diff --git a/feb2020.exe b/feb2020.exe new file mode 100644 index 0000000..296717d Binary files /dev/null and b/feb2020.exe differ diff --git a/minecraftcpp-master/docs/bugs-handheld.txt b/minecraftcpp-master/docs/bugs-handheld.txt new file mode 100644 index 0000000..6992a87 --- /dev/null +++ b/minecraftcpp-master/docs/bugs-handheld.txt @@ -0,0 +1,53 @@ +Bugs/missing features + +* Frustum culler doesn't work correctly, even though I tried + to copy it from Minecraft java version. + NOTE: Culling of chunks works, but entities isn't 100% + +* Basically whole Item/ItemInstance package is missing +Update: Over half package is now done, but difficult to go very much +further without having items to "test"/evaluate it with. + +* Lighting's broken + +* Android version doesn't quit correctly. Right now it seg-faults + on purpose, since it doesn't shut down fully if not. + NOTE: much better now, and doesn't use segfault. Still a call to + gl* is made with no context. Back button shouldn't actually shut + down the process but rather hides it. + +* A few (~3) "static" memory leaks (marked in the code with @memleak) + +* Water horizon doesn't care about "movement head offsetting" + +( * Returning some temporary AABBs by ref, not sure it's a problem.) + +( * Some seeds constants are too big for long (int) data type.) + +FIXED: +* Flickering. Removing glClear( color-bit ) "fixes" this. + NOTE: div by 0.0f in bobHurt when a = 0. Java code also have this + problem but rotating NaN or INF degrees seems fine there (or a != 0) + +* Can't walk without hopping every tile or falling through tiles + NOTE: Still jumps out of water as a feature :) + +* Tile ticking, water flow and leaf decay + +* Rendering business. Right now it's hardcoded to render the + first N chunks it encounters and then no more. + (Addon: then it might crash :p ) + And since it doesn't redraw chunks correctly, destroying tiles + isn't graphically visible (if all N chunks have been used). + NOTE: Now using basically the same rendering pipeline as display lists. + +* Code doesn't really support playing on the network game "host" at the moment. + NOTE: Chose a fairly straightforward approach where you let people join + your world. + +* Abyss + +* (Render) Chunks are sometimes missing. Came when ChunkCache was + rewritten/updated for fixed worlds. + NOTE: Fixed, this and chunks not updated in multiplayer if chunk not + visible to player were same problem (Chunk::rebuild,if(!visible)return;) diff --git a/minecraftcpp-master/handheld/data/app/ios/bg128.png b/minecraftcpp-master/handheld/data/app/ios/bg128.png new file mode 100644 index 0000000..70e6aa1 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/bg128.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/bg64.png b/minecraftcpp-master/handheld/data/app/ios/bg64.png new file mode 100644 index 0000000..58abd82 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/bg64.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/cancel_0.png b/minecraftcpp-master/handheld/data/app/ios/dialog/cancel_0.png new file mode 100644 index 0000000..1e7215c Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/cancel_0.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/cancel_0_1.png b/minecraftcpp-master/handheld/data/app/ios/dialog/cancel_0_1.png new file mode 100644 index 0000000..c1c77de Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/cancel_0_1.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/cancel_0_3.png b/minecraftcpp-master/handheld/data/app/ios/dialog/cancel_0_3.png new file mode 100644 index 0000000..42227db Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/cancel_0_3.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/cancel_1.png b/minecraftcpp-master/handheld/data/app/ios/dialog/cancel_1.png new file mode 100644 index 0000000..fade487 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/cancel_1.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/cancel_1_1.png b/minecraftcpp-master/handheld/data/app/ios/dialog/cancel_1_1.png new file mode 100644 index 0000000..70abbc7 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/cancel_1_1.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/cancel_1_3.png b/minecraftcpp-master/handheld/data/app/ios/dialog/cancel_1_3.png new file mode 100644 index 0000000..3329d22 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/cancel_1_3.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/create_0.png b/minecraftcpp-master/handheld/data/app/ios/dialog/create_0.png new file mode 100644 index 0000000..a311524 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/create_0.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/create_0_1.png b/minecraftcpp-master/handheld/data/app/ios/dialog/create_0_1.png new file mode 100644 index 0000000..2ed050f Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/create_0_1.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/create_0_3.png b/minecraftcpp-master/handheld/data/app/ios/dialog/create_0_3.png new file mode 100644 index 0000000..ae26713 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/create_0_3.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/create_1.png b/minecraftcpp-master/handheld/data/app/ios/dialog/create_1.png new file mode 100644 index 0000000..1f1a3da Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/create_1.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/create_1_1.png b/minecraftcpp-master/handheld/data/app/ios/dialog/create_1_1.png new file mode 100644 index 0000000..e34ea69 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/create_1_1.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/create_1_3.png b/minecraftcpp-master/handheld/data/app/ios/dialog/create_1_3.png new file mode 100644 index 0000000..66f62c0 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/create_1_3.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/cancel_0_4.png b/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/cancel_0_4.png new file mode 100644 index 0000000..e902dcd Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/cancel_0_4.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/cancel_1_4.png b/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/cancel_1_4.png new file mode 100644 index 0000000..b54fbd7 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/cancel_1_4.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/create_0_4.png b/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/create_0_4.png new file mode 100644 index 0000000..bfe8d8d Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/create_0_4.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/create_1_4.png b/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/create_1_4.png new file mode 100644 index 0000000..c7bc56f Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/create_1_4.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/creative_0_4.png b/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/creative_0_4.png new file mode 100644 index 0000000..89f8124 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/creative_0_4.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/creative_1_4.png b/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/creative_1_4.png new file mode 100644 index 0000000..b847443 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/creative_1_4.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/creative_3_4.png b/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/creative_3_4.png new file mode 100644 index 0000000..328db9d Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/creative_3_4.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/survival_0_4.png b/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/survival_0_4.png new file mode 100644 index 0000000..d0ec675 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/survival_0_4.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/survival_1_4.png b/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/survival_1_4.png new file mode 100644 index 0000000..19f8325 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/survival_1_4.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/survival_3_4.png b/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/survival_3_4.png new file mode 100644 index 0000000..3d866f1 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/survival_3_4.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/worldname_ipad_4.png b/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/worldname_ipad_4.png new file mode 100644 index 0000000..736e914 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/ipad/worldname_ipad_4.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/save_0.png b/minecraftcpp-master/handheld/data/app/ios/dialog/save_0.png new file mode 100644 index 0000000..03a89d6 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/save_0.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/save_0_3.png b/minecraftcpp-master/handheld/data/app/ios/dialog/save_0_3.png new file mode 100644 index 0000000..cdcd88d Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/save_0_3.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/save_1.png b/minecraftcpp-master/handheld/data/app/ios/dialog/save_1.png new file mode 100644 index 0000000..5ee6184 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/save_1.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/save_1_3.png b/minecraftcpp-master/handheld/data/app/ios/dialog/save_1_3.png new file mode 100644 index 0000000..c7b1fae Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/save_1_3.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/worldname_ipad.png b/minecraftcpp-master/handheld/data/app/ios/dialog/worldname_ipad.png new file mode 100644 index 0000000..afe50bb Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/worldname_ipad.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/worldname_ipad_3.png b/minecraftcpp-master/handheld/data/app/ios/dialog/worldname_ipad_3.png new file mode 100644 index 0000000..da5f34c Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/worldname_ipad_3.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/worldname_iphone.png b/minecraftcpp-master/handheld/data/app/ios/dialog/worldname_iphone.png new file mode 100644 index 0000000..1a3781a Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/worldname_iphone.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog/worldname_iphone_3.png b/minecraftcpp-master/handheld/data/app/ios/dialog/worldname_iphone_3.png new file mode 100644 index 0000000..f65f34d Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog/worldname_iphone_3.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog2/cancel_0_1.png b/minecraftcpp-master/handheld/data/app/ios/dialog2/cancel_0_1.png new file mode 100644 index 0000000..c43434a Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog2/cancel_0_1.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog2/cancel_0_3.png b/minecraftcpp-master/handheld/data/app/ios/dialog2/cancel_0_3.png new file mode 100644 index 0000000..44f7b13 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog2/cancel_0_3.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog2/cancel_1_1.png b/minecraftcpp-master/handheld/data/app/ios/dialog2/cancel_1_1.png new file mode 100644 index 0000000..abaa241 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog2/cancel_1_1.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog2/cancel_1_3.png b/minecraftcpp-master/handheld/data/app/ios/dialog2/cancel_1_3.png new file mode 100644 index 0000000..304fc53 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog2/cancel_1_3.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog2/create_0_1.png b/minecraftcpp-master/handheld/data/app/ios/dialog2/create_0_1.png new file mode 100644 index 0000000..4ebc3b2 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog2/create_0_1.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog2/create_0_3.png b/minecraftcpp-master/handheld/data/app/ios/dialog2/create_0_3.png new file mode 100644 index 0000000..07fe661 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog2/create_0_3.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog2/create_1_1.png b/minecraftcpp-master/handheld/data/app/ios/dialog2/create_1_1.png new file mode 100644 index 0000000..5db6202 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog2/create_1_1.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog2/create_1_3.png b/minecraftcpp-master/handheld/data/app/ios/dialog2/create_1_3.png new file mode 100644 index 0000000..5b5fc4e Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog2/create_1_3.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog2/creative_0_3.png b/minecraftcpp-master/handheld/data/app/ios/dialog2/creative_0_3.png new file mode 100644 index 0000000..299e830 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog2/creative_0_3.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog2/creative_1_3.png b/minecraftcpp-master/handheld/data/app/ios/dialog2/creative_1_3.png new file mode 100644 index 0000000..7cac499 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog2/creative_1_3.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog2/survival_0_3.png b/minecraftcpp-master/handheld/data/app/ios/dialog2/survival_0_3.png new file mode 100644 index 0000000..c5174f7 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog2/survival_0_3.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog2/survival_1_3.png b/minecraftcpp-master/handheld/data/app/ios/dialog2/survival_1_3.png new file mode 100644 index 0000000..a2a1eb6 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog2/survival_1_3.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog2/worldname.png b/minecraftcpp-master/handheld/data/app/ios/dialog2/worldname.png new file mode 100644 index 0000000..b8f42a2 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog2/worldname.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog2/worldname_3.png b/minecraftcpp-master/handheld/data/app/ios/dialog2/worldname_3.png new file mode 100644 index 0000000..adccd67 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog2/worldname_3.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog2/worldname_ipad.png b/minecraftcpp-master/handheld/data/app/ios/dialog2/worldname_ipad.png new file mode 100644 index 0000000..afe50bb Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog2/worldname_ipad.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog2/worldname_ipad_3.png b/minecraftcpp-master/handheld/data/app/ios/dialog2/worldname_ipad_3.png new file mode 100644 index 0000000..da5f34c Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog2/worldname_ipad_3.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog2/worldname_iphone.png b/minecraftcpp-master/handheld/data/app/ios/dialog2/worldname_iphone.png new file mode 100644 index 0000000..509f439 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog2/worldname_iphone.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog2/worldname_iphone5_3.png b/minecraftcpp-master/handheld/data/app/ios/dialog2/worldname_iphone5_3.png new file mode 100644 index 0000000..ab2b0ba Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog2/worldname_iphone5_3.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/dialog2/worldname_iphone_3.png b/minecraftcpp-master/handheld/data/app/ios/dialog2/worldname_iphone_3.png new file mode 100644 index 0000000..7f65500 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/dialog2/worldname_iphone_3.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/icons/Icon-72.png b/minecraftcpp-master/handheld/data/app/ios/icons/Icon-72.png new file mode 100644 index 0000000..d198911 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/icons/Icon-72.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/icons/Icon-72_lite.png b/minecraftcpp-master/handheld/data/app/ios/icons/Icon-72_lite.png new file mode 100644 index 0000000..ad32eb3 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/icons/Icon-72_lite.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/icons/Icon-Small-50.png b/minecraftcpp-master/handheld/data/app/ios/icons/Icon-Small-50.png new file mode 100644 index 0000000..4413190 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/icons/Icon-Small-50.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/icons/Icon-Small-50_lite.png b/minecraftcpp-master/handheld/data/app/ios/icons/Icon-Small-50_lite.png new file mode 100644 index 0000000..fe2162d Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/icons/Icon-Small-50_lite.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/icons/Icon-Small.png b/minecraftcpp-master/handheld/data/app/ios/icons/Icon-Small.png new file mode 100644 index 0000000..65fe938 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/icons/Icon-Small.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/icons/Icon-Small@2x.png b/minecraftcpp-master/handheld/data/app/ios/icons/Icon-Small@2x.png new file mode 100644 index 0000000..4218ed5 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/icons/Icon-Small@2x.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/icons/Icon-Small@2x_lite.png b/minecraftcpp-master/handheld/data/app/ios/icons/Icon-Small@2x_lite.png new file mode 100644 index 0000000..5a790d0 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/icons/Icon-Small@2x_lite.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/icons/Icon-Small_lite.png b/minecraftcpp-master/handheld/data/app/ios/icons/Icon-Small_lite.png new file mode 100644 index 0000000..7d50baa Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/icons/Icon-Small_lite.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/icons/Icon.png b/minecraftcpp-master/handheld/data/app/ios/icons/Icon.png new file mode 100644 index 0000000..05824c1 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/icons/Icon.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/icons/Icon@2x.png b/minecraftcpp-master/handheld/data/app/ios/icons/Icon@2x.png new file mode 100644 index 0000000..6eea25c Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/icons/Icon@2x.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/icons/Icon@2x_lite.png b/minecraftcpp-master/handheld/data/app/ios/icons/Icon@2x_lite.png new file mode 100644 index 0000000..491c13a Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/icons/Icon@2x_lite.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/icons/Icon_lite.png b/minecraftcpp-master/handheld/data/app/ios/icons/Icon_lite.png new file mode 100644 index 0000000..22e4376 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/icons/Icon_lite.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/icons/mcpe_ios_icon.png b/minecraftcpp-master/handheld/data/app/ios/icons/mcpe_ios_icon.png new file mode 100644 index 0000000..e70d4cc Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/icons/mcpe_ios_icon.png differ diff --git a/minecraftcpp-master/handheld/data/app/ios/icons/mcpe_lite_ios_icon.png b/minecraftcpp-master/handheld/data/app/ios/icons/mcpe_lite_ios_icon.png new file mode 100644 index 0000000..a6a6154 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/ios/icons/mcpe_lite_ios_icon.png differ diff --git a/minecraftcpp-master/handheld/data/app/launch/Default-Landscape~ipad.png b/minecraftcpp-master/handheld/data/app/launch/Default-Landscape~ipad.png new file mode 100644 index 0000000..a4a061c Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/launch/Default-Landscape~ipad.png differ diff --git a/minecraftcpp-master/handheld/data/app/launch/Default.png b/minecraftcpp-master/handheld/data/app/launch/Default.png new file mode 100644 index 0000000..dd2702a Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/launch/Default.png differ diff --git a/minecraftcpp-master/handheld/data/app/launch/Default@2x.png b/minecraftcpp-master/handheld/data/app/launch/Default@2x.png new file mode 100644 index 0000000..8bd9662 Binary files /dev/null and b/minecraftcpp-master/handheld/data/app/launch/Default@2x.png differ diff --git a/minecraftcpp-master/handheld/data/fonts/minecraft.ttf b/minecraftcpp-master/handheld/data/fonts/minecraft.ttf new file mode 100644 index 0000000..55c5075 Binary files /dev/null and b/minecraftcpp-master/handheld/data/fonts/minecraft.ttf differ diff --git a/minecraftcpp-master/handheld/data/images/armor/chain_1.png b/minecraftcpp-master/handheld/data/images/armor/chain_1.png new file mode 100644 index 0000000..3632af5 Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/armor/chain_1.png differ diff --git a/minecraftcpp-master/handheld/data/images/armor/chain_2.png b/minecraftcpp-master/handheld/data/images/armor/chain_2.png new file mode 100644 index 0000000..330425b Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/armor/chain_2.png differ diff --git a/minecraftcpp-master/handheld/data/images/armor/cloth_1.png b/minecraftcpp-master/handheld/data/images/armor/cloth_1.png new file mode 100644 index 0000000..f3cf4aa Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/armor/cloth_1.png differ diff --git a/minecraftcpp-master/handheld/data/images/armor/cloth_2.png b/minecraftcpp-master/handheld/data/images/armor/cloth_2.png new file mode 100644 index 0000000..15fb908 Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/armor/cloth_2.png differ diff --git a/minecraftcpp-master/handheld/data/images/armor/diamond_1.png b/minecraftcpp-master/handheld/data/images/armor/diamond_1.png new file mode 100644 index 0000000..339da65 Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/armor/diamond_1.png differ diff --git a/minecraftcpp-master/handheld/data/images/armor/diamond_2.png b/minecraftcpp-master/handheld/data/images/armor/diamond_2.png new file mode 100644 index 0000000..c220c12 Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/armor/diamond_2.png differ diff --git a/minecraftcpp-master/handheld/data/images/armor/gold_1.png b/minecraftcpp-master/handheld/data/images/armor/gold_1.png new file mode 100644 index 0000000..885f309 Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/armor/gold_1.png differ diff --git a/minecraftcpp-master/handheld/data/images/armor/gold_2.png b/minecraftcpp-master/handheld/data/images/armor/gold_2.png new file mode 100644 index 0000000..9d1ea3b Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/armor/gold_2.png differ diff --git a/minecraftcpp-master/handheld/data/images/armor/iron_1.png b/minecraftcpp-master/handheld/data/images/armor/iron_1.png new file mode 100644 index 0000000..374ab07 Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/armor/iron_1.png differ diff --git a/minecraftcpp-master/handheld/data/images/armor/iron_2.png b/minecraftcpp-master/handheld/data/images/armor/iron_2.png new file mode 100644 index 0000000..53af4f4 Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/armor/iron_2.png differ diff --git a/minecraftcpp-master/handheld/data/images/art/kz.png b/minecraftcpp-master/handheld/data/images/art/kz.png new file mode 100644 index 0000000..c40ca22 Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/art/kz.png differ diff --git a/minecraftcpp-master/handheld/data/images/environment/clouds.png b/minecraftcpp-master/handheld/data/images/environment/clouds.png new file mode 100644 index 0000000..7ad7fa4 Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/environment/clouds.png differ diff --git a/minecraftcpp-master/handheld/data/images/font/default8.png b/minecraftcpp-master/handheld/data/images/font/default8.png new file mode 100644 index 0000000..6179312 Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/font/default8.png differ diff --git a/minecraftcpp-master/handheld/data/images/gui/background.png b/minecraftcpp-master/handheld/data/images/gui/background.png new file mode 100644 index 0000000..c8cadb4 Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/gui/background.png differ diff --git a/minecraftcpp-master/handheld/data/images/gui/badge/minecon140.png b/minecraftcpp-master/handheld/data/images/gui/badge/minecon140.png new file mode 100644 index 0000000..dd95dec Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/gui/badge/minecon140.png differ diff --git a/minecraftcpp-master/handheld/data/images/gui/bg32.png b/minecraftcpp-master/handheld/data/images/gui/bg32.png new file mode 100644 index 0000000..d9796c4 Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/gui/bg32.png differ diff --git a/minecraftcpp-master/handheld/data/images/gui/cursor.png b/minecraftcpp-master/handheld/data/images/gui/cursor.png new file mode 100644 index 0000000..ec1012a Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/gui/cursor.png differ diff --git a/minecraftcpp-master/handheld/data/images/gui/default_world.png b/minecraftcpp-master/handheld/data/images/gui/default_world.png new file mode 100644 index 0000000..17c9cdc Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/gui/default_world.png differ diff --git a/minecraftcpp-master/handheld/data/images/gui/gui.png b/minecraftcpp-master/handheld/data/images/gui/gui.png new file mode 100644 index 0000000..0ae80b9 Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/gui/gui.png differ diff --git a/minecraftcpp-master/handheld/data/images/gui/gui2.png b/minecraftcpp-master/handheld/data/images/gui/gui2.png new file mode 100644 index 0000000..34ae051 Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/gui/gui2.png differ diff --git a/minecraftcpp-master/handheld/data/images/gui/gui_blocks.png b/minecraftcpp-master/handheld/data/images/gui/gui_blocks.png new file mode 100644 index 0000000..fa4df26 Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/gui/gui_blocks.png differ diff --git a/minecraftcpp-master/handheld/data/images/gui/icons.png b/minecraftcpp-master/handheld/data/images/gui/icons.png new file mode 100644 index 0000000..8afc25a Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/gui/icons.png differ diff --git a/minecraftcpp-master/handheld/data/images/gui/itemframe.png b/minecraftcpp-master/handheld/data/images/gui/itemframe.png new file mode 100644 index 0000000..8e23979 Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/gui/itemframe.png differ diff --git a/minecraftcpp-master/handheld/data/images/gui/items.png b/minecraftcpp-master/handheld/data/images/gui/items.png new file mode 100644 index 0000000..ace2e9a Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/gui/items.png differ diff --git a/minecraftcpp-master/handheld/data/images/gui/logo/raknet_high_72.png b/minecraftcpp-master/handheld/data/images/gui/logo/raknet_high_72.png new file mode 100644 index 0000000..fdd7d4e Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/gui/logo/raknet_high_72.png differ diff --git a/minecraftcpp-master/handheld/data/images/gui/logo/raknet_low_18.png b/minecraftcpp-master/handheld/data/images/gui/logo/raknet_low_18.png new file mode 100644 index 0000000..1b9a869 Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/gui/logo/raknet_low_18.png differ diff --git a/minecraftcpp-master/handheld/data/images/gui/pi_title.png b/minecraftcpp-master/handheld/data/images/gui/pi_title.png new file mode 100644 index 0000000..b31eed9 Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/gui/pi_title.png differ diff --git a/minecraftcpp-master/handheld/data/images/gui/spritesheet.png b/minecraftcpp-master/handheld/data/images/gui/spritesheet.png new file mode 100644 index 0000000..b130262 Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/gui/spritesheet.png differ diff --git a/minecraftcpp-master/handheld/data/images/gui/title.png b/minecraftcpp-master/handheld/data/images/gui/title.png new file mode 100644 index 0000000..5f2e4ff Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/gui/title.png differ diff --git a/minecraftcpp-master/handheld/data/images/gui/touchgui.png b/minecraftcpp-master/handheld/data/images/gui/touchgui.png new file mode 100644 index 0000000..3d2221f Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/gui/touchgui.png differ diff --git a/minecraftcpp-master/handheld/data/images/item/arrows.png b/minecraftcpp-master/handheld/data/images/item/arrows.png new file mode 100644 index 0000000..75c5828 Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/item/arrows.png differ diff --git a/minecraftcpp-master/handheld/data/images/item/camera.png b/minecraftcpp-master/handheld/data/images/item/camera.png new file mode 100644 index 0000000..9725189 Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/item/camera.png differ diff --git a/minecraftcpp-master/handheld/data/images/item/sign.png b/minecraftcpp-master/handheld/data/images/item/sign.png new file mode 100644 index 0000000..e829472 Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/item/sign.png differ diff --git a/minecraftcpp-master/handheld/data/images/mob/char.png b/minecraftcpp-master/handheld/data/images/mob/char.png new file mode 100644 index 0000000..7cfa08a Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/mob/char.png differ diff --git a/minecraftcpp-master/handheld/data/images/mob/chicken.png b/minecraftcpp-master/handheld/data/images/mob/chicken.png new file mode 100644 index 0000000..d481293 Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/mob/chicken.png differ diff --git a/minecraftcpp-master/handheld/data/images/mob/cow.png b/minecraftcpp-master/handheld/data/images/mob/cow.png new file mode 100644 index 0000000..bc0e89f Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/mob/cow.png differ diff --git a/minecraftcpp-master/handheld/data/images/mob/creeper.png b/minecraftcpp-master/handheld/data/images/mob/creeper.png new file mode 100644 index 0000000..e0a5e0a Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/mob/creeper.png differ diff --git a/minecraftcpp-master/handheld/data/images/mob/pig.png b/minecraftcpp-master/handheld/data/images/mob/pig.png new file mode 100644 index 0000000..1ed505b Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/mob/pig.png differ diff --git a/minecraftcpp-master/handheld/data/images/mob/pigzombie.png b/minecraftcpp-master/handheld/data/images/mob/pigzombie.png new file mode 100644 index 0000000..3521845 Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/mob/pigzombie.png differ diff --git a/minecraftcpp-master/handheld/data/images/mob/sheep.png b/minecraftcpp-master/handheld/data/images/mob/sheep.png new file mode 100644 index 0000000..a6ed11d Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/mob/sheep.png differ diff --git a/minecraftcpp-master/handheld/data/images/mob/sheep_fur.png b/minecraftcpp-master/handheld/data/images/mob/sheep_fur.png new file mode 100644 index 0000000..b00aa8c Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/mob/sheep_fur.png differ diff --git a/minecraftcpp-master/handheld/data/images/mob/skeleton.png b/minecraftcpp-master/handheld/data/images/mob/skeleton.png new file mode 100644 index 0000000..9d22339 Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/mob/skeleton.png differ diff --git a/minecraftcpp-master/handheld/data/images/mob/spider.png b/minecraftcpp-master/handheld/data/images/mob/spider.png new file mode 100644 index 0000000..08344a8 Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/mob/spider.png differ diff --git a/minecraftcpp-master/handheld/data/images/mob/zombie.png b/minecraftcpp-master/handheld/data/images/mob/zombie.png new file mode 100644 index 0000000..4d47ccf Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/mob/zombie.png differ diff --git a/minecraftcpp-master/handheld/data/images/particles.png b/minecraftcpp-master/handheld/data/images/particles.png new file mode 100644 index 0000000..de34f1b Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/particles.png differ diff --git a/minecraftcpp-master/handheld/data/images/terrain.png b/minecraftcpp-master/handheld/data/images/terrain.png new file mode 100644 index 0000000..f14bbed Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/terrain.png differ diff --git a/minecraftcpp-master/handheld/data/images/terrain.pvr b/minecraftcpp-master/handheld/data/images/terrain.pvr new file mode 100644 index 0000000..6cb2065 Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/terrain.pvr differ diff --git a/minecraftcpp-master/handheld/data/images/terrain.pvr4 b/minecraftcpp-master/handheld/data/images/terrain.pvr4 new file mode 100644 index 0000000..6c32892 Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/terrain.pvr4 differ diff --git a/minecraftcpp-master/handheld/data/images/terrain.pvrtc b/minecraftcpp-master/handheld/data/images/terrain.pvrtc new file mode 100644 index 0000000..0c45ab1 Binary files /dev/null and b/minecraftcpp-master/handheld/data/images/terrain.pvrtc differ diff --git a/minecraftcpp-master/handheld/data/images/terrain_4444.h b/minecraftcpp-master/handheld/data/images/terrain_4444.h new file mode 100644 index 0000000..c222eb9 --- /dev/null +++ b/minecraftcpp-master/handheld/data/images/terrain_4444.h @@ -0,0 +1,1052 @@ +/********************************************************** + * PVRTexture Tool v 3.20 + * PVRTC Library v 1.106. 0. 0 Beta + **********************************************************/ + +#ifndef A32BIT + #define A32BIT static const unsigned long +#endif + +A32BIT terrain_4444[] = { + +/* Header */ +0x00000034, /* dwHeaderSize */ +0x00000100, /* dwHeight */ +0x00000100, /* dwWidth */ +0x00000000, /* dwMipMapCount */ +0x00008010, /* dwpfFlags */ +0x00020000, /* dwDataSize */ +0x00000010, /* dwBitCount */ +0x0000f000, /* dwRBitMask */ +0x00000f00, /* dwGBitMask */ +0x000000f0, /* dwBBitMask */ +0x0000000f, /* dwAlphaBitMask */ +0x21525650, /* dwPVR */ +0x00000001, /* dwNumSurfs */ + +/* Data */ +0x999f999f,0x888f999f,0x888f888f,0x888f777f,0x999f999f,0x888f888f,0x888f888f,0x888f777f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x888f666f,0x777f777f,0x777f777f,0x777f777f,0x964fb85f,0x753f964f,0xb85f753f,0x964f964f,0x753f753f,0x753f532f,0xb85f753f,0xb85f753f,0x7b4f7b4f,0x6a3f7b4f,0x6a4f6a3f,0x6a4f593f,0x7b4f7b5f,0x6a3f6a4f,0x6a3f6a3f,0x6a4f592f, +0x984fb96f,0x984f984f,0xb96f984f,0xb95fb96f,0xb96f984f,0xb96fb96f,0xb96fb96f,0x984fb96f,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xaaafcccf,0x888f888f,0x888f888f,0x888f888f,0x999f999f,0x999f777f,0x888f888f,0x888f888f,0x888f888f,0x943f943f,0xcccf943f,0x943f943f,0xa53f943f,0xa53f943f,0xdddf843f,0xa53f943f,0x943f943f, +0xc31fd41f,0xa31fb31f,0xc31fd41f,0xa31fb31f,0xc31fd41f,0xa31fb31f,0xc31fd41f,0xa31fb31f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0x0000ffff,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0xffff0000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x888f999f,0x999faaaf,0x888f999f,0x888f888f,0xaaaf777f,0x999faaaf,0x888f888f,0x888f888f,0x777f777f,0x888f888f,0x888f888f,0x888f888f,0x888f777f,0x888f888f,0x777f666f,0x777f777f,0x964f753f,0x753f532f,0x964f753f,0x532f888f,0xb85f753f,0x753f964f,0x964f753f,0x532f532f,0x6a4f7b4f,0x8b5f8b5f,0x532f8b5f,0x6a3f6a3f,0x9c6f593f,0x7b4f9b6f,0x6a4f6a3f,0x6a4f6a3f, +0xb96fb96f,0x753fb95f,0xb95fb95f,0x984f984f,0x984f984f,0xb95f984f,0xb95f984f,0x984fb96f,0xaaafcccf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfaaaf,0xbbbfbbbf,0xaaaf999f,0x888faaaf,0xaaaf888f,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfaaaf,0xbbbfbbbf,0xaaaf999f,0x888faaaf,0x732f732f,0xeeef842f,0x732fb54f,0x632f632f,0x732f732f,0xdddf842f,0x732f943f,0x732f732f, +0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0xffff0000,0x00000000,0x00000000,0x00000000,0xffffffff,0x0000ffff,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x4c2f0000,0x00000000,0x00000000, +0xbbbfaaaf,0x888fbbbf,0x888f888f,0x999f999f,0x999f999f,0xaaafaaaf,0x777f888f,0xbbbf888f,0x666f777f,0x777f777f,0x777f666f,0x777f777f,0x777f888f,0x777f777f,0x888f777f,0x777f777f,0x753fb85f,0x532f753f,0x753fb85f,0x753f753f,0x753fb85f,0x753f753f,0x532f532f,0x753fb85f,0x532f8b5f,0x6a3f9c6f,0x532f6a3f,0x532f7b4f,0x7b5f7b4f,0x9c6f9c6f,0x592f532f,0x532f6a3f, +0xb96fb96f,0x984f984f,0x984f984f,0xb95fb95f,0xb96fb96f,0xb95fb96f,0xb96f753f,0x984fb96f,0x999fcccf,0xaaafaaaf,0xaaaf999f,0xaaafaaaf,0xaaafbbbf,0xaaafaaaf,0xbbbfaaaf,0x888faaaf,0x999f888f,0xaaafaaaf,0xaaaf999f,0xaaafaaaf,0xaaafbbbf,0xaaafaaaf,0xbbbfaaaf,0x888faaaf,0x843f732f,0xdddf632f,0x732f943f,0x732f732f,0x732f732f,0xdddf732f,0x943f842f,0x843f732f, +0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0x888fd41f,0x921f555f,0x888fd41f,0x000f555f,0x555f000f,0x921f888f,0x555fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x00000000,0xffffffff,0xffffffff,0x00000000,0x0000ffff,0xffff0000,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x00000000,0x4c2f4c2f,0x00000000,0x00000000,0x060f4c2f,0x0000060f,0x00000000, +0x888f777f,0x999f888f,0x999f999f,0x777f777f,0x888f777f,0x999f888f,0x888f888f,0x777f888f,0x888f777f,0x777f777f,0x666f777f,0x888f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x666f964f,0x753fb85f,0x532f964f,0xb85f753f,0x964f964f,0x964f753f,0xb85f753f,0x753f964f,0x666f532f,0x532f532f,0x532f7b4f,0x532f532f,0x532f593f,0x532f6a4f,0x532f753f,0x753f532f, +0x653f653f,0x753f653f,0x753f753f,0x753f753f,0x753f753f,0x653f653f,0x653f653f,0x753f753f,0xbbbfcccf,0xaaafaaaf,0x999faaaf,0xbbbfaaaf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0x888faaaf,0xbbbf888f,0xaaafaaaf,0x999faaaf,0xbbbfaaaf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0x888faaaf,0xbbbfbbbf,0xdddfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xdddfbbbf,0xbbbfbbbf,0xbbbfbbbf, +0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0x921fa31f,0x555f921f,0x921fa31f,0x921f555f,0x000f555f,0x921f921f,0x921f555f,0x921f921f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0x00000000,0xffff0000,0x00000000,0xffffffff,0x0000ffff,0x00000000,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x00000000,0x060f4c2f,0x4c2f0000,0x060f4c2f,0x060f0000,0x0000962f,0x00000000, +0x888faaaf,0x888faaaf,0xaaafaaaf,0xaaaf888f,0x777fbbbf,0xaaaf888f,0x777faaaf,0x888f888f,0x888f777f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x888f888f,0x666f888f,0x753f964f,0xb85f964f,0x964f532f,0x753f753f,0x532f964f,0x666f753f,0x964f753f,0x753f532f,0x753f964f,0xb85f964f,0x964f532f,0x753f753f,0x532f532f,0x666f532f,0x964f753f,0x753f532f, +0x984fb96f,0x984f984f,0xb96f984f,0x984fb96f,0x984fb96f,0x753f984f,0xb95fb95f,0xb96fb95f,0xbbbfcccf,0xaaafbbbf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0xbbbfbbbf,0xbbbfbbbf,0x777fbbbf,0xbbbf888f,0xaaafbbbf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0xbbbfbbbf,0xbbbfbbbf,0x777fbbbf,0x943f843f,0x943f943f,0x943f943f,0xdddf943f,0xa53fa53f,0x943fa43f,0x943f943f,0xdddf943f, +0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xd41fd41f,0xa31fd41f,0xd41f555f,0xa31f555f,0xd41f555f,0x000f000f,0xd41f555f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0x00000000,0xffff0000,0x0000ffff,0xffff0000,0xffff0000,0xffff0000,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x4c2f0000,0x060f962f,0x0000060f,0x060f060f,0x962f530f,0x060f962f,0x00000000, +0x999f999f,0xaaaf777f,0x999f888f,0x999f999f,0x999f888f,0x888f888f,0x888f777f,0x999f888f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x666f777f,0x777f777f,0x777f777f,0x777f666f,0x532f753f,0x964f964f,0x964f753f,0x532f532f,0x753f532f,0x532f753f,0x753f753f,0xb85f753f,0x532f753f,0x964f964f,0x964f753f,0x532f532f,0x753f532f,0x532f753f,0x753f753f,0xb85f753f, +0x984f984f,0xb95f753f,0xb95fb95f,0x984fb96f,0xb95fb95f,0xb95fb95f,0x984f984f,0x984f984f,0xaaafcccf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0x999faaaf,0xaaafaaaf,0xaaafaaaf,0x888f999f,0xaaaf888f,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0x999faaaf,0xaaafaaaf,0xaaafaaaf,0x888f999f,0x732f943f,0x732f943f,0x732f632f,0xdddf732f,0x732f943f,0x732f732f,0x732f632f,0xdddf732f, +0xdddfdddf,0xcccfdddf,0xdddfdddf,0xdddfdddf,0xdddfcccf,0xcccfdddf,0xdddfcccf,0xcccfdddf,0x888fd41f,0x921f888f,0x000fd41f,0x921f000f,0x888f555f,0x555f555f,0x888f000f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x00000000,0x0000ffff,0xffff0000,0xffff0000,0x00000000,0x0000ffff,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x3bef0000,0x00003bef,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x060f0000,0x060f530f,0x0000060f,0x962f060f,0x530f962f,0x962f530f,0x00000000, +0x999f777f,0x999faaaf,0x888f999f,0x777f888f,0x888f888f,0xaaafbbbf,0xaaaf999f,0x888f999f,0x888f888f,0x888f777f,0x777f777f,0x888f888f,0x777f777f,0x777f777f,0x888f888f,0x666f888f,0x532fb85f,0x753f753f,0x753f888f,0xb85f753f,0x753fb85f,0xb85fb85f,0x964f753f,0x964f753f,0x532fb85f,0x753f753f,0x753f888f,0xb85f753f,0x753fb85f,0xb85fb85f,0x964f753f,0x964f753f, +0xb96fb96f,0xb95fb96f,0xb96fb96f,0x984fb96f,0x984f984f,0xb96f753f,0xb96fb96f,0xb96fb96f,0xbbbfcccf,0xaaafaaaf,0xaaafaaaf,0xbbbfbbbf,0xaaafaaaf,0xaaafaaaf,0xbbbfbbbf,0x777fbbbf,0xbbbf999f,0xaaafaaaf,0xaaafaaaf,0xbbbfbbbf,0xaaafaaaf,0xaaafaaaf,0xbbbfbbbf,0x777fbbbf,0x522f943f,0x632f842f,0x632f732f,0xdddf732f,0x632fa53f,0x732f842f,0x732f732f,0xdddf732f, +0xdddfcccf,0x000f000f,0xcccf000f,0xcccf000f,0x000fdddf,0x000fcccf,0x000f000f,0xcccfdddf,0x888fd41f,0x555f555f,0x888fd41f,0x555f000f,0x555f000f,0x555f000f,0x000f555f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x00000000,0x0000ffff,0x0000ffff,0xffffffff,0xffff0000,0xffff0000,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x379f3bef,0x39bf3acf,0x00003acf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x00000000,0x530f0000,0x530f962f,0x962f962f,0x060f530f,0x4c2f0000,0x0000060f, +0x888f888f,0x888f999f,0x777f999f,0x888faaaf,0xaaaf999f,0x888f888f,0xaaaf888f,0xaaaf777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x666f777f,0x777f777f,0x777f777f,0x777f777f,0x753fb85f,0xb85fb85f,0x964f964f,0x753f753f,0x532f964f,0x964f964f,0x753f753f,0x964f964f,0x753fb85f,0xb85fb85f,0x964f964f,0x753f753f,0x532f964f,0x964f964f,0x753f753f,0x964f964f, +0x753f753f,0x653f653f,0x653f653f,0x753f653f,0x753f753f,0x653f653f,0x653f653f,0x753f753f,0x888faaaf,0x888f888f,0x888f888f,0x888f888f,0x777f888f,0x888f888f,0x888f888f,0x888f888f,0xaaaf888f,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0x999faaaf,0xaaafaaaf,0xaaafaaaf,0x888faaaf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xdddfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xdddfbbbf, +0xcccfcccf,0x000fcccf,0xcccfcccf,0x000f000f,0x000fcccf,0xcccfcccf,0xcccf000f,0xcccfcccf,0x921fa31f,0x921f921f,0x000f555f,0x000f000f,0x000f000f,0x921f555f,0x000fa31f,0x921f921f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x0000ffff,0x00000000,0x0000ffff,0xffff0000, +0x00000000,0x00000000,0x3acf0000,0x3acf3acf,0x379f3bef,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x4c2f0000,0x0000060f,0x962f530f,0x4c2f4c2f,0x00000000,0x060f4c2f,0x0000060f, +0x999f888f,0xaaafbbbf,0x888faaaf,0x999faaaf,0xaaafbbbf,0x999f888f,0x999f888f,0x777f777f,0x888f777f,0x666f888f,0x777f888f,0x777f777f,0x888f777f,0x888f888f,0x888f888f,0x888f888f,0x753f964f,0x964f753f,0x964f753f,0x532f753f,0x964f753f,0x753f964f,0x753f753f,0x753f532f,0x753f964f,0x964f753f,0x964f753f,0x532f753f,0x964f753f,0x753f964f,0x753f753f,0x753f532f, +0xb96fb96f,0xb96fb96f,0x753fb96f,0xb96f984f,0xb95fb96f,0xb95fb95f,0xb96fb96f,0x984fb96f,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xbbbfcccf,0xbbbf888f,0x999fbbbf,0xaaafbbbf,0xaaafaaaf,0xbbbfaaaf,0xbbbfbbbf,0xbbbfbbbf,0x999fbbbf,0x943fa43f,0xdddf943f,0x943f943f,0xb54fa53f,0x943fa43f,0xdddf943f,0x943f943f,0x732fb54f, +0xcccfcccf,0x000fcccf,0xcccfcccf,0xcccf000f,0x000f000f,0xcccfcccf,0xcccf000f,0xcccfcccf,0xd41fd41f,0xa31fd41f,0xd41fd41f,0x000f000f,0x555f000f,0x555fd41f,0x000f555f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0x00000000,0x0000ffff,0x0000ffff,0xffff0000,0xffffffff,0xffffffff,0xffffffff,0xffffffff, +0x00000000,0x00000000,0x00000000,0x39bf3bef,0x379f379f,0x00003acf,0x00000000,0x00000000,0x00000000,0x00000000,0xcd0f0000,0x0000ff0f,0xbb0fff0f,0x0000ff0f,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x060f0000,0x962f0000,0x962f962f,0x060f060f,0x530f060f,0x060f0000,0x00000000, +0x888f999f,0x888fbbbf,0x999f888f,0x888faaaf,0x999f888f,0xaaaf999f,0xbbbf888f,0x888f888f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f666f,0x777f777f,0x777f777f,0x777f888f,0x964f964f,0x753f532f,0x532f753f,0x753f532f,0x753f753f,0x753f753f,0xb85fb85f,0x964f753f,0x964f964f,0x753f532f,0x532f753f,0x753f532f,0x753f753f,0x753f753f,0xb85fb85f,0x964f753f, +0x984f984f,0x984f984f,0xb96f984f,0xb95fb95f,0x984f984f,0x753f984f,0x984fb96f,0x984f984f,0xaaafcccf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0xaaaf999f,0xaaafaaaf,0xaaafaaaf,0x888fbbbf,0xaaaf888f,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0xaaaf999f,0xaaafaaaf,0xaaafaaaf,0x888fbbbf,0x732f732f,0xcccf732f,0x732f943f,0x732f732f,0x843f842f,0xcccf732f,0x842f943f,0x732f732f, +0xaaafcccf,0x000faaaf,0xaaafcccf,0xcccf000f,0x000fcccf,0xcccfcccf,0xaaaf000f,0xcccfaaaf,0x888fd41f,0x555f555f,0x000f000f,0x000f000f,0x000f000f,0x921f888f,0x555f000f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x00000000,0x0000ffff,0xffff0000,0xffffffff,0xffff0000,0x00000000,0x0000ffff,0xffff0000, +0x00000000,0x00000000,0x00000000,0x180f3acf,0x0000160f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xcd0fcd0f,0x890fff0f,0x00000000,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x00000000,0x962f060f,0x962f530f,0x060f962f,0x962f962f,0x962f962f,0x00004c2f, +0x999f999f,0xaaaf999f,0xbbbf888f,0x999f888f,0x777fcccf,0x888faaaf,0x888f888f,0x888f888f,0x777f777f,0x777f888f,0x888f777f,0x777f888f,0x777f666f,0x888f888f,0x777f888f,0x777f777f,0x964f964f,0xb85f753f,0x753fb85f,0x964fb85f,0xb85f532f,0x753fb85f,0x964f964f,0x753f888f,0x964f964f,0xb85f753f,0x753fb85f,0x964fb85f,0xb85f532f,0x753fb85f,0x964f964f,0x753f888f, +0xb95fb96f,0xb95fb95f,0xb96fb96f,0x984f984f,0x984f984f,0xb95fb95f,0xb95fb95f,0x984fb95f,0xaaafcccf,0xaaafbbbf,0xbbbfaaaf,0xaaafbbbf,0xaaaf999f,0xbbbfbbbf,0xaaafbbbf,0x888faaaf,0xaaaf888f,0xaaafbbbf,0xbbbfaaaf,0xaaafbbbf,0xaaaf999f,0xbbbfbbbf,0xaaafbbbf,0x888faaaf,0x732f843f,0xdddf842f,0x732f943f,0x732f522f,0x842f632f,0xdddf732f,0x732f943f,0x732f842f, +0xaaafaaaf,0xaaafcccf,0xcccfaaaf,0xaaafaaaf,0xcccfaaaf,0xaaafaaaf,0xaaafcccf,0xaaafaaaf,0x888fd41f,0x921f888f,0x000fd41f,0x000f000f,0x888f000f,0x921f555f,0x888f000f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x00000000,0x0000ffff,0xffff0000,0xffff0000,0x00000000,0x0000ffff,0x0000ffff,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x543f0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xff0f0000,0xbb0fff0f,0x890f890f,0x0000cd0f,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x4c2f0000,0x530f060f,0x4c2f0000,0x530f060f,0x4c2f530f,0x0000060f,0x060f060f, +0xaaaf888f,0xaaaf888f,0x888f999f,0x888f999f,0x999f999f,0x777f888f,0x777f777f,0x888f777f,0x777f666f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x777f777f,0x888f777f,0x666f888f,0x753f964f,0x964f753f,0xb85f964f,0x964f753f,0x964f666f,0x753f964f,0x964f532f,0x532f753f,0x753f964f,0x964f753f,0xb85f964f,0x964f753f,0x964f666f,0x753f964f,0x964f532f,0x532f753f, +0x653f753f,0x753f753f,0x653f653f,0x753f653f,0x753f753f,0x753f753f,0x653f653f,0x753f653f,0xaaafcccf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0xbbbfbbbf,0xaaafaaaf,0xbbbfaaaf,0x777fbbbf,0xaaaf777f,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0xbbbfbbbf,0xaaafaaaf,0xbbbfaaaf,0x777fbbbf,0xbbbfbbbf,0xdddfaaaf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xdddfbbbf,0xbbbfbbbf,0xbbbfbbbf, +0xa31fb31f,0x720f821f,0xa31fb31f,0x720f821f,0xa31fb31f,0x720f821f,0xa31fb31f,0x720f821f,0x921fa31f,0x921f921f,0x921f000f,0x921f000f,0x555f000f,0x000f921f,0x921f555f,0x921f921f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0x00000000,0xffff0000,0xffffffff,0xffff0000,0xffff0000,0xffffffff,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x180f543f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x180f0000,0x0000180f,0x00000000,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x060f4c2f,0x060f060f,0x060f0000,0x962f060f,0x0000530f,0x00000000,0x060f0000, +0x999fbbbf,0x888f888f,0x999f999f,0x777f888f,0x999f666f,0x777f888f,0xaaaf999f,0x888f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x777f777f,0x777f777f,0x777f777f,0x532f753f,0x753f964f,0x964f964f,0x753fb85f,0x753f753f,0x753f753f,0x753f753f,0xb85fb85f,0x532f753f,0x753f964f,0x964f964f,0x753fb85f,0x753f753f,0x753f753f,0x753f753f,0xb85fb85f, +0xb96fb96f,0xb96fb96f,0x984fb96f,0x984fb96f,0x984f984f,0x984f984f,0x753fb95f,0xb96fb96f,0xaaafcccf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0xbbbfbbbf,0xaaafaaaf,0xaaafaaaf,0x888faaaf,0xaaaf888f,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0xbbbfbbbf,0xaaafaaaf,0xaaafaaaf,0x888faaaf,0xa43f943f,0x943fa53f,0x943f943f,0xcccf943f,0xb54f943f,0x943f943f,0x943f943f,0xeeef943f, +0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xd41fd41f,0x555fd41f,0xd41fd41f,0xa31f555f,0x000f555f,0x555f000f,0xd41f555f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0x00000000,0xffff0000,0x0000ffff,0xffffffff,0x0000ffff,0x00000000,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x160f0000,0x0000180f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x180f0000,0x180f160f,0x0000160f,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x060f060f,0x060f0000,0x530f0000,0x4c2f962f,0x00004c2f,0x00000000,0x00000000, +0xaaafbbbf,0x777f777f,0x888f777f,0xcccf888f,0xcccfaaaf,0x999faaaf,0x888faaaf,0xaaafaaaf,0x888f777f,0x888f777f,0x777f666f,0x777f777f,0x777f777f,0x777f666f,0x777f777f,0x888f888f,0x964f753f,0x753f753f,0x753f754f,0x964f964f,0x532f753f,0x532fb85f,0xb85f753f,0x964f964f,0x964f753f,0x753f753f,0x753f532f,0x964f964f,0x532f753f,0x532fb85f,0xb85f753f,0x964f964f, +0x984fb95f,0xb96f753f,0xb96fb96f,0x984fb96f,0xb95fb96f,0x984fb95f,0x984f984f,0xb95f984f,0xbbbfcccf,0xbbbfaaaf,0xaaaf999f,0xaaafaaaf,0xaaafaaaf,0xaaaf999f,0xaaafaaaf,0x999fbbbf,0xbbbf888f,0xbbbfaaaf,0xaaaf999f,0xaaafaaaf,0xaaafaaaf,0xaaaf999f,0xaaafaaaf,0x999fbbbf,0x732f943f,0x732f732f,0x732f732f,0xcccf632f,0x732f943f,0x732f732f,0x732f732f,0xdddf832f, +0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0x888fd41f,0x921f555f,0x888fd41f,0x921f888f,0x555fd41f,0x921f888f,0x555fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x00000000,0x0000ffff,0xffff0000,0x0000ffff,0x00000000,0xffffffff,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x543f180f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x160f0000,0x180f180f,0x160f160f,0x00000000,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x00000000,0x00000000,0x962f0000,0x530f962f,0x0000060f,0x00000000,0x00000000, +0xaaafaaaf,0x777f888f,0xaaafbbbf,0x999f999f,0x999f777f,0x888f999f,0x999faaaf,0xaaaf888f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x777f777f,0x777f777f,0x753f964f,0xb85f532f,0x532f753f,0x532f753f,0x753f753f,0x532f753f,0x753f753f,0x964f964f,0x753f964f,0xb85f532f,0x532f753f,0x532f753f,0x753f753f,0x532f753f,0x753f753f,0x964f964f, +0xb96fb96f,0x984f984f,0xb96f984f,0x984fb96f,0xb96fb96f,0xb95f984f,0xb96fb96f,0xb96fb96f,0xaaafcccf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0xbbbfbbbf,0xaaafaaaf,0x888faaaf,0xaaaf888f,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0xbbbfbbbf,0xaaafaaaf,0x888faaaf,0x521f943f,0x732f842f,0x732f732f,0xdddf732f,0x732f943f,0x732f732f,0x732f842f,0xdddf832f, +0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0xffff0000,0x00000000,0x00000000,0xffffffff,0xffffffff,0x00000000,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x543f0000,0x0000160f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x180f160f,0x0000160f,0x00000000,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x00000000,0x00000000,0x962f0000,0x530f962f,0x00000000,0x00000000,0x00000000, +0x999f888f,0x777f888f,0x999faaaf,0xbbbf999f,0xbbbf888f,0x888f777f,0x999f888f,0x999f888f,0x777f777f,0x777f777f,0x888f666f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x753f964f,0x964fb85f,0x753f964f,0x964f888f,0x964f964f,0x753f753f,0x964f964f,0x532f753f,0x753f964f,0x964fb85f,0x753f964f,0x964f888f,0x964f964f,0x753f753f,0x964f964f,0x532f753f, +0x753f753f,0x763f753f,0x653f653f,0x653f763f,0x753f753f,0x653f753f,0x653f432f,0x753f653f,0x888faaaf,0x888f888f,0x999f777f,0x888f999f,0x888f888f,0x888f888f,0x888f888f,0x888f888f,0x888f888f,0x888f888f,0x999f777f,0x888f999f,0x888f888f,0x888f888f,0x888f888f,0x888f888f,0xbbbfbbbf,0xbbbfaaaf,0xbbbfbbbf,0xdddfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xcccfbbbf, +0xb31fc31f,0x921fa31f,0xb31fc31f,0x921fa31f,0xb31fc31f,0x921fa31f,0xb31fc31f,0x921fa31f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0x0000ffff,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0xffff0000, +0x00000000,0x00000000,0x00000000,0x00000000,0x0000160f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x180f0000,0x0000160f,0x00000000,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x00000000,0x00000000,0x530f0000,0x530f962f,0x00000000,0x00000000,0x00000000, +0xbbbfbbbf,0xaaafbbbf,0x777f999f,0x555f666f,0xbbbf555f,0xbbbfbbbf,0x555f888f,0x888fbbbf,0x333f555f,0x333f333f,0x555f333f,0x999f999f,0x999f000f,0x333f555f,0x333f333f,0x555f333f,0xddaf995f,0xdd9fdd9f,0xdd9fdd9f,0xdd9fdc9f,0xddafedaf,0xdd9fdd9f,0xdc9fdc9f,0xdd9fcc8f,0xbbbf554f,0x988f656f,0x988f988f,0x656f988f,0x656f777f,0x988f988f,0xa99f887f,0x988f766f, +0x653f432f,0x974f653f,0x653f331f,0x432f974f,0x653f653f,0x763f653f,0x763f653f,0x974f653f,0x653f653f,0x653f321f,0x653f653f,0x321f321f,0x653f321f,0x321f653f,0x653f653f,0x653f653f,0xaaafaaaf,0xbbbfaaaf,0xdddfcccf,0xdddfdddf,0xdddfdddf,0xdddfdddf,0xdddfdddf,0xeeefdddf,0xc81fc82f,0xda2fc91f,0xec3fdb2f,0xec3fed3f,0xec3fec3f,0xed4fed4f,0xed4fed4f,0xfe5ffd5f, +0x087f087f,0x098f087f,0x0bbf0aaf,0x0bbf0cbf,0x0bbf0bbf,0x0cbf0cbf,0x1ccf0ccf,0x4ddf1ccf,0x322f221f,0x322f322f,0x332f322f,0x332f332f,0x332f322f,0x332f332f,0x332f332f,0x221f332f,0x432f433f,0x432f432f,0x433f432f,0x433f433f,0x433f432f,0x433f433f,0x433f433f,0x322f433f,0x432f433f,0x432f432f,0x433f432f,0x433f433f,0x433f432f,0x433f433f,0x433f433f,0x322f433f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xbbbfbbbf,0x777f666f,0x555f222f,0xbbbfbbbf,0x777f555f,0x777f888f,0x333f999f,0x999f666f,0x555f555f,0x999f999f,0x999f999f,0x999f999f,0x999f333f,0x999f999f,0x555f000f,0x333f555f,0xdd9fddaf,0xedbfedaf,0xdc9fbb8f,0xdc9fdc9f,0xedafcb8f,0xdd9fffdf,0xdd9fdc9f,0xeeafdd9f,0x988f877f,0xbaaf988f,0xa9af878f,0x656f999f,0xbaafbaaf,0x988f665f,0xa99f544f,0x988f867f, +0x652f331f,0x321f653f,0x974f331f,0x653f432f,0x331f974f,0x974f653f,0x763f432f,0x974f432f,0xb95f653f,0xb95fb85f,0xb95fb95f,0xb95fb95f,0xb85fa85f,0xb95fb95f,0xb96fb95f,0x642fb95f,0xeeefdddf,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xdddfeeef,0xfe6fec4f,0xfe5ffe5f,0xff5fff5f,0xff5fff5f,0xff5fff5f,0xff5fff5f,0xff5fff5f,0xec3fff4f, +0x6ddf0bbf,0x6edf6ddf,0x8eef8eef,0x8eef8eef,0x7edf7edf,0x8eef8eef,0x7edf7edf,0x0bbf7edf,0x862f332f,0x962f962f,0x962f962f,0x752f752f,0x752f752f,0x962f752f,0x962f752f,0x322f862f,0xa72f433f,0xa61fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72f861f,0xa72f861f,0x221fa72f,0xa72f433f,0xa61fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72f861f,0xa72f861f,0x221fa72f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x777f555f,0x222f777f,0xbbbf555f,0x888fbbbf,0x222f333f,0x777f888f,0x555f333f,0x888f555f,0x000f555f,0x333f333f,0x333f000f,0x333f333f,0x333f999f,0x555f555f,0x999f555f,0x555f555f,0xeebfedaf,0xdc9ffecf,0xdd9fdd9f,0xdd9fdd9f,0xedafdd9f,0xedbfedaf,0xcc9fcc8f,0xfecfdc9f,0x766f876f,0xbaaf656f,0x888fbaaf,0x877fbbbf,0x544f656f,0xcbbf666f,0x876fcbbf,0x656f656f, +0x542f321f,0x432f642f,0x974f653f,0x653f331f,0x321f974f,0x763f653f,0x763f432f,0x974f432f,0xb95f321f,0x984f984f,0x974f984f,0x984f984f,0x984fa85f,0x984f984f,0xa85f984f,0x653fb95f,0xeeefdddf,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xdddfeeef,0xff6fed4f,0xff5fff5f,0xff5fff5f,0xff5fff5f,0xff5fff5f,0xff4fff5f,0xff4fff4f,0xec2fff3f, +0x8eef0cbf,0x8eef8eef,0x8eef9eef,0x8eef8eef,0x8eef8eef,0x8eef8eef,0x6ddf7edf,0x0bbf5ddf,0x962f332f,0x861f861f,0x861f861f,0xa72fa72f,0xa72fa72f,0xa72fa72f,0xa72fa61f,0x322f962f,0xa72f433f,0x861f861f,0x861f861f,0xa72fa72f,0xa72fa72f,0xa72fa72f,0xa72fa61f,0x221fa72f,0xa72f433f,0x861f861f,0x861f861f,0x851fa72f,0xa72f862f,0xa72fa72f,0xa72fa61f,0x221fa72f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x0000f60f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf60f0000, +0x444f777f,0x555f333f,0x666fbbbf,0x777f999f,0x555f333f,0x333f333f,0xaaaf555f,0x555fbbbf,0x999f555f,0x555f555f,0x000f555f,0x999f555f,0x555f555f,0x333f333f,0x333f333f,0x555f333f,0xdc9fcc8f,0xddafdd9f,0xddafdc9f,0xcc9fdc9f,0xdc9fdc9f,0xedafdd9f,0xdd9fdd9f,0xbb8fdd9f,0x777f888f,0xbaafbbbf,0x988f988f,0x656f877f,0x888f888f,0x766f998f,0x766f766f,0xa99fbaaf, +0x432f653f,0x432f642f,0x763f763f,0x653f331f,0x321f974f,0x974f653f,0x974f331f,0x763f432f,0xb95f653f,0xb95fa85f,0xb96fb96f,0xb96fb96f,0xb95fb96f,0xb95fb96f,0x984fb96f,0x321fb95f,0xeeefdddf,0xeeefeeef,0xeeefeeef,0xffffffff,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xdddfeeef,0xff5fed4f,0xff5fff5f,0xff5fff5f,0xff5fff5f,0xff5fff5f,0xff4fff4f,0xff4fff4f,0xec3fff4f, +0x9eef0cbf,0x8eef9eef,0x9eef8eef,0x9eef9eef,0x8eef9eef,0x8eef8eef,0x7edf7edf,0x0bbf7edf,0x862f322f,0xa61fa62f,0xa61fa61f,0xa61fa61f,0xa61fa61f,0xa62fa62f,0xa62fa62f,0x322f962f,0xa62f433f,0xa61fa62f,0xa61fa61f,0xa61fa61f,0xa61fa61f,0xa62fa62f,0xa62fa62f,0x221fa61f,0xa62f433f,0xa61fa62f,0xa61fa61f,0xcccf851f,0x851faaaf,0xa62fa62f,0xa62fa62f,0x221fa61f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x0000f60f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf60f0000, +0xbbbfbbbf,0x555f555f,0x888fbbbf,0x333f888f,0xaaaf555f,0x999f999f,0x777f555f,0x555faaaf,0x999f555f,0x333f999f,0x333f333f,0x333f333f,0x333f333f,0x999f999f,0x999f999f,0x000f999f,0xdc9fedaf,0xdc9fedbf,0xedbfedbf,0xedbfedaf,0xcc9fedaf,0xedafdc9f,0xcb8fdc9f,0xcc8fddaf,0xa99f656f,0x544f544f,0x555f999f,0x656f777f,0x766f999f,0xaaaf655f,0x888f988f,0x988faaaf, +0x432f653f,0x653f653f,0x763f763f,0x653f653f,0x432f653f,0x974f653f,0x974f331f,0x763f321f,0xb85f432f,0xb96f984f,0xb95fb95f,0xb95fb95f,0xb95fb95f,0xb95fb95f,0x984fb96f,0x653fb95f,0xffffdddf,0xeeefeeef,0xffffeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xdddfeeef,0xff5fed4f,0xff5fff5f,0xff4fff4f,0xff5fff4f,0xff5fff5f,0xff4fff4f,0xff4fff4f,0xed3fff4f, +0x9eef0cbf,0x9eef8eef,0x9eef8eef,0x9eef9eef,0x9eef9eef,0x7edf8eef,0x7edf7edf,0x0cbf7edf,0x752f332f,0x861f861f,0xa72f861f,0x861fa72f,0x861fa72f,0xa61f861f,0xa72fa72f,0x332f962f,0x752f433f,0x752f752f,0x962f752f,0x752f962f,0x752f962f,0x962f752f,0x962f962f,0x221f962f,0x752f433f,0x752f752f,0x962f752f,0xcccf752f,0x531f888f,0x962f752f,0x962f962f,0x221f962f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x0000f60f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf60f0000, +0x888f777f,0x555f777f,0x888f777f,0x333f777f,0xcccfaaaf,0x888f777f,0x555f666f,0x333f222f,0x333f333f,0x555f555f,0x333f555f,0x333f333f,0x000f555f,0x555f555f,0x333f333f,0x555f000f,0xddafcc8f,0xffffcc9f,0xeeafdc9f,0xddafddaf,0xfebfdd9f,0xcb8fdd9f,0xdc9fcc9f,0xcb8fdd9f,0xbbbf999f,0xa99f767f,0xaaaf778f,0x444f877f,0x765f444f,0xbbbf877f,0x555fcbcf,0x444f666f, +0x542f653f,0x653f653f,0x653f974f,0x653f653f,0x331f653f,0x864f653f,0x763f331f,0x653f432f,0xb95f321f,0xb96f984f,0x984fb95f,0xa85fa85f,0x984f984f,0xb95f984f,0x984fb95f,0x653fb95f,0xffffdddf,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xdddfeeef,0xff5fed4f,0xff4fff5f,0xff4fff4f,0xff4fff4f,0xff5fff5f,0xff4fff4f,0xff4fff4f,0xed3fff4f, +0x9eef0cbf,0x6ddf9eef,0x8eef6ddf,0x8eef8eef,0x8eef8eef,0x8eef8eef,0x7edf8eef,0x0cbf7edf,0x752f322f,0xa72fa61f,0xa72fa72f,0x861fa72f,0xa72fa72f,0xa72fa72f,0x861f861f,0x322f752f,0x322f432f,0x332f322f,0x332f332f,0x322f332f,0x332f332f,0x332f332f,0x322f322f,0x111f322f,0x322f432f,0x332f322f,0x332f332f,0xaaaf221f,0x221f777f,0x332f332f,0x322f322f,0x111f322f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x0000f60f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf00f0000, +0x777f777f,0x555f777f,0x333f666f,0x666f333f,0x888f666f,0x777faaaf,0x777f777f,0x555f777f,0x999f999f,0x666f555f,0x333f555f,0x999f999f,0x555f555f,0x555f555f,0x999f999f,0x000f999f,0xddafbb7f,0xdd9fcb9f,0xedafbb8f,0xdc9fdd9f,0xdd9fdc9f,0xffcfedbf,0xedafdd9f,0xdcafddaf,0xa99fa99f,0x988f777f,0xa99f988f,0xbaaf878f,0x766f998f,0x444f877f,0x888f444f,0x656f888f, +0x763f653f,0x653f432f,0x642f974f,0x321f653f,0x321f974f,0x542f763f,0x763f321f,0x653f331f,0xb95f321f,0xb96f984f,0x984fb95f,0xb96fb96f,0xb96fb96f,0xb95f984f,0x984fb95f,0x321fb95f,0xeeefdddf,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xdddfeeef,0xff5fed4f,0xff4fff5f,0xff4fff4f,0xff4fff4f,0xff4fff4f,0xff4fff4f,0xff4fff4f,0xec3fff4f, +0x9eef0cbf,0x8eef8eef,0x7edf8eef,0x8eef8eef,0x8eef8eef,0x8eef8eef,0x7edf8eef,0x0cbf6edf,0x962f332f,0xa72fa72f,0xa72fa72f,0x861fa72f,0x861f861f,0xa72fa61f,0xa72fa72f,0x332f962f,0x753f433f,0x752f753f,0x753f753f,0x652f753f,0x652f652f,0x753f752f,0x753f753f,0x221f753f,0x753f433f,0x752f753f,0x753f753f,0x999f642f,0x431f777f,0x753f752f,0x753f753f,0x221f753f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x0000f60f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf00ff60f, +0x777f777f,0x555f333f,0xbbbfaaaf,0x555f555f,0x444f555f,0x888f333f,0x333f777f,0xcccf666f,0x555f555f,0x333f555f,0x333f333f,0x333f333f,0x000f333f,0x333f333f,0x333f333f,0x555f555f,0xdd9fdd9f,0xdd9fedaf,0xdc9fdd9f,0xffbfedaf,0xdc9fddaf,0xdc9fdd9f,0xedafddaf,0xedafdc9f,0x656f656f,0xbbbfbbbf,0x888faaaf,0x444f988f,0xa88f656f,0x656f888f,0x666f877f,0x767f778f, +0x974f653f,0x653f331f,0x331f974f,0x432f974f,0x321f974f,0x432f763f,0x763f653f,0x653f331f,0xb95f321f,0xca6f984f,0x984fb95f,0xb95fb96f,0xb96fb95f,0xa85fa84f,0x984fb96f,0x753fb95f,0xffffdddf,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xdddfeeef,0xff6fed3f,0xff4fff5f,0xff4fff4f,0xff4fff4f,0xff4fff4f,0xff4fff4f,0xff4fff4f,0xec3fff3f, +0x9eef0cbf,0x8eef8eef,0x6ddf6ddf,0x6ddf6ddf,0x6edf6ddf,0x7edf7edf,0x7edf8eef,0x0bbf5ddf,0x962f322f,0xa62fa62f,0xa62fa62f,0xa61fa62f,0xa61fa61f,0xa62fa62f,0xa62fa62f,0x322f962f,0x962f432f,0x862f862f,0x862f862f,0x962f862f,0x962f962f,0x862f862f,0x862f862f,0x221f852f,0x962f432f,0x862f862f,0x862f862f,0x641f741f,0x751f641f,0x862f862f,0x862f862f,0x221f852f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf60ff00f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf00ff60f, +0x222f777f,0xbbbf555f,0x777fbbbf,0xbbbf666f,0x777faaaf,0x444f555f,0x222f333f,0xbbbfcccf,0x999f555f,0x000f999f,0x333f999f,0x555f555f,0x999f555f,0x999f999f,0x999f999f,0x999f999f,0xddafedaf,0xedafeebf,0xdc9fedaf,0xddafedbf,0xffdffebf,0xdd9fcb8f,0xdcafdc9f,0xdd9fdc9f,0x555f666f,0x544f544f,0x988f988f,0x877faa9f,0x655f999f,0x988f656f,0x656fbaaf,0x566f988f, +0x974f653f,0x753f331f,0x432f974f,0x432f653f,0x432f653f,0x321f974f,0x653f653f,0x763f331f,0xb95f653f,0xb96fa95f,0x984fb95f,0xb95fb96f,0xb96fb95f,0xb95f984f,0x984fb96f,0x653fb95f,0xffffdddf,0xeeefffff,0xeeefffff,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xcccfeeef,0xff6fed4f,0xff4fff6f,0xff4fff6f,0xff4fff4f,0xff4fff4f,0xff4fff4f,0xfe3fff4f,0xec2ffe3f, +0x9eef0cbf,0x8eefaeef,0x6ddfaeef,0x6ddf6ddf,0x6ddf6ddf,0x6ddf6ddf,0x5ddf6ddf,0x0bbf3dcf,0x962f332f,0xa72fa72f,0xa61fa72f,0xa72f861f,0xa72fa72f,0xa72fa72f,0xa72fa72f,0x322f962f,0xa72f433f,0xa72fa72f,0xa61fa72f,0xa72f861f,0xa72fa72f,0xa72fa72f,0xa72fa72f,0x221f962f,0xa72f433f,0xa72fa72f,0xa61fa72f,0xa72f861f,0xa72fa72f,0xa72fa72f,0xa72fa72f,0x221f962f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf60ff00f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf00ff60f, +0x555f888f,0xbbbfbbbf,0x333f888f,0x666fbbbf,0x999fbbbf,0x555f999f,0xcccf555f,0x777f777f,0x333f555f,0x333f333f,0x333f333f,0x555f333f,0x555f000f,0x333f555f,0x333f333f,0x555f999f,0xba7fcb8f,0xdd9fedaf,0xddafdd9f,0xdc9fedaf,0xdd9fdd9f,0xeebfdd9f,0xedafdd9f,0xeeafcb8f,0x656f988f,0xaaafaaaf,0x656f877f,0xcbcfcbcf,0x877f444f,0x765fbbbf,0x988f877f,0x444f666f, +0x974f653f,0x653f432f,0x974f653f,0x653f432f,0x321f653f,0x432f974f,0x974f653f,0x763f432f,0xb95f653f,0xb96f984f,0x974fb85f,0xb96fb96f,0xb96fb96f,0xb95f984f,0x984fb96f,0x653fb95f,0xffffdddf,0xeeefffff,0xffffffff,0xffffeeef,0xffffffff,0xffffffff,0xeeefffff,0xdddfeeef,0xff6fed4f,0xff4fff6f,0xff6fff6f,0xff5fff5f,0xff5fff5f,0xff5fff5f,0xff5fff5f,0xec3fff4f, +0x9eef0cbf,0x8eefaeef,0x9eef9eef,0x9eef9eef,0x9eef9eef,0x9eef9eef,0x8eef9eef,0x0cbf8eef,0x752f322f,0x861f861f,0xa72f861f,0xa72fa72f,0x861f861f,0xa61f861f,0x861fa72f,0x322f752f,0x861f432f,0x861f861f,0xa72f861f,0xa72fa72f,0x861f861f,0xa61f861f,0x861fa72f,0x221f752f,0x861f432f,0x861f861f,0xa72f861f,0xa72fa72f,0x861f861f,0xa61f861f,0x861fa72f,0x221f752f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf60ff00f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf00ff60f, +0xaaaf555f,0x777f777f,0x333f777f,0x999fbbbf,0x777f777f,0x333f888f,0x555f555f,0x888f999f,0x555f555f,0x333f999f,0x999f333f,0x333f999f,0x333f000f,0x999f999f,0x555f999f,0x555f555f,0xedafddaf,0xedafaa6f,0xeebfcc8f,0xdcafdd9f,0xfebffebf,0xdc9feeaf,0xdd9fdd9f,0xdd9fdd9f,0xbaaf656f,0x444fbaaf,0x544fa88f,0x766f665f,0x766f988f,0x988f656f,0x776f877f,0x655fbbbf, +0x763f432f,0x653f432f,0x974f653f,0x642f321f,0x542f331f,0x432f975f,0x974f653f,0x974f432f,0xb85f653f,0xb95f984f,0x984fb95f,0x984f984f,0x984f984f,0xb95f984f,0x984fb96f,0x653fb95f,0xffffdddf,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xeeefffff,0xcccfeeef,0xff7fed4f,0xff7fff7f,0xff6fff6f,0xff6fff6f,0xff6fff6f,0xff5fff5f,0xff5fff5f,0xec3ffe4f, +0xaeef0cbf,0xaeefaeef,0xaeefaeef,0xaeefaeef,0xaeefaeef,0xaeef9eef,0x8eef9eef,0x0baf6ddf,0x962f332f,0xa72fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72fa72f,0xa72fa72f,0x322f962f,0xa72f433f,0xa72fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72fa72f,0xa72fa72f,0x221f962f,0xa72f433f,0xa72fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72fa72f,0xa72fa72f,0x221f962f, +0x00000000,0x00000000,0x00000000,0xf22ff22f,0xe11ff22f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xc97fc97f,0x965fc97f,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf60ff00f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf00ff60f, +0x555f555f,0x777faaaf,0x333f666f,0x888f777f,0x777f999f,0x555f333f,0x555faaaf,0x333f555f,0x555f000f,0x555f555f,0x555f333f,0x555f555f,0x999f999f,0x555f555f,0x999f555f,0x000f999f,0xedafcc9f,0xcb9fedaf,0xdc9fddaf,0xdd9fdd9f,0xdd9fddaf,0xffcfdd9f,0xdc9fdc9f,0xbb7fdc9f,0xbaaf656f,0x655fbaaf,0x888f765f,0x555f777f,0x544fa99f,0x544faaaf,0x656f655f,0x988f777f, +0x763f331f,0x653f331f,0x974f653f,0x974f432f,0x542f321f,0x331f974f,0x974f653f,0x974f321f,0xb85f321f,0xb96f984f,0xb95fb85f,0xb85fb95f,0xb95fb95f,0xb95fb95f,0xa85fb96f,0x652fb95f,0xffffdddf,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xeeefffff,0xeeefeeef,0xcccfdddf,0xff7fed5f,0xff7fff7f,0xff7fff7f,0xff6fff7f,0xff6fff6f,0xff5fff6f,0xfe4ffe4f,0xeb2ffd4f, +0xaeef0cbf,0xaeefaeef,0xaeefaeef,0xaeefaeef,0x9eefaeef,0x8eef9eef,0x3dcf5ddf,0x0baf2dcf,0x862f322f,0xa61fa61f,0xa62fa62f,0xa61fa62f,0xa61fa61f,0xa61fa61f,0xa62fa62f,0x322f862f,0xa62f432f,0xa61fa61f,0xa62fa62f,0xa61fa62f,0xa61fa61f,0xa61fa61f,0xa62fa62f,0x221f862f,0xa62f432f,0xa61fa61f,0xa62fa62f,0xa61fa62f,0xa61fa61f,0xa61fa61f,0xa62fa62f,0x221f862f, +0x00000000,0x00000000,0xf22f0000,0xe11fffff,0xc12fe11f,0x0000911f,0x00000000,0x00000000,0x00000000,0x00000000,0xc97f0000,0x965fc97f,0x965f965f,0x0000754f,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf00ff00f,0x0000f60f,0x00000000,0x00000000,0x00000000,0x00000000,0xf60f0000,0xf00ff00f, +0xbbbfbbbf,0x333f333f,0x333f333f,0x777f666f,0x333f444f,0x999fbbbf,0x777f777f,0x555f555f,0x333f555f,0x333f333f,0x333f333f,0x333f333f,0x999f999f,0x333f333f,0x333f333f,0x555f333f,0xddafeebf,0xeebfdc9f,0xdc9fddaf,0xbb7fedaf,0xdd9fcb8f,0xdc9fdd9f,0xedafedaf,0xdc9fdc9f,0xa99fbaaf,0x545f988f,0xbaafbaaf,0x877fa9af,0x999faaaf,0xaaaf877f,0x554fa99f,0x887f877f, +0x974f321f,0x653f321f,0x974f653f,0x653f321f,0x652f331f,0x321f974f,0x642f653f,0x974f432f,0xb95f321f,0xb96f984f,0xb95fb96f,0xb96fb96f,0xb96fb96f,0xb96fb96f,0x984fb96f,0x321fb95f,0xffffdddf,0xffffffff,0xffffffff,0xffffffff,0xeeefffff,0xeeefeeef,0xdddfdddf,0xcccfdddf,0xff7fed5f,0xff7fff7f,0xff7fff7f,0xff6fff6f,0xff6fff6f,0xfe4fff5f,0xfd3ffd3f,0xeb2ffd3f, +0xaeef0cbf,0xaeefaeef,0xaeefaeef,0xaeefaeef,0x8eef9eef,0x5ddf7edf,0x0ccf1ccf,0x0baf0cbf,0x962f332f,0xa72fa72f,0x861fa72f,0x861fa72f,0x861f861f,0x861f861f,0xa61fa72f,0x332f962f,0xa72f433f,0xa72fa72f,0x861fa72f,0x861fa72f,0x861f861f,0x861f861f,0xa61fa72f,0x221f962f,0xa72f433f,0xa72fa72f,0x861fa72f,0x861fa72f,0x861f861f,0x861f861f,0xa61fa72f,0x221f962f, +0x00000000,0x00000000,0xe11ff22f,0xe11fe11f,0xcccfe11f,0x911f911f,0x00000000,0x00000000,0x00000000,0x00000000,0x965f0000,0x965f965f,0x754f965f,0x0000754f,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf60ff00f,0x0000f00f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf00ff60f, +0x777fbbbf,0xbbbf777f,0xbbbfaaaf,0x333f555f,0xcccf666f,0x777faaaf,0x777f999f,0x333f888f,0x999f555f,0x999f333f,0x555f000f,0x333f555f,0x333f333f,0x333f000f,0x555f555f,0x999f999f,0xedafffdf,0xba7fcc8f,0xdc9fdc9f,0xfebfdc9f,0xfebfedaf,0xddafedaf,0xdd9fedaf,0xdc9fedaf,0x998fbaaf,0xbaafbbbf,0x877fa99f,0xaaaf999f,0x877f888f,0x988f999f,0xb99f555f,0x544fbbbf, +0x653f432f,0x653f542f,0x763f653f,0x653f432f,0x642f653f,0x331f653f,0x974f653f,0x321f974f,0xb95f321f,0x984f974f,0x984fa85f,0x984f984f,0xa84f974f,0xa85f984f,0xa85fa85f,0x321fb85f,0xffffdddf,0xeeefffff,0xffffffff,0xffffffff,0xeeefeeef,0xeeefeeef,0xdddfdddf,0xcccfdddf,0xff6fed4f,0xff6fff6f,0xff6fff6f,0xff6fff6f,0xff5fff5f,0xfe3ffe4f,0xfd3ffd3f,0xeb2ffd3f, +0xaeef0cbf,0x9eef9eef,0xaeefaeef,0x9eefaeef,0x7edf8eef,0x2dcf4ddf,0x0ccf1ccf,0x0baf0ccf,0x752f332f,0xa72fa61f,0xa72fa72f,0x861fa72f,0xa72fa72f,0x861fa72f,0x861f861f,0x332f752f,0x861f433f,0xa72fa61f,0xa72fa72f,0x861fa72f,0xa72fa72f,0x861fa72f,0x861f861f,0x221f752f,0x861f433f,0xa72fa61f,0xa72fa72f,0x861fa72f,0xa72fa72f,0x861fa72f,0x861f861f,0x221f752f, +0x00000000,0x00000000,0xe11fcccf,0xcccfc12f,0x911fc12f,0x999f911f,0x00000000,0x00000000,0x00000000,0x00000000,0x965f0000,0x754f754f,0x754f754f,0x0000754f,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf60ff00f,0x00000000,0x0000f00f,0x0000f60f,0x00000000,0xf60f0000,0x0000f60f,0xf00ff00f, +0x888f777f,0xaaaf444f,0x777f888f,0x555f777f,0x555f555f,0x999f777f,0x999f888f,0x333f333f,0x555f555f,0x333f555f,0x333f333f,0x333f333f,0x555f555f,0x999f999f,0x333f555f,0x555f333f,0xdcafedaf,0xcc9fdc9f,0xdc9fddaf,0xedafdd9f,0xddafba7f,0xdd9fbb7f,0xcb9fedaf,0xedafcc9f,0x776f998f,0x877f666f,0x999f656f,0x544f877f,0xbaafbbbf,0xa99f887f,0x655f877f,0x877f766f, +0x653f321f,0x432f974f,0x763f653f,0x331f432f,0x653f974f,0x321f974f,0x763f652f,0x653f331f,0xb95f432f,0xb95fb95f,0xb95fb95f,0xa85fa85f,0xb95fb95f,0xb95fa85f,0xb95fb95f,0x653fb95f,0xffffdddf,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xdddfeeef,0xdddfdddf,0xcccfdddf,0xff5fed4f,0xff5fff5f,0xff5fff5f,0xff5fff5f,0xff5fff5f,0xfd3ffe4f,0xfc2ffd3f,0xeb2ffc2f, +0x9eef0cbf,0x7edf8eef,0x8eef8eef,0x7edf8eef,0x6edf7edf,0x0ccf3dcf,0x0cbf0cbf,0x0a9f0cbf,0x862f332f,0x752f752f,0x962f752f,0x752f962f,0x962f962f,0x962f752f,0x962f962f,0x332f862f,0x962f433f,0x752f752f,0x962f752f,0x752f962f,0x962f962f,0x962f752f,0x962f962f,0x221f862f,0x962f433f,0x752f752f,0x962f752f,0x752f962f,0x962f962f,0x962f752f,0x962f962f,0x221f862f, +0x00000000,0x00000000,0xc12f0000,0x911f911f,0x911f911f,0x0000911f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x655f0000,0x0000443f,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf60ff00f,0xf60ff00f,0xf60ff00f,0x0000f00f,0xf00f0000,0xf00ff60f,0xf60ff00f,0xf00ff00f, +0x777f777f,0x444f777f,0x222f222f,0x555f333f,0x888faaaf,0x555f555f,0x444f444f,0x666f333f,0x333f333f,0x333f333f,0x999f000f,0x555f999f,0x555f555f,0x333f555f,0x333f333f,0x555f555f,0xedafdc9f,0xcb8fdd9f,0xddafffdf,0xeebfcc8f,0xfebfdd9f,0xdc9fdc9f,0xdd9fdc9f,0xcc8fdd9f,0x988f544f,0xa99f444f,0x656f988f,0x988f544f,0x544f544f,0xa98f444f,0x656fbaaf,0x999fb88f, +0x653f542f,0x331f763f,0x653f642f,0x432f653f,0x653f653f,0x321f653f,0x653f653f,0x763f652f,0x653f653f,0x653f321f,0x653f653f,0x653f321f,0x653f653f,0x653f653f,0x321f321f,0x653f321f,0xeeefeeef,0xeeefeeef,0xdddfdddf,0xdddfdddf,0xdddfdddf,0xdddfdddf,0xdddfdddf,0xcccfdddf,0xff4fff4f,0xfe4ffe4f,0xfd3ffd3f,0xfc3ffd3f,0xfd3ffc3f,0xfc3ffc3f,0xfc3ffc3f,0xfb3ffc3f, +0x6ddf7edf,0x4ddf5ddf,0x1ccf2dcf,0x0cbf0cbf,0x0ccf0cbf,0x0cbf0cbf,0x0cbf0cbf,0x0bbf0bbf,0x322f221f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x211f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x211f221f, +0x00000000,0x00000000,0x00000000,0x744f0000,0x0000522f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x655f0000,0x0000443f,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f, +0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x888f666f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x888f666f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x888f666f,0x777f777f,0x777f777f,0x777f777f,0xb96fb96f,0xb95fb96f,0xb96fb96f,0x984fb96f,0x984f984f,0xb96f753f,0xb96fb96f,0x984fb96f, +0xbbbfbbbf,0xaaafbbbf,0x777f999f,0x141f242f,0xbbbf555f,0xbbbfbbbf,0x555f888f,0x888fbbbf,0x111f111f,0x001f111f,0x111f001f,0x001f001f,0x000f111f,0x111f001f,0x111f112f,0x111f000f,0x324f436f,0x038f000f,0x325f018f,0x112f325f,0x001f112f,0x000f038f,0x112f112f,0x112f000f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x432f433f,0x432f432f,0x433f432f,0x433f433f,0x433f432f,0x433f433f,0x433f433f,0x221f433f,0x432f433f,0x432f432f,0x433f432f,0x433f433f,0x433f432f,0x433f433f,0x433f433f,0x322f433f,0x110f110f,0x110f000f,0x110f110f,0x000f000f,0x110f000f,0x000f110f,0x110f110f,0x110f110f, +0x333f333f,0x333f333f,0x222f333f,0x222f222f,0x333f222f,0x333f333f,0x222f222f,0x333f333f,0x333f333f,0x333f333f,0x222f333f,0x222f222f,0x333f222f,0x333f333f,0x222f222f,0x333f333f,0x333f333f,0x333f333f,0x222f333f,0x222f222f,0x333f222f,0x333f333f,0x222f222f,0x333f333f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x777f777f,0x888f888f,0x888f888f,0x888f888f,0x888f777f,0x888f888f,0x777f666f,0x777f777f,0x777f777f,0x888f888f,0x888f888f,0x888f888f,0x888f777f,0x888f888f,0x777f666f,0x777f777f,0x777f777f,0x888f888f,0x888f888f,0x888f888f,0x888f777f,0x888f888f,0x777f666f,0x777f777f,0x221fb96f,0x211f211f,0x211f211f,0x570f781f,0x221f221f,0x211f211f,0x211f211f,0x984f221f, +0xbbbfbbbf,0x777f666f,0x141f222f,0x383f383f,0x777f141f,0x777f888f,0x121f999f,0x999f666f,0x111f001f,0x000f000f,0x111f000f,0x111f001f,0x325f000f,0x111f111f,0x000f111f,0x111f335f,0x324f436f,0x038f213f,0x325f018f,0x112f325f,0x325f112f,0x324f325f,0x001f324f,0x325f325f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa72f433f,0xa61fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72f861f,0xa72f861f,0x861f861f,0x861f861f,0xa61fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72f861f,0xa72f861f,0x221fa72f,0xb95f110f,0x221fb85f,0xa74fa74f,0xa74fa74f,0xa74fa64f,0xa74fa74f,0xb96f221f,0x110fb95f, +0x666f333f,0x666f555f,0x555f444f,0x777f777f,0x666f444f,0x666f666f,0x444f555f,0x333f555f,0x666f333f,0x666f555f,0x555f444f,0x777f777f,0x666f444f,0x666f666f,0x444f555f,0x333f555f,0x666f333f,0x666f555f,0x555f444f,0x777f777f,0x666f444f,0x666f666f,0x444f555f,0x333f555f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x666f777f,0x777f777f,0x777ffe4f,0x777f777f,0x777f888f,0x777f777f,0xfe4fffbf,0x777f777f,0x666f777f,0x777f777f,0x777fb98f,0x777f777f,0x777f888f,0x777f777f,0xb98fda9f,0x777f777f,0x666f777f,0x777f777f,0x777f333f,0x777f777f,0x777f888f,0x777f777f,0x333f333f,0x777f777f,0xb11fb96f,0x221f911f,0x247f358f,0x570f781f,0x321f321f,0x781f321f,0x321f570f,0x984f431f, +0x777f141f,0x121f777f,0x383f141f,0x262fbbbf,0x010f333f,0x777f888f,0x141f121f,0x888f141f,0x000f111f,0x335f325f,0x001f335f,0x000f001f,0x112f335f,0x001f111f,0x335f000f,0x111f112f,0x324f000f,0x038f038f,0x213f213f,0x112f112f,0x112f000f,0x213f213f,0x325f324f,0x038f038f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa72f433f,0x861f861f,0x861f861f,0xa72fa72f,0xa72fa72f,0xa72fa72f,0xa72fa61f,0x531fa72f,0xa72f531f,0x861f861f,0x861f861f,0xa72fa72f,0xa72fa72f,0xa72fa72f,0xa72fa61f,0x221fa72f,0xb95f000f,0xa63f211f,0x963fa63f,0xa63fa63f,0xa63fa74f,0xa63fa63f,0x221fa63f,0x110fb95f, +0x555f222f,0x555f777f,0x888f666f,0x777f888f,0x555f666f,0x777f888f,0x777f555f,0x333f555f,0x555f222f,0x555f777f,0x888f666f,0x777f888f,0x555f666f,0x777f888f,0x777f555f,0x333f555f,0x555f222f,0x555f777f,0x555f666f,0x777f555f,0x555f666f,0x777f888f,0x777f555f,0x333f555f,0x0000f60f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf60f0000, +0x888f777f,0x777f777f,0x666f777f,0xffbf777f,0x777ffa2f,0x777f777f,0x777f777f,0x777f777f,0x888f777f,0x777f777f,0x666f777f,0xda9f777f,0x777fa87f,0x777f777f,0x777f777f,0x777f777f,0x888f777f,0x777f777f,0x666f777f,0x333f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0xbbbf653f,0x186f888f,0x247f358f,0x570f781f,0x911fb11f,0x781f321f,0x186f570f,0x753f065f, +0x131f252f,0x141f121f,0x252fbbbf,0x777f999f,0x141f333f,0x333f121f,0xaaaf141f,0x141fbbbf,0x000f001f,0x212f112f,0x111f001f,0x436f111f,0x112f112f,0x111f001f,0x001f000f,0x111f111f,0x324f000f,0x018f038f,0x000f112f,0x324f436f,0x325f325f,0x213f112f,0x112f001f,0x018f038f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa62f433f,0xa61fa62f,0xa61fa61f,0xa61fa61f,0xa61fa61f,0xa62fa62f,0xa62fa62f,0xcccf851f,0x851faaaf,0xa61fa62f,0xa61fa61f,0xa61fa61f,0xa61fa61f,0xa62fa62f,0xa62fa62f,0x221fa61f,0x221f110f,0x532fa64f,0x532f421f,0x532f532f,0x421f421f,0x532f532f,0xa63f532f,0x000f221f, +0x555f222f,0x666f555f,0x222f666f,0x333f333f,0x222f222f,0x444f222f,0x888f666f,0x222f666f,0x555f222f,0x666f555f,0x666f999f,0x888f888f,0x666f555f,0x555f555f,0x888f666f,0x222f666f,0x555f222f,0xcccf555f,0x555fcccf,0x666f555f,0x666f666f,0xcccf666f,0x888fcccf,0x222f666f,0x0000f60f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf60f0000, +0x888f777f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x888f888f,0x666f888f,0x888f777f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x888f888f,0x666f888f,0x888f777f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x888f888f,0x666f888f,0xb11fb96f,0x186f911f,0x247f358f,0x333f444f,0x911fb11f,0x781f321f,0xbbbf570f,0xb96f888f, +0xbbbfbbbf,0x141f555f,0x888fbbbf,0x333f888f,0x373f141f,0x373f999f,0x777f141f,0x555faaaf,0x000f001f,0x111f112f,0x111f111f,0x111f001f,0x001f000f,0x001f111f,0x001f112f,0x111f111f,0x112f000f,0x018f038f,0x000f112f,0x213f436f,0x038f214f,0x213f038f,0x112f001f,0x018f038f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x752f433f,0x752f752f,0x962f752f,0x752f962f,0x752f962f,0x962f752f,0x962f962f,0xcccf752f,0x531f888f,0x752f752f,0x962f752f,0x752f962f,0x752f962f,0x962f752f,0x962f962f,0x221f962f,0xa74f100f,0x532fa63f,0xa53f953f,0xa74f532f,0x421fa74f,0xb74f953f,0xa63f532f,0x110fa74f, +0x777f333f,0x444f777f,0x000f333f,0x000f000f,0x000f000f,0x333f000f,0x888f555f,0x222f777f,0x777f333f,0x666f777f,0x777f888f,0x555f777f,0x888f666f,0x999f999f,0x888f777f,0x222f777f,0x777f333f,0xbbbf888f,0xbbbfbbbf,0x555f333f,0x888f888f,0xbbbfcccf,0x777fbbbf,0x222f777f,0x0000f60f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf60f0000, +0x777f777f,0x777f777f,0xffff777f,0x777fffbf,0x666f777f,0xffbfffff,0x777f777f,0x777f666f,0x777f777f,0x777f777f,0xecaf777f,0x777fda9f,0x666f777f,0xda9fecaf,0x777f777f,0x777f666f,0x777f777f,0x777f777f,0x444f777f,0x777f333f,0x666f777f,0x333f444f,0x777f777f,0x777f666f,0xb11f984f,0x186f911f,0x247f358f,0x333f444f,0xb11f431f,0x781f911f,0x186f570f,0x984f065f, +0x888f777f,0x141f777f,0x888f252f,0x121f777f,0xcccf383f,0x262f777f,0x555f666f,0x121f121f,0x111f111f,0x001f111f,0x000f000f,0x000f000f,0x001f111f,0x111f000f,0x111f111f,0x001f001f,0x112f000f,0x018f038f,0x436f112f,0x213f436f,0x038f213f,0x213f018f,0x325f001f,0x018f038f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x322f432f,0x332f322f,0x332f332f,0x322f332f,0x332f332f,0x332f332f,0x322f322f,0xaaaf221f,0x221f777f,0x332f322f,0x332f332f,0x322f332f,0x332f332f,0x332f332f,0x322f322f,0x111f322f,0xa74f000f,0x532fa63f,0xa63fa74f,0x952f421f,0x431fa63f,0x953f852f,0xa63f532f,0x110fa74f, +0x555f222f,0x222f777f,0x000f000f,0x000f000f,0x000f000f,0x000f000f,0x666faaaf,0x222f333f,0x555f222f,0x666f777f,0x777f777f,0x555f777f,0x999f999f,0x888f777f,0x666f777f,0x222f333f,0x555f222f,0x777f777f,0xbbbfbbbf,0x666f888f,0xcccf555f,0x777fbbbf,0x666f777f,0x222f333f,0x0000f60f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf00f0000, +0x888f888f,0xffff777f,0xfe4fffbf,0xfa2ffe4f,0x777f777f,0xfa2ffe4f,0x888f888f,0x666f888f,0x888f888f,0xecaf777f,0xb98fda9f,0xa87fb98f,0x777f777f,0xa87fb98f,0x888f888f,0x666f888f,0x888f888f,0x444f777f,0x333f333f,0x333f333f,0x777f777f,0x333f333f,0x888f888f,0x666f888f,0xb11fb96f,0x186f911f,0x247f358f,0x570f781f,0xb11f321f,0x781f911f,0x186f570f,0xb96f065f, +0x777f777f,0x141f262f,0x121f252f,0x242f333f,0x363f242f,0x262faaaf,0x777f777f,0x555f262f,0x111f111f,0x111f111f,0x335f335f,0x335f335f,0x000f001f,0x001f335f,0x000f000f,0x001f000f,0x112f325f,0x018f038f,0x111f112f,0x111f436f,0x038f111f,0x325f018f,0x213f324f,0x018f038f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x753f433f,0x752f753f,0x753f753f,0x652f753f,0x652f652f,0x753f752f,0x753f753f,0x999f642f,0x431f777f,0x752f753f,0x753f753f,0x652f753f,0x652f652f,0x753f752f,0x753f753f,0x221f753f,0xa74f000f,0x532fa63f,0x431f532f,0x532f532f,0x532f421f,0x421f431f,0xa63f532f,0x000fa74f, +0x666f333f,0x222f777f,0x000f000f,0x111f000f,0x111f111f,0x000f111f,0x888faaaf,0x222f666f,0x666f333f,0x666f777f,0x555f777f,0x777f666f,0x888f777f,0x777f888f,0x888f888f,0x222f666f,0x666f333f,0x666f777f,0x666f555f,0x555f555f,0x666f555f,0x666f777f,0x888f555f,0x222f666f,0x0000f60f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf00ff60f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x666f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x666f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x666f777f,0x777f777f,0x777f777f,0x777f777f,0x753f753f,0x653f653f,0x653f653f,0x753f653f,0x753f753f,0x653f653f,0x653f653f,0x753f753f, +0x777f777f,0x141f121f,0xbbbf383f,0x131f141f,0x131f242f,0x888f333f,0x333f777f,0xcccf242f,0x111f111f,0x001f000f,0x112f111f,0x112f112f,0x000f111f,0x000f112f,0x335f324f,0x112f112f,0x112f000f,0x018f213f,0x111f112f,0x325f325f,0x038f111f,0x213f018f,0x000f213f,0x112f038f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x962f432f,0x862f862f,0x862f862f,0x962f862f,0x962f962f,0x862f862f,0x862f862f,0x641f741f,0x751f641f,0x862f862f,0x862f862f,0x962f862f,0x962f962f,0x862f862f,0x862f862f,0x221f852f,0xa74f000f,0x532fa63f,0xa63fa74f,0xa74f532f,0x532fa74f,0xa64fa63f,0xa63f532f,0x110fa74f, +0x555f222f,0x222f555f,0xbbbf777f,0xaaafaaaf,0xaaafaaaf,0x666faaaf,0x555faaaf,0x333f555f,0x555f222f,0x666f555f,0x888f888f,0x666f666f,0x555f666f,0x777f555f,0x555f888f,0x333f555f,0x555f222f,0x666f666f,0x444f777f,0x888f444f,0x555f888f,0x444f666f,0x555f666f,0x333f555f,0xf60ff00f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf00ff60f, +0xffbf777f,0x666ffe4f,0x777f888f,0x777f777f,0xffbfffff,0x888f888f,0x888f888f,0x888f888f,0xda9f777f,0x666fb98f,0x777f888f,0x777f777f,0xda9fecaf,0x888f888f,0x888f888f,0x888f888f,0x333f777f,0x666f333f,0x777f888f,0x777f777f,0x333f444f,0x888f888f,0x888f888f,0x888f888f,0x984fb96f,0x984f984f,0xb96f984f,0xb95fb95f,0x984f984f,0x753f984f,0x984fb96f,0x984f984f, +0x010f777f,0xbbbf141f,0x262f383f,0xbbbf252f,0x262faaaf,0x131f242f,0x222f131f,0xbbbfcccf,0x000f001f,0x112f335f,0x111f001f,0x112f213f,0x001f111f,0x000f111f,0x112f112f,0x111f001f,0x112f000f,0x018f213f,0x111f112f,0x038f038f,0x038f111f,0x001f018f,0x000f038f,0x112f038f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa72f433f,0xa72fa72f,0xa61fa72f,0xa72f861f,0xa72fa72f,0xa72fa72f,0xa72fa72f,0xa72f861f,0xa72fa72f,0xa72fa72f,0xa61fa72f,0xa72f861f,0xa72fa72f,0xa72fa72f,0xa72fa72f,0x221f962f,0xa74f110f,0x532f953f,0xa63fa74f,0xa74f532f,0x532fa74f,0xa74fa63f,0xa63f532f,0x110fb74f, +0x444f222f,0x888f777f,0x555f555f,0x555f444f,0x555f555f,0x444f555f,0x555f777f,0x333f777f,0x444f222f,0x888f777f,0x777f999f,0x999f777f,0x888f999f,0x666f777f,0x555f666f,0x333f777f,0x444f222f,0x888f777f,0x555f555f,0x222f888f,0x666f222f,0x666f555f,0x555f777f,0x333f777f,0xf60ff00f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf00ff60f, +0x777f777f,0x777f777f,0x777f777f,0xffbf777f,0xfa2ffa2f,0x777ffa2f,0x777f777f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0xda9f777f,0xa87fa87f,0x777fa87f,0x777f777f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x333f333f,0x777f333f,0x777f777f,0x777f888f,0x211f984f,0x211f211f,0x211f211f,0x221f211f,0x221f221f,0x211f211f,0x247f358f,0x984f221f, +0x555f888f,0xbbbfbbbf,0x121f262f,0x666fbbbf,0x373fbbbf,0x141f999f,0xcccf555f,0x777f777f,0x111f001f,0x111f111f,0x111f111f,0x212f111f,0x001f001f,0x001f001f,0x001f112f,0x111f111f,0x000f000f,0x213f213f,0x324f112f,0x018f038f,0x038f111f,0x324f325f,0x000f038f,0x112f038f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x861f432f,0x861f861f,0xa72f861f,0xa72fa72f,0x861f861f,0xa61f861f,0x861fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72f861f,0xa72fa72f,0x861f861f,0xa61f861f,0x861fa72f,0x221f752f,0xb74f110f,0x421f842f,0x431f532f,0x532f532f,0x532f421f,0x532f431f,0xa63f532f,0x110fa74f, +0x888f444f,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0x333f888f,0x888f444f,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0x333f888f,0x888f444f,0xcccfcccf,0xcccfcccf,0x000f222f,0x222f000f,0xcccfcccf,0xcccfcccf,0x333f888f,0xf60ff00f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf00ff60f, +0x777f777f,0x777f888f,0x888ffe4f,0x777f888f,0x777f666f,0x888f888f,0x777f888f,0x777f777f,0x777f777f,0x777f888f,0x888fb98f,0x777f888f,0x777f666f,0x888f888f,0x777f888f,0x777f777f,0x777f777f,0x777f888f,0x888f333f,0x777f888f,0x777f666f,0x888f888f,0x777f888f,0x777f777f,0x211fb96f,0x321f321f,0x911fb11f,0x321f321f,0xa90f321f,0x221f870f,0x247f358f,0x984f321f, +0x383f555f,0x777f777f,0x333f777f,0x999fbbbf,0x262f777f,0x333f888f,0x555f242f,0x888f999f,0x111f111f,0x001f111f,0x111f001f,0x001f001f,0x000f111f,0x112f001f,0x001f111f,0x111f111f,0x112f324f,0x112f112f,0x213f000f,0x018f038f,0x038f213f,0x038f038f,0x000f038f,0x112f325f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa72f433f,0xa72fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72fa72f,0xa72fa72f,0x221f962f,0xa74f110f,0x421fa63f,0xa63f953f,0xa63f431f,0x421f852f,0xb74fa63f,0xa63f532f,0x110fa74f, +0x777f444f,0xbbbfbbbf,0x777fbbbf,0x444f444f,0x444f333f,0xbbbf777f,0xaaaf999f,0x333f777f,0x777f444f,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfaaaf,0xbbbfbbbf,0xaaaf999f,0x333f777f,0x777f444f,0xbbbfbbbf,0xbbbfaaaf,0x111f222f,0x222f111f,0xbbbfcccf,0xaaaf999f,0x333f777f,0xf60ff00f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf00ff60f, +0x777f666f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0xffbf777f,0x888ffa2f,0x666f888f,0x777f666f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0xda9f777f,0x888fa87f,0x666f888f,0x777f666f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x333f777f,0x888f333f,0x666f888f,0x830f753f,0x620f730f,0x911fb11f,0x431f321f,0xbbbf570f,0x911f888f,0x247f358f,0x753f186f, +0x141f141f,0x777f373f,0x333f666f,0x888f777f,0x777f999f,0x131f121f,0x141f383f,0x333f141f,0x000f112f,0x111f000f,0x001f001f,0x001f111f,0x335f000f,0x111f001f,0x435f000f,0x111f112f,0x112f214f,0x325f213f,0x213f000f,0x018f038f,0x325f213f,0x018f038f,0x000f038f,0x112f325f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa62f432f,0xa61fa61f,0xa62fa62f,0xa61fa62f,0xa61fa61f,0xa61fa61f,0xa62fa62f,0xa61fa62f,0xa61fa61f,0xa61fa61f,0xa62fa62f,0xa61fa62f,0xa61fa61f,0xa61fa61f,0xa62fa62f,0x221f862f,0xa74f000f,0x532fa63f,0xb74f953f,0xa74f532f,0x532fa74f,0xb74f953f,0xa64f532f,0x110fa74f, +0x777f444f,0x777faaaf,0x333f333f,0x000f000f,0x000f000f,0x333f333f,0xaaaf777f,0x333f777f,0x777f444f,0xaaafaaaf,0x999faaaf,0xbbbfaaaf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0x333f777f,0x777f444f,0xbbbfaaaf,0xbbbfbbbf,0x111fbbbf,0xcccf111f,0xbbbfaaaf,0xaaafbbbf,0x333f777f,0xf00ff00f,0x0000f60f,0x00000000,0x00000000,0x00000000,0x00000000,0xf60f0000,0xf00ff00f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0xffffffbf,0xfe4fffbf,0xfa2ffe4f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0xecafda9f,0xb98fda9f,0xa87fb98f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x444f333f,0x333f333f,0x333f333f,0x777f777f,0x830fb96f,0x620f730f,0x911fb11f,0x321f358f,0xbbbf570f,0x911f888f,0x247f358f,0xb96f186f, +0xbbbfbbbf,0x121f121f,0x121f121f,0x777f242f,0x121f131f,0x999fbbbf,0x777f262f,0x141f141f,0x335f111f,0x212f325f,0x000f001f,0x001f101f,0x325f000f,0x111f112f,0x111f111f,0x001f001f,0x112f213f,0x000f112f,0x000f000f,0x213f038f,0x324f213f,0x018f038f,0x324f000f,0x214f213f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa72f433f,0xa72fa72f,0x861fa72f,0x861fa72f,0x861f861f,0x861f861f,0xa61fa72f,0x861fa72f,0x861f861f,0xa72fa72f,0x861fa72f,0x861fa72f,0x861f861f,0x861f861f,0xa61fa72f,0x221f962f,0x221f000f,0x532fa63f,0x421f532f,0x532f532f,0x532f532f,0x532f532f,0xa63f532f,0x000f221f, +0x777f444f,0x333f777f,0x000f000f,0x000f000f,0x000f000f,0x000f000f,0xbbbf444f,0x222f777f,0x777f444f,0xaaafbbbf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0xbbbfbbbf,0xbbbfbbbf,0x222f777f,0x777f444f,0xbbbfbbbf,0xaaafbbbf,0xcccfbbbf,0xaaafcccf,0xbbbfbbbf,0xbbbfaaaf,0x222f777f,0xf60ff00f,0x0000f00f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf00ff60f, +0x888f777f,0xffbf777f,0x777ffa2f,0x777f777f,0xfa2f777f,0x777ffa2f,0x777f777f,0x888f888f,0x888f777f,0xda9f777f,0x777fa87f,0x777f777f,0xa87f777f,0x777fa87f,0x777f777f,0x888f888f,0x888f777f,0x333f777f,0x777f333f,0x777f777f,0x333f777f,0x777f333f,0x777f777f,0x888f888f,0x830fb95f,0x620f730f,0x911fb11f,0x570f358f,0xa90f321f,0x911f870f,0x247f358f,0xb95f186f, +0x777fbbbf,0xbbbf252f,0xbbbf383f,0x333f141f,0xcccf242f,0x777faaaf,0x777f999f,0x333f888f,0x111f002f,0x112f112f,0x000f111f,0x111f112f,0x213f000f,0x112f112f,0x111f111f,0x111f001f,0x000f112f,0x325f112f,0x324f325f,0x213f213f,0x325f111f,0x018f038f,0x000f325f,0x213f325f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x861f433f,0xa72fa61f,0xa72fa72f,0x861fa72f,0xa72fa72f,0x861fa72f,0x861f861f,0x861fa72f,0xa72fa72f,0xa72fa61f,0xa72fa72f,0x861fa72f,0xa72fa72f,0x861fa72f,0x861f861f,0x221f752f,0xb95f000f,0xa63f211f,0xa63fa64f,0xa63fa63f,0xa63f963f,0xa64fa63f,0x221fa74f,0x000fb85f, +0x777f444f,0x000f333f,0x111f111f,0x111f111f,0x111f111f,0x111f111f,0xbbbf000f,0x333f777f,0x777f444f,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0x999faaaf,0xaaafaaaf,0xaaafaaaf,0x333f777f,0x777f444f,0xbbbfbbbf,0xbbbfbbbf,0xaaafbbbf,0xaaafaaaf,0xaaafaaaf,0xaaafbbbf,0x333f777f,0xf60ff00f,0x00000000,0x0000f00f,0x0000f60f,0x00000000,0xf60f0000,0x0000f60f,0xf00ff00f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x777f777f,0x777f777f,0x830fb96f,0x620f730f,0x911fb11f,0x570f358f,0xa90f431f,0x911f870f,0x247f358f,0xb96f186f, +0x888f777f,0xaaaf131f,0x777f888f,0x141f777f,0x141f141f,0x999f777f,0x999f888f,0x121f333f,0x111f111f,0x112f111f,0x111f111f,0x001f001f,0x112f000f,0x112f112f,0x111f112f,0x001f001f,0x324f000f,0x213f325f,0x038f038f,0x324f213f,0x213f111f,0x214f038f,0x000f213f,0x112f325f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x962f433f,0x752f752f,0x962f752f,0x752f962f,0x962f962f,0x962f752f,0x962f962f,0x752f962f,0x962f962f,0x752f752f,0x962f752f,0x752f962f,0x962f962f,0x962f752f,0x962f962f,0x221f862f,0xb95f100f,0x221fb95f,0xb74fa74f,0xa64fa64f,0xa74fa74f,0xa74fa64f,0xb95f221f,0x110fb95f, +0x777f444f,0x111f333f,0x222f222f,0x222f222f,0x222f222f,0x222f222f,0xbbbf111f,0x222f777f,0x777f444f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x222f777f,0x777f444f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x222f777f,0xf60ff00f,0xf60ff00f,0xf60ff00f,0x0000f00f,0xf00f0000,0xf00ff60f,0xf60ff00f,0xf00ff00f, +0x777f777f,0x777f777f,0x888f666f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x888f666f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x888f666f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x753f753f,0x763f753f,0x653f653f,0x653f763f,0x753f753f,0x653f753f,0x653f432f,0x753f653f, +0x777f777f,0x131f777f,0x010f020f,0x141f121f,0x888f383f,0x242f555f,0x131f131f,0x666f121f,0x001f111f,0x001f111f,0x111f111f,0x111f111f,0x111f111f,0x111f111f,0x111f111f,0x111f001f,0x436f436f,0x213f000f,0x018f038f,0x324f112f,0x213f111f,0x213f038f,0x325f112f,0x112f000f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x211f221f,0x110f110f,0x110f000f,0x521f110f,0x521f421f,0x521f521f,0x110f521f,0x000f000f,0x110f000f, +0x666f333f,0x222f333f,0x222f222f,0x222f222f,0x222f222f,0x222f222f,0xaaaf222f,0x333f666f,0x333f333f,0x333f333f,0x333f333f,0x333f333f,0x222f333f,0x333f333f,0x333f333f,0x333f333f,0x333f333f,0x222f333f,0x222f222f,0x333f333f,0x333f333f,0x222f222f,0x333f222f,0x333f333f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f, +0xcc4fdd4f,0xcc4fbb2f,0xcc4fcc4f,0xcc4fcc4f,0xcc4fdd5f,0xee4f550f,0xcc4fdd5f,0xcc4fcc4f,0xffffffff,0x0000ffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xcfffffff,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x888f666f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x888f666f,0x777f777f,0x777f777f,0x777f777f, +0x0000999f,0x999faaaf,0x0000555f,0x00000000,0x0000777f,0x00000000,0x555f0000,0xaaaf0000,0x222f999f,0x999faaaf,0x222f555f,0x222f222f,0x222f777f,0x222f222f,0x555f222f,0xaaaf222f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x432f433f,0x432f432f,0x433f432f,0x433f433f,0x433f432f,0x433f433f,0x433f433f,0x221f433f,0x433f433f,0x432f432f,0x433f432f,0x433f433f,0x433f432f,0x433f433f,0x433f433f,0x322f433f,0x984f110f,0x984f984f,0x221f984f,0x521fb74f,0xb74f521f,0xb96f221f,0xb96fb96f,0x110fb96f, +0x984f110f,0x984f984f,0x221f984f,0x521fb74f,0xb74f521f,0xb96f221f,0xb96fb96f,0x110fb96f,0x333f333f,0x333f333f,0x222f333f,0x222f222f,0x333f222f,0x333f333f,0x222f222f,0x333f333f,0x333f333f,0x333f333f,0x222f333f,0x222f222f,0x333f222f,0x333f333f,0x222f222f,0x333f333f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x330fcc3f,0xcc4fee4f,0xcc4fcc3f,0x330f330f,0xdd4fcc4f,0xcc4fcc4f,0xcc4fcc4f,0xcc4f220f,0x0000ffff,0x00000000,0x00000000,0xcfff0000,0x00000000,0x00000000,0x00000000,0xbddf0000,0x777f777f,0x888f888f,0x888f888f,0x888f888f,0x888f777f,0x888f888f,0x777f666f,0x777f777f,0x777f777f,0x888f888f,0x888f888f,0x888f888f,0x888f777f,0x888f888f,0x777f666f,0x777f777f, +0x0000888f,0x999fbbbf,0x555f0000,0x00000000,0x444f555f,0xbbbf0000,0x555fbbbf,0x555f0000,0x222f888f,0x999fbbbf,0x555f222f,0x222f222f,0x444f555f,0xbbbf222f,0x555fbbbf,0x555f222f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa72f433f,0xa61fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72f861f,0xa72f861f,0x861f861f,0x861f861f,0xa61fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72f861f,0xa72f861f,0x221fa72f,0xb96f110f,0x753fb95f,0xb95fb95f,0x521f221f,0x221f521f,0xb95f984f,0xb95f984f,0x110fb96f, +0xb96f110f,0x753fb95f,0xb95fb95f,0x521f221f,0x221f521f,0xb95f984f,0xb95f984f,0x110fb96f,0x666f333f,0x666f555f,0x555f444f,0x777f777f,0x666f444f,0x666f666f,0x444f555f,0x333f555f,0x666f333f,0x666f555f,0x555f444f,0x777f777f,0x666f444f,0x666f666f,0x444f555f,0x333f555f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xcc4fcc4f,0xdd4fcc4f,0xdd5fcc4f,0x660f550f,0xcc4fdd4f,0xee5fbb3f,0xcc4f330f,0xcc4fff6f,0x0000ffff,0xffff0000,0x00000000,0x0000cfff,0x00000000,0x00000000,0x00000000,0x00000000,0x666f777f,0x777f777f,0x777f7cff,0x777f777f,0x777f888f,0x777f777f,0x7cffceff,0x777f777f,0x666f777f,0x777f777f,0x777f900f,0x777f777f,0x777f888f,0x777f777f,0x900ff00f,0x777f777f, +0x00000000,0x0000888f,0xaaaf555f,0x0000aaaf,0xaaaf999f,0xbbbf555f,0x0000999f,0xaaafbbbf,0x222f222f,0x222f888f,0xaaaf555f,0x222faaaf,0xaaaf999f,0xbbbf555f,0x222f999f,0xaaafbbbf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa72f433f,0x861f861f,0x861f861f,0xa72fa72f,0xa72fa72f,0xa72fa72f,0xa72fa61f,0xa72fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72fa72f,0xa72fa72f,0xa72fa72f,0xa72fa61f,0x221fa72f,0xb96f110f,0x984f984f,0x984f753f,0x221fb95f,0xb96f221f,0xb95fb96f,0xb96f753f,0x110fb96f, +0xb96f110f,0x984f984f,0x984f753f,0x221fb95f,0xb96f221f,0xb95fb96f,0xb96f753f,0x110fb96f,0x555f222f,0x555f777f,0x888f666f,0x777f888f,0x555f666f,0x777f888f,0x777f555f,0x333f555f,0x555f222f,0x555f777f,0x888f666f,0x777f888f,0x555f666f,0x777f888f,0x777f555f,0x333f555f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xcc3fcc4f,0x330fdd5f,0xdd4f330f,0x330fee4f,0xcc3fee4f,0x220fcc3f,0xcc3f660f,0xdd5fcc4f,0x0000ffff,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xbddfcfff,0x888f777f,0x777f777f,0x666f777f,0xceff777f,0x777f5eff,0x777f777f,0x777f777f,0x777f777f,0x888f777f,0x777f777f,0x666f777f,0xf00f777f,0x777f800f,0x777f777f,0x777f777f,0x777f777f, +0x00000000,0x00000000,0xaaaf0000,0x0000888f,0x999faaaf,0xaaaf444f,0x0000888f,0x999faaaf,0x222f222f,0x222f222f,0xaaaf222f,0x222f888f,0x999faaaf,0xaaaf444f,0x222f888f,0x999faaaf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa62f433f,0xa61fa62f,0xa61fa61f,0xa61fa61f,0xa61fa61f,0xa62fa62f,0xa62fa62f,0xa61fa61f,0xa61fa61f,0xa61fa62f,0xa61fa61f,0xa61fa61f,0xa61fa61f,0xa62fa62f,0xa62fa62f,0x221fa61f,0x653f110f,0x432f653f,0x753f432f,0x110f753f,0x753f110f,0x653f432f,0x653f653f,0x110f753f, +0x653f110f,0x432f653f,0x753f432f,0x110f753f,0x753f110f,0x210f432f,0x210f210f,0x110f753f,0x555f222f,0x666f555f,0x222f666f,0x333f333f,0x222f222f,0x444f222f,0x888f666f,0x222f666f,0x555f222f,0x666f555f,0x666f999f,0x888f888f,0x666f555f,0x555f555f,0x888f666f,0x222f666f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xcc4fcc4f,0x660fcc4f,0xcc4f660f,0xcc3faa1f,0xbb3fcc4f,0xcc4fcc4f,0xcc4fee4f,0xcc4fff7f,0xffffffff,0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0xcfff0000,0xbddf0000,0x888f777f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x888f888f,0x666f888f,0x888f777f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x888f888f,0x666f888f, +0xaaaf0000,0x0000aaaf,0xaaaf0000,0x0000555f,0x888f999f,0x00000000,0x0000888f,0x888f999f,0xaaaf222f,0x222faaaf,0xaaaf222f,0x222f555f,0x888f999f,0x222f222f,0x222f888f,0x888f999f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x752f433f,0x752f752f,0x962f752f,0x752f962f,0x752f962f,0x962f752f,0x962f962f,0x752f962f,0x752f962f,0x752f752f,0x962f752f,0x752f962f,0x752f962f,0x962f752f,0x962f962f,0x221f962f,0x984f110f,0x753f984f,0xb96f984f,0x221fb96f,0x984f221f,0x753f753f,0xb95fb95f,0x110fb95f, +0x984f110f,0x753f984f,0xb96f984f,0x221fb96f,0x984f221f,0x210f753f,0x210f753f,0x110f753f,0x777f333f,0x444f777f,0x000f333f,0x000f000f,0x000f000f,0x333f000f,0x888f555f,0x222f777f,0x777f333f,0x666f777f,0x777f888f,0x555f777f,0x888f666f,0x999f999f,0x888f777f,0x222f777f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xbb3fcc4f,0xcc4fcc4f,0xbb3fee4f,0xdd4fcc4f,0xcc4f220f,0xcc4fdd4f,0xdd5f660f,0xcc4fdd4f,0x0000ffff,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x0000cfff,0x00000000,0x777f777f,0x777f777f,0xffff777f,0x777fceff,0x666f777f,0xceffffff,0x777f777f,0x777f666f,0x777f777f,0x777f777f,0xf00f777f,0x777fa00f,0x666f777f,0xa00ff00f,0x777f777f,0x777f666f, +0xbbbf0000,0x0000888f,0x888f444f,0x0000555f,0x999f555f,0x555f0000,0x555f0000,0x888f0000,0xbbbf222f,0x222f888f,0x888f444f,0x222f555f,0x999f555f,0x555f222f,0x555f222f,0x888f222f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x322f432f,0x332f322f,0x332f332f,0x322f332f,0x332f332f,0x332f332f,0x322f322f,0x322f332f,0x332f332f,0x332f322f,0x332f332f,0x322f332f,0x332f332f,0x332f332f,0x322f322f,0x111f322f,0x984f110f,0x210f753f,0x210fb95f,0x221fb96f,0xb95f221f,0xb95f963f,0x984f984f,0x110f984f, +0x984f110f,0x210f753f,0xb95fb95f,0x221fb96f,0xb95f221f,0x210f963f,0x210f210f,0x110f653f,0x555f222f,0x222f777f,0x000f000f,0x000f000f,0x000f000f,0x000f000f,0x666faaaf,0x222f333f,0x555f222f,0x666f777f,0x777f777f,0x555f777f,0x999f999f,0x888f777f,0x666f777f,0x222f333f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x330fdd5f,0xee6fcc4f,0xcc4f660f,0xcc4fcc4f,0xdd4fee4f,0xbb2fcc4f,0xee4fff6f,0xcc4fcc4f,0x00000000,0x00000000,0x00000000,0xcfff0000,0x00000000,0x00000000,0x00000000,0xbddf0000,0x888f888f,0xffff777f,0x7cffceff,0x5eff7cff,0x777f777f,0x5eff7cff,0x888f888f,0x666f888f,0x888f888f,0xb00f777f,0x900fa00f,0x800f900f,0x777f777f,0x800f900f,0x888f888f,0x666f888f, +0x999f555f,0x555f0000,0x0000555f,0xaaafaaaf,0x00000000,0x0000666f,0x555f0000,0x555f555f,0x999f555f,0x555f222f,0x222f555f,0xaaafaaaf,0x222f222f,0x222f666f,0x555f222f,0x555f555f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x753f433f,0x752f753f,0x753f753f,0x652f753f,0x652f652f,0x753f752f,0x753f753f,0x652f753f,0x652f652f,0x752f753f,0x753f753f,0x652f753f,0x652f652f,0x753f752f,0x753f753f,0x221f753f,0xb96f110f,0x210fb96f,0x210f753f,0x221f753f,0x984f221f,0xb96f432f,0xb96fb96f,0x110fb96f, +0xb96f110f,0x210fb96f,0xb96fb96f,0x221fb96f,0x984f221f,0xdddf432f,0xbbbfdddf,0x110f753f,0x666f333f,0x222f777f,0x000f000f,0x111f000f,0x111f111f,0x000f111f,0x888faaaf,0x222f666f,0x666f333f,0x666f777f,0x555f777f,0x777f666f,0x888f777f,0x777f888f,0x888f888f,0x222f666f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x660fbb3f,0xdd4fee4f,0xdd5fee4f,0xcc4fcc3f,0xcc4fcc4f,0xbb2fdd4f,0xcc4f991f,0xcc4fdd5f,0x0000ffff,0x0000cfff,0x00000000,0x0000cfff,0x00000000,0x00000000,0x00000000,0xbddf0000,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x666f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x666f777f,0x777f777f,0x777f777f,0x777f777f, +0xbbbfaaaf,0xaaaf0000,0x555fbbbf,0x999faaaf,0xaaaf0000,0x555fbbbf,0x555f0000,0x666f0000,0xbbbfaaaf,0xaaaf222f,0x555fbbbf,0x999faaaf,0xaaaf222f,0x555fbbbf,0x555f222f,0x666f222f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x962f432f,0x862f862f,0x862f862f,0x962f862f,0x962f962f,0x862f862f,0x862f862f,0x962f862f,0x962f962f,0x862f862f,0x862f862f,0x962f862f,0x962f962f,0x862f862f,0x862f862f,0x221f852f,0x753f110f,0x653f653f,0x653fdddf,0x110f653f,0x753f110f,0x432f653f,0x653f653f,0x110f753f, +0x753f110f,0x210f653f,0x653f653f,0x110f653f,0x753f110f,0xffff653f,0xbbbfdddf,0x110f432f,0x555f222f,0x222f555f,0xbbbf777f,0xaaafaaaf,0xaaafaaaf,0x666faaaf,0x555faaaf,0x333f555f,0x555f222f,0x666f555f,0x888f888f,0x666f666f,0x555f666f,0x777f555f,0x555f888f,0x333f555f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xee4fcc4f,0xdd4fdd4f,0xcc4fdd4f,0x330fcc3f,0x330fee4f,0x330f330f,0xcc4fbb2f,0xcc4f330f,0xcfffffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xbddf0000,0xceff777f,0x666f7cff,0x777f888f,0x777f777f,0xceffffff,0x888f888f,0x888f888f,0x888f888f,0xf00f777f,0x666f900f,0x777f888f,0x777f777f,0xa00ff00f,0x888f888f,0x888f888f,0x888f888f, +0x888fbbbf,0x999f0000,0x555f999f,0x999f999f,0x999f0000,0x0000999f,0xbbbf0000,0x555f999f,0x888fbbbf,0x999f222f,0x555f999f,0x999f999f,0x999f222f,0x222f999f,0xbbbf222f,0x555f999f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa72f433f,0xa72fa72f,0xa61fa72f,0xa72f861f,0xa72fa72f,0xa72fa72f,0xa72fa72f,0xa72f861f,0xa72fa72f,0xa72fa72f,0xa61fa72f,0xa72f861f,0xa72fa72f,0xa72fa72f,0xa72fa72f,0x221f962f,0xb96f110f,0xdddfb96f,0xdddf753f,0x221f653f,0xb95f221f,0xb95fb95f,0xb96fb96f,0x110fb96f, +0xb96f110f,0x210fb96f,0x753fbbbf,0x221f984f,0xb95f221f,0x753fb95f,0xbbbfdddf,0x110f753f,0x444f222f,0x888f777f,0x888f555f,0x999f888f,0x999f999f,0x444f888f,0x555f777f,0x333f777f,0x444f222f,0x888f777f,0x777faaaf,0x999f666f,0x888f999f,0x666f777f,0x444f555f,0x333f777f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xcc4fcc4f,0x330fcc4f,0xcc4fcc4f,0xdd4fdd5f,0x660fcc4f,0x660f550f,0x330fee4f,0x660f660f,0x0000ffff,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x777f777f,0x777f777f,0x777f777f,0xceff777f,0x5eff5eff,0x777f5eff,0x777f777f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0xa00f777f,0x800f800f,0x777f800f,0x777f777f,0x777f888f, +0x444f888f,0x555f0000,0x0000888f,0x0000999f,0x0000555f,0x0000999f,0xaaaf555f,0x0000999f,0x444f888f,0x555f222f,0x222f888f,0x222f999f,0x222f555f,0x222f999f,0xaaaf555f,0x222f999f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x861f432f,0x861f861f,0xa72f861f,0xa72fa72f,0x861f861f,0xa61f861f,0x861fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72f861f,0xa72fa72f,0x861f861f,0xa61f861f,0x861fa72f,0x221f752f,0x984f110f,0xbbbf984f,0xbbbf653f,0x221f753f,0x984f221f,0x753f984f,0x984fb96f,0x110f984f, +0x984f110f,0xdddfbbbf,0x753fbbbf,0x221fb95f,0x984f221f,0x753f984f,0xbbbfffff,0x110f653f,0x888f444f,0xdddfcccf,0xeeefdddf,0xffffffff,0xffffffff,0xdddfeeef,0xcccfdddf,0x333f888f,0x555f222f,0x999f999f,0x555f777f,0x777f999f,0x888f999f,0x666f888f,0x999f666f,0x333f555f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdd4fcc4f,0xee4fcc4f,0xcc3fcc4f,0xdd4f110f,0xdd5fee6f,0xee4fee5f,0xff6fcc4f,0xcc3f550f,0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0x00000000,0xffff0000,0x00000000,0x777f777f,0x777f888f,0x888f7cff,0x777f888f,0x777f666f,0x888f888f,0x777f888f,0x777f777f,0x777f777f,0x777f888f,0x888f900f,0x777f888f,0x777f666f,0x888f888f,0x777f888f,0x777f777f, +0x0000555f,0x00000000,0x444f0000,0x0000555f,0xaaafaaaf,0x00000000,0x999f555f,0x00000000,0x222f555f,0x222f222f,0x444f222f,0x222f555f,0xaaafaaaf,0x222f222f,0x999f555f,0x222f222f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa72f433f,0xa72fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72fa72f,0xa72fa72f,0x221f962f,0xb95f110f,0xb95fb95f,0xb96fb96f,0x110f984f,0x984f221f,0xb95fb95f,0xb95f963f,0x110fb95f, +0xb95f110f,0x753f753f,0x753fbbbf,0x110f984f,0x984f221f,0xb95fb95f,0xbbbfdddf,0x110f753f,0x777f444f,0xdddfcccf,0xeeefeeef,0x444f444f,0x444f333f,0xeeefeeef,0xcccfdddf,0x333f777f,0x555f222f,0x777f777f,0x555f777f,0x888f999f,0x777f777f,0x555f777f,0x666f666f,0x222f666f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdd4f110f,0xcc4fcc4f,0xcc4fcc4f,0xdd4fdd3f,0xcc4fcc4f,0x110fcc4f,0xcc4fcc4f,0xcc4fee4f,0x0000ffff,0x00000000,0x00000000,0x0000cfff,0x00000000,0x00000000,0x0000ffff,0xbddf0000,0x777f666f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0xceff777f,0x888f5eff,0x666f888f,0x777f666f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0xf00f777f,0x888f800f,0x666f888f, +0x0000aaaf,0xbbbfaaaf,0x00000000,0x00000000,0x999faaaf,0xaaaf0000,0x0000888f,0xaaaf555f,0x222faaaf,0xbbbfaaaf,0x222f222f,0x222f222f,0x999faaaf,0xaaaf222f,0x222f888f,0xaaaf555f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa62f432f,0xa61fa61f,0xa62fa62f,0xa61fa62f,0xa61fa61f,0xa61fa61f,0xa62fa62f,0xa61fa62f,0xa61fa61f,0xa61fa61f,0xa62fa62f,0xa61fa62f,0xa61fa61f,0xa61fa61f,0xa62fa62f,0x221f862f,0x653f110f,0x753f753f,0x653f653f,0x100f653f,0x753f110f,0x753f753f,0x653f432f,0x110f653f, +0x653f110f,0x753f753f,0x431f431f,0x100f653f,0x753f110f,0x753f753f,0xbbbf221f,0x110f431f,0xaaaf444f,0xdddfdddf,0x333f333f,0xc00ff00f,0xc00ff00f,0x333f333f,0xdddfdddf,0x333faaaf,0x777f333f,0x777f888f,0x555f777f,0x777f777f,0x777f888f,0x666f555f,0x666f888f,0x222f777f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xff5f660f,0x330fcc4f,0xdd4f110f,0xcc3fcc4f,0x220f330f,0xcc4fdd4f,0xaa2fdd4f,0xee4f660f,0xcfff0000,0x00000000,0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0xbddf0000,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0xffffceff,0x7cffceff,0x5eff7cff,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0xf00fa00f,0x900fa00f,0x800f900f,0x777f777f, +0x0000888f,0x999fbbbf,0xaaaf0000,0x0000bbbf,0x888f0000,0x999f0000,0x0000999f,0xaaaf444f,0x222f888f,0x999fbbbf,0xaaaf222f,0x222fbbbf,0x888f222f,0x999f222f,0x222f999f,0xaaaf444f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa72f433f,0xa72fa72f,0x861fa72f,0x861fa72f,0x861f861f,0x861f861f,0xa61fa72f,0x861fa72f,0x861f861f,0xa72fa72f,0x861fa72f,0x861fa72f,0x861f861f,0x861f861f,0xa61fa72f,0x221f962f,0xb96f110f,0xa73fb96f,0x984fb96f,0x110fb96f,0x984f221f,0x984f984f,0x753f963f,0x110fb96f, +0xb96f110f,0xa73fb96f,0x984fb96f,0x110fb96f,0x984f221f,0x984f984f,0xffff963f,0x110f753f,0xcccf888f,0x333feeef,0xc00fc00f,0xc00ffa0f,0xf00ffa0f,0xc00fc00f,0xeeef444f,0x222faaaf,0x555f222f,0x555f555f,0x555f555f,0x777f666f,0x555f666f,0x888f999f,0x777f777f,0x222f333f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xee4fee4f,0x660fdd4f,0xee4f660f,0x330fcc3f,0x660f660f,0xdd4f550f,0xcc4fcc4f,0xcc4fcc4f,0x0000cfff,0x00000000,0x00000000,0x00000000,0x00000000,0x0000cfff,0x00000000,0xbddf0000,0x888f777f,0xceff777f,0x777f5eff,0x777f777f,0x5eff777f,0x777f5eff,0x777f777f,0x888f888f,0x888f777f,0xf00f777f,0x777f800f,0x777f777f,0x800f777f,0x777f800f,0x777f777f,0x888f888f, +0x0000999f,0x999f555f,0xaaaf0000,0x0000888f,0x555f0000,0x999f0000,0xaaaf444f,0x0000aaaf,0x222f999f,0x999f555f,0xaaaf222f,0x222f888f,0x555f222f,0x999f222f,0xaaaf444f,0x222faaaf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x861f433f,0xa72fa61f,0xa72fa72f,0x861fa72f,0xa72fa72f,0x861fa72f,0x861f861f,0x861fa72f,0xa72fa72f,0xa72fa61f,0xa72fa72f,0x861fa72f,0xa72fa72f,0x861fa72f,0x861f861f,0x221f752f,0x984f110f,0xa73f753f,0xb96fb96f,0x221fb96f,0xb95f221f,0x984fb95f,0x984f984f,0x110f984f, +0x984f110f,0xa73f753f,0xb96fb96f,0x221fb96f,0xb95f221f,0x984fb95f,0x653f984f,0x110f653f,0xdddf888f,0xf00f333f,0xfa0ffa0f,0xf00ffa0f,0xfa0fff0f,0xf00ff00f,0xeeeff00f,0x333faaaf,0x666f333f,0x999f777f,0x999f888f,0x555f666f,0x999f666f,0x777f888f,0x777f888f,0x222f666f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xcc3fcc4f,0xee6fbb3f,0xbb2fee4f,0xcc4fdd5f,0x660f660f,0xcc4fee4f,0xee4f660f,0xcc3fcc4f,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xcfff0000,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x777f777f,0x777f777f, +0x0000666f,0x555f0000,0x888f555f,0x00000000,0x666f0000,0x999f555f,0xbbbf0000,0x555f999f,0x222f666f,0x555f222f,0x888f555f,0x222f222f,0x666f222f,0x999f555f,0xbbbf222f,0x555f999f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x962f433f,0x752f752f,0x962f752f,0x752f962f,0x962f962f,0x962f752f,0x962f962f,0x752f962f,0x962f962f,0x752f752f,0x962f752f,0x752f962f,0x962f962f,0x962f752f,0x962f962f,0x221f862f,0xb96f110f,0x753f984f,0xb96f984f,0x221fb96f,0xb96f221f,0xb95f984f,0xb96fb96f,0x110fb96f, +0xb96f110f,0x753f984f,0xb96f984f,0x221fb96f,0xb96f221f,0xb95f984f,0xb96fb96f,0x110fb96f,0xeeef888f,0xfa0f333f,0xff0fff0f,0xfa0fff0f,0xff0ffa0f,0xfa0fff0f,0xeeeffa0f,0x222faaaf,0x666f333f,0x666f555f,0x555f444f,0x777f777f,0x666f444f,0x666f666f,0x444f555f,0x333f555f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xbb3fee5f,0xcc4fbb2f,0xcc4fbb2f,0xcc4fdd4f,0xee5fff6f,0xdd4fdd5f,0xcc4fee4f,0xcc4fcc4f,0xbddfcfff,0xbddfbddf,0xbddfbddf,0x00000000,0xbddfbddf,0xbddf0000,0xbddfbddf,0xcfffbddf,0x777f777f,0x777f777f,0x888f666f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x888f666f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x777f777f, +0x0000aaaf,0x00000000,0x999f0000,0x555f0000,0xaaafaaaf,0x0000555f,0x888f0000,0xaaaf555f,0x222faaaf,0x222f222f,0x999f222f,0x555f222f,0xaaafaaaf,0x222f555f,0x888f222f,0xaaaf555f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x211f221f,0x753f110f,0x763f753f,0x653f653f,0x110f763f,0x753f110f,0x653f753f,0x653f432f,0x110f653f, +0x753f110f,0x763f753f,0x653f653f,0x110f763f,0x753f110f,0x653f753f,0x653f432f,0x110f653f,0xdddf888f,0xf00f333f,0xf00ffa0f,0xff0ffa0f,0xfa0ff00f,0xfa0fff0f,0xeeeff00f,0x333f999f,0x333f333f,0x333f333f,0x222f333f,0x222f222f,0x333f222f,0x333f333f,0x222f222f,0x333f333f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdddfcccf,0xcccfcccf,0xeeefdddf,0xdddfcccf,0xeeefeeef,0xcccfbbbf,0xeeefeeef,0xcccfcccf,0x157f235f,0x157f245f,0x245f046f,0x036f258f,0x157f157f,0x157f245f,0x356f258f,0x245f157f,0xffffffff,0xefffffff,0xffffffff,0xffffefff,0xffffffff,0xefffefff,0xefffefff,0xffffffff,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9, +0xffffffff,0xefffffff,0xffffffff,0xffffefff,0xffffffff,0xefffefff,0xefffefff,0xffffffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x041f0000,0x181f181f,0x181f182f,0x061f182f,0x172f041f,0x182f172f,0x181f182f,0x0000061f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xaabf889f,0x9abfaabf,0x9abf9aaf,0x9aaf9aaf,0xaabfaabf,0x9aaf9aaf,0x9aaf9aaf,0x9aaf99af,0xeedf0000,0x00009c6f,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0x322f222f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x222f322f,0x322f222f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x222f322f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0xeeefdddf,0xffffffff,0xeeefeeef,0xdddfdddf,0xcccfcccf,0xdddfdddf,0xcccfbbbf,0xdddfdddf,0x0000157f,0x0000157f,0x157f0000,0x00000000,0x00000000,0x0000157f,0x157f0000,0x147f0000,0xffffffff,0xefffffff,0xefffefff,0xefffefff,0xffffefff,0xefffefff,0xffffefff,0xefffffff,0x7af97af9,0x7af97af9,0x7af97af9,0x8bf97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9, +0xffffffff,0xefffffff,0x532fefff,0xefffefff,0xffffefff,0xefffefff,0xffffefff,0xefffffff,0x061f0000,0x000f061f,0x061f020f,0x000f020f,0x061f061f,0x000f061f,0x061f020f,0x0000061f,0x041f0000,0x181f171f,0x182f071f,0x000f051f,0x171f041f,0x182f172f,0x181f182f,0x0000061f,0x061f0000,0x061f061f,0x061f061f,0x061f061f,0x061f061f,0x061f061f,0x061f061f,0x0000061f, +0x9aafaabf,0xaabfaabf,0x9aaf99af,0x9aaf9aaf,0xaabf99af,0xaabfabcf,0x9aaf9aaf,0xaabf9aaf,0x8a5f0000,0x0000684f,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0xeedf0000,0x00009c6f,0x754f322f,0x853f854f,0x854f854f,0x753f753f,0x753f753f,0x854f753f,0x854f753f,0x322f754f,0x754f322f,0x853f854f,0x854f854f,0x753f753f,0x753f753f,0x854f753f,0x854f753f,0x322f754f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xffffeeef,0xdddfdddf,0xffffffff,0xdddfeeef,0xffffeeef,0xeeefeeef,0xffffffff,0xeeefeeef,0x157f134f,0x157f245f,0x356f157f,0x157f157f,0x157f147f,0x157f134f,0x235f157f,0x245f036f,0xffffefff,0xefffefff,0xefffefff,0xefffefff,0xefffffff,0xefffefff,0xffffffff,0xefffefff,0x7af97af9,0xfff97af9,0x7af97af9,0x7af98bf9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9, +0x532fefff,0xefffefff,0x532fefff,0x532fefff,0xefffffff,0xefffefff,0xffff532f,0x532fefff,0x061f0000,0x051f182f,0x171f181f,0x051f171f,0x181f182f,0x061f182f,0x181f182f,0x0000061f,0x000f000f,0x171f061f,0x182f071f,0x031f061f,0x171f041f,0x182f172f,0x051f182f,0x000f000f,0x061f0000,0xdd9fdd9f,0xdd9fdd9f,0xdd9fdd9f,0xdd9fdd9f,0xdd9fdd9f,0xdd9fddaf,0x0000061f, +0xaabfaabf,0x9aafabcf,0x9aaf9aaf,0x9abf9abf,0xaabfaabf,0xaabfaabf,0x9aaf99af,0xabcf9aaf,0xad7f0000,0x9e3f8a5f,0xad7f0000,0x00008a5f,0xad7f0000,0x7c2f8a5f,0x8a5f0000,0x0000684f,0x854f322f,0x853f532f,0x853f532f,0x954f532f,0x964f532f,0x954f532f,0x964f532f,0x322f854f,0x854f322f,0x853f853f,0x853f853f,0x753f954f,0x964f753f,0x954f964f,0x964f953f,0x322f854f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdddfdddf,0xffffeeef,0xdddfdddf,0xffffdddf,0xdddfcccf,0xffffffff,0xdddfdddf,0xffffffff,0x0000157f,0x0000157f,0x258f0000,0x00000000,0x00000000,0x0000258f,0x157f0000,0x258f0000,0xefffffff,0xefffefff,0xffffffff,0xffffefff,0xefffffff,0xefffefff,0xffffffff,0xefffefff,0x7af97af9,0x7af9fff9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af98bf9, +0x666f532f,0x532f532f,0x532fffff,0x532f532f,0x532fffff,0x532fefff,0x532f753f,0x753f532f,0x000f0000,0x192f051f,0x182f181f,0x000f061f,0x181f061f,0x000f061f,0x181f061f,0x0000061f,0x020f0000,0x171f061f,0x182f071f,0x061f171f,0x051f000f,0x182f172f,0x071f182f,0x0000061f,0x061f0000,0xdd9fdd9f,0xdd9fdd9f,0xdd9fdd9f,0xdd9fdd9f,0xdd9fdd9f,0xdd9fddaf,0x0000061f, +0x9aaf99af,0xaabf9aaf,0xaabf9aaf,0x9aaf9aaf,0x9aaf9aaf,0xaabf9aaf,0x9aaf9abf,0x99af9abf,0xad7f0000,0x7c2f8a5f,0xad7f0000,0x9e3f8a5f,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0x853f322f,0x953f421f,0x953f421f,0x953f421f,0x953f421f,0x954f421f,0x954f421f,0x322f853f,0x853f322f,0x953f954f,0x953f953f,0x111f753f,0x753f111f,0x954f954f,0x954f954f,0x322f853f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdddfeeef,0xdddfcccf,0xeeefeeef,0xbbbfbbbf,0xeeefdddf,0xcccfdddf,0xeeefeeef,0xbbbfcccf,0x0000157f,0x0000157f,0x157f0000,0x00000000,0x00000000,0x0000157f,0x157f0000,0x046f0000,0xffffffff,0xefffefff,0xffffefff,0xffffefff,0xefffefff,0xffffefff,0xefffffff,0xefffefff,0xfff97af9,0x7af97af9,0x7af97af9,0x7af97af9,0xfff97af9,0x7af97af9,0x8bf97af9,0x7af97af9, +0x753f964f,0xb85f964f,0x964f532f,0x753f753f,0x532f532f,0x666f532f,0x964f753f,0x753f532f,0x020f0000,0x181f182f,0x182f061f,0x061f182f,0x181f182f,0x061f182f,0x181f182f,0x0000061f,0x041f0000,0x181f071f,0x182f172f,0x061f181f,0x061f020f,0x182f181f,0x171f182f,0x0000061f,0x061f0000,0xddafdd9f,0xddafdd9f,0xddafddaf,0xddafdd9f,0xddafdd9f,0xdd9fdd9f,0x0000061f, +0x9aafaabf,0x9aafaabf,0xaabfaabf,0xaabfaabf,0x99afaabf,0xaabf9aaf,0x99af9abf,0x99afaabf,0xad7f0000,0x00008a5f,0xeedf0000,0x7c2f9c6f,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0x753f322f,0x532f853f,0x532f853f,0x532f964f,0x532f964f,0x532f853f,0x532f954f,0x322f854f,0x753f322f,0x853f853f,0x964f853f,0x111f753f,0x753f111f,0x953f853f,0x954f954f,0x322f854f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xbbbfcccf,0xffffcccf,0xbbbfcccf,0xdddfcccf,0xbbbfcccf,0xdddfdddf,0xdddfcccf,0xdddfcccf,0x157f245f,0x258f245f,0x346f157f,0x157f157f,0x258f157f,0x258f245f,0x245f157f,0x245f157f,0xefffefff,0xefffefff,0xffffefff,0xffffffff,0xefffefff,0xefffefff,0xefffefff,0xefffefff,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af9fff9,0x7af97af9,0x7af98bf9,0x7af97af9, +0x532f753f,0x964f964f,0x964f753f,0x532f532f,0x753f532f,0x532f753f,0x753f753f,0xb85f753f,0x061f0000,0x061f181f,0x061f000f,0x181f171f,0x181f171f,0x182f182f,0x051f182f,0x0000000f,0x041f0000,0x181f061f,0x172f172f,0x061f172f,0x171f041f,0x182f181f,0x071f182f,0x0000061f,0x061f0000,0xdd9fdd9f,0xdd9fddaf,0xdd9fdd9f,0xdd9fdd9f,0xddafdd9f,0xdd9fdd9f,0x0000061f, +0xaabf99af,0xabdf9aaf,0xaabf9aaf,0xaabfaabf,0xaabf9aaf,0x99afaabf,0x9aaf9aaf,0x99af9abf,0xad7f0000,0x00008a5f,0x8a5f0000,0x0000684f,0xeedf0000,0x00009c6f,0xad7f0000,0x00008a5f,0x753f322f,0x422f953f,0x422f954f,0x321f964f,0x422f954f,0x422f954f,0x321f853f,0x322f753f,0x753f322f,0x954f953f,0x954f954f,0x111f753f,0x753f111f,0x954f954f,0x853f853f,0x322f753f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xffffffff,0xeeefeeef,0xdddfdddf,0xeeefdddf,0xffffeeef,0xdddfeeef,0xffffffff,0xeeefeeef,0x0000157f,0x0000046f,0x157f0000,0x00000000,0x00000000,0x0000157f,0x035f0000,0x157f0000,0xefffffff,0xefffefff,0xefffffff,0xffffefff,0xefffefff,0xffffefff,0xefffefff,0xefffefff,0x7af97af9,0x7af97af9,0x7af97af9,0x8bf97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9, +0x532fb85f,0x753f753f,0x753f888f,0xb85f753f,0x753fb85f,0xb85fb85f,0x964f753f,0x964f753f,0x020f0000,0x192f071f,0x182f181f,0x181f182f,0x000f061f,0x181f171f,0x181f181f,0x0000061f,0x000f000f,0x071f171f,0x171f181f,0x061f172f,0x171f041f,0x171f182f,0x051f182f,0x000f000f,0x061f0000,0xdd9fdd9f,0xdd9fddaf,0xddafdd9f,0xdd9fdd9f,0xdd9fdd9f,0xdd9fdd9f,0x0000061f, +0xaabf99af,0x9abf99af,0xaabf99af,0x9aaf9aaf,0x9aaf9aaf,0xabcfaabf,0xaabfaabf,0x9abfaabf,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0x8a5f0000,0x0000684f,0xad7f0000,0x9e3f8a5f,0x854f322f,0x954f532f,0x964f532f,0x853f532f,0x853f532f,0x964f532f,0x964f532f,0x322f854f,0x854f322f,0x954f964f,0x964f964f,0x111f753f,0x753f111f,0x964f953f,0x964f964f,0x322f854f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdddfdddf,0xffffffff,0xeeefeeef,0xffffffff,0xdddfcccf,0xffffeeef,0xeeefeeef,0xffffffff,0x0000157f,0x0000157f,0x157f0000,0x00000000,0x00000000,0x0000157f,0x258f0000,0x147f0000,0xffffffff,0xefffefff,0xefffefff,0xefffefff,0xffffffff,0xefffefff,0xefffffff,0xefffefff,0x7af97af9,0x7af98bf9,0x7af97af9,0x7af98bf9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9, +0x753fb85f,0xb85fb85f,0x964f964f,0x753f753f,0x532f964f,0x964f964f,0x753f753f,0x964f964f,0x000f0000,0x181f051f,0x192f061f,0x181f182f,0x061f182f,0x182f181f,0x181f061f,0x0000020f,0x041f0000,0x171f182f,0x171f181f,0x061f182f,0x051f000f,0x071f182f,0x061f182f,0x0000031f,0x061f0000,0xdd9fdd9f,0xdd9fddaf,0xddafdd9f,0xdd9fddaf,0xdd9fdd9f,0xdd9fdd9f,0x0000061f, +0x9aaf9abf,0x9aafaabf,0x9aaf9abf,0xabbfaabf,0x99afaabf,0x9aaf9aaf,0xaabfaabf,0xaabf9aaf,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0xad7f0000,0x7c2f8a5f,0x853f322f,0x954f421f,0x954f421f,0x953f421f,0x953f421f,0x954f421f,0x954f421f,0x322f853f,0x853f322f,0x954f954f,0x954f954f,0x111f753f,0x753f111f,0x954f954f,0x954f954f,0x322f853f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xeeefeeef,0xdddfcccf,0xeeefffff,0xdddfcccf,0xdddfdddf,0xcccfdddf,0xdddfdddf,0xcccfcccf,0x0000258f,0x0000157f,0x157f0000,0x00000000,0x00000000,0x0000157f,0x157f0000,0x157f0000,0xefffffff,0xefffefff,0xefffefff,0xefffefff,0xffffffff,0xefffffff,0xffffffff,0xefffefff,0x8bf97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9, +0x753f964f,0x964f753f,0x964f753f,0x532f753f,0x964f753f,0x753f964f,0x753f753f,0x753f532f,0x061f0000,0x061f182f,0x061f000f,0x061f171f,0x181f181f,0x061f181f,0x061f000f,0x0000000f,0x041f0000,0x071f182f,0x071f181f,0x061f181f,0x061f020f,0x171f182f,0x071f181f,0x0000061f,0x061f0000,0xddafdd9f,0xdd9fddaf,0xddafdd9f,0xdd9fddaf,0xddafdd9f,0xdd9fdd9f,0x0000061f, +0xaabfaabf,0xaabfaabf,0x9aafaabf,0xaabfaabf,0xabcfaabf,0xaabf99af,0x9abf9aaf,0x9abf9aaf,0xeedf9e3f,0x00009c6f,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0x854f322f,0x532f964f,0x532f964f,0x532f853f,0x532f964f,0x532f954f,0x532f964f,0x322f854f,0x854f322f,0x964f964f,0x953f964f,0x111f753f,0x753f111f,0x954f954f,0x964f964f,0x322f854f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdddfdddf,0xeeefdddf,0xbbbfbbbf,0xeeefdddf,0xeeefcccf,0xffffffff,0xeeefdddf,0xffffffff,0x0000157f,0x0000157f,0x258f0000,0x00000000,0x00000000,0x0000147f,0x147f0000,0x157f0000,0xefffefff,0xffffefff,0xffffffff,0xefffffff,0xefffefff,0xefffefff,0xefffffff,0xefffefff,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af9fff9,0x7af97af9,0x7af97af9,0x7af97af9, +0x964f964f,0x753f532f,0x532f753f,0x753f532f,0x753f753f,0x753f753f,0xb85fb85f,0x964f753f,0x061f0000,0x181f182f,0x182f061f,0x000f061f,0x181f061f,0x182f181f,0x181f061f,0x0000061f,0x041f0000,0x171f182f,0x182f172f,0x000f051f,0x071f041f,0x071f182f,0x071f182f,0x0000061f,0x061f0000,0xdd9fdd9f,0xdd9fdd9f,0xdd9fdd9f,0xdd9fdd9f,0xddafdd9f,0xdd9fdd9f,0x0000061f, +0x899f99af,0x9aafaabf,0xaabf9aaf,0x9aafaabf,0xaabf9abf,0xaabfaabf,0xaabf9abf,0xaabf99af,0x8a5f7c2f,0x0000684f,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0xeedf0000,0x00009c6f,0x753f322f,0x321f853f,0x432f853f,0x422f954f,0x321f853f,0x421f853f,0x321f964f,0x322f753f,0x753f322f,0x853f853f,0x964f853f,0x111f753f,0x753f111f,0x953f853f,0x853f964f,0x322f753f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xffffffff,0xeeefeeef,0xffffffff,0xeeefeeef,0xeeefffff,0xeeefdddf,0xdddfeeef,0xdddfcccf,0x157f023f,0x157f134f,0x234f157f,0x157f046f,0x157f269f,0x157f245f,0x245f147f,0x134f268f,0xffffffff,0xefffffff,0xefffefff,0xefffefff,0xefffefff,0xffffefff,0xefffffff,0xefffefff,0x7af97af9,0x7af97af9,0x7af97af9,0xfff97af9,0x7af97af9,0x7af97af9,0xfff97af9,0x7af97af9, +0x964f964f,0xb85f753f,0x753fb85f,0x964fb85f,0xb85f532f,0x753fb85f,0x964f964f,0x753f888f,0x000f0000,0x181f051f,0x181f182f,0x182f181f,0x061f181f,0x061f171f,0x181f182f,0x0000061f,0x041f000f,0x071f182f,0x182f181f,0x031f061f,0x171f041f,0x071f182f,0x051f182f,0x000f000f,0x061f0000,0xdd9fdd9f,0xdd9fddaf,0xdd9fdd9f,0xdd9fdd9f,0xddafdd9f,0xdd9fddaf,0x0000061f, +0xaabfaabf,0xaabf889f,0xaabf99af,0x9abf9aaf,0xaabfaabf,0x9aafaabf,0x9aaf9abf,0x9abf9aaf,0xad7f0000,0x00008a5f,0xeedf7c2f,0x00009c6f,0xad7f9e3f,0x00008a5f,0x8a5f0000,0x0000684f,0x854f322f,0x954f532f,0x964f532f,0x853f532f,0x853f532f,0x954f532f,0x954f532f,0x322f854f,0x854f322f,0x954f954f,0x964f964f,0x111f753f,0x753f111f,0x954f954f,0x954f954f,0x322f854f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xcccfcccf,0xeeefeeef,0xdddfdddf,0xeeefeeef,0xcccfcccf,0xeeefdddf,0xbbbfbbbf,0xeeefdddf,0x0000046f,0x0000258f,0x268f0000,0x00000000,0x00000000,0x0000157f,0x157f0000,0x157f0000,0xefffffff,0xefffefff,0xefffefff,0xefffefff,0xefffefff,0xffffefff,0xefffefff,0xefffefff,0x7af97af9,0x7af97af9,0x7af97af9,0x7af98bf9,0x7af97af9,0x7af97af9,0x7af9fff9,0x7af97af9, +0x753f964f,0x964f753f,0xb85f964f,0x964f753f,0x964f666f,0x753f964f,0x964f532f,0x532f753f,0x061f0000,0x181f182f,0x061f182f,0x182f181f,0x000f061f,0x000f061f,0x181f061f,0x0000000f,0x041f0000,0x071f182f,0x182f172f,0x061f071f,0x171f041f,0x171f182f,0x061f182f,0x0000031f,0x061f0000,0xdd9fdd9f,0xddafddaf,0xdd9fdd9f,0xddafddaf,0xddafddaf,0xdd9fdd9f,0x0000061f, +0xaabf99af,0x99afaabf,0x9aafaabf,0x9aafaabf,0xaabfaabf,0xabcf9aaf,0x9aaf9aaf,0x99af9aaf,0xad7f0000,0x00008a5f,0x8a5f0000,0x0000684f,0xad7f7c2f,0x00008a5f,0xad7f0000,0x00008a5f,0x853f322f,0x953f421f,0x954f421f,0x953f421f,0x953f421f,0x953f421f,0x954f421f,0x322f853f,0x853f322f,0x953f953f,0x954f954f,0x111f753f,0x753f111f,0x953f953f,0x954f954f,0x322f853f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdddfdddf,0xbbbfbbbf,0xffffffff,0xbbbfcccf,0xeeefdddf,0xeeefeeef,0xffffffff,0xcccfeeef,0x0000157f,0x0000157f,0x157f0000,0x00000000,0x00000000,0x0000157f,0x157f0000,0x157f0000,0xffffefff,0xefffefff,0xefffefff,0xffffefff,0xffffffff,0xefffefff,0xefffefff,0xefffefff,0x8bf97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0xfff97af9,0x7af97af9,0x7af97af9, +0x532f753f,0x753f964f,0x964f964f,0x753fb85f,0x753f753f,0x753f753f,0x753f753f,0xb85fb85f,0x061f0000,0x181f182f,0x000f061f,0x182f181f,0x061f182f,0x061f181f,0x182f182f,0x0000061f,0x000f000f,0x071f061f,0x182f172f,0x061f071f,0x051f000f,0x171f182f,0x071f171f,0x000f061f,0x061f0000,0xdd9fdd9f,0xddafdd9f,0xdd9fdd9f,0xdd9fdd9f,0xddafddaf,0xdd9fddaf,0x0000061f, +0xaabfaabf,0xaabf9aaf,0x9aafaabf,0x99afaabf,0xaabf99af,0x9aaf9aaf,0xaabfaabf,0x9aaf9aaf,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0x854f322f,0x532f964f,0x532f964f,0x532f964f,0x532f853f,0x532f853f,0x532f954f,0x322f854f,0x854f322f,0x964f964f,0x853f964f,0x111f753f,0x753f111f,0x853f853f,0x953f954f,0x322f854f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xeeefeeef,0xffffffff,0xeeefffff,0xdddfeeef,0xdddfbbbf,0xffffeeef,0xdddfdddf,0xffffffff,0x147f245f,0x157f245f,0x245f157f,0x157f157f,0x258f157f,0x147f245f,0x134f157f,0x245f157f,0xefffefff,0xefffefff,0xefffefff,0xefffefff,0xefffffff,0xefffefff,0xffffffff,0xefffefff,0x7af98bf9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af98bf9,0x7af97af9,0x7af97af9, +0x964f753f,0x753f753f,0x753f532f,0x964f964f,0x532f753f,0x532fb85f,0xb85f753f,0x964f964f,0x061f0000,0x181f051f,0x061f182f,0x071f051f,0x051f182f,0x182f181f,0x051f051f,0x0000061f,0x020f0000,0x171f071f,0x182f181f,0x061f071f,0x061f020f,0x171f172f,0x182f182f,0x0000061f,0x061f0000,0xdd9fdd9f,0xdd9fdd9f,0xdd9fdd9f,0xdd9fdd9f,0xdd9fdd9f,0xdd9fdd9f,0x0000061f, +0xaabfabcf,0x899f99af,0x9aaf9aaf,0xaabf9aaf,0xaabfaabf,0xaabfaabf,0x9aafaabf,0x9abfaabf,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0xeedf0000,0x00009c6f,0xad7f7c2f,0x00008a5f,0x753f322f,0x432f953f,0x432f964f,0x321f964f,0x422f964f,0x321f954f,0x321f853f,0x322f753f,0x753f322f,0x964f953f,0x964f964f,0x753f964f,0x954f753f,0x853f954f,0x853f853f,0x322f753f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xffffffff,0xdddfdddf,0xeeefffff,0xeeefeeef,0xeeefffff,0xdddfdddf,0xeeefeeef,0xcccfdddf,0x0000046f,0x0000258f,0x157f0000,0x00000000,0x00000000,0x0000258f,0x147f0000,0x157f0000,0xefffffff,0xefffffff,0xefffefff,0xffffefff,0xffffffff,0xffffffff,0xefffffff,0xefffefff,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9, +0x753f964f,0xb85f532f,0x532f753f,0x532f753f,0x753f753f,0x532f753f,0x753f753f,0x964f964f,0x061f0000,0x020f000f,0x061f061f,0x061f000f,0x000f020f,0x061f061f,0x020f000f,0x0000061f,0x041f0000,0x182f172f,0x182f071f,0x000f051f,0x172f041f,0x171f182f,0x171f182f,0x0000061f,0x061f0000,0x061f061f,0x061f061f,0x061f061f,0x061f061f,0x061f061f,0x061f061f,0x0000061f, +0x9abfaabf,0x9aaf9aaf,0x9abfaabf,0xaabfaabf,0xaabf899f,0x9aaf99af,0x99afaabf,0xaabf9aaf,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0x8a5f0000,0x0000684f,0xad7f0000,0x00008a5f,0x754f322f,0x753f753f,0x854f753f,0x753f854f,0x854f854f,0x854f753f,0x854f854f,0x322f754f,0x754f322f,0x753f753f,0x854f753f,0x753f854f,0x854f854f,0x854f753f,0x854f854f,0x322f754f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xcccfcccf,0xeeefffff,0xdddfcccf,0xffffffff,0xdddfdddf,0xffffeeef,0xcccfcccf,0xffffeeef,0x157f245f,0x157f245f,0x245f157f,0x157f157f,0x157f258f,0x157f124f,0x356f157f,0x245f157f,0xffffffff,0xefffffff,0xefffefff,0xefffefff,0xefffefff,0xffffefff,0xefffefff,0xffffefff,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9, +0x753f964f,0x964fb85f,0x753f964f,0x964f888f,0x964f964f,0x753f753f,0x964f964f,0x532f753f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x041f0000,0x182f172f,0x181f171f,0x031f061f,0x181f041f,0x071f172f,0x171f181f,0x0000061f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xaabf9aaf,0x99af9aaf,0xaabfabcf,0xaabf99af,0xaabf9abf,0x9aaf9aaf,0x9abf9aaf,0x99af9aaf,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0x322f222f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x322f222f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x322f322f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xa84fb95f,0xa84fa84f,0xb95fa84f,0xa94fb95f,0xb95fa84f,0xb95fb95f,0xb95fb95f,0x863fb95f,0xaaafaaaf,0xaaafaaaf,0xbbbfbbbf,0xbbbfcccf,0xbbbfbbbf,0xcccfcccf,0xcccfcccf,0xbbbfcccf,0x00000000,0x542f873f,0x00000000,0x00000000,0x00000000,0x00000000,0x652fa85f,0x00000000, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x420f741f,0x631f731f,0x420f420f,0x631f631f,0x310f420f,0x420f631f,0x631f531f,0x731f420f,0x632f964f,0x964f964f,0x632f632f,0x964f964f,0x421f632f,0x632f964f,0x964f753f,0x964f632f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00006c0f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x0000661f,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x963fb95f,0x752f863f,0x863f863f,0x863f863f,0x863f863f,0x863f863f,0x863f863f,0x641f963f,0xcccfbbbf,0xbbbfbbbf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xaaafcccf,0xa84f0000,0x431fa84f,0x873f873f,0xa84fa84f,0xa85fa85f,0xa84fa85f,0x642f873f,0x0000a84f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x310f420f,0x521f531f,0x420f520f,0x631f310f,0x310f420f,0x420f520f,0x420f420f,0x731f310f,0x421f632f,0x753f753f,0x632f753f,0x964f421f,0x421f632f,0x632f753f,0x632f632f,0x964f421f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00005b0f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x280f9b0f,0x00000000,0x00000000,0x00000000,0x00000000,0x761f0000,0x00000000,0x00000000,0x110f871f,0x00000000,0x00000000,0x0000761f,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x963fb95f,0x752f752f,0x752f752f,0x863f852f,0x852f852f,0x852f852f,0x963f642f,0x641f963f,0xcccfcccf,0xbbbfbbbf,0xbbbfbbbf,0xcccfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xcccfbbbf,0xaaafbbbf,0x642f0000,0x542f873f,0x642f642f,0x642f642f,0x642f642f,0x542f542f,0x652f642f,0x0000642f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x310f731f,0x631f631f,0x420f520f,0x420f210f,0x210f420f,0x420f631f,0x420f420f,0x531f420f,0x421f964f,0x964f964f,0x632f753f,0x753f421f,0x421f753f,0x632f964f,0x632f632f,0x753f632f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x160f5b0f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x360f890f,0x00000000,0x00000000,0x00000000,0x00000000,0x761f0000,0x0000220f,0x00000000,0x871f0000,0x00000000,0x00000000,0x220f871f,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x752f973f,0x0000642f,0x00000000,0x973f0000,0x0000642f,0x00000000,0x963f0000,0x531f752f,0xbbbfbbbf,0x0000bbbf,0x00000000,0xcccf0000,0x0000bbbf,0x00000000,0xcccf0000,0xaaafbbbf,0x00000000,0x431f542f,0x00000000,0x00000000,0x00000000,0x00000000,0x431f542f,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x420f531f,0x333f631f,0x320f520f,0x531f320f,0x210f420f,0x420f420f,0x420f420f,0x631f310f,0x632f753f,0x555f964f,0x632f753f,0x964f632f,0x421f753f,0x753f753f,0x632f632f,0x964f421f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000c0f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x160f5c0f,0x00000000,0x00000000,0x00000000,0x00000000,0x591f0000,0x00000000,0x00000000,0x5a0f0000,0x00000000,0x00000000,0x00006b0f,0x00000000,0x00000000,0x0000970f,0x761f0000,0x9a0f0000,0x0000330f,0x970f0000,0x330f0000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x752f333f,0x0000752f,0x00000000,0xa84f0000,0x0000852f,0x00000000,0xa84f0000,0x742f863f,0xbbbf444f,0x0000bbbf,0x00000000,0xcccf0000,0x0000bbbf,0x00000000,0xcccf0000,0xaaafcccf,0x00000000,0x542f873f,0x00000000,0x00000000,0x00000000,0x00000000,0x642fa84f,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x420f531f,0x520f520f,0x320f320f,0x420f531f,0x210f420f,0x222f531f,0x420f420f,0x631f310f,0x632f753f,0x753f753f,0x632f632f,0x753f964f,0x421f753f,0x555f964f,0x632f753f,0x964f421f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x180f0a0f,0x00000000,0x00000000,0x00000000,0x00000000,0x5a0f0000,0x00000000,0x00000000,0x481f0000,0x00000000,0x00000000,0x00005c0f,0x00000000,0x6b0f0000,0x0000150f,0x6c0f0000,0x9c0f0000,0x0000160f,0x00000000,0x160f5a0f,0x00000000,0x00000000,0x440f9b0f,0x970f0000,0x9a0f220f,0x761f350f,0x9a0f0000,0x00000000,0x0000761f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x863f666f,0x0000642f,0x00000000,0xa84f0000,0x0000852f,0x00000000,0xa84f0000,0x641f863f,0xcccf888f,0x0000bbbf,0x00000000,0xcccf0000,0x0000bbbf,0x00000000,0xcccf0000,0xaaafcccf,0xa84f0000,0x642f642f,0xa85fa85f,0x873fa85f,0x873f873f,0xa85f642f,0x542f873f,0x0000a84f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x420f420f,0x420f631f,0x320f320f,0x521f210f,0x310f310f,0x210f521f,0x420f420f,0x631f631f,0x632f632f,0x632f964f,0x632f632f,0x964f421f,0x632f632f,0x421f964f,0x632f753f,0x964f964f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x0000090f,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x060f0c0f,0x00000000,0x00000000,0x00000000,0x00000000,0x5c0f0000,0x0000160f,0x591f0000,0x5a0f0000,0x0000030f,0x00000000,0x170f5c0f,0x00000000,0x00000000,0x00005a0f,0x6b0f0000,0x9b0f270f,0x0000481f,0x591f0000,0x160f0000,0x00000000,0x0000551f,0x460f9a0f,0x0000871f,0x890f440f,0x871f350f,0xab0f220f,0x00000000,0x110f871f, +0x00000000,0x00000000,0x00000000,0xfd0f0000,0x0000f80f,0x00000000,0x00000000,0x00000000,0x963fb95f,0x963f963f,0xa84fa84f,0xa84fa84f,0x863f863f,0x973fa84f,0xa84fa84f,0x742f963f,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xaaafcccf,0x642f0000,0x642fa85f,0x542f542f,0x642f542f,0x642f642f,0x542f542f,0x652fa85f,0x0000642f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x520f631f,0x420f631f,0x210f320f,0x420f210f,0x210f310f,0x420f521f,0x420f420f,0x520f631f,0x753f964f,0x753f964f,0x421f632f,0x753f421f,0x421f632f,0x753f964f,0x632f753f,0x753f964f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x040f0c0f,0x00000000,0x00000000,0x00000000,0x00000000, +0x0c0f0000,0x00000000,0x00000000,0x0a0f0000,0x00000000,0x00000000,0x00000d0f,0x00000000,0x00000000,0x00005b0f,0x5c0f0000,0x5a0f050f,0x0000160f,0x5a0f0000,0x00000000,0x00000000,0x00000000,0x160f8a0f,0x00006d0f,0x8a0f160f,0x6d0f370f,0x8a0f0000,0x00000000,0x00000000,0x000f871f,0x350fab0f,0x330f9a0f,0x780f0000,0x9a0f240f,0x780f330f,0x761f0000,0x330f0000, +0x00000000,0x00000000,0x00000000,0xff9f0000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x752f973f,0x642f642f,0x642f642f,0x752f642f,0x642f642f,0x642f642f,0x752f642f,0x531f752f,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xaaafbbbf,0x00000000,0x431f542f,0x00000000,0x00000000,0x00000000,0x00000000,0x431f542f,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x310f631f,0x420f520f,0x210f320f,0x520f210f,0x210f310f,0x420f420f,0x320f320f,0x520f631f,0x421f964f,0x753f753f,0x421f632f,0x964f421f,0x421f632f,0x753f753f,0x632f632f,0x753f964f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x191f0b0f,0x00000000,0x00000000,0x00000000,0x00000000, +0x0c0f0000,0x0000180f,0x0a0f0000,0x491f0000,0x0000060f,0x00000000,0x291f0c0f,0x00000000,0x00000000,0x170f5a0f,0x00006c0f,0x5b0f280f,0x5b0f050f,0x5a0f0000,0x00000000,0x00000000,0x00000000,0x350f9c0f,0x291f8a0f,0x9b0f0000,0x9b0f350f,0x8a0f291f,0x00000000,0x00006b0f,0x440f9a0f,0x470fab0f,0x350fab0f,0x890f0000,0x9a0f130f,0xab0f360f,0x9a0f0000,0x0000220f, +0x00000000,0x00000000,0x00000000,0x763f0000,0x0000432f,0x00000000,0x00000000,0x00000000,0x963fb95f,0x0000852f,0x00000000,0xa84f0000,0x0000852f,0x00000000,0xa84f0000,0x641f963f,0xcccfcccf,0x0000cccf,0x00000000,0xcccf0000,0x0000bbbf,0x00000000,0xcccf0000,0xaaafbbbf,0x00000000,0x652fa85f,0x00000000,0x00000000,0x00000000,0x00000000,0x652fa85f,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x310f531f,0x420f520f,0x310f320f,0x520f210f,0x210f310f,0x310f521f,0x210f320f,0x420f520f,0x421f753f,0x753f753f,0x632f632f,0x964f421f,0x421f632f,0x632f964f,0x421f632f,0x632f753f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x0000081f,0x00000000,0x00000000,0x00000000,0x00000000,0x0b0f0000,0x00000000,0x00000000,0x0c0f0000,0x00000000,0x00000000,0x00000b0f,0x00000000, +0x00000000,0x00000b0f,0x0b0f0000,0x5c0f060f,0x0000040f,0x0a0f0000,0x180f0000,0x00000000,0x00000000,0x160f5c0f,0x280f5c0f,0x790f0000,0x591f170f,0x5c0f160f,0x00000000,0x00005b0f,0x00006b0f,0x470f9b0f,0x250f890f,0x8a0f0000,0x8a0f360f,0x9a0f370f,0x481f0000,0x170f0000,0x350fab0f,0x470f9a0f,0x470f890f,0x9a0f0000,0x9a0f240f,0x780f350f,0x780f0000,0x0000360f, +0x00000000,0x00000000,0x00000000,0x974f0000,0x0000321f,0x00000000,0x00000000,0x00000000,0x863fa84f,0x0000752f,0x00000000,0xa84f0000,0x0000752f,0x00000000,0xa84f0000,0x641f863f,0xcccfcccf,0x0000bbbf,0x00000000,0xcccf0000,0x0000bbbf,0x00000000,0xcccf0000,0xaaafcccf,0xa84f0000,0x542f873f,0xa85fa85f,0x873f873f,0x873f873f,0xa84fa84f,0x542fa85f,0x0000a84f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x310f531f,0x420f631f,0x420f320f,0x521f310f,0x310f420f,0x320f521f,0x210f320f,0x520f631f,0x421f753f,0x632f964f,0x753f632f,0x964f632f,0x632f753f,0x632f964f,0x421f632f,0x753f964f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x030f091f,0x00000000,0x00000000,0x00000000,0x00000000,0x0a0f0000,0x0000060f,0x0c0f0000,0x4b0f0000,0x0000180f,0x00000000,0x170f0c0f,0x00000000, +0x00000000,0x170f5c0f,0x00000a0f,0x5b0f170f,0x0a0f170f,0x5b0f0000,0x00000000,0x00000000,0x00005b0f,0x170f5b0f,0x170f5c0f,0x9c0f0000,0x5a0f140f,0x5c0f050f,0x5a0f0000,0x160f0000,0x170f9b0f,0x370f780f,0x250f8a0f,0x890f0000,0x8a0f350f,0x8a0f250f,0x9a0f0000,0x0000030f,0x470f890f,0x360f890f,0x240f9b0f,0x890f0000,0x780f360f,0x780f360f,0x780f0000,0x0000130f, +0x00000000,0x00000000,0x00000000,0x974f0000,0x0000432f,0x00000000,0x00000000,0x00000000,0x863fb95f,0x0000852f,0x00000000,0xa84f0000,0x0000752f,0x00000000,0xa84f0000,0x641f863f,0xcccfcccf,0x0000bbbf,0x00000000,0xcccf0000,0x0000bbbf,0x00000000,0xcccf0000,0xaaafbbbf,0x642f0000,0x642fa84f,0x542f542f,0x642f542f,0x642f642f,0x642f642f,0x642fa84f,0x0000642f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x420f531f,0x631f631f,0x320f420f,0x420f210f,0x310f420f,0x531f210f,0x631f320f,0x420f333f,0x632f753f,0x964f964f,0x632f753f,0x753f421f,0x632f753f,0x964f421f,0x964f632f,0x632f666f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000b1f,0x00000000,0x00000000,0x00000000,0x00000000,0x0d0f0000,0x00000000,0x00000000,0x0b1f0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000b0f,0x090f0000,0x4b0f180f,0x0000060f,0x0a0f0000,0x180f0000,0x00000000, +0x00000000,0x170f5b0f,0x160f4a0f,0x790f0000,0x5b0f160f,0x5b0f160f,0x00000000,0x00000e0f,0x170f5a0f,0x170f790f,0x280f8b0f,0x8b0f0000,0x9c0f470f,0x5b0f150f,0x5b0f0000,0x0000150f,0x360f8a0f,0x130f890f,0x350f890f,0x890f0000,0x780f240f,0x8a0f250f,0x8a0f0000,0x0000360f,0x240f9a0f,0x240f780f,0x460fab0f,0x890f0000,0x780f240f,0x890f130f,0x9a0f0000,0x0000120f, +0x00000000,0x00000000,0x00000000,0x975f0000,0x0000432f,0x00000000,0x00000000,0x00000000,0x752f973f,0x973f752f,0x963f963f,0x973f963f,0x973f752f,0x973f973f,0x963f963f,0x531f752f,0xbbbfbbbf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfbbbf,0xcccfcccf,0xbbbfbbbf,0x999fbbbf,0x00000000,0x431f642f,0x00000000,0x00000000,0x00000000,0x00000000,0x431f542f,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x420f531f,0x631f420f,0x320f520f,0x420f320f,0x420f222f,0x631f210f,0x631f420f,0x310f420f,0x632f753f,0x964f632f,0x632f753f,0x753f632f,0x753f555f,0x964f421f,0x964f632f,0x421f632f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x070f0a1f,0x00000000,0x00000000,0x00000000,0x00000000,0x0c1f0000,0x0000191f,0x00000000,0x4b0f0000,0x0000070f,0x00000000,0x00000b1f,0x00000000,0x00000000,0x170f491f,0x00000c0f,0x4b0f050f,0x080f170f,0x4b0f0000,0x00000000,0x00000000, +0x0000090f,0x170f5b0f,0x060f481f,0x690f0000,0x491f140f,0x491f170f,0x080f0000,0x2a1f0000,0x160f5b0f,0x240f8a0f,0x370f560f,0x790f0000,0x790f360f,0x790f470f,0x790f0000,0x0000160f,0x250f9a0f,0x250f890f,0x240f780f,0x780f0000,0x780f240f,0x780f130f,0x8a0f0000,0x0000350f,0x350f890f,0x130f780f,0x470f890f,0x671f0000,0x780f240f,0x671f130f,0x890f0000,0x0000350f, +0x00000000,0x00000000,0x00000000,0x974f0000,0x0000321f,0x00000000,0x00000000,0x00000000,0x963fb95f,0xa84f963f,0xa84fa84f,0xa84fa84f,0xa84f863f,0xa84fa84f,0x973fa84f,0x742f963f,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xbbbfcccf,0xaaafbbbf,0x00000000,0x652fa85f,0x00000000,0x00000000,0x00000000,0x00000000,0x431fa84f,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x310f420f,0x631f420f,0x420f520f,0x631f210f,0x420f320f,0x520f420f,0x631f420f,0x631f631f,0x421f632f,0x964f632f,0x632f753f,0x964f421f,0x632f632f,0x753f632f,0x964f632f,0x964f964f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x0e1f0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000d0f,0x0c0f0000,0x4a0f0000,0x0000060f,0x0a1f0000,0x070f0000,0x00000000,0x00000000,0x050f4c0f,0x191f4a0f,0x7c0f0000,0x4a0f060f,0x4a0f030f,0x00000000,0x00000b0f, +0x040f5c0f,0x170f8a0f,0x030f790f,0x680f0000,0x790f140f,0x491f040f,0x491f0000,0x0000040f,0x160f790f,0x360f790f,0x010f790f,0x670f0000,0x670f140f,0x790f140f,0x8a0f0000,0x0000250f,0x360f790f,0x240f780f,0x130f890f,0x671f0000,0x671f130f,0x671f130f,0x671f0000,0x0000360f,0x240f780f,0x130f670f,0x240f671f,0x671f0000,0x671f020f,0x670f130f,0x671f0000,0x0000240f, +0x00000000,0x00000000,0x00000000,0x653f0000,0x0000331f,0x00000000,0x00000000,0x00000000,0x863fa94f,0x852f642f,0x852f852f,0x863f852f,0x852f852f,0x752f852f,0x863f752f,0x742f863f,0xcccfcccf,0xbbbfbbbf,0xcccfcccf,0xcccfcccf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xaaafbbbf,0xa84f0000,0x652f642f,0xa85f873f,0x873fa85f,0xa85fa85f,0xa84f873f,0x542f873f,0x0000a84f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x531f420f,0x521f420f,0x420f421f,0x631f420f,0x420f631f,0x520f310f,0x310f420f,0x531f531f,0x753f632f,0x753f632f,0x632f542f,0x964f632f,0x632f964f,0x753f421f,0x421f632f,0x753f753f, +0x00000000,0x00000000,0x00000000,0x00000b1f,0x00000000,0x00000000,0x00000000,0x00000000,0x0b1f0000,0x00000000,0x00000000,0x3b0f0000,0x00001a1f,0x00000000,0x00000c1f,0x00000000,0x00000000,0x1a1f381f,0x00000a1f,0x391f181f,0x091f060f,0x391f0000,0x00000000,0x00000000,0x00000b0f,0x170f4b0f,0x050f391f,0x7a0f0000,0x491f370f,0x4c0f050f,0x090f0000,0x070f0000, +0x170f491f,0x260f790f,0x250f680f,0x570f0000,0x790f030f,0x680f240f,0x571f0000,0x0000040f,0x140f680f,0x140f680f,0x240f671f,0x670f0000,0x571f020f,0x790f020f,0x670f0000,0x0000360f,0x140f780f,0x130f670f,0x240f671f,0x671f0000,0x440f020f,0x671f020f,0x671f0000,0x0000020f,0x020f671f,0x020f780f,0x020f670f,0x660f0000,0x661f020f,0x561f020f,0x560f0000,0x0000020f, +0x00000000,0x00000000,0x00000000,0x974f0000,0x0000321f,0x00000000,0x00000000,0x00000000,0x963fb95f,0x863f752f,0x963f863f,0xa84f963f,0x963f852f,0x444f863f,0x111f222f,0x742f742f,0xcccfcccf,0xcccfbbbf,0xcccfcccf,0xcccfcccf,0xcccfbbbf,0xbbbfbbbf,0xaaafbbbf,0x999faaaf,0x642f0000,0x542f873f,0x542f542f,0x542f652f,0x642f642f,0x542f642f,0x652fa85f,0x0000642f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x420f631f,0x631f310f,0x420f631f,0x420f310f,0x420f631f,0x520f310f,0x310f420f,0x531f731f,0x632f753f,0x964f421f,0x632f964f,0x632f421f,0x632f964f,0x753f421f,0x421f632f,0x753f964f, +0x00000000,0x00000000,0x00000000,0x0a1f0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000d1f,0x00000000,0x3b0f0000,0x0000070f,0x0e1f0000,0x181f0000,0x00000000,0x00000000,0x030f4a1f,0x050f381f,0x580f0000,0x391f050f,0x381f040f,0x00000000,0x00000000,0x170f4b0f,0x060f690f,0x040f690f,0x680f0000,0x7a0f260f,0x4a0f040f,0x381f0000,0x0000040f, +0x040f680f,0x240f670f,0x130f680f,0x561f0000,0x680f020f,0x670f140f,0x680f0000,0x0000020f,0x030f570f,0x030f460f,0x020f450f,0x560f0000,0x560f020f,0x680f020f,0x571f0000,0x0000020f,0x130f561f,0x010f560f,0x020f671f,0x450f0000,0x560f020f,0x560f000f,0x671f0000,0x0000020f,0x020f670f,0x130f560f,0x010f671f,0x560f0000,0x560f010f,0x560f010f,0x660f0000,0x0000000f, +0x00000000,0x00000000,0x00000000,0x653f0000,0x0000321f,0x00000000,0x00000000,0x00000000,0x752f333f,0x752f642f,0x752f752f,0x963f752f,0x752f642f,0x111f752f,0x963f531f,0x531f531f,0xbbbf444f,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfaaaf,0xbbbfaaaf,0xbbbfbbbf,0x999faaaf,0x00000000,0x432f642f,0x00000000,0x00000000,0x00000000,0x00000000,0x431f431f,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x631f631f,0x731f310f,0x531f531f,0x631f420f,0x420f531f,0x631f420f,0x420f531f,0x310f731f,0x753f753f,0x964f421f,0x753f753f,0x964f632f,0x632f753f,0x964f632f,0x632f753f,0x421f964f, +0x00000000,0x00000b1f,0x00000000,0x0e1f0000,0x0000060f,0x0c1f0000,0x00000000,0x00000000,0x00000000,0x191f3c0f,0x0000091f,0x3a0f0000,0x0b1f060f,0x391f0000,0x00000000,0x00000000,0x0000091f,0x050f690f,0x030f580f,0x6a0f0000,0x571f030f,0x680f050f,0x081f0000,0x00000000,0x060f381f,0x140f690f,0x140f690f,0x690f0000,0x580f130f,0x571f250f,0x580f0000,0x0000030f, +0x020f670f,0x020f571f,0x130f680f,0x680f0000,0x561f010f,0x561f030f,0x571f0000,0x0000030f,0x020f560f,0x000f560f,0x000f450f,0x450f0000,0x450f000f,0x561f000f,0x680f0000,0x0000010f,0x010f560f,0x010f671f,0x010f671f,0x671f0000,0x450f000f,0x671f010f,0x560f0000,0x0000020f,0x020f550f,0x000f670f,0x010f550f,0x550f0000,0x440f000f,0x661f000f,0x450f0000,0x0000010f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x863f666f,0x863f752f,0x963f863f,0xa84f963f,0x963f752f,0x963f963f,0xa84f963f,0x641f963f,0xcccf888f,0xcccfbbbf,0xcccfcccf,0xcccfcccf,0xcccfbbbf,0xcccfcccf,0xcccfbbbf,0xaaafbbbf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0xa50fa50f,0xd71fd71f,0xd71fa50f,0xa50fd71f,0xd71fa50f,0xd71fd71f,0xd71fa50f,0xa50fa50f,0xa55fc77f,0x955fa55f,0x733fc86f,0x422f522f,0x800f422f,0xa55fc77f,0x422f733f,0x844fa55f, +0x643f543f,0x432f321f,0x422f321f,0x321f321f,0x432f432f,0x654f432f,0x321f432f,0x543f321f,0x752ffb5f,0x764f752f,0x764f764f,0x752ffb5f,0x764f764f,0xfb5f764f,0xc84ffb5f,0x764f752f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x963fb95f,0x973f863f,0xa84fa84f,0xa84fa84f,0xa84f863f,0xa84fa84f,0xa84fa84f,0x641f963f,0xcccfdddf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xaaafbbbf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xea4fa50f,0xea4fa50f,0xd71fe91f,0xd71fa50f,0xa50fe91f,0xe91fe91f,0xd71fe91f,0xa50fa50f,0xa55fc77f,0x844f400f,0x422f100f,0x800fc77f,0x500f422f,0x500f955f,0x622f600f,0xa66f633f, +0x543f432f,0x643f654f,0x643f654f,0x533f765f,0x321f321f,0x644f644f,0x321f321f,0x433f543f,0xffff752f,0x431fc84f,0xfb5f764f,0xffffc84f,0x764f431f,0x752ffb5f,0xfffffd9f,0x431fc84f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x963fb95f,0x863f863f,0x863f863f,0x863f863f,0x963f963f,0x863f963f,0x963f752f,0x641f963f,0xcccfdddf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xbbbfcccf,0xbbbfbbbf,0xbbbfbbbf,0xaaafbbbf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xea4fd71f,0xa50fea4f,0xe91fe91f,0xea4fa50f,0xa50fe91f,0xe91fe91f,0xa50fea4f,0xd71fd71f,0x733f533f,0x211f844f,0x800f422f,0x500fc77f,0x100f200f,0x500f744f,0x533f211f,0x855f300f, +0x432f654f,0x321f644f,0x643f321f,0x543f321f,0x321f543f,0x321f865f,0x422f432f,0x422f543f,0x752f752f,0x764f431f,0x764f752f,0x752f431f,0x764f431f,0x431f764f,0xc84fc84f,0x764f431f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x752f973f,0x642f642f,0x642f642f,0x752f642f,0x642f642f,0x642f642f,0x752f642f,0x531f752f,0xbbbfcccf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xaaafbbbf,0xaaafaaaf,0xaaafaaaf,0x999faaaf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xe91fd71f,0xe91fe91f,0xe91fa50f,0xe91fa50f,0xa50fe91f,0xd71fe91f,0xd71fa50f,0xd71fe91f,0x422f744f,0x533f100f,0x633fa55f,0xa75fa55f,0x422f311f,0x311f211f,0xb66f422f,0x533f800f, +0x321f432f,0x321f765f,0x644f765f,0x543f321f,0x321f432f,0x432f432f,0x432f432f,0x976f432f,0x431f764f,0xfb5f764f,0x752f752f,0x431f764f,0xfb5f764f,0x764f752f,0x431f431f,0x431f764f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x863fb95f,0x863f752f,0x963f863f,0xa84f963f,0x863f852f,0x752f863f,0xa84f863f,0x742f863f,0xcccfcccf,0xcccfbbbf,0xcccfcccf,0xcccfcccf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xaaafbbbf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd71fa50f,0xe91fe91f,0xd71fd71f,0xe91fa50f,0xe91fd71f,0xa50fe91f,0xea4fe91f,0xa50fd71f,0xc77fea8f,0x533f853f,0x855fc77f,0x200f855f,0x955f533f,0xa66f944f,0xa65f422f,0x533f700f, +0x432f533f,0x755f654f,0x321f321f,0x865f432f,0x654f432f,0x765f543f,0x432f865f,0x543f533f,0x764f764f,0xc84ffb5f,0xc84ffd9f,0x764f431f,0xc84ffb5f,0x431f752f,0x764f764f,0x431ffb5f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x863fa84f,0x863f642f,0x863f863f,0xa84f963f,0x863f852f,0x863f863f,0xa84f863f,0x641f863f,0xcccfcccf,0xcccfbbbf,0xcccfcccf,0xcccfcccf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xaaafbbbf,0x00000000,0x00000000,0x00000000,0xf00f0000,0x0000f00f,0x00000000,0x00000000,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa50fa50f,0xa50fa50f,0xa50fe91f,0x320f320f,0xe91fe91f,0xe91fa50f,0xa50fd71f,0xa50fa50f,0x855f400f,0x533f733f,0x600f633f,0x311f844f,0xd88fb66f,0x955f844f,0x533f954f,0x211f100f, +0x321f432f,0x644f321f,0x533f321f,0x654f321f,0x432f321f,0x321f543f,0x754f654f,0x422f876f,0x752f764f,0xfd9f752f,0xfd9fffff,0x764f431f,0xffffc84f,0x431f431f,0xfb5f764f,0x431fc84f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x777f0000,0x0000777f,0x00000000,0x00000000,0x00000000,0x963fb95f,0x863f852f,0x963f963f,0xa84f963f,0x863f752f,0x963f752f,0xa84f963f,0x742f963f,0xbbbfcccf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfaaaf,0xbbbfaaaf,0xbbbfbbbf,0xaaafbbbf,0x00000000,0x00000000,0x00000000,0xfd0ff00f,0xf00ff80f,0x00000000,0x00000000,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xe91fd71f,0xe91fe91f,0x320fa50f,0xb80fea0f,0xa50f320f,0xd71fe91f,0xe91fa50f,0xd71fd71f,0x844f500f,0x533f733f,0x100f522f,0x522f311f,0x600f633f,0x844fb66f,0x844f633f,0x300f500f, +0x654f321f,0x432f321f,0x654f865f,0x321f654f,0x321f432f,0x321f865f,0x654f644f,0x654f432f,0x431f764f,0xc84f431f,0xc84ffd9f,0x764f431f,0x431f752f,0x764f764f,0xc84f752f,0x431fffff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x888f0000,0x0000777f,0x00000000,0x00000000,0x00000000,0x752f973f,0x963f752f,0x963f963f,0x973f963f,0x973f752f,0x963f963f,0x963f963f,0x531f752f,0xaaafbbbf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0xaaaf999f,0xaaafaaaf,0xaaafaaaf,0x888faaaf,0x00000000,0x00000000,0x00000000,0xff9ff00f,0xf00fffff,0x00000000,0x00000000,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd71fa50f,0xe91fd71f,0x320fe91f,0xea0fb80f,0x320fb80f,0xa50fa50f,0xe91fe91f,0xd71fea4f,0x844f733f,0x522f211f,0xc77f955f,0x422f422f,0x200f633f,0x955f311f,0x311f500f,0x911f400f, +0x644f654f,0x432f654f,0x432f432f,0x432f321f,0x654f543f,0x543f644f,0x644f644f,0x754f321f,0x764f764f,0x431f764f,0x752f752f,0x764f431f,0x764f431f,0x752ffb5f,0x752f764f,0x431ffd9f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x763f0000,0x0000653f,0x00000000,0x00000000,0x00000000,0x963fb95f,0x963f963f,0x752f963f,0x963f863f,0x863f963f,0x863f863f,0x963f963f,0x641f963f,0xaaafaaaf,0xaaafaaaf,0x999faaaf,0x999f999f,0x999f999f,0x999f999f,0x999f999f,0x777f999f,0x00000000,0x00000000,0x00000000,0xf00f0000,0x0000a00f,0x00000000,0x00000000,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa50fd71f,0xa50fa50f,0xa50fa50f,0xb80f320f,0xa50fea0f,0xd71fe91f,0xa50fa50f,0xa50fa50f,0x100f733f,0x800f533f,0xa75f800f,0xa55f964f,0x733fb66f,0x422f522f,0x000f211f,0xda7fd88f, +0x987f654f,0x432f754f,0x654f543f,0x321f432f,0x432f432f,0x321f644f,0x321f321f,0x644f643f,0xc84ffb5f,0x764f752f,0x752f431f,0x764f431f,0xfb5f764f,0x752fc84f,0x764f431f,0x431f752f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x763f0000,0x0000432f,0x00000000,0x00000000,0x00000000,0x863fa84f,0x752f752f,0x852f752f,0x863f852f,0x752f752f,0x642f752f,0x863f852f,0x641f863f,0x999faaaf,0x999f999f,0x999f999f,0x999f999f,0x888f999f,0x888f888f,0x999f999f,0x888f999f,0x00000000,0x00000000,0x00000000,0x974f0000,0x0000321f,0x00000000,0x00000000,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xea4fd71f,0xe91fe91f,0xe91fe91f,0x320fa50f,0xa50fa50f,0xa50fe91f,0xd71fe91f,0xd71fd71f,0x422f744f,0x800fc77f,0x311f600f,0x400fa55f,0x844fea8f,0x533fb86f,0xd77f522f,0x500f500f, +0x543f422f,0x643f532f,0x865f765f,0x321f765f,0x765f543f,0x321f432f,0x321f321f,0x654f422f,0xfffffb5f,0x431ffd9f,0x431f764f,0xfb5f764f,0xc84f752f,0xc84fffff,0x764f431f,0x431f752f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x653f0000,0x0000321f,0x00000000,0x00000000,0x00000000,0x863f333f,0x863f852f,0x963f963f,0xa84f863f,0x863f752f,0x863f863f,0xa84f863f,0x641f863f,0x999f444f,0x999f999f,0x999f999f,0x999f999f,0x999f888f,0x999f999f,0x999f999f,0x777f999f,0x00000000,0x00000000,0x00000000,0x974f0000,0x0000432f,0x00000000,0x00000000,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xe91fa50f,0xa50fd71f,0xa50fa50f,0xa50fea4f,0xa50fe91f,0xd71fea4f,0xe91fa50f,0xd71fea4f,0x700f422f,0x844fa65f,0x100f733f,0x600fa55f,0x733f844f,0x100f744f,0x422f633f,0x733f700f, +0x432f432f,0x754f654f,0x321f321f,0x432f754f,0x654f432f,0x543f654f,0x321f644f,0x654f321f,0x752f752f,0x764f431f,0x764f764f,0x764f764f,0x752f431f,0x752fc84f,0x764f431f,0x764f431f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x653f0000,0x0000321f,0x00000000,0x00000000,0x00000000,0x752f666f,0x752f642f,0x752f752f,0x973f752f,0x752f642f,0x752f752f,0x963f752f,0x531f752f,0x999f888f,0x999f888f,0x888f999f,0x999f888f,0x999f888f,0x888f888f,0x999f888f,0x777f888f,0x00000000,0x00000000,0x00000000,0x975f0000,0x0000432f,0x00000000,0x00000000,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa50fa50f,0xe91fd71f,0xa50fe91f,0xa50fe91f,0xd71fe91f,0xe91fd71f,0xd71fa50f,0xa50fe91f,0x300f533f,0x844fa66f,0x100f633f,0x500f844f,0x733f955f,0x300f211f,0x422fb66f,0x311f300f, +0x644f543f,0x765f321f,0x321f644f,0x432f643f,0x321f644f,0x654f976f,0x654f643f,0x432f876f,0x431f764f,0x752f764f,0x764f431f,0xfb5ffb5f,0x431f764f,0x431f752f,0x752f764f,0x764f764f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x653f0000,0x0000321f,0x00000000,0x00000000,0x00000000,0x963fb95f,0x963f852f,0x863f963f,0xa84f963f,0x863f752f,0x863f863f,0x973f863f,0x742f963f,0x999f999f,0x999f888f,0x999f999f,0x999f999f,0x999f888f,0x999f999f,0x999f999f,0x777f999f,0x00000000,0x00000000,0x00000000,0x974f0000,0x0000321f,0x00000000,0x00000000,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd71fd71f,0xe91fd71f,0xa50fe91f,0xa50fe91f,0xe91fea4f,0xe91fa50f,0xa50fe91f,0xd71fe91f,0xa55fc77f,0x311f211f,0x100f211f,0x500f633f,0x100f422f,0x700fc77f,0x733f844f,0x533f853f, +0x754f321f,0x754f321f,0x644f321f,0x432f643f,0x543f432f,0x654f432f,0x543f643f,0x533f432f,0x764f764f,0xc84ffb5f,0x764f431f,0x752f431f,0x764fffff,0x764f431f,0xc84ffb5f,0x431f752f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x763f0000,0x0000653f,0x00000000,0x00000000,0x00000000,0x863fa94f,0xa84f752f,0xa84fa84f,0xa84fa84f,0xa84f963f,0xa84fa84f,0xa84fa84f,0x742f863f,0x999f999f,0x999f888f,0x999f999f,0x999f999f,0x999f999f,0x999f999f,0x999f999f,0x777f999f,0x00000000,0x00000000,0x00000000,0x653f0000,0x0000331f,0x00000000,0x00000000,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xe91fd71f,0xe91fea4f,0xd71fa50f,0xa50fd71f,0xe91fea4f,0xa50fd71f,0xe91fe91f,0xd71fa50f,0x844fc77f,0xc77f633f,0xa55f700f,0x100f533f,0x911f633f,0x500fb66f,0x500f955f,0x311f744f, +0x876f422f,0x321f643f,0x321f321f,0x422f754f,0x765f543f,0x432f865f,0x432f432f,0x432f432f,0xfb5f764f,0xffffc84f,0x431ffd9f,0x431f764f,0x431fc84f,0xfb5f764f,0xffffc84f,0x431fc84f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x763f0000,0x0000653f,0x00000000,0x00000000,0x00000000,0x963fb95f,0x863f863f,0x963f863f,0x863f963f,0x963f963f,0x863f863f,0x963f963f,0x742f963f,0x999f999f,0x999f999f,0x999f999f,0x999f999f,0x999f999f,0x999f999f,0x999f999f,0x777f999f,0x00000000,0x00000000,0x00000000,0x974f0000,0x0000321f,0x00000000,0x00000000,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xe91fa50f,0xd71fe91f,0xe91fa50f,0xa50fd71f,0xe91fd71f,0xa50fe91f,0xe91fd71f,0xa50fe91f,0x955f633f,0xa66f200f,0x633f500f,0x300f500f,0x300f422f,0x600fa75f,0x844f955f,0x311f211f, +0x543f533f,0x321f865f,0x432f433f,0x321f876f,0x765f432f,0x543f543f,0x422f422f,0x765f432f,0x752f764f,0xc84f752f,0x752f752f,0x764f431f,0x431f431f,0x752f764f,0x752f752f,0x431f752f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x974f0000,0x0000653f,0x00000000,0x00000000,0x00000000,0x531f752f,0x531f531f,0x531f531f,0x531f531f,0x531f531f,0x531f531f,0x531f431f,0x531f531f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x00000000,0x00000000,0x00000000,0x653f0000,0x0000321f,0x00000000,0x00000000,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa50fa50f,0xd71fa50f,0xd71fa50f,0xa50fa50f,0xd71fd71f,0xa50fa50f,0xd71fd71f,0xa50fa50f,0x633f633f,0x311f400f,0x100f511f,0x300f211f,0xa75fa55f,0x954f422f,0x311f311f,0x522f311f, +0x543f865f,0x754f654f,0x765f543f,0x321f432f,0x321f321f,0x433f543f,0x321f321f,0x876f865f,0x431f764f,0x431f431f,0x431f431f,0x764f764f,0x764f764f,0x431f764f,0x431f431f,0x431f431f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x111f111f,0x111f111f,0x111f111f,0x111f111f,0x111f111f,0x111f100f,0x111f111f,0x111f111f,0x333f333f,0x333f333f,0x444f444f,0x333f333f,0x444f444f,0x333f333f,0x444f444f,0x333f333f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x210f100f,0x531f320f,0x320f100f,0x100f431f,0x210f210f,0x321f210f,0x321f320f,0x531f210f,0xeedfbbbf,0xeeefeeef,0xbbbfeeef,0xdddfeeef,0xeeefeddf,0xffffffff,0xeeefffff,0xbbafeeef,0xa50fa50f,0xa50fd71f,0xd71fa50f,0xa50fd71f,0xd71fa50f,0xa50fa50f,0xd71fd71f,0xa50fa50f,0xa50fa50f,0xa50fd71f,0xd71fa50f,0xa50fd71f,0xd71fa50f,0xa50fa50f,0xd71fd71f,0xa50fa50f, +0xa50fa50f,0xa50fd71f,0xfd2fe91f,0xa50fd71f,0xd71fa50f,0xa50fe91f,0xd71fd71f,0xa50fa50f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xcccf0000,0xdddfdddf,0xdddfdddf,0xdddfdddf,0xdddfdddf,0xdddfdddf,0xdddfdddf,0x0000cccf,0xcccf0000,0xdddfdddf,0xdddfdddf,0x720fdddf,0x610f610f,0xdddfdddf,0xdddfdddf,0x0000cccf, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x864f0000,0x0000873f,0x00000000,0x111f111f,0x222f222f,0x111f211f,0x111f111f,0x111f111f,0x111f111f,0x111f100f,0x111f111f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x333f333f,0x444f333f,0x333f333f,0x444f333f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x210f100f,0x000f321f,0x531f100f,0x210f100f,0x100f531f,0x531f210f,0x321f110f,0x431f110f,0xeeeffeef,0xdddfdddf,0xeeefdddf,0xeeefeeef,0xeedfeeef,0xeeefeeef,0xeeefeedf,0xeeeffedf,0xea4fa50f,0xa50fe91f,0xe91fd71f,0xd71fe91f,0xe91fa50f,0xa50fe91f,0xe91fd71f,0xa50fe91f,0xea4fa50f,0xa50fe91f,0xe91fd71f,0xd71fe91f,0xe91fa50f,0xa50fe91f,0xe91fd71f,0xa50fe91f, +0xea4fa50f,0xe91fe91f,0xff3fff2f,0xd71ffd3f,0xfd3fa50f,0xe91fff3f,0xe91fd71f,0xa50fe91f,0xdddf0000,0xdddfdddf,0xdddfdddf,0xdddfdddf,0xdddfdddf,0xdddfdddf,0xdddfdddf,0x0000dddf,0xcccf0000,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0x0000cccf,0x941f0000,0xeeef720f,0x720f720f,0x720f720f,0x720f720f,0x720f720f,0x720f720f,0x0000941f, +0xa52f0000,0xa52fa52f,0xa52fa52f,0xa52fa52f,0xa52fa52f,0xa52fa52f,0xa52fa52f,0x0000a52f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x542f0000,0xaaafaaaf,0xaaafaaaf,0x211f211f,0x111f111f,0x211f211f,0x111f111f,0x211f111f,0x111f111f,0x222f211f,0x111f111f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x210f100f,0x100f210f,0x531f210f,0x210f100f,0x100f531f,0x321f210f,0x321f110f,0x531f110f,0xefefdddf,0xeeefeeef,0xeddfeeef,0xdddfeeef,0xdddfdddf,0xbbbfeeef,0xeeefeeef,0xdddfdddf,0xd71fa50f,0xa50fe91f,0xe91fa50f,0xe91fe91f,0xea4fa50f,0xa50fe91f,0xe91fe91f,0xa50fe91f,0xd71fa50f,0xa50fe91f,0x200f200f,0xe91fe91f,0xea4fa50f,0xa50f200f,0xe91fe91f,0xa50fe91f, +0xd71fa50f,0xeb1fe91f,0x400f400f,0xfd3fff3f,0xff9fe91f,0xeb1f400f,0xe91ffd3f,0xa50fe91f,0xdddf0000,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefe11f,0x0000dddf,0xcccf0000,0xcccfeeef,0xdddfcccf,0xcccfeeef,0xdddfcccf,0xcccfeeef,0xdddfcccf,0x0000cccf,0x941f0000,0x820f720f,0x720f820f,0x820f720f,0x720f720f,0x820f820f,0x720f820f,0x0000941f, +0xa52f0000,0xa52fb52f,0xb52fb52f,0xb52fb52f,0xb52fb52f,0xb52fb52f,0xb52fa52f,0x0000a52f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xaaafaaaf,0x666f666f,0x666f666f,0x111f111f,0x211f111f,0x111f111f,0x211f111f,0x111f111f,0x211f211f,0x111f111f,0x211f222f,0x333f444f,0x444f444f,0x333f444f,0x444f444f,0x444f333f,0x444f444f,0x333f444f,0x444f444f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x100f320f,0x100f210f,0x321f321f,0x210f100f,0x100f531f,0x531f210f,0x531f100f,0x321f100f,0xffffeeef,0xbbbfeeef,0x111f433f,0x333f212f,0xfeefeeef,0xefefeeef,0xeeefeeef,0xeeefdddf,0xd71fa50f,0xd71fe91f,0xe91fa50f,0xea4fd71f,0xea4fa50f,0xa50fe91f,0xe91fea4f,0xa50fd71f,0xd71fa50f,0xa50fe91f,0x410f200f,0xea4f200f,0x200fa50f,0x200f200f,0xe91fa50f,0xa50fd71f, +0xd71fa50f,0xe91ffd3f,0xba3f400f,0xff9f400f,0x400feb1f,0x400f400f,0xfd3feb1f,0xa50fd71f,0xdddf0000,0xdddfeeef,0xdddfdddf,0xdddfdddf,0xdddfdddf,0xdddfeeef,0xeeefdddf,0x0000dddf,0xcccf0000,0xa52fcccf,0xcccfa52f,0xa52fcccf,0xcccfa52f,0xa52fcccf,0xcccfa52f,0x0000cccf,0x941f0000,0x610f610f,0x610f610f,0x720f820f,0x820f820f,0x610f610f,0x610f610f,0x0000941f, +0xa52f0000,0xb52fb52f,0xb52fa52f,0xa52fb52f,0xb52fb52f,0xb52fa52f,0xb52fb52f,0x0000a52f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x00000000,0xaaafaaaf,0x666f666f,0x543f432f,0x00000000,0x111f111f,0x111f111f,0x111f111f,0x100f100f,0x111f111f,0x111f111f,0x111f111f,0x100f111f,0x444f444f,0x444f333f,0x444f444f,0x333f333f,0x444f333f,0x333f333f,0x444f444f,0x333f333f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x100f310f,0x210f320f,0x321f321f,0x210f320f,0x100f320f,0x531f310f,0x531f100f,0x321f100f,0xeeefeeef,0xbbbfbbbf,0x333fdedf,0x212f333f,0xeeef333f,0xdddfdddf,0xeddfdddf,0xdddf433f,0xd71fa50f,0xd71fe91f,0xea4fa50f,0xe91fd71f,0xe91fa50f,0xa50fd71f,0xe91fea4f,0xa50fd71f,0xd71fa50f,0x200fa50f,0x410f410f,0xa50f410f,0x200fa50f,0x410f410f,0xa50f200f,0xa50fd71f, +0xd71fa50f,0x400feb1f,0xba3fba3f,0xeb1fbb3f,0x400feb1f,0xba3fbb3f,0xeb1f400f,0xa50fd71f,0xdddf0000,0xe33feeef,0xeeefe11f,0xeeefeeef,0xe11feeef,0xeeefdddf,0xeeefeeef,0x0000dddf,0x941f0000,0xa52fa52f,0xa52fa52f,0xa52fa52f,0xa52fa52f,0xa52fa52f,0xa52fa52f,0x0000941f,0x941f0000,0x720f720f,0x720f720f,0x610f610f,0x610f610f,0x720f610f,0x720f720f,0x0000941f, +0xa52f0000,0xb52fb52f,0xb52fb52f,0xb52fb52f,0xb52fa52f,0xb52fb52f,0xb52fb52f,0x0000a52f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x864f0000,0xaaaf542f,0x666f666f,0x00000000,0x873f432f,0x00000000,0x100f111f,0x211f111f,0x100f111f,0x111f111f,0x100f111f,0x111f111f,0x111f100f,0x111f111f,0x333f333f,0x444f333f,0x333f333f,0x333f333f,0x333f333f,0x444f333f,0x333f333f,0x333f333f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x210f320f,0x210f320f,0x210f531f,0x310f210f,0x100f320f,0x431f210f,0x321f100f,0x210f100f,0x443f333f,0xffffeeef,0xfeefffff,0xffffeeef,0xeeefffff,0xffffffff,0x333feeef,0x111f111f,0xea4fa50f,0xd71fe91f,0xea4fa50f,0xe91fe91f,0xe91fa50f,0xa50fd71f,0xe91fea4f,0xa50fd71f,0xea4fa50f,0x200fa50f,0x410f410f,0xa50f410f,0x200fa50f,0x410f410f,0xa50f410f,0xa50fd71f, +0xea4fa50f,0x400fa50f,0xbb3fbb3f,0xa50fbb3f,0x400feb1f,0xbb3fbb3f,0xeb1fbb3f,0xa50ffd2f,0xdddf0000,0xe11feeef,0xeeefe11f,0xeeefeeef,0xeeefdddf,0xdddfeeef,0xeeefeeef,0x0000dddf,0x941f0000,0xb52fa52f,0xa52fb52f,0xb52fa52f,0xa52fb52f,0xb52fa52f,0xa52fb52f,0x0000941f,0x941f0000,0x820f720f,0x720f820f,0x820f720f,0x720f820f,0x820f720f,0x720f820f,0x0000941f, +0xa52f0000,0xa52fb52f,0xb52fb52f,0xb52fb52f,0xb52fb52f,0xa52fb52f,0xb52fb52f,0x0000a52f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x542f0000,0x666faaaf,0x00000000,0x00000000,0x864f642f,0x00000000,0x222f222f,0x111f211f,0x111f111f,0x111f111f,0x222f211f,0x111f111f,0x222f222f,0x111f111f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x00000000,0x00000000,0x00000000,0x500f0000,0x0000400f,0x00000000,0x00000000,0x00000000, +0x321f210f,0x320f110f,0x210f431f,0x100f210f,0x100f431f,0x210f321f,0x321f000f,0x320f100f,0xedcf333f,0xeeefddcf,0xbbbfeeef,0xdddfeedf,0xdddfdddf,0xeeefeeef,0xeeefbbbf,0xeeefeeef,0xea4fa50f,0xe91fe91f,0xea4fa50f,0xe91fe91f,0xe91fa50f,0xa50fd71f,0xe91fd71f,0xa50fa50f,0xea4fa50f,0x200fa50f,0x410f410f,0xa50f410f,0x200fa50f,0x410f410f,0x410f410f,0xa50fa50f, +0xea4fa50f,0x400fa50f,0xcc3fbb3f,0xa50fcc3f,0x400feb1f,0xcc3fcc3f,0xbb3fbb3f,0xa50feb1f,0xdddf0000,0xeeefeeef,0xdddfeeef,0xeeefeeef,0xeeefeeef,0xeeefe11f,0xeeefdddf,0x0000dddf,0x941f0000,0xb52fb52f,0xb52fb52f,0xa52fb52f,0xb52fb52f,0xb52fb52f,0xb52fa52f,0x0000941f,0x941f0000,0x820f820f,0x820f820f,0x720f820f,0x820f820f,0x820f820f,0x820f720f,0x0000941f, +0xa52f0000,0xb52fb52f,0xa52fb52f,0xb52fb52f,0xb52fb52f,0xb52fb52f,0xa52fb52f,0x0000a52f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0xaaaf0000,0x543f666f,0x0000873f,0x00000000,0x642f0000,0x0000873f,0x111f111f,0x222f222f,0x111f111f,0x211f211f,0x111f111f,0x211f111f,0x111f111f,0x211f211f,0x333f333f,0x444f444f,0x444f444f,0x444f444f,0x333f333f,0x444f444f,0x444f444f,0x444f444f,0x00000000,0x00000000,0x00000000,0x400f0000,0x0000200f,0x00000000,0x00000000,0x00000000, +0x531f320f,0x320f100f,0x100f531f,0x100f531f,0x100f531f,0x110f321f,0x321f210f,0x320f100f,0xbbbfeeef,0xeedfffff,0xdddfeeef,0xeeefdddf,0xbbbfffff,0xeeefeeef,0xdddfffff,0xdddfdddf,0xe91fa50f,0xe91fe91f,0xe91fa50f,0xe91fe91f,0xe91fa50f,0xa50fe91f,0xe91fd71f,0xa50fa50f,0xe91fa50f,0xa50fe91f,0x410f410f,0xa50fa50f,0xa50fa50f,0x410f410f,0x410f410f,0xa50fa50f, +0xe91fa50f,0xa50fe91f,0xcc3fcc3f,0xe91fa50f,0xa50fe91f,0xcc3fcd4f,0xbb3fcc3f,0xa50fa50f,0xdddf0000,0xeeefe11f,0xdddfeeef,0xe33feeef,0xdddfe11f,0xeeefdddf,0xeeefeeef,0x0000dddf,0x941f0000,0x941f941f,0x941f941f,0x941f941f,0x941f941f,0x941f941f,0x941f941f,0x0000941f,0x941f0000,0x610f610f,0x610f610f,0x610f610f,0x610f610f,0x610f610f,0x610f610f,0x0000941f, +0xa52f0000,0xb52fb52f,0xb52fb52f,0xb52fb52f,0xb52fa52f,0xb52fb52f,0xb52fb52f,0x0000a52f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x666faaaf,0x642f0000,0x873f864f,0x00000000,0x642f0000,0x0000864f,0x111f111f,0x111f111f,0x111f211f,0x111f111f,0x111f111f,0x100f111f,0x111f111f,0x111f111f,0x444f444f,0x333f333f,0x444f444f,0x333f333f,0x444f333f,0x333f333f,0x444f444f,0x333f333f,0x00000000,0x00000000,0x00000000,0x763f0000,0x0000432f,0x00000000,0x00000000,0x00000000, +0x531f210f,0x321f100f,0x100f431f,0x100f210f,0x100f210f,0x100f431f,0x320f320f,0x321f100f,0xdddfdddf,0xffffdddf,0xeeefffff,0xfffffeef,0xeeefeddf,0xeeeffeef,0xefefeeef,0xdddfdddf,0xe91fa50f,0xe91fe91f,0xd71fa50f,0xd71fe91f,0xe91fa50f,0xd71fe91f,0xe91fa50f,0xa50fd71f,0xe91fa50f,0xe91fe91f,0xa50fa50f,0xd71fa50f,0xa50fa50f,0xa50fa50f,0xa50fa50f,0xa50fd71f, +0xe91fa50f,0xff3ffd3f,0xeb1fe91f,0xd71fe91f,0xe91feb1f,0xeb1fe91f,0xeb1fe91f,0xa50ffd2f,0xdddf0000,0xdddfeeef,0xdddfeeef,0xe11feeef,0xdddfe11f,0xe33fdddf,0xeeefe11f,0x0000dddf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa52f0000,0xb52fb52f,0xb52fa52f,0xb52fa52f,0xb52fb52f,0xa52fb52f,0xb52fb52f,0x0000a52f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x666faaaf,0x00000000,0x864f642f,0x0000864f,0x642f0000,0x0000864f,0x111f111f,0x211f111f,0x100f100f,0x111f111f,0x111f111f,0x222f222f,0x111f111f,0x222f222f,0x444f333f,0x444f333f,0x333f333f,0x444f444f,0x444f333f,0x444f444f,0x444f444f,0x444f444f,0x00000000,0x00000000,0x00000000,0x974f0000,0x0000321f,0x00000000,0x00000000,0x00000000, +0x531f210f,0x210f100f,0x431f320f,0x310f100f,0x100f310f,0x100f431f,0x431f320f,0x321f100f,0xeeefeedf,0xeeefeeef,0xdddfdddf,0xdddfbbbf,0xddcfbbbf,0xeeefdddf,0xeedfefef,0xeeeffeef,0xd71fa50f,0xe91fe91f,0xd71fa50f,0xd71fe91f,0xe91fa50f,0xe91fe91f,0xe91fa50f,0xa50fd71f,0xd71fa50f,0x200fa50f,0x200fa50f,0xa50fa50f,0xa50f200f,0x200fa50f,0x200fa50f,0xa50fd71f, +0xfd2fa50f,0x400feb1f,0x400feb1f,0xeb1feb1f,0xeb1f400f,0x400feb1f,0x400feb1f,0xa50fff2f,0xdddf0000,0xdddfeeef,0xeeefe11f,0xeeefeeef,0xdddfeeef,0xe11feeef,0xeeefe11f,0x0000dddf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa52f0000,0xb52fa52f,0xb52fb52f,0xb52fb52f,0xb52fb52f,0xb52fb52f,0xa52fb52f,0x0000a52f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0xaaaf0000,0x0000666f,0x00000000,0x642f0000,0x873f864f,0x00000000,0x864f542f,0x211f211f,0x111f111f,0x211f222f,0x111f111f,0x211f211f,0x111f111f,0x111f111f,0x111f111f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x444f333f,0x00000000,0x00000000,0x00000000,0x974f0000,0x0000432f,0x00000000,0x00000000,0x00000000, +0x321f100f,0x310f100f,0x431f210f,0x210f100f,0x210f100f,0x100f531f,0x531f310f,0x431f100f,0xefefbbbf,0xdddfddcf,0xbbbfdddf,0xeeefeeef,0xeedfeeef,0xffffffff,0xeeefeeef,0xeeefffff,0xd71fa50f,0xe91fe91f,0xd71fa50f,0xa50fe91f,0xe91fa50f,0xe91fe91f,0xe91fa50f,0xa50fd71f,0xd71fa50f,0x200f200f,0x200f200f,0x200f410f,0x410f200f,0x200f200f,0x200f410f,0xa50fa50f, +0xff2fa50f,0x400f400f,0x400f400f,0x400fde4f,0xdf4f400f,0x400f400f,0x400fcc3f,0xa50feb1f,0xdddf0000,0xdddfeeef,0xeeefeeef,0xdddfdddf,0xeeefeeef,0xeeefeeef,0xeeefdddf,0x0000dddf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa52f0000,0xb52fb52f,0xb52fb52f,0xb52fb52f,0xb52fb52f,0xb52fa52f,0xb52fb52f,0x0000a52f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x864f0000,0xaaaf542f,0x0000666f,0x00000000,0x00000000,0x864f642f,0x0000873f,0x653f432f,0x111f111f,0x111f111f,0x111f111f,0x111f111f,0x111f111f,0x111f111f,0x100f100f,0x111f111f,0x333f333f,0x444f444f,0x333f333f,0x444f444f,0x333f333f,0x444f333f,0x333f333f,0x444f333f,0x00000000,0x00000000,0x00000000,0x975f0000,0x0000432f,0x00000000,0x00000000,0x00000000, +0x321f100f,0x210f100f,0x531f321f,0x531f100f,0x210f000f,0x100f531f,0x431f320f,0x531f100f,0xeeefeeef,0xeeefeeef,0xbbbfeeef,0xbbbfbbbf,0xeeefeeef,0xdddfdedf,0xbbbfbbbf,0xdddfdddf,0xa50fa50f,0xe91fe91f,0xea4fa50f,0xa50fe91f,0xe91fd71f,0xe91fd71f,0xea4fa50f,0xa50fe91f,0xa50fa50f,0x410f200f,0x410f410f,0x410f410f,0x410f410f,0x410f410f,0x410f410f,0xa50f410f, +0xa50fa50f,0xcc3f400f,0xcd4fcc3f,0xde4fde4f,0xde4fdf4f,0xcd4fde4f,0xcc3fcc3f,0xeb1fbb3f,0xdddf0000,0xdddfeeef,0xeeefdddf,0xeeefeeef,0xe11fe33f,0xeeefdddf,0xeeefdddf,0x0000dddf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa52f0000,0xb52fb52f,0xb52fb52f,0xb52fa52f,0xb52fa52f,0xb52fb52f,0xb52fa52f,0x0000a52f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x864f0000,0x666faaaf,0x864f543f,0x0000873f,0x00000000,0x642f0000,0x653f642f,0x666f666f,0x111f111f,0x100f100f,0x211f211f,0x100f111f,0x111f111f,0x111f111f,0x222f222f,0x100f111f,0x333f333f,0x333f333f,0x444f444f,0x333f333f,0x444f444f,0x444f444f,0x444f444f,0x333f444f,0x00000000,0x00000000,0x00000000,0x974f0000,0x0000321f,0x00000000,0x00000000,0x00000000, +0x531f100f,0x210f100f,0x531f320f,0x310f000f,0x210f100f,0x100f431f,0x210f310f,0x531f100f,0xffffeeef,0xeeefffff,0xdddfdddf,0xeeefdedf,0xeedfeeef,0xeeefeeef,0xeeefeeef,0x443f333f,0xa50fa50f,0xe91fe91f,0xea4fa50f,0xa50fe91f,0xe91fd71f,0xe91fe91f,0xea4fa50f,0xa50fe91f,0xa50fa50f,0x200fa50f,0xa50f410f,0x410f410f,0x410fa50f,0x410f410f,0x410fa50f,0xa50f410f, +0xa50fa50f,0x400fe91f,0xe91fcc3f,0xde4fcd4f,0xde4fe91f,0xcd4fcd4f,0xbb3fa50f,0xeb1fbb3f,0xdddf0000,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xe11fe11f,0xdddfdddf,0xeeefdddf,0x0000dddf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa52f0000,0xa52fb52f,0xa52fb52f,0xb52fb52f,0xb52fb52f,0xb52fb52f,0xb52fb52f,0x0000a52f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x666faaaf,0x542f432f,0x864f642f,0x873f873f,0x00000000,0x666f432f,0xaaafaaaf,0x111f111f,0x222f211f,0x111f211f,0x111f111f,0x111f100f,0x211f111f,0x111f111f,0x222f211f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x444f333f,0x444f444f,0x444f444f,0x444f444f,0x00000000,0x00000000,0x00000000,0x653f0000,0x0000331f,0x00000000,0x00000000,0x00000000, +0x320f100f,0x320f210f,0x321f210f,0x320f110f,0x210f320f,0x100f210f,0x431f310f,0x100f531f,0xdddf333f,0xefdfdddf,0xeedfeeef,0xbbafeeef,0xeeefdddf,0xeeefeeef,0x334f433f,0x111f111f,0xa50fa50f,0xd71fe91f,0xe91fa50f,0xa50fe91f,0xe91fd71f,0xd71fe91f,0xea4fa50f,0xa50fe91f,0xa50fa50f,0x200fa50f,0xe91fa50f,0xa50f410f,0xe91fa50f,0x410fe91f,0xea4fa50f,0xa50fa50f, +0xa50fa50f,0x400fa50f,0xe91fe91f,0xe91fcd4f,0xe91fa50f,0xcc3ffd3f,0xea4fa50f,0xa50fa50f,0xdddf0000,0xe11feeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0x0000dddf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa52f0000,0xb52fb52f,0xb52fb52f,0xa52fb52f,0xb52fb52f,0xb52fa52f,0xb52fb52f,0x0000a52f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x666faaaf,0x00000000,0x642f0000,0x642f642f,0x653f873f,0xaaaf666f,0x864f542f,0x211f211f,0x111f111f,0x111f211f,0x111f111f,0x211f222f,0x111f111f,0x111f111f,0x111f111f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x333f333f,0x444f444f,0x333f333f,0x00000000,0x00000000,0x00000000,0x974f0000,0x0000321f,0x00000000,0x00000000,0x00000000, +0x210f100f,0x100f431f,0x321f320f,0x100f110f,0x210f431f,0x100f531f,0x321f210f,0x210f100f,0x333f111f,0xeeef333f,0xffffeeef,0xffffffff,0xdddfeeef,0x333f333f,0xdddfbbbf,0x111f121f,0xd71fa50f,0xd71fe91f,0xe91fa50f,0xa50fe91f,0xea4fa50f,0xa50fe91f,0xe91fa50f,0xa50fe91f,0xd71fa50f,0xd71fe91f,0xe91fa50f,0xa50fe91f,0xea4fa50f,0xa50fe91f,0xe91fa50f,0xa50fe91f, +0xd71fa50f,0xd71fe91f,0xe91fa50f,0xa50fe91f,0xea4fa50f,0xa50fe91f,0xe91fa50f,0xa50fe91f,0xdddf0000,0xdddfdddf,0xdddfdddf,0xdddfdddf,0xdddfdddf,0xdddfdddf,0xdddfdddf,0x0000dddf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa52f0000,0xa52fa52f,0xa52fa52f,0xa52fa52f,0xa52fa52f,0xa52fa52f,0xa52fa52f,0x0000a52f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x666faaaf,0x00000000,0x00000000,0x00000000,0x432f432f,0xaaaf666f,0x0000864f,0x111f111f,0x111f211f,0x111f111f,0x211f211f,0x111f111f,0x211f111f,0x111f111f,0x211f211f,0x333f333f,0x444f444f,0x333f333f,0x444f444f,0x333f444f,0x444f444f,0x333f333f,0x444f444f,0x00000000,0x00000000,0x00000000,0x653f0000,0x0000321f,0x00000000,0x00000000,0x00000000, +0x210f210f,0x100f321f,0x210f210f,0x100f210f,0x320f210f,0x000f210f,0x210f210f,0x321f210f,0xeeefeeef,0x333feeef,0xdddfdddf,0xeeefeddf,0xeeefeeef,0xeddfdddf,0xffffdddf,0xfeefffff,0xa50fa50f,0xd71fd71f,0xa50fa50f,0xa50fd71f,0xd71fa50f,0xa50fa50f,0xd71fd71f,0xa50fa50f,0xa50fa50f,0xd71fd71f,0xa50fa50f,0xa50fd71f,0xd71fa50f,0xa50fa50f,0xd71fd71f,0xa50fa50f, +0xa50fa50f,0xd71fd71f,0xa50fa50f,0xa50fd71f,0xd71fa50f,0xa50fa50f,0xd71fd71f,0xa50fa50f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x666faaaf,0x00000000,0x00000000,0x00000000,0x00000000,0xaaaf666f,0x00000000,0x922f922f,0x922f922f,0xa32fa22f,0x922f922f,0xa22fa22f,0x922f822f,0xa22fa22f,0x822f922f,0xd79fd78f,0xd68fd68f,0xd9afd89f,0xd78fd78f,0xd8afd8af,0xd68fc57f,0xd89fd89f,0xc67fd68f,0x888f888f,0x888f888f,0x888f888f,0x999f999f,0x999f777f,0x888f888f,0x888f888f,0x888f888f, +0x999f0000,0x444f0000,0x999f0000,0x0000444f,0x0000999f,0x444f999f,0x999f0000,0x999f0000,0x999f333f,0x444f333f,0x999f333f,0x333f444f,0x333f999f,0x444f999f,0x999f333f,0x999f333f,0x800f800f,0x800f800f,0x800f800f,0x900f800f,0x800f810f,0x800f800f,0x800f800f,0x800f801f,0x700f800f,0x912f800f,0x811f911f,0x700f800f,0xaaafbbaf,0xcccfbcbf,0x9a9fbbbf,0xbbaf999f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x864f0000,0x666faaaf,0x753f543f,0xa84fa84f,0xa85fa85f,0x653f864f,0xaaaf666f,0x0000864f,0xa22fa22f,0xb32fb32f,0xa22fb32f,0x922f922f,0x822f922f,0x922f922f,0x822f822f,0xa22f922f,0xd8afd89f,0xeabfeabf,0xd8afd9af,0xd79fd79f,0xc67fd68f,0xd79fd78f,0xd68fc57f,0xd89fd79f,0xaaaf888f,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfaaaf,0xbbbfbbbf,0xaaaf999f,0x888faaaf, +0x888f999f,0x444f888f,0x999f333f,0x333f0000,0x999f0000,0x444f888f,0x00000000,0x888f0000,0x888f999f,0x444f888f,0x999f333f,0x333f333f,0x999f333f,0x444f888f,0x333f333f,0x888f333f,0x800f800f,0x911f811f,0x911f911f,0x911f911f,0x801f911f,0x911f800f,0xa11fa11f,0xa12fa11f,0x911fa22f,0x922f800f,0x800f922f,0x700f800f,0xdddfcccf,0xffffeeef,0xbbbfdddf,0x9aafbaaf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x444f0000,0x444f444f,0x444f444f,0x0000444f,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x542f0000,0x666faaaf,0x542f432f,0x642f642f,0x642f642f,0x432f432f,0xaaaf666f,0x0000542f,0xb32fb32f,0xa22f922f,0xb32fb32f,0x922fa22f,0xb32fa22f,0xa22fa22f,0xb32fb32f,0xa22fa22f,0xe9afd9af,0xd89fd79f,0xe9afe9bf,0xd79fd89f,0xe9afd8af,0xd8afd8af,0xeabfeabf,0xd8afd8af,0x999f888f,0xaaafaaaf,0xaaaf999f,0xaaafaaaf,0xaaafbbbf,0xaaafaaaf,0xbbbfaaaf,0x888faaaf, +0x999f0000,0x444f0000,0x0000999f,0x0000999f,0x0000999f,0x444f999f,0x999f0000,0x999f444f,0x999f333f,0x333f333f,0x333f999f,0x333f999f,0x333f999f,0x333f999f,0x999f333f,0x999f444f,0x800f800f,0xb33fa22f,0xa33fa33f,0xb33fb33f,0xa22fa33f,0xa22fa22f,0xb33fb33f,0xb33fb33f,0xa33fb33f,0xb45f911f,0xa22fb44f,0x600f700f,0xffffcccf,0xffffffff,0xdcdfffff,0xa99fbbaf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x444f0000,0xcccf444f,0xcccfcccf,0xcccfcccf,0x444fcccf,0x0000444f,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x666faaaf,0x00000000,0x00000000,0x00000000,0x00000000,0xaaaf666f,0x00000000,0x922fa22f,0xb32fa22f,0x922f922f,0xb32fa22f,0x922f922f,0xb32fb32f,0x922fa22f,0xb32fb32f,0xd79fd89f,0xe9afd9af,0xd79fd79f,0xe9afd89f,0xd79fd78f,0xe9afe9af,0xd79fd89f,0xe9afeabf,0xbbbf888f,0xaaafaaaf,0x999faaaf,0xbbbfaaaf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0x888faaaf, +0x0000999f,0x0000999f,0x999f0000,0x0000555f,0x0000888f,0x333f444f,0x444f999f,0x0000999f,0x333f999f,0x333f999f,0x999f333f,0x333f555f,0x333f888f,0x333f444f,0x444f999f,0x333f999f,0x901f800f,0xa33fa32f,0xa33fa33f,0xb33fa33f,0xa33fa33f,0xa22fa22f,0xb33fa23f,0xb33fb33f,0xa32fa33f,0xc55f911f,0x922fb44f,0x700f800f,0xffffcccf,0xffffffff,0xeeefffff,0x99afbbbf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x444f0000,0xcccf444f,0xeeefcccf,0xeeefe11f,0xeeefeeef,0xcccfeeef,0x444fcccf,0x0000444f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x666faaaf,0x00000000,0x00000000,0x00000000,0x00000000,0xaaaf666f,0x00000000,0xa22fa22f,0xa22f922f,0xa22fa32f,0x822f822f,0xa22f922f,0x922f922f,0xa32fa32f,0x822f922f,0xd89fd8af,0xd89fd78f,0xd9afd9af,0xc57fc57f,0xd89fd79f,0xd68fd78f,0xd9afd9af,0xc57fd68f,0xbbbf888f,0xaaafbbbf,0xaaafaaaf,0x999f999f,0x999f999f,0xbbbfbbbf,0xbbbfbbbf,0x777fbbbf, +0x0000444f,0x888f0000,0x0000999f,0x444f999f,0x999f888f,0x00000000,0x999f0000,0x0000444f,0x333f444f,0x888f333f,0x333f999f,0x444f999f,0x999f888f,0x333f333f,0x999f333f,0x333f333f,0x911f800f,0xa22fa23f,0xa22f922f,0xa22fa22f,0xa22fa22f,0x922f922f,0x922f922f,0x922f922f,0x911f922f,0xb55f911f,0x921fb44f,0x700f700f,0xffffdddf,0xffffffff,0xfeefeeef,0xaaafcccf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xcccf444f,0xe11fcccf,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefe11f,0xcccfeeef,0x444fcccf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x864f0000,0x666faaaf,0x864f653f,0x873fa85f,0x873f873f,0x653f642f,0xaaaf666f,0x0000864f,0x822f822f,0xb32f922f,0x822f922f,0x922f922f,0x822f922f,0x922f922f,0x922f822f,0x922f922f,0xc57fd68f,0xe9afd78f,0xc57fd78f,0xd79fd78f,0xc57fd78f,0xd79fd79f,0xd78fc67f,0xd79fd68f,0xaaaf888f,0xaaafaaaf,0x999faaaf,0x777f888f,0x888f777f,0xaaafcccf,0xaaafaaaf,0x888f999f, +0x0000444f,0x444f888f,0x0000444f,0x444f0000,0x333f999f,0x444f999f,0x444f999f,0x0000999f,0x333f444f,0x444f888f,0x333f444f,0x444f333f,0x333f999f,0x444f999f,0x444f999f,0x333f999f,0x911f800f,0xb33fb33f,0x922f912f,0x911f911f,0x811f811f,0x810f801f,0x811f811f,0x811f811f,0x811f810f,0xc55f911f,0x811fa22f,0x600f700f,0xffffdddf,0xffffffff,0xeeefeeef,0xbbbfdddf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xcccf444f,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefe11f,0xeeefeeef,0xeeefe11f,0x444fcccf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x542f0000,0x666faaaf,0x432f432f,0x642f542f,0x642f642f,0x432f542f,0xaaaf666f,0x0000542f,0xb32fb32f,0xa22fa32f,0xa22fa22f,0xa22fa22f,0xb32fb32f,0x922fa22f,0xb32fb32f,0xa22fa22f,0xeabfeabf,0xd9afd9af,0xd89fd89f,0xd89fd89f,0xeabfd9af,0xd79fd8af,0xeabfeabf,0xd89fd8af,0xbbbf999f,0xaaafaaaf,0x999faaaf,0x500f999f,0xbbbf500f,0xaaafcccf,0xbbbfbbbf,0x777fbbbf, +0x999f444f,0x888f888f,0x0000444f,0x0000999f,0x999f444f,0x0000444f,0x444f888f,0x999f0000,0x999f333f,0x888f888f,0x333f444f,0x333f999f,0x999f333f,0x333f444f,0x444f888f,0x999f333f,0x911f800f,0x922fb33f,0x911f911f,0x811f911f,0x810f811f,0x811f811f,0x811f811f,0x811f811f,0x911f811f,0xc66f911f,0x810f922f,0x600f700f,0xfeffdddf,0xeeffffff,0xeeffeeef,0xbbbfdcdf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xcccf444f,0xeeefcccf,0xeeefe11f,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xcccfeeef,0x444fcccf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x666faaaf,0x00000000,0x00000000,0x00000000,0x00000000,0xaaaf666f,0x00000000,0x922f922f,0xb32fb32f,0xa22fa22f,0xb32fb32f,0x922f922f,0xb32fa22f,0xa22fa22f,0xb32fb32f,0xd79fd79f,0xeabfeabf,0xd8afd8af,0xe9afe9af,0xd78fd68f,0xe9afd9af,0xd8afd8af,0xe9afe9af,0xaaaf888f,0xaaafaaaf,0x888f999f,0x500f999f,0xbbbf400f,0xcccfaaaf,0xaaafaaaf,0x888faaaf, +0x333f0000,0x0000999f,0x999f333f,0x999f0000,0x0000999f,0x0000999f,0x0000888f,0x0000999f,0x333f333f,0x333f999f,0x999f333f,0x999f333f,0x333f999f,0x333f999f,0x333f888f,0x333f999f,0x901f800f,0x811f922f,0x811f810f,0x811f811f,0x811f811f,0x811f811f,0x811f811f,0x811f811f,0x811f811f,0xb44f800f,0x811f911f,0x600f700f,0xefefdddf,0xeeffffff,0xeeefeeef,0xbbbfcdcf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xcccf444f,0xcccfeeef,0xeeefcccf,0xeeefeeef,0xeeefe11f,0xcccfeeef,0xbbbfcccf,0x444fbbbf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x666faaaf,0x00000000,0x00000000,0x00000000,0x00000000,0xaaaf666f,0x00000000,0xa22fa22f,0x922f822f,0xa22fb32f,0x922f922f,0x922f922f,0x822f922f,0x922fa22f,0x922f922f,0xd8afd8af,0xd79fd68f,0xd8afe9af,0xd79fd78f,0xd79fd79f,0xc67fd78f,0xd79fd89f,0xd68fd68f,0xbbbf888f,0x999fbbbf,0x888f999f,0x500f999f,0xbbbf200f,0xcccf999f,0xbbbfbbbf,0x999fbbbf, +0x999f0000,0x999f444f,0x0000333f,0x444f999f,0x0000444f,0x999f0000,0x999f444f,0x999f0000,0x999f333f,0x999f444f,0x333f333f,0x444f999f,0x333f444f,0x999f333f,0x999f444f,0x999f333f,0x901f800f,0x811f921f,0x811f811f,0x911f811f,0x811f811f,0x811f811f,0x811f811f,0x811f811f,0x811f811f,0xb33f800f,0x811f911f,0x600f700f,0xffffdddf,0xeeffffef,0xeeefeeef,0xbabfccdf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xcccf310f,0xeeefeeef,0xcccfeeef,0xcccfcccf,0xcccfcccf,0xbbbfcccf,0xbbbfbbbf,0x310fbbbf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x864f0000,0x666faaaf,0x864f653f,0x873f873f,0x873f873f,0x653fa84f,0xaaaf666f,0x0000864f,0x922f922f,0xb32f922f,0x822f822f,0xa22f922f,0xa22f922f,0xb32fb32f,0xa22fa22f,0xb32fb32f,0xd79fd79f,0xd9afd79f,0xc57fc57f,0xd89fd79f,0xd8afd78f,0xeabfeabf,0xd8afd89f,0xeabfeabf,0xaaaf888f,0x999faaaf,0xaaaf888f,0x500f999f,0xbbbf200f,0x999faaaf,0xaaafcccf,0x888fbbbf, +0x444f999f,0x444f888f,0x999f0000,0x999f0000,0x0000444f,0x0000999f,0x0000444f,0x444f999f,0x333f999f,0x444f888f,0x999f333f,0x999f333f,0x333f333f,0x333f999f,0x333f444f,0x444f999f,0x911f800f,0x911f921f,0x811f811f,0x811f811f,0x811f811f,0x811f811f,0x810f811f,0x811f911f,0x811f811f,0xb33f800f,0x811f911f,0x600f700f,0xfeffdddf,0xeeffeeff,0xeeefeeef,0xbbbfdccf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x941f310f,0xeeefcccf,0xeeefeeef,0xcccfcccf,0xbbbfcccf,0xbbbfbbbf,0xa52fbbbf,0x310f941f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x542f0000,0x666faaaf,0x432f432f,0x642f542f,0x642f642f,0x432f642f,0xaaaf666f,0x0000542f,0xb32fb32f,0xa22fa22f,0xb32fb32f,0xa22fa22f,0xb32fb32f,0xa22f922f,0xa22fa22f,0xa22f922f,0xe9afe9af,0xd8afd8af,0xe9afeabf,0xd8afd8af,0xd9afe9af,0xd89fd79f,0xd89fd8af,0xd89fd68f,0xaaaf888f,0x999fbbbf,0x999f888f,0x500f999f,0xbbbf200f,0xaaafaaaf,0xaaafcccf,0x888faaaf, +0x0000888f,0x444f0000,0x444f999f,0x00000000,0x999f0000,0x999f444f,0x999f0000,0x444f333f,0x333f888f,0x333f333f,0x444f999f,0x333f333f,0x999f333f,0x999f444f,0x999f333f,0x444f333f,0x811f800f,0x911f922f,0x811f811f,0x811f811f,0x811f811f,0x811f811f,0x811f811f,0x811f911f,0x811f811f,0xb33f800f,0x811f921f,0x600f700f,0xedefcccf,0xeeefeeef,0xdeefeeef,0xaaafcccf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x941f310f,0xa52fa52f,0xcccfeeef,0xcccfcccf,0xbbbfcccf,0xbbbfbbbf,0xa52fa52f,0x310f941f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x666faaaf,0x00000000,0x00000000,0x00000000,0x00000000,0xaaaf666f,0x00000000,0x922f922f,0xa22fa22f,0x922f922f,0xa22fa32f,0x922f922f,0xa22f922f,0x822f822f,0xa22f922f,0xd78fd68f,0xd89fd89f,0xd79fd79f,0xd8afd9af,0xd78fd68f,0xd8afd79f,0xc57fc57f,0xd8afd79f,0xaaaf777f,0x888f999f,0x999faaaf,0x400f999f,0xbbbf200f,0x999faaaf,0xcccfaaaf,0x777fbbbf, +0x00000000,0x0000999f,0x444f888f,0x999f0000,0x0000444f,0x888f999f,0x444f0000,0x444f0000,0x333f333f,0x333f999f,0x444f888f,0x999f333f,0x333f333f,0x888f999f,0x444f333f,0x333f333f,0x910f800f,0x811f911f,0x811f810f,0x800f811f,0x800f701f,0x811f811f,0x811f801f,0x701f710f,0x810f700f,0xa33f700f,0x811f911f,0x600f700f,0xdddfcccf,0xeeefdddf,0xdccfdddf,0xaaafbbbf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x941f310f,0xb52fb52f,0xa52fa52f,0xa52fcccf,0xa52fa52f,0xa52fbbbf,0xa52fa52f,0x310f941f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x666faaaf,0x00000000,0x00000000,0x00000000,0x00000000,0xaaaf666f,0x00000000,0x922f922f,0x822f822f,0xb32fb32f,0x822f922f,0xa32fa22f,0xa22fa22f,0xb32fb32f,0x822fa22f,0xd79fd79f,0xc57fc57f,0xe9bfe9af,0xc57fd68f,0xd9afd89f,0xd8afd89f,0xeabfeabf,0xc67fd8af,0xaaaf888f,0x888f999f,0xaaaf999f,0x400f999f,0xbbbf200f,0xaaaf999f,0xcccfaaaf,0x888faaaf, +0x888f444f,0x999f888f,0x999f888f,0x999f333f,0x999f333f,0x999f0000,0x444f0000,0x0000333f,0x888f333f,0x999f888f,0x999f888f,0x999f333f,0x999f333f,0x999f333f,0x444f333f,0x333f333f,0x900f700f,0x811f911f,0x811f811f,0x710f701f,0x801f710f,0x711f701f,0x801f801f,0x800f810f,0x810f711f,0xa32f700f,0x811fa22f,0x600f700f,0xdddfcccf,0xdddfdddf,0xcccfdddf,0xaaafbbbf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x310f0000,0x941f310f,0xb52f941f,0xa52fb52f,0xa52fa52f,0x941fa52f,0x941f941f,0x0000310f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x864f0000,0x666faaaf,0x864f543f,0x873fa85f,0xa85fa85f,0x653f873f,0xaaaf666f,0x0000864f,0xa22fa22f,0xb32fb32f,0xa22fb32f,0x922fa22f,0xa22f822f,0xb32fa22f,0xa22fa22f,0xb32fb32f,0xd8afd8af,0xeabfeabf,0xd8afe9af,0xd79fd89f,0xd89fc57f,0xe9afd8af,0xd89fd89f,0xeabfe9af,0xbbbf888f,0xbbbfaaaf,0xaaaf999f,0x400f999f,0xbbbf200f,0xcccfaaaf,0xaaafcccf,0x999fbbbf, +0x0000333f,0x0000999f,0x0000999f,0x444f999f,0x00000000,0x444f999f,0x444f0000,0x0000999f,0x333f333f,0x333f999f,0x333f999f,0x444f999f,0x333f333f,0x444f999f,0x333f333f,0x333f999f,0x800f800f,0x811f811f,0x811f811f,0x801f711f,0x810f811f,0x801f701f,0x711f811f,0x811f810f,0x811f811f,0xa32f700f,0x811f911f,0x600f700f,0xdddfcdcf,0xcccfdddf,0xdddfcdcf,0xbbbfcccf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x310f0000,0x941f310f,0x941f941f,0x941f941f,0x310f941f,0x310f310f,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x542f0000,0x666faaaf,0x432f432f,0x542f652f,0x642f642f,0x432f642f,0xaaaf666f,0x0000542f,0xb32fb32f,0x922fa22f,0xa22fb32f,0xa22fa22f,0xb32fb32f,0x922f922f,0xa22fa22f,0x922f922f,0xe9bfe9bf,0xd79fd89f,0xd89fe9af,0xd9afd8af,0xd9afeabf,0xd79fd78f,0xd8afd89f,0xd68fd79f,0xaaaf888f,0xaaafaaaf,0xbbbfaaaf,0xcccfbbbf,0xcccfcccf,0xbbbfcccf,0xaaafaaaf,0x888faaaf, +0x999f444f,0x999f0000,0x999f444f,0x444f0000,0x0000444f,0x0000888f,0x999f333f,0x999f0000,0x999f333f,0x999f333f,0x999f444f,0x333f333f,0x333f444f,0x333f888f,0x999f333f,0x999f333f,0x800f800f,0x800f700f,0x800f800f,0x811f810f,0x811f701f,0x700f810f,0x700f700f,0x800f700f,0x800f800f,0x911f700f,0x700f811f,0x700f700f,0xdccfddcf,0xbbbfcbcf,0xcccfbbbf,0xbbbfdddf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x310f0000,0x310f310f,0x310f310f,0x0000310f,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x666faaaf,0x00000000,0x00000000,0x00000000,0x00000000,0xaaaf666f,0x00000000,0x922f822f,0xa22fb32f,0x922f922f,0xb32fb32f,0x922fa22f,0xb32fa22f,0x922f922f,0xb32fb32f,0xd78fc67f,0xd89fe9af,0xd79fd68f,0xeabfe9af,0xd79fd89f,0xe9afd8af,0xd78fd68f,0xe9afd9af,0x888f888f,0x888f888f,0x999f777f,0x888f888f,0x888f888f,0x888f888f,0x888f888f,0x888f888f, +0x444f0000,0x333f0000,0x444f999f,0x0000999f,0x999f444f,0x888f0000,0x0000333f,0x0000888f,0x444f333f,0x333f333f,0x444f999f,0x333f999f,0x999f444f,0x888f333f,0x333f333f,0x333f888f,0x800f800f,0x800f800f,0x800f700f,0x800f800f,0x800f800f,0x800f800f,0x800f800f,0x800f800f,0x800f800f,0x800f700f,0x700f800f,0x600f700f,0xbbbfbbbf,0xaaafbbaf,0xbbbfaaaf,0xbbbfbbbf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x149f15bf,0x15cf149f,0x15cf15cf,0x248f248f,0x15bf15af,0x248f14af,0x259f248f,0x14bf248f,0x341f341f,0x341f341f,0x351f341f,0x341f341f,0x351f351f,0x341f341f,0x341f341f,0x341f341f,0x3b2f3a2f,0x3a2f3a2f,0x3c3f3b2f,0x3b2f3a2f,0x3c3f3c3f,0x3a2f3a2f,0x3c2f3c2f,0x3a2f3a2f,0x888f888f,0x888f888f,0x888f888f,0x999f999f,0x999f777f,0x888f888f,0x888f888f,0x888f888f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x800f800f,0x800f800f,0x800f800f,0x811f800f,0x711f801f,0x800f810f,0x800f800f,0x801f711f,0x800f800f,0x800f700f,0x800f800f,0x811f800f,0x711f811f,0x811f801f,0x700f700f,0x801f811f,0x800f800f,0x800f700f,0x800f922f,0x600f800f,0xccdfbbbf,0xcccfcdcf,0xbbbfbbbf,0xbbbfbbbf, +0xcdcfbbbf,0xcccfcccf,0xbbbfbbbf,0xbbbfbbbf,0xcddfbbbf,0xcccfccdf,0xbbbfbbbf,0xbbbfbbbf,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x14bf13cf,0x37af15cf,0x14df25bf,0x159f14af,0x15bf15af,0x03bf03bf,0x149f149f,0x14bf14bf,0x351f341f,0x451f351f,0x351f351f,0x341f341f,0x341f341f,0x341f341f,0x341f231f,0x341f341f,0x3c3f3b2f,0x4d4f4c3f,0x3c3f3c3f,0x3b2f3b2f,0x3a2f3a2f,0x3b2f3b2f,0x3a2f292f,0x3b2f3b2f,0xaaaf888f,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfaaaf,0xbbbfbbbf,0xaaaf999f,0x888faaaf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x811f800f,0x811f811f,0x811f811f,0x810f811f,0x801f811f,0x811f801f,0x811f801f,0x801f811f,0x811f800f,0x811f811f,0x811f811f,0x811f811f,0x711f711f,0x711f811f,0x811f911f,0x810f811f,0x811f811f,0xb33f700f,0x811fa22f,0x600f801f,0xeeefbbbf,0xeeffefef,0xeeefefef,0xbbbfcdcf, +0xcccfbbbf,0xeeefeeef,0xffffffff,0xffffffff,0xffffffff,0xfeefeeef,0xeeefefff,0xbbbfccdf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x15cf14bf,0x269f15cf,0x14af15cf,0x149f139f,0x14af248f,0x03bf14bf,0x14af02bf,0x14bf14bf,0x351f351f,0x341f341f,0x351f351f,0x341f341f,0x351f351f,0x351f351f,0x351f351f,0x351f351f,0x4c3f3c3f,0x3b2f3b2f,0x4c3f4c3f,0x3b2f3c2f,0x4c3f3c3f,0x3c3f3c3f,0x4c3f4c3f,0x3c3f3c3f,0x999f888f,0xaaafaaaf,0xaaaf999f,0xaaafaaaf,0xaaafbbbf,0xaaafaaaf,0xbbbfaaaf,0x888faaaf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x811f800f,0x922f922f,0x922f922f,0x921f912f,0x811f811f,0x801f811f,0x800f811f,0x811f811f,0x811f800f,0x922f922f,0x921f922f,0x912f922f,0x811f811f,0x800f811f,0x811f810f,0x811f811f,0x711f811f,0xa22f700f,0x811f810f,0x600f811f,0xccdfbbbf,0xeeefeeef,0xeeefeeef,0xbbbfdccf, +0xddcfbbbf,0xeeffeeff,0xeeeffeef,0xfeefeeef,0xfeefffff,0xffffefef,0xfeefefef,0xbbbfcddf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x14bf14bf,0x15cf14bf,0x14cf15cf,0x158f14af,0x248f14bf,0x03bf149f,0x149f03bf,0x14bf14af,0x341f341f,0x351f351f,0x341f341f,0x351f341f,0x341f341f,0x351f351f,0x341f341f,0x351f451f,0x3b2f3b2f,0x4c3f3c3f,0x3b2f3b2f,0x4c3f3b2f,0x3b2f3a2f,0x4c3f4c3f,0x3b2f3b2f,0x4c3f4d4f,0xbbbf888f,0xaaafaaaf,0x999faaaf,0xbbbfaaaf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0x888faaaf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x600f600f,0x600f600f,0x600f600f,0x600f600f,0x600f600f,0x600f600f,0x600f600f,0x600f600f,0x700f600f,0x700f600f,0x600f600f,0x600f600f,0x600f600f,0x600f600f,0x600f600f,0x600f600f,0x600f600f,0x600f600f,0x600f600f,0x600f600f,0xbbbfbbbf,0xcccfddcf,0xbbbfcccf,0xbbbfbbbf, +0xbbbfbbbf,0xcccfcccf,0xbbbfcccf,0xbbbfbbbf,0xbbbfbbbf,0xcccfdcdf,0xbbbfcccf,0xbbbfbbbf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x14bf13cf,0x15cf14bf,0x14cf15cf,0x148f14bf,0x149f14bf,0x248f14af,0x03bf248f,0x14bf149f,0x341f351f,0x341f341f,0x351f351f,0x231f341f,0x341f341f,0x341f341f,0x351f351f,0x341f341f,0x3b2f3c3f,0x3b2f3a2f,0x3c3f3c3f,0x292f3a2f,0x3c2f3b2f,0x3a2f3b2f,0x3c3f3c3f,0x3a2f3a2f,0xbbbf888f,0xaaafbbbf,0xaaafaaaf,0x999f999f,0x999f999f,0xbbbfbbbf,0xbbbfbbbf,0x777fbbbf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x963fa94f,0x963f863f,0x963f963f,0x863f862f,0x963f963f,0x863f863f,0x963f963f,0x541f973f,0x963fa84f,0x973f863f,0x963f863f,0x863f863f,0x963f963f,0x863f863f,0x973f963f,0x863f963f,0x862f863f,0x963f963f,0x963f873f,0x863f963f,0x963f863f,0x963f863f,0x963f863f,0x531f863f, +0x963fa94f,0x963f863f,0x963f963f,0x863f863f,0x963f973f,0x863f863f,0x963f963f,0x531f973f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x14bf14bf,0x14bf14bf,0x15cf15bf,0x14af14bf,0x248f14bf,0x26bf149f,0x03bf149f,0x14bf149f,0x241f341f,0x351f341f,0x231f341f,0x341f341f,0x231f341f,0x341f341f,0x341f341f,0x341f341f,0x3a2f3a2f,0x4c3f3b2f,0x292f3a2f,0x3b2f3a2f,0x292f3a2f,0x3b2f3b2f,0x3b2f3a2f,0x3b2f3a2f,0xaaaf888f,0xaaafaaaf,0x999faaaf,0x777f888f,0x888f777f,0xaaafcccf,0xaaafaaaf,0x888f999f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x863fb95f,0x642f642f,0x642f642f,0x642f641f,0x532f531f,0x642f641f,0x974f531f,0x541f863f,0x863fa95f,0x641f632f,0x641f641f,0x642f641f,0x531f531f,0x641f641f,0x632f531f,0x641f641f,0x531f642f,0x641f641f,0x641f531f,0x641f642f,0x641f641f,0x641f642f,0x974f641f,0x531f863f, +0x863fb94f,0x642f641f,0x642f641f,0x641f641f,0x531f531f,0x641f641f,0x974f531f,0x531f863f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x13bf14bf,0x13cf13cf,0x15cf14bf,0x14af14cf,0x248f159f,0x248f149f,0x258f149f,0x13bf149f,0x451f351f,0x351f351f,0x341f341f,0x341f341f,0x451f351f,0x341f351f,0x451f451f,0x341f351f,0x4c4f4c3f,0x3c3f3c3f,0x3b2f3b2f,0x3c2f3b2f,0x4c4f3c3f,0x3b2f3c3f,0x4d4f4d4f,0x3c2f3c3f,0xbbbf999f,0xaaafaaaf,0x999faaaf,0xf00f999f,0xbbbff00f,0xaaafcccf,0xbbbfbbbf,0x777fbbbf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x863fa84f,0x0000531f,0x00000000,0x00000000,0x00000000,0x00000000,0xa94f0000,0x531f963f,0x862fa84f,0x0000531f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xa94f0000,0x531f963f, +0x863fa94f,0x0000531f,0x00000000,0x00000000,0x00000000,0x00000000,0xa84f0000,0x531f963f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x14af13bf,0x14bf14bf,0x02bf14bf,0x14bf14af,0x149f14af,0x14af14bf,0x258f14af,0x13bf129f,0x341f341f,0x451f351f,0x351f351f,0x351f351f,0x341f341f,0x351f351f,0x351f351f,0x351f351f,0x3b2f3b2f,0x4d4f4c3f,0x3c3f3c3f,0x4c3f4c3f,0x3b2f3a2f,0x4c3f3c3f,0x3c3f3c3f,0x4c3f4c3f,0xaaaf888f,0xaaafaaaf,0x888f999f,0xf00f999f,0xbbbfd00f,0xcccfaaaf,0xaaafaaaf,0x888faaaf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x863fa95f,0x0000531f,0x00000000,0x00000000,0x00000000,0x00000000,0xb95f0000,0x641f963f,0x863fb95f,0x0000531f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xb95f0000,0x642f963f, +0x863fb95f,0x0000531f,0x00000000,0x00000000,0x00000000,0x00000000,0xb95f0000,0x642f863f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x249f13bf,0x15cf13bf,0x13af14cf,0x14cf02bf,0x15af24af,0x14af248f,0x258f149f,0x13bf13bf,0x351f351f,0x341f341f,0x351f351f,0x341f341f,0x341f341f,0x341f341f,0x341f341f,0x341f341f,0x3c3f3c3f,0x3b2f3a2f,0x3c3f4c3f,0x3b2f3a2f,0x3b2f3b2f,0x3a2f3b2f,0x3b2f3b2f,0x3a2f3a2f,0xbbbf888f,0x999fbbbf,0x888f999f,0xf00f999f,0xbbbfa00f,0xcccf999f,0xbbbfbbbf,0x999fbbbf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x963fa84f,0x0000641f,0x00000000,0x00000000,0x00000000,0x00000000,0xa84f0000,0x641f963f,0x963fa84f,0x0000641f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xa84f0000,0x641f963f, +0x973fa84f,0x0000641f,0x00000000,0x00000000,0x00000000,0x00000000,0xa94f0000,0x642f963f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x13bf13bf,0x13cf13af,0x26af14bf,0x14bf24af,0x14af14af,0x248f14af,0x14af248f,0x13bf258f,0x341f341f,0x351f341f,0x341f231f,0x341f341f,0x351f341f,0x451f451f,0x351f341f,0x351f451f,0x3b2f3b2f,0x3c3f3b2f,0x3a2f392f,0x3c3f3b2f,0x3c3f3a2f,0x4d4f4d4f,0x3c3f3b2f,0x4c3f4d4f,0xaaaf888f,0x999faaaf,0xaaaf888f,0xd00f999f,0xbbbfd00f,0x999faaaf,0xaaafcccf,0x888fbbbf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x13bf368f,0x12bf139f,0x259f13af,0x02bf24af,0x14af13bf,0x248f249f,0x14af248f,0x358f368f,0x351f351f,0x351f351f,0x351f451f,0x351f351f,0x351f351f,0x341f341f,0x341f351f,0x341f341f,0x4c3f4c3f,0x3c3f3c3f,0x4c3f4c4f,0x3c3f3c3f,0x3c3f4c3f,0x3c2f3b2f,0x3b2f3c3f,0x3b2f3a2f,0xaaaf888f,0x999fbbbf,0x999f888f,0xd00f999f,0xbbbfb00f,0xaaafaaaf,0xaaafcccf,0x888faaaf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x248f258f,0x129f149f,0x148f129f,0x02bf13af,0x14af13af,0x248f249f,0x249f248f,0x258f358f,0x341f341f,0x341f341f,0x341f341f,0x351f351f,0x341f341f,0x351f341f,0x241f241f,0x351f341f,0x3a2f3a2f,0x3c3f3c3f,0x3b2f3b2f,0x3c3f3c3f,0x3a2f3a2f,0x3c3f3b2f,0x3a2f3a2f,0x3c3f3b2f,0xaaaf777f,0x888f999f,0x999faaaf,0xf00f999f,0xbbbfd00f,0x999faaaf,0xcccfaaaf,0x777fbbbf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x259f358f,0x139f248f,0x12af129f,0x02bf13bf,0x14af12bf,0x149f14af,0x248f248f,0x258f248f,0x341f341f,0x341f231f,0x351f351f,0x231f341f,0x351f341f,0x351f341f,0x451f451f,0x341f351f,0x3b2f3b2f,0x3a2f392f,0x4c3f4c3f,0x292f3a2f,0x3c3f3b2f,0x3c3f3c2f,0x4d4f4d4f,0x3a2f3c3f,0xaaaf888f,0x888f999f,0xaaaf999f,0xf00f999f,0xbbbfb00f,0xaaaf999f,0xcccfaaaf,0x888faaaf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x248f258f,0x248f249f,0x12af12af,0x03bf14af,0x139f12bf,0x149f248f,0x248f248f,0x258f248f,0x351f351f,0x451f351f,0x351f351f,0x341f341f,0x341f231f,0x351f351f,0x341f341f,0x351f351f,0x3c3f3c3f,0x4d4f4c3f,0x3c3f4c3f,0x3b2f3c2f,0x3b2f392f,0x4c3f3c3f,0x3b2f3b2f,0x4c3f4c3f,0xbbbf888f,0xbbbfaaaf,0xaaaf999f,0xd00f999f,0xbbbfb00f,0xcccfaaaf,0xaaafcccf,0x999fbbbf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x247f149f,0x15cf15cf,0x248f248f,0x248f248f,0x14af02bf,0x03bf139f,0x248f248f,0x14bf248f,0x351f351f,0x341f341f,0x341f351f,0x351f351f,0x351f451f,0x341f341f,0x351f341f,0x341f341f,0x4c3f4c3f,0x3b2f3b2f,0x3c2f4c3f,0x3c3f3c3f,0x3c3f4d4f,0x3b2f3b2f,0x3c3f3c2f,0x3a2f3b2f,0xaaaf888f,0xaaafaaaf,0xbbbfaaaf,0xcccfbbbf,0xcccfcccf,0xbbbfcccf,0xaaafaaaf,0x888faaaf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x149f357f,0x15cf149f,0x14af14df,0x248f14af,0x14af248f,0x248f248f,0x248f248f,0x14bf14bf,0x341f341f,0x341f351f,0x341f341f,0x351f351f,0x341f341f,0x351f351f,0x341f341f,0x351f351f,0x3a2f3a2f,0x3c2f4c3f,0x3b2f3a2f,0x4c3f4c3f,0x3b2f3b2f,0x4c3f3c3f,0x3a2f3a2f,0x4c3f3c3f,0x888f888f,0x888f888f,0x999f777f,0x888f888f,0x888f888f,0x888f888f,0x888f888f,0x888f888f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x888f666f,0x777f777f,0x777f777f,0x777f777f,0x531f421f,0x421f421f,0x531f531f,0x531f421f,0x531f531f,0x421f421f,0x531f531f,0x421f421f,0xba1fba1f,0xaa1fa91f,0xcc1fcb1f,0xba1fba1f,0xcb1fcb1f,0xaa1fa91f,0xcb1fcb1f,0xa91faa1f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x00000000,0x00000000,0x00000000,0x00000000,0x0000eeef,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x777f777f,0x888f888f,0x888f888f,0x888f888f,0x888f777f,0x888f888f,0x777f666f,0x777f777f,0x531f531f,0x632f631f,0x531f531f,0x531f531f,0x421f421f,0x531f531f,0x421f421f,0x531f531f,0xcb1fcb1f,0xdc2fdc2f,0xcb1fdc1f,0xba1fba1f,0xa91faa1f,0xba1fba1f,0xa91f981f,0xbb1fba1f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x666f777f,0x269f15cf,0x14af15cf,0x777f777f,0x777f888f,0x777f777f,0x14af02bf,0x777f777f,0x531f531f,0x531f531f,0x531f631f,0x531f531f,0x531f531f,0x531f531f,0x631f631f,0x531f531f,0xdc2fdc1f,0xcb1fba1f,0xdc2fdc2f,0xba1fcb1f,0xdc2fcb1f,0xcb1fcb1f,0xdc2fdc2f,0xcb1fcb1f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x888f777f,0x777f777f,0x14cf777f,0x158f777f,0x777f14bf,0x777f777f,0x777f777f,0x777f777f,0x531f531f,0x531f531f,0x531f531f,0x531f531f,0x531f421f,0x531f531f,0x531f531f,0x531f632f,0xba1fcb1f,0xdc2fcc1f,0xba1fba1f,0xdc2fcb1f,0xba1fba1f,0xdc2fdc2f,0xba1fcb1f,0xdc2fdc2f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0xeeef0000,0x0000dddf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x888f777f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x888f888f,0x666f888f,0x531f531f,0x531f421f,0x531f531f,0x421f421f,0x531f531f,0x421f531f,0x531f531f,0x421f421f,0xbb1fcb1f,0xcb1fba1f,0xcc1fcc1f,0x981fa91f,0xcb1fba1f,0xa91fba1f,0xcc1fcc1f,0xa91faa1f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0xeeef0000,0xdddf0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x777f777f,0x777f777f,0x15cf777f,0x777f14bf,0x666f777f,0x26bf149f,0x777f777f,0x777f666f,0x421f421f,0x531f421f,0x421f421f,0x531f421f,0x421f421f,0x531f531f,0x531f421f,0x531f421f,0x991fa91f,0xdc2fba1f,0x981fba1f,0xba1fba1f,0x981fba1f,0xba1fba1f,0xba1fa91f,0xba1faa1f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x0000ffff,0xdddfffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x888f888f,0x13cf777f,0x15cf14bf,0x14af14cf,0x777f777f,0x248f149f,0x888f888f,0x666f888f,0x632f631f,0x531f531f,0x531f531f,0x531f531f,0x632f531f,0x531f531f,0x632f632f,0x531f531f,0xdc2fdc2f,0xcc1fdc1f,0xcb1fcb1f,0xcb1fbb1f,0xdc2fdc1f,0xba1fcb1f,0xdc2fdc2f,0xcb1fcb1f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0xdddfdddf,0xdddfffff,0xffffeeef,0xffffffff,0x00000000,0x00000000,0x00000000,0x00000000,0xdddfdddf,0x0000dddf,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x14af777f,0x777f14bf,0x777f777f,0x777f777f,0x666f777f,0x777f777f,0x777f777f,0x777f777f,0x531f531f,0x632f631f,0x531f531f,0x531f531f,0x531f421f,0x531f531f,0x531f531f,0x531f531f,0xba1fba1f,0xdc2fdc2f,0xcb1fcb1f,0xdc2fdc2f,0xba1faa1f,0xdc2fcc1f,0xcb1fcb1f,0xdc2fdc2f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x0000eeef,0xdddfffff,0x00000000,0xeeefeeef,0xeeef0000,0xffffeeef,0xffffffff,0x0000ffff,0x0000eeef,0xdddfffff,0x00000000,0xdddfeeef,0x0000ffff,0x0000eeef,0x0000ffff,0x0000ffff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x249f777f,0x666f13bf,0x777f888f,0x14cf777f,0x15af777f,0x14af248f,0x888f888f,0x888f888f,0x531f531f,0x531f421f,0x531f531f,0x531f421f,0x531f531f,0x421f531f,0x531f531f,0x421f421f,0xcb1fcb1f,0xba1fa91f,0xcb1fdc2f,0xba1fba1f,0xba1fba1f,0xa91fba1f,0xba1fcb1f,0xa91fa91f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0xeeef0000,0xffffeeef,0xeeefdddf,0xeeefffff,0x0000ffff,0x0000dddf,0xffff0000,0x00000000,0xeeef0000,0x0000eeef,0xeeef0000,0xffff0000,0x0000dddf,0x0000dddf,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x777f777f,0x777f777f,0x777f777f,0x14bf777f,0x14af14af,0x248f14af,0x14af777f,0x777f258f,0x531f531f,0x531f531f,0x421f421f,0x531f531f,0x531f421f,0x632f632f,0x531f531f,0x631f632f,0xba1fba1f,0xdc1fba1f,0xa91f991f,0xcb1fba1f,0xcb1fba1f,0xdc2fdc2f,0xcb1fcb1f,0xdc2fdc2f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0xffff0000,0xffffdddf,0xdddf0000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xffffdddf,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x777f777f,0x777f888f,0x888f13af,0x777f888f,0x14af13bf,0x888f249f,0x14af888f,0x777f368f,0x531f531f,0x531f531f,0x531f632f,0x531f531f,0x531f531f,0x531f531f,0x531f531f,0x531f421f,0xdc2fdc2f,0xcb1fcb1f,0xdc2fdc2f,0xcb1fcb1f,0xdc1fdc2f,0xcb1fba1f,0xcb1fcb1f,0xcb1faa1f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0xdddf0000,0x0000ffff,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x777f666f,0x129f149f,0x777f129f,0x777f777f,0x888f888f,0x777f777f,0x249f777f,0x666f358f,0x421f421f,0x531f531f,0x531f531f,0x531f531f,0x421f421f,0x531f531f,0x421f421f,0x531f531f,0xba1faa1f,0xcb1fcb1f,0xba1fba1f,0xcb1fcc1f,0xba1faa1f,0xcb1fba1f,0x991f991f,0xcb1fba1f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x0000ffff,0xffff0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x777f777f,0x777f777f,0x12af777f,0x777f777f,0x14af12bf,0x777f14af,0x248f777f,0x777f248f,0x531f531f,0x421f421f,0x631f531f,0x421f421f,0x531f531f,0x531f531f,0x632f632f,0x421f531f,0xba1fba1f,0xa91f991f,0xdc2fdc2f,0x981fa91f,0xcc1fcb1f,0xcb1fcb1f,0xdc2fdc2f,0xa91fcb1f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0xdddf0000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x888f777f,0x888f777f,0x12af12af,0x777f14af,0x139f12bf,0x777f248f,0x777f777f,0x888f888f,0x531f531f,0x632f631f,0x531f531f,0x531f531f,0x531f421f,0x531f531f,0x531f531f,0x631f531f,0xcb1fcb1f,0xdc2fdc2f,0xcb1fdc2f,0xba1fcb1f,0xcb1f991f,0xdc2fcb1f,0xcb1fbb1f,0xdc2fdc2f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x0000dddf,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x777f777f,0x777f777f,0x248f248f,0x777f248f,0x777f777f,0x888f888f,0x777f777f,0x777f777f,0x531f631f,0x531f531f,0x531f531f,0x531f531f,0x531f632f,0x531f531f,0x531f531f,0x421f531f,0xdc2fdc2f,0xba1fcb1f,0xcb1fdc2f,0xcc1fcb1f,0xdc1fdc2f,0xba1fba1f,0xcb1fcb1f,0xaa1fba1f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x777f777f,0x777f777f,0x888f666f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x421f421f,0x531f531f,0x531f421f,0x631f531f,0x531f531f,0x531f531f,0x421f421f,0x531f531f,0xba1fa91f,0xcb1fdc2f,0xba1faa1f,0xdc2fdc2f,0xba1fbb1f,0xdc2fcb1f,0xba1faa1f,0xdc2fdc1f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xedafedaf,0xdd9fdc9f,0xddafedaf,0xdc9fdc9f,0xddafddaf,0xddafdc9f,0xdd9fedaf,0xeeafedaf,0x239f228f,0x228f228f,0x23af239f,0x239f228f,0x23af239f,0x228f228f,0x239f239f,0x228f228f,0x58df57cf,0x57cf47cf,0x79df68df,0x58df57cf,0x79df69df,0x57cf46cf,0x68df68df,0x47cf57cf,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0xddafddaf,0xddafedaf,0xcc9fdc9f,0xcc9fcc9f,0xdd9fdd9f,0xedafdc9f,0xeeafdd9f,0xeeafeeaf,0x239f239f,0x23bf23af,0x23af23af,0x239f239f,0x228f228f,0x239f239f,0x228f127f,0x239f239f,0x69df68df,0x8adf8adf,0x79df79df,0x68df68df,0x47cf57cf,0x68df58df,0x47cf36cf,0x68df58df,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdc9fddaf,0xdd9fddaf,0xcc9fcc9f,0xdc9fcc9f,0xdd9fdc9f,0xedafdc9f,0xddafedaf,0xedafedaf,0x23af23af,0x239f239f,0x23af23af,0x239f239f,0x23af23af,0x23af23af,0x23af23af,0x239f23af,0x79df79df,0x68df68df,0x79df8adf,0x68df68df,0x79df79df,0x79df79df,0x8adf8adf,0x69df79df,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdd9fedaf,0xdd9fdd9f,0xdc9fdc9f,0xedafdd9f,0xdd9fdc9f,0xdd9fdc9f,0xddafedaf,0xdc9fddaf,0x239f239f,0x23af23af,0x239f239f,0x23af239f,0x239f228f,0x23af23af,0x239f239f,0x23af23bf,0x58df68df,0x79df79df,0x58df68df,0x79df68df,0x68df57cf,0x79df79df,0x58df68df,0x79df8adf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdc9fdd9f,0xdc9fdd9f,0xdd9fdd9f,0xedafddaf,0xdd9fdc9f,0xdd9fdd9f,0xddafedaf,0xdc9fddaf,0x239f239f,0x239f228f,0x23af23af,0x227f228f,0x239f239f,0x228f239f,0x23af23af,0x228f228f,0x68df69df,0x68df57cf,0x79df79df,0x36cf46cf,0x68df58df,0x47cf58df,0x79df79df,0x46cf57cf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdd9fdc9f,0xcc9fdd9f,0xdc9fcc9f,0xeebfedaf,0xdc9fddaf,0xdc9fdc9f,0xdd9fdd9f,0xdd9fddaf,0x228f228f,0x23af238f,0x227f228f,0x239f228f,0x227f228f,0x239f239f,0x239f228f,0x239f228f,0x46cf47cf,0x79df57cf,0x36cf57cf,0x58df57cf,0x36cf57cf,0x68df58df,0x58df47cf,0x58df57cf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xddafdc9f,0xdc9fddaf,0xdc9fdd9f,0xedbfdc9f,0xdd9fddaf,0xdd9fedaf,0xddafdc9f,0xddafddaf,0x23bf23af,0x23af23af,0x239f239f,0x239f239f,0x23bf23af,0x239f239f,0x23bf23bf,0x239f23af,0x8adf8adf,0x79df79df,0x68df68df,0x68df68df,0x8adf79df,0x68df69df,0x8adf8adf,0x68df79df,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdc9fddaf,0xcc9fddaf,0xdc9fdd9f,0xdc9fdc9f,0xddafddaf,0xddafedaf,0xddafdd9f,0xddafddaf,0x239f239f,0x23bf23af,0x239f23af,0x23af23af,0x239f228f,0x23af23af,0x239f239f,0x23af23af,0x58df58df,0x8adf8adf,0x69df79df,0x79df79df,0x58df57cf,0x79df79df,0x69df69df,0x79df79df,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdc9fdd9f,0xddafddaf,0xedafdd9f,0xddafddaf,0xdd9fddaf,0xedafdd9f,0xedafedaf,0xdd9fedaf,0x23af23af,0x239f228f,0x239f23af,0x239f228f,0x239f239f,0x228f239f,0x239f239f,0x228f228f,0x79df79df,0x58df47cf,0x69df79df,0x58df57cf,0x68df58df,0x47cf58df,0x68df68df,0x47cf47cf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdc9fdc9f,0xdc9fdc9f,0xedafddaf,0xcc9fdd9f,0xdc9fedaf,0xddafdc9f,0xddafedaf,0xdd9fddaf,0x239f239f,0x23af239f,0x228f227f,0x239f239f,0x239f228f,0x23bf23bf,0x23af239f,0x23af23bf,0x68df58df,0x79df58df,0x46cf36cf,0x68df68df,0x69df57cf,0x8adf8adf,0x79df68df,0x8adf8adf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdd9fcc9f,0xdd9fdd9f,0xedafdc9f,0xdd9fddaf,0xdd9fdd9f,0xcc8fdd9f,0xeebfedaf,0xdc9fedaf,0x23af23af,0x23af23af,0x23af23bf,0x239f23af,0x23af23af,0x239f239f,0x239f239f,0x239f228f,0x79df79df,0x79df79df,0x79df8adf,0x69df79df,0x79df79df,0x68df68df,0x68df69df,0x68df57cf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xedafdd9f,0xddafddaf,0xdc9fdc9f,0xcc9fedaf,0xdc9fdc9f,0xdc9fdc9f,0xddafddaf,0xdd9fdc9f,0x228f228f,0x239f239f,0x239f239f,0x23af23af,0x228f228f,0x239f239f,0x228f228f,0x239f239f,0x57cf57cf,0x68df68df,0x58df58df,0x79df79df,0x57cf57cf,0x69df58df,0x46cf46cf,0x69df58df,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xddafddaf,0xddafddaf,0xddafddaf,0xdc9fdd9f,0xdc9fcc8f,0xcc9fdc9f,0xdd9fdc9f,0xdd9fedaf,0x239f239f,0x228f227f,0x23af23af,0x227f228f,0x23af239f,0x23af239f,0x23bf23bf,0x228f239f,0x58df58df,0x46cf36cf,0x8adf79df,0x36cf47cf,0x79df68df,0x79df68df,0x8adf8adf,0x47cf69df,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xddafedaf,0xddafdc9f,0xdcafddaf,0xdd9fdc9f,0xdc9fdc9f,0xdc9fdd9f,0xddafddaf,0xedafdd9f,0x239f23af,0x23bf23af,0x23af23af,0x239f239f,0x239f227f,0x23af23af,0x239f239f,0x23af23af,0x69df79df,0x8adf8adf,0x79df79df,0x68df68df,0x68df36cf,0x79df79df,0x68df68df,0x8adf79df,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xedafedaf,0xedafdd9f,0xddafddaf,0xcc9fdc9f,0xdd9fdc9f,0xddafdd9f,0xedafddaf,0xddafddaf,0x23af23af,0x239f239f,0x239f23af,0x23af239f,0x23af23bf,0x239f239f,0x23af239f,0x228f239f,0x89df8adf,0x68df68df,0x68df79df,0x79df69df,0x79df8adf,0x58df58df,0x79df68df,0x57cf58df,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xedafeeaf,0xdd9fddaf,0xedafdc9f,0xdc9fddaf,0xddafdc9f,0xedafdd9f,0xddafdd9f,0xddafddaf,0x228f228f,0x239f23af,0x239f228f,0x23af23af,0x239f239f,0x23af239f,0x228f228f,0x23af23af,0x57cf47cf,0x68df79df,0x58df57cf,0x8adf79df,0x58df68df,0x79df69df,0x57cf57cf,0x79df79df,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xeebfedbf,0xedbfeebf,0xedafedaf,0xeebffebf,0xfebfeebf,0xeebfeebf,0xfebfeebf,0xeebffebf,0x72bf72bf,0x72bf72bf,0x83cf83cf,0x72bf72bf,0x83cf83cf,0x72bf62af,0x83cf83cf,0x72af72bf,0xb3cfb3cf,0xb3cfb3cf,0xc5cfb4cf,0xb3cfb3cf,0xc5cfc5cf,0xb3cfa3bf,0xc4cfc4cf,0xb3bfb3cf,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x25f836f9,0x15f825f8,0x15f815f8,0x25f825f8,0x25f825f8,0x25f825f8,0x36f936f9,0x36f936f9,0x25f836f9,0x15f825f8,0x15f815f8,0x25f825f8,0x25f825f8,0x25f825f8,0x36f936f9,0x36f936f9,0x25f836f9,0x15f825f8,0x15f815f8,0x25f825f8,0x25f825f8,0x25f825f8,0x36f936f9,0x36f936f9, +0xdcafedaf,0xddafddaf,0xdcafddaf,0xcc9fdc9f,0xdc9fdc9f,0xddafdd9f,0xedbfdc9f,0xedafedbf,0x83cf83cf,0x94df94df,0x83cf83cf,0x73cf73cf,0x72af72bf,0x73cf72bf,0x72af62af,0x73cf72bf,0xc5cfc4cf,0xc6dfc6df,0xc5cfc5cf,0xb4cfb4cf,0xb3bfb3cf,0xb4cfb3cf,0xb3bfa3af,0xb4cfb3cf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x25f815f8,0x36f936f9,0x36f936f9,0x36f936f9,0x36f936f9,0x25f836f9,0x25f825f8,0x15f815f8,0x25f815f8,0x36f936f9,0x36f936f9,0x36f936f9,0x36f936f9,0x25f836f9,0x25f825f8,0x15f815f8,0x25f815f8,0x36f936f9,0x36f936f9,0x36f936f9,0x36f936f9,0x25f836f9,0x25f825f8,0x15f815f8, +0xdc9fcc8f,0xcb8fdc8f,0xcc8fcc8f,0xcb8fcc8f,0xcc7fcc8f,0xcb7fcb7f,0xcc9fcc8f,0xcb7fcb8f,0x84cf83cf,0x73cf73cf,0x84cf84df,0x73cf83cf,0x84cf83cf,0x83cf83cf,0x94df94df,0x83cf83cf,0xc5dfc5cf,0xb4cfb4cf,0xc5dfc6df,0xb4cfc4cf,0xc5dfc5cf,0xc5cfc5cf,0xc6dfc6df,0xc5cfc5cf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x15f815f8,0x25f825f8,0x36f925f8,0x25f825f8,0x25f825f8,0x36f915f8,0x15f836f9,0x15f815f8,0x15f815f8,0x25f825f8,0x36f925f8,0x25f825f8,0x25f825f8,0x36f915f8,0x15f836f9,0x15f815f8,0x15f815f8,0x25f825f8,0x36f925f8,0x25f825f8,0x25f825f8,0x36f915f8,0x15f836f9,0x15f815f8, +0xfecfcc8f,0xeebfedbf,0xfecfcc7f,0xfebffebf,0xedbfeebf,0xfebfbb6f,0xedbfedbf,0xfebffebf,0x72bf83cf,0x84cf83cf,0x73bf73cf,0x84cf83cf,0x73cf72bf,0x84cf84cf,0x72bf83cf,0x84cf94df,0xb3cfc4cf,0xc5dfc5cf,0xb4cfb4cf,0xc5dfb4cf,0xb4cfb3cf,0xc5dfc5df,0xb3cfc4cf,0xc5cfc6df,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x36f915f8,0x25f836f9,0x36f925f8,0x36f936f9,0x15f836f9,0x15f815f8,0x15f815f8,0x25f825f8,0x36f915f8,0x25f836f9,0x36f925f8,0x36f936f9,0x15f836f9,0x15f815f8,0x15f815f8,0x25f825f8,0x36f915f8,0x25f836f9,0x36f925f8,0x36f936f9,0x15f836f9,0x15f815f8,0x15f815f8,0x25f825f8, +0xddafcc8f,0xdc9fdd9f,0xddafcc7f,0xedafedaf,0xcb7fdc9f,0xdc9fedaf,0xedbfddaf,0xddafdc9f,0x73cf83cf,0x83cf72bf,0x83cf83cf,0x62af62af,0x83cf72bf,0x72bf72bf,0x83cf83cf,0x62af72bf,0xb4cfc5cf,0xc4cfb3cf,0xc5cfc5cf,0xa3bfa3bf,0xc4cfb3cf,0xb3bfb3cf,0xc5cfc5cf,0xa3bfb3cf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x36f936f9,0x15f836f9,0x15f815f8,0x15f815f8,0x36f915f8,0x25f825f8,0x15f825f8,0x15f825f8,0x36f936f9,0x15f836f9,0x15f815f8,0x15f815f8,0x36f915f8,0x25f825f8,0x15f825f8,0x15f825f8,0x36f936f9,0x15f836f9,0x15f815f8,0x15f815f8,0x36f915f8,0x25f825f8,0x15f825f8,0x15f825f8, +0xdc9fddaf,0xdd9fdc9f,0xedafcc7f,0xeebfddaf,0xcb7fddaf,0xdd9fedaf,0xddafdd9f,0xcb7fddaf,0x62af72af,0x84cf72bf,0x62af72bf,0x72bf72bf,0x62af72bf,0x73cf72bf,0x72bf72af,0x73bf72bf,0xa3bfb3bf,0xc5dfb3cf,0xa3bfb3cf,0xb3cfb3cf,0xa3bfb3cf,0xb4cfb3cf,0xb3cfa3bf,0xb4cfb3cf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x25f836f9,0x15f825f8,0x25f825f8,0x25f825f8,0x15f836f9,0x15f815f8,0x36f915f8,0x15f815f8,0x25f836f9,0x15f825f8,0x25f825f8,0x25f825f8,0x15f836f9,0x15f815f8,0x36f915f8,0x15f815f8,0x25f836f9,0x15f825f8,0x25f825f8,0x25f825f8,0x15f836f9,0x15f815f8,0x36f915f8,0x15f815f8, +0xcc8fddaf,0xcc8fcc8f,0xcc8fcc7f,0xedbfddbf,0xcb7fbb7f,0xedafcc8f,0xdd9fddaf,0xcb7fddaf,0x94df94df,0x83cf83cf,0x83cf83cf,0x83cf73cf,0x94df83cf,0x73cf83cf,0x94df94df,0x83cf83cf,0xc6dfc6df,0xc5cfc5cf,0xb4cfb4cf,0xc4cfb4cf,0xc6dfc5cf,0xb4cfc5cf,0xc6dfc6df,0xc4cfc5cf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x25f825f8,0x15f815f8,0x15f815f8,0x36f915f8,0x15f815f8,0x25f815f8,0x36f925f8,0x36f936f9,0x25f825f8,0x15f815f8,0x15f815f8,0x36f915f8,0x15f815f8,0x25f815f8,0x36f925f8,0x36f936f9,0x25f825f8,0x15f815f8,0x15f815f8,0x36f915f8,0x15f815f8,0x25f815f8,0x36f925f8,0x36f936f9, +0xfecfcb7f,0xedbfeebf,0xeebffecf,0xcc8fcc8f,0xeebfeebf,0xcc8ffebf,0xcc8fcc9f,0xeebfcb7f,0x72bf72bf,0x94df94df,0x83cf83cf,0x84cf84cf,0x72bf72bf,0x84cf83cf,0x83cf83cf,0x84cf84cf,0xb3cfb3cf,0xc6dfc6df,0xc5cfc5cf,0xc5cfc5df,0xb3cfb3cf,0xc5dfc5cf,0xc5cfc5cf,0xc5cfc5df,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x25f815f8,0x36f936f9,0x25f836f9,0x25f825f8,0x25f815f8,0x36f925f8,0x25f836f9,0x15f825f8,0x25f815f8,0x36f936f9,0x25f836f9,0x25f825f8,0x25f815f8,0x36f925f8,0x25f836f9,0x15f825f8,0x25f815f8,0x36f936f9,0x25f836f9,0x25f825f8,0x25f815f8,0x36f925f8,0x25f836f9,0x15f825f8, +0xddafeebf,0xddafedaf,0xcb7fddaf,0xeebfeebf,0xdd9fddaf,0xdc8fedaf,0xeebffebf,0xeebfcb7f,0x83cf83cf,0x72bf72af,0x83cf84cf,0x73bf72bf,0x73cf72bf,0x72af72bf,0x73cf83cf,0x72bf72bf,0xc5cfc5cf,0xb3cfb3bf,0xc5cfc5cf,0xb4cfb3cf,0xb4cfb3cf,0xa3bfb3cf,0xb4cfb4cf,0xb3bfb3cf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x25f825f8,0x25f836f9,0x25f825f8,0x25f825f8,0x15f825f8,0x15f815f8,0x15f815f8,0x15f815f8,0x25f825f8,0x25f836f9,0x25f825f8,0x25f825f8,0x15f825f8,0x15f815f8,0x15f815f8,0x15f815f8,0x25f825f8,0x25f836f9,0x25f825f8,0x25f825f8,0x15f825f8,0x15f815f8,0x15f815f8,0x15f815f8, +0xedafdc9f,0xedafedaf,0xcb7fdd9f,0xddafedbf,0xddafedaf,0xcb6fdc9f,0xddafedbf,0xddafcb7f,0x73cf72bf,0x83cf73bf,0x62af62af,0x83cf73cf,0x83cf72bf,0x94df94df,0x83cf73cf,0x94df94df,0xb4cfb3cf,0xc5cfb4cf,0xa3bfa3bf,0xc4cfb4cf,0xc5cfb3cf,0xc6dfc6df,0xc5cfb4cf,0xc6dfc6df,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x15f815f8,0x15f815f8,0x15f815f8,0x36f936f9,0x36f936f9,0x36f925f8,0x25f836f9,0x25f825f8,0x15f815f8,0x15f815f8,0x15f815f8,0x36f936f9,0x36f936f9,0x36f925f8,0x25f836f9,0x25f825f8,0x15f815f8,0x15f815f8,0x15f815f8,0x36f936f9,0x36f936f9,0x36f925f8,0x25f836f9,0x25f825f8, +0xcb7fdd9f,0xcb7fcb7f,0xcc8fdc9f,0xdd9fdd9f,0xdd9fedbf,0xcc8fddaf,0xcb7fddaf,0xcb7fcb7f,0x84cf84cf,0x83cf83cf,0x84cf94df,0x83cf83cf,0x83cf84cf,0x83cf73cf,0x83cf83cf,0x83cf72bf,0xc5dfc5cf,0xc5cfc5cf,0xc5dfc6df,0xc5cfc5cf,0xc5cfc5df,0xc4cfb4cf,0xb4cfc5cf,0xc4cfb3cf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x25f815f8,0x36f936f9,0x25f836f9,0x36f925f8,0x15f836f9,0x36f915f8,0x15f825f8,0x15f815f8,0x25f815f8,0x36f936f9,0x25f836f9,0x36f925f8,0x15f836f9,0x36f915f8,0x15f825f8,0x15f815f8,0x25f815f8,0x36f936f9,0x25f836f9,0x36f925f8,0x15f836f9,0x36f915f8,0x15f825f8,0x15f815f8, +0xeebfcb7f,0xedafeebf,0xbb6fcc8f,0xcb7fcb7f,0xcb7fdd9f,0xeebfcb7f,0xedafcb7f,0xeebfeebf,0x72bf72bf,0x83cf83cf,0x73bf72bf,0x83cf83cf,0x72bf72bf,0x83cf72bf,0x62af62af,0x83cf73bf,0xb3cfb3cf,0xc4cfc4cf,0xb4cfb3cf,0xc5cfc5cf,0xb3cfb3cf,0xc5cfb3cf,0xa3bfa3bf,0xc5cfb4cf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8, +0xedbfeebf,0xcc8fedaf,0xeebfeebf,0xeebfeebf,0xeecfcb7f,0xddafedbf,0xedbfcc8f,0xedbfeebf,0x72bf73bf,0x62af62af,0x84df84cf,0x62af72bf,0x83cf83cf,0x83cf83cf,0x94df94df,0x72af83cf,0xb3cfb4cf,0xa3bfa3bf,0xc6dfc5cf,0xa3bfb3bf,0xc5cfb4cf,0xc5cfc4cf,0xc6dfc6df,0xa3bfc5cf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x36f936f9,0x36f936f9,0x36f936f9,0x36f936f9,0x25f825f8,0x25f825f8,0x15f815f8,0x15f815f8,0x36f936f9,0x36f936f9,0x36f936f9,0x36f936f9,0x25f825f8,0x25f825f8,0x15f815f8,0x15f815f8,0x36f936f9,0x36f936f9,0x36f936f9,0x36f936f9,0x25f825f8,0x25f825f8,0x15f815f8,0x15f815f8, +0xedbfedbf,0xcb7fdc9f,0xddafdcaf,0xddafdd9f,0xddafcb7f,0xdc9fdc9f,0xedbfcb7f,0xddafddaf,0x83cf83cf,0x94df94df,0x83cf84cf,0x73cf83cf,0x73cf62af,0x84cf83cf,0x73cf73cf,0x94df84cf,0xc5cfc5cf,0xc6dfc6df,0xc5cfc5cf,0xb4cfc4cf,0xb4cfa3bf,0xc5dfc5cf,0xb4cfb4cf,0xc6dfc5df,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x15f815f8,0x15f815f8,0x25f815f8,0x36f925f8,0x36f936f9,0x36f936f9,0x25f836f9,0x15f825f8,0x15f815f8,0x15f815f8,0x25f815f8,0x36f925f8,0x36f936f9,0x36f936f9,0x25f836f9,0x15f825f8,0x15f815f8,0x15f815f8,0x25f815f8,0x36f925f8,0x36f936f9,0x36f936f9,0x25f836f9,0x15f825f8, +0xcc8fcc9f,0xcc8fedaf,0xeebfddaf,0xbb7fddbf,0xcc7fedbf,0xedafddaf,0xbb6fcc8f,0xbb6fddaf,0x84df84df,0x73cf83cf,0x83cf84cf,0x83cf83cf,0x83cf94df,0x72bf72bf,0x83cf83cf,0x72bf73bf,0xc6dfc6df,0xb4cfc4cf,0xc4cfc5df,0xc5cfc5cf,0xc5cfc6df,0xb3cfb3cf,0xc5cfc4cf,0xb3cfb4cf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x25f825f8,0x36f936f9,0x36f936f9,0x15f815f8,0x15f815f8,0x25f825f8,0x25f825f8,0x36f936f9,0x25f825f8,0x36f936f9,0x36f936f9,0x15f815f8,0x15f815f8,0x25f825f8,0x25f825f8,0x36f936f9,0x25f825f8,0x36f936f9,0x36f936f9,0x15f815f8,0x15f815f8,0x25f825f8,0x25f825f8,0x36f936f9, +0xeebfeebf,0xddafcc8f,0xcc8fcc8f,0xedafcb7f,0xdd9fedaf,0xcc8fcb7f,0xeebfedbf,0xeebfcb7f,0x72bf72af,0x83cf84cf,0x73bf72bf,0x94df84cf,0x72bf73cf,0x84cf83cf,0x72bf72bf,0x84cf83cf,0xb3cfb3bf,0xc4cfc5cf,0xb4cfb3cf,0xc6dfc5df,0xb3cfb4cf,0xc5cfc5cf,0xb3cfb3cf,0xc5dfc5cf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x15f815f8,0x15f815f8,0x15f815f8,0x15f836f9,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f836f9,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f836f9,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8, +0xddafeeaf,0xcb7fcc8f,0xddafedaf,0xcb7feebf,0xedafdc9f,0xddafddaf,0xddafcb7f,0xddafddaf,0x268f268f,0x268f268f,0x279f279f,0x268f268f,0x279f279f,0x268f268f,0x279f279f,0x268f268f,0xe73fe72f,0xe72fe72f,0xe84fe83f,0xe72fe72f,0xe83fe83f,0xe72fe61f,0xe83fe83f,0xe72fe72f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x25f836f9,0x15f825f8,0x15f815f8,0x25f825f8,0x25f825f8,0x25f825f8,0x36f936f9,0x36f936f9,0x25f836f9,0x15f825f8,0x15f815f8,0x25f825f8,0x25f825f8,0x25f825f8,0x36f936f9,0x36f936f9, +0xcb7fedaf,0xedafddaf,0xdc9fcb7f,0xcb7fdc9f,0xddafdd9f,0xdc9fdc9f,0xcb7fdc9f,0xeebfcb7f,0x279f279f,0x28af28af,0x279f27af,0x279f279f,0x268f268f,0x279f268f,0x268f157f,0x279f268f,0xe83fe83f,0xe84fe84f,0xe83fe84f,0xe73fe73f,0xe72fe72f,0xe73fe72f,0xe72fe61f,0xe73fe73f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x25f815f8,0x36f936f9,0x36f936f9,0x36f936f9,0x36f936f9,0x25f836f9,0x25f825f8,0x15f815f8,0x25f815f8,0x36f936f9,0x36f936f9,0x36f936f9,0x36f936f9,0x25f836f9,0x25f825f8,0x15f815f8, +0xedafcc8f,0xcb7fdd9f,0xdc9fcb7f,0xdc9fcc9f,0xdc9fcb7f,0xedafcc9f,0xeeafcb7f,0xcb7fedaf,0x27af27af,0x279f279f,0x27af28af,0x279f279f,0x27af279f,0x279f279f,0x28af28af,0x279f279f,0xe84fe84f,0xe73fe73f,0xe84fe84f,0xe73fe83f,0xe84fe83f,0xe83fe83f,0xe84fe84f,0xe83fe83f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x15f815f8,0x25f825f8,0x36f925f8,0x25f825f8,0x25f825f8,0x36f915f8,0x15f836f9,0x15f815f8,0x15f815f8,0x25f825f8,0x36f925f8,0x25f825f8,0x25f825f8,0x36f915f8,0x15f836f9,0x15f815f8, +0xdd9fcc8f,0xedbfcb7f,0xcb7fedbf,0xddafdd9f,0xdc9fdc8f,0xcb7fdd9f,0xedafedbf,0xdc9fdd9f,0x268f279f,0x27af279f,0x278f279f,0x27af279f,0x279f268f,0x27af27af,0x268f279f,0x27af28af,0xe73fe83f,0xe84fe84f,0xe73fe73f,0xe84fe83f,0xe73fe72f,0xe84fe84f,0xe73fe83f,0xe84fe84f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x36f915f8,0x25f836f9,0x36f925f8,0x36f936f9,0x15f836f9,0x15f815f8,0x15f815f8,0x25f825f8,0x36f915f8,0x25f836f9,0x36f925f8,0x36f936f9,0x15f836f9,0x15f815f8,0x15f815f8,0x25f825f8, +0xcb7fdd9f,0xddafedbf,0xdc8fdc9f,0xeebfeebf,0xcc8fcb7f,0xedbfcc8f,0xedafedaf,0xddafdd9f,0x279f279f,0x279f268f,0x279f279f,0x267f268f,0x279f268f,0x268f268f,0x279f279f,0x268f268f,0xe73fe83f,0xe83fe72f,0xe84fe84f,0xe61fe61f,0xe83fe72f,0xe72fe72f,0xe84fe84f,0xe61fe72f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x36f936f9,0x15f836f9,0x15f815f8,0x15f815f8,0x36f915f8,0x25f825f8,0x15f825f8,0x15f825f8,0x36f936f9,0x15f836f9,0x15f815f8,0x15f815f8,0x36f915f8,0x25f825f8,0x15f825f8,0x15f825f8, +0xcb7fdc9f,0xddafdc9f,0xdc8fddaf,0xcb7fcb7f,0xddafedaf,0xcb7fdd9f,0xdd9fdc9f,0xdc9fcc9f,0x267f268f,0x27af268f,0x267f268f,0x268f268f,0x267f268f,0x279f268f,0x268f268f,0x278f268f,0xe61fe72f,0xe84fe72f,0xe61fe72f,0xe73fe72f,0xe61fe72f,0xe73fe73f,0xe72fe61f,0xe73fe72f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x25f836f9,0x15f825f8,0x25f825f8,0x25f825f8,0x15f836f9,0x15f815f8,0x36f915f8,0x15f815f8,0x25f836f9,0x15f825f8,0x25f825f8,0x25f825f8,0x15f836f9,0x15f815f8,0x36f915f8,0x15f815f8, +0xdd9fcb7f,0xedbfdd9f,0xdc8fdc9f,0xedafcb7f,0xdd9fcb7f,0xdc9fedaf,0xcc8fcc8f,0xcb7fedbf,0x28af28af,0x279f27af,0x279f279f,0x279f279f,0x28af27af,0x279f279f,0x28af28af,0x279f279f,0xe84fe84f,0xe84fe84f,0xe83fe83f,0xe83fe73f,0xe84fe84f,0xe73fe83f,0xe84fe84f,0xe83fe83f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x799f799f,0x00000000,0x799f0000,0x0000799f,0x00000000,0x799f799f,0x00000000,0x25f825f8,0x15f815f8,0x15f815f8,0x36f915f8,0x15f815f8,0x25f815f8,0x36f925f8,0x36f936f9,0x25f825f8,0x15f815f8,0x15f815f8,0x36f915f8,0x15f815f8,0x25f815f8,0x36f925f8,0x36f936f9, +0xcb7fedaf,0xdc8fedbf,0xcb7fcb7f,0xdc9fdc9f,0xedafcb7f,0xddafddaf,0xedafddaf,0xedafcb7f,0x268f268f,0x28af28af,0x279f279f,0x27af27af,0x268f268f,0x27af279f,0x279f279f,0x27af28af,0xe73fe73f,0xe84fe84f,0xe83fe83f,0xe84fe84f,0xe72fe72f,0xe84fe84f,0xe83fe83f,0xe84fe84f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x799f0000,0xdddfffff,0x0000567f,0xffff799f,0x567fdddf,0x799f0000,0xdddfffff,0x0000567f,0x25f815f8,0x36f936f9,0x25f836f9,0x25f825f8,0x25f815f8,0x36f925f8,0x25f836f9,0x15f825f8,0x25f815f8,0x36f936f9,0x25f836f9,0x25f825f8,0x25f815f8,0x36f925f8,0x25f836f9,0x15f825f8, +0xdc9fdc9f,0xddafcb7f,0xedafedaf,0xdc9fcc8f,0xcb7fddaf,0xdd9fcb7f,0xcb7feebf,0xdc9fddaf,0x279f279f,0x268f268f,0x279f27af,0x278f268f,0x279f268f,0x268f268f,0x279f279f,0x268f268f,0xe83fe83f,0xe72fe72f,0xe83fe84f,0xe73fe72f,0xe73fe72f,0xe61fe72f,0xe73fe83f,0xe72fe72f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x799f0000,0xbccfdddf,0x0000567f,0xdddf799f,0x567fbccf,0x799f0000,0xbccfdddf,0x0000567f,0x25f825f8,0x25f836f9,0x25f825f8,0x25f825f8,0x15f825f8,0x15f815f8,0x15f815f8,0x15f815f8,0x25f825f8,0x25f836f9,0x25f825f8,0x25f825f8,0x15f825f8,0x15f815f8,0x15f815f8,0x15f815f8, +0xdd9fdc9f,0xdc9fcc8f,0xddafddaf,0xdc9fcb7f,0xdc9fedaf,0xcb7fcc9f,0xcc8fcb7f,0xdc9fedaf,0x279f268f,0x27af278f,0x268f267f,0x279f279f,0x279f268f,0x28af28af,0x279f279f,0x28af28af,0xe73fe72f,0xe84fe73f,0xe61fe61f,0xe83fe73f,0xe83fe72f,0xe84fe84f,0xe83fe73f,0xe84fe84f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x567f567f,0x00000000,0x567f0000,0x0000567f,0x00000000,0x567f567f,0x00000000,0x15f815f8,0x15f815f8,0x15f815f8,0x36f936f9,0x36f936f9,0x36f925f8,0x25f836f9,0x25f825f8,0x15f815f8,0x15f815f8,0x15f815f8,0x36f936f9,0x36f936f9,0x36f925f8,0x25f836f9,0x25f825f8, +0xcb7fdc9f,0xdc9fdc9f,0xedafddaf,0xddafcb7f,0xdc9fddaf,0xeebfcb7f,0xcc8fddaf,0xdd9fedaf,0x28af27af,0x279f279f,0x27af28af,0x279f279f,0x27af28af,0x279f279f,0x279f279f,0x279f268f,0xe84fe84f,0xe83fe83f,0xe84fe84f,0xe83fe83f,0xe84fe84f,0xe83fe73f,0xe83fe83f,0xe83fe72f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x25f815f8,0x36f936f9,0x25f836f9,0x36f925f8,0x15f836f9,0x36f915f8,0x15f825f8,0x15f815f8,0x25f815f8,0x36f936f9,0x25f836f9,0x36f925f8,0x15f836f9,0x36f915f8,0x15f825f8,0x15f815f8, +0xeebfcb7f,0xedafeebf,0xedafdd9f,0xcb7fedaf,0xeebfdc9f,0xeebfcb7f,0xcb7fddaf,0xddafddaf,0x268f268f,0x279f279f,0x278f268f,0x279f279f,0x268f268f,0x279f268f,0x267f267f,0x279f278f,0xe72fe72f,0xe83fe83f,0xe73fe73f,0xe83fe84f,0xe72fe72f,0xe83fe72f,0xe61fe61f,0xe83fe73f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8, +0xcc8fddaf,0xedafcb7f,0xcc8fcc8f,0xdc9fcb7f,0xcb7fdc9f,0xdd9feebf,0xddafdc9f,0xcc8fcb7f,0x268f278f,0x268f267f,0x28af27af,0x267f268f,0x279f279f,0x279f279f,0x28af28af,0x268f279f,0xe73fe73f,0xe61fe61f,0xe84fe84f,0xe61fe72f,0xe84fe83f,0xe83fe83f,0xe84fe84f,0xe61fe83f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x36f936f9,0x36f936f9,0x36f936f9,0x36f936f9,0x25f825f8,0x25f825f8,0x15f815f8,0x15f815f8,0x36f936f9,0x36f936f9,0x36f936f9,0x36f936f9,0x25f825f8,0x25f825f8,0x15f815f8,0x15f815f8, +0xedafedaf,0xcb7feebf,0xddafcb7f,0xcb7fdd9f,0xcc8fdc9f,0xddafdd9f,0xcb7fedaf,0xddafedbf,0x279f279f,0x28af28af,0x279f27af,0x279f279f,0x279f267f,0x27af279f,0x279f279f,0x28af27af,0xe83fe83f,0xe84fe84f,0xe83fe84f,0xe73fe83f,0xe73fe61f,0xe84fe83f,0xe73fe73f,0xe84fe84f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x15f815f8,0x15f815f8,0x25f815f8,0x36f925f8,0x36f936f9,0x36f936f9,0x25f836f9,0x15f825f8,0x15f815f8,0x15f815f8,0x25f815f8,0x36f925f8,0x36f936f9,0x36f936f9,0x25f836f9,0x15f825f8, +0xedafedaf,0xeebfdc9f,0xddafcb7f,0xcb7fdc9f,0xcb7fcc8f,0xddafcc8f,0xedbfcb7f,0xddafdd9f,0x28af28af,0x279f279f,0x279f27af,0x279f279f,0x27af28af,0x268f268f,0x279f279f,0x268f278f,0xe84fe84f,0xe73fe83f,0xe83fe84f,0xe84fe83f,0xe84fe84f,0xe72fe72f,0xe83fe83f,0xe72fe73f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x25f825f8,0x36f936f9,0x36f936f9,0x15f815f8,0x15f815f8,0x25f825f8,0x25f825f8,0x36f936f9,0x25f825f8,0x36f936f9,0x36f936f9,0x15f815f8,0x15f815f8,0x25f825f8,0x25f825f8,0x36f936f9, +0xddafedaf,0xcb7fdd9f,0xedafddaf,0xcb7fdd9f,0xddafddaf,0xcb7fdc9f,0xddafdd9f,0xedafddaf,0x268f268f,0x279f27af,0x278f268f,0x28af27af,0x268f279f,0x27af279f,0x268f268f,0x27af27af,0xe72fe72f,0xe83fe84f,0xe73fe72f,0xe84fe84f,0xe73fe73f,0xe84fe83f,0xe72fe72f,0xe84fe84f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x15f815f8,0x15f815f8,0x15f815f8,0x15f836f9,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f836f9,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x999f999f,0x899f899f,0xaaaf9aaf,0x999f999f,0xaaafaaaf,0x899f888f,0xaaafaaaf,0x899f899f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0xfa0fc00f,0xf50ffa0f,0xc00ff00f,0xc00fc00f,0xf00ff00f,0xf00ff50f,0xc00ff00f,0xc00fc00f,0xfa0fc00f,0xf50ffa0f,0xc00ff00f,0xc00fc00f,0xf00ff00f,0xf00ff50f,0xc00ff00f,0xc00fc00f,0xfa0fc00f,0xf50ffa0f,0xc00ff00f,0xc00fc00f,0xf00ff00f,0xf00ff50f,0xc00ff00f,0xc00fc00f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xaaaf9aaf,0xbbbfbbbf,0xaaafabbf,0x9aaf9aaf,0x899f899f,0x9aaf999f,0x899f788f,0x9aaf999f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xff0ff50f,0xf50fff0f,0xf00ff00f,0xf00fc00f,0xf50ff00f,0xf50fff0f,0xf00ff00f,0xc00fc00f,0xff0ff50f,0xf50fff0f,0xf00ff00f,0xf00fc00f,0xf50ff00f,0xf50fff0f,0xf00ff00f,0xc00fc00f,0xff0ff50f,0xf50fff0f,0xf00ff00f,0xf00fc00f,0xf50ff00f,0xf50fff0f,0xf00ff00f,0xc00fc00f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xabbfabbf,0x9aaf9aaf,0xabbfbbbf,0x9aafaaaf,0xabbfaaaf,0xaaafaaaf,0xbbbfbbbf,0xaaafaaaf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xfa0ff50f,0xf50fff0f,0xf00fc00f,0xf50ff00f,0xf50ff00f,0xfa0fff0f,0xf00fc00f,0xf00ff00f,0xfa0ff50f,0xf50fff0f,0xf00fc00f,0xf50ff00f,0xf50ff00f,0xfa0fff0f,0xf00fc00f,0xf00ff00f,0xfa0ff50f,0xf50fff0f,0xf00fc00f,0xf50ff00f,0xf50ff00f,0xfa0fff0f,0xf00fc00f,0xf00ff00f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x999f9aaf,0xabbfaaaf,0x999f9aaf,0xabbf9aaf,0x9aaf999f,0xabbfabbf,0x999f9aaf,0xabbfbbbf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf00ff00f,0xf00ff50f,0xf50ff50f,0xff0ffa0f,0xf50ff50f,0xf50ff50f,0xf50ff50f,0xf00ff00f,0xf00ff00f,0xf00ff50f,0xf50ff50f,0xff0ffa0f,0xf50ff50f,0xf50ff50f,0xf50ff50f,0xf00ff00f,0xf00ff00f,0xf00ff50f,0xf50ff50f,0xff0ffa0f,0xf50ff50f,0xf50ff50f,0xf50ff50f,0xf00ff00f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x9aafaaaf,0x9aaf999f,0xaaafaaaf,0x888f888f,0xaaaf999f,0x899f999f,0xaaafaaaf,0x888f899f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xc00ff00f,0xf50ff00f,0xf50fff0f,0xf50ff50f,0xff0ffa0f,0xff0ff50f,0xfa0fff0f,0xf00ff50f,0xc00ff00f,0xf50ff00f,0xf50fff0f,0xf50ff50f,0xff0ffa0f,0xff0ff50f,0xfa0fff0f,0xf00ff50f,0xc00ff00f,0xf50ff00f,0xf50fff0f,0xf50ff50f,0xff0ffa0f,0xff0ff50f,0xfa0fff0f,0xf00ff50f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x888f899f,0xabbf999f,0x888f999f,0x999f999f,0x888f999f,0x9aaf999f,0x999f899f,0x9aaf899f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf00ff00f,0xff0ffa0f,0xf50ff50f,0xf00fc00f,0xf00ff00f,0xfa0fc00f,0xf50ffa0f,0xf00ff50f,0xf00ff00f,0xff0ffa0f,0xf50ff50f,0xf00fc00f,0xf00ff00f,0xfa0fc00f,0xf50ffa0f,0xf00ff50f,0xf00ff00f,0xff0ffa0f,0xf50ff50f,0xf00fc00f,0xf00ff00f,0xfa0fc00f,0xf50ffa0f,0xf00ff50f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xbbbfbbbf,0xaaafabbf,0x9aaf9aaf,0xaaaf9aaf,0xbbbfabbf,0x9aafaaaf,0xbbbfbbbf,0xaaafaaaf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf00fc00f,0xf00ff50f,0xf00ff00f,0xc00fc00f,0xf00ff00f,0xf50ff00f,0xf00ff00f,0xf00ffa0f,0xf00fc00f,0xf00ff50f,0xf00ff00f,0xc00fc00f,0xf00ff00f,0xf50ff00f,0xf00ff00f,0xf00ffa0f,0xf00fc00f,0xf00ff50f,0xf00ff00f,0xc00fc00f,0xf00ff00f,0xf50ff00f,0xf00ff00f,0xf00ffa0f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x999f999f,0xbbbfbbbf,0xaaafaaaf,0xabbfabbf,0x999f899f,0xabbfaaaf,0xaaafaaaf,0xabbfabbf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xc00fc00f,0xf50ff00f,0xf50ffa0f,0xc00fc00f,0xf50ff50f,0xc00ff00f,0xfa0ff00f,0xfa0fff0f,0xc00fc00f,0xf50ff00f,0xf50ffa0f,0xc00fc00f,0xf50ff50f,0xc00ff00f,0xfa0ff00f,0xfa0fff0f,0xc00fc00f,0xf50ff00f,0xf50ffa0f,0xc00fc00f,0xf50ff50f,0xc00ff00f,0xfa0ff00f,0xfa0fff0f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xaaafaaaf,0x999f899f,0xaaafabbf,0x999f999f,0x9aaf999f,0x899f999f,0x9aaf9aaf,0x899f899f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xc00fc00f,0xfa0ff50f,0xfa0fff0f,0xf00ff00f,0xff0ffa0f,0xc00ff50f,0xf50ff00f,0xf50ff50f,0xc00fc00f,0xfa0ff50f,0xfa0fff0f,0xf00ff00f,0xff0ffa0f,0xc00ff50f,0xf50ff00f,0xf50ff50f,0xc00fc00f,0xfa0ff50f,0xfa0fff0f,0xf00ff00f,0xff0ffa0f,0xc00ff50f,0xf50ff00f,0xf50ff50f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x9aaf999f,0xabbf9aaf,0x888f888f,0xaaaf9aaf,0xaaaf999f,0xbbbfbbbf,0xaaaf9aaf,0xbbbfbbbf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf00ff00f,0xf50ff00f,0xf50ff50f,0xf00ff00f,0xff0ff50f,0xc00ff50f,0xf00fc00f,0xf00ff50f,0xf00ff00f,0xf50ff00f,0xf50ff50f,0xf00ff00f,0xff0ff50f,0xc00ff50f,0xf00fc00f,0xf00ff50f,0xf00ff00f,0xf50ff00f,0xf50ff50f,0xf00ff00f,0xff0ff50f,0xc00ff50f,0xf00fc00f,0xf00ff50f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xabbfabbf,0xaaafaaaf,0xabbfbbbf,0xaaafaaaf,0xabbfabbf,0xaaaf9aaf,0x9aafaaaf,0x9aaf899f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf50ff00f,0xf00ff50f,0xf00ff00f,0xf00fc00f,0xf50ff50f,0xf00ff50f,0xfa0ff00f,0xf00ff50f,0xf50ff00f,0xf00ff50f,0xf00ff00f,0xf00fc00f,0xf50ff50f,0xf00ff50f,0xfa0ff00f,0xf00ff50f,0xf50ff00f,0xf00ff50f,0xf00ff00f,0xf00fc00f,0xf50ff50f,0xf00ff50f,0xfa0ff00f,0xf00ff50f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x999f899f,0xaaafaaaf,0x999f999f,0xaaafaaaf,0x999f899f,0xaaaf999f,0x888f888f,0xaaaf9aaf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xfa0ff00f,0xf50fff0f,0xfa0ff50f,0xf00ff50f,0xf00ff00f,0xf50ff00f,0xff0ffa0f,0xf00ffa0f,0xfa0ff00f,0xf50fff0f,0xfa0ff50f,0xf00ff50f,0xf00ff00f,0xf50ff00f,0xff0ffa0f,0xf00ffa0f,0xfa0ff00f,0xf50fff0f,0xfa0ff50f,0xf00ff50f,0xf00ff00f,0xf50ff00f,0xff0ffa0f,0xf00ffa0f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x999f999f,0x888f888f,0xbbbfabbf,0x888f899f,0xaaaf9aaf,0xaaafaaaf,0xbbbfbbbf,0x899faaaf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xff0ff00f,0xf50fff0f,0xff0fff0f,0xf00ffa0f,0xf00fc00f,0xf50ff00f,0xff0fff0f,0xf00ff50f,0xff0ff00f,0xf50fff0f,0xff0fff0f,0xf00ffa0f,0xf00fc00f,0xf50ff00f,0xff0fff0f,0xf00ff50f,0xff0ff00f,0xf50fff0f,0xff0fff0f,0xf00ffa0f,0xf00fc00f,0xf50ff00f,0xff0fff0f,0xf00ff50f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xaaafaaaf,0xbbbfbbbf,0xaaafabbf,0x9aafaaaf,0x9aaf888f,0xabbfaaaf,0x9aaf9aaf,0xbbbfabbf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf50ff00f,0xf50ffa0f,0xf50ff50f,0xf00ff50f,0xf50ff50f,0xf50ff00f,0xf50ffa0f,0xf00ff00f,0xf50ff00f,0xf50ffa0f,0xf50ff50f,0xf00ff50f,0xf50ff50f,0xf50ff00f,0xf50ffa0f,0xf00ff00f,0xf50ff00f,0xf50ffa0f,0xf50ff50f,0xf00ff50f,0xf50ff50f,0xf50ff00f,0xf50ffa0f,0xf00ff00f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xbbbfbbbf,0x9aaf9aaf,0xaaafabbf,0xaaafaaaf,0xabbfbbbf,0x999f999f,0xaaafaaaf,0x899f999f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf00fc00f,0xf00ff50f,0xf00fc00f,0xf50ff00f,0xfa0ffa0f,0xf00ff50f,0xf00ff50f,0xc00ff00f,0xf00fc00f,0xf00ff50f,0xf00fc00f,0xf50ff00f,0xfa0ffa0f,0xf00ff50f,0xf00ff50f,0xc00ff00f,0xf00fc00f,0xf00ff50f,0xf00fc00f,0xf50ff00f,0xfa0ffa0f,0xf00ff50f,0xf00ff50f,0xc00ff00f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x999f899f,0xaaafabbf,0x999f899f,0xbbbfabbf,0x999f9aaf,0xabbfaaaf,0x999f899f,0xabbfabbf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf00fc00f,0xf00ff50f,0xf00ff00f,0xc00fc00f,0xf50ffa0f,0xf00ff00f,0xf00ff00f,0xc00fc00f,0xf00fc00f,0xf00ff50f,0xf00ff00f,0xc00fc00f,0xf50ffa0f,0xf00ff00f,0xf00ff00f,0xc00fc00f,0xf00fc00f,0xf00ff50f,0xf00ff00f,0xc00fc00f,0xf50ffa0f,0xf00ff00f,0xf00ff00f,0xc00fc00f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f, +0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f999f,0x777f777f,0x777f777f,0x777f999f,0x777f777f,0x777f333f,0x777f777f,0x777f333f,0x777f999f,0x777f333f,0x777f333f,0x777f999f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0xfa0fc00f,0xf50ffa0f,0xc00ff00f,0xc00fc00f,0xf00ff00f,0xf00ff50f,0xc00ff00f,0xc00fc00f,0xfa0fc00f,0xf50ffa0f,0xc00ff00f,0xc00fc00f,0xf00ff00f,0xf00ff50f,0xc00ff00f,0xc00fc00f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f, +0x777f777f,0x333f777f,0x333f333f,0x777f999f,0x777f777f,0x777f333f,0x777f333f,0x777f777f,0x777f777f,0x333f999f,0x333f333f,0x777f999f,0x777f777f,0x777f333f,0x777f333f,0x777f777f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xff0ff50f,0xf50fff0f,0xf00ff00f,0xf00fc00f,0xf50ff00f,0xf50fff0f,0xf00ff00f,0xc00fc00f,0xff0ff50f,0xf50fff0f,0xf00ff00f,0xf00fc00f,0xf50ff00f,0xf50fff0f,0xf00ff00f,0xc00fc00f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x333f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f777f,0x777f333f,0x333f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f999f,0x777f333f,0x333f333f,0x777f777f,0x777f777f,0x777f777f, +0x333f777f,0x999f777f,0x999f999f,0x777f333f,0x333f333f,0x777f999f,0x333f999f,0x777f777f,0x333f777f,0x999f777f,0x999f999f,0x777f333f,0x333f333f,0x777f999f,0x333f999f,0x777f777f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xfa0ff50f,0xf50fff0f,0xf00fc00f,0xf50ff00f,0xf50ff00f,0xfa0fff0f,0xf00fc00f,0xf00ff00f,0xfa0ff50f,0xf50fff0f,0xf00fc00f,0xf50ff00f,0xf50ff00f,0xfa0fff0f,0xf00fc00f,0xf00ff00f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f, +0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x777f999f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f999f,0x999f999f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f999f,0x999f999f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f333f,0x777f777f,0x333f999f,0x999f999f,0x777f777f,0x333f777f,0x777f777f, +0x999f777f,0x333f333f,0x777f777f,0x333f999f,0x999f999f,0x777f777f,0x333f777f,0x777f777f,0x999f777f,0x333f333f,0x777f777f,0x333f999f,0x999f999f,0x777f777f,0x333f777f,0x777f777f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf00ff00f,0xf00ff50f,0xf50ff50f,0xff0ffa0f,0xf50ff50f,0xf50ff50f,0xf50ff50f,0xf00ff00f,0xf00ff00f,0xf00ff50f,0xf50ff50f,0xff0ffa0f,0xf50ff50f,0xf50ff50f,0xf50ff50f,0xf00ff00f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f, +0x777f777f,0x777f777f,0x777f777f,0x999f333f,0x333f777f,0x777f777f,0x333f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f333f,0x333f777f,0x777f777f,0x333f777f,0x777f333f,0x777f777f,0x777f777f,0x777f333f,0x999f333f,0x333f777f,0x777f777f,0x333f777f,0x777f333f,0x777f777f,0x999f999f,0x777f333f,0x999f333f,0x333f777f,0x777f333f,0x333f777f,0x777f333f, +0x333f777f,0x999f999f,0x777f333f,0x999f333f,0x333f777f,0x777f333f,0x333f777f,0x777f333f,0x333f333f,0x999f999f,0x777f333f,0x999f333f,0x333f777f,0x777f333f,0x333f777f,0x777f333f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xc00ff00f,0xf50ff00f,0xf50fff0f,0xf50ff50f,0xff0ffa0f,0xff0ff50f,0xfa0fff0f,0xf00ff50f,0xc00ff00f,0xf50ff00f,0xf50fff0f,0xf50ff50f,0xff0ffa0f,0xff0ff50f,0xfa0fff0f,0xf00ff50f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x333f777f,0x777f777f,0x777f333f,0x777f777f, +0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x333f777f,0x777f777f,0x999f333f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f333f,0x333f777f,0x777f777f,0x999f333f,0x777f999f,0x777f777f,0x777f777f,0x777f333f,0x777f333f,0x333f777f,0x777f777f,0x999f333f,0x777f999f,0x777f777f,0x777f777f,0x777f333f,0x777f333f,0x333f777f,0x777f999f,0x999f333f,0x333f999f, +0x999f777f,0x777f777f,0x777f333f,0x777f333f,0x333f777f,0x777f999f,0x999f333f,0x333f999f,0x999f999f,0x777f777f,0x777f333f,0x777f333f,0x333f777f,0x777f999f,0x999f333f,0x333f999f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf00ff00f,0xff0ffa0f,0xf50ff50f,0xf00fc00f,0xf00ff00f,0xfa0fc00f,0xf50ffa0f,0xf00ff50f,0xf00ff00f,0xff0ffa0f,0xf50ff50f,0xf00fc00f,0xf00ff00f,0xfa0fc00f,0xf50ffa0f,0xf00ff50f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f777f,0x333f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x777f333f,0x999f777f,0x333f333f,0x777f999f,0x777f777f, +0x777f777f,0x777f777f,0x333f333f,0x777f333f,0x999f777f,0x333f333f,0x777f999f,0x777f777f,0x777f777f,0x777f777f,0x333f333f,0x777f333f,0x999f777f,0x333f333f,0x777f999f,0x777f777f,0x777f777f,0x777f777f,0x333f333f,0x777f333f,0x999f777f,0x333f333f,0x777f999f,0x777f777f,0x777f777f,0x777f777f,0x333f333f,0x777f333f,0x999f777f,0x333f333f,0x777f999f,0x999f777f, +0x777f777f,0x777f777f,0x333f333f,0x777f333f,0x999f777f,0x333f333f,0x777f999f,0x999f777f,0x777f777f,0x777f777f,0x333f333f,0x777f333f,0x999f777f,0x333f333f,0x777f999f,0x999f777f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf00fc00f,0xf00ff50f,0xf00ff00f,0xc00fc00f,0xf00ff00f,0xf50ff00f,0xf00ff00f,0xf00ffa0f,0xf00fc00f,0xf00ff50f,0xf00ff00f,0xc00fc00f,0xf00ff00f,0xf50ff00f,0xf00ff00f,0xf00ffa0f, +0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f999f,0x333f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f999f,0x333f777f,0x999f999f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f777f,0x333f999f,0x333f777f,0x999f999f,0x777f777f,0x777f777f, +0x777f777f,0x333f777f,0x999f999f,0x333f999f,0x333f777f,0x999f999f,0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x999f999f,0x333f999f,0x333f777f,0x999f999f,0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x999f999f,0x333f999f,0x333f777f,0x333f999f,0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x999f999f,0x333f999f,0x333f777f,0x333f999f,0x777f777f,0x777f777f, +0x777f777f,0x333f777f,0x999f999f,0x333f999f,0x333f777f,0x333f999f,0x777f777f,0x777f777f,0x333f333f,0x333f777f,0x999f999f,0x333f999f,0x333f777f,0x333f999f,0x777f777f,0x777f777f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xc00fc00f,0xf50ff00f,0xf50ffa0f,0xc00fc00f,0xf50ff50f,0xc00ff00f,0xfa0ff00f,0xfa0fff0f,0xc00fc00f,0xf50ff00f,0xf50ffa0f,0xc00fc00f,0xf50ff50f,0xc00ff00f,0xfa0ff00f,0xfa0fff0f, +0x777f777f,0x777f777f,0x777f777f,0x999f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f777f,0x999f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f777f,0x999f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f777f,0x999f333f,0x777f777f,0x777f777f,0x777f777f, +0x777f777f,0x999f777f,0x777f777f,0x999f777f,0x999f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f333f,0x777f777f,0x999f777f,0x999f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f333f,0x777f777f,0x999f777f,0x999f333f,0x999f777f,0x777f777f,0x777f777f,0x777f777f,0x999f333f,0x333f777f,0x999f777f,0x999f333f,0x333f777f,0x777f777f,0x777f777f, +0x777f777f,0x999f333f,0x333f777f,0x999f777f,0x999f333f,0x333f777f,0x777f777f,0x777f777f,0x999f999f,0x999f333f,0x333f777f,0x999f777f,0x999f333f,0x333f777f,0x777f777f,0x333f777f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xc00fc00f,0xfa0ff50f,0xfa0fff0f,0xf00ff00f,0xff0ffa0f,0xc00ff50f,0xf50ff00f,0xf50ff50f,0xc00fc00f,0xfa0ff50f,0xfa0fff0f,0xf00ff00f,0xff0ffa0f,0xc00ff50f,0xf50ff00f,0xf50ff50f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f999f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f999f,0x777f777f,0x777f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f333f,0x777f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x999f333f,0x777f777f,0x777f333f,0x999f777f,0x777f333f,0x777f777f, +0x777f777f,0x777f333f,0x999f333f,0x777f777f,0x777f333f,0x999f777f,0x777f333f,0x777f333f,0x777f777f,0x777f333f,0x999f333f,0x777f777f,0x777f333f,0x999f777f,0x777f333f,0x999f333f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf00ff00f,0xf50ff00f,0xf50ff50f,0xf00ff00f,0xff0ff50f,0xc00ff50f,0xf00fc00f,0xf00ff50f,0xf00ff00f,0xf50ff00f,0xf50ff50f,0xf00ff00f,0xff0ff50f,0xc00ff50f,0xf00fc00f,0xf00ff50f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f999f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x777f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f999f,0x333f999f,0x777f777f,0x333f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f999f,0x333f999f,0x777f777f,0x333f333f,0x777f777f,0x777f999f,0x777f777f, +0x777f333f,0x777f999f,0x333f999f,0x777f777f,0x333f333f,0x777f777f,0x333f999f,0x777f999f,0x777f333f,0x777f999f,0x333f999f,0x777f777f,0x333f333f,0x777f777f,0x333f999f,0x777f999f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf50ff00f,0xf00ff50f,0xf00ff00f,0xf00fc00f,0xf50ff50f,0xf00ff50f,0xfa0ff00f,0xf00ff50f,0xf50ff00f,0xf00ff50f,0xf00ff00f,0xf00fc00f,0xf50ff50f,0xf00ff50f,0xfa0ff00f,0xf00ff50f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x777f999f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f333f,0x777f999f,0x777f777f,0x777f777f,0x777f777f, +0x777f777f,0x777f777f,0x333f777f,0x333f333f,0x777f999f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x333f333f,0x777f999f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x333f333f,0x999f999f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x333f333f,0x999f999f,0x333f333f,0x777f777f,0x777f777f, +0x333f999f,0x777f777f,0x333f777f,0x333f333f,0x999f999f,0x333f333f,0x333f777f,0x777f777f,0x333f999f,0x777f777f,0x333f777f,0x333f333f,0x999f999f,0x333f333f,0x333f777f,0x777f777f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xfa0ff00f,0xf50fff0f,0xfa0ff50f,0xf00ff50f,0xf00ff00f,0xf50ff00f,0xff0ffa0f,0xf00ffa0f,0xfa0ff00f,0xf50fff0f,0xfa0ff50f,0xf00ff50f,0xf00ff00f,0xf50ff00f,0xff0ffa0f,0xf00ffa0f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f999f,0x777f777f,0x777f777f,0x777f777f,0x777f777f, +0x777f777f,0x777f777f,0x999f777f,0x999f999f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f333f,0x999f999f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f333f,0x999f999f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x777f777f,0x999f333f,0x999f999f,0x777f333f,0x999f999f,0x777f777f,0x777f777f, +0x333f777f,0x777f777f,0x999f333f,0x999f999f,0x777f333f,0x999f999f,0x999f777f,0x777f777f,0x333f777f,0x777f777f,0x999f333f,0x999f999f,0x777f333f,0x999f999f,0x999f777f,0x333f333f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xff0ff00f,0xf50fff0f,0xff0fff0f,0xf00ffa0f,0xf00fc00f,0xf50ff00f,0xff0fff0f,0xf00ff50f,0xff0ff00f,0xf50fff0f,0xff0fff0f,0xf00ffa0f,0xf00fc00f,0xf50ff00f,0xff0fff0f,0xf00ff50f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f999f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f999f,0x777f777f,0x333f999f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x777f999f,0x777f777f,0x333f999f,0x333f333f,0x777f777f,0x777f777f,0x999f777f,0x333f333f,0x777f999f,0x777f777f,0x333f999f,0x333f333f,0x777f777f,0x777f777f, +0x999f777f,0x333f333f,0x777f999f,0x777f777f,0x333f999f,0x333f333f,0x777f777f,0x777f777f,0x999f777f,0x333f333f,0x777f999f,0x777f777f,0x333f999f,0x333f333f,0x777f777f,0x999f999f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf50ff00f,0xf50ffa0f,0xf50ff50f,0xf00ff50f,0xf50ff50f,0xf50ff00f,0xf50ffa0f,0xf00ff00f,0xf50ff00f,0xf50ffa0f,0xf50ff50f,0xf00ff50f,0xf50ff50f,0xf50ff00f,0xf50ffa0f,0xf00ff00f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f777f,0x777f777f,0x777f777f,0x999f777f,0x999f999f,0x777f777f,0x777f777f,0x777f777f,0x999f999f,0x777f333f,0x777f777f,0x999f333f,0x999f999f,0x777f333f,0x777f777f, +0x777f777f,0x999f333f,0x333f333f,0x777f777f,0x999f333f,0x999f999f,0x333f333f,0x777f777f,0x777f777f,0x999f333f,0x333f333f,0x777f777f,0x999f333f,0x999f999f,0x333f333f,0x777f777f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf00fc00f,0xf00ff50f,0xf00fc00f,0xf50ff00f,0xfa0ffa0f,0xf00ff50f,0xf00ff50f,0xc00ff00f,0xf00fc00f,0xf00ff50f,0xf00fc00f,0xf50ff00f,0xfa0ffa0f,0xf00ff50f,0xf00ff50f,0xc00ff00f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f999f,0x777f777f,0x777f999f,0x777f777f,0x777f999f,0x777f777f, +0x777f777f,0x777f999f,0x999f999f,0x777f777f,0x777f333f,0x777f777f,0x999f999f,0x777f333f,0x777f777f,0x777f333f,0x999f999f,0x777f777f,0x777f333f,0x777f777f,0x999f999f,0x777f333f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf00fc00f,0xf00ff50f,0xf00ff00f,0xc00fc00f,0xf50ffa0f,0xf00ff00f,0xf00ff00f,0xc00fc00f,0xf00fc00f,0xf00ff50f,0xf00ff00f,0xc00fc00f,0xf50ffa0f,0xf00ff00f,0xf00ff00f,0xc00fc00f, +0 }; diff --git a/minecraftcpp-master/handheld/data/images/terrain_5551.h b/minecraftcpp-master/handheld/data/images/terrain_5551.h new file mode 100644 index 0000000..95e42b0 --- /dev/null +++ b/minecraftcpp-master/handheld/data/images/terrain_5551.h @@ -0,0 +1,1052 @@ +/********************************************************** + * PVRTexture Tool v 3.20 + * PVRTC Library v 1.106. 0. 0 Beta + **********************************************************/ + +#ifndef A32BIT + #define A32BIT static const unsigned long +#endif + +A32BIT terrain_5551[] = { + +/* Header */ +0x00000034, /* dwHeaderSize */ +0x00000100, /* dwHeight */ +0x00000100, /* dwWidth */ +0x00000000, /* dwMipMapCount */ +0x00008011, /* dwpfFlags */ +0x00020000, /* dwDataSize */ +0x00000010, /* dwBitCount */ +0x0000f800, /* dwRBitMask */ +0x000007c0, /* dwGBitMask */ +0x0000003e, /* dwBBitMask */ +0x00000001, /* dwAlphaBitMask */ +0x21525650, /* dwPVR */ +0x00000001, /* dwNumSurfs */ + +/* Data */ +0x94a594a5,0x842194a5,0x8c638421,0x8c637bdf,0x94a59ce7,0x84218c63,0x84218c63,0x8c63739d,0x739d7bdf,0x739d739d,0x7bdf739d,0x8c638c63,0x8c636b5b,0x739d7bdf,0x739d739d,0x7bdf739d,0x9353bc17,0x7a8f9353,0xbc177a8f,0x93539353,0x7a8f7a8f,0x7a8f59cb,0xbc177a8f,0xbc177a8f,0x75937593,0x650f7593,0x6d51650f,0x6d515ccd,0x75937dd5,0x650f6d51,0x650d6d4f,0x6d515489, +0x9c13bcd9,0x9c139c13,0xbcd99c13,0xb497bcd9,0xbcd99c13,0xbcd9bcd9,0xbcd9bcd9,0x9c13bcd9,0xc631ce73,0xc631c631,0xce73c631,0xce73ce73,0xce73c631,0xc631ce73,0xc631c631,0xad6bc631,0x84218421,0x84218421,0x84218421,0x94a594a5,0x94a57bdf,0x84218421,0x84218421,0x84218421,0x924d9a4d,0xce739a4d,0x9a4f9a4d,0xa28f920d,0xaa8f9a4d,0xd6b58a0d,0xaa8f9a4d,0x9a4d9a4d, +0xc9c5da07,0xa185b1c5,0xc9c5da07,0xa185b1c5,0xc9c5da07,0xa185b1c5,0xc9c5da07,0xa185b1c5,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0x0000ffff,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0xffff0000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x8c6394a5,0x94a5a529,0x84219ce7,0x84218c63,0xad6b7bdf,0x94a5a529,0x8c638421,0x8c638421,0x7bdf7bdf,0x8c638c63,0x8c638c63,0x8c638c63,0x8c63739d,0x8c638c63,0x7bdf6b5b,0x739d7bdf,0x93537a8f,0x7a8f59cb,0x93537a8f,0x59cb8421,0xbc177a8f,0x7a8f9353,0x93537a8f,0x59cb59cb,0x6d517593,0x85958dd7,0x59cb8595,0x650f6d4f,0x96195ccd,0x759395d9,0x6d51650d,0x6d51650f, +0xbcd9bcd9,0x72cfb497,0xb497b497,0x9c139c13,0x9c139c13,0xb4979c13,0xb4979c13,0x9c13bcd9,0xad6bce73,0xb5adb5ad,0xb5adb5ad,0xb5adb5ad,0xb5ada529,0xb5adb5ad,0xad6b9ce7,0x8421ad6b,0xad6b8421,0xb5adb5ad,0xb5adb5ad,0xb5adb5ad,0xb5ada529,0xb5adb5ad,0xad6b9ce7,0x8421ad6b,0x79cb79cb,0xe739820b,0x79cbb2d1,0x61896989,0x71cb79cb,0xd6b5820b,0x79cb9a4d,0x79cb79cb, +0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0xffff0000,0x00000000,0x00000000,0x00000000,0xffffffff,0x0000ffff,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x4e490000,0x00000000,0x00000000, +0xbdefa529,0x8421b5ad,0x8c638c63,0x94a594a5,0x9ce794a5,0xad6bad6b,0x739d8421,0xb5ad8421,0x6b5b7bdf,0x739d739d,0x739d6b5b,0x739d739d,0x739d8c63,0x7bdf7bdf,0x8c637bdf,0x7bdf7bdf,0x7a8fbc17,0x59cb7a8f,0x7a8fbc17,0x7a8f7a8f,0x7a8fbc17,0x7a8f7a8f,0x59cb59cb,0x7a8fbc17,0x59cb8dd7,0x650f9e5b,0x59cb6d4f,0x59cb7591,0x7dd57593,0x96199619,0x548b59cb,0x59cb650d, +0xbcd9bcd9,0x9c139c13,0x9c139c13,0xb497b497,0xbcd9bcd9,0xb497bcd9,0xbcd972cf,0x9c13bcd9,0x9ce7ce73,0xa529a529,0xa5299ce7,0xa529a529,0xa529b5ad,0xad6bad6b,0xb5adad6b,0x8421ad6b,0x9ce78421,0xa529a529,0xa5299ce7,0xa529a529,0xa529b5ad,0xad6bad6b,0xb5adad6b,0x8421ad6b,0x8a0d79cb,0xd6b56989,0x79cb9a4d,0x718979cb,0x79cb79cb,0xd6b579cb,0x920d820b,0x8a0d79cb, +0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0x8c63da07,0x91455295,0x8c63da07,0x00015295,0x52950001,0x91458c63,0x5295da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x00000000,0xffffffff,0xffffffff,0x00000000,0x0000ffff,0xffff0000,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x00000000,0x4e494e49,0x00000000,0x00000000,0x03014e49,0x00000301,0x00000000, +0x8421739d,0x94a58c63,0x9ce794a5,0x7bdf7bdf,0x84217bdf,0x94a58c63,0x8c638c63,0x7bdf8c63,0x8c637bdf,0x7bdf7bdf,0x6b5b7bdf,0x8c637bdf,0x7bdf7bdf,0x739d739d,0x739d739d,0x7bdf739d,0x6b5b9353,0x7a8fbc17,0x59cb9353,0xbc177a8f,0x93539353,0x93537a8f,0xbc177a8f,0x7a8f9353,0x6b5b59cb,0x59cb59cb,0x59cb7591,0x59cb59cb,0x59cb5ccd,0x59cb6d51,0x59cb7a8f,0x7a8f59cb, +0x6a8d6a8d,0x72cf6a8d,0x72cf72cf,0x72cf72cf,0x72cf72cf,0x6a8d6a8d,0x6a8d6a8d,0x72cf72cf,0xb5adce73,0xad6bad6b,0x9ce7ad6b,0xb5adad6b,0xad6bad6b,0xa529a529,0xa529a529,0x8421a529,0xb5ad8421,0xad6bad6b,0x9ce7ad6b,0xb5adad6b,0xad6bad6b,0xa529a529,0xa529a529,0x8421a529,0xbdefbdef,0xd6b5b5ad,0xb5adb5ad,0xb5adb5ad,0xbdefb5ad,0xdef7b5ad,0xb5adb5ad,0xbdefb5ad, +0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0x9145a985,0x52959145,0x9145a985,0x91455295,0x00015295,0x91459145,0x91455295,0x91459145,0x9145a985,0x91459145,0x9145a985,0x91459145,0x9145a985,0x91459145,0x9145a985,0x91459145,0x00000000,0xffff0000,0x00000000,0xffffffff,0x0000ffff,0x00000000,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x00000000,0x03014e49,0x4e490000,0x03014e49,0x03010000,0x0000930b,0x00000000, +0x8421a529,0x8421ad6b,0xad6bad6b,0xad6b8c63,0x739dbdef,0xa5298421,0x7bdfad6b,0x8c638c63,0x8c637bdf,0x739d8c63,0x739d739d,0x739d739d,0x739d739d,0x8c638c63,0x8c638c63,0x6b5b8c63,0x7a8f9353,0xbc179353,0x935359cb,0x7a8f7a8f,0x59cb9353,0x6b5b7a8f,0x93537a8f,0x7a8f59cb,0x7a8f9353,0xbc179353,0x935359cb,0x7a8f7a8f,0x59cb59cb,0x6b5b59cb,0x93537a8f,0x7a8f59cb, +0x9c13bcd9,0x9c139c13,0xbcd99c13,0x9c13bcd9,0x9c13bcd9,0x72cf9c13,0xb497b497,0xbcd9b497,0xb5adce73,0xa529b5ad,0xa529a529,0xa529a529,0xa529a529,0xb5adb5ad,0xb5adb5ad,0x7bdfb5ad,0xb5ad8421,0xa529b5ad,0xa529a529,0xa529a529,0xa529a529,0xb5adb5ad,0xb5adb5ad,0x7bdfb5ad,0x9a4d8a0d,0x9a4d9a4d,0x924d9a4d,0xd6b59a4d,0xaa8faa8f,0x9a4da24f,0x9a4d9a4d,0xd6b59a4d, +0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xda07da07,0xa985da07,0xda075295,0xa9855295,0xda075295,0x00010001,0xda075295,0xa985da07,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0x00000000,0xffff0000,0x0000ffff,0xffff0000,0xffff0000,0xffff0000,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x4e490000,0x0301930b,0x00000301,0x03010301,0x930b5981,0x0301930b,0x00000000, +0x9ce79ce7,0xa5297bdf,0x94a58421,0x9ce794a5,0x94a58421,0x84218c63,0x8c637bdf,0x94a58c63,0x739d739d,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x6b5b7bdf,0x7bdf7bdf,0x739d739d,0x7bdf6b5b,0x59cb7a8f,0x93539353,0x93537a8f,0x59cb59cb,0x7a8f59cb,0x59cb7a8f,0x7a8f7a8f,0xbc177a8f,0x59cb7a8f,0x93539353,0x93537a8f,0x59cb59cb,0x7a8f59cb,0x59cb7a8f,0x7a8f7a8f,0xbc177a8f, +0x9c139c13,0xb49772cf,0xb497b497,0x9c13bcd9,0xb497b497,0xb497b497,0x9c139c13,0x9c139c13,0xa529c631,0xad6bad6b,0xa529ad6b,0xa529a529,0x9ce7ad6b,0xad6bad6b,0xa529a529,0x84219ce7,0xa5298421,0xad6bad6b,0xa529ad6b,0xa529a529,0x9ce7ad6b,0xad6bad6b,0xa529a529,0x84219ce7,0x79cb9a4d,0x79cb9a4d,0x79cb6189,0xd6b579cb,0x79cb9a4d,0x79cb7189,0x79cb6989,0xd6b579cb, +0xdef7def7,0xce73def7,0xdef7def7,0xdef7def7,0xdef7ce73,0xce73def7,0xdef7ce73,0xce73def7,0x8c63da07,0x91458c63,0x0001da07,0x91450001,0x8c635295,0x52955295,0x8c630001,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x00000000,0x0000ffff,0xffff0000,0xffff0000,0x00000000,0x0000ffff,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x3df90000,0x00003df9,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x03010000,0x03015981,0x00000301,0x930b0301,0x5981930b,0x930b5981,0x00000000, +0x9ce77bdf,0x94a5a529,0x842194a5,0x7bdf8c63,0x84218421,0xad6bb5ad,0xa52994a5,0x8c6394a5,0x8c638c63,0x84217bdf,0x739d7bdf,0x8c638c63,0x7bdf7bdf,0x7bdf7bdf,0x8c638c63,0x6b5b8c63,0x59cbbc17,0x7a8f7a8f,0x7a8f8421,0xbc177a8f,0x7a8fbc17,0xbc17bc17,0x93537a8f,0x93537a8f,0x59cbbc17,0x7a8f7a8f,0x7a8f8421,0xbc177a8f,0x7a8fbc17,0xbc17bc17,0x93537a8f,0x93537a8f, +0xbcd9bcd9,0xb497bcd9,0xbcd9bcd9,0x9c13bcd9,0x9c139c13,0xbcd972cf,0xbcd9bcd9,0xbcd9bcd9,0xb5adce73,0xad6bad6b,0xa529ad6b,0xb5adb5ad,0xad6bad6b,0xad6bad6b,0xb5adb5ad,0x7bdfb5ad,0xb5ad94a5,0xad6bad6b,0xa529ad6b,0xb5adb5ad,0xad6bad6b,0xad6bad6b,0xb5adb5ad,0x7bdfb5ad,0x59499a4d,0x69898a0b,0x618979cb,0xdef779cb,0x6989aa8f,0x71cb820b,0x79cb79cb,0xd6b579cb, +0xdef7ce73,0x00010001,0xce730001,0xce730001,0x0001def7,0x0001ce73,0x00010001,0xce73def7,0x8c63da07,0x52955295,0x8c63da07,0x52950001,0x52950001,0x52950001,0x00015295,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x00000000,0x0000ffff,0x0000ffff,0xffffffff,0xffff0000,0xffff0000,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x33e73df9,0x3cef3d33,0x00003d33,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x00000000,0x59810000,0x5981930b,0x930b930b,0x03015981,0x4e490000,0x00000301, +0x84218c63,0x8c639ce7,0x7bdf94a5,0x8421a529,0xad6b94a5,0x84218421,0xa5298c63,0xad6b7bdf,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x739d739d,0x6b5b739d,0x739d739d,0x739d739d,0x7bdf7bdf,0x7a8fbc17,0xbc17bc17,0x93539353,0x7a8f7a8f,0x59cb9353,0x93539353,0x7a8f7a8f,0x93539353,0x7a8fbc17,0xbc17bc17,0x93539353,0x7a8f7a8f,0x59cb9353,0x93539353,0x7a8f7a8f,0x93539353, +0x72cf72cf,0x6a8d6a8d,0x6a8d6a8d,0x72cf6a8d,0x72cf72cf,0x6a8d6a8d,0x6a8d6a8d,0x72cf72cf,0x8421ad6b,0x84218421,0x84218421,0x84218421,0x7bdf8421,0x84218421,0x84218421,0x84218421,0xad6b8421,0xa529ad6b,0xa529a529,0xa529a529,0x9ce7a529,0xa529a529,0xa529a529,0x8421ad6b,0xb5adb5ad,0xb5adb5ad,0xbdefb5ad,0xd6b5b5ad,0xb5adb5ad,0xb5adb5ad,0xb5adb5ad,0xd6b5b5ad, +0xce73ce73,0x0001ce73,0xce73ce73,0x00010001,0x0001ce73,0xce73ce73,0xce730001,0xce73ce73,0x9145a985,0x91459145,0x00015295,0x00010001,0x00010001,0x91455295,0x0001a985,0x91459145,0x9145a985,0x91459145,0x9145a985,0x91459145,0x9145a985,0x91459145,0x9145a985,0x91459145,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x0000ffff,0x00000000,0x0000ffff,0xffff0000, +0x00000000,0x00000000,0x3d330000,0x3d333d33,0x33e73df9,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x4e490000,0x00000301,0x930b5981,0x4e494e49,0x00000000,0x03014e49,0x00000301, +0x9ce78421,0xad6bb5ad,0x8421ad6b,0x9ce7ad6b,0xad6bb5ad,0x94a58421,0x94a58421,0x7bdf7bdf,0x8c637bdf,0x6b5b8c63,0x739d8c63,0x7bdf7bdf,0x8c637bdf,0x8c638c63,0x8c638c63,0x8c638c63,0x7a8f9353,0x93537a8f,0x93537a8f,0x59cb7a8f,0x93537a8f,0x7a8f9353,0x7a8f7a8f,0x7a8f59cb,0x7a8f9353,0x93537a8f,0x93537a8f,0x59cb7a8f,0x93537a8f,0x7a8f9353,0x7a8f7a8f,0x7a8f59cb, +0xbcd9bcd9,0xbcd9bcd9,0x72cfbcd9,0xbcd99c13,0xb497bcd9,0xb497b497,0xbcd9bcd9,0x9c13bcd9,0xce73ce73,0xc631ce73,0xc631ce73,0xce73ce73,0xce73ce73,0xce73ce73,0xce73ce73,0xb5adce73,0xb5ad8421,0x9ce7b5ad,0xa529b5ad,0xad6bad6b,0xb5adad6b,0xb5adb5ad,0xb5adb5ad,0x94a5b5ad,0x9a4da24f,0xd6b59a4d,0x9a4d9a4d,0xb2d1a28f,0x9a4da24f,0xd6b59a4d,0x9a4d9a4d,0x79cbb2d1, +0xce73ce73,0x0001ce73,0xce73ce73,0xce730001,0x00010001,0xce73ce73,0xce730001,0xce73ce73,0xda07da07,0xa985da07,0xda07da07,0x00010001,0x52950001,0x5295da07,0x00015295,0xa985da07,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0x00000000,0x0000ffff,0x0000ffff,0xffff0000,0xffffffff,0xffffffff,0xffffffff,0xffffffff, +0x00000000,0x00000000,0x00000000,0x3cef3df9,0x33e733e7,0x00003d33,0x00000000,0x00000000,0x00000000,0x00000000,0xce810000,0x0000f7c1,0xb5c1f7c1,0x0000f7c1,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x03010000,0x930b0000,0x930b930b,0x03010301,0x59810301,0x03010000,0x00000000, +0x842194a5,0x8c63b5ad,0x9ce78c63,0x8421ad6b,0x94a58421,0xad6b94a5,0xb5ad8c63,0x84218c63,0x739d7bdf,0x739d739d,0x739d739d,0x7bdf739d,0x7bdf6b5b,0x739d7bdf,0x739d739d,0x7bdf8c63,0x93539353,0x7a8f59cb,0x59cb7a8f,0x7a8f59cb,0x7a8f7a8f,0x7a8f7a8f,0xbc17bc17,0x93537a8f,0x93539353,0x7a8f59cb,0x59cb7a8f,0x7a8f59cb,0x7a8f7a8f,0x7a8f7a8f,0xbc17bc17,0x93537a8f, +0x9c139c13,0x9c139c13,0xbcd99c13,0xb497b497,0x9c139c13,0x72cf9c13,0x9c13bcd9,0x9c139c13,0xa529ce73,0xa529a529,0xa529a529,0xad6ba529,0xad6b9ce7,0xa529ad6b,0xa529a529,0x8421b5ad,0xa5298421,0xa529a529,0xa529a529,0xad6ba529,0xad6b9ce7,0xa529ad6b,0xa529a529,0x8421b5ad,0x79cb79cb,0xce7379cb,0x79cb924d,0x79cb79cb,0x8a0d820b,0xce7379cb,0x8a0b9a4d,0x79cb79cb, +0xad6bce73,0x0001ad6b,0xad6bce73,0xce730001,0x0001ce73,0xce73ce73,0xad6b0001,0xce73ad6b,0x8c63da07,0x52955295,0x00010001,0x00010001,0x00010001,0x91458c63,0x52950001,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x00000000,0x0000ffff,0xffff0000,0xffffffff,0xffff0000,0x00000000,0x0000ffff,0xffff0000, +0x00000000,0x00000000,0x00000000,0x14013d33,0x00001301,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xce81ce81,0x8c81f7c1,0x00000000,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x00000000,0x930b0301,0x930b5981,0x0301930b,0x930b930b,0x930b930b,0x00004e49, +0x9ce79ce7,0xa52994a5,0xb5ad8421,0x94a58c63,0x7bdfc631,0x8421a529,0x8c638c63,0x8c638421,0x7bdf7bdf,0x739d8c63,0x8c63739d,0x739d8c63,0x739d6b5b,0x8c638c63,0x7bdf8c63,0x7bdf7bdf,0x93539353,0xbc177a8f,0x7a8fbc17,0x9353bc17,0xbc1759cb,0x7a8fbc17,0x93539353,0x7a8f8421,0x93539353,0xbc177a8f,0x7a8fbc17,0x9353bc17,0xbc1759cb,0x7a8fbc17,0x93539353,0x7a8f8421, +0xb497bcd9,0xb497b497,0xbcd9bcd9,0x9c139c13,0x9c139c13,0xb497b497,0xb497b497,0x9c13b497,0xad6bce73,0xa529b5ad,0xb5ada529,0xa529b5ad,0xa5299ce7,0xb5adb5ad,0xad6bb5ad,0x8421ad6b,0xad6b8421,0xa529b5ad,0xb5ada529,0xa529b5ad,0xa5299ce7,0xb5adb5ad,0xad6bb5ad,0x8421ad6b,0x79cb8a0d,0xdef78a0b,0x79cb9a4d,0x79cb5949,0x820b6989,0xd6b579cb,0x79cb9a4d,0x79cb820b, +0xad6bad6b,0xad6bce73,0xce73ad6b,0xad6bad6b,0xce73ad6b,0xad6bad6b,0xad6bce73,0xad6bad6b,0x8c63da07,0x91458c63,0x0001da07,0x00010001,0x8c630001,0x91455295,0x8c630001,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x00000000,0x0000ffff,0xffff0000,0xffff0000,0x00000000,0x0000ffff,0x0000ffff,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x5a0d0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf7c10000,0xb5c1f7c1,0x8c818c81,0x0000ce81,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x4e490000,0x59810301,0x4e490000,0x59810301,0x4e495981,0x00000301,0x03010301, +0xad6b8421,0xa5298421,0x842194a5,0x8c6394a5,0x94a594a5,0x7bdf8c63,0x7bdf7bdf,0x8c637bdf,0x7bdf6b5b,0x7bdf7bdf,0x7bdf739d,0x7bdf7bdf,0x8c638c63,0x7bdf7bdf,0x8c637bdf,0x6b5b8c63,0x7a8f9353,0x93537a8f,0xbc179353,0x93537a8f,0x93536b5b,0x7a8f9353,0x935359cb,0x59cb7a8f,0x7a8f9353,0x93537a8f,0xbc179353,0x93537a8f,0x93536b5b,0x7a8f9353,0x935359cb,0x59cb7a8f, +0x6a8d72cf,0x72cf72cf,0x6a8d6a8d,0x72cf6a8d,0x72cf72cf,0x72cf72cf,0x6a8d6a8d,0x72cf6a8d,0xad6bc631,0xad6bad6b,0xad6ba529,0xad6bad6b,0xb5adb5ad,0xad6bad6b,0xb5adad6b,0x7bdfb5ad,0xad6b7bdf,0xad6bad6b,0xad6ba529,0xad6bad6b,0xb5adb5ad,0xad6bad6b,0xb5adad6b,0x7bdfb5ad,0xb5adb5ad,0xd6b5ad6b,0xb5adb5ad,0xb5adb5ad,0xb5adb5ad,0xdef7b5ad,0xbdefb5ad,0xb5adb5ad, +0xa185b1c5,0x79038945,0xa185b1c5,0x79038945,0xa185b1c5,0x79038945,0xa185b1c5,0x79038945,0x9145a985,0x91459145,0x91450001,0x91450001,0x52950001,0x00019145,0x91455295,0x91459145,0x9145a985,0x91459145,0x9145a985,0x91459145,0x9145a985,0x91459145,0x9145a985,0x91459145,0x00000000,0xffff0000,0xffffffff,0xffff0000,0xffff0000,0xffffffff,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x14015a0d,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x14010000,0x00001401,0x00000000,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x03014e49,0x03010301,0x03010000,0x930b0301,0x00005981,0x00000000,0x03010000, +0x94a5bdef,0x8c638421,0x94a59ce7,0x7bdf8421,0x94a56319,0x7bdf8c63,0xa5299ce7,0x84217bdf,0x739d7bdf,0x739d739d,0x739d739d,0x739d739d,0x8c638c63,0x739d739d,0x739d739d,0x7bdf739d,0x59cb7a8f,0x7a8f9353,0x93539353,0x7a8fbc17,0x7a8f7a8f,0x7a8f7a8f,0x7a8f7a8f,0xbc17bc17,0x59cb7a8f,0x7a8f9353,0x93539353,0x7a8fbc17,0x7a8f7a8f,0x7a8f7a8f,0x7a8f7a8f,0xbc17bc17, +0xbcd9bcd9,0xbcd9bcd9,0x9c13bcd9,0x9c13bcd9,0x9c139c13,0x9c139c13,0x72cfb497,0xbcd9bcd9,0xa529ce73,0xa529a529,0xa529a529,0xa529a529,0xb5adb5ad,0xa529a529,0xa529a529,0x8421a529,0xa5298421,0xa529a529,0xa529a529,0xa529a529,0xb5adb5ad,0xa529a529,0xa529a529,0x8421a529,0xa24f9a4f,0x9a4daa8f,0x9a4d9a4d,0xce73924d,0xb2d1924d,0x9a4d9a4d,0x9a4d9a4d,0xe7399a4f, +0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xda07da07,0x5295da07,0xda07da07,0xa9855295,0x00015295,0x52950001,0xda075295,0xa985da07,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0x00000000,0xffff0000,0x0000ffff,0xffffffff,0x0000ffff,0x00000000,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x13010000,0x00001401,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x14010000,0x14011301,0x00001301,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x03010301,0x03010000,0x59810000,0x4e49930b,0x00004e49,0x00000000,0x00000000, +0xad6bb5ad,0x739d739d,0x84217bdf,0xc6318421,0xc631a529,0x9ce7ad6b,0x8c63a529,0xad6bad6b,0x8c637bdf,0x8c63739d,0x7bdf6b5b,0x739d7bdf,0x739d739d,0x739d6b5b,0x7bdf7bdf,0x8c638c63,0x93537a8f,0x7a8f7a8f,0x7a8f72d1,0x93539353,0x59cb7a8f,0x59cbbc17,0xbc177a8f,0x93539353,0x93537a8f,0x7a8f7a8f,0x7a8f59cb,0x93539353,0x59cb7a8f,0x59cbbc17,0xbc177a8f,0x93539353, +0x9c13b497,0xbcd972cf,0xbcd9bcd9,0x9c13bcd9,0xb497bcd9,0x9c13b497,0x9c139c13,0xb4979c13,0xb5adce73,0xb5ada529,0xad6b9ce7,0xa529ad6b,0xa529a529,0xa5299ce7,0xad6bad6b,0x94a5b5ad,0xb5ad8421,0xb5ada529,0xad6b9ce7,0xa529ad6b,0xa529a529,0xa5299ce7,0xad6bad6b,0x94a5b5ad,0x79cb9a4d,0x79cb79cb,0x79cb79cb,0xce736189,0x79cb9a4d,0x79cb79cb,0x79cb79cb,0xd6b581cb, +0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0x8c63da07,0x91455295,0x8c63da07,0x91458c63,0x5295da07,0x91458c63,0x5295da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x00000000,0x0000ffff,0xffff0000,0x0000ffff,0x00000000,0xffffffff,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x5a0d1401,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x13010000,0x14011401,0x13011301,0x00000000,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x00000000,0x00000000,0x930b0000,0x5981930b,0x00000301,0x00000000,0x00000000, +0xa529a529,0x7bdf8c63,0xad6bb5ad,0x94a594a5,0x94a57bdf,0x842194a5,0x9ce7ad6b,0xa5298c63,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x739d739d,0x7bdf7bdf,0x8c638c63,0x739d7bdf,0x7bdf739d,0x7a8f9353,0xbc1759cb,0x59cb7a8f,0x59cb7a8f,0x7a8f7a8f,0x59cb7a8f,0x7a8f7a8f,0x93539353,0x7a8f9353,0xbc1759cb,0x59cb7a8f,0x59cb7a8f,0x7a8f7a8f,0x59cb7a8f,0x7a8f7a8f,0x93539353, +0xbcd9bcd9,0x9c139c13,0xbcd99c13,0x9c13bcd9,0xbcd9bcd9,0xb4979c13,0xbcd9bcd9,0xbcd9bcd9,0xad6bce73,0xa529ad6b,0xa529a529,0xa529a529,0xad6bad6b,0xb5adb5ad,0xa529ad6b,0x8421a529,0xad6b8421,0xa529ad6b,0xa529a529,0xa529a529,0xad6bad6b,0xb5adb5ad,0xa529ad6b,0x8421a529,0x51479a4d,0x79cb820b,0x79cb79cb,0xd6b579cb,0x79cb9a4d,0x79cb79cb,0x79cb820b,0xd6b581cb, +0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0xffff0000,0x00000000,0x00000000,0xffffffff,0xffffffff,0x00000000,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x5a0d0000,0x00001301,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x14011301,0x00001301,0x00000000,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x00000000,0x00000000,0x930b0000,0x5981930b,0x00000000,0x00000000,0x00000000, +0x94a58421,0x739d8c63,0x9ce7a529,0xbdef94a5,0xbdef8c63,0x84217bdf,0x94a58421,0x9ce78c63,0x739d739d,0x739d739d,0x8c636b5b,0x7bdf8c63,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x7bdf7bdf,0x7a8f9353,0x9353bc17,0x7a8f9353,0x93538421,0x93539353,0x7a8f7a8f,0x93539353,0x59cb7a8f,0x7a8f9353,0x9353bc17,0x7a8f9353,0x93538421,0x93539353,0x7a8f7a8f,0x93539353,0x59cb7a8f, +0x72cf72cf,0x7b0f72cf,0x6a8d6a8d,0x6a8d7b0f,0x72cf72cf,0x6a8d72cf,0x6a8d49c9,0x72cf6a8d,0x8421a529,0x84218421,0x94a57bdf,0x842194a5,0x84218421,0x84218421,0x84218421,0x84218421,0x84218421,0x84218421,0x94a57bdf,0x842194a5,0x84218421,0x84218421,0x84218421,0x84218421,0xb5adb5ad,0xb5adad6b,0xb5adb5ad,0xd6b5b5ad,0xb5adbdef,0xb5adb5ad,0xb5adbdef,0xce73b5ad, +0xb185c1c5,0x9145a185,0xb185c1c5,0x9145a185,0xb185c1c5,0x9145a185,0xb185c1c5,0x9145a185,0x9145a985,0x91459145,0x9145a985,0x91459145,0x9145a985,0x91459145,0x9145a985,0x91459145,0x9145a985,0x91459145,0x9145a985,0x91459145,0x9145a985,0x91459145,0x9145a985,0x91459145,0x0000ffff,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0xffff0000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00001301,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x14010000,0x00001301,0x00000000,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x00000000,0x00000000,0x59810000,0x5981930b,0x00000000,0x00000000,0x00000000, +0xb5adb5ad,0xa529b5ad,0x7bdf94a5,0x5ad76319,0xb5ad5ad7,0xb5adb5ad,0x5ad78421,0x8c63b5ad,0x318d5295,0x318d318d,0x5295318d,0x94a594a5,0x94a50001,0x318d5295,0x318d318d,0x5295318d,0xdea99c97,0xdea7dea7,0xdea7d6a5,0xdea7d665,0xdea9e6e9,0xd6a7dea7,0xd665d665,0xdea7ce23,0xbdef5a93,0x9c216ad9,0x94239c21,0x6ad99c23,0x6ad97bdf,0x9c639c63,0xa4e58c1f,0x9c21735b, +0x6a8d41c9,0x9bd36a8d,0x6acd3987,0x41899391,0x6a8d628d,0x7b0f628d,0x7b0f6acd,0x9bd36a8d,0x6a8d6a8d,0x6a8d3947,0x628d6a8d,0x39473947,0x6a8d3947,0x39476a8d,0x6a8d6acf,0x6acd6a8d,0xa529ad6b,0xbdefad6b,0xd6b5c631,0xd6b5d6b5,0xd6b5d6b5,0xdef7d6b5,0xdef7def7,0xe739def7,0xc407c449,0xd509cc87,0xe64fddcb,0xee4fee8f,0xee0fee4d,0xee91ee91,0xeed3eed3,0xff17f6d5, +0x041d041d,0x04e3045f,0x05ed0569,0x05ed062f,0x05ed05ed,0x062f062f,0x1e710e71,0x46b51e71,0x31492907,0x31493149,0x31893149,0x31893189,0x31893149,0x31893189,0x31893189,0x29073189,0x41cb41cd,0x41cb41cb,0x41cd41cb,0x41cd41cd,0x41cd41cb,0x41cd41cd,0x41cd41cd,0x314941cd,0x41cb41cd,0x41cb41cb,0x41cd41cb,0x41cd41cd,0x41cd41cb,0x41cd41cd,0x41cd41cd,0x314941cd, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xb5adb5ad,0x7bdf6b5b,0x5ad7294b,0xb5adb5ad,0x7bdf5ad7,0x7bdf8c63,0x39cf94a5,0x9ce76b5b,0x52955295,0x94a594a5,0x94a594a5,0x94a594a5,0x94a5318d,0x94a594a5,0x52950001,0x318d5295,0xdea7dea9,0xe6ede6ab,0xd665bda3,0xd665d665,0xe6ebc5e1,0xdea7fff7,0xdea7d665,0xef2bd6a7,0x9c218bdd,0xbd6b9c21,0xa4e98be1,0x6ad99ca7,0xb56bb56b,0x94636b17,0xa4e55253,0x9c63835d, +0x628b3987,0x39476acf,0x9bd33987,0x628d4189,0x39879bd3,0x9bd36a8d,0x7b0f49c9,0x939149c9,0xb4976a8d,0xb497b455,0xb497b497,0xb497b497,0xb455ac55,0xb497b497,0xbc99bc97,0x624bb497,0xef7bd6b5,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xd6b5ef7b,0xff59e651,0xff57ff57,0xff97ff97,0xff97ff95,0xff97ff97,0xff95ff97,0xff95ff95,0xee4fff93, +0x66f705ed,0x6f3766f7,0x87398739,0x87398739,0x7f377f37,0x87398739,0x7f377f37,0x05ed7737,0x830b3189,0x9309930b,0x930b930b,0x7ac97ac9,0x7ac97ac9,0x930b7ac9,0x930b7ac9,0x3149830b,0xabcb41cd,0xa347a389,0xa389a389,0x8b478b47,0x8b478b47,0xa3898b47,0xa3898b47,0x2907abcb,0xabcb41cd,0xa347a389,0xa389a389,0x8b478b47,0x8b478b47,0xa3898b47,0xa3898b47,0x2907abcb, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x7bdf5ad7,0x294b7bdf,0xb5ad5ad7,0x8421b5ad,0x2109318d,0x7bdf8c63,0x5ad739cf,0x84215ad7,0x00015295,0x318d318d,0x318d0001,0x318d318d,0x318d94a5,0x52955295,0x94a55295,0x52955295,0xef2de6ab,0xd667ff71,0xd6a7dea7,0xdea7dea7,0xe6e9dea7,0xeeede6eb,0xce65c623,0xff71d665,0x731b8b9b,0xb5296ad9,0x8c21b529,0x83dfbdad,0x52516ad9,0xc5ef6b5b,0x839bc5ef,0x6ad96ad9, +0x5a4b3947,0x4189624b,0x9bd36a8d,0x628d3987,0x39479bd3,0x7b0f628d,0x7b0f49c9,0x9bd349c9,0xb4973947,0x9c139c13,0x93d19c13,0x9c139c13,0x9c13a455,0x9c139c13,0xa4159c13,0x6a8db497,0xef7bd6b5,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xd6b5e739,0xffd9ee91,0xffd5ffd7,0xffd5ffd5,0xffd5ffd5,0xffd7ffd7,0xffd3ffd5,0xff91ff93,0xee4bff8f, +0x8f39062f,0x8f398f39,0x8f399779,0x8f398f39,0x87398739,0x87398f39,0x6ef77f37,0x05ed5ef5,0x934b3189,0x8b478b47,0x8b478b47,0xa389a389,0xabcbabcb,0xa389abcb,0xabcba347,0x3149934b,0xabcb41cd,0x8b478b47,0x8b478b47,0xa389a389,0xabcbabcb,0xa389abcb,0xabcba347,0x2907abcb,0xabcb41cd,0x8b478b47,0x8b478b47,0x82c7a389,0xabcb8b09,0xa389abcb,0xabcba347,0x2907abcb, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x0000fb41,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb410000, +0x4a53739d,0x5ad7318d,0x6319bdef,0x7bdf94a5,0x5ad739cf,0x39cf39cf,0xad6b5ad7,0x5ad7b5ad,0x94a55295,0x52955295,0x00015295,0x94a55295,0x52955295,0x318d318d,0x318d318d,0x5295318d,0xd667ce23,0xdea9dea7,0xdee9d665,0xce65d665,0xd665d665,0xe6e9dea7,0xdea7dea7,0xbde1dea7,0x7bdf8c21,0xb52bbdef,0x9c219c61,0x6ad983df,0x8c638c63,0x735b9ca3,0x735b735b,0xa4a5b529, +0x41c96acd,0x4189624b,0x7b0f7b0f,0x6a8d3987,0x39479bd3,0x9bd36a8d,0x9bd33987,0x7b0f4189,0xb4976a8d,0xb497a455,0xbcd9bcd9,0xbcd9bcd9,0xbc97bcd9,0xbc97bcd9,0x9c13bcd9,0x3947b497,0xef7bd6b5,0xef7bef7b,0xef7bef7b,0xf7bdf7bd,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xd6b5ef7b,0xffd5ee91,0xffd5ffd5,0xffd5ffd5,0xffd5ffd5,0xffd7ffd7,0xffd3ffd3,0xffd1ff91,0xee4dffd1, +0x9779062f,0x8f399779,0x97798f39,0x97799f79,0x87399779,0x87398739,0x7f377f37,0x05ed7f37,0x8b093149,0xa347a349,0xa347a347,0xa347a347,0xa347a347,0xa349a349,0xa349a349,0x31499309,0xa34941cd,0xa347a349,0xa347a347,0xa347a347,0xa347a347,0xa349a349,0xa349a349,0x2907a347,0xa34941cd,0xa347a349,0xa347a347,0xce738ac7,0x8ac7a529,0xa349a349,0xa349a349,0x2907a347, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x0000fb41,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb410000, +0xb5adb5ad,0x5ad75ad7,0x8421b5ad,0x39cf8421,0xa5295ad7,0x9ce79ce7,0x7bdf5295,0x5ad7ad6b,0x94a55295,0x318d94a5,0x318d318d,0x318d318d,0x318d318d,0x94a594a5,0x94a594a5,0x000194a5,0xd665e6e9,0xd665eeed,0xeeedeeed,0xeeede6eb,0xce25e6eb,0xe6ebd665,0xc5e1d667,0xce23dee9,0xa4e56ad9,0x52515251,0x5a959ca5,0x6ad9739d,0x735994a7,0xad2962d5,0x8c219c63,0x9461a529, +0x41896a8d,0x628d6a8d,0x7b0f7b0f,0x628d6a8d,0x41896acf,0x9bd36a8d,0x9bd33987,0x7b0f3947,0xb45749c9,0xbcd99c13,0xbc97b497,0xb497b497,0xb497b497,0xbc97b497,0x9c13bcd9,0x6a8db497,0xf7bdd6b5,0xef7bef7b,0xf7bdef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xd6b5ef7b,0xffd5ee91,0xffd5ffd5,0xffd3ffd3,0xffd5ffd3,0xffd7ffd5,0xff91ffd3,0xff91ff91,0xee8fff91, +0x9779062f,0x97798f39,0x97798739,0x97799779,0x97799779,0x7f378739,0x77377f37,0x062f7737,0x7ac93189,0x8b478b47,0xabcb8b47,0x8b47abcb,0x8b47abcb,0xa3478b47,0xa389a389,0x3189930b,0x7ac941cd,0x7ac97ac9,0x934b7ac9,0x7ac9934b,0x7ac9934b,0x93097ac9,0x930b930b,0x2907930b,0x7ac941cd,0x7ac97ac9,0x934b7ac9,0xc6317ac9,0x51c58421,0x93097ac9,0x930b930b,0x2907930b, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x0000fb41,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb410000, +0x8421739d,0x5ad77bdf,0x8c637bdf,0x318d7bdf,0xc631ad6b,0x8c637bdf,0x5ad76319,0x39cf294b,0x318d318d,0x52955295,0x318d5295,0x318d318d,0x00015295,0x52955295,0x318d318d,0x52950001,0xdee9ce23,0xfffdce65,0xef2bd665,0xdea9dea9,0xf76dd6a7,0xc5e1dea7,0xd665ce65,0xc5e1dea7,0xbdad9ca5,0xa4e77b5d,0xad2b7be1,0x4a118b9d,0x73174a53,0xbdad8bdf,0x5a95c5f1,0x4a116b59, +0x5a4b6a8d,0x628d6a8d,0x6a8d9bd3,0x6a8d628d,0x39876a8d,0x8b516a8d,0x7b0f3987,0x628d4189,0xb4973947,0xbcd99c13,0x9c13b497,0xa455a455,0x9c139c13,0xb4979c13,0x9c13bc97,0x6a8db497,0xf7bdd6b5,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xd6b5ef7b,0xffd7ee91,0xff91ffd5,0xffd3ff91,0xffd3ffd3,0xffd5ffd5,0xffd3ffd3,0xffd3ffd3,0xee8fffd3, +0x9f79062f,0x6ef79779,0x87396ef7,0x87398739,0x87398739,0x87398739,0x7f378739,0x062f7f37,0x7ac93149,0xa389a347,0xa389a389,0x8b47abcb,0xa389a389,0xa389a389,0x8b478b47,0x31497ac9,0x314941cb,0x31893149,0x31893189,0x31493189,0x31893189,0x31893189,0x31493149,0x18c53149,0x314941cb,0x31893149,0x31893189,0xa5292907,0x2907739d,0x31893189,0x31493149,0x18c53149, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x0000fb41,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf8010000, +0x7bdf7bdf,0x5ad77bdf,0x39cf6b5b,0x631939cf,0x8c636319,0x7bdfa529,0x7bdf739d,0x52957bdf,0x94a594a5,0x63195295,0x318d5295,0x94a594a5,0x52955295,0x52955295,0x94a594a5,0x000194a5,0xdeabbd9f,0xdea7cde5,0xe6e9bde1,0xd665dea7,0xd6a7d667,0xffb3eeed,0xe6ebdea7,0xde69dea9,0xaca5a4e7,0x94637bdf,0xa4a79c63,0xb52983e1,0x735b9ca3,0x4a118bdf,0x8c234a11,0x6ad98c23, +0x7b0f6a8d,0x6a8d49c9,0x624b9393,0x39476a8d,0x39479391,0x5a0b7b0f,0x7b0f3145,0x6acf3987,0xb4973947,0xbc999c13,0x9c13b497,0xbc99bc99,0xbcd9bcd9,0xb4979c13,0x9c13bc97,0x3947b497,0xef7bd6b5,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xd6b5ef7b,0xffd7e691,0xffd3ffd5,0xff91ffd3,0xffd3ffd3,0xffd3ffd3,0xffd3ffd3,0xffd1ffd3,0xee4dff91, +0x9779062f,0x87398739,0x77378739,0x87398739,0x87398739,0x87398739,0x7f378739,0x062d6f37,0x934b3189,0xa389abcb,0xabcbabcb,0x8b47abcb,0x8b478b47,0xabcba347,0xabcbabcb,0x3189934b,0x72cd41cd,0x728b72cd,0x72cd72cd,0x6a8b72cd,0x6a8b6a8b,0x72cd728b,0x72cd72cd,0x290772cd,0x72cd41cd,0x728b72cd,0x72cd72cd,0x94a56249,0x4187739d,0x72cd728b,0x72cd72cd,0x290772cd, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x0000fb41,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf801fb41, +0x7bdf7bdf,0x5295318d,0xb5adad6b,0x52955ad7,0x4a535ad7,0x8c63318d,0x39cf7bdf,0xc6316319,0x52955295,0x318d5295,0x318d318d,0x318d318d,0x0001318d,0x318d318d,0x318d318d,0x52955295,0xd6a7dea7,0xdea7e6eb,0xd665dea7,0xffafe6eb,0xd627dea9,0xd665d6a7,0xe6abdee9,0xe6ebd665,0x6ad96ad9,0xbdadbdad,0x8c63ad29,0x4a519c63,0xa4616ad9,0x6ad98c21,0x6b5b83df,0x735d7be1, +0x9bd36a8d,0x6a8d3987,0x39879bd3,0x41899bd3,0x39479bd3,0x49c97b0f,0x7b0f628d,0x6acf3987,0xb4973947,0xcd1b9c13,0x9c13b497,0xb497bcd9,0xbc99b497,0xac55a413,0x9c13bcd9,0x72cfb497,0xf7bdd6b5,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xd6b5e739,0xffd9ee8f,0xffd3ffd7,0xff91ff91,0xff91ff91,0xff91ff91,0xffd1ff91,0xff91ffd1,0xee4dff8f, +0x9f79062f,0x87398f39,0x6ef76ef7,0x6ef76ef7,0x6f376ef7,0x7f377737,0x77378739,0x05ed5ef5,0x93093149,0xa349a349,0xa349a349,0xa347a349,0xa347a347,0xa349a349,0xa349a349,0x31499309,0x930941cb,0x8b098b09,0x8b098b09,0x93098b09,0x93099309,0x8b098b09,0x8b098b09,0x290782c9,0x930941cb,0x8b098b09,0x8b098b09,0x62057247,0x72876205,0x8b098b09,0x8b098b09,0x290782c9, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb41f801,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf801fb41, +0x21097bdf,0xbdef5ad7,0x7bdfb5ad,0xb5ad6b5b,0x7bdfad6b,0x4a535ad7,0x210939cf,0xb5adc631,0x94a55295,0x000194a5,0x318d94a5,0x52955295,0x94a55295,0x94a594a5,0x94a594a5,0x94a594a5,0xdeabe6e9,0xe6ebef2d,0xd665e6ab,0xdeabeeed,0xfff5f72f,0xdea7c5e1,0xde69d667,0xdea7d665,0x52956b5b,0x52515251,0x94219461,0x83dfad27,0x62d79ce7,0x94236ad9,0x6ad9b569,0x5b199c63, +0x9bd36a8d,0x72cf3987,0x41899391,0x41896a8d,0x41896a8d,0x39479391,0x6a8d6a8d,0x7b0f3987,0xb4976a8d,0xbcd9ac97,0x9c13b497,0xb497bc99,0xbcd9b497,0xb4979c13,0x9c13bcd9,0x6a8dbc97,0xf7bdd6b5,0xef7bf7bd,0xef7bf7bd,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xe739ef7b,0xce73e739,0xffd9ee91,0xffd3ffd9,0xff91ffdb,0xff91ff91,0xff91ff91,0xff91ff91,0xff4fff91,0xee4bf74d, +0x9779062f,0x8739a77b,0x6ef7a77b,0x6ef76ef7,0x6ef76ef7,0x6ef76ef7,0x56f56ef7,0x05ed3eb3,0x934b3189,0xabcbabcb,0xa347abcb,0xabcb8b47,0xa389abcb,0xa389a389,0xabcbabcb,0x3149934b,0xabcb41cd,0xabcbabcb,0xa347abcb,0xabcb8b47,0xa389abcb,0xa389a389,0xabcbabcb,0x2907934b,0xabcb41cd,0xabcbabcb,0xa347abcb,0xabcb8b47,0xa389abcb,0xa389a389,0xabcbabcb,0x2907934b, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb41f801,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf801fb41, +0x5ad78c63,0xb5adb5ad,0x39cf8c63,0x6b5bb5ad,0x94a5bdef,0x5ad794a5,0xc6315ad7,0x7bdf7bdf,0x318d5295,0x318d318d,0x318d318d,0x5295318d,0x52950001,0x318d5295,0x318d318d,0x529594a5,0xb55dc5e1,0xdea7e6eb,0xdea9dea7,0xd665e6eb,0xdea7dea7,0xef6ddea7,0xe6abdea7,0xef2bc5e1,0x6ad99423,0xa529a529,0x6ad983dd,0xc5f1c5f1,0x83df4a11,0x7317bdef,0x9c63839d,0x4a116b5b, +0x9bd36a8d,0x628d41c9,0x93916acd,0x6a8d4189,0x39476a8d,0x41899391,0x93916a8d,0x7b0f4189,0xb4976a8d,0xbcd99c13,0x9bd3b457,0xbcd9bcd9,0xbcd9bcd9,0xb4979c13,0x9c13bcd9,0x6a8db497,0xf7bdd6b5,0xef7bf7bd,0xf7bdf7bd,0xf7bdef7b,0xf7bdf7bd,0xf7bdf7bd,0xef7bf7bd,0xd6b5ef7b,0xffdbee93,0xffd3ffdb,0xffd9ffd9,0xffd7ffd7,0xffd7ffd7,0xffd5ffd7,0xffd5ffd5,0xee4fff93, +0x9779062f,0x8739a77b,0x97799779,0x97799779,0x97799779,0x9f799f79,0x8f399779,0x062d8739,0x7ac93149,0x8b478b47,0xabcb8b47,0xa389a389,0x8b478b47,0xa3478b47,0x8b47abcb,0x31497ac9,0x8b4741cb,0x8b478b47,0xabcb8b47,0xa389a389,0x8b478b47,0xa3478b47,0x8b47abcb,0x29077ac9,0x8b4741cb,0x8b478b47,0xabcb8b47,0xa389a389,0x8b478b47,0xa3478b47,0x8b47abcb,0x29077ac9, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb41f801,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf801fb41, +0xa5295ad7,0x7bdf7bdf,0x318d7bdf,0x94a5b5ad,0x7bdf7bdf,0x39cf8421,0x5ad75ad7,0x84219ce7,0x52955295,0x318d94a5,0x94a5318d,0x318d94a5,0x318d0001,0x94a594a5,0x529594a5,0x52955295,0xe6abdee9,0xe6ebad1b,0xef2dc623,0xde69d6a7,0xf76df72f,0xd665e72b,0xd6a7dea7,0xdea7d6a5,0xb56b6ad9,0x4a11b56b,0x5a51ac63,0x735b6317,0x735b9463,0x94216ad9,0x7b9b83df,0x62d7bdef, +0x7b0f41c9,0x6a8d4189,0x9391628d,0x624b3947,0x5a4b3987,0x41899bd5,0x9bd36a8d,0x93914189,0xb455628d,0xb4979c13,0x9c13b497,0x9c139c13,0x9c139c13,0xbc979c13,0x9c13bcd9,0x6a8db497,0xf7bdd6b5,0xf7bdf7bd,0xf7bdf7bd,0xf7bdf7bd,0xf7bdf7bd,0xf7bdf7bd,0xef7bf7bd,0xce73ef7b,0xffddee93,0xffddffdd,0xffdbffdb,0xffd9ffdb,0xffd9ffd9,0xffd7ffd7,0xff95ffd7,0xee0dff53, +0xa77b062f,0xaf7baf7b,0xa77ba77b,0xa77ba77b,0xa77ba77b,0xa77b9f79,0x87399f79,0x05eb66f7,0x930b3189,0xa389a389,0xabcbabcb,0x8b478b47,0x8b478b47,0xa389a389,0xa389a389,0x3149930b,0xa38941cd,0xa389a389,0xabcbabcb,0x8b478b47,0x8b478b47,0xa389a389,0xa389a389,0x2907930b,0xa38941cd,0xa389a389,0xabcbabcb,0x8b478b47,0x8b478b47,0xa389a389,0xa389a389,0x2907930b, +0x00000000,0x00000000,0x00000000,0xf94bf94b,0xe085f94b,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xccdfccdf,0x9355ccdf,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb41f801,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf801fb41, +0x5ad75ad7,0x7bdfa529,0x39cf6b5b,0x84217bdf,0x7bdf94a5,0x529539cf,0x5ad7ad6b,0x39cf5ad7,0x52950001,0x52955295,0x5295318d,0x52955295,0x94a594a5,0x52955295,0x94a55295,0x000194a5,0xe6ebce25,0xcde5e6e9,0xd667dea9,0xdea7dea7,0xdea7dea9,0xfff1dea7,0xd665d665,0xbd9fd665,0xb56b6ad9,0x6ad5b529,0x8c637317,0x5295739d,0x5253a4e7,0x5253ad2b,0x6ad96ad5,0x94617bdf, +0x7b0f3987,0x628d3987,0x9bd36acf,0x9bd34189,0x5a4b3947,0x39879bd3,0x93936a8d,0x9bd33947,0xb4573947,0xbcd99c13,0xb497b457,0xb457b497,0xb497b497,0xbc97b497,0xa455bcd9,0x628bb497,0xf7bddef7,0xf7bdf7bd,0xf7bdf7bd,0xf7bdf7bd,0xf7bdf7bd,0xef7bf7bd,0xe739e739,0xce73def7,0xffdfee95,0xffddffdf,0xffddffdd,0xffdbffdd,0xffdbffdb,0xff97ffd9,0xff11ff53,0xe5cbfed1, +0xaf7b062f,0xaf7baf7b,0xaf7baf7b,0xa77baf7b,0x9f79a77b,0x87399f79,0x3eb35ef5,0x05a926b3,0x8b093149,0xa347a347,0xa349a349,0xa347a349,0xa347a347,0xa347a347,0xa349a349,0x31498b09,0xa34941cb,0xa347a347,0xa349a349,0xa347a349,0xa347a347,0xa347a347,0xa349a349,0x29078b09,0xa34941cb,0xa347a347,0xa349a349,0xa347a349,0xa347a347,0xa347a347,0xa349a349,0x29078b09, +0x00000000,0x00000000,0xf94b0000,0xe085ffff,0xc0c9e085,0x00009887,0x00000000,0x00000000,0x00000000,0x00000000,0xccdf0000,0x9355ccdf,0x93559355,0x00007291,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf801f801,0x0000fb41,0x00000000,0x00000000,0x00000000,0x00000000,0xfb410000,0xf801f801, +0xb5adb5ad,0x39cf39cf,0x39cf39cf,0x7bdf6319,0x318d4211,0x9ce7b5ad,0x7bdf7bdf,0x5ad75ad7,0x318d5295,0x318d318d,0x318d318d,0x318d318d,0x94a594a5,0x318d318d,0x318d318d,0x5295318d,0xdea9ef2d,0xef2dd665,0xd665dee9,0xbd9fe6e9,0xdea7c5e3,0xd665dea7,0xe6ebe6ab,0xd667d665,0xa4a5b569,0x5a559463,0xb56bb56b,0x83dface9,0x9ce7ad29,0xa52983df,0x5293a4e5,0x8c1f83dd, +0x9bd33947,0x628d3947,0x9bd36a8d,0x6a8d3947,0x628b3987,0x39479393,0x624b6a8d,0x9bd34189,0xb4973947,0xbcd99c13,0xb497bcd9,0xbcd9bc99,0xbcd9bcd9,0xbcd9bcd9,0x9c13bc99,0x3947b497,0xf7bddef7,0xf7bdf7bd,0xf7bdf7bd,0xf7bdf7bd,0xef7bf7bd,0xe739ef7b,0xdef7def7,0xce73def7,0xffddee95,0xffddffdd,0xffddffdd,0xffdbffdb,0xffd9ffdb,0xff53ff95,0xf68ff6cf,0xedcbf68d, +0xaf7b062f,0xa77ba77b,0xaf7ba77b,0xa77baf7b,0x8f399779,0x56f57f37,0x06711e71,0x05a9066f,0x934b3189,0xabcbabcb,0x8b47abcb,0x8b47abcb,0x8b478b47,0x8b478b47,0xa347a389,0x3189934b,0xabcb41cd,0xabcbabcb,0x8b47abcb,0x8b47abcb,0x8b478b47,0x8b478b47,0xa347a389,0x2907934b,0xabcb41cd,0xabcbabcb,0x8b47abcb,0x8b47abcb,0x8b478b47,0x8b478b47,0xa347a389,0x2907934b, +0x00000000,0x00000000,0xe085f94b,0xe085e085,0xce73e085,0x98879887,0x00000000,0x00000000,0x00000000,0x00000000,0x93550000,0x93559355,0x72919355,0x00007291,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb41f801,0x0000f801,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf801fb41, +0x7bdfbdef,0xb5ad739d,0xb5adad6b,0x39cf5ad7,0xce736319,0x7bdfa529,0x7bdf94a5,0x318d8c63,0x94a55295,0x94a5318d,0x52950001,0x318d5295,0x318d318d,0x318d0001,0x52955295,0x94a594a5,0xe6ebfff5,0xb55dce23,0xd665d665,0xf76fd665,0xf76fe6ab,0xdee9e6eb,0xd6a7e6e9,0xd667e6eb,0x9ca3b569,0xb569bdad,0x83dfa4e7,0xad2b94a5,0x83dd8c21,0x94219ca5,0xb4e75a95,0x5a53b5ad, +0x6acd4189,0x6a8d5a4b,0x7b0f6a8d,0x6acf49c9,0x624b6acd,0x3987628d,0x93916a8d,0x39479bd3,0xb4973947,0x9c139bd1,0x9c13a455,0x9c139c13,0xa4139bd3,0xa4559c13,0xa455a455,0x3947b457,0xf7bddef7,0xef7bf7bd,0xf7bdf7bd,0xf7bdf7bd,0xef7bef7b,0xe739e739,0xdef7def7,0xce73def7,0xffd9ee93,0xffd9ffd9,0xffd9ffd9,0xffd9ffd9,0xff97ffd7,0xff0fff11,0xfecffecf,0xedcbfe8d, +0xa77b062f,0x97799779,0xa77ba77b,0x9f79a77b,0x7f378f39,0x2eb346b5,0x0e711e71,0x05a90e71,0x7ac93189,0xabcba347,0xabcbabcb,0x8b47abcb,0xa389abcb,0x8b47a389,0x8b478b47,0x31897ac9,0x8b4741cd,0xabcba347,0xabcbabcb,0x8b47abcb,0xa389abcb,0x8b47a389,0x8b478b47,0x29077ac9,0x8b4741cd,0xabcba347,0xabcbabcb,0x8b47abcb,0xa389abcb,0x8b47a389,0x8b478b47,0x29077ac9, +0x00000000,0x00000000,0xe085ce73,0xce73c0c9,0x9887c0c9,0x94a59887,0x00000000,0x00000000,0x00000000,0x00000000,0x93550000,0x72917291,0x72917291,0x00007291,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb41f801,0x00000000,0x0000f801,0x0000fb41,0x00000000,0xfb410000,0x0000fb41,0xf801f801, +0x8c63739d,0xa5294211,0x7bdf8421,0x5ad77bdf,0x5ad75ad7,0x94a57bdf,0x94a58c63,0x39cf39cf,0x52955295,0x318d5295,0x318d318d,0x318d318d,0x52955295,0x94a594a5,0x318d5295,0x5295318d,0xde69e6ab,0xce65d667,0xd667dea9,0xe6e9dea7,0xdee9b55d,0xd6a7bd9f,0xcde5e6eb,0xe6abce65,0x7b9b9ca3,0x8bdf6b19,0x9ce76ad9,0x525383dd,0xb56bbdef,0xa4e58c1f,0x6ad583dd,0x839d7b59, +0x628d3947,0x41899393,0x7b0f6a8d,0x398749c9,0x6a8d9391,0x39479bd3,0x7b0f628b,0x628d3987,0xb49749c9,0xb497b497,0xb497b497,0xac55ac55,0xb497b497,0xb497ac15,0xb497b497,0x6a8db497,0xf7bdd6b5,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xdef7e739,0xd6b5d6b5,0xc631d6b5,0xffd5ee91,0xff95ffd5,0xffd5ff95,0xff95ff95,0xff95ff95,0xfe8dff11,0xf64bf68d,0xe58bf64b, +0x9779062f,0x7f378f39,0x87398739,0x7f378739,0x6f377f37,0x0e7136b3,0x062f062f,0x0567062d,0x830b3189,0x7ac97ac9,0x934b7ac9,0x7ac9934b,0x934b934b,0x930b7ac9,0x934b934b,0x3189830b,0x934b41cd,0x7ac97ac9,0x934b7ac9,0x7ac9934b,0x934b934b,0x930b7ac9,0x934b934b,0x2907830b,0x934b41cd,0x7ac97ac9,0x934b7ac9,0x7ac9934b,0x934b934b,0x930b7ac9,0x934b934b,0x2907830b, +0x00000000,0x00000000,0xc0c90000,0x98879887,0x98879887,0x00009887,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x6ad50000,0x00004a0f,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb41f801,0xfb41f801,0xfb41f801,0x0000f801,0xf8010000,0xf801fb41,0xfb41f801,0xf801f801, +0x739d7bdf,0x4a53739d,0x294b294b,0x5ad739cf,0x8421ad6b,0x5ad75295,0x4a534211,0x631939cf,0x318d318d,0x318d318d,0x94a50001,0x529594a5,0x52955295,0x318d5295,0x318d318d,0x52955295,0xe6e9d667,0xc5e1d6a7,0xdee9fff5,0xef2dc623,0xf72fdea7,0xd665d665,0xdea7d667,0xc623d6a7,0x94615251,0xa4a54a11,0x6ad99c63,0x94615253,0x52535253,0xa4a14a11,0x6ad9b529,0x9ce7b461, +0x6a8d5a4b,0x39877b0f,0x6a8d624b,0x41896a8d,0x6a8d6a8d,0x3145628d,0x6a8d628d,0x7b0f628b,0x6acf6a8d,0x6a8d3947,0x6a8d6a8d,0x6a8d3947,0x6a8d6a8d,0x6a8d6a8d,0x39473947,0x6a8d3947,0xef7bef7b,0xe739e739,0xdef7def7,0xd6b5def7,0xdef7d6b5,0xd6b5d6b5,0xd6b5d6b5,0xce73d6b5,0xff93ff93,0xff11ff51,0xfecffecf,0xf64df68d,0xfe8ff64d,0xfe4dfe4d,0xfe0dfe4d,0xfdcdfe0d, +0x6ef77f37,0x4ef55ef5,0x1e712eb3,0x062d062f,0x0671062f,0x062f062f,0x062f062f,0x05ed05ed,0x31492907,0x39493149,0x31493149,0x31493949,0x31493149,0x31493149,0x31493149,0x31493149,0x29072907,0x29072907,0x29072907,0x29072907,0x29072907,0x29072907,0x29072107,0x20c52907,0x29072907,0x29072907,0x29072907,0x29072907,0x29072907,0x29072907,0x29072107,0x20c52907, +0x00000000,0x00000000,0x00000000,0x7a110000,0x0000514b,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x6ad50000,0x00004a0f,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf801f801,0xf801f801,0xf801f801,0xf801f801,0xf801f801,0xf801f801,0xf801f801,0xf801f801, +0x739d7bdf,0x739d739d,0x7bdf739d,0x8c638c63,0x8c636b5b,0x739d7bdf,0x739d739d,0x7bdf739d,0x739d7bdf,0x739d739d,0x7bdf739d,0x8c638c63,0x8c636b5b,0x739d7bdf,0x739d739d,0x7bdf739d,0x739d7bdf,0x739d739d,0x7bdf739d,0x8c638c63,0x8c636b5b,0x739d7bdf,0x739d739d,0x7bdf739d,0xbcd9bcd9,0xb497bcd9,0xbcd9bcd9,0x9c13bcd9,0x9c139c13,0xbcd972cf,0xbcd9bcd9,0x9c13bcd9, +0xb5adb5ad,0xa529b5ad,0x7bdf94a5,0x1a072249,0xb5ad5ad7,0xb5adb5ad,0x5ad78421,0x8c63b5ad,0x10871087,0x08451087,0x10870845,0x08450845,0x08431087,0x10870845,0x10851089,0x10870843,0x311341d9,0x09a30003,0x315500a1,0x18893155,0x00051889,0x000309a3,0x18891889,0x18890003,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x41cb41cd,0x41cb41cb,0x41cd41cb,0x41cd41cd,0x41cd41cb,0x41cd41cd,0x41cd41cd,0x290741cd,0x41cb41cd,0x41cb41cb,0x41cd41cb,0x41cd41cd,0x41cd41cb,0x41cd41cd,0x41cd41cd,0x314941cd,0x18831883,0x18830841,0x18831883,0x08410841,0x18830841,0x08411883,0x18831883,0x18831883, +0x318d39cf,0x318d318d,0x294b318d,0x294b294b,0x39cf2109,0x318d39cf,0x2109294b,0x318d318d,0x318d39cf,0x318d318d,0x294b318d,0x294b294b,0x39cf2109,0x318d39cf,0x2109294b,0x318d318d,0x318d39cf,0x318d318d,0x294b318d,0x294b294b,0x39cf2109,0x318d39cf,0x2109294b,0x318d318d,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x7bdf7bdf,0x8c638c63,0x8c638c63,0x8c638c63,0x8c63739d,0x8c638c63,0x7bdf6b5b,0x739d7bdf,0x7bdf7bdf,0x8c638c63,0x8c638c63,0x8c638c63,0x8c63739d,0x8c638c63,0x7bdf6b5b,0x739d7bdf,0x7bdf7bdf,0x8c638c63,0x8c638c63,0x8c638c63,0x8c63739d,0x8c638c63,0x7bdf6b5b,0x739d7bdf,0x2905bcd9,0x20c520c5,0x20c520c5,0x5b837445,0x29052905,0x20c520c5,0x20c520c5,0x9c132905, +0xb5adb5ad,0x7bdf6b5b,0x1a07294b,0x3c4f3c4f,0x7bdf1a07,0x7bdf8c63,0x114594a5,0x9ce76b5b,0x10850845,0x08430843,0x10850843,0x10870847,0x31550843,0x10871087,0x08431087,0x10873995,0x311341d9,0x09e320cd,0x315500a1,0x18893155,0x31551889,0x31133155,0x00053113,0x31553155,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabcb41cd,0xa347a389,0xa389a389,0x8b478b47,0x8b478b47,0xa3898b47,0xa3898b47,0x8b478b47,0x8b478b47,0xa347a389,0xa389a389,0x8b478b47,0x8b478b47,0xa3898b47,0xa3898b47,0x2907abcb,0xb4971883,0x2905b455,0xab91ab91,0xab91ab91,0xab91ab51,0xab91ab91,0xbc992905,0x1883b497, +0x6b5b39cf,0x63195ad7,0x52954211,0x739d739d,0x63194a53,0x63196319,0x42115295,0x318d5295,0x6b5b39cf,0x63195ad7,0x52954211,0x739d739d,0x63194a53,0x63196319,0x42115295,0x318d5295,0x6b5b39cf,0x63195ad7,0x52954211,0x739d739d,0x63194a53,0x63196319,0x42115295,0x318d5295,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x6b5b7bdf,0x739d739d,0x739dff53,0x739d739d,0x739d8c63,0x7bdf7bdf,0xff53ffed,0x7bdf7bdf,0x6b5b7bdf,0x739d739d,0x739dbce1,0x739d739d,0x739d8c63,0x7bdf7bdf,0xbce1dd65,0x7bdf7bdf,0x6b5b7bdf,0x739d739d,0x739d318d,0x739d739d,0x739d8c63,0x7bdf7bdf,0x318d39cf,0x7bdf7bdf,0xb885bcd9,0x29059085,0x2a5f32e3,0x5b837445,0x31453145,0x74453145,0x39475b83,0x9c134187, +0x7bdf1a07,0x11057bdf,0x3c4f1a07,0x2b0bb5ad,0x08c3318d,0x7bdf8c63,0x1a071145,0x84211a07,0x08431087,0x39953955,0x08453995,0x08430845,0x18cb3995,0x08451087,0x39950843,0x108718cb,0x31130003,0x09a309e3,0x20cd20cd,0x18891889,0x18890003,0x20cd20cd,0x31553113,0x09e309e3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabcb41cd,0x8b478b47,0x8b478b47,0xa389a389,0xabcbabcb,0xa389abcb,0xabcba347,0x51c5a389,0xabcb51c5,0x8b478b47,0x8b478b47,0xa389a389,0xabcbabcb,0xa389abcb,0xabcba347,0x2907abcb,0xb4970841,0xa34f20c5,0x9b0fa34f,0xa34fa34f,0xa34fa391,0xa34fa34f,0x2105a34f,0x1883b497, +0x5295294b,0x52957bdf,0x8c636319,0x7bdf8c63,0x52956319,0x7bdf8421,0x7bdf5ad7,0x318d5295,0x5295294b,0x52957bdf,0x8c636319,0x7bdf8c63,0x52956319,0x7bdf8421,0x7bdf5ad7,0x318d5295,0x5295294b,0x52957bdf,0x5ad76319,0x7bdf5ad7,0x52956319,0x7bdf8421,0x7bdf5ad7,0x318d5295,0x0000fb41,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb410000, +0x8c637bdf,0x7bdf7bdf,0x6b5b7bdf,0xffed7bdf,0x7bdffd4b,0x739d739d,0x739d739d,0x7bdf739d,0x8c637bdf,0x7bdf7bdf,0x6b5b7bdf,0xdd657bdf,0x7bdfac5d,0x739d739d,0x739d739d,0x7bdf739d,0x8c637bdf,0x7bdf7bdf,0x6b5b7bdf,0x39cf7bdf,0x7bdf318d,0x739d739d,0x739d739d,0x7bdf739d,0xb5ad6a8d,0x145b8c63,0x2a5f32e3,0x5b837445,0x9085b885,0x74453145,0x145b5b83,0x72cf0b55, +0x19c722c9,0x1a071105,0x2289bdef,0x7bdf94a5,0x1a0739cf,0x39cf1145,0xad6b1a07,0x1a07b5ad,0x08430845,0x20cb18cb,0x10850845,0x41d91085,0x18cb18cb,0x10870845,0x08450843,0x10871087,0x31130003,0x00a109e3,0x00031889,0x311341d9,0x31553155,0x20cd1889,0x18890005,0x00a109e3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa34941cd,0xa347a349,0xa347a347,0xa347a347,0xa347a347,0xa349a349,0xa349a349,0xce738ac7,0x8ac7a529,0xa347a349,0xa347a347,0xa347a347,0xa347a347,0xa349a349,0xa349a349,0x2907a347,0x29051883,0x5189a351,0x51c94947,0x51c951c9,0x49474947,0x518951c9,0xa34f51c9,0x08412905, +0x5295294b,0x6b5b5ad7,0x21096b5b,0x318d318d,0x294b2109,0x42112109,0x8c636b5b,0x294b6b5b,0x5295294b,0x6b5b5ad7,0x63199ce7,0x84218c63,0x6b5b5ad7,0x5ad75ad7,0x8c636b5b,0x294b6b5b,0x5295294b,0xce735ad7,0x5295ce73,0x6b5b5295,0x6b5b6b5b,0xce736b5b,0x8c63ce73,0x294b6b5b,0x0000fb41,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb410000, +0x8c637bdf,0x739d8c63,0x739d739d,0x739d739d,0x739d739d,0x8c638c63,0x8c638c63,0x6b5b8c63,0x8c637bdf,0x739d8c63,0x739d739d,0x739d739d,0x739d739d,0x8c638c63,0x8c638c63,0x6b5b8c63,0x8c637bdf,0x739d8c63,0x739d739d,0x739d739d,0x739d739d,0x8c638c63,0x8c638c63,0x6b5b8c63,0xb885bcd9,0x145b9085,0x2a5f32e3,0x39cf4a53,0x9085b885,0x74453947,0xb5ad5b83,0xbcd98c63, +0xb5adb5ad,0x1a075ad7,0x8421b5ad,0x39cf8421,0x3bcf1a07,0x33cd9ce7,0x7bdf1a07,0x5ad7ad6b,0x08430845,0x108718cb,0x10851085,0x10870845,0x08450843,0x08451087,0x084718cb,0x10871087,0x18890003,0x00a109e3,0x00031889,0x20cd41d9,0x09e328d1,0x20cd09a3,0x18890005,0x00a109a3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x7ac941cd,0x7ac97ac9,0x934b7ac9,0x7ac9934b,0x7ac9934b,0x93097ac9,0x930b930b,0xc6317ac9,0x51c58421,0x7ac97ac9,0x934b7ac9,0x7ac9934b,0x7ac9934b,0x93097ac9,0x930b930b,0x2907930b,0xab911043,0x51c9a34f,0xa2cd9acd,0xab915189,0x4947ab91,0xb3939acd,0xa34f51c9,0x1883ab91, +0x739d39cf,0x4a537bdf,0x0001318d,0x00010001,0x00010001,0x318d0001,0x84215295,0x2109739d,0x739d39cf,0x6b5b7bdf,0x7bdf8c63,0x5ad77bdf,0x8c636b5b,0x94a594a5,0x8421739d,0x2109739d,0x739d39cf,0xb5ad8c63,0xb5adb5ad,0x529539cf,0x84218421,0xb5adce73,0x7bdfb5ad,0x2109739d,0x0000fb41,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb410000, +0x739d739d,0x7bdf7bdf,0xffff7bdf,0x739dffed,0x6b5b7bdf,0xffedffff,0x739d739d,0x7bdf6b5b,0x739d739d,0x7bdf7bdf,0xe62b7bdf,0x739ddd65,0x6b5b7bdf,0xdd65e62b,0x739d739d,0x7bdf6b5b,0x739d739d,0x7bdf7bdf,0x42117bdf,0x739d39cf,0x6b5b7bdf,0x39cf4211,0x739d739d,0x7bdf6b5b,0xb8859c13,0x145b9085,0x2a5f32e3,0x39cf4a53,0xb8854187,0x74459085,0x145b5b83,0x9c130b55, +0x8421739d,0x1a077bdf,0x8c632acb,0x11457bdf,0xc6313c0f,0x2b4b7bdf,0x5ad76319,0x11451105,0x10871087,0x08451085,0x08430843,0x08430843,0x08451087,0x10870843,0x10871087,0x08450845,0x18890003,0x00a109e3,0x41d91889,0x20cd41d9,0x09e320cd,0x20cd00a1,0x31550005,0x00a109a3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x314941cb,0x31893149,0x31893189,0x31493189,0x31893189,0x31893189,0x31493149,0xa5292907,0x2907739d,0x31893149,0x31893189,0x31493189,0x31893189,0x31893189,0x31493149,0x18c53149,0xab910841,0x51c9a34f,0xa34fab91,0x928b4105,0x4987a34f,0x9acd8a8b,0xa34f5189,0x1883ab91, +0x5ad7294b,0x294b7bdf,0x00010001,0x00010001,0x00010001,0x00010001,0x6b5ba529,0x210939cf,0x5ad7294b,0x6b5b7bdf,0x7bdf7bdf,0x5ad77bdf,0x94a594a5,0x84217bdf,0x6b5b7bdf,0x210939cf,0x5ad7294b,0x739d7bdf,0xb5adb5ad,0x6b5b8c63,0xce735295,0x7bdfb5ad,0x6b5b7bdf,0x210939cf,0x0000fb41,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf8010000, +0x8c638c63,0xffff7bdf,0xff53ffed,0xfd4bff53,0x7bdf7bdf,0xfd4bff53,0x8c638c63,0x6b5b8c63,0x8c638c63,0xe62b7bdf,0xbce1dd65,0xac5dbce1,0x7bdf7bdf,0xac5dbce1,0x8c638c63,0x6b5b8c63,0x8c638c63,0x42117bdf,0x318d39cf,0x318d318d,0x7bdf7bdf,0x318d318d,0x8c638c63,0x6b5b8c63,0xb885bcd9,0x145b9085,0x2a5f32e3,0x5b837445,0xb8853947,0x74459085,0x145b5b83,0xbcd90b55, +0x7bdf7bdf,0x1a072b0b,0x11452289,0x224939cf,0x334d2249,0x2b0ba529,0x7bdf739d,0x52952b0b,0x10851087,0x10871087,0x39953995,0x39953995,0x08430845,0x08453995,0x08430843,0x08450843,0x18893155,0x00a109a3,0x10871889,0x108741d9,0x09a31087,0x315500a1,0x20cd3113,0x00a109a3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x72cd41cd,0x728b72cd,0x72cd72cd,0x6a8b72cd,0x6a8b6a8b,0x72cd728b,0x72cd72cd,0x94a56249,0x4187739d,0x728b72cd,0x72cd72cd,0x6a8b72cd,0x6a8b6a8b,0x72cd728b,0x72cd72cd,0x290772cd,0xab910841,0x5189a34f,0x49875189,0x51895189,0x51c94947,0x49474987,0xa34f5189,0x0841ab91, +0x6319318d,0x294b7bdf,0x08430001,0x10850843,0x10851085,0x00011085,0x8421a529,0x21096319,0x6319318d,0x6b5b7bdf,0x5ad7739d,0x7bdf6b5b,0x8421739d,0x7bdf8c63,0x84218421,0x21096319,0x6319318d,0x6b5b7bdf,0x6b5b5ad7,0x52955295,0x6b5b5295,0x6b5b7bdf,0x84215295,0x21096319,0x0000fb41,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf801fb41, +0x7bdf7bdf,0x739d7bdf,0x739d739d,0x739d739d,0x6b5b739d,0x739d739d,0x739d739d,0x7bdf7bdf,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x739d739d,0x6b5b739d,0x739d739d,0x739d739d,0x7bdf7bdf,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x739d739d,0x6b5b739d,0x739d739d,0x739d739d,0x7bdf7bdf,0x72cf72cf,0x6a8d6a8d,0x6a8d6a8d,0x72cf6a8d,0x72cf72cf,0x6a8d6a8d,0x6a8d6a8d,0x72cf72cf, +0x7bdf7bdf,0x1a071105,0xb5ad3c0f,0x19c71a07,0x19c72249,0x8c63318d,0x39cf7bdf,0xc6312249,0x10871087,0x08450843,0x188b1087,0x108918cb,0x08431087,0x084318cb,0x39953113,0x108918cb,0x18890003,0x00a120cd,0x10871889,0x31553155,0x09a31087,0x20cd00a1,0x000320cd,0x188909a3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x930941cb,0x8b098b09,0x8b098b09,0x93098b09,0x93099309,0x8b098b09,0x8b098b09,0x62057247,0x72876205,0x8b098b09,0x8b098b09,0x93098b09,0x93099309,0x8b098b09,0x8b098b09,0x290782c9,0xab910841,0x59c9a34f,0xa34fab91,0xab9151c9,0x5189ab91,0xab51a34f,0xa34f51c9,0x1883ab91, +0x5ad7294b,0x21095ad7,0xb5ad739d,0xad6bad6b,0xa529ad6b,0x6b5ba529,0x5ad7ad6b,0x39cf5295,0x5ad7294b,0x63195ad7,0x8c638c63,0x63196b5b,0x5ad76b5b,0x7bdf5ad7,0x5ad78421,0x39cf5295,0x5ad7294b,0x6b5b6b5b,0x4a53739d,0x84214a53,0x5ad78421,0x4a536b5b,0x5ad76b5b,0x39cf5295,0xfb41f801,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf801fb41, +0xffed7bdf,0x6b5bff53,0x739d8c63,0x7bdf7bdf,0xffedffff,0x8c638c63,0x8c638c63,0x8c638c63,0xdd657bdf,0x6b5bbce1,0x739d8c63,0x7bdf7bdf,0xdd65e62b,0x8c638c63,0x8c638c63,0x8c638c63,0x39cf7bdf,0x6b5b318d,0x739d8c63,0x7bdf7bdf,0x39cf4211,0x8c638c63,0x8c638c63,0x8c638c63,0x9c13bcd9,0x9c139c13,0xbcd99c13,0xb497b497,0x9c139c13,0x72cf9c13,0x9c13bcd9,0x9c139c13, +0x08c37bdf,0xbdef1a07,0x2b0b3c4f,0xb5ad2289,0x2b0bad6b,0x19c72249,0x21091185,0xb5adc631,0x08430845,0x18cb3995,0x10870845,0x18cb20cd,0x08451087,0x08431087,0x18cb188b,0x10870845,0x18890003,0x00a120cd,0x10871889,0x09a309e3,0x09a31087,0x000500a1,0x000309a3,0x188909a3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabcb41cd,0xabcbabcb,0xa347abcb,0xabcb8b47,0xa389abcb,0xa389a389,0xabcbabcb,0xabcb8b47,0xa389abcb,0xabcbabcb,0xa347abcb,0xabcb8b47,0xa389abcb,0xa389a389,0xabcbabcb,0x2907934b,0xab911883,0x51c99acd,0xa34fab91,0xab915189,0x51c9ab91,0xab91a34f,0xa34f51c9,0x1883b393, +0x4211294b,0x84217bdf,0x52955ad7,0x5ad74a53,0x52955ad7,0x4a535295,0x5ad7739d,0x39cf7bdf,0x4211294b,0x8c637bdf,0x7bdf9ce7,0x94a5739d,0x842194a5,0x6b5b7bdf,0x5ad76b5b,0x39cf7bdf,0x4211294b,0x84217bdf,0x52955ad7,0x21098c63,0x63192109,0x6b5b5295,0x5ad7739d,0x39cf7bdf,0xfb41f801,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf801fb41, +0x739d7bdf,0x739d739d,0x739d739d,0xffed739d,0xfd4bfd4b,0x739dfd4b,0x739d739d,0x7bdf8c63,0x739d7bdf,0x739d739d,0x739d739d,0xdd65739d,0xac5dac5d,0x739dac5d,0x739d739d,0x7bdf8c63,0x739d7bdf,0x739d739d,0x739d739d,0x39cf739d,0x318d318d,0x739d318d,0x739d739d,0x7bdf8c63,0x20c59c13,0x20c520c5,0x20c520c5,0x290520c5,0x29052905,0x20c520c5,0x2a5f32e3,0x9c132905, +0x5ad78c63,0xb5adb5ad,0x11452b4b,0x6b5bb5ad,0x338dbdef,0x1a0794a5,0xc6315ad7,0x7bdf7bdf,0x10870845,0x10871087,0x10851087,0x20cb1087,0x08450847,0x00050845,0x084518cb,0x10871087,0x00010003,0x20cd20cd,0x31131889,0x00a109e3,0x09a31087,0x31133155,0x000309a3,0x188909a3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b4741cb,0x8b478b47,0xabcb8b47,0xa389a389,0x8b478b47,0xa3478b47,0x8b47abcb,0xa389a389,0x8b478b47,0x8b478b47,0xabcb8b47,0xa389a389,0x8b478b47,0xa3478b47,0x8b47abcb,0x29077ac9,0xb3931883,0x49478a4b,0x49875189,0x51c951c9,0x51c94947,0x51894987,0xa34f51c9,0x1883ab91, +0x8c634a53,0xc631c631,0xce73c631,0xce73ce73,0xce73c631,0xc631ce73,0xc631c631,0x39cf8c63,0x8c634a53,0xc631c631,0xce73c631,0xce73ce73,0xce73c631,0xc631ce73,0xc631c631,0x39cf8c63,0x8c634a53,0xc631c631,0xce73c631,0x00012109,0x21090001,0xc631ce73,0xc631c631,0x39cf8c63,0xfb41f801,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf801fb41, +0x7bdf7bdf,0x739d8c63,0x8c63ff53,0x739d8c63,0x739d6b5b,0x8c638c63,0x7bdf8c63,0x7bdf7bdf,0x7bdf7bdf,0x739d8c63,0x8c63bce1,0x739d8c63,0x739d6b5b,0x8c638c63,0x7bdf8c63,0x7bdf7bdf,0x7bdf7bdf,0x739d8c63,0x8c63318d,0x739d8c63,0x739d6b5b,0x8c638c63,0x7bdf8c63,0x7bdf7bdf,0x20c5bcd9,0x31453145,0x9085b885,0x39473947,0xacc33145,0x29058bc3,0x2a5f32e3,0x9c133145, +0x3c0f5ad7,0x7bdf7bdf,0x318d7bdf,0x94a5b5ad,0x2b0b7bdf,0x39cf8421,0x5ad72249,0x84219ce7,0x10871085,0x08451087,0x10870845,0x08470847,0x08431087,0x10890845,0x08451087,0x10871087,0x18893113,0x18891889,0x20cd0003,0x00a109a3,0x09a320cd,0x09a309e3,0x000309a3,0x18893155,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa38941cd,0xa389a389,0xabcbabcb,0x8b478b47,0x8b478b47,0xa389a389,0xa389a389,0x8b478b47,0x8b478b47,0xa389a389,0xabcbabcb,0x8b478b47,0x8b478b47,0xa389a389,0xa389a389,0x2907930b,0xab911883,0x4947a34f,0xa34f9acd,0xa34f4987,0x41058a8b,0xb393a34f,0xa34f51c9,0x1883ab91, +0x7bdf4a53,0xb5adb5ad,0x7bdfb5ad,0x42114211,0x421139cf,0xb5ad7bdf,0xad6b9ce7,0x318d7bdf,0x7bdf4a53,0xb5adb5ad,0xb5adb5ad,0xb5adb5ad,0xb5ada529,0xb5adb5ad,0xad6b9ce7,0x318d7bdf,0x7bdf4a53,0xb5adb5ad,0xb5adad6b,0x10852109,0x21091085,0xb5adce73,0xad6b9ce7,0x318d7bdf,0xfb41f801,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf801fb41, +0x7bdf6b5b,0x7bdf7bdf,0x7bdf739d,0x7bdf7bdf,0x8c638c63,0xffed7bdf,0x8c63fd4b,0x6b5b8c63,0x7bdf6b5b,0x7bdf7bdf,0x7bdf739d,0x7bdf7bdf,0x8c638c63,0xdd657bdf,0x8c63ac5d,0x6b5b8c63,0x7bdf6b5b,0x7bdf7bdf,0x7bdf739d,0x7bdf7bdf,0x8c638c63,0x39cf7bdf,0x8c63318d,0x6b5b8c63,0x818372cf,0x61417181,0x9085b885,0x41873145,0xb5ad5b83,0x90858c63,0x2a5f32e3,0x72cf145b, +0x1a071a07,0x7bdf33cd,0x39cf6b5b,0x84217bdf,0x7bdf94a5,0x19c71145,0x1a073c0f,0x39cf1a07,0x08431089,0x10870843,0x08450845,0x08451087,0x39950843,0x10870845,0x41970843,0x108718cb,0x188928d1,0x315520cd,0x20cd0003,0x00a109a3,0x315520cd,0x00a109e3,0x000309a3,0x18893155,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa34941cb,0xa347a347,0xa349a349,0xa347a349,0xa347a347,0xa347a347,0xa349a349,0xa347a349,0xa347a347,0xa347a347,0xa349a349,0xa347a349,0xa347a347,0xa347a347,0xa349a349,0x29078b09,0xab910841,0x51c9a34f,0xb3919acd,0xab915189,0x5189ab91,0xb3939acd,0xa35151c9,0x1883ab91, +0x7bdf4a53,0x7bdfad6b,0x39cf39cf,0x00010001,0x00010001,0x39cf39cf,0xa529739d,0x318d739d,0x7bdf4a53,0xad6bad6b,0x9ce7ad6b,0xb5adad6b,0xad6bad6b,0xa529a529,0xa529a529,0x318d739d,0x7bdf4a53,0xb5adad6b,0xb5adb5ad,0x1085b5ad,0xce731085,0xb5adad6b,0xa529b5ad,0x318d739d,0xf801f801,0x0000fb41,0x00000000,0x00000000,0x00000000,0x00000000,0xfb410000,0xf801f801, +0x739d7bdf,0x739d739d,0x739d739d,0x739d739d,0xffffffed,0xff53ffed,0xfd4bff53,0x7bdf739d,0x739d7bdf,0x739d739d,0x739d739d,0x739d739d,0xe62bdd65,0xbce1dd65,0xac5dbce1,0x7bdf739d,0x739d7bdf,0x739d739d,0x739d739d,0x739d739d,0x421139cf,0x318d39cf,0x318d318d,0x7bdf739d,0x8183bcd9,0x61417181,0x9085b885,0x314532e3,0xb5ad5b83,0x90858c63,0x2a5f32e3,0xbcd9145b, +0xb5adb5ad,0x11451145,0x11451145,0x7bdf2249,0x11451987,0x9ce7b5ad,0x7bdf2b0b,0x1a071a07,0x39951087,0x20cb3955,0x08430845,0x08451047,0x39550843,0x108718cb,0x10851087,0x08450845,0x188920cd,0x00011889,0x00010003,0x20cd09a3,0x311320cd,0x00a109e3,0x31130003,0x28d120cd,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabcb41cd,0xabcbabcb,0x8b47abcb,0x8b47abcb,0x8b478b47,0x8b478b47,0xa347a389,0x8b47abcb,0x8b478b47,0xabcbabcb,0x8b47abcb,0x8b47abcb,0x8b478b47,0x8b478b47,0xa347a389,0x2907934b,0x29050841,0x51c9a34f,0x494751c9,0x51c95189,0x51c951c9,0x51c951c9,0xa34f5189,0x08412905, +0x7bdf4a53,0x39cf7bdf,0x00010001,0x00010001,0x00010001,0x00010001,0xb5ad4211,0x294b7bdf,0x7bdf4a53,0xa529b5ad,0xa529a529,0xa529a529,0xa529a529,0xb5adb5ad,0xb5adb5ad,0x294b7bdf,0x7bdf4a53,0xb5adb5ad,0xad6bb5ad,0xce73b5ad,0xa529ce73,0xb5adb5ad,0xb5adad6b,0x294b7bdf,0xfb41f801,0x0000f801,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf801fb41, +0x8c637bdf,0xffed739d,0x7bdffd4b,0x739d7bdf,0xfd4b739d,0x739dfd4b,0x7bdf7bdf,0x8c638c63,0x8c637bdf,0xdd65739d,0x7bdfac5d,0x739d7bdf,0xac5d739d,0x739dac5d,0x7bdf7bdf,0x8c638c63,0x8c637bdf,0x39cf739d,0x7bdf318d,0x739d7bdf,0x318d739d,0x739d318d,0x7bdf7bdf,0x8c638c63,0x8183b497,0x61417181,0x9085b885,0x5b8332e3,0xacc33145,0x90858bc3,0x2a5f32e3,0xb497145b, +0x7bdfbdef,0xb5ad2289,0xb5ad3c0f,0x39cf1a07,0xce732249,0x7bdfa529,0x7bdf94a5,0x318d8c63,0x10870849,0x18cb18cb,0x00031087,0x108718cb,0x20cd0843,0x18cb18cb,0x10871087,0x10870847,0x00031889,0x31551889,0x31133155,0x20cd20cd,0x31551087,0x00a109e3,0x00033155,0x20cd3155,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b4741cd,0xabcba347,0xabcbabcb,0x8b47abcb,0xa389abcb,0x8b47a389,0x8b478b47,0x8b47abcb,0xa389abcb,0xabcba347,0xabcbabcb,0x8b47abcb,0xa389abcb,0x8b47a389,0x8b478b47,0x29077ac9,0xb4970841,0xa34f20c5,0xa34fa351,0xa34fa34f,0xa34f9b4f,0xa351a34f,0x2105a391,0x0841b457, +0x739d4a53,0x000139cf,0x18c71085,0x18c718c7,0x108518c7,0x108518c7,0xb5ad0001,0x318d739d,0x739d4a53,0xad6bad6b,0xa529ad6b,0xa529a529,0x9ce7ad6b,0xad6bad6b,0xa529a529,0x318d739d,0x739d4a53,0xb5adb5ad,0xb5adb5ad,0xad6bb5ad,0xad6bad6b,0xa529a529,0xad6bb5ad,0x318d739d,0xfb41f801,0x00000000,0x0000f801,0x0000fb41,0x00000000,0xfb410000,0x0000fb41,0xf801f801, +0x7bdf7bdf,0x739d7bdf,0x739d739d,0x739d739d,0x7bdf7bdf,0x8c638c63,0x739d7bdf,0x7bdf739d,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x739d739d,0x7bdf7bdf,0x8c638c63,0x739d7bdf,0x7bdf739d,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x739d739d,0x7bdf7bdf,0x8c638c63,0x739d7bdf,0x7bdf739d,0x8183bcd9,0x61417181,0x9085b885,0x5b8332e3,0xacc34187,0x90858bc3,0x2a5f32e3,0xbcd9145b, +0x8c63739d,0xa5291185,0x7bdf8421,0x1a077bdf,0x1a071a07,0x94a57bdf,0x94a58c63,0x114539cf,0x10851087,0x18cb1087,0x10871087,0x08450845,0x18890843,0x18cb18cb,0x108718cb,0x08450845,0x31130003,0x20cd3155,0x09a309e3,0x311320cd,0x20cd1087,0x28d109e3,0x000320cd,0x18893155,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x934b41cd,0x7ac97ac9,0x934b7ac9,0x7ac9934b,0x934b934b,0x930b7ac9,0x934b934b,0x7ac9934b,0x934b934b,0x7ac97ac9,0x934b7ac9,0x7ac9934b,0x934b934b,0x930b7ac9,0x934b934b,0x2907830b,0xb4971043,0x2905b497,0xb393ab91,0xab51ab51,0xab91ab91,0xab91ab51,0xb4972905,0x1883b497, +0x7bdf4a53,0x108539cf,0x2109294b,0x294b294b,0x294b294b,0x294b294b,0xb5ad1085,0x294b7bdf,0x7bdf4a53,0x7bdf7bdf,0x739d7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x294b7bdf,0x7bdf4a53,0x7bdf7bdf,0x739d7bdf,0x7bdf739d,0x739d7bdf,0x739d739d,0x7bdf7bdf,0x294b7bdf,0xfb41f801,0xfb41f801,0xfb41f801,0x0000f801,0xf8010000,0xf801fb41,0xfb41f801,0xf801f801, +0x739d739d,0x739d739d,0x8c636b5b,0x7bdf8c63,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x7bdf7bdf,0x739d739d,0x739d739d,0x8c636b5b,0x7bdf8c63,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x7bdf7bdf,0x739d739d,0x739d739d,0x8c636b5b,0x7bdf8c63,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x7bdf7bdf,0x72cf72cf,0x7b0f72cf,0x6a8d6a8d,0x6a8d7b0f,0x72cf72cf,0x6a8d72cf,0x6a8d49c9,0x72cf6a8d, +0x739d7bdf,0x19c7739d,0x08c30903,0x1a071145,0x84213c4f,0x22495295,0x19c71987,0x63191145,0x08451087,0x08471087,0x10871087,0x10871087,0x10871087,0x10871085,0x10871087,0x10870845,0x41d941d9,0x20cd0003,0x00a109a3,0x31131889,0x20cd1087,0x20cd09a3,0x31551889,0x18890001,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x29072907,0x29072907,0x29072907,0x29072907,0x29072907,0x29072907,0x29072107,0x29072907,0x29072907,0x29072907,0x29072907,0x29072907,0x29072907,0x29072907,0x29072107,0x20c52907,0x18831883,0x18830841,0x51051883,0x51054905,0x51055105,0x18835105,0x08410841,0x18830841, +0x631939cf,0x294b318d,0x294b294b,0x294b294b,0x2109294b,0x294b294b,0xa529294b,0x318d6319,0x318d39cf,0x318d318d,0x318d318d,0x318d318d,0x294b318d,0x318d318d,0x318d318d,0x318d318d,0x318d39cf,0x294b318d,0x294b294b,0x318d318d,0x318d318d,0x294b294b,0x318d294b,0x318d318d,0xf801f801,0xf801f801,0xf801f801,0xf801f801,0xf801f801,0xf801f801,0xf801f801,0xf801f801, +0xce51d693,0xce51b58b,0xce51ce51,0xce51ce51,0xce51ded5,0xe7135281,0xce51ded5,0xce51ce51,0xffffffff,0x0000ffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xc7bfffff,0x739d7bdf,0x739d739d,0x7bdf739d,0x8c638c63,0x8c636b5b,0x739d7bdf,0x739d739d,0x7bdf739d,0x739d7bdf,0x739d739d,0x7bdf739d,0x8c638c63,0x8c636b5b,0x739d7bdf,0x739d739d,0x7bdf739d, +0x000094a5,0x9ce7ad6b,0x00005ad7,0x00000000,0x00007bdf,0x00000000,0x52950000,0xad6b0000,0x294b94a5,0x9ce7ad6b,0x294b5ad7,0x294b294b,0x294b7bdf,0x294b294b,0x5295294b,0xad6b294b,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x41cb41cd,0x41cb41cb,0x41cd41cb,0x41cd41cd,0x41cd41cb,0x41cd41cd,0x41cd41cd,0x290741cd,0x41cd41cd,0x41cb41cb,0x41cd41cb,0x41cd41cd,0x41cd41cb,0x41cd41cd,0x41cd41cd,0x314941cd,0x9c131883,0x9c139c13,0x29059c13,0x5947b393,0xb3935947,0xbcd92905,0xbcd9bcd9,0x1883bcd9, +0x9c131883,0x9c139c13,0x29059c13,0x5947b393,0xb3935947,0xbcd92905,0xbcd9bcd9,0x1883bcd9,0x318d39cf,0x318d318d,0x294b318d,0x294b294b,0x39cf2109,0x318d39cf,0x2109294b,0x318d318d,0x318d39cf,0x318d318d,0x294b318d,0x294b294b,0x39cf2109,0x318d39cf,0x2109294b,0x318d318d,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x39c1c60f,0xce51e713,0xce51c60f,0x39c139c1,0xd693ce51,0xce51ce51,0xce51ce51,0xce512101,0x0000ffff,0x00000000,0x00000000,0xc7bf0000,0x00000000,0x00000000,0x00000000,0xb6b70000,0x7bdf7bdf,0x8c638c63,0x8c638c63,0x8c638c63,0x8c63739d,0x8c638c63,0x7bdf6b5b,0x739d7bdf,0x7bdf7bdf,0x8c638c63,0x8c638c63,0x8c638c63,0x8c63739d,0x8c638c63,0x7bdf6b5b,0x739d7bdf, +0x00008421,0x9ce7bdef,0x52950000,0x00000000,0x4a535295,0xb5ad0000,0x5295b5ad,0x52950000,0x294b8421,0x9ce7bdef,0x5295294b,0x294b294b,0x4a535295,0xb5ad294b,0x5295b5ad,0x5295294b,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabcb41cd,0xa347a389,0xa389a389,0x8b478b47,0x8b478b47,0xa3898b47,0xa3898b47,0x8b478b47,0x8b478b47,0xa347a389,0xa389a389,0x8b478b47,0x8b478b47,0xa3898b47,0xa3898b47,0x2907abcb,0xbcd91883,0x72cfb497,0xb497b497,0x59472105,0x21055947,0xb4979c13,0xb4979c13,0x1883bcd9, +0xbcd91883,0x72cfb497,0xb497b497,0x59472105,0x21055947,0xb4979c13,0xb4979c13,0x1883bcd9,0x6b5b39cf,0x63195ad7,0x52954211,0x739d739d,0x63194a53,0x63196319,0x42115295,0x318d5295,0x6b5b39cf,0x63195ad7,0x52954211,0x739d739d,0x63194a53,0x63196319,0x42115295,0x318d5295,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce51ce51,0xd693ce51,0xded5ce51,0x63015281,0xce51ded1,0xe717bdcd,0xce5139c1,0xce51ffd9,0x0000ffff,0xffff0000,0x00000000,0x0000c7bf,0x00000000,0x00000000,0x00000000,0x00000000,0x6b5b7bdf,0x739d739d,0x739d767f,0x739d739d,0x739d8c63,0x7bdf7bdf,0x767fc73f,0x7bdf7bdf,0x6b5b7bdf,0x739d739d,0x739d9001,0x739d739d,0x739d8c63,0x7bdf7bdf,0x9001f801,0x7bdf7bdf, +0x00000000,0x00008c63,0xad6b5295,0x0000a529,0xad6b9ce7,0xb5ad5ad7,0x000094a5,0xad6bb5ad,0x294b294b,0x294b8c63,0xad6b5295,0x294ba529,0xad6b9ce7,0xb5ad5ad7,0x294b94a5,0xad6bb5ad,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabcb41cd,0x8b478b47,0x8b478b47,0xa389a389,0xabcbabcb,0xa389abcb,0xabcba347,0xa389a389,0xabcbabcb,0x8b478b47,0x8b478b47,0xa389a389,0xabcbabcb,0xa389abcb,0xabcba347,0x2907abcb,0xbcd91883,0x9c139c13,0x9c137acd,0x2905b497,0xbcd92905,0xb497bcd9,0xbcd972cf,0x1883bcd9, +0xbcd91883,0x9c139c13,0x9c137acd,0x2905b497,0xbcd92905,0xb497bcd9,0xbcd972cf,0x1883bcd9,0x5295294b,0x52957bdf,0x8c636319,0x7bdf8c63,0x52956319,0x7bdf8421,0x7bdf5ad7,0x318d5295,0x5295294b,0x52957bdf,0x8c636319,0x7bdf8c63,0x52956319,0x7bdf8421,0x7bdf5ad7,0x318d5295,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xc60fce51,0x39c1ded5,0xd69339c1,0x39c1e713,0xc60fe713,0x2941c60f,0xce4d6301,0xded5ce51,0x0000ffff,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xb6b7c7bf,0x8c637bdf,0x7bdf7bdf,0x6b5b7bdf,0xc73f7bdf,0x7bdf5f7d,0x739d739d,0x739d739d,0x7bdf739d,0x8c637bdf,0x7bdf7bdf,0x6b5b7bdf,0xf8017bdf,0x7bdf8801,0x739d739d,0x739d739d,0x7bdf739d, +0x00000000,0x00000000,0xad6b0000,0x00008c63,0x9ce7ad6b,0xad6b4a53,0x00008c63,0x9ce7ad6b,0x294b294b,0x294b294b,0xad6b294b,0x294b8c63,0x9ce7ad6b,0xad6b4a53,0x294b8c63,0x9ce7ad6b,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa34941cd,0xa347a349,0xa347a347,0xa347a347,0xa347a347,0xa349a349,0xa349a349,0xa347a347,0xa347a347,0xa347a349,0xa347a347,0xa347a347,0xa347a347,0xa349a349,0xa349a349,0x2907a347,0x6a8d1883,0x49c96a8d,0x72cf49c9,0x188372cf,0x72cf1883,0x6a8d4189,0x6a8d6a8d,0x188372cf, +0x6a8d1883,0x49c96a8d,0x72cf49c9,0x188372cf,0x72cf1883,0x28c34189,0x28c328c3,0x188372cf,0x5295294b,0x6b5b5ad7,0x21096b5b,0x318d318d,0x294b2109,0x42112109,0x8c636b5b,0x294b6b5b,0x5295294b,0x6b5b5ad7,0x63199ce7,0x84218c63,0x6b5b5ad7,0x5ad75ad7,0x8c636b5b,0x294b6b5b,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce51ce51,0x6301ce51,0xce516301,0xc60fa507,0xbdcdce51,0xce51ce51,0xce51e713,0xce51ffdf,0xffffffff,0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0xc7bf0000,0xb6b70000,0x8c637bdf,0x739d8c63,0x739d739d,0x739d739d,0x739d739d,0x8c638c63,0x8c638c63,0x6b5b8c63,0x8c637bdf,0x739d8c63,0x739d739d,0x739d739d,0x739d739d,0x8c638c63,0x8c638c63,0x6b5b8c63, +0xa5290000,0x0000a529,0xa5290000,0x00005295,0x8c639ce7,0x00000000,0x00008c63,0x8c6394a5,0xa529294b,0x294ba529,0xa529294b,0x294b5295,0x8c639ce7,0x294b294b,0x294b8c63,0x8c6394a5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x7ac941cd,0x7ac97ac9,0x934b7ac9,0x7ac9934b,0x7ac9934b,0x93097ac9,0x930b930b,0x7ac9934b,0x7ac9934b,0x7ac97ac9,0x934b7ac9,0x7ac9934b,0x7ac9934b,0x93097ac9,0x930b930b,0x2907930b,0x9c131883,0x7acd9c13,0xbcd99c13,0x2105bcd9,0x9c132905,0x72cf7acd,0xb497b497,0x1883b497, +0x9c131883,0x7acd9c13,0xbcd99c13,0x2105bcd9,0x9c132905,0x28c37acd,0x28c372cf,0x188372cf,0x739d39cf,0x4a537bdf,0x0001318d,0x00010001,0x00010001,0x318d0001,0x84215295,0x2109739d,0x739d39cf,0x6b5b7bdf,0x7bdf8c63,0x5ad77bdf,0x8c636b5b,0x94a594a5,0x8421739d,0x2109739d,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xbdcdce51,0xce51ce51,0xbdcde713,0xd693ce51,0xce512101,0xce51d693,0xded56301,0xce51d693,0x0000ffff,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x0000c7bf,0x00000000,0x739d739d,0x7bdf7bdf,0xffff7bdf,0x739dc73f,0x6b5b7bdf,0xc73fffff,0x739d739d,0x7bdf6b5b,0x739d739d,0x7bdf7bdf,0xf8017bdf,0x739da801,0x6b5b7bdf,0xa801f801,0x739d739d,0x7bdf6b5b, +0xb5ad0000,0x00008421,0x8c634a53,0x00005ad7,0x9ce75295,0x52950000,0x5ad70000,0x84210000,0xb5ad294b,0x294b8421,0x8c634a53,0x294b5ad7,0x9ce75295,0x5295294b,0x5ad7294b,0x8421294b,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x314941cb,0x31893149,0x31893189,0x31493189,0x31893189,0x31893189,0x31493149,0x31493189,0x31893189,0x31893149,0x31893189,0x31493189,0x31893189,0x31893189,0x31493149,0x18c53149,0x9c131883,0x28c372cf,0x28c3b497,0x2105bcd9,0xb4972905,0xb4979b4f,0x9c139c13,0x18839c13, +0x9c131883,0x28c372cf,0xb497b497,0x2105bcd9,0xb4972905,0x28c39b4f,0x28c328c3,0x1883628d,0x5ad7294b,0x294b7bdf,0x00010001,0x00010001,0x00010001,0x00010001,0x6b5ba529,0x210939cf,0x5ad7294b,0x6b5b7bdf,0x7bdf7bdf,0x5ad77bdf,0x94a594a5,0x84217bdf,0x6b5b7bdf,0x210939cf,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x39c1ded5,0xef59ce51,0xce516301,0xce51ce51,0xd693e713,0xb58bce51,0xe713ffd9,0xce51ce51,0x00000000,0x00000000,0x00000000,0xc7bf0000,0x00000000,0x00000000,0x00000000,0xb6b70000,0x8c638c63,0xffff7bdf,0x767fc73f,0x5f7d767f,0x7bdf7bdf,0x5f7d767f,0x8c638c63,0x6b5b8c63,0x8c638c63,0xb8017bdf,0x9001a801,0x88019001,0x7bdf7bdf,0x88019001,0x8c638c63,0x6b5b8c63, +0x94a55295,0x52950000,0x00005ad7,0xa529a529,0x00000000,0x00006319,0x52950000,0x5ad75ad7,0x94a55295,0x5295294b,0x294b5ad7,0xa529a529,0x294b294b,0x294b6319,0x5295294b,0x5ad75ad7,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x72cd41cd,0x728b72cd,0x72cd72cd,0x6a8b72cd,0x6a8b6a8b,0x72cd728b,0x72cd72cd,0x6a8b72cd,0x6a8b6a8b,0x728b72cd,0x72cd72cd,0x6a8b72cd,0x6a8b6a8b,0x72cd728b,0x72cd72cd,0x290772cd,0xbcd91883,0x28c3bcd9,0x28c372cf,0x210572cf,0x9c132105,0xbcd949c9,0xbcd9bcd9,0x1883bcd9, +0xbcd91883,0x28c3bcd9,0xbcd9bcd9,0x2105bcd9,0x9c132105,0xdef749c9,0xb5addef7,0x188372cf,0x6319318d,0x294b7bdf,0x08430001,0x10850843,0x10851085,0x00011085,0x8421a529,0x21096319,0x6319318d,0x6b5b7bdf,0x5ad7739d,0x7bdf6b5b,0x8421739d,0x7bdf8c63,0x84218421,0x21096319,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x6b41bdcd,0xd693e713,0xded5e713,0xce51c60f,0xce51ce51,0xb58bd693,0xce519cc5,0xce51ded5,0x0000ffff,0x0000c7bf,0x00000000,0x0000c7bf,0x00000000,0x00000000,0x00000000,0xb6b70000,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x739d739d,0x6b5b739d,0x739d739d,0x739d739d,0x7bdf7bdf,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x739d739d,0x6b5b739d,0x739d739d,0x739d739d,0x7bdf7bdf, +0xb5ada529,0xa5290000,0x5ad7b5ad,0x94a5ad6b,0xad6b0000,0x5295bdef,0x52950000,0x63190000,0xb5ada529,0xa529294b,0x5ad7b5ad,0x94a5ad6b,0xad6b294b,0x5295bdef,0x5295294b,0x6319294b,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x930941cb,0x8b098b09,0x8b098b09,0x93098b09,0x93099309,0x8b098b09,0x8b098b09,0x93098b09,0x93099309,0x8b098b09,0x8b098b09,0x93098b09,0x93099309,0x8b098b09,0x8b098b09,0x290782c9,0x72cf1883,0x6a8d6a8d,0x6a8ddef7,0x18836a8d,0x72cf1883,0x41896a8d,0x6a8d6a8d,0x188372cf, +0x72cf1883,0x28c36a8d,0x6a8d6a8d,0x18836a8d,0x72cf1883,0xffff6a8d,0xb5addef7,0x188341c9,0x5ad7294b,0x21095ad7,0xb5ad739d,0xad6bad6b,0xa529ad6b,0x6b5ba529,0x5ad7ad6b,0x39cf5295,0x5ad7294b,0x63195ad7,0x8c638c63,0x63196b5b,0x5ad76b5b,0x7bdf5ad7,0x5ad78421,0x39cf5295,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe713ce51,0xd693ded1,0xce51d693,0x39c1c60f,0x39c1e713,0x39c139c1,0xce51b58b,0xce5139c1,0xc7bfffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xb6b70000,0xc73f7bdf,0x6b5b767f,0x739d8c63,0x7bdf7bdf,0xc73fffff,0x8c638c63,0x8c638c63,0x8c638c63,0xf8017bdf,0x6b5b9001,0x739d8c63,0x7bdf7bdf,0xa801f801,0x8c638c63,0x8c638c63,0x8c638c63, +0x8c63bdef,0x9ce70000,0x529594a5,0x94a594a5,0x94a50000,0x000094a5,0xbdef0000,0x52959ce7,0x8c63bdef,0x9ce7294b,0x529594a5,0x94a594a5,0x94a5294b,0x294b94a5,0xbdef294b,0x52959ce7,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabcb41cd,0xabcbabcb,0xa347abcb,0xabcb8b47,0xa389abcb,0xa389a389,0xabcbabcb,0xabcb8b47,0xa389abcb,0xabcbabcb,0xa347abcb,0xabcb8b47,0xa389abcb,0xa389a389,0xabcbabcb,0x2907934b,0xbcd91883,0xdef7bcd9,0xdef772cf,0x2905628d,0xb4972905,0xb497b497,0xbcd9bcd9,0x1883bcd9, +0xbcd91883,0x28c3bcd9,0x72cfb5ad,0x29059c13,0xb4972905,0x72cfb497,0xb5addef7,0x188372cf,0x4211294b,0x84217bdf,0x8c635ad7,0x94a58c63,0x94a594a5,0x4a538c63,0x5ad7739d,0x39cf7bdf,0x4211294b,0x8c63739d,0x739da529,0x94a56b5b,0x842194a5,0x6319739d,0x4a535ad7,0x39cf7bdf,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce51ce51,0x39c1ce51,0xce51ce51,0xd693ded5,0x6301ce51,0x63015281,0x39c1e713,0x6b436b43,0x0000ffff,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x739d7bdf,0x739d739d,0x739d739d,0xc73f739d,0x5f7d5f7d,0x739d5f7d,0x739d739d,0x7bdf8c63,0x739d7bdf,0x739d739d,0x739d739d,0xa801739d,0x88018801,0x739d8801,0x739d739d,0x7bdf8c63, +0x4a538c63,0x5ad70000,0x00008c63,0x00009ce7,0x00005295,0x000094a5,0xad6b5295,0x000094a5,0x4a538c63,0x5ad7294b,0x294b8c63,0x294b9ce7,0x294b5295,0x294b94a5,0xad6b5295,0x294b94a5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b4741cb,0x8b478b47,0xabcb8b47,0xa389a389,0x8b478b47,0xa3478b47,0x8b47abcb,0xa389a389,0x8b478b47,0x8b478b47,0xabcb8b47,0xa389a389,0x8b478b47,0xa3478b47,0x8b47abcb,0x29077ac9,0x9c131883,0xb5ad9c13,0xb5ad628d,0x290572cf,0x9c132105,0x72cf9c13,0x9c13bcd9,0x18839c13, +0x9c131883,0xdef7b5ad,0x72cfb5ad,0x2905b497,0x9c132105,0x72cf9c13,0xb5adffff,0x1883628d,0x8c634a53,0xdef7c631,0xe739def7,0xf7bdf7bd,0xf7bdf7bd,0xdef7e739,0xc631def7,0x39cf8c63,0x5295294b,0x94a594a5,0x5ad77bdf,0x739d94a5,0x842194a5,0x6b5b8421,0x94a56b5b,0x318d5295,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd693ce51,0xe713ce51,0xc60fce51,0xd69318c1,0xded5ef59,0xe713ef55,0xffdbce51,0xce4d5281,0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0x00000000,0xffff0000,0x00000000,0x7bdf7bdf,0x739d8c63,0x8c63767f,0x739d8c63,0x739d6b5b,0x8c638c63,0x7bdf8c63,0x7bdf7bdf,0x7bdf7bdf,0x739d8c63,0x8c639001,0x739d8c63,0x739d6b5b,0x8c638c63,0x7bdf8c63,0x7bdf7bdf, +0x00005ad7,0x00000000,0x4a530000,0x00005ad7,0xad6bad6b,0x00000000,0x9ce75ad7,0x00000000,0x294b5ad7,0x294b294b,0x4a53294b,0x294b5ad7,0xad6bad6b,0x294b294b,0x9ce75ad7,0x294b294b,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa38941cd,0xa389a389,0xabcbabcb,0x8b478b47,0x8b478b47,0xa389a389,0xa389a389,0x8b478b47,0x8b478b47,0xa389a389,0xabcbabcb,0x8b478b47,0x8b478b47,0xa389a389,0xa389a389,0x2907930b,0xb4971883,0xb497b497,0xbcd9bcd9,0x18839c13,0x9c132105,0xb497b497,0xb4979b4f,0x1883b497, +0xb4971883,0x72cf72cf,0x72cfb5ad,0x18839c13,0x9c132105,0xb497b497,0xb5addef7,0x188372cf,0x7bdf4a53,0xdef7ce73,0xe739ef7b,0x42114211,0x421139cf,0xef7be739,0xc631d6b5,0x318d7bdf,0x5295294b,0x7bdf739d,0x52957bdf,0x842194a5,0x7bdf7bdf,0x5ad77bdf,0x6b5b6b5b,0x294b6b5b,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd69118c1,0xce51ce51,0xce51ce51,0xd693d68f,0xce51ce51,0x1081ce51,0xce51ce51,0xce51e713,0x0000ffff,0x00000000,0x00000000,0x0000c7bf,0x00000000,0x00000000,0x0000ffff,0xb6b70000,0x7bdf6b5b,0x7bdf7bdf,0x7bdf739d,0x7bdf7bdf,0x8c638c63,0xc73f7bdf,0x8c635f7d,0x6b5b8c63,0x7bdf6b5b,0x7bdf7bdf,0x7bdf739d,0x7bdf7bdf,0x8c638c63,0xf8017bdf,0x8c638801,0x6b5b8c63, +0x0000ad6b,0xb5adad6b,0x00000000,0x00000000,0x9ce7ad6b,0xad6b0000,0x00008421,0xad6b5295,0x294bad6b,0xb5adad6b,0x294b294b,0x294b294b,0x9ce7ad6b,0xad6b294b,0x294b8421,0xad6b5295,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa34941cb,0xa347a347,0xa349a349,0xa347a349,0xa347a347,0xa347a347,0xa349a349,0xa347a349,0xa347a347,0xa347a347,0xa349a349,0xa347a349,0xa347a347,0xa347a347,0xa349a349,0x29078b09,0x6a8d1883,0x72cf72cf,0x6a8d6a8d,0x10436a8d,0x72cf1883,0x72cf72cf,0x6a8d4189,0x18836a8d, +0x6a8d1883,0x72cf72cf,0x41874187,0x10436a8d,0x72cf1883,0x72cf72cf,0xb5ad2905,0x18834187,0xad6b4a53,0xdef7d6b5,0x39cf39cf,0xc801f801,0xc801f801,0x39cf39cf,0xd6b5def7,0x318da529,0x739d39cf,0x7bdf8c63,0x5ad7739d,0x7bdf7bdf,0x7bdf8421,0x63195ad7,0x6b5b8c63,0x2109739d,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xf7976301,0x39c1ce51,0xd69318c1,0xc60fce51,0x294139c1,0xce51d693,0xad49d693,0xe7136301,0xc7bf0000,0x00000000,0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0xb6b70000,0x739d7bdf,0x739d739d,0x739d739d,0x739d739d,0xffffc73f,0x767fc73f,0x5f7d767f,0x7bdf739d,0x739d7bdf,0x739d739d,0x739d739d,0x739d739d,0xf801a801,0x9001a801,0x88019001,0x7bdf739d, +0x00008c63,0x9ce7b5ad,0xad6b0000,0x0000b5ad,0x8c630000,0x94a50000,0x000094a5,0xa5294a53,0x294b8c63,0x9ce7b5ad,0xad6b294b,0x294bb5ad,0x8c63294b,0x94a5294b,0x294b94a5,0xa5294a53,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabcb41cd,0xabcbabcb,0x8b47abcb,0x8b47abcb,0x8b478b47,0x8b478b47,0xa347a389,0x8b47abcb,0x8b478b47,0xabcbabcb,0x8b47abcb,0x8b47abcb,0x8b478b47,0x8b478b47,0xa347a389,0x2907934b,0xbcd91883,0xa38fbcd9,0x9c13bcd9,0x1883bcd9,0x9c132105,0x9c139c13,0x72cf9b4f,0x1883bcd9, +0xbcd91883,0xa38fbcd9,0x9c13bcd9,0x1883bcd9,0x9c132105,0x9c139c13,0xffff9b4f,0x188372cf,0xc6318c63,0x39cfe739,0xc801c801,0xc801fd01,0xf801fd01,0xc801c801,0xef7b4211,0x294bad6b,0x5ad7294b,0x5ad75ad7,0x5ad75ad7,0x7bdf6b5b,0x5ad76319,0x8c6394a5,0x7bdf7bdf,0x210939cf,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe713e713,0x6b41d693,0xe7136301,0x39c1c60f,0x63016301,0xd6935281,0xce51ce51,0xce51ce51,0x0000c7bf,0x00000000,0x00000000,0x00000000,0x00000000,0x0000c7bf,0x00000000,0xb6b70000,0x8c637bdf,0xc73f739d,0x7bdf5f7d,0x739d7bdf,0x5f7d739d,0x739d5f7d,0x7bdf7bdf,0x8c638c63,0x8c637bdf,0xf801739d,0x7bdf8801,0x739d7bdf,0x8801739d,0x739d8801,0x7bdf7bdf,0x8c638c63, +0x000094a5,0x94a55ad7,0xa5290000,0x00008c63,0x52950000,0x94a50000,0xad6b4a53,0x0000ad6b,0x294b94a5,0x94a55ad7,0xa529294b,0x294b8c63,0x5295294b,0x94a5294b,0xad6b4a53,0x294bad6b,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b4741cd,0xabcba347,0xabcbabcb,0x8b47abcb,0xa389abcb,0x8b47a389,0x8b478b47,0x8b47abcb,0xa389abcb,0xabcba347,0xabcbabcb,0x8b47abcb,0xa389abcb,0x8b47a389,0x8b478b47,0x29077ac9,0x9c131883,0xa38f72cf,0xbcd9bcd9,0x2105bcd9,0xb4972905,0x9c13b497,0x9c139c13,0x18839c13, +0x9c131883,0xa38f72cf,0xbcd9bcd9,0x2105bcd9,0xb4972905,0x9c13b497,0x628d9c13,0x1883628d,0xdef78c63,0xf80139cf,0xfd01fd01,0xf801fd01,0xfd01ffc1,0xf801f801,0xef7bf801,0x318da529,0x6319318d,0x94a5739d,0x94a58c63,0x5ad76b5b,0x9ce76b5b,0x7bdf8c63,0x7bdf8421,0x21096319,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xc60fce51,0xef59bdcd,0xb58be713,0xce51ded5,0x63016301,0xce51e713,0xe7136301,0xc60fce51,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xc7bf0000,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x739d739d,0x7bdf7bdf,0x8c638c63,0x739d7bdf,0x7bdf739d,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x739d739d,0x7bdf7bdf,0x8c638c63,0x739d7bdf,0x7bdf739d, +0x00006319,0x5ad70000,0x84215ad7,0x00000000,0x63190000,0x94a55295,0xb5ad0000,0x5ad794a5,0x294b6319,0x5ad7294b,0x84215ad7,0x294b294b,0x6319294b,0x94a55295,0xb5ad294b,0x5ad794a5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x934b41cd,0x7ac97ac9,0x934b7ac9,0x7ac9934b,0x934b934b,0x930b7ac9,0x934b934b,0x7ac9934b,0x934b934b,0x7ac97ac9,0x934b7ac9,0x7ac9934b,0x934b934b,0x930b7ac9,0x934b934b,0x2907830b,0xbcd91883,0x7acd9c13,0xbcd99c13,0x2105bcd9,0xbcd92905,0xb4979c13,0xbcd9bcd9,0x1883bcd9, +0xbcd91883,0x7acd9c13,0xbcd99c13,0x2105bcd9,0xbcd92905,0xb4979c13,0xbcd9bcd9,0x1883bcd9,0xe7398c63,0xfd0139cf,0xffc1ffc1,0xfd01ffc1,0xffc1fd01,0xfd01ffc1,0xef7bfd01,0x294bad6b,0x6b5b39cf,0x63195ad7,0x52954211,0x739d739d,0x63194a53,0x63196319,0x42115295,0x318d5295,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xbdcde717,0xce51b58b,0xce51b58b,0xce51d693,0xef55ffdb,0xd693ded5,0xce51e713,0xce51ce51,0xb6b7c7bf,0xb6b7b6b7,0xb6b7b6b7,0x00000000,0xb6b7b6b7,0xb6b70000,0xb6b7b6b7,0xc7bfb6b7,0x739d739d,0x739d739d,0x8c636b5b,0x7bdf8c63,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x7bdf7bdf,0x739d739d,0x739d739d,0x8c636b5b,0x7bdf8c63,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x7bdf7bdf, +0x0000a529,0x00000000,0x9ce70000,0x52950000,0xad6bad6b,0x00005295,0x8c630000,0xad6b5295,0x294ba529,0x294b294b,0x9ce7294b,0x5295294b,0xad6bad6b,0x294b5295,0x8c63294b,0xad6b5295,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x29072907,0x29072907,0x29072907,0x29072907,0x29072907,0x29072907,0x29072107,0x29072907,0x29072907,0x29072907,0x29072907,0x29072907,0x29072907,0x29072907,0x29072107,0x20c52907,0x72cf1883,0x7b0f72cf,0x6a8d6a8d,0x18837b0f,0x72cf1883,0x6a8d72cf,0x6a8d49c9,0x18836a8d, +0x72cf1883,0x7b0f72cf,0x6a8d6a8d,0x18837b0f,0x72cf1883,0x6a8d72cf,0x6a8d49c9,0x18836a8d,0xdef78421,0xf801318d,0xf801fd01,0xffc1fd01,0xfd01f801,0xfd01ffc1,0xef7bf801,0x318d9ce7,0x318d39cf,0x318d318d,0x294b318d,0x294b294b,0x39cf2109,0x318d39cf,0x2109294b,0x318d318d,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd6b5ce73,0xce73c631,0xef7bdef7,0xd6b5ce73,0xef7be739,0xce73bdef,0xe739e739,0xc631ce73,0x1a9f21d5,0x1a9f2215,0x2a570a1b,0x01d922e1,0x1a9f129f,0x1a9f2215,0x3adb22e1,0x22151a9f,0xffffffff,0xefffffff,0xffffffff,0xffffefff,0xffffffff,0xefffefff,0xe7bde7bd,0xffffffff,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f, +0xffffffff,0xefffffff,0xffffffff,0xffffefff,0xffffffff,0xefffefff,0xe7bde7bd,0xffffffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x0a050000,0x14071407,0x14071449,0x0b071449,0x13c90a05,0x140913c9,0x14071409,0x00000b07,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa52d8465,0x9d2da52d,0x9d2d9d2b,0x9d2b9d2b,0xa52da56d,0x9d2b9d2b,0x9d2b9d2b,0x9d2b94eb,0xe7770000,0x00009619,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0x314b2909,0x314b314b,0x314b314b,0x314b314b,0x314b314b,0x314b314b,0x314b314b,0x2109314b,0x314b2909,0x314b314b,0x314b314b,0x314b314b,0x314b314b,0x314b314b,0x314b314b,0x2109314b, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0xe739def7,0xffffffff,0xef7bef7b,0xd6b5def7,0xc631ce73,0xd6b5d6b5,0xc631b5ad,0xdef7d6b5,0x00001a9f,0x00001a9f,0x1a9f0000,0x00000000,0x00000000,0x00001a9f,0x1a9f0000,0x125d0000,0xffffffff,0xefffffff,0xefffefff,0xe7bdefff,0xffffe7bd,0xefffefff,0xffffe7bd,0xe7bdffff,0x757f757f,0x757f757f,0x757f757f,0x8dff757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f, +0xffffffff,0xefffffff,0x59cbefff,0xe7bdefff,0xffffe7bd,0xefffefff,0xffffe7bd,0xe7bdffff,0x0b070000,0x00010b07,0x0b070143,0x00010143,0x0b070b07,0x00010b07,0x0b070143,0x00000b07,0x0a050000,0x140713c7,0x14490b87,0x00010a85,0x13870a05,0x144913c9,0x14071409,0x00000b07,0x0b070000,0x0b070b07,0x0b070b07,0x0b070b07,0x0b070b07,0x0b070b07,0x0b070b07,0x00000b07, +0x9d2ba52d,0xa56fa52d,0x9d2b94a9,0x9d2b9d2b,0xa56f94e9,0xa52dadf3,0x9d2b9d2b,0xa56d9d2b,0x85570000,0x00006c11,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0xe7770000,0x00009619,0x7a91314b,0x828f8291,0x82918291,0x728f728f,0x728f728f,0x8291728f,0x8291728f,0x314b7a91,0x7a91314b,0x828f8291,0x82918291,0x728f728f,0x728f728f,0x8291728f,0x8291728f,0x314b7a91, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xf7bdef7b,0xdef7d6b5,0xf7bdf7bd,0xd6b5e739,0xf7bdef7b,0xe739e739,0xffffffff,0xe739ef7b,0x1a9f1993,0x1a9f2215,0x3adb129f,0x1a9f1a9f,0x1a9f125d,0x1a9f1191,0x21d51a9f,0x221501d9,0xffffefff,0xe7bdefff,0xefffe7bd,0xe7bdefff,0xefffffff,0xe7bdefff,0xffffffff,0xefffefff,0x757f757f,0xffff757f,0x757f757f,0x757f8dff,0x757f757f,0x757f757f,0x757f757f,0x757f757f, +0x59cbefff,0xe7bdefff,0x59cbe7bd,0x59cbefff,0xefffffff,0xe7bdefff,0xffff59cb,0x59cbefff,0x0b070000,0x0a851409,0x13c71407,0x0a8513c7,0x14071449,0x0b471449,0x14071409,0x00000b07,0x00010001,0x13c70b47,0x14490b87,0x09c50b07,0x13870a05,0x140913c9,0x0ac51409,0x00010001,0x0b070000,0xdee7dee7,0xdee7dee7,0xdee7dee7,0xdee7dee7,0xdee7dee7,0xdee7dee9,0x00000b07, +0xad6fa52d,0x9d2badb1,0x9d2b9d2b,0x9d2d9d2d,0xa56da52d,0xa56fa56f,0x9d2b94e9,0xadb19d2b,0xaedd0000,0x974d8557,0xaedd0000,0x00008557,0xaedd0000,0x760b8557,0x85570000,0x00006c11,0x8ad1314b,0x828f5189,0x828f5189,0x92d159cb,0x9b1359cb,0x92d159cb,0x9b135989,0x314b8ad1,0x8ad1314b,0x828f828f,0x828f828f,0x728f92d1,0x9b13728f,0x92d19b13,0x9b1392cf,0x314b8ad1, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd6b5def7,0xf7bdef7b,0xd6b5d6b5,0xf7bddef7,0xdef7ce73,0xf7bdf7bd,0xd6b5def7,0xf7bdffff,0x00001a9f,0x00001a9f,0x22e10000,0x00000000,0x00000000,0x000022e1,0x1a9f0000,0x22e10000,0xe7bdffff,0xe7bde7bd,0xffffffff,0xffffe7bd,0xefffffff,0xe7bdefff,0xffffffff,0xe7bdefff,0x757f757f,0x757fffff,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f8dff, +0x6b5b59cb,0x59cb59cb,0x59cbffff,0x59cb59cb,0x59cbffff,0x59cbefff,0x59cb7a8f,0x7a8f59cb,0x00010000,0x14890a85,0x14091407,0x00010b47,0x14070b47,0x00010b47,0x14070b47,0x00000b07,0x01430000,0x13c70b07,0x14090b87,0x0b071387,0x0a850001,0x144913c9,0x0b871449,0x00000b07,0x0b070000,0xd6a7dee7,0xd6a7d6a7,0xd6a7d6a7,0xd6a7d6a7,0xd6a7d6a7,0xdee7d6e9,0x00000b07, +0x9d2b9ceb,0xa52d9d2b,0xa52d9d2b,0x9d2b9d2b,0x9d2b9d2b,0xa56d9d2b,0x9d2b9d2d,0x94e99d2d,0xaedd0000,0x760b8557,0xaedd0000,0x974d8557,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0x828f314b,0x92cf4147,0x92cf4147,0x92cf4147,0x92cf4147,0x92d14147,0x92d14147,0x314b828f,0x828f314b,0x92cf92d1,0x92cf92cf,0x1885728f,0x728f1885,0x92d192d1,0x92d192d1,0x314b828f, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdef7e739,0xdef7ce73,0xef7bef7b,0xb5adbdef,0xe739d6b5,0xc631d6b5,0xef7bef7b,0xbdefce73,0x00001a9f,0x00001a9f,0x1a9f0000,0x00000000,0x00000000,0x00001a9f,0x1a9f0000,0x0a1b0000,0xffffffff,0xefffefff,0xffffefff,0xffffe7bd,0xefffefff,0xffffe7bd,0xefffffff,0xe7bdefff,0xffff757f,0x757f757f,0x757f757f,0x757f757f,0xffff757f,0x757f757f,0x8dff757f,0x757f757f, +0x7a8f9353,0xbc179353,0x935359cb,0x7a8f7a8f,0x59cb59cb,0x6b5b59cb,0x93537a8f,0x7a8f59cb,0x01430000,0x14071409,0x14490b47,0x0b471449,0x14071449,0x0b471449,0x14071449,0x00000b07,0x0a050000,0x14070b87,0x140913c9,0x0b071407,0x0b070143,0x14491407,0x13871449,0x00000b07,0x0b070000,0xd6e9dee7,0xdee9dee7,0xdee9dee9,0xdee9dee7,0xdee9dee7,0xdee7d6a7,0x00000b07, +0x9d2ba56d,0x9d2ba56f,0xa56fa56f,0xa56fa52f,0x9ceba56f,0xa56f9d2b,0x94e99d2d,0x94eba52d,0xaedd0000,0x00008557,0xe7770000,0x760b9619,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0x728f314b,0x5189828f,0x59cb828f,0x51899b13,0x51899b13,0x5989828f,0x59cb92d1,0x314b8291,0x728f314b,0x828f828f,0x9b13828f,0x1885728f,0x728f1885,0x92cf828f,0x92d192d1,0x314b8291, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xbdefc631,0xf7bdce73,0xb5adce73,0xd6b5ce73,0xb5adce73,0xd6b5d6b5,0xd6b5c631,0xd6b5ce73,0x1a9f2215,0x22e12215,0x32591a9f,0x1a9f1a9f,0x22e11a9f,0x22e12215,0x22151a9f,0x22151a9f,0xefffefff,0xefffefff,0xffffe7bd,0xffffffff,0xefffe7bd,0xe7bde7bd,0xefffefff,0xe7bdefff,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757fffff,0x757f757f,0x757f8dff,0x757f757f, +0x59cb7a8f,0x93539353,0x93537a8f,0x59cb59cb,0x7a8f59cb,0x59cb7a8f,0x7a8f7a8f,0xbc177a8f,0x0b070000,0x0b471407,0x0b470001,0x140713c7,0x140713c7,0x14091449,0x0a851449,0x00000001,0x0a050000,0x14070b47,0x13c913c9,0x0b0713c9,0x13870a05,0x14491407,0x0b871409,0x00000b07,0x0b070000,0xd6a7dee7,0xdee7dee9,0xdee7dee7,0xdee7dee7,0xdee9dee7,0xdee7d6a7,0x00000b07, +0xa52d9ceb,0xadf59d2b,0xa56d9d2b,0xa52da52d,0xad6f9d2b,0x94e9a52d,0x9d2b9d2b,0x94e99d2d,0xaedd0000,0x00008557,0x85570000,0x00006c11,0xe7770000,0x00009619,0xaedd0000,0x00008557,0x728f314b,0x414992cf,0x414992d1,0x39479b13,0x414992d1,0x414992d1,0x3947828f,0x314b728f,0x728f314b,0x92d192cf,0x92d192d1,0x1885728f,0x728f1885,0x92d192d1,0x828f828f,0x314b728f, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xffffffff,0xef7bef7b,0xdef7def7,0xe739def7,0xffffef7b,0xdef7e739,0xffffffff,0xe739ef7b,0x00001a9f,0x0000021b,0x1a9f0000,0x00000000,0x00000000,0x00001a9f,0x01970000,0x1a9f0000,0xe7bdffff,0xe7bde7bd,0xefffffff,0xffffe7bd,0xe7bde7bd,0xffffe7bd,0xefffefff,0xe7bde7bd,0x757f757f,0x757f757f,0x757f757f,0x8dff757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f, +0x59cbbc17,0x7a8f7a8f,0x7a8f8421,0xbc177a8f,0x7a8fbc17,0xbc17bc17,0x93537a8f,0x93537a8f,0x01430000,0x14890b87,0x14491407,0x14071409,0x00010b47,0x140713c7,0x14071407,0x00000b07,0x00010001,0x0bc71387,0x13c71407,0x0b0713c9,0x13870a05,0x13c71409,0x0a851409,0x00010001,0x0b070000,0xd6a7dee7,0xdee7dee9,0xd6e9d6a7,0xd6a7d6a7,0xdee7dee7,0xdee7d6a7,0x00000b07, +0xa52d94e9,0x9d2d9ceb,0xa56d94e9,0x9d2b9d2b,0x9d2b9d2b,0xadb1a56f,0xa56fa52d,0x9d2da52d,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0x85570000,0x00006c11,0xaedd0000,0x974d8557,0x8ad1314b,0x92d159cb,0x9b1359cb,0x828f59cb,0x828f5189,0x9b135989,0x9b1359cb,0x314b8ad1,0x8ad1314b,0x92d19b13,0x9b139b13,0x1885728f,0x728f1885,0x9b1392cf,0x9b139b13,0x314b8ad1, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd6b5d6b5,0xffffffff,0xe739ef7b,0xf7bdf7bd,0xd6b5ce73,0xf7bdef7b,0xe739e739,0xf7bdf7bd,0x00001a9f,0x00001a9f,0x1a9f0000,0x00000000,0x00000000,0x00001a9f,0x22e10000,0x125d0000,0xffffffff,0xefffefff,0xefffefff,0xe7bdefff,0xffffffff,0xe7bde7bd,0xefffffff,0xe7bdefff,0x757f757f,0x757f8dff,0x757f757f,0x757f8dff,0x757f757f,0x757f757f,0x757f757f,0x757f757f, +0x7a8fbc17,0xbc17bc17,0x93539353,0x7a8f7a8f,0x59cb9353,0x93539353,0x7a8f7a8f,0x93539353,0x00010000,0x14070a85,0x14890b47,0x14071449,0x0b471449,0x14091407,0x14070b47,0x00000143,0x0a050000,0x13871449,0x13871407,0x0b071449,0x0a850001,0x0bc71409,0x0b051409,0x000009c5,0x0b070000,0xd6a7dee7,0xdee7dee9,0xdee9d6a7,0xd6a7dee9,0xdee7dee7,0xdee7d6a7,0x00000b07, +0x9d2b9d2d,0x9d2ba56f,0x9d2b9d2d,0xadafa56d,0x9ceba52d,0x9d2b9d2b,0xa52da52d,0xa56f9d2b,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0xaedd0000,0x760b8557,0x828f314b,0x92d14147,0x92d14147,0x92cf4147,0x92cf4147,0x92d14147,0x92d14147,0x314b828f,0x828f314b,0x92d192d1,0x92d192d1,0x1885728f,0x728f1885,0x92d192d1,0x92d192d1,0x314b828f, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe739ef7b,0xd6b5c631,0xe739f7bd,0xd6b5ce73,0xd6b5d6b5,0xc631d6b5,0xdef7def7,0xc631c631,0x000022e1,0x00001a9f,0x1a9f0000,0x00000000,0x00000000,0x00001a9f,0x1a9f0000,0x1a9f0000,0xefffffff,0xefffefff,0xe7bde7bd,0xe7bde7bd,0xffffffff,0xe7bdffff,0xffffffff,0xe7bdefff,0x8dff757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f, +0x7a8f9353,0x93537a8f,0x93537a8f,0x59cb7a8f,0x93537a8f,0x7a8f9353,0x7a8f7a8f,0x7a8f59cb,0x0b070000,0x0b471449,0x0b470001,0x0b4713c7,0x14071407,0x0b471407,0x0b470001,0x00000001,0x0a050000,0x0b871449,0x0b871407,0x0b071407,0x0b070143,0x13871449,0x0b871407,0x00000b07,0x0b070000,0xd6e9dee7,0xdee7dee9,0xdee9d6a7,0xd6a7dee9,0xdee9dee7,0xdee7d6a7,0x00000b07, +0xa52da52d,0xa56fa56f,0x9d2ba52d,0xa52da56f,0xadf3ad6f,0xa52d94e9,0x9d2d9d2b,0x9d2d9d2b,0xe777974d,0x00009619,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0x8ad1314b,0x59cb9b13,0x59899b13,0x59cb828f,0x59cb9b13,0x59cb92d1,0x59cb9b13,0x314b8ad1,0x8ad1314b,0x9b139b13,0x92cf9b13,0x1885728f,0x728f1885,0x92d192d1,0x9b139b13,0x314b8ad1, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdef7d6b5,0xef7bd6b5,0xbdefbdef,0xe739def7,0xe739ce73,0xffffffff,0xe739def7,0xffffffff,0x00001a9f,0x00001a9f,0x22e10000,0x00000000,0x00000000,0x0000125d,0x125d0000,0x1a9f0000,0xefffefff,0xffffefff,0xffffffff,0xefffffff,0xefffefff,0xe7bdefff,0xe7bdffff,0xe7bde7bd,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757fffff,0x757f757f,0x757f757f,0x757f757f, +0x93539353,0x7a8f59cb,0x59cb7a8f,0x7a8f59cb,0x7a8f7a8f,0x7a8f7a8f,0xbc17bc17,0x93537a8f,0x0b070000,0x14071449,0x14090b47,0x00010b47,0x14070b47,0x14091407,0x14070b47,0x00000b07,0x0a050000,0x13871449,0x144913c9,0x00010a85,0x0b870a05,0x0b871449,0x0b871449,0x00000b07,0x0b070000,0xd6a7dee7,0xdee7dee7,0xd6a7d6a7,0xd6a7d6a7,0xdee9dee7,0xdee7d6a7,0x00000b07, +0x8ca794e9,0x9d2ba52d,0xa52d9d2b,0x9d2ba56f,0xa52d9d2d,0xad6fa52d,0xa52d9d2d,0xa56d94e9,0x8557760b,0x00006c11,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0xe7770000,0x00009619,0x728f314b,0x3947828f,0x4989828f,0x414992d1,0x3947828f,0x4147828f,0x39479b13,0x314b728f,0x728f314b,0x828f828f,0x9b13828f,0x1885728f,0x728f1885,0x92cf828f,0x828f9b13,0x314b728f, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xf7bdf7bd,0xef7bef7b,0xf7bdffff,0xe739ef7b,0xef7bf7bd,0xe739d6b5,0xdef7e739,0xdef7ce73,0x1a9f094f,0x1a9f1191,0x21d31a9f,0x1a9f0a1b,0x1a9f2b65,0x1a9f2215,0x2215125d,0x11912b23,0xffffffff,0xe7bdffff,0xefffefff,0xefffefff,0xefffefff,0xffffe7bd,0xefffffff,0xe7bdefff,0x757f757f,0x757f757f,0x757f757f,0xffff757f,0x757f757f,0x757f757f,0xffff757f,0x757f757f, +0x93539353,0xbc177a8f,0x7a8fbc17,0x9353bc17,0xbc1759cb,0x7a8fbc17,0x93539353,0x7a8f8421,0x00010000,0x14070a85,0x14071409,0x14491407,0x0b471407,0x0b4713c7,0x14071449,0x00000b07,0x0a050001,0x0b871409,0x14491407,0x09c50b05,0x13c70a05,0x0b871449,0x0a851449,0x00010001,0x0b070000,0xd6a7dee7,0xdee7dee9,0xdee7dee7,0xdee7dee7,0xdee9dee7,0xdee7d6e9,0x00000b07, +0xa52da52d,0xa52f8c67,0xa56f94e9,0x9d2d9d2b,0xad6fad6f,0x9d2ba56d,0x9d2b9d2d,0x9d2d9d2b,0xaedd0000,0x00008557,0xe777760b,0x00009619,0xaedd974d,0x00008557,0x85570000,0x00006c11,0x8291314b,0x92d159cb,0x9b1359cb,0x828f5189,0x828f5189,0x92d159cb,0x92d159cb,0x314b8291,0x8291314b,0x92d192d1,0x9b139b13,0x1885728f,0x728f1885,0x92d192d1,0x92d192d1,0x314b8291, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce73ce73,0xe739e739,0xd6b5d6b5,0xe739ef7b,0xce73ce73,0xe739d6b5,0xbdefbdef,0xe739d6b5,0x00000a1b,0x000022e1,0x2b230000,0x00000000,0x00000000,0x00001a9f,0x1a9f0000,0x1a9f0000,0xe7bdffff,0xefffe7bd,0xefffefff,0xe7bde7bd,0xe7bde7bd,0xffffe7bd,0xefffefff,0xe7bde7bd,0x757f757f,0x757f757f,0x757f757f,0x757f8dff,0x757f757f,0x757f757f,0x757fffff,0x757f757f, +0x7a8f9353,0x93537a8f,0xbc179353,0x93537a8f,0x93536b5b,0x7a8f9353,0x935359cb,0x59cb7a8f,0x0b070000,0x14071449,0x0b471449,0x14091407,0x00010b47,0x00010b47,0x14070b47,0x00000001,0x0a050000,0x0b871409,0x144913c9,0x0b070b87,0x13c70a05,0x13871449,0x0b071449,0x000009c5,0x0b070000,0xd6a7dee7,0xdee9dee9,0xdee7dee7,0xdee9dee9,0xdee9dee9,0xdee7d6a7,0x00000b07, +0xa52f9ceb,0x94eba56d,0x9d2ba52d,0x9d2ba52d,0xa52da52d,0xadb19d2b,0x9d2b9d2b,0x94a99d2b,0xaedd0000,0x00008557,0x85570000,0x00006c11,0xaedd760b,0x00008557,0xaedd0000,0x00008557,0x828f314b,0x92cf4147,0x92d14147,0x92cf4147,0x92cf4147,0x92cf4147,0x92d14147,0x314b828f,0x828f314b,0x92cf92cf,0x92d192d1,0x1885728f,0x728f1885,0x92cf92cf,0x92d192d1,0x314b828f, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd6b5d6b5,0xbdefbdef,0xf7bdf7bd,0xb5adc631,0xef7bdef7,0xe739e739,0xffffffff,0xc631e739,0x00001a9f,0x00001a9f,0x1a9f0000,0x00000000,0x00000000,0x00001a9f,0x1a9f0000,0x1a9f0000,0xffffefff,0xe7bdefff,0xe7bde7bd,0xffffefff,0xffffffff,0xe7bdefff,0xe7bde7bd,0xe7bde7bd,0x8dff757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0xffff757f,0x757f757f,0x757f757f, +0x59cb7a8f,0x7a8f9353,0x93539353,0x7a8fbc17,0x7a8f7a8f,0x7a8f7a8f,0x7a8f7a8f,0xbc17bc17,0x0b070000,0x14071449,0x00010b47,0x14091407,0x0b471449,0x0b471407,0x14091449,0x00000b07,0x00010001,0x0b870b47,0x144913c9,0x0b070b87,0x0ac50001,0x13871449,0x0b8713c7,0x00010b07,0x0b070000,0xd6a7dee7,0xd6e9d6a7,0xd6a7d6a7,0xd6a7d6a7,0xd6e9d6e9,0xdee7d6e9,0x00000b07, +0xa52dad6f,0xad6f9d2b,0x9d2ba52d,0x94e9a56d,0xa52d94e9,0x9d2b9d2b,0xa52fa52d,0x9d2b9d2b,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0x8ad1314b,0x59cb9b13,0x51899b13,0x51899b13,0x5189828f,0x5189828f,0x598992d1,0x314b8ad1,0x8ad1314b,0x9b139b13,0x828f9b13,0x1885728f,0x728f1885,0x828f828f,0x92cf92d1,0x314b8ad1, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe739e739,0xffffffff,0xef7bf7bd,0xd6b5e739,0xdef7bdef,0xf7bde739,0xdef7def7,0xfffff7bd,0x125d2215,0x1a9f2215,0x22151a9f,0x1a9f1a9f,0x22e11a9f,0x125d2215,0x19911a9f,0x22151a9f,0xefffefff,0xe7bdefff,0xefffefff,0xe7bdefff,0xefffffff,0xe7bdefff,0xffffffff,0xefffefff,0x757f8dff,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f8dff,0x757f757f,0x757f757f, +0x93537a8f,0x7a8f7a8f,0x7a8f59cb,0x93539353,0x59cb7a8f,0x59cbbc17,0xbc177a8f,0x93539353,0x0b070000,0x14070a85,0x0b471449,0x0b870a85,0x0a851449,0x14091407,0x0a850a85,0x00000b07,0x01430000,0x13c70b87,0x14091407,0x0b070bc7,0x0b470143,0x138713c9,0x14491449,0x00000b07,0x0b070000,0xdee7dee7,0xdee7dee7,0xdee7dee7,0xdee7dee7,0xdee7dee7,0xdee7dee7,0x00000b07, +0xa56fadb3,0x8ca79ceb,0x9d2b9d2b,0xad6f9d2b,0xad6fa52d,0xa52da56f,0x9d2ba56d,0x9d2da56f,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0xe7770000,0x00009619,0xaedd760b,0x00008557,0x728f314b,0x498992cf,0x49899b13,0x39479b13,0x41499b13,0x394792d1,0x3947828f,0x314b728f,0x728f314b,0x9b1392cf,0x9b139b13,0x728f9b13,0x92d1728f,0x828f92d1,0x828f828f,0x314b728f, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xf7bdf7bd,0xdef7def7,0xe739f7bd,0xef7be739,0xef7bffff,0xd6b5d6b5,0xe739e739,0xce73d6b5,0x00000a1b,0x000022e1,0x1a9f0000,0x00000000,0x00000000,0x000022e1,0x125d0000,0x1a9f0000,0xefffffff,0xe7bdffff,0xe7bde7bd,0xffffe7bd,0xffffffff,0xffffffff,0xefffffff,0xe7bdefff,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f, +0x7a8f9353,0xbc1759cb,0x59cb7a8f,0x59cb7a8f,0x7a8f7a8f,0x59cb7a8f,0x7a8f7a8f,0x93539353,0x0b070000,0x01430001,0x0b070b07,0x0b070001,0x00010143,0x0b070b07,0x01430001,0x00000b07,0x0a050000,0x144913c9,0x14090b87,0x00010ac5,0x13c90a05,0x13871449,0x13871409,0x00000b07,0x0b070000,0x0b070b07,0x0b070b07,0x0b070b07,0x0b070b07,0x0b070b07,0x0b070b07,0x00000b07, +0x9d2da52d,0x9d2b9d2b,0x9d2da52d,0xa56da52d,0xa52d8ca7,0x9d2b94a9,0x9ceba56f,0xa52d9d2b,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0x85570000,0x00006c11,0xaedd0000,0x00008557,0x7a91314b,0x728f728f,0x8ad1728f,0x728f8ad1,0x8ad18ad1,0x8291728f,0x8ad18ad1,0x314b7a91,0x7a91314b,0x728f728f,0x8ad1728f,0x728f8ad1,0x8ad18ad1,0x8291728f,0x8ad18ad1,0x314b7a91, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce73c631,0xe739f7bd,0xd6b5ce73,0xfffff7bd,0xd6b5def7,0xf7bde739,0xce73ce73,0xf7bdef7b,0x1a9f2215,0x1a9f2215,0x2a571a9f,0x1a9f1a9f,0x1a9f22e1,0x1a9f1151,0x32991a9f,0x2a571a9f,0xffffffff,0xefffffff,0xe7bdefff,0xe7bde7bd,0xe7bde7bd,0xffffefff,0xefffe7bd,0xffffe7bd,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f, +0x7a8f9353,0x9353bc17,0x7a8f9353,0x93538421,0x93539353,0x7a8f7a8f,0x93539353,0x59cb7a8f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x0a050000,0x140913c9,0x14071387,0x09c50b47,0x14070a05,0x0b8713c9,0x13c71407,0x00000b07,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa56d9d2b,0x94e99d2b,0xa52dadf3,0xa56f94e9,0xad6f9d2d,0x9d2b9d2b,0x9d2d9d2b,0x94e99d2b,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0x314b2909,0x314b314b,0x314b314b,0x314b314b,0x314b314b,0x314b314b,0x314b314b,0x314b314b,0x314b2909,0x314b314b,0x314b314b,0x314b314b,0x314b314b,0x314b314b,0x314b314b,0x314b314b, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xac51b495,0xac51ac51,0xb495ac51,0xac93b495,0xb495ac51,0xb495b495,0xb495b495,0x8b4db495,0xa529a529,0xad6ba529,0xbdefb5ad,0xbdefc631,0xbdefbdef,0xc631c631,0xc631c631,0xbdefc631,0x00000000,0x5a498b8f,0x00000000,0x00000000,0x00000000,0x00000000,0x6a8bac55,0x00000000, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x49437205,0x69c571c5,0x41034103,0x69c569c5,0x30c14103,0x410369c5,0x69c55985,0x71c54903,0x61c99b51,0x9b519b51,0x61c961c9,0x9b519b51,0x414561c9,0x61c99b51,0x9b517a8d,0x9b5161c9, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00006601,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00006b05,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x934fb495,0x7acb8b4d,0x8b4d8b4d,0x8b4d8b4d,0x8b4d8b4d,0x8b4d8b4d,0x8b4d8b4d,0x6a07934f,0xc631bdef,0xbdefbdef,0xc631c631,0xc631c631,0xc631c631,0xc631c631,0xc631c631,0xa529c631,0xa4130000,0x4987a413,0x8b8f8b8f,0xa413a413,0xac55ac55,0xa413ac55,0x624b8b8f,0x0000a413, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c34943,0x51455985,0x41035143,0x618530c1,0x30c14103,0x41035143,0x41034103,0x71c530c3,0x414561c9,0x7a8d7a8d,0x61c97a8d,0x9b514145,0x414561c9,0x61c97a8d,0x61c961c9,0x9b514145, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00005d83,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x24039581,0x00000000,0x00000000,0x00000000,0x00000000,0x73050000,0x00000000,0x00000000,0x10c18b85,0x00000000,0x00000000,0x00007b45,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x934fb495,0x7a897a89,0x7a897a89,0x8b4d828b,0x82cb82cb,0x828b82cb,0x934f6249,0x6a07934f,0xc631c631,0xbdefbdef,0xbdefbdef,0xc631bdef,0xbdefbdef,0xbdefbdef,0xc631b5ad,0xa529bdef,0x624b0000,0x5a498b8f,0x624b624b,0x624b624b,0x624b624b,0x5a095a09,0x6a8b624b,0x0000624b, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c371c5,0x69c569c5,0x41035143,0x49432881,0x28814943,0x41036185,0x41034103,0x59854103,0x41459b51,0x9b519b51,0x61c97a8d,0x7a8d4145,0x41457a8d,0x61c99b51,0x61c961c9,0x7a8d61c9, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1b415d83,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x3b4384c3,0x00000000,0x00000000,0x00000000,0x00000000,0x7b450000,0x00002101,0x00000000,0x83850000,0x00000000,0x00000000,0x29418385,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x728b9b8f,0x00006209,0x00000000,0x938f0000,0x00006249,0x00000000,0x934d0000,0x51c77acb,0xbdefbdef,0x0000b5ad,0x00000000,0xc6310000,0x0000b5ad,0x00000000,0xc6310000,0xa529bdef,0x00000000,0x49875a09,0x00000000,0x00000000,0x00000000,0x00000000,0x41875a09,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x41035985,0x318d69c5,0x39035143,0x59853903,0x28814943,0x49434943,0x41034103,0x69c530c3,0x61c97a8d,0x52959b51,0x61c97a8d,0x9b5161c9,0x41457a8d,0x7a8d7a8d,0x61c961c9,0x9b514145, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000641,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x13415e41,0x00000000,0x00000000,0x00000000,0x00000000,0x5cc50000,0x00000000,0x00000000,0x5d430000,0x00000000,0x00000000,0x00006583,0x00000000,0x00000000,0x000093c3,0x7b450000,0x95010000,0x00003981,0x93c30000,0x39810000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x7a89318d,0x00007a89,0x00000000,0xa4110000,0x000082cb,0x00000000,0xa4510000,0x72098b4d,0xbdef4a53,0x0000bdef,0x00000000,0xce730000,0x0000bdef,0x00000000,0xce730000,0xad6bc631,0x00000000,0x5a498b8f,0x00000000,0x00000000,0x00000000,0x00000000,0x624ba413,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x41035985,0x51435143,0x39033903,0x49035985,0x28814903,0x294b5985,0x41034943,0x69c530c1,0x61c97a8d,0x7a8d7a8d,0x61c961c9,0x7a8d9b51,0x41457a8d,0x52959b51,0x61c97a8d,0x9b514145, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x1c430501,0x00000000,0x00000000,0x00000000,0x00000000,0x55430000,0x00000000,0x00000000,0x4c450000,0x00000000,0x00000000,0x00005e01,0x00000000,0x65830000,0x00001281,0x66010000,0x9e010000,0x00001b01,0x00000000,0x1b415d43,0x00000000,0x00000000,0x42019d81,0x93c30000,0x95012941,0x7b4532c1,0x95010000,0x00000000,0x00007305, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x8b4d6b5b,0x00006249,0x00000000,0xa4110000,0x0000828b,0x00000000,0xa4110000,0x6a078b4d,0xc6318421,0x0000b5ad,0x00000000,0xce730000,0x0000bdef,0x00000000,0xce730000,0xa529c631,0xa4130000,0x624b624b,0xac55ac55,0x8b8fac55,0x8b8f8b8f,0xac55624b,0x5a498b8f,0x0000a413, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x41034903,0x41036185,0x39033903,0x51452881,0x38c330c3,0x28815145,0x41034943,0x69c56185,0x61c961c9,0x61c99b51,0x61c961c9,0x9b514145,0x61c961c9,0x41459b51,0x61c97a8d,0x9b519b51, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000483,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x0b010641,0x00000000,0x00000000,0x00000000,0x00000000,0x5e410000,0x00001301,0x54c50000,0x55430000,0x000009c1,0x00000000,0x1bc35e01,0x00000000,0x00000000,0x00005d43,0x65830000,0x95c123c3,0x00004c05,0x54850000,0x1b010000,0x00000000,0x00005a85,0x43439501,0x00008385,0x8cc34a01,0x838532c1,0xa5c12941,0x00000000,0x18c18b85, +0x00000000,0x00000000,0x00000000,0xfec10000,0x0000fc41,0x00000000,0x00000000,0x00000000,0x934fb495,0x934f934f,0xa453a451,0xa411a453,0x8b4d8b4d,0x938fa411,0xa453a453,0x7209934f,0xc631c631,0xc631c631,0xce73ce73,0xce73ce73,0xc631c631,0xc631ce73,0xce73ce73,0xa529c631,0x624b0000,0x624bac55,0x5a095a09,0x624b5a09,0x624b624b,0x5a095a09,0x6a8bac55,0x0000624b, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x514369c5,0x49436185,0x28813903,0x41032881,0x208130c3,0x49035145,0x41034943,0x51436185,0x7a8d9b51,0x7a8d9b51,0x414561c9,0x7a8d4145,0x414561c9,0x7a8d9b51,0x61c97a8d,0x7a8d9b51, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x02410641,0x00000000,0x00000000,0x00000000,0x00000000, +0x06010000,0x00000000,0x00000000,0x05410000,0x00000000,0x00000000,0x00000681,0x00000000,0x00000000,0x00005dc3,0x5e410000,0x55030a81,0x00001301,0x55430000,0x00000000,0x00000000,0x00000000,0x1b018d01,0x00006e81,0x8d411b41,0x6e813b83,0x8d010000,0x00000000,0x00000000,0x00018bc5,0x32c1a5c1,0x31819541,0x7c430000,0x9d412a41,0x7c433181,0x7b450000,0x39c10000, +0x00000000,0x00000000,0x00000000,0xffe50000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x7acb9bcf,0x62096209,0x62096209,0x7acb6209,0x62496249,0x62096249,0x728b6209,0x51c77acb,0xbdefbdef,0xb5adb5ad,0xb5adb5ad,0xbdefb5ad,0xb5adb5ad,0xb5adb5ad,0xbdefb5ad,0xa529bdef,0x00000000,0x41875a09,0x00000000,0x00000000,0x00000000,0x00000000,0x41875a09,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c169c5,0x49435143,0x28813903,0x51432881,0x208130c3,0x49034103,0x39033903,0x51436185,0x41459b51,0x7a8d7a8d,0x414561c9,0x9b514145,0x414561c9,0x7a8d7a8d,0x61c961c9,0x7a8d9b51, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1c8505c3,0x00000000,0x00000000,0x00000000,0x00000000, +0x06010000,0x00001c43,0x05010000,0x4cc50000,0x00000b01,0x00000000,0x24850601,0x00000000,0x00000000,0x1b815543,0x00006601,0x5dc32403,0x5d830ac1,0x55030000,0x00000000,0x00000000,0x00000000,0x32c19e01,0x2c858d01,0x95810000,0x95c132c1,0x8d412c85,0x00000000,0x00006583,0x42019541,0x4383a5c1,0x32c1a5c1,0x8cc30000,0x95411981,0xa5c13b01,0x95410000,0x00002141, +0x00000000,0x00000000,0x00000000,0x7b0f0000,0x000049c9,0x00000000,0x00000000,0x00000000,0x934fb495,0x000082cb,0x00000000,0xa4530000,0x000082cb,0x00000000,0xa4530000,0x6a07934f,0xc631c631,0x0000c631,0x00000000,0xce730000,0x0000bdef,0x00000000,0xc6310000,0xa529bdef,0x00000000,0x6a8bac55,0x00000000,0x00000000,0x00000000,0x00000000,0x6a8bac55,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c15985,0x49435143,0x38c33903,0x51432881,0x208130c3,0x38c35145,0x28813903,0x41035143,0x41457a8d,0x7a8d7a8d,0x61c961c9,0x9b514145,0x414561c9,0x61c99b51,0x414561c9,0x61c97a8d, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000405,0x00000000,0x00000000,0x00000000,0x00000000,0x05830000,0x00000000,0x00000000,0x06010000,0x00000000,0x00000000,0x000005c3,0x00000000, +0x00000000,0x000005c1,0x05c10000,0x56010b01,0x00000a41,0x05010000,0x1c030000,0x00000000,0x00000000,0x13015e01,0x24035e01,0x74830000,0x54c51b83,0x5e011341,0x00000000,0x00005d83,0x00006583,0x43c395c1,0x2ac184c3,0x8d410000,0x8d013b43,0x95413b83,0x4c450000,0x1b810000,0x32c1a5c1,0x43839d41,0x43838c83,0x95410000,0x9d412a41,0x7c4332c1,0x7c430000,0x00003b01, +0x00000000,0x00000000,0x00000000,0x93910000,0x00003947,0x00000000,0x00000000,0x00000000,0x8b4dac51,0x00007a89,0x00000000,0xa4510000,0x00007a89,0x00000000,0xa4110000,0x6a078b4d,0xc631c631,0x0000bdef,0x00000000,0xce730000,0x0000bdef,0x00000000,0xce730000,0xa529c631,0xa4130000,0x5a498b8f,0xac55ac55,0x8b8f8b8f,0x8b8f8b8f,0xa413a413,0x5a49ac55,0x0000a413, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c35985,0x41036185,0x49433903,0x514538c3,0x38c34103,0x39035145,0x28813903,0x51436185,0x41457a8d,0x61c99b51,0x7a8d61c9,0x9b5161c9,0x61c97a8d,0x61c99b51,0x414561c9,0x7a8d9b51, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x01c104c5,0x00000000,0x00000000,0x00000000,0x00000000,0x05030000,0x00000b41,0x06030000,0x4d830000,0x00001443,0x00000000,0x13c30601,0x00000000, +0x00000000,0x13c35601,0x00000541,0x55831bc3,0x05411bc3,0x55830000,0x00000000,0x00000000,0x00005d83,0x1bc35d83,0x1bc35e41,0x96010000,0x55031a01,0x5e010a81,0x55030000,0x13410000,0x1b819581,0x3b837403,0x2a818d01,0x84830000,0x8d0132c1,0x8d412ac1,0x95410000,0x000009c1,0x4bc38483,0x3b038483,0x2a419d81,0x8c830000,0x7c433b01,0x7c433b03,0x74030000,0x00001981, +0x00000000,0x00000000,0x00000000,0x93910000,0x00004189,0x00000000,0x00000000,0x00000000,0x8b4db495,0x0000828b,0x00000000,0xa4110000,0x00007a89,0x00000000,0xa4510000,0x6a078b4d,0xc631c631,0x0000bdef,0x00000000,0xce730000,0x0000bdef,0x00000000,0xce730000,0xa529bdef,0x624b0000,0x624ba413,0x5a095a09,0x624b5a09,0x624b624b,0x624b624b,0x624ba413,0x0000624b, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x41035985,0x61856185,0x39034943,0x49032881,0x38c34903,0x59852881,0x61853903,0x410339cf,0x61c97a8d,0x9b519b51,0x61c97a8d,0x7a8d4145,0x61c97a8d,0x9b514145,0x9b5161c9,0x61c96b5b, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000585,0x00000000,0x00000000,0x00000000,0x00000000,0x06830000,0x00000000,0x00000000,0x05c50000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x000005c3,0x04c30000,0x4dc31403,0x00000b41,0x05430000,0x14430000,0x00000000, +0x00000000,0x13c35583,0x13414d43,0x74830000,0x55c31341,0x55831341,0x00000000,0x00000701,0x1b815543,0x1b817cc3,0x24438dc1,0x8d810000,0x960143c3,0x5d8312c1,0x5d830000,0x000012c1,0x3b038d01,0x118184c3,0x32c18483,0x84830000,0x74432241,0x8d012ac1,0x8d010000,0x00003b03,0x2a419501,0x2a417403,0x4343a5c1,0x84830000,0x7c432a41,0x8cc319c1,0x95410000,0x00001141, +0x00000000,0x00000000,0x00000000,0x9bd50000,0x00004189,0x00000000,0x00000000,0x00000000,0x728b9bcf,0x938f7acb,0x934d934d,0x938f934d,0x938f7acb,0x938f938f,0x934d934d,0x51c7728b,0xbdefbdef,0xce73c631,0xc631c631,0xc631c631,0xc631bdef,0xc631c631,0xbdefbdef,0x9ce7b5ad,0x00000000,0x4987624b,0x00000000,0x00000000,0x00000000,0x00000000,0x41875a09,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x41035985,0x61854103,0x39035143,0x49433903,0x4943294b,0x61852881,0x61854103,0x30c34103,0x61c97a8d,0x9b5161c9,0x61c97a8d,0x7a8d61c9,0x7a8d5295,0x9b514145,0x9b5161c9,0x414561c9, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x03810545,0x00000000,0x00000000,0x00000000,0x00000000,0x06050000,0x00001485,0x00000000,0x45830000,0x00000bc3,0x00000000,0x00000585,0x00000000,0x00000000,0x13c344c5,0x00000641,0x4d830281,0x04031383,0x4dc30000,0x00000000,0x00000000, +0x00000481,0x138155c3,0x0b014405,0x6c830000,0x4cc51a01,0x44851383,0x04410000,0x2d050000,0x13015d83,0x22418541,0x3b835b43,0x74830000,0x74833343,0x7c8343c3,0x7cc30000,0x00001341,0x2ac19541,0x2a8184c3,0x2a417443,0x74430000,0x74432241,0x744319c1,0x8d410000,0x000032c1,0x32c18c83,0x11817c43,0x43838483,0x6b850000,0x7c432201,0x6bc51981,0x8cc30000,0x000032c1, +0x00000000,0x00000000,0x00000000,0x93930000,0x00003947,0x00000000,0x00000000,0x00000000,0x934fb495,0xa453934f,0xa411a453,0xa411a453,0xa4118b4d,0xa411a411,0x938fa451,0x7209934f,0xc631c631,0xce73c631,0xce73ce73,0xce73ce73,0xce73c631,0xc631ce73,0xbdefc631,0xa529b5ad,0x00000000,0x6a8bac55,0x00000000,0x00000000,0x00000000,0x00000000,0x4987a413,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c34943,0x69c54103,0x41035143,0x61852881,0x41033903,0x51434103,0x69c54103,0x69c569c5,0x414561c9,0x9b5161c9,0x61c97a8d,0x9b514145,0x61c961c9,0x7a8d61c9,0x9b5161c9,0x9b519b51, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x07050000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x000006c3,0x06430000,0x45430000,0x00000b41,0x05450000,0x0b810000,0x00000000,0x00000000,0x02814e01,0x1c854503,0x7e010000,0x45030b41,0x454301c1,0x00000000,0x00000583, +0x0a415601,0x13c38541,0x018174c3,0x64030000,0x74831201,0x4cc50a41,0x44850000,0x00000201,0x13417483,0x33017483,0x00817cc3,0x63c30000,0x63c31a01,0x74831a01,0x8d410000,0x00002a81,0x3b017c83,0x2a417443,0x19c18483,0x63c50000,0x6bc51181,0x638519c1,0x63c50000,0x00003301,0x2a417403,0x19c16b83,0x2a416bc5,0x6b850000,0x6bc50901,0x6b8319c1,0x6bc50000,0x00002a41, +0x00000000,0x00000000,0x00000000,0x628d0000,0x00003987,0x00000000,0x00000000,0x00000000,0x8b4dac93,0x82cb6249,0x82cb82cb,0x8b4d82cb,0x828b82cb,0x7a89828b,0x8b4d7a89,0x72098b4d,0xc631c631,0xbdefbdef,0xc631c631,0xc631c631,0xbdefbdef,0xb5adb5ad,0xb5adb5ad,0xa529b5ad,0xa4130000,0x6a8b624b,0xac558b8f,0x8b8fac55,0xac55ac55,0xa4138b8f,0x5a498b8f,0x0000a413, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x59854943,0x51454903,0x41034105,0x61854103,0x41036185,0x514330c1,0x30c34103,0x59855985,0x7a8d61c9,0x7a8d61c9,0x61c95a0b,0x9b5161c9,0x61c99b51,0x7a8d4145,0x414561c9,0x7a8d7a8d, +0x00000000,0x00000000,0x00000000,0x000005c5,0x00000000,0x00000000,0x00000000,0x00000000,0x05850000,0x00000000,0x00000000,0x3dc30000,0x00001d47,0x00000000,0x00000645,0x00000000,0x00000000,0x1d053c45,0x00000505,0x3cc51445,0x04850301,0x3cc50000,0x00000000,0x00000000,0x000005c3,0x13c34d83,0x02c13c85,0x7d410000,0x448533c3,0x4e0102c1,0x04830000,0x0b810000, +0x13c34cc5,0x2b0374c3,0x22816c43,0x5b830000,0x74830981,0x6c432241,0x5bc50000,0x00000a01,0x1a016c03,0x1a016c03,0x224163c5,0x63830000,0x5b850141,0x74830141,0x63830000,0x00003301,0x1a017403,0x11c16383,0x2a416bc5,0x6bc50000,0x42430901,0x6bc50941,0x63c50000,0x00000901,0x09416bc5,0x09017c43,0x09016383,0x63430000,0x63450901,0x5b450901,0x5b030000,0x00000901, +0x00000000,0x00000000,0x00000000,0x9bd30000,0x00003947,0x00000000,0x00000000,0x00000000,0x934fb495,0x8b4d7a89,0x934f8b4d,0xa411934f,0x934f82cb,0x42118b4d,0x18c7294b,0x72097209,0xc631c631,0xc631bdef,0xc631c631,0xce73c631,0xc631bdef,0xb5adbdef,0xa529bdef,0x9ce7a529,0x624b0000,0x5a498b8f,0x5a095a09,0x5a096a8b,0x624b624b,0x5a09624b,0x6a8bac55,0x0000624b, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x49436185,0x69c530c3,0x410369c5,0x410330c3,0x410369c5,0x514330c3,0x30c34103,0x598571c5,0x61c97a8d,0x9b514145,0x61c99b51,0x61c94145,0x61c99b51,0x7a8d4145,0x414561c9,0x7a8d9b51, +0x00000000,0x00000000,0x00000000,0x05450000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000685,0x00000000,0x3d830000,0x00000381,0x07050000,0x14450000,0x00000000,0x00000000,0x01c14505,0x02c13c45,0x5c030000,0x3cc50281,0x34050241,0x00000000,0x00000000,0x13c34d83,0x0b416483,0x02016cc3,0x64430000,0x75012b03,0x45430201,0x3c450000,0x00000241, +0x0a416403,0x224163c3,0x11c16c43,0x53450000,0x64030101,0x63c31a41,0x64030000,0x00000141,0x09815b83,0x09814b03,0x01414ac3,0x53030000,0x53030101,0x6c030101,0x5b850000,0x00000101,0x11815b45,0x00c15b43,0x09416385,0x4a830000,0x5b430941,0x5b030001,0x6bc50000,0x00000901,0x09416b83,0x19c15b03,0x00c16385,0x5b030000,0x5b030081,0x5b030081,0x63430000,0x00000041, +0x00000000,0x00000000,0x00000000,0x628d0000,0x00003145,0x00000000,0x00000000,0x00000000,0x7acb318d,0x7acb6249,0x728b728b,0x934d7acb,0x7acb6249,0x18c77acb,0x934d51c7,0x51c751c7,0xbdef4a53,0xbdefb5ad,0xb5adb5ad,0xb5adb5ad,0xb5ada529,0xb5adad6b,0xb5adbdef,0x9ce7a529,0x00000000,0x49c9624b,0x00000000,0x00000000,0x00000000,0x00000000,0x41874187,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x61856185,0x71c538c3,0x59855985,0x69c54903,0x41035985,0x69c54903,0x49435985,0x38c371c5,0x7a8d7a8d,0x9b514145,0x7a8d7a8d,0x9b5161c9,0x61c97a8d,0x9b5161c9,0x61c97a8d,0x41459b51, +0x00000000,0x000005c5,0x00000000,0x07050000,0x00000341,0x06050000,0x00000000,0x00000000,0x00000000,0x14c53e41,0x00000485,0x3d030000,0x05c50341,0x3cc50000,0x00000000,0x00000000,0x000004c5,0x02816483,0x01c15c03,0x6d010000,0x53c50981,0x64430281,0x04450000,0x00000000,0x0b413c05,0x12016483,0x1a416483,0x64830000,0x5c0311c1,0x5bc522c1,0x5c030000,0x000001c1, +0x094163c3,0x09415bc5,0x11c16403,0x64030000,0x534500c1,0x53450981,0x53850000,0x00000981,0x01015303,0x00015303,0x00014ac3,0x42830000,0x42830041,0x53450041,0x6c030000,0x000000c1,0x00815b43,0x00816385,0x00c16385,0x63850000,0x42830001,0x63850081,0x53030000,0x00000941,0x090152c3,0x00416b83,0x00c152c3,0x52c30000,0x42430041,0x63450041,0x4a830000,0x00000081, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x8b4d6b5b,0x8b4d7a89,0x934f8b4d,0xa451934f,0x934f7a89,0x934f934f,0xa453934f,0x6a07934f,0xc6318421,0xc631bdef,0xc631c631,0xce73c631,0xc631bdef,0xc631c631,0xc631bdef,0xad6bbdef,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0xa2c3a2c3,0xd3c5d3c5,0xd3c5a2c3,0xa2c3d3c5,0xd3c5a2c3,0xd3c5d3c5,0xd3c5a2c3,0xa2c3a2c3,0xa2d7c39d,0x9a95a2d7,0x71cfc41b,0x4909514b,0x80434909,0xa2d7c39d,0x490971cf,0x8211aad7, +0x624f5a4f,0x49cb3947,0x41493947,0x31053907,0x498b418b,0x6291498b,0x39074189,0x520d3105,0x7acbfdd7,0x73537acb,0x73537353,0x7acbfdd7,0x73537353,0xfdd77353,0xc451fdd7,0x73537acb,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x934fb495,0x938f8b4d,0xa451a451,0xa411a411,0xa4118b4d,0xa451a411,0xa451a411,0x6a07934f,0xc631d6b5,0xc631c631,0xce73ce73,0xce73ce73,0xce73c631,0xce73ce73,0xc631c631,0xa529b5ad,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe513a2c3,0xe513a2c3,0xd3c5e487,0xd3c5a2c3,0xa2c3e487,0xe487e487,0xd3c5e487,0xa2c3a2c3,0xa2d7c39d,0x8a534001,0x49091843,0x8043c39d,0x58014909,0x58019295,0x69496843,0xab19618d, +0x520d4189,0x624f6ad3,0x624f6a93,0x51cd7b15,0x39073947,0x62516251,0x31053105,0x49cd5a4f,0xffff7acb,0x49c5c451,0xfdd77353,0xffffc451,0x735349c5,0x7acbfdd7,0xfffffea7,0x49c5c451,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x934fb495,0x8b4d8b4d,0x8b4d8b4d,0x8b4d8b4d,0x934f934f,0x8b4d934f,0x934f7acb,0x6a07934f,0xc631d6b5,0xc631c631,0xc631c631,0xc631c631,0xbdefc631,0xbdefbdef,0xb5adb5ad,0xa529b5ad,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe513d3c5,0xa2c3e513,0xe487e487,0xe513a2c3,0xa2c3e487,0xe487e487,0xa2c3e513,0xd3c5d3c5,0x71cf598d,0x28858a53,0x80434909,0x5801c39d,0x10432043,0x58017a11,0x598d2885,0x8a953843, +0x498b6291,0x31056251,0x624f3907,0x5a4f3907,0x31055a4f,0x31058357,0x41494189,0x4149520d,0x7acb7acb,0x735349c5,0x73537acb,0x7acb49c5,0x735349c5,0x49c57353,0xc451c451,0x735349c5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x728b9b8f,0x62496209,0x62496249,0x7acb6249,0x62496249,0x62096209,0x728b6209,0x51c77acb,0xbdefc631,0xbdefbdef,0xbdefbdef,0xbdefb5ad,0xad6bb5ad,0xad6bad6b,0xad6bad6b,0x9ce7ad6b,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe487d3c5,0xe487e487,0xe487a2c3,0xe487a2c3,0xa2c3e487,0xd3c5e487,0xd3c5a2c3,0xd3c5e487,0x41097211,0x598d1043,0x69cfaad7,0xab97a2d7,0x490930c7,0x38c72885,0xbb5b4909,0x598d8843, +0x39074189,0x31057b15,0x62517b15,0x5a4f3105,0x3947418b,0x498b498b,0x41894189,0x93db49cb,0x49c57353,0xfdd77353,0x7acb7acb,0x49c57353,0xfdd77353,0x73537acb,0x49c549c5,0x49c57353,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x8b4db495,0x8b4d7a89,0x934f8b4d,0xa411934f,0x8b4d82cb,0x7acb8b4d,0xa4518b4d,0x72098b4d,0xc631ce73,0xc631bdef,0xc631c631,0xc631c631,0xb5adb5ad,0xb5adb5ad,0xbdefb5ad,0xa529b5ad,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3c5a2c3,0xe487e487,0xd3c5d3c5,0xe487a2c3,0xe487d3c5,0xa2c3e487,0xe513e487,0xa2c3d3c5,0xc39de521,0x598d8a8f,0x8a95c39d,0x20438a95,0x9295598d,0xab199253,0xab554109,0x598d7843, +0x418b51cd,0x72d56ad3,0x31053907,0x8357498b,0x6291418b,0x7b155a4f,0x41898357,0x5a4f51cd,0x73537353,0xc451fdd7,0xc451fea7,0x735349c5,0xc451fdd7,0x49c57acb,0x73537353,0x49c5fdd7,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x8b4dac51,0x8b4d6249,0x8b4d8b4d,0xa411934f,0x8b4d828b,0x8b4d8b4d,0xa4118b4d,0x6a078b4d,0xc631ce73,0xc631b5ad,0xc631c631,0xc631c631,0xb5adb5ad,0xb5adb5ad,0xbdefb5ad,0xa529b5ad,0x00000000,0x00000000,0x00000000,0xf8010000,0x0000f801,0x00000000,0x00000000,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa2c3a2c3,0xa2c3a2c3,0xa2c3e487,0x39413941,0xe487e487,0xe487a2c3,0xa2c3d3c5,0xa2c3a2c3,0x8a954801,0x598d71cf,0x600169cf,0x30c78a53,0xdc21bb5b,0x92958253,0x598d9291,0x28851043, +0x3907418b,0x62513907,0x51cd3105,0x6a913107,0x418b3947,0x31075a4f,0x72d36a91,0x41498b99,0x7acb7353,0xfea77acb,0xfea7ffff,0x735349c5,0xffffc451,0x49c549c5,0xfdd77353,0x49c5c451,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x7bdf0000,0x0000739d,0x00000000,0x00000000,0x00000000,0x934fb495,0x8b4d82cb,0x934f934f,0xa411934f,0x8b4d7a89,0x934f7acb,0xa453934f,0x7209934f,0xbdefc631,0xb5adb5ad,0xb5adb5ad,0xbdefb5ad,0xb5adad6b,0xb5adad6b,0xbdefb5ad,0xa529b5ad,0x00000000,0x00000000,0x00000000,0xfec1f801,0xf801fc41,0x00000000,0x00000000,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe487d3c5,0xe487e487,0x3941a2c3,0xb401e541,0xa2c33941,0xd3c5e487,0xe487a2c3,0xd3c5d3c5,0x8a535801,0x598d71cf,0x1843594b,0x514b30c7,0x604361cf,0x8a53b319,0x8a53618d,0x30435801, +0x6a913105,0x41893907,0x6a918357,0x39076a93,0x3947418b,0x31058357,0x6a916251,0x6a91418b,0x49c57353,0xc45149c5,0xc451fea7,0x735349c5,0x49c57acb,0x73537353,0xc4517acb,0x49c5ffff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x84210000,0x0000739d,0x00000000,0x00000000,0x00000000,0x7acb9bcf,0x934d728b,0x934d934d,0x938f934d,0x938f7acb,0x934d934d,0x934d934d,0x51c77acb,0xad6bb5ad,0xad6ba529,0xa529a529,0xa529a529,0xad6b9ce7,0xa529a529,0xa529a529,0x8c63a529,0x00000000,0x00000000,0x00000000,0xffe5f801,0xf801ffff,0x00000000,0x00000000,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3c5a2c3,0xe487d3c5,0x3941e487,0xe541b401,0x3941b401,0xa2c3a2c3,0xe487e487,0xd3c5e513,0x8a5371cf,0x514b2885,0xc39d9a95,0x41094909,0x2843618d,0x929530c7,0x30c75801,0x90854001, +0x62516293,0x41896a91,0x4189498b,0x49cb3105,0x6ad3520d,0x5a4f6251,0x62516251,0x72d33907,0x73537353,0x49c57353,0x7acb7acb,0x735349c5,0x735349c5,0x7acbfdd7,0x7acb7353,0x49c5fea7,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x7b0f0000,0x00006a8d,0x00000000,0x00000000,0x00000000,0x934fb495,0x934f934f,0x7acb934f,0x934f8b4d,0x8b4d934f,0x8b4d8b4d,0x934f934f,0x6a07934f,0xa529ad6b,0xa529a529,0x9ce7a529,0x9ce79ce7,0x9ce79ce7,0x9ce79ce7,0x94a59ce7,0x7bdf94a5,0x00000000,0x00000000,0x00000000,0xf8010000,0x0000a801,0x00000000,0x00000000,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa2c3d3c5,0xa2c3a2c3,0xa2c3a2c3,0xb4013941,0xa2c3e541,0xd3c5e487,0xa2c3a2c3,0xa2c3a2c3,0x104371cf,0x8843598d,0xab978043,0xa2d79b13,0x71cfb35b,0x4109514b,0x08432885,0xdd1fdc21, +0x9c1d6ad3,0x49cb72d3,0x62915a0f,0x3105498b,0x41894189,0x31056251,0x31053105,0x6251624f,0xc451fdd7,0x73537acb,0x7acb49c5,0x735349c5,0xfdd77353,0x7acbc451,0x735349c5,0x49c57acb,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x7b0f0000,0x000049c9,0x00000000,0x00000000,0x00000000,0x8b4dac51,0x7a897a89,0x82cb7a89,0x8b4d828b,0x7a897a89,0x62497a89,0x8b4d82cb,0x6a078b4d,0x9ce7a529,0x94a594a5,0x94a594a5,0x9ce794a5,0x8c6394a5,0x8c638c63,0x94a594a5,0x842194a5,0x00000000,0x00000000,0x00000000,0x93910000,0x00003947,0x00000000,0x00000000,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe513d3c5,0xe487e487,0xe487e487,0x3941a2c3,0xa2c3a2c3,0xa2c3e487,0xd3c5e487,0xd3c5d3c5,0x49097a11,0x8043c39d,0x30c76001,0x4001a2d7,0x8211e561,0x598dbc19,0xd3df514b,0x58015801, +0x520d4149,0x624f51cb,0x83577b15,0x39077b15,0x7b15520d,0x3947418b,0x31053105,0x6a914149,0xfffffdd7,0x49c5fea7,0x49c57353,0xfdd77353,0xc4517acb,0xc451ffff,0x735349c5,0x49c57acb,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x628d0000,0x00003947,0x00000000,0x00000000,0x00000000,0x8b4d318d,0x8b4d828b,0x934f934f,0xa4118b4d,0x8b4d7a89,0x8b4d8b4d,0xa4518b4d,0x6a078b4d,0x9ce74a53,0x9ce794a5,0x9ce79ce7,0x9ce79ce7,0x94a58c63,0x94a594a5,0x9ce794a5,0x7bdf94a5,0x00000000,0x00000000,0x00000000,0x93910000,0x00004189,0x00000000,0x00000000,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe487a2c3,0xa2c3d3c5,0xa2c3a2c3,0xa2c3e513,0xa2c3e487,0xd3c5e513,0xe487a2c3,0xd3c5e513,0x78434909,0x8a53ab55,0x104371cf,0x6843a2d7,0x71cf8a53,0x18437a11,0x4909618d,0x79cf7043, +0x41894189,0x72d36a93,0x31053105,0x418972d3,0x6a93498b,0x5a4f6a93,0x31056251,0x6a933105,0x7acb7acb,0x735349c5,0x73537353,0x73537353,0x7acb49c5,0x7acbc451,0x735349c5,0x735349c5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x6acf0000,0x00003947,0x00000000,0x00000000,0x00000000,0x728b6b5b,0x7acb6249,0x728b728b,0x938f728b,0x7acb6249,0x7acb7acb,0x934d728b,0x51c7728b,0x94a58421,0x94a58c63,0x8c6394a5,0x94a58c63,0x94a58c63,0x8c638c63,0x94a58c63,0x7bdf8c63,0x00000000,0x00000000,0x00000000,0x9bd50000,0x00004189,0x00000000,0x00000000,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa2c3a2c3,0xe487d3c5,0xa2c3e487,0xa2c3e487,0xd3c5e487,0xe487d3c5,0xd3c5a2c3,0xa2c3e487,0x3843598d,0x8253ab19,0x1843618d,0x58018a53,0x71cf9ad7,0x30432885,0x4909bb5b,0x30c73843, +0x6251520d,0x7b153947,0x31056251,0x49cb624f,0x39476251,0x6a9393db,0x6a93624f,0x498b8b99,0x49c57353,0x7acb7353,0x735349c5,0xfdd7fdd7,0x49c57353,0x49c57acb,0x7acb7353,0x73537353,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x6acf0000,0x00003947,0x00000000,0x00000000,0x00000000,0x934fb495,0x934f82cb,0x8b4d934f,0xa411934f,0x8b4d7a89,0x8b4d8b4d,0x938f8b4d,0x7209934f,0x94a594a5,0x94a58c63,0x94a594a5,0x9ce794a5,0x94a58c63,0x94a594a5,0x94a594a5,0x7bdf94a5,0x00000000,0x00000000,0x00000000,0x93930000,0x00003947,0x00000000,0x00000000,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3c5d3c5,0xe487d3c5,0xa2c3e487,0xa2c3e487,0xe487e513,0xe487a2c3,0xa2c3e487,0xd3c5e487,0xa2d7c39d,0x30c72885,0x18432885,0x580161cf,0x18434109,0x7043c39d,0x71cf8a53,0x598d8a8f, +0x72d33105,0x72d33105,0x62513107,0x4189624f,0x5a0f4189,0x6ad3498b,0x5a4f624f,0x51cd49cb,0x73537353,0xc451fdd7,0x735349c5,0x7acb49c5,0x7353ffff,0x735349c5,0xc451fdd7,0x49c57acb,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x7b0f0000,0x00006a8d,0x00000000,0x00000000,0x00000000,0x8b4dac93,0xa4537acb,0xa453a453,0xa411a453,0xa451934f,0xa411a451,0xa411a411,0x72098b4d,0x94a594a5,0x9ce78c63,0x9ce79ce7,0x9ce79ce7,0x9ce794a5,0x9ce79ce7,0x9ce79ce7,0x739d94a5,0x00000000,0x00000000,0x00000000,0x628d0000,0x00003987,0x00000000,0x00000000,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe487d3c5,0xe487e513,0xd3c5a2c3,0xa2c3d3c5,0xe487e513,0xa2c3d3c5,0xe487e487,0xd3c5a2c3,0x8253cbdf,0xcb9d618d,0xaad77843,0x1843598d,0x988561cf,0x5801b35b,0x58019ad7,0x30c77a11, +0x8b994149,0x3107624f,0x31053105,0x414972d3,0x7b155a0f,0x418b8357,0x4189498b,0x41894189,0xfdd77353,0xffffc451,0x49c5fea7,0x49c57353,0x49c5c451,0xfdd77353,0xffffc451,0x49c5c451,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x7b0f0000,0x00006a8d,0x00000000,0x00000000,0x00000000,0x934fb495,0x8b4d8b4d,0x934f8b4d,0x8b4d934f,0x934f934f,0x8b4d8b4d,0x934f934f,0x7209934f,0x94a594a5,0x94a594a5,0x94a594a5,0x94a594a5,0x94a594a5,0x94a594a5,0x94a594a5,0x739d94a5,0x00000000,0x00000000,0x00000000,0x9bd30000,0x00003947,0x00000000,0x00000000,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe487a2c3,0xd3c5e487,0xe487a2c3,0xa2c3d3c5,0xe487d3c5,0xa2c3e487,0xe487d3c5,0xa2c3e487,0x9295698d,0xab192043,0x69cf5801,0x38435801,0x38434909,0x6843ab97,0x8a5392d7,0x30c72885, +0x5a4f51cd,0x31058357,0x418b49cd,0x31078b99,0x7b154189,0x5a0f5a4f,0x41494149,0x7b1549cb,0x7acb7353,0xc4517acb,0x7acb7acb,0x735349c5,0x49c549c5,0x7acb7353,0x7acb7acb,0x49c57acb,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x93910000,0x0000628d,0x00000000,0x00000000,0x00000000,0x51c77acb,0x59c751c7,0x51c751c7,0x51c759c7,0x51c751c7,0x51c751c7,0x51c74987,0x51c751c7,0x7bdf8421,0x739d739d,0x739d739d,0x739d739d,0x739d739d,0x739d739d,0x739d739d,0x739d739d,0x00000000,0x00000000,0x00000000,0x628d0000,0x00003145,0x00000000,0x00000000,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa2c3a2c3,0xd3c5a2c3,0xd3c5a2c3,0xa2c3a2c3,0xd3c5d3c5,0xa2c3a2c3,0xd3c5d3c5,0xa2c3a2c3,0x698d69cf,0x38c74801,0x184358c5,0x38432885,0xab97a2d7,0x92914909,0x38c738c7,0x514b38c7, +0x5a0f8357,0x72d36a91,0x7b175a0f,0x3907498b,0x31053907,0x49cd5a0f,0x31053105,0x8b998357,0x49c57353,0x49c549c5,0x49c549c5,0x73537353,0x73537353,0x49c57353,0x49c549c5,0x49c549c5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x18851085,0x10851085,0x18c71885,0x10851085,0x18c718c7,0x10851043,0x18c718c7,0x10851085,0x39cf39cf,0x39cf39cf,0x42114211,0x39cf39cf,0x42114211,0x39cf39cf,0x42114211,0x39cf39cf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x28c31841,0x51c73103,0x31031041,0x10414987,0x28c328c3,0x390528c3,0x39053103,0x51c728c3,0xef77b5ad,0xef79ef79,0xbdedef79,0xdef5ef79,0xe779e6f5,0xffffffff,0xef39ffff,0xb5abef79,0xa2c3a2c3,0xa2c3d3c5,0xd3c5a2c3,0xa2c3d3c5,0xd3c5a2c3,0xa2c3a2c3,0xd3c5d3c5,0xa2c3a2c3,0xa2c3a2c3,0xa2c3d3c5,0xd3c5a2c3,0xa2c3d3c5,0xd3c5a2c3,0xa2c3a2c3,0xd3c5d3c5,0xa2c3a2c3, +0xa2c3a2c3,0xa2c3d3c5,0xf689e4c5,0xa2c3d3c5,0xd3c5a2c3,0xa2c3e4c5,0xd3c5d3c5,0xa2c3a2c3,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xc6310000,0xdef7def7,0xdef7def7,0xdef7def7,0xdef7def7,0xdef7def7,0xdef7def7,0x0000c631,0xc6310000,0xdef7def7,0xdef7def7,0x7901def7,0x60816081,0xdef7def7,0xdef7def7,0x0000c631, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x83110000,0x00008b8f,0x00000000,0x18c71885,0x21092109,0x18c720c7,0x18851885,0x10851085,0x18851085,0x10851043,0x18851885,0x42114211,0x4a534a53,0x42114211,0x42114211,0x39cf39cf,0x421139cf,0x39cf318d,0x421139cf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x28c31041,0x08013105,0x51871041,0x28c31041,0x10415187,0x518728c3,0x39051881,0x49871881,0xe779f779,0xdeb5def5,0xe779deb5,0xef39e779,0xef77e779,0xef79e779,0xef79ef77,0xef79f777,0xe513a2c3,0xa2c3e487,0xe487d3c5,0xd3c5e487,0xe487a2c3,0xa2c3e487,0xe487d3c5,0xa2c3e487,0xe513a2c3,0xa2c3e487,0xe487d3c5,0xd3c5e487,0xe487a2c3,0xa2c3e487,0xe487d3c5,0xa2c3e487, +0xe513a2c3,0xe4c5e487,0xffcff7cb,0xd3c5f6cd,0xf6cda2c3,0xe4c5ffcf,0xe487d3c5,0xa2c3e487,0xd6b50000,0xdef7def7,0xdef7def7,0xdef7def7,0xdef7def7,0xdef7def7,0xdef7def7,0x0000d6b5,0xc6310000,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0x0000c631,0x92470000,0xef7b7901,0x79017901,0x79017901,0x79017901,0x79017901,0x79017901,0x00009247, +0xa2890000,0xa289a289,0xa289a289,0xa289a289,0xa289a289,0xa289a289,0xa289a289,0x0000a289,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x520b0000,0xa529a529,0xa529a529,0x20c720c7,0x18851885,0x20c720c7,0x188518c7,0x20c718c7,0x18c718c7,0x210920c7,0x18c718c7,0x4a534211,0x42114211,0x4a534a53,0x42114211,0x4a534211,0x42114211,0x4a534a53,0x42114211,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x28c31001,0x104128c1,0x518728c3,0x28c31041,0x10415187,0x390528c3,0x39051881,0x51871881,0xefb9d6f7,0xef79e739,0xe6f5ef79,0xdeb5ef79,0xdeb7def5,0xb5ade779,0xe779ef79,0xdef5deb5,0xd3c5a2c3,0xa2c3e487,0xe487a2c3,0xe487e487,0xe513a2c3,0xa2c3e487,0xe487e487,0xa2c3e487,0xd3c5a2c3,0xa2c3e487,0x28012801,0xe487e487,0xe513a2c3,0xa2c32801,0xe487e487,0xa2c3e487, +0xd3c5a2c3,0xed85e487,0x48014801,0xf6cdffcf,0xffe5e4c5,0xed854801,0xe487f6cd,0xa2c3e487,0xdef70000,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7be8c7,0x0000def7,0xc6310000,0xc631ef7b,0xdef7c631,0xc631ef7b,0xdef7c631,0xc631ef7b,0xdef7c631,0x0000c631,0x92470000,0x81017901,0x79018101,0x81017901,0x79017901,0x81018101,0x79018101,0x00009247, +0xa2890000,0xa289bac9,0xbac9bac9,0xbac9bac9,0xbac9bac9,0xbac9bac9,0xbac9a289,0x0000a289,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xa529a529,0x6b5b6b5b,0x6b5b6b5b,0x18851885,0x20c718c7,0x18851885,0x20c71885,0x18851085,0x20c720c7,0x18851885,0x20c72109,0x39cf4211,0x4a534211,0x39cf4211,0x4a534211,0x421139cf,0x4a534a53,0x39cf4211,0x4a534a53,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x10413103,0x104128c3,0x39053905,0x28c31041,0x10415187,0x518728c3,0x51c71041,0x39051041,0xffffef79,0xb5ede779,0x10c541cf,0x398f20c9,0xf779ef39,0xefb9ef39,0xef79ef79,0xef79def5,0xd3c5a2c3,0xd3c5e487,0xe487a2c3,0xe513d3c5,0xe513a2c3,0xa2c3e487,0xe487e513,0xa2c3d3c5,0xd3c5a2c3,0xa2c3e487,0x40812801,0xe5132801,0x2801a2c3,0x28012801,0xe487a2c3,0xa2c3d3c5, +0xd3c5a2c3,0xe4c5f6cd,0xb50d4801,0xffe54801,0x4801ed85,0x48014801,0xf6cded85,0xa2c3d3c5,0xdef70000,0xdef7ef7b,0xd6b5def7,0xdef7def7,0xdef7def7,0xdef7ef7b,0xef7bdef7,0x0000def7,0xc6310000,0xa289c631,0xc631a289,0xa289c631,0xc631a289,0xa289c631,0xc631a289,0x0000c631,0x92470000,0x60816081,0x60816081,0x79018101,0x81018101,0x60816081,0x60816081,0x00009247, +0xa2890000,0xbac9bac9,0xbac9a289,0xa289bac9,0xbac9bac9,0xbac9a289,0xbac9bac9,0x0000a289,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0xa529a529,0x6b5b6b5b,0x5a4d4189,0x00000000,0x188518c7,0x18851085,0x18c718c7,0x10431043,0x18c71085,0x10851085,0x18c718c7,0x10431085,0x42114211,0x421139cf,0x42114211,0x318d39cf,0x421139cf,0x39cf39cf,0x42114211,0x39cf39cf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x104130c3,0x28c33103,0x39053905,0x28c33103,0x10413103,0x518730c3,0x51871041,0x39051041,0xef79ef39,0xb5adb5ad,0x39cddf35,0x20c939cf,0xe77939cf,0xd6f5def5,0xe6b5def5,0xdeb541cf,0xd3c5a2c3,0xd3c5e487,0xe513a2c3,0xe487d3c5,0xe487a2c3,0xa2c3d3c5,0xe487e513,0xa2c3d3c5,0xd3c5a2c3,0x2801a2c3,0x40814081,0xa2c34081,0x2801a2c3,0x40814081,0xa2c32801,0xa2c3d3c5, +0xd3c5a2c3,0x4801ed85,0xb54db54d,0xed85bd8d,0x4801ed85,0xb54dbd8d,0xed854801,0xa2c3d3c5,0xdef70000,0xe98def7b,0xef7be8c7,0xef7bef7b,0xe8c7ef7b,0xef7bd6b5,0xef7bef7b,0x0000def7,0x92470000,0xa289a289,0xa289aac9,0xa289a289,0xa289aac9,0xa289a289,0xa289aac9,0x00009247,0x92470000,0x79017901,0x71017901,0x60816081,0x60816081,0x71016081,0x79017901,0x00009247, +0xa2890000,0xbac9bac9,0xbac9bac9,0xbac9bac9,0xbac9a289,0xbac9bac9,0xbac9bac9,0x0000a289,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x83110000,0xa529520b,0x6b5b6b5b,0x00000000,0x8b8f49c9,0x00000000,0x10431085,0x20c71085,0x10431085,0x18851085,0x10431085,0x18851885,0x10851043,0x18851085,0x318d39cf,0x4a5339cf,0x318d39cf,0x39cf39cf,0x318d39cf,0x421139cf,0x39cf39cf,0x39cf39cf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x28c33103,0x28c33103,0x28c35187,0x30c328c3,0x10413103,0x498528c3,0x39051041,0x28c31041,0x420f39cf,0xffffef79,0xf779ffff,0xffffef79,0xef79ffff,0xffffffff,0x39cfef79,0x18c518c7,0xe513a2c3,0xd3c5e487,0xe513a2c3,0xe487e487,0xe487a2c3,0xa2c3d3c5,0xe487e513,0xa2c3d3c5,0xe513a2c3,0x2801a2c3,0x40814081,0xa2c34081,0x2801a2c3,0x40814081,0xa2c34081,0xa2c3d3c5, +0xe513a2c3,0x4801a2c3,0xbdcdbd8d,0xa2c3bdcf,0x4801ed85,0xbdcdbdcf,0xed85bd8d,0xa2c3f689,0xdef70000,0xe8c7ef7b,0xef7be8c7,0xef7bef7b,0xef7bd6b5,0xdef7ef7b,0xef7bef7b,0x0000def7,0x92470000,0xbac9aac9,0xaac9bac9,0xbac9aac9,0xaac9bac9,0xbac9aac9,0xaac9bac9,0x00009247,0x92470000,0x81017901,0x79018101,0x81017901,0x79018101,0x81017901,0x79018101,0x00009247, +0xa2890000,0xa289bac9,0xbac9bac9,0xbac9bac9,0xbac9bac9,0xa289bac9,0xbac9bac9,0x0000a289,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x520b0000,0x6b5ba529,0x00000000,0x00000000,0x8311624b,0x00000000,0x21092109,0x18c720c7,0x18851885,0x18c71885,0x210920c7,0x188518c7,0x21092109,0x18c718c7,0x4a534a53,0x42114211,0x42114211,0x42114211,0x4a534211,0x42114211,0x4a534a53,0x42114211,0x00000000,0x00000000,0x00000000,0x50010000,0x00004801,0x00000000,0x00000000,0x00000000, +0x390528c3,0x31031881,0x28c14987,0x104128c3,0x10414985,0x20813905,0x39050801,0x31031041,0xe6f339cf,0xe739deb3,0xbdedef79,0xdeb5ef37,0xdef5d6f5,0xef39ef79,0xef39b5ad,0xef79ef39,0xe513a2c3,0xe487e487,0xe513a2c3,0xe487e487,0xe487a2c3,0xa2c3d3c5,0xe487d3c5,0xa2c3a2c3,0xe513a2c3,0x2801a2c3,0x40814081,0xa2c34081,0x2801a2c3,0x40814081,0x40814081,0xa2c3a2c3, +0xe513a2c3,0x4801a2c3,0xc60fbdcf,0xa2c3c64f,0x4801ed85,0xc60fc64f,0xbd8dbdcf,0xa2c3ed85,0xdef70000,0xef7bef7b,0xd6b5ef7b,0xef7bef7b,0xef7bef7b,0xef7be8c7,0xef7bdef7,0x0000def7,0x92470000,0xbac9bac9,0xbac9bac9,0xa289bac9,0xbac9bac9,0xbac9bac9,0xbac9a289,0x00009247,0x92470000,0x81018101,0x81018101,0x71018101,0x81018101,0x81018101,0x81017101,0x00009247, +0xa2890000,0xbac9bac9,0xa289bac9,0xbac9bac9,0xbac9bac9,0xbac9bac9,0xa289bac9,0x0000a289,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0xa5290000,0x5a4d6b5b,0x00008b8f,0x00000000,0x624b0000,0x00008b8f,0x18851885,0x21092109,0x18c718c7,0x20c720c7,0x10851085,0x20c718c7,0x18c718c7,0x20c720c7,0x39cf39cf,0x4a534a53,0x42114211,0x4a534a53,0x39cf39cf,0x4a534211,0x42114211,0x4a534a53,0x00000000,0x00000000,0x00000000,0x48010000,0x00002801,0x00000000,0x00000000,0x00000000, +0x51873103,0x31031041,0x104151c7,0x10415187,0x10015187,0x18813905,0x390528c3,0x31031041,0xbdade779,0xef77ffff,0xdef5ef39,0xe779def5,0xbdedffff,0xef79e779,0xdef5ffff,0xd6b7def5,0xe487a2c3,0xe487e487,0xe487a2c3,0xe487e487,0xe487a2c3,0xa2c3e487,0xe487d3c5,0xa2c3a2c3,0xe487a2c3,0xa2c3e487,0x40814081,0xa2c3a2c3,0xa2c3a2c3,0x40814081,0x40814081,0xa2c3a2c3, +0xe487a2c3,0xa2c3e487,0xc64fc60f,0xe4c5a2c3,0xa2c3e4c5,0xc64fce91,0xbdcdc60f,0xa2c3a2c3,0xdef70000,0xef7be8c7,0xdef7ef7b,0xe98def7b,0xd6b5e8c7,0xef7bdef7,0xef7bef7b,0x0000def7,0x92470000,0x92479247,0x92479247,0x92479247,0x92479247,0x92479247,0x92479247,0x00009247,0x92470000,0x60816081,0x60816081,0x60816081,0x60816081,0x60816081,0x60816081,0x00009247, +0xa2890000,0xbac9bac9,0xbac9bac9,0xbac9bac9,0xbac9a289,0xbac9bac9,0xbac9bac9,0x0000a289,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x6b5ba529,0x624b0000,0x8b8f8351,0x00000000,0x624b0000,0x00008311,0x18c718c7,0x10851085,0x18c720c7,0x18851085,0x18851085,0x10431085,0x18851885,0x10851085,0x42114211,0x39cf39cf,0x42114a53,0x39cf39cf,0x421139cf,0x39cf39cf,0x42114211,0x39cf39cf,0x00000000,0x00000000,0x00000000,0x7b0f0000,0x000049c9,0x00000000,0x00000000,0x00000000, +0x518728c3,0x31051041,0x10414985,0x104128c3,0x104128c3,0x10414985,0x31033103,0x39051041,0xdef5deb5,0xffffdeb5,0xef79ffff,0xfffff779,0xef79eef7,0xef39f779,0xefb9e779,0xdef5d6f5,0xe487a2c3,0xe487e487,0xd3c5a2c3,0xd3c5e487,0xe487a2c3,0xd3c5e487,0xe487a2c3,0xa2c3d3c5,0xe487a2c3,0xe487e487,0xa2c3a2c3,0xd3c5a2c3,0xa2c3a2c3,0xa2c3a2c3,0xa2c3a2c3,0xa2c3d3c5, +0xe487a2c3,0xffcff6cd,0xed85e4c5,0xd3c5e4c5,0xe4c5ed85,0xed85e4c5,0xed85e4c5,0xa2c3f689,0xdef70000,0xdef7ef7b,0xdef7ef7b,0xe8c7ef7b,0xdef7e8c7,0xe98ddef7,0xef7be8c7,0x0000def7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2890000,0xbac9bac9,0xbac9a289,0xbac9a289,0xbac9bac9,0xa289bac9,0xbac9bac9,0x0000a289,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x6b5ba529,0x00000000,0x8311624b,0x00008311,0x624b0000,0x00008311,0x18851085,0x20c71885,0x10431043,0x18c71885,0x18c71085,0x21092109,0x18c71885,0x21092109,0x421139cf,0x421139cf,0x39cf318d,0x42114211,0x421139cf,0x4a534a53,0x42114211,0x4a534a53,0x00000000,0x00000000,0x00000000,0x93910000,0x00003947,0x00000000,0x00000000,0x00000000, +0x51c728c3,0x28c31841,0x49853103,0x30c31041,0x100130c3,0x10414987,0x49873103,0x39051041,0xe739ef77,0xe779ef79,0xdef5def5,0xdef5b5ed,0xdef3b5ed,0xef79d6f5,0xef77efbb,0xef39f77b,0xd3c5a2c3,0xe487e487,0xd3c5a2c3,0xd3c5e487,0xe487a2c3,0xe487e487,0xe487a2c3,0xa2c3d3c5,0xd3c5a2c3,0x2801a2c3,0x2801a2c3,0xa2c3a2c3,0xa2c32801,0x2801a2c3,0x2801a2c3,0xa2c3d3c5, +0xf689a2c3,0x4801ed85,0x4801ed85,0xed85ed85,0xed854801,0x4801ed85,0x4801ed85,0xa2c3f7cb,0xdef70000,0xdef7ef7b,0xef7be8c7,0xef7bef7b,0xdef7ef7b,0xe8c7ef7b,0xef7be8c7,0x0000def7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2890000,0xbac9a289,0xbac9bac9,0xbac9bac9,0xbac9bac9,0xbac9bac9,0xa289bac9,0x0000a289,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0xa5290000,0x00006b5b,0x00000000,0x624b0000,0x8b8f8311,0x00000000,0x83515a09,0x20c720c7,0x18c718c7,0x20c72109,0x18c718c7,0x20c720c7,0x18c71885,0x188518c7,0x18851085,0x4a534a53,0x42114211,0x4a534a53,0x42114211,0x42114a53,0x42114211,0x42114211,0x421139cf,0x00000000,0x00000000,0x00000000,0x93910000,0x00004189,0x00000000,0x00000000,0x00000000, +0x39051041,0x30c31041,0x498728c3,0x28c11001,0x28c31041,0x104151c7,0x51c730c3,0x49871041,0xefb9b5ed,0xdef5deb3,0xb5addef5,0xef79ef79,0xef77ef79,0xffffffff,0xe739ef79,0xef7bffff,0xd3c5a2c3,0xe487e487,0xd3c5a2c3,0xa2c3e487,0xe487a2c3,0xe487e487,0xe487a2c3,0xa2c3d3c5,0xd3c5a2c3,0x28012801,0x28012801,0x28014081,0x40812801,0x28012801,0x28014081,0xa2c3a2c3, +0xf7cba2c3,0x48014801,0x48014801,0x4801d711,0xdf934801,0x48014801,0x4801ce4f,0xa2c3ed85,0xdef70000,0xdef7ef7b,0xef7bef7b,0xdef7d6b5,0xef7bef7b,0xef7bef7b,0xef7bdef7,0x0000def7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2890000,0xbac9bac9,0xbac9bac9,0xbac9bac9,0xbac9bac9,0xbac9a289,0xbac9bac9,0x0000a289,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83110000,0xa529520b,0x00006b5b,0x00000000,0x00000000,0x8311624b,0x00008b8f,0x6a8f4189,0x10851085,0x18c718c7,0x18851885,0x18c718c7,0x10851085,0x18c71085,0x10431043,0x18c71885,0x39cf39cf,0x42114211,0x39cf39cf,0x42114211,0x39cf39cf,0x421139cf,0x318d318d,0x421139cf,0x00000000,0x00000000,0x00000000,0x9bd50000,0x00004189,0x00000000,0x00000000,0x00000000, +0x39051041,0x28c31041,0x51873105,0x51871041,0x28c30801,0x104151c7,0x49873103,0x51c71041,0xef79ef79,0xe779e739,0xbdadef79,0xb5edb5ed,0xef79ef79,0xdef5d735,0xb5adb5ed,0xdef7def5,0xa2c3a2c3,0xe487e487,0xe513a2c3,0xa2c3e487,0xe487d3c5,0xe487d3c5,0xe513a2c3,0xa2c3e487,0xa2c3a2c3,0x40812801,0x40814081,0x40814081,0x40814081,0x40814081,0x40814081,0xa2c34081, +0xa2c3a2c3,0xc60f4801,0xced1c64f,0xdf51d711,0xdf51df93,0xced1d711,0xc60fc64f,0xed85bd8d,0xdef70000,0xdef7ef7b,0xef7bdef7,0xef7bef7b,0xe8c7e98d,0xef7bdef7,0xef7bdef7,0x0000def7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2890000,0xbac9bac9,0xbac9bac9,0xbac9a289,0xbac9a289,0xbac9bac9,0xbac9a289,0x0000a289,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83110000,0x6b5ba529,0x83515a4d,0x00008b8f,0x00000000,0x624b0000,0x6a8f624b,0x6b5b6b5b,0x18851885,0x10431043,0x20c720c7,0x10431085,0x18c71885,0x18c718c7,0x21092109,0x104318c7,0x39cf39cf,0x39cf318d,0x4a534a53,0x318d39cf,0x42114211,0x42114211,0x4a534a53,0x39cf4211,0x00000000,0x00000000,0x00000000,0x93930000,0x00003947,0x00000000,0x00000000,0x00000000, +0x51871001,0x28c31001,0x51873103,0x30c30801,0x28c31041,0x10414987,0x28c130c3,0x51871041,0xffffe77b,0xef7bffff,0xdef5d6f5,0xef79d735,0xe777ef79,0xef39ef7b,0xef79ef39,0x420f39cf,0xa2c3a2c3,0xe487e487,0xe513a2c3,0xa2c3e487,0xe487d3c5,0xe487e487,0xe513a2c3,0xa2c3e487,0xa2c3a2c3,0x2801a2c3,0xa2c34081,0x40814081,0x4081a2c3,0x40814081,0x4081a2c3,0xa2c34081, +0xa2c3a2c3,0x4801e4c5,0xe4c5c64f,0xd711ced1,0xd711e4c5,0xce91ced1,0xbdcfa2c3,0xed85bd8d,0xdef70000,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xe8c7e8c7,0xdef7def7,0xef7bdef7,0x0000def7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2890000,0xa289bac9,0xa289bac9,0xbac9bac9,0xbac9bac9,0xbac9bac9,0xbac9bac9,0x0000a289,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b5ba529,0x5a094189,0x8311624b,0x8b8f8b8f,0x00000000,0x6b5b4189,0xa529a529,0x18c718c7,0x210920c7,0x18c720c7,0x188518c7,0x18851043,0x20c718c7,0x18851885,0x210920c7,0x42114211,0x4a534a53,0x42114a53,0x42114211,0x4211318d,0x4a534211,0x42114211,0x4a534a53,0x00000000,0x00000000,0x00000000,0x628d0000,0x00003987,0x00000000,0x00000000,0x00000000, +0x31031041,0x310328c3,0x390528c3,0x31031881,0x28c33103,0x104128c3,0x498530c3,0x100151c7,0xdef539cf,0xefb7d6f5,0xef77ef79,0xb5abe77b,0xef79def5,0xef39ef39,0x39d141cf,0x18c518c7,0xa2c3a2c3,0xd3c5e487,0xe487a2c3,0xa2c3e487,0xe487d3c5,0xd3c5e487,0xe513a2c3,0xa2c3e487,0xa2c3a2c3,0x2801a2c3,0xe487a2c3,0xa2c34081,0xe487a2c3,0x4081e487,0xe513a2c3,0xa2c3a2c3, +0xa2c3a2c3,0x4801a2c3,0xe487e4c5,0xe4c5ce91,0xe487a2c3,0xc64ff6cd,0xe513a2c3,0xa2c3a2c3,0xdef70000,0xe8c7ef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0x0000def7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2890000,0xbac9bac9,0xbac9bac9,0xa289bac9,0xbac9bac9,0xbac9a289,0xbac9bac9,0x0000a289,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b5ba529,0x00000000,0x624b0000,0x624b624b,0x6a8f8b8f,0xa5296b5b,0x8311520b,0x20c720c7,0x18851885,0x18c720c7,0x18c718c7,0x20c72109,0x10851085,0x18c718c7,0x10851885,0x4a534a53,0x42114211,0x42114a53,0x42114211,0x42114a53,0x39cf39cf,0x42114211,0x39cf39cf,0x00000000,0x00000000,0x00000000,0x9bd30000,0x00003947,0x00000000,0x00000000,0x00000000, +0x28c31001,0x10414987,0x39053103,0x10411881,0x28c34985,0x10015187,0x390528c3,0x28c31041,0x39cf18c7,0xef7931cf,0xffffef79,0xffffffff,0xdef5ef39,0x39cf39cf,0xdef7bdad,0x18871907,0xd3c5a2c3,0xd3c5e487,0xe487a2c3,0xa2c3e487,0xe513a2c3,0xa2c3e487,0xe487a2c3,0xa2c3e487,0xd3c5a2c3,0xd3c5e487,0xe487a2c3,0xa2c3e487,0xe513a2c3,0xa2c3e487,0xe487a2c3,0xa2c3e487, +0xd3c5a2c3,0xd3c5e487,0xe487a2c3,0xa2c3e487,0xe513a2c3,0xa2c3e487,0xe487a2c3,0xa2c3e487,0xd6b50000,0xdef7def7,0xdef7def7,0xdef7def7,0xdef7def7,0xdef7def7,0xdef7def7,0x0000d6b5,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2890000,0xa289a289,0xa289a289,0xa289a289,0xa289a289,0xa289a289,0xa289a289,0x0000a289,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b5ba529,0x00000000,0x00000000,0x00000000,0x418949c9,0xa5296b5b,0x00008311,0x10851085,0x18c720c7,0x18851085,0x20c720c7,0x18851885,0x20c718c7,0x10851085,0x20c720c7,0x39cf39cf,0x42114a53,0x39cf39cf,0x4a534a53,0x39cf4211,0x4a534211,0x39cf39cf,0x4a534211,0x00000000,0x00000000,0x00000000,0x628d0000,0x00003145,0x00000000,0x00000000,0x00000000, +0x28c328c3,0x10413905,0x28c328c1,0x104128c3,0x310328c3,0x080128c3,0x28c328c3,0x390528c3,0xef79ef39,0x39cfef79,0xdef5def5,0xef79e6f7,0xef7bef79,0xe6f5d6b5,0xffffdeb5,0xf779ffff,0xa2c3a2c3,0xd3c5d3c5,0xa2c3a2c3,0xa2c3d3c5,0xd3c5a2c3,0xa2c3a2c3,0xd3c5d3c5,0xa2c3a2c3,0xa2c3a2c3,0xd3c5d3c5,0xa2c3a2c3,0xa2c3d3c5,0xd3c5a2c3,0xa2c3a2c3,0xd3c5d3c5,0xa2c3a2c3, +0xa2c3a2c3,0xd3c5d3c5,0xa2c3a2c3,0xa2c3d3c5,0xd3c5a2c3,0xa2c3a2c3,0xd3c5d3c5,0xa2c3a2c3,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b5ba529,0x00000000,0x00000000,0x00000000,0x00000000,0xa5296b5b,0x00000000,0x99499149,0x91499149,0xa98ba14b,0x99499149,0xa94ba94b,0x91498909,0xa14ba14b,0x89099149,0xd3a5d3a3,0xd363d361,0xdca9dc27,0xd3a3d3a3,0xdc69dc69,0xd361cadf,0xdc27dc27,0xcb1fd361,0x84218421,0x84218421,0x84218421,0x94a594a5,0x94a57bdf,0x84218421,0x84218421,0x84218421, +0x9ce70000,0x4a530000,0x9ce70000,0x00004a53,0x00009ce7,0x4a539ce7,0x9ce70000,0x9ce70000,0x9ce7318d,0x4a53318d,0x9ce7318d,0x318d4a53,0x318d9ce7,0x4a539ce7,0x9ce7318d,0x9ce7318d,0x80438043,0x88438043,0x80438003,0x90438843,0x80438883,0x80438003,0x88438043,0x80438845,0x78418043,0x90c98041,0x888590c7,0x70018043,0xad6bb5ab,0xce31be2f,0x9d27b5ad,0xb5ab9ce7, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x83110000,0x6b5ba529,0x72cd5a4d,0xa413a413,0xac55ac55,0x6a8f8351,0xa5296b5b,0x00008311,0xa94ba14b,0xb98bb98b,0xa94bb18b,0x9949994b,0x89099149,0x99499949,0x89098109,0xa14b9949,0xdc69dc27,0xe56fe52d,0xdc69dceb,0xd3e5d3e5,0xcb1fd363,0xd3e5d3a3,0xd321ca9d,0xdc27d3a5,0xad6b8421,0xb5adb5ad,0xb5adb5ad,0xb5adb5ad,0xb5ada529,0xb5adb5ad,0xad6b9ce7,0x8421ad6b, +0x8c639ce7,0x4a538c63,0x9ce7318d,0x318d0000,0x9ce70000,0x4a538c63,0x00000000,0x8c630000,0x8c639ce7,0x4a538c63,0x9ce7318d,0x318d318d,0x9ce7318d,0x4a538c63,0x318d318d,0x8c63318d,0x80438043,0x90858885,0x90859085,0x98879085,0x88459885,0x98878843,0xa0c7a0c7,0xa0c9a087,0x98c5a109,0x99098803,0x88439949,0x70018003,0xd6b5c633,0xf7bde77b,0xbdadd6b5,0x9d29b56b, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x4a530000,0x4a534a53,0x4a534a53,0x00004a53,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x520b0000,0x6b5ba529,0x520b41c9,0x624b624b,0x624b624b,0x418949c9,0xa5296b5b,0x0000520b,0xb18bb18b,0xa14b9949,0xb18bb18b,0x9949a14b,0xb18ba94b,0xa94ba94b,0xb98bb18b,0xa94ba94b,0xe4ebdceb,0xdc27d3e5,0xe4ebe4ed,0xd3e5dc27,0xe4ebdc69,0xdc69dc69,0xe52de52d,0xdc69dc69,0x9ce78421,0xa529a529,0xa5299ce7,0xa529a529,0xa529b5ad,0xad6bad6b,0xb5adad6b,0x8421ad6b, +0x9ce70000,0x42110000,0x00009ce7,0x00009ce7,0x00009ce7,0x42119ce7,0x9ce70000,0x9ce74a53,0x9ce7318d,0x318d318d,0x318d9ce7,0x318d9ce7,0x318d9ce7,0x318d9ce7,0x9ce7318d,0x9ce74a53,0x88438043,0xb18da94b,0xa98da98d,0xb18db1cd,0xa14ba98d,0xa94ba14b,0xb1cfb1cf,0xb1cfb1cf,0xa98db1cf,0xba5590c5,0xa109b211,0x68017803,0xf7bdc671,0xffffffff,0xd675f7bf,0xa4e7b5ab, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x4a530000,0xc6314a53,0xc631c631,0xc631c631,0x4a53c631,0x00004a53,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b5ba529,0x00000000,0x00000000,0x00000000,0x00000000,0xa5296b5b,0x00000000,0x9949a14b,0xb18ba94b,0x99499949,0xb18ba14b,0x994b9149,0xb18bb18b,0x9949a14b,0xb18bb98b,0xd3a5dc27,0xe4ebdca9,0xd3a5d3e5,0xe4ebdc27,0xd3e5d3a3,0xe4ebe4eb,0xd3a5dc27,0xe4ebe56f,0xb5ad8421,0xad6bad6b,0x9ce7ad6b,0xb5adad6b,0xad6bad6b,0xa529a529,0xa529a529,0x8421a529, +0x00009ce7,0x00009ce7,0x9ce70000,0x00005295,0x00008c63,0x318d4a53,0x4a539ce7,0x00009ce7,0x318d9ce7,0x318d9ce7,0x9ce7318d,0x318d5295,0x318d8c63,0x318d4a53,0x4a539ce7,0x318d9ce7,0x90458043,0xa98da98b,0xa98da98d,0xb18da98d,0xa98da98d,0xa14ba94b,0xb18da94d,0xb18db18d,0xa98ba98d,0xc2959087,0x990bb211,0x70018043,0xffffce73,0xffffffff,0xe739f7bd,0x9ce9bdef, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x4a530000,0xc6314a53,0xef7bc631,0xef7be8c7,0xef7bef7b,0xc631ef7b,0x4a53c631,0x00004a53,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b5ba529,0x00000000,0x00000000,0x00000000,0x00000000,0xa5296b5b,0x00000000,0xa14ba94b,0xa14b9149,0xa94ba98b,0x81098909,0xa14b9949,0x91499949,0xa98ba98b,0x89099149,0xdc27dc69,0xdc27d3a3,0xdca9dca9,0xca9dcadf,0xdc27d3a5,0xd321d3a3,0xdca9dca9,0xcadfd361,0xb5ad8421,0xa529b5ad,0xa529a529,0x94a594a5,0x94a594a5,0xb5adb5ad,0xb5adb5ad,0x7bdfb5ad, +0x00004a53,0x8c630000,0x00009ce7,0x4a539ce7,0x9ce78c63,0x00000000,0x9ce70000,0x00004211,0x318d4a53,0x8c63318d,0x318d9ce7,0x4a539ce7,0x9ce78c63,0x318d318d,0x9ce7318d,0x318d318d,0x98878041,0xa94ba94d,0xa14b9909,0xa14ba94b,0xa14ba94b,0x9909990b,0x99099909,0x990b9909,0x90c7994b,0xba959085,0x9107b211,0x70017843,0xffffd6b5,0xffbfffff,0xf77bef3b,0xa529ce33, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xc6314a53,0xe8c7c631,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7be8c7,0xc631ef7b,0x4a53c631,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83110000,0x6b5ba529,0x83516acf,0x8b8fac55,0x8b8f8b8f,0x6acf624b,0xa5296b5b,0x00008311,0x89098909,0xb18b9149,0x81099149,0x99499149,0x81099149,0x99499949,0x99498909,0x99499149,0xcadfd321,0xe4ebd3a3,0xca9dd3a3,0xd3a5d3a3,0xca9dd3a3,0xd3e5d3a5,0xd3a3cb1f,0xd3e5d363,0xa5298421,0xad6bad6b,0x94a5ad6b,0x7bdf8421,0x84217bdf,0xad6bc631,0xa529a529,0x84219ce7, +0x00004a53,0x4a538c63,0x00004a53,0x4a530000,0x318d9ce7,0x4a539ce7,0x4a539ce7,0x00009ce7,0x318d4a53,0x4a538c63,0x318d4a53,0x4a53318d,0x318d9ce7,0x4a539ce7,0x4a539ce7,0x318d9ce7,0x98c78043,0xb18fb1cf,0x990998c9,0x908798c7,0x888788c7,0x80838845,0x808580c5,0x88858887,0x88858883,0xc2d59085,0x8085a10b,0x68017843,0xf7bdd6b7,0xf7bdffbd,0xef7bef7b,0xb5add6b5, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xc6314a53,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7be8c7,0xef7bef7b,0xef7be8c7,0x4a53c631,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x520b0000,0x6b5ba529,0x49c94189,0x624b5a09,0x624b624b,0x41895a09,0xa5296b5b,0x0000520b,0xb98bb98b,0xa94ba98b,0xa14ba14b,0xa14ba14b,0xb98bb18b,0x994ba94b,0xb98bb98b,0xa14ba94b,0xe56fe52d,0xdca9dceb,0xdc27dc27,0xdc27dc27,0xe56fdceb,0xd3e5dc69,0xe56fe56f,0xdc27dc69,0xb5ad94a5,0xad6bad6b,0x94a5ad6b,0x500194a5,0xb5ad5001,0xad6bce73,0xb5adb5ad,0x7bdfb5ad, +0x9ce74211,0x8c638c63,0x00004a53,0x00009ce7,0x9ce74211,0x00004a53,0x4a538c63,0x9ce70000,0x9ce7318d,0x8c638c63,0x318d4a53,0x318d9ce7,0x9ce7318d,0x318d4a53,0x4a538c63,0x9ce7318d,0x90858043,0x994bb1cd,0x90c590c7,0x88859087,0x88838885,0x80858885,0x88c58885,0x88858885,0x90858885,0xcb199085,0x80839909,0x68017001,0xf77dd6b5,0xef7df7bd,0xe77def7b,0xb5afd675, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xc6314a53,0xef7bc631,0xef7be8c7,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xc631ef7b,0x4a53c631,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b5ba529,0x00000000,0x00000000,0x00000000,0x00000000,0xa5296b5b,0x00000000,0x99499949,0xb98bb98b,0xa94ba94b,0xb18bb18b,0x99499149,0xb18ba94b,0xa94ba94b,0xb18bb18b,0xd3a5d3a5,0xe56fe52d,0xdc69dc69,0xe4ebe4eb,0xd3a3d363,0xe4ebdca9,0xdc69dc69,0xe4ebe4eb,0xad6b8421,0xa529ad6b,0x842194a5,0x500194a5,0xb5ad4001,0xc631a529,0xa529a529,0x8421ad6b, +0x318d0000,0x00009ce7,0x9ce7318d,0x9ce70000,0x00009ce7,0x00009ce7,0x00008c63,0x00009ce7,0x318d318d,0x318d9ce7,0x9ce7318d,0x9ce7318d,0x318d9ce7,0x318d9ce7,0x318d8c63,0x318d9ce7,0x90458043,0x88859909,0x88858083,0x80858085,0x88858887,0x88858885,0x88858887,0x88858885,0x88878885,0xba538843,0x808590c7,0x68017001,0xefbbd6f7,0xef7df7bd,0xef7bef7b,0xb5adceb3, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce734a53,0xc631ef7b,0xef7bc631,0xef7bef7b,0xef7be8c7,0xc631ef7b,0xbdefc631,0x4a53bdef,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b5ba529,0x00000000,0x00000000,0x00000000,0x00000000,0xa5296b5b,0x00000000,0xa94ba94b,0x99498909,0xa94bb18b,0x99499149,0x99499949,0x89099949,0x994ba14b,0x91499149,0xdc69dc69,0xd3a5d321,0xdc69e4eb,0xd3a5d3a3,0xd3e5d3a5,0xcb1fd3a3,0xd3e5dc27,0xd321d361,0xb5ad8421,0x9ce7b5ad,0x842194a5,0x500194a5,0xb5ad2801,0xce739ce7,0xb5adb5ad,0x94a5b5ad, +0x9ce70000,0x9ce74a53,0x0000318d,0x4a539ce7,0x00004a53,0x9ce70000,0x9ce74a53,0x9ce70000,0x9ce7318d,0x9ce74a53,0x318d318d,0x4a539ce7,0x318d4a53,0x9ce7318d,0x9ce74a53,0x9ce7318d,0x90458043,0x88879907,0x88858887,0x90858885,0x88858885,0x88858885,0x88858885,0x888588c5,0x88858885,0xb1cf8843,0x808590c7,0x68017003,0xf7bdd6b5,0xef7df7bb,0xef7bef7b,0xb56dce75, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce7338c3,0xef7bef7b,0xc631ef7b,0xc631c631,0xc631c631,0xbdefc631,0xbdefbdef,0x38c3bdef,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83110000,0x6b5ba529,0x83516acf,0x8b8f8b8f,0x8b8f8b8f,0x6a8fa413,0xa5296b5b,0x00008311,0x994b9949,0xb18b9949,0x89098109,0xa14b994b,0xa94b9149,0xb98bb98b,0xa94ba14b,0xb98bb98b,0xd3e5d3a5,0xdcebd3e5,0xcadfcadf,0xdc67d3e5,0xdc69d3a3,0xe56fe56f,0xdc69dc27,0xe52de56f,0xa5298421,0x94a5a529,0xa5298421,0x580194a5,0xb5ad2801,0x9ce7a529,0xa529ce73,0x8421b5ad, +0x42119ce7,0x4a538c63,0x9ce70000,0x9ce70000,0x00004211,0x00009ce7,0x00004a53,0x4a539ce7,0x318d9ce7,0x4a538c63,0x9ce7318d,0x9ce7318d,0x318d318d,0x318d9ce7,0x318d4a53,0x4a539ce7,0x90858003,0x90c79907,0x88858885,0x80878885,0x88858885,0x88858885,0x88838885,0x888590c5,0x80858885,0xb1cf8843,0x888598c7,0x68017001,0xf77dd6b5,0xef7def7d,0xef7bef7b,0xb5add673, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x924738c3,0xef7bce73,0xef7bef7b,0xce73ce73,0xbdefce73,0xbdefbdef,0xa289bdef,0x38c39247,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x520b0000,0x6b5ba529,0x49c94189,0x624b5a09,0x624b624b,0x41c9624b,0xa5296b5b,0x0000520b,0xb18bb18b,0xa94ba94b,0xb18bb98b,0xa94ba94b,0xb18bb18b,0xa14b9949,0xa14ba94b,0xa14b9149,0xe4ebe4eb,0xdc69dc69,0xe4ebe56f,0xdc69dc69,0xdcebe4eb,0xdc27d3e5,0xdc27dc69,0xdc27d361,0xad6b8421,0x94a5b5ad,0x9ce78421,0x580194a5,0xb5ad2801,0xa529a529,0xad6bce73,0x8421ad6b, +0x00008c63,0x42110000,0x4a539ce7,0x00000000,0x9ce70000,0x9ce74a53,0x9ce70000,0x4a53318d,0x318d8c63,0x318d318d,0x4a539ce7,0x318d318d,0x9ce7318d,0x9ce74a53,0x9ce7318d,0x4a53318d,0x88858043,0x90c79909,0x80858085,0x88858085,0x88878085,0x88878885,0x88858885,0x88859085,0x88858885,0xb1cf8043,0x88879107,0x68017801,0xe6f9c631,0xef7bef7b,0xdf39ef7b,0xad6bc631, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x924738c3,0xa289a289,0xce73ef7b,0xce73ce73,0xbdefce73,0xbdefbdef,0xa289a289,0x38c39247,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b5ba529,0x00000000,0x00000000,0x00000000,0x00000000,0xa5296b5b,0x00000000,0x91499149,0xa14ba14b,0x99499949,0xa94ba98b,0x91499149,0xa94b9949,0x89098909,0xa94b9949,0xd3a3d361,0xdc67dc67,0xd3a5d3a5,0xdc69dca9,0xd3a3d363,0xdc69d3a5,0xcadfcadf,0xdc69d3e5,0xad6b7bdf,0x842194a5,0x9ce7a529,0x480194a5,0xb5ad2801,0x9ce7a529,0xce73a529,0x7bdfb5ad, +0x00000000,0x00009ce7,0x4a538c63,0x9ce70000,0x00004a53,0x8c639ce7,0x4a530000,0x42110000,0x318d318d,0x318d9ce7,0x4a538c63,0x9ce7318d,0x318d318d,0x8c639ce7,0x4a53318d,0x318d318d,0x90838041,0x888598c7,0x80858083,0x80438085,0x80437845,0x88858085,0x80858045,0x78457883,0x80837843,0xa98d7001,0x888590c7,0x68017041,0xdef7c631,0xef79deb7,0xd671def7,0xad6bb5ad, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x924738c3,0xbac9bac9,0xa289aac9,0xa289c631,0xa289a289,0xaac9bdef,0xa289a289,0x38c39247,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b5ba529,0x00000000,0x00000000,0x00000000,0x00000000,0xa5296b5b,0x00000000,0x99499949,0x89098109,0xb18bb18b,0x81099149,0xa98ba14b,0xa94ba14b,0xb98bb98b,0x8909a94b,0xd3a5d3a5,0xcadfcadf,0xe4ede4eb,0xca9dd321,0xdca9dc27,0xdc69dc27,0xe56fe56f,0xcb1fdc69,0xa5298421,0x842194a5,0xa5299ce7,0x480194a5,0xb5ad2801,0xad299ce7,0xc631a529,0x8421a529, +0x8c634211,0x9ce78c63,0x9ce78c63,0x9ce7318d,0x9ce7318d,0x9ce70000,0x4a530000,0x0000318d,0x8c63318d,0x9ce78c63,0x9ce78c63,0x9ce7318d,0x9ce7318d,0x9ce7318d,0x4a53318d,0x318d318d,0x90437843,0x888590c7,0x80858885,0x78837845,0x80457883,0x78857845,0x80458045,0x80438083,0x80837885,0xa98b7001,0x8085a14b,0x68017003,0xdeb7c631,0xdef7def7,0xce73d6b5,0xad6bb5ad, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x38c30000,0x924738c3,0xbac99247,0xaac9bac9,0xaac9aac9,0x9247aac9,0x92479247,0x000038c3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83110000,0x6b5ba529,0x83515a4d,0x8b8fac55,0xac55ac55,0x6a8f8b8f,0xa5296b5b,0x00008311,0xa94ba94b,0xb98bb18b,0xa94bb18b,0x9949a14b,0xa14b8109,0xb18ba94b,0xa14ba14b,0xb98bb18b,0xdc69dc69,0xe56fe52d,0xdc69e4eb,0xd3e5dc27,0xdc27cadf,0xe4ebdc69,0xdc27dc27,0xe52de4eb,0xb5ad8421,0xb5ada529,0xa5299ce7,0x400194a5,0xb5ad2001,0xce73ad29,0xad6bce73,0x94a5b5ad, +0x0000318d,0x00009ce7,0x00009ce7,0x4a539ce7,0x00000000,0x4a539ce7,0x42110000,0x00009ce7,0x318d318d,0x318d9ce7,0x318d9ce7,0x4a539ce7,0x318d318d,0x4a539ce7,0x318d318d,0x318d9ce7,0x88418003,0x88858885,0x88858885,0x80457885,0x80838085,0x80457845,0x78858085,0x80858083,0x80858085,0xa98b7801,0x808598c7,0x68017001,0xdef7ceb3,0xce73deb5,0xdeb7c6b3,0xb5adce33, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x38c30000,0x924738c3,0x92479247,0x92479247,0x38c39247,0x38c338c3,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x520b0000,0x6b5ba529,0x49c94189,0x5a096a8b,0x624b624b,0x4189624b,0xa5296b5b,0x0000520b,0xb18bb18b,0x994ba14b,0xa14bb18b,0xa94ba94b,0xb18bb98b,0x99499949,0xa94ba14b,0x91499949,0xe4ede4ed,0xd3e5dc27,0xdc27e4eb,0xdca9dc69,0xdcebe56f,0xd3a5d3a3,0xdc69dc27,0xd363d3a5,0xad6b8421,0xa529ad6b,0xb5ada529,0xc631b5ad,0xc631c631,0xb5adce73,0xa529ad6b,0x8421a529, +0x9ce74211,0x9ce70000,0x9ce74a53,0x42110000,0x00004a53,0x00008c63,0x9ce7318d,0x9ce70000,0x9ce7318d,0x9ce7318d,0x9ce74a53,0x318d318d,0x318d4a53,0x318d8c63,0x9ce7318d,0x9ce7318d,0x80438043,0x80437803,0x80418043,0x80858083,0x80857845,0x78038083,0x78417801,0x80437843,0x80038003,0x98857801,0x78038885,0x70017003,0xd673d6b3,0xb5adc5f1,0xce73b5af,0xb5edd6b5, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x38c30000,0x38c338c3,0x38c338c3,0x000038c3,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b5ba529,0x00000000,0x00000000,0x00000000,0x00000000,0xa5296b5b,0x00000000,0x91498909,0xa14bb18b,0x99499149,0xb18bb18b,0x9949a14b,0xb18ba94b,0x91499149,0xb18bb18b,0xd3a3cb1f,0xdc27e4eb,0xd3a5d363,0xe52de4eb,0xd3a5dc27,0xe4ebdc69,0xd3a3d363,0xe4ebdceb,0x84218421,0x84218421,0x94a57bdf,0x84218c63,0x84218421,0x84218421,0x84218421,0x84218421, +0x4a530000,0x318d0000,0x4a539ce7,0x00009ce7,0x9ce74a53,0x8c630000,0x0000318d,0x00008c63,0x4a53318d,0x318d318d,0x4a539ce7,0x318d9ce7,0x9ce74a53,0x8c63318d,0x318d318d,0x318d8c63,0x80418043,0x80438043,0x80437841,0x80438043,0x80438043,0x80038041,0x80438001,0x80438043,0x80438003,0x80037841,0x78018043,0x68017003,0xb5adb5af,0xa569b5ab,0xb5adad6b,0xbdafb5ad, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x1a671aed,0x12b11a67,0x12b11af1,0x22632263,0x1aad1aa9,0x2a631a69,0x22a52a63,0x122d2a61,0x32453205,0x32053205,0x3a873247,0x32453205,0x3a873a87,0x32053205,0x3a473a47,0x32053205,0x358b354b,0x354b354b,0x3e4d3dcb,0x358b354b,0x3e0d3e0d,0x354b350b,0x3e0b3e0b,0x350b354b,0x84218421,0x84218421,0x84218421,0x94a594a5,0x94a57bdf,0x84218421,0x84218421,0x84218421, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x80438043,0x80418003,0x80438003,0x80858043,0x78858045,0x80438083,0x80438043,0x80457885,0x80038043,0x80037843,0x80418043,0x80858043,0x78858085,0x80858045,0x78437843,0x80458085,0x80018043,0x80417801,0x8043994b,0x68018043,0xce75b5ad,0xce73ceb3,0xbdedb5ef,0xb5adb5af, +0xceb3bdad,0xce73ce73,0xbdedb5ef,0xbdadb5ad,0xceb5b5ad,0xce73ce75,0xbdafbdad,0xb5edb5ad,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x1a6d19f1,0x3be91ab1,0x123522ef,0x1aa71a2b,0x1aad1aa9,0x09af09af,0x1a271a67,0x122d122d,0x3a873247,0x42c73ac7,0x3a873a87,0x32453247,0x32053205,0x32453245,0x320529c5,0x32473245,0x3e0d3dcb,0x4e914e4f,0x3e0d3e4d,0x3dcb3dcb,0x350b354b,0x3dcb358b,0x350b2cc9,0x3dcb358b,0xad6b8421,0xb5adb5ad,0xb5adb5ad,0xb5adb5ad,0xb5ada529,0xb5adb5ad,0xad6b9ce7,0x8421ad6b, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x88c58043,0x88858885,0x88858885,0x80838885,0x80458085,0x80858045,0x88c58845,0x80458885,0x88858043,0x888588c5,0x88858885,0x80858885,0x78857885,0x78858085,0x88859087,0x80838885,0x88858885,0xb18d7801,0x8885a10b,0x68018045,0xef7bbdad,0xef7defbb,0xef7befbb,0xb5afceb3, +0xce73b5ef,0xef7bef7b,0xffffffff,0xf7fdffff,0xffbfffbd,0xf77bef7b,0xef7befbd,0xb5adce75,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x12b1122d,0x2b671ab1,0x1a691af1,0x1a6719e7,0x1a692a63,0x09af1a2d,0x1a69092f,0x122d122d,0x3a873a87,0x32473245,0x3a873a87,0x32453a47,0x3a873a87,0x3a873a87,0x3ac73a87,0x3a873a87,0x464d3e4d,0x3dcb3dcb,0x464d464f,0x3dcb3e0b,0x464d3e0d,0x3e0d3e0d,0x4e4f464f,0x3e0d3e0d,0x9ce78421,0xa529a529,0xa5299ce7,0xa529a529,0xa529b5ad,0xad6bad6b,0xb5adad6b,0x8421ad6b, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x88858003,0x99099909,0x99099909,0x990798c9,0x88858885,0x804588c5,0x80438085,0x88858885,0x88858043,0x99099909,0x99079109,0x98c99909,0x88858885,0x80438887,0x80858083,0x88858085,0x78858885,0xa14b7001,0x88858083,0x68018887,0xce75b5ad,0xef7bef7b,0xef3bef7b,0xb5add673, +0xd6b3b5ad,0xef7def7d,0xef7bf77b,0xf77bef7b,0xf77bffff,0xf7bdefbb,0xf77befbb,0xb5adceb5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x122d122d,0x1ab11a6d,0x12311ab1,0x1aa31a2b,0x2a63122f,0x09af1a67,0x1a6709af,0x122d1a69,0x32453247,0x3a873a87,0x32453245,0x3a873247,0x32473205,0x3a873a87,0x32453247,0x3a8742c7,0x358b3dcb,0x464d3e4d,0x3d8b3dcb,0x464d3dcb,0x3dcb354b,0x464d464d,0x358b3dcb,0x464d4e91,0xb5ad8421,0xad6bad6b,0x9ce7ad6b,0xb5adad6b,0xad6bad6b,0xa529a529,0xa529a529,0x8421a529, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x68016801,0x68016801,0x68016801,0x68016801,0x68016801,0x68016801,0x68016801,0x68016801,0x70016801,0x70016801,0x68016801,0x68016801,0x68016801,0x68016801,0x68016801,0x68016801,0x68016801,0x68016801,0x68016801,0x68016801,0xbdefb5ad,0xce73d6b3,0xb5adce73,0xb5adb5ef, +0xb5edb5ad,0xce33ce73,0xb5adce73,0xb5adb5ad,0xbdefb5ef,0xce73d675,0xbdedce73,0xb5afb5ef,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x1a6f19f1,0x1ab1122d,0x12331ab1,0x1a611a2d,0x1a27122f,0x2a631a69,0x09af2a63,0x122d1a67,0x32473a87,0x32473205,0x3a873a87,0x29c53205,0x3a473245,0x32053245,0x3a873a87,0x32053205,0x3dcb3e0d,0x3dcb354b,0x3e4d3e4d,0x2cc9350b,0x3e0b358b,0x354b358b,0x3e4d3e4d,0x350b354b,0xb5ad8421,0xa529b5ad,0xa529a529,0x94a594a5,0x94a594a5,0xb5adb5ad,0xb5adb5ad,0x7bdfb5ad, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x934da493,0x934f8b4d,0x934f934f,0x8b4d8b4b,0x934d934d,0x8b4d834d,0x934d934d,0x5207938f,0x934fac53,0x938f834d,0x934f8b4f,0x8b4d8b0d,0x934f934d,0x830d8b4d,0x938d934f,0x8b4d934f,0x8b4b8b4d,0x934d934f,0x934f8b8f,0x8b4d934d,0x934d8b4d,0x934f8b0d,0x934d8b4d,0x59c78b4d, +0x934fac93,0x934f830d,0x934d934f,0x8b0d8b4d,0x934f938f,0x8b4d830d,0x934d934d,0x59c7938f,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x122f1a6f,0x1a6f122d,0x1ab11aaf,0x1a69122f,0x2a63122f,0x232d1a27,0x09af1a67,0x122d1a67,0x2a053205,0x3a873205,0x29c53205,0x32453205,0x29c53205,0x32453245,0x32453205,0x32453205,0x3509350b,0x464d358b,0x2cc9354b,0x358b354b,0x2cc9354b,0x3dcb358b,0x358b350b,0x3d8b354b,0xa5298421,0xad6bad6b,0x94a5ad6b,0x7bdf8421,0x84217bdf,0xad6bc631,0xa529a529,0x84219ce7, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b0db495,0x6a096209,0x6a096a09,0x6a096a07,0x51c951c5,0x6a096a07,0x939159c7,0x5a078b4f,0x8b4dac95,0x6a0769c9,0x6a076a07,0x6a096a07,0x51c751c7,0x6a076a07,0x69c951c7,0x6a076a07,0x59c76209,0x6a076a07,0x6a0751c7,0x6a076a09,0x6a076a07,0x6a076a09,0x93916207,0x51c78b4f, +0x8b0db4d3,0x6a096a07,0x62096207,0x6a076a07,0x59c751c7,0x6a076a07,0x9bd159c7,0x59c78b4d,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x19af1a6f,0x19f111f3,0x1ab11a2d,0x1a691233,0x2a631aa5,0x22631a27,0x2aa31a67,0x19af1a67,0x42c73ac7,0x3a873a87,0x32473247,0x3a473247,0x42c73a87,0x32473a87,0x42c742c7,0x3a473a87,0x4e514e4f,0x3e4d3e4d,0x3dcb3dcb,0x3e0b3dcb,0x4e513e4d,0x3dcb3e0d,0x4e914e91,0x3e0b3e0d,0xb5ad94a5,0xad6bad6b,0x94a5ad6b,0xf80194a5,0xb5adf801,0xad6bce73,0xb5adb5ad,0x7bdfb5ad, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b0dac51,0x000051c7,0x00000000,0x00000000,0x00000000,0x00000000,0xac930000,0x51c7934f,0x8b4bac53,0x000059c7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xac930000,0x59c7934f, +0x8b4dac93,0x000051c7,0x00000000,0x00000000,0x00000000,0x00000000,0xac510000,0x51c7934d,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x1a2b19af,0x1a6f126d,0x092f1a6f,0x122d1a69,0x1a671a69,0x1a29122f,0x2aa31a29,0x19af1165,0x32453245,0x42c73ac7,0x3a873a87,0x3a873a87,0x32453205,0x3a873a87,0x3a873a87,0x3a873a87,0x358b358b,0x4e914e4f,0x3e0d3e0d,0x464d464d,0x358b354b,0x464d3e4d,0x3e0d3e0d,0x464d464d,0xad6b8421,0xa529ad6b,0x842194a5,0xf80194a5,0xb5add001,0xc631a529,0xa529a529,0x8421ad6b, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b4facd5,0x000059c5,0x00000000,0x00000000,0x00000000,0x00000000,0xb4950000,0x6a07934f,0x8b4db495,0x000051c7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xb4950000,0x6a09934f, +0x8b4fb495,0x000051c7,0x00000000,0x00000000,0x00000000,0x00000000,0xb4950000,0x6a098b4f,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x226719af,0x12b119ef,0x19eb1a71,0x1231092f,0x1aab2269,0x1a692a63,0x2aa31a27,0x19af19af,0x3a873a87,0x32453205,0x3a873a87,0x32453205,0x32453245,0x32053245,0x32473247,0x32053205,0x3e0d3e0d,0x358b350b,0x3e0d464d,0x3d8b354b,0x3dcb358b,0x350b358b,0x3dcb3dcb,0x354b354b,0xb5ad8421,0x9ce7b5ad,0x842194a5,0xf80194a5,0xb5ada801,0xce739ce7,0xb5adb5ad,0x94a5b5ad, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x9b4dac53,0x00006a07,0x00000000,0x00000000,0x00000000,0x00000000,0xac530000,0x6a07934f,0x934fac53,0x00006a07,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xac510000,0x6a07934f, +0x938dac51,0x00006a07,0x00000000,0x00000000,0x00000000,0x00000000,0xac910000,0x6a09934f,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x19af19af,0x19f119eb,0x232b1a2f,0x1a2d2269,0x1a291a2b,0x2a631a2b,0x1a292a63,0x19af2aa3,0x32473245,0x3a873245,0x320529c5,0x3a473247,0x3a873205,0x42c742c7,0x3a873247,0x3ac742c7,0x3dcb358b,0x3e4d3d8b,0x350b34c9,0x3e0d3dcb,0x3e0d354b,0x4e914e91,0x3e0d3dcb,0x4e4f4e91,0xa5298421,0x94a5a529,0xa5298421,0xd00194a5,0xb5add001,0x9ce7a529,0xa529ce73,0x8421b5ad, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x19af3321,0x116d19a7,0x2aa519eb,0x092f2269,0x1a2919ed,0x2a632265,0x1a292a63,0x32e33321,0x3a873a87,0x3a873a87,0x3a8742c7,0x3a873a87,0x3a873a87,0x3a473245,0x32473a87,0x32473205,0x464d464d,0x3e0d3e0d,0x464d4e51,0x3e0d3e0d,0x3e4d464d,0x3e0b3dcb,0x3dcb3e0d,0x3dcb354b,0xad6b8421,0x94a5b5ad,0x9ce78421,0xd00194a5,0xb5adb001,0xa529a529,0xad6bce73,0x8421ad6b, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x22632aa3,0x11271a67,0x1a231165,0x092f19a9,0x1a6911eb,0x2a632227,0x22652263,0x2aa332e3,0x32053205,0x3a473a47,0x32453245,0x3a873a87,0x32053205,0x3a873245,0x2a052a05,0x3a873245,0x354b354b,0x3e0d3e0d,0x3d8b358b,0x3e0d3e4d,0x354b354b,0x3e0d358b,0x35093509,0x3e0d3d8b,0xad6b7bdf,0x842194a5,0x9ce7a529,0xf80194a5,0xb5add801,0x9ce7a529,0xce73a529,0x7bdfb5ad, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x2aa532e3,0x19a52a63,0x11691167,0x092f11ad,0x1a2b116d,0x1a671a69,0x22632a63,0x2aa32223,0x32453245,0x320529c5,0x3a873a87,0x29c53205,0x3a873247,0x3a873a47,0x42c742c7,0x32053a87,0x358b3d8b,0x350b34c9,0x464f464d,0x2cc9354b,0x3e4d3dcb,0x3e0d3e0b,0x4e914e91,0x350b3e0d,0xa5298421,0x842194a5,0xa5299ce7,0xf80194a5,0xb5adb001,0xad299ce7,0xc631a529,0x8421a529, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x22632ae1,0x22632225,0x116b116b,0x09af1a69,0x11a5116d,0x1a252223,0x2a612a63,0x2aa32261,0x3a873a87,0x42c73a87,0x3a873a87,0x32453a47,0x324729c5,0x3a873a87,0x32473247,0x3ac73a87,0x3e0d3e0d,0x4e91464f,0x3e0d464d,0x3dcb3e0b,0x3dcb34c9,0x464d3e0d,0x3dcb3dcb,0x4e4f464d,0xb5ad8421,0xb5ada529,0xa5299ce7,0xd00194a5,0xb5adb001,0xce73ad29,0xad6bce73,0x94a5b5ad, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x221d1a65,0x1ab11ab1,0x22632263,0x22632263,0x1a69096f,0x09af11a5,0x22232a63,0x122d2a61,0x3a873a87,0x32473247,0x3a473a87,0x3a873a87,0x3a8742c7,0x32453245,0x3a873a47,0x32053245,0x464f464f,0x3dcb3dcb,0x3e0b464d,0x3e4d3e0d,0x3e4d4e91,0x358b358b,0x3e0d3e0b,0x354b3d8b,0xad6b8421,0xa529ad6b,0xb5ada529,0xc631b5ad,0xc631c631,0xb5adce73,0xa529ad6b,0x8421a529, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x1a6732df,0x1ab11a67,0x1a691235,0x22631a69,0x1a692263,0x2a632223,0x2a632a63,0x122d122d,0x32053205,0x3a473a87,0x32453205,0x3a873a87,0x32453247,0x3a873a87,0x32053205,0x3a873a87,0x354b350b,0x3e0b464d,0x3d8b354b,0x464f464d,0x358b3dcb,0x464d3e0d,0x354b354b,0x464d3e4d,0x84218421,0x84218421,0x94a57bdf,0x84218c63,0x84218421,0x84218421,0x84218421,0x84218421, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x739d7bdf,0x739d739d,0x7bdf739d,0x8c638c63,0x8c636b5b,0x739d7bdf,0x739d739d,0x7bdf739d,0x51874947,0x49474947,0x59875187,0x51874947,0x59875987,0x49474947,0x51875187,0x49474947,0xb547b505,0xad05acc5,0xce07c587,0xb547b507,0xcdc7cdc7,0xad05a485,0xc587c587,0xa4c5ad05,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x00000000,0x00000000,0x00000000,0x00000000,0x0000ef7b,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x7bdf7bdf,0x8c638c63,0x8c638c63,0x8c638c63,0x8c63739d,0x8c638c63,0x7bdf6b5b,0x739d7bdf,0x59875187,0x61c961c7,0x59875987,0x51875187,0x49474947,0x51875187,0x49474145,0x51875187,0xcdc7c587,0xde4bde49,0xcdc7d607,0xbd47bd47,0xa4c5ad05,0xbd47b547,0xa4c59c45,0xbd87b547,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x6b5b7bdf,0x2b671ab1,0x1a691af1,0x739d739d,0x739d8c63,0x7bdf7bdf,0x1a69092f,0x7bdf7bdf,0x59c75987,0x51875187,0x59c761c7,0x51875187,0x59c75987,0x59875987,0x61c761c7,0x59875987,0xd649d607,0xc587bd47,0xd649de49,0xbd47c587,0xd649cdc7,0xcdc7cdc7,0xde4bde49,0xcdc7cdc7,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x8c637bdf,0x7bdf7bdf,0x12317bdf,0x1aa37bdf,0x7bdf122f,0x739d739d,0x739d739d,0x7bdf739d,0x51875187,0x59c75987,0x51875187,0x59c75187,0x51874947,0x59c759c7,0x51875187,0x59c761c9,0xb547c587,0xd649ce07,0xbd47bd47,0xd649c587,0xbd47b507,0xd649d649,0xb547c587,0xd609de4b,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0xef7b0000,0x0000def7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x8c637bdf,0x739d8c63,0x739d739d,0x739d739d,0x739d739d,0x8c638c63,0x8c638c63,0x6b5b8c63,0x51875987,0x51874947,0x59875987,0x41454947,0x51875187,0x49475187,0x59875987,0x49474947,0xbd87cdc7,0xc587b507,0xce07ce07,0x9c45a485,0xc587b547,0xa4c5b547,0xce07ce07,0xa485ad05,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0xef7b0000,0xdef70000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x739d739d,0x7bdf7bdf,0x1ab17bdf,0x739d122f,0x6b5b7bdf,0x232d1a27,0x739d739d,0x7bdf6b5b,0x49454947,0x59c74947,0x41454947,0x51874947,0x41454947,0x51875187,0x51874947,0x51874947,0x9c85a4c5,0xd649b507,0x9c45b507,0xb547b505,0x9c45b507,0xbd47b547,0xb547a4c5,0xbd47ad05,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x0000ffff,0xdef7ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x8c638c63,0x19f17bdf,0x1ab11a2d,0x1a691233,0x7bdf7bdf,0x22631a27,0x8c638c63,0x6b5b8c63,0x61c961c7,0x59875987,0x51875187,0x51875187,0x61c95987,0x51875987,0x61c961c9,0x51875987,0xde4bde4b,0xce07d607,0xc587c587,0xc587bd87,0xde4bd607,0xbd47cdc7,0xde4bde4b,0xc587cdc7,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0xdef7def7,0xdef7ffff,0xffffef7b,0xffffffff,0x00000000,0x00000000,0x00000000,0x00000000,0xdef7def7,0x0000def7,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x1a2b7bdf,0x739d126d,0x739d739d,0x739d739d,0x6b5b739d,0x739d739d,0x739d739d,0x7bdf7bdf,0x51875187,0x61c961c7,0x59875987,0x59c759c7,0x51874947,0x59c75987,0x59875987,0x59c759c7,0xb547b547,0xde4bde4b,0xcdc7cdc7,0xd609d649,0xb547ad05,0xd649ce07,0xcdc7cdc7,0xd609d649,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x0000ef7b,0xdef7ffff,0x00000000,0xef7bef7b,0xef7b0000,0xffffef7b,0xffffffff,0x0000ffff,0x0000ef7b,0xdef7ffff,0x00000000,0xdef7ef7b,0x0000ffff,0x0000ef7b,0x0000ffff,0x0000ffff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x22677bdf,0x6b5b19ef,0x739d8c63,0x12317bdf,0x1aab7bdf,0x1a692a63,0x8c638c63,0x8c638c63,0x59875987,0x51874947,0x598759c7,0x51874947,0x51875187,0x49475187,0x51875187,0x49474947,0xcdc7cdc7,0xb547a4c5,0xcdc7d609,0xbd47b507,0xbd47b547,0xa4c5b547,0xbd47c587,0xa4c5acc5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0xef7b0000,0xffffef7b,0xef7bdef7,0xef7bffff,0x0000ffff,0x0000def7,0xffff0000,0x00000000,0xef7b0000,0x0000ef7b,0xef7b0000,0xffff0000,0x0000def7,0x0000def7,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x739d7bdf,0x739d739d,0x739d739d,0x1a2d739d,0x1a291a2b,0x2a631a2b,0x1a29739d,0x7bdf2aa3,0x51875187,0x59875187,0x49474145,0x59875187,0x59874947,0x61c961c9,0x59875187,0x61c761c9,0xbd47b547,0xd607bd47,0xa4859c85,0xcdc7bd47,0xcdc7b507,0xde4bde4b,0xcdc7c587,0xde49de4b,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0xffff0000,0xffffdef7,0xdef70000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xffffdef7,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x7bdf7bdf,0x739d8c63,0x8c6319eb,0x739d8c63,0x1a2919ed,0x8c632265,0x1a298c63,0x7bdf3321,0x59c759c7,0x59875987,0x59c761c9,0x59875987,0x598759c7,0x51875187,0x51875987,0x51874947,0xd649d609,0xcdc7cdc7,0xd649de4b,0xcdc7cdc7,0xd607d649,0xc587bd47,0xc587cdc7,0xc587ad05,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0xdef70000,0x0000ffff,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x7bdf6b5b,0x11271a67,0x7bdf1165,0x7bdf7bdf,0x8c638c63,0x7bdf7bdf,0x22657bdf,0x6b5b32e3,0x49474947,0x59875987,0x51875187,0x59875987,0x49474947,0x59875187,0x49454945,0x59875187,0xb507ad05,0xcdc7cdc7,0xbd47b547,0xcdc7ce07,0xb507ad05,0xcdc7b547,0x9c859c85,0xcdc7bd47,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x0000ffff,0xffff0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x739d7bdf,0x739d739d,0x1169739d,0x739d739d,0x1a2b116d,0x739d1a69,0x2263739d,0x7bdf2223,0x51875187,0x49474145,0x61c759c7,0x41454947,0x59875187,0x59875187,0x61c961c9,0x49475987,0xb547bd47,0xa4859c85,0xde49d609,0x9c45a4c5,0xce07c587,0xcdc7c587,0xde4bde4b,0xa4c5cdc7,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0xdef70000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x8c637bdf,0x8c63739d,0x116b116b,0x739d1a69,0x11a5116d,0x739d2223,0x7bdf7bdf,0x8c638c63,0x59875987,0x61c961c7,0x598759c7,0x51875187,0x51874145,0x59c75987,0x51875187,0x61c759c7,0xcdc7cdc7,0xde4bde49,0xcdc7d609,0xbd47c587,0xc5879c85,0xd649cdc7,0xc587bd87,0xde4bd649,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x0000def7,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x7bdf7bdf,0x739d7bdf,0x22632263,0x739d2263,0x7bdf7bdf,0x8c638c63,0x739d7bdf,0x7bdf739d,0x59c761c7,0x51875187,0x518759c7,0x59875987,0x598761c9,0x51875187,0x59875187,0x49475187,0xde49de49,0xbd47c587,0xc587d649,0xce07cdc7,0xd607de4b,0xb547b547,0xcdc7c587,0xad05bd47,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x739d739d,0x739d739d,0x8c636b5b,0x7bdf8c63,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x7bdf7bdf,0x49474947,0x518759c7,0x51874947,0x61c759c7,0x51875187,0x59c75987,0x49474947,0x59c75987,0xb507a4c5,0xc587d609,0xbd47ad05,0xde49d649,0xb547bd87,0xd609cdc7,0xb507ad05,0xd649d607,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe6e9e6eb,0xdea7d667,0xdea9e6e9,0xd665d667,0xdea9dea9,0xdea9d667,0xd6a7e6e9,0xef2be6e9,0x21a52163,0x21632163,0x29a921a7,0x21a52163,0x29a929a7,0x21632161,0x21a721a7,0x21612163,0x5c3553f3,0x53f34bb3,0x74b76475,0x5c3553f3,0x74b56cb5,0x53f34373,0x6c756c75,0x4bb353f3,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0xdea9dea9,0xdea9e6a9,0xce27d667,0xce25ce25,0xdea7dea7,0xe6e9d667,0xe72bdea7,0xef2be72b,0x29a721a7,0x29ed29eb,0x29a929a9,0x21a521a5,0x21612163,0x21a521a5,0x2161195f,0x21a521a5,0x6cb56c75,0x8d778d37,0x74b57cf7,0x64356435,0x4bb353f3,0x64355c35,0x4bb33b31,0x64355c35,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd667dea9,0xdea7dea9,0xce27ce65,0xd665ce25,0xd6a7d665,0xe6e9d665,0xdee9e6eb,0xe6ebe6e9,0x29e929a9,0x21a521a5,0x29e929eb,0x21a521a7,0x29e929a9,0x29a929a9,0x29eb29eb,0x29a729a9,0x7cf77cf7,0x64756435,0x7cf78537,0x64356c75,0x7cf774b5,0x74b574b5,0x8d378537,0x6cb574b5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdea7e6e9,0xdea7dea7,0xde67d667,0xe6a9dea7,0xdea7d665,0xdea7d665,0xdea9e6e9,0xd665dea9,0x21a521a7,0x29e929a9,0x21a521a5,0x29e921a7,0x21a52163,0x29e929e9,0x21a521a7,0x29e929ed,0x5c356c75,0x7cf774b7,0x5c356435,0x7cf76475,0x643553f3,0x7cf77cf7,0x5c356c75,0x7cf78d77,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd665dea7,0xd665dea7,0xdea7d6a7,0xe6e9dea9,0xdea7d665,0xd6a7dea7,0xdea9e6e9,0xd667dea9,0x21a529a7,0x21a72163,0x29a929a9,0x215f2161,0x21a721a5,0x216321a5,0x29a929a9,0x21612163,0x64356cb5,0x6c7553f3,0x74b774b7,0x3b714373,0x6c755c35,0x4bb35c35,0x74b774b7,0x437353f3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdea7d665,0xce25dea7,0xd667ce25,0xef2de6eb,0xd667dea9,0xd667de67,0xdea7dea7,0xdea7dea9,0x21612161,0x29e921a3,0x215f2163,0x21a52163,0x215f2163,0x21a521a5,0x21a52161,0x21a52163,0x43734bb3,0x7cf753f3,0x3b7153f3,0x5c3553f3,0x3b7153f3,0x64355c35,0x5c3543b3,0x5c3553f3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdea9d667,0xd667dea9,0xd665dea7,0xe6edd667,0xdea7dea9,0xdea7e6e9,0xdea9d667,0xdea9dea9,0x29ed29eb,0x29a929a9,0x21a721a7,0x21a721a5,0x29ed29a9,0x21a529a7,0x29ed29ed,0x21a729a9,0x8d378d37,0x74b77cf7,0x64756475,0x6c756435,0x8d377cf7,0x64356cb5,0x8d778d77,0x6c7574b5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd667dea9,0xce65dea9,0xd667dea7,0xd665d665,0xdea9dea9,0xdea9e6e9,0xdea9dea7,0xdea9dea9,0x21a521a5,0x29ed29eb,0x29a729a9,0x29e929e9,0x21a52163,0x29e929a9,0x29a729a7,0x29e929eb,0x5c355c35,0x8d778d37,0x6cb574b5,0x7cf77cf7,0x5c3553f3,0x7cf774b7,0x6cb56cb5,0x7cf77cf7,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd665dea7,0xdea9dea9,0xe6a9dea7,0xdea9dea9,0xdea7dea9,0xe6e9dea7,0xe6ebe6eb,0xd6a7e6e9,0x29a929a9,0x21a52161,0x29a729e9,0x21a52163,0x21a521a5,0x216121a5,0x21a521a7,0x21632163,0x74b574b5,0x5c354bb3,0x6cb57cf7,0x5c3553f3,0x64355c35,0x43b35c35,0x64356475,0x4bb34bb3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd665d665,0xd667d665,0xe6e9dea9,0xce25dea7,0xd667e6e9,0xdea9d665,0xdea9e6eb,0xdea7dea9,0x21a521a5,0x29a921a5,0x2161215f,0x29a721a5,0x29a72163,0x29ed29ed,0x29a921a5,0x29eb29ed,0x64355c35,0x7cf75c35,0x43733b73,0x6c756435,0x6cb553f3,0x8d778d77,0x74b56475,0x8d378d77,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdea7ce25,0xdea7d6a7,0xe6ebd667,0xdea7dea9,0xdee7dea7,0xce23dea7,0xef2de6e9,0xd665e6eb,0x29eb29e9,0x29a929a9,0x29e929ed,0x29a729a9,0x29a929eb,0x21a721a5,0x21a729a7,0x21a72163,0x7cf77cf7,0x74b574b5,0x7cf78d37,0x6cb574b5,0x7cf77cf7,0x6c756435,0x64756cb5,0x6c7553f3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe6e9dea7,0xdea9dea9,0xde67d667,0xce25e6a9,0xd667d667,0xd667d665,0xdea9dea9,0xdea7d667,0x21632163,0x29a729a7,0x21a521a5,0x29a929a9,0x21632163,0x29a721a5,0x21612161,0x29a721a5,0x53f353f3,0x6c756c75,0x5c355c35,0x74b574b7,0x53f353f3,0x6cb55c35,0x43734373,0x6cb55c35,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdea9dea9,0xdea9dea9,0xdee9dea9,0xd665dea7,0xd665ce23,0xce25d665,0xdea7d665,0xdea7e6e9,0x21a521a5,0x2161215f,0x29eb29e9,0x215f2163,0x29a921a7,0x29a921a7,0x29ed29ed,0x216129a7,0x5c355c35,0x43733b73,0x85377cf7,0x3b714bb3,0x74b76475,0x74b56c75,0x8d778d77,0x43b36cb5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdea9e6eb,0xdeebd667,0xd669dea9,0xd6a7d667,0xd667d667,0xd667dea7,0xdea9dea9,0xe6e9dea7,0x29a729a9,0x29ed29eb,0x29a929e9,0x21a521a7,0x21a5215f,0x29e929a9,0x21a521a5,0x29eb29e9,0x6cb574b5,0x8d778537,0x74b57cf7,0x64356c75,0x64753b73,0x7cf774b5,0x64756435,0x8d377cf7,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe6e9e6e9,0xe6e9dea7,0xdee9dea9,0xce65d667,0xdea7d667,0xdea9d6a7,0xe6ebdea9,0xdea9dea9,0x29eb29eb,0x21a521a7,0x21a729e9,0x29a929a7,0x29a929ed,0x21a521a5,0x29a921a7,0x216321a5,0x84f78537,0x64356c75,0x6c757cf7,0x74b76cb5,0x7cf78d77,0x5c355c35,0x74b56c75,0x53f35c35,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe6e9ef2b,0xdea7dea9,0xe6a9de67,0xd667dea9,0xdea9d667,0xe6ebd6a7,0xdee9dea7,0xdea9dea9,0x21632161,0x21a729e9,0x21a52163,0x29eb29e9,0x21a521a5,0x29e929a7,0x21632163,0x29e929a9,0x53f34bb3,0x6c757cf7,0x5c3553f3,0x85377cf7,0x5c356435,0x7cf76cb5,0x53f353f3,0x7cf77cf7,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xef2deeed,0xe6edef2d,0xe6ebe6ab,0xef2df76f,0xf76fef2d,0xef2def2d,0xf76fef2d,0xef2df76f,0x796f716d,0x716d716d,0x89f381b1,0x796f716d,0x81f381b3,0x716d696b,0x81b381b3,0x716b716d,0xb9f1b9f1,0xb9f1b1b1,0xc2b3ba73,0xb9f1b9f1,0xc2b3c2b3,0xb1f1a9ad,0xc273c273,0xb1afb1f1,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f, +0xd669e6eb,0xdea9dea9,0xd669dea9,0xce25d667,0xd667d667,0xdea9dea7,0xe6edd667,0xe6ebe6ed,0x81b381b1,0x92759275,0x81f389f3,0x79b179b1,0x716b716d,0x79b1796f,0x716b6969,0x79b1796f,0xc2b3c273,0xcb75cb35,0xc2b3c2f3,0xba33ba33,0xb1afb9f1,0xba33b9f1,0xb1afa1ab,0xba33b9f1,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x1abf1abf, +0xd667c621,0xc5e1d663,0xc621ce21,0xc5e1ce23,0xc61fc621,0xc5ddc5df,0xce65ce21,0xc5dfc5e3,0x8a3389f3,0x79b179b1,0x8a338a35,0x79b181b3,0x8a3381f3,0x81f381f3,0x92759235,0x81b381f3,0xc2f5c2f3,0xba33ba33,0xc2f5cb35,0xba33c273,0xc2f5c2b3,0xc2b3c2b3,0xcb75cb35,0xc2b3c2b3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x1abf1abf,0x22ff22ff,0x3b7f22ff,0x22ff22ff,0x22ff22ff,0x3b7f1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f22ff,0x22ff22ff,0x22ff22ff,0x3b7f1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f22ff,0x22ff22ff,0x22ff22ff,0x3b7f1abf,0x1abf3b7f,0x1abf1abf, +0xf771ce23,0xef2de6ed,0xf771ce1f,0xf76ff76f,0xe6edef2f,0xf76fbd9b,0xe6ede6ed,0xf76ff76f,0x796f81b1,0x8a3389f3,0x79af79b1,0x8a3381b1,0x79b1716d,0x8a338a33,0x796f81b1,0x8a339275,0xb9f1c273,0xc2f5c2b3,0xba33ba33,0xc2f5ba73,0xba33b9f1,0xc2f5c2f5,0xb9f1c273,0xc2f3cb75,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x3b7f1abf,0x22ff3b7f,0x3b7f22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f1abf,0x22ff3b7f,0x3b7f22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f1abf,0x22ff3b7f,0x3b7f22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff, +0xdea9ce21,0xd667dea7,0xdee9ce1f,0xe6e9e6eb,0xc5ddde67,0xd667e6eb,0xe6eddea9,0xdea9d667,0x79b181b3,0x81b1716d,0x89f389f3,0x6969696b,0x81b3796f,0x716d796f,0x89f389f3,0x696b716d,0xba33c2b3,0xc273b9f1,0xc2b3c2b3,0xa1ada9ad,0xc273b9f1,0xb1afb9f1,0xc2b3c2b3,0xa9adb1f1,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x22ff22ff,0x1abf22ff,0x1abf22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x22ff22ff,0x1abf22ff,0x1abf22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x22ff22ff,0x1abf22ff,0x1abf22ff, +0xd667d6a9,0xdea7d667,0xe6ebce1f,0xef2ddea9,0xc5dddea9,0xdea7e6eb,0xdea9dea7,0xc5dfdeab,0x6969716b,0x8a33796f,0x6969716d,0x796f716d,0x6969716d,0x79b1796f,0x796f716b,0x79af716d,0xa9adb1af,0xc2f5b9f1,0xa1adb9f1,0xb9f1b9f1,0xa1adb9f1,0xba33b9f1,0xb9f1a9af,0xba33b9f1,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff3b7f,0x1abf22ff,0x22ff22ff,0x22ff22ff,0x1abf3b7f,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff3b7f,0x1abf22ff,0x22ff22ff,0x22ff22ff,0x1abf3b7f,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff3b7f,0x1abf22ff,0x22ff22ff,0x22ff22ff,0x1abf3b7f,0x1abf1abf,0x3b7f1abf,0x1abf1abf, +0xce63dea9,0xce23ce63,0xce23ce1f,0xe6eddeed,0xc5ddbd9d,0xe6ebc621,0xd6a7deeb,0xc5dfdeab,0x92759275,0x89f389f3,0x81b181b1,0x81b379b1,0x927589f3,0x79b181b3,0x92759275,0x81b381f3,0xcb75cb75,0xc2b3c2f3,0xba73ba73,0xc273ba33,0xcb75c2f3,0xba33c2b3,0xcb75cb75,0xc273c2b3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f, +0xf771c5dd,0xeeedef2d,0xef2ff771,0xc621ce23,0xef2def2d,0xc621f76f,0xce21ce25,0xef2fc5df,0x796f796f,0x92759275,0x81b381f3,0x8a338a33,0x796f716d,0x8a3389f3,0x81b381b3,0x8a338a33,0xb9f1b9f1,0xcb75cb75,0xc2b3c2b3,0xc2f3c2f5,0xb9f1b9f1,0xc2f5c2b3,0xc2b3c2b3,0xc2f3c2f5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x22ff1abf,0x3b7f22ff,0x22ff3b7f,0x1abf22ff,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x22ff1abf,0x3b7f22ff,0x22ff3b7f,0x1abf22ff,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x22ff1abf,0x3b7f22ff,0x22ff3b7f,0x1abf22ff, +0xdea9ef2f,0xdea9e6eb,0xc5dfdea9,0xef2fef2d,0xdea7deab,0xd663e6eb,0xef2df76f,0xef2fc5df,0x81f381f3,0x796f716b,0x81b38a33,0x79af716d,0x79b1796f,0x716b796f,0x79b181b1,0x716d716d,0xc2b3c2b3,0xb9f1b1af,0xc2b3c2f3,0xba33b9f1,0xba33b9f1,0xa9afb9f1,0xba33ba73,0xb1afb1b1,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff22ff,0x22ff3b7f,0x22ff22ff,0x22ff22ff,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff3b7f,0x22ff22ff,0x22ff22ff,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff3b7f,0x22ff22ff,0x22ff22ff,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xe6ebd667,0xe6ebe6eb,0xc5dddea7,0xdeabeeed,0xdeabe6eb,0xc5dbd667,0xdeebe6ed,0xdeebc5df,0x79b1796f,0x89f379af,0x696b6969,0x81b379b1,0x81b3716d,0x92759275,0x81f379b1,0x92759275,0xba33b9f1,0xc2f3ba33,0xa9ada1ad,0xc273ba33,0xc2b3b9f1,0xcb75cb75,0xc2b3ba33,0xcb35cb75,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f22ff,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f22ff,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f22ff,0x22ff3b7f,0x22ff22ff, +0xc5dfdea7,0xc5dfc5df,0xce21d667,0xdea7dea7,0xdea7e6ed,0xce21dea9,0xc5dddeeb,0xc59dc5dd,0x8a338a33,0x81f381f3,0x8a339275,0x81b381f3,0x89f38a33,0x81b379b1,0x81b181b3,0x81b1716d,0xc2f5c2f3,0xc2b3c2b3,0xc2f5cb75,0xc2b3c2b3,0xc2f3c2f5,0xc273ba33,0xba73c2b3,0xc273b1f1,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x3b7f22ff,0x1abf3b7f,0x3b7f1abf,0x1abf22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x3b7f22ff,0x1abf3b7f,0x3b7f1abf,0x1abf22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x3b7f22ff,0x1abf3b7f,0x3b7f1abf,0x1abf22ff,0x1abf1abf, +0xef2fc5dd,0xe6ebef2f,0xbd9bce21,0xc5ddc5dd,0xc5dddea7,0xef2fc5dd,0xe6e9c5dd,0xef2fef2f,0x716d716d,0x81b381b3,0x79af796f,0x81f389f3,0x716d716d,0x81b3796f,0x69696969,0x81b379af,0xb9f1b1f1,0xc273c273,0xba33b9f1,0xc2b3c2b3,0xb9f1b9f1,0xc2b3b9f1,0xa9ada9ad,0xc2b3ba33,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xe6efef2d,0xce23e6eb,0xef2fef2d,0xef2def2d,0xef31c5dd,0xdeabeeed,0xe6edce23,0xe6ede72f,0x796f79af,0x696b6969,0x8a358a33,0x6969716d,0x89f381b1,0x81f381b3,0x92759275,0x716b81b3,0xb9f1ba33,0xa9ada1ad,0xcb35c2f3,0xa1adb1af,0xc2b3ba73,0xc2b3c273,0xcb75cb75,0xa9afc2b3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff22ff,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff22ff,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff22ff,0x22ff22ff,0x1abf1abf,0x1abf1abf, +0xe6efe6ed,0xc5dfd667,0xdea9d669,0xdeabdea7,0xd6a9c5dd,0xd667d667,0xe6edc5dd,0xdea9deeb,0x81b381f3,0x92759235,0x81f38a33,0x79b181b3,0x79b16969,0x8a3381f3,0x79b179b1,0x92758a33,0xc2b3c2b3,0xcb75cb35,0xc2b3c2f3,0xba33c273,0xba33a1ad,0xc2f5c2b3,0xba33ba33,0xcb75c2f5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x1abf1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff, +0xc621ce25,0xce23e6eb,0xe72ddea9,0xbd9ddeed,0xce1fe6ed,0xe6ebdeeb,0xbd9bc621,0xbd9bdea9,0x8a358a35,0x79b181b1,0x81b38a33,0x89f381b3,0x89f39275,0x796f796f,0x81f381b3,0x716d79af,0xc335cb35,0xba33c273,0xc273c2f5,0xc2b3c2b3,0xc2f3cb75,0xb9f1b9f1,0xc2b3c273,0xb9f1ba33,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x3b7f3b7f, +0xef2de72f,0xdea9ce23,0xc621c621,0xe6ebc5df,0xdea7e6e9,0xce21c5dd,0xef2deeed,0xef2fc5dd,0x716d716b,0x81b38a33,0x79af716d,0x92358a33,0x796f79b1,0x8a3381b3,0x716d716d,0x8a3389f3,0xb9f1b1af,0xc273c2f3,0xba33b9f1,0xcb35c2f5,0xb9f1ba33,0xc2f3c2b3,0xb9f1b9f1,0xc2f5c2f3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xdea9ef2b,0xc5ddce23,0xdea9e6eb,0xc5ddef2d,0xe6e9d667,0xdea9dea9,0xdea9c5dd,0xdea9dea9,0x23632363,0x23612361,0x2be723a5,0x23632363,0x2be72be7,0x23612321,0x2ba52ba5,0x23212361,0xebcdeb8b,0xeb8beb89,0xec11ec0d,0xebcbebcb,0xec0fec0f,0xeb89e347,0xec0dec0d,0xeb89eb89,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f, +0xc5dde6eb,0xe6a9dea9,0xd667c5dd,0xc5ddd667,0xdea9dea7,0xd667d667,0xc5ddd667,0xe72dc5dd,0x2be723a5,0x2c2b2c2b,0x2be72be9,0x23a523a5,0x23212361,0x23a52363,0x23211adf,0x23a52363,0xec0fec0d,0xec53ec53,0xec0fec11,0xebcdebcd,0xeb89eb8b,0xebcdebcb,0xeb89e345,0xebcdebcd,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x22ff1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x1abf1abf, +0xe6a9ce23,0xc5dddea7,0xd667c5dd,0xd665ce25,0xd665c5dd,0xe6e9ce25,0xef2bc5dd,0xc5dde6e9,0x2be92be9,0x23a523a5,0x2be92c29,0x23a52ba5,0x2be92be7,0x2be72be7,0x2c2b2c29,0x2be72be7,0xec51ec11,0xebcdebcd,0xec51ec51,0xebcdec0d,0xec51ec0f,0xec0fec0f,0xec53ec51,0xec0fec0f,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1abf1abf,0x22ff22ff,0x3b7f22ff,0x22ff22ff,0x22ff22ff,0x3b7f1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f22ff,0x22ff22ff,0x22ff22ff,0x3b7f1abf,0x1abf3b7f,0x1abf1abf, +0xdea7ce23,0xeeedc5dd,0xc5ddeeed,0xdea9dea7,0xd665d663,0xc5ddd6a7,0xe6e9eeed,0xd665dea7,0x236323a5,0x2be92be7,0x23a323a5,0x2be923a5,0x23a52363,0x2be92be9,0x236323a5,0x2be92c2b,0xebcdec0d,0xec51ec11,0xebcdebcd,0xec51ec0d,0xebcdebcb,0xec51ec51,0xebcdec0d,0xec51ec53,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x3b7f1abf,0x22ff3b7f,0x3b7f22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f1abf,0x22ff3b7f,0x3b7f22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff, +0xc5dddea7,0xdea9eeed,0xd663d667,0xef2def2d,0xce23c5dd,0xeeedce23,0xe6e9e6e9,0xdea9dea7,0x23a52be7,0x23a52363,0x2be72be7,0x231f2321,0x2ba52363,0x23212363,0x2be72be7,0x23212361,0xebcdec0f,0xec0debcb,0xec11ec11,0xe345e347,0xec0debcb,0xeb89ebcb,0xec11ec11,0xe347eb89,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x22ff22ff,0x1abf22ff,0x1abf22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x22ff22ff,0x1abf22ff,0x1abf22ff, +0xc5ddd667,0xdea9d667,0xd663dea9,0xc5ddc5dd,0xdea9e6e9,0xc5dddea7,0xdea7d667,0xd667ce25,0x231f2321,0x2be92363,0x231f2363,0x23632363,0x231f2363,0x23a52363,0x23632321,0x23a32361,0xe347eb89,0xec51ebcb,0xe345ebcb,0xebcdeb8b,0xe345ebcb,0xebcdebcd,0xebcbeb47,0xebcdeb8b,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x22ff3b7f,0x1abf22ff,0x22ff22ff,0x22ff22ff,0x1abf3b7f,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff3b7f,0x1abf22ff,0x22ff22ff,0x22ff22ff,0x1abf3b7f,0x1abf1abf,0x3b7f1abf,0x1abf1abf, +0xdea7c5dd,0xeeeddea7,0xd663d667,0xe6ebc5dd,0xdea7c5dd,0xd665e6e9,0xce23ce23,0xc5ddeeed,0x2c2b2c2b,0x2be72be9,0x23a523a5,0x2ba523a5,0x2c2b2be9,0x23a52be7,0x2c2b2c2b,0x2ba52be7,0xec53ec53,0xec11ec11,0xec0dec0d,0xec0debcd,0xec53ec11,0xebcdec0f,0xec53ec53,0xec0dec0f,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x7ca77ca7,0x00000000,0x7ca70000,0x00007ca7,0x00000000,0x7ca77ca7,0x00000000,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f, +0xc5dde6e9,0xd663eeed,0xc5ddc5dd,0xd665d665,0xe6e9c5dd,0xdea9dea9,0xe6ebdea9,0xe6ebc5dd,0x23632363,0x2c2b2c2b,0x2be72be7,0x2be92be9,0x23632361,0x2be92be7,0x2be72be7,0x2be92c29,0xebcdebcd,0xec53ec53,0xec0fec0f,0xec51ec51,0xebcbeb8b,0xec51ec11,0xec0fec0f,0xec51ec51,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x7ca70000,0xd6f7ffff,0x0000535d,0xffff7ca7,0x535dd6f7,0x7ca70000,0xd6f7ffff,0x0000535d,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x22ff1abf,0x3b7f22ff,0x22ff3b7f,0x1abf22ff,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x22ff1abf,0x3b7f22ff,0x22ff3b7f,0x1abf22ff, +0xd665d665,0xdea9c5dd,0xe6e9e6e9,0xd667ce23,0xc5dddea9,0xdea7c5dd,0xc5ddef2d,0xd665dea9,0x2be72be7,0x23632321,0x2be72be9,0x23a32363,0x23a52363,0x23212363,0x23a523a5,0x23212361,0xec0fec0f,0xebcbeb89,0xec0fec51,0xebcdebcb,0xebcdebcb,0xeb47ebcb,0xebcdec0d,0xeb89eb89,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x7ca70000,0xbe73d6f7,0x0000535d,0xd6f77ca7,0x535dbe73,0x7ca70000,0xbe73d6f7,0x0000535d,0x22ff22ff,0x22ff3b7f,0x22ff22ff,0x22ff22ff,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff3b7f,0x22ff22ff,0x22ff22ff,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xdea7d667,0xd665ce23,0xdea9dea9,0xd665c5df,0xd665e6e9,0xc5ddce25,0xce23c5dd,0xd667e6e9,0x23a52363,0x2be923a3,0x2321231f,0x2ba723a5,0x2be72363,0x2c2b2c2b,0x2be723a5,0x2c2b2c2b,0xebcdebcb,0xec11ebcd,0xe347e345,0xec0febcd,0xec0febcb,0xec53ec53,0xec0febcd,0xec53ec53,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x535d535d,0x00000000,0x535d0000,0x0000535d,0x00000000,0x535d535d,0x00000000,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f22ff,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f22ff,0x22ff3b7f,0x22ff22ff, +0xc5ddd665,0xd667d665,0xe6e9dea9,0xdea9c5dd,0xd667dea9,0xef2dc5dd,0xce23dea9,0xdea7e6e9,0x2c292be9,0x2be72be7,0x2be92c2b,0x2be72be7,0x2be92c29,0x2ba523a5,0x23a52be7,0x23a52361,0xec51ec51,0xec0fec0f,0xec51ec53,0xec0fec0f,0xec11ec51,0xec0debcd,0xec0dec0f,0xec0deb89,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x3b7f22ff,0x1abf3b7f,0x3b7f1abf,0x1abf22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x3b7f22ff,0x1abf3b7f,0x3b7f1abf,0x1abf22ff,0x1abf1abf, +0xef2dc5dd,0xe6e9ef2d,0xe6e9dea7,0xc5dde6e9,0xef2dd667,0xef2dc5dd,0xc5dddea9,0xdea9dea9,0x23632361,0x2ba72ba7,0x23a32363,0x2be72be7,0x23632361,0x2be72363,0x231f231f,0x2be723a3,0xebcbeb89,0xec0fec0f,0xebcdebcd,0xec0fec11,0xebcbeb8b,0xec0febcb,0xe347e347,0xec0febcd,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xce23dea9,0xe6ebc5dd,0xce23ce23,0xd665c5dd,0xc5ddd665,0xdea7ef2d,0xdee9d665,0xce23c5dd,0x236323a3,0x2321231f,0x2c292be9,0x231f2321,0x2be723a5,0x2be72ba5,0x2c2b2c2b,0x23212be7,0xebcdebcd,0xe347e345,0xec51ec51,0xe345eb89,0xec11ec0d,0xec0fec0d,0xec53ec53,0xeb47ec0f,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff22ff,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff22ff,0x22ff22ff,0x1abf1abf,0x1abf1abf, +0xe6a9e6e9,0xc5ddef2d,0xdea9c5dd,0xc5dddea7,0xce23d665,0xdea9dea7,0xc5dde6e9,0xdea9eeed,0x2be72be7,0x2c2b2c29,0x2be72be9,0x23a52ba5,0x23a5231f,0x2be92be7,0x23a523a5,0x2c2b2be9,0xec0fec0f,0xec53ec51,0xec0fec51,0xebcdec0d,0xebcde345,0xec51ec0f,0xebcdebcd,0xec53ec51,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1abf1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff, +0xe6e9e6e9,0xef2dd667,0xdea9c5dd,0xc5ddd667,0xc5ddce23,0xdea9ce23,0xeeedc5dd,0xdea9dea7,0x2c292c29,0x23a523a5,0x2ba52be9,0x2be72be7,0x2be92c2b,0x23632363,0x2be72ba5,0x236123a3,0xec51ec51,0xebcdec0d,0xec0dec51,0xec11ec0f,0xec11ec53,0xebcbebcb,0xec0fec0d,0xeb8bebcd,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x3b7f3b7f, +0xdea9e6eb,0xc5dddea7,0xe6ebdea9,0xc5dddea7,0xdea9dea9,0xc5ddde67,0xdea9dea7,0xe6ebdea9,0x23632321,0x2ba52be9,0x23a32361,0x2c292be9,0x236323a5,0x2be92be7,0x23632361,0x2be92be9,0xebcbeb89,0xec0dec51,0xebcdeb8b,0xec51ec51,0xebcdebcd,0xec51ec0f,0xebcbeb8b,0xec51ec11,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x94e794e7,0x8ca58ca5,0xad6b9d29,0x94e794e7,0xa56ba56b,0x8ca58463,0xa529a529,0x8ca58ca5,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0xfd01c801,0xfa81fd01,0xc801f801,0xc801c801,0xf801f801,0xf801fa81,0xc801f801,0xc801c801,0xfd01c801,0xfa81fd01,0xc801f801,0xc801c801,0xf801f801,0xf801fa81,0xc801f801,0xc801c801,0xfd01c801,0xfa81fd01,0xc801f801,0xc801c801,0xf801f801,0xf801fa81,0xc801f801,0xc801c801, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa56b9d29,0xbdefb5ef,0xa56badad,0x9d299d29,0x8ca58ca5,0x9d2994e7,0x8ca57c63,0x9d2994e7,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xffc1fa81,0xfa81ffc1,0xf801f801,0xf801c801,0xfa81f801,0xfa81ffc1,0xf801f801,0xc801c801,0xffc1fa81,0xfa81ffc1,0xf801f801,0xf801c801,0xfa81f801,0xfa81ffc1,0xf801f801,0xc801c801,0xffc1fa81,0xfa81ffc1,0xf801f801,0xf801c801,0xfa81f801,0xfa81ffc1,0xf801f801,0xc801c801, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xadadadad,0x9d299d29,0xadadb5ad,0x9d29a529,0xadada56b,0xa56ba56b,0xb5efb5ad,0xa56ba56b,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfd01fa81,0xfa81ffc1,0xf801c801,0xfa81f801,0xfa81f801,0xfd01ffc1,0xf801c801,0xf801f801,0xfd01fa81,0xfa81ffc1,0xf801c801,0xfa81f801,0xfa81f801,0xfd01ffc1,0xf801c801,0xf801f801,0xfd01fa81,0xfa81ffc1,0xf801c801,0xfa81f801,0xfa81f801,0xfd01ffc1,0xf801c801,0xf801f801, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x94e79d29,0xadada56b,0x94e79d29,0xadad9d29,0x9d2994e7,0xadadadad,0x94e79d29,0xadadbdef,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf801f801,0xf801fa81,0xfa81fa81,0xffc1fd01,0xfa81fa81,0xfa81fa81,0xfa81fa81,0xf801f801,0xf801f801,0xf801fa81,0xfa81fa81,0xffc1fd01,0xfa81fa81,0xfa81fa81,0xfa81fa81,0xf801f801,0xf801f801,0xf801fa81,0xfa81fa81,0xffc1fd01,0xfa81fa81,0xfa81fa81,0xfa81fa81,0xf801f801, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x9d29a56b,0x9d2994e7,0xa56bad6b,0x84638463,0xa52994e7,0x8ca594e7,0xad6bad6b,0x84638ca5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc801f801,0xfa81f801,0xfa81ffc1,0xfa81fa81,0xffc1fd01,0xffc1fa81,0xfd01ffc1,0xf801fa81,0xc801f801,0xfa81f801,0xfa81ffc1,0xfa81fa81,0xffc1fd01,0xffc1fa81,0xfd01ffc1,0xf801fa81,0xc801f801,0xfa81f801,0xfa81ffc1,0xfa81fa81,0xffc1fd01,0xffc1fa81,0xfd01ffc1,0xf801fa81, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x84638ca5,0xadad94e7,0x846394e7,0x94e794e7,0x846394e7,0x9d2994e7,0x94e784a5,0x95298ca5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf801f801,0xffc1fd01,0xfa81fa81,0xf801c801,0xf801f801,0xfd01c801,0xfa81fd01,0xf801fa81,0xf801f801,0xffc1fd01,0xfa81fa81,0xf801c801,0xf801f801,0xfd01c801,0xfa81fd01,0xf801fa81,0xf801f801,0xffc1fd01,0xfa81fa81,0xf801c801,0xf801f801,0xfd01c801,0xfa81fd01,0xf801fa81, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xb5efb5ef,0xa56badad,0x9d299d29,0xa5299d29,0xb5efadad,0x9d29a56b,0xbdefbdef,0xa529a56b,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf801c801,0xf801fa81,0xf801f801,0xc801c801,0xf801f801,0xfa81f801,0xf801f801,0xf801fd01,0xf801c801,0xf801fa81,0xf801f801,0xc801c801,0xf801f801,0xfa81f801,0xf801f801,0xf801fd01,0xf801c801,0xf801fa81,0xf801f801,0xc801c801,0xf801f801,0xfa81f801,0xf801f801,0xf801fd01, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x94e794e7,0xbdefb5ef,0xa56ba56b,0xadadadad,0x94e78ca5,0xadada56b,0xa56ba56b,0xadadadad,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc801c801,0xfa81f801,0xfa81fd01,0xc801c801,0xfa81fa81,0xc801f801,0xfd01f801,0xfd01ffc1,0xc801c801,0xfa81f801,0xfa81fd01,0xc801c801,0xfa81fa81,0xc801f801,0xfd01f801,0xfd01ffc1,0xc801c801,0xfa81f801,0xfa81fd01,0xc801c801,0xfa81fa81,0xc801f801,0xfd01f801,0xfd01ffc1, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa56ba56b,0x94e78ca5,0xa56badad,0x94e794e7,0x9d2994e7,0x84a594e7,0x9d299d29,0x8ca58ca5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc801c801,0xfd01fa81,0xfd01ffc1,0xf801f801,0xffc1fd01,0xc801fa81,0xfa81f801,0xfa81fa81,0xc801c801,0xfd01fa81,0xfd01ffc1,0xf801f801,0xffc1fd01,0xc801fa81,0xfa81f801,0xfa81fa81,0xc801c801,0xfd01fa81,0xfd01ffc1,0xf801f801,0xffc1fd01,0xc801fa81,0xfa81f801,0xfa81fa81, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x9d2994e7,0xadad9529,0x84638463,0xa56b9d29,0xa56b94e7,0xbdefbdef,0xa56b9d29,0xb5efbdef,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf801f801,0xfa81f801,0xfa81fa81,0xf801f801,0xffc1fa81,0xc801fa81,0xf801c801,0xf801fa81,0xf801f801,0xfa81f801,0xfa81fa81,0xf801f801,0xffc1fa81,0xc801fa81,0xf801c801,0xf801fa81,0xf801f801,0xfa81f801,0xfa81fa81,0xf801f801,0xffc1fa81,0xc801fa81,0xf801c801,0xf801fa81, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xadadadad,0xa56ba56b,0xadadb5ef,0xa56ba56b,0xadadadad,0xa5299d29,0x9d29a56b,0x9d298ca5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfa81f801,0xf801fa81,0xf801f801,0xf801c801,0xfa81fa81,0xf801fa81,0xfd01f801,0xf801fa81,0xfa81f801,0xf801fa81,0xf801f801,0xf801c801,0xfa81fa81,0xf801fa81,0xfd01f801,0xf801fa81,0xfa81f801,0xf801fa81,0xf801f801,0xf801c801,0xfa81fa81,0xf801fa81,0xfd01f801,0xf801fa81, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x94e78ca5,0xa56ba56b,0x94e794e7,0xa56bad6b,0x94e78ca5,0xa56b94e7,0x84638463,0xa56b9529,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfd01f801,0xfa81ffc1,0xfd01fa81,0xf801fa81,0xf801f801,0xfa81f801,0xffc1fd01,0xf801fd01,0xfd01f801,0xfa81ffc1,0xfd01fa81,0xf801fa81,0xf801f801,0xfa81f801,0xffc1fd01,0xf801fd01,0xfd01f801,0xfa81ffc1,0xfd01fa81,0xf801fa81,0xf801f801,0xfa81f801,0xffc1fd01,0xf801fd01, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x94e794e7,0x84638463,0xb5adadad,0x84638ca5,0xad6b9d29,0xa56ba529,0xbdefbdef,0x84a5a56b,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xffc1f801,0xfa81ffc1,0xffc1ffc1,0xf801fd01,0xf801c801,0xfa81f801,0xffc1ffc1,0xf801fa81,0xffc1f801,0xfa81ffc1,0xffc1ffc1,0xf801fd01,0xf801c801,0xfa81f801,0xffc1ffc1,0xf801fa81,0xffc1f801,0xfa81ffc1,0xffc1ffc1,0xf801fd01,0xf801c801,0xfa81f801,0xffc1ffc1,0xf801fa81, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa56ba56b,0xbdefb5ad,0xa56badad,0x9d29a529,0x9d298463,0xadada56b,0x9d299d29,0xb5efadad,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfa81f801,0xfa81fd01,0xfa81fa81,0xf801fa81,0xfa81fa81,0xfa81f801,0xfa81fd01,0xf801f801,0xfa81f801,0xfa81fd01,0xfa81fa81,0xf801fa81,0xfa81fa81,0xfa81f801,0xfa81fd01,0xf801f801,0xfa81f801,0xfa81fd01,0xfa81fa81,0xf801fa81,0xfa81fa81,0xfa81f801,0xfa81fd01,0xf801f801, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xb5adb5ad,0x9d299d29,0xa529adad,0xa56ba56b,0xadadbdef,0x94e794e7,0xa56ba529,0x8ca594e7,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf801c801,0xf801fa81,0xf801c801,0xfa81f801,0xfd01fd01,0xf801fa81,0xf801fa81,0xc801f801,0xf801c801,0xf801fa81,0xf801c801,0xfa81f801,0xfd01fd01,0xf801fa81,0xf801fa81,0xc801f801,0xf801c801,0xf801fa81,0xf801c801,0xfa81f801,0xfd01fd01,0xf801fa81,0xf801fa81,0xc801f801, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x94e78ca5,0xa529adad,0x94e78ca5,0xb5adadad,0x94e79d29,0xadada56b,0x94e78ca5,0xadadadad,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf801c801,0xf801fa81,0xf801f801,0xc801c801,0xfa81fd01,0xf801f801,0xf801f801,0xc801c801,0xf801c801,0xf801fa81,0xf801f801,0xc801c801,0xfa81fd01,0xf801f801,0xf801f801,0xc801c801,0xf801c801,0xf801fa81,0xf801f801,0xc801c801,0xfa81fd01,0xf801f801,0xf801f801,0xc801c801, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf39cf,0x7bdf9ce7,0x7bdf39cf,0x7bdf39cf,0x7bdf9ce7,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0xfd01c801,0xfa81fd01,0xc801f801,0xc801c801,0xf801f801,0xf801fa81,0xc801f801,0xc801c801,0xfd01c801,0xfa81fd01,0xc801f801,0xc801c801,0xf801f801,0xf801fa81,0xc801f801,0xc801c801, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x39cf7bdf,0x39cf39cf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf39cf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x39cf9ce7,0x39cf39cf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf39cf,0x7bdf39cf,0x7bdf7bdf,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xffc1fa81,0xfa81ffc1,0xf801f801,0xf801c801,0xfa81f801,0xfa81ffc1,0xf801f801,0xc801c801,0xffc1fa81,0xfa81ffc1,0xf801f801,0xf801c801,0xfa81f801,0xfa81ffc1,0xf801f801,0xc801c801, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x39cf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce77bdf,0x7bdf39cf,0x39cf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce79ce7,0x7bdf39cf,0x39cf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x39cf7bdf,0x9ce77bdf,0x9ce79ce7,0x7bdf39cf,0x39cf39cf,0x7bdf9ce7,0x39cf9ce7,0x7bdf7bdf,0x39cf7bdf,0x9ce77bdf,0x9ce79ce7,0x7bdf39cf,0x39cf39cf,0x7bdf9ce7,0x39cf9ce7,0x7bdf7bdf,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfd01fa81,0xfa81ffc1,0xf801c801,0xfa81f801,0xfa81f801,0xfd01ffc1,0xf801c801,0xf801f801,0xfd01fa81,0xfa81ffc1,0xf801c801,0xfa81f801,0xfa81f801,0xfd01ffc1,0xf801c801,0xf801f801, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf9ce7,0x9ce79ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf9ce7,0x9ce79ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf39cf,0x7bdf7bdf,0x39cf9ce7,0x9ce79ce7,0x7bdf7bdf,0x39cf7bdf,0x7bdf7bdf, +0x9ce77bdf,0x39cf39cf,0x7bdf7bdf,0x39cf9ce7,0x9ce79ce7,0x7bdf7bdf,0x39cf7bdf,0x7bdf7bdf,0x9ce77bdf,0x39cf39cf,0x7bdf7bdf,0x39cf9ce7,0x9ce79ce7,0x7bdf7bdf,0x39cf7bdf,0x7bdf7bdf,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf801f801,0xf801fa81,0xfa81fa81,0xffc1fd01,0xfa81fa81,0xfa81fa81,0xfa81fa81,0xf801f801,0xf801f801,0xf801fa81,0xfa81fa81,0xffc1fd01,0xfa81fa81,0xfa81fa81,0xfa81fa81,0xf801f801, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce739cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce739cf,0x39cf7bdf,0x7bdf7bdf,0x39cf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce739cf,0x39cf7bdf,0x7bdf7bdf,0x39cf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x9ce739cf,0x39cf7bdf,0x7bdf7bdf,0x39cf7bdf,0x7bdf39cf,0x7bdf7bdf,0x9ce79ce7,0x7bdf39cf,0x9ce739cf,0x39cf7bdf,0x7bdf39cf,0x39cf7bdf,0x7bdf39cf, +0x39cf7bdf,0x9ce79ce7,0x7bdf39cf,0x9ce739cf,0x39cf7bdf,0x7bdf39cf,0x39cf7bdf,0x7bdf39cf,0x39cf39cf,0x9ce79ce7,0x7bdf39cf,0x9ce739cf,0x39cf7bdf,0x7bdf39cf,0x39cf7bdf,0x7bdf39cf,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc801f801,0xfa81f801,0xfa81ffc1,0xfa81fa81,0xffc1fd01,0xffc1fa81,0xfd01ffc1,0xf801fa81,0xc801f801,0xfa81f801,0xfa81ffc1,0xfa81fa81,0xffc1fd01,0xffc1fa81,0xfd01ffc1,0xf801fa81, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x39cf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x39cf7bdf,0x7bdf7bdf,0x9ce739cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf39cf,0x39cf7bdf,0x7bdf7bdf,0x9ce739cf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf39cf,0x39cf7bdf,0x7bdf7bdf,0x9ce739cf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf39cf,0x39cf7bdf,0x7bdf9ce7,0x9ce739cf,0x39cf9ce7, +0x9ce77bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf39cf,0x39cf7bdf,0x7bdf9ce7,0x9ce739cf,0x39cf9ce7,0x9ce79ce7,0x7bdf7bdf,0x7bdf39cf,0x7bdf39cf,0x39cf7bdf,0x7bdf9ce7,0x9ce739cf,0x39cf9ce7,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf801f801,0xffc1fd01,0xfa81fa81,0xf801c801,0xf801f801,0xfd01c801,0xfa81fd01,0xf801fa81,0xf801f801,0xffc1fd01,0xfa81fa81,0xf801c801,0xf801f801,0xfd01c801,0xfa81fd01,0xf801fa81, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x39cf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x7bdf39cf,0x9ce77bdf,0x39cf39cf,0x7bdf9ce7,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf7bdf,0x39cf39cf,0x7bdf39cf,0x9ce77bdf,0x39cf39cf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf39cf,0x7bdf39cf,0x9ce77bdf,0x39cf39cf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf39cf,0x7bdf39cf,0x9ce77bdf,0x39cf39cf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf39cf,0x7bdf39cf,0x9ce77bdf,0x39cf39cf,0x7bdf9ce7,0x9ce77bdf, +0x7bdf7bdf,0x7bdf7bdf,0x39cf39cf,0x7bdf39cf,0x9ce77bdf,0x39cf39cf,0x7bdf9ce7,0x9ce77bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf39cf,0x7bdf39cf,0x9ce77bdf,0x39cf39cf,0x7bdf9ce7,0x9ce77bdf,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf801c801,0xf801fa81,0xf801f801,0xc801c801,0xf801f801,0xfa81f801,0xf801f801,0xf801fd01,0xf801c801,0xf801fa81,0xf801f801,0xc801c801,0xf801f801,0xfa81f801,0xf801f801,0xf801fd01, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf9ce7,0x39cf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf9ce7,0x39cf7bdf,0x9ce79ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce77bdf,0x39cf9ce7,0x39cf7bdf,0x9ce79ce7,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x39cf7bdf,0x9ce79ce7,0x39cf9ce7,0x39cf7bdf,0x9ce79ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x9ce79ce7,0x39cf9ce7,0x39cf7bdf,0x9ce79ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x9ce79ce7,0x39cf9ce7,0x39cf7bdf,0x39cf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x9ce79ce7,0x39cf9ce7,0x39cf7bdf,0x39cf9ce7,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x39cf7bdf,0x9ce79ce7,0x39cf9ce7,0x39cf7bdf,0x39cf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x39cf39cf,0x39cf7bdf,0x9ce79ce7,0x39cf9ce7,0x39cf7bdf,0x39cf9ce7,0x7bdf7bdf,0x7bdf7bdf,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc801c801,0xfa81f801,0xfa81fd01,0xc801c801,0xfa81fa81,0xc801f801,0xfd01f801,0xfd01ffc1,0xc801c801,0xfa81f801,0xfa81fd01,0xc801c801,0xfa81fa81,0xc801f801,0xfd01f801,0xfd01ffc1, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce77bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce77bdf,0x9ce739cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce77bdf,0x9ce739cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce77bdf,0x9ce739cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x9ce77bdf,0x7bdf7bdf,0x9ce77bdf,0x9ce739cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce739cf,0x7bdf7bdf,0x9ce77bdf,0x9ce739cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce739cf,0x7bdf7bdf,0x9ce77bdf,0x9ce739cf,0x9ce77bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce739cf,0x39cf7bdf,0x9ce77bdf,0x9ce739cf,0x39cf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x9ce739cf,0x39cf7bdf,0x9ce77bdf,0x9ce739cf,0x39cf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce79ce7,0x9ce739cf,0x39cf7bdf,0x9ce77bdf,0x9ce739cf,0x39cf7bdf,0x7bdf7bdf,0x39cf7bdf,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc801c801,0xfd01fa81,0xfd01ffc1,0xf801f801,0xffc1fd01,0xc801fa81,0xfa81f801,0xfa81fa81,0xc801c801,0xfd01fa81,0xfd01ffc1,0xf801f801,0xffc1fd01,0xc801fa81,0xfa81f801,0xfa81fa81, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf39cf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x9ce739cf,0x7bdf7bdf,0x7bdf39cf,0x9ce77bdf,0x7bdf39cf,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf39cf,0x9ce739cf,0x7bdf7bdf,0x7bdf39cf,0x9ce77bdf,0x7bdf39cf,0x7bdf39cf,0x7bdf7bdf,0x7bdf39cf,0x9ce739cf,0x7bdf7bdf,0x7bdf39cf,0x9ce77bdf,0x7bdf39cf,0x9ce739cf,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf801f801,0xfa81f801,0xfa81fa81,0xf801f801,0xffc1fa81,0xc801fa81,0xf801c801,0xf801fa81,0xf801f801,0xfa81f801,0xfa81fa81,0xf801f801,0xffc1fa81,0xc801fa81,0xf801c801,0xf801fa81, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf9ce7,0x39cf9ce7,0x7bdf7bdf,0x39cf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf9ce7,0x39cf9ce7,0x7bdf7bdf,0x39cf39cf,0x7bdf7bdf,0x7bdf9ce7,0x7bdf7bdf, +0x7bdf39cf,0x7bdf9ce7,0x39cf9ce7,0x7bdf7bdf,0x39cf39cf,0x7bdf7bdf,0x39cf9ce7,0x7bdf9ce7,0x7bdf39cf,0x7bdf9ce7,0x39cf9ce7,0x7bdf7bdf,0x39cf39cf,0x7bdf7bdf,0x39cf9ce7,0x7bdf9ce7,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfa81f801,0xf801fa81,0xf801f801,0xf801c801,0xfa81fa81,0xf801fa81,0xfd01f801,0xf801fa81,0xfa81f801,0xf801fa81,0xf801f801,0xf801c801,0xfa81fa81,0xf801fa81,0xfd01f801,0xf801fa81, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf39cf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x39cf39cf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x39cf39cf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x39cf39cf,0x9ce79ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x39cf39cf,0x9ce79ce7,0x39cf39cf,0x7bdf7bdf,0x7bdf7bdf, +0x39cf9ce7,0x7bdf7bdf,0x39cf7bdf,0x39cf39cf,0x9ce79ce7,0x39cf39cf,0x39cf7bdf,0x7bdf7bdf,0x39cf9ce7,0x7bdf7bdf,0x39cf7bdf,0x39cf39cf,0x9ce79ce7,0x39cf39cf,0x39cf7bdf,0x7bdf7bdf,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfd01f801,0xfa81ffc1,0xfd01fa81,0xf801fa81,0xf801f801,0xfa81f801,0xffc1fd01,0xf801fd01,0xfd01f801,0xfa81ffc1,0xfd01fa81,0xf801fa81,0xf801f801,0xfa81f801,0xffc1fd01,0xf801fd01, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce77bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce79ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf7bdf,0x9ce77bdf,0x9ce79ce7,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce739cf,0x9ce79ce7,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce739cf,0x9ce79ce7,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x7bdf7bdf,0x9ce739cf,0x9ce79ce7,0x7bdf39cf,0x9ce79ce7,0x7bdf7bdf,0x7bdf7bdf, +0x39cf7bdf,0x7bdf7bdf,0x9ce739cf,0x9ce79ce7,0x7bdf39cf,0x9ce79ce7,0x9ce77bdf,0x7bdf7bdf,0x39cf7bdf,0x7bdf7bdf,0x9ce739cf,0x9ce79ce7,0x7bdf39cf,0x9ce79ce7,0x9ce77bdf,0x39cf39cf,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xffc1f801,0xfa81ffc1,0xffc1ffc1,0xf801fd01,0xf801c801,0xfa81f801,0xffc1ffc1,0xf801fa81,0xffc1f801,0xfa81ffc1,0xffc1ffc1,0xf801fd01,0xf801c801,0xfa81f801,0xffc1ffc1,0xf801fa81, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf9ce7,0x7bdf7bdf,0x39cf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x7bdf9ce7,0x7bdf7bdf,0x39cf9ce7,0x39cf39cf,0x7bdf7bdf,0x7bdf7bdf,0x9ce77bdf,0x39cf39cf,0x7bdf9ce7,0x7bdf7bdf,0x39cf9ce7,0x39cf39cf,0x7bdf7bdf,0x7bdf7bdf, +0x9ce77bdf,0x39cf39cf,0x7bdf9ce7,0x7bdf7bdf,0x39cf9ce7,0x39cf39cf,0x7bdf7bdf,0x7bdf7bdf,0x9ce77bdf,0x39cf39cf,0x7bdf9ce7,0x7bdf7bdf,0x39cf9ce7,0x39cf39cf,0x7bdf7bdf,0x9ce79ce7,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfa81f801,0xfa81fd01,0xfa81fa81,0xf801fa81,0xfa81fa81,0xfa81f801,0xfa81fd01,0xf801f801,0xfa81f801,0xfa81fd01,0xfa81fa81,0xf801fa81,0xfa81fa81,0xfa81f801,0xfa81fd01,0xf801f801, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce77bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce77bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce77bdf,0x9ce79ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce79ce7,0x7bdf39cf,0x7bdf7bdf,0x9ce739cf,0x9ce79ce7,0x7bdf39cf,0x7bdf7bdf, +0x7bdf7bdf,0x9ce739cf,0x39cf39cf,0x7bdf7bdf,0x9ce739cf,0x9ce79ce7,0x39cf39cf,0x7bdf7bdf,0x7bdf7bdf,0x9ce739cf,0x39cf39cf,0x7bdf7bdf,0x9ce739cf,0x9ce79ce7,0x39cf39cf,0x7bdf7bdf,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf801c801,0xf801fa81,0xf801c801,0xfa81f801,0xfd01fd01,0xf801fa81,0xf801fa81,0xc801f801,0xf801c801,0xf801fa81,0xf801c801,0xfa81f801,0xfd01fd01,0xf801fa81,0xf801fa81,0xc801f801, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf9ce7,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf9ce7,0x9ce79ce7,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x9ce79ce7,0x7bdf39cf,0x7bdf7bdf,0x7bdf39cf,0x9ce79ce7,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x9ce79ce7,0x7bdf39cf,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf801c801,0xf801fa81,0xf801f801,0xc801c801,0xfa81fd01,0xf801f801,0xf801f801,0xc801c801,0xf801c801,0xf801fa81,0xf801f801,0xc801c801,0xfa81fd01,0xf801f801,0xf801f801,0xc801c801, +0 }; diff --git a/minecraftcpp-master/handheld/data/images/terrain_565.h b/minecraftcpp-master/handheld/data/images/terrain_565.h new file mode 100644 index 0000000..609d7f4 --- /dev/null +++ b/minecraftcpp-master/handheld/data/images/terrain_565.h @@ -0,0 +1,1052 @@ +/********************************************************** + * PVRTexture Tool v 3.23 + * PVRTC Library v 1.142. 0. 0 Beta + **********************************************************/ + +#ifndef A32BIT + #define A32BIT static const unsigned long +#endif + +A32BIT terrain_565[] = { + +/* Header */ +0x00000034, /* dwHeaderSize */ +0x00000100, /* dwHeight */ +0x00000100, /* dwWidth */ +0x00000000, /* dwMipMapCount */ +0x00010013, /* dwpfFlags */ +0x00020000, /* dwDataSize */ +0x00000010, /* dwBitCount */ +0x0000f800, /* dwRBitMask */ +0x000007e0, /* dwGBitMask */ +0x0000001f, /* dwBBitMask */ +0x00000000, /* dwAlphaBitMask */ +0x21525650, /* dwPVR */ +0x00000001, /* dwNumSurfs */ + +/* Data */ +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x7bef9cd3,0x7bef7bef, +0x7bef7bef,0x7bef9cd3,0x9cd39cd3,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x9cd39cd3,0x7bef39e7,0x7bef7bef,0x7bef39e7,0x9cd39cd3,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x9cd39cd3,0x7bef39e7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xfaa0fd00,0xf800f800,0xf800f800,0xc800c800,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xfaa0fd00,0xf800f800,0xf800f800,0xc800c800, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd39cd3,0x7bef39e7,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x7bef39e7,0x7bef7bef, +0x7bef7bef,0x9cd339e7,0x39e739e7,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x39e739e7,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x39e739e7,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x39e739e7,0x7bef7bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800c800,0xf800faa0,0xf800c800,0xfaa0f800,0xfd00fd00,0xf800faa0,0xf800faa0,0xc800f800,0xf800c800,0xf800faa0,0xf800c800,0xfaa0f800,0xfd00fd00,0xf800faa0,0xf800faa0,0xc800f800, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x39e79cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef9cd3,0x7bef7bef,0x39e79cd3,0x39e739e7,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x39e79cd3,0x39e739e7,0x7bef7bef,0x7bef7bef, +0x9cd37bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x39e79cd3,0x39e739e7,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x39e79cd3,0x39e739e7,0x7bef7bef,0x9cd39cd3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfaa0f800,0xfaa0fd00,0xfaa0faa0,0xf800faa0,0xfaa0faa0,0xfaa0f800,0xfaa0fd00,0xf800f800,0xfaa0f800,0xfaa0fd00,0xfaa0faa0,0xf800faa0,0xfaa0faa0,0xfaa0f800,0xfaa0fd00,0xf800f800, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x9cd37bef,0x9cd39cd3,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x7bef39e7,0x9cd39cd3,0x7bef7bef,0x7bef7bef, +0x39e77bef,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x7bef39e7,0x9cd39cd3,0x9cd37bef,0x7bef7bef,0x39e77bef,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x7bef39e7,0x9cd39cd3,0x9cd37bef,0x39e739e7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xffe0f800,0xfaa0ffe0,0xffe0ffe0,0xf800fd00,0xf800c800,0xfaa0f800,0xffe0ffe0,0xf800faa0,0xffe0f800,0xfaa0ffe0,0xffe0ffe0,0xf800fd00,0xf800c800,0xfaa0f800,0xffe0ffe0,0xf800faa0, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x39e77bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x39e739e7,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x39e739e7,0x9cd39cd3,0x39e739e7,0x7bef7bef,0x7bef7bef, +0x39e79cd3,0x7bef7bef,0x39e77bef,0x39e739e7,0x9cd39cd3,0x39e739e7,0x39e77bef,0x7bef7bef,0x39e79cd3,0x7bef7bef,0x39e77bef,0x39e739e7,0x9cd39cd3,0x39e739e7,0x39e77bef,0x7bef7bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfd00f800,0xfaa0ffe0,0xfd00faa0,0xf800faa0,0xf800f800,0xfaa0f800,0xffe0fd00,0xf800fd00,0xfd00f800,0xfaa0ffe0,0xfd00faa0,0xf800faa0,0xf800f800,0xfaa0f800,0xffe0fd00,0xf800fd00, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x39e79cd3,0x7bef7bef,0x39e739e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x39e79cd3,0x7bef7bef,0x39e739e7,0x7bef7bef,0x7bef9cd3,0x7bef7bef, +0x7bef39e7,0x7bef9cd3,0x39e79cd3,0x7bef7bef,0x39e739e7,0x7bef7bef,0x39e79cd3,0x7bef9cd3,0x7bef39e7,0x7bef9cd3,0x39e79cd3,0x7bef7bef,0x39e739e7,0x7bef7bef,0x39e79cd3,0x7bef9cd3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfaa0f800,0xf800faa0,0xf800f800,0xf800c800,0xfaa0faa0,0xf800faa0,0xfd00f800,0xf800faa0,0xfaa0f800,0xf800faa0,0xf800f800,0xf800c800,0xfaa0faa0,0xf800faa0,0xfd00f800,0xf800faa0, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x9cd339e7,0x7bef7bef,0x7bef39e7,0x9cd37bef,0x7bef39e7,0x7bef7bef, +0x7bef7bef,0x7bef39e7,0x9cd339e7,0x7bef7bef,0x7bef39e7,0x9cd37bef,0x7bef39e7,0x7bef39e7,0x7bef7bef,0x7bef39e7,0x9cd339e7,0x7bef7bef,0x7bef39e7,0x9cd37bef,0x7bef39e7,0x9cd339e7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0xfaa0f800,0xfaa0faa0,0xf800f800,0xffe0faa0,0xc800faa0,0xf800c800,0xf800faa0,0xf800f800,0xfaa0f800,0xfaa0faa0,0xf800f800,0xffe0faa0,0xc800faa0,0xf800c800,0xf800faa0, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x9cd339e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x9cd339e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x9cd339e7,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x9cd37bef,0x7bef7bef,0x9cd37bef,0x9cd339e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x7bef7bef,0x9cd37bef,0x9cd339e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x7bef7bef,0x9cd37bef,0x9cd339e7,0x9cd37bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x39e77bef,0x9cd37bef,0x9cd339e7,0x39e77bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x9cd339e7,0x39e77bef,0x9cd37bef,0x9cd339e7,0x39e77bef,0x7bef7bef,0x7bef7bef,0x9cd39cd3,0x9cd339e7,0x39e77bef,0x9cd37bef,0x9cd339e7,0x39e77bef,0x7bef7bef,0x39e77bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc800c800,0xfd00faa0,0xfd00ffe0,0xf800f800,0xffe0fd00,0xc800faa0,0xfaa0f800,0xfaa0faa0,0xc800c800,0xfd00faa0,0xfd00ffe0,0xf800f800,0xffe0fd00,0xc800faa0,0xfaa0f800,0xfaa0faa0, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e79cd3,0x39e77bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e79cd3,0x39e77bef,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x39e79cd3,0x39e77bef,0x9cd39cd3,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x39e77bef,0x9cd39cd3,0x39e79cd3,0x39e77bef,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x9cd39cd3,0x39e79cd3,0x39e77bef,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x9cd39cd3,0x39e79cd3,0x39e77bef,0x39e79cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x9cd39cd3,0x39e79cd3,0x39e77bef,0x39e79cd3,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x39e77bef,0x9cd39cd3,0x39e79cd3,0x39e77bef,0x39e79cd3,0x7bef7bef,0x7bef7bef,0x39e739e7,0x39e77bef,0x9cd39cd3,0x39e79cd3,0x39e77bef,0x39e79cd3,0x7bef7bef,0x7bef7bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc800c800,0xfaa0f800,0xfaa0fd00,0xc800c800,0xfaa0faa0,0xc800f800,0xfd00f800,0xfd00ffe0,0xc800c800,0xfaa0f800,0xfaa0fd00,0xc800c800,0xfaa0faa0,0xc800f800,0xfd00f800,0xfd00ffe0, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x39e739e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef39e7,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef39e7,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef39e7,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef39e7,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef39e7,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x9cd37bef, +0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef39e7,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x9cd37bef,0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef39e7,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x9cd37bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xf800f800,0xfaa0f800,0xf800f800,0xf800fd00,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xf800f800,0xfaa0f800,0xf800f800,0xf800fd00, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x39e77bef,0x7bef7bef,0x7bef39e7,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x39e77bef,0x7bef7bef,0x9cd339e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x39e77bef,0x7bef7bef,0x9cd339e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x39e77bef,0x7bef7bef,0x9cd339e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x39e77bef,0x7bef9cd3,0x9cd339e7,0x39e79cd3, +0x9cd37bef,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x39e77bef,0x7bef9cd3,0x9cd339e7,0x39e79cd3,0x9cd39cd3,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x39e77bef,0x7bef9cd3,0x9cd339e7,0x39e79cd3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0xffe0fd00,0xfaa0faa0,0xf800c800,0xf800f800,0xfd00c800,0xfaa0fd00,0xf800faa0,0xf800f800,0xffe0fd00,0xfaa0faa0,0xf800c800,0xf800f800,0xfd00c800,0xfaa0fd00,0xf800faa0, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x39e77bef,0x7bef7bef,0x39e77bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x39e77bef,0x7bef7bef,0x39e77bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x9cd339e7,0x39e77bef,0x7bef7bef,0x39e77bef,0x7bef39e7,0x7bef7bef,0x9cd39cd3,0x7bef39e7,0x9cd339e7,0x39e77bef,0x7bef39e7,0x39e77bef,0x7bef39e7, +0x39e77bef,0x9cd39cd3,0x7bef39e7,0x9cd339e7,0x39e77bef,0x7bef39e7,0x39e77bef,0x7bef39e7,0x39e739e7,0x9cd39cd3,0x7bef39e7,0x9cd339e7,0x39e77bef,0x7bef39e7,0x39e77bef,0x7bef39e7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc800f800,0xfaa0f800,0xfaa0ffe0,0xfaa0faa0,0xffe0fd00,0xffe0faa0,0xfd00ffe0,0xf800faa0,0xc800f800,0xfaa0f800,0xfaa0ffe0,0xfaa0faa0,0xffe0fd00,0xffe0faa0,0xfd00ffe0,0xf800faa0, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e79cd3,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e79cd3,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef7bef,0x39e79cd3,0x9cd39cd3,0x7bef7bef,0x39e77bef,0x7bef7bef, +0x9cd37bef,0x39e739e7,0x7bef7bef,0x39e79cd3,0x9cd39cd3,0x7bef7bef,0x39e77bef,0x7bef7bef,0x9cd37bef,0x39e739e7,0x7bef7bef,0x39e79cd3,0x9cd39cd3,0x7bef7bef,0x39e77bef,0x7bef7bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0xf800faa0,0xfaa0faa0,0xffe0fd00,0xfaa0faa0,0xfaa0faa0,0xfaa0faa0,0xf800f800,0xf800f800,0xf800faa0,0xfaa0faa0,0xffe0fd00,0xfaa0faa0,0xfaa0faa0,0xfaa0faa0,0xf800f800, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x39e739e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x7bef39e7,0x39e739e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd39cd3,0x7bef39e7,0x39e739e7,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x39e77bef,0x9cd37bef,0x9cd39cd3,0x7bef39e7,0x39e739e7,0x7bef9cd3,0x39e79cd3,0x7bef7bef,0x39e77bef,0x9cd37bef,0x9cd39cd3,0x7bef39e7,0x39e739e7,0x7bef9cd3,0x39e79cd3,0x7bef7bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfd00faa0,0xfaa0ffe0,0xf800c800,0xfaa0f800,0xfaa0f800,0xfd00ffe0,0xf800c800,0xf800f800,0xfd00faa0,0xfaa0ffe0,0xf800c800,0xfaa0f800,0xfaa0f800,0xfd00ffe0,0xf800c800,0xf800f800, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x39e77bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x39e79cd3,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x7bef7bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xffe0faa0,0xfaa0ffe0,0xf800f800,0xf800c800,0xfaa0f800,0xfaa0ffe0,0xf800f800,0xc800c800,0xffe0faa0,0xfaa0ffe0,0xf800f800,0xf800c800,0xfaa0f800,0xfaa0ffe0,0xf800f800,0xc800c800, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef39e7,0x7bef9cd3,0x7bef39e7,0x7bef39e7,0x7bef9cd3,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0xfd00c800,0xfaa0fd00,0xc800f800,0xc800c800,0xf800f800,0xf800faa0,0xc800f800,0xc800c800,0xfd00c800,0xfaa0fd00,0xc800f800,0xc800c800,0xf800f800,0xf800faa0,0xc800f800,0xc800c800, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x94d38c92,0xa534ad96,0x94f38cb2,0xb5b6adb6,0x94f39d14,0xad96a555,0x94d38cb2,0xadb6ad96,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xfaa0fd00,0xf800f800,0xf800f800,0xc800c800,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xfaa0fd00,0xf800f800,0xf800f800,0xc800c800,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xfaa0fd00,0xf800f800,0xf800f800,0xc800c800, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xb5b6b5b6,0x9d149d34,0xa534adb6,0xa575a555,0xad96bdf7,0x94f394f3,0xa575a534,0x8cb294f3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800c800,0xf800faa0,0xf800c800,0xfaa0f800,0xfd00fd00,0xf800faa0,0xf800faa0,0xc800f800,0xf800c800,0xf800faa0,0xf800c800,0xfaa0f800,0xfd00fd00,0xf800faa0,0xf800faa0,0xc800f800,0xf800c800,0xf800faa0,0xf800c800,0xfaa0f800,0xfd00fd00,0xf800faa0,0xf800faa0,0xc800f800, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa555a575,0xbdf7b5b6,0xa575ad96,0x9d14a534,0x9d148451,0xadb6a575,0x9d149d14,0xb5d7adb6,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfaa0f800,0xfaa0fd00,0xfaa0faa0,0xf800faa0,0xfaa0faa0,0xfaa0f800,0xfaa0fd00,0xf800f800,0xfaa0f800,0xfaa0fd00,0xfaa0faa0,0xf800faa0,0xfaa0faa0,0xfaa0f800,0xfaa0fd00,0xf800f800,0xfaa0f800,0xfaa0fd00,0xfaa0faa0,0xf800faa0,0xfaa0faa0,0xfaa0f800,0xfaa0fd00,0xf800f800, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x94f394f3,0x84718451,0xb5b6ad96,0x84518cb2,0xad759d34,0xa575a534,0xbdf7bdf7,0x8492a555,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xffe0f800,0xfaa0ffe0,0xffe0ffe0,0xf800fd00,0xf800c800,0xfaa0f800,0xffe0ffe0,0xf800faa0,0xffe0f800,0xfaa0ffe0,0xffe0ffe0,0xf800fd00,0xf800c800,0xfaa0f800,0xffe0ffe0,0xf800faa0,0xffe0f800,0xfaa0ffe0,0xffe0ffe0,0xf800fd00,0xf800c800,0xfaa0f800,0xffe0ffe0,0xf800faa0, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x94d38cb2,0xa555a555,0x94f394f3,0xa575ad75,0x94d38cb2,0xa55594f3,0x84718471,0xa5559514,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfd00f800,0xfaa0ffe0,0xfd00faa0,0xf800faa0,0xf800f800,0xfaa0f800,0xffe0fd00,0xf800fd00,0xfd00f800,0xfaa0ffe0,0xfd00faa0,0xf800faa0,0xf800f800,0xfaa0f800,0xffe0fd00,0xf800fd00,0xfd00f800,0xfaa0ffe0,0xfd00faa0,0xf800faa0,0xf800f800,0xfaa0f800,0xffe0fd00,0xf800fd00, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xadb6ad96,0xa575a575,0xadb6b5f7,0xa555a575,0xad96adb6,0xa5349d14,0x9d34a555,0x9d348cb2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfaa0f800,0xf800faa0,0xf800f800,0xf800c800,0xfaa0faa0,0xf800faa0,0xfd00f800,0xf800faa0,0xfaa0f800,0xf800faa0,0xf800f800,0xf800c800,0xfaa0faa0,0xf800faa0,0xfd00f800,0xf800faa0,0xfaa0f800,0xf800faa0,0xf800f800,0xf800c800,0xfaa0faa0,0xf800faa0,0xfd00f800,0xf800faa0, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x9d1494f3,0xad969514,0x84718451,0xa5559d14,0xa55594d3,0xbdf7bdf7,0xa5759d14,0xb5d7bdf7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0xfaa0f800,0xfaa0faa0,0xf800f800,0xffe0faa0,0xc800faa0,0xf800c800,0xf800faa0,0xf800f800,0xfaa0f800,0xfaa0faa0,0xf800f800,0xffe0faa0,0xc800faa0,0xf800c800,0xf800faa0,0xf800f800,0xfaa0f800,0xfaa0faa0,0xf800f800,0xffe0faa0,0xc800faa0,0xf800c800,0xf800faa0, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa575a575,0x94f38c92,0xa555ad96,0x94f394d3,0x9d1494f3,0x849294f3,0x9d149d34,0x8cb28cb2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc800c800,0xfd00faa0,0xfd00ffe0,0xf800f800,0xffe0fd00,0xc800faa0,0xfaa0f800,0xfaa0faa0,0xc800c800,0xfd00faa0,0xfd00ffe0,0xf800f800,0xffe0fd00,0xc800faa0,0xfaa0f800,0xfaa0faa0,0xc800c800,0xfd00faa0,0xfd00ffe0,0xf800f800,0xffe0fd00,0xc800faa0,0xfaa0f800,0xfaa0faa0, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x94f394f3,0xbdf7b5d7,0xa555a575,0xad96adb6,0x94f38cb2,0xadb6a575,0xa555a555,0xad96adb6,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc800c800,0xfaa0f800,0xfaa0fd00,0xc800c800,0xfaa0faa0,0xc800f800,0xfd00f800,0xfd00ffe0,0xc800c800,0xfaa0f800,0xfaa0fd00,0xc800c800,0xfaa0faa0,0xc800f800,0xfd00f800,0xfd00ffe0,0xc800c800,0xfaa0f800,0xfaa0fd00,0xc800c800,0xfaa0faa0,0xc800f800,0xfd00f800,0xfd00ffe0, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xb5f7b5d7,0xa575ad96,0x9d349d34,0xa5349d14,0xb5f7ad96,0x9d14a555,0xbdf7bdf7,0xa534a575,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xf800f800,0xfaa0f800,0xf800f800,0xf800fd00,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xf800f800,0xfaa0f800,0xf800f800,0xf800fd00,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xf800f800,0xfaa0f800,0xf800f800,0xf800fd00, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x84718c92,0xadb694d3,0x845194d3,0x94f394d3,0x845194d3,0x9d1494f3,0x94f38492,0x95148cb2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0xffe0fd00,0xfaa0faa0,0xf800c800,0xf800f800,0xfd00c800,0xfaa0fd00,0xf800faa0,0xf800f800,0xffe0fd00,0xfaa0faa0,0xf800c800,0xf800f800,0xfd00c800,0xfaa0fd00,0xf800faa0,0xf800f800,0xffe0fd00,0xfaa0faa0,0xf800c800,0xf800f800,0xfd00c800,0xfaa0fd00,0xf800faa0, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x9d14a555,0x9d3494d3,0xa575ad75,0x84518471,0xa53494f3,0x8cb294f3,0xad75ad75,0x84718cb2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc800f800,0xfaa0f800,0xfaa0ffe0,0xfaa0faa0,0xffe0fd00,0xffe0faa0,0xfd00ffe0,0xf800faa0,0xc800f800,0xfaa0f800,0xfaa0ffe0,0xfaa0faa0,0xffe0fd00,0xffe0faa0,0xfd00ffe0,0xf800faa0,0xc800f800,0xfaa0f800,0xfaa0ffe0,0xfaa0faa0,0xffe0fd00,0xffe0faa0,0xfd00ffe0,0xf800faa0, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x94f39d34,0xadb6a575,0x94f39d14,0xadb69d34,0x9d1494d3,0xadb6adb6,0x94f39d34,0xad96bdf7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0xf800faa0,0xfaa0faa0,0xffe0fd00,0xfaa0faa0,0xfaa0faa0,0xfaa0faa0,0xf800f800,0xf800f800,0xf800faa0,0xfaa0faa0,0xffe0fd00,0xfaa0faa0,0xfaa0faa0,0xfaa0faa0,0xf800f800,0xf800f800,0xf800faa0,0xfaa0faa0,0xffe0fd00,0xfaa0faa0,0xfaa0faa0,0xfaa0faa0,0xf800f800, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xadb6ad96,0x9d149d14,0xadb6b5b6,0x9d14a534,0xadb6a575,0xa575a575,0xb5d7b5b6,0xa555a575,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfd00faa0,0xfaa0ffe0,0xf800c800,0xfaa0f800,0xfaa0f800,0xfd00ffe0,0xf800c800,0xf800f800,0xfd00faa0,0xfaa0ffe0,0xf800c800,0xfaa0f800,0xfaa0f800,0xfd00ffe0,0xf800c800,0xf800f800,0xfd00faa0,0xfaa0ffe0,0xf800c800,0xfaa0f800,0xfaa0f800,0xfd00ffe0,0xf800c800,0xf800f800, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa5559d34,0xbdf7b5d7,0xa575ad96,0x9d149d14,0x8c928cb2,0x9d1494f3,0x8c927c51,0x9d1494f3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xffe0faa0,0xfaa0ffe0,0xf800f800,0xf800c800,0xfaa0f800,0xfaa0ffe0,0xf800f800,0xc800c800,0xffe0faa0,0xfaa0ffe0,0xf800f800,0xf800c800,0xfaa0f800,0xfaa0ffe0,0xf800f800,0xc800c800,0xffe0faa0,0xfaa0ffe0,0xf800f800,0xf800c800,0xfaa0f800,0xfaa0ffe0,0xf800f800,0xc800c800, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x94f394d3,0x8cb28cb2,0xad759d34,0x94f394d3,0xa575a555,0x8cb28471,0xa534a534,0x8c928cb2,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0xfd00c800,0xfaa0fd00,0xc800f800,0xc800c800,0xf800f800,0xf800faa0,0xc800f800,0xc800c800,0xfd00c800,0xfaa0fd00,0xc800f800,0xc800c800,0xf800f800,0xf800faa0,0xc800f800,0xc800c800,0xfd00c800,0xfaa0fd00,0xc800f800,0xc800c800,0xf800f800,0xf800faa0,0xc800f800,0xc800c800, +0xdeb4e6d5,0xc5cedeb3,0xe6d5de94,0xc5cede93,0xde94deb4,0xc5cede73,0xdeb4de93,0xe6f5deb4,0x23512330,0x2bb22bf4,0x23912350,0x2c142bf4,0x23712392,0x2bf42bd3,0x23512350,0x2bf42bf4,0xebc5eb84,0xec06ec48,0xebc6eba5,0xec48ec48,0xebc6ebe6,0xec48ec07,0xebc5eba5,0xec48ec28,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xe6d4e6d4,0xef16d673,0xdeb4c5ce,0xc5ced673,0xc5cece31,0xdeb4ce31,0xeef6c5ce,0xdeb4de93,0x2c142c14,0x239223b2,0x2bb22bf4,0x2bd32bd3,0x2bf42c35,0x23712371,0x2bd32bb2,0x23502391,0xec48ec48,0xebe6ec06,0xec06ec48,0xec28ec07,0xec28ec69,0xebc5ebc5,0xec27ec06,0xeba5ebc6,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x3b7f3b7f, +0xe6b4e6d4,0xc5ceef16,0xde94c5ce,0xc5cede93,0xce31d672,0xde94de93,0xc5cee6d4,0xde94eef6,0x2bd32bd3,0x2c352c14,0x2bd32bf4,0x23922bb2,0x2392230f,0x2bf42bd3,0x23922392,0x2c352bf4,0xec07ec27,0xec69ec48,0xec27ec48,0xebe6ec06,0xebe6e342,0xec48ec27,0xebe6ebe6,0xec69ec48,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1abf1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff, +0xce31deb4,0xe6d5c5ce,0xce31ce31,0xd672c5ce,0xc5ced652,0xdeb3ef16,0xded4d672,0xce31c5ce,0x23712391,0x2330230f,0x2c142bf4,0x230f2330,0x2bd323b2,0x2bd32bb2,0x2c352c35,0x23302bd3,0xebc6ebc6,0xe363e342,0xec48ec48,0xe342eba4,0xec28ec06,0xec27ec06,0xec69ec69,0xeb63ec07,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff22ff,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff22ff,0x22ff22ff,0x1abf1abf,0x1abf1abf, +0xef16c5ce,0xe6d4ef16,0xe6d4de93,0xc5cee6d4,0xef16d673,0xef16c5ce,0xc5cede94,0xdeb4deb4,0x23512350,0x2bb32bb3,0x23912371,0x2bd32bd3,0x23512350,0x2bd32371,0x230f230f,0x2bd32391,0xebc5eba4,0xec07ec07,0xebc6ebc6,0xec27ec28,0xebc5eba5,0xec07ebc5,0xe363e363,0xec07ebc6,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xc5ced652,0xd673d672,0xe6d4deb4,0xde94c5ce,0xd673deb4,0xef16c5ce,0xce31deb4,0xdeb3e6d4,0x2c142bf4,0x2bd32bd3,0x2bf42c35,0x2bd32bd3,0x2bf42c14,0x2bb22392,0x23b22bd3,0x23b22350,0xec48ec48,0xec27ec27,0xec48ec69,0xec07ec27,0xec28ec48,0xec06ebe6,0xec06ec07,0xec06eba4,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x3b7f22ff,0x1abf3b7f,0x3b7f1abf,0x1abf22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x3b7f22ff,0x1abf3b7f,0x3b7f1abf,0x1abf22ff,0x1abf1abf, +0xdeb3d673,0xd652ce31,0xdeb4de94,0xd652c5cf,0xd672e6d4,0xc5cece32,0xce31c5ee,0xd673e6d4,0x23922371,0x2bf42391,0x2330230f,0x2bb32392,0x2bd32351,0x2c352c35,0x2bd32392,0x2c352c35,0xebe6ebc5,0xec28ebc6,0xe363e342,0xec07ebe6,0xec07ebc5,0xec69ec69,0xec27ebe6,0xec69ec69,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x536e536e,0x00000000,0x536e0000,0x0000536e,0x00000000,0x536e536e,0x00000000,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f22ff,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f22ff,0x22ff3b7f,0x22ff22ff, +0xd652d672,0xde94c5ce,0xe6d4e6d4,0xd673ce31,0xc5cede94,0xde93c5ce,0xc5ceef36,0xd672de94,0x2bd32bd3,0x23712330,0x2bd32bf4,0x23912351,0x23922371,0x23302371,0x239223b2,0x23302350,0xec27ec27,0xebc5eba4,0xec07ec48,0xebc6ebc5,0xebe6ebc5,0xeb63ebc5,0xebe6ec06,0xeba4eba4,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x7cb30000,0xbe59d6fb,0x0000536e,0xd6fb7cb3,0x536ebe59,0x7cb30000,0xbe59d6fb,0x0000536e,0x22ff22ff,0x22ff3b7f,0x22ff22ff,0x22ff22ff,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff3b7f,0x22ff22ff,0x22ff22ff,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xc5cee6f4,0xd651eef6,0xc5cec5ce,0xd652d652,0xe6d4c5ce,0xdeb4deb4,0xe6f5deb4,0xe6f5c5ce,0x23712371,0x2c352c35,0x2bd32bd3,0x2bf42bf4,0x23712350,0x2bf42bd3,0x2bd32bd3,0x2bf42c14,0xebc6ebc6,0xec69ec69,0xec07ec27,0xec48ec48,0xebc5eba5,0xec48ec28,0xec07ec07,0xec48ec48,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x7cb30000,0xd6fbffff,0x0000536e,0xffff7cb3,0x536ed6fb,0x7cb30000,0xd6fbffff,0x0000536e,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x22ff1abf,0x3b7f22ff,0x22ff3b7f,0x1abf22ff,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x22ff1abf,0x3b7f22ff,0x22ff3b7f,0x1abf22ff, +0xdeb3c5ce,0xeef6de93,0xd651d673,0xe6d5c5ce,0xde93c5ce,0xd652e6d4,0xce31ce31,0xc5ceeef6,0x2c352c35,0x2bd32bf4,0x23b223b2,0x2bb22392,0x2c352bf4,0x23922bd3,0x2c352c35,0x2bb22bd3,0xec69ec69,0xec28ec28,0xec06ec06,0xec06ebe6,0xec69ec28,0xebe6ec07,0xec69ec69,0xec06ec27,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x7cb37cb3,0x00000000,0x7cb30000,0x00007cb3,0x00000000,0x7cb37cb3,0x00000000,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f, +0xc5ced673,0xde94d673,0xd651de94,0xc5cec5ce,0xde94e6f4,0xc5cede93,0xde93d653,0xd653ce32,0x230f2330,0x2bf42371,0x230f2351,0x23712351,0x230f2351,0x23922371,0x23712330,0x23912350,0xe363eba4,0xec48ebc5,0xe342ebc5,0xebc6eba5,0xe342ebc5,0xebe6ebc6,0xebc5eb63,0xebc6eba5,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x22ff3b7f,0x1abf22ff,0x22ff22ff,0x22ff22ff,0x1abf3b7f,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff3b7f,0x1abf22ff,0x22ff22ff,0x22ff22ff,0x1abf3b7f,0x1abf1abf,0x3b7f1abf,0x1abf1abf, +0xc5cede93,0xde94eef6,0xd651d673,0xef16ef16,0xce31c5ce,0xeef6ce31,0xe6d4e6d4,0xde94de93,0x23922bd3,0x23b22351,0x2bd32bd3,0x230f2330,0x2bb22371,0x23302371,0x2bd32bd3,0x23302350,0xebe6ec07,0xec06ebc5,0xec28ec28,0xe342e363,0xec06ebc5,0xeba4ebc5,0xec28ec28,0xe363eba4,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x22ff22ff,0x1abf22ff,0x1abf22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x22ff22ff,0x1abf22ff,0x1abf22ff, +0xdeb3ce31,0xeef6c5ce,0xc5ceeef6,0xdeb4de93,0xd672d651,0xc5ced693,0xe6f4eef6,0xd652de93,0x237123b2,0x2bf42bd3,0x23912392,0x2bf423b2,0x23922351,0x2bf42bf4,0x237123b2,0x2bf42c35,0xebc6ec06,0xec48ec28,0xebc6ebe6,0xec48ec06,0xebe6ebc5,0xec48ec48,0xebc6ec06,0xec48ec69,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x3b7f1abf,0x22ff3b7f,0x3b7f22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f1abf,0x22ff3b7f,0x3b7f22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff, +0xe6b4ce31,0xc5cede93,0xd653c5ce,0xd652ce32,0xd652c5ce,0xe6f4ce32,0xef35c5ce,0xc5cee6d4,0x2bf42bf4,0x23922392,0x2bf42c14,0x23922bb2,0x2bf42bd3,0x2bd32bd3,0x2c352c14,0x2bd32bd3,0xec48ec28,0xebe6ebe6,0xec48ec48,0xebe6ec06,0xec48ec27,0xec27ec27,0xec69ec48,0xec07ec27,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1abf1abf,0x22ff22ff,0x3b7f22ff,0x22ff22ff,0x22ff22ff,0x3b7f1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f22ff,0x22ff22ff,0x22ff22ff,0x3b7f1abf,0x1abf3b7f,0x1abf1abf, +0xc5cee6f5,0xe6b4de94,0xd653c5ce,0xc5ced673,0xdeb4deb3,0xd673d653,0xc5ced673,0xe716c5ce,0x2bd323b2,0x2c352c35,0x2bd32bf4,0x23922392,0x23302350,0x23922371,0x23301aef,0x23922371,0xec07ec06,0xec69ec69,0xec27ec28,0xebe6ebe6,0xeb84eba5,0xebe6ebc5,0xeba4e342,0xebe6ebc6,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x22ff1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x1abf1abf, +0xde94ef15,0xc5cece31,0xde94e6d5,0xc5ceef16,0xe6d4d673,0xdeb4deb4,0xdeb4c5ce,0xdeb4deb4,0x23712351,0x23502350,0x2bd323b2,0x23712351,0x2bd32bd3,0x23502330,0x2bb22bb2,0x23302350,0xebc6eba5,0xeba5eba4,0xec28ec06,0xebc5ebc5,0xec27ec07,0xeba4e363,0xec06ec06,0xeb84eba4,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f, +0xef16e717,0xdeb4ce31,0xc610c610,0xe6d5c5cf,0xde93e6d4,0xce30c5ce,0xef36eef6,0xef37c5ee,0x71767155,0x81998a19,0x79977176,0x923a8a19,0x79777998,0x8a1981b9,0x71767176,0x8a1989f9,0xb9d8b1b7,0xc279c2f9,0xba19b9d8,0xcb3ac2fa,0xb9f8ba39,0xc2f9c299,0xb9d8b9d8,0xc2fac2d9,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xc610ce32,0xce31e6d5,0xe716de94,0xbdaeded6,0xce0fe6f6,0xe6d5ded5,0xbd8dc610,0xbdaddeb4,0x8a3a8a3a,0x79988198,0x81998a19,0x89d981b9,0x89f9927a,0x79777977,0x81d98199,0x71767997,0xc31acb1a,0xba19c259,0xc279c2fa,0xc2b9c299,0xc2d9cb5a,0xb9f8b9f8,0xc2b9c279,0xb9d8ba19,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x3b7f3b7f, +0xe6f7e6f6,0xc5efd673,0xde94d674,0xdeb5de93,0xd694c5ce,0xd673d673,0xe6f6c5ce,0xde94ded5,0x81b981d9,0x927a923a,0x81d98a19,0x79988199,0x79986954,0x8a1981d9,0x79987998,0x925a8a19,0xc299c2b9,0xcb5acb3a,0xc2b9c2f9,0xba19c279,0xba39a196,0xc2fac2b9,0xba39ba39,0xcb5ac2fa,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x1abf1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff, +0xe6f7ef16,0xce31e6d5,0xef37ef16,0xef16ef16,0xef38c5ce,0xde95eef6,0xe6f6ce31,0xe6d6e717,0x79777997,0x69556954,0x8a3a8a19,0x69547176,0x89d98198,0x81d98199,0x927a927a,0x715581b9,0xb9f8ba19,0xa9b6a196,0xcb1ac2f9,0xa196b1b7,0xc2b9ba59,0xc2b9c279,0xcb5acb5a,0xa9b7c299,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff22ff,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff22ff,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff22ff,0x22ff22ff,0x1abf1abf,0x1abf1abf, +0xef37c5ce,0xe6d5ef37,0xbdadce10,0xc5eec5ee,0xc5cede93,0xef17c5ce,0xe6d4c5ee,0xef37ef37,0x71767176,0x81998199,0x79977977,0x81d989d9,0x71767176,0x81b97977,0x69546954,0x81b97997,0xb9d8b1d8,0xc279c279,0xba19b9f8,0xc2b9c2b9,0xb9d8b9d8,0xc299b9f8,0xa9b6a9b6,0xc299ba19,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xc5efde93,0xc5efc5ef,0xce30d673,0xde93de93,0xde93e6f6,0xce10deb4,0xc5eeded5,0xc5aec5ee,0x8a198a19,0x81d981d9,0x8a19927a,0x81b981d9,0x89f98a19,0x81997998,0x819881b9,0x81987176,0xc2fac2f9,0xc2b9c2b9,0xc2facb5a,0xc299c2b9,0xc2d9c2fa,0xc279ba19,0xba59c299,0xc259b1d8,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x3b7f22ff,0x1abf3b7f,0x3b7f1abf,0x1abf22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x3b7f22ff,0x1abf3b7f,0x3b7f1abf,0x1abf22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x3b7f22ff,0x1abf3b7f,0x3b7f1abf,0x1abf22ff,0x1abf1abf, +0xe6d5d673,0xe6d5e6d5,0xc5eede93,0xdeb5eef6,0xdeb5e6d5,0xc5cdd673,0xded5e6f6,0xded5c5cf,0x79987977,0x89f97997,0x69556954,0x81997998,0x81b97176,0x927a927a,0x81d97998,0x925a927a,0xba19b9f8,0xc2d9ba19,0xa9b6a196,0xc279ba19,0xc299b9d8,0xcb5acb5a,0xc2b9ba39,0xcb3acb5a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f22ff,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f22ff,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f22ff,0x22ff3b7f,0x22ff22ff, +0xde94ef37,0xde94e6d5,0xc5efdeb4,0xef17ef16,0xde93de95,0xd651e6d5,0xef16f757,0xef37c5ef,0x81d981d9,0x79777175,0x81b98a19,0x79977176,0x79987977,0x71557977,0x79988198,0x71767176,0xc2b9c2b9,0xb9f8b1b7,0xc299c2f9,0xba19b9d8,0xba19b9f8,0xa9b7b9f8,0xba19ba59,0xb1b7b1b8,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff22ff,0x22ff3b7f,0x22ff22ff,0x22ff22ff,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff3b7f,0x22ff22ff,0x22ff22ff,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff3b7f,0x22ff22ff,0x22ff22ff,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xf758c5ce,0xeef6ef16,0xef37f758,0xc610ce31,0xef16ef16,0xc610f757,0xce10ce32,0xef37c5cf,0x79777977,0x927a925a,0x81b981d9,0x8a198a19,0x79777176,0x8a1989d9,0x81b981b9,0x8a198a19,0xb9f8b9f8,0xcb5acb5a,0xc299c2b9,0xc2f9c2fa,0xb9f8b9d8,0xc2fac2b9,0xc299c299,0xc2f9c2fa,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x22ff1abf,0x3b7f22ff,0x22ff3b7f,0x1abf22ff,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x22ff1abf,0x3b7f22ff,0x22ff3b7f,0x1abf22ff,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x22ff1abf,0x3b7f22ff,0x22ff3b7f,0x1abf22ff, +0xce51de94,0xce31ce51,0xce31ce2f,0xe6f6ded6,0xc5eebdae,0xe6d5c610,0xd693ded5,0xc5cfdeb5,0x927a925a,0x89d989f9,0x81988198,0x81997998,0x927a89f9,0x799881b9,0x927a927a,0x819981d9,0xcb5acb5a,0xc2b9c2d9,0xba59ba59,0xc279ba39,0xcb5ac2d9,0xba19c299,0xcb5acb5a,0xc279c2b9,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f, +0xd673d694,0xdeb3d673,0xe6d5ce2f,0xef16deb4,0xc5eedeb4,0xde93e6d5,0xdeb4de93,0xc5cfdeb5,0x69547175,0x8a197977,0x69547176,0x79777176,0x69547176,0x79987977,0x79777155,0x79977176,0xa9b6b1b7,0xc2fab9d8,0xa196b9d8,0xb9f8b9d8,0xa196b9d8,0xba19b9f8,0xb9f8a9b7,0xba19b9d8,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff3b7f,0x1abf22ff,0x22ff22ff,0x22ff22ff,0x1abf3b7f,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff3b7f,0x1abf22ff,0x22ff22ff,0x22ff22ff,0x1abf3b7f,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff3b7f,0x1abf22ff,0x22ff22ff,0x22ff22ff,0x1abf3b7f,0x1abf1abf,0x3b7f1abf,0x1abf1abf, +0xde94ce30,0xd673de93,0xded4ce2f,0xe6d4e6f5,0xc5cede73,0xd673e6d5,0xe6f6deb4,0xdeb4d673,0x799881b9,0x81987176,0x89d989d9,0x69546955,0x81997977,0x71767977,0x89d989d9,0x69557176,0xba39c299,0xc259b9d8,0xc2b9c2b9,0xa196a9b6,0xc279b9f8,0xb1b7b9f8,0xc2b9c2b9,0xa9b6b1d8,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x22ff22ff,0x1abf22ff,0x1abf22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x22ff22ff,0x1abf22ff,0x1abf22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x22ff22ff,0x1abf22ff,0x1abf22ff, +0xf778ce11,0xef36e6f6,0xf758ce2f,0xf757f757,0xe6f6ef17,0xf757bdad,0xe6f6e6f6,0xf757f757,0x79778198,0x8a1989d9,0x79977998,0x8a198198,0x79987176,0x8a198a19,0x79778198,0x8a19927a,0xb9f8c259,0xc2fac2b9,0xba19ba19,0xc2faba59,0xba19b9d8,0xc2fac2fa,0xb9f8c259,0xc2f9cb5a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x3b7f1abf,0x22ff3b7f,0x3b7f22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f1abf,0x22ff3b7f,0x3b7f22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f1abf,0x22ff3b7f,0x3b7f22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff, +0xd673c610,0xc5f0d651,0xc610ce10,0xc5f0ce31,0xc60fc610,0xc5cec5cf,0xce52ce30,0xc5cfc5f1,0x8a1989f9,0x79987998,0x8a198a3a,0x79988199,0x8a1981d9,0x81d981d9,0x925a923a,0x81b981d9,0xc2fac2d9,0xba39ba19,0xc2facb1a,0xba19c279,0xc2fac2b9,0xc2b9c2b9,0xcb5acb3a,0xc299c2b9,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x1abf1abf,0x22ff22ff,0x3b7f22ff,0x22ff22ff,0x22ff22ff,0x3b7f1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f22ff,0x22ff22ff,0x22ff22ff,0x3b7f1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f22ff,0x22ff22ff,0x22ff22ff,0x3b7f1abf,0x1abf3b7f,0x1abf1abf, +0xd674e6d5,0xde94de94,0xd674de94,0xce32d653,0xd673d673,0xde94de93,0xe6f6d673,0xe6f5e6f6,0x81b98198,0x927a925a,0x81d989f9,0x79987998,0x71557176,0x79987977,0x71756954,0x79987977,0xc299c259,0xcb5acb3a,0xc2b9c2d9,0xba19ba19,0xb1b7b9d8,0xba19b9f8,0xb1b7a195,0xba39b9f8,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x1abf1abf, +0xef16eef6,0xe6f6ef16,0xe6d5e6b5,0xef16f757,0xf757ef16,0xef16ef16,0xf757ef16,0xef16f757,0x79777176,0x71767176,0x89d98198,0x79777176,0x81d981b9,0x71766955,0x81998199,0x71557176,0xb9f8b9d8,0xb9d8b1b8,0xc2b9ba59,0xb9f8b9d8,0xc2b9c299,0xb1d8a9b6,0xc279c279,0xb1b7b1d8,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f, +0xe6d4ef15,0xdeb3deb4,0xe6b4de73,0xd673de94,0xdeb4d673,0xe6f5d693,0xded4de93,0xdeb4deb4,0x21712170,0x21b329d4,0x21922171,0x29d529d4,0x21922192,0x29d429b3,0x21712171,0x29d429b4,0x53f94b99,0x6c7a7cdb,0x5c1a53d9,0x851b7cdb,0x5c1a643a,0x7cdb6c9a,0x53f953d9,0x7cdb7cdb,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe6d4e6d4,0xe6d4de93,0xded4de94,0xce52d673,0xde93d653,0xdeb4d693,0xe6f5deb4,0xdeb4deb4,0x29d529d5,0x21922193,0x21b329d4,0x29b429b3,0x29b429d6,0x21922192,0x29b421b3,0x21712192,0x84fb851b,0x643a6c7a,0x6c7a7cdb,0x74bb6c9a,0x7cdb8d5b,0x5c1a5c1a,0x749a6c7a,0x53d95c1a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdeb4e6d5,0xded5d673,0xd674de94,0xd693d653,0xd673d673,0xd673deb3,0xdeb4de94,0xe6d4deb3,0x29b329b4,0x29d629d5,0x29b429d4,0x219221b3,0x2192214f,0x29d429b4,0x21922192,0x29d529d4,0x6c9a749a,0x8d5b851b,0x749a7cdb,0x643a6c7a,0x645a3b59,0x7cdb749a,0x645a643a,0x8d3b7cdb,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdeb4deb4,0xdeb4de94,0xded4de94,0xd672deb3,0xd672ce31,0xce32d652,0xde93d652,0xde93e6d4,0x21922192,0x2150214f,0x29d529d4,0x214f2171,0x29b42193,0x29b421b3,0x29d629d6,0x217029b3,0x5c1a5c1a,0x43793b59,0x851b7cdb,0x3b584bb9,0x74bb645a,0x749a6c7a,0x8d5b8d5b,0x43996c9a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe6d4de93,0xdeb4deb4,0xde73d673,0xce32e6b4,0xd673d673,0xd673d652,0xde94deb4,0xdeb3d673,0x21712171,0x29b329b3,0x21922192,0x29b429b4,0x21712171,0x29b32192,0x21502150,0x29b32192,0x53f953d9,0x6c7a6c7a,0x5c1a5c1a,0x749a74bb,0x53f953d9,0x6c9a5c1a,0x43794379,0x6c9a5c1a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdeb3ce32,0xde93d693,0xe6d5d673,0xde93deb4,0xded3de93,0xce31deb3,0xef16e6d4,0xd652e6f5,0x29d529d4,0x29b429b4,0x29d429d6,0x29b329b4,0x29b429d5,0x21b32192,0x219329b3,0x21932171,0x7cfb7cdb,0x749a749a,0x7cdb8d3b,0x6c9a749a,0x7cdb7cfb,0x6c7a643a,0x645a6c9a,0x6c7a53d9,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd672d652,0xd673d652,0xe6d4deb4,0xce32de93,0xd673e6d4,0xdeb4d672,0xdeb4e6f5,0xde93deb4,0x21922192,0x29b42192,0x2150214f,0x29b32192,0x29b32171,0x29d629d6,0x29b42192,0x29d529d6,0x643a5c1a,0x7cdb5c1a,0x43793b59,0x6c7a643a,0x6c9a53f9,0x8d5b8d5b,0x749a645a,0x8d3b8d5b,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd672de93,0xde94deb4,0xe6b4de93,0xde94deb4,0xde93de94,0xe6d4deb3,0xe6f5e6f5,0xd693e6d4,0x29b429b4,0x21922170,0x29b329d4,0x21922171,0x21922192,0x21702192,0x21922193,0x21712171,0x749a749a,0x5c1a4bb9,0x6c9a7cdb,0x5c1a53f9,0x643a5c1a,0x43995c1a,0x643a645a,0x4bb94bb9,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd673deb4,0xce52deb4,0xd673de93,0xd652d652,0xdeb4deb4,0xde94e6f4,0xdeb4de93,0xde94deb4,0x21922192,0x29d629d5,0x29b329b4,0x29d429d4,0x21922171,0x29d429b4,0x29b329b3,0x29d429d5,0x5c1a5c1a,0x8d5b8d3b,0x6c9a749a,0x7cdb7cdb,0x5c1a53d9,0x7cdb74bb,0x6c9a6c9a,0x7cdb7cfb,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdeb4d673,0xd673deb4,0xd652deb3,0xe6f6d673,0xde93de94,0xde93e6d4,0xdeb4d673,0xde94de94,0x29d629d5,0x29b429b4,0x21932193,0x21b32192,0x29d629b4,0x219229b3,0x29d629d6,0x21b329b4,0x8d3b8d3b,0x74bb7cdb,0x645a645a,0x6c7a643a,0x8d3b7cdb,0x643a6c9a,0x8d5b8d5b,0x6c7a749a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xde93d652,0xce32de93,0xd673ce32,0xef36e6d5,0xd653deb4,0xd673de73,0xde93de93,0xde93de94,0x21502170,0x29d42191,0x214f2171,0x21922171,0x214f2171,0x21922192,0x21922170,0x21922171,0x43794bb9,0x7cdb53f9,0x3b5853f9,0x5c1a53d9,0x3b5853f9,0x643a5c1a,0x5c1a4399,0x5c1a53d9,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd672de93,0xd652deb3,0xde93d693,0xe6d4deb4,0xdeb3d652,0xd693de93,0xdeb4e6f4,0xd673deb4,0x219229b3,0x21932171,0x29b429b4,0x214f2150,0x21b32192,0x21712192,0x29b429b4,0x21502171,0x643a6c9a,0x6c7a53f9,0x74bb74bb,0x3b584379,0x6c7a5c1a,0x4bb95c1a,0x74bb74bb,0x437953d9,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xde93e6d4,0xde93deb3,0xde73d673,0xe6b4de93,0xde93d672,0xdeb3d652,0xdeb4e6f4,0xd652deb4,0x21922193,0x29d429b4,0x21922192,0x29d42193,0x21922171,0x29d429d4,0x21922193,0x29d429d6,0x5c1a6c7a,0x7cdb74bb,0x5c1a643a,0x7cdb645a,0x643a53f9,0x7cdb7cdb,0x5c1a6c7a,0x7cdb8d5b,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd673deb4,0xde93deb4,0xce33ce52,0xd652ce32,0xd693d672,0xe6f4d672,0xded4e6f5,0xe6f5e6d4,0x29d429b4,0x21922192,0x29d429d5,0x219221b3,0x29d429b4,0x29b429b4,0x29d529d5,0x29b329b4,0x7cdb7cdb,0x645a643a,0x7cdb851b,0x643a6c7a,0x7cdb749a,0x749a749a,0x8d3b851b,0x6c9a749a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xde94deb4,0xde94e6b4,0xce33d673,0xce32ce32,0xde93deb3,0xe6d4d673,0xe715deb3,0xef15e715,0x29b32193,0x29d629d5,0x29b429b4,0x21922192,0x21702171,0x21922192,0x2170194f,0x21922192,0x6c9a6c7a,0x8d5b8d3b,0x749a7cdb,0x643a643a,0x4b9953d9,0x643a5c1a,0x4bb93b38,0x643a5c1a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe6d4e6d5,0xde93d673,0xde94e6d4,0xd652d673,0xdeb4deb4,0xdeb4d673,0xd693e6d4,0xef15e6f4,0x21922171,0x21712171,0x29b42193,0x21922171,0x29b429b3,0x21712150,0x21b321b3,0x21702171,0x5c1a53d9,0x53d94bb9,0x74bb645a,0x5c1a53f9,0x749a6c9a,0x53d94379,0x6c7a6c7a,0x4b9953d9,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x73ae73ae,0x73ae73ae,0x8c716b4d,0x7bef8c71,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x7bef7bef,0x49634963,0x51a359c3,0x51834963,0x61c359c3,0x51835183,0x59c359a3,0x49634963,0x59c359a3,0xb523a4c2,0xc5a3d624,0xbd63ad02,0xde64d644,0xb543bd83,0xd624cdc3,0xb523ad02,0xd644d623,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x7bef7bef,0x73ae7bef,0x22712271,0x73ae2271,0x7bef7bef,0x8c718c71,0x73ae7bef,0x7bef73ae,0x59c361c3,0x51835183,0x51a359c3,0x59a359a3,0x59a361c4,0x51835183,0x59a351a3,0x49635183,0xde64de64,0xbd63c5a3,0xc5a3d644,0xce03cdc3,0xd623de65,0xb543b543,0xcde3c5a3,0xad02bd63,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x8c717bef,0x8c7173ae,0x11751175,0x73ae1a54,0x11b21156,0x73ae2231,0x7bef7bef,0x8c718c71,0x59a359a3,0x61c461c3,0x59a359c3,0x518351a3,0x51834142,0x59c359a3,0x51835183,0x61c359c3,0xcdc3cde3,0xde65de64,0xcde3d624,0xbd63c5a3,0xc5839c82,0xd644cde3,0xc583bd83,0xde65d644,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x0000dedb,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x73ae7bef,0x73ae73ae,0x117473ae,0x73ae73ae,0x1a151176,0x73ae1a54,0x227173ae,0x7bef2211,0x51835183,0x49634142,0x61c359c3,0x41424963,0x59a35183,0x59a351a3,0x61c461c4,0x496359a3,0xb543bd63,0xa4a29c82,0xde64d624,0x9c62a4e2,0xce03c5a3,0xcde3c5a3,0xde65de65,0xa4c2cdc3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0xdedb0000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x7bef6b4d,0x11331a53,0x7bef1152,0x7bef7bef,0x8c718c71,0x7bef7bef,0x22527bef,0x6b4d32f1,0x49634963,0x59a359a3,0x51835183,0x59a359a3,0x49634963,0x59a35183,0x49424942,0x59a35183,0xb523ad02,0xcdc3cdc3,0xbd63b543,0xcde3ce03,0xb523ad02,0xcdc3b543,0x9c829c82,0xcdc3bd63,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x0000ffff,0xffff0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x7bef7bef,0x73ae8c71,0x8c7119d5,0x73ae8c71,0x1a3419f6,0x8c712252,0x1a348c71,0x7bef3310,0x59c359c3,0x59a359a3,0x59c361c4,0x59a359a3,0x59a359c3,0x51a35183,0x518359a3,0x51834963,0xd644d624,0xcde3cde3,0xd644de65,0xcdc3cde3,0xd623d644,0xc5a3bd63,0xc5a3cdc3,0xc5a3ad02,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0xdedb0000,0x0000ffff,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x73ae7bef,0x73ae73ae,0x73ae73ae,0x1a3673ae,0x1a341a35,0x2a711a15,0x1a1473ae,0x7bef2ab1,0x51835183,0x59a35183,0x49634142,0x59a35183,0x59a34963,0x61c461c4,0x59a35183,0x61c361c4,0xbd63b543,0xd623bd63,0xa4a29c82,0xcdc3bd63,0xcdc3b523,0xde65de65,0xcde3c583,0xde64de65,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0xffff0000,0xffffdedb,0xdedb0000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xffffdedb,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x22537bef,0x6b4d19f7,0x73ae8c71,0x12387bef,0x1a957bef,0x1a542a71,0x8c718c71,0x8c718c71,0x59a359a3,0x51834963,0x59a359c3,0x51834963,0x51835183,0x49635183,0x51835183,0x49634963,0xcde3cde3,0xb543a4e2,0xcdc3d624,0xbd63b523,0xbd63b543,0xa4c2b543,0xbd63c5a3,0xa4e2ace2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0xef5d0000,0xffffef5d,0xef5ddedb,0xef5dffff,0x0000ffff,0x0000dedb,0xffff0000,0x00000000,0xef5d0000,0x0000ef5d,0xef5d0000,0xffff0000,0x0000dedb,0x0000dedb,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x1a157bef,0x73ae1256,0x73ae73ae,0x73ae73ae,0x6b4d73ae,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x51835183,0x61c461c3,0x59a359a3,0x59c359c3,0x51834963,0x59c359a3,0x59a359a3,0x59c359c3,0xb543b543,0xde65de65,0xcdc3cde3,0xd624d644,0xb543ad02,0xd644ce03,0xcdc3cdc3,0xd624d644,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x0000ef5d,0xdedbffff,0x00000000,0xef5def5d,0xef5d0000,0xffffef5d,0xffffffff,0x0000ffff,0x0000ef5d,0xdedbffff,0x00000000,0xdedbef5d,0x0000ffff,0x0000ef5d,0x0000ffff,0x0000ffff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x8c718c71,0x19f87bef,0x1ab81a36,0x1a541219,0x7bef7bef,0x22711a33,0x8c718c71,0x6b4d8c71,0x61c461c3,0x59a359a3,0x51835183,0x51a35183,0x61c459a3,0x518359a3,0x61c461c4,0x51a359a3,0xde65de65,0xce03d623,0xc5a3c5a3,0xc5a3bd83,0xde65d623,0xbd63cdc3,0xde65de65,0xc5a3cde3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0xdedbdedb,0xdedbffff,0xffffef5d,0xffffffff,0x00000000,0x00000000,0x00000000,0x00000000,0xdedbdedb,0x0000dedb,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x73ae73ae,0x7bef7bef,0x1ab87bef,0x73ae1237,0x6b4d7bef,0x23161a33,0x73ae73ae,0x7bef6b4d,0x49424963,0x59c34963,0x41424963,0x51834963,0x41424963,0x51835183,0x51834963,0x51834963,0x9c82a4e2,0xd644b523,0x9c62b523,0xb543b522,0x9c62b523,0xbd63b543,0xb543a4c2,0xbd63ad02,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x0000ffff,0xdedbffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x8c717bef,0x73ae8c71,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x8c718c71,0x6b4d8c71,0x518359a3,0x51834963,0x59a359a3,0x41424963,0x51a35183,0x49635183,0x59a359a3,0x49634963,0xbd83cdc3,0xc5a3b523,0xce03ce03,0x9c62a4a2,0xc5a3b543,0xa4e2b543,0xce03ce03,0xa4a2ad02,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0xef5d0000,0xdedb0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x8c717bef,0x7bef7bef,0x12387bef,0x1a917bef,0x7bef1237,0x73ae73ae,0x73ae73ae,0x7bef73ae,0x51835183,0x59c359a3,0x51835183,0x59c35183,0x51834963,0x59c359c3,0x51835183,0x59c361c4,0xb543c5a3,0xd644ce03,0xbd63bd63,0xd644c5a3,0xbd63b523,0xd644d644,0xb543c5a3,0xd624de65,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0xef5d0000,0x0000dedb,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x6b4d7bef,0x2b731ab8,0x1a541ad8,0x73ae73ae,0x73ae8c71,0x7bef7bef,0x1a540937,0x7bef7bef,0x59c359a3,0x51835183,0x59c361c3,0x518351a3,0x59c359a3,0x59a359a3,0x61c361c3,0x59a359a3,0xd644d623,0xc583bd63,0xd644de64,0xbd63c5a3,0xd644cde3,0xcde3cde3,0xde65de64,0xcdc3cde3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x7bef7bef,0x8c718c71,0x8c718c71,0x8c718c71,0x8c7173ae,0x8c718c71,0x7bef6b4d,0x73ae7bef,0x59a35183,0x61c461c3,0x59a359a3,0x51835183,0x49634963,0x51835183,0x49634142,0x51835183,0xcdc3c5a3,0xde65de64,0xcde3d623,0xbd63bd63,0xa4c2ad02,0xbd63b543,0xa4e29c62,0xbd83b543,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x73ae7bef,0x73ae73ae,0x7bef73ae,0x8c718c71,0x8c716b4d,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x51834963,0x49634963,0x59a35183,0x51834963,0x59a359a3,0x49634963,0x51a351a3,0x49634963,0xb543b522,0xad02ace2,0xce03c5a3,0xb543b523,0xcde3cdc3,0xad02a4a2,0xc5a3c5a3,0xa4c2ad02,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x00000000,0x00000000,0x00000000,0x00000000,0x0000ef5d,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x1a5332ef,0x1ab81a53,0x1a54121a,0x22711a54,0x1a542271,0x2a712211,0x2a712a71,0x12361236,0x32223202,0x3a633a83,0x32423222,0x3aa33aa3,0x32423243,0x3a833a83,0x32223222,0x3aa33a83,0x35653525,0x3e054666,0x3da53565,0x46674666,0x35853dc5,0x46663e06,0x35653565,0x46663e66,0x84108410,0x84108410,0x94927bcf,0x84108c51,0x84108410,0x84108430,0x84108410,0x84308430, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x220e1a72,0x1ab81ab8,0x22712271,0x22712271,0x1a540957,0x099711b2,0x22112a71,0x12362a50,0x3aa33aa3,0x32433263,0x3a633aa3,0x3a833a83,0x3a8342c3,0x32423242,0x3a833a63,0x32223242,0x46674667,0x3dc53de5,0x3e054666,0x3e463e06,0x3e664e88,0x35853585,0x3e263e05,0x35653da5,0xad558430,0xa514ad55,0xb596a514,0xc638b596,0xc638c638,0xb596ce79,0xa514ad55,0x8430a514, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x22512ad0,0x22712232,0x11751175,0x09971a54,0x11b21156,0x1a322231,0x2a502a71,0x2ab12250,0x3a833a83,0x42c33aa3,0x3a833a83,0x32423a63,0x324329e2,0x3aa33a83,0x32433243,0x3ac33aa3,0x3e063e26,0x4e884667,0x3e264666,0x3dc53e05,0x3dc534e4,0x46663e26,0x3dc53dc5,0x4e674666,0xb5968430,0xb596a514,0xa5149cf3,0xd00094b2,0xb596b000,0xce79ad14,0xad55ce79,0x9492b596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x2a9232f1,0x19922a71,0x11741173,0x09371196,0x1a151176,0x1a531a54,0x22712a71,0x2ab12211,0x32423242,0x320229e2,0x3aa33a83,0x29e23222,0x3a833263,0x3a833a63,0x42c342c3,0x32023a83,0x35853da5,0x350534e4,0x46674666,0x2cc43545,0x3e463de5,0x3e263e05,0x4e884e88,0x35053e06,0xa5148430,0x84109492,0xa5149cf3,0xf8009492,0xb596b000,0xad149cf3,0xc638a514,0x8430a514, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x22512ab1,0x11331a53,0x1a111152,0x093719b4,0x1a5411d5,0x2a712233,0x22522251,0x2ab132f1,0x32223222,0x3a633a63,0x32423242,0x3a833a83,0x32223222,0x3a833242,0x2a022a02,0x3a833242,0x35653545,0x3e063e06,0x3da53585,0x3e263e46,0x35653565,0x3e063585,0x35043504,0x3e063da5,0xad557bcf,0x84109492,0x9cf3a514,0xf8009492,0xb596d800,0x9cf3a514,0xce79a514,0x7bcfb596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x19b73310,0x117619b3,0x2ab219d5,0x09372274,0x1a3419f6,0x2a712252,0x1a342a71,0x32f13310,0x3aa33a83,0x3a833a83,0x3aa342c3,0x3a833a83,0x3a833aa3,0x3a633242,0x32633a83,0x32633222,0x46664666,0x3e263e26,0x46664e68,0x3e063e26,0x3e664666,0x3e053dc5,0x3de53e06,0x3de53545,0xad558430,0x9492b596,0x9cf38410,0xd0009492,0xb596b000,0xa514a514,0xad55ce79,0x8430ad55, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x19b719b7,0x19f819f5,0x23151a37,0x1a362274,0x1a341a35,0x2a711a15,0x1a142a71,0x19b72ab1,0x32433242,0x3a833242,0x320229e2,0x3a633243,0x3a833222,0x42c342c3,0x3a833243,0x3ac342c3,0x3dc53585,0x3e663da5,0x350534e4,0x3e063dc5,0x3e063565,0x4e884e88,0x3e263dc5,0x4e674e88,0xa5148430,0x9492a514,0xa5148410,0xd0009492,0xb596d000,0x9cf3a514,0xa514ce79,0x8430b596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x225319b7,0x129819f7,0x19f51a58,0x12380937,0x1a952274,0x1a542a71,0x2ab11a33,0x19b719b7,0x3a833a83,0x32423222,0x3a833a83,0x32423222,0x32423242,0x32023242,0x32433263,0x32223222,0x3e263e26,0x35853525,0x3e064666,0x3da53565,0x3dc53585,0x35053585,0x3dc53de5,0x35453545,0xb5968430,0x9cf3b596,0x84109492,0xf8009492,0xb596a800,0xce799cf3,0xb596b596,0x9492b596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x9b66ac49,0x00006a03,0x00000000,0x00000000,0x00000000,0x00000000,0xac690000,0x6a239367,0x9367ac69,0x00006a23,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xac680000,0x6a039367, +0x9386ac68,0x00006a03,0x00000000,0x00000000,0x00000000,0x00000000,0xac880000,0x6a049367,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x1a1519b7,0x1a771256,0x09371a57,0x12161a54,0x1a731a74,0x1a341237,0x2ab11a34,0x19b71152,0x32423242,0x42c33ac3,0x3a833a83,0x3a833aa3,0x32423222,0x3aa33a83,0x3a833a83,0x3a833aa3,0x35853585,0x4e884e67,0x3e063e26,0x46664666,0x35853565,0x46663e46,0x3e063e06,0x46664666,0xad558430,0xa514ad55,0x84109492,0xf8009492,0xb596d000,0xc638a514,0xa514a514,0x8430ad55, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b67acca,0x000059e2,0x00000000,0x00000000,0x00000000,0x00000000,0xb4aa0000,0x6a239367,0x8b46b4aa,0x000051e3,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xb4aa0000,0x6a049367, +0x8b67b4aa,0x000051e3,0x00000000,0x00000000,0x00000000,0x00000000,0xb4aa0000,0x6a048b67,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x19b71a57,0x19f811f9,0x1ab81a36,0x1a541219,0x2a711a92,0x22711a33,0x2ab11a53,0x19b71a53,0x42c33ac3,0x3a833a83,0x32633263,0x3a633243,0x42c33a83,0x32433a83,0x42c342c3,0x3a633a83,0x4e684e67,0x3e463e46,0x3de53de5,0x3e053dc5,0x4e683e66,0x3dc53e06,0x4e884e88,0x3e053e26,0xb5969492,0xad55ad55,0x9492ad55,0xf8009492,0xb596f800,0xad55ce79,0xb596b596,0x7bcfb596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b06ac68,0x000051e3,0x00000000,0x00000000,0x00000000,0x00000000,0xac890000,0x51e39367,0x8b45ac69,0x000059e3,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xac890000,0x59e39367, +0x8b46ac89,0x000051e3,0x00000000,0x00000000,0x00000000,0x00000000,0xac480000,0x51e39366,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x12371a57,0x1a571236,0x1ab81a97,0x1a541237,0x2a711237,0x23161a33,0x09971a53,0x12161a53,0x2a023222,0x3aa33222,0x29e23222,0x32423222,0x29e23222,0x32423242,0x32423202,0x32423222,0x35043525,0x46663585,0x2cc43565,0x35853565,0x2cc43565,0x3dc53585,0x35853505,0x3da53565,0xa5148410,0xad55ad55,0x9492ad55,0x7bcf8410,0x84107bcf,0xad55c638,0xa514a514,0x84309cf3, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b26b4aa,0x6a246204,0x6a046a04,0x6a046a03,0x51e451c2,0x6a246a03,0x93a859e3,0x5a038b67,0x8b46acaa,0x6a0369e4,0x6a036a03,0x6a246a03,0x51e351e3,0x6a236a23,0x69e451c3,0x6a036a03,0x59e36224,0x6a036a03,0x6a2351c3,0x6a236a24,0x6a036a03,0x6a236a04,0x93a86203,0x51c38b67, +0x8b26b4c9,0x6a046a03,0x62046223,0x6a036a03,0x59e351e3,0x6a036a03,0x9bc859c3,0x59c38b66,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x1a5719f8,0x1a981236,0x12191ab8,0x1a701a16,0x1a331237,0x2a711a74,0x09972a71,0x12161a53,0x32433a83,0x32633222,0x3a833a83,0x29e23202,0x3a633242,0x32223242,0x3a833a83,0x32023222,0x3dc53e06,0x3de53565,0x3e463e46,0x2cc43505,0x3e053585,0x35453585,0x3e463e46,0x35053545,0xb5968430,0xa514b596,0xa514a514,0x94929492,0x94929492,0xb596b596,0xb596b596,0x7bcfb596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x9366a489,0x93678b46,0x93679367,0x8b468b45,0x93469366,0x8b468346,0x93669366,0x52039387,0x9367ac69,0x93878346,0x93678b47,0x8b468b26,0x93679366,0x83268b46,0x93869347,0x8b469367,0x8b458b46,0x93669367,0x93678b87,0x8b469346,0x93468b46,0x93678b26,0x93668b66,0x59c38b66, +0x9347aca9,0x93678326,0x93669367,0x8b268b46,0x936793a7,0x8b468326,0x93669366,0x59e39387,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x12361236,0x1ab81a76,0x12381a98,0x1a911a35,0x2a711237,0x09971a73,0x1a530997,0x12161a54,0x32423263,0x3aa33a83,0x32423242,0x3aa33263,0x32433222,0x3aa33aa3,0x32423263,0x3a8342c3,0x35853de5,0x46663e46,0x3da53dc5,0x46663de5,0x3dc53565,0x46664666,0x35853de5,0x46664e88,0xb5968430,0xad55ad55,0x9cf3ad55,0xb596ad55,0xad55ad55,0xa514a514,0xa514a514,0x8430a514, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x68006800,0x68206820,0x68006800,0x68006800,0x68006800,0x68006800,0x68006800,0x68006800,0x70006800,0x70006800,0x68006800,0x68006800,0x68006800,0x68006800,0x68006800,0x68006800,0x68006800,0x68206800,0x68006800,0x68006800,0xbdd7b5b6,0xce59d6b9,0xb5b6ce59,0xb5b6b5d7, +0xb5d6b596,0xce39ce59,0xb5b6ce59,0xb5b6b5b6,0xbdd7b5d7,0xce59d67a,0xbdd6ce79,0xb5b7b5d7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x12981236,0x2b731ab8,0x1a541ad8,0x1a7319f3,0x1a742a71,0x09971a16,0x1a540937,0x12361236,0x3aa33a83,0x32433242,0x3aa33aa3,0x32423a63,0x3aa33a83,0x3a833a83,0x3ac33aa3,0x3a833a83,0x46663e66,0x3dc53dc5,0x46664667,0x3dc53e05,0x46663e26,0x3e263e26,0x4e674667,0x3e063e26,0x9cf38430,0xa514a514,0xa5149cf3,0xa514a514,0xa514b596,0xad55ad55,0xb596ad55,0x8430ad55, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x88828021,0x99049904,0x99249904,0x990398e4,0x88a288a2,0x806288c2,0x80618082,0x88a288a2,0x88828041,0x99049904,0x99039104,0x98e49904,0x888288a2,0x806188a3,0x80828081,0x88a280a2,0x78828882,0xa1457000,0x88a28081,0x68008883,0xce7ab5b6,0xef5def5d,0xef3def7d,0xb5b6d679, +0xd699b5b6,0xef7eef7e,0xef7df77d,0xf75def7d,0xf77dffdf,0xf7beef9d,0xf77def9d,0xb5b6ce9a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x1a7619f8,0x3bd41ab8,0x121a22d7,0x1a931a15,0x1a961a94,0x09970997,0x1a331a73,0x12361236,0x3a833263,0x42c33ac3,0x3a833a83,0x32423243,0x32023222,0x32423242,0x322229e2,0x32433242,0x3e063de5,0x4e884e67,0x3e263e66,0x3dc53dc5,0x35253565,0x3dc53585,0x35252cc4,0x3dc53585,0xad558430,0xb596b596,0xb596b596,0xb596b596,0xb596a514,0xb596b596,0xad559cf3,0x8410ad55, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x88c28041,0x88a28882,0x88a288a2,0x808188a2,0x80628082,0x80828042,0x88c28862,0x806288a2,0x88a28041,0x88a288c2,0x88a28882,0x808288a2,0x78a27882,0x78828082,0x88a290a3,0x808188a2,0x88a288a2,0xb1a67820,0x88a2a125,0x68008062,0xef7dbdb6,0xef7eef9d,0xef7def9d,0xb5b7ce99, +0xce79b5d7,0xef7def5d,0xffdfffdf,0xf7deffdf,0xffbfffbe,0xf77def7d,0xef5def9e,0xb5b6ce7a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x1a531ad6,0x12981a53,0x12981af8,0x22712271,0x1ab61ab4,0x2a711a54,0x22922a71,0x12362a50,0x32423222,0x32223222,0x3a833263,0x32423222,0x3a833a83,0x32223202,0x3a633a63,0x32023222,0x35853565,0x35653545,0x3e463de5,0x35853565,0x3e263e06,0x35453505,0x3e053e05,0x35253545,0x84108430,0x84108410,0x84308410,0x94929492,0x94927bcf,0x84108430,0x84108410,0x84308410, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x80418061,0x80408021,0x80418021,0x80828041,0x78828062,0x80618081,0x80418061,0x80627882,0x80218041,0x80217841,0x80408041,0x80828041,0x78828082,0x80828062,0x78417841,0x806280a2,0x80208061,0x80407820,0x80619965,0x68008041,0xce7ab5b6,0xce59ce99,0xbdd6b5d7,0xb596b5b7, +0xce99bd96,0xce59ce79,0xbdd6b5d7,0xbd96b596,0xce9ab5b6,0xce79ce7a,0xbdb7bdb6,0xb5d6b5b6,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0x91448924,0xa165b185,0x99449144,0xb185b185,0x9944a165,0xb185a965,0x91449144,0xb185b185,0xd391cb0f,0xdc33e4d5,0xd3b2d371,0xe516e4d5,0xd3b2dc13,0xe4d5dc54,0xd391d371,0xe4d5dcd5,0x84108410,0x84108410,0x94927bcf,0x84108c51,0x84108410,0x84108430,0x84108410,0x84308430, +0x4a690000,0x31860000,0x4a699cd3,0x00009cd3,0x9cd34a69,0x8c510000,0x00003186,0x00008c51,0x4a693186,0x31863186,0x4a699cd3,0x31869cd3,0x9cd34a69,0x8c513186,0x31863186,0x31868c51,0x80408061,0x80418041,0x80417840,0x80418041,0x80418041,0x80218040,0x80418020,0x80418041,0x80418021,0x80217840,0x78208041,0x68007021,0xb5b6b5b7,0xa574b5b5,0xb5b6ad75,0xbdb7b5b6, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x52050000,0x6b4da534,0x49e441a4,0x5a246a85,0x62656265,0x41a46265,0xa5346b4d,0x00005205,0xb185b185,0x9965a165,0xa165b185,0xa965a965,0xb185b9a5,0x99449944,0xa965a165,0x91449944,0xe4f6e4f6,0xd3f2dc33,0xdc33e4d5,0xdc94dc54,0xdcd5e557,0xd3b2d3b1,0xdc74dc33,0xd371d3b2,0xad558430,0xa514ad55,0xb596a514,0xc638b596,0xc638c638,0xb596ce79,0xa514ad55,0x8430a514, +0x9cd34208,0x9cd30000,0x9cd34a69,0x42080000,0x00004a69,0x00008c51,0x9cd33186,0x9cd30000,0x9cd33186,0x9cd33186,0x9cd34a69,0x31863186,0x31864a69,0x31868c51,0x9cd33186,0x9cd33186,0x80418041,0x80417821,0x80608041,0x80828081,0x80827862,0x782180a1,0x78407820,0x80417841,0x80218021,0x98a27820,0x78218882,0x70007021,0xd679d699,0xb5b6c5f8,0xce59b5b7,0xb5d6d69a, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x38e10000,0x38e138e1,0x38e138e1,0x000038e1,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83280000,0x6b4da534,0x83685a66,0x8b87ac4a,0xac4aac4a,0x6aa78b87,0xa5346b4d,0x00008328,0xa965a965,0xb9a5b185,0xa965b185,0x9944a165,0xa1658124,0xb185a965,0xa165a165,0xb985b185,0xdc54dc74,0xe557e516,0xdc74e4d5,0xd3d2dc33,0xdc13cacf,0xe4d5dc74,0xdc13dc13,0xe536e4d5,0xb5968430,0xb596a514,0xa5149cf3,0x400094b2,0xb5962000,0xce79ad14,0xad55ce79,0x9492b596, +0x00003186,0x00009cd3,0x00009cd3,0x4a699cd3,0x00000000,0x4a699cd3,0x42080000,0x00009cd3,0x31863186,0x31869cd3,0x31869cd3,0x4a699cd3,0x31863186,0x4a699cd3,0x31863186,0x31869cd3,0x88408021,0x888288a2,0x88a288a2,0x80627882,0x80818082,0x80627862,0x78828082,0x80828081,0x80828082,0xa9857820,0x808298e3,0x68007020,0xdefbce99,0xce79deba,0xdebbc699,0xb5b6ce39, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x38e10000,0x924338e1,0x92439243,0x92439243,0x38e19243,0x38e138e1,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0x99449944,0x89248124,0xb185b185,0x81249144,0xa985a165,0xa965a165,0xb9a5b9a5,0x8924a965,0xd3b2d3b2,0xcaefcacf,0xe4f6e4d5,0xcaaed330,0xdc94dc13,0xdc74dc33,0xe557e557,0xcb0fdc54,0xa5148430,0x84109492,0xa5149cf3,0x48009492,0xb5962800,0xad149cf3,0xc638a514,0x8430a514, +0x8c514208,0x9cd38c51,0x9cd38c51,0x9cd33186,0x9cd33186,0x9cd30000,0x4a690000,0x00003186,0x8c513186,0x9cd38c51,0x9cd38c51,0x9cd33186,0x9cd33186,0x9cd33186,0x4a693186,0x31863186,0x90617841,0x88a290e3,0x808288a2,0x78817862,0x80627881,0x78a27862,0x80628062,0x80618081,0x80817882,0xa9857020,0x8082a145,0x68007021,0xdebbc638,0xdefbdedb,0xce79d6ba,0xad55b596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x38e10000,0x924338e1,0xbae49243,0xaac4bae4,0xaac4aac4,0x9243aac4,0x92439243,0x000038e1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0x91449144,0xa165a165,0x99449944,0xa965a985,0x91449144,0xa9659944,0x89248924,0xa9659944,0xd391d350,0xdc53dc53,0xd3b2d3b2,0xdc74dc94,0xd391d371,0xdc54d3b2,0xcaefcaef,0xdc54d3d2,0xad557bcf,0x84109492,0x9cf3a514,0x48009492,0xb5962800,0x9cf3a514,0xce79a514,0x7bcfb596, +0x00000000,0x00009cd3,0x4a698c51,0x9cd30000,0x00004a69,0x8c519cd3,0x4a690000,0x42080000,0x31863186,0x31869cd3,0x4a698c51,0x9cd33186,0x31863186,0x8c519cd3,0x4a693186,0x31863186,0x90818040,0x88a298c3,0x80828081,0x80618082,0x80617862,0x88828082,0x80828062,0x78627881,0x80817861,0xa9a67020,0x88a290e3,0x68007040,0xdedbc618,0xef5cdebb,0xd678defb,0xad55b596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x924338e1,0xbae4bae4,0xa284aac4,0xa284c618,0xa284a284,0xaac4bdf7,0xa284a284,0x38e19243,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x52050000,0x6b4da534,0x49e441a4,0x62655a24,0x62656265,0x41c46265,0xa5346b4d,0x00005205,0xb185b185,0xa965a965,0xb185b9a5,0xa965a965,0xb185b185,0xa1659944,0xa165a965,0xa1659144,0xe4f5e4d5,0xdc74dc74,0xe4d5e557,0xdc54dc74,0xdcd5e4f5,0xdc33d3d2,0xdc13dc54,0xdc33d350,0xad558430,0x9492b596,0x9cf38410,0x58009492,0xb5962800,0xa514a514,0xad55ce79,0x8430ad55, +0x00008c51,0x42080000,0x4a699cd3,0x00000000,0x9cd30000,0x9cd34a69,0x9cd30000,0x4a693186,0x31868c51,0x31863186,0x4a699cd3,0x31863186,0x9cd33186,0x9cd34a69,0x9cd33186,0x4a693186,0x88828041,0x90e39904,0x80a28082,0x88828082,0x88a38082,0x88a388a2,0x88a288a2,0x88a290a2,0x888288a2,0xb1e78061,0x88a39103,0x68007820,0xe6fcc618,0xef5def5d,0xdf1cef5d,0xad75c618, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x924338e1,0xa284a284,0xce79ef5d,0xce79ce79,0xbdf7ce79,0xbdf7bdf7,0xa284a284,0x38e19243,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83280000,0x6b4da534,0x83686ac7,0x8b878b87,0x8b878b87,0x6aa7a409,0xa5346b4d,0x00008328,0x99659944,0xb1859944,0x89248124,0xa1659965,0xa9659144,0xb9a5b9a5,0xa965a165,0xb985b9a5,0xd3f2d3b2,0xdcd5d3d2,0xcaefcacf,0xdc53d3f2,0xdc54d391,0xe557e557,0xdc74dc13,0xe536e557,0xa5148430,0x9492a514,0xa5148410,0x58009492,0xb5962800,0x9cf3a514,0xa514ce79,0x8430b596, +0x42089cd3,0x4a698c51,0x9cd30000,0x9cd30000,0x00004208,0x00009cd3,0x00004a69,0x4a699cd3,0x31869cd3,0x4a698c51,0x9cd33186,0x9cd33186,0x31863186,0x31869cd3,0x31864a69,0x4a699cd3,0x90828021,0x90c39903,0x88a288a2,0x80a388a2,0x88a288a2,0x88a288a2,0x88a18882,0x88a290c2,0x80a288a2,0xb1e78861,0x88a298c3,0x68007020,0xf77ed69a,0xef5eef7e,0xef5def5d,0xb596d679, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x924338e1,0xef5dce79,0xef5def5d,0xce79ce79,0xbdf7ce79,0xbdf7bdf7,0xa284bdf7,0x38e19243,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0xa965a965,0x99448924,0xa965b185,0x99449144,0x99449944,0x89249944,0x9965a165,0x91449144,0xdc74dc74,0xd3b2d310,0xdc54e4d5,0xd3b2d391,0xd3d2d3b2,0xcb0fd3b1,0xd3f2dc13,0xd330d350,0xb5968430,0x9cf3b596,0x84109492,0x50009492,0xb5962800,0xce799cf3,0xb596b596,0x9492b596, +0x9cd30000,0x9cd34a69,0x00003186,0x4a699cd3,0x00004a69,0x9cd30000,0x9cd34a69,0x9cd30000,0x9cd33186,0x9cd34a69,0x31863186,0x4a699cd3,0x31864a69,0x9cd33186,0x9cd34a69,0x9cd33186,0x90628041,0x88a39903,0x888288a3,0x90a288a2,0x88a288a2,0x88a288a2,0x88a288a2,0x888288c2,0x88a288a2,0xb1c78861,0x808290e3,0x68007021,0xf7bed6ba,0xef7ef79d,0xef5def5d,0xb576ce7a, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce7938e1,0xef5def5d,0xc618ef5d,0xc618c618,0xc618c618,0xbdf7c618,0xbdf7bdf7,0x38e1bdf7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0x99449944,0xb9a5b985,0xa965a965,0xb185b185,0x99449144,0xb185a965,0xa965a965,0xb185b185,0xd3b2d3b2,0xe557e536,0xdc54dc74,0xe4d5e4d5,0xd3b1d371,0xe4d5dc94,0xdc54dc54,0xe4d5e4f5,0xad558430,0xa514ad55,0x84109492,0x50009492,0xb5964020,0xc638a514,0xa514a514,0x8430ad55, +0x31860000,0x00009cd3,0x9cd33186,0x9cd30000,0x00009cd3,0x00009cd3,0x00008c51,0x00009cd3,0x31863186,0x31869cd3,0x9cd33186,0x9cd33186,0x31869cd3,0x31869cd3,0x31868c51,0x31869cd3,0x90628041,0x88a29904,0x88a280a1,0x80a28082,0x88a28883,0x88a288a2,0x88a288a3,0x88a288a2,0x888388a2,0xba498861,0x80a290e3,0x68007000,0xef9dd6db,0xef7ef79e,0xef7def5d,0xb5b6ce99, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce794a49,0xc618ef5d,0xef5dc618,0xef5def5d,0xef5de8e3,0xc618ef5d,0xbdf7c618,0x4a49bdf7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x52050000,0x6b4da534,0x49e441a4,0x62655a24,0x62656265,0x41a45a24,0xa5346b4d,0x00005205,0xb9a5b985,0xa965a985,0xa165a165,0xa165a165,0xb9a5b185,0x9965a965,0xb9a5b9a5,0xa165a965,0xe557e536,0xdc94dcd5,0xdc13dc13,0xdc33dc13,0xe557dcd5,0xd3f2dc54,0xe557e557,0xdc33dc74,0xb5969492,0xad55ad55,0x9492ad55,0x50209492,0xb5965000,0xad55ce79,0xb596b596,0x7bcfb596, +0x9cd34208,0x8c518c51,0x00004a69,0x00009cd3,0x9cd34208,0x00004a69,0x4a698c51,0x9cd30000,0x9cd33186,0x8c518c51,0x31864a69,0x31869cd3,0x9cd33186,0x31864a69,0x4a698c51,0x9cd33186,0x90828061,0x9965b1c6,0x90c290c3,0x88a290a3,0x88818882,0x808288a2,0x88c28882,0x888288a2,0x90a288a2,0xcb0c9082,0x80819924,0x68007000,0xf77ed6ba,0xef7ef79e,0xe75eef5d,0xb5b7d67a, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xc6184a49,0xef5dc618,0xef5de8e3,0xef5def5d,0xef5def5d,0xef5def5d,0xc618ef5d,0x4a49c618,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83280000,0x6b4da534,0x83686ac7,0x8b87ac4a,0x8b878b87,0x6ac76265,0xa5346b4d,0x00008328,0x89248924,0xb1859144,0x81249144,0x99449144,0x81249144,0x99449944,0x99448924,0x99449144,0xcaefd310,0xe4d5d391,0xcaaed391,0xd3b2d391,0xcaaed391,0xd3d2d3b2,0xd3b1cb0f,0xd3d2d371,0xa5148410,0xad55ad55,0x9492ad55,0x7bcf8410,0x84107bcf,0xad55c638,0xa514a514,0x84309cf3, +0x00004a69,0x4a698c51,0x00004a69,0x4a690000,0x31869cd3,0x4a699cd3,0x4a699cd3,0x00009cd3,0x31864a69,0x4a698c51,0x31864a69,0x4a693186,0x31869cd3,0x4a699cd3,0x4a699cd3,0x31869cd3,0x98e38041,0xb1a7b1e7,0x990498e4,0x90a398e3,0x88a388c3,0x80818862,0x808280c2,0x88a288a3,0x888288a1,0xc2ca9082,0x80a2a125,0x68007841,0xf7bed6bb,0xf79effbe,0xef5def5d,0xb596d69a, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xc6184a49,0xef5def5d,0xef5def5d,0xef5def5d,0xef5de8e3,0xef5def5d,0xef5de8e3,0x4a49c618,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0xa165a965,0xa1659144,0xa965a985,0x81248924,0xa1659944,0x91449944,0xa985a985,0x89249144,0xdc13dc54,0xdc33d391,0xdc94dc94,0xcaaecaef,0xdc33d3b2,0xd330d3b1,0xdc94dc94,0xcaefd350,0xb5968430,0xa514b596,0xa514a514,0x94929492,0x94929492,0xb596b596,0xb596b596,0x7bcfb596, +0x00004a69,0x8c510000,0x00009cd3,0x4a699cd3,0x9cd38c51,0x00000000,0x9cd30000,0x00004208,0x31864a69,0x8c513186,0x31869cd3,0x4a699cd3,0x9cd38c51,0x31863186,0x9cd33186,0x31863186,0x98838040,0xa965a966,0xa1459904,0xa145a965,0xa145a965,0x99049925,0x99049904,0x99259924,0x90e39945,0xbaaa9082,0x9103b208,0x70007841,0xffffd6ba,0xffbfffff,0xf75def3d,0xa514ce39, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xc6184a49,0xe8e3c618,0xef5def5d,0xef5def5d,0xef5def5d,0xef5de8e3,0xc618ef5d,0x4a49c618,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0x9944a165,0xb185a965,0x99449944,0xb185a165,0x99659144,0xb185b185,0x9944a165,0xb185b9a5,0xd3b2dc33,0xe4d5dc94,0xd3b2d3d2,0xe4d5dc13,0xd3f2d391,0xe4d5e4d5,0xd3b2dc33,0xe4d5e557,0xb5968430,0xad55ad55,0x9cf3ad55,0xb596ad55,0xad55ad55,0xa514a514,0xa514a514,0x8430a514, +0x00009cd3,0x00009cd3,0x9cd30000,0x000052aa,0x00008c51,0x31864a69,0x4a699cd3,0x00009cd3,0x31869cd3,0x31869cd3,0x9cd33186,0x318652aa,0x31868c51,0x31864a69,0x4a699cd3,0x31869cd3,0x90628041,0xa9a6a985,0xa9a6a9a6,0xb1a6a9a6,0xa986a986,0xa145a965,0xb186a966,0xb186b1a6,0xa985a986,0xc2aa90a3,0x9925b208,0x70008041,0xffdfce59,0xffdfffff,0xe73cf79e,0x9cf4bdd7, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x4a490000,0xc6184a49,0xef5dc618,0xef5de8e3,0xef5def5d,0xc618ef5d,0x4a49c618,0x00004a49,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x52050000,0x6b4da534,0x520541c4,0x62656265,0x62656265,0x41a449e4,0xa5346b4d,0x00005205,0xb185b185,0xa1659944,0xb185b185,0x9944a165,0xb185a965,0xa965a965,0xb985b185,0xa965a965,0xe4d5dcd5,0xdc13d3d2,0xe4d5e4f6,0xd3d2dc33,0xe4d5dc74,0xdc74dc74,0xe536e516,0xdc54dc74,0x9cf38430,0xa514a514,0xa5149cf3,0xa514a514,0xa514b596,0xad55ad55,0xb596ad55,0x8430ad55, +0x9cd30000,0x42080000,0x00009cd3,0x00009cd3,0x00009cd3,0x42089cd3,0x9cd30000,0x9cd34a69,0x9cd33186,0x31863186,0x31869cd3,0x31869cd3,0x31869cd3,0x31869cd3,0x9cd33186,0x9cd34a69,0x88618041,0xb1a6a945,0xa986a986,0xb186b1c6,0xa145a986,0xa965a145,0xb1c7b1c7,0xb1e7b1c7,0xa9a6b1e7,0xba6a90c2,0xa124b208,0x68007821,0xf79ec658,0xffffffff,0xd67af79f,0xa4f3b595, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x4a490000,0xc6184a49,0xc618c618,0xc618c618,0x4a49c618,0x00004a49,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83280000,0x6b4da534,0x72e65a66,0xa409a409,0xac4aac4a,0x6aa78368,0xa5346b4d,0x00008328,0xa965a165,0xb9a5b985,0xa965b185,0x99449965,0x89249144,0x99449944,0x89248124,0xa1659944,0xdc54dc33,0xe557e536,0xdc74dcd5,0xd3d2d3f2,0xcb0fd371,0xd3d2d3b1,0xd310ca8e,0xdc13d3b2,0xad558430,0xb596b596,0xb596b596,0xb596b596,0xb596a514,0xb596b596,0xad559cf3,0x8410ad55, +0x8c519cd3,0x4a698c51,0x9cd33186,0x31860000,0x9cd30000,0x4a698c51,0x00000000,0x8c510000,0x8c519cd3,0x4a698c51,0x9cd33186,0x31863186,0x9cd33186,0x4a698c51,0x31863186,0x8c513186,0x80418041,0x90a28882,0x90a290a2,0x98a390a2,0x88629882,0x98a38841,0xa0e3a0c3,0xa0e4a0a3,0x98c2a104,0x99248821,0x88619944,0x70208021,0xd69ac639,0xf7bee75d,0xbd96d6ba,0x9d34b555, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x4a490000,0x4a494a49,0x4a494a49,0x00004a49,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0x99449144,0x91449144,0xa985a165,0x99449144,0xa965a965,0x91448924,0xa165a165,0x89249144,0xd3b2d391,0xd371d350,0xdc94dc13,0xd3b1d391,0xdc74dc54,0xd350caef,0xdc33dc33,0xcb0fd350,0x84108430,0x84108410,0x84308410,0x94929492,0x94927bcf,0x84108430,0x84108410,0x84308410, +0x9cd30000,0x4a690000,0x9cd30000,0x00004a69,0x00009cd3,0x4a699cd3,0x9cd30000,0x9cd30000,0x9cd33186,0x4a693186,0x9cd33186,0x31864a69,0x31869cd3,0x4a699cd3,0x9cd33186,0x9cd33186,0x80418041,0x88618061,0x80418021,0x90618861,0x80418881,0x80418021,0x88618041,0x80618862,0x78408041,0x90e48040,0x88a290e3,0x70008041,0xad75b595,0xce38be17,0x9d13b596,0xb5959cf3, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x41a449e4,0xa5346b4d,0x00008328,0x10821082,0x18c320e3,0x18a21082,0x20e320e3,0x18a218a2,0x20e318c3,0x10821082,0x20e320e3,0x39e739c7,0x42084a49,0x39e739e7,0x4a494a49,0x39e74208,0x4a494228,0x39e739e7,0x4a494228,0x00000000,0x00000000,0x00000000,0x62860000,0x00003142,0x00000000,0x00000000,0x00000000, +0x28e128c1,0x10403922,0x28e128c0,0x104028e1,0x310128e1,0x082028e1,0x28e128e1,0x392228c1,0xef5cef3c,0x39e7ef5c,0xdefadefa,0xef5ce6fb,0xef7def5c,0xe6fad69a,0xffffdeba,0xf77cffff,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0xa2c1d3e2,0xd3e2a2c1,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0xa2c1d3e2,0xd3e2a2c1,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1, +0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0xa2c1d3e2,0xd3e2a2c1,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x62650000,0x62656265,0x6aa78b87,0xa5346b4d,0x83285205,0x20e320e3,0x18a218a2,0x18c320e3,0x18c318c3,0x20e32104,0x10821082,0x18c318c3,0x108218a2,0x4a494a49,0x42084208,0x42084a49,0x42284228,0x42284a69,0x39e739e7,0x42284208,0x39e739e7,0x00000000,0x00000000,0x00000000,0x9bc90000,0x00003963,0x00000000,0x00000000,0x00000000, +0x28e11020,0x104049a3,0x39223101,0x10401880,0x28e14982,0x102051a3,0x392228c1,0x28e11040,0x39e718c3,0xef5c31e7,0xffffef5c,0xffffffff,0xdefaef3c,0x39e739c7,0xdefbbd96,0x18a31903,0xd3e2a2c1,0xd3e2e483,0xe483a2c1,0xa2c1e483,0xe529a2c1,0xa2c1e483,0xe483a2c1,0xa2c1e483,0xd3e2a2c1,0xd3e2e483,0xe483a2c1,0xa2c1e483,0xe529a2c1,0xa2c1e483,0xe483a2c1,0xa2c1e483, +0xd3e2a2c1,0xd3e2e483,0xe483a2c1,0xa2c1e483,0xe529a2c1,0xa2c1e483,0xe483a2c1,0xa2c1e483,0xd6ba0000,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0x0000d6ba,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2840000,0xa284a284,0xa284a284,0xa284a284,0xa284a284,0xa284a284,0xa284a284,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x5a2441a4,0x83286265,0x8b878b87,0x00000000,0x6b4d41a4,0xa534a534,0x18c318c3,0x210420e3,0x18c320e3,0x18a218c3,0x18a21061,0x20e318c3,0x18a218a2,0x210420e3,0x42284228,0x4a694a49,0x42284a49,0x42084208,0x420831a6,0x4a494228,0x42084208,0x4a494a49,0x00000000,0x00000000,0x00000000,0x62860000,0x00003983,0x00000000,0x00000000,0x00000000, +0x31011040,0x310128c1,0x392228e1,0x31011880,0x28c13101,0x104028e1,0x498230e1,0x102051c3,0xdeda39e7,0xef9bd6fa,0xef5bef5c,0xb595e77d,0xef7cdeda,0xef3cef3c,0x39c841c7,0x18c218e3,0xa2c1a2c1,0xd3e2e483,0xe483a2c1,0xa2c1e483,0xe483d3e2,0xd3e2e483,0xe529a2c1,0xa2c1e483,0xa2c1a2c1,0x2800a2c1,0xe483a2c1,0xa2c14080,0xe483a2c1,0x4080e483,0xe529a2c1,0xa2c1a2c1, +0xa2c1a2c1,0x4800a2c1,0xe483e4c2,0xe4c2cea8,0xe483a2c1,0xc667f6e6,0xe529a2c1,0xa2c1a2c1,0xdefb0000,0xe8e3ef5d,0xef5def5d,0xef5def5d,0xef5def5d,0xef5def5d,0xef5def5d,0x0000defb,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2840000,0xbae4bae4,0xbae4bae4,0xa284bae4,0xbae4bae4,0xbae4a284,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83280000,0x6b4da534,0x83685a66,0x00008b87,0x00000000,0x62650000,0x6aa76265,0x6b4d6b4d,0x18a218a2,0x10611061,0x20e320e3,0x10611082,0x18c318a2,0x18c318c3,0x21042104,0x106118c3,0x39e739e7,0x39c731a6,0x4a494a49,0x31a639c7,0x42284208,0x42284208,0x4a694a69,0x39c74228,0x00000000,0x00000000,0x00000000,0x93a90000,0x00003963,0x00000000,0x00000000,0x00000000, +0x51a31020,0x28e11020,0x51a33101,0x30e10820,0x28c11040,0x104049a3,0x28c030e1,0x51a31040,0xffffe75d,0xef5dffff,0xdedad6da,0xef5cd71a,0xe75bef5c,0xef3cef5d,0xef5cef3c,0x420739e7,0xa2c1a2c1,0xe483e483,0xe529a2c1,0xa2c1e483,0xe483d3e2,0xe483e483,0xe529a2c1,0xa2c1e483,0xa2c1a2c1,0x2800a2c1,0xa2c14080,0x40804080,0x4080a2c1,0x40804080,0x4080a2c1,0xa2c14080, +0xa2c1a2c1,0x4800e4c2,0xe4c2c647,0xd728cee8,0xd728e4c2,0xcea8cee8,0xbde7a2c1,0xeda2bd86,0xdefb0000,0xef5def5d,0xef5def5d,0xef5def5d,0xe8e3e8e3,0xdefbdefb,0xef5ddefb,0x0000defb,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2840000,0xa284bae4,0xa284bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83280000,0xa5345205,0x00006b4d,0x00000000,0x00000000,0x83286265,0x00008b87,0x6aa741a4,0x10821082,0x18c318c3,0x18a218a2,0x18c318c3,0x10821082,0x18c31082,0x10611061,0x18c318a2,0x39e739c7,0x42284228,0x39e739e7,0x42284228,0x39e739e7,0x422839e7,0x31a631a6,0x422839e7,0x00000000,0x00000000,0x00000000,0x9bea0000,0x00004184,0x00000000,0x00000000,0x00000000, +0x39221040,0x28e11040,0x51a33102,0x51a31040,0x28c10820,0x104051c3,0x49a33101,0x51c31040,0xef5cef5c,0xe77ce73c,0xbdb6ef5c,0xb5d6b5d6,0xef5cef5c,0xdefad71a,0xb596b5d6,0xdefbdeda,0xa2c1a2c1,0xe483e483,0xe529a2c1,0xa2c1e483,0xe483d3e2,0xe483d3e2,0xe529a2c1,0xa2c1e483,0xa2c1a2c1,0x40802800,0x40804080,0x40804080,0x40804080,0x40804080,0x40804080,0xa2c14080, +0xa2c1a2c1,0xc6074800,0xcec8c667,0xdf68d728,0xdf68df89,0xcec8d728,0xc607c667,0xeda2bda6,0xdefb0000,0xdefbef5d,0xef5ddefb,0xef5def5d,0xe8e3e9a6,0xef5ddefb,0xef5ddefb,0x0000defb,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2840000,0xbae4bae4,0xbae4bae4,0xbae4a284,0xbae4a284,0xbae4bae4,0xbae4a284,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0xa5340000,0x00006b4d,0x00000000,0x62650000,0x8b878328,0x00000000,0x83685a24,0x20e320e3,0x18c318c3,0x20e32104,0x18c318c3,0x20e320e3,0x18c318a2,0x18a218c3,0x18a21082,0x4a494a49,0x42284228,0x4a494a69,0x42284228,0x42284a49,0x42084208,0x42084228,0x420839c7,0x00000000,0x00000000,0x00000000,0x93a80000,0x000041a4,0x00000000,0x00000000,0x00000000, +0x39221060,0x30e11040,0x49a328e1,0x28c01020,0x28c11040,0x104051c3,0x51c330e1,0x49a31040,0xef9cb5d6,0xdedadeb9,0xb5b6deda,0xef7cef7c,0xef5bef7c,0xffffffff,0xe71cef5c,0xef5dffff,0xd3e2a2c1,0xe483e483,0xd3e2a2c1,0xa2c1e483,0xe483a2c1,0xe483e483,0xe483a2c1,0xa2c1d3e2,0xd3e2a2c1,0x28002800,0x28002800,0x28004080,0x40802800,0x28002800,0x28004080,0xa2c1a2c1, +0xf7c5a2c1,0x48004800,0x48004800,0x4800d728,0xdf894800,0x48004800,0x4800ce67,0xa2c1eda2,0xdefb0000,0xdefbef5d,0xef5def5d,0xdefbd6ba,0xef5def5d,0xef5def5d,0xef5ddefb,0x0000defb,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2840000,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4a284,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x6b4da534,0x00000000,0x83286265,0x00008328,0x62650000,0x00008328,0x18a21082,0x20e318a2,0x10611061,0x18c318a2,0x18c31082,0x21042104,0x18c318a2,0x21042104,0x420839e7,0x422839e7,0x39c731a6,0x42284208,0x422839e7,0x4a694a69,0x42284208,0x4a494a69,0x00000000,0x00000000,0x00000000,0x93880000,0x00003963,0x00000000,0x00000000,0x00000000, +0x51c328e1,0x28e11860,0x49823101,0x30e11040,0x102030e1,0x104049a3,0x49a33101,0x39221040,0xe73cef7b,0xe75cef5c,0xdedadeda,0xdedab5d6,0xded9b5d6,0xef5cd6da,0xef7bef9d,0xef3cf75d,0xd3e2a2c1,0xe483e483,0xd3e2a2c1,0xd3e2e483,0xe483a2c1,0xe483e483,0xe483a2c1,0xa2c1d3e2,0xd3e2a2c1,0x2800a2c1,0x2800a2c1,0xa2c1a2c1,0xa2c12800,0x2800a2c1,0x2800a2c1,0xa2c1d3e2, +0xf684a2c1,0x4800eda2,0x4800eda2,0xeda2eda2,0xeda24800,0x4800eda2,0x4800eda2,0xa2c1f7c5,0xdefb0000,0xdefbef5d,0xef5de8e3,0xef5def5d,0xdefbef5d,0xe8e3ef5d,0xef5de8e3,0x0000defb,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2840000,0xbae4a284,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xa284bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x6b4da534,0x62650000,0x8b878368,0x00000000,0x62650000,0x00008328,0x18c318c3,0x10821082,0x18c320e3,0x18a21082,0x18a21082,0x10611082,0x18a218a2,0x10821082,0x42284228,0x39e739c7,0x42284a49,0x39e739e7,0x420839e7,0x39c739e7,0x42084208,0x39c739c7,0x00000000,0x00000000,0x00000000,0x7b070000,0x000049e4,0x00000000,0x00000000,0x00000000, +0x51a328e1,0x31021040,0x10404982,0x104028e1,0x104028e1,0x10404982,0x31013101,0x39221040,0xdefade9a,0xffffde9a,0xef7cffff,0xfffff75c,0xef7ceefb,0xef1cf77c,0xef9ce75c,0xdefad6da,0xe483a2c1,0xe483e483,0xd3e2a2c1,0xd3e2e483,0xe483a2c1,0xd3e2e483,0xe483a2c1,0xa2c1d3e2,0xe483a2c1,0xe483e483,0xa2c1a2c1,0xd3e2a2c1,0xa2c1a2c1,0xa2c1a2c1,0xa2c1a2c1,0xa2c1d3e2, +0xe483a2c1,0xffe7f6e6,0xeda2e4c2,0xd3e2e4c2,0xe4c2eda2,0xeda2e4c2,0xeda2e4c2,0xa2c1f684,0xdefb0000,0xdefbef5d,0xdefbef5d,0xe8e3ef5d,0xdefbe8e3,0xe9a6defb,0xef5de8e3,0x0000defb,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2840000,0xbae4bae4,0xbae4a284,0xbae4a284,0xbae4bae4,0xa284bae4,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0xa5340000,0x5a666b4d,0x00008b87,0x00000000,0x62650000,0x00008b87,0x18a218a2,0x21042104,0x18c318c3,0x20e320e3,0x10821082,0x20e318c3,0x18c318c3,0x20e320e3,0x39e739e7,0x4a694a49,0x42284228,0x4a494a49,0x39e739e7,0x4a494228,0x42284228,0x4a494a49,0x00000000,0x00000000,0x00000000,0x48000000,0x00002800,0x00000000,0x00000000,0x00000000, +0x51a33101,0x31011040,0x104051c3,0x104051a3,0x102051a3,0x18803922,0x392228e1,0x31011040,0xbd96e75c,0xef5bffff,0xdefaef3c,0xe75cdeda,0xbdd6ffff,0xef7ce75c,0xdedaffff,0xd6bbdefa,0xe483a2c1,0xe483e483,0xe483a2c1,0xe483e483,0xe483a2c1,0xa2c1e483,0xe483d3e2,0xa2c1a2c1,0xe483a2c1,0xa2c1e483,0x40804080,0xa2c1a2c1,0xa2c1a2c1,0x40804080,0x40804080,0xa2c1a2c1, +0xe483a2c1,0xa2c1e483,0xc667c607,0xe4c2a2c1,0xa2c1e4c2,0xc667cea8,0xbdc6c607,0xa2c1a2c1,0xdefb0000,0xef5de8e3,0xdefbef5d,0xe9a6ef5d,0xd6bae8e3,0xef5ddefb,0xef5def5d,0x0000defb,0x92430000,0x92439243,0x92439243,0x92439243,0x92439243,0x92439243,0x92439243,0x00009243,0x92430000,0x60a060a0,0x60a060a0,0x60a060a0,0x60a060a0,0x60a060a0,0x60a060a0,0x00009243, +0xa2840000,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4a284,0xbae4bae4,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x52050000,0x6b4da534,0x00000000,0x00000000,0x83286265,0x00000000,0x21042104,0x18c320e3,0x18a218a2,0x18c318a2,0x210420e3,0x18a218c3,0x21042104,0x18c318c3,0x4a694a49,0x42284228,0x42084208,0x42084208,0x4a694228,0x42084228,0x4a694a69,0x42084228,0x00000000,0x00000000,0x00000000,0x50000000,0x00004800,0x00000000,0x00000000,0x00000000, +0x392228e1,0x31011880,0x28c049a3,0x104028e1,0x10404982,0x20a03922,0x39220820,0x31011040,0xe6d939e7,0xe73cdeb9,0xbdd6ef5c,0xdebaef3b,0xdedad6fa,0xef3cef5c,0xef3cb596,0xef5cef3c,0xe529a2c1,0xe483e483,0xe529a2c1,0xe483e483,0xe483a2c1,0xa2c1d3e2,0xe483d3e2,0xa2c1a2c1,0xe529a2c1,0x2800a2c1,0x40804080,0xa2c14080,0x2800a2c1,0x40804080,0x40804080,0xa2c1a2c1, +0xe529a2c1,0x4800a2c1,0xc607bdc7,0xa2c1c647,0x4800eda2,0xc607c647,0xbd86bdc7,0xa2c1eda2,0xdefb0000,0xef5def5d,0xd6baef5d,0xef5def5d,0xef5def5d,0xef5de8e3,0xef5ddefb,0x0000defb,0x92430000,0xbae4bae4,0xbae4bae4,0xa284bae4,0xbae4bae4,0xbae4bae4,0xbae4a284,0x00009243,0x92430000,0x81208120,0x81208120,0x71008120,0x81208120,0x81208120,0x81207100,0x00009243, +0xa2840000,0xbae4bae4,0xa284bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xa284bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x83280000,0xa5345205,0x6b4d6b4d,0x00000000,0x8b8749e4,0x00000000,0x10611082,0x20e31082,0x10611082,0x18a21082,0x10611082,0x18a218a2,0x10821061,0x18a21082,0x31a639c7,0x4a4939e7,0x31a639e7,0x39e739e7,0x31a639e7,0x420839e7,0x39e739c7,0x39e739e7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x28c13101,0x28e13101,0x28e151a3,0x30e128e1,0x10403101,0x498228e1,0x39221040,0x28e11040,0x420739c7,0xffffef7c,0xf75cffff,0xffffef5c,0xef5cffff,0xffffffff,0x39c7ef5c,0x18e218c3,0xe529a2c1,0xd3e2e483,0xe529a2c1,0xe483e483,0xe483a2c1,0xa2c1d3e2,0xe483e529,0xa2c1d3e2,0xe529a2c1,0x2800a2c1,0x40804080,0xa2c14080,0x2800a2c1,0x40804080,0xa2c14080,0xa2c1d3e2, +0xe529a2c1,0x4800a2c1,0xbdc6bd86,0xa2c1bde7,0x4800eda2,0xbdc6bde7,0xeda2bd86,0xa2c1f684,0xdefb0000,0xe8e3ef5d,0xef5de8e3,0xef5def5d,0xef5dd6ba,0xdefbef5d,0xef5def5d,0x0000defb,0x92430000,0xbae4aac4,0xaac4bae4,0xbae4aac4,0xaac4bae4,0xbae4aac4,0xaac4bae4,0x00009243,0x92430000,0x81207900,0x79008120,0x81207900,0x79008120,0x81207900,0x79008120,0x00009243, +0xa2840000,0xa284bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xa284bae4,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0xa534a534,0x6b4d6b4d,0x5a6641a4,0x00000000,0x18a218c3,0x18a21082,0x18c318c3,0x10611061,0x18c31082,0x10821082,0x18c318c3,0x10611082,0x42084228,0x420839e7,0x42284228,0x31a639c7,0x420839e7,0x39c739e7,0x42284228,0x39c739c7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x104030e1,0x28e13101,0x39223922,0x28e13101,0x10403101,0x51a330e1,0x51a31040,0x39221040,0xef5cef3c,0xb5b6b5b6,0x39c6df1a,0x20c439c7,0xe75c39e7,0xd6fadeda,0xe6badeda,0xdeba41e7,0xd3e2a2c1,0xd3e2e483,0xe529a2c1,0xe483d3e2,0xe483a2c1,0xa2c1d3e2,0xe483e529,0xa2c1d3e2,0xd3e2a2c1,0x2800a2c1,0x40804080,0xa2c14080,0x2800a2c1,0x40804080,0xa2c12800,0xa2c1d3e2, +0xd3e2a2c1,0x4800eda2,0xb566b546,0xeda2bd86,0x4800eda2,0xb566bd86,0xeda24800,0xa2c1d3e2,0xdefb0000,0xe9a6ef5d,0xef5de8e3,0xef5def5d,0xe8e3ef5d,0xef5dd6ba,0xef5def5d,0x0000defb,0x92430000,0xa284a284,0xa284aac4,0xa284a284,0xa284aac4,0xa284a284,0xa284aac4,0x00009243,0x92430000,0x79007900,0x71007900,0x60a060a0,0x60a060a0,0x710060a0,0x79007900,0x00009243, +0xa2840000,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4a284,0xbae4bae4,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xa534a534,0x6b4d6b4d,0x6b4d6b4d,0x18a218a2,0x20e318c3,0x18a218a2,0x20e318a2,0x18a21082,0x20e320e3,0x18a218a2,0x20e32104,0x39e74208,0x4a494228,0x39e74208,0x4a494208,0x420839e7,0x4a494a49,0x39e74208,0x4a494a69,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x10603101,0x104028c1,0x39223922,0x28e11040,0x104051a3,0x51a328e1,0x51c31040,0x39221040,0xffffef5c,0xb5d6e77c,0x10c241e7,0x39a720c4,0xf75cef3c,0xef9cef3c,0xef7cef7c,0xef5cdeda,0xd3e2a2c1,0xd3e2e483,0xe483a2c1,0xe529d3e2,0xe529a2c1,0xa2c1e483,0xe483e529,0xa2c1d3e2,0xd3e2a2c1,0xa2c1e483,0x40802800,0xe5292800,0x2800a2c1,0x28002800,0xe483a2c1,0xa2c1d3e2, +0xd3e2a2c1,0xe4c2f6e6,0xb5064800,0xfff24800,0x4800eda2,0x48004800,0xf6e6eda2,0xa2c1d3e2,0xdefb0000,0xdefbef5d,0xd6badefb,0xdefbdefb,0xdefbdefb,0xdefbef5d,0xef5ddefb,0x0000defb,0xc6180000,0xa284c618,0xc618a284,0xa284c618,0xc618a284,0xa284c618,0xc618a284,0x0000c618,0x92430000,0x60a060a0,0x60a060a0,0x79008120,0x81208120,0x60a060a0,0x60a060a0,0x00009243, +0xa2840000,0xbae4bae4,0xbae4a284,0xa284bae4,0xbae4bae4,0xbae4a284,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x52050000,0xa534a534,0xa534a534,0x20e320e3,0x18a218a2,0x20e320e3,0x18a218c3,0x20e318c3,0x18c318c3,0x210420e3,0x18c318c3,0x4a494228,0x42084208,0x4a494a49,0x42084208,0x4a494228,0x42284228,0x4a494a49,0x42284228,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x28c11020,0x104028c0,0x51a328e1,0x28e11040,0x104051a3,0x392228e1,0x39221880,0x51a31880,0xef9cd6db,0xef7ce73c,0xe6daef5c,0xdebaef7c,0xdebbdeda,0xb5b6e77c,0xe75cef5c,0xdedadeba,0xd3e2a2c1,0xa2c1e483,0xe483a2c1,0xe483e483,0xe529a2c1,0xa2c1e483,0xe483e483,0xa2c1e483,0xd3e2a2c1,0xa2c1e483,0x28002800,0xe483e483,0xe529a2c1,0xa2c12800,0xe483e483,0xa2c1e483, +0xd3e2a2c1,0xeda2e483,0x48004800,0xf6e6ffe7,0xfff2e4c2,0xeda24800,0xe483f6e6,0xa2c1e483,0xdefb0000,0xef5def5d,0xef5def5d,0xef5def5d,0xef5def5d,0xef5def5d,0xef5de8e3,0x0000defb,0xc6180000,0xc618ef5d,0xdefbc618,0xc618ef5d,0xdefbc618,0xc618ef5d,0xdefbc618,0x0000c618,0x92430000,0x81207900,0x79008120,0x81207900,0x79007900,0x81208120,0x79008120,0x00009243, +0xa2840000,0xa284bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4a284,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x83280000,0x00008b87,0x00000000,0x18c318a2,0x21042104,0x18c320e3,0x18a218a2,0x10821082,0x18a21082,0x10821061,0x18a218a2,0x42284208,0x4a694a49,0x42284228,0x42084208,0x39c739e7,0x420839e7,0x39c731a6,0x420839e7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x28c11040,0x08203102,0x51a31040,0x28e11040,0x104051a3,0x51a328e1,0x39221880,0x49a31880,0xe75cf77c,0xdebadeda,0xe77cde9a,0xef1ce75c,0xef7be77c,0xef7ce75c,0xef5cef7b,0xef5cf75b,0xe529a2c1,0xa2c1e483,0xe483d3e2,0xd3e2e483,0xe483a2c1,0xa2c1e483,0xe483d3e2,0xa2c1e483,0xe529a2c1,0xa2c1e483,0xe483d3e2,0xd3e2e483,0xe483a2c1,0xa2c1e483,0xe483d3e2,0xa2c1e483, +0xe529a2c1,0xe4c2e483,0xffe7f7c5,0xd3e2f6e6,0xf6e6a2c1,0xe4c2ffe7,0xe483d3e2,0xa2c1e483,0xd6ba0000,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0x0000d6ba,0xc6180000,0xef5def5d,0xef5def5d,0xef5def5d,0xef5def5d,0xef5def5d,0xef5def5d,0x0000c618,0x92430000,0xef5d7900,0x79007900,0x79007900,0x79007900,0x79007900,0x79007900,0x00009243, +0xa2840000,0xa284a284,0xa284a284,0xa284a284,0xa284a284,0xa284a284,0xa284a284,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x18a21082,0x10821082,0x18c318a2,0x10821082,0x18c318c3,0x10821061,0x18c318c3,0x10821082,0x39e739e7,0x39e739c7,0x42284208,0x39e739e7,0x42284228,0x39c739c7,0x42084208,0x39c739c7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x28e11860,0x51c33101,0x31011040,0x104049a3,0x28e128e1,0x392228e1,0x39223101,0x51c328e1,0xef7bb5b6,0xef7cef5c,0xbdd6ef7c,0xdefaef5c,0xe75ce6da,0xffffffff,0xef3cffff,0xb5b5ef7c,0xa2c1a2c1,0xa2c1d3e2,0xd3e2a2c1,0xa2c1d3e2,0xd3e2a2c1,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0xa2c1a2c1,0xa2c1d3e2,0xd3e2a2c1,0xa2c1d3e2,0xd3e2a2c1,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1, +0xa2c1a2c1,0xa2c1d3e2,0xf684e4c2,0xa2c1d3e2,0xd3e2a2c1,0xa2c1e4c2,0xd3e2d3e2,0xa2c1a2c1,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xc6180000,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0x0000c618,0xc6180000,0xdefbdefb,0xdefbdefb,0x7900defb,0x60a060a0,0xdefbdefb,0xdefbdefb,0x0000c618, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x00000000,0x00000000,0x00000000,0x93a80000,0x00006286,0x00000000,0x00000000,0x00000000,0x51e37ac5,0x59e351e3,0x51c351c3,0x51c359e3,0x51e351e3,0x51c351e3,0x51c349a3,0x51e351c3,0x7bcf8430,0x73ae73ae,0x73ae738e,0x73ae73ae,0x73ae73ae,0x738e73ae,0x738e738e,0x738e738e,0x00000000,0x00000000,0x00000000,0x62860000,0x00003142,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa2c1a2c1,0xd3e2a2c1,0xd3e2a2c1,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0x69a669c7,0x38e34820,0x184158e2,0x38412882,0xab8ba2cb,0x92884924,0x38e338c3,0x514538e3, +0x5a27836b,0x72c96a88,0x7b2b5a27,0x392349a5,0x31023923,0x49c65a27,0x31023102,0x8b8c834b,0x49c27369,0x49c249c2,0x49c249c2,0x73697369,0x73697369,0x49c27369,0x49c249c2,0x49c249c2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x7b070000,0x00006aa6,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x8b468b46,0x93678b46,0x8b469367,0x93679367,0x8b468b46,0x93679367,0x72249367,0x94b294b2,0x94b294b2,0x94b29492,0x94929492,0x949294b2,0x94929492,0x94929492,0x73ae9492,0x00000000,0x00000000,0x00000000,0x9bc90000,0x00003963,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe483a2c1,0xd3e2e483,0xe483a2c1,0xa2c1d3e2,0xe483d3e2,0xa2c1e483,0xe483d3e2,0xa2c1e483,0x92aa69a6,0xab2c2041,0x69c75820,0x38415820,0x38414924,0x6841ab8b,0x8a4992cb,0x30c328a2, +0x5a4751e6,0x3102836b,0x41a549e6,0x31238b8c,0x7b0a4184,0x5a275a47,0x41644164,0x7b2a49c5,0x7ac57369,0xc4687ac5,0x7ac57ac5,0x736949c2,0x49c249c2,0x7ac57369,0x7ac57ac5,0x49c27ac5,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x7b070000,0x00006aa6,0x00000000,0x00000000,0x00000000,0x8b46aca9,0xa4497ac5,0xa449a449,0xa408a449,0xa4489367,0xa408a448,0xa408a408,0x72248b46,0x949294b2,0x9cf38c71,0x9cd39cf3,0x9cd39cd3,0x9cd394b2,0x9cd39cd3,0x9cd39cd3,0x73ae9492,0x00000000,0x00000000,0x00000000,0x62860000,0x00003983,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe483d3e2,0xe483e529,0xd3e2a2c1,0xa2c1d3e2,0xe483e529,0xa2c1d3e2,0xe483e483,0xd3e2a2c1,0x8269cbcf,0xcbae6186,0xaaeb7861,0x184159a6,0x988261c7,0x5820b34d,0x58209aeb,0x30c37a08, +0x8b8c4164,0x31236247,0x31023102,0x416472c9,0x7b2a5a27,0x41a5834b,0x418449a5,0x41844184,0xfdeb7369,0xffffc468,0x49c2feb3,0x49c27369,0x49c2c468,0xfdeb7369,0xffffc468,0x49c2c468,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x6ac70000,0x00003963,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x936782c5,0x8b469367,0xa4089367,0x8b467a84,0x8b468b46,0x93878b46,0x72249367,0x949294b2,0x94b28c71,0x949294b2,0x9cd394b2,0x94b28c71,0x94929492,0x94b294b2,0x7bef94b2,0x00000000,0x00000000,0x00000000,0x93a90000,0x00003963,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3e2d3e2,0xe483d3e2,0xa2c1e483,0xa2c1e483,0xe483e529,0xe483a2c1,0xa2c1e483,0xd3e2e483,0xa2cbc38e,0x30c32882,0x18412882,0x582061c7,0x18414124,0x7041c38e,0x71e78a69,0x59a68a87, +0x72c93102,0x72c93102,0x62683103,0x41846247,0x5a274184,0x6ac949a5,0x5a476267,0x51e649c5,0x73697369,0xc468fdeb,0x736949c2,0x7ac549c2,0x7369ffff,0x736949c2,0xc468fdeb,0x49c27ac5,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x6ac70000,0x00003963,0x00000000,0x00000000,0x00000000,0x72a56b6d,0x7ac56244,0x72a572a5,0x938772a5,0x7ac56244,0x7ac57ac5,0x936672a5,0x51e372a5,0x94928410,0x94928c51,0x8c719492,0x94b28c71,0x94928c51,0x8c718c71,0x94b28c71,0x7bcf8c71,0x00000000,0x00000000,0x00000000,0x9bea0000,0x00004184,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa2c1a2c1,0xe483d3e2,0xa2c1e483,0xa2c1e483,0xd3e2e483,0xe483d3e2,0xd3e2a2c1,0xa2c1e483,0x384159a6,0x8269ab2c,0x18416186,0x58208a69,0x71e79aeb,0x30412882,0x4924bb6d,0x30c33841, +0x62685206,0x7b2a3943,0x31026268,0x49c56247,0x39436268,0x6aa993cd,0x6aa96247,0x49a58bac,0x49c27369,0x7ac57369,0x736949c2,0xfdebfdeb,0x49c27369,0x49c27ac5,0x7ac57369,0x73697369,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x62860000,0x00003963,0x00000000,0x00000000,0x00000000,0x8b4631a6,0x8b4682a5,0x93679367,0xa4088b46,0x8b467a84,0x8b468b46,0xa4488b46,0x6a038b46,0x9cd34a69,0x9cd394b2,0x9cd39cf3,0x9cf39cd3,0x94b28c71,0x94b294b2,0x9cf394b2,0x7bef94b2,0x00000000,0x00000000,0x00000000,0x93a80000,0x000041a4,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe483a2c1,0xa2c1d3e2,0xa2c1a2c1,0xa2c1e529,0xa2c1e483,0xd3e2e529,0xe483a2c1,0xd3e2e529,0x78614924,0x8a69ab4a,0x104171e7,0x6841a2cb,0x71e78a69,0x18417a08,0x492461a6,0x79e77041, +0x41844184,0x72e96aa9,0x31023102,0x418472e9,0x6aa949a5,0x5a476aa9,0x31026268,0x6aa93102,0x7ac57ac5,0x736949c2,0x73697369,0x73697369,0x7ac549c2,0x7ac5c468,0x736949c2,0x736949c2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x7b070000,0x000049e4,0x00000000,0x00000000,0x00000000,0x8b46ac68,0x7a847a84,0x82c57a84,0x8b4682a5,0x7a847a84,0x62447a84,0x8b4682c5,0x6a038b46,0x9cf3a514,0x94b294b2,0x94b294b2,0x9cd394b2,0x8c719492,0x8c518c71,0x94b29492,0x841094b2,0x00000000,0x00000000,0x00000000,0x93880000,0x00003963,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe529d3e2,0xe483e483,0xe483e483,0x3960a2c1,0xa2c1a2c1,0xa2c1e483,0xd3e2e483,0xd3e2d3e2,0x49247a08,0x8061c38e,0x30e36020,0x4020a2cb,0x8228e550,0x59a6bc0c,0xd3ef5145,0x58205820, +0x52064164,0x624751c5,0x834b7b0a,0x39237b2a,0x7b0a5206,0x394341a5,0x31023102,0x6a884164,0xfffffdeb,0x49c2feb3,0x49c27369,0xfdeb7369,0xc4687ac5,0xc468ffff,0x736949c2,0x49c27ac5,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x7b070000,0x00006aa6,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x93679367,0x7ac59367,0x93678b46,0x8b469367,0x8b468b46,0x93679367,0x6a039367,0xa534ad75,0xa534a534,0x9cd3a514,0x9cf39cd3,0x9cd39cd3,0x9cd39cd3,0x94b29cd3,0x7bef94b2,0x00000000,0x00000000,0x00000000,0xf8000000,0x0000a800,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa2c1d3e2,0xa2c1a2c1,0xa2c1a2c1,0xb4203960,0xa2c1e540,0xd3e2e483,0xa2c1a2c1,0xa2c1a2c1,0x104171c7,0x886159a6,0xab8b8061,0xa2cb9b09,0x71c7b34d,0x41245145,0x084128a2,0xdd0fdc10, +0x9c0e6ac9,0x49c572e9,0x62885a27,0x310249a5,0x41844184,0x31026268,0x31023102,0x62686247,0xc468fdeb,0x73697ac5,0x7ac549c2,0x736949c2,0xfdeb7369,0x7ac5c468,0x736949c2,0x49c27ac5,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x84100000,0x0000738e,0x00000000,0x00000000,0x00000000,0x7ac59be7,0x936672a5,0x93669366,0x93879366,0x93877ac5,0x93669366,0x93669366,0x51e37ac5,0xad55b596,0xad55a514,0xa534a534,0xa534a534,0xad559cf3,0xa534a534,0xa534a534,0x8c51a514,0x00000000,0x00000000,0x00000000,0xfff2f800,0xf800ffff,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3e2a2c1,0xe483d3e2,0x3960e483,0xe540b420,0x3960b420,0xa2c1a2c1,0xe483e483,0xd3e2e529,0x8a6971e7,0x51652882,0xc38e9aaa,0x41044924,0x284161a6,0x92aa30c3,0x30c35820,0x90824020, +0x626862a9,0x41846a88,0x418449a5,0x49c53102,0x6ac95206,0x5a476268,0x62686268,0x72e93923,0x73697369,0x49c27369,0x7ac57ac5,0x736949c2,0x736949c2,0x7ac5fdeb,0x7ac57369,0x49c2feb3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x7bef0000,0x0000738e,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x8b4682c5,0x93679367,0xa4089367,0x8b467a84,0x93677ac5,0xa4499367,0x72249367,0xbdd7c638,0xb5b6b596,0xb5b6b596,0xbdf7b5b6,0xb596ad75,0xb596ad75,0xbdd7b596,0xa514b596,0x00000000,0x00000000,0x00000000,0xfec0f800,0xf800fc60,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe483d3e2,0xe483e483,0x3960a2c1,0xb420e540,0xa2c13960,0xd3e2e483,0xe483a2c1,0xd3e2d3e2,0x8a695820,0x59a671e7,0x18415965,0x514530c3,0x604161c7,0x8a69b32c,0x8a6961a6,0x30415820, +0x6a883102,0x41843923,0x6a88836b,0x39236aa9,0x394341a5,0x3102836b,0x6a886268,0x6a8841a5,0x49c27369,0xc46849c2,0xc468feb3,0x736949c2,0x49c27ac5,0x73697369,0xc4687ac5,0x49c2ffff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x8b46ac68,0x8b466244,0x8b468b46,0xa4089367,0x8b4682a5,0x8b468b46,0xa4088b46,0x6a038b46,0xc618ce59,0xc618b5b6,0xc618c618,0xc618c618,0xb5b6b596,0xb596b596,0xbdd7b596,0xa514b596,0x00000000,0x00000000,0x00000000,0xf8000000,0x0000f800,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa2c1a2c1,0xa2c1a2c1,0xa2c1e483,0x39603960,0xe483e483,0xe483a2c1,0xa2c1d3e2,0xa2c1a2c1,0x8aaa4820,0x59a671c7,0x602069c7,0x30c38a69,0xdc10bb6d,0x92aa8249,0x59a692a8,0x28821041, +0x392341a5,0x62683923,0x51e63102,0x6a883123,0x41a53943,0x31035a47,0x72c96a88,0x41648bac,0x7ac57369,0xfeb37ac5,0xfeb3ffff,0x736949c2,0xffffc468,0x49c249c2,0xfdeb7369,0x49c2c468,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x8b46b4aa,0x8b467a84,0x93678b46,0xa4089367,0x8b4682c5,0x7ac58b46,0xa4488b46,0x72248b46,0xc638ce79,0xc638bdf7,0xc638c618,0xc618c618,0xb5b6b5b6,0xb596b5b6,0xbdf7b5b6,0xa514b5b6,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3e2a2c1,0xe483e483,0xd3e2d3e2,0xe483a2c1,0xe483d3e2,0xa2c1e483,0xe529e483,0xa2c1d3e2,0xc38ee530,0x59a68a87,0x8aaac38e,0x20418aaa,0x928a59a6,0xab0c9269,0xab6a4104,0x59a67861, +0x41a551e6,0x72ea6ac9,0x31023923,0x836b49a5,0x628841a5,0x7b0a5a67,0x4184834b,0x5a6751e6,0x73697369,0xc468fdeb,0xc468feb3,0x736949c2,0xc468fdeb,0x49c27ac5,0x73697369,0x49c2fdeb,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x72a59ba7,0x62446224,0x62446244,0x7ac56244,0x62446244,0x62246224,0x72a56224,0x51e37ac5,0xbdf7c638,0xbdd7bdd7,0xbdd7bdd7,0xbdd7b5b6,0xad75b596,0xad55ad55,0xad75ad55,0x9cf3ad75,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe483d3e2,0xe483e483,0xe483a2c1,0xe483a2c1,0xa2c1e483,0xd3e2e483,0xd3e2a2c1,0xd3e2e483,0x41247228,0x59a61041,0x69e7aaeb,0xab8ba2eb,0x492430c3,0x38e32882,0xbb6d4924,0x59a68861, +0x39234184,0x31027b0a,0x62687b0a,0x5a473102,0x394341a5,0x49a549a5,0x41844184,0x93cd49c5,0x49c27369,0xfdeb7369,0x7ac57ac5,0x49c27369,0xfdeb7369,0x73697ac5,0x49c249c2,0x49c27369,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x8b468b46,0x8b468b46,0x8b468b46,0x93679367,0x8b469367,0x93677ac5,0x6a039367,0xc638d69a,0xc638c638,0xc638c638,0xc638c638,0xbdf7c638,0xbdd7bdf7,0xb5b6b596,0xa514b5b6,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe529d3e2,0xa2c1e529,0xe483e483,0xe529a2c1,0xa2c1e483,0xe483e483,0xa2c1e529,0xd3e2d3e2,0x71e75986,0x28828a69,0x80614924,0x5820c38e,0x10412061,0x58207a08,0x59a62882,0x8a8a3841, +0x49a56288,0x31026268,0x62473923,0x5a473923,0x31025a47,0x3102834b,0x41644184,0x41645206,0x7ac57ac5,0x736949c2,0x73697ac5,0x7ac549c2,0x736949c2,0x49c27369,0xc468c468,0x736949c2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x93878b46,0xa448a448,0xa408a408,0xa4088b46,0xa448a408,0xa448a408,0x6a039367,0xc638d69a,0xc638c638,0xce79ce79,0xce59ce79,0xce59c638,0xce59ce59,0xc618c618,0xa534b5b6,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe529a2c1,0xe529a2c1,0xd3e2e483,0xd3e2a2c1,0xa2c1e483,0xe483e483,0xd3e2e483,0xa2c1a2c1,0xa2cbc38e,0x8a694020,0x49241841,0x8061c38e,0x58204924,0x582092aa,0x69646841,0xab0c6186, +0x52064184,0x62476ac9,0x62476aa9,0x51e67b0a,0x39233943,0x62686268,0x31023102,0x49c65a47,0xffff7ac5,0x49c2c468,0xfdeb7369,0xffffc468,0x736949c2,0x7ac5fdeb,0xfffffeb3,0x49c2c468,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x8b466b6d,0x8b467a84,0x93678b46,0xa4489367,0x93677a84,0x93679367,0xa4499367,0x6a039367,0xc6188410,0xc618bdd7,0xc618c618,0xce59c618,0xc618bdd7,0xc618c618,0xc638bdf7,0xad55bdf7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0xa2c1a2c1,0xd3e2d3e2,0xd3e2a2c1,0xa2c1d3e2,0xd3e2a2c1,0xd3e2d3e2,0xd3e2a2c1,0xa2c1a2c1,0xa2cbc38e,0x9a8aa2cb,0x71e7c42d,0x49245145,0x80614924,0xa2cbc38e,0x492471e7,0x8228aaeb, +0x62475a47,0x49c53943,0x41643943,0x31023923,0x49a541a5,0x628849a5,0x39234184,0x52063102,0x7ac5fdeb,0x73697ac5,0x73697369,0x7ac5fdeb,0x73697369,0xfdeb7369,0xc468fdeb,0x73697ac5,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x00000000,0x00000000,0x00000000,0x62860000,0x00003142,0x00000000,0x00000000,0x00000000,0x7ac531a6,0x7ae56244,0x72a572a5,0x93667ae5,0x7ac56244,0x18c37ac5,0x936651c3,0x51e351c3,0xbdd74a69,0xbdd7b596,0xb596b596,0xb596b596,0xb596a534,0xb596ad75,0xb596bdd7,0x9cf3a514,0x00000000,0x49c46265,0x00000000,0x00000000,0x00000000,0x00000000,0x41834183,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x61a261a2,0x71e238c1,0x59825982,0x69c24921,0x41215982,0x69e24921,0x49415982,0x38e171e2,0x7aa67aa6,0x9b484142,0x7aa67aa6,0x9b4861e4,0x61e47aa6,0x9b4861e4,0x61e47aa6,0x41429b48, +0x00000000,0x000005e2,0x00000000,0x07020000,0x00000340,0x06220000,0x00000000,0x00000000,0x00000000,0x14c23e60,0x000004a2,0x3d210000,0x05c20340,0x3cc20000,0x00000000,0x00000000,0x000004c2,0x02a06481,0x01c05c01,0x6d000000,0x53e209a0,0x64610280,0x04420000,0x00000000,0x0b603c02,0x12006481,0x1a606481,0x64810000,0x5c0111e0,0x5be222c0,0x5c010000,0x000001c0, +0x096063e1,0x09605bc2,0x11e06401,0x64010000,0x534200c0,0x53620980,0x53820000,0x00000980,0x01005321,0x00205321,0x00004ac1,0x42a10000,0x42810060,0x53420060,0x6c210000,0x000000e0,0x00805b61,0x008063a2,0x00c06382,0x63820000,0x42810000,0x63a20080,0x53010000,0x00000940,0x090052e1,0x00606ba1,0x00c052e1,0x52e10000,0x42410040,0x63620060,0x4aa10000,0x000000a0, +0x00000000,0x00000000,0x00000000,0x9bc90000,0x00003963,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x8b467a84,0x93678b46,0xa4089367,0x936782c5,0x42088b46,0x18c32965,0x72247224,0xc638c618,0xc618bdd7,0xc638c618,0xce59c618,0xc618bdd7,0xb5b6bdd7,0xa534bdd7,0x9cf3a534,0x62650000,0x5a448b87,0x5a245a24,0x5a246a85,0x62656265,0x5a246265,0x6a85ac4a,0x00006265, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x494161a2,0x69e230c1,0x412169c2,0x412130c1,0x412169c2,0x516130c1,0x30c14121,0x598271e2,0x61e47aa6,0x9b484142,0x61e49b48,0x61e44142,0x61e49b48,0x7aa64142,0x414261e4,0x7aa69b48, +0x00000000,0x00000000,0x00000000,0x05620000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x000006a2,0x00000000,0x3d810000,0x00000380,0x07220000,0x14620000,0x00000000,0x00000000,0x01e04502,0x02e03c42,0x5c210000,0x3ce20280,0x34020240,0x00000000,0x00000000,0x13c14da1,0x0b406481,0x02006cc1,0x64610000,0x75202b21,0x45610220,0x3c420000,0x00000240, +0x0a606401,0x226063e1,0x11e06c61,0x53620000,0x64010100,0x63e11a40,0x64210000,0x00000140,0x09805ba1,0x09804b01,0x01404ae1,0x53210000,0x53210100,0x6c010100,0x5b820000,0x00000100,0x11a05b42,0x00e05b41,0x09406382,0x4aa10000,0x5b410940,0x5b210000,0x6bc20000,0x00000920,0x09406ba1,0x19e05b21,0x00e06382,0x5b010000,0x5b2100a0,0x5b210080,0x63610000,0x00000060, +0x00000000,0x00000000,0x00000000,0x62860000,0x00003983,0x00000000,0x00000000,0x00000000,0x8b46aca9,0x82c56244,0x82c582c5,0x8b4682c5,0x82a582c5,0x7a8482a5,0x8b467a84,0x72248b46,0xc638c618,0xbdf7bdd7,0xc618c618,0xc618c618,0xbdd7bdf7,0xb596b5b6,0xb5b6b596,0xa514b5b6,0xa4090000,0x6a856265,0xac4a8b87,0x8b87ac4a,0xac4aac4a,0xa4098b87,0x5a448b87,0x0000a409, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x59824941,0x51624921,0x41214122,0x61a24101,0x410161a2,0x516130c0,0x30c14121,0x59825982,0x7aa661e4,0x7aa661e4,0x61e45a05,0x9b4861e4,0x61e49b48,0x7aa64142,0x414261e4,0x7aa67aa6, +0x00000000,0x00000000,0x00000000,0x000005c2,0x00000000,0x00000000,0x00000000,0x00000000,0x05a20000,0x00000000,0x00000000,0x3dc10000,0x00001d63,0x00000000,0x00000642,0x00000000,0x00000000,0x1d023c62,0x00000502,0x3ce21462,0x04a20320,0x3ce20000,0x00000000,0x00000000,0x000005c1,0x13e14d81,0x02c03c82,0x7d600000,0x44a233e1,0x4e0002c0,0x04a10000,0x0b800000, +0x13c14cc2,0x2b2174c1,0x22a06c61,0x5ba10000,0x74a10980,0x6c412240,0x5bc20000,0x00000a20,0x1a206c01,0x1a006c21,0x226063c2,0x63a10000,0x5ba20140,0x74810140,0x63a10000,0x00003320,0x1a207421,0x11c06381,0x2a406be2,0x6bc20000,0x42610920,0x6bc20940,0x63c20000,0x00000920,0x09606be2,0x09007c61,0x09206381,0x63610000,0x63420900,0x5b420920,0x5b210000,0x00000920, +0x00000000,0x00000000,0x00000000,0x93a90000,0x00003963,0x00000000,0x00000000,0x00000000,0x9367b4aa,0xa4499367,0xa408a449,0xa408a449,0xa4088b46,0xa408a408,0x9387a448,0x72249367,0xc638c618,0xce79c638,0xce79ce79,0xce79ce79,0xce59c618,0xc638ce59,0xbdd7c618,0xa514b5b6,0x00000000,0x6a85ac4a,0x00000000,0x00000000,0x00000000,0x00000000,0x49a3a409,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c14941,0x69c24121,0x41015161,0x61a228a0,0x41013901,0x51614101,0x69c24121,0x69e269c2,0x414261e4,0x9b4861e4,0x61e47aa6,0x9b484142,0x61e461e4,0x7aa661e4,0x9b4861e4,0x9b489b48, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x07220000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x000006c1,0x06410000,0x45610000,0x00000b60,0x05620000,0x0b800000,0x00000000,0x00000000,0x02804e00,0x1c824521,0x7e000000,0x45010b60,0x456101c0,0x00000000,0x00000581, +0x0a605600,0x13c18560,0x018074e1,0x64010000,0x74a11200,0x4ce20a60,0x44a20000,0x00000220,0x13407481,0x33007481,0x00807cc1,0x63e10000,0x63e11a20,0x74811a00,0x8d600000,0x00002aa0,0x3b207c81,0x2a607441,0x19c084a1,0x63c20000,0x6bc211a0,0x63a219e0,0x63c20000,0x00003300,0x2a407401,0x19c06ba1,0x2a406bc2,0x6ba20000,0x6bc20900,0x6ba119c0,0x6bc20000,0x00002a60, +0x00000000,0x00000000,0x00000000,0x9bea0000,0x00004184,0x00000000,0x00000000,0x00000000,0x72a59be7,0x93877ac5,0x93669366,0x93879366,0x93877ac5,0x93879387,0x93669366,0x51e372a5,0xbdf7bdd7,0xce59c618,0xc638c638,0xc638c638,0xc638bdf7,0xc638c638,0xbdf7bdf7,0x9cf3b596,0x00000000,0x49a36265,0x00000000,0x00000000,0x00000000,0x00000000,0x41835a24,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x41215982,0x61a24121,0x39015161,0x49413901,0x49412965,0x61a228a0,0x61a24101,0x30c14121,0x61e47aa6,0x9b4861e4,0x61e47aa6,0x7aa661e4,0x7aa652aa,0x9b484142,0x9b4861e4,0x414261e4, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x03800562,0x00000000,0x00000000,0x00000000,0x00000000,0x06020000,0x000014a2,0x00000000,0x45a10000,0x00000be1,0x00000000,0x000005a2,0x00000000,0x00000000,0x13c144e2,0x00000660,0x4da10280,0x042113a1,0x4dc10000,0x00000000,0x00000000, +0x000004a0,0x138055e1,0x0b004402,0x6c810000,0x4cc21a20,0x44a213a1,0x04600000,0x2d220000,0x13205d81,0x22608540,0x3ba15b41,0x74810000,0x74813361,0x7ca143e1,0x7ce10000,0x00001340,0x2ac09560,0x2aa084c1,0x2a407441,0x74410000,0x74612240,0x744119e0,0x8d400000,0x000032c0,0x32c08ca1,0x11807c41,0x438184a1,0x6ba20000,0x7c412200,0x6bc219a0,0x8cc10000,0x000032e0, +0x00000000,0x00000000,0x00000000,0x93a80000,0x000041a4,0x00000000,0x00000000,0x00000000,0x8b46b4aa,0x000082a5,0x00000000,0xa4080000,0x00007a84,0x00000000,0xa4480000,0x6a038b46,0xc638c618,0x0000bdf7,0x00000000,0xce790000,0x0000bdf7,0x00000000,0xce590000,0xa514bdf7,0x62650000,0x6265a409,0x5a245a24,0x62655a24,0x62656265,0x62656265,0x6265a409,0x00006265, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x41215982,0x61a261a2,0x39014941,0x492128a0,0x38e14921,0x598228a0,0x61a23901,0x412139e7,0x61e47aa6,0x9b489b48,0x61e47aa6,0x7aa64142,0x61e47aa6,0x9b484142,0x9b4861e4,0x61e46b6d, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x000005a2,0x00000000,0x00000000,0x00000000,0x00000000,0x06810000,0x00000000,0x00000000,0x05e20000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x000005c1,0x04c10000,0x4de11421,0x00000b40,0x05610000,0x14410000,0x00000000, +0x00000000,0x13c155a1,0x13404d41,0x74810000,0x55e11340,0x55a11340,0x00000000,0x00000700,0x1b805561,0x1b807cc1,0x24418dc0,0x8d800000,0x960043e1,0x5da112c0,0x5d810000,0x000012c0,0x3b218d20,0x11a084e1,0x32e084a1,0x84a10000,0x74612240,0x8d002ac0,0x8d200000,0x00003b21,0x2a409500,0x2a407401,0x4361a5c0,0x84810000,0x7c412a40,0x8cc119c0,0x95400000,0x00001160, +0x00000000,0x00000000,0x00000000,0x93880000,0x00003963,0x00000000,0x00000000,0x00000000,0x8b46ac68,0x00007a84,0x00000000,0xa4480000,0x00007a84,0x00000000,0xa4080000,0x6a038b46,0xc618c618,0x0000bdf7,0x00000000,0xce790000,0x0000bdf7,0x00000000,0xce590000,0xa534c618,0xa4090000,0x5a448b87,0xac4aac4a,0x8b878b87,0x8b878b87,0xa409a409,0x5a44ac4a,0x0000a409, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c15982,0x410161a2,0x49413901,0x516238e1,0x38e14121,0x39015162,0x28a03901,0x516161a2,0x41427aa6,0x61e49b48,0x7aa661e4,0x9b4861e4,0x61e47aa6,0x61e49b48,0x414261e4,0x7aa69b48, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x01c004e2,0x00000000,0x00000000,0x00000000,0x00000000,0x05210000,0x00000b60,0x06210000,0x4d810000,0x00001441,0x00000000,0x13e10620,0x00000000, +0x00000000,0x13c15600,0x00000560,0x55811bc1,0x05601bc1,0x55810000,0x00000000,0x00000000,0x00005da1,0x1bc15da1,0x1be15e60,0x96000000,0x55211a20,0x5e000a80,0x55210000,0x13400000,0x1b809580,0x3b817421,0x2a808d20,0x84a10000,0x8d2032e0,0x8d402ac0,0x95600000,0x000009c0,0x4bc184a1,0x3b2184a1,0x2a409da0,0x8ca10000,0x7c413b00,0x7c413b21,0x74010000,0x000019a0, +0x00000000,0x00000000,0x00000000,0x7b070000,0x000049e4,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x000082c5,0x00000000,0xa4490000,0x000082c5,0x00000000,0xa4490000,0x6a039367,0xc638c618,0x0000c618,0x00000000,0xce590000,0x0000bdd7,0x00000000,0xc6380000,0xa514bdf7,0x00000000,0x6a85ac4a,0x00000000,0x00000000,0x00000000,0x00000000,0x6a85ac4a,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c05982,0x49415161,0x38e13901,0x516128a0,0x20a030e1,0x38e15162,0x28a03901,0x41215161,0x41427aa6,0x7aa67aa6,0x61e461e4,0x9b484142,0x414261e4,0x61e49b48,0x414261e4,0x61e47aa6, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000422,0x00000000,0x00000000,0x00000000,0x00000000,0x05810000,0x00000000,0x00000000,0x06200000,0x00000000,0x00000000,0x000005e1,0x00000000, +0x00000000,0x000005c0,0x05c00000,0x56000b20,0x00000a60,0x05000000,0x1c210000,0x00000000,0x00000000,0x13005e00,0x24015e00,0x74810000,0x54e21ba1,0x5e201340,0x00000000,0x00005d81,0x000065a1,0x43e195c0,0x2ac084e1,0x8d400000,0x8d203b61,0x95603b81,0x4c420000,0x1b800000,0x32e0a5e0,0x43819d60,0x43818ca1,0x95400000,0x9d602a60,0x7c4132e0,0x7c410000,0x00003b00, +0x00000000,0x00000000,0x00000000,0xfff20000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x7ac59be7,0x62246224,0x62246224,0x7ac56224,0x62446244,0x62246244,0x72a56224,0x51e37ac5,0xbdf7bdd7,0xb5b6b5b6,0xb596b596,0xbdd7b596,0xb5b6b5b6,0xb5b6b5b6,0xbdd7b5b6,0xa514bdd7,0x00000000,0x41835a24,0x00000000,0x00000000,0x00000000,0x00000000,0x41835a24,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c069c2,0x49415161,0x28a03901,0x514128a0,0x208030c1,0x49214121,0x39013901,0x516161a2,0x41429b48,0x7aa67aa6,0x414261e4,0x9b484142,0x414261e4,0x7aa67aa6,0x61e461e4,0x7aa69b48, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1c8205e1,0x00000000,0x00000000,0x00000000,0x00000000, +0x06000000,0x00001c41,0x05200000,0x4cc20000,0x00000b20,0x00000000,0x24a20600,0x00000000,0x00000000,0x1b805541,0x00006620,0x5de12401,0x5d810ac0,0x55010000,0x00000000,0x00000000,0x00000000,0x32c09e00,0x2c828d00,0x95a00000,0x95c032e0,0x8d402c82,0x00000000,0x000065a1,0x42009540,0x43a1a5c0,0x32e0a5c0,0x8cc10000,0x954019a0,0xa5c03b20,0x95400000,0x00002140, +0x00000000,0x00000000,0x00000000,0xfec00000,0x0000fc60,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x93679367,0xa449a448,0xa408a449,0x8b468b46,0x9387a408,0xa449a449,0x72249367,0xc638c618,0xc618c638,0xce59ce59,0xce59ce79,0xc618c618,0xc638ce59,0xce59ce79,0xa534c618,0x62650000,0x6265ac4a,0x5a245a24,0x62655a24,0x62656265,0x5a245a24,0x6a85ac4a,0x00006265, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x516169c2,0x494161a2,0x28a03901,0x412128a0,0x20a030e1,0x49215162,0x41014941,0x516161a2,0x7aa69b48,0x7aa69b48,0x414261e4,0x7aa64142,0x414261e4,0x7aa69b48,0x61e47aa6,0x7aa69b48, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x02400660,0x00000000,0x00000000,0x00000000,0x00000000, +0x06200000,0x00000000,0x00000000,0x05400000,0x00000000,0x00000000,0x00000680,0x00000000,0x00000000,0x00005dc1,0x5e400000,0x55210a80,0x00001300,0x55610000,0x00000000,0x00000000,0x00000000,0x1b008d20,0x00006e80,0x8d401b40,0x6e803b81,0x8d200000,0x00000000,0x00000000,0x00208be2,0x32e0a5e0,0x31809540,0x7c410000,0x9d602a60,0x7c613180,0x7b420000,0x39c00000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x8b466b6d,0x00006244,0x00000000,0xa4080000,0x000082a5,0x00000000,0xa4080000,0x6a038b46,0xc6188410,0x0000b5b6,0x00000000,0xce590000,0x0000bdf7,0x00000000,0xce590000,0xa534c618,0xa4090000,0x62656265,0xac4aac4a,0x8b87ac4a,0x8b878b87,0xac4a6265,0x5a448b87,0x0000a409, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x41214921,0x410161a2,0x39013901,0x516228a0,0x38e130e1,0x28a05162,0x41014941,0x69c261a2,0x61e461e4,0x61e49b48,0x61e461e4,0x9b484142,0x61e461e4,0x41429b48,0x61e47aa6,0x9b489b48, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000481,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x0b200640,0x00000000,0x00000000,0x00000000,0x00000000,0x5e400000,0x00001320,0x54e20000,0x55410000,0x000009c0,0x00000000,0x1be15e20,0x00000000,0x00000000,0x00005d41,0x65810000,0x95c023e1,0x00004c02,0x54a20000,0x1b000000,0x00000000,0x00005a82,0x43419520,0x00008382,0x8cc14a20,0x838232c0,0xa5c02940,0x00000000,0x18e08ba2, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x7a8431a6,0x00007a84,0x00000000,0xa4080000,0x000082c5,0x00000000,0xa4480000,0x72248b46,0xbdf74a69,0x0000bdd7,0x00000000,0xce590000,0x0000bdf7,0x00000000,0xce590000,0xad55c618,0x00000000,0x5a448b87,0x00000000,0x00000000,0x00000000,0x00000000,0x6265a409,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x41215982,0x51615161,0x39013901,0x49215982,0x28a04921,0x29655982,0x41014941,0x69c230c0,0x61e47aa6,0x7aa67aa6,0x61e461e4,0x7aa69b48,0x41427aa6,0x52aa9b48,0x61e47aa6,0x9b484142, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x1c610520,0x00000000,0x00000000,0x00000000,0x00000000,0x55610000,0x00000000,0x00000000,0x4c420000,0x00000000,0x00000000,0x00005e00,0x00000000,0x65a10000,0x00001280,0x66000000,0x9e200000,0x00001b20,0x00000000,0x1b605d41,0x00000000,0x00000000,0x42209d80,0x93e10000,0x95202940,0x7b4232c0,0x95000000,0x00000000,0x00007302, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x72a59ba7,0x00006224,0x00000000,0x93870000,0x00006244,0x00000000,0x93660000,0x51e37ac5,0xbdf7bdd7,0x0000b5b6,0x00000000,0xc6380000,0x0000b5b6,0x00000000,0xc6180000,0xa514bdf7,0x00000000,0x49a35a24,0x00000000,0x00000000,0x00000000,0x00000000,0x41835a24,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x41215982,0x318669c2,0x39015161,0x59823901,0x28a04941,0x49414941,0x41214101,0x69c230c1,0x61e47aa6,0x52aa9b48,0x61e47aa6,0x9b4861e4,0x41427aa6,0x7aa67aa6,0x61e461e4,0x9b484142, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000640,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x13405e40,0x00000000,0x00000000,0x00000000,0x00000000,0x5ce20000,0x00000000,0x00000000,0x5d610000,0x00000000,0x00000000,0x000065a1,0x00000000,0x00000000,0x000093c1,0x7b420000,0x95200000,0x000039a0,0x93e10000,0x39a00000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x7a847a84,0x7a847a84,0x8b4682a5,0x82c582c5,0x82a582c5,0x93676244,0x6a039367,0xc638c618,0xbdd7bdd7,0xbdd7bdd7,0xc618bdf7,0xbdf7bdf7,0xbdf7bdf7,0xc618b5b6,0xa534bdf7,0x62650000,0x5a448b87,0x62656265,0x62656265,0x62656265,0x5a245a24,0x6a856265,0x00006265, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c171e2,0x69c269c2,0x41015161,0x494128a0,0x28a04941,0x410161a2,0x41214121,0x59824121,0x41429b48,0x9b489b48,0x61e47aa6,0x7aa64142,0x41427aa6,0x61e49b48,0x61e461e4,0x7aa661e4, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1b605d81,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x3b6184c1,0x00000000,0x00000000,0x00000000,0x00000000,0x7b620000,0x00002120,0x00000000,0x83a20000,0x00000000,0x00000000,0x294083a2,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x7ac58b46,0x8b468b46,0x8b468b46,0x8b468b46,0x8b468b46,0x8b468b46,0x6a039367,0xc618bdf7,0xbdd7bdf7,0xc618c618,0xc618c618,0xc618c618,0xc618c618,0xc618c618,0xa534c618,0xa4090000,0x49a3a409,0x8b878b87,0xa409a409,0xac4aac4a,0xa409ac4a,0x62658b87,0x0000a409, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c14941,0x51625982,0x41215161,0x61a230c0,0x30c04101,0x41215161,0x41214121,0x71e230c1,0x414261e4,0x7aa67aa6,0x61e47aa6,0x9b484142,0x414261e4,0x61e47aa6,0x61e461e4,0x9b484142, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00005da1,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x240195a0,0x00000000,0x00000000,0x00000000,0x00000000,0x73220000,0x00000000,0x00000000,0x10c08ba2,0x00000000,0x00000000,0x00007b42,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xac68b4aa,0xac68ac68,0xb4aaac68,0xaca9b4aa,0xb4aaac68,0xb4aab4aa,0xb4aab4aa,0x8b46b4aa,0xa514a534,0xad75a534,0xbdf7b5b6,0xbdf7c618,0xbdf7bdf7,0xc618c618,0xc638c638,0xbdd7c638,0x00000000,0x5a448b87,0x00000000,0x00000000,0x00000000,0x00000000,0x6a85ac4a,0x00000000, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x49417202,0x69e271e2,0x41214121,0x69c269c2,0x30c04121,0x412169c2,0x69e25982,0x71e24921,0x61e49b48,0x9b489b48,0x61e461e4,0x9b489b48,0x414261e4,0x61e49b48,0x9b487aa6,0x9b4861e4, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00006620,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00006b02,0x00000000,0x00000000,0x00000000,0x00000000, +0xce79c618,0xe71cf79e,0xd6bace59,0xffdff79e,0xd69adedb,0xf79ee73c,0xce79ce59,0xf79eef7d,0x1aaf220a,0x1aaf220a,0x2a4b1aaf,0x1aaf1aaf,0x1aaf22d0,0x1aaf1168,0x328c1aaf,0x2a4b1aaf,0xffffffff,0xefffffff,0xe79eefff,0xe79ee79e,0xe79ee79e,0xffffefff,0xefffe79e,0xffffe79e,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0x7aa79369,0x9369bc2b,0x7aa79369,0x93698430,0x93699369,0x7aa77aa7,0x93699369,0x59e57aa7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x0a020000,0x142413e4,0x140313a3,0x09c20b63,0x14030a02,0x0b8313e4,0x13e31403,0x00000b03,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa5569d15,0x94d49d15,0xa536add9,0xa55794f4,0xad779d36,0x9d159d15,0x9d369d15,0x94f49d15,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x31652904,0x31653165,0x31653165,0x31653165,0x31653165,0x31653165,0x31653145,0x31653165,0x31652904,0x31653165,0x31653165,0x31653165,0x31653165,0x31653165,0x31653145,0x31653165, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xf7bef7be,0xdedbdefb,0xe71cf79e,0xef5de73c,0xef7dffff,0xd69ad69a,0xe73ce71c,0xce59d6ba,0x00000a0d,0x000022f0,0x1aaf0000,0x00000000,0x00000000,0x000022d0,0x124e0000,0x1aaf0000,0xefffffff,0xe79effff,0xe79ee79e,0xffffe79e,0xffffffff,0xffffffff,0xefffffff,0xe79eefff,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0x7aa79369,0xbc2b59e5,0x59e57aa7,0x59e57aa7,0x7aa77aa7,0x59e57aa7,0x7aa77aa7,0x93699369,0x0b030000,0x01410000,0x0b030b03,0x0b030000,0x00000141,0x0b030b03,0x01410000,0x00000b03,0x0a020000,0x146413e4,0x14240ba3,0x00000ac2,0x13e40a02,0x13a31464,0x13a31424,0x00000b03,0x0b030000,0x0b030b03,0x0b030b03,0x0b030b03,0x0b030b03,0x0b030b03,0x0b030b03,0x00000b03, +0x9d16a536,0x9d159d15,0x9d16a536,0xa556a536,0xa5368cb3,0x9d1594b4,0x9cf5a557,0xa5369d15,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x854b0000,0x00006c28,0xaece0000,0x0000854b,0x7aa83165,0x72877287,0x8ae87287,0x72878ae8,0x8ae88ae8,0x82a87287,0x8ae88ae8,0x31657aa8,0x7aa83165,0x72877287,0x8ae87287,0x72878ae8,0x8ae88ae8,0x82a87287,0x8ae88ae8,0x31657aa8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe73ce73c,0xffffffdf,0xef5df79e,0xd6bae71c,0xdedbbdd7,0xf79ee73c,0xdedbdedb,0xfffff79e,0x126e220a,0x1aaf220a,0x220a1aaf,0x1aaf1aaf,0x22d01aaf,0x126e220a,0x19a81aaf,0x220a1aaf,0xefffefff,0xe79eefff,0xefffefff,0xe79eefff,0xefffffff,0xe79eefff,0xffffffff,0xefffefff,0x755f8dff,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f8dff,0x755f755f,0x755f755f, +0x93697aa7,0x7aa77aa7,0x7aa759e5,0x93699369,0x59e57aa7,0x59e5bc2b,0xbc2b7aa7,0x93699369,0x0b030000,0x14030aa2,0x0b431444,0x0ba30aa2,0x0aa21444,0x14241403,0x0aa20aa2,0x00000b03,0x01410000,0x13e30b83,0x14241403,0x0b030bc3,0x0b630141,0x13a313e4,0x14641464,0x00000b03,0x0b030000,0xdef3def3,0xdef3def3,0xded3def3,0xded3def3,0xdef3def3,0xdef3def3,0x00000b03, +0xa557adb9,0x8c939cf5,0x9d159d15,0xad779d15,0xad77a536,0xa536a557,0x9d15a556,0x9d16a557,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xe77b0000,0x0000960c,0xaece7605,0x0000854b,0x72873165,0x498492c7,0x49849b29,0x39439b29,0x41649b29,0x394392e8,0x394382a7,0x31657287,0x72873165,0x9b2992c7,0x9b299b29,0x72879b29,0x92e87287,0x82a792e8,0x82a782a7,0x31657287, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd69ad6ba,0xbdf7bdd7,0xf7bef79e,0xb5b6c638,0xef5ddefb,0xe73ce71c,0xffffffff,0xc618e73c,0x00001aaf,0x00001aaf,0x1aaf0000,0x00000000,0x00000000,0x00001aaf,0x1aaf0000,0x1aaf0000,0xffffefff,0xe79eefff,0xe79ee79e,0xffffefff,0xffffffff,0xe79eefff,0xe79ee79e,0xe79ee79e,0x8dff755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0xffff755f,0x755f755f,0x755f755f, +0x59e57aa7,0x7aa79369,0x93699369,0x7aa7bc2b,0x7aa77aa7,0x7aa77aa7,0x7aa77aa7,0xbc2bbc2b,0x0b030000,0x14031444,0x00000b43,0x14241403,0x0b431444,0x0b431403,0x14241464,0x00000b03,0x00000000,0x0b830b43,0x146413e4,0x0b030b83,0x0ae20000,0x13a31464,0x0ba313e3,0x00000b03,0x0b030000,0xd6b3def3,0xd6d4d6b3,0xd6b3d6b3,0xd6b3d6b3,0xd6d4d6d4,0xdef3d6d4,0x00000b03, +0xa536ad77,0xad779d15,0x9d15a536,0x94d4a556,0xa53694f4,0x9d159d15,0xa537a536,0x9d159d15,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x8ae83165,0x59e59b29,0x51849b29,0x51849b29,0x518482a7,0x518482a7,0x59a492e8,0x31658ae8,0x8ae83165,0x9b299b29,0x82a79b29,0x18a27287,0x728718a2,0x82a782a7,0x92c792e8,0x31658ae8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce79ce59,0xe71ce71c,0xd6bad69a,0xe73cef5d,0xce79ce59,0xe73cd69a,0xbdd7bdd7,0xe73cd6ba,0x00000a2d,0x000022d0,0x2b310000,0x00000000,0x00000000,0x00001aaf,0x1aaf0000,0x1aaf0000,0xe79effff,0xefffe79e,0xefffefff,0xe79ee79e,0xe79ee79e,0xffffe79e,0xefffefff,0xe79ee79e,0x755f755f,0x755f755f,0x755f755f,0x755f8dff,0x755f755f,0x755f755f,0x755fffff,0x755f755f, +0x7aa79369,0x93697aa7,0xbc2b9369,0x93697aa7,0x93696b6d,0x7aa79369,0x936959e5,0x59e57aa7,0x0b030000,0x14031444,0x0b431444,0x14241403,0x00000b43,0x00000b43,0x14030b43,0x00000000,0x0a020000,0x0ba31424,0x146413e4,0x0b030ba3,0x13e30a02,0x13a31464,0x0b031464,0x000009c2,0x0b030000,0xd6b3def3,0xdef4def4,0xdef3def3,0xdef4def4,0xdef4def4,0xdef3d6b3,0x00000b03, +0xa5379cf5,0x94d5a556,0x9d15a536,0x9d15a536,0xa536a536,0xadb89d35,0x9d159d15,0x94b49d15,0xaece0000,0x0000854b,0x854b0000,0x00006c28,0xaece7605,0x0000854b,0xaece0000,0x0000854b,0x82873165,0x92c74143,0x92c84143,0x92c74143,0x92c74143,0x92c74143,0x92c84143,0x31658287,0x82873165,0x92c792c7,0x92c892c8,0x18a27287,0x728718a2,0x92c792c7,0x92c892c8,0x31658287, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xf79ef79e,0xef5def5d,0xf79effff,0xe73cef5d,0xef7df79e,0xe71cd6ba,0xdefbe73c,0xdefbce59,0x1aaf0947,0x1aaf1188,0x21e91aaf,0x1a8f0a2d,0x1a8f2b52,0x1aaf220a,0x220a124e,0x11882b11,0xffffffff,0xe79effff,0xefffefff,0xefffefff,0xefffefff,0xffffe79e,0xefffffff,0xe79eefff,0x755f755f,0x755f755f,0x755f755f,0xffff755f,0x755f755f,0x755f755f,0xffff755f,0x755f755f, +0x93699369,0xbc2b7aa7,0x7aa7bc2b,0x9369bc2b,0xbc2b59e5,0x7aa7bc2b,0x93699369,0x7aa78430,0x00000000,0x14030aa2,0x14031424,0x14441403,0x0b431403,0x0b4313e3,0x14031444,0x00000b03,0x0a020000,0x0ba31424,0x14641403,0x09c20b02,0x13e30a02,0x0ba31464,0x0aa21464,0x00000000,0x0b030000,0xd6b3def3,0xdef3def4,0xdef3def3,0xdef3def3,0xdef4def3,0xdef3d6d4,0x00000b03, +0xa536a536,0xa5378c73,0xa55794f4,0x9d169d35,0xad77ad77,0x9d15a556,0x9d159d36,0x9d369d15,0xaece0000,0x0000854b,0xe77b7605,0x0000960c,0xaece9766,0x0000854b,0x854b0000,0x00006c28,0x82a83165,0x92e859c5,0x9b2959e5,0x82a75184,0x82a75184,0x92e859c5,0x92e859c5,0x316582a8,0x82a83165,0x92e892e8,0x9b299b29,0x18a27287,0x728718a2,0x92e892e8,0x92e892e8,0x316582a8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdedbd69a,0xef7dd6ba,0xbdf7bdd7,0xe71cdedb,0xe73cce79,0xffffffff,0xe73cdedb,0xffdfffff,0x00001aaf,0x00001aaf,0x22f00000,0x00000000,0x00000000,0x0000126e,0x126e0000,0x1aaf0000,0xefffefff,0xffffefff,0xffffffff,0xefffffff,0xefffefff,0xe79eefff,0xe79effff,0xe79ee79e,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755fffff,0x755f755f,0x755f755f,0x755f755f, +0x93699369,0x7aa759e5,0x59e57aa7,0x7aa759e5,0x7aa77aa7,0x7aa77aa7,0xbc2bbc2b,0x93697aa7,0x0b030000,0x14031444,0x14240b43,0x00000b43,0x14030b43,0x14241403,0x14030b43,0x00000b03,0x0a020000,0x13a31464,0x146413e4,0x00000aa2,0x0b830a02,0x0ba31464,0x0ba31464,0x00000b03,0x0b030000,0xd6b3ded3,0xdef3def3,0xd6b3d6b3,0xd6b3d6b3,0xdef4def3,0xdef3d6b3,0x00000b03, +0x8c9394d4,0x9d35a536,0xa5369d35,0x9d15a557,0xa5369d36,0xad77a536,0xa5369d36,0xa57694d4,0x854b7605,0x00006c28,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xe77b0000,0x0000960c,0x72873165,0x394382a7,0x498482a7,0x416492e8,0x394382a7,0x414382a7,0x39439b29,0x31657287,0x72873165,0x82a782a7,0x9b2982a7,0x18a27287,0x728718a2,0x92c782a7,0x82a79b29,0x31657287, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe73cef5d,0xd69ac618,0xe73cf79e,0xd6bace79,0xd6bad69a,0xc618d69a,0xdedbdefb,0xc638c638,0x000022f0,0x00001aaf,0x1aaf0000,0x00000000,0x00000000,0x00001aaf,0x1aaf0000,0x1aaf0000,0xefffffff,0xefffefff,0xe79ee79e,0xe79ee79e,0xffffffff,0xe79effff,0xffffffff,0xe79eefff,0x8dff755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0x7aa79369,0x93697aa7,0x93697aa7,0x59e57aa7,0x93697aa7,0x7aa79369,0x7aa77aa7,0x7aa759e5,0x0b030000,0x0b431444,0x0b430000,0x0b4313e3,0x14031403,0x0b431403,0x0b430000,0x00000000,0x0a020000,0x0ba31464,0x0ba31403,0x0b031403,0x0b230141,0x13a31444,0x0ba31403,0x00000b03,0x0b030000,0xd6d4def3,0xdef3def4,0xdef4d6b3,0xd6b3def4,0xdef4def3,0xdef3d6b3,0x00000b03, +0xa536a536,0xa557a557,0x9d15a536,0xa536a557,0xadd9ad77,0xa53694d4,0x9d169d15,0x9d369d15,0xe77b9766,0x0000960c,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x8ae83165,0x59e59b29,0x59a49b29,0x59e582a7,0x59c59b29,0x59c592e8,0x59e59b29,0x31658ae8,0x8ae83165,0x9b299b29,0x92c79b29,0x18a27287,0x728718a2,0x92e892e8,0x9b299b29,0x31658ae8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd69ad69a,0xffffffff,0xe73cef5d,0xf79ef79e,0xd69ace59,0xf79eef5d,0xe73ce73c,0xf79ef79e,0x00001aaf,0x00001aaf,0x1aaf0000,0x00000000,0x00000000,0x00001aaf,0x22d00000,0x124e0000,0xffffffff,0xefffefff,0xefffefff,0xe79eefff,0xffffffff,0xe79ee79e,0xefffffff,0xe79eefff,0x755f755f,0x755f8dff,0x755f755f,0x755f8dff,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0x7aa7bc2b,0xbc2bbc2b,0x93699369,0x7aa77aa7,0x59e59369,0x93699369,0x7aa77aa7,0x93699369,0x00000000,0x14030aa2,0x14840b43,0x14031444,0x0b431444,0x14241403,0x14030b43,0x00000141,0x0a020000,0x13a31464,0x13a31403,0x0b031464,0x0a820000,0x0bc31424,0x0b221424,0x000009c2,0x0b030000,0xd6b3def3,0xdef3def4,0xdef4d6b3,0xd6b3def4,0xdef3def3,0xdef3d6b3,0x00000b03, +0x9d159d36,0x9d35a557,0x9d159d36,0xadb7a556,0x9cf5a536,0x9d159d15,0xa536a536,0xa5579d15,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x7605854b,0x82873165,0x92c84143,0x92c84143,0x92c74143,0x92c74143,0x92c84143,0x92c84143,0x31658287,0x82873165,0x92c892c8,0x92c892c8,0x18a27287,0x728718a2,0x92c892c8,0x92c892c8,0x31658287, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xffffffff,0xef5def7d,0xdefbdefb,0xe71cdedb,0xffffef7d,0xdedbe73c,0xffffffff,0xe71cef5d,0x00001aaf,0x0000020d,0x1a8f0000,0x00000000,0x00000000,0x00001aaf,0x01ab0000,0x1aaf0000,0xe79effff,0xe79ee79e,0xefffffff,0xffffe79e,0xe79ee79e,0xffffe79e,0xefffefff,0xe79ee79e,0x755f755f,0x755f755f,0x755f755f,0x8dff755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0x59e5bc2b,0x7aa77aa7,0x7aa78430,0xbc2b7aa7,0x7aa7bc2b,0xbc2bbc2b,0x93697aa7,0x93697aa7,0x01410000,0x14840ba3,0x14441403,0x14031424,0x00000b43,0x140313e3,0x14031403,0x00000b03,0x00000000,0x0bc313a3,0x13e31403,0x0b0313e4,0x13a30a02,0x13e31424,0x0aa21424,0x00000000,0x0b030000,0xd6b3def3,0xdef3def4,0xd6d4d6b3,0xd6b3d6b3,0xdef3def3,0xdef3d6b3,0x00000b03, +0xa53694d4,0x9d369cf5,0xa55694d4,0x9d159d15,0x9d159d15,0xadb8a557,0xa557a536,0x9d16a536,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x854b0000,0x00006c28,0xaece0000,0x9766854b,0x8ae83165,0x92e859e5,0x9b2959e5,0x82a759e5,0x82a75184,0x9b2959a4,0x9b2959e5,0x31658ae8,0x8ae83165,0x92e89b29,0x9b299b29,0x18a27287,0x728718a2,0x9b2992c7,0x9b299b29,0x31658ae8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xbdd7c618,0xf79ece79,0xb5b6ce79,0xd69ace59,0xb5b6ce79,0xd6bad69a,0xd69ac618,0xd6bace59,0x1aaf220a,0x22d0220a,0x326c1aaf,0x1aaf1aaf,0x22f01aaf,0x22f0220a,0x220a1aaf,0x220a1aaf,0xefffefff,0xefffefff,0xffffe79e,0xffffffff,0xefffe79e,0xe79ee79e,0xefffefff,0xe79eefff,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755fffff,0x755f755f,0x755f8dff,0x755f755f, +0x59e57aa7,0x93699369,0x93697aa7,0x59e559e5,0x7aa759e5,0x59e57aa7,0x7aa77aa7,0xbc2b7aa7,0x0b030000,0x0b431403,0x0b430000,0x140313e3,0x140313e3,0x14241444,0x0aa21444,0x00000000,0x0a020000,0x14030b43,0x13e413e4,0x0b0313e4,0x13a30a02,0x14441403,0x0ba31424,0x00000b03,0x0b030000,0xd6b3def3,0xdef3def4,0xdef3def3,0xdef3def3,0xdef4def3,0xdef3d6b3,0x00000b03, +0xa5369cf5,0xadda9d15,0xa5769d15,0xa536a536,0xad779d15,0x94d4a536,0x9d159d15,0x94d49d36,0xaece0000,0x0000854b,0x854b0000,0x00006c28,0xe77b0000,0x0000960c,0xaece0000,0x0000854b,0x72873165,0x416492c7,0x416492e8,0x39439b29,0x416492e8,0x416492e8,0x394382a7,0x31657287,0x72873165,0x92e892c7,0x92e892e8,0x18a27287,0x728718a2,0x92e892e8,0x82a782a7,0x31657287, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdedbe73c,0xdefbce79,0xef5def5d,0xb5b6bdf7,0xe71cd69a,0xc638d69a,0xef5def5d,0xbdf7ce59,0x00001aaf,0x00001aaf,0x1aaf0000,0x00000000,0x00000000,0x00001aaf,0x1aaf0000,0x0a0d0000,0xffffffff,0xefffefff,0xffffefff,0xffffe79e,0xefffefff,0xffffe79e,0xefffffff,0xe79eefff,0xffff755f,0x755f755f,0x755f755f,0x755f755f,0xffff755f,0x755f755f,0x8dff755f,0x755f755f, +0x7aa79369,0xbc2b9369,0x936959e5,0x7aa77aa7,0x59e559e5,0x6b6d59e5,0x93697aa7,0x7aa759e5,0x01410000,0x14031424,0x14440b43,0x0b431444,0x14031444,0x0b431444,0x14031444,0x00000b03,0x0a020000,0x14030ba3,0x142413e4,0x0b031403,0x0b230141,0x14641403,0x13a31464,0x00000b03,0x0b030000,0xd6d4def3,0xdef4def3,0xdef4def4,0xdef4def3,0xdef4def3,0xdef3d6b3,0x00000b03, +0x9d15a556,0x9d15a557,0xa557a557,0xa557a537,0x9cf5a557,0xa5579d15,0x94d49d16,0x94f5a536,0xaece0000,0x0000854b,0xe77b0000,0x7605960c,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x72873165,0x518482a7,0x59e582a7,0x51849b29,0x51849b29,0x59a482a7,0x59c592e8,0x316582a8,0x72873165,0x82a782a7,0x9b2982a7,0x18a27287,0x728718a2,0x92c782a7,0x92e892e8,0x316582a8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd69adefb,0xf79eef5d,0xd6bad6ba,0xf79edefb,0xdedbce79,0xf79ef79e,0xd69adefb,0xf79effff,0x00001aaf,0x00001aaf,0x22f00000,0x00000000,0x00000000,0x000022f0,0x1aaf0000,0x22d00000,0xe79effff,0xe79ee79e,0xffffffff,0xffffe79e,0xefffffff,0xe79eefff,0xffffffff,0xe79eefff,0x755f755f,0x755fffff,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f8dff, +0x6b6d59e5,0x59e559e5,0x59e5ffff,0x59e559e5,0x59e5ffff,0x59e5efff,0x59e57aa7,0x7aa759e5,0x00000000,0x14a40aa2,0x14241403,0x00000b43,0x14030b43,0x00000b43,0x14030b43,0x00000b03,0x01410000,0x13e30b23,0x14240ba3,0x0b0313a3,0x0aa20000,0x146413e4,0x0ba31464,0x00000b03,0x0b030000,0xd6b3def3,0xd6b3d6b3,0xd6b3d6b3,0xd6b3d6b3,0xd6b3d6b3,0xdef3d6d4,0x00000b03, +0x9d159cf5,0xa5369d15,0xa5369d15,0x9d159d15,0x9d159d15,0xa5569d35,0x9d359d36,0x94d49d36,0xaece0000,0x7605854b,0xaece0000,0x9766854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x82873165,0x92c74143,0x92c74143,0x92c74143,0x92c74143,0x92c84143,0x92c84143,0x31658287,0x82873165,0x92c792c8,0x92c792c7,0x18a27287,0x728718a2,0x92c892c8,0x92c892c8,0x31658287, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xf79eef7d,0xdedbd6ba,0xf79ef7be,0xd6bae71c,0xf79eef5d,0xe73ce73c,0xffffffdf,0xe73cef5d,0x1aaf19a9,0x1aaf220a,0x3acd128f,0x1aaf1a8f,0x1aaf124e,0x1a8f11a8,0x21ea1aaf,0x220a01cc,0xffffefff,0xe79eefff,0xefffe79e,0xe79eefff,0xefffffff,0xe79eefff,0xffffffff,0xefffefff,0x755f755f,0xffff755f,0x755f755f,0x755f8dff,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0x59e5efff,0xe79eefff,0x59e5e79e,0x59e5efff,0xefffffff,0xe79eefff,0xffff59e5,0x59e5efff,0x0b030000,0x0aa21424,0x13e31403,0x0aa213e3,0x14031464,0x0b431444,0x14031424,0x00000b03,0x00000000,0x13e30b43,0x14640ba3,0x09c20b03,0x13a30a02,0x142413e4,0x0ac21424,0x00000000,0x0b030000,0xded3def3,0xdef3def3,0xdef3def3,0xdef3ded3,0xdef3def3,0xdef3def4,0x00000b03, +0xad77a536,0x9d15ad98,0x9d159d15,0x9d369d36,0xa556a536,0xa557a557,0x9d1594f4,0xad989d15,0xaece0000,0x9766854b,0xaece0000,0x0000854b,0xaece0000,0x7605854b,0x854b0000,0x00006c28,0x8ae83165,0x82a75184,0x82a75184,0x92e859c5,0x9b2959e5,0x92e859e5,0x9b2959a4,0x31658ae8,0x8ae83165,0x82a782a7,0x82a782a7,0x728792e8,0x9b297287,0x92e89b29,0x9b2992c7,0x31658ae8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe73cdefb,0xffffffdf,0xef5def7d,0xd6badedb,0xc618ce59,0xd6bad69a,0xc618b596,0xdedbd69a,0x00001aaf,0x00001aaf,0x1aaf0000,0x00000000,0x00000000,0x00001aaf,0x1aaf0000,0x126e0000,0xffffffff,0xefffffff,0xefffefff,0xe79eefff,0xffffe79e,0xefffefff,0xffffe79e,0xe79effff,0x755f755f,0x755f755f,0x755f755f,0x8dff755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0xffffffff,0xefffffff,0x59e5efff,0xe79eefff,0xffffe79e,0xefffefff,0xffffe79e,0xe79effff,0x0b030000,0x00000b03,0x0b030141,0x00000141,0x0b030b03,0x00000b03,0x0b030141,0x00000b03,0x0a020000,0x140313e3,0x14640b83,0x00000aa2,0x13a30a02,0x146413e4,0x14031424,0x00000b03,0x0b030000,0x0b030b03,0x0b030b03,0x0b030b03,0x0b030b03,0x0b030b03,0x0b030b03,0x00000b03, +0x9d35a536,0xa557a536,0x9d1594b4,0x9d159d15,0xa55794d4,0xa536add9,0x9d359d15,0xa5769d15,0x854b0000,0x00006c28,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xe77b0000,0x0000960c,0x7aa83165,0x828782a8,0x82a882a8,0x72877287,0x72877287,0x82a87287,0x82a87287,0x31657aa8,0x7aa83165,0x828782a8,0x82a882a8,0x72877287,0x72877287,0x82a87287,0x82a87287,0x31657aa8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd69ace59,0xce59c638,0xef5ddefb,0xd69ace79,0xef5de73c,0xce59bdf7,0xe71ce71c,0xc618ce59,0x1aaf21ea,0x1aaf220a,0x2a6b0a2d,0x01cc22f0,0x1aaf128f,0x1aaf220a,0x3aed22d0,0x220a1aaf,0xffffffff,0xefffffff,0xffffffff,0xffffefff,0xffffffff,0xefffefff,0xe79ee79e,0xffffffff,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0xffffffff,0xefffffff,0xffffffff,0xffffefff,0xffffffff,0xefffefff,0xe79ee79e,0xffffffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x0a020000,0x14031403,0x14031464,0x0b031464,0x13e40a02,0x142413e4,0x14031424,0x00000b03,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa5368452,0x9d36a536,0x9d369d15,0x9d359d15,0xa536a556,0x9d159d15,0x9d159d15,0x9d3594f5,0xe77b0000,0x0000960c,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x31652924,0x31653165,0x31653165,0x31653165,0x31653165,0x31653165,0x31653165,0x21043165,0x31652924,0x31653165,0x31653165,0x31653165,0x31653165,0x31653165,0x31653165,0x21043165, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0xbde6e70b,0xce68b5a5,0xce68b5a5,0xce68d6a9,0xef4affed,0xd689deea,0xce68e729,0xce68ce68,0xb6bbc7bf,0xb6bbb6bb,0xb6bbb6bb,0x00000000,0xb6bbb6bb,0xb6bb0000,0xb6bbb6bb,0xc7bfb6bb,0x73ae73ae,0x73ae73ae,0x8c716b4d,0x7bef8c71,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x7bef7bef,0x73ae73ae,0x73ae73ae,0x8c716b4d,0x7bef8c71,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x7bef7bef, +0x0000a514,0x00000000,0x9cd30000,0x528a0000,0xad75ad55,0x0000528a,0x8c710000,0xad7552aa,0x2965a514,0x29652965,0x9cd32965,0x528a2965,0xad75ad55,0x2965528a,0x8c712965,0xad7552aa,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232103,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232103,0x20e22923,0x72e718a1,0x7b0772e7,0x6aa66aa6,0x18a17b07,0x72e718a1,0x6aa672e7,0x6aa649e4,0x18a16aa6, +0x72e718a1,0x7b0772e7,0x6aa66aa6,0x18a17b07,0x72e718a1,0x6aa672e7,0x6aa649e4,0x18a16aa6,0xdedb8410,0xf8003186,0xf800fd00,0xffe0fd00,0xfd00f800,0xfd00ffe0,0xef5df800,0x31869cd3,0x31a639c7,0x318631a6,0x29653186,0x29652965,0x39c72124,0x31a639c7,0x21242965,0x318631a6,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xc627ce68,0xef6cbdc6,0xb5a5e729,0xce68deea,0x63006300,0xce48e729,0xe7296300,0xc627ce68,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xc7bf0000,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x8c718c71,0x73ae7bef,0x7bef73ae,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x8c718c71,0x73ae7bef,0x7bef73ae, +0x0000632c,0x5acb0000,0x84305aeb,0x00000000,0x632c0000,0x94b2528a,0xb5960000,0x5acb9492,0x2965632c,0x5acb2965,0x84305aeb,0x29652965,0x632c2965,0x94b2528a,0xb5962965,0x5acb9492,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x936541e6,0x7ae47ae4,0x93657ae4,0x7ae49365,0x93659365,0x93257ae4,0x93659365,0x7ae49365,0x93659365,0x7ae47ae4,0x93657ae4,0x7ae49365,0x93659365,0x93257ae4,0x93659365,0x29238305,0xbccc18a1,0x7ac69c29,0xbccc9c29,0x2102bccc,0xbccc2922,0xb48b9c29,0xbcccbccc,0x18a1bccc, +0xbccc18a1,0x7ac69c29,0xbccc9c29,0x2102bccc,0xbccc2922,0xb48b9c29,0xbcccbccc,0x18a1bccc,0xe71c8c51,0xfd0039e7,0xffe0ffe0,0xfd00ffe0,0xffe0fd00,0xfd00ffe0,0xef7dfd00,0x2965ad55,0x6b6d39c7,0x630c5acb,0x52aa4228,0x738e738e,0x630c4a69,0x630c632c,0x422852aa,0x318652aa,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe729e729,0x6b40d689,0xe7296300,0x39e0c627,0x63006300,0xd6895280,0xce68ce68,0xce68ce68,0x0000c7bf,0x00000000,0x00000000,0x00000000,0x00000000,0x0000c7bf,0x00000000,0xb6bb0000,0x8c717bef,0xc73f73ae,0x7bef5f7e,0x73ae7bef,0x5f7e73ae,0x73ae5f7e,0x7bef7bef,0x8c718c71,0x8c717bef,0xf80073ae,0x7bef8800,0x73ae7bef,0x880073ae,0x73ae8800,0x7bef7bef,0x8c718c71, +0x00009492,0x94925acb,0xa5340000,0x00008c51,0x528a0000,0x94b20000,0xad754a69,0x0000ad55,0x29659492,0x94925acb,0xa5342965,0x29658c51,0x528a2965,0x94b22965,0xad754a69,0x2965ad55,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b4341e6,0xabc5a363,0xabc5abc5,0x8b43abc5,0xa384abc5,0x8b43a384,0x8b438b43,0x8b43abc5,0xa384abc5,0xabc5a363,0xabc5abc5,0x8b43abc5,0xa384abc5,0x8b43a384,0x8b438b43,0x29237ae4,0x9c2918a1,0xa38772e7,0xbcccbccc,0x2102bccc,0xb48b2922,0x9c29b48b,0x9c299c29,0x18a19c29, +0x9c2918a1,0xa38772e7,0xbcccbccc,0x2102bccc,0xb48b2922,0x9c29b48b,0x62869c29,0x18a16286,0xdefb8c51,0xf80039e7,0xfd00fd00,0xf800fd00,0xfd00ffe0,0xf800f800,0xef7df800,0x3186a514,0x630c3186,0x9492738e,0x94928c71,0x5acb6b4d,0x9cf36b6d,0x7bcf8c51,0x7bcf8410,0x2104630c,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xf78b6300,0x39c0ce48,0xd68918e0,0xc627ce68,0x294039c0,0xce68d6a9,0xad64d6a9,0xe7296300,0xc7bf0000,0x00000000,0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0xb6bb0000,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x73ae73ae,0xffffc73f,0x767fc73f,0x5f7e767f,0x7bef73ae,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x73ae73ae,0xf800a820,0x9000a820,0x88009000,0x7bef73ae, +0x00008c51,0x9cd3b596,0xad750000,0x0000b596,0x8c510000,0x94b20000,0x00009492,0xa5344a69,0x29658c51,0x9cd3b596,0xad752965,0x2965b596,0x8c512965,0x94b22965,0x29659492,0xa5344a69,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0xabc5abc5,0x8b43abc5,0x8b43abc5,0x8b438b43,0x8b438b43,0xa363a384,0x8b43abc5,0x8b438b43,0xabc5abc5,0x8b43abc5,0x8b43abc5,0x8b438b43,0x8b438b43,0xa363a384,0x29239365,0xbccc18a1,0xa387bccc,0x9c29bccc,0x18a1bccc,0x9c292102,0x9c299c29,0x72e79b47,0x18a1bccc, +0xbccc18a1,0xa387bccc,0x9c29bccc,0x18a1bccc,0x9c292102,0x9c299c29,0xffff9b47,0x18a172e7,0xc6188c51,0x39e7e71c,0xc800c800,0xc800fd00,0xf800fd00,0xc800c800,0xef7d4208,0x2965ad55,0x5acb2945,0x5acb5acb,0x5acb5acb,0x7bcf6b6d,0x5acb630c,0x8c519492,0x7bcf7bcf,0x212439c7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd6a818e0,0xce68ce68,0xce68ce68,0xd6a9d6a7,0xce68ce68,0x1080ce68,0xce68ce68,0xce68e729,0x0000ffff,0x00000000,0x00000000,0x0000c7bf,0x00000000,0x00000000,0x0000ffff,0xb6bb0000,0x7bef6b4d,0x7bef7bef,0x7bef73ae,0x7bef7bef,0x8c718c71,0xc73f7bef,0x8c715f7e,0x6b4d8c71,0x7bef6b4d,0x7bef7bef,0x7bef73ae,0x7bef7bef,0x8c718c71,0xf8007bef,0x8c718800,0x6b4d8c71, +0x0000ad75,0xb5b6ad75,0x00000000,0x00000000,0x9cd3ad75,0xad550000,0x00008430,0xad55528a,0x2965ad75,0xb5b6ad75,0x29652965,0x29652965,0x9cd3ad75,0xad552965,0x29658430,0xad55528a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa34441e5,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0x29238b04,0x6aa618a1,0x72e772e7,0x6aa66aa6,0x10616aa6,0x72e718a1,0x72e772e7,0x6aa641a4,0x18a16aa6, +0x6aa618a1,0x72e772e7,0x41a341a3,0x10616aa6,0x72e718a1,0x72e772e7,0xb5b62902,0x18a141a3,0xad554a49,0xdefbd6ba,0x39c739e7,0xc800f800,0xc800f800,0x39e739e7,0xd6badefb,0x3186a534,0x738e39c7,0x7bcf8c51,0x5acb738e,0x7bcf7bcf,0x7bcf8410,0x632c5acb,0x6b4d8c71,0x2124738e,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd6a9ce68,0xe729ce68,0xc627ce68,0xd68918c0,0xdeeaef6c,0xe729ef4a,0xffedce68,0xce4652a0,0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0x00000000,0xffff0000,0x00000000,0x7bef7bef,0x73ae8c71,0x8c71767f,0x73ae8c71,0x73ae6b4d,0x8c718c71,0x7bef8c71,0x7bef7bef,0x7bef7bef,0x73ae8c71,0x8c719000,0x73ae8c71,0x73ae6b4d,0x8c718c71,0x7bef8c71,0x7bef7bef, +0x00005aeb,0x00000000,0x4a490000,0x00005acb,0xad55ad55,0x00000000,0x9cd35acb,0x00000000,0x29655aeb,0x29652965,0x4a492965,0x29655acb,0xad55ad55,0x29652965,0x9cd35acb,0x29652965,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa38441e6,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xa384a384,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xa384a384,0x29239325,0xb48b18a1,0xb48bb48b,0xbcccbccc,0x18a19c29,0x9c292102,0xb48bb48b,0xb48b9b47,0x18a1b48b, +0xb48b18a1,0x72c772c7,0x72e7b5b6,0x18a19c29,0x9c292102,0xb48bb48b,0xb5b6dedb,0x18a172c7,0x7bcf4a49,0xdedbce59,0xe71cef7d,0x42084208,0x420839e7,0xef7de71c,0xc638d69a,0x31867bcf,0x528a2965,0x7bcf73ae,0x52aa7bcf,0x84109492,0x7bcf7bcf,0x5acb7bef,0x6b4d6b4d,0x29456b4d,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce68ce68,0x39c0ce68,0xce68ce68,0xd689deea,0x6300ce68,0x63005280,0x39c0e729,0x6b416b41,0x0000ffff,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x73ae7bef,0x73ae73ae,0x73ae73ae,0xc73f73ae,0x5f7e5f7e,0x73ae5f7e,0x73ae73ae,0x7bef8c71,0x73ae7bef,0x73ae73ae,0x73ae73ae,0xa82073ae,0x88008800,0x73ae8800,0x73ae73ae,0x7bef8c71, +0x4a698c71,0x5acb0000,0x00008c71,0x00009cd3,0x000052aa,0x000094b2,0xad7552aa,0x00009492,0x4a698c71,0x5acb2965,0x29658c71,0x29659cd3,0x296552aa,0x296594b2,0xad7552aa,0x29659492,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b4341c5,0x8b438b43,0xabc58b43,0xa384a384,0x8b438b43,0xa3638b43,0x8b43abc5,0xa384a384,0x8b438b43,0x8b438b43,0xabc58b43,0xa384a384,0x8b438b43,0xa3638b43,0x8b43abc5,0x29237ae4,0x9c2918a1,0xb5b69c29,0xb5b66286,0x290272c7,0x9c292102,0x72e79c29,0x9c29bccc,0x18a19c29, +0x9c2918a1,0xdedbb5b6,0x72e7b5b6,0x2902b48b,0x9c292102,0x72e79c29,0xb5b6ffff,0x18a16286,0x8c714a49,0xdedbc638,0xe73cdedb,0xf79ef79e,0xf79ef79e,0xdedbe73c,0xc638dedb,0x39e78c71,0x528a2945,0x94929492,0x5acb7bef,0x738e9492,0x841094b2,0x6b4d8410,0x94b26b4d,0x3186528a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe729ce68,0xd689dec8,0xce68d689,0x39c0c607,0x39c0e729,0x39c039c0,0xce68b5a5,0xce6839c0,0xc7bfffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xb6bb0000,0xc73f7bef,0x6b4d767f,0x73ae8c71,0x7bef7bef,0xc73fffff,0x8c718c71,0x8c718c71,0x8c718c71,0xf8007bef,0x6b4d9000,0x73ae8c71,0x7bef7bef,0xa820f800,0x8c718c71,0x8c718c71,0x8c718c71, +0x8c71bdd7,0x9cd30000,0x52aa94b2,0x949294b2,0x94b20000,0x00009492,0xbdd70000,0x52aa9cf3,0x8c71bdd7,0x9cd32965,0x52aa94b2,0x949294b2,0x94b22965,0x29659492,0xbdd72965,0x52aa9cf3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0xabc5abc5,0xa363abc5,0xabc58b43,0xa384abc5,0xa384a384,0xabc5abc5,0xabc58b43,0xa384abc5,0xabc5abc5,0xa363abc5,0xabc58b43,0xa384abc5,0xa384a384,0xabc5abc5,0x29239365,0xbccc18a1,0xdedbbccc,0xdedb72e7,0x29226286,0xb48b2922,0xb48bb48b,0xbcccbccc,0x18a1bccc, +0xbccc18a1,0x28e1bccc,0x72e7b5b6,0x29229c29,0xb48b2922,0x72c7b48b,0xb5b6dedb,0x18a172e7,0x42282965,0x84107bcf,0x8c715aeb,0x94b28c71,0x94929492,0x4a698c71,0x5aeb73ae,0x39c77bcf,0x42282965,0x8c51738e,0x738ea514,0x94b26b6d,0x84309492,0x632c738e,0x4a495aeb,0x39c77bcf,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x6b40bde6,0xd689e729,0xdecae729,0xce48c607,0xce68ce68,0xb585d6a9,0xce689ce2,0xce68deca,0x0000ffff,0x0000c7bf,0x00000000,0x0000c7bf,0x00000000,0x00000000,0x00000000,0xb6bb0000,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x6b4d73ae,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x6b4d73ae,0x73ae73ae,0x73ae73ae,0x7bef7bef, +0xb5b6a514,0xa5340000,0x5acbb5b6,0x9492ad75,0xad550000,0x528abdd7,0x528a0000,0x630c0000,0xb5b6a514,0xa5342965,0x5acbb5b6,0x9492ad75,0xad552965,0x528abdd7,0x528a2965,0x630c2965,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x930441e5,0x8b048b04,0x8b048b04,0x93048b04,0x93049304,0x8b048b04,0x8b048b04,0x93048b04,0x93049304,0x8b048b04,0x8b048b04,0x93048b04,0x93049304,0x8b048b04,0x8b048b04,0x292382c4,0x72e718a1,0x6aa66aa6,0x6aa6dedb,0x18a16aa6,0x72e718a1,0x41a46aa6,0x6aa66aa6,0x18a172e7, +0x72e718a1,0x28e16aa6,0x6aa66aa6,0x18a16aa6,0x72e718a1,0xffff6aa6,0xb5b6dedb,0x18a141c4,0x5aeb2965,0x21245acb,0xb5b6738e,0xad55ad55,0xa534ad55,0x6b4da534,0x5acbad55,0x39c7528a,0x5aeb2965,0x632c5acb,0x8c718c71,0x632c6b4d,0x5acb6b4d,0x7bef5acb,0x5acb8430,0x39c7528a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x39c0deea,0xef4cce68,0xce686300,0xce68ce68,0xd689e729,0xb5a5ce68,0xe729ffcc,0xce68ce68,0x00000000,0x00000000,0x00000000,0xc7bf0000,0x00000000,0x00000000,0x00000000,0xb6bb0000,0x8c718c71,0xffff7bef,0x767fc73f,0x5f7e767f,0x7bef7bef,0x5f7e767f,0x8c718c71,0x6b4d8c71,0x8c718c71,0xb8207bef,0x9000a820,0x88009000,0x7bef7bef,0x88009000,0x8c718c71,0x6b4d8c71, +0x94b2528a,0x528a0000,0x00005acb,0xa534a514,0x00000000,0x0000632c,0x528a0000,0x5aeb5acb,0x94b2528a,0x528a2965,0x29655acb,0xa534a514,0x29652965,0x2965632c,0x528a2965,0x5aeb5acb,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x72c641e6,0x72a572c6,0x72c672c6,0x6a8572c6,0x6a856a85,0x72c672a5,0x72c672c6,0x6a8572c6,0x6a856a85,0x72a572c6,0x72c672c6,0x6a8572c6,0x6a856a85,0x72c672a5,0x72c672c6,0x292372c6,0xbccc18a1,0x28e1bccc,0x28e172e7,0x210272e7,0x9c292102,0xbccc49e4,0xbcccbccc,0x18a1bccc, +0xbccc18a1,0x28e1bccc,0xbcccbccc,0x2102bccc,0x9c292102,0xdedb49e4,0xb5b6dedb,0x18a172e7,0x630c3186,0x29457bef,0x08610000,0x10820861,0x10821082,0x000010a2,0x8430a534,0x2104630c,0x630c3186,0x6b6d7bef,0x5acb73ae,0x7bcf6b4d,0x8430738e,0x7bef8c71,0x84308410,0x2104630c,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xbdc6ce68,0xce68ce68,0xbde6e729,0xd689ce68,0xce682120,0xce68d6a9,0xdeca6300,0xce68d6a9,0x0000ffff,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x0000c7bf,0x00000000,0x73ae73ae,0x7bef7bef,0xffff7bef,0x73aec73f,0x6b4d7bef,0xc73fffff,0x73ae73ae,0x7bef6b4d,0x73ae73ae,0x7bef7bef,0xf8007bef,0x73aea820,0x6b4d7bef,0xa820f800,0x73ae73ae,0x7bef6b4d, +0xb5960000,0x00008430,0x8c714a69,0x00005aeb,0x9cd3528a,0x52aa0000,0x5acb0000,0x84300000,0xb5962965,0x29658430,0x8c714a69,0x29655aeb,0x9cd3528a,0x52aa2965,0x5acb2965,0x84302965,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x316441c5,0x31843164,0x31843184,0x31643184,0x31843184,0x31843184,0x31643164,0x31643184,0x31843184,0x31843164,0x31843184,0x31643184,0x31843184,0x31843184,0x31643164,0x18e23164,0x9c2918a1,0x28e172e7,0x28e1b48b,0x2102bccc,0xb48b2902,0xb48b9b47,0x9c299c29,0x18a19c29, +0x9c2918a1,0x28e172e7,0xb48bb48b,0x2102bccc,0xb48b2902,0x28e19b47,0x28e128e1,0x18a16286,0x5acb2945,0x29457bef,0x00000000,0x00000000,0x00000000,0x00000000,0x6b4da514,0x212439c7,0x5acb2945,0x6b6d7bef,0x7bef7bef,0x5acb7bcf,0x94929492,0x84107bef,0x6b4d7bcf,0x212439c7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce68ce68,0x6300ce68,0xce686300,0xc607a523,0xbde6ce68,0xce68ce68,0xce68e729,0xce68ffef,0xffffffff,0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0xc7bf0000,0xb6bb0000,0x8c717bef,0x73ae8c71,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x8c718c71,0x6b4d8c71,0x8c717bef,0x73ae8c71,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x8c718c71,0x6b4d8c71, +0xa5140000,0x0000a514,0xa5340000,0x0000528a,0x8c719cd3,0x00000000,0x00008c71,0x8c519492,0xa5142965,0x2965a514,0xa5342965,0x2965528a,0x8c719cd3,0x29652965,0x29658c71,0x8c519492,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x7ae441e6,0x7ae47ae4,0x93657ae4,0x7ae49365,0x7ae49365,0x93047ae4,0x93259325,0x7ae49365,0x7ae49365,0x7ae47ae4,0x93657ae4,0x7ae49365,0x7ae49365,0x93047ae4,0x93259325,0x29239325,0x9c2918a1,0x7ac69c29,0xbccc9c29,0x2102bccc,0x9c292922,0x72e77ac6,0xb48bb48b,0x18a1b48b, +0x9c2918a1,0x7ac69c29,0xbccc9c29,0x2102bccc,0x9c292922,0x28e17ac6,0x28e172c7,0x18a172c7,0x738e39c7,0x4a697bcf,0x000031a6,0x00000000,0x00000000,0x31a60000,0x8430528a,0x2124738e,0x738e39c7,0x6b4d7bcf,0x7bcf8c71,0x5acb7bcf,0x8c516b4d,0x94b294b2,0x8430738e,0x2124738e,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xc607ce68,0x39c0deea,0xd68939c0,0x39e0e729,0xc627e729,0x2960c607,0xce466300,0xdecace68,0x0000ffff,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xb6bbc7bf,0x8c717bef,0x7bef7bef,0x6b4d7bef,0xc73f7bef,0x7bef5f7e,0x73ae73ae,0x73ae73ae,0x7bef73ae,0x8c717bef,0x7bef7bef,0x6b4d7bef,0xf8007bef,0x7bef8800,0x73ae73ae,0x73ae73ae,0x7bef73ae, +0x00000000,0x00000000,0xad750000,0x00008c51,0x9cd3ad55,0xad754a69,0x00008c51,0x9cd3ad75,0x29652965,0x29652965,0xad752965,0x29658c51,0x9cd3ad55,0xad754a69,0x29658c51,0x9cd3ad75,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa34441e6,0xa363a344,0xa363a363,0xa363a363,0xa363a363,0xa344a344,0xa344a344,0xa363a363,0xa363a363,0xa363a344,0xa363a363,0xa363a363,0xa363a363,0xa344a344,0xa344a344,0x2923a363,0x6aa618a1,0x49e46aa6,0x72e749e4,0x18a172e7,0x72e718a1,0x6aa641a4,0x6aa66aa6,0x18a172e7, +0x6aa618a1,0x49e46aa6,0x72e749e4,0x18a172e7,0x72e718a1,0x28e141a4,0x28e128e1,0x18a172e7,0x528a2965,0x6b6d5aeb,0x21246b6d,0x31863186,0x29452104,0x42082104,0x8c516b4d,0x29456b4d,0x528a2965,0x6b6d5aeb,0x632c9cd3,0x84308c51,0x6b6d5aeb,0x5acb5acb,0x8c516b4d,0x29456b4d,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce68ce68,0xd689ce68,0xdeeace68,0x63005280,0xce68dec8,0xe70bbde6,0xce4839c0,0xce68ffec,0x0000ffff,0xffff0000,0x00000000,0x0000c7bf,0x00000000,0x00000000,0x00000000,0x00000000,0x6b4d7bef,0x73ae73ae,0x73ae767f,0x73ae73ae,0x73ae8c71,0x7bef7bef,0x767fc73f,0x7bef7bef,0x6b4d7bef,0x73ae73ae,0x73ae9000,0x73ae73ae,0x73ae8c71,0x7bef7bef,0x9000f800,0x7bef7bef, +0x00000000,0x00008c71,0xad75528a,0x0000a514,0xad559cf3,0xb5965aeb,0x000094b2,0xad55b596,0x29652965,0x29658c71,0xad75528a,0x2965a514,0xad559cf3,0xb5965aeb,0x296594b2,0xad55b596,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0xa384abc5,0xabc5a363,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0xa384abc5,0xabc5a363,0x2923abc5,0xbccc18a1,0x9c299c29,0x9c297ac6,0x2902b48b,0xbccc2922,0xb48bbccc,0xbccc72e7,0x18a1bccc, +0xbccc18a1,0x9c299c29,0x9c297ac6,0x2902b48b,0xbccc2922,0xb48bbccc,0xbccc72e7,0x18a1bccc,0x528a2945,0x52aa7bcf,0x8c71630c,0x7bcf8c71,0x528a632c,0x7bef8430,0x7bcf5aeb,0x3186528a,0x528a2945,0x52aa7bcf,0x8c71630c,0x7bcf8c71,0x528a632c,0x7bef8430,0x7bcf5aeb,0x3186528a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x39c0c627,0xce68e729,0xce68c607,0x39c039c0,0xd689ce68,0xce68ce68,0xce68ce68,0xce682100,0x0000ffff,0x00000000,0x00000000,0xc7bf0000,0x00000000,0x00000000,0x00000000,0xb6bb0000,0x7bef7bef,0x8c718c71,0x8c718c71,0x8c718c71,0x8c7173ae,0x8c718c71,0x7bef6b4d,0x73ae7bef,0x7bef7bef,0x8c718c71,0x8c718c71,0x8c718c71,0x8c7173ae,0x8c718c71,0x7bef6b4d,0x73ae7bef, +0x00008430,0x9cd3bdd7,0x52aa0000,0x00000000,0x4a6952aa,0xb5960000,0x528ab5b6,0x52aa0000,0x29658430,0x9cd3bdd7,0x52aa2965,0x29652965,0x4a6952aa,0xb5962965,0x528ab5b6,0x52aa2965,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0xa363a384,0xa384a384,0x8b438b43,0x8b438b43,0xa3848b43,0xa3848b43,0x8b438b43,0x8b438b43,0xa363a384,0xa384a384,0x8b438b43,0x8b438b43,0xa3848b43,0xa3848b43,0x2923abc5,0xbccc18a1,0x72e7b48b,0xb48bb48b,0x59632102,0x21025963,0xb48b9c29,0xb48b9c29,0x18a1bccc, +0xbccc18a1,0x72e7b48b,0xb48bb48b,0x59632102,0x21025963,0xb48b9c29,0xb48b9c29,0x18a1bccc,0x6b6d39c7,0x630c5acb,0x52aa4228,0x738e738e,0x630c4a69,0x630c632c,0x422852aa,0x318652aa,0x6b6d39c7,0x630c5acb,0x52aa4228,0x738e738e,0x630c4a69,0x630c632c,0x422852aa,0x318652aa,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce68d689,0xce68b5a5,0xce68ce68,0xce68ce68,0xce68deea,0xe7295280,0xce68deea,0xce68ce68,0xffffffff,0x0000ffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xc7bfffff,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x8c718c71,0x8c716b4d,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x8c718c71,0x8c716b4d,0x73ae7bef,0x73ae73ae,0x7bef73ae, +0x000094b2,0x9cf3ad75,0x00005acb,0x00000000,0x00007bef,0x00000000,0x52aa0000,0xad550000,0x296594b2,0x9cf3ad75,0x29655acb,0x29652965,0x29657bef,0x29652965,0x52aa2965,0xad552965,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x41c541e6,0x41c541c5,0x41e641c5,0x41e641e6,0x41e641c5,0x41e641e6,0x41e641e6,0x292341e6,0x41e641e6,0x41c541c5,0x41e641c5,0x41e641e6,0x41e641c5,0x41e641e6,0x41e641e6,0x316441e6,0x9c2918a1,0x9c299c29,0x29229c29,0x5963b3a9,0xb3a95963,0xbccc2922,0xbcccbccc,0x18a1bccc, +0x9c2918a1,0x9c299c29,0x29229c29,0x5963b3a9,0xb3a95963,0xbccc2922,0xbcccbccc,0x18a1bccc,0x31a639c7,0x318631a6,0x29653186,0x29652965,0x39c72124,0x31a639c7,0x21242965,0x318631a6,0x31a639c7,0x318631a6,0x29653186,0x29652965,0x39c72124,0x31a639c7,0x21242965,0x318631a6,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x73ae73ae,0x73ae73ae,0x8c716b4d,0x7bef8c71,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x7bef7bef,0x73ae73ae,0x73ae73ae,0x8c716b4d,0x7bef8c71,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x7bef7bef,0x73ae73ae,0x73ae73ae,0x8c716b4d,0x7bef8c71,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x7bef7bef,0x72e772e7,0x7b0772e7,0x6aa66aa6,0x6aa67b07,0x72e772e7,0x6aa672e7,0x6aa649e4,0x72e76aa6, +0x73ae7bcf,0x19e3738e,0x08e10901,0x1a231142,0x84103c47,0x224452aa,0x19c319a3,0x630c1162,0x08621083,0x08631083,0x10831083,0x10831083,0x10831083,0x10831082,0x10831083,0x10830862,0x41cc41cc,0x20c60021,0x00b009b1,0x31091884,0x20c61083,0x20c609b1,0x314a1884,0x18840000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232103,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232103,0x20e22923,0x18a118a1,0x18a10840,0x512218a1,0x51224902,0x51225122,0x18a15122,0x08400840,0x18a10840, +0x630c39e7,0x29453186,0x29452945,0x29452945,0x21242945,0x29452945,0xa5342945,0x3186630c,0x318639e7,0x31863186,0x31863186,0x31863186,0x29653186,0x31863186,0x31863186,0x31863186,0x318639e7,0x29453186,0x29452945,0x31863186,0x31863186,0x29452945,0x31862945,0x31863186,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800, +0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x8c718c71,0x73ae7bef,0x7bef73ae,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x8c718c71,0x73ae7bef,0x7bef73ae,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x8c718c71,0x73ae7bef,0x7bef73ae,0x81a1bccc,0x61407180,0x9082b8a2,0x5b8132d1,0xacc14183,0x90828be1,0x2a6f32d1,0xbccc146d, +0x8c5173ae,0xa51411a2,0x7bcf8410,0x1a237bef,0x1a231a23,0x94927bef,0x94b28c51,0x114239e7,0x10821083,0x18c51083,0x10831083,0x08620862,0x18a40841,0x18c518c5,0x108318c5,0x08620862,0x31090021,0x20c6314a,0x09b109d1,0x310920c6,0x20c61083,0x28c809d1,0x002120c6,0x1884314a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x936541e6,0x7ae47ae4,0x93657ae4,0x7ae49365,0x93659365,0x93257ae4,0x93659365,0x7ae49365,0x93659365,0x7ae47ae4,0x93657ae4,0x7ae49365,0x93659365,0x93257ae4,0x93659365,0x29238305,0xb48b1061,0x2902b48b,0xb3a9ab88,0xab68ab68,0xab88ab88,0xab88ab68,0xb48b2902,0x18a1b48b, +0x7bef4a69,0x108239e7,0x21242945,0x29452945,0x29452945,0x29452945,0xb5b61082,0x29657bef,0x7bef4a69,0x7bcf7bcf,0x73ae7bcf,0x7bef7bef,0x7bcf7bcf,0x7bcf7bcf,0x7bef7bef,0x29657bef,0x7bef4a69,0x7bcf7bcf,0x738e7bcf,0x7bcf738e,0x738e7bcf,0x738e738e,0x7bcf7bcf,0x29657bef,0xfb60f800,0xfb60f800,0xfb60f800,0x0000f800,0xf8000000,0xf800fb60,0xfb60f800,0xf800f800, +0x8c717bef,0xfff673ae,0x7beffd65,0x73ae7bef,0xfd6573ae,0x73aefd65,0x7bef7bef,0x8c718c71,0x8c717bef,0xdd7273ae,0x7befac6e,0x73ae7bef,0xac6e73ae,0x73aeac6e,0x7bef7bef,0x8c718c71,0x8c717bef,0x39e773ae,0x7bef31a6,0x73ae7bef,0x31a673ae,0x73ae31a6,0x7bef7bef,0x8c718c71,0x81a1b48b,0x61407180,0x9082b8a2,0x5b8132d1,0xacc13142,0x90828be1,0x2a6f32d1,0xb48b146d, +0x7bcfbdd7,0xb5b622a4,0xb5b63c07,0x39c71a23,0xce592264,0x7befa534,0x7bef9492,0x31a68c51,0x10830864,0x18c518c5,0x00211083,0x108318c5,0x20e60841,0x18c518c5,0x10831083,0x10830863,0x00211884,0x314a1884,0x3109314a,0x20c620c6,0x314a1083,0x00b009d1,0x0021314a,0x20c6314a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b4341e6,0xabc5a363,0xabc5abc5,0x8b43abc5,0xa384abc5,0x8b43a384,0x8b438b43,0x8b43abc5,0xa384abc5,0xabc5a363,0xabc5abc5,0x8b43abc5,0xa384abc5,0x8b43a384,0x8b438b43,0x29237ae4,0xb48b0840,0xa34720e2,0xa347a368,0xa347a347,0xa3479b47,0xa368a347,0x2102a388,0x0840b46b, +0x73ae4a49,0x000039e7,0x18c31082,0x18c318c3,0x10a218c3,0x108218c3,0xb5960000,0x3186738e,0x73ae4a49,0xad55ad55,0xa514ad55,0xa514a514,0x9cf3ad55,0xad55ad55,0xa514a514,0x3186738e,0x73ae4a49,0xb596b596,0xb596b596,0xad55b596,0xad55ad55,0xa514a514,0xad55b596,0x3186738e,0xfb60f800,0x00000000,0x0000f800,0x0000fb60,0x00000000,0xfb600000,0x0000fb60,0xf800f800, +0x73ae7bef,0x73ae73ae,0x73ae73ae,0x73ae73ae,0xfffffff6,0xff69fff6,0xfd65ff69,0x7bef73ae,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x73ae73ae,0xe615dd72,0xbcd0dd72,0xac6ebcd0,0x7bef73ae,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x422839e7,0x31a639e7,0x31a631a6,0x7bef73ae,0x81a1bccc,0x61407180,0x9082b8a2,0x314232d1,0xb5b65b81,0x90828c51,0x2a6f32d1,0xbccc146d, +0xb596b596,0x11421142,0x11421142,0x7bef2264,0x114219a3,0x9cf3b596,0x7bef2b05,0x1a231a23,0x398a1083,0x20c5396a,0x08610862,0x08621063,0x396a0841,0x108318c5,0x10821083,0x08620862,0x188420c6,0x00001884,0x00000021,0x20c609b1,0x310920c6,0x00b009d1,0x31090021,0x28c820c6,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0xabc5abc5,0x8b43abc5,0x8b43abc5,0x8b438b43,0x8b438b43,0xa363a384,0x8b43abc5,0x8b438b43,0xabc5abc5,0x8b43abc5,0x8b43abc5,0x8b438b43,0x8b438b43,0xa363a384,0x29239365,0x29020840,0x51c4a347,0x494351c4,0x51c451a4,0x51c451c4,0x51c451c4,0xa34751a4,0x08402902, +0x7bef4a49,0x39e77bef,0x00000000,0x00000000,0x00000000,0x00000000,0xb5964208,0x29657bef,0x7bef4a49,0xa514b596,0xa514a514,0xa514a514,0xa514a514,0xb596b596,0xb596b596,0x29657bef,0x7bef4a49,0xb596b596,0xad55b596,0xce59b596,0xa514ce59,0xb596b596,0xb596ad55,0x29657bef,0xfb60f800,0x0000f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x7bef6b4d,0x7bef7bef,0x7bef73ae,0x7bef7bef,0x8c718c71,0xfff67bef,0x8c71fd65,0x6b4d8c71,0x7bef6b4d,0x7bef7bef,0x7bef73ae,0x7bef7bef,0x8c718c71,0xdd727bef,0x8c71ac6e,0x6b4d8c71,0x7bef6b4d,0x7bef7bef,0x7bef73ae,0x7bef7bef,0x8c718c71,0x39e77bef,0x8c7131a6,0x6b4d8c71,0x81a172e7,0x61407180,0x9082b8a2,0x41833142,0xb5b65b81,0x90828c51,0x2a6f32d1,0x72e7146d, +0x1a231a23,0x7bef33e6,0x39c76b6d,0x84107bef,0x7bef9492,0x19e31142,0x1a233c27,0x39c71a23,0x08411084,0x10830841,0x08620862,0x08621083,0x398a0841,0x10830862,0x41ab0841,0x108318c5,0x188428c8,0x314a20c6,0x20c60021,0x00b009b1,0x314a20c6,0x00b009d1,0x002109b1,0x1884314a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa34441e5,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0x29238b04,0xab880840,0x51c4a347,0xb3889ac6,0xab8851a4,0x51a4ab88,0xb3a99ac6,0xa36851c4,0x1881ab88, +0x7bef4a49,0x7bcfad55,0x39c739e7,0x00000000,0x00000000,0x39e739e7,0xa51473ae,0x318673ae,0x7bef4a49,0xad55ad55,0x9cf3ad55,0xb596ad55,0xad55ad55,0xa514a514,0xa514a514,0x318673ae,0x7bef4a49,0xb596ad55,0xb596b596,0x1082b596,0xce591082,0xb596ad55,0xa514b596,0x318673ae,0xf800f800,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000,0xf800f800, +0x7bef7bef,0x73ae8c71,0x8c71ff69,0x73ae8c71,0x73ae6b4d,0x8c718c71,0x7bef8c71,0x7bef7bef,0x7bef7bef,0x73ae8c71,0x8c71bcd0,0x73ae8c71,0x73ae6b4d,0x8c718c71,0x7bef8c71,0x7bef7bef,0x7bef7bef,0x73ae8c71,0x8c7131a6,0x73ae8c71,0x73ae6b4d,0x8c718c71,0x7bef8c71,0x7bef7bef,0x20e2bccc,0x31423142,0x9082b8a2,0x39633963,0xacc13142,0x29028be1,0x2a6f32d1,0x9c293142, +0x3c075aeb,0x7bef7bcf,0x31867bef,0x94b2b596,0x2b057bef,0x39c78430,0x5aeb2244,0x84309cd3,0x10831082,0x08621083,0x10830862,0x08630863,0x08411083,0x10840862,0x08421083,0x10831083,0x18843109,0x18841884,0x20c60021,0x00b009b1,0x09b120c6,0x09b109d1,0x002109b1,0x1884314a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa38441e6,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xa384a384,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xa384a384,0x29239325,0xab881881,0x4943a347,0xa3479ac6,0xa3474983,0x41228a85,0xb3a9a347,0xa34751c4,0x18a1ab88, +0x7bcf4a49,0xb596b596,0x7befb596,0x42084208,0x420839e7,0xb5967bef,0xad559cf3,0x31867bcf,0x7bcf4a49,0xb596b596,0xb596b596,0xb596b596,0xb596a514,0xb596b596,0xad559cf3,0x31867bcf,0x7bcf4a49,0xb596b596,0xb596ad55,0x10822104,0x21041082,0xb596ce59,0xad559cf3,0x31867bcf,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x73ae7bef,0x73ae73ae,0x73ae73ae,0xfff673ae,0xfd65fd65,0x73aefd65,0x73ae73ae,0x7bef8c71,0x73ae7bef,0x73ae73ae,0x73ae73ae,0xdd7273ae,0xac6eac6e,0x73aeac6e,0x73ae73ae,0x7bef8c71,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x39e773ae,0x31a631a6,0x73ae31a6,0x73ae73ae,0x7bef8c71,0x20e29c29,0x20e220e2,0x20e220e2,0x290220e2,0x29022902,0x20e220e2,0x2a6f32d1,0x9c292902, +0x5aeb8c51,0xb5b6b596,0x11622b45,0x6b4db596,0x3386bdd7,0x1a239492,0xc6185aeb,0x7bef7bef,0x10830862,0x10831083,0x10821083,0x20e51083,0x08620863,0x00220862,0x086218c5,0x10831083,0x00000021,0x20c620c6,0x31091884,0x00b009d1,0x09b11083,0x3109314a,0x002109b1,0x188409b1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b4341c5,0x8b438b43,0xabc58b43,0xa384a384,0x8b438b43,0xa3638b43,0x8b43abc5,0xa384a384,0x8b438b43,0x8b438b43,0xabc58b43,0xa384a384,0x8b438b43,0xa3638b43,0x8b43abc5,0x29237ae4,0xb3a918a1,0x49638a65,0x498351a4,0x51c451c4,0x51c44963,0x51a44983,0xa34751c4,0x18a1ab88, +0x8c714a49,0xc638c638,0xce59c638,0xce79ce79,0xce79c618,0xc638ce59,0xc638c638,0x39e78c71,0x8c714a49,0xc638c638,0xce59c638,0xce79ce79,0xce79c618,0xc638ce59,0xc638c638,0x39e78c71,0x8c714a49,0xc638c638,0xce59c638,0x00002104,0x21040000,0xc638ce59,0xc638c638,0x39e78c71,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0xfff67bef,0x6b4dff69,0x73ae8c71,0x7bef7bef,0xfff6ffff,0x8c718c71,0x8c718c71,0x8c718c71,0xdd727bef,0x6b4dbcd0,0x73ae8c71,0x7bef7bef,0xdd72e615,0x8c718c71,0x8c718c71,0x8c718c71,0x39e77bef,0x6b4d31a6,0x73ae8c71,0x7bef7bef,0x39e74228,0x8c718c71,0x8c718c71,0x8c718c71,0x9c29bccc,0x9c299c29,0xbccc9c29,0xb48bb48b,0x9c299c29,0x72e79c29,0x9c29bccc,0x9c299c29, +0x08e17bef,0xbdd71a23,0x2b053c47,0xb59622a4,0x2b05ad55,0x19c32244,0x21041182,0xb596c638,0x08410862,0x18c5398a,0x10830862,0x18c520e6,0x08621083,0x08411083,0x18c518a5,0x10830862,0x18840021,0x00b020c6,0x10831884,0x09b109d1,0x09b11083,0x002200b0,0x002109b1,0x188409b1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0xabc5abc5,0xa363abc5,0xabc58b43,0xa384abc5,0xa384a384,0xabc5abc5,0xabc58b43,0xa384abc5,0xabc5abc5,0xa363abc5,0xabc58b43,0xa384abc5,0xa384a384,0xabc5abc5,0x29239365,0xab8818a1,0x51c49ac6,0xa347ab88,0xab8851a4,0x51c4ab88,0xab88a347,0xa34751c4,0x18a1b3a9, +0x42282965,0x84107bcf,0x528a5aeb,0x5acb4a69,0x52aa5acb,0x4a69528a,0x5aeb73ae,0x39c77bcf,0x42282965,0x8c717bcf,0x7bcf9cf3,0x94b273ae,0x84309492,0x6b6d7bcf,0x5aeb6b4d,0x39c77bcf,0x42282965,0x84107bcf,0x528a5aeb,0x21048c71,0x632c2104,0x6b6d528a,0x5aeb73ae,0x39c77bcf,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x6b4d73ae,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x6b4d73ae,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x6b4d73ae,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x72e772e7,0x6aa66aa6,0x6aa66aa6,0x72e76aa6,0x72e772e7,0x6aa66aa6,0x6aa66aa6,0x72e772e7, +0x7bef7bef,0x1a031122,0xb5963c27,0x19e31a23,0x19c32244,0x8c5131a6,0x39c77bef,0xc6182264,0x10831083,0x08620841,0x18a51083,0x108418c5,0x08411083,0x084118c5,0x398a3129,0x108418c5,0x18840021,0x00b020c6,0x10831884,0x314a314a,0x09b11083,0x20c600b0,0x002120c6,0x188409b1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x930441e5,0x8b048b04,0x8b048b04,0x93048b04,0x93049304,0x8b048b04,0x8b048b04,0x62027263,0x72836202,0x8b048b04,0x8b048b04,0x93048b04,0x93049304,0x8b048b04,0x8b048b04,0x292382c4,0xab880840,0x59c4a347,0xa347ab88,0xab8851c4,0x51a4ab88,0xab68a367,0xa34751c4,0x18a1ab88, +0x5aeb2965,0x21245acb,0xb5b6738e,0xad55ad55,0xa534ad55,0x6b4da534,0x5acbad55,0x39c7528a,0x5aeb2965,0x632c5acb,0x8c718c71,0x632c6b4d,0x5acb6b4d,0x7bef5acb,0x5acb8430,0x39c7528a,0x5aeb2965,0x6b6d6b6d,0x4a69738e,0x84304a69,0x5acb8430,0x4a696b6d,0x5acb6b4d,0x39c7528a,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x8c718c71,0xffff7bef,0xff69fff6,0xfd65ff69,0x7bef7bef,0xfd65ff69,0x8c718c71,0x6b4d8c71,0x8c718c71,0xe6157bef,0xbcd0dd72,0xac6ebcd0,0x7bef7bef,0xac6ebcd0,0x8c718c71,0x6b4d8c71,0x8c718c71,0x42287bef,0x31a639e7,0x31a631a6,0x7bef7bef,0x31a631a6,0x8c718c71,0x6b4d8c71,0xb8a2bccc,0x146d9082,0x2a6f32d1,0x5b817462,0xb8a23963,0x74629082,0x146d5b81,0xbccc0b4a, +0x7bef7bef,0x1a232b05,0x11422284,0x224439c7,0x33662264,0x2b05a514,0x7bef738e,0x52aa2b05,0x10821083,0x10831083,0x398a398a,0x398a398a,0x08410862,0x0862398a,0x08410841,0x08620841,0x1884314a,0x00b009b1,0x10831884,0x108341cc,0x09b11083,0x314a00b0,0x20c63109,0x00b009b1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x72c641e6,0x72a572c6,0x72c672c6,0x6a8572c6,0x6a856a85,0x72c672a5,0x72c672c6,0x94926244,0x41a373ae,0x72a572c6,0x72c672c6,0x6a8572c6,0x6a856a85,0x72c672a5,0x72c672c6,0x292372c6,0xab880840,0x51a4a347,0x498351a4,0x51a451a4,0x51c44963,0x49434983,0xa34751a4,0x0840ab88, +0x630c3186,0x29457bef,0x08610000,0x10820861,0x10821082,0x000010a2,0x8430a534,0x2104630c,0x630c3186,0x6b6d7bef,0x5acb73ae,0x7bcf6b4d,0x8430738e,0x7bef8c71,0x84308410,0x2104630c,0x630c3186,0x6b6d7bef,0x6b6d5aeb,0x528a528a,0x6b6d528a,0x6b6d7bcf,0x8430528a,0x2104630c,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x73ae73ae,0x7bef7bef,0xffff7bef,0x73aefff6,0x6b4d7bef,0xfff6ffff,0x73ae73ae,0x7bef6b4d,0x73ae73ae,0x7bef7bef,0xe6157bef,0x73aedd72,0x6b4d7bef,0xdd72e615,0x73ae73ae,0x7bef6b4d,0x73ae73ae,0x7bef7bef,0x42287bef,0x73ae39e7,0x6b4d7bef,0x39e74228,0x73ae73ae,0x7bef6b4d,0xb8a29c29,0x146d9082,0x2a6f32d1,0x39e74a49,0xb8a24183,0x74629082,0x146d5b81,0x9c290b4a, +0x8430738e,0x1a237bef,0x8c512ae5,0x11427bef,0xc6383c27,0x2b457bcf,0x5acb630c,0x11621122,0x10831083,0x08421082,0x08410841,0x08410841,0x08621083,0x10830841,0x10831083,0x08620862,0x18840021,0x00b009d1,0x41cc1884,0x20c641cc,0x09d120c6,0x20c600b0,0x314a0022,0x00b009b1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x316441c5,0x31843164,0x31843184,0x31643184,0x31843184,0x31843184,0x31643164,0xa5342923,0x292373ae,0x31843164,0x31843184,0x31643184,0x31843184,0x31843184,0x31643164,0x18e23164,0xab880840,0x51c4a347,0xa347ab88,0x92a54122,0x4983a347,0x9ac68a85,0xa34751a4,0x18a1ab88, +0x5acb2945,0x29457bef,0x00000000,0x00000000,0x00000000,0x00000000,0x6b4da514,0x212439c7,0x5acb2945,0x6b6d7bef,0x7bef7bef,0x5acb7bcf,0x94929492,0x84107bef,0x6b4d7bcf,0x212439c7,0x5acb2945,0x73ae7bef,0xb596b596,0x6b6d8c71,0xce59528a,0x7bcfb596,0x6b4d7bcf,0x212439c7,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf8000000, +0x8c717bef,0x73ae8c71,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x8c718c71,0x6b4d8c71,0x8c717bef,0x73ae8c71,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x8c718c71,0x6b4d8c71,0x8c717bef,0x73ae8c71,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x8c718c71,0x6b4d8c71,0xb8a2bccc,0x146d9082,0x2a6f32d1,0x39e74a49,0x9082b8a2,0x74623963,0xb5b65b81,0xbccc8c51, +0xb596b596,0x1a235aeb,0x8430b596,0x39e78430,0x3be71a23,0x33c69cf3,0x7bef1a03,0x5aebad55,0x08410862,0x108318c5,0x10821082,0x10830862,0x08620861,0x08421083,0x086318c5,0x10831083,0x18840021,0x00b009d1,0x00211884,0x20c641cc,0x09d128c8,0x20c609b1,0x18840022,0x00b009b1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x7ae441e6,0x7ae47ae4,0x93657ae4,0x7ae49365,0x7ae49365,0x93047ae4,0x93259325,0xc6187ac4,0x51e28430,0x7ae47ae4,0x93657ae4,0x7ae49365,0x7ae49365,0x93047ae4,0x93259325,0x29239325,0xab881061,0x51c4a347,0xa2e69ac6,0xab8851a4,0x4943ab88,0xb3a99ac6,0xa34751c4,0x18a1ab88, +0x738e39c7,0x4a697bcf,0x000031a6,0x00000000,0x00000000,0x31a60000,0x8430528a,0x2124738e,0x738e39c7,0x6b4d7bcf,0x7bcf8c71,0x5acb7bcf,0x8c516b4d,0x94b294b2,0x8430738e,0x2124738e,0x738e39c7,0xb5968c71,0xb596b596,0x528a39c7,0x84308430,0xb596ce59,0x7bcfb596,0x2124738e,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000, +0x8c717bef,0x7bef7bef,0x6b4d7bef,0xfff67bef,0x7beffd65,0x73ae73ae,0x73ae73ae,0x7bef73ae,0x8c717bef,0x7bef7bef,0x6b4d7bef,0xdd727bef,0x7befac6e,0x73ae73ae,0x73ae73ae,0x7bef73ae,0x8c717bef,0x7bef7bef,0x6b4d7bef,0x39e77bef,0x7bef31a6,0x73ae73ae,0x73ae73ae,0x7bef73ae,0xb5b66aa6,0x146d8c51,0x2a6f32d1,0x5b817462,0x9082b8a2,0x74623142,0x146d5b81,0x72e70b4a, +0x19c322c4,0x1a231122,0x2284bdd7,0x7bef94b2,0x1a2339c7,0x39e71142,0xad551a23,0x1a23b5b6,0x08410862,0x20c518c5,0x10820862,0x41cc1082,0x18c518c5,0x10830862,0x08620841,0x10831083,0x31090021,0x00b009d1,0x00211884,0x310941cc,0x314a314a,0x20c61884,0x18840022,0x00b009d1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa34441e6,0xa363a344,0xa363a363,0xa363a363,0xa363a363,0xa344a344,0xa344a344,0xce798ac3,0x8ac3a534,0xa363a344,0xa363a363,0xa363a363,0xa363a363,0xa344a344,0xa344a344,0x2923a363,0x290218a1,0x51a4a368,0x51c44963,0x51c451c4,0x49434963,0x51a451c4,0xa34751c4,0x08402902, +0x528a2965,0x6b6d5aeb,0x21246b6d,0x31863186,0x29452104,0x42082104,0x8c516b4d,0x29456b4d,0x528a2965,0x6b6d5aeb,0x632c9cd3,0x84308c51,0x6b6d5aeb,0x5acb5acb,0x8c516b4d,0x29456b4d,0x528a2965,0xce595aeb,0x528ace59,0x6b6d528a,0x6b6d6b6d,0xce596b6d,0x8c51ce59,0x29456b4d,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000, +0x6b4d7bef,0x73ae73ae,0x73aeff69,0x73ae73ae,0x73ae8c71,0x7bef7bef,0xff69fff6,0x7bef7bef,0x6b4d7bef,0x73ae73ae,0x73aebcd0,0x73ae73ae,0x73ae8c71,0x7bef7bef,0xbcd0dd72,0x7bef7bef,0x6b4d7bef,0x73ae73ae,0x73ae31a6,0x73ae73ae,0x73ae8c71,0x7bef7bef,0x31a639e7,0x7bef7bef,0xb8a2bccc,0x29029082,0x2a6f32d1,0x5b817462,0x31423142,0x74623142,0x39635b81,0x9c294183, +0x7bef1a23,0x11227bef,0x3c471a23,0x2b25b596,0x08e13186,0x7bef8c51,0x1a231142,0x84301a23,0x08411083,0x398a396a,0x0862398a,0x08410862,0x18c5398a,0x08621083,0x398a0841,0x108318c5,0x31090021,0x09b109d1,0x20c620c6,0x18841884,0x18840021,0x20c620c6,0x314a3109,0x09d109d1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0xa384abc5,0xabc5a363,0x51e2a384,0xabc551e2,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0xa384abc5,0xabc5a363,0x2923abc5,0xb48b0840,0xa34720e2,0x9b27a347,0xa347a347,0xa347a388,0xa347a347,0x2102a347,0x18a1b48b, +0x528a2945,0x52aa7bcf,0x8c71630c,0x7bcf8c71,0x528a632c,0x7bef8430,0x7bcf5aeb,0x3186528a,0x528a2945,0x52aa7bcf,0x8c71630c,0x7bcf8c71,0x528a632c,0x7bef8430,0x7bcf5aeb,0x3186528a,0x528a2945,0x52aa7bcf,0x5aeb630c,0x7bcf5aeb,0x528a632c,0x7bef8430,0x7bcf5aeb,0x3186528a,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000, +0x7bef7bef,0x8c718c71,0x8c718c71,0x8c718c71,0x8c7173ae,0x8c718c71,0x7bef6b4d,0x73ae7bef,0x7bef7bef,0x8c718c71,0x8c718c71,0x8c718c71,0x8c7173ae,0x8c718c71,0x7bef6b4d,0x73ae7bef,0x7bef7bef,0x8c718c71,0x8c718c71,0x8c718c71,0x8c7173ae,0x8c718c71,0x7bef6b4d,0x73ae7bef,0x2902bccc,0x20e220e2,0x20e220e2,0x5b817462,0x29022902,0x20e220e2,0x20e220e2,0x9c292902, +0xb596b596,0x7bef6b4d,0x1a232965,0x3c473c47,0x7bef1a23,0x7bef8c51,0x11629492,0x9cf36b6d,0x10820862,0x08410841,0x10820841,0x10830863,0x314a0841,0x10831083,0x08411083,0x1083398a,0x310941cc,0x09d120c6,0x314a00b0,0x1884314a,0x314a1884,0x3109314a,0x00223109,0x314a314a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0xa363a384,0xa384a384,0x8b438b43,0x8b438b43,0xa3848b43,0xa3848b43,0x8b438b43,0x8b438b43,0xa363a384,0xa384a384,0x8b438b43,0x8b438b43,0xa3848b43,0xa3848b43,0x2923abc5,0xb48b18a1,0x2902b46a,0xab88ab88,0xab88ab88,0xab88ab68,0xab88ab88,0xbcac2922,0x1881b48b, +0x6b6d39c7,0x630c5acb,0x52aa4228,0x738e738e,0x630c4a69,0x630c632c,0x422852aa,0x318652aa,0x6b6d39c7,0x630c5acb,0x52aa4228,0x738e738e,0x630c4a69,0x630c632c,0x422852aa,0x318652aa,0x6b6d39c7,0x630c5acb,0x52aa4228,0x738e738e,0x630c4a69,0x630c632c,0x422852aa,0x318652aa,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x73ae7bef,0x73ae73ae,0x7bef73ae,0x8c718c71,0x8c716b4d,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x8c718c71,0x8c716b4d,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x8c718c71,0x8c716b4d,0x73ae7bef,0x73ae73ae,0x7bef73ae,0xbcccbccc,0xb48bbccc,0xbcccbccc,0x9c29bccc,0x9c299c29,0xbccc72e7,0xbcccbccc,0x9c29bccc, +0xb596b596,0xa534b596,0x7bef94b2,0x1a232244,0xb5965aeb,0xb596b596,0x5aeb8410,0x8c71b5b6,0x10831083,0x08621083,0x10830862,0x08620862,0x08411083,0x10830862,0x10821084,0x10830841,0x310941cc,0x09b10021,0x314a00b0,0x1884314a,0x00221884,0x002109b1,0x18841884,0x18840021,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x41c541e6,0x41c541c5,0x41e641c5,0x41e641e6,0x41e641c5,0x41e641e6,0x41e641e6,0x292341e6,0x41c541e6,0x41c541c5,0x41e641c5,0x41e641e6,0x41e641c5,0x41e641e6,0x41e641e6,0x316441e6,0x18a118a1,0x18a10840,0x188118a1,0x08400840,0x18a10840,0x084018a1,0x18a118a1,0x18a118a1, +0x31a639c7,0x318631a6,0x29653186,0x29652965,0x39c72124,0x31a639c7,0x21242965,0x318631a6,0x31a639c7,0x318631a6,0x29653186,0x29652965,0x39c72124,0x31a639c7,0x21242965,0x318631a6,0x31a639c7,0x318631a6,0x29653186,0x29652965,0x39c72124,0x31a639c7,0x21242965,0x318631a6,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x73ae7bcf,0x4a69738e,0x29452945,0x5aeb39c7,0x8410ad75,0x5aeb52aa,0x4a494228,0x630c39e7,0x31863186,0x31863186,0x94b20020,0x52aa94b2,0x52aa52aa,0x318652aa,0x31863186,0x52aa52aa,0xe6f4d673,0xc5d0d693,0xded4fffa,0xef16c611,0xf737deb3,0xd672d652,0xdeb3d673,0xc611d693,0x94505248,0xa4b24a08,0x6aec9c71,0x94505269,0x52495249,0xa4904a28,0x6aecb514,0x9cd3b470, +0x6a865a45,0x39837b07,0x6aa66265,0x41846a86,0x6aa66aa6,0x31426286,0x6aa66286,0x7b076285,0x6ac76aa6,0x6aa63963,0x6a866aa6,0x6aa63963,0x6aa66aa6,0x6aa66aa6,0x39633963,0x6aa63963,0xef5def5d,0xe73ce73c,0xdefbdefb,0xd69adedb,0xdedbd6ba,0xd6bad6ba,0xd6bad6ba,0xce79d69a,0xff89ffa9,0xff28ff68,0xfec7fee7,0xf646f686,0xfe87f646,0xfe66fe66,0xfe26fe46,0xfde6fe06, +0x6efb7f1b,0x4eda5efa,0x1e782e99,0x06160637,0x06580617,0x06370637,0x06170637,0x05d605f6,0x31642923,0x39643164,0x31643164,0x31643964,0x31643164,0x31643164,0x31643164,0x31643164,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232103,0x20e22923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232103,0x20e22923, +0x00000000,0x00000000,0x00000000,0x7a080000,0x00005165,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x6aca0000,0x00004a07,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800, +0x8c5173ae,0xa5144208,0x7bcf8410,0x5aeb7bef,0x5aeb5aeb,0x94927bef,0x94b28c51,0x39c739e7,0x52aa52aa,0x318652aa,0x31863186,0x31863186,0x52aa52aa,0x94b294b2,0x318652aa,0x52aa3186,0xde74e6b5,0xce52d673,0xd653de94,0xe6d4deb3,0xded4b56e,0xd693bdaf,0xcdf2e6d5,0xe6b5ce52,0x7b8d9c91,0x8bef6b0c,0x9cd36aec,0x524983ce,0xb555bdd7,0xa4d28c0f,0x6aca83ce,0x83ae7b6c, +0x62863963,0x418493a9,0x7b076aa6,0x398349e4,0x6a869388,0x39639bc9,0x7b076285,0x62863983,0xb48b49e4,0xb48bb48b,0xb48bb48b,0xac4aac4a,0xb48bb48b,0xb48bac2a,0xb48bb48b,0x6aa6b48b,0xf79ed6ba,0xef7def7d,0xef7def7d,0xef7def7d,0xef5def5d,0xdedbe71c,0xd6bad6ba,0xc638d69a,0xffeaeea8,0xffaaffca,0xffcaffaa,0xffaaffaa,0xff8aff8a,0xfea6ff08,0xf665f686,0xe5a5f645, +0x975c0637,0x7f1b8f3c,0x873c873c,0x7f1b873c,0x6f1b7f1b,0x0e583699,0x06170637,0x05730616,0x83053184,0x7ae47ae4,0x93657ae4,0x7ae49365,0x93659365,0x93257ae4,0x93659365,0x31848305,0x936541e6,0x7ae47ae4,0x93657ae4,0x7ae49365,0x93659365,0x93257ae4,0x93659365,0x29238305,0x936541e6,0x7ae47ae4,0x93657ae4,0x7ae49365,0x93659365,0x93257ae4,0x93659365,0x29238305, +0x00000000,0x00000000,0xc0e40000,0x98a398a3,0x98a398a3,0x000098a3,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x6aca0000,0x00004a07,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb60f800,0xfb60f800,0xfb60f800,0x0000f800,0xf8000000,0xf800fb60,0xfb60f800,0xf800f800, +0x7bcfbdd7,0xb5b6738e,0xb5b6ad55,0x39c75aeb,0xce59630c,0x7befa534,0x7bef9492,0x31a68c51,0x94b252aa,0x94b23186,0x52aa0020,0x318652aa,0x31863186,0x31860020,0x52aa52aa,0x94b294b2,0xe6d5fffa,0xb56ece31,0xd672d652,0xf757d672,0xf757e6b5,0xded4e6d5,0xd693e6f4,0xd653e6d5,0x9c91b554,0xb554bdb6,0x83efa4f3,0xad3594b2,0x83ce8c30,0x94309cb2,0xb4f35aaa,0x5a69b596, +0x6ac641a4,0x6aa65a45,0x7b076a86,0x6ac749e4,0x62656ac6,0x39836286,0x93a86aa6,0x39639be9,0xb48b3963,0x9c299be8,0x9c29a44a,0x9c299c29,0xa4299be9,0xa44a9c29,0xa44aa46a,0x3963b46b,0xf79ededb,0xef7df79e,0xf79ef79e,0xf79ef79e,0xef5def7d,0xe71ce71c,0xdedbdefb,0xce59dedb,0xffeceea9,0xffccffec,0xffecffec,0xffecffec,0xffabffcb,0xff07ff28,0xfec7fee7,0xedc5fea6, +0xa77d0637,0x975c975c,0xa75da75d,0x9f5ca75d,0x7f1b8f3c,0x2e9946ba,0x0e581e78,0x05940e58,0x7ae43184,0xabc5a363,0xabc5abc5,0x8b43abc5,0xa384abc5,0x8b43a384,0x8b438b43,0x31847ae4,0x8b4341e6,0xabc5a363,0xabc5abc5,0x8b43abc5,0xa384abc5,0x8b43a384,0x8b438b43,0x29237ae4,0x8b4341e6,0xabc5a363,0xabc5abc5,0x8b43abc5,0xa384abc5,0x8b43a384,0x8b438b43,0x29237ae4, +0x00000000,0x00000000,0xe082ce79,0xce79c0e4,0x98a3c0e4,0x94b298a3,0x00000000,0x00000000,0x00000000,0x00000000,0x936a0000,0x72a872a8,0x72a872a8,0x000072a8,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb60f800,0x00000000,0x0000f800,0x0000fb60,0x00000000,0xfb600000,0x0000fb60,0xf800f800, +0xb596b596,0x39c739c7,0x39c739c7,0x7bef630c,0x31a64228,0x9cf3b596,0x7bef7bef,0x5aeb5aeb,0x318652aa,0x31863186,0x31863186,0x31863186,0x94b294b2,0x31863186,0x31863186,0x52aa3186,0xdeb4ef16,0xef36d672,0xd652ded4,0xbdafe6d4,0xdeb3c5f1,0xd652de93,0xe6d5e6b5,0xd673d652,0xa4b2b554,0x5a6a9471,0xb555b555,0x83efacf4,0x9cf3ad34,0xa51483ef,0x5289a4d2,0x8c0f83ce, +0x9bc93963,0x62863963,0x9bc96aa6,0x6aa63943,0x62853983,0x396393a9,0x62656aa6,0x9bc94184,0xb48b3963,0xbccc9c29,0xb48bbccc,0xbcccbcac,0xbcccbccc,0xbcccbccc,0x9c29bcac,0x3963b48b,0xf79ededb,0xf79ef79e,0xf79ef79e,0xf79ef79e,0xef7df79e,0xe73cef5d,0xdedbdefb,0xce59dedb,0xffeeeeaa,0xffeeffee,0xffeeffee,0xffedffed,0xffccffcd,0xff49ff8a,0xf6a7f6e7,0xedc5f6a6, +0xaf7d0637,0xa75da75d,0xaf7da77d,0xa75daf7d,0x8f3c975c,0x56da7f1b,0x06581e78,0x05940657,0x93653184,0xabc5abc5,0x8b43abc5,0x8b43abc5,0x8b438b43,0x8b438b43,0xa363a384,0x31849365,0xabc541e6,0xabc5abc5,0x8b43abc5,0x8b43abc5,0x8b438b43,0x8b438b43,0xa363a384,0x29239365,0xabc541e6,0xabc5abc5,0x8b43abc5,0x8b43abc5,0x8b438b43,0x8b438b43,0xa363a384,0x29239365, +0x00000000,0x00000000,0xe082f945,0xe082e082,0xce79e082,0x98a398a3,0x00000000,0x00000000,0x00000000,0x00000000,0x936a0000,0x936a936a,0x72a8936a,0x000072a8,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb60f800,0x0000f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x5aeb5aeb,0x7befa514,0x39c76b6d,0x84107bef,0x7bef9492,0x528a39c7,0x5aebad75,0x39c75aeb,0x52aa0020,0x52aa52aa,0x52aa3186,0x52aa52aa,0x94b294b2,0x52aa52aa,0x94b252aa,0x002094b2,0xe6d5ce32,0xcdf2e6f4,0xd673deb4,0xde93deb3,0xdeb3deb4,0xffd8de93,0xd672d672,0xbd8fd652,0xb5556aec,0x6aeab534,0x8c71730b,0x52aa73ae,0x5249a4d3,0x5249ad35,0x6aec6aea,0x94507bcf, +0x7b073983,0x62863983,0x9bc96ac7,0x9bc941a4,0x5a453943,0x39839be9,0x93a96aa6,0x9bc93963,0xb46b3963,0xbccc9c29,0xb48bb46b,0xb46bb48b,0xb48bb48b,0xbcabb48b,0xa44abccc,0x6285b48b,0xf79ededb,0xf79ef79e,0xf79ef79e,0xf79ef79e,0xf79ef79e,0xef7df79e,0xe71ce73c,0xce59defb,0xffefee8a,0xffeeffef,0xffeeffee,0xffedffee,0xffcdffed,0xffabffec,0xff28ff69,0xe5e5fee8, +0xaf7d0637,0xaf7daf7d,0xaf7daf7d,0xa77daf7d,0x9f5ca75d,0x873c9f5c,0x3eb95efa,0x05942699,0x8b043164,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0x31648b04,0xa34441e5,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0x29238b04,0xa34441e5,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0x29238b04, +0x00000000,0x00000000,0xf9450000,0xe082ffff,0xc0e4e082,0x000098a3,0x00000000,0x00000000,0x00000000,0x00000000,0xcccf0000,0x936acccf,0x936a936a,0x000072a8,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000,0xf800f800, +0xa5345aeb,0x7bef7bcf,0x31867bef,0x94b2b596,0x7bef7bef,0x39c78430,0x5aeb5aeb,0x84309cd3,0x52aa52aa,0x318694b2,0x94b23186,0x318694b2,0x31860020,0x94b294b2,0x52aa94b2,0x52aa52aa,0xe6b5ded4,0xe6d5ad0d,0xef16c611,0xde74d693,0xf756f737,0xd672e715,0xd693deb3,0xdeb3d692,0xb5556acc,0x4a28b555,0x5a68ac71,0x736d630b,0x736d9451,0x94306aec,0x7bad83ef,0x62cbbdf7, +0x7b0741c4,0x6aa64184,0x93a86286,0x62653963,0x5a453983,0x41849bea,0x9bc96aa6,0x93a841a4,0xb46a6286,0xb48b9c29,0x9c29b48b,0x9c299c29,0x9c299c29,0xbcab9c29,0x9c29bccc,0x6a86b48b,0xf79ed6ba,0xf79ef79e,0xf79ef79e,0xf79ef79e,0xf79ef79e,0xf79ef79e,0xef7df79e,0xce79ef5d,0xffeeee89,0xffeeffee,0xffedffed,0xffecffed,0xffecffec,0xffebffeb,0xffaaffeb,0xee06ff69, +0xa77d0637,0xaf7daf7d,0xa75da77d,0xa77da77d,0xa75da75d,0xa75d9f5c,0x873c9f5c,0x05d566fb,0x93253184,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xa384a384,0x31649325,0xa38441e6,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xa384a384,0x29239325,0xa38441e6,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xa384a384,0x29239325, +0x00000000,0x00000000,0x00000000,0xf945f945,0xe082f945,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xcccfcccf,0x936acccf,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x5aeb8c51,0xb5b6b596,0x39c78c51,0x6b4db596,0x9492bdd7,0x5aeb9492,0xc6185aeb,0x7bef7bef,0x318652aa,0x31863186,0x31863186,0x52aa3186,0x52aa0020,0x318652aa,0x31863186,0x52aa94b2,0xb54ec5d0,0xde93e6d5,0xde94de93,0xd672e6d5,0xdeb3deb3,0xef56deb3,0xe6b5deb3,0xef15c5f0,0x6aec9431,0xa514a534,0x6aec83ee,0xc5f8c5f8,0x83cf4a28,0x730bbdf7,0x9c5183ae,0x4a286b4d, +0x9be96aa6,0x628641c4,0x93a86ac6,0x6aa641a4,0x39636aa6,0x41a493a8,0x93a86aa6,0x7b0741a4,0xb48b6aa6,0xbccc9c09,0x9be9b46b,0xbcccbccc,0xbcccbccc,0xb48b9c29,0x9c09bccc,0x6aa6b48b,0xf79ed6ba,0xef7df79e,0xf79ef79e,0xf79eef7d,0xf79ef79e,0xf79ef79e,0xef7df79e,0xd69aef7d,0xffcdee89,0xffc9ffed,0xffccffcc,0xffebffcb,0xffebffeb,0xffeaffeb,0xffcaffea,0xee67ffa9, +0x975c0637,0x873ca77d,0x975c975c,0x975c975c,0x975c975c,0x9f5c9f5c,0x8f3c975c,0x0616873c,0x7ae43164,0x8b438b43,0xabc58b43,0xa384a384,0x8b438b43,0xa3638b43,0x8b43abc5,0x31647ae4,0x8b4341c5,0x8b438b43,0xabc58b43,0xa384a384,0x8b438b43,0xa3638b43,0x8b43abc5,0x29237ae4,0x8b4341c5,0x8b438b43,0xabc58b43,0xa384a384,0x8b438b43,0xa3638b43,0x8b43abc5,0x29237ae4, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x21247bef,0xbdd75aeb,0x7befb596,0xb5966b6d,0x7befad55,0x4a495aeb,0x210439e7,0xb596c638,0x94b252aa,0x002094b2,0x318694b2,0x52aa52aa,0x94b252aa,0x94b294b2,0x94b294b2,0x94b294b2,0xde95e6d4,0xe6d5ef16,0xd672e6b5,0xde95eef6,0xfffaf737,0xdeb3c5d0,0xde74d673,0xdeb3d672,0x528a6b4d,0x52485248,0x94109470,0x83efad13,0x62eb9cd3,0x94116aec,0x6aecb554,0x5b0c9c71, +0x9bc96aa6,0x72c73983,0x41a493a8,0x41846aa6,0x41a46aa6,0x39639388,0x6aa66aa6,0x7b073983,0xb48b6aa6,0xbcccac8b,0x9c29b48b,0xb48bbcac,0xbcccb48b,0xb48b9c09,0x9c09bccc,0x6aa6bcab,0xf79ed6ba,0xef7df79e,0xef5df79e,0xef5def5d,0xef5def5d,0xef5def5d,0xe73cef5d,0xce79e71c,0xffcceea8,0xffc9ffec,0xff88ffed,0xff88ff88,0xff88ff88,0xff88ff88,0xff67ff88,0xee45f746, +0x975c0637,0x873ca75d,0x6efba75d,0x6efb6efb,0x6efb6efb,0x6efb6efb,0x56da6efb,0x05d63eb9,0x93653184,0xabc5abc5,0xa363abc5,0xabc58b43,0xa384abc5,0xa384a384,0xabc5abc5,0x31649365,0xabc541e6,0xabc5abc5,0xa363abc5,0xabc58b43,0xa384abc5,0xa384a384,0xabc5abc5,0x29239365,0xabc541e6,0xabc5abc5,0xa363abc5,0xabc58b43,0xa384abc5,0xa384a384,0xabc5abc5,0x29239365, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x7bef7bef,0x52aa3186,0xb596ad55,0x528a5aeb,0x4a695aeb,0x8c5131a6,0x39c77bef,0xc618630c,0x52aa52aa,0x318652aa,0x31863186,0x31863186,0x00203186,0x31863186,0x31863186,0x52aa52aa,0xd693deb3,0xde93e6d5,0xd652deb3,0xffb7e6f5,0xd633deb4,0xd672d693,0xe6b5ded4,0xe6d5d672,0x6aec6aec,0xbdb6bdb6,0x8c71ad34,0x4a489c71,0xa4706aec,0x6aec8c30,0x6b4d83ef,0x736e7bf0, +0x9bc96aa6,0x6aa63983,0x39839bc9,0x41a49bc9,0x39639bc9,0x49e47b07,0x7b076286,0x6ac73983,0xb48b3963,0xcd2d9c29,0x9c29b48b,0xb48bbccc,0xbcacb48b,0xac4aa429,0x9c29bccc,0x72e7b48b,0xf79ed6ba,0xef7def7d,0xef5def5d,0xef5def5d,0xef5def5d,0xef7def5d,0xef5def7d,0xd69ae73c,0xffeceea7,0xffc9ffcb,0xff88ff88,0xff88ff88,0xff88ff88,0xffc8ffa8,0xffa8ffc8,0xee66ff87, +0x9f5c0637,0x873c8f3c,0x6efb6efb,0x6efb6efb,0x6f1b6efb,0x7f1b771b,0x771b873c,0x05f65efa,0x93043164,0xa344a344,0xa344a344,0xa363a344,0xa363a363,0xa344a344,0xa344a344,0x31649304,0x930441e5,0x8b048b04,0x8b048b04,0x93048b04,0x93049304,0x8b048b04,0x8b048b04,0x292382c4,0x930441e5,0x8b048b04,0x8b048b04,0x62027263,0x72836202,0x8b048b04,0x8b048b04,0x292382c4, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x7bef7bef,0x5aeb7bef,0x39c76b4d,0x630c39c7,0x8c71630c,0x7befa514,0x7bef738e,0x52aa7bef,0x94b294b2,0x630c52aa,0x318652aa,0x94b294b2,0x52aa52aa,0x52aa52aa,0x94b294b2,0x002094b2,0xde95bdaf,0xdeb3cdf2,0xe6d4bdd0,0xd672de93,0xd693d673,0xffb9eef6,0xe6d5deb3,0xde74deb4,0xacb2a4f3,0x94517bcf,0xa4b39c51,0xb51483f0,0x736d9c91,0x4a288bef,0x8c314a28,0x6aec8c31, +0x7b076a86,0x6aa649e4,0x626593a9,0x39636a86,0x39639388,0x5a257b07,0x7b073142,0x6ac73983,0xb48b3963,0xbcac9c29,0x9c09b48b,0xbcacbcac,0xbcccbccc,0xb48b9c29,0x9c29bcab,0x3963b48b,0xef7dd6ba,0xef7def7d,0xef5def7d,0xef7def7d,0xef7def7d,0xef7def7d,0xef7def7d,0xd69aef5d,0xffebe688,0xffc9ffca,0xffa8ffc9,0xffc9ffc9,0xffc9ffc9,0xffe9ffc9,0xffc8ffe9,0xee66ff88, +0x975c0637,0x873c873c,0x771b873c,0x873c873c,0x873c873c,0x873c873c,0x7f1b873c,0x06166f1b,0x93653184,0xa384abc5,0xabc5abc5,0x8b43abc5,0x8b438b43,0xabc5a363,0xabc5abc5,0x31849365,0x72c641e6,0x72a572c6,0x72c672c6,0x6a8572c6,0x6a856a85,0x72c672a5,0x72c672c6,0x292372c6,0x72c641e6,0x72a572c6,0x72c672c6,0x94926244,0x41a373ae,0x72c672a5,0x72c672c6,0x292372c6, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x8430738e,0x5aeb7bef,0x8c517bcf,0x31a67bef,0xc638ad55,0x8c517bcf,0x5acb630c,0x39c72965,0x31863186,0x52aa52aa,0x318652aa,0x31863186,0x002052aa,0x52aa52aa,0x31863186,0x52aa0020,0xded4ce31,0xfffece52,0xef15d672,0xde94deb4,0xf756d693,0xc5f0deb3,0xd652ce52,0xc5f0deb3,0xbd969c92,0xa4d37b6e,0xad357bd0,0x4a288bae,0x730b4a49,0xbd968bcf,0x5aaac5f8,0x4a286b4c, +0x5a456aa6,0x62866aa6,0x6a869bc9,0x6aa66286,0x39836aa6,0x8b686aa6,0x7b073983,0x62864184,0xb48b3963,0xbccc9c09,0x9c29b48b,0xa44aa44a,0x9c299c29,0xb48b9c29,0x9c09bcab,0x6aa6b48b,0xf79ed6ba,0xef5def7d,0xef7def5d,0xef7def7d,0xef7def7d,0xef7def7d,0xef7def7d,0xd6baef7d,0xffebee88,0xff88ffea,0xffc9ff88,0xffc9ffc9,0xffcaffca,0xffc9ffc9,0xffc9ffc9,0xee87ffc9, +0x9f5c0637,0x6efb975c,0x873c6efb,0x873c873c,0x873c873c,0x873c873c,0x7f1b873c,0x06177f1b,0x7ae43164,0xa384a363,0xa384a384,0x8b43abc5,0xa384a384,0xa384a384,0x8b438b43,0x31647ae4,0x316441c5,0x31843164,0x31843184,0x31643184,0x31843184,0x31843184,0x31643164,0x18e23164,0x316441c5,0x31843164,0x31843184,0xa5342923,0x292373ae,0x31843184,0x31643164,0x18e23164, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf8000000, +0xb596b596,0x5aeb5aeb,0x8430b596,0x39e78430,0xa5345aeb,0x9cf39cf3,0x7bef528a,0x5aebad55,0x94b252aa,0x318694b2,0x31863186,0x31863186,0x31863186,0x94b294b2,0x94b294b2,0x002094b2,0xd672e6f4,0xd672eef6,0xeef6eef6,0xeef6e6d5,0xce32e6d5,0xe6d5d672,0xc5f0d653,0xce11ded4,0xa4d26aec,0x52485248,0x5aaa9c92,0x6aec738e,0x736c94b3,0xad1462ca,0x8c309c71,0x9470a514, +0x41a46aa6,0x62866aa6,0x7b077b07,0x62866aa6,0x41a46ac7,0x9bc96aa6,0x9bc93983,0x7b073963,0xb46b49e4,0xbccc9c09,0xbcabb48b,0xb48bb48b,0xb48bb48b,0xbcabb48b,0x9c29bccc,0x6aa6b48b,0xf79ed6ba,0xef7def7d,0xf79eef7d,0xef7def7d,0xef7def7d,0xef7def7d,0xef5def5d,0xd6baef5d,0xffeaee88,0xffeaffea,0xffe9ffc9,0xffeaffe9,0xffcbffca,0xffa8ffc9,0xffa8ffa8,0xee87ffa8, +0x975c0637,0x975c8f3c,0x975c873c,0x975c975c,0x975c975c,0x7f1b873c,0x771b7f1b,0x0617771b,0x7ae43184,0x8b438b43,0xabc58b43,0x8b43abc5,0x8b43abc5,0xa3638b43,0xa384a384,0x31849325,0x7ae441e6,0x7ae47ae4,0x93657ae4,0x7ae49365,0x7ae49365,0x93047ae4,0x93259325,0x29239325,0x7ae441e6,0x7ae47ae4,0x93657ae4,0xc6187ac4,0x51e28430,0x93047ae4,0x93259325,0x29239325, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000, +0x4a49738e,0x5aeb3186,0x632cbdd7,0x7bef94b2,0x5acb39c7,0x39e739c7,0xad555aeb,0x5acbb5b6,0x94b252aa,0x52aa52aa,0x002052aa,0x94b252aa,0x52aa52aa,0x31863186,0x31863186,0x52aa3186,0xd673ce31,0xdeb4de93,0xded4d652,0xce52d652,0xd672d672,0xe6f4de93,0xde93deb3,0xbdd0deb3,0x7bef8c10,0xb535bdf7,0x9c309c70,0x6aec83cf,0x8c718c51,0x734d9c91,0x734d734d,0xa4b2b534, +0x41c46ac6,0x41846265,0x7b077b07,0x6a863983,0x39639bc9,0x9bc96a86,0x9be93983,0x7b0741a4,0xb48b6aa6,0xb48ba44a,0xbcccbccc,0xbcccbccc,0xbcabbccc,0xbcabbccc,0x9c29bccc,0x3963b48b,0xef7dd6ba,0xef7def7d,0xef7def7d,0xf79ef79e,0xef7def7d,0xef7def7d,0xef7def7d,0xd69aef7d,0xffcaee88,0xffeaffea,0xffeaffea,0xffeaffea,0xffcbffcb,0xffc9ffc9,0xffc8ffa8,0xee66ffc8, +0x975c0637,0x8f3c975c,0x975c8f3c,0x975c9f5c,0x873c975c,0x873c873c,0x7f1b7f1b,0x05f67f1b,0x8b043164,0xa363a344,0xa363a363,0xa363a363,0xa363a363,0xa344a344,0xa344a344,0x31649304,0xa34441e6,0xa363a344,0xa363a363,0xa363a363,0xa363a363,0xa344a344,0xa344a344,0x2923a363,0xa34441e6,0xa363a344,0xa363a363,0xce798ac3,0x8ac3a534,0xa344a344,0xa344a344,0x2923a363, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000, +0x7bef5acb,0x29657bef,0xb5965acb,0x8410b596,0x21243186,0x7bef8c51,0x5aeb39c7,0x84305aeb,0x002052aa,0x31863186,0x31860020,0x31863186,0x318694b2,0x52aa52aa,0x94b252aa,0x52aa52aa,0xef16e6b5,0xd673ff78,0xd693de93,0xdeb3deb3,0xe6f4deb3,0xeef6e6d5,0xce52c611,0xff78d672,0x732d8b8d,0xb5346aec,0x8c10b534,0x83efbd96,0x52486aec,0xc5f76b4d,0x83adc5f7,0x6aec6aec, +0x5a453963,0x41a46265,0x9bc96a86,0x62863983,0x39639bc9,0x7b076286,0x7b0749e4,0x9bc949e4,0xb48b3963,0x9c099c09,0x93e89c29,0x9c099c29,0x9c29a46a,0x9c299c29,0xa42a9c29,0x6aa6b48b,0xef7dd6ba,0xef7def7d,0xef7def7d,0xef7def7d,0xef7def7d,0xef7def7d,0xef5def5d,0xd69ae73c,0xffccee88,0xffcaffcb,0xffeaffea,0xffcaffea,0xffcbffcb,0xffc9ffca,0xff88ffa9,0xee65ff87, +0x8f3c0617,0x8f3c8f3c,0x8f3c975c,0x8f3c8f3c,0x873c873c,0x873c8f3c,0x6efb7f1b,0x05f65efa,0x93653184,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0xa384abc5,0xabc5a363,0x31649365,0xabc541e6,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0xa384abc5,0xabc5a363,0x2923abc5,0xabc541e6,0x8b438b43,0x8b438b43,0x82e3a384,0xabc58b04,0xa384abc5,0xabc5a363,0x2923abc5, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000, +0xb596b596,0x7bef6b4d,0x5aeb2965,0xb596b596,0x7bef5aeb,0x7bef8c51,0x39c79492,0x9cf36b6d,0x52aa52aa,0x94b294b2,0x94b294b2,0x94b294b2,0x94b23186,0x94b294b2,0x52aa0020,0x318652aa,0xde93deb4,0xe6d6e6b5,0xd672bdb1,0xd672d652,0xe6d5c5d0,0xdeb3fffb,0xde93d672,0xef15d693,0x9c108bce,0xbd559c30,0xa4d48bf0,0x6aec9cb3,0xb555b555,0x94716b0b,0xa4d25249,0x9c51836e, +0x62853983,0x39436ac7,0x9bc93983,0x628641a4,0x39839bc9,0x9bc96a86,0x7b0749e4,0x93a849e4,0xb48b6aa6,0xb48bb46a,0xb48bb48b,0xb48bb48b,0xb46aac4a,0xb48bb48b,0xbcacbcab,0x6265b48b,0xef5dd69a,0xef5def5d,0xef7def7d,0xef7def7d,0xef7def7d,0xef7def7d,0xef5def7d,0xd69aef5d,0xff4ce648,0xff6bff4b,0xffabffab,0xffabffaa,0xff8bffab,0xffaaffab,0xff8affaa,0xee67ff89, +0x66fb05f6,0x6f1b66fb,0x873c873c,0x873c873c,0x7f1b7f1b,0x873c873c,0x7f1b7f1b,0x05f6771b,0x83053184,0x93049325,0x93259325,0x7ae47ae4,0x7ae47ae4,0x93257ae4,0x93257ae4,0x31648305,0xabc541e6,0xa363a384,0xa384a384,0x8b438b43,0x8b438b43,0xa3848b43,0xa3848b43,0x2923abc5,0xabc541e6,0xa363a384,0xa384a384,0x8b438b43,0x8b438b43,0xa3848b43,0xa3848b43,0x2923abc5, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xb596b596,0xa534b596,0x7bef94b2,0x5aeb630c,0xb5965aeb,0xb596b596,0x5aeb8410,0x8c71b5b6,0x318652aa,0x31863186,0x52aa3186,0x94b294b2,0x94b20020,0x318652aa,0x31863186,0x52aa3186,0xdeb49cab,0xdeb3deb3,0xdeb3d692,0xde93d672,0xdeb4e6f4,0xd693de93,0xd672d652,0xde93ce31,0xbdf75a89,0x9c306aec,0x94119c30,0x6aec9c31,0x6aec7bef,0x9c719c71,0xa4d28c0f,0x9c30734d, +0x6aa641c4,0x9bc96aa6,0x6ac63983,0x41a493a8,0x6a866286,0x7b076286,0x7b076ac6,0x9be96aa6,0x6aa66aa6,0x6aa63963,0x62866aa6,0x39633963,0x6aa63963,0x39636aa6,0x6aa66ac7,0x6ac66aa6,0xa534ad55,0xbdd7ad75,0xd69ac638,0xd69ad6ba,0xd69ad69a,0xdedbd6ba,0xdefbdedb,0xe71cdefb,0xc423c444,0xd524cc83,0xe647ddc5,0xee67ee87,0xee27ee46,0xeea8ee88,0xeee9eec9,0xff0bf6ea, +0x042e042e,0x04f1044f,0x05f60574,0x05f60617,0x05f605f6,0x06370637,0x1e780e58,0x46ba1e78,0x31642923,0x31643164,0x31843164,0x31843184,0x31843164,0x31843184,0x31843184,0x29233184,0x41c541e6,0x41c541c5,0x41e641c5,0x41e641e6,0x41e641c5,0x41e641e6,0x41e641e6,0x316441e6,0x41c541e6,0x41c541c5,0x41e641c5,0x41e641e6,0x41e641c5,0x41e641e6,0x41e641e6,0x316441e6, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x94b28430,0x738e8c51,0x9cd3a534,0xbdd794b2,0xbdf78c71,0x84107bef,0x94928430,0x9cf38c51,0x73ae73ae,0x73ae73ae,0x8c716b4d,0x7bef8c71,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x7bef7bef,0x7aa79369,0x9369bc2b,0x7aa79369,0x93698430,0x93699369,0x7aa77aa7,0x93699369,0x59e57aa7,0x7aa79369,0x9369bc2b,0x7aa79369,0x93698430,0x93699369,0x7aa77aa7,0x93699369,0x59e57aa7, +0x72e772e7,0x7b0772e7,0x6aa66aa6,0x6aa67b07,0x72e772e7,0x6aa672e7,0x6aa649e4,0x72e76aa6,0x8410a514,0x84108410,0x94927bcf,0x84309492,0x84308430,0x84108430,0x84108410,0x84308430,0x84108410,0x84108410,0x94927bcf,0x84309492,0x84308430,0x84108430,0x84108410,0x84308430,0xb596b5b6,0xb5b6ad55,0xb5b6b5b6,0xd6bab5b6,0xb5b6bdd7,0xb5b6b596,0xb5b6bdd7,0xce79b5b6, +0xb1a2c1e2,0x9162a182,0xb1a2c1e2,0x9162a182,0xb1a2c1e2,0x9162a182,0xb1a2c1e2,0x9162a182,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x0000ffff,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0xffff0000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00001300,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x14200000,0x00001300,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x00000000,0x59a00000,0x59a09325,0x00000000,0x00000000,0x00000000, +0xa514a514,0x7bcf8c51,0xad55b596,0x949294b2,0x94b27bef,0x843094b2,0x9cf3ad55,0xa5148c51,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x8c718c71,0x73ae7bef,0x7bef73ae,0x7aa79369,0xbc2b59e5,0x59e57aa7,0x59e57aa7,0x7aa77aa7,0x59e57aa7,0x7aa77aa7,0x93699369,0x7aa79369,0xbc2b59e5,0x59e57aa7,0x59e57aa7,0x7aa77aa7,0x59e57aa7,0x7aa77aa7,0x93699369, +0xbcccbccc,0x9c299c29,0xbccc9c29,0x9c29bccc,0xbcccbccc,0xb48b9c29,0xbcccbccc,0xbcccbccc,0xad55ce59,0xa514ad55,0xa514a514,0xa514a514,0xad55ad55,0xb596b596,0xa514ad55,0x8430a514,0xad558430,0xa514ad55,0xa514a514,0xa514a514,0xad55ad55,0xb596b596,0xa514ad55,0x8430a514,0x51439a66,0x79e58205,0x79e579e5,0xd6ba79e5,0x79e59a66,0x79e579e5,0x79e58205,0xd69a81e5, +0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0xffff0000,0x00000000,0x00000000,0xffffffff,0xffffffff,0x00000000,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x5a260000,0x00001300,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x14201300,0x00001300,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x00000000,0x93250000,0x59a09325,0x00000000,0x00000000,0x00000000, +0xad55b5b6,0x73ae73ae,0x84107bef,0xc6188410,0xc638a514,0x9cd3ad55,0x8c51a514,0xad75ad55,0x8c717bef,0x8c7173ae,0x7bef6b4d,0x73ae7bef,0x73ae73ae,0x73ae6b4d,0x7bef7bef,0x8c718c71,0x93697aa7,0x7aa77aa7,0x7aa772c8,0x93699369,0x59e57aa7,0x59e5bc2b,0xbc2b7aa7,0x93699369,0x93697aa7,0x7aa77aa7,0x7aa759e5,0x93699369,0x59e57aa7,0x59e5bc2b,0xbc2b7aa7,0x93699369, +0x9c29b48b,0xbccc72e7,0xbcccbccc,0x9c29bccc,0xb48bbccc,0x9c29b48b,0x9c299c29,0xb48b9c29,0xb596ce59,0xb596a514,0xad559cf3,0xa514ad55,0xa514a514,0xa5149cf3,0xad55ad55,0x9492b596,0xb5968430,0xb596a514,0xad559cf3,0xa514ad55,0xa514a514,0xa5149cf3,0xad55ad55,0x9492b596,0x79e59a66,0x79e579c5,0x79e579e5,0xce796184,0x79c59a66,0x79e579e5,0x79e579e5,0xd69a81e5, +0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0x8c71da23,0x916252aa,0x8c71da23,0x91628c71,0x52aada23,0x91628c71,0x52aada23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x00000000,0x0000ffff,0xffff0000,0x0000ffff,0x00000000,0xffffffff,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x5a261420,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x13000000,0x14201420,0x13001300,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x00000000,0x93250000,0x59a09325,0x00000320,0x00000000,0x00000000, +0x94b2bdd7,0x8c518410,0x94929cd3,0x7bcf8430,0x9492632c,0x7bef8c51,0xa5349cf3,0x84307bcf,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x73ae73ae,0x73ae73ae,0x7bef73ae,0x59e57aa7,0x7aa79369,0x93699369,0x7aa7bc2b,0x7aa77aa7,0x7aa77aa7,0x7aa77aa7,0xbc2bbc2b,0x59e57aa7,0x7aa79369,0x93699369,0x7aa7bc2b,0x7aa77aa7,0x7aa77aa7,0x7aa77aa7,0xbc2bbc2b, +0xbcccbccc,0xbcccbccc,0x9c29bccc,0x9c29bccc,0x9c299c29,0x9c299c29,0x72e7b48b,0xbcccbccc,0xa514ce59,0xa514a514,0xa514a514,0xa514a514,0xb596b596,0xa514a514,0xa514a514,0x8430a514,0xa5148430,0xa514a514,0xa514a514,0xa514a514,0xb596b596,0xa514a514,0xa514a514,0x8430a514,0xa2679a67,0x9a66aaa7,0x9a669a66,0xce799246,0xb2c89246,0x9a669a66,0x9a669a46,0xe71c9a67, +0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xda23da23,0x52aada23,0xda23da23,0xa9a252aa,0x000052aa,0x52aa0000,0xda2352aa,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0x00000000,0xffff0000,0x0000ffff,0xffffffff,0x0000ffff,0x00000000,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x13000000,0x00001420,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x14200000,0x14201300,0x00001300,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x03200320,0x03200000,0x59a00000,0x4e649325,0x00004e64,0x00000000,0x00000000, +0xad758430,0xa5148430,0x843094b2,0x8c519492,0x949294b2,0x7bcf8c71,0x7bef7bef,0x8c517bef,0x7bef6b4d,0x7bef7bef,0x7bef73ae,0x7bef7bef,0x8c718c71,0x7bef7bef,0x8c717bef,0x6b4d8c71,0x7aa79369,0x93697aa7,0xbc2b9369,0x93697aa7,0x93696b6d,0x7aa79369,0x936959e5,0x59e57aa7,0x7aa79369,0x93697aa7,0xbc2b9369,0x93697aa7,0x93696b6d,0x7aa79369,0x936959e5,0x59e57aa7, +0x6aa672e7,0x72e772e7,0x6aa66aa6,0x72e76aa6,0x72e772e7,0x72e772e7,0x6aa66aa6,0x72e76aa6,0xad55c618,0xad55ad55,0xad55a514,0xad55ad55,0xb596b596,0xad55ad55,0xb596ad55,0x7bcfb596,0xad557bcf,0xad55ad55,0xad55a514,0xad55ad55,0xb596b596,0xad55ad55,0xb596ad55,0x7bcfb596,0xb5b6b5b6,0xd6baad75,0xb5b6b5b6,0xb5b6b5b6,0xb5b6b5b6,0xdedbb596,0xbdd7b596,0xb5b6b596, +0xa182b1c2,0x79218942,0xa182b1c2,0x79218942,0xa182b1c2,0x79218942,0xa182b1c2,0x79218942,0x9162a9a2,0x91629162,0x91620000,0x91620000,0x52aa0000,0x00009162,0x916252aa,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x00000000,0xffff0000,0xffffffff,0xffff0000,0xffff0000,0xffffffff,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x14205a26,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x14200000,0x00001420,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x03204e64,0x03200320,0x03200000,0x93250320,0x000059a0,0x00000000,0x03200000, +0x9cf39cd3,0xa53494b2,0xb5b68410,0x94928c71,0x7bcfc618,0x8410a534,0x8c518c71,0x8c718430,0x7bef7bef,0x73ae8c71,0x8c7173ae,0x73ae8c71,0x73ae6b4d,0x8c718c71,0x7bef8c71,0x7bef7bef,0x93699369,0xbc2b7aa7,0x7aa7bc2b,0x9369bc2b,0xbc2b59e5,0x7aa7bc2b,0x93699369,0x7aa78430,0x93699369,0xbc2b7aa7,0x7aa7bc2b,0x9369bc2b,0xbc2b59e5,0x7aa7bc2b,0x93699369,0x7aa78430, +0xb48bbccc,0xb48bb48b,0xbcccbccc,0x9c299c29,0x9c299c29,0xb48bb48b,0xb48bb48b,0x9c29b48b,0xad55ce59,0xa514b596,0xb596a514,0xa514b596,0xa5149cf3,0xb596b596,0xad55b596,0x8430ad55,0xad558430,0xa514b596,0xb596a514,0xa514b596,0xa5149cf3,0xb596b596,0xad55b596,0x8430ad55,0x79e58a26,0xdefb8a05,0x79e59a66,0x79e55964,0x820569a4,0xd69a79e5,0x79e59a66,0x79e58205, +0xad75ad75,0xad75ce79,0xce79ad75,0xad75ad75,0xce79ad75,0xad75ad75,0xad75ce79,0xad75ad75,0x8c71da23,0x91628c71,0x0000da23,0x00000000,0x8c710000,0x916252aa,0x8c710000,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x00000000,0x0000ffff,0xffff0000,0xffff0000,0x00000000,0x0000ffff,0x0000ffff,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x5a260000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf7c00000,0xb5e0f7c0,0x8c808c80,0x0000ce80,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x4e640000,0x59a00320,0x4e640000,0x59a00320,0x4e6459a0,0x00000320,0x03200320, +0x841094b2,0x8c71b5b6,0x9cd38c71,0x8410ad55,0x94928430,0xad559492,0xb5968c71,0x84108c71,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x7bef73ae,0x7bef6b4d,0x73ae7bef,0x73ae73ae,0x7bef8c71,0x93699369,0x7aa759e5,0x59e57aa7,0x7aa759e5,0x7aa77aa7,0x7aa77aa7,0xbc2bbc2b,0x93697aa7,0x93699369,0x7aa759e5,0x59e57aa7,0x7aa759e5,0x7aa77aa7,0x7aa77aa7,0xbc2bbc2b,0x93697aa7, +0x9c299c29,0x9c299c29,0xbccc9c29,0xb48bb48b,0x9c299c29,0x72e79c29,0x9c29bccc,0x9c299c29,0xa514ce59,0xa514a514,0xa514a514,0xad55a514,0xad559cf3,0xa514ad55,0xa514a514,0x8430b596,0xa5148430,0xa514a514,0xa514a514,0xad55a514,0xad559cf3,0xa514ad55,0xa514a514,0x8430b596,0x79e579e5,0xce7979e5,0x79e59246,0x79e579e5,0x8a268205,0xce7979c5,0x8a059a66,0x79e579e5, +0xad75ce79,0x0000ad75,0xad75ce79,0xce790000,0x0000ce79,0xce79ce79,0xad750000,0xce79ad75,0x8c71da23,0x52aa52aa,0x00000000,0x00000000,0x00000000,0x91628c71,0x52aa0000,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x00000000,0x0000ffff,0xffff0000,0xffffffff,0xffff0000,0x00000000,0x0000ffff,0xffff0000, +0x00000000,0x00000000,0x00000000,0x14203d19,0x00001300,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xce80ce80,0x8c80f7c0,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x93250320,0x932559a0,0x03209325,0x93259325,0x93259325,0x00004e64, +0x9cd38410,0xad55b5b6,0x8410ad75,0x9cf3ad75,0xad55b596,0x94928410,0x94928430,0x7bef7bef,0x8c717bef,0x6b4d8c71,0x73ae8c71,0x7bef7bef,0x8c717bef,0x8c718c71,0x8c718c71,0x8c718c71,0x7aa79369,0x93697aa7,0x93697aa7,0x59e57aa7,0x93697aa7,0x7aa79369,0x7aa77aa7,0x7aa759e5,0x7aa79369,0x93697aa7,0x93697aa7,0x59e57aa7,0x93697aa7,0x7aa79369,0x7aa77aa7,0x7aa759e5, +0xbcccbccc,0xbcccbccc,0x72e7bccc,0xbccc9c29,0xb48bbccc,0xb48bb48b,0xbcccbccc,0x9c29bccc,0xce79ce59,0xc618ce79,0xc638ce79,0xce59ce59,0xce79ce59,0xce79ce79,0xce79ce79,0xb596ce79,0xb5968430,0x9cf3b596,0xa514b596,0xad55ad55,0xb596ad55,0xb596b596,0xb596b596,0x9492b596,0x9a66a267,0xd69a9a66,0x9a669a46,0xb2c8a287,0x9a66a267,0xd69a9a66,0x9a669a66,0x79e5b2c8, +0xce79ce79,0x0000ce79,0xce79ce79,0xce790000,0x00000000,0xce79ce79,0xce790000,0xce79ce79,0xda23da23,0xa9a2da23,0xda23da23,0x00000000,0x52aa0000,0x52aada23,0x000052aa,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0x00000000,0x0000ffff,0x0000ffff,0xffff0000,0xffffffff,0xffffffff,0xffffffff,0xffffffff, +0x00000000,0x00000000,0x00000000,0x3cd73ddc,0x33f333f3,0x00003d19,0x00000000,0x00000000,0x00000000,0x00000000,0xce800000,0x0000f7c0,0xb5e0f7c0,0x0000f7c0,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x03200000,0x93250000,0x93259325,0x03200320,0x59a00320,0x03200000,0x00000000, +0x84308c71,0x8c519cf3,0x7bef9492,0x8430a534,0xad7594b2,0x84108430,0xa5148c71,0xad557bef,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x6b4d73ae,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x7aa7bc2b,0xbc2bbc2b,0x93699369,0x7aa77aa7,0x59e59369,0x93699369,0x7aa77aa7,0x93699369,0x7aa7bc2b,0xbc2bbc2b,0x93699369,0x7aa77aa7,0x59e59369,0x93699369,0x7aa77aa7,0x93699369, +0x72e772e7,0x6aa66aa6,0x6aa66aa6,0x72e76aa6,0x72e772e7,0x6aa66aa6,0x6aa66aa6,0x72e772e7,0x8430ad55,0x84108430,0x84108410,0x84108410,0x7bcf8410,0x84108410,0x84108410,0x84308430,0xad558430,0xa514ad55,0xa514a514,0xa514a514,0x9cf3a514,0xa514a514,0xa514a514,0x8430ad55,0xb5b6b5b6,0xb596b5b6,0xbdd7b596,0xd6bab5b6,0xb5b6b5b6,0xb5b6b596,0xb5b6b5b6,0xd6bab5b6, +0xce79ce79,0x0000ce79,0xce79ce79,0x00000000,0x0000ce79,0xce79ce79,0xce790000,0xce79ce79,0x9162a9a2,0x91629162,0x000052aa,0x00000000,0x00000000,0x916252aa,0x0000a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x0000ffff,0x00000000,0x0000ffff,0xffff0000, +0x00000000,0x00000000,0x3d190000,0x3d193d19,0x33f33ddc,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x4e640000,0x00000320,0x932559a0,0x4e644e64,0x00000000,0x03204e64,0x00000320, +0x9cf37bef,0x9492a534,0x84109492,0x7bef8c51,0x84308430,0xad75b5b6,0xa5349492,0x8c7194b2,0x8c718c71,0x84107bef,0x73ae7bef,0x8c718c71,0x7bef7bef,0x7bef7bef,0x8c718c71,0x6b4d8c71,0x59e5bc2b,0x7aa77aa7,0x7aa78430,0xbc2b7aa7,0x7aa7bc2b,0xbc2bbc2b,0x93697aa7,0x93697aa7,0x59e5bc2b,0x7aa77aa7,0x7aa78430,0xbc2b7aa7,0x7aa7bc2b,0xbc2bbc2b,0x93697aa7,0x93697aa7, +0xbcccbccc,0xb48bbccc,0xbcccbccc,0x9c29bccc,0x9c299c29,0xbccc72e7,0xbcccbccc,0xbcccbccc,0xb596ce79,0xad55ad55,0xa514ad55,0xb596b596,0xad55ad55,0xad55ad55,0xb596b596,0x7bcfb596,0xb5969492,0xad55ad55,0xa514ad55,0xb596b596,0xad55ad55,0xad55ad55,0xb596b596,0x7bcfb596,0x59649a66,0x69a48a05,0x618479e5,0xdefb79e5,0x69a4aaa7,0x71c58205,0x79e579e5,0xd69a79e5, +0xdedbce79,0x00000000,0xce790000,0xce790000,0x0000dedb,0x0000ce79,0x00000000,0xce79dedb,0x8c71da23,0x52aa52aa,0x8c71da23,0x52aa0000,0x52aa0000,0x52aa0000,0x000052aa,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x00000000,0x0000ffff,0x0000ffff,0xffffffff,0xffff0000,0xffff0000,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x33f33ddc,0x3cd73d19,0x00003d19,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x59a00000,0x59a09325,0x93259325,0x032059a0,0x4e640000,0x00000320, +0x9cd39cd3,0xa5347bcf,0x94b28410,0x9cd394b2,0x94b28430,0x84108c51,0x8c517bcf,0x94b28c71,0x73ae73ae,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x6b4d7bef,0x7bef7bef,0x73ae73ae,0x7bef6b4d,0x59e57aa7,0x93699369,0x93697aa7,0x59e559e5,0x7aa759e5,0x59e57aa7,0x7aa77aa7,0xbc2b7aa7,0x59e57aa7,0x93699369,0x93697aa7,0x59e559e5,0x7aa759e5,0x59e57aa7,0x7aa77aa7,0xbc2b7aa7, +0x9c299c29,0xb48b72e7,0xb48bb48b,0x9c29bccc,0xb48bb48b,0xb48bb48b,0x9c299c29,0x9c299c29,0xa514c638,0xad55ad55,0xa514ad55,0xa514a514,0x9cf3ad55,0xad55ad55,0xa514a514,0x84309cf3,0xa5148410,0xad55ad55,0xa514ad55,0xa514a514,0x9cf3ad55,0xad55ad55,0xa514a514,0x84309cf3,0x79e59a66,0x79e59a66,0x79e56184,0xd69a79c5,0x79e59a66,0x79e571a4,0x79e569a4,0xd6ba79e5, +0xdedbdedb,0xce79dedb,0xdedbdedb,0xdedbdedb,0xdedbce79,0xce79dedb,0xdedbce79,0xce79dedb,0x8c71da23,0x91628c71,0x0000da23,0x91620000,0x8c7152aa,0x52aa52aa,0x8c710000,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x00000000,0x0000ffff,0xffff0000,0xffff0000,0x00000000,0x0000ffff,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x3ddc0000,0x00003ddc,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x03200000,0x032059a0,0x00000320,0x93250320,0x59a09325,0x932559a0,0x00000000, +0x8410a514,0x8410ad75,0xad75ad75,0xad758c51,0x73aebdd7,0xa5348410,0x7befad55,0x8c718c51,0x8c717bef,0x73ae8c71,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x8c718c71,0x6b4d8c71,0x7aa79369,0xbc2b9369,0x936959e5,0x7aa77aa7,0x59e59369,0x6b6d7aa7,0x93697aa7,0x7aa759e5,0x7aa79369,0xbc2b9369,0x936959e5,0x7aa77aa7,0x59e559e5,0x6b6d59e5,0x93697aa7,0x7aa759e5, +0x9c29bccc,0x9c299c29,0xbccc9c29,0x9c29bccc,0x9c29bccc,0x72e79c29,0xb48bb48b,0xbcccb48b,0xb596ce59,0xa514b596,0xa514a514,0xa514a514,0xa514a514,0xb596b596,0xb596b596,0x7bcfb596,0xb5968430,0xa514b596,0xa514a514,0xa514a514,0xa514a514,0xb596b596,0xb596b596,0x7bcfb596,0x9a668a26,0x9a669a66,0x92469a66,0xd69a9a66,0xaa87aa87,0x9a66a267,0x9a669a66,0xd69a9a66, +0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xda23da23,0xa9a2da23,0xda2352aa,0xa9a252aa,0xda2352aa,0x00000000,0xda2352aa,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0x00000000,0xffff0000,0x0000ffff,0xffff0000,0xffff0000,0xffff0000,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x4e640000,0x03209325,0x00000320,0x03200320,0x932559a0,0x03209325,0x00000000, +0x843073ae,0x94b28c51,0x9cd39492,0x7bcf7bef,0x84107bef,0x94b28c71,0x8c518c71,0x7bef8c71,0x8c717bef,0x7bef7bef,0x6b4d7bef,0x8c717bef,0x7bef7bef,0x73ae73ae,0x73ae73ae,0x7bef73ae,0x6b6d9369,0x7aa7bc2b,0x59e59369,0xbc2b7aa7,0x93699369,0x93697aa7,0xbc2b7aa7,0x7aa79369,0x6b6d59e5,0x59e559e5,0x59e57588,0x59e559e5,0x59e55ce6,0x59e56d68,0x59e57aa7,0x7aa759e5, +0x6aa66aa6,0x72e76aa6,0x72e772e7,0x72e772e7,0x72e772e7,0x6aa66aa6,0x6aa66aa6,0x72e772e7,0xb596ce59,0xad55ad55,0x9cf3ad55,0xb596ad55,0xad55ad55,0xa514a514,0xa514a514,0x8430a514,0xb5968430,0xad55ad55,0x9cf3ad55,0xb596ad55,0xad55ad55,0xa514a514,0xa514a514,0x8430a514,0xbdd7bdd7,0xd6bab596,0xb5b6b5b6,0xb596b5b6,0xbdd7b5b6,0xdefbb5b6,0xb5b6b5b6,0xbdf7b596, +0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0x9162a9a2,0x52aa9162,0x9162a9a2,0x916252aa,0x000052aa,0x91629162,0x916252aa,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x00000000,0xffff0000,0x00000000,0xffffffff,0x0000ffff,0x00000000,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x03204e64,0x4e640000,0x03204e64,0x03200000,0x00009325,0x00000000, +0xbdd7a514,0x8430b596,0x8c518c51,0x94929492,0x9cf394b2,0xad75ad55,0x73ae8430,0xb5b68410,0x6b4d7bef,0x73ae73ae,0x73ae6b4d,0x73ae73ae,0x73ae8c71,0x7bef7bef,0x8c717bef,0x7bef7bef,0x7aa7bc2b,0x59e57aa7,0x7aa7bc2b,0x7aa77aa7,0x7aa7bc2b,0x7aa77aa7,0x59e559e5,0x7aa7bc2b,0x59e58deb,0x65279e4d,0x59e56d47,0x59e57588,0x7dea75a9,0x962c960c,0x54a559e5,0x59e56506, +0xbcccbccc,0x9c299c29,0x9c299c29,0xb48bb48b,0xbcccbccc,0xb48bbccc,0xbccc72e7,0x9c29bccc,0x9cf3ce59,0xa514a514,0xa5149cf3,0xa514a514,0xa514b596,0xad55ad55,0xb596ad55,0x8430ad55,0x9cf38430,0xa514a514,0xa5149cf3,0xa514a514,0xa514b596,0xad55ad55,0xb596ad55,0x8430ad55,0x8a2679e5,0xd69a69a4,0x79e59a66,0x71a479e5,0x79e579e5,0xd69a79e5,0x92268205,0x8a2679e5, +0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0x8c71da23,0x916252aa,0x8c71da23,0x000052aa,0x52aa0000,0x91628c71,0x52aada23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x00000000,0xffffffff,0xffffffff,0x00000000,0x0000ffff,0xffff0000,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x4e644e64,0x00000000,0x00000000,0x03204e64,0x00000320,0x00000000, +0x8c7194b2,0x94b2a514,0x84109cd3,0x84108c51,0xad557bef,0x9492a534,0x8c718410,0x8c518430,0x7bef7bef,0x8c718c71,0x8c718c71,0x8c718c71,0x8c7173ae,0x8c718c71,0x7bef6b4d,0x73ae7bef,0x93697aa7,0x7aa759e5,0x93697aa7,0x59e58430,0xbc2b7aa7,0x7aa79369,0x93697aa7,0x59e559e5,0x6d6875a9,0x858a8dcb,0x59e5858a,0x65076d47,0x960c5ce6,0x758995ec,0x6d686506,0x6d486527, +0xbcccbccc,0x72e7b48b,0xb48bb48b,0x9c299c29,0x9c299c29,0xb48b9c29,0xb48b9c29,0x9c29bccc,0xad55ce59,0xb596b596,0xb596b596,0xb596b596,0xb596a514,0xb596b596,0xad559cf3,0x8410ad55,0xad558430,0xb596b596,0xb596b596,0xb596b596,0xb596a514,0xb596b596,0xad559cf3,0x8410ad55,0x79e579e5,0xe71c8205,0x79e5b2c8,0x618469a4,0x71c579e5,0xd69a8205,0x79e59a66,0x79e579e5, +0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0xffff0000,0x00000000,0x00000000,0x00000000,0xffffffff,0x0000ffff,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x4e640000,0x00000000,0x00000000, +0x94b294b2,0x84309492,0x8c718430,0x8c717bef,0x94b29cf3,0x84308c51,0x84108c51,0x8c71738e,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x8c718c71,0x8c716b4d,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x9369bc2b,0x7aa79369,0xbc2b7aa7,0x93699369,0x7aa77aa7,0x7aa759e5,0xbc2b7aa7,0xbc2b7aa7,0x75a975a9,0x65277589,0x6d686527,0x6d685ce6,0x75a97dea,0x65276d48,0x65066d47,0x6d685484, +0x9c29bccc,0x9c299c29,0xbccc9c29,0xb48bbccc,0xbccc9c29,0xbcccbccc,0xbcccbccc,0x9c29bccc,0xc638ce59,0xc638c638,0xce59c638,0xce79ce79,0xce79c618,0xc638ce59,0xc638c638,0xad55c638,0x84108430,0x84108410,0x84308410,0x94929492,0x94927bcf,0x84108430,0x84108410,0x84308410,0x92469a66,0xce799a66,0x9a679a66,0xa2879226,0xaaa79a66,0xd69a8a26,0xaa879a66,0x9a669a66, +0xc9e2da23,0xa1a2b1c2,0xc9e2da23,0xa1a2b1c2,0xc9e2da23,0xa1a2b1c2,0xc9e2da23,0xa1a2b1c2,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0x0000ffff,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0xffff0000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0 }; diff --git a/minecraftcpp-master/handheld/data/images/terrain_565_2.h b/minecraftcpp-master/handheld/data/images/terrain_565_2.h new file mode 100644 index 0000000..fc474ad --- /dev/null +++ b/minecraftcpp-master/handheld/data/images/terrain_565_2.h @@ -0,0 +1,1052 @@ +/********************************************************** + * PVRTexture Tool v 3.20 + * PVRTC Library v 1.106. 0. 0 Beta + **********************************************************/ + +#ifndef A32BIT + #define A32BIT static const unsigned long +#endif + +A32BIT terrain_565_2[] = { + +/* Header */ +0x00000034, /* dwHeaderSize */ +0x00000100, /* dwHeight */ +0x00000100, /* dwWidth */ +0x00000000, /* dwMipMapCount */ +0x00010013, /* dwpfFlags */ +0x00020000, /* dwDataSize */ +0x00000010, /* dwBitCount */ +0x0000f800, /* dwRBitMask */ +0x000007e0, /* dwGBitMask */ +0x0000001f, /* dwBBitMask */ +0x00000000, /* dwAlphaBitMask */ +0x21525650, /* dwPVR */ +0x00000001, /* dwNumSurfs */ + +/* Data */ +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x7bef9cd3,0x7bef7bef, +0x7bef7bef,0x7bef9cd3,0x9cd39cd3,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x9cd39cd3,0x7bef39e7,0x7bef7bef,0x7bef39e7,0x9cd39cd3,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x9cd39cd3,0x7bef39e7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xfaa0fd00,0xf800f800,0xf800f800,0xc800c800,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xfaa0fd00,0xf800f800,0xf800f800,0xc800c800, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd39cd3,0x7bef39e7,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x7bef39e7,0x7bef7bef, +0x7bef7bef,0x9cd339e7,0x39e739e7,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x39e739e7,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x39e739e7,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x39e739e7,0x7bef7bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800c800,0xf800faa0,0xf800c800,0xfaa0f800,0xfd00fd00,0xf800faa0,0xf800faa0,0xc800f800,0xf800c800,0xf800faa0,0xf800c800,0xfaa0f800,0xfd00fd00,0xf800faa0,0xf800faa0,0xc800f800, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x39e79cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef9cd3,0x7bef7bef,0x39e79cd3,0x39e739e7,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x39e79cd3,0x39e739e7,0x7bef7bef,0x7bef7bef, +0x9cd37bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x39e79cd3,0x39e739e7,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x39e79cd3,0x39e739e7,0x7bef7bef,0x9cd39cd3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfaa0f800,0xfaa0fd00,0xfaa0faa0,0xf800faa0,0xfaa0faa0,0xfaa0f800,0xfaa0fd00,0xf800f800,0xfaa0f800,0xfaa0fd00,0xfaa0faa0,0xf800faa0,0xfaa0faa0,0xfaa0f800,0xfaa0fd00,0xf800f800, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x9cd37bef,0x9cd39cd3,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x7bef39e7,0x9cd39cd3,0x7bef7bef,0x7bef7bef, +0x39e77bef,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x7bef39e7,0x9cd39cd3,0x9cd37bef,0x7bef7bef,0x39e77bef,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x7bef39e7,0x9cd39cd3,0x9cd37bef,0x39e739e7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xffe0f800,0xfaa0ffe0,0xffe0ffe0,0xf800fd00,0xf800c800,0xfaa0f800,0xffe0ffe0,0xf800faa0,0xffe0f800,0xfaa0ffe0,0xffe0ffe0,0xf800fd00,0xf800c800,0xfaa0f800,0xffe0ffe0,0xf800faa0, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x39e77bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x39e739e7,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x39e739e7,0x9cd39cd3,0x39e739e7,0x7bef7bef,0x7bef7bef, +0x39e79cd3,0x7bef7bef,0x39e77bef,0x39e739e7,0x9cd39cd3,0x39e739e7,0x39e77bef,0x7bef7bef,0x39e79cd3,0x7bef7bef,0x39e77bef,0x39e739e7,0x9cd39cd3,0x39e739e7,0x39e77bef,0x7bef7bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfd00f800,0xfaa0ffe0,0xfd00faa0,0xf800faa0,0xf800f800,0xfaa0f800,0xffe0fd00,0xf800fd00,0xfd00f800,0xfaa0ffe0,0xfd00faa0,0xf800faa0,0xf800f800,0xfaa0f800,0xffe0fd00,0xf800fd00, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x39e79cd3,0x7bef7bef,0x39e739e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x39e79cd3,0x7bef7bef,0x39e739e7,0x7bef7bef,0x7bef9cd3,0x7bef7bef, +0x7bef39e7,0x7bef9cd3,0x39e79cd3,0x7bef7bef,0x39e739e7,0x7bef7bef,0x39e79cd3,0x7bef9cd3,0x7bef39e7,0x7bef9cd3,0x39e79cd3,0x7bef7bef,0x39e739e7,0x7bef7bef,0x39e79cd3,0x7bef9cd3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfaa0f800,0xf800faa0,0xf800f800,0xf800c800,0xfaa0faa0,0xf800faa0,0xfd00f800,0xf800faa0,0xfaa0f800,0xf800faa0,0xf800f800,0xf800c800,0xfaa0faa0,0xf800faa0,0xfd00f800,0xf800faa0, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x9cd339e7,0x7bef7bef,0x7bef39e7,0x9cd37bef,0x7bef39e7,0x7bef7bef, +0x7bef7bef,0x7bef39e7,0x9cd339e7,0x7bef7bef,0x7bef39e7,0x9cd37bef,0x7bef39e7,0x7bef39e7,0x7bef7bef,0x7bef39e7,0x9cd339e7,0x7bef7bef,0x7bef39e7,0x9cd37bef,0x7bef39e7,0x9cd339e7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0xfaa0f800,0xfaa0faa0,0xf800f800,0xffe0faa0,0xc800faa0,0xf800c800,0xf800faa0,0xf800f800,0xfaa0f800,0xfaa0faa0,0xf800f800,0xffe0faa0,0xc800faa0,0xf800c800,0xf800faa0, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x9cd339e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x9cd339e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x9cd339e7,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x9cd37bef,0x7bef7bef,0x9cd37bef,0x9cd339e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x7bef7bef,0x9cd37bef,0x9cd339e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x7bef7bef,0x9cd37bef,0x9cd339e7,0x9cd37bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x39e77bef,0x9cd37bef,0x9cd339e7,0x39e77bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x9cd339e7,0x39e77bef,0x9cd37bef,0x9cd339e7,0x39e77bef,0x7bef7bef,0x7bef7bef,0x9cd39cd3,0x9cd339e7,0x39e77bef,0x9cd37bef,0x9cd339e7,0x39e77bef,0x7bef7bef,0x39e77bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc800c800,0xfd00faa0,0xfd00ffe0,0xf800f800,0xffe0fd00,0xc800faa0,0xfaa0f800,0xfaa0faa0,0xc800c800,0xfd00faa0,0xfd00ffe0,0xf800f800,0xffe0fd00,0xc800faa0,0xfaa0f800,0xfaa0faa0, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e79cd3,0x39e77bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e79cd3,0x39e77bef,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x39e79cd3,0x39e77bef,0x9cd39cd3,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x39e77bef,0x9cd39cd3,0x39e79cd3,0x39e77bef,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x9cd39cd3,0x39e79cd3,0x39e77bef,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x9cd39cd3,0x39e79cd3,0x39e77bef,0x39e79cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x9cd39cd3,0x39e79cd3,0x39e77bef,0x39e79cd3,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x39e77bef,0x9cd39cd3,0x39e79cd3,0x39e77bef,0x39e79cd3,0x7bef7bef,0x7bef7bef,0x39e739e7,0x39e77bef,0x9cd39cd3,0x39e79cd3,0x39e77bef,0x39e79cd3,0x7bef7bef,0x7bef7bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc800c800,0xfaa0f800,0xfaa0fd00,0xc800c800,0xfaa0faa0,0xc800f800,0xfd00f800,0xfd00ffe0,0xc800c800,0xfaa0f800,0xfaa0fd00,0xc800c800,0xfaa0faa0,0xc800f800,0xfd00f800,0xfd00ffe0, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x39e739e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef39e7,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef39e7,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef39e7,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef39e7,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef39e7,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x9cd37bef, +0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef39e7,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x9cd37bef,0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef39e7,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x9cd37bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xf800f800,0xfaa0f800,0xf800f800,0xf800fd00,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xf800f800,0xfaa0f800,0xf800f800,0xf800fd00, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x39e77bef,0x7bef7bef,0x7bef39e7,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x39e77bef,0x7bef7bef,0x9cd339e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x39e77bef,0x7bef7bef,0x9cd339e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x39e77bef,0x7bef7bef,0x9cd339e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x39e77bef,0x7bef9cd3,0x9cd339e7,0x39e79cd3, +0x9cd37bef,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x39e77bef,0x7bef9cd3,0x9cd339e7,0x39e79cd3,0x9cd39cd3,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x39e77bef,0x7bef9cd3,0x9cd339e7,0x39e79cd3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0xffe0fd00,0xfaa0faa0,0xf800c800,0xf800f800,0xfd00c800,0xfaa0fd00,0xf800faa0,0xf800f800,0xffe0fd00,0xfaa0faa0,0xf800c800,0xf800f800,0xfd00c800,0xfaa0fd00,0xf800faa0, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x39e77bef,0x7bef7bef,0x39e77bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x39e77bef,0x7bef7bef,0x39e77bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x9cd339e7,0x39e77bef,0x7bef7bef,0x39e77bef,0x7bef39e7,0x7bef7bef,0x9cd39cd3,0x7bef39e7,0x9cd339e7,0x39e77bef,0x7bef39e7,0x39e77bef,0x7bef39e7, +0x39e77bef,0x9cd39cd3,0x7bef39e7,0x9cd339e7,0x39e77bef,0x7bef39e7,0x39e77bef,0x7bef39e7,0x39e739e7,0x9cd39cd3,0x7bef39e7,0x9cd339e7,0x39e77bef,0x7bef39e7,0x39e77bef,0x7bef39e7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc800f800,0xfaa0f800,0xfaa0ffe0,0xfaa0faa0,0xffe0fd00,0xffe0faa0,0xfd00ffe0,0xf800faa0,0xc800f800,0xfaa0f800,0xfaa0ffe0,0xfaa0faa0,0xffe0fd00,0xffe0faa0,0xfd00ffe0,0xf800faa0, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e79cd3,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e79cd3,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef7bef,0x39e79cd3,0x9cd39cd3,0x7bef7bef,0x39e77bef,0x7bef7bef, +0x9cd37bef,0x39e739e7,0x7bef7bef,0x39e79cd3,0x9cd39cd3,0x7bef7bef,0x39e77bef,0x7bef7bef,0x9cd37bef,0x39e739e7,0x7bef7bef,0x39e79cd3,0x9cd39cd3,0x7bef7bef,0x39e77bef,0x7bef7bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0xf800faa0,0xfaa0faa0,0xffe0fd00,0xfaa0faa0,0xfaa0faa0,0xfaa0faa0,0xf800f800,0xf800f800,0xf800faa0,0xfaa0faa0,0xffe0fd00,0xfaa0faa0,0xfaa0faa0,0xfaa0faa0,0xf800f800, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x39e739e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x7bef39e7,0x39e739e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd39cd3,0x7bef39e7,0x39e739e7,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x39e77bef,0x9cd37bef,0x9cd39cd3,0x7bef39e7,0x39e739e7,0x7bef9cd3,0x39e79cd3,0x7bef7bef,0x39e77bef,0x9cd37bef,0x9cd39cd3,0x7bef39e7,0x39e739e7,0x7bef9cd3,0x39e79cd3,0x7bef7bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfd00faa0,0xfaa0ffe0,0xf800c800,0xfaa0f800,0xfaa0f800,0xfd00ffe0,0xf800c800,0xf800f800,0xfd00faa0,0xfaa0ffe0,0xf800c800,0xfaa0f800,0xfaa0f800,0xfd00ffe0,0xf800c800,0xf800f800, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x39e77bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x39e79cd3,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x7bef7bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xffe0faa0,0xfaa0ffe0,0xf800f800,0xf800c800,0xfaa0f800,0xfaa0ffe0,0xf800f800,0xc800c800,0xffe0faa0,0xfaa0ffe0,0xf800f800,0xf800c800,0xfaa0f800,0xfaa0ffe0,0xf800f800,0xc800c800, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef39e7,0x7bef9cd3,0x7bef39e7,0x7bef39e7,0x7bef9cd3,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0xfd00c800,0xfaa0fd00,0xc800f800,0xc800c800,0xf800f800,0xf800faa0,0xc800f800,0xc800c800,0xfd00c800,0xfaa0fd00,0xc800f800,0xc800c800,0xf800f800,0xf800faa0,0xc800f800,0xc800c800, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x94d38c92,0xa534ad96,0x94f38cb2,0xb5b6adb6,0x94f39d14,0xad96a555,0x94d38cb2,0xadb6ad96,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xfaa0fd00,0xf800f800,0xf800f800,0xc800c800,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xfaa0fd00,0xf800f800,0xf800f800,0xc800c800,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xfaa0fd00,0xf800f800,0xf800f800,0xc800c800, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xb5b6b5b6,0x9d149d34,0xa534adb6,0xa575a555,0xad96bdf7,0x94f394f3,0xa575a534,0x8cb294f3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800c800,0xf800faa0,0xf800c800,0xfaa0f800,0xfd00fd00,0xf800faa0,0xf800faa0,0xc800f800,0xf800c800,0xf800faa0,0xf800c800,0xfaa0f800,0xfd00fd00,0xf800faa0,0xf800faa0,0xc800f800,0xf800c800,0xf800faa0,0xf800c800,0xfaa0f800,0xfd00fd00,0xf800faa0,0xf800faa0,0xc800f800, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa555a575,0xbdf7b5b6,0xa575ad96,0x9d14a534,0x9d148451,0xadb6a575,0x9d149d14,0xb5d7adb6,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfaa0f800,0xfaa0fd00,0xfaa0faa0,0xf800faa0,0xfaa0faa0,0xfaa0f800,0xfaa0fd00,0xf800f800,0xfaa0f800,0xfaa0fd00,0xfaa0faa0,0xf800faa0,0xfaa0faa0,0xfaa0f800,0xfaa0fd00,0xf800f800,0xfaa0f800,0xfaa0fd00,0xfaa0faa0,0xf800faa0,0xfaa0faa0,0xfaa0f800,0xfaa0fd00,0xf800f800, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x94f394f3,0x84718451,0xb5b6ad96,0x84518cb2,0xad759d34,0xa575a534,0xbdf7bdf7,0x8492a555,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xffe0f800,0xfaa0ffe0,0xffe0ffe0,0xf800fd00,0xf800c800,0xfaa0f800,0xffe0ffe0,0xf800faa0,0xffe0f800,0xfaa0ffe0,0xffe0ffe0,0xf800fd00,0xf800c800,0xfaa0f800,0xffe0ffe0,0xf800faa0,0xffe0f800,0xfaa0ffe0,0xffe0ffe0,0xf800fd00,0xf800c800,0xfaa0f800,0xffe0ffe0,0xf800faa0, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x94d38cb2,0xa555a555,0x94f394f3,0xa575ad75,0x94d38cb2,0xa55594f3,0x84718471,0xa5559514,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfd00f800,0xfaa0ffe0,0xfd00faa0,0xf800faa0,0xf800f800,0xfaa0f800,0xffe0fd00,0xf800fd00,0xfd00f800,0xfaa0ffe0,0xfd00faa0,0xf800faa0,0xf800f800,0xfaa0f800,0xffe0fd00,0xf800fd00,0xfd00f800,0xfaa0ffe0,0xfd00faa0,0xf800faa0,0xf800f800,0xfaa0f800,0xffe0fd00,0xf800fd00, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xadb6ad96,0xa575a575,0xadb6b5f7,0xa555a575,0xad96adb6,0xa5349d14,0x9d34a555,0x9d348cb2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfaa0f800,0xf800faa0,0xf800f800,0xf800c800,0xfaa0faa0,0xf800faa0,0xfd00f800,0xf800faa0,0xfaa0f800,0xf800faa0,0xf800f800,0xf800c800,0xfaa0faa0,0xf800faa0,0xfd00f800,0xf800faa0,0xfaa0f800,0xf800faa0,0xf800f800,0xf800c800,0xfaa0faa0,0xf800faa0,0xfd00f800,0xf800faa0, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x9d1494f3,0xad969514,0x84718451,0xa5559d14,0xa55594d3,0xbdf7bdf7,0xa5759d14,0xb5d7bdf7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0xfaa0f800,0xfaa0faa0,0xf800f800,0xffe0faa0,0xc800faa0,0xf800c800,0xf800faa0,0xf800f800,0xfaa0f800,0xfaa0faa0,0xf800f800,0xffe0faa0,0xc800faa0,0xf800c800,0xf800faa0,0xf800f800,0xfaa0f800,0xfaa0faa0,0xf800f800,0xffe0faa0,0xc800faa0,0xf800c800,0xf800faa0, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa575a575,0x94f38c92,0xa555ad96,0x94f394d3,0x9d1494f3,0x849294f3,0x9d149d34,0x8cb28cb2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc800c800,0xfd00faa0,0xfd00ffe0,0xf800f800,0xffe0fd00,0xc800faa0,0xfaa0f800,0xfaa0faa0,0xc800c800,0xfd00faa0,0xfd00ffe0,0xf800f800,0xffe0fd00,0xc800faa0,0xfaa0f800,0xfaa0faa0,0xc800c800,0xfd00faa0,0xfd00ffe0,0xf800f800,0xffe0fd00,0xc800faa0,0xfaa0f800,0xfaa0faa0, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x94f394f3,0xbdf7b5d7,0xa555a575,0xad96adb6,0x94f38cb2,0xadb6a575,0xa555a555,0xad96adb6,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc800c800,0xfaa0f800,0xfaa0fd00,0xc800c800,0xfaa0faa0,0xc800f800,0xfd00f800,0xfd00ffe0,0xc800c800,0xfaa0f800,0xfaa0fd00,0xc800c800,0xfaa0faa0,0xc800f800,0xfd00f800,0xfd00ffe0,0xc800c800,0xfaa0f800,0xfaa0fd00,0xc800c800,0xfaa0faa0,0xc800f800,0xfd00f800,0xfd00ffe0, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xb5f7b5d7,0xa575ad96,0x9d349d34,0xa5349d14,0xb5f7ad96,0x9d14a555,0xbdf7bdf7,0xa534a575,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xf800f800,0xfaa0f800,0xf800f800,0xf800fd00,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xf800f800,0xfaa0f800,0xf800f800,0xf800fd00,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xf800f800,0xfaa0f800,0xf800f800,0xf800fd00, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x84718c92,0xadb694d3,0x845194d3,0x94f394d3,0x845194d3,0x9d1494f3,0x94f38492,0x95148cb2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0xffe0fd00,0xfaa0faa0,0xf800c800,0xf800f800,0xfd00c800,0xfaa0fd00,0xf800faa0,0xf800f800,0xffe0fd00,0xfaa0faa0,0xf800c800,0xf800f800,0xfd00c800,0xfaa0fd00,0xf800faa0,0xf800f800,0xffe0fd00,0xfaa0faa0,0xf800c800,0xf800f800,0xfd00c800,0xfaa0fd00,0xf800faa0, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x9d14a555,0x9d3494d3,0xa575ad75,0x84518471,0xa53494f3,0x8cb294f3,0xad75ad75,0x84718cb2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc800f800,0xfaa0f800,0xfaa0ffe0,0xfaa0faa0,0xffe0fd00,0xffe0faa0,0xfd00ffe0,0xf800faa0,0xc800f800,0xfaa0f800,0xfaa0ffe0,0xfaa0faa0,0xffe0fd00,0xffe0faa0,0xfd00ffe0,0xf800faa0,0xc800f800,0xfaa0f800,0xfaa0ffe0,0xfaa0faa0,0xffe0fd00,0xffe0faa0,0xfd00ffe0,0xf800faa0, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x94f39d34,0xadb6a575,0x94f39d14,0xadb69d34,0x9d1494d3,0xadb6adb6,0x94f39d34,0xad96bdf7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0xf800faa0,0xfaa0faa0,0xffe0fd00,0xfaa0faa0,0xfaa0faa0,0xfaa0faa0,0xf800f800,0xf800f800,0xf800faa0,0xfaa0faa0,0xffe0fd00,0xfaa0faa0,0xfaa0faa0,0xfaa0faa0,0xf800f800,0xf800f800,0xf800faa0,0xfaa0faa0,0xffe0fd00,0xfaa0faa0,0xfaa0faa0,0xfaa0faa0,0xf800f800, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xadb6ad96,0x9d149d14,0xadb6b5b6,0x9d14a534,0xadb6a575,0xa575a575,0xb5d7b5b6,0xa555a575,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfd00faa0,0xfaa0ffe0,0xf800c800,0xfaa0f800,0xfaa0f800,0xfd00ffe0,0xf800c800,0xf800f800,0xfd00faa0,0xfaa0ffe0,0xf800c800,0xfaa0f800,0xfaa0f800,0xfd00ffe0,0xf800c800,0xf800f800,0xfd00faa0,0xfaa0ffe0,0xf800c800,0xfaa0f800,0xfaa0f800,0xfd00ffe0,0xf800c800,0xf800f800, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa5559d34,0xbdf7b5d7,0xa575ad96,0x9d149d14,0x8c928cb2,0x9d1494f3,0x8c927c51,0x9d1494f3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xffe0faa0,0xfaa0ffe0,0xf800f800,0xf800c800,0xfaa0f800,0xfaa0ffe0,0xf800f800,0xc800c800,0xffe0faa0,0xfaa0ffe0,0xf800f800,0xf800c800,0xfaa0f800,0xfaa0ffe0,0xf800f800,0xc800c800,0xffe0faa0,0xfaa0ffe0,0xf800f800,0xf800c800,0xfaa0f800,0xfaa0ffe0,0xf800f800,0xc800c800, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x94f394d3,0x8cb28cb2,0xad759d34,0x94f394d3,0xa575a555,0x8cb28471,0xa534a534,0x8c928cb2,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0xfd00c800,0xfaa0fd00,0xc800f800,0xc800c800,0xf800f800,0xf800faa0,0xc800f800,0xc800c800,0xfd00c800,0xfaa0fd00,0xc800f800,0xc800c800,0xf800f800,0xf800faa0,0xc800f800,0xc800c800,0xfd00c800,0xfaa0fd00,0xc800f800,0xc800c800,0xf800f800,0xf800faa0,0xc800f800,0xc800c800, +0xdeb4e6d5,0xc5cedeb3,0xe6d5de94,0xc5cede93,0xde94deb4,0xc5cede73,0xdeb4de93,0xe6f5deb4,0x23512330,0x2bb22bf4,0x23912350,0x2c142bf4,0x23712392,0x2bf42bd3,0x23512350,0x2bf42bf4,0xebc5eb84,0xec06ec48,0xebc6eba5,0xec48ec48,0xebc6ebe6,0xec48ec07,0xebc5eba5,0xec48ec28,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xe6d4e6d4,0xef16d673,0xdeb4c5ce,0xc5ced673,0xc5cece31,0xdeb4ce31,0xeef6c5ce,0xdeb4de93,0x2c142c14,0x239223b2,0x2bb22bf4,0x2bd32bd3,0x2bf42c35,0x23712371,0x2bd32bb2,0x23502391,0xec48ec48,0xebe6ec06,0xec06ec48,0xec28ec07,0xec28ec69,0xebc5ebc5,0xec27ec06,0xeba5ebc6,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x3b7f3b7f, +0xe6b4e6d4,0xc5ceef16,0xde94c5ce,0xc5cede93,0xce31d672,0xde94de93,0xc5cee6d4,0xde94eef6,0x2bd32bd3,0x2c352c14,0x2bd32bf4,0x23922bb2,0x2392230f,0x2bf42bd3,0x23922392,0x2c352bf4,0xec07ec27,0xec69ec48,0xec27ec48,0xebe6ec06,0xebe6e342,0xec48ec27,0xebe6ebe6,0xec69ec48,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1abf1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff, +0xce31deb4,0xe6d5c5ce,0xce31ce31,0xd672c5ce,0xc5ced652,0xdeb3ef16,0xded4d672,0xce31c5ce,0x23712391,0x2330230f,0x2c142bf4,0x230f2330,0x2bd323b2,0x2bd32bb2,0x2c352c35,0x23302bd3,0xebc6ebc6,0xe363e342,0xec48ec48,0xe342eba4,0xec28ec06,0xec27ec06,0xec69ec69,0xeb63ec07,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff22ff,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff22ff,0x22ff22ff,0x1abf1abf,0x1abf1abf, +0xef16c5ce,0xe6d4ef16,0xe6d4de93,0xc5cee6d4,0xef16d673,0xef16c5ce,0xc5cede94,0xdeb4deb4,0x23512350,0x2bb32bb3,0x23912371,0x2bd32bd3,0x23512350,0x2bd32371,0x230f230f,0x2bd32391,0xebc5eba4,0xec07ec07,0xebc6ebc6,0xec27ec28,0xebc5eba5,0xec07ebc5,0xe363e363,0xec07ebc6,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xc5ced652,0xd673d672,0xe6d4deb4,0xde94c5ce,0xd673deb4,0xef16c5ce,0xce31deb4,0xdeb3e6d4,0x2c142bf4,0x2bd32bd3,0x2bf42c35,0x2bd32bd3,0x2bf42c14,0x2bb22392,0x23b22bd3,0x23b22350,0xec48ec48,0xec27ec27,0xec48ec69,0xec07ec27,0xec28ec48,0xec06ebe6,0xec06ec07,0xec06eba4,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x3b7f22ff,0x1abf3b7f,0x3b7f1abf,0x1abf22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x3b7f22ff,0x1abf3b7f,0x3b7f1abf,0x1abf22ff,0x1abf1abf, +0xdeb3d673,0xd652ce31,0xdeb4de94,0xd652c5cf,0xd672e6d4,0xc5cece32,0xce31c5ee,0xd673e6d4,0x23922371,0x2bf42391,0x2330230f,0x2bb32392,0x2bd32351,0x2c352c35,0x2bd32392,0x2c352c35,0xebe6ebc5,0xec28ebc6,0xe363e342,0xec07ebe6,0xec07ebc5,0xec69ec69,0xec27ebe6,0xec69ec69,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x536e536e,0x00000000,0x536e0000,0x0000536e,0x00000000,0x536e536e,0x00000000,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f22ff,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f22ff,0x22ff3b7f,0x22ff22ff, +0xd652d672,0xde94c5ce,0xe6d4e6d4,0xd673ce31,0xc5cede94,0xde93c5ce,0xc5ceef36,0xd672de94,0x2bd32bd3,0x23712330,0x2bd32bf4,0x23912351,0x23922371,0x23302371,0x239223b2,0x23302350,0xec27ec27,0xebc5eba4,0xec07ec48,0xebc6ebc5,0xebe6ebc5,0xeb63ebc5,0xebe6ec06,0xeba4eba4,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x7cb30000,0xbe59d6fb,0x0000536e,0xd6fb7cb3,0x536ebe59,0x7cb30000,0xbe59d6fb,0x0000536e,0x22ff22ff,0x22ff3b7f,0x22ff22ff,0x22ff22ff,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff3b7f,0x22ff22ff,0x22ff22ff,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xc5cee6f4,0xd651eef6,0xc5cec5ce,0xd652d652,0xe6d4c5ce,0xdeb4deb4,0xe6f5deb4,0xe6f5c5ce,0x23712371,0x2c352c35,0x2bd32bd3,0x2bf42bf4,0x23712350,0x2bf42bd3,0x2bd32bd3,0x2bf42c14,0xebc6ebc6,0xec69ec69,0xec07ec27,0xec48ec48,0xebc5eba5,0xec48ec28,0xec07ec07,0xec48ec48,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x7cb30000,0xd6fbffff,0x0000536e,0xffff7cb3,0x536ed6fb,0x7cb30000,0xd6fbffff,0x0000536e,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x22ff1abf,0x3b7f22ff,0x22ff3b7f,0x1abf22ff,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x22ff1abf,0x3b7f22ff,0x22ff3b7f,0x1abf22ff, +0xdeb3c5ce,0xeef6de93,0xd651d673,0xe6d5c5ce,0xde93c5ce,0xd652e6d4,0xce31ce31,0xc5ceeef6,0x2c352c35,0x2bd32bf4,0x23b223b2,0x2bb22392,0x2c352bf4,0x23922bd3,0x2c352c35,0x2bb22bd3,0xec69ec69,0xec28ec28,0xec06ec06,0xec06ebe6,0xec69ec28,0xebe6ec07,0xec69ec69,0xec06ec27,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x7cb37cb3,0x00000000,0x7cb30000,0x00007cb3,0x00000000,0x7cb37cb3,0x00000000,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f, +0xc5ced673,0xde94d673,0xd651de94,0xc5cec5ce,0xde94e6f4,0xc5cede93,0xde93d653,0xd653ce32,0x230f2330,0x2bf42371,0x230f2351,0x23712351,0x230f2351,0x23922371,0x23712330,0x23912350,0xe363eba4,0xec48ebc5,0xe342ebc5,0xebc6eba5,0xe342ebc5,0xebe6ebc6,0xebc5eb63,0xebc6eba5,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x22ff3b7f,0x1abf22ff,0x22ff22ff,0x22ff22ff,0x1abf3b7f,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff3b7f,0x1abf22ff,0x22ff22ff,0x22ff22ff,0x1abf3b7f,0x1abf1abf,0x3b7f1abf,0x1abf1abf, +0xc5cede93,0xde94eef6,0xd651d673,0xef16ef16,0xce31c5ce,0xeef6ce31,0xe6d4e6d4,0xde94de93,0x23922bd3,0x23b22351,0x2bd32bd3,0x230f2330,0x2bb22371,0x23302371,0x2bd32bd3,0x23302350,0xebe6ec07,0xec06ebc5,0xec28ec28,0xe342e363,0xec06ebc5,0xeba4ebc5,0xec28ec28,0xe363eba4,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x22ff22ff,0x1abf22ff,0x1abf22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x22ff22ff,0x1abf22ff,0x1abf22ff, +0xdeb3ce31,0xeef6c5ce,0xc5ceeef6,0xdeb4de93,0xd672d651,0xc5ced693,0xe6f4eef6,0xd652de93,0x237123b2,0x2bf42bd3,0x23912392,0x2bf423b2,0x23922351,0x2bf42bf4,0x237123b2,0x2bf42c35,0xebc6ec06,0xec48ec28,0xebc6ebe6,0xec48ec06,0xebe6ebc5,0xec48ec48,0xebc6ec06,0xec48ec69,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x3b7f1abf,0x22ff3b7f,0x3b7f22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f1abf,0x22ff3b7f,0x3b7f22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff, +0xe6b4ce31,0xc5cede93,0xd653c5ce,0xd652ce32,0xd652c5ce,0xe6f4ce32,0xef35c5ce,0xc5cee6d4,0x2bf42bf4,0x23922392,0x2bf42c14,0x23922bb2,0x2bf42bd3,0x2bd32bd3,0x2c352c14,0x2bd32bd3,0xec48ec28,0xebe6ebe6,0xec48ec48,0xebe6ec06,0xec48ec27,0xec27ec27,0xec69ec48,0xec07ec27,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1abf1abf,0x22ff22ff,0x3b7f22ff,0x22ff22ff,0x22ff22ff,0x3b7f1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f22ff,0x22ff22ff,0x22ff22ff,0x3b7f1abf,0x1abf3b7f,0x1abf1abf, +0xc5cee6f5,0xe6b4de94,0xd653c5ce,0xc5ced673,0xdeb4deb3,0xd673d653,0xc5ced673,0xe716c5ce,0x2bd323b2,0x2c352c35,0x2bd32bf4,0x23922392,0x23302350,0x23922371,0x23301aef,0x23922371,0xec07ec06,0xec69ec69,0xec27ec28,0xebe6ebe6,0xeb84eba5,0xebe6ebc5,0xeba4e342,0xebe6ebc6,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x22ff1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x1abf1abf, +0xde94ef15,0xc5cece31,0xde94e6d5,0xc5ceef16,0xe6d4d673,0xdeb4deb4,0xdeb4c5ce,0xdeb4deb4,0x23712351,0x23502350,0x2bd323b2,0x23712351,0x2bd32bd3,0x23502330,0x2bb22bb2,0x23302350,0xebc6eba5,0xeba5eba4,0xec28ec06,0xebc5ebc5,0xec27ec07,0xeba4e363,0xec06ec06,0xeb84eba4,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f, +0xef16e717,0xdeb4ce31,0xc610c610,0xe6d5c5cf,0xde93e6d4,0xce30c5ce,0xef36eef6,0xef37c5ee,0x71767155,0x81998a19,0x79977176,0x923a8a19,0x79777998,0x8a1981b9,0x71767176,0x8a1989f9,0xb9d8b1b7,0xc279c2f9,0xba19b9d8,0xcb3ac2fa,0xb9f8ba39,0xc2f9c299,0xb9d8b9d8,0xc2fac2d9,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xc610ce32,0xce31e6d5,0xe716de94,0xbdaeded6,0xce0fe6f6,0xe6d5ded5,0xbd8dc610,0xbdaddeb4,0x8a3a8a3a,0x79988198,0x81998a19,0x89d981b9,0x89f9927a,0x79777977,0x81d98199,0x71767997,0xc31acb1a,0xba19c259,0xc279c2fa,0xc2b9c299,0xc2d9cb5a,0xb9f8b9f8,0xc2b9c279,0xb9d8ba19,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x3b7f3b7f, +0xe6f7e6f6,0xc5efd673,0xde94d674,0xdeb5de93,0xd694c5ce,0xd673d673,0xe6f6c5ce,0xde94ded5,0x81b981d9,0x927a923a,0x81d98a19,0x79988199,0x79986954,0x8a1981d9,0x79987998,0x925a8a19,0xc299c2b9,0xcb5acb3a,0xc2b9c2f9,0xba19c279,0xba39a196,0xc2fac2b9,0xba39ba39,0xcb5ac2fa,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x1abf1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff, +0xe6f7ef16,0xce31e6d5,0xef37ef16,0xef16ef16,0xef38c5ce,0xde95eef6,0xe6f6ce31,0xe6d6e717,0x79777997,0x69556954,0x8a3a8a19,0x69547176,0x89d98198,0x81d98199,0x927a927a,0x715581b9,0xb9f8ba19,0xa9b6a196,0xcb1ac2f9,0xa196b1b7,0xc2b9ba59,0xc2b9c279,0xcb5acb5a,0xa9b7c299,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff22ff,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff22ff,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff22ff,0x22ff22ff,0x1abf1abf,0x1abf1abf, +0xef37c5ce,0xe6d5ef37,0xbdadce10,0xc5eec5ee,0xc5cede93,0xef17c5ce,0xe6d4c5ee,0xef37ef37,0x71767176,0x81998199,0x79977977,0x81d989d9,0x71767176,0x81b97977,0x69546954,0x81b97997,0xb9d8b1d8,0xc279c279,0xba19b9f8,0xc2b9c2b9,0xb9d8b9d8,0xc299b9f8,0xa9b6a9b6,0xc299ba19,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xc5efde93,0xc5efc5ef,0xce30d673,0xde93de93,0xde93e6f6,0xce10deb4,0xc5eeded5,0xc5aec5ee,0x8a198a19,0x81d981d9,0x8a19927a,0x81b981d9,0x89f98a19,0x81997998,0x819881b9,0x81987176,0xc2fac2f9,0xc2b9c2b9,0xc2facb5a,0xc299c2b9,0xc2d9c2fa,0xc279ba19,0xba59c299,0xc259b1d8,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x3b7f22ff,0x1abf3b7f,0x3b7f1abf,0x1abf22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x3b7f22ff,0x1abf3b7f,0x3b7f1abf,0x1abf22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x3b7f22ff,0x1abf3b7f,0x3b7f1abf,0x1abf22ff,0x1abf1abf, +0xe6d5d673,0xe6d5e6d5,0xc5eede93,0xdeb5eef6,0xdeb5e6d5,0xc5cdd673,0xded5e6f6,0xded5c5cf,0x79987977,0x89f97997,0x69556954,0x81997998,0x81b97176,0x927a927a,0x81d97998,0x925a927a,0xba19b9f8,0xc2d9ba19,0xa9b6a196,0xc279ba19,0xc299b9d8,0xcb5acb5a,0xc2b9ba39,0xcb3acb5a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f22ff,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f22ff,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f22ff,0x22ff3b7f,0x22ff22ff, +0xde94ef37,0xde94e6d5,0xc5efdeb4,0xef17ef16,0xde93de95,0xd651e6d5,0xef16f757,0xef37c5ef,0x81d981d9,0x79777175,0x81b98a19,0x79977176,0x79987977,0x71557977,0x79988198,0x71767176,0xc2b9c2b9,0xb9f8b1b7,0xc299c2f9,0xba19b9d8,0xba19b9f8,0xa9b7b9f8,0xba19ba59,0xb1b7b1b8,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff22ff,0x22ff3b7f,0x22ff22ff,0x22ff22ff,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff3b7f,0x22ff22ff,0x22ff22ff,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff3b7f,0x22ff22ff,0x22ff22ff,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xf758c5ce,0xeef6ef16,0xef37f758,0xc610ce31,0xef16ef16,0xc610f757,0xce10ce32,0xef37c5cf,0x79777977,0x927a925a,0x81b981d9,0x8a198a19,0x79777176,0x8a1989d9,0x81b981b9,0x8a198a19,0xb9f8b9f8,0xcb5acb5a,0xc299c2b9,0xc2f9c2fa,0xb9f8b9d8,0xc2fac2b9,0xc299c299,0xc2f9c2fa,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x22ff1abf,0x3b7f22ff,0x22ff3b7f,0x1abf22ff,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x22ff1abf,0x3b7f22ff,0x22ff3b7f,0x1abf22ff,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x22ff1abf,0x3b7f22ff,0x22ff3b7f,0x1abf22ff, +0xce51de94,0xce31ce51,0xce31ce2f,0xe6f6ded6,0xc5eebdae,0xe6d5c610,0xd693ded5,0xc5cfdeb5,0x927a925a,0x89d989f9,0x81988198,0x81997998,0x927a89f9,0x799881b9,0x927a927a,0x819981d9,0xcb5acb5a,0xc2b9c2d9,0xba59ba59,0xc279ba39,0xcb5ac2d9,0xba19c299,0xcb5acb5a,0xc279c2b9,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f, +0xd673d694,0xdeb3d673,0xe6d5ce2f,0xef16deb4,0xc5eedeb4,0xde93e6d5,0xdeb4de93,0xc5cfdeb5,0x69547175,0x8a197977,0x69547176,0x79777176,0x69547176,0x79987977,0x79777155,0x79977176,0xa9b6b1b7,0xc2fab9d8,0xa196b9d8,0xb9f8b9d8,0xa196b9d8,0xba19b9f8,0xb9f8a9b7,0xba19b9d8,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff3b7f,0x1abf22ff,0x22ff22ff,0x22ff22ff,0x1abf3b7f,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff3b7f,0x1abf22ff,0x22ff22ff,0x22ff22ff,0x1abf3b7f,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff3b7f,0x1abf22ff,0x22ff22ff,0x22ff22ff,0x1abf3b7f,0x1abf1abf,0x3b7f1abf,0x1abf1abf, +0xde94ce30,0xd673de93,0xded4ce2f,0xe6d4e6f5,0xc5cede73,0xd673e6d5,0xe6f6deb4,0xdeb4d673,0x799881b9,0x81987176,0x89d989d9,0x69546955,0x81997977,0x71767977,0x89d989d9,0x69557176,0xba39c299,0xc259b9d8,0xc2b9c2b9,0xa196a9b6,0xc279b9f8,0xb1b7b9f8,0xc2b9c2b9,0xa9b6b1d8,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x22ff22ff,0x1abf22ff,0x1abf22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x22ff22ff,0x1abf22ff,0x1abf22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x22ff22ff,0x1abf22ff,0x1abf22ff, +0xf778ce11,0xef36e6f6,0xf758ce2f,0xf757f757,0xe6f6ef17,0xf757bdad,0xe6f6e6f6,0xf757f757,0x79778198,0x8a1989d9,0x79977998,0x8a198198,0x79987176,0x8a198a19,0x79778198,0x8a19927a,0xb9f8c259,0xc2fac2b9,0xba19ba19,0xc2faba59,0xba19b9d8,0xc2fac2fa,0xb9f8c259,0xc2f9cb5a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x3b7f1abf,0x22ff3b7f,0x3b7f22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f1abf,0x22ff3b7f,0x3b7f22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f1abf,0x22ff3b7f,0x3b7f22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff, +0xd673c610,0xc5f0d651,0xc610ce10,0xc5f0ce31,0xc60fc610,0xc5cec5cf,0xce52ce30,0xc5cfc5f1,0x8a1989f9,0x79987998,0x8a198a3a,0x79988199,0x8a1981d9,0x81d981d9,0x925a923a,0x81b981d9,0xc2fac2d9,0xba39ba19,0xc2facb1a,0xba19c279,0xc2fac2b9,0xc2b9c2b9,0xcb5acb3a,0xc299c2b9,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x1abf1abf,0x22ff22ff,0x3b7f22ff,0x22ff22ff,0x22ff22ff,0x3b7f1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f22ff,0x22ff22ff,0x22ff22ff,0x3b7f1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f22ff,0x22ff22ff,0x22ff22ff,0x3b7f1abf,0x1abf3b7f,0x1abf1abf, +0xd674e6d5,0xde94de94,0xd674de94,0xce32d653,0xd673d673,0xde94de93,0xe6f6d673,0xe6f5e6f6,0x81b98198,0x927a925a,0x81d989f9,0x79987998,0x71557176,0x79987977,0x71756954,0x79987977,0xc299c259,0xcb5acb3a,0xc2b9c2d9,0xba19ba19,0xb1b7b9d8,0xba19b9f8,0xb1b7a195,0xba39b9f8,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x1abf1abf, +0xef16eef6,0xe6f6ef16,0xe6d5e6b5,0xef16f757,0xf757ef16,0xef16ef16,0xf757ef16,0xef16f757,0x79777176,0x71767176,0x89d98198,0x79777176,0x81d981b9,0x71766955,0x81998199,0x71557176,0xb9f8b9d8,0xb9d8b1b8,0xc2b9ba59,0xb9f8b9d8,0xc2b9c299,0xb1d8a9b6,0xc279c279,0xb1b7b1d8,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f, +0xe6d4ef15,0xdeb3deb4,0xe6b4de73,0xd673de94,0xdeb4d673,0xe6f5d693,0xded4de93,0xdeb4deb4,0x21712170,0x21b329d4,0x21922171,0x29d529d4,0x21922192,0x29d429b3,0x21712171,0x29d429b4,0x53f94b99,0x6c7a7cdb,0x5c1a53d9,0x851b7cdb,0x5c1a643a,0x7cdb6c9a,0x53f953d9,0x7cdb7cdb,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe6d4e6d4,0xe6d4de93,0xded4de94,0xce52d673,0xde93d653,0xdeb4d693,0xe6f5deb4,0xdeb4deb4,0x29d529d5,0x21922193,0x21b329d4,0x29b429b3,0x29b429d6,0x21922192,0x29b421b3,0x21712192,0x84fb851b,0x643a6c7a,0x6c7a7cdb,0x74bb6c9a,0x7cdb8d5b,0x5c1a5c1a,0x749a6c7a,0x53d95c1a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdeb4e6d5,0xded5d673,0xd674de94,0xd693d653,0xd673d673,0xd673deb3,0xdeb4de94,0xe6d4deb3,0x29b329b4,0x29d629d5,0x29b429d4,0x219221b3,0x2192214f,0x29d429b4,0x21922192,0x29d529d4,0x6c9a749a,0x8d5b851b,0x749a7cdb,0x643a6c7a,0x645a3b59,0x7cdb749a,0x645a643a,0x8d3b7cdb,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdeb4deb4,0xdeb4de94,0xded4de94,0xd672deb3,0xd672ce31,0xce32d652,0xde93d652,0xde93e6d4,0x21922192,0x2150214f,0x29d529d4,0x214f2171,0x29b42193,0x29b421b3,0x29d629d6,0x217029b3,0x5c1a5c1a,0x43793b59,0x851b7cdb,0x3b584bb9,0x74bb645a,0x749a6c7a,0x8d5b8d5b,0x43996c9a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe6d4de93,0xdeb4deb4,0xde73d673,0xce32e6b4,0xd673d673,0xd673d652,0xde94deb4,0xdeb3d673,0x21712171,0x29b329b3,0x21922192,0x29b429b4,0x21712171,0x29b32192,0x21502150,0x29b32192,0x53f953d9,0x6c7a6c7a,0x5c1a5c1a,0x749a74bb,0x53f953d9,0x6c9a5c1a,0x43794379,0x6c9a5c1a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdeb3ce32,0xde93d693,0xe6d5d673,0xde93deb4,0xded3de93,0xce31deb3,0xef16e6d4,0xd652e6f5,0x29d529d4,0x29b429b4,0x29d429d6,0x29b329b4,0x29b429d5,0x21b32192,0x219329b3,0x21932171,0x7cfb7cdb,0x749a749a,0x7cdb8d3b,0x6c9a749a,0x7cdb7cfb,0x6c7a643a,0x645a6c9a,0x6c7a53d9,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd672d652,0xd673d652,0xe6d4deb4,0xce32de93,0xd673e6d4,0xdeb4d672,0xdeb4e6f5,0xde93deb4,0x21922192,0x29b42192,0x2150214f,0x29b32192,0x29b32171,0x29d629d6,0x29b42192,0x29d529d6,0x643a5c1a,0x7cdb5c1a,0x43793b59,0x6c7a643a,0x6c9a53f9,0x8d5b8d5b,0x749a645a,0x8d3b8d5b,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd672de93,0xde94deb4,0xe6b4de93,0xde94deb4,0xde93de94,0xe6d4deb3,0xe6f5e6f5,0xd693e6d4,0x29b429b4,0x21922170,0x29b329d4,0x21922171,0x21922192,0x21702192,0x21922193,0x21712171,0x749a749a,0x5c1a4bb9,0x6c9a7cdb,0x5c1a53f9,0x643a5c1a,0x43995c1a,0x643a645a,0x4bb94bb9,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd673deb4,0xce52deb4,0xd673de93,0xd652d652,0xdeb4deb4,0xde94e6f4,0xdeb4de93,0xde94deb4,0x21922192,0x29d629d5,0x29b329b4,0x29d429d4,0x21922171,0x29d429b4,0x29b329b3,0x29d429d5,0x5c1a5c1a,0x8d5b8d3b,0x6c9a749a,0x7cdb7cdb,0x5c1a53d9,0x7cdb74bb,0x6c9a6c9a,0x7cdb7cfb,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdeb4d673,0xd673deb4,0xd652deb3,0xe6f6d673,0xde93de94,0xde93e6d4,0xdeb4d673,0xde94de94,0x29d629d5,0x29b429b4,0x21932193,0x21b32192,0x29d629b4,0x219229b3,0x29d629d6,0x21b329b4,0x8d3b8d3b,0x74bb7cdb,0x645a645a,0x6c7a643a,0x8d3b7cdb,0x643a6c9a,0x8d5b8d5b,0x6c7a749a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xde93d652,0xce32de93,0xd673ce32,0xef36e6d5,0xd653deb4,0xd673de73,0xde93de93,0xde93de94,0x21502170,0x29d42191,0x214f2171,0x21922171,0x214f2171,0x21922192,0x21922170,0x21922171,0x43794bb9,0x7cdb53f9,0x3b5853f9,0x5c1a53d9,0x3b5853f9,0x643a5c1a,0x5c1a4399,0x5c1a53d9,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd672de93,0xd652deb3,0xde93d693,0xe6d4deb4,0xdeb3d652,0xd693de93,0xdeb4e6f4,0xd673deb4,0x219229b3,0x21932171,0x29b429b4,0x214f2150,0x21b32192,0x21712192,0x29b429b4,0x21502171,0x643a6c9a,0x6c7a53f9,0x74bb74bb,0x3b584379,0x6c7a5c1a,0x4bb95c1a,0x74bb74bb,0x437953d9,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xde93e6d4,0xde93deb3,0xde73d673,0xe6b4de93,0xde93d672,0xdeb3d652,0xdeb4e6f4,0xd652deb4,0x21922193,0x29d429b4,0x21922192,0x29d42193,0x21922171,0x29d429d4,0x21922193,0x29d429d6,0x5c1a6c7a,0x7cdb74bb,0x5c1a643a,0x7cdb645a,0x643a53f9,0x7cdb7cdb,0x5c1a6c7a,0x7cdb8d5b,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd673deb4,0xde93deb4,0xce33ce52,0xd652ce32,0xd693d672,0xe6f4d672,0xded4e6f5,0xe6f5e6d4,0x29d429b4,0x21922192,0x29d429d5,0x219221b3,0x29d429b4,0x29b429b4,0x29d529d5,0x29b329b4,0x7cdb7cdb,0x645a643a,0x7cdb851b,0x643a6c7a,0x7cdb749a,0x749a749a,0x8d3b851b,0x6c9a749a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xde94deb4,0xde94e6b4,0xce33d673,0xce32ce32,0xde93deb3,0xe6d4d673,0xe715deb3,0xef15e715,0x29b32193,0x29d629d5,0x29b429b4,0x21922192,0x21702171,0x21922192,0x2170194f,0x21922192,0x6c9a6c7a,0x8d5b8d3b,0x749a7cdb,0x643a643a,0x4b9953d9,0x643a5c1a,0x4bb93b38,0x643a5c1a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe6d4e6d5,0xde93d673,0xde94e6d4,0xd652d673,0xdeb4deb4,0xdeb4d673,0xd693e6d4,0xef15e6f4,0x21922171,0x21712171,0x29b42193,0x21922171,0x29b429b3,0x21712150,0x21b321b3,0x21702171,0x5c1a53d9,0x53d94bb9,0x74bb645a,0x5c1a53f9,0x749a6c9a,0x53d94379,0x6c7a6c7a,0x4b9953d9,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x73ae73ae,0x73ae73ae,0x8c716b4d,0x7bef8c71,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x7bef7bef,0x49634963,0x51a359c3,0x51834963,0x61c359c3,0x51835183,0x59c359a3,0x49634963,0x59c359a3,0xb523a4c2,0xc5a3d624,0xbd63ad02,0xde64d644,0xb543bd83,0xd624cdc3,0xb523ad02,0xd644d623,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x7bef7bef,0x73ae7bef,0x22712271,0x73ae2271,0x7bef7bef,0x8c718c71,0x73ae7bef,0x7bef73ae,0x59c361c3,0x51835183,0x51a359c3,0x59a359a3,0x59a361c4,0x51835183,0x59a351a3,0x49635183,0xde64de64,0xbd63c5a3,0xc5a3d644,0xce03cdc3,0xd623de65,0xb543b543,0xcde3c5a3,0xad02bd63,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x8c717bef,0x8c7173ae,0x11751175,0x73ae1a54,0x11b21156,0x73ae2231,0x7bef7bef,0x8c718c71,0x59a359a3,0x61c461c3,0x59a359c3,0x518351a3,0x51834142,0x59c359a3,0x51835183,0x61c359c3,0xcdc3cde3,0xde65de64,0xcde3d624,0xbd63c5a3,0xc5839c82,0xd644cde3,0xc583bd83,0xde65d644,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x0000dedb,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x73ae7bef,0x73ae73ae,0x117473ae,0x73ae73ae,0x1a151176,0x73ae1a54,0x227173ae,0x7bef2211,0x51835183,0x49634142,0x61c359c3,0x41424963,0x59a35183,0x59a351a3,0x61c461c4,0x496359a3,0xb543bd63,0xa4a29c82,0xde64d624,0x9c62a4e2,0xce03c5a3,0xcde3c5a3,0xde65de65,0xa4c2cdc3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0xdedb0000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x7bef6b4d,0x11331a53,0x7bef1152,0x7bef7bef,0x8c718c71,0x7bef7bef,0x22527bef,0x6b4d32f1,0x49634963,0x59a359a3,0x51835183,0x59a359a3,0x49634963,0x59a35183,0x49424942,0x59a35183,0xb523ad02,0xcdc3cdc3,0xbd63b543,0xcde3ce03,0xb523ad02,0xcdc3b543,0x9c829c82,0xcdc3bd63,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x0000ffff,0xffff0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x7bef7bef,0x73ae8c71,0x8c7119d5,0x73ae8c71,0x1a3419f6,0x8c712252,0x1a348c71,0x7bef3310,0x59c359c3,0x59a359a3,0x59c361c4,0x59a359a3,0x59a359c3,0x51a35183,0x518359a3,0x51834963,0xd644d624,0xcde3cde3,0xd644de65,0xcdc3cde3,0xd623d644,0xc5a3bd63,0xc5a3cdc3,0xc5a3ad02,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0xdedb0000,0x0000ffff,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x73ae7bef,0x73ae73ae,0x73ae73ae,0x1a3673ae,0x1a341a35,0x2a711a15,0x1a1473ae,0x7bef2ab1,0x51835183,0x59a35183,0x49634142,0x59a35183,0x59a34963,0x61c461c4,0x59a35183,0x61c361c4,0xbd63b543,0xd623bd63,0xa4a29c82,0xcdc3bd63,0xcdc3b523,0xde65de65,0xcde3c583,0xde64de65,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0xffff0000,0xffffdedb,0xdedb0000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xffffdedb,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x22537bef,0x6b4d19f7,0x73ae8c71,0x12387bef,0x1a957bef,0x1a542a71,0x8c718c71,0x8c718c71,0x59a359a3,0x51834963,0x59a359c3,0x51834963,0x51835183,0x49635183,0x51835183,0x49634963,0xcde3cde3,0xb543a4e2,0xcdc3d624,0xbd63b523,0xbd63b543,0xa4c2b543,0xbd63c5a3,0xa4e2ace2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0xef5d0000,0xffffef5d,0xef5ddedb,0xef5dffff,0x0000ffff,0x0000dedb,0xffff0000,0x00000000,0xef5d0000,0x0000ef5d,0xef5d0000,0xffff0000,0x0000dedb,0x0000dedb,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x1a157bef,0x73ae1256,0x73ae73ae,0x73ae73ae,0x6b4d73ae,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x51835183,0x61c461c3,0x59a359a3,0x59c359c3,0x51834963,0x59c359a3,0x59a359a3,0x59c359c3,0xb543b543,0xde65de65,0xcdc3cde3,0xd624d644,0xb543ad02,0xd644ce03,0xcdc3cdc3,0xd624d644,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x0000ef5d,0xdedbffff,0x00000000,0xef5def5d,0xef5d0000,0xffffef5d,0xffffffff,0x0000ffff,0x0000ef5d,0xdedbffff,0x00000000,0xdedbef5d,0x0000ffff,0x0000ef5d,0x0000ffff,0x0000ffff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x8c718c71,0x19f87bef,0x1ab81a36,0x1a541219,0x7bef7bef,0x22711a33,0x8c718c71,0x6b4d8c71,0x61c461c3,0x59a359a3,0x51835183,0x51a35183,0x61c459a3,0x518359a3,0x61c461c4,0x51a359a3,0xde65de65,0xce03d623,0xc5a3c5a3,0xc5a3bd83,0xde65d623,0xbd63cdc3,0xde65de65,0xc5a3cde3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0xdedbdedb,0xdedbffff,0xffffef5d,0xffffffff,0x00000000,0x00000000,0x00000000,0x00000000,0xdedbdedb,0x0000dedb,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x73ae73ae,0x7bef7bef,0x1ab87bef,0x73ae1237,0x6b4d7bef,0x23161a33,0x73ae73ae,0x7bef6b4d,0x49424963,0x59c34963,0x41424963,0x51834963,0x41424963,0x51835183,0x51834963,0x51834963,0x9c82a4e2,0xd644b523,0x9c62b523,0xb543b522,0x9c62b523,0xbd63b543,0xb543a4c2,0xbd63ad02,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x0000ffff,0xdedbffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x8c717bef,0x73ae8c71,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x8c718c71,0x6b4d8c71,0x518359a3,0x51834963,0x59a359a3,0x41424963,0x51a35183,0x49635183,0x59a359a3,0x49634963,0xbd83cdc3,0xc5a3b523,0xce03ce03,0x9c62a4a2,0xc5a3b543,0xa4e2b543,0xce03ce03,0xa4a2ad02,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0xef5d0000,0xdedb0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x8c717bef,0x7bef7bef,0x12387bef,0x1a917bef,0x7bef1237,0x73ae73ae,0x73ae73ae,0x7bef73ae,0x51835183,0x59c359a3,0x51835183,0x59c35183,0x51834963,0x59c359c3,0x51835183,0x59c361c4,0xb543c5a3,0xd644ce03,0xbd63bd63,0xd644c5a3,0xbd63b523,0xd644d644,0xb543c5a3,0xd624de65,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0xef5d0000,0x0000dedb,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x6b4d7bef,0x2b731ab8,0x1a541ad8,0x73ae73ae,0x73ae8c71,0x7bef7bef,0x1a540937,0x7bef7bef,0x59c359a3,0x51835183,0x59c361c3,0x518351a3,0x59c359a3,0x59a359a3,0x61c361c3,0x59a359a3,0xd644d623,0xc583bd63,0xd644de64,0xbd63c5a3,0xd644cde3,0xcde3cde3,0xde65de64,0xcdc3cde3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x7bef7bef,0x8c718c71,0x8c718c71,0x8c718c71,0x8c7173ae,0x8c718c71,0x7bef6b4d,0x73ae7bef,0x59a35183,0x61c461c3,0x59a359a3,0x51835183,0x49634963,0x51835183,0x49634142,0x51835183,0xcdc3c5a3,0xde65de64,0xcde3d623,0xbd63bd63,0xa4c2ad02,0xbd63b543,0xa4e29c62,0xbd83b543,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x73ae7bef,0x73ae73ae,0x7bef73ae,0x8c718c71,0x8c716b4d,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x51834963,0x49634963,0x59a35183,0x51834963,0x59a359a3,0x49634963,0x51a351a3,0x49634963,0xb543b522,0xad02ace2,0xce03c5a3,0xb543b523,0xcde3cdc3,0xad02a4a2,0xc5a3c5a3,0xa4c2ad02,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x00000000,0x00000000,0x00000000,0x00000000,0x0000ef5d,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x1a5332ef,0x1ab81a53,0x1a54121a,0x22711a54,0x1a542271,0x2a712211,0x2a712a71,0x12361236,0x32223202,0x3a633a83,0x32423222,0x3aa33aa3,0x32423243,0x3a833a83,0x32223222,0x3aa33a83,0x35653525,0x3e054666,0x3da53565,0x46674666,0x35853dc5,0x46663e06,0x35653565,0x46663e66,0x84108410,0x84108410,0x94927bcf,0x84108c51,0x84108410,0x84108430,0x84108410,0x84308430, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x220e1a72,0x1ab81ab8,0x22712271,0x22712271,0x1a540957,0x099711b2,0x22112a71,0x12362a50,0x3aa33aa3,0x32433263,0x3a633aa3,0x3a833a83,0x3a8342c3,0x32423242,0x3a833a63,0x32223242,0x46674667,0x3dc53de5,0x3e054666,0x3e463e06,0x3e664e88,0x35853585,0x3e263e05,0x35653da5,0xad558430,0xa514ad55,0xb596a514,0xc638b596,0xc638c638,0xb596ce79,0xa514ad55,0x8430a514, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x22512ad0,0x22712232,0x11751175,0x09971a54,0x11b21156,0x1a322231,0x2a502a71,0x2ab12250,0x3a833a83,0x42c33aa3,0x3a833a83,0x32423a63,0x324329e2,0x3aa33a83,0x32433243,0x3ac33aa3,0x3e063e26,0x4e884667,0x3e264666,0x3dc53e05,0x3dc534e4,0x46663e26,0x3dc53dc5,0x4e674666,0xb5968430,0xb596a514,0xa5149cf3,0xd00094b2,0xb596b000,0xce79ad14,0xad55ce79,0x9492b596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x2a9232f1,0x19922a71,0x11741173,0x09371196,0x1a151176,0x1a531a54,0x22712a71,0x2ab12211,0x32423242,0x320229e2,0x3aa33a83,0x29e23222,0x3a833263,0x3a833a63,0x42c342c3,0x32023a83,0x35853da5,0x350534e4,0x46674666,0x2cc43545,0x3e463de5,0x3e263e05,0x4e884e88,0x35053e06,0xa5148430,0x84109492,0xa5149cf3,0xf8009492,0xb596b000,0xad149cf3,0xc638a514,0x8430a514, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x22512ab1,0x11331a53,0x1a111152,0x093719b4,0x1a5411d5,0x2a712233,0x22522251,0x2ab132f1,0x32223222,0x3a633a63,0x32423242,0x3a833a83,0x32223222,0x3a833242,0x2a022a02,0x3a833242,0x35653545,0x3e063e06,0x3da53585,0x3e263e46,0x35653565,0x3e063585,0x35043504,0x3e063da5,0xad557bcf,0x84109492,0x9cf3a514,0xf8009492,0xb596d800,0x9cf3a514,0xce79a514,0x7bcfb596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x19b73310,0x117619b3,0x2ab219d5,0x09372274,0x1a3419f6,0x2a712252,0x1a342a71,0x32f13310,0x3aa33a83,0x3a833a83,0x3aa342c3,0x3a833a83,0x3a833aa3,0x3a633242,0x32633a83,0x32633222,0x46664666,0x3e263e26,0x46664e68,0x3e063e26,0x3e664666,0x3e053dc5,0x3de53e06,0x3de53545,0xad558430,0x9492b596,0x9cf38410,0xd0009492,0xb596b000,0xa514a514,0xad55ce79,0x8430ad55, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x19b719b7,0x19f819f5,0x23151a37,0x1a362274,0x1a341a35,0x2a711a15,0x1a142a71,0x19b72ab1,0x32433242,0x3a833242,0x320229e2,0x3a633243,0x3a833222,0x42c342c3,0x3a833243,0x3ac342c3,0x3dc53585,0x3e663da5,0x350534e4,0x3e063dc5,0x3e063565,0x4e884e88,0x3e263dc5,0x4e674e88,0xa5148430,0x9492a514,0xa5148410,0xd0009492,0xb596d000,0x9cf3a514,0xa514ce79,0x8430b596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x225319b7,0x129819f7,0x19f51a58,0x12380937,0x1a952274,0x1a542a71,0x2ab11a33,0x19b719b7,0x3a833a83,0x32423222,0x3a833a83,0x32423222,0x32423242,0x32023242,0x32433263,0x32223222,0x3e263e26,0x35853525,0x3e064666,0x3da53565,0x3dc53585,0x35053585,0x3dc53de5,0x35453545,0xb5968430,0x9cf3b596,0x84109492,0xf8009492,0xb596a800,0xce799cf3,0xb596b596,0x9492b596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x9b66ac49,0x00006a03,0x00000000,0x00000000,0x00000000,0x00000000,0xac690000,0x6a239367,0x9367ac69,0x00006a23,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xac680000,0x6a039367, +0x9386ac68,0x00006a03,0x00000000,0x00000000,0x00000000,0x00000000,0xac880000,0x6a049367,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x1a1519b7,0x1a771256,0x09371a57,0x12161a54,0x1a731a74,0x1a341237,0x2ab11a34,0x19b71152,0x32423242,0x42c33ac3,0x3a833a83,0x3a833aa3,0x32423222,0x3aa33a83,0x3a833a83,0x3a833aa3,0x35853585,0x4e884e67,0x3e063e26,0x46664666,0x35853565,0x46663e46,0x3e063e06,0x46664666,0xad558430,0xa514ad55,0x84109492,0xf8009492,0xb596d000,0xc638a514,0xa514a514,0x8430ad55, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b67acca,0x000059e2,0x00000000,0x00000000,0x00000000,0x00000000,0xb4aa0000,0x6a239367,0x8b46b4aa,0x000051e3,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xb4aa0000,0x6a049367, +0x8b67b4aa,0x000051e3,0x00000000,0x00000000,0x00000000,0x00000000,0xb4aa0000,0x6a048b67,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x19b71a57,0x19f811f9,0x1ab81a36,0x1a541219,0x2a711a92,0x22711a33,0x2ab11a53,0x19b71a53,0x42c33ac3,0x3a833a83,0x32633263,0x3a633243,0x42c33a83,0x32433a83,0x42c342c3,0x3a633a83,0x4e684e67,0x3e463e46,0x3de53de5,0x3e053dc5,0x4e683e66,0x3dc53e06,0x4e884e88,0x3e053e26,0xb5969492,0xad55ad55,0x9492ad55,0xf8009492,0xb596f800,0xad55ce79,0xb596b596,0x7bcfb596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b06ac68,0x000051e3,0x00000000,0x00000000,0x00000000,0x00000000,0xac890000,0x51e39367,0x8b45ac69,0x000059e3,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xac890000,0x59e39367, +0x8b46ac89,0x000051e3,0x00000000,0x00000000,0x00000000,0x00000000,0xac480000,0x51e39366,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x12371a57,0x1a571236,0x1ab81a97,0x1a541237,0x2a711237,0x23161a33,0x09971a53,0x12161a53,0x2a023222,0x3aa33222,0x29e23222,0x32423222,0x29e23222,0x32423242,0x32423202,0x32423222,0x35043525,0x46663585,0x2cc43565,0x35853565,0x2cc43565,0x3dc53585,0x35853505,0x3da53565,0xa5148410,0xad55ad55,0x9492ad55,0x7bcf8410,0x84107bcf,0xad55c638,0xa514a514,0x84309cf3, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b26b4aa,0x6a246204,0x6a046a04,0x6a046a03,0x51e451c2,0x6a246a03,0x93a859e3,0x5a038b67,0x8b46acaa,0x6a0369e4,0x6a036a03,0x6a246a03,0x51e351e3,0x6a236a23,0x69e451c3,0x6a036a03,0x59e36224,0x6a036a03,0x6a2351c3,0x6a236a24,0x6a036a03,0x6a236a04,0x93a86203,0x51c38b67, +0x8b26b4c9,0x6a046a03,0x62046223,0x6a036a03,0x59e351e3,0x6a036a03,0x9bc859c3,0x59c38b66,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x1a5719f8,0x1a981236,0x12191ab8,0x1a701a16,0x1a331237,0x2a711a74,0x09972a71,0x12161a53,0x32433a83,0x32633222,0x3a833a83,0x29e23202,0x3a633242,0x32223242,0x3a833a83,0x32023222,0x3dc53e06,0x3de53565,0x3e463e46,0x2cc43505,0x3e053585,0x35453585,0x3e463e46,0x35053545,0xb5968430,0xa514b596,0xa514a514,0x94929492,0x94929492,0xb596b596,0xb596b596,0x7bcfb596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x9366a489,0x93678b46,0x93679367,0x8b468b45,0x93469366,0x8b468346,0x93669366,0x52039387,0x9367ac69,0x93878346,0x93678b47,0x8b468b26,0x93679366,0x83268b46,0x93869347,0x8b469367,0x8b458b46,0x93669367,0x93678b87,0x8b469346,0x93468b46,0x93678b26,0x93668b66,0x59c38b66, +0x9347aca9,0x93678326,0x93669367,0x8b268b46,0x936793a7,0x8b468326,0x93669366,0x59e39387,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x12361236,0x1ab81a76,0x12381a98,0x1a911a35,0x2a711237,0x09971a73,0x1a530997,0x12161a54,0x32423263,0x3aa33a83,0x32423242,0x3aa33263,0x32433222,0x3aa33aa3,0x32423263,0x3a8342c3,0x35853de5,0x46663e46,0x3da53dc5,0x46663de5,0x3dc53565,0x46664666,0x35853de5,0x46664e88,0xb5968430,0xad55ad55,0x9cf3ad55,0xb596ad55,0xad55ad55,0xa514a514,0xa514a514,0x8430a514, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x68006800,0x68206820,0x68006800,0x68006800,0x68006800,0x68006800,0x68006800,0x68006800,0x70006800,0x70006800,0x68006800,0x68006800,0x68006800,0x68006800,0x68006800,0x68006800,0x68006800,0x68206800,0x68006800,0x68006800,0xbdd7b5b6,0xce59d6b9,0xb5b6ce59,0xb5b6b5d7, +0xb5d6b596,0xce39ce59,0xb5b6ce59,0xb5b6b5b6,0xbdd7b5d7,0xce59d67a,0xbdd6ce79,0xb5b7b5d7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x12981236,0x2b731ab8,0x1a541ad8,0x1a7319f3,0x1a742a71,0x09971a16,0x1a540937,0x12361236,0x3aa33a83,0x32433242,0x3aa33aa3,0x32423a63,0x3aa33a83,0x3a833a83,0x3ac33aa3,0x3a833a83,0x46663e66,0x3dc53dc5,0x46664667,0x3dc53e05,0x46663e26,0x3e263e26,0x4e674667,0x3e063e26,0x9cf38430,0xa514a514,0xa5149cf3,0xa514a514,0xa514b596,0xad55ad55,0xb596ad55,0x8430ad55, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x88828021,0x99049904,0x99249904,0x990398e4,0x88a288a2,0x806288c2,0x80618082,0x88a288a2,0x88828041,0x99049904,0x99039104,0x98e49904,0x888288a2,0x806188a3,0x80828081,0x88a280a2,0x78828882,0xa1457000,0x88a28081,0x68008883,0xce7ab5b6,0xef5def5d,0xef3def7d,0xb5b6d679, +0xd699b5b6,0xef7eef7e,0xef7df77d,0xf75def7d,0xf77dffdf,0xf7beef9d,0xf77def9d,0xb5b6ce9a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x1a7619f8,0x3bd41ab8,0x121a22d7,0x1a931a15,0x1a961a94,0x09970997,0x1a331a73,0x12361236,0x3a833263,0x42c33ac3,0x3a833a83,0x32423243,0x32023222,0x32423242,0x322229e2,0x32433242,0x3e063de5,0x4e884e67,0x3e263e66,0x3dc53dc5,0x35253565,0x3dc53585,0x35252cc4,0x3dc53585,0xad558430,0xb596b596,0xb596b596,0xb596b596,0xb596a514,0xb596b596,0xad559cf3,0x8410ad55, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x88c28041,0x88a28882,0x88a288a2,0x808188a2,0x80628082,0x80828042,0x88c28862,0x806288a2,0x88a28041,0x88a288c2,0x88a28882,0x808288a2,0x78a27882,0x78828082,0x88a290a3,0x808188a2,0x88a288a2,0xb1a67820,0x88a2a125,0x68008062,0xef7dbdb6,0xef7eef9d,0xef7def9d,0xb5b7ce99, +0xce79b5d7,0xef7def5d,0xffdfffdf,0xf7deffdf,0xffbfffbe,0xf77def7d,0xef5def9e,0xb5b6ce7a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x1a531ad6,0x12981a53,0x12981af8,0x22712271,0x1ab61ab4,0x2a711a54,0x22922a71,0x12362a50,0x32423222,0x32223222,0x3a833263,0x32423222,0x3a833a83,0x32223202,0x3a633a63,0x32023222,0x35853565,0x35653545,0x3e463de5,0x35853565,0x3e263e06,0x35453505,0x3e053e05,0x35253545,0x84108430,0x84108410,0x84308410,0x94929492,0x94927bcf,0x84108430,0x84108410,0x84308410, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x80418061,0x80408021,0x80418021,0x80828041,0x78828062,0x80618081,0x80418061,0x80627882,0x80218041,0x80217841,0x80408041,0x80828041,0x78828082,0x80828062,0x78417841,0x806280a2,0x80208061,0x80407820,0x80619965,0x68008041,0xce7ab5b6,0xce59ce99,0xbdd6b5d7,0xb596b5b7, +0xce99bd96,0xce59ce79,0xbdd6b5d7,0xbd96b596,0xce9ab5b6,0xce79ce7a,0xbdb7bdb6,0xb5d6b5b6,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0x91448924,0xa165b185,0x99449144,0xb185b185,0x9944a165,0xb185a965,0x91449144,0xb185b185,0xd391cb0f,0xdc33e4d5,0xd3b2d371,0xe516e4d5,0xd3b2dc13,0xe4d5dc54,0xd391d371,0xe4d5dcd5,0x84108410,0x84108410,0x94927bcf,0x84108c51,0x84108410,0x84108430,0x84108410,0x84308430, +0x4a690000,0x31860000,0x4a699cd3,0x00009cd3,0x9cd34a69,0x8c510000,0x00003186,0x00008c51,0x4a693186,0x31863186,0x4a699cd3,0x31869cd3,0x9cd34a69,0x8c513186,0x31863186,0x31868c51,0x80408061,0x80418041,0x80417840,0x80418041,0x80418041,0x80218040,0x80418020,0x80418041,0x80418021,0x80217840,0x78208041,0x68007021,0xb5b6b5b7,0xa574b5b5,0xb5b6ad75,0xbdb7b5b6, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x52050000,0x6b4da534,0x49e441a4,0x5a246a85,0x62656265,0x41a46265,0xa5346b4d,0x00005205,0xb185b185,0x9965a165,0xa165b185,0xa965a965,0xb185b9a5,0x99449944,0xa965a165,0x91449944,0xe4f6e4f6,0xd3f2dc33,0xdc33e4d5,0xdc94dc54,0xdcd5e557,0xd3b2d3b1,0xdc74dc33,0xd371d3b2,0xad558430,0xa514ad55,0xb596a514,0xc638b596,0xc638c638,0xb596ce79,0xa514ad55,0x8430a514, +0x9cd34208,0x9cd30000,0x9cd34a69,0x42080000,0x00004a69,0x00008c51,0x9cd33186,0x9cd30000,0x9cd33186,0x9cd33186,0x9cd34a69,0x31863186,0x31864a69,0x31868c51,0x9cd33186,0x9cd33186,0x80418041,0x80417821,0x80608041,0x80828081,0x80827862,0x782180a1,0x78407820,0x80417841,0x80218021,0x98a27820,0x78218882,0x70007021,0xd679d699,0xb5b6c5f8,0xce59b5b7,0xb5d6d69a, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x38e10000,0x38e138e1,0x38e138e1,0x000038e1,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83280000,0x6b4da534,0x83685a66,0x8b87ac4a,0xac4aac4a,0x6aa78b87,0xa5346b4d,0x00008328,0xa965a965,0xb9a5b185,0xa965b185,0x9944a165,0xa1658124,0xb185a965,0xa165a165,0xb985b185,0xdc54dc74,0xe557e516,0xdc74e4d5,0xd3d2dc33,0xdc13cacf,0xe4d5dc74,0xdc13dc13,0xe536e4d5,0xb5968430,0xb596a514,0xa5149cf3,0x400094b2,0xb5962000,0xce79ad14,0xad55ce79,0x9492b596, +0x00003186,0x00009cd3,0x00009cd3,0x4a699cd3,0x00000000,0x4a699cd3,0x42080000,0x00009cd3,0x31863186,0x31869cd3,0x31869cd3,0x4a699cd3,0x31863186,0x4a699cd3,0x31863186,0x31869cd3,0x88408021,0x888288a2,0x88a288a2,0x80627882,0x80818082,0x80627862,0x78828082,0x80828081,0x80828082,0xa9857820,0x808298e3,0x68007020,0xdefbce99,0xce79deba,0xdebbc699,0xb5b6ce39, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x38e10000,0x924338e1,0x92439243,0x92439243,0x38e19243,0x38e138e1,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0x99449944,0x89248124,0xb185b185,0x81249144,0xa985a165,0xa965a165,0xb9a5b9a5,0x8924a965,0xd3b2d3b2,0xcaefcacf,0xe4f6e4d5,0xcaaed330,0xdc94dc13,0xdc74dc33,0xe557e557,0xcb0fdc54,0xa5148430,0x84109492,0xa5149cf3,0x48009492,0xb5962800,0xad149cf3,0xc638a514,0x8430a514, +0x8c514208,0x9cd38c51,0x9cd38c51,0x9cd33186,0x9cd33186,0x9cd30000,0x4a690000,0x00003186,0x8c513186,0x9cd38c51,0x9cd38c51,0x9cd33186,0x9cd33186,0x9cd33186,0x4a693186,0x31863186,0x90617841,0x88a290e3,0x808288a2,0x78817862,0x80627881,0x78a27862,0x80628062,0x80618081,0x80817882,0xa9857020,0x8082a145,0x68007021,0xdebbc638,0xdefbdedb,0xce79d6ba,0xad55b596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x38e10000,0x924338e1,0xbae49243,0xaac4bae4,0xaac4aac4,0x9243aac4,0x92439243,0x000038e1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0x91449144,0xa165a165,0x99449944,0xa965a985,0x91449144,0xa9659944,0x89248924,0xa9659944,0xd391d350,0xdc53dc53,0xd3b2d3b2,0xdc74dc94,0xd391d371,0xdc54d3b2,0xcaefcaef,0xdc54d3d2,0xad557bcf,0x84109492,0x9cf3a514,0x48009492,0xb5962800,0x9cf3a514,0xce79a514,0x7bcfb596, +0x00000000,0x00009cd3,0x4a698c51,0x9cd30000,0x00004a69,0x8c519cd3,0x4a690000,0x42080000,0x31863186,0x31869cd3,0x4a698c51,0x9cd33186,0x31863186,0x8c519cd3,0x4a693186,0x31863186,0x90818040,0x88a298c3,0x80828081,0x80618082,0x80617862,0x88828082,0x80828062,0x78627881,0x80817861,0xa9a67020,0x88a290e3,0x68007040,0xdedbc618,0xef5cdebb,0xd678defb,0xad55b596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x924338e1,0xbae4bae4,0xa284aac4,0xa284c618,0xa284a284,0xaac4bdf7,0xa284a284,0x38e19243,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x52050000,0x6b4da534,0x49e441a4,0x62655a24,0x62656265,0x41c46265,0xa5346b4d,0x00005205,0xb185b185,0xa965a965,0xb185b9a5,0xa965a965,0xb185b185,0xa1659944,0xa165a965,0xa1659144,0xe4f5e4d5,0xdc74dc74,0xe4d5e557,0xdc54dc74,0xdcd5e4f5,0xdc33d3d2,0xdc13dc54,0xdc33d350,0xad558430,0x9492b596,0x9cf38410,0x58009492,0xb5962800,0xa514a514,0xad55ce79,0x8430ad55, +0x00008c51,0x42080000,0x4a699cd3,0x00000000,0x9cd30000,0x9cd34a69,0x9cd30000,0x4a693186,0x31868c51,0x31863186,0x4a699cd3,0x31863186,0x9cd33186,0x9cd34a69,0x9cd33186,0x4a693186,0x88828041,0x90e39904,0x80a28082,0x88828082,0x88a38082,0x88a388a2,0x88a288a2,0x88a290a2,0x888288a2,0xb1e78061,0x88a39103,0x68007820,0xe6fcc618,0xef5def5d,0xdf1cef5d,0xad75c618, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x924338e1,0xa284a284,0xce79ef5d,0xce79ce79,0xbdf7ce79,0xbdf7bdf7,0xa284a284,0x38e19243,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83280000,0x6b4da534,0x83686ac7,0x8b878b87,0x8b878b87,0x6aa7a409,0xa5346b4d,0x00008328,0x99659944,0xb1859944,0x89248124,0xa1659965,0xa9659144,0xb9a5b9a5,0xa965a165,0xb985b9a5,0xd3f2d3b2,0xdcd5d3d2,0xcaefcacf,0xdc53d3f2,0xdc54d391,0xe557e557,0xdc74dc13,0xe536e557,0xa5148430,0x9492a514,0xa5148410,0x58009492,0xb5962800,0x9cf3a514,0xa514ce79,0x8430b596, +0x42089cd3,0x4a698c51,0x9cd30000,0x9cd30000,0x00004208,0x00009cd3,0x00004a69,0x4a699cd3,0x31869cd3,0x4a698c51,0x9cd33186,0x9cd33186,0x31863186,0x31869cd3,0x31864a69,0x4a699cd3,0x90828021,0x90c39903,0x88a288a2,0x80a388a2,0x88a288a2,0x88a288a2,0x88a18882,0x88a290c2,0x80a288a2,0xb1e78861,0x88a298c3,0x68007020,0xf77ed69a,0xef5eef7e,0xef5def5d,0xb596d679, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x924338e1,0xef5dce79,0xef5def5d,0xce79ce79,0xbdf7ce79,0xbdf7bdf7,0xa284bdf7,0x38e19243,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0xa965a965,0x99448924,0xa965b185,0x99449144,0x99449944,0x89249944,0x9965a165,0x91449144,0xdc74dc74,0xd3b2d310,0xdc54e4d5,0xd3b2d391,0xd3d2d3b2,0xcb0fd3b1,0xd3f2dc13,0xd330d350,0xb5968430,0x9cf3b596,0x84109492,0x50009492,0xb5962800,0xce799cf3,0xb596b596,0x9492b596, +0x9cd30000,0x9cd34a69,0x00003186,0x4a699cd3,0x00004a69,0x9cd30000,0x9cd34a69,0x9cd30000,0x9cd33186,0x9cd34a69,0x31863186,0x4a699cd3,0x31864a69,0x9cd33186,0x9cd34a69,0x9cd33186,0x90628041,0x88a39903,0x888288a3,0x90a288a2,0x88a288a2,0x88a288a2,0x88a288a2,0x888288c2,0x88a288a2,0xb1c78861,0x808290e3,0x68007021,0xf7bed6ba,0xef7ef79d,0xef5def5d,0xb576ce7a, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce7938e1,0xef5def5d,0xc618ef5d,0xc618c618,0xc618c618,0xbdf7c618,0xbdf7bdf7,0x38e1bdf7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0x99449944,0xb9a5b985,0xa965a965,0xb185b185,0x99449144,0xb185a965,0xa965a965,0xb185b185,0xd3b2d3b2,0xe557e536,0xdc54dc74,0xe4d5e4d5,0xd3b1d371,0xe4d5dc94,0xdc54dc54,0xe4d5e4f5,0xad558430,0xa514ad55,0x84109492,0x50009492,0xb5964020,0xc638a514,0xa514a514,0x8430ad55, +0x31860000,0x00009cd3,0x9cd33186,0x9cd30000,0x00009cd3,0x00009cd3,0x00008c51,0x00009cd3,0x31863186,0x31869cd3,0x9cd33186,0x9cd33186,0x31869cd3,0x31869cd3,0x31868c51,0x31869cd3,0x90628041,0x88a29904,0x88a280a1,0x80a28082,0x88a28883,0x88a288a2,0x88a288a3,0x88a288a2,0x888388a2,0xba498861,0x80a290e3,0x68007000,0xef9dd6db,0xef7ef79e,0xef7def5d,0xb5b6ce99, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce794a49,0xc618ef5d,0xef5dc618,0xef5def5d,0xef5de8e3,0xc618ef5d,0xbdf7c618,0x4a49bdf7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x52050000,0x6b4da534,0x49e441a4,0x62655a24,0x62656265,0x41a45a24,0xa5346b4d,0x00005205,0xb9a5b985,0xa965a985,0xa165a165,0xa165a165,0xb9a5b185,0x9965a965,0xb9a5b9a5,0xa165a965,0xe557e536,0xdc94dcd5,0xdc13dc13,0xdc33dc13,0xe557dcd5,0xd3f2dc54,0xe557e557,0xdc33dc74,0xb5969492,0xad55ad55,0x9492ad55,0x50209492,0xb5965000,0xad55ce79,0xb596b596,0x7bcfb596, +0x9cd34208,0x8c518c51,0x00004a69,0x00009cd3,0x9cd34208,0x00004a69,0x4a698c51,0x9cd30000,0x9cd33186,0x8c518c51,0x31864a69,0x31869cd3,0x9cd33186,0x31864a69,0x4a698c51,0x9cd33186,0x90828061,0x9965b1c6,0x90c290c3,0x88a290a3,0x88818882,0x808288a2,0x88c28882,0x888288a2,0x90a288a2,0xcb0c9082,0x80819924,0x68007000,0xf77ed6ba,0xef7ef79e,0xe75eef5d,0xb5b7d67a, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xc6184a49,0xef5dc618,0xef5de8e3,0xef5def5d,0xef5def5d,0xef5def5d,0xc618ef5d,0x4a49c618,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83280000,0x6b4da534,0x83686ac7,0x8b87ac4a,0x8b878b87,0x6ac76265,0xa5346b4d,0x00008328,0x89248924,0xb1859144,0x81249144,0x99449144,0x81249144,0x99449944,0x99448924,0x99449144,0xcaefd310,0xe4d5d391,0xcaaed391,0xd3b2d391,0xcaaed391,0xd3d2d3b2,0xd3b1cb0f,0xd3d2d371,0xa5148410,0xad55ad55,0x9492ad55,0x7bcf8410,0x84107bcf,0xad55c638,0xa514a514,0x84309cf3, +0x00004a69,0x4a698c51,0x00004a69,0x4a690000,0x31869cd3,0x4a699cd3,0x4a699cd3,0x00009cd3,0x31864a69,0x4a698c51,0x31864a69,0x4a693186,0x31869cd3,0x4a699cd3,0x4a699cd3,0x31869cd3,0x98e38041,0xb1a7b1e7,0x990498e4,0x90a398e3,0x88a388c3,0x80818862,0x808280c2,0x88a288a3,0x888288a1,0xc2ca9082,0x80a2a125,0x68007841,0xf7bed6bb,0xf79effbe,0xef5def5d,0xb596d69a, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xc6184a49,0xef5def5d,0xef5def5d,0xef5def5d,0xef5de8e3,0xef5def5d,0xef5de8e3,0x4a49c618,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0xa165a965,0xa1659144,0xa965a985,0x81248924,0xa1659944,0x91449944,0xa985a985,0x89249144,0xdc13dc54,0xdc33d391,0xdc94dc94,0xcaaecaef,0xdc33d3b2,0xd330d3b1,0xdc94dc94,0xcaefd350,0xb5968430,0xa514b596,0xa514a514,0x94929492,0x94929492,0xb596b596,0xb596b596,0x7bcfb596, +0x00004a69,0x8c510000,0x00009cd3,0x4a699cd3,0x9cd38c51,0x00000000,0x9cd30000,0x00004208,0x31864a69,0x8c513186,0x31869cd3,0x4a699cd3,0x9cd38c51,0x31863186,0x9cd33186,0x31863186,0x98838040,0xa965a966,0xa1459904,0xa145a965,0xa145a965,0x99049925,0x99049904,0x99259924,0x90e39945,0xbaaa9082,0x9103b208,0x70007841,0xffffd6ba,0xffbfffff,0xf75def3d,0xa514ce39, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xc6184a49,0xe8e3c618,0xef5def5d,0xef5def5d,0xef5def5d,0xef5de8e3,0xc618ef5d,0x4a49c618,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0x9944a165,0xb185a965,0x99449944,0xb185a165,0x99659144,0xb185b185,0x9944a165,0xb185b9a5,0xd3b2dc33,0xe4d5dc94,0xd3b2d3d2,0xe4d5dc13,0xd3f2d391,0xe4d5e4d5,0xd3b2dc33,0xe4d5e557,0xb5968430,0xad55ad55,0x9cf3ad55,0xb596ad55,0xad55ad55,0xa514a514,0xa514a514,0x8430a514, +0x00009cd3,0x00009cd3,0x9cd30000,0x000052aa,0x00008c51,0x31864a69,0x4a699cd3,0x00009cd3,0x31869cd3,0x31869cd3,0x9cd33186,0x318652aa,0x31868c51,0x31864a69,0x4a699cd3,0x31869cd3,0x90628041,0xa9a6a985,0xa9a6a9a6,0xb1a6a9a6,0xa986a986,0xa145a965,0xb186a966,0xb186b1a6,0xa985a986,0xc2aa90a3,0x9925b208,0x70008041,0xffdfce59,0xffdfffff,0xe73cf79e,0x9cf4bdd7, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x4a490000,0xc6184a49,0xef5dc618,0xef5de8e3,0xef5def5d,0xc618ef5d,0x4a49c618,0x00004a49,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x52050000,0x6b4da534,0x520541c4,0x62656265,0x62656265,0x41a449e4,0xa5346b4d,0x00005205,0xb185b185,0xa1659944,0xb185b185,0x9944a165,0xb185a965,0xa965a965,0xb985b185,0xa965a965,0xe4d5dcd5,0xdc13d3d2,0xe4d5e4f6,0xd3d2dc33,0xe4d5dc74,0xdc74dc74,0xe536e516,0xdc54dc74,0x9cf38430,0xa514a514,0xa5149cf3,0xa514a514,0xa514b596,0xad55ad55,0xb596ad55,0x8430ad55, +0x9cd30000,0x42080000,0x00009cd3,0x00009cd3,0x00009cd3,0x42089cd3,0x9cd30000,0x9cd34a69,0x9cd33186,0x31863186,0x31869cd3,0x31869cd3,0x31869cd3,0x31869cd3,0x9cd33186,0x9cd34a69,0x88618041,0xb1a6a945,0xa986a986,0xb186b1c6,0xa145a986,0xa965a145,0xb1c7b1c7,0xb1e7b1c7,0xa9a6b1e7,0xba6a90c2,0xa124b208,0x68007821,0xf79ec658,0xffffffff,0xd67af79f,0xa4f3b595, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x4a490000,0xc6184a49,0xc618c618,0xc618c618,0x4a49c618,0x00004a49,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83280000,0x6b4da534,0x72e65a66,0xa409a409,0xac4aac4a,0x6aa78368,0xa5346b4d,0x00008328,0xa965a165,0xb9a5b985,0xa965b185,0x99449965,0x89249144,0x99449944,0x89248124,0xa1659944,0xdc54dc33,0xe557e536,0xdc74dcd5,0xd3d2d3f2,0xcb0fd371,0xd3d2d3b1,0xd310ca8e,0xdc13d3b2,0xad558430,0xb596b596,0xb596b596,0xb596b596,0xb596a514,0xb596b596,0xad559cf3,0x8410ad55, +0x8c519cd3,0x4a698c51,0x9cd33186,0x31860000,0x9cd30000,0x4a698c51,0x00000000,0x8c510000,0x8c519cd3,0x4a698c51,0x9cd33186,0x31863186,0x9cd33186,0x4a698c51,0x31863186,0x8c513186,0x80418041,0x90a28882,0x90a290a2,0x98a390a2,0x88629882,0x98a38841,0xa0e3a0c3,0xa0e4a0a3,0x98c2a104,0x99248821,0x88619944,0x70208021,0xd69ac639,0xf7bee75d,0xbd96d6ba,0x9d34b555, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x4a490000,0x4a494a49,0x4a494a49,0x00004a49,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0x99449144,0x91449144,0xa985a165,0x99449144,0xa965a965,0x91448924,0xa165a165,0x89249144,0xd3b2d391,0xd371d350,0xdc94dc13,0xd3b1d391,0xdc74dc54,0xd350caef,0xdc33dc33,0xcb0fd350,0x84108430,0x84108410,0x84308410,0x94929492,0x94927bcf,0x84108430,0x84108410,0x84308410, +0x9cd30000,0x4a690000,0x9cd30000,0x00004a69,0x00009cd3,0x4a699cd3,0x9cd30000,0x9cd30000,0x9cd33186,0x4a693186,0x9cd33186,0x31864a69,0x31869cd3,0x4a699cd3,0x9cd33186,0x9cd33186,0x80418041,0x88618061,0x80418021,0x90618861,0x80418881,0x80418021,0x88618041,0x80618862,0x78408041,0x90e48040,0x88a290e3,0x70008041,0xad75b595,0xce38be17,0x9d13b596,0xb5959cf3, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x41a449e4,0xa5346b4d,0x00008328,0x10821082,0x18c320e3,0x18a21082,0x20e320e3,0x18a218a2,0x20e318c3,0x10821082,0x20e320e3,0x39e739c7,0x42084a49,0x39e739e7,0x4a494a49,0x39e74208,0x4a494228,0x39e739e7,0x4a494228,0x00000000,0x00000000,0x00000000,0x62860000,0x00003142,0x00000000,0x00000000,0x00000000, +0x28e128c1,0x10403922,0x28e128c0,0x104028e1,0x310128e1,0x082028e1,0x28e128e1,0x392228c1,0xef5cef3c,0x39e7ef5c,0xdefadefa,0xef5ce6fb,0xef7def5c,0xe6fad69a,0xffffdeba,0xf77cffff,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0xa2c1d3e2,0xd3e2a2c1,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0xa2c1d3e2,0xd3e2a2c1,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1, +0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0xa2c1d3e2,0xd3e2a2c1,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x62650000,0x62656265,0x6aa78b87,0xa5346b4d,0x83285205,0x20e320e3,0x18a218a2,0x18c320e3,0x18c318c3,0x20e32104,0x10821082,0x18c318c3,0x108218a2,0x4a494a49,0x42084208,0x42084a49,0x42284228,0x42284a69,0x39e739e7,0x42284208,0x39e739e7,0x00000000,0x00000000,0x00000000,0x9bc90000,0x00003963,0x00000000,0x00000000,0x00000000, +0x28e11020,0x104049a3,0x39223101,0x10401880,0x28e14982,0x102051a3,0x392228c1,0x28e11040,0x39e718c3,0xef5c31e7,0xffffef5c,0xffffffff,0xdefaef3c,0x39e739c7,0xdefbbd96,0x18a31903,0xd3e2a2c1,0xd3e2e483,0xe483a2c1,0xa2c1e483,0xe529a2c1,0xa2c1e483,0xe483a2c1,0xa2c1e483,0xd3e2a2c1,0xd3e2e483,0xe483a2c1,0xa2c1e483,0xe529a2c1,0xa2c1e483,0xe483a2c1,0xa2c1e483, +0xd3e2a2c1,0xd3e2e483,0xe483a2c1,0xa2c1e483,0xe529a2c1,0xa2c1e483,0xe483a2c1,0xa2c1e483,0xd6ba0000,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0x0000d6ba,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2840000,0xa284a284,0xa284a284,0xa284a284,0xa284a284,0xa284a284,0xa284a284,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x5a2441a4,0x83286265,0x8b878b87,0x00000000,0x6b4d41a4,0xa534a534,0x18c318c3,0x210420e3,0x18c320e3,0x18a218c3,0x18a21061,0x20e318c3,0x18a218a2,0x210420e3,0x42284228,0x4a694a49,0x42284a49,0x42084208,0x420831a6,0x4a494228,0x42084208,0x4a494a49,0x00000000,0x00000000,0x00000000,0x62860000,0x00003983,0x00000000,0x00000000,0x00000000, +0x31011040,0x310128c1,0x392228e1,0x31011880,0x28c13101,0x104028e1,0x498230e1,0x102051c3,0xdeda39e7,0xef9bd6fa,0xef5bef5c,0xb595e77d,0xef7cdeda,0xef3cef3c,0x39c841c7,0x18c218e3,0xa2c1a2c1,0xd3e2e483,0xe483a2c1,0xa2c1e483,0xe483d3e2,0xd3e2e483,0xe529a2c1,0xa2c1e483,0xa2c1a2c1,0x2800a2c1,0xe483a2c1,0xa2c14080,0xe483a2c1,0x4080e483,0xe529a2c1,0xa2c1a2c1, +0xa2c1a2c1,0x4800a2c1,0xe483e4c2,0xe4c2cea8,0xe483a2c1,0xc667f6e6,0xe529a2c1,0xa2c1a2c1,0xdefb0000,0xe8e3ef5d,0xef5def5d,0xef5def5d,0xef5def5d,0xef5def5d,0xef5def5d,0x0000defb,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2840000,0xbae4bae4,0xbae4bae4,0xa284bae4,0xbae4bae4,0xbae4a284,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83280000,0x6b4da534,0x83685a66,0x00008b87,0x00000000,0x62650000,0x6aa76265,0x6b4d6b4d,0x18a218a2,0x10611061,0x20e320e3,0x10611082,0x18c318a2,0x18c318c3,0x21042104,0x106118c3,0x39e739e7,0x39c731a6,0x4a494a49,0x31a639c7,0x42284208,0x42284208,0x4a694a69,0x39c74228,0x00000000,0x00000000,0x00000000,0x93a90000,0x00003963,0x00000000,0x00000000,0x00000000, +0x51a31020,0x28e11020,0x51a33101,0x30e10820,0x28c11040,0x104049a3,0x28c030e1,0x51a31040,0xffffe75d,0xef5dffff,0xdedad6da,0xef5cd71a,0xe75bef5c,0xef3cef5d,0xef5cef3c,0x420739e7,0xa2c1a2c1,0xe483e483,0xe529a2c1,0xa2c1e483,0xe483d3e2,0xe483e483,0xe529a2c1,0xa2c1e483,0xa2c1a2c1,0x2800a2c1,0xa2c14080,0x40804080,0x4080a2c1,0x40804080,0x4080a2c1,0xa2c14080, +0xa2c1a2c1,0x4800e4c2,0xe4c2c647,0xd728cee8,0xd728e4c2,0xcea8cee8,0xbde7a2c1,0xeda2bd86,0xdefb0000,0xef5def5d,0xef5def5d,0xef5def5d,0xe8e3e8e3,0xdefbdefb,0xef5ddefb,0x0000defb,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2840000,0xa284bae4,0xa284bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83280000,0xa5345205,0x00006b4d,0x00000000,0x00000000,0x83286265,0x00008b87,0x6aa741a4,0x10821082,0x18c318c3,0x18a218a2,0x18c318c3,0x10821082,0x18c31082,0x10611061,0x18c318a2,0x39e739c7,0x42284228,0x39e739e7,0x42284228,0x39e739e7,0x422839e7,0x31a631a6,0x422839e7,0x00000000,0x00000000,0x00000000,0x9bea0000,0x00004184,0x00000000,0x00000000,0x00000000, +0x39221040,0x28e11040,0x51a33102,0x51a31040,0x28c10820,0x104051c3,0x49a33101,0x51c31040,0xef5cef5c,0xe77ce73c,0xbdb6ef5c,0xb5d6b5d6,0xef5cef5c,0xdefad71a,0xb596b5d6,0xdefbdeda,0xa2c1a2c1,0xe483e483,0xe529a2c1,0xa2c1e483,0xe483d3e2,0xe483d3e2,0xe529a2c1,0xa2c1e483,0xa2c1a2c1,0x40802800,0x40804080,0x40804080,0x40804080,0x40804080,0x40804080,0xa2c14080, +0xa2c1a2c1,0xc6074800,0xcec8c667,0xdf68d728,0xdf68df89,0xcec8d728,0xc607c667,0xeda2bda6,0xdefb0000,0xdefbef5d,0xef5ddefb,0xef5def5d,0xe8e3e9a6,0xef5ddefb,0xef5ddefb,0x0000defb,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2840000,0xbae4bae4,0xbae4bae4,0xbae4a284,0xbae4a284,0xbae4bae4,0xbae4a284,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0xa5340000,0x00006b4d,0x00000000,0x62650000,0x8b878328,0x00000000,0x83685a24,0x20e320e3,0x18c318c3,0x20e32104,0x18c318c3,0x20e320e3,0x18c318a2,0x18a218c3,0x18a21082,0x4a494a49,0x42284228,0x4a494a69,0x42284228,0x42284a49,0x42084208,0x42084228,0x420839c7,0x00000000,0x00000000,0x00000000,0x93a80000,0x000041a4,0x00000000,0x00000000,0x00000000, +0x39221060,0x30e11040,0x49a328e1,0x28c01020,0x28c11040,0x104051c3,0x51c330e1,0x49a31040,0xef9cb5d6,0xdedadeb9,0xb5b6deda,0xef7cef7c,0xef5bef7c,0xffffffff,0xe71cef5c,0xef5dffff,0xd3e2a2c1,0xe483e483,0xd3e2a2c1,0xa2c1e483,0xe483a2c1,0xe483e483,0xe483a2c1,0xa2c1d3e2,0xd3e2a2c1,0x28002800,0x28002800,0x28004080,0x40802800,0x28002800,0x28004080,0xa2c1a2c1, +0xf7c5a2c1,0x48004800,0x48004800,0x4800d728,0xdf894800,0x48004800,0x4800ce67,0xa2c1eda2,0xdefb0000,0xdefbef5d,0xef5def5d,0xdefbd6ba,0xef5def5d,0xef5def5d,0xef5ddefb,0x0000defb,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2840000,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4a284,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x6b4da534,0x00000000,0x83286265,0x00008328,0x62650000,0x00008328,0x18a21082,0x20e318a2,0x10611061,0x18c318a2,0x18c31082,0x21042104,0x18c318a2,0x21042104,0x420839e7,0x422839e7,0x39c731a6,0x42284208,0x422839e7,0x4a694a69,0x42284208,0x4a494a69,0x00000000,0x00000000,0x00000000,0x93880000,0x00003963,0x00000000,0x00000000,0x00000000, +0x51c328e1,0x28e11860,0x49823101,0x30e11040,0x102030e1,0x104049a3,0x49a33101,0x39221040,0xe73cef7b,0xe75cef5c,0xdedadeda,0xdedab5d6,0xded9b5d6,0xef5cd6da,0xef7bef9d,0xef3cf75d,0xd3e2a2c1,0xe483e483,0xd3e2a2c1,0xd3e2e483,0xe483a2c1,0xe483e483,0xe483a2c1,0xa2c1d3e2,0xd3e2a2c1,0x2800a2c1,0x2800a2c1,0xa2c1a2c1,0xa2c12800,0x2800a2c1,0x2800a2c1,0xa2c1d3e2, +0xf684a2c1,0x4800eda2,0x4800eda2,0xeda2eda2,0xeda24800,0x4800eda2,0x4800eda2,0xa2c1f7c5,0xdefb0000,0xdefbef5d,0xef5de8e3,0xef5def5d,0xdefbef5d,0xe8e3ef5d,0xef5de8e3,0x0000defb,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2840000,0xbae4a284,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xa284bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x6b4da534,0x62650000,0x8b878368,0x00000000,0x62650000,0x00008328,0x18c318c3,0x10821082,0x18c320e3,0x18a21082,0x18a21082,0x10611082,0x18a218a2,0x10821082,0x42284228,0x39e739c7,0x42284a49,0x39e739e7,0x420839e7,0x39c739e7,0x42084208,0x39c739c7,0x00000000,0x00000000,0x00000000,0x7b070000,0x000049e4,0x00000000,0x00000000,0x00000000, +0x51a328e1,0x31021040,0x10404982,0x104028e1,0x104028e1,0x10404982,0x31013101,0x39221040,0xdefade9a,0xffffde9a,0xef7cffff,0xfffff75c,0xef7ceefb,0xef1cf77c,0xef9ce75c,0xdefad6da,0xe483a2c1,0xe483e483,0xd3e2a2c1,0xd3e2e483,0xe483a2c1,0xd3e2e483,0xe483a2c1,0xa2c1d3e2,0xe483a2c1,0xe483e483,0xa2c1a2c1,0xd3e2a2c1,0xa2c1a2c1,0xa2c1a2c1,0xa2c1a2c1,0xa2c1d3e2, +0xe483a2c1,0xffe7f6e6,0xeda2e4c2,0xd3e2e4c2,0xe4c2eda2,0xeda2e4c2,0xeda2e4c2,0xa2c1f684,0xdefb0000,0xdefbef5d,0xdefbef5d,0xe8e3ef5d,0xdefbe8e3,0xe9a6defb,0xef5de8e3,0x0000defb,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2840000,0xbae4bae4,0xbae4a284,0xbae4a284,0xbae4bae4,0xa284bae4,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0xa5340000,0x5a666b4d,0x00008b87,0x00000000,0x62650000,0x00008b87,0x18a218a2,0x21042104,0x18c318c3,0x20e320e3,0x10821082,0x20e318c3,0x18c318c3,0x20e320e3,0x39e739e7,0x4a694a49,0x42284228,0x4a494a49,0x39e739e7,0x4a494228,0x42284228,0x4a494a49,0x00000000,0x00000000,0x00000000,0x48000000,0x00002800,0x00000000,0x00000000,0x00000000, +0x51a33101,0x31011040,0x104051c3,0x104051a3,0x102051a3,0x18803922,0x392228e1,0x31011040,0xbd96e75c,0xef5bffff,0xdefaef3c,0xe75cdeda,0xbdd6ffff,0xef7ce75c,0xdedaffff,0xd6bbdefa,0xe483a2c1,0xe483e483,0xe483a2c1,0xe483e483,0xe483a2c1,0xa2c1e483,0xe483d3e2,0xa2c1a2c1,0xe483a2c1,0xa2c1e483,0x40804080,0xa2c1a2c1,0xa2c1a2c1,0x40804080,0x40804080,0xa2c1a2c1, +0xe483a2c1,0xa2c1e483,0xc667c607,0xe4c2a2c1,0xa2c1e4c2,0xc667cea8,0xbdc6c607,0xa2c1a2c1,0xdefb0000,0xef5de8e3,0xdefbef5d,0xe9a6ef5d,0xd6bae8e3,0xef5ddefb,0xef5def5d,0x0000defb,0x92430000,0x92439243,0x92439243,0x92439243,0x92439243,0x92439243,0x92439243,0x00009243,0x92430000,0x60a060a0,0x60a060a0,0x60a060a0,0x60a060a0,0x60a060a0,0x60a060a0,0x00009243, +0xa2840000,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4a284,0xbae4bae4,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x52050000,0x6b4da534,0x00000000,0x00000000,0x83286265,0x00000000,0x21042104,0x18c320e3,0x18a218a2,0x18c318a2,0x210420e3,0x18a218c3,0x21042104,0x18c318c3,0x4a694a49,0x42284228,0x42084208,0x42084208,0x4a694228,0x42084228,0x4a694a69,0x42084228,0x00000000,0x00000000,0x00000000,0x50000000,0x00004800,0x00000000,0x00000000,0x00000000, +0x392228e1,0x31011880,0x28c049a3,0x104028e1,0x10404982,0x20a03922,0x39220820,0x31011040,0xe6d939e7,0xe73cdeb9,0xbdd6ef5c,0xdebaef3b,0xdedad6fa,0xef3cef5c,0xef3cb596,0xef5cef3c,0xe529a2c1,0xe483e483,0xe529a2c1,0xe483e483,0xe483a2c1,0xa2c1d3e2,0xe483d3e2,0xa2c1a2c1,0xe529a2c1,0x2800a2c1,0x40804080,0xa2c14080,0x2800a2c1,0x40804080,0x40804080,0xa2c1a2c1, +0xe529a2c1,0x4800a2c1,0xc607bdc7,0xa2c1c647,0x4800eda2,0xc607c647,0xbd86bdc7,0xa2c1eda2,0xdefb0000,0xef5def5d,0xd6baef5d,0xef5def5d,0xef5def5d,0xef5de8e3,0xef5ddefb,0x0000defb,0x92430000,0xbae4bae4,0xbae4bae4,0xa284bae4,0xbae4bae4,0xbae4bae4,0xbae4a284,0x00009243,0x92430000,0x81208120,0x81208120,0x71008120,0x81208120,0x81208120,0x81207100,0x00009243, +0xa2840000,0xbae4bae4,0xa284bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xa284bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x83280000,0xa5345205,0x6b4d6b4d,0x00000000,0x8b8749e4,0x00000000,0x10611082,0x20e31082,0x10611082,0x18a21082,0x10611082,0x18a218a2,0x10821061,0x18a21082,0x31a639c7,0x4a4939e7,0x31a639e7,0x39e739e7,0x31a639e7,0x420839e7,0x39e739c7,0x39e739e7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x28c13101,0x28e13101,0x28e151a3,0x30e128e1,0x10403101,0x498228e1,0x39221040,0x28e11040,0x420739c7,0xffffef7c,0xf75cffff,0xffffef5c,0xef5cffff,0xffffffff,0x39c7ef5c,0x18e218c3,0xe529a2c1,0xd3e2e483,0xe529a2c1,0xe483e483,0xe483a2c1,0xa2c1d3e2,0xe483e529,0xa2c1d3e2,0xe529a2c1,0x2800a2c1,0x40804080,0xa2c14080,0x2800a2c1,0x40804080,0xa2c14080,0xa2c1d3e2, +0xe529a2c1,0x4800a2c1,0xbdc6bd86,0xa2c1bde7,0x4800eda2,0xbdc6bde7,0xeda2bd86,0xa2c1f684,0xdefb0000,0xe8e3ef5d,0xef5de8e3,0xef5def5d,0xef5dd6ba,0xdefbef5d,0xef5def5d,0x0000defb,0x92430000,0xbae4aac4,0xaac4bae4,0xbae4aac4,0xaac4bae4,0xbae4aac4,0xaac4bae4,0x00009243,0x92430000,0x81207900,0x79008120,0x81207900,0x79008120,0x81207900,0x79008120,0x00009243, +0xa2840000,0xa284bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xa284bae4,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0xa534a534,0x6b4d6b4d,0x5a6641a4,0x00000000,0x18a218c3,0x18a21082,0x18c318c3,0x10611061,0x18c31082,0x10821082,0x18c318c3,0x10611082,0x42084228,0x420839e7,0x42284228,0x31a639c7,0x420839e7,0x39c739e7,0x42284228,0x39c739c7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x104030e1,0x28e13101,0x39223922,0x28e13101,0x10403101,0x51a330e1,0x51a31040,0x39221040,0xef5cef3c,0xb5b6b5b6,0x39c6df1a,0x20c439c7,0xe75c39e7,0xd6fadeda,0xe6badeda,0xdeba41e7,0xd3e2a2c1,0xd3e2e483,0xe529a2c1,0xe483d3e2,0xe483a2c1,0xa2c1d3e2,0xe483e529,0xa2c1d3e2,0xd3e2a2c1,0x2800a2c1,0x40804080,0xa2c14080,0x2800a2c1,0x40804080,0xa2c12800,0xa2c1d3e2, +0xd3e2a2c1,0x4800eda2,0xb566b546,0xeda2bd86,0x4800eda2,0xb566bd86,0xeda24800,0xa2c1d3e2,0xdefb0000,0xe9a6ef5d,0xef5de8e3,0xef5def5d,0xe8e3ef5d,0xef5dd6ba,0xef5def5d,0x0000defb,0x92430000,0xa284a284,0xa284aac4,0xa284a284,0xa284aac4,0xa284a284,0xa284aac4,0x00009243,0x92430000,0x79007900,0x71007900,0x60a060a0,0x60a060a0,0x710060a0,0x79007900,0x00009243, +0xa2840000,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4a284,0xbae4bae4,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xa534a534,0x6b4d6b4d,0x6b4d6b4d,0x18a218a2,0x20e318c3,0x18a218a2,0x20e318a2,0x18a21082,0x20e320e3,0x18a218a2,0x20e32104,0x39e74208,0x4a494228,0x39e74208,0x4a494208,0x420839e7,0x4a494a49,0x39e74208,0x4a494a69,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x10603101,0x104028c1,0x39223922,0x28e11040,0x104051a3,0x51a328e1,0x51c31040,0x39221040,0xffffef5c,0xb5d6e77c,0x10c241e7,0x39a720c4,0xf75cef3c,0xef9cef3c,0xef7cef7c,0xef5cdeda,0xd3e2a2c1,0xd3e2e483,0xe483a2c1,0xe529d3e2,0xe529a2c1,0xa2c1e483,0xe483e529,0xa2c1d3e2,0xd3e2a2c1,0xa2c1e483,0x40802800,0xe5292800,0x2800a2c1,0x28002800,0xe483a2c1,0xa2c1d3e2, +0xd3e2a2c1,0xe4c2f6e6,0xb5064800,0xfff24800,0x4800eda2,0x48004800,0xf6e6eda2,0xa2c1d3e2,0xdefb0000,0xdefbef5d,0xd6badefb,0xdefbdefb,0xdefbdefb,0xdefbef5d,0xef5ddefb,0x0000defb,0xc6180000,0xa284c618,0xc618a284,0xa284c618,0xc618a284,0xa284c618,0xc618a284,0x0000c618,0x92430000,0x60a060a0,0x60a060a0,0x79008120,0x81208120,0x60a060a0,0x60a060a0,0x00009243, +0xa2840000,0xbae4bae4,0xbae4a284,0xa284bae4,0xbae4bae4,0xbae4a284,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x52050000,0xa534a534,0xa534a534,0x20e320e3,0x18a218a2,0x20e320e3,0x18a218c3,0x20e318c3,0x18c318c3,0x210420e3,0x18c318c3,0x4a494228,0x42084208,0x4a494a49,0x42084208,0x4a494228,0x42284228,0x4a494a49,0x42284228,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x28c11020,0x104028c0,0x51a328e1,0x28e11040,0x104051a3,0x392228e1,0x39221880,0x51a31880,0xef9cd6db,0xef7ce73c,0xe6daef5c,0xdebaef7c,0xdebbdeda,0xb5b6e77c,0xe75cef5c,0xdedadeba,0xd3e2a2c1,0xa2c1e483,0xe483a2c1,0xe483e483,0xe529a2c1,0xa2c1e483,0xe483e483,0xa2c1e483,0xd3e2a2c1,0xa2c1e483,0x28002800,0xe483e483,0xe529a2c1,0xa2c12800,0xe483e483,0xa2c1e483, +0xd3e2a2c1,0xeda2e483,0x48004800,0xf6e6ffe7,0xfff2e4c2,0xeda24800,0xe483f6e6,0xa2c1e483,0xdefb0000,0xef5def5d,0xef5def5d,0xef5def5d,0xef5def5d,0xef5def5d,0xef5de8e3,0x0000defb,0xc6180000,0xc618ef5d,0xdefbc618,0xc618ef5d,0xdefbc618,0xc618ef5d,0xdefbc618,0x0000c618,0x92430000,0x81207900,0x79008120,0x81207900,0x79007900,0x81208120,0x79008120,0x00009243, +0xa2840000,0xa284bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4a284,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x83280000,0x00008b87,0x00000000,0x18c318a2,0x21042104,0x18c320e3,0x18a218a2,0x10821082,0x18a21082,0x10821061,0x18a218a2,0x42284208,0x4a694a49,0x42284228,0x42084208,0x39c739e7,0x420839e7,0x39c731a6,0x420839e7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x28c11040,0x08203102,0x51a31040,0x28e11040,0x104051a3,0x51a328e1,0x39221880,0x49a31880,0xe75cf77c,0xdebadeda,0xe77cde9a,0xef1ce75c,0xef7be77c,0xef7ce75c,0xef5cef7b,0xef5cf75b,0xe529a2c1,0xa2c1e483,0xe483d3e2,0xd3e2e483,0xe483a2c1,0xa2c1e483,0xe483d3e2,0xa2c1e483,0xe529a2c1,0xa2c1e483,0xe483d3e2,0xd3e2e483,0xe483a2c1,0xa2c1e483,0xe483d3e2,0xa2c1e483, +0xe529a2c1,0xe4c2e483,0xffe7f7c5,0xd3e2f6e6,0xf6e6a2c1,0xe4c2ffe7,0xe483d3e2,0xa2c1e483,0xd6ba0000,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0x0000d6ba,0xc6180000,0xef5def5d,0xef5def5d,0xef5def5d,0xef5def5d,0xef5def5d,0xef5def5d,0x0000c618,0x92430000,0xef5d7900,0x79007900,0x79007900,0x79007900,0x79007900,0x79007900,0x00009243, +0xa2840000,0xa284a284,0xa284a284,0xa284a284,0xa284a284,0xa284a284,0xa284a284,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x18a21082,0x10821082,0x18c318a2,0x10821082,0x18c318c3,0x10821061,0x18c318c3,0x10821082,0x39e739e7,0x39e739c7,0x42284208,0x39e739e7,0x42284228,0x39c739c7,0x42084208,0x39c739c7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x28e11860,0x51c33101,0x31011040,0x104049a3,0x28e128e1,0x392228e1,0x39223101,0x51c328e1,0xef7bb5b6,0xef7cef5c,0xbdd6ef7c,0xdefaef5c,0xe75ce6da,0xffffffff,0xef3cffff,0xb5b5ef7c,0xa2c1a2c1,0xa2c1d3e2,0xd3e2a2c1,0xa2c1d3e2,0xd3e2a2c1,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0xa2c1a2c1,0xa2c1d3e2,0xd3e2a2c1,0xa2c1d3e2,0xd3e2a2c1,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1, +0xa2c1a2c1,0xa2c1d3e2,0xf684e4c2,0xa2c1d3e2,0xd3e2a2c1,0xa2c1e4c2,0xd3e2d3e2,0xa2c1a2c1,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xc6180000,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0x0000c618,0xc6180000,0xdefbdefb,0xdefbdefb,0x7900defb,0x60a060a0,0xdefbdefb,0xdefbdefb,0x0000c618, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x00000000,0x00000000,0x00000000,0x93a80000,0x00006286,0x00000000,0x00000000,0x00000000,0x51e37ac5,0x59e351e3,0x51c351c3,0x51c359e3,0x51e351e3,0x51c351e3,0x51c349a3,0x51e351c3,0x7bcf8430,0x73ae73ae,0x73ae738e,0x73ae73ae,0x73ae73ae,0x738e73ae,0x738e738e,0x738e738e,0x00000000,0x00000000,0x00000000,0x62860000,0x00003142,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa2c1a2c1,0xd3e2a2c1,0xd3e2a2c1,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0x69a669c7,0x38e34820,0x184158e2,0x38412882,0xab8ba2cb,0x92884924,0x38e338c3,0x514538e3, +0x5a27836b,0x72c96a88,0x7b2b5a27,0x392349a5,0x31023923,0x49c65a27,0x31023102,0x8b8c834b,0x49c27369,0x49c249c2,0x49c249c2,0x73697369,0x73697369,0x49c27369,0x49c249c2,0x49c249c2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x7b070000,0x00006aa6,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x8b468b46,0x93678b46,0x8b469367,0x93679367,0x8b468b46,0x93679367,0x72249367,0x94b294b2,0x94b294b2,0x94b29492,0x94929492,0x949294b2,0x94929492,0x94929492,0x73ae9492,0x00000000,0x00000000,0x00000000,0x9bc90000,0x00003963,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe483a2c1,0xd3e2e483,0xe483a2c1,0xa2c1d3e2,0xe483d3e2,0xa2c1e483,0xe483d3e2,0xa2c1e483,0x92aa69a6,0xab2c2041,0x69c75820,0x38415820,0x38414924,0x6841ab8b,0x8a4992cb,0x30c328a2, +0x5a4751e6,0x3102836b,0x41a549e6,0x31238b8c,0x7b0a4184,0x5a275a47,0x41644164,0x7b2a49c5,0x7ac57369,0xc4687ac5,0x7ac57ac5,0x736949c2,0x49c249c2,0x7ac57369,0x7ac57ac5,0x49c27ac5,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x7b070000,0x00006aa6,0x00000000,0x00000000,0x00000000,0x8b46aca9,0xa4497ac5,0xa449a449,0xa408a449,0xa4489367,0xa408a448,0xa408a408,0x72248b46,0x949294b2,0x9cf38c71,0x9cd39cf3,0x9cd39cd3,0x9cd394b2,0x9cd39cd3,0x9cd39cd3,0x73ae9492,0x00000000,0x00000000,0x00000000,0x62860000,0x00003983,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe483d3e2,0xe483e529,0xd3e2a2c1,0xa2c1d3e2,0xe483e529,0xa2c1d3e2,0xe483e483,0xd3e2a2c1,0x8269cbcf,0xcbae6186,0xaaeb7861,0x184159a6,0x988261c7,0x5820b34d,0x58209aeb,0x30c37a08, +0x8b8c4164,0x31236247,0x31023102,0x416472c9,0x7b2a5a27,0x41a5834b,0x418449a5,0x41844184,0xfdeb7369,0xffffc468,0x49c2feb3,0x49c27369,0x49c2c468,0xfdeb7369,0xffffc468,0x49c2c468,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x6ac70000,0x00003963,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x936782c5,0x8b469367,0xa4089367,0x8b467a84,0x8b468b46,0x93878b46,0x72249367,0x949294b2,0x94b28c71,0x949294b2,0x9cd394b2,0x94b28c71,0x94929492,0x94b294b2,0x7bef94b2,0x00000000,0x00000000,0x00000000,0x93a90000,0x00003963,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3e2d3e2,0xe483d3e2,0xa2c1e483,0xa2c1e483,0xe483e529,0xe483a2c1,0xa2c1e483,0xd3e2e483,0xa2cbc38e,0x30c32882,0x18412882,0x582061c7,0x18414124,0x7041c38e,0x71e78a69,0x59a68a87, +0x72c93102,0x72c93102,0x62683103,0x41846247,0x5a274184,0x6ac949a5,0x5a476267,0x51e649c5,0x73697369,0xc468fdeb,0x736949c2,0x7ac549c2,0x7369ffff,0x736949c2,0xc468fdeb,0x49c27ac5,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x6ac70000,0x00003963,0x00000000,0x00000000,0x00000000,0x72a56b6d,0x7ac56244,0x72a572a5,0x938772a5,0x7ac56244,0x7ac57ac5,0x936672a5,0x51e372a5,0x94928410,0x94928c51,0x8c719492,0x94b28c71,0x94928c51,0x8c718c71,0x94b28c71,0x7bcf8c71,0x00000000,0x00000000,0x00000000,0x9bea0000,0x00004184,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa2c1a2c1,0xe483d3e2,0xa2c1e483,0xa2c1e483,0xd3e2e483,0xe483d3e2,0xd3e2a2c1,0xa2c1e483,0x384159a6,0x8269ab2c,0x18416186,0x58208a69,0x71e79aeb,0x30412882,0x4924bb6d,0x30c33841, +0x62685206,0x7b2a3943,0x31026268,0x49c56247,0x39436268,0x6aa993cd,0x6aa96247,0x49a58bac,0x49c27369,0x7ac57369,0x736949c2,0xfdebfdeb,0x49c27369,0x49c27ac5,0x7ac57369,0x73697369,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x62860000,0x00003963,0x00000000,0x00000000,0x00000000,0x8b4631a6,0x8b4682a5,0x93679367,0xa4088b46,0x8b467a84,0x8b468b46,0xa4488b46,0x6a038b46,0x9cd34a69,0x9cd394b2,0x9cd39cf3,0x9cf39cd3,0x94b28c71,0x94b294b2,0x9cf394b2,0x7bef94b2,0x00000000,0x00000000,0x00000000,0x93a80000,0x000041a4,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe483a2c1,0xa2c1d3e2,0xa2c1a2c1,0xa2c1e529,0xa2c1e483,0xd3e2e529,0xe483a2c1,0xd3e2e529,0x78614924,0x8a69ab4a,0x104171e7,0x6841a2cb,0x71e78a69,0x18417a08,0x492461a6,0x79e77041, +0x41844184,0x72e96aa9,0x31023102,0x418472e9,0x6aa949a5,0x5a476aa9,0x31026268,0x6aa93102,0x7ac57ac5,0x736949c2,0x73697369,0x73697369,0x7ac549c2,0x7ac5c468,0x736949c2,0x736949c2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x7b070000,0x000049e4,0x00000000,0x00000000,0x00000000,0x8b46ac68,0x7a847a84,0x82c57a84,0x8b4682a5,0x7a847a84,0x62447a84,0x8b4682c5,0x6a038b46,0x9cf3a514,0x94b294b2,0x94b294b2,0x9cd394b2,0x8c719492,0x8c518c71,0x94b29492,0x841094b2,0x00000000,0x00000000,0x00000000,0x93880000,0x00003963,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe529d3e2,0xe483e483,0xe483e483,0x3960a2c1,0xa2c1a2c1,0xa2c1e483,0xd3e2e483,0xd3e2d3e2,0x49247a08,0x8061c38e,0x30e36020,0x4020a2cb,0x8228e550,0x59a6bc0c,0xd3ef5145,0x58205820, +0x52064164,0x624751c5,0x834b7b0a,0x39237b2a,0x7b0a5206,0x394341a5,0x31023102,0x6a884164,0xfffffdeb,0x49c2feb3,0x49c27369,0xfdeb7369,0xc4687ac5,0xc468ffff,0x736949c2,0x49c27ac5,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x7b070000,0x00006aa6,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x93679367,0x7ac59367,0x93678b46,0x8b469367,0x8b468b46,0x93679367,0x6a039367,0xa534ad75,0xa534a534,0x9cd3a514,0x9cf39cd3,0x9cd39cd3,0x9cd39cd3,0x94b29cd3,0x7bef94b2,0x00000000,0x00000000,0x00000000,0xf8000000,0x0000a800,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa2c1d3e2,0xa2c1a2c1,0xa2c1a2c1,0xb4203960,0xa2c1e540,0xd3e2e483,0xa2c1a2c1,0xa2c1a2c1,0x104171c7,0x886159a6,0xab8b8061,0xa2cb9b09,0x71c7b34d,0x41245145,0x084128a2,0xdd0fdc10, +0x9c0e6ac9,0x49c572e9,0x62885a27,0x310249a5,0x41844184,0x31026268,0x31023102,0x62686247,0xc468fdeb,0x73697ac5,0x7ac549c2,0x736949c2,0xfdeb7369,0x7ac5c468,0x736949c2,0x49c27ac5,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x84100000,0x0000738e,0x00000000,0x00000000,0x00000000,0x7ac59be7,0x936672a5,0x93669366,0x93879366,0x93877ac5,0x93669366,0x93669366,0x51e37ac5,0xad55b596,0xad55a514,0xa534a534,0xa534a534,0xad559cf3,0xa534a534,0xa534a534,0x8c51a514,0x00000000,0x00000000,0x00000000,0xfff2f800,0xf800ffff,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3e2a2c1,0xe483d3e2,0x3960e483,0xe540b420,0x3960b420,0xa2c1a2c1,0xe483e483,0xd3e2e529,0x8a6971e7,0x51652882,0xc38e9aaa,0x41044924,0x284161a6,0x92aa30c3,0x30c35820,0x90824020, +0x626862a9,0x41846a88,0x418449a5,0x49c53102,0x6ac95206,0x5a476268,0x62686268,0x72e93923,0x73697369,0x49c27369,0x7ac57ac5,0x736949c2,0x736949c2,0x7ac5fdeb,0x7ac57369,0x49c2feb3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x7bef0000,0x0000738e,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x8b4682c5,0x93679367,0xa4089367,0x8b467a84,0x93677ac5,0xa4499367,0x72249367,0xbdd7c638,0xb5b6b596,0xb5b6b596,0xbdf7b5b6,0xb596ad75,0xb596ad75,0xbdd7b596,0xa514b596,0x00000000,0x00000000,0x00000000,0xfec0f800,0xf800fc60,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe483d3e2,0xe483e483,0x3960a2c1,0xb420e540,0xa2c13960,0xd3e2e483,0xe483a2c1,0xd3e2d3e2,0x8a695820,0x59a671e7,0x18415965,0x514530c3,0x604161c7,0x8a69b32c,0x8a6961a6,0x30415820, +0x6a883102,0x41843923,0x6a88836b,0x39236aa9,0x394341a5,0x3102836b,0x6a886268,0x6a8841a5,0x49c27369,0xc46849c2,0xc468feb3,0x736949c2,0x49c27ac5,0x73697369,0xc4687ac5,0x49c2ffff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x8b46ac68,0x8b466244,0x8b468b46,0xa4089367,0x8b4682a5,0x8b468b46,0xa4088b46,0x6a038b46,0xc618ce59,0xc618b5b6,0xc618c618,0xc618c618,0xb5b6b596,0xb596b596,0xbdd7b596,0xa514b596,0x00000000,0x00000000,0x00000000,0xf8000000,0x0000f800,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa2c1a2c1,0xa2c1a2c1,0xa2c1e483,0x39603960,0xe483e483,0xe483a2c1,0xa2c1d3e2,0xa2c1a2c1,0x8aaa4820,0x59a671c7,0x602069c7,0x30c38a69,0xdc10bb6d,0x92aa8249,0x59a692a8,0x28821041, +0x392341a5,0x62683923,0x51e63102,0x6a883123,0x41a53943,0x31035a47,0x72c96a88,0x41648bac,0x7ac57369,0xfeb37ac5,0xfeb3ffff,0x736949c2,0xffffc468,0x49c249c2,0xfdeb7369,0x49c2c468,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x8b46b4aa,0x8b467a84,0x93678b46,0xa4089367,0x8b4682c5,0x7ac58b46,0xa4488b46,0x72248b46,0xc638ce79,0xc638bdf7,0xc638c618,0xc618c618,0xb5b6b5b6,0xb596b5b6,0xbdf7b5b6,0xa514b5b6,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3e2a2c1,0xe483e483,0xd3e2d3e2,0xe483a2c1,0xe483d3e2,0xa2c1e483,0xe529e483,0xa2c1d3e2,0xc38ee530,0x59a68a87,0x8aaac38e,0x20418aaa,0x928a59a6,0xab0c9269,0xab6a4104,0x59a67861, +0x41a551e6,0x72ea6ac9,0x31023923,0x836b49a5,0x628841a5,0x7b0a5a67,0x4184834b,0x5a6751e6,0x73697369,0xc468fdeb,0xc468feb3,0x736949c2,0xc468fdeb,0x49c27ac5,0x73697369,0x49c2fdeb,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x72a59ba7,0x62446224,0x62446244,0x7ac56244,0x62446244,0x62246224,0x72a56224,0x51e37ac5,0xbdf7c638,0xbdd7bdd7,0xbdd7bdd7,0xbdd7b5b6,0xad75b596,0xad55ad55,0xad75ad55,0x9cf3ad75,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe483d3e2,0xe483e483,0xe483a2c1,0xe483a2c1,0xa2c1e483,0xd3e2e483,0xd3e2a2c1,0xd3e2e483,0x41247228,0x59a61041,0x69e7aaeb,0xab8ba2eb,0x492430c3,0x38e32882,0xbb6d4924,0x59a68861, +0x39234184,0x31027b0a,0x62687b0a,0x5a473102,0x394341a5,0x49a549a5,0x41844184,0x93cd49c5,0x49c27369,0xfdeb7369,0x7ac57ac5,0x49c27369,0xfdeb7369,0x73697ac5,0x49c249c2,0x49c27369,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x8b468b46,0x8b468b46,0x8b468b46,0x93679367,0x8b469367,0x93677ac5,0x6a039367,0xc638d69a,0xc638c638,0xc638c638,0xc638c638,0xbdf7c638,0xbdd7bdf7,0xb5b6b596,0xa514b5b6,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe529d3e2,0xa2c1e529,0xe483e483,0xe529a2c1,0xa2c1e483,0xe483e483,0xa2c1e529,0xd3e2d3e2,0x71e75986,0x28828a69,0x80614924,0x5820c38e,0x10412061,0x58207a08,0x59a62882,0x8a8a3841, +0x49a56288,0x31026268,0x62473923,0x5a473923,0x31025a47,0x3102834b,0x41644184,0x41645206,0x7ac57ac5,0x736949c2,0x73697ac5,0x7ac549c2,0x736949c2,0x49c27369,0xc468c468,0x736949c2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x93878b46,0xa448a448,0xa408a408,0xa4088b46,0xa448a408,0xa448a408,0x6a039367,0xc638d69a,0xc638c638,0xce79ce79,0xce59ce79,0xce59c638,0xce59ce59,0xc618c618,0xa534b5b6,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe529a2c1,0xe529a2c1,0xd3e2e483,0xd3e2a2c1,0xa2c1e483,0xe483e483,0xd3e2e483,0xa2c1a2c1,0xa2cbc38e,0x8a694020,0x49241841,0x8061c38e,0x58204924,0x582092aa,0x69646841,0xab0c6186, +0x52064184,0x62476ac9,0x62476aa9,0x51e67b0a,0x39233943,0x62686268,0x31023102,0x49c65a47,0xffff7ac5,0x49c2c468,0xfdeb7369,0xffffc468,0x736949c2,0x7ac5fdeb,0xfffffeb3,0x49c2c468,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x8b466b6d,0x8b467a84,0x93678b46,0xa4489367,0x93677a84,0x93679367,0xa4499367,0x6a039367,0xc6188410,0xc618bdd7,0xc618c618,0xce59c618,0xc618bdd7,0xc618c618,0xc638bdf7,0xad55bdf7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0xa2c1a2c1,0xd3e2d3e2,0xd3e2a2c1,0xa2c1d3e2,0xd3e2a2c1,0xd3e2d3e2,0xd3e2a2c1,0xa2c1a2c1,0xa2cbc38e,0x9a8aa2cb,0x71e7c42d,0x49245145,0x80614924,0xa2cbc38e,0x492471e7,0x8228aaeb, +0x62475a47,0x49c53943,0x41643943,0x31023923,0x49a541a5,0x628849a5,0x39234184,0x52063102,0x7ac5fdeb,0x73697ac5,0x73697369,0x7ac5fdeb,0x73697369,0xfdeb7369,0xc468fdeb,0x73697ac5,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x00000000,0x00000000,0x00000000,0x62860000,0x00003142,0x00000000,0x00000000,0x00000000,0x7ac531a6,0x7ae56244,0x72a572a5,0x93667ae5,0x7ac56244,0x18c37ac5,0x936651c3,0x51e351c3,0xbdd74a69,0xbdd7b596,0xb596b596,0xb596b596,0xb596a534,0xb596ad75,0xb596bdd7,0x9cf3a514,0x00000000,0x49c46265,0x00000000,0x00000000,0x00000000,0x00000000,0x41834183,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x61a261a2,0x71e238c1,0x59825982,0x69c24921,0x41215982,0x69e24921,0x49415982,0x38e171e2,0x7aa67aa6,0x9b484142,0x7aa67aa6,0x9b4861e4,0x61e47aa6,0x9b4861e4,0x61e47aa6,0x41429b48, +0x00000000,0x000005e2,0x00000000,0x07020000,0x00000340,0x06220000,0x00000000,0x00000000,0x00000000,0x14c23e60,0x000004a2,0x3d210000,0x05c20340,0x3cc20000,0x00000000,0x00000000,0x000004c2,0x02a06481,0x01c05c01,0x6d000000,0x53e209a0,0x64610280,0x04420000,0x00000000,0x0b603c02,0x12006481,0x1a606481,0x64810000,0x5c0111e0,0x5be222c0,0x5c010000,0x000001c0, +0x096063e1,0x09605bc2,0x11e06401,0x64010000,0x534200c0,0x53620980,0x53820000,0x00000980,0x01005321,0x00205321,0x00004ac1,0x42a10000,0x42810060,0x53420060,0x6c210000,0x000000e0,0x00805b61,0x008063a2,0x00c06382,0x63820000,0x42810000,0x63a20080,0x53010000,0x00000940,0x090052e1,0x00606ba1,0x00c052e1,0x52e10000,0x42410040,0x63620060,0x4aa10000,0x000000a0, +0x00000000,0x00000000,0x00000000,0x9bc90000,0x00003963,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x8b467a84,0x93678b46,0xa4089367,0x936782c5,0x42088b46,0x18c32965,0x72247224,0xc638c618,0xc618bdd7,0xc638c618,0xce59c618,0xc618bdd7,0xb5b6bdd7,0xa534bdd7,0x9cf3a534,0x62650000,0x5a448b87,0x5a245a24,0x5a246a85,0x62656265,0x5a246265,0x6a85ac4a,0x00006265, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x494161a2,0x69e230c1,0x412169c2,0x412130c1,0x412169c2,0x516130c1,0x30c14121,0x598271e2,0x61e47aa6,0x9b484142,0x61e49b48,0x61e44142,0x61e49b48,0x7aa64142,0x414261e4,0x7aa69b48, +0x00000000,0x00000000,0x00000000,0x05620000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x000006a2,0x00000000,0x3d810000,0x00000380,0x07220000,0x14620000,0x00000000,0x00000000,0x01e04502,0x02e03c42,0x5c210000,0x3ce20280,0x34020240,0x00000000,0x00000000,0x13c14da1,0x0b406481,0x02006cc1,0x64610000,0x75202b21,0x45610220,0x3c420000,0x00000240, +0x0a606401,0x226063e1,0x11e06c61,0x53620000,0x64010100,0x63e11a40,0x64210000,0x00000140,0x09805ba1,0x09804b01,0x01404ae1,0x53210000,0x53210100,0x6c010100,0x5b820000,0x00000100,0x11a05b42,0x00e05b41,0x09406382,0x4aa10000,0x5b410940,0x5b210000,0x6bc20000,0x00000920,0x09406ba1,0x19e05b21,0x00e06382,0x5b010000,0x5b2100a0,0x5b210080,0x63610000,0x00000060, +0x00000000,0x00000000,0x00000000,0x62860000,0x00003983,0x00000000,0x00000000,0x00000000,0x8b46aca9,0x82c56244,0x82c582c5,0x8b4682c5,0x82a582c5,0x7a8482a5,0x8b467a84,0x72248b46,0xc638c618,0xbdf7bdd7,0xc618c618,0xc618c618,0xbdd7bdf7,0xb596b5b6,0xb5b6b596,0xa514b5b6,0xa4090000,0x6a856265,0xac4a8b87,0x8b87ac4a,0xac4aac4a,0xa4098b87,0x5a448b87,0x0000a409, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x59824941,0x51624921,0x41214122,0x61a24101,0x410161a2,0x516130c0,0x30c14121,0x59825982,0x7aa661e4,0x7aa661e4,0x61e45a05,0x9b4861e4,0x61e49b48,0x7aa64142,0x414261e4,0x7aa67aa6, +0x00000000,0x00000000,0x00000000,0x000005c2,0x00000000,0x00000000,0x00000000,0x00000000,0x05a20000,0x00000000,0x00000000,0x3dc10000,0x00001d63,0x00000000,0x00000642,0x00000000,0x00000000,0x1d023c62,0x00000502,0x3ce21462,0x04a20320,0x3ce20000,0x00000000,0x00000000,0x000005c1,0x13e14d81,0x02c03c82,0x7d600000,0x44a233e1,0x4e0002c0,0x04a10000,0x0b800000, +0x13c14cc2,0x2b2174c1,0x22a06c61,0x5ba10000,0x74a10980,0x6c412240,0x5bc20000,0x00000a20,0x1a206c01,0x1a006c21,0x226063c2,0x63a10000,0x5ba20140,0x74810140,0x63a10000,0x00003320,0x1a207421,0x11c06381,0x2a406be2,0x6bc20000,0x42610920,0x6bc20940,0x63c20000,0x00000920,0x09606be2,0x09007c61,0x09206381,0x63610000,0x63420900,0x5b420920,0x5b210000,0x00000920, +0x00000000,0x00000000,0x00000000,0x93a90000,0x00003963,0x00000000,0x00000000,0x00000000,0x9367b4aa,0xa4499367,0xa408a449,0xa408a449,0xa4088b46,0xa408a408,0x9387a448,0x72249367,0xc638c618,0xce79c638,0xce79ce79,0xce79ce79,0xce59c618,0xc638ce59,0xbdd7c618,0xa514b5b6,0x00000000,0x6a85ac4a,0x00000000,0x00000000,0x00000000,0x00000000,0x49a3a409,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c14941,0x69c24121,0x41015161,0x61a228a0,0x41013901,0x51614101,0x69c24121,0x69e269c2,0x414261e4,0x9b4861e4,0x61e47aa6,0x9b484142,0x61e461e4,0x7aa661e4,0x9b4861e4,0x9b489b48, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x07220000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x000006c1,0x06410000,0x45610000,0x00000b60,0x05620000,0x0b800000,0x00000000,0x00000000,0x02804e00,0x1c824521,0x7e000000,0x45010b60,0x456101c0,0x00000000,0x00000581, +0x0a605600,0x13c18560,0x018074e1,0x64010000,0x74a11200,0x4ce20a60,0x44a20000,0x00000220,0x13407481,0x33007481,0x00807cc1,0x63e10000,0x63e11a20,0x74811a00,0x8d600000,0x00002aa0,0x3b207c81,0x2a607441,0x19c084a1,0x63c20000,0x6bc211a0,0x63a219e0,0x63c20000,0x00003300,0x2a407401,0x19c06ba1,0x2a406bc2,0x6ba20000,0x6bc20900,0x6ba119c0,0x6bc20000,0x00002a60, +0x00000000,0x00000000,0x00000000,0x9bea0000,0x00004184,0x00000000,0x00000000,0x00000000,0x72a59be7,0x93877ac5,0x93669366,0x93879366,0x93877ac5,0x93879387,0x93669366,0x51e372a5,0xbdf7bdd7,0xce59c618,0xc638c638,0xc638c638,0xc638bdf7,0xc638c638,0xbdf7bdf7,0x9cf3b596,0x00000000,0x49a36265,0x00000000,0x00000000,0x00000000,0x00000000,0x41835a24,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x41215982,0x61a24121,0x39015161,0x49413901,0x49412965,0x61a228a0,0x61a24101,0x30c14121,0x61e47aa6,0x9b4861e4,0x61e47aa6,0x7aa661e4,0x7aa652aa,0x9b484142,0x9b4861e4,0x414261e4, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x03800562,0x00000000,0x00000000,0x00000000,0x00000000,0x06020000,0x000014a2,0x00000000,0x45a10000,0x00000be1,0x00000000,0x000005a2,0x00000000,0x00000000,0x13c144e2,0x00000660,0x4da10280,0x042113a1,0x4dc10000,0x00000000,0x00000000, +0x000004a0,0x138055e1,0x0b004402,0x6c810000,0x4cc21a20,0x44a213a1,0x04600000,0x2d220000,0x13205d81,0x22608540,0x3ba15b41,0x74810000,0x74813361,0x7ca143e1,0x7ce10000,0x00001340,0x2ac09560,0x2aa084c1,0x2a407441,0x74410000,0x74612240,0x744119e0,0x8d400000,0x000032c0,0x32c08ca1,0x11807c41,0x438184a1,0x6ba20000,0x7c412200,0x6bc219a0,0x8cc10000,0x000032e0, +0x00000000,0x00000000,0x00000000,0x93a80000,0x000041a4,0x00000000,0x00000000,0x00000000,0x8b46b4aa,0x000082a5,0x00000000,0xa4080000,0x00007a84,0x00000000,0xa4480000,0x6a038b46,0xc638c618,0x0000bdf7,0x00000000,0xce790000,0x0000bdf7,0x00000000,0xce590000,0xa514bdf7,0x62650000,0x6265a409,0x5a245a24,0x62655a24,0x62656265,0x62656265,0x6265a409,0x00006265, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x41215982,0x61a261a2,0x39014941,0x492128a0,0x38e14921,0x598228a0,0x61a23901,0x412139e7,0x61e47aa6,0x9b489b48,0x61e47aa6,0x7aa64142,0x61e47aa6,0x9b484142,0x9b4861e4,0x61e46b6d, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x000005a2,0x00000000,0x00000000,0x00000000,0x00000000,0x06810000,0x00000000,0x00000000,0x05e20000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x000005c1,0x04c10000,0x4de11421,0x00000b40,0x05610000,0x14410000,0x00000000, +0x00000000,0x13c155a1,0x13404d41,0x74810000,0x55e11340,0x55a11340,0x00000000,0x00000700,0x1b805561,0x1b807cc1,0x24418dc0,0x8d800000,0x960043e1,0x5da112c0,0x5d810000,0x000012c0,0x3b218d20,0x11a084e1,0x32e084a1,0x84a10000,0x74612240,0x8d002ac0,0x8d200000,0x00003b21,0x2a409500,0x2a407401,0x4361a5c0,0x84810000,0x7c412a40,0x8cc119c0,0x95400000,0x00001160, +0x00000000,0x00000000,0x00000000,0x93880000,0x00003963,0x00000000,0x00000000,0x00000000,0x8b46ac68,0x00007a84,0x00000000,0xa4480000,0x00007a84,0x00000000,0xa4080000,0x6a038b46,0xc618c618,0x0000bdf7,0x00000000,0xce790000,0x0000bdf7,0x00000000,0xce590000,0xa534c618,0xa4090000,0x5a448b87,0xac4aac4a,0x8b878b87,0x8b878b87,0xa409a409,0x5a44ac4a,0x0000a409, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c15982,0x410161a2,0x49413901,0x516238e1,0x38e14121,0x39015162,0x28a03901,0x516161a2,0x41427aa6,0x61e49b48,0x7aa661e4,0x9b4861e4,0x61e47aa6,0x61e49b48,0x414261e4,0x7aa69b48, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x01c004e2,0x00000000,0x00000000,0x00000000,0x00000000,0x05210000,0x00000b60,0x06210000,0x4d810000,0x00001441,0x00000000,0x13e10620,0x00000000, +0x00000000,0x13c15600,0x00000560,0x55811bc1,0x05601bc1,0x55810000,0x00000000,0x00000000,0x00005da1,0x1bc15da1,0x1be15e60,0x96000000,0x55211a20,0x5e000a80,0x55210000,0x13400000,0x1b809580,0x3b817421,0x2a808d20,0x84a10000,0x8d2032e0,0x8d402ac0,0x95600000,0x000009c0,0x4bc184a1,0x3b2184a1,0x2a409da0,0x8ca10000,0x7c413b00,0x7c413b21,0x74010000,0x000019a0, +0x00000000,0x00000000,0x00000000,0x7b070000,0x000049e4,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x000082c5,0x00000000,0xa4490000,0x000082c5,0x00000000,0xa4490000,0x6a039367,0xc638c618,0x0000c618,0x00000000,0xce590000,0x0000bdd7,0x00000000,0xc6380000,0xa514bdf7,0x00000000,0x6a85ac4a,0x00000000,0x00000000,0x00000000,0x00000000,0x6a85ac4a,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c05982,0x49415161,0x38e13901,0x516128a0,0x20a030e1,0x38e15162,0x28a03901,0x41215161,0x41427aa6,0x7aa67aa6,0x61e461e4,0x9b484142,0x414261e4,0x61e49b48,0x414261e4,0x61e47aa6, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000422,0x00000000,0x00000000,0x00000000,0x00000000,0x05810000,0x00000000,0x00000000,0x06200000,0x00000000,0x00000000,0x000005e1,0x00000000, +0x00000000,0x000005c0,0x05c00000,0x56000b20,0x00000a60,0x05000000,0x1c210000,0x00000000,0x00000000,0x13005e00,0x24015e00,0x74810000,0x54e21ba1,0x5e201340,0x00000000,0x00005d81,0x000065a1,0x43e195c0,0x2ac084e1,0x8d400000,0x8d203b61,0x95603b81,0x4c420000,0x1b800000,0x32e0a5e0,0x43819d60,0x43818ca1,0x95400000,0x9d602a60,0x7c4132e0,0x7c410000,0x00003b00, +0x00000000,0x00000000,0x00000000,0xfff20000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x7ac59be7,0x62246224,0x62246224,0x7ac56224,0x62446244,0x62246244,0x72a56224,0x51e37ac5,0xbdf7bdd7,0xb5b6b5b6,0xb596b596,0xbdd7b596,0xb5b6b5b6,0xb5b6b5b6,0xbdd7b5b6,0xa514bdd7,0x00000000,0x41835a24,0x00000000,0x00000000,0x00000000,0x00000000,0x41835a24,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c069c2,0x49415161,0x28a03901,0x514128a0,0x208030c1,0x49214121,0x39013901,0x516161a2,0x41429b48,0x7aa67aa6,0x414261e4,0x9b484142,0x414261e4,0x7aa67aa6,0x61e461e4,0x7aa69b48, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1c8205e1,0x00000000,0x00000000,0x00000000,0x00000000, +0x06000000,0x00001c41,0x05200000,0x4cc20000,0x00000b20,0x00000000,0x24a20600,0x00000000,0x00000000,0x1b805541,0x00006620,0x5de12401,0x5d810ac0,0x55010000,0x00000000,0x00000000,0x00000000,0x32c09e00,0x2c828d00,0x95a00000,0x95c032e0,0x8d402c82,0x00000000,0x000065a1,0x42009540,0x43a1a5c0,0x32e0a5c0,0x8cc10000,0x954019a0,0xa5c03b20,0x95400000,0x00002140, +0x00000000,0x00000000,0x00000000,0xfec00000,0x0000fc60,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x93679367,0xa449a448,0xa408a449,0x8b468b46,0x9387a408,0xa449a449,0x72249367,0xc638c618,0xc618c638,0xce59ce59,0xce59ce79,0xc618c618,0xc638ce59,0xce59ce79,0xa534c618,0x62650000,0x6265ac4a,0x5a245a24,0x62655a24,0x62656265,0x5a245a24,0x6a85ac4a,0x00006265, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x516169c2,0x494161a2,0x28a03901,0x412128a0,0x20a030e1,0x49215162,0x41014941,0x516161a2,0x7aa69b48,0x7aa69b48,0x414261e4,0x7aa64142,0x414261e4,0x7aa69b48,0x61e47aa6,0x7aa69b48, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x02400660,0x00000000,0x00000000,0x00000000,0x00000000, +0x06200000,0x00000000,0x00000000,0x05400000,0x00000000,0x00000000,0x00000680,0x00000000,0x00000000,0x00005dc1,0x5e400000,0x55210a80,0x00001300,0x55610000,0x00000000,0x00000000,0x00000000,0x1b008d20,0x00006e80,0x8d401b40,0x6e803b81,0x8d200000,0x00000000,0x00000000,0x00208be2,0x32e0a5e0,0x31809540,0x7c410000,0x9d602a60,0x7c613180,0x7b420000,0x39c00000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x8b466b6d,0x00006244,0x00000000,0xa4080000,0x000082a5,0x00000000,0xa4080000,0x6a038b46,0xc6188410,0x0000b5b6,0x00000000,0xce590000,0x0000bdf7,0x00000000,0xce590000,0xa534c618,0xa4090000,0x62656265,0xac4aac4a,0x8b87ac4a,0x8b878b87,0xac4a6265,0x5a448b87,0x0000a409, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x41214921,0x410161a2,0x39013901,0x516228a0,0x38e130e1,0x28a05162,0x41014941,0x69c261a2,0x61e461e4,0x61e49b48,0x61e461e4,0x9b484142,0x61e461e4,0x41429b48,0x61e47aa6,0x9b489b48, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000481,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x0b200640,0x00000000,0x00000000,0x00000000,0x00000000,0x5e400000,0x00001320,0x54e20000,0x55410000,0x000009c0,0x00000000,0x1be15e20,0x00000000,0x00000000,0x00005d41,0x65810000,0x95c023e1,0x00004c02,0x54a20000,0x1b000000,0x00000000,0x00005a82,0x43419520,0x00008382,0x8cc14a20,0x838232c0,0xa5c02940,0x00000000,0x18e08ba2, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x7a8431a6,0x00007a84,0x00000000,0xa4080000,0x000082c5,0x00000000,0xa4480000,0x72248b46,0xbdf74a69,0x0000bdd7,0x00000000,0xce590000,0x0000bdf7,0x00000000,0xce590000,0xad55c618,0x00000000,0x5a448b87,0x00000000,0x00000000,0x00000000,0x00000000,0x6265a409,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x41215982,0x51615161,0x39013901,0x49215982,0x28a04921,0x29655982,0x41014941,0x69c230c0,0x61e47aa6,0x7aa67aa6,0x61e461e4,0x7aa69b48,0x41427aa6,0x52aa9b48,0x61e47aa6,0x9b484142, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x1c610520,0x00000000,0x00000000,0x00000000,0x00000000,0x55610000,0x00000000,0x00000000,0x4c420000,0x00000000,0x00000000,0x00005e00,0x00000000,0x65a10000,0x00001280,0x66000000,0x9e200000,0x00001b20,0x00000000,0x1b605d41,0x00000000,0x00000000,0x42209d80,0x93e10000,0x95202940,0x7b4232c0,0x95000000,0x00000000,0x00007302, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x72a59ba7,0x00006224,0x00000000,0x93870000,0x00006244,0x00000000,0x93660000,0x51e37ac5,0xbdf7bdd7,0x0000b5b6,0x00000000,0xc6380000,0x0000b5b6,0x00000000,0xc6180000,0xa514bdf7,0x00000000,0x49a35a24,0x00000000,0x00000000,0x00000000,0x00000000,0x41835a24,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x41215982,0x318669c2,0x39015161,0x59823901,0x28a04941,0x49414941,0x41214101,0x69c230c1,0x61e47aa6,0x52aa9b48,0x61e47aa6,0x9b4861e4,0x41427aa6,0x7aa67aa6,0x61e461e4,0x9b484142, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000640,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x13405e40,0x00000000,0x00000000,0x00000000,0x00000000,0x5ce20000,0x00000000,0x00000000,0x5d610000,0x00000000,0x00000000,0x000065a1,0x00000000,0x00000000,0x000093c1,0x7b420000,0x95200000,0x000039a0,0x93e10000,0x39a00000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x7a847a84,0x7a847a84,0x8b4682a5,0x82c582c5,0x82a582c5,0x93676244,0x6a039367,0xc638c618,0xbdd7bdd7,0xbdd7bdd7,0xc618bdf7,0xbdf7bdf7,0xbdf7bdf7,0xc618b5b6,0xa534bdf7,0x62650000,0x5a448b87,0x62656265,0x62656265,0x62656265,0x5a245a24,0x6a856265,0x00006265, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c171e2,0x69c269c2,0x41015161,0x494128a0,0x28a04941,0x410161a2,0x41214121,0x59824121,0x41429b48,0x9b489b48,0x61e47aa6,0x7aa64142,0x41427aa6,0x61e49b48,0x61e461e4,0x7aa661e4, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1b605d81,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x3b6184c1,0x00000000,0x00000000,0x00000000,0x00000000,0x7b620000,0x00002120,0x00000000,0x83a20000,0x00000000,0x00000000,0x294083a2,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x7ac58b46,0x8b468b46,0x8b468b46,0x8b468b46,0x8b468b46,0x8b468b46,0x6a039367,0xc618bdf7,0xbdd7bdf7,0xc618c618,0xc618c618,0xc618c618,0xc618c618,0xc618c618,0xa534c618,0xa4090000,0x49a3a409,0x8b878b87,0xa409a409,0xac4aac4a,0xa409ac4a,0x62658b87,0x0000a409, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c14941,0x51625982,0x41215161,0x61a230c0,0x30c04101,0x41215161,0x41214121,0x71e230c1,0x414261e4,0x7aa67aa6,0x61e47aa6,0x9b484142,0x414261e4,0x61e47aa6,0x61e461e4,0x9b484142, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00005da1,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x240195a0,0x00000000,0x00000000,0x00000000,0x00000000,0x73220000,0x00000000,0x00000000,0x10c08ba2,0x00000000,0x00000000,0x00007b42,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xac68b4aa,0xac68ac68,0xb4aaac68,0xaca9b4aa,0xb4aaac68,0xb4aab4aa,0xb4aab4aa,0x8b46b4aa,0xa514a534,0xad75a534,0xbdf7b5b6,0xbdf7c618,0xbdf7bdf7,0xc618c618,0xc638c638,0xbdd7c638,0x00000000,0x5a448b87,0x00000000,0x00000000,0x00000000,0x00000000,0x6a85ac4a,0x00000000, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x49417202,0x69e271e2,0x41214121,0x69c269c2,0x30c04121,0x412169c2,0x69e25982,0x71e24921,0x61e49b48,0x9b489b48,0x61e461e4,0x9b489b48,0x414261e4,0x61e49b48,0x9b487aa6,0x9b4861e4, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00006620,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00006b02,0x00000000,0x00000000,0x00000000,0x00000000, +0xce79c618,0xe71cf79e,0xd6bace59,0xffdff79e,0xd69adedb,0xf79ee73c,0xce79ce59,0xf79eef7d,0x1aaf220a,0x1aaf220a,0x2a4b1aaf,0x1aaf1aaf,0x1aaf22d0,0x1aaf1168,0x328c1aaf,0x2a4b1aaf,0xffffffff,0xefffffff,0xe79eefff,0xe79ee79e,0xe79ee79e,0xffffefff,0xefffe79e,0xffffe79e,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0x7aa79369,0x9369bc2b,0x7aa79369,0x93698430,0x93699369,0x7aa77aa7,0x93699369,0x59e57aa7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x0a020000,0x142413e4,0x140313a3,0x09c20b63,0x14030a02,0x0b8313e4,0x13e31403,0x00000b03,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa5569d15,0x94d49d15,0xa536add9,0xa55794f4,0xad779d36,0x9d159d15,0x9d369d15,0x94f49d15,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x31652904,0x31653165,0x31653165,0x31653165,0x31653165,0x31653165,0x31653145,0x31653165,0x31652904,0x31653165,0x31653165,0x31653165,0x31653165,0x31653165,0x31653145,0x31653165, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xf7bef7be,0xdedbdefb,0xe71cf79e,0xef5de73c,0xef7dffff,0xd69ad69a,0xe73ce71c,0xce59d6ba,0x00000a0d,0x000022f0,0x1aaf0000,0x00000000,0x00000000,0x000022d0,0x124e0000,0x1aaf0000,0xefffffff,0xe79effff,0xe79ee79e,0xffffe79e,0xffffffff,0xffffffff,0xefffffff,0xe79eefff,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0x7aa79369,0xbc2b59e5,0x59e57aa7,0x59e57aa7,0x7aa77aa7,0x59e57aa7,0x7aa77aa7,0x93699369,0x0b030000,0x01410000,0x0b030b03,0x0b030000,0x00000141,0x0b030b03,0x01410000,0x00000b03,0x0a020000,0x146413e4,0x14240ba3,0x00000ac2,0x13e40a02,0x13a31464,0x13a31424,0x00000b03,0x0b030000,0x0b030b03,0x0b030b03,0x0b030b03,0x0b030b03,0x0b030b03,0x0b030b03,0x00000b03, +0x9d16a536,0x9d159d15,0x9d16a536,0xa556a536,0xa5368cb3,0x9d1594b4,0x9cf5a557,0xa5369d15,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x854b0000,0x00006c28,0xaece0000,0x0000854b,0x7aa83165,0x72877287,0x8ae87287,0x72878ae8,0x8ae88ae8,0x82a87287,0x8ae88ae8,0x31657aa8,0x7aa83165,0x72877287,0x8ae87287,0x72878ae8,0x8ae88ae8,0x82a87287,0x8ae88ae8,0x31657aa8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe73ce73c,0xffffffdf,0xef5df79e,0xd6bae71c,0xdedbbdd7,0xf79ee73c,0xdedbdedb,0xfffff79e,0x126e220a,0x1aaf220a,0x220a1aaf,0x1aaf1aaf,0x22d01aaf,0x126e220a,0x19a81aaf,0x220a1aaf,0xefffefff,0xe79eefff,0xefffefff,0xe79eefff,0xefffffff,0xe79eefff,0xffffffff,0xefffefff,0x755f8dff,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f8dff,0x755f755f,0x755f755f, +0x93697aa7,0x7aa77aa7,0x7aa759e5,0x93699369,0x59e57aa7,0x59e5bc2b,0xbc2b7aa7,0x93699369,0x0b030000,0x14030aa2,0x0b431444,0x0ba30aa2,0x0aa21444,0x14241403,0x0aa20aa2,0x00000b03,0x01410000,0x13e30b83,0x14241403,0x0b030bc3,0x0b630141,0x13a313e4,0x14641464,0x00000b03,0x0b030000,0xdef3def3,0xdef3def3,0xded3def3,0xded3def3,0xdef3def3,0xdef3def3,0x00000b03, +0xa557adb9,0x8c939cf5,0x9d159d15,0xad779d15,0xad77a536,0xa536a557,0x9d15a556,0x9d16a557,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xe77b0000,0x0000960c,0xaece7605,0x0000854b,0x72873165,0x498492c7,0x49849b29,0x39439b29,0x41649b29,0x394392e8,0x394382a7,0x31657287,0x72873165,0x9b2992c7,0x9b299b29,0x72879b29,0x92e87287,0x82a792e8,0x82a782a7,0x31657287, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd69ad6ba,0xbdf7bdd7,0xf7bef79e,0xb5b6c638,0xef5ddefb,0xe73ce71c,0xffffffff,0xc618e73c,0x00001aaf,0x00001aaf,0x1aaf0000,0x00000000,0x00000000,0x00001aaf,0x1aaf0000,0x1aaf0000,0xffffefff,0xe79eefff,0xe79ee79e,0xffffefff,0xffffffff,0xe79eefff,0xe79ee79e,0xe79ee79e,0x8dff755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0xffff755f,0x755f755f,0x755f755f, +0x59e57aa7,0x7aa79369,0x93699369,0x7aa7bc2b,0x7aa77aa7,0x7aa77aa7,0x7aa77aa7,0xbc2bbc2b,0x0b030000,0x14031444,0x00000b43,0x14241403,0x0b431444,0x0b431403,0x14241464,0x00000b03,0x00000000,0x0b830b43,0x146413e4,0x0b030b83,0x0ae20000,0x13a31464,0x0ba313e3,0x00000b03,0x0b030000,0xd6b3def3,0xd6d4d6b3,0xd6b3d6b3,0xd6b3d6b3,0xd6d4d6d4,0xdef3d6d4,0x00000b03, +0xa536ad77,0xad779d15,0x9d15a536,0x94d4a556,0xa53694f4,0x9d159d15,0xa537a536,0x9d159d15,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x8ae83165,0x59e59b29,0x51849b29,0x51849b29,0x518482a7,0x518482a7,0x59a492e8,0x31658ae8,0x8ae83165,0x9b299b29,0x82a79b29,0x18a27287,0x728718a2,0x82a782a7,0x92c792e8,0x31658ae8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce79ce59,0xe71ce71c,0xd6bad69a,0xe73cef5d,0xce79ce59,0xe73cd69a,0xbdd7bdd7,0xe73cd6ba,0x00000a2d,0x000022d0,0x2b310000,0x00000000,0x00000000,0x00001aaf,0x1aaf0000,0x1aaf0000,0xe79effff,0xefffe79e,0xefffefff,0xe79ee79e,0xe79ee79e,0xffffe79e,0xefffefff,0xe79ee79e,0x755f755f,0x755f755f,0x755f755f,0x755f8dff,0x755f755f,0x755f755f,0x755fffff,0x755f755f, +0x7aa79369,0x93697aa7,0xbc2b9369,0x93697aa7,0x93696b6d,0x7aa79369,0x936959e5,0x59e57aa7,0x0b030000,0x14031444,0x0b431444,0x14241403,0x00000b43,0x00000b43,0x14030b43,0x00000000,0x0a020000,0x0ba31424,0x146413e4,0x0b030ba3,0x13e30a02,0x13a31464,0x0b031464,0x000009c2,0x0b030000,0xd6b3def3,0xdef4def4,0xdef3def3,0xdef4def4,0xdef4def4,0xdef3d6b3,0x00000b03, +0xa5379cf5,0x94d5a556,0x9d15a536,0x9d15a536,0xa536a536,0xadb89d35,0x9d159d15,0x94b49d15,0xaece0000,0x0000854b,0x854b0000,0x00006c28,0xaece7605,0x0000854b,0xaece0000,0x0000854b,0x82873165,0x92c74143,0x92c84143,0x92c74143,0x92c74143,0x92c74143,0x92c84143,0x31658287,0x82873165,0x92c792c7,0x92c892c8,0x18a27287,0x728718a2,0x92c792c7,0x92c892c8,0x31658287, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xf79ef79e,0xef5def5d,0xf79effff,0xe73cef5d,0xef7df79e,0xe71cd6ba,0xdefbe73c,0xdefbce59,0x1aaf0947,0x1aaf1188,0x21e91aaf,0x1a8f0a2d,0x1a8f2b52,0x1aaf220a,0x220a124e,0x11882b11,0xffffffff,0xe79effff,0xefffefff,0xefffefff,0xefffefff,0xffffe79e,0xefffffff,0xe79eefff,0x755f755f,0x755f755f,0x755f755f,0xffff755f,0x755f755f,0x755f755f,0xffff755f,0x755f755f, +0x93699369,0xbc2b7aa7,0x7aa7bc2b,0x9369bc2b,0xbc2b59e5,0x7aa7bc2b,0x93699369,0x7aa78430,0x00000000,0x14030aa2,0x14031424,0x14441403,0x0b431403,0x0b4313e3,0x14031444,0x00000b03,0x0a020000,0x0ba31424,0x14641403,0x09c20b02,0x13e30a02,0x0ba31464,0x0aa21464,0x00000000,0x0b030000,0xd6b3def3,0xdef3def4,0xdef3def3,0xdef3def3,0xdef4def3,0xdef3d6d4,0x00000b03, +0xa536a536,0xa5378c73,0xa55794f4,0x9d169d35,0xad77ad77,0x9d15a556,0x9d159d36,0x9d369d15,0xaece0000,0x0000854b,0xe77b7605,0x0000960c,0xaece9766,0x0000854b,0x854b0000,0x00006c28,0x82a83165,0x92e859c5,0x9b2959e5,0x82a75184,0x82a75184,0x92e859c5,0x92e859c5,0x316582a8,0x82a83165,0x92e892e8,0x9b299b29,0x18a27287,0x728718a2,0x92e892e8,0x92e892e8,0x316582a8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdedbd69a,0xef7dd6ba,0xbdf7bdd7,0xe71cdedb,0xe73cce79,0xffffffff,0xe73cdedb,0xffdfffff,0x00001aaf,0x00001aaf,0x22f00000,0x00000000,0x00000000,0x0000126e,0x126e0000,0x1aaf0000,0xefffefff,0xffffefff,0xffffffff,0xefffffff,0xefffefff,0xe79eefff,0xe79effff,0xe79ee79e,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755fffff,0x755f755f,0x755f755f,0x755f755f, +0x93699369,0x7aa759e5,0x59e57aa7,0x7aa759e5,0x7aa77aa7,0x7aa77aa7,0xbc2bbc2b,0x93697aa7,0x0b030000,0x14031444,0x14240b43,0x00000b43,0x14030b43,0x14241403,0x14030b43,0x00000b03,0x0a020000,0x13a31464,0x146413e4,0x00000aa2,0x0b830a02,0x0ba31464,0x0ba31464,0x00000b03,0x0b030000,0xd6b3ded3,0xdef3def3,0xd6b3d6b3,0xd6b3d6b3,0xdef4def3,0xdef3d6b3,0x00000b03, +0x8c9394d4,0x9d35a536,0xa5369d35,0x9d15a557,0xa5369d36,0xad77a536,0xa5369d36,0xa57694d4,0x854b7605,0x00006c28,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xe77b0000,0x0000960c,0x72873165,0x394382a7,0x498482a7,0x416492e8,0x394382a7,0x414382a7,0x39439b29,0x31657287,0x72873165,0x82a782a7,0x9b2982a7,0x18a27287,0x728718a2,0x92c782a7,0x82a79b29,0x31657287, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe73cef5d,0xd69ac618,0xe73cf79e,0xd6bace79,0xd6bad69a,0xc618d69a,0xdedbdefb,0xc638c638,0x000022f0,0x00001aaf,0x1aaf0000,0x00000000,0x00000000,0x00001aaf,0x1aaf0000,0x1aaf0000,0xefffffff,0xefffefff,0xe79ee79e,0xe79ee79e,0xffffffff,0xe79effff,0xffffffff,0xe79eefff,0x8dff755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0x7aa79369,0x93697aa7,0x93697aa7,0x59e57aa7,0x93697aa7,0x7aa79369,0x7aa77aa7,0x7aa759e5,0x0b030000,0x0b431444,0x0b430000,0x0b4313e3,0x14031403,0x0b431403,0x0b430000,0x00000000,0x0a020000,0x0ba31464,0x0ba31403,0x0b031403,0x0b230141,0x13a31444,0x0ba31403,0x00000b03,0x0b030000,0xd6d4def3,0xdef3def4,0xdef4d6b3,0xd6b3def4,0xdef4def3,0xdef3d6b3,0x00000b03, +0xa536a536,0xa557a557,0x9d15a536,0xa536a557,0xadd9ad77,0xa53694d4,0x9d169d15,0x9d369d15,0xe77b9766,0x0000960c,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x8ae83165,0x59e59b29,0x59a49b29,0x59e582a7,0x59c59b29,0x59c592e8,0x59e59b29,0x31658ae8,0x8ae83165,0x9b299b29,0x92c79b29,0x18a27287,0x728718a2,0x92e892e8,0x9b299b29,0x31658ae8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd69ad69a,0xffffffff,0xe73cef5d,0xf79ef79e,0xd69ace59,0xf79eef5d,0xe73ce73c,0xf79ef79e,0x00001aaf,0x00001aaf,0x1aaf0000,0x00000000,0x00000000,0x00001aaf,0x22d00000,0x124e0000,0xffffffff,0xefffefff,0xefffefff,0xe79eefff,0xffffffff,0xe79ee79e,0xefffffff,0xe79eefff,0x755f755f,0x755f8dff,0x755f755f,0x755f8dff,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0x7aa7bc2b,0xbc2bbc2b,0x93699369,0x7aa77aa7,0x59e59369,0x93699369,0x7aa77aa7,0x93699369,0x00000000,0x14030aa2,0x14840b43,0x14031444,0x0b431444,0x14241403,0x14030b43,0x00000141,0x0a020000,0x13a31464,0x13a31403,0x0b031464,0x0a820000,0x0bc31424,0x0b221424,0x000009c2,0x0b030000,0xd6b3def3,0xdef3def4,0xdef4d6b3,0xd6b3def4,0xdef3def3,0xdef3d6b3,0x00000b03, +0x9d159d36,0x9d35a557,0x9d159d36,0xadb7a556,0x9cf5a536,0x9d159d15,0xa536a536,0xa5579d15,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x7605854b,0x82873165,0x92c84143,0x92c84143,0x92c74143,0x92c74143,0x92c84143,0x92c84143,0x31658287,0x82873165,0x92c892c8,0x92c892c8,0x18a27287,0x728718a2,0x92c892c8,0x92c892c8,0x31658287, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xffffffff,0xef5def7d,0xdefbdefb,0xe71cdedb,0xffffef7d,0xdedbe73c,0xffffffff,0xe71cef5d,0x00001aaf,0x0000020d,0x1a8f0000,0x00000000,0x00000000,0x00001aaf,0x01ab0000,0x1aaf0000,0xe79effff,0xe79ee79e,0xefffffff,0xffffe79e,0xe79ee79e,0xffffe79e,0xefffefff,0xe79ee79e,0x755f755f,0x755f755f,0x755f755f,0x8dff755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0x59e5bc2b,0x7aa77aa7,0x7aa78430,0xbc2b7aa7,0x7aa7bc2b,0xbc2bbc2b,0x93697aa7,0x93697aa7,0x01410000,0x14840ba3,0x14441403,0x14031424,0x00000b43,0x140313e3,0x14031403,0x00000b03,0x00000000,0x0bc313a3,0x13e31403,0x0b0313e4,0x13a30a02,0x13e31424,0x0aa21424,0x00000000,0x0b030000,0xd6b3def3,0xdef3def4,0xd6d4d6b3,0xd6b3d6b3,0xdef3def3,0xdef3d6b3,0x00000b03, +0xa53694d4,0x9d369cf5,0xa55694d4,0x9d159d15,0x9d159d15,0xadb8a557,0xa557a536,0x9d16a536,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x854b0000,0x00006c28,0xaece0000,0x9766854b,0x8ae83165,0x92e859e5,0x9b2959e5,0x82a759e5,0x82a75184,0x9b2959a4,0x9b2959e5,0x31658ae8,0x8ae83165,0x92e89b29,0x9b299b29,0x18a27287,0x728718a2,0x9b2992c7,0x9b299b29,0x31658ae8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xbdd7c618,0xf79ece79,0xb5b6ce79,0xd69ace59,0xb5b6ce79,0xd6bad69a,0xd69ac618,0xd6bace59,0x1aaf220a,0x22d0220a,0x326c1aaf,0x1aaf1aaf,0x22f01aaf,0x22f0220a,0x220a1aaf,0x220a1aaf,0xefffefff,0xefffefff,0xffffe79e,0xffffffff,0xefffe79e,0xe79ee79e,0xefffefff,0xe79eefff,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755fffff,0x755f755f,0x755f8dff,0x755f755f, +0x59e57aa7,0x93699369,0x93697aa7,0x59e559e5,0x7aa759e5,0x59e57aa7,0x7aa77aa7,0xbc2b7aa7,0x0b030000,0x0b431403,0x0b430000,0x140313e3,0x140313e3,0x14241444,0x0aa21444,0x00000000,0x0a020000,0x14030b43,0x13e413e4,0x0b0313e4,0x13a30a02,0x14441403,0x0ba31424,0x00000b03,0x0b030000,0xd6b3def3,0xdef3def4,0xdef3def3,0xdef3def3,0xdef4def3,0xdef3d6b3,0x00000b03, +0xa5369cf5,0xadda9d15,0xa5769d15,0xa536a536,0xad779d15,0x94d4a536,0x9d159d15,0x94d49d36,0xaece0000,0x0000854b,0x854b0000,0x00006c28,0xe77b0000,0x0000960c,0xaece0000,0x0000854b,0x72873165,0x416492c7,0x416492e8,0x39439b29,0x416492e8,0x416492e8,0x394382a7,0x31657287,0x72873165,0x92e892c7,0x92e892e8,0x18a27287,0x728718a2,0x92e892e8,0x82a782a7,0x31657287, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdedbe73c,0xdefbce79,0xef5def5d,0xb5b6bdf7,0xe71cd69a,0xc638d69a,0xef5def5d,0xbdf7ce59,0x00001aaf,0x00001aaf,0x1aaf0000,0x00000000,0x00000000,0x00001aaf,0x1aaf0000,0x0a0d0000,0xffffffff,0xefffefff,0xffffefff,0xffffe79e,0xefffefff,0xffffe79e,0xefffffff,0xe79eefff,0xffff755f,0x755f755f,0x755f755f,0x755f755f,0xffff755f,0x755f755f,0x8dff755f,0x755f755f, +0x7aa79369,0xbc2b9369,0x936959e5,0x7aa77aa7,0x59e559e5,0x6b6d59e5,0x93697aa7,0x7aa759e5,0x01410000,0x14031424,0x14440b43,0x0b431444,0x14031444,0x0b431444,0x14031444,0x00000b03,0x0a020000,0x14030ba3,0x142413e4,0x0b031403,0x0b230141,0x14641403,0x13a31464,0x00000b03,0x0b030000,0xd6d4def3,0xdef4def3,0xdef4def4,0xdef4def3,0xdef4def3,0xdef3d6b3,0x00000b03, +0x9d15a556,0x9d15a557,0xa557a557,0xa557a537,0x9cf5a557,0xa5579d15,0x94d49d16,0x94f5a536,0xaece0000,0x0000854b,0xe77b0000,0x7605960c,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x72873165,0x518482a7,0x59e582a7,0x51849b29,0x51849b29,0x59a482a7,0x59c592e8,0x316582a8,0x72873165,0x82a782a7,0x9b2982a7,0x18a27287,0x728718a2,0x92c782a7,0x92e892e8,0x316582a8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd69adefb,0xf79eef5d,0xd6bad6ba,0xf79edefb,0xdedbce79,0xf79ef79e,0xd69adefb,0xf79effff,0x00001aaf,0x00001aaf,0x22f00000,0x00000000,0x00000000,0x000022f0,0x1aaf0000,0x22d00000,0xe79effff,0xe79ee79e,0xffffffff,0xffffe79e,0xefffffff,0xe79eefff,0xffffffff,0xe79eefff,0x755f755f,0x755fffff,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f8dff, +0x6b6d59e5,0x59e559e5,0x59e5ffff,0x59e559e5,0x59e5ffff,0x59e5efff,0x59e57aa7,0x7aa759e5,0x00000000,0x14a40aa2,0x14241403,0x00000b43,0x14030b43,0x00000b43,0x14030b43,0x00000b03,0x01410000,0x13e30b23,0x14240ba3,0x0b0313a3,0x0aa20000,0x146413e4,0x0ba31464,0x00000b03,0x0b030000,0xd6b3def3,0xd6b3d6b3,0xd6b3d6b3,0xd6b3d6b3,0xd6b3d6b3,0xdef3d6d4,0x00000b03, +0x9d159cf5,0xa5369d15,0xa5369d15,0x9d159d15,0x9d159d15,0xa5569d35,0x9d359d36,0x94d49d36,0xaece0000,0x7605854b,0xaece0000,0x9766854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x82873165,0x92c74143,0x92c74143,0x92c74143,0x92c74143,0x92c84143,0x92c84143,0x31658287,0x82873165,0x92c792c8,0x92c792c7,0x18a27287,0x728718a2,0x92c892c8,0x92c892c8,0x31658287, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xf79eef7d,0xdedbd6ba,0xf79ef7be,0xd6bae71c,0xf79eef5d,0xe73ce73c,0xffffffdf,0xe73cef5d,0x1aaf19a9,0x1aaf220a,0x3acd128f,0x1aaf1a8f,0x1aaf124e,0x1a8f11a8,0x21ea1aaf,0x220a01cc,0xffffefff,0xe79eefff,0xefffe79e,0xe79eefff,0xefffffff,0xe79eefff,0xffffffff,0xefffefff,0x755f755f,0xffff755f,0x755f755f,0x755f8dff,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0x59e5efff,0xe79eefff,0x59e5e79e,0x59e5efff,0xefffffff,0xe79eefff,0xffff59e5,0x59e5efff,0x0b030000,0x0aa21424,0x13e31403,0x0aa213e3,0x14031464,0x0b431444,0x14031424,0x00000b03,0x00000000,0x13e30b43,0x14640ba3,0x09c20b03,0x13a30a02,0x142413e4,0x0ac21424,0x00000000,0x0b030000,0xded3def3,0xdef3def3,0xdef3def3,0xdef3ded3,0xdef3def3,0xdef3def4,0x00000b03, +0xad77a536,0x9d15ad98,0x9d159d15,0x9d369d36,0xa556a536,0xa557a557,0x9d1594f4,0xad989d15,0xaece0000,0x9766854b,0xaece0000,0x0000854b,0xaece0000,0x7605854b,0x854b0000,0x00006c28,0x8ae83165,0x82a75184,0x82a75184,0x92e859c5,0x9b2959e5,0x92e859e5,0x9b2959a4,0x31658ae8,0x8ae83165,0x82a782a7,0x82a782a7,0x728792e8,0x9b297287,0x92e89b29,0x9b2992c7,0x31658ae8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe73cdefb,0xffffffdf,0xef5def7d,0xd6badedb,0xc618ce59,0xd6bad69a,0xc618b596,0xdedbd69a,0x00001aaf,0x00001aaf,0x1aaf0000,0x00000000,0x00000000,0x00001aaf,0x1aaf0000,0x126e0000,0xffffffff,0xefffffff,0xefffefff,0xe79eefff,0xffffe79e,0xefffefff,0xffffe79e,0xe79effff,0x755f755f,0x755f755f,0x755f755f,0x8dff755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0xffffffff,0xefffffff,0x59e5efff,0xe79eefff,0xffffe79e,0xefffefff,0xffffe79e,0xe79effff,0x0b030000,0x00000b03,0x0b030141,0x00000141,0x0b030b03,0x00000b03,0x0b030141,0x00000b03,0x0a020000,0x140313e3,0x14640b83,0x00000aa2,0x13a30a02,0x146413e4,0x14031424,0x00000b03,0x0b030000,0x0b030b03,0x0b030b03,0x0b030b03,0x0b030b03,0x0b030b03,0x0b030b03,0x00000b03, +0x9d35a536,0xa557a536,0x9d1594b4,0x9d159d15,0xa55794d4,0xa536add9,0x9d359d15,0xa5769d15,0x854b0000,0x00006c28,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xe77b0000,0x0000960c,0x7aa83165,0x828782a8,0x82a882a8,0x72877287,0x72877287,0x82a87287,0x82a87287,0x31657aa8,0x7aa83165,0x828782a8,0x82a882a8,0x72877287,0x72877287,0x82a87287,0x82a87287,0x31657aa8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd69ace59,0xce59c638,0xef5ddefb,0xd69ace79,0xef5de73c,0xce59bdf7,0xe71ce71c,0xc618ce59,0x1aaf21ea,0x1aaf220a,0x2a6b0a2d,0x01cc22f0,0x1aaf128f,0x1aaf220a,0x3aed22d0,0x220a1aaf,0xffffffff,0xefffffff,0xffffffff,0xffffefff,0xffffffff,0xefffefff,0xe79ee79e,0xffffffff,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0xffffffff,0xefffffff,0xffffffff,0xffffefff,0xffffffff,0xefffefff,0xe79ee79e,0xffffffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x0a020000,0x14031403,0x14031464,0x0b031464,0x13e40a02,0x142413e4,0x14031424,0x00000b03,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa5368452,0x9d36a536,0x9d369d15,0x9d359d15,0xa536a556,0x9d159d15,0x9d159d15,0x9d3594f5,0xe77b0000,0x0000960c,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x31652924,0x31653165,0x31653165,0x31653165,0x31653165,0x31653165,0x31653165,0x21043165,0x31652924,0x31653165,0x31653165,0x31653165,0x31653165,0x31653165,0x31653165,0x21043165, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0xbde6e70b,0xce68b5a5,0xce68b5a5,0xce68d6a9,0xef4affed,0xd689deea,0xce68e729,0xce68ce68,0xb6bbc7bf,0xb6bbb6bb,0xb6bbb6bb,0x00000000,0xb6bbb6bb,0xb6bb0000,0xb6bbb6bb,0xc7bfb6bb,0x73ae73ae,0x73ae73ae,0x8c716b4d,0x7bef8c71,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x7bef7bef,0x73ae73ae,0x73ae73ae,0x8c716b4d,0x7bef8c71,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x7bef7bef, +0x0000a514,0x00000000,0x9cd30000,0x528a0000,0xad75ad55,0x0000528a,0x8c710000,0xad7552aa,0x2965a514,0x29652965,0x9cd32965,0x528a2965,0xad75ad55,0x2965528a,0x8c712965,0xad7552aa,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232103,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232103,0x20e22923,0x72e718a1,0x7b0772e7,0x6aa66aa6,0x18a17b07,0x72e718a1,0x6aa672e7,0x6aa649e4,0x18a16aa6, +0x72e718a1,0x7b0772e7,0x6aa66aa6,0x18a17b07,0x72e718a1,0x6aa672e7,0x6aa649e4,0x18a16aa6,0xdedb8410,0xf8003186,0xf800fd00,0xffe0fd00,0xfd00f800,0xfd00ffe0,0xef5df800,0x31869cd3,0x31a639c7,0x318631a6,0x29653186,0x29652965,0x39c72124,0x31a639c7,0x21242965,0x318631a6,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xc627ce68,0xef6cbdc6,0xb5a5e729,0xce68deea,0x63006300,0xce48e729,0xe7296300,0xc627ce68,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xc7bf0000,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x8c718c71,0x73ae7bef,0x7bef73ae,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x8c718c71,0x73ae7bef,0x7bef73ae, +0x0000632c,0x5acb0000,0x84305aeb,0x00000000,0x632c0000,0x94b2528a,0xb5960000,0x5acb9492,0x2965632c,0x5acb2965,0x84305aeb,0x29652965,0x632c2965,0x94b2528a,0xb5962965,0x5acb9492,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x936541e6,0x7ae47ae4,0x93657ae4,0x7ae49365,0x93659365,0x93257ae4,0x93659365,0x7ae49365,0x93659365,0x7ae47ae4,0x93657ae4,0x7ae49365,0x93659365,0x93257ae4,0x93659365,0x29238305,0xbccc18a1,0x7ac69c29,0xbccc9c29,0x2102bccc,0xbccc2922,0xb48b9c29,0xbcccbccc,0x18a1bccc, +0xbccc18a1,0x7ac69c29,0xbccc9c29,0x2102bccc,0xbccc2922,0xb48b9c29,0xbcccbccc,0x18a1bccc,0xe71c8c51,0xfd0039e7,0xffe0ffe0,0xfd00ffe0,0xffe0fd00,0xfd00ffe0,0xef7dfd00,0x2965ad55,0x6b6d39c7,0x630c5acb,0x52aa4228,0x738e738e,0x630c4a69,0x630c632c,0x422852aa,0x318652aa,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe729e729,0x6b40d689,0xe7296300,0x39e0c627,0x63006300,0xd6895280,0xce68ce68,0xce68ce68,0x0000c7bf,0x00000000,0x00000000,0x00000000,0x00000000,0x0000c7bf,0x00000000,0xb6bb0000,0x8c717bef,0xc73f73ae,0x7bef5f7e,0x73ae7bef,0x5f7e73ae,0x73ae5f7e,0x7bef7bef,0x8c718c71,0x8c717bef,0xf80073ae,0x7bef8800,0x73ae7bef,0x880073ae,0x73ae8800,0x7bef7bef,0x8c718c71, +0x00009492,0x94925acb,0xa5340000,0x00008c51,0x528a0000,0x94b20000,0xad754a69,0x0000ad55,0x29659492,0x94925acb,0xa5342965,0x29658c51,0x528a2965,0x94b22965,0xad754a69,0x2965ad55,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b4341e6,0xabc5a363,0xabc5abc5,0x8b43abc5,0xa384abc5,0x8b43a384,0x8b438b43,0x8b43abc5,0xa384abc5,0xabc5a363,0xabc5abc5,0x8b43abc5,0xa384abc5,0x8b43a384,0x8b438b43,0x29237ae4,0x9c2918a1,0xa38772e7,0xbcccbccc,0x2102bccc,0xb48b2922,0x9c29b48b,0x9c299c29,0x18a19c29, +0x9c2918a1,0xa38772e7,0xbcccbccc,0x2102bccc,0xb48b2922,0x9c29b48b,0x62869c29,0x18a16286,0xdefb8c51,0xf80039e7,0xfd00fd00,0xf800fd00,0xfd00ffe0,0xf800f800,0xef7df800,0x3186a514,0x630c3186,0x9492738e,0x94928c71,0x5acb6b4d,0x9cf36b6d,0x7bcf8c51,0x7bcf8410,0x2104630c,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xf78b6300,0x39c0ce48,0xd68918e0,0xc627ce68,0x294039c0,0xce68d6a9,0xad64d6a9,0xe7296300,0xc7bf0000,0x00000000,0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0xb6bb0000,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x73ae73ae,0xffffc73f,0x767fc73f,0x5f7e767f,0x7bef73ae,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x73ae73ae,0xf800a820,0x9000a820,0x88009000,0x7bef73ae, +0x00008c51,0x9cd3b596,0xad750000,0x0000b596,0x8c510000,0x94b20000,0x00009492,0xa5344a69,0x29658c51,0x9cd3b596,0xad752965,0x2965b596,0x8c512965,0x94b22965,0x29659492,0xa5344a69,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0xabc5abc5,0x8b43abc5,0x8b43abc5,0x8b438b43,0x8b438b43,0xa363a384,0x8b43abc5,0x8b438b43,0xabc5abc5,0x8b43abc5,0x8b43abc5,0x8b438b43,0x8b438b43,0xa363a384,0x29239365,0xbccc18a1,0xa387bccc,0x9c29bccc,0x18a1bccc,0x9c292102,0x9c299c29,0x72e79b47,0x18a1bccc, +0xbccc18a1,0xa387bccc,0x9c29bccc,0x18a1bccc,0x9c292102,0x9c299c29,0xffff9b47,0x18a172e7,0xc6188c51,0x39e7e71c,0xc800c800,0xc800fd00,0xf800fd00,0xc800c800,0xef7d4208,0x2965ad55,0x5acb2945,0x5acb5acb,0x5acb5acb,0x7bcf6b6d,0x5acb630c,0x8c519492,0x7bcf7bcf,0x212439c7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd6a818e0,0xce68ce68,0xce68ce68,0xd6a9d6a7,0xce68ce68,0x1080ce68,0xce68ce68,0xce68e729,0x0000ffff,0x00000000,0x00000000,0x0000c7bf,0x00000000,0x00000000,0x0000ffff,0xb6bb0000,0x7bef6b4d,0x7bef7bef,0x7bef73ae,0x7bef7bef,0x8c718c71,0xc73f7bef,0x8c715f7e,0x6b4d8c71,0x7bef6b4d,0x7bef7bef,0x7bef73ae,0x7bef7bef,0x8c718c71,0xf8007bef,0x8c718800,0x6b4d8c71, +0x0000ad75,0xb5b6ad75,0x00000000,0x00000000,0x9cd3ad75,0xad550000,0x00008430,0xad55528a,0x2965ad75,0xb5b6ad75,0x29652965,0x29652965,0x9cd3ad75,0xad552965,0x29658430,0xad55528a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa34441e5,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0x29238b04,0x6aa618a1,0x72e772e7,0x6aa66aa6,0x10616aa6,0x72e718a1,0x72e772e7,0x6aa641a4,0x18a16aa6, +0x6aa618a1,0x72e772e7,0x41a341a3,0x10616aa6,0x72e718a1,0x72e772e7,0xb5b62902,0x18a141a3,0xad554a49,0xdefbd6ba,0x39c739e7,0xc800f800,0xc800f800,0x39e739e7,0xd6badefb,0x3186a534,0x738e39c7,0x7bcf8c51,0x5acb738e,0x7bcf7bcf,0x7bcf8410,0x632c5acb,0x6b4d8c71,0x2124738e,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd6a9ce68,0xe729ce68,0xc627ce68,0xd68918c0,0xdeeaef6c,0xe729ef4a,0xffedce68,0xce4652a0,0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0x00000000,0xffff0000,0x00000000,0x7bef7bef,0x73ae8c71,0x8c71767f,0x73ae8c71,0x73ae6b4d,0x8c718c71,0x7bef8c71,0x7bef7bef,0x7bef7bef,0x73ae8c71,0x8c719000,0x73ae8c71,0x73ae6b4d,0x8c718c71,0x7bef8c71,0x7bef7bef, +0x00005aeb,0x00000000,0x4a490000,0x00005acb,0xad55ad55,0x00000000,0x9cd35acb,0x00000000,0x29655aeb,0x29652965,0x4a492965,0x29655acb,0xad55ad55,0x29652965,0x9cd35acb,0x29652965,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa38441e6,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xa384a384,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xa384a384,0x29239325,0xb48b18a1,0xb48bb48b,0xbcccbccc,0x18a19c29,0x9c292102,0xb48bb48b,0xb48b9b47,0x18a1b48b, +0xb48b18a1,0x72c772c7,0x72e7b5b6,0x18a19c29,0x9c292102,0xb48bb48b,0xb5b6dedb,0x18a172c7,0x7bcf4a49,0xdedbce59,0xe71cef7d,0x42084208,0x420839e7,0xef7de71c,0xc638d69a,0x31867bcf,0x528a2965,0x7bcf73ae,0x52aa7bcf,0x84109492,0x7bcf7bcf,0x5acb7bef,0x6b4d6b4d,0x29456b4d,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce68ce68,0x39c0ce68,0xce68ce68,0xd689deea,0x6300ce68,0x63005280,0x39c0e729,0x6b416b41,0x0000ffff,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x73ae7bef,0x73ae73ae,0x73ae73ae,0xc73f73ae,0x5f7e5f7e,0x73ae5f7e,0x73ae73ae,0x7bef8c71,0x73ae7bef,0x73ae73ae,0x73ae73ae,0xa82073ae,0x88008800,0x73ae8800,0x73ae73ae,0x7bef8c71, +0x4a698c71,0x5acb0000,0x00008c71,0x00009cd3,0x000052aa,0x000094b2,0xad7552aa,0x00009492,0x4a698c71,0x5acb2965,0x29658c71,0x29659cd3,0x296552aa,0x296594b2,0xad7552aa,0x29659492,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b4341c5,0x8b438b43,0xabc58b43,0xa384a384,0x8b438b43,0xa3638b43,0x8b43abc5,0xa384a384,0x8b438b43,0x8b438b43,0xabc58b43,0xa384a384,0x8b438b43,0xa3638b43,0x8b43abc5,0x29237ae4,0x9c2918a1,0xb5b69c29,0xb5b66286,0x290272c7,0x9c292102,0x72e79c29,0x9c29bccc,0x18a19c29, +0x9c2918a1,0xdedbb5b6,0x72e7b5b6,0x2902b48b,0x9c292102,0x72e79c29,0xb5b6ffff,0x18a16286,0x8c714a49,0xdedbc638,0xe73cdedb,0xf79ef79e,0xf79ef79e,0xdedbe73c,0xc638dedb,0x39e78c71,0x528a2945,0x94929492,0x5acb7bef,0x738e9492,0x841094b2,0x6b4d8410,0x94b26b4d,0x3186528a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe729ce68,0xd689dec8,0xce68d689,0x39c0c607,0x39c0e729,0x39c039c0,0xce68b5a5,0xce6839c0,0xc7bfffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xb6bb0000,0xc73f7bef,0x6b4d767f,0x73ae8c71,0x7bef7bef,0xc73fffff,0x8c718c71,0x8c718c71,0x8c718c71,0xf8007bef,0x6b4d9000,0x73ae8c71,0x7bef7bef,0xa820f800,0x8c718c71,0x8c718c71,0x8c718c71, +0x8c71bdd7,0x9cd30000,0x52aa94b2,0x949294b2,0x94b20000,0x00009492,0xbdd70000,0x52aa9cf3,0x8c71bdd7,0x9cd32965,0x52aa94b2,0x949294b2,0x94b22965,0x29659492,0xbdd72965,0x52aa9cf3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0xabc5abc5,0xa363abc5,0xabc58b43,0xa384abc5,0xa384a384,0xabc5abc5,0xabc58b43,0xa384abc5,0xabc5abc5,0xa363abc5,0xabc58b43,0xa384abc5,0xa384a384,0xabc5abc5,0x29239365,0xbccc18a1,0xdedbbccc,0xdedb72e7,0x29226286,0xb48b2922,0xb48bb48b,0xbcccbccc,0x18a1bccc, +0xbccc18a1,0x28e1bccc,0x72e7b5b6,0x29229c29,0xb48b2922,0x72c7b48b,0xb5b6dedb,0x18a172e7,0x42282965,0x84107bcf,0x8c715aeb,0x94b28c71,0x94929492,0x4a698c71,0x5aeb73ae,0x39c77bcf,0x42282965,0x8c51738e,0x738ea514,0x94b26b6d,0x84309492,0x632c738e,0x4a495aeb,0x39c77bcf,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x6b40bde6,0xd689e729,0xdecae729,0xce48c607,0xce68ce68,0xb585d6a9,0xce689ce2,0xce68deca,0x0000ffff,0x0000c7bf,0x00000000,0x0000c7bf,0x00000000,0x00000000,0x00000000,0xb6bb0000,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x6b4d73ae,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x6b4d73ae,0x73ae73ae,0x73ae73ae,0x7bef7bef, +0xb5b6a514,0xa5340000,0x5acbb5b6,0x9492ad75,0xad550000,0x528abdd7,0x528a0000,0x630c0000,0xb5b6a514,0xa5342965,0x5acbb5b6,0x9492ad75,0xad552965,0x528abdd7,0x528a2965,0x630c2965,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x930441e5,0x8b048b04,0x8b048b04,0x93048b04,0x93049304,0x8b048b04,0x8b048b04,0x93048b04,0x93049304,0x8b048b04,0x8b048b04,0x93048b04,0x93049304,0x8b048b04,0x8b048b04,0x292382c4,0x72e718a1,0x6aa66aa6,0x6aa6dedb,0x18a16aa6,0x72e718a1,0x41a46aa6,0x6aa66aa6,0x18a172e7, +0x72e718a1,0x28e16aa6,0x6aa66aa6,0x18a16aa6,0x72e718a1,0xffff6aa6,0xb5b6dedb,0x18a141c4,0x5aeb2965,0x21245acb,0xb5b6738e,0xad55ad55,0xa534ad55,0x6b4da534,0x5acbad55,0x39c7528a,0x5aeb2965,0x632c5acb,0x8c718c71,0x632c6b4d,0x5acb6b4d,0x7bef5acb,0x5acb8430,0x39c7528a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x39c0deea,0xef4cce68,0xce686300,0xce68ce68,0xd689e729,0xb5a5ce68,0xe729ffcc,0xce68ce68,0x00000000,0x00000000,0x00000000,0xc7bf0000,0x00000000,0x00000000,0x00000000,0xb6bb0000,0x8c718c71,0xffff7bef,0x767fc73f,0x5f7e767f,0x7bef7bef,0x5f7e767f,0x8c718c71,0x6b4d8c71,0x8c718c71,0xb8207bef,0x9000a820,0x88009000,0x7bef7bef,0x88009000,0x8c718c71,0x6b4d8c71, +0x94b2528a,0x528a0000,0x00005acb,0xa534a514,0x00000000,0x0000632c,0x528a0000,0x5aeb5acb,0x94b2528a,0x528a2965,0x29655acb,0xa534a514,0x29652965,0x2965632c,0x528a2965,0x5aeb5acb,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x72c641e6,0x72a572c6,0x72c672c6,0x6a8572c6,0x6a856a85,0x72c672a5,0x72c672c6,0x6a8572c6,0x6a856a85,0x72a572c6,0x72c672c6,0x6a8572c6,0x6a856a85,0x72c672a5,0x72c672c6,0x292372c6,0xbccc18a1,0x28e1bccc,0x28e172e7,0x210272e7,0x9c292102,0xbccc49e4,0xbcccbccc,0x18a1bccc, +0xbccc18a1,0x28e1bccc,0xbcccbccc,0x2102bccc,0x9c292102,0xdedb49e4,0xb5b6dedb,0x18a172e7,0x630c3186,0x29457bef,0x08610000,0x10820861,0x10821082,0x000010a2,0x8430a534,0x2104630c,0x630c3186,0x6b6d7bef,0x5acb73ae,0x7bcf6b4d,0x8430738e,0x7bef8c71,0x84308410,0x2104630c,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xbdc6ce68,0xce68ce68,0xbde6e729,0xd689ce68,0xce682120,0xce68d6a9,0xdeca6300,0xce68d6a9,0x0000ffff,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x0000c7bf,0x00000000,0x73ae73ae,0x7bef7bef,0xffff7bef,0x73aec73f,0x6b4d7bef,0xc73fffff,0x73ae73ae,0x7bef6b4d,0x73ae73ae,0x7bef7bef,0xf8007bef,0x73aea820,0x6b4d7bef,0xa820f800,0x73ae73ae,0x7bef6b4d, +0xb5960000,0x00008430,0x8c714a69,0x00005aeb,0x9cd3528a,0x52aa0000,0x5acb0000,0x84300000,0xb5962965,0x29658430,0x8c714a69,0x29655aeb,0x9cd3528a,0x52aa2965,0x5acb2965,0x84302965,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x316441c5,0x31843164,0x31843184,0x31643184,0x31843184,0x31843184,0x31643164,0x31643184,0x31843184,0x31843164,0x31843184,0x31643184,0x31843184,0x31843184,0x31643164,0x18e23164,0x9c2918a1,0x28e172e7,0x28e1b48b,0x2102bccc,0xb48b2902,0xb48b9b47,0x9c299c29,0x18a19c29, +0x9c2918a1,0x28e172e7,0xb48bb48b,0x2102bccc,0xb48b2902,0x28e19b47,0x28e128e1,0x18a16286,0x5acb2945,0x29457bef,0x00000000,0x00000000,0x00000000,0x00000000,0x6b4da514,0x212439c7,0x5acb2945,0x6b6d7bef,0x7bef7bef,0x5acb7bcf,0x94929492,0x84107bef,0x6b4d7bcf,0x212439c7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce68ce68,0x6300ce68,0xce686300,0xc607a523,0xbde6ce68,0xce68ce68,0xce68e729,0xce68ffef,0xffffffff,0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0xc7bf0000,0xb6bb0000,0x8c717bef,0x73ae8c71,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x8c718c71,0x6b4d8c71,0x8c717bef,0x73ae8c71,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x8c718c71,0x6b4d8c71, +0xa5140000,0x0000a514,0xa5340000,0x0000528a,0x8c719cd3,0x00000000,0x00008c71,0x8c519492,0xa5142965,0x2965a514,0xa5342965,0x2965528a,0x8c719cd3,0x29652965,0x29658c71,0x8c519492,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x7ae441e6,0x7ae47ae4,0x93657ae4,0x7ae49365,0x7ae49365,0x93047ae4,0x93259325,0x7ae49365,0x7ae49365,0x7ae47ae4,0x93657ae4,0x7ae49365,0x7ae49365,0x93047ae4,0x93259325,0x29239325,0x9c2918a1,0x7ac69c29,0xbccc9c29,0x2102bccc,0x9c292922,0x72e77ac6,0xb48bb48b,0x18a1b48b, +0x9c2918a1,0x7ac69c29,0xbccc9c29,0x2102bccc,0x9c292922,0x28e17ac6,0x28e172c7,0x18a172c7,0x738e39c7,0x4a697bcf,0x000031a6,0x00000000,0x00000000,0x31a60000,0x8430528a,0x2124738e,0x738e39c7,0x6b4d7bcf,0x7bcf8c71,0x5acb7bcf,0x8c516b4d,0x94b294b2,0x8430738e,0x2124738e,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xc607ce68,0x39c0deea,0xd68939c0,0x39e0e729,0xc627e729,0x2960c607,0xce466300,0xdecace68,0x0000ffff,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xb6bbc7bf,0x8c717bef,0x7bef7bef,0x6b4d7bef,0xc73f7bef,0x7bef5f7e,0x73ae73ae,0x73ae73ae,0x7bef73ae,0x8c717bef,0x7bef7bef,0x6b4d7bef,0xf8007bef,0x7bef8800,0x73ae73ae,0x73ae73ae,0x7bef73ae, +0x00000000,0x00000000,0xad750000,0x00008c51,0x9cd3ad55,0xad754a69,0x00008c51,0x9cd3ad75,0x29652965,0x29652965,0xad752965,0x29658c51,0x9cd3ad55,0xad754a69,0x29658c51,0x9cd3ad75,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa34441e6,0xa363a344,0xa363a363,0xa363a363,0xa363a363,0xa344a344,0xa344a344,0xa363a363,0xa363a363,0xa363a344,0xa363a363,0xa363a363,0xa363a363,0xa344a344,0xa344a344,0x2923a363,0x6aa618a1,0x49e46aa6,0x72e749e4,0x18a172e7,0x72e718a1,0x6aa641a4,0x6aa66aa6,0x18a172e7, +0x6aa618a1,0x49e46aa6,0x72e749e4,0x18a172e7,0x72e718a1,0x28e141a4,0x28e128e1,0x18a172e7,0x528a2965,0x6b6d5aeb,0x21246b6d,0x31863186,0x29452104,0x42082104,0x8c516b4d,0x29456b4d,0x528a2965,0x6b6d5aeb,0x632c9cd3,0x84308c51,0x6b6d5aeb,0x5acb5acb,0x8c516b4d,0x29456b4d,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce68ce68,0xd689ce68,0xdeeace68,0x63005280,0xce68dec8,0xe70bbde6,0xce4839c0,0xce68ffec,0x0000ffff,0xffff0000,0x00000000,0x0000c7bf,0x00000000,0x00000000,0x00000000,0x00000000,0x6b4d7bef,0x73ae73ae,0x73ae767f,0x73ae73ae,0x73ae8c71,0x7bef7bef,0x767fc73f,0x7bef7bef,0x6b4d7bef,0x73ae73ae,0x73ae9000,0x73ae73ae,0x73ae8c71,0x7bef7bef,0x9000f800,0x7bef7bef, +0x00000000,0x00008c71,0xad75528a,0x0000a514,0xad559cf3,0xb5965aeb,0x000094b2,0xad55b596,0x29652965,0x29658c71,0xad75528a,0x2965a514,0xad559cf3,0xb5965aeb,0x296594b2,0xad55b596,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0xa384abc5,0xabc5a363,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0xa384abc5,0xabc5a363,0x2923abc5,0xbccc18a1,0x9c299c29,0x9c297ac6,0x2902b48b,0xbccc2922,0xb48bbccc,0xbccc72e7,0x18a1bccc, +0xbccc18a1,0x9c299c29,0x9c297ac6,0x2902b48b,0xbccc2922,0xb48bbccc,0xbccc72e7,0x18a1bccc,0x528a2945,0x52aa7bcf,0x8c71630c,0x7bcf8c71,0x528a632c,0x7bef8430,0x7bcf5aeb,0x3186528a,0x528a2945,0x52aa7bcf,0x8c71630c,0x7bcf8c71,0x528a632c,0x7bef8430,0x7bcf5aeb,0x3186528a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x39c0c627,0xce68e729,0xce68c607,0x39c039c0,0xd689ce68,0xce68ce68,0xce68ce68,0xce682100,0x0000ffff,0x00000000,0x00000000,0xc7bf0000,0x00000000,0x00000000,0x00000000,0xb6bb0000,0x7bef7bef,0x8c718c71,0x8c718c71,0x8c718c71,0x8c7173ae,0x8c718c71,0x7bef6b4d,0x73ae7bef,0x7bef7bef,0x8c718c71,0x8c718c71,0x8c718c71,0x8c7173ae,0x8c718c71,0x7bef6b4d,0x73ae7bef, +0x00008430,0x9cd3bdd7,0x52aa0000,0x00000000,0x4a6952aa,0xb5960000,0x528ab5b6,0x52aa0000,0x29658430,0x9cd3bdd7,0x52aa2965,0x29652965,0x4a6952aa,0xb5962965,0x528ab5b6,0x52aa2965,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0xa363a384,0xa384a384,0x8b438b43,0x8b438b43,0xa3848b43,0xa3848b43,0x8b438b43,0x8b438b43,0xa363a384,0xa384a384,0x8b438b43,0x8b438b43,0xa3848b43,0xa3848b43,0x2923abc5,0xbccc18a1,0x72e7b48b,0xb48bb48b,0x59632102,0x21025963,0xb48b9c29,0xb48b9c29,0x18a1bccc, +0xbccc18a1,0x72e7b48b,0xb48bb48b,0x59632102,0x21025963,0xb48b9c29,0xb48b9c29,0x18a1bccc,0x6b6d39c7,0x630c5acb,0x52aa4228,0x738e738e,0x630c4a69,0x630c632c,0x422852aa,0x318652aa,0x6b6d39c7,0x630c5acb,0x52aa4228,0x738e738e,0x630c4a69,0x630c632c,0x422852aa,0x318652aa,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce68d689,0xce68b5a5,0xce68ce68,0xce68ce68,0xce68deea,0xe7295280,0xce68deea,0xce68ce68,0xffffffff,0x0000ffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xc7bfffff,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x8c718c71,0x8c716b4d,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x8c718c71,0x8c716b4d,0x73ae7bef,0x73ae73ae,0x7bef73ae, +0x000094b2,0x9cf3ad75,0x00005acb,0x00000000,0x00007bef,0x00000000,0x52aa0000,0xad550000,0x296594b2,0x9cf3ad75,0x29655acb,0x29652965,0x29657bef,0x29652965,0x52aa2965,0xad552965,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x41c541e6,0x41c541c5,0x41e641c5,0x41e641e6,0x41e641c5,0x41e641e6,0x41e641e6,0x292341e6,0x41e641e6,0x41c541c5,0x41e641c5,0x41e641e6,0x41e641c5,0x41e641e6,0x41e641e6,0x316441e6,0x9c2918a1,0x9c299c29,0x29229c29,0x5963b3a9,0xb3a95963,0xbccc2922,0xbcccbccc,0x18a1bccc, +0x9c2918a1,0x9c299c29,0x29229c29,0x5963b3a9,0xb3a95963,0xbccc2922,0xbcccbccc,0x18a1bccc,0x31a639c7,0x318631a6,0x29653186,0x29652965,0x39c72124,0x31a639c7,0x21242965,0x318631a6,0x31a639c7,0x318631a6,0x29653186,0x29652965,0x39c72124,0x31a639c7,0x21242965,0x318631a6,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x73ae73ae,0x73ae73ae,0x8c716b4d,0x7bef8c71,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x7bef7bef,0x73ae73ae,0x73ae73ae,0x8c716b4d,0x7bef8c71,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x7bef7bef,0x73ae73ae,0x73ae73ae,0x8c716b4d,0x7bef8c71,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x7bef7bef,0x72e772e7,0x7b0772e7,0x6aa66aa6,0x6aa67b07,0x72e772e7,0x6aa672e7,0x6aa649e4,0x72e76aa6, +0x73ae7bcf,0x19e3738e,0x08e10901,0x1a231142,0x84103c47,0x224452aa,0x19c319a3,0x630c1162,0x08621083,0x08631083,0x10831083,0x10831083,0x10831083,0x10831082,0x10831083,0x10830862,0x41cc41cc,0x20c60021,0x00b009b1,0x31091884,0x20c61083,0x20c609b1,0x314a1884,0x18840000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232103,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232103,0x20e22923,0x18a118a1,0x18a10840,0x512218a1,0x51224902,0x51225122,0x18a15122,0x08400840,0x18a10840, +0x630c39e7,0x29453186,0x29452945,0x29452945,0x21242945,0x29452945,0xa5342945,0x3186630c,0x318639e7,0x31863186,0x31863186,0x31863186,0x29653186,0x31863186,0x31863186,0x31863186,0x318639e7,0x29453186,0x29452945,0x31863186,0x31863186,0x29452945,0x31862945,0x31863186,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800, +0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x8c718c71,0x73ae7bef,0x7bef73ae,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x8c718c71,0x73ae7bef,0x7bef73ae,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x8c718c71,0x73ae7bef,0x7bef73ae,0x81a1bccc,0x61407180,0x9082b8a2,0x5b8132d1,0xacc14183,0x90828be1,0x2a6f32d1,0xbccc146d, +0x8c5173ae,0xa51411a2,0x7bcf8410,0x1a237bef,0x1a231a23,0x94927bef,0x94b28c51,0x114239e7,0x10821083,0x18c51083,0x10831083,0x08620862,0x18a40841,0x18c518c5,0x108318c5,0x08620862,0x31090021,0x20c6314a,0x09b109d1,0x310920c6,0x20c61083,0x28c809d1,0x002120c6,0x1884314a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x936541e6,0x7ae47ae4,0x93657ae4,0x7ae49365,0x93659365,0x93257ae4,0x93659365,0x7ae49365,0x93659365,0x7ae47ae4,0x93657ae4,0x7ae49365,0x93659365,0x93257ae4,0x93659365,0x29238305,0xb48b1061,0x2902b48b,0xb3a9ab88,0xab68ab68,0xab88ab88,0xab88ab68,0xb48b2902,0x18a1b48b, +0x7bef4a69,0x108239e7,0x21242945,0x29452945,0x29452945,0x29452945,0xb5b61082,0x29657bef,0x7bef4a69,0x7bcf7bcf,0x73ae7bcf,0x7bef7bef,0x7bcf7bcf,0x7bcf7bcf,0x7bef7bef,0x29657bef,0x7bef4a69,0x7bcf7bcf,0x738e7bcf,0x7bcf738e,0x738e7bcf,0x738e738e,0x7bcf7bcf,0x29657bef,0xfb60f800,0xfb60f800,0xfb60f800,0x0000f800,0xf8000000,0xf800fb60,0xfb60f800,0xf800f800, +0x8c717bef,0xfff673ae,0x7beffd65,0x73ae7bef,0xfd6573ae,0x73aefd65,0x7bef7bef,0x8c718c71,0x8c717bef,0xdd7273ae,0x7befac6e,0x73ae7bef,0xac6e73ae,0x73aeac6e,0x7bef7bef,0x8c718c71,0x8c717bef,0x39e773ae,0x7bef31a6,0x73ae7bef,0x31a673ae,0x73ae31a6,0x7bef7bef,0x8c718c71,0x81a1b48b,0x61407180,0x9082b8a2,0x5b8132d1,0xacc13142,0x90828be1,0x2a6f32d1,0xb48b146d, +0x7bcfbdd7,0xb5b622a4,0xb5b63c07,0x39c71a23,0xce592264,0x7befa534,0x7bef9492,0x31a68c51,0x10830864,0x18c518c5,0x00211083,0x108318c5,0x20e60841,0x18c518c5,0x10831083,0x10830863,0x00211884,0x314a1884,0x3109314a,0x20c620c6,0x314a1083,0x00b009d1,0x0021314a,0x20c6314a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b4341e6,0xabc5a363,0xabc5abc5,0x8b43abc5,0xa384abc5,0x8b43a384,0x8b438b43,0x8b43abc5,0xa384abc5,0xabc5a363,0xabc5abc5,0x8b43abc5,0xa384abc5,0x8b43a384,0x8b438b43,0x29237ae4,0xb48b0840,0xa34720e2,0xa347a368,0xa347a347,0xa3479b47,0xa368a347,0x2102a388,0x0840b46b, +0x73ae4a49,0x000039e7,0x18c31082,0x18c318c3,0x10a218c3,0x108218c3,0xb5960000,0x3186738e,0x73ae4a49,0xad55ad55,0xa514ad55,0xa514a514,0x9cf3ad55,0xad55ad55,0xa514a514,0x3186738e,0x73ae4a49,0xb596b596,0xb596b596,0xad55b596,0xad55ad55,0xa514a514,0xad55b596,0x3186738e,0xfb60f800,0x00000000,0x0000f800,0x0000fb60,0x00000000,0xfb600000,0x0000fb60,0xf800f800, +0x73ae7bef,0x73ae73ae,0x73ae73ae,0x73ae73ae,0xfffffff6,0xff69fff6,0xfd65ff69,0x7bef73ae,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x73ae73ae,0xe615dd72,0xbcd0dd72,0xac6ebcd0,0x7bef73ae,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x422839e7,0x31a639e7,0x31a631a6,0x7bef73ae,0x81a1bccc,0x61407180,0x9082b8a2,0x314232d1,0xb5b65b81,0x90828c51,0x2a6f32d1,0xbccc146d, +0xb596b596,0x11421142,0x11421142,0x7bef2264,0x114219a3,0x9cf3b596,0x7bef2b05,0x1a231a23,0x398a1083,0x20c5396a,0x08610862,0x08621063,0x396a0841,0x108318c5,0x10821083,0x08620862,0x188420c6,0x00001884,0x00000021,0x20c609b1,0x310920c6,0x00b009d1,0x31090021,0x28c820c6,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0xabc5abc5,0x8b43abc5,0x8b43abc5,0x8b438b43,0x8b438b43,0xa363a384,0x8b43abc5,0x8b438b43,0xabc5abc5,0x8b43abc5,0x8b43abc5,0x8b438b43,0x8b438b43,0xa363a384,0x29239365,0x29020840,0x51c4a347,0x494351c4,0x51c451a4,0x51c451c4,0x51c451c4,0xa34751a4,0x08402902, +0x7bef4a49,0x39e77bef,0x00000000,0x00000000,0x00000000,0x00000000,0xb5964208,0x29657bef,0x7bef4a49,0xa514b596,0xa514a514,0xa514a514,0xa514a514,0xb596b596,0xb596b596,0x29657bef,0x7bef4a49,0xb596b596,0xad55b596,0xce59b596,0xa514ce59,0xb596b596,0xb596ad55,0x29657bef,0xfb60f800,0x0000f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x7bef6b4d,0x7bef7bef,0x7bef73ae,0x7bef7bef,0x8c718c71,0xfff67bef,0x8c71fd65,0x6b4d8c71,0x7bef6b4d,0x7bef7bef,0x7bef73ae,0x7bef7bef,0x8c718c71,0xdd727bef,0x8c71ac6e,0x6b4d8c71,0x7bef6b4d,0x7bef7bef,0x7bef73ae,0x7bef7bef,0x8c718c71,0x39e77bef,0x8c7131a6,0x6b4d8c71,0x81a172e7,0x61407180,0x9082b8a2,0x41833142,0xb5b65b81,0x90828c51,0x2a6f32d1,0x72e7146d, +0x1a231a23,0x7bef33e6,0x39c76b6d,0x84107bef,0x7bef9492,0x19e31142,0x1a233c27,0x39c71a23,0x08411084,0x10830841,0x08620862,0x08621083,0x398a0841,0x10830862,0x41ab0841,0x108318c5,0x188428c8,0x314a20c6,0x20c60021,0x00b009b1,0x314a20c6,0x00b009d1,0x002109b1,0x1884314a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa34441e5,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0x29238b04,0xab880840,0x51c4a347,0xb3889ac6,0xab8851a4,0x51a4ab88,0xb3a99ac6,0xa36851c4,0x1881ab88, +0x7bef4a49,0x7bcfad55,0x39c739e7,0x00000000,0x00000000,0x39e739e7,0xa51473ae,0x318673ae,0x7bef4a49,0xad55ad55,0x9cf3ad55,0xb596ad55,0xad55ad55,0xa514a514,0xa514a514,0x318673ae,0x7bef4a49,0xb596ad55,0xb596b596,0x1082b596,0xce591082,0xb596ad55,0xa514b596,0x318673ae,0xf800f800,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000,0xf800f800, +0x7bef7bef,0x73ae8c71,0x8c71ff69,0x73ae8c71,0x73ae6b4d,0x8c718c71,0x7bef8c71,0x7bef7bef,0x7bef7bef,0x73ae8c71,0x8c71bcd0,0x73ae8c71,0x73ae6b4d,0x8c718c71,0x7bef8c71,0x7bef7bef,0x7bef7bef,0x73ae8c71,0x8c7131a6,0x73ae8c71,0x73ae6b4d,0x8c718c71,0x7bef8c71,0x7bef7bef,0x20e2bccc,0x31423142,0x9082b8a2,0x39633963,0xacc13142,0x29028be1,0x2a6f32d1,0x9c293142, +0x3c075aeb,0x7bef7bcf,0x31867bef,0x94b2b596,0x2b057bef,0x39c78430,0x5aeb2244,0x84309cd3,0x10831082,0x08621083,0x10830862,0x08630863,0x08411083,0x10840862,0x08421083,0x10831083,0x18843109,0x18841884,0x20c60021,0x00b009b1,0x09b120c6,0x09b109d1,0x002109b1,0x1884314a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa38441e6,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xa384a384,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xa384a384,0x29239325,0xab881881,0x4943a347,0xa3479ac6,0xa3474983,0x41228a85,0xb3a9a347,0xa34751c4,0x18a1ab88, +0x7bcf4a49,0xb596b596,0x7befb596,0x42084208,0x420839e7,0xb5967bef,0xad559cf3,0x31867bcf,0x7bcf4a49,0xb596b596,0xb596b596,0xb596b596,0xb596a514,0xb596b596,0xad559cf3,0x31867bcf,0x7bcf4a49,0xb596b596,0xb596ad55,0x10822104,0x21041082,0xb596ce59,0xad559cf3,0x31867bcf,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x73ae7bef,0x73ae73ae,0x73ae73ae,0xfff673ae,0xfd65fd65,0x73aefd65,0x73ae73ae,0x7bef8c71,0x73ae7bef,0x73ae73ae,0x73ae73ae,0xdd7273ae,0xac6eac6e,0x73aeac6e,0x73ae73ae,0x7bef8c71,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x39e773ae,0x31a631a6,0x73ae31a6,0x73ae73ae,0x7bef8c71,0x20e29c29,0x20e220e2,0x20e220e2,0x290220e2,0x29022902,0x20e220e2,0x2a6f32d1,0x9c292902, +0x5aeb8c51,0xb5b6b596,0x11622b45,0x6b4db596,0x3386bdd7,0x1a239492,0xc6185aeb,0x7bef7bef,0x10830862,0x10831083,0x10821083,0x20e51083,0x08620863,0x00220862,0x086218c5,0x10831083,0x00000021,0x20c620c6,0x31091884,0x00b009d1,0x09b11083,0x3109314a,0x002109b1,0x188409b1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b4341c5,0x8b438b43,0xabc58b43,0xa384a384,0x8b438b43,0xa3638b43,0x8b43abc5,0xa384a384,0x8b438b43,0x8b438b43,0xabc58b43,0xa384a384,0x8b438b43,0xa3638b43,0x8b43abc5,0x29237ae4,0xb3a918a1,0x49638a65,0x498351a4,0x51c451c4,0x51c44963,0x51a44983,0xa34751c4,0x18a1ab88, +0x8c714a49,0xc638c638,0xce59c638,0xce79ce79,0xce79c618,0xc638ce59,0xc638c638,0x39e78c71,0x8c714a49,0xc638c638,0xce59c638,0xce79ce79,0xce79c618,0xc638ce59,0xc638c638,0x39e78c71,0x8c714a49,0xc638c638,0xce59c638,0x00002104,0x21040000,0xc638ce59,0xc638c638,0x39e78c71,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0xfff67bef,0x6b4dff69,0x73ae8c71,0x7bef7bef,0xfff6ffff,0x8c718c71,0x8c718c71,0x8c718c71,0xdd727bef,0x6b4dbcd0,0x73ae8c71,0x7bef7bef,0xdd72e615,0x8c718c71,0x8c718c71,0x8c718c71,0x39e77bef,0x6b4d31a6,0x73ae8c71,0x7bef7bef,0x39e74228,0x8c718c71,0x8c718c71,0x8c718c71,0x9c29bccc,0x9c299c29,0xbccc9c29,0xb48bb48b,0x9c299c29,0x72e79c29,0x9c29bccc,0x9c299c29, +0x08e17bef,0xbdd71a23,0x2b053c47,0xb59622a4,0x2b05ad55,0x19c32244,0x21041182,0xb596c638,0x08410862,0x18c5398a,0x10830862,0x18c520e6,0x08621083,0x08411083,0x18c518a5,0x10830862,0x18840021,0x00b020c6,0x10831884,0x09b109d1,0x09b11083,0x002200b0,0x002109b1,0x188409b1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0xabc5abc5,0xa363abc5,0xabc58b43,0xa384abc5,0xa384a384,0xabc5abc5,0xabc58b43,0xa384abc5,0xabc5abc5,0xa363abc5,0xabc58b43,0xa384abc5,0xa384a384,0xabc5abc5,0x29239365,0xab8818a1,0x51c49ac6,0xa347ab88,0xab8851a4,0x51c4ab88,0xab88a347,0xa34751c4,0x18a1b3a9, +0x42282965,0x84107bcf,0x528a5aeb,0x5acb4a69,0x52aa5acb,0x4a69528a,0x5aeb73ae,0x39c77bcf,0x42282965,0x8c717bcf,0x7bcf9cf3,0x94b273ae,0x84309492,0x6b6d7bcf,0x5aeb6b4d,0x39c77bcf,0x42282965,0x84107bcf,0x528a5aeb,0x21048c71,0x632c2104,0x6b6d528a,0x5aeb73ae,0x39c77bcf,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x6b4d73ae,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x6b4d73ae,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x6b4d73ae,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x72e772e7,0x6aa66aa6,0x6aa66aa6,0x72e76aa6,0x72e772e7,0x6aa66aa6,0x6aa66aa6,0x72e772e7, +0x7bef7bef,0x1a031122,0xb5963c27,0x19e31a23,0x19c32244,0x8c5131a6,0x39c77bef,0xc6182264,0x10831083,0x08620841,0x18a51083,0x108418c5,0x08411083,0x084118c5,0x398a3129,0x108418c5,0x18840021,0x00b020c6,0x10831884,0x314a314a,0x09b11083,0x20c600b0,0x002120c6,0x188409b1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x930441e5,0x8b048b04,0x8b048b04,0x93048b04,0x93049304,0x8b048b04,0x8b048b04,0x62027263,0x72836202,0x8b048b04,0x8b048b04,0x93048b04,0x93049304,0x8b048b04,0x8b048b04,0x292382c4,0xab880840,0x59c4a347,0xa347ab88,0xab8851c4,0x51a4ab88,0xab68a367,0xa34751c4,0x18a1ab88, +0x5aeb2965,0x21245acb,0xb5b6738e,0xad55ad55,0xa534ad55,0x6b4da534,0x5acbad55,0x39c7528a,0x5aeb2965,0x632c5acb,0x8c718c71,0x632c6b4d,0x5acb6b4d,0x7bef5acb,0x5acb8430,0x39c7528a,0x5aeb2965,0x6b6d6b6d,0x4a69738e,0x84304a69,0x5acb8430,0x4a696b6d,0x5acb6b4d,0x39c7528a,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x8c718c71,0xffff7bef,0xff69fff6,0xfd65ff69,0x7bef7bef,0xfd65ff69,0x8c718c71,0x6b4d8c71,0x8c718c71,0xe6157bef,0xbcd0dd72,0xac6ebcd0,0x7bef7bef,0xac6ebcd0,0x8c718c71,0x6b4d8c71,0x8c718c71,0x42287bef,0x31a639e7,0x31a631a6,0x7bef7bef,0x31a631a6,0x8c718c71,0x6b4d8c71,0xb8a2bccc,0x146d9082,0x2a6f32d1,0x5b817462,0xb8a23963,0x74629082,0x146d5b81,0xbccc0b4a, +0x7bef7bef,0x1a232b05,0x11422284,0x224439c7,0x33662264,0x2b05a514,0x7bef738e,0x52aa2b05,0x10821083,0x10831083,0x398a398a,0x398a398a,0x08410862,0x0862398a,0x08410841,0x08620841,0x1884314a,0x00b009b1,0x10831884,0x108341cc,0x09b11083,0x314a00b0,0x20c63109,0x00b009b1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x72c641e6,0x72a572c6,0x72c672c6,0x6a8572c6,0x6a856a85,0x72c672a5,0x72c672c6,0x94926244,0x41a373ae,0x72a572c6,0x72c672c6,0x6a8572c6,0x6a856a85,0x72c672a5,0x72c672c6,0x292372c6,0xab880840,0x51a4a347,0x498351a4,0x51a451a4,0x51c44963,0x49434983,0xa34751a4,0x0840ab88, +0x630c3186,0x29457bef,0x08610000,0x10820861,0x10821082,0x000010a2,0x8430a534,0x2104630c,0x630c3186,0x6b6d7bef,0x5acb73ae,0x7bcf6b4d,0x8430738e,0x7bef8c71,0x84308410,0x2104630c,0x630c3186,0x6b6d7bef,0x6b6d5aeb,0x528a528a,0x6b6d528a,0x6b6d7bcf,0x8430528a,0x2104630c,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x73ae73ae,0x7bef7bef,0xffff7bef,0x73aefff6,0x6b4d7bef,0xfff6ffff,0x73ae73ae,0x7bef6b4d,0x73ae73ae,0x7bef7bef,0xe6157bef,0x73aedd72,0x6b4d7bef,0xdd72e615,0x73ae73ae,0x7bef6b4d,0x73ae73ae,0x7bef7bef,0x42287bef,0x73ae39e7,0x6b4d7bef,0x39e74228,0x73ae73ae,0x7bef6b4d,0xb8a29c29,0x146d9082,0x2a6f32d1,0x39e74a49,0xb8a24183,0x74629082,0x146d5b81,0x9c290b4a, +0x8430738e,0x1a237bef,0x8c512ae5,0x11427bef,0xc6383c27,0x2b457bcf,0x5acb630c,0x11621122,0x10831083,0x08421082,0x08410841,0x08410841,0x08621083,0x10830841,0x10831083,0x08620862,0x18840021,0x00b009d1,0x41cc1884,0x20c641cc,0x09d120c6,0x20c600b0,0x314a0022,0x00b009b1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x316441c5,0x31843164,0x31843184,0x31643184,0x31843184,0x31843184,0x31643164,0xa5342923,0x292373ae,0x31843164,0x31843184,0x31643184,0x31843184,0x31843184,0x31643164,0x18e23164,0xab880840,0x51c4a347,0xa347ab88,0x92a54122,0x4983a347,0x9ac68a85,0xa34751a4,0x18a1ab88, +0x5acb2945,0x29457bef,0x00000000,0x00000000,0x00000000,0x00000000,0x6b4da514,0x212439c7,0x5acb2945,0x6b6d7bef,0x7bef7bef,0x5acb7bcf,0x94929492,0x84107bef,0x6b4d7bcf,0x212439c7,0x5acb2945,0x73ae7bef,0xb596b596,0x6b6d8c71,0xce59528a,0x7bcfb596,0x6b4d7bcf,0x212439c7,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf8000000, +0x8c717bef,0x73ae8c71,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x8c718c71,0x6b4d8c71,0x8c717bef,0x73ae8c71,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x8c718c71,0x6b4d8c71,0x8c717bef,0x73ae8c71,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x8c718c71,0x6b4d8c71,0xb8a2bccc,0x146d9082,0x2a6f32d1,0x39e74a49,0x9082b8a2,0x74623963,0xb5b65b81,0xbccc8c51, +0xb596b596,0x1a235aeb,0x8430b596,0x39e78430,0x3be71a23,0x33c69cf3,0x7bef1a03,0x5aebad55,0x08410862,0x108318c5,0x10821082,0x10830862,0x08620861,0x08421083,0x086318c5,0x10831083,0x18840021,0x00b009d1,0x00211884,0x20c641cc,0x09d128c8,0x20c609b1,0x18840022,0x00b009b1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x7ae441e6,0x7ae47ae4,0x93657ae4,0x7ae49365,0x7ae49365,0x93047ae4,0x93259325,0xc6187ac4,0x51e28430,0x7ae47ae4,0x93657ae4,0x7ae49365,0x7ae49365,0x93047ae4,0x93259325,0x29239325,0xab881061,0x51c4a347,0xa2e69ac6,0xab8851a4,0x4943ab88,0xb3a99ac6,0xa34751c4,0x18a1ab88, +0x738e39c7,0x4a697bcf,0x000031a6,0x00000000,0x00000000,0x31a60000,0x8430528a,0x2124738e,0x738e39c7,0x6b4d7bcf,0x7bcf8c71,0x5acb7bcf,0x8c516b4d,0x94b294b2,0x8430738e,0x2124738e,0x738e39c7,0xb5968c71,0xb596b596,0x528a39c7,0x84308430,0xb596ce59,0x7bcfb596,0x2124738e,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000, +0x8c717bef,0x7bef7bef,0x6b4d7bef,0xfff67bef,0x7beffd65,0x73ae73ae,0x73ae73ae,0x7bef73ae,0x8c717bef,0x7bef7bef,0x6b4d7bef,0xdd727bef,0x7befac6e,0x73ae73ae,0x73ae73ae,0x7bef73ae,0x8c717bef,0x7bef7bef,0x6b4d7bef,0x39e77bef,0x7bef31a6,0x73ae73ae,0x73ae73ae,0x7bef73ae,0xb5b66aa6,0x146d8c51,0x2a6f32d1,0x5b817462,0x9082b8a2,0x74623142,0x146d5b81,0x72e70b4a, +0x19c322c4,0x1a231122,0x2284bdd7,0x7bef94b2,0x1a2339c7,0x39e71142,0xad551a23,0x1a23b5b6,0x08410862,0x20c518c5,0x10820862,0x41cc1082,0x18c518c5,0x10830862,0x08620841,0x10831083,0x31090021,0x00b009d1,0x00211884,0x310941cc,0x314a314a,0x20c61884,0x18840022,0x00b009d1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa34441e6,0xa363a344,0xa363a363,0xa363a363,0xa363a363,0xa344a344,0xa344a344,0xce798ac3,0x8ac3a534,0xa363a344,0xa363a363,0xa363a363,0xa363a363,0xa344a344,0xa344a344,0x2923a363,0x290218a1,0x51a4a368,0x51c44963,0x51c451c4,0x49434963,0x51a451c4,0xa34751c4,0x08402902, +0x528a2965,0x6b6d5aeb,0x21246b6d,0x31863186,0x29452104,0x42082104,0x8c516b4d,0x29456b4d,0x528a2965,0x6b6d5aeb,0x632c9cd3,0x84308c51,0x6b6d5aeb,0x5acb5acb,0x8c516b4d,0x29456b4d,0x528a2965,0xce595aeb,0x528ace59,0x6b6d528a,0x6b6d6b6d,0xce596b6d,0x8c51ce59,0x29456b4d,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000, +0x6b4d7bef,0x73ae73ae,0x73aeff69,0x73ae73ae,0x73ae8c71,0x7bef7bef,0xff69fff6,0x7bef7bef,0x6b4d7bef,0x73ae73ae,0x73aebcd0,0x73ae73ae,0x73ae8c71,0x7bef7bef,0xbcd0dd72,0x7bef7bef,0x6b4d7bef,0x73ae73ae,0x73ae31a6,0x73ae73ae,0x73ae8c71,0x7bef7bef,0x31a639e7,0x7bef7bef,0xb8a2bccc,0x29029082,0x2a6f32d1,0x5b817462,0x31423142,0x74623142,0x39635b81,0x9c294183, +0x7bef1a23,0x11227bef,0x3c471a23,0x2b25b596,0x08e13186,0x7bef8c51,0x1a231142,0x84301a23,0x08411083,0x398a396a,0x0862398a,0x08410862,0x18c5398a,0x08621083,0x398a0841,0x108318c5,0x31090021,0x09b109d1,0x20c620c6,0x18841884,0x18840021,0x20c620c6,0x314a3109,0x09d109d1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0xa384abc5,0xabc5a363,0x51e2a384,0xabc551e2,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0xa384abc5,0xabc5a363,0x2923abc5,0xb48b0840,0xa34720e2,0x9b27a347,0xa347a347,0xa347a388,0xa347a347,0x2102a347,0x18a1b48b, +0x528a2945,0x52aa7bcf,0x8c71630c,0x7bcf8c71,0x528a632c,0x7bef8430,0x7bcf5aeb,0x3186528a,0x528a2945,0x52aa7bcf,0x8c71630c,0x7bcf8c71,0x528a632c,0x7bef8430,0x7bcf5aeb,0x3186528a,0x528a2945,0x52aa7bcf,0x5aeb630c,0x7bcf5aeb,0x528a632c,0x7bef8430,0x7bcf5aeb,0x3186528a,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000, +0x7bef7bef,0x8c718c71,0x8c718c71,0x8c718c71,0x8c7173ae,0x8c718c71,0x7bef6b4d,0x73ae7bef,0x7bef7bef,0x8c718c71,0x8c718c71,0x8c718c71,0x8c7173ae,0x8c718c71,0x7bef6b4d,0x73ae7bef,0x7bef7bef,0x8c718c71,0x8c718c71,0x8c718c71,0x8c7173ae,0x8c718c71,0x7bef6b4d,0x73ae7bef,0x2902bccc,0x20e220e2,0x20e220e2,0x5b817462,0x29022902,0x20e220e2,0x20e220e2,0x9c292902, +0xb596b596,0x7bef6b4d,0x1a232965,0x3c473c47,0x7bef1a23,0x7bef8c51,0x11629492,0x9cf36b6d,0x10820862,0x08410841,0x10820841,0x10830863,0x314a0841,0x10831083,0x08411083,0x1083398a,0x310941cc,0x09d120c6,0x314a00b0,0x1884314a,0x314a1884,0x3109314a,0x00223109,0x314a314a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0xa363a384,0xa384a384,0x8b438b43,0x8b438b43,0xa3848b43,0xa3848b43,0x8b438b43,0x8b438b43,0xa363a384,0xa384a384,0x8b438b43,0x8b438b43,0xa3848b43,0xa3848b43,0x2923abc5,0xb48b18a1,0x2902b46a,0xab88ab88,0xab88ab88,0xab88ab68,0xab88ab88,0xbcac2922,0x1881b48b, +0x6b6d39c7,0x630c5acb,0x52aa4228,0x738e738e,0x630c4a69,0x630c632c,0x422852aa,0x318652aa,0x6b6d39c7,0x630c5acb,0x52aa4228,0x738e738e,0x630c4a69,0x630c632c,0x422852aa,0x318652aa,0x6b6d39c7,0x630c5acb,0x52aa4228,0x738e738e,0x630c4a69,0x630c632c,0x422852aa,0x318652aa,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x73ae7bef,0x73ae73ae,0x7bef73ae,0x8c718c71,0x8c716b4d,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x8c718c71,0x8c716b4d,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x8c718c71,0x8c716b4d,0x73ae7bef,0x73ae73ae,0x7bef73ae,0xbcccbccc,0xb48bbccc,0xbcccbccc,0x9c29bccc,0x9c299c29,0xbccc72e7,0xbcccbccc,0x9c29bccc, +0xb596b596,0xa534b596,0x7bef94b2,0x1a232244,0xb5965aeb,0xb596b596,0x5aeb8410,0x8c71b5b6,0x10831083,0x08621083,0x10830862,0x08620862,0x08411083,0x10830862,0x10821084,0x10830841,0x310941cc,0x09b10021,0x314a00b0,0x1884314a,0x00221884,0x002109b1,0x18841884,0x18840021,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x41c541e6,0x41c541c5,0x41e641c5,0x41e641e6,0x41e641c5,0x41e641e6,0x41e641e6,0x292341e6,0x41c541e6,0x41c541c5,0x41e641c5,0x41e641e6,0x41e641c5,0x41e641e6,0x41e641e6,0x316441e6,0x18a118a1,0x18a10840,0x188118a1,0x08400840,0x18a10840,0x084018a1,0x18a118a1,0x18a118a1, +0x31a639c7,0x318631a6,0x29653186,0x29652965,0x39c72124,0x31a639c7,0x21242965,0x318631a6,0x31a639c7,0x318631a6,0x29653186,0x29652965,0x39c72124,0x31a639c7,0x21242965,0x318631a6,0x31a639c7,0x318631a6,0x29653186,0x29652965,0x39c72124,0x31a639c7,0x21242965,0x318631a6,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x73ae7bcf,0x4a69738e,0x29452945,0x5aeb39c7,0x8410ad75,0x5aeb52aa,0x4a494228,0x630c39e7,0x31863186,0x31863186,0x94b20020,0x52aa94b2,0x52aa52aa,0x318652aa,0x31863186,0x52aa52aa,0xe6f4d673,0xc5d0d693,0xded4fffa,0xef16c611,0xf737deb3,0xd672d652,0xdeb3d673,0xc611d693,0x94505248,0xa4b24a08,0x6aec9c71,0x94505269,0x52495249,0xa4904a28,0x6aecb514,0x9cd3b470, +0x6a865a45,0x39837b07,0x6aa66265,0x41846a86,0x6aa66aa6,0x31426286,0x6aa66286,0x7b076285,0x6ac76aa6,0x6aa63963,0x6a866aa6,0x6aa63963,0x6aa66aa6,0x6aa66aa6,0x39633963,0x6aa63963,0xef5def5d,0xe73ce73c,0xdefbdefb,0xd69adedb,0xdedbd6ba,0xd6bad6ba,0xd6bad6ba,0xce79d69a,0xff89ffa9,0xff28ff68,0xfec7fee7,0xf646f686,0xfe87f646,0xfe66fe66,0xfe26fe46,0xfde6fe06, +0x6efb7f1b,0x4eda5efa,0x1e782e99,0x06160637,0x06580617,0x06370637,0x06170637,0x05d605f6,0x31642923,0x39643164,0x31643164,0x31643964,0x31643164,0x31643164,0x31643164,0x31643164,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232103,0x20e22923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232103,0x20e22923, +0x00000000,0x00000000,0x00000000,0x7a080000,0x00005165,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x6aca0000,0x00004a07,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800, +0x8c5173ae,0xa5144208,0x7bcf8410,0x5aeb7bef,0x5aeb5aeb,0x94927bef,0x94b28c51,0x39c739e7,0x52aa52aa,0x318652aa,0x31863186,0x31863186,0x52aa52aa,0x94b294b2,0x318652aa,0x52aa3186,0xde74e6b5,0xce52d673,0xd653de94,0xe6d4deb3,0xded4b56e,0xd693bdaf,0xcdf2e6d5,0xe6b5ce52,0x7b8d9c91,0x8bef6b0c,0x9cd36aec,0x524983ce,0xb555bdd7,0xa4d28c0f,0x6aca83ce,0x83ae7b6c, +0x62863963,0x418493a9,0x7b076aa6,0x398349e4,0x6a869388,0x39639bc9,0x7b076285,0x62863983,0xb48b49e4,0xb48bb48b,0xb48bb48b,0xac4aac4a,0xb48bb48b,0xb48bac2a,0xb48bb48b,0x6aa6b48b,0xf79ed6ba,0xef7def7d,0xef7def7d,0xef7def7d,0xef5def5d,0xdedbe71c,0xd6bad6ba,0xc638d69a,0xffeaeea8,0xffaaffca,0xffcaffaa,0xffaaffaa,0xff8aff8a,0xfea6ff08,0xf665f686,0xe5a5f645, +0x975c0637,0x7f1b8f3c,0x873c873c,0x7f1b873c,0x6f1b7f1b,0x0e583699,0x06170637,0x05730616,0x83053184,0x7ae47ae4,0x93657ae4,0x7ae49365,0x93659365,0x93257ae4,0x93659365,0x31848305,0x936541e6,0x7ae47ae4,0x93657ae4,0x7ae49365,0x93659365,0x93257ae4,0x93659365,0x29238305,0x936541e6,0x7ae47ae4,0x93657ae4,0x7ae49365,0x93659365,0x93257ae4,0x93659365,0x29238305, +0x00000000,0x00000000,0xc0e40000,0x98a398a3,0x98a398a3,0x000098a3,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x6aca0000,0x00004a07,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb60f800,0xfb60f800,0xfb60f800,0x0000f800,0xf8000000,0xf800fb60,0xfb60f800,0xf800f800, +0x7bcfbdd7,0xb5b6738e,0xb5b6ad55,0x39c75aeb,0xce59630c,0x7befa534,0x7bef9492,0x31a68c51,0x94b252aa,0x94b23186,0x52aa0020,0x318652aa,0x31863186,0x31860020,0x52aa52aa,0x94b294b2,0xe6d5fffa,0xb56ece31,0xd672d652,0xf757d672,0xf757e6b5,0xded4e6d5,0xd693e6f4,0xd653e6d5,0x9c91b554,0xb554bdb6,0x83efa4f3,0xad3594b2,0x83ce8c30,0x94309cb2,0xb4f35aaa,0x5a69b596, +0x6ac641a4,0x6aa65a45,0x7b076a86,0x6ac749e4,0x62656ac6,0x39836286,0x93a86aa6,0x39639be9,0xb48b3963,0x9c299be8,0x9c29a44a,0x9c299c29,0xa4299be9,0xa44a9c29,0xa44aa46a,0x3963b46b,0xf79ededb,0xef7df79e,0xf79ef79e,0xf79ef79e,0xef5def7d,0xe71ce71c,0xdedbdefb,0xce59dedb,0xffeceea9,0xffccffec,0xffecffec,0xffecffec,0xffabffcb,0xff07ff28,0xfec7fee7,0xedc5fea6, +0xa77d0637,0x975c975c,0xa75da75d,0x9f5ca75d,0x7f1b8f3c,0x2e9946ba,0x0e581e78,0x05940e58,0x7ae43184,0xabc5a363,0xabc5abc5,0x8b43abc5,0xa384abc5,0x8b43a384,0x8b438b43,0x31847ae4,0x8b4341e6,0xabc5a363,0xabc5abc5,0x8b43abc5,0xa384abc5,0x8b43a384,0x8b438b43,0x29237ae4,0x8b4341e6,0xabc5a363,0xabc5abc5,0x8b43abc5,0xa384abc5,0x8b43a384,0x8b438b43,0x29237ae4, +0x00000000,0x00000000,0xe082ce79,0xce79c0e4,0x98a3c0e4,0x94b298a3,0x00000000,0x00000000,0x00000000,0x00000000,0x936a0000,0x72a872a8,0x72a872a8,0x000072a8,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb60f800,0x00000000,0x0000f800,0x0000fb60,0x00000000,0xfb600000,0x0000fb60,0xf800f800, +0xb596b596,0x39c739c7,0x39c739c7,0x7bef630c,0x31a64228,0x9cf3b596,0x7bef7bef,0x5aeb5aeb,0x318652aa,0x31863186,0x31863186,0x31863186,0x94b294b2,0x31863186,0x31863186,0x52aa3186,0xdeb4ef16,0xef36d672,0xd652ded4,0xbdafe6d4,0xdeb3c5f1,0xd652de93,0xe6d5e6b5,0xd673d652,0xa4b2b554,0x5a6a9471,0xb555b555,0x83efacf4,0x9cf3ad34,0xa51483ef,0x5289a4d2,0x8c0f83ce, +0x9bc93963,0x62863963,0x9bc96aa6,0x6aa63943,0x62853983,0x396393a9,0x62656aa6,0x9bc94184,0xb48b3963,0xbccc9c29,0xb48bbccc,0xbcccbcac,0xbcccbccc,0xbcccbccc,0x9c29bcac,0x3963b48b,0xf79ededb,0xf79ef79e,0xf79ef79e,0xf79ef79e,0xef7df79e,0xe73cef5d,0xdedbdefb,0xce59dedb,0xffeeeeaa,0xffeeffee,0xffeeffee,0xffedffed,0xffccffcd,0xff49ff8a,0xf6a7f6e7,0xedc5f6a6, +0xaf7d0637,0xa75da75d,0xaf7da77d,0xa75daf7d,0x8f3c975c,0x56da7f1b,0x06581e78,0x05940657,0x93653184,0xabc5abc5,0x8b43abc5,0x8b43abc5,0x8b438b43,0x8b438b43,0xa363a384,0x31849365,0xabc541e6,0xabc5abc5,0x8b43abc5,0x8b43abc5,0x8b438b43,0x8b438b43,0xa363a384,0x29239365,0xabc541e6,0xabc5abc5,0x8b43abc5,0x8b43abc5,0x8b438b43,0x8b438b43,0xa363a384,0x29239365, +0x00000000,0x00000000,0xe082f945,0xe082e082,0xce79e082,0x98a398a3,0x00000000,0x00000000,0x00000000,0x00000000,0x936a0000,0x936a936a,0x72a8936a,0x000072a8,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb60f800,0x0000f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x5aeb5aeb,0x7befa514,0x39c76b6d,0x84107bef,0x7bef9492,0x528a39c7,0x5aebad75,0x39c75aeb,0x52aa0020,0x52aa52aa,0x52aa3186,0x52aa52aa,0x94b294b2,0x52aa52aa,0x94b252aa,0x002094b2,0xe6d5ce32,0xcdf2e6f4,0xd673deb4,0xde93deb3,0xdeb3deb4,0xffd8de93,0xd672d672,0xbd8fd652,0xb5556aec,0x6aeab534,0x8c71730b,0x52aa73ae,0x5249a4d3,0x5249ad35,0x6aec6aea,0x94507bcf, +0x7b073983,0x62863983,0x9bc96ac7,0x9bc941a4,0x5a453943,0x39839be9,0x93a96aa6,0x9bc93963,0xb46b3963,0xbccc9c29,0xb48bb46b,0xb46bb48b,0xb48bb48b,0xbcabb48b,0xa44abccc,0x6285b48b,0xf79ededb,0xf79ef79e,0xf79ef79e,0xf79ef79e,0xf79ef79e,0xef7df79e,0xe71ce73c,0xce59defb,0xffefee8a,0xffeeffef,0xffeeffee,0xffedffee,0xffcdffed,0xffabffec,0xff28ff69,0xe5e5fee8, +0xaf7d0637,0xaf7daf7d,0xaf7daf7d,0xa77daf7d,0x9f5ca75d,0x873c9f5c,0x3eb95efa,0x05942699,0x8b043164,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0x31648b04,0xa34441e5,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0x29238b04,0xa34441e5,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0x29238b04, +0x00000000,0x00000000,0xf9450000,0xe082ffff,0xc0e4e082,0x000098a3,0x00000000,0x00000000,0x00000000,0x00000000,0xcccf0000,0x936acccf,0x936a936a,0x000072a8,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000,0xf800f800, +0xa5345aeb,0x7bef7bcf,0x31867bef,0x94b2b596,0x7bef7bef,0x39c78430,0x5aeb5aeb,0x84309cd3,0x52aa52aa,0x318694b2,0x94b23186,0x318694b2,0x31860020,0x94b294b2,0x52aa94b2,0x52aa52aa,0xe6b5ded4,0xe6d5ad0d,0xef16c611,0xde74d693,0xf756f737,0xd672e715,0xd693deb3,0xdeb3d692,0xb5556acc,0x4a28b555,0x5a68ac71,0x736d630b,0x736d9451,0x94306aec,0x7bad83ef,0x62cbbdf7, +0x7b0741c4,0x6aa64184,0x93a86286,0x62653963,0x5a453983,0x41849bea,0x9bc96aa6,0x93a841a4,0xb46a6286,0xb48b9c29,0x9c29b48b,0x9c299c29,0x9c299c29,0xbcab9c29,0x9c29bccc,0x6a86b48b,0xf79ed6ba,0xf79ef79e,0xf79ef79e,0xf79ef79e,0xf79ef79e,0xf79ef79e,0xef7df79e,0xce79ef5d,0xffeeee89,0xffeeffee,0xffedffed,0xffecffed,0xffecffec,0xffebffeb,0xffaaffeb,0xee06ff69, +0xa77d0637,0xaf7daf7d,0xa75da77d,0xa77da77d,0xa75da75d,0xa75d9f5c,0x873c9f5c,0x05d566fb,0x93253184,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xa384a384,0x31649325,0xa38441e6,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xa384a384,0x29239325,0xa38441e6,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xa384a384,0x29239325, +0x00000000,0x00000000,0x00000000,0xf945f945,0xe082f945,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xcccfcccf,0x936acccf,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x5aeb8c51,0xb5b6b596,0x39c78c51,0x6b4db596,0x9492bdd7,0x5aeb9492,0xc6185aeb,0x7bef7bef,0x318652aa,0x31863186,0x31863186,0x52aa3186,0x52aa0020,0x318652aa,0x31863186,0x52aa94b2,0xb54ec5d0,0xde93e6d5,0xde94de93,0xd672e6d5,0xdeb3deb3,0xef56deb3,0xe6b5deb3,0xef15c5f0,0x6aec9431,0xa514a534,0x6aec83ee,0xc5f8c5f8,0x83cf4a28,0x730bbdf7,0x9c5183ae,0x4a286b4d, +0x9be96aa6,0x628641c4,0x93a86ac6,0x6aa641a4,0x39636aa6,0x41a493a8,0x93a86aa6,0x7b0741a4,0xb48b6aa6,0xbccc9c09,0x9be9b46b,0xbcccbccc,0xbcccbccc,0xb48b9c29,0x9c09bccc,0x6aa6b48b,0xf79ed6ba,0xef7df79e,0xf79ef79e,0xf79eef7d,0xf79ef79e,0xf79ef79e,0xef7df79e,0xd69aef7d,0xffcdee89,0xffc9ffed,0xffccffcc,0xffebffcb,0xffebffeb,0xffeaffeb,0xffcaffea,0xee67ffa9, +0x975c0637,0x873ca77d,0x975c975c,0x975c975c,0x975c975c,0x9f5c9f5c,0x8f3c975c,0x0616873c,0x7ae43164,0x8b438b43,0xabc58b43,0xa384a384,0x8b438b43,0xa3638b43,0x8b43abc5,0x31647ae4,0x8b4341c5,0x8b438b43,0xabc58b43,0xa384a384,0x8b438b43,0xa3638b43,0x8b43abc5,0x29237ae4,0x8b4341c5,0x8b438b43,0xabc58b43,0xa384a384,0x8b438b43,0xa3638b43,0x8b43abc5,0x29237ae4, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x21247bef,0xbdd75aeb,0x7befb596,0xb5966b6d,0x7befad55,0x4a495aeb,0x210439e7,0xb596c638,0x94b252aa,0x002094b2,0x318694b2,0x52aa52aa,0x94b252aa,0x94b294b2,0x94b294b2,0x94b294b2,0xde95e6d4,0xe6d5ef16,0xd672e6b5,0xde95eef6,0xfffaf737,0xdeb3c5d0,0xde74d673,0xdeb3d672,0x528a6b4d,0x52485248,0x94109470,0x83efad13,0x62eb9cd3,0x94116aec,0x6aecb554,0x5b0c9c71, +0x9bc96aa6,0x72c73983,0x41a493a8,0x41846aa6,0x41a46aa6,0x39639388,0x6aa66aa6,0x7b073983,0xb48b6aa6,0xbcccac8b,0x9c29b48b,0xb48bbcac,0xbcccb48b,0xb48b9c09,0x9c09bccc,0x6aa6bcab,0xf79ed6ba,0xef7df79e,0xef5df79e,0xef5def5d,0xef5def5d,0xef5def5d,0xe73cef5d,0xce79e71c,0xffcceea8,0xffc9ffec,0xff88ffed,0xff88ff88,0xff88ff88,0xff88ff88,0xff67ff88,0xee45f746, +0x975c0637,0x873ca75d,0x6efba75d,0x6efb6efb,0x6efb6efb,0x6efb6efb,0x56da6efb,0x05d63eb9,0x93653184,0xabc5abc5,0xa363abc5,0xabc58b43,0xa384abc5,0xa384a384,0xabc5abc5,0x31649365,0xabc541e6,0xabc5abc5,0xa363abc5,0xabc58b43,0xa384abc5,0xa384a384,0xabc5abc5,0x29239365,0xabc541e6,0xabc5abc5,0xa363abc5,0xabc58b43,0xa384abc5,0xa384a384,0xabc5abc5,0x29239365, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x7bef7bef,0x52aa3186,0xb596ad55,0x528a5aeb,0x4a695aeb,0x8c5131a6,0x39c77bef,0xc618630c,0x52aa52aa,0x318652aa,0x31863186,0x31863186,0x00203186,0x31863186,0x31863186,0x52aa52aa,0xd693deb3,0xde93e6d5,0xd652deb3,0xffb7e6f5,0xd633deb4,0xd672d693,0xe6b5ded4,0xe6d5d672,0x6aec6aec,0xbdb6bdb6,0x8c71ad34,0x4a489c71,0xa4706aec,0x6aec8c30,0x6b4d83ef,0x736e7bf0, +0x9bc96aa6,0x6aa63983,0x39839bc9,0x41a49bc9,0x39639bc9,0x49e47b07,0x7b076286,0x6ac73983,0xb48b3963,0xcd2d9c29,0x9c29b48b,0xb48bbccc,0xbcacb48b,0xac4aa429,0x9c29bccc,0x72e7b48b,0xf79ed6ba,0xef7def7d,0xef5def5d,0xef5def5d,0xef5def5d,0xef7def5d,0xef5def7d,0xd69ae73c,0xffeceea7,0xffc9ffcb,0xff88ff88,0xff88ff88,0xff88ff88,0xffc8ffa8,0xffa8ffc8,0xee66ff87, +0x9f5c0637,0x873c8f3c,0x6efb6efb,0x6efb6efb,0x6f1b6efb,0x7f1b771b,0x771b873c,0x05f65efa,0x93043164,0xa344a344,0xa344a344,0xa363a344,0xa363a363,0xa344a344,0xa344a344,0x31649304,0x930441e5,0x8b048b04,0x8b048b04,0x93048b04,0x93049304,0x8b048b04,0x8b048b04,0x292382c4,0x930441e5,0x8b048b04,0x8b048b04,0x62027263,0x72836202,0x8b048b04,0x8b048b04,0x292382c4, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x7bef7bef,0x5aeb7bef,0x39c76b4d,0x630c39c7,0x8c71630c,0x7befa514,0x7bef738e,0x52aa7bef,0x94b294b2,0x630c52aa,0x318652aa,0x94b294b2,0x52aa52aa,0x52aa52aa,0x94b294b2,0x002094b2,0xde95bdaf,0xdeb3cdf2,0xe6d4bdd0,0xd672de93,0xd693d673,0xffb9eef6,0xe6d5deb3,0xde74deb4,0xacb2a4f3,0x94517bcf,0xa4b39c51,0xb51483f0,0x736d9c91,0x4a288bef,0x8c314a28,0x6aec8c31, +0x7b076a86,0x6aa649e4,0x626593a9,0x39636a86,0x39639388,0x5a257b07,0x7b073142,0x6ac73983,0xb48b3963,0xbcac9c29,0x9c09b48b,0xbcacbcac,0xbcccbccc,0xb48b9c29,0x9c29bcab,0x3963b48b,0xef7dd6ba,0xef7def7d,0xef5def7d,0xef7def7d,0xef7def7d,0xef7def7d,0xef7def7d,0xd69aef5d,0xffebe688,0xffc9ffca,0xffa8ffc9,0xffc9ffc9,0xffc9ffc9,0xffe9ffc9,0xffc8ffe9,0xee66ff88, +0x975c0637,0x873c873c,0x771b873c,0x873c873c,0x873c873c,0x873c873c,0x7f1b873c,0x06166f1b,0x93653184,0xa384abc5,0xabc5abc5,0x8b43abc5,0x8b438b43,0xabc5a363,0xabc5abc5,0x31849365,0x72c641e6,0x72a572c6,0x72c672c6,0x6a8572c6,0x6a856a85,0x72c672a5,0x72c672c6,0x292372c6,0x72c641e6,0x72a572c6,0x72c672c6,0x94926244,0x41a373ae,0x72c672a5,0x72c672c6,0x292372c6, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x8430738e,0x5aeb7bef,0x8c517bcf,0x31a67bef,0xc638ad55,0x8c517bcf,0x5acb630c,0x39c72965,0x31863186,0x52aa52aa,0x318652aa,0x31863186,0x002052aa,0x52aa52aa,0x31863186,0x52aa0020,0xded4ce31,0xfffece52,0xef15d672,0xde94deb4,0xf756d693,0xc5f0deb3,0xd652ce52,0xc5f0deb3,0xbd969c92,0xa4d37b6e,0xad357bd0,0x4a288bae,0x730b4a49,0xbd968bcf,0x5aaac5f8,0x4a286b4c, +0x5a456aa6,0x62866aa6,0x6a869bc9,0x6aa66286,0x39836aa6,0x8b686aa6,0x7b073983,0x62864184,0xb48b3963,0xbccc9c09,0x9c29b48b,0xa44aa44a,0x9c299c29,0xb48b9c29,0x9c09bcab,0x6aa6b48b,0xf79ed6ba,0xef5def7d,0xef7def5d,0xef7def7d,0xef7def7d,0xef7def7d,0xef7def7d,0xd6baef7d,0xffebee88,0xff88ffea,0xffc9ff88,0xffc9ffc9,0xffcaffca,0xffc9ffc9,0xffc9ffc9,0xee87ffc9, +0x9f5c0637,0x6efb975c,0x873c6efb,0x873c873c,0x873c873c,0x873c873c,0x7f1b873c,0x06177f1b,0x7ae43164,0xa384a363,0xa384a384,0x8b43abc5,0xa384a384,0xa384a384,0x8b438b43,0x31647ae4,0x316441c5,0x31843164,0x31843184,0x31643184,0x31843184,0x31843184,0x31643164,0x18e23164,0x316441c5,0x31843164,0x31843184,0xa5342923,0x292373ae,0x31843184,0x31643164,0x18e23164, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf8000000, +0xb596b596,0x5aeb5aeb,0x8430b596,0x39e78430,0xa5345aeb,0x9cf39cf3,0x7bef528a,0x5aebad55,0x94b252aa,0x318694b2,0x31863186,0x31863186,0x31863186,0x94b294b2,0x94b294b2,0x002094b2,0xd672e6f4,0xd672eef6,0xeef6eef6,0xeef6e6d5,0xce32e6d5,0xe6d5d672,0xc5f0d653,0xce11ded4,0xa4d26aec,0x52485248,0x5aaa9c92,0x6aec738e,0x736c94b3,0xad1462ca,0x8c309c71,0x9470a514, +0x41a46aa6,0x62866aa6,0x7b077b07,0x62866aa6,0x41a46ac7,0x9bc96aa6,0x9bc93983,0x7b073963,0xb46b49e4,0xbccc9c09,0xbcabb48b,0xb48bb48b,0xb48bb48b,0xbcabb48b,0x9c29bccc,0x6aa6b48b,0xf79ed6ba,0xef7def7d,0xf79eef7d,0xef7def7d,0xef7def7d,0xef7def7d,0xef5def5d,0xd6baef5d,0xffeaee88,0xffeaffea,0xffe9ffc9,0xffeaffe9,0xffcbffca,0xffa8ffc9,0xffa8ffa8,0xee87ffa8, +0x975c0637,0x975c8f3c,0x975c873c,0x975c975c,0x975c975c,0x7f1b873c,0x771b7f1b,0x0617771b,0x7ae43184,0x8b438b43,0xabc58b43,0x8b43abc5,0x8b43abc5,0xa3638b43,0xa384a384,0x31849325,0x7ae441e6,0x7ae47ae4,0x93657ae4,0x7ae49365,0x7ae49365,0x93047ae4,0x93259325,0x29239325,0x7ae441e6,0x7ae47ae4,0x93657ae4,0xc6187ac4,0x51e28430,0x93047ae4,0x93259325,0x29239325, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000, +0x4a49738e,0x5aeb3186,0x632cbdd7,0x7bef94b2,0x5acb39c7,0x39e739c7,0xad555aeb,0x5acbb5b6,0x94b252aa,0x52aa52aa,0x002052aa,0x94b252aa,0x52aa52aa,0x31863186,0x31863186,0x52aa3186,0xd673ce31,0xdeb4de93,0xded4d652,0xce52d652,0xd672d672,0xe6f4de93,0xde93deb3,0xbdd0deb3,0x7bef8c10,0xb535bdf7,0x9c309c70,0x6aec83cf,0x8c718c51,0x734d9c91,0x734d734d,0xa4b2b534, +0x41c46ac6,0x41846265,0x7b077b07,0x6a863983,0x39639bc9,0x9bc96a86,0x9be93983,0x7b0741a4,0xb48b6aa6,0xb48ba44a,0xbcccbccc,0xbcccbccc,0xbcabbccc,0xbcabbccc,0x9c29bccc,0x3963b48b,0xef7dd6ba,0xef7def7d,0xef7def7d,0xf79ef79e,0xef7def7d,0xef7def7d,0xef7def7d,0xd69aef7d,0xffcaee88,0xffeaffea,0xffeaffea,0xffeaffea,0xffcbffcb,0xffc9ffc9,0xffc8ffa8,0xee66ffc8, +0x975c0637,0x8f3c975c,0x975c8f3c,0x975c9f5c,0x873c975c,0x873c873c,0x7f1b7f1b,0x05f67f1b,0x8b043164,0xa363a344,0xa363a363,0xa363a363,0xa363a363,0xa344a344,0xa344a344,0x31649304,0xa34441e6,0xa363a344,0xa363a363,0xa363a363,0xa363a363,0xa344a344,0xa344a344,0x2923a363,0xa34441e6,0xa363a344,0xa363a363,0xce798ac3,0x8ac3a534,0xa344a344,0xa344a344,0x2923a363, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000, +0x7bef5acb,0x29657bef,0xb5965acb,0x8410b596,0x21243186,0x7bef8c51,0x5aeb39c7,0x84305aeb,0x002052aa,0x31863186,0x31860020,0x31863186,0x318694b2,0x52aa52aa,0x94b252aa,0x52aa52aa,0xef16e6b5,0xd673ff78,0xd693de93,0xdeb3deb3,0xe6f4deb3,0xeef6e6d5,0xce52c611,0xff78d672,0x732d8b8d,0xb5346aec,0x8c10b534,0x83efbd96,0x52486aec,0xc5f76b4d,0x83adc5f7,0x6aec6aec, +0x5a453963,0x41a46265,0x9bc96a86,0x62863983,0x39639bc9,0x7b076286,0x7b0749e4,0x9bc949e4,0xb48b3963,0x9c099c09,0x93e89c29,0x9c099c29,0x9c29a46a,0x9c299c29,0xa42a9c29,0x6aa6b48b,0xef7dd6ba,0xef7def7d,0xef7def7d,0xef7def7d,0xef7def7d,0xef7def7d,0xef5def5d,0xd69ae73c,0xffccee88,0xffcaffcb,0xffeaffea,0xffcaffea,0xffcbffcb,0xffc9ffca,0xff88ffa9,0xee65ff87, +0x8f3c0617,0x8f3c8f3c,0x8f3c975c,0x8f3c8f3c,0x873c873c,0x873c8f3c,0x6efb7f1b,0x05f65efa,0x93653184,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0xa384abc5,0xabc5a363,0x31649365,0xabc541e6,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0xa384abc5,0xabc5a363,0x2923abc5,0xabc541e6,0x8b438b43,0x8b438b43,0x82e3a384,0xabc58b04,0xa384abc5,0xabc5a363,0x2923abc5, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000, +0xb596b596,0x7bef6b4d,0x5aeb2965,0xb596b596,0x7bef5aeb,0x7bef8c51,0x39c79492,0x9cf36b6d,0x52aa52aa,0x94b294b2,0x94b294b2,0x94b294b2,0x94b23186,0x94b294b2,0x52aa0020,0x318652aa,0xde93deb4,0xe6d6e6b5,0xd672bdb1,0xd672d652,0xe6d5c5d0,0xdeb3fffb,0xde93d672,0xef15d693,0x9c108bce,0xbd559c30,0xa4d48bf0,0x6aec9cb3,0xb555b555,0x94716b0b,0xa4d25249,0x9c51836e, +0x62853983,0x39436ac7,0x9bc93983,0x628641a4,0x39839bc9,0x9bc96a86,0x7b0749e4,0x93a849e4,0xb48b6aa6,0xb48bb46a,0xb48bb48b,0xb48bb48b,0xb46aac4a,0xb48bb48b,0xbcacbcab,0x6265b48b,0xef5dd69a,0xef5def5d,0xef7def7d,0xef7def7d,0xef7def7d,0xef7def7d,0xef5def7d,0xd69aef5d,0xff4ce648,0xff6bff4b,0xffabffab,0xffabffaa,0xff8bffab,0xffaaffab,0xff8affaa,0xee67ff89, +0x66fb05f6,0x6f1b66fb,0x873c873c,0x873c873c,0x7f1b7f1b,0x873c873c,0x7f1b7f1b,0x05f6771b,0x83053184,0x93049325,0x93259325,0x7ae47ae4,0x7ae47ae4,0x93257ae4,0x93257ae4,0x31648305,0xabc541e6,0xa363a384,0xa384a384,0x8b438b43,0x8b438b43,0xa3848b43,0xa3848b43,0x2923abc5,0xabc541e6,0xa363a384,0xa384a384,0x8b438b43,0x8b438b43,0xa3848b43,0xa3848b43,0x2923abc5, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xb596b596,0xa534b596,0x7bef94b2,0x5aeb630c,0xb5965aeb,0xb596b596,0x5aeb8410,0x8c71b5b6,0x318652aa,0x31863186,0x52aa3186,0x94b294b2,0x94b20020,0x318652aa,0x31863186,0x52aa3186,0xdeb49cab,0xdeb3deb3,0xdeb3d692,0xde93d672,0xdeb4e6f4,0xd693de93,0xd672d652,0xde93ce31,0xbdf75a89,0x9c306aec,0x94119c30,0x6aec9c31,0x6aec7bef,0x9c719c71,0xa4d28c0f,0x9c30734d, +0x6aa641c4,0x9bc96aa6,0x6ac63983,0x41a493a8,0x6a866286,0x7b076286,0x7b076ac6,0x9be96aa6,0x6aa66aa6,0x6aa63963,0x62866aa6,0x39633963,0x6aa63963,0x39636aa6,0x6aa66ac7,0x6ac66aa6,0xa534ad55,0xbdd7ad75,0xd69ac638,0xd69ad6ba,0xd69ad69a,0xdedbd6ba,0xdefbdedb,0xe71cdefb,0xc423c444,0xd524cc83,0xe647ddc5,0xee67ee87,0xee27ee46,0xeea8ee88,0xeee9eec9,0xff0bf6ea, +0x042e042e,0x04f1044f,0x05f60574,0x05f60617,0x05f605f6,0x06370637,0x1e780e58,0x46ba1e78,0x31642923,0x31643164,0x31843164,0x31843184,0x31843164,0x31843184,0x31843184,0x29233184,0x41c541e6,0x41c541c5,0x41e641c5,0x41e641e6,0x41e641c5,0x41e641e6,0x41e641e6,0x316441e6,0x41c541e6,0x41c541c5,0x41e641c5,0x41e641e6,0x41e641c5,0x41e641e6,0x41e641e6,0x316441e6, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x94b28430,0x738e8c51,0x9cd3a534,0xbdd794b2,0xbdf78c71,0x84107bef,0x94928430,0x9cf38c51,0x73ae73ae,0x73ae73ae,0x8c716b4d,0x7bef8c71,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x7bef7bef,0x7aa79369,0x9369bc2b,0x7aa79369,0x93698430,0x93699369,0x7aa77aa7,0x93699369,0x59e57aa7,0x7aa79369,0x9369bc2b,0x7aa79369,0x93698430,0x93699369,0x7aa77aa7,0x93699369,0x59e57aa7, +0x72e772e7,0x7b0772e7,0x6aa66aa6,0x6aa67b07,0x72e772e7,0x6aa672e7,0x6aa649e4,0x72e76aa6,0x8410a514,0x84108410,0x94927bcf,0x84309492,0x84308430,0x84108430,0x84108410,0x84308430,0x84108410,0x84108410,0x94927bcf,0x84309492,0x84308430,0x84108430,0x84108410,0x84308430,0xb596b5b6,0xb5b6ad55,0xb5b6b5b6,0xd6bab5b6,0xb5b6bdd7,0xb5b6b596,0xb5b6bdd7,0xce79b5b6, +0xb1a2c1e2,0x9162a182,0xb1a2c1e2,0x9162a182,0xb1a2c1e2,0x9162a182,0xb1a2c1e2,0x9162a182,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x0000ffff,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0xffff0000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00001300,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x14200000,0x00001300,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x00000000,0x59a00000,0x59a09325,0x00000000,0x00000000,0x00000000, +0xa514a514,0x7bcf8c51,0xad55b596,0x949294b2,0x94b27bef,0x843094b2,0x9cf3ad55,0xa5148c51,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x8c718c71,0x73ae7bef,0x7bef73ae,0x7aa79369,0xbc2b59e5,0x59e57aa7,0x59e57aa7,0x7aa77aa7,0x59e57aa7,0x7aa77aa7,0x93699369,0x7aa79369,0xbc2b59e5,0x59e57aa7,0x59e57aa7,0x7aa77aa7,0x59e57aa7,0x7aa77aa7,0x93699369, +0xbcccbccc,0x9c299c29,0xbccc9c29,0x9c29bccc,0xbcccbccc,0xb48b9c29,0xbcccbccc,0xbcccbccc,0xad55ce59,0xa514ad55,0xa514a514,0xa514a514,0xad55ad55,0xb596b596,0xa514ad55,0x8430a514,0xad558430,0xa514ad55,0xa514a514,0xa514a514,0xad55ad55,0xb596b596,0xa514ad55,0x8430a514,0x51439a66,0x79e58205,0x79e579e5,0xd6ba79e5,0x79e59a66,0x79e579e5,0x79e58205,0xd69a81e5, +0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0xffff0000,0x00000000,0x00000000,0xffffffff,0xffffffff,0x00000000,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x5a260000,0x00001300,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x14201300,0x00001300,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x00000000,0x93250000,0x59a09325,0x00000000,0x00000000,0x00000000, +0xad55b5b6,0x73ae73ae,0x84107bef,0xc6188410,0xc638a514,0x9cd3ad55,0x8c51a514,0xad75ad55,0x8c717bef,0x8c7173ae,0x7bef6b4d,0x73ae7bef,0x73ae73ae,0x73ae6b4d,0x7bef7bef,0x8c718c71,0x93697aa7,0x7aa77aa7,0x7aa772c8,0x93699369,0x59e57aa7,0x59e5bc2b,0xbc2b7aa7,0x93699369,0x93697aa7,0x7aa77aa7,0x7aa759e5,0x93699369,0x59e57aa7,0x59e5bc2b,0xbc2b7aa7,0x93699369, +0x9c29b48b,0xbccc72e7,0xbcccbccc,0x9c29bccc,0xb48bbccc,0x9c29b48b,0x9c299c29,0xb48b9c29,0xb596ce59,0xb596a514,0xad559cf3,0xa514ad55,0xa514a514,0xa5149cf3,0xad55ad55,0x9492b596,0xb5968430,0xb596a514,0xad559cf3,0xa514ad55,0xa514a514,0xa5149cf3,0xad55ad55,0x9492b596,0x79e59a66,0x79e579c5,0x79e579e5,0xce796184,0x79c59a66,0x79e579e5,0x79e579e5,0xd69a81e5, +0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0x8c71da23,0x916252aa,0x8c71da23,0x91628c71,0x52aada23,0x91628c71,0x52aada23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x00000000,0x0000ffff,0xffff0000,0x0000ffff,0x00000000,0xffffffff,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x5a261420,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x13000000,0x14201420,0x13001300,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x00000000,0x93250000,0x59a09325,0x00000320,0x00000000,0x00000000, +0x94b2bdd7,0x8c518410,0x94929cd3,0x7bcf8430,0x9492632c,0x7bef8c51,0xa5349cf3,0x84307bcf,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x73ae73ae,0x73ae73ae,0x7bef73ae,0x59e57aa7,0x7aa79369,0x93699369,0x7aa7bc2b,0x7aa77aa7,0x7aa77aa7,0x7aa77aa7,0xbc2bbc2b,0x59e57aa7,0x7aa79369,0x93699369,0x7aa7bc2b,0x7aa77aa7,0x7aa77aa7,0x7aa77aa7,0xbc2bbc2b, +0xbcccbccc,0xbcccbccc,0x9c29bccc,0x9c29bccc,0x9c299c29,0x9c299c29,0x72e7b48b,0xbcccbccc,0xa514ce59,0xa514a514,0xa514a514,0xa514a514,0xb596b596,0xa514a514,0xa514a514,0x8430a514,0xa5148430,0xa514a514,0xa514a514,0xa514a514,0xb596b596,0xa514a514,0xa514a514,0x8430a514,0xa2679a67,0x9a66aaa7,0x9a669a66,0xce799246,0xb2c89246,0x9a669a66,0x9a669a46,0xe71c9a67, +0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xda23da23,0x52aada23,0xda23da23,0xa9a252aa,0x000052aa,0x52aa0000,0xda2352aa,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0x00000000,0xffff0000,0x0000ffff,0xffffffff,0x0000ffff,0x00000000,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x13000000,0x00001420,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x14200000,0x14201300,0x00001300,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x03200320,0x03200000,0x59a00000,0x4e649325,0x00004e64,0x00000000,0x00000000, +0xad758430,0xa5148430,0x843094b2,0x8c519492,0x949294b2,0x7bcf8c71,0x7bef7bef,0x8c517bef,0x7bef6b4d,0x7bef7bef,0x7bef73ae,0x7bef7bef,0x8c718c71,0x7bef7bef,0x8c717bef,0x6b4d8c71,0x7aa79369,0x93697aa7,0xbc2b9369,0x93697aa7,0x93696b6d,0x7aa79369,0x936959e5,0x59e57aa7,0x7aa79369,0x93697aa7,0xbc2b9369,0x93697aa7,0x93696b6d,0x7aa79369,0x936959e5,0x59e57aa7, +0x6aa672e7,0x72e772e7,0x6aa66aa6,0x72e76aa6,0x72e772e7,0x72e772e7,0x6aa66aa6,0x72e76aa6,0xad55c618,0xad55ad55,0xad55a514,0xad55ad55,0xb596b596,0xad55ad55,0xb596ad55,0x7bcfb596,0xad557bcf,0xad55ad55,0xad55a514,0xad55ad55,0xb596b596,0xad55ad55,0xb596ad55,0x7bcfb596,0xb5b6b5b6,0xd6baad75,0xb5b6b5b6,0xb5b6b5b6,0xb5b6b5b6,0xdedbb596,0xbdd7b596,0xb5b6b596, +0xa182b1c2,0x79218942,0xa182b1c2,0x79218942,0xa182b1c2,0x79218942,0xa182b1c2,0x79218942,0x9162a9a2,0x91629162,0x91620000,0x91620000,0x52aa0000,0x00009162,0x916252aa,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x00000000,0xffff0000,0xffffffff,0xffff0000,0xffff0000,0xffffffff,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x14205a26,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x14200000,0x00001420,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x03204e64,0x03200320,0x03200000,0x93250320,0x000059a0,0x00000000,0x03200000, +0x9cf39cd3,0xa53494b2,0xb5b68410,0x94928c71,0x7bcfc618,0x8410a534,0x8c518c71,0x8c718430,0x7bef7bef,0x73ae8c71,0x8c7173ae,0x73ae8c71,0x73ae6b4d,0x8c718c71,0x7bef8c71,0x7bef7bef,0x93699369,0xbc2b7aa7,0x7aa7bc2b,0x9369bc2b,0xbc2b59e5,0x7aa7bc2b,0x93699369,0x7aa78430,0x93699369,0xbc2b7aa7,0x7aa7bc2b,0x9369bc2b,0xbc2b59e5,0x7aa7bc2b,0x93699369,0x7aa78430, +0xb48bbccc,0xb48bb48b,0xbcccbccc,0x9c299c29,0x9c299c29,0xb48bb48b,0xb48bb48b,0x9c29b48b,0xad55ce59,0xa514b596,0xb596a514,0xa514b596,0xa5149cf3,0xb596b596,0xad55b596,0x8430ad55,0xad558430,0xa514b596,0xb596a514,0xa514b596,0xa5149cf3,0xb596b596,0xad55b596,0x8430ad55,0x79e58a26,0xdefb8a05,0x79e59a66,0x79e55964,0x820569a4,0xd69a79e5,0x79e59a66,0x79e58205, +0xad75ad75,0xad75ce79,0xce79ad75,0xad75ad75,0xce79ad75,0xad75ad75,0xad75ce79,0xad75ad75,0x8c71da23,0x91628c71,0x0000da23,0x00000000,0x8c710000,0x916252aa,0x8c710000,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x00000000,0x0000ffff,0xffff0000,0xffff0000,0x00000000,0x0000ffff,0x0000ffff,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x5a260000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf7c00000,0xb5e0f7c0,0x8c808c80,0x0000ce80,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x4e640000,0x59a00320,0x4e640000,0x59a00320,0x4e6459a0,0x00000320,0x03200320, +0x841094b2,0x8c71b5b6,0x9cd38c71,0x8410ad55,0x94928430,0xad559492,0xb5968c71,0x84108c71,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x7bef73ae,0x7bef6b4d,0x73ae7bef,0x73ae73ae,0x7bef8c71,0x93699369,0x7aa759e5,0x59e57aa7,0x7aa759e5,0x7aa77aa7,0x7aa77aa7,0xbc2bbc2b,0x93697aa7,0x93699369,0x7aa759e5,0x59e57aa7,0x7aa759e5,0x7aa77aa7,0x7aa77aa7,0xbc2bbc2b,0x93697aa7, +0x9c299c29,0x9c299c29,0xbccc9c29,0xb48bb48b,0x9c299c29,0x72e79c29,0x9c29bccc,0x9c299c29,0xa514ce59,0xa514a514,0xa514a514,0xad55a514,0xad559cf3,0xa514ad55,0xa514a514,0x8430b596,0xa5148430,0xa514a514,0xa514a514,0xad55a514,0xad559cf3,0xa514ad55,0xa514a514,0x8430b596,0x79e579e5,0xce7979e5,0x79e59246,0x79e579e5,0x8a268205,0xce7979c5,0x8a059a66,0x79e579e5, +0xad75ce79,0x0000ad75,0xad75ce79,0xce790000,0x0000ce79,0xce79ce79,0xad750000,0xce79ad75,0x8c71da23,0x52aa52aa,0x00000000,0x00000000,0x00000000,0x91628c71,0x52aa0000,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x00000000,0x0000ffff,0xffff0000,0xffffffff,0xffff0000,0x00000000,0x0000ffff,0xffff0000, +0x00000000,0x00000000,0x00000000,0x14203d19,0x00001300,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xce80ce80,0x8c80f7c0,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x93250320,0x932559a0,0x03209325,0x93259325,0x93259325,0x00004e64, +0x9cd38410,0xad55b5b6,0x8410ad75,0x9cf3ad75,0xad55b596,0x94928410,0x94928430,0x7bef7bef,0x8c717bef,0x6b4d8c71,0x73ae8c71,0x7bef7bef,0x8c717bef,0x8c718c71,0x8c718c71,0x8c718c71,0x7aa79369,0x93697aa7,0x93697aa7,0x59e57aa7,0x93697aa7,0x7aa79369,0x7aa77aa7,0x7aa759e5,0x7aa79369,0x93697aa7,0x93697aa7,0x59e57aa7,0x93697aa7,0x7aa79369,0x7aa77aa7,0x7aa759e5, +0xbcccbccc,0xbcccbccc,0x72e7bccc,0xbccc9c29,0xb48bbccc,0xb48bb48b,0xbcccbccc,0x9c29bccc,0xce79ce59,0xc618ce79,0xc638ce79,0xce59ce59,0xce79ce59,0xce79ce79,0xce79ce79,0xb596ce79,0xb5968430,0x9cf3b596,0xa514b596,0xad55ad55,0xb596ad55,0xb596b596,0xb596b596,0x9492b596,0x9a66a267,0xd69a9a66,0x9a669a46,0xb2c8a287,0x9a66a267,0xd69a9a66,0x9a669a66,0x79e5b2c8, +0xce79ce79,0x0000ce79,0xce79ce79,0xce790000,0x00000000,0xce79ce79,0xce790000,0xce79ce79,0xda23da23,0xa9a2da23,0xda23da23,0x00000000,0x52aa0000,0x52aada23,0x000052aa,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0x00000000,0x0000ffff,0x0000ffff,0xffff0000,0xffffffff,0xffffffff,0xffffffff,0xffffffff, +0x00000000,0x00000000,0x00000000,0x3cd73ddc,0x33f333f3,0x00003d19,0x00000000,0x00000000,0x00000000,0x00000000,0xce800000,0x0000f7c0,0xb5e0f7c0,0x0000f7c0,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x03200000,0x93250000,0x93259325,0x03200320,0x59a00320,0x03200000,0x00000000, +0x84308c71,0x8c519cf3,0x7bef9492,0x8430a534,0xad7594b2,0x84108430,0xa5148c71,0xad557bef,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x6b4d73ae,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x7aa7bc2b,0xbc2bbc2b,0x93699369,0x7aa77aa7,0x59e59369,0x93699369,0x7aa77aa7,0x93699369,0x7aa7bc2b,0xbc2bbc2b,0x93699369,0x7aa77aa7,0x59e59369,0x93699369,0x7aa77aa7,0x93699369, +0x72e772e7,0x6aa66aa6,0x6aa66aa6,0x72e76aa6,0x72e772e7,0x6aa66aa6,0x6aa66aa6,0x72e772e7,0x8430ad55,0x84108430,0x84108410,0x84108410,0x7bcf8410,0x84108410,0x84108410,0x84308430,0xad558430,0xa514ad55,0xa514a514,0xa514a514,0x9cf3a514,0xa514a514,0xa514a514,0x8430ad55,0xb5b6b5b6,0xb596b5b6,0xbdd7b596,0xd6bab5b6,0xb5b6b5b6,0xb5b6b596,0xb5b6b5b6,0xd6bab5b6, +0xce79ce79,0x0000ce79,0xce79ce79,0x00000000,0x0000ce79,0xce79ce79,0xce790000,0xce79ce79,0x9162a9a2,0x91629162,0x000052aa,0x00000000,0x00000000,0x916252aa,0x0000a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x0000ffff,0x00000000,0x0000ffff,0xffff0000, +0x00000000,0x00000000,0x3d190000,0x3d193d19,0x33f33ddc,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x4e640000,0x00000320,0x932559a0,0x4e644e64,0x00000000,0x03204e64,0x00000320, +0x9cf37bef,0x9492a534,0x84109492,0x7bef8c51,0x84308430,0xad75b5b6,0xa5349492,0x8c7194b2,0x8c718c71,0x84107bef,0x73ae7bef,0x8c718c71,0x7bef7bef,0x7bef7bef,0x8c718c71,0x6b4d8c71,0x59e5bc2b,0x7aa77aa7,0x7aa78430,0xbc2b7aa7,0x7aa7bc2b,0xbc2bbc2b,0x93697aa7,0x93697aa7,0x59e5bc2b,0x7aa77aa7,0x7aa78430,0xbc2b7aa7,0x7aa7bc2b,0xbc2bbc2b,0x93697aa7,0x93697aa7, +0xbcccbccc,0xb48bbccc,0xbcccbccc,0x9c29bccc,0x9c299c29,0xbccc72e7,0xbcccbccc,0xbcccbccc,0xb596ce79,0xad55ad55,0xa514ad55,0xb596b596,0xad55ad55,0xad55ad55,0xb596b596,0x7bcfb596,0xb5969492,0xad55ad55,0xa514ad55,0xb596b596,0xad55ad55,0xad55ad55,0xb596b596,0x7bcfb596,0x59649a66,0x69a48a05,0x618479e5,0xdefb79e5,0x69a4aaa7,0x71c58205,0x79e579e5,0xd69a79e5, +0xdedbce79,0x00000000,0xce790000,0xce790000,0x0000dedb,0x0000ce79,0x00000000,0xce79dedb,0x8c71da23,0x52aa52aa,0x8c71da23,0x52aa0000,0x52aa0000,0x52aa0000,0x000052aa,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x00000000,0x0000ffff,0x0000ffff,0xffffffff,0xffff0000,0xffff0000,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x33f33ddc,0x3cd73d19,0x00003d19,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x59a00000,0x59a09325,0x93259325,0x032059a0,0x4e640000,0x00000320, +0x9cd39cd3,0xa5347bcf,0x94b28410,0x9cd394b2,0x94b28430,0x84108c51,0x8c517bcf,0x94b28c71,0x73ae73ae,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x6b4d7bef,0x7bef7bef,0x73ae73ae,0x7bef6b4d,0x59e57aa7,0x93699369,0x93697aa7,0x59e559e5,0x7aa759e5,0x59e57aa7,0x7aa77aa7,0xbc2b7aa7,0x59e57aa7,0x93699369,0x93697aa7,0x59e559e5,0x7aa759e5,0x59e57aa7,0x7aa77aa7,0xbc2b7aa7, +0x9c299c29,0xb48b72e7,0xb48bb48b,0x9c29bccc,0xb48bb48b,0xb48bb48b,0x9c299c29,0x9c299c29,0xa514c638,0xad55ad55,0xa514ad55,0xa514a514,0x9cf3ad55,0xad55ad55,0xa514a514,0x84309cf3,0xa5148410,0xad55ad55,0xa514ad55,0xa514a514,0x9cf3ad55,0xad55ad55,0xa514a514,0x84309cf3,0x79e59a66,0x79e59a66,0x79e56184,0xd69a79c5,0x79e59a66,0x79e571a4,0x79e569a4,0xd6ba79e5, +0xdedbdedb,0xce79dedb,0xdedbdedb,0xdedbdedb,0xdedbce79,0xce79dedb,0xdedbce79,0xce79dedb,0x8c71da23,0x91628c71,0x0000da23,0x91620000,0x8c7152aa,0x52aa52aa,0x8c710000,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x00000000,0x0000ffff,0xffff0000,0xffff0000,0x00000000,0x0000ffff,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x3ddc0000,0x00003ddc,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x03200000,0x032059a0,0x00000320,0x93250320,0x59a09325,0x932559a0,0x00000000, +0x8410a514,0x8410ad75,0xad75ad75,0xad758c51,0x73aebdd7,0xa5348410,0x7befad55,0x8c718c51,0x8c717bef,0x73ae8c71,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x8c718c71,0x6b4d8c71,0x7aa79369,0xbc2b9369,0x936959e5,0x7aa77aa7,0x59e59369,0x6b6d7aa7,0x93697aa7,0x7aa759e5,0x7aa79369,0xbc2b9369,0x936959e5,0x7aa77aa7,0x59e559e5,0x6b6d59e5,0x93697aa7,0x7aa759e5, +0x9c29bccc,0x9c299c29,0xbccc9c29,0x9c29bccc,0x9c29bccc,0x72e79c29,0xb48bb48b,0xbcccb48b,0xb596ce59,0xa514b596,0xa514a514,0xa514a514,0xa514a514,0xb596b596,0xb596b596,0x7bcfb596,0xb5968430,0xa514b596,0xa514a514,0xa514a514,0xa514a514,0xb596b596,0xb596b596,0x7bcfb596,0x9a668a26,0x9a669a66,0x92469a66,0xd69a9a66,0xaa87aa87,0x9a66a267,0x9a669a66,0xd69a9a66, +0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xda23da23,0xa9a2da23,0xda2352aa,0xa9a252aa,0xda2352aa,0x00000000,0xda2352aa,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0x00000000,0xffff0000,0x0000ffff,0xffff0000,0xffff0000,0xffff0000,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x4e640000,0x03209325,0x00000320,0x03200320,0x932559a0,0x03209325,0x00000000, +0x843073ae,0x94b28c51,0x9cd39492,0x7bcf7bef,0x84107bef,0x94b28c71,0x8c518c71,0x7bef8c71,0x8c717bef,0x7bef7bef,0x6b4d7bef,0x8c717bef,0x7bef7bef,0x73ae73ae,0x73ae73ae,0x7bef73ae,0x6b6d9369,0x7aa7bc2b,0x59e59369,0xbc2b7aa7,0x93699369,0x93697aa7,0xbc2b7aa7,0x7aa79369,0x6b6d59e5,0x59e559e5,0x59e57588,0x59e559e5,0x59e55ce6,0x59e56d68,0x59e57aa7,0x7aa759e5, +0x6aa66aa6,0x72e76aa6,0x72e772e7,0x72e772e7,0x72e772e7,0x6aa66aa6,0x6aa66aa6,0x72e772e7,0xb596ce59,0xad55ad55,0x9cf3ad55,0xb596ad55,0xad55ad55,0xa514a514,0xa514a514,0x8430a514,0xb5968430,0xad55ad55,0x9cf3ad55,0xb596ad55,0xad55ad55,0xa514a514,0xa514a514,0x8430a514,0xbdd7bdd7,0xd6bab596,0xb5b6b5b6,0xb596b5b6,0xbdd7b5b6,0xdefbb5b6,0xb5b6b5b6,0xbdf7b596, +0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0x9162a9a2,0x52aa9162,0x9162a9a2,0x916252aa,0x000052aa,0x91629162,0x916252aa,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x00000000,0xffff0000,0x00000000,0xffffffff,0x0000ffff,0x00000000,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x03204e64,0x4e640000,0x03204e64,0x03200000,0x00009325,0x00000000, +0xbdd7a514,0x8430b596,0x8c518c51,0x94929492,0x9cf394b2,0xad75ad55,0x73ae8430,0xb5b68410,0x6b4d7bef,0x73ae73ae,0x73ae6b4d,0x73ae73ae,0x73ae8c71,0x7bef7bef,0x8c717bef,0x7bef7bef,0x7aa7bc2b,0x59e57aa7,0x7aa7bc2b,0x7aa77aa7,0x7aa7bc2b,0x7aa77aa7,0x59e559e5,0x7aa7bc2b,0x59e58deb,0x65279e4d,0x59e56d47,0x59e57588,0x7dea75a9,0x962c960c,0x54a559e5,0x59e56506, +0xbcccbccc,0x9c299c29,0x9c299c29,0xb48bb48b,0xbcccbccc,0xb48bbccc,0xbccc72e7,0x9c29bccc,0x9cf3ce59,0xa514a514,0xa5149cf3,0xa514a514,0xa514b596,0xad55ad55,0xb596ad55,0x8430ad55,0x9cf38430,0xa514a514,0xa5149cf3,0xa514a514,0xa514b596,0xad55ad55,0xb596ad55,0x8430ad55,0x8a2679e5,0xd69a69a4,0x79e59a66,0x71a479e5,0x79e579e5,0xd69a79e5,0x92268205,0x8a2679e5, +0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0x8c71da23,0x916252aa,0x8c71da23,0x000052aa,0x52aa0000,0x91628c71,0x52aada23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x00000000,0xffffffff,0xffffffff,0x00000000,0x0000ffff,0xffff0000,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x4e644e64,0x00000000,0x00000000,0x03204e64,0x00000320,0x00000000, +0x8c7194b2,0x94b2a514,0x84109cd3,0x84108c51,0xad557bef,0x9492a534,0x8c718410,0x8c518430,0x7bef7bef,0x8c718c71,0x8c718c71,0x8c718c71,0x8c7173ae,0x8c718c71,0x7bef6b4d,0x73ae7bef,0x93697aa7,0x7aa759e5,0x93697aa7,0x59e58430,0xbc2b7aa7,0x7aa79369,0x93697aa7,0x59e559e5,0x6d6875a9,0x858a8dcb,0x59e5858a,0x65076d47,0x960c5ce6,0x758995ec,0x6d686506,0x6d486527, +0xbcccbccc,0x72e7b48b,0xb48bb48b,0x9c299c29,0x9c299c29,0xb48b9c29,0xb48b9c29,0x9c29bccc,0xad55ce59,0xb596b596,0xb596b596,0xb596b596,0xb596a514,0xb596b596,0xad559cf3,0x8410ad55,0xad558430,0xb596b596,0xb596b596,0xb596b596,0xb596a514,0xb596b596,0xad559cf3,0x8410ad55,0x79e579e5,0xe71c8205,0x79e5b2c8,0x618469a4,0x71c579e5,0xd69a8205,0x79e59a66,0x79e579e5, +0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0xffff0000,0x00000000,0x00000000,0x00000000,0xffffffff,0x0000ffff,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x4e640000,0x00000000,0x00000000, +0x94b294b2,0x84309492,0x8c718430,0x8c717bef,0x94b29cf3,0x84308c51,0x84108c51,0x8c71738e,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x8c718c71,0x8c716b4d,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x9369bc2b,0x7aa79369,0xbc2b7aa7,0x93699369,0x7aa77aa7,0x7aa759e5,0xbc2b7aa7,0xbc2b7aa7,0x75a975a9,0x65277589,0x6d686527,0x6d685ce6,0x75a97dea,0x65276d48,0x65066d47,0x6d685484, +0x9c29bccc,0x9c299c29,0xbccc9c29,0xb48bbccc,0xbccc9c29,0xbcccbccc,0xbcccbccc,0x9c29bccc,0xc638ce59,0xc638c638,0xce59c638,0xce79ce79,0xce79c618,0xc638ce59,0xc638c638,0xad55c638,0x84108430,0x84108410,0x84308410,0x94929492,0x94927bcf,0x84108430,0x84108410,0x84308410,0x92469a66,0xce799a66,0x9a679a66,0xa2879226,0xaaa79a66,0xd69a8a26,0xaa879a66,0x9a669a66, +0xc9e2da23,0xa1a2b1c2,0xc9e2da23,0xa1a2b1c2,0xc9e2da23,0xa1a2b1c2,0xc9e2da23,0xa1a2b1c2,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0x0000ffff,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0xffff0000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0 }; diff --git a/minecraftcpp-master/handheld/data/lang/en_US.lang b/minecraftcpp-master/handheld/data/lang/en_US.lang new file mode 100644 index 0000000..31a820f --- /dev/null +++ b/minecraftcpp-master/handheld/data/lang/en_US.lang @@ -0,0 +1,967 @@ + +language.name=English +language.region=US +language.code=en_US + +gui.done=Done +gui.cancel=Cancel +gui.toMenu=Back to title screen +gui.up=Up +gui.down=Down +gui.yes=Yes +gui.no=No + +menu.singleplayer=Singleplayer +menu.multiplayer=Multiplayer +menu.mods=Texture Packs +menu.options=Options... +menu.quit=Quit Game +menu.returnToMenu=Save and Quit to Title +menu.disconnect=Disconnect +menu.returnToGame=Back to Game +menu.switchingLevel=Switching level +menu.generatingLevel=Generating level +menu.loadingLevel=Loading level +menu.generatingTerrain=Building terrain +menu.simulating=Simulating the world for a bit +menu.respawning=Respawning + +selectWorld.title=Select World +selectWorld.empty=empty +selectWorld.world=World +selectWorld.select=Play Selected World +selectWorld.create=Create New World +selectWorld.createDemo=Play New Demo World +selectWorld.delete=Delete +selectWorld.rename=Rename +selectWorld.deleteQuestion=Are you sure you want to delete this world? +selectWorld.deleteWarning=will be lost forever! (A long time!) +selectWorld.deleteButton=Delete +selectWorld.renameButton=Rename +selectWorld.renameTitle=Rename World +selectWorld.conversion=Must be converted! +selectWorld.newWorld=New World +selectWorld.enterName=World Name +selectWorld.resultFolder=Will be saved in: +selectWorld.enterSeed=Seed for the World Generator +selectWorld.seedInfo=Leave blank for a random seed + +gameMode.survival=Survival Mode +gameMode.creative=Creative Mode +gameMode.hardcore=Hardcore Mode! +gameMode.changed=Your game mode has been changed + +selectWorld.gameMode=Game Mode: +selectWorld.gameMode.survival=Survival +selectWorld.gameMode.survival.line1=Search for resources, crafting, gain +selectWorld.gameMode.survival.line2=levels, health and hunger +selectWorld.gameMode.creative=Creative +selectWorld.gameMode.creative.line1=Unlimited resources, free flying and +selectWorld.gameMode.creative.line2=destroy blocks instantly +selectWorld.gameMode.hardcore=Hardcore +selectWorld.gameMode.hardcore.line1=Same as survival mode, locked at hardest +selectWorld.gameMode.hardcore.line2=difficulty, and one life only +selectWorld.moreWorldOptions=More World Options... +selectWorld.mapFeatures=Generate Structures: +selectWorld.mapFeatures.info=Villages, dungeons etc +selectWorld.mapType=World Type: +selectWorld.mapType.normal=Normal +selectWorld.hardcoreMode=Hardcore: +selectWorld.hardcoreMode.info=World is deleted upon death + +generator.default=Default +generator.flat=Superflat + +selectServer.title=Select Server +selectServer.empty=empty +selectServer.select=Join Server +selectServer.direct=Direct Connect +selectServer.edit=Edit +selectServer.delete=Delete +selectServer.add=Add server +selectServer.defaultName=Minecraft Server +selectServer.deleteQuestion=Are you sure you want to remove this server? +selectServer.deleteWarning=will be lost forever! (A long time!) +selectServer.deleteButton=Delete +selectServer.refresh=Refresh +addServer.title=Edit Server Info +addServer.enterName=Server Name +addServer.enterIp=Server Address +addServer.add=Done + +multiplayer.title=Play Multiplayer +multiplayer.connect=Connect +multiplayer.info1=Minecraft Multiplayer is currently not finished, but there +multiplayer.info2=is some buggy early testing going on. +multiplayer.ipinfo=Enter the IP of a server to connect to it: + +multiplayer.downloadingTerrain=Downloading terrain + +multiplayer.stopSleeping=Leave Bed + +demo.day.1=This demo will last five game days, do your best! +demo.day.2=Day Two +demo.day.3=Day Three +demo.day.4=Day Four +demo.day.5=This is your last day! +demo.day.warning=Your time is almost up! +demo.day.6=You have passed your fifth day, use F2 to save a screenshot of your creation +demo.reminder=The demo time has expired, buy the game to continue or start a new world! +demo.help.movement=Use %1$s, %2$s, %3$s, %4$s and the mouse to move around +demo.help.jump=Jump by pressing %1$s +demo.help.inventory=Use %1$s to open your inventory + +connect.connecting=Connecting to the server... +connect.authorizing=Logging in... +connect.failed=Failed to connect to the server + +disconnect.genericReason=%s +disconnect.disconnected=Disconnected by Server +disconnect.lost=Connection Lost +disconnect.kicked=Was kicked from the game +disconnect.timeout=Timed out +disconnect.closed=Connection closed +disconnect.loginFailed=Failed to login +disconnect.loginFailedInfo=Failed to login: %s +disconnect.quitting=Quitting +disconnect.endOfStream=End of stream +disconnect.overflow=Buffer overflow + +options.off=OFF +options.on=ON +options.title=Options +options.controls=Controls... +options.video=Video Settings... +options.language=Language... +options.languageWarning=Language translations may not be 100% accurate +options.videoTitle=Video Settings +options.music=Music +options.sound=Sound +options.invertMouse=Invert Mouse +options.fov=FOV +options.fov.min=Normal +options.fov.max=Quake Pro +options.gamma=Brightness +options.gamma.min=Moody +options.gamma.max=Bright +options.sensitivity=Sensitivity +options.sensitivity.min=*yawn* +options.sensitivity.max=HYPERSPEED!!! +options.renderDistance=Render Distance +options.renderDistance.tiny=Tiny +options.renderDistance.short=Short +options.renderDistance.normal=Normal +options.renderDistance.far=Far +options.viewBobbing=View Bobbing +options.ao=Smooth Lighting +options.anaglyph=3D Anaglyph +options.framerateLimit=Performance +options.difficulty=Difficulty +options.difficulty.peaceful=Peaceful +options.difficulty.easy=Easy +options.difficulty.normal=Normal +options.difficulty.hard=Hard +options.difficulty.hardcore=Hardcore +options.graphics=Graphics +options.graphics.fancy=Fancy +options.graphics.fast=Fast +options.guiScale=GUI Scale +options.guiScale.auto=Auto +options.guiScale.small=Small +options.guiScale.normal=Normal +options.guiScale.large=Large +options.advancedOpengl=Advanced OpenGL +options.renderClouds=Clouds +options.farWarning1=A 64 bit Java installation is recommended +options.farWarning2=for 'Far' render distance (you have 32 bit) +options.particles=Particles +options.particles.all=All +options.particles.decreased=Decreased +options.particles.minimal=Minimal + +performance.max=Max FPS +performance.balanced=Balanced +performance.powersaver=Power saver + +controls.title=Controls + +key.forward=Forward +key.left=Left +key.back=Back +key.right=Right +key.jump=Jump +key.inventory=Inventory +key.drop=Drop +key.chat=Chat +key.fog=Toggle Fog +key.sneak=Sneak +key.playerlist=List Players +key.attack=Attack +key.use=Use Item +key.pickItem=Pick Block +key.mouseButton=Button %1$s + +texturePack.openFolder=Open texture pack folder +texturePack.title=Select Texture Pack +texturePack.folderInfo=(Place texture pack files here) + +tile.stone.name=Stone +tile.grass.name=Grass Block +tile.dirt.name=Dirt +tile.stonebrick.name=Cobblestone +tile.wood.name=Wooden Planks +tile.sapling.name=Sapling +tile.deadbush.name=Dead Bush +tile.bedrock.name=Bedrock +tile.water.name=Water +tile.lava.name=Lava +tile.sand.name=Sand +tile.sandStone.name=Sandstone +tile.gravel.name=Gravel +tile.oreGold.name=Gold Ore +tile.oreIron.name=Iron Ore +tile.oreCoal.name=Coal Ore +tile.log.name=Wood +tile.leaves.name=Leaves +tile.tallgrass.name=Grass +tile.tallgrass.shrub.name=Shrub +tile.tallgrass.grass.name=Grass +tile.tallgrass.fern.name=Fern +tile.sponge.name=Sponge +tile.glass.name=Glass +tile.thinGlass.name=Glass Pane +tile.cloth.name=Wool +tile.flower.name=Flower +tile.rose.name=Rose +tile.mushroom.name=Mushroom +tile.blockGold.name=Block of Gold +tile.blockIron.name=Block of Iron +tile.stoneSlab.stone.name=Stone Slab +tile.stoneSlab.sand.name=Sandstone Slab +tile.stoneSlab.wood.name=Wooden Slab +tile.stoneSlab.cobble.name=Cobblestone Slab +tile.stoneSlab.brick.name=Bricks Slab +tile.stoneSlab.smoothStoneBrick.name=Stone Bricks Slab +tile.brick.name=Bricks +tile.tnt.name=TNT +tile.bookshelf.name=Bookshelf +tile.stoneMoss.name=Moss Stone +tile.obsidian.name=Obsidian +tile.torch.name=Torch +tile.fire.name=Fire +tile.mobSpawner.name=Monster Spawner +tile.stairsWood.name=Wooden Stairs +tile.chest.name=Chest +tile.redstoneDust.name=Redstone Dust +tile.oreDiamond.name=Diamond Ore +tile.blockDiamond.name=Block of Diamond +tile.workbench.name=Crafting Table +tile.crops.name=Crops +tile.farmland.name=Farmland +tile.furnace.name=Furnace +tile.sign.name=Sign +tile.doorWood.name=Wooden Door +tile.ladder.name=Ladder +tile.rail.name=Rail +tile.goldenRail.name=Powered Rail +tile.detectorRail.name=Detector Rail +tile.stairsStone.name=Stone Stairs +tile.lever.name=Lever +tile.pressurePlate.name=Pressure Plate +tile.doorIron.name=Iron Door +tile.oreRedstone.name=Redstone Ore +tile.notGate.name=Redstone Torch +tile.button.name=Button +tile.snow.name=Snow +tile.ice.name=Ice +tile.cactus.name=Cactus +tile.clay.name=Clay +tile.reeds.name=Sugar cane +tile.jukebox.name=Jukebox +tile.fence.name=Fence +tile.fenceGate.name=Fence Gate +tile.pumpkin.name=Pumpkin +tile.litpumpkin.name=Jack 'o' Lantern +tile.hellrock.name=Netherrack +tile.hellsand.name=Soul Sand +tile.lightgem.name=Glowstone +tile.portal.name=Portal +tile.cloth.black.name=Black Wool +tile.cloth.red.name=Red Wool +tile.cloth.green.name=Green Wool +tile.cloth.brown.name=Brown Wool +tile.cloth.blue.name=Blue Wool +tile.cloth.purple.name=Purple Wool +tile.cloth.cyan.name=Cyan Wool +tile.cloth.silver.name=Light Gray Wool +tile.cloth.gray.name=Gray Wool +tile.cloth.pink.name=Pink Wool +tile.cloth.lime.name=Lime Wool +tile.cloth.yellow.name=Yellow Wool +tile.cloth.lightBlue.name=Blue Light Wool +tile.cloth.magenta.name=Magenta Wool +tile.cloth.orange.name=Orange Wool +tile.cloth.white.name=Wool +tile.oreLapis.name=Lapis Lazuli Ore +tile.blockLapis.name=Lapis Lazuli Block +tile.dispenser.name=Dispenser +tile.musicBlock.name=Note Block +tile.cake.name=Cake +tile.bed.name=Bed +tile.bed.occupied=This bed is occupied +tile.bed.noSleep=You can only sleep at night +tile.bed.notSafe=You may not rest now, there are monsters nearby +tile.bed.notValid=Your home bed was missing or obstructed +tile.lockedchest.name=Locked chest +tile.trapdoor.name=Trapdoor +tile.web.name=Cobweb +tile.stonebricksmooth.name=Stone Bricks +tile.pistonBase.name=Piston +tile.pistonStickyBase.name=Sticky Piston +tile.fenceIron.name=Iron Bars +tile.melon.name=Melon +tile.stairsBrick.name=Brick Stairs +tile.stairsStoneBrickSmooth.name=Stone Brick Stairs +tile.vine.name=Vines +tile.netherBrick.name=Nether Brick +tile.netherFence.name=Nether Brick Fence +tile.stairsNetherBrick.name=Nether Brick Stairs +tile.netherStalk.name=Nether Wart +tile.cauldron.name=Cauldron +tile.enchantmentTable.name=Enchantment Table +tile.whiteStone.name=End Stone +tile.mycel.name=Mycelium +tile.waterlily.name=Lily Pad +tile.dragonEgg.name=Dragon Egg +tile.redstoneLight.name=Redstone Lamp +tile.glowingobsidian.name=Glowing Obsidian +tile.netherreactor.name=Nether Reactor Core +tile.quartzBlock.name=Block of Quartz +tile.stairsQuartz.name=Quartz Stairs +tile.stairsSandStone.name=Sand Stone Stairs +tile.stonecutter.name=Stonecutter + +item.shovelIron.name=Iron Shovel +item.pickaxeIron.name=Iron Pickaxe +item.hatchetIron.name=Iron Axe +item.flintAndSteel.name=Flint and Steel +item.apple.name=Apple +item.cookie.name=Cookie +item.bow.name=Bow +item.arrow.name=Arrow +item.coal.name=Coal +item.charcoal.name=Charcoal +item.emerald.name=Diamond +item.ingotIron.name=Iron Ingot +item.ingotGold.name=Gold Ingot +item.swordIron.name=Iron Sword +item.swordWood.name=Wooden Sword +item.shovelWood.name=Wooden Shovel +item.pickaxeWood.name=Wooden Pickaxe +item.hatchetWood.name=Wooden Axe +item.swordStone.name=Stone Sword +item.shovelStone.name=Stone Shovel +item.pickaxeStone.name=Stone Pickaxe +item.hatchetStone.name=Stone Axe +item.swordDiamond.name=Diamond Sword +item.shovelDiamond.name=Diamond Shovel +item.pickaxeDiamond.name=Diamond Pickaxe +item.hatchetDiamond.name=Diamond Axe +item.stick.name=Stick +item.bowl.name=Bowl +item.mushroomStew.name=Mushroom Stew +item.swordGold.name=Golden Sword +item.shovelGold.name=Golden Shovel +item.pickaxeGold.name=Golden Pickaxe +item.hatchetGold.name=Golden Axe +item.string.name=String +item.feather.name=Feather +item.sulphur.name=Gunpowder +item.hoeWood.name=Wooden Hoe +item.hoeStone.name=Stone Hoe +item.hoeIron.name=Iron Hoe +item.hoeDiamond.name=Diamond Hoe +item.hoeGold.name=Golden Hoe +item.seeds.name=Seeds +item.seeds_pumpkin.name=Pumpkin Seeds +item.seeds_melon.name=Melon Seeds +item.melon.name=Melon +item.wheat.name=Wheat +item.bread.name=Bread +item.helmetCloth.name=Leather Cap +item.chestplateCloth.name=Leather Tunic +item.leggingsCloth.name=Leather Pants +item.bootsCloth.name=Leather Boots +item.helmetChain.name=Chain Helmet +item.chestplateChain.name=Chain Chestplate +item.leggingsChain.name=Chain Leggings +item.bootsChain.name=Chain Boots +item.helmetIron.name=Iron Helmet +item.chestplateIron.name=Iron Chestplate +item.leggingsIron.name=Iron Leggings +item.bootsIron.name=Iron Boots +item.helmetDiamond.name=Diamond Helmet +item.chestplateDiamond.name=Diamond Chestplate +item.leggingsDiamond.name=Diamond Leggings +item.bootsDiamond.name=Diamond Boots +item.helmetGold.name=Golden Helmet +item.chestplateGold.name=Golden Chestplate +item.leggingsGold.name=Golden Leggings +item.bootsGold.name=Golden Boots +item.flint.name=Flint +item.porkchopRaw.name=Raw Porkchop +item.porkchopCooked.name=Cooked Porkchop +item.chickenRaw.name=Raw Chicken +item.chickenCooked.name=Cooked Chicken +item.beefRaw.name=Raw Beef +item.beefCooked.name=Steak +item.painting.name=Painting +item.appleGold.name=Golden Apple +item.sign.name=Sign +item.doorWood.name=Wooden Door +item.bucket.name=Bucket +item.bucketWater.name=Water Bucket +item.bucketLava.name=Lava Bucket +item.minecart.name=Minecart +item.saddle.name=Saddle +item.doorIron.name=Iron Door +item.redstone.name=Redstone +item.snowball.name=Snowball +item.boat.name=Boat +item.leather.name=Leather +item.milk.name=Milk +item.brick.name=Brick +item.clay.name=Clay +item.reeds.name=Sugar Canes +item.paper.name=Paper +item.book.name=Book +item.slimeball.name=Slimeball +item.minecartChest.name=Minecart with Chest +item.minecartFurnace.name=Minecart with Furnace +item.egg.name=Egg +item.compass.name=Compass +item.fishingRod.name=Fishing Rod +item.clock.name=Clock +item.yellowDust.name=Glowstone Dust +item.fishRaw.name=Raw Fish +item.fishCooked.name=Cooked Fish +item.record.name=Music Disc +item.bone.name=Bone +item.dyePowder.black.name=Ink Sac +item.dyePowder.red.name=Rose Red +item.dyePowder.green.name=Cactus Green +item.dyePowder.brown.name=Cocoa Beans +item.dyePowder.blue.name=Lapis Lazuli +item.dyePowder.purple.name=Purple Dye +item.dyePowder.cyan.name=Cyan Dye +item.dyePowder.silver.name=Light Gray Dye +item.dyePowder.gray.name=Gray Dye +item.dyePowder.pink.name=Pink Dye +item.dyePowder.lime.name=Lime Dye +item.dyePowder.yellow.name=Dandelion Yellow +item.dyePowder.lightBlue.name=Light Blue Dye +item.dyePowder.magenta.name=Magenta Dye +item.dyePowder.orange.name=Orange Dye +item.dyePowder.white.name=Bone Meal +item.sugar.name=Sugar +item.cake.name=Cake +item.bed.name=Bed +item.diode.name=Redstone Repeater +item.map.name=Map +item.leaves.name=Leaves +item.shears.name=Shears +item.rottenFlesh.name=Rotten Flesh +item.enderPearl.name=Ender Pearl +item.blazeRod.name=Blaze Rod +item.ghastTear.name=Ghast Tear +item.netherStalkSeeds.name=Nether Wart +item.potion.name=Potion +item.emptyPotion.name=Water Bottle +item.goldNugget.name=Gold Nugget +item.glassBottle.name=Glass Bottle +item.spiderEye.name=Spider Eye +item.fermentedSpiderEye.name=Fermented Spider Eye +item.blazePowder.name=Blaze Powder +item.magmaCream.name=Magma Cream +item.cauldron.name=Cauldron +item.brewingStand.name=Brewing Stand +item.eyeOfEnder.name=Eye of Ender +item.speckledMelon.name=Glistering Melon +item.monsterPlacer.name=Spawn +item.expBottle.name=Bottle o' Enchanting +item.fireball.name=Fire Charge +item.netherbrickItem.name=Nether Brick +item.netherquartz.name=Nether Quartz + +container.inventory=Inventory +container.crafting=Crafting +container.dispenser=Dispenser +container.furnace=Furnace +container.enchant=Enchant +container.creative=Item Selection +container.brewing=Brewing Stand +container.chest=Chest +container.minecart=Minecart + +entity.Item.name=Item +entity.XPOrb.name=Experience Orb + +entity.Arrow.name=Arrow +entity.Snowball.name=Snowball +entity.Painting.name=Painting + +entity.Mob.name=Mob +entity.Monster.name=Monster + +entity.Creeper.name=Creeper +entity.Skeleton.name=Skeleton +entity.Spider.name=Spider +entity.Giant.name=Giant +entity.Zombie.name=Zombie +entity.Slime.name=Slime +entity.Ghast.name=Ghast +entity.PigZombie.name=Zombie Pigman +entity.Enderman.name=Enderman +entity.Silverfish.name=Silverfish +entity.CaveSpider.name=Cave Spider +entity.Blaze.name=Blaze +entity.LavaSlime.name=Magma Cube +entity.MushroomCow.name=Mooshroom +entity.Villager.name=Villager +entity.VillagerGolem.name=Iron Golem +entity.SnowMan.name=Snow Golem +entity.EnderDragon.name=Ender Dragon + +entity.Pig.name=Pig +entity.Sheep.name=Sheep +entity.Cow.name=Cow +entity.Chicken.name=Chicken +entity.Squid.name=Squid +entity.Wolf.name=Wolf +entity.Ozelot.name=Ocelot +entity.Cat.name=Cat + +entity.PrimedTnt.name=Block of TNT +entity.FallingSand.name=Falling Block + +entity.Minecart.name=Minecart +entity.Boat.name=Boat + +entity.Arrow.name=arrow +entity.generic.name=unknown + +death.inFire=%1$s went up in flames +death.onFire=%1$s burned to death +death.lava=%1$s tried to swim in lava +death.inWall=%1$s suffocated in a wall +death.drown=%1$s drowned +death.starve=%1$s starved to death +death.cactus=%1$s was pricked to death +death.fall=%1$s hit the ground too hard +death.outOfWorld=%1$s fell out of the world +death.generic=%1$s died +death.explosion=%1$s blew up +death.magic=%1$s was killed by magic +death.mob=%1$s was slain by %2$s +death.player=%1$s was slain by %2$s +death.arrow=%1$s was shot by %2$s +death.fireball=%1$s was fireballed by %2$s +death.thrown=%1$s was pummeled by %2$s +death.indirectMagic=%1$s was killed by %2$s + +deathScreen.respawn=Respawn +deathScreen.deleteWorld=Delete world +deathScreen.titleScreen=Title screen +deathScreen.score=Score +deathScreen.title.hardcore=Game over! +deathScreen.hardcoreInfo=You cannot respawn in hardcore mode! +deathScreen.title=You died! + +potion.empty=No Effects +potion.moveSpeed=Speed +potion.moveSlowdown=Slowness +potion.digSpeed=Haste +potion.digSlowDown=Mining Fatigue +potion.damageBoost=Strength +potion.weakness=Weakness +potion.heal=Instant Health +potion.harm=Instant Damage +potion.jump=Jump Boost +potion.confusion=Nausea +potion.regeneration=Regeneration +potion.resistance=Resistance +potion.fireResistance=Fire Resistance +potion.waterBreathing=Water Breathing +potion.invisibility=Invisibility +potion.blindness=Blindness +potion.nightVision=Night Vision +potion.hunger=Hunger +potion.poison=Poison + +potion.moveSpeed.postfix=Potion of Swiftness +potion.moveSlowdown.postfix=Potion of Slowness +potion.digSpeed.postfix=Potion of Haste +potion.digSlowDown.postfix=Potion of Dullness +potion.damageBoost.postfix=Potion of Strength +potion.weakness.postfix=Potion of Weakness +potion.heal.postfix=Potion of Healing +potion.harm.postfix=Potion of Harming +potion.jump.postfix=Potion of Leaping +potion.confusion.postfix=Potion of Nausea +potion.regeneration.postfix=Potion of Regeneration +potion.resistance.postfix=Potion of Resistance +potion.fireResistance.postfix=Potion of Fire Resistance +potion.waterBreathing.postfix=Potion of Water Breathing +potion.invisibility.postfix=Potion of Invisibility +potion.blindness.postfix=Potion of Blindness +potion.nightVision.postfix=Potion of Night Vision +potion.hunger.postfix=Potion of Hunger +potion.poison.postfix=Potion of Poison + +potion.potency.0= +potion.potency.1=II +potion.potency.2=III +potion.potency.3=IV + +potion.prefix.grenade=Splash +potion.prefix.mundane=Mundane +potion.prefix.uninteresting=Uninteresting +potion.prefix.bland=Bland +potion.prefix.clear=Clear +potion.prefix.milky=Milky +potion.prefix.diffuse=Diffuse +potion.prefix.artless=Artless +potion.prefix.thin=Thin +potion.prefix.awkward=Awkward +potion.prefix.flat=Flat +potion.prefix.bulky=Bulky +potion.prefix.bungling=Bungling +potion.prefix.buttered=Buttered +potion.prefix.smooth=Smooth +potion.prefix.suave=Suave +potion.prefix.debonair=Debonair +potion.prefix.thick=Thick +potion.prefix.elegant=Elegant +potion.prefix.fancy=Fancy +potion.prefix.charming=Charming +potion.prefix.dashing=Dashing +potion.prefix.refined=Refined +potion.prefix.cordial=Cordial +potion.prefix.sparkling=Sparkling +potion.prefix.potent=Potent +potion.prefix.foul=Foul +potion.prefix.odorless=Odorless +potion.prefix.rank=Rank +potion.prefix.harsh=Harsh +potion.prefix.acrid=Acrid +potion.prefix.gross=Gross +potion.prefix.stinky=Stinky + +enchantment.damage.all=Sharpness +enchantment.damage.undead=Smite +enchantment.damage.arthropods=Bane of Arthropods +enchantment.knockback=Knockback +enchantment.fire=Fire Aspect +enchantment.protect.all=Protection +enchantment.protect.fire=Fire Protection +enchantment.protect.fall=Feather Falling +enchantment.protect.explosion=Blast Protection +enchantment.protect.projectile=Projectile Protection +enchantment.oxygen=Respiration +enchantment.waterWorker=Aqua Affinity +enchantment.digging=Efficiency +enchantment.untouching=Silk Touch +enchantment.durability=Unbreaking +enchantment.lootBonus=Looting +enchantment.lootBonusDigger=Fortune +enchantment.arrowDamage=Power +enchantment.arrowFire=Flame +enchantment.arrowKnockback=Punch +enchantment.arrowInfinite=Infinity + +enchantment.level.1=I +enchantment.level.2=II +enchantment.level.3=III +enchantment.level.4=IV +enchantment.level.5=V +enchantment.level.6=VI +enchantment.level.7=VII +enchantment.level.8=VIII +enchantment.level.9=IX +enchantment.level.10=X + +gui.achievements=Achievements +gui.stats=Statistics + +stat.generalButton=General +stat.blocksButton=Blocks +stat.itemsButton=Items + +stat.used=Times Used +stat.mined=Times Mined +stat.depleted=Times Depleted +stat.crafted=Times Crafted + +stat.startGame=Times played +stat.createWorld=Worlds played +stat.loadWorld=Saves loaded +stat.joinMultiplayer=Multiplayer joins +stat.leaveGame=Games quit + +stat.playOneMinute=Minutes Played + +stat.walkOneCm=Distance Walked +stat.fallOneCm=Distance Fallen +stat.swimOneCm=Distance Swum +stat.flyOneCm=Distance Flown +stat.climbOneCm=Distance Climbed +stat.diveOneCm=Distance Dove +stat.minecartOneCm=Distance by Minecart +stat.boatOneCm=Distance by Boat +stat.pigOneCm=Distance by Pig +stat.jump=Jumps +stat.drop=Items Dropped + +stat.damageDealt=Damage Dealt +stat.damageTaken=Damage Taken +stat.deaths=Number of Deaths +stat.mobKills=Mob Kills +stat.playerKills=Player Kills +stat.fishCaught=Fish Caught + +stat.mineBlock=%1$s Mined +stat.craftItem=%1$s Crafted +stat.useItem=%1$s Used +stat.breakItem=%1$s Depleted + +achievement.get=Achievement get! + +achievement.taken=Taken! + +achievement.requires=Requires '%1$s' +achievement.openInventory=Taking Inventory +achievement.openInventory.desc=Press '%1$s' to open your inventory. +achievement.mineWood=Getting Wood +achievement.mineWood.desc=Attack a tree until a block of wood pops out +achievement.buildWorkBench=Benchmarking +achievement.buildWorkBench.desc=Craft a workbench with four blocks of planks +achievement.buildPickaxe=Time to Mine! +achievement.buildPickaxe.desc=Use planks and sticks to make a pickaxe +achievement.buildFurnace=Hot Topic +achievement.buildFurnace.desc=Construct a furnace out of eight stone blocks +achievement.acquireIron=Acquire Hardware +achievement.acquireIron.desc=Smelt an iron ingot +achievement.buildHoe=Time to Farm! +achievement.buildHoe.desc=Use planks and sticks to make a hoe +achievement.makeBread=Bake Bread +achievement.makeBread.desc=Turn wheat into bread +achievement.bakeCake=The Lie +achievement.bakeCake.desc=Wheat, sugar, milk and eggs! +achievement.buildBetterPickaxe=Getting an Upgrade +achievement.buildBetterPickaxe.desc=Construct a better pickaxe +achievement.cookFish=Delicious Fish +achievement.cookFish.desc=Catch and cook fish! +achievement.onARail=On A Rail +achievement.onARail.desc=Travel by minecart at least 1 km from where you started +achievement.buildSword=Time to Strike! +achievement.buildSword.desc=Use planks and sticks to make a sword +achievement.killEnemy=Monster Hunter +achievement.killEnemy.desc=Attack and destroy a monster +achievement.killCow=Cow Tipper +achievement.killCow.desc=Harvest some leather +achievement.flyPig=When Pigs Fly +achievement.flyPig.desc=Fly a pig off a cliff +achievement.snipeSkeleton=Sniper Duel +achievement.snipeSkeleton.desc=Kill a skeleton with an arrow from more than 50 meters +achievement.diamonds=DIAMONDS! +achievement.diamonds.desc=Acquire diamonds with your iron tools +achievement.portal=We Need to Go Deeper +achievement.portal.desc=Build a portal to the Nether +achievement.ghast=Return to Sender +achievement.ghast.desc=Destroy a Ghast with a fireball +achievement.blazeRod=Into Fire +achievement.blazeRod.desc=Relieve a Blaze of its rod +achievement.potion=Local Brewery +achievement.potion.desc=Brew a potion +achievement.theEnd=The End? +achievement.theEnd.desc=Locate the End +achievement.theEnd2=The End. +achievement.theEnd2.desc=Defeat the Ender Dragon +achievement.enchantments=Enchanter +achievement.enchantments.desc=Use a book, obsidian and diamonds to construct an enchantment table +achievement.overkill=Overkill +achievement.overkill.desc=Deal eight hearts of damage in a single hit +achievement.bookcase=Librarian +achievement.bookcase.desc=Build some bookshelves to improve your enchantment table + +desc.sword=Deals more damage than by hand. +desc.shovel=Used to dig dirt, grass, sand, gravel and snow faster than by hand. +desc.pickaxe=Required to mine stone-related blocks and ore. +desc.hatchet=Used to chop wood-related blocks faster than by hand. +desc.hoe=Used to till dirt and grass blocks to prepare for crops. +desc.doorwood=Wooden doors are activated by using, hitting them or with Redstone. +desc.dooriron=Iron doors can only be opened by Redstone, buttons or switches. +desc.helmet=Gives the user 1.5 Armor when worn. +desc.chestplate=Gives the user 4 Armor when worn. +desc.leggings=Gives the user 3 Armor when worn. +desc.boots=Gives the user 1.5 Armor when worn. +desc.ingot=A shiny ingot which can be used to craft tools made from this material. +desc.block=Used as an expensive building block or compact storage of the ore. +desc.pressureplate=Used to send an electrical charge when stepped on by a player, an animal, or a monster. Wooden Pressure Plates can also be activated by dropping something on them. +desc.stairs=Used for compact staircases. +desc.stairsstonebricksmooth=Used for compact staircases. +desc.stairsnetherbrick=Used for compact staircases. +desc.stairssandstone=Used for compact staircases. +desc.stairsquartzblock=Used for compact staircases. +desc.slab=Used for making long staircases. +desc.halfslab=Used for compact staircases. +desc.torch=Used to create light. Torches also melt snow and ice. +desc.wood=Used as a building material and can be crafted into many things. Can be crafted from any wood. +desc.sandstone=Used as a building material. +desc.sandstone.addon=Is not influenced by gravity like normal Sand. +desc.structblock=Used as a building material. +desc.stick=Used to craft torches, arrows, signs, ladders, fences and as handles for tools and weapons. +desc.bed=Used to sleep until dawn. Changes your spawn point to the bed's position. +desc.craftingtable=Allows you to craft a more varied selection of items than the normal crafting. +desc.furnace=Allows you to smelt ore, create charcoal and glass, and cook fish and porkchops. +desc.chest=Stores blocks and items inside. +desc.fence=Used as a barrier that cannot be jumped over. +desc.ladder=Used to climb vertically. +desc.trapdoor=Work like normal doors, but are a one by one block and lay flat on the ground. +desc.sign=Shows text entered by you or other players. +desc.glowstone=Used to create brighter light than torches. Melts snow/ice and can be used underwater. +desc.tnt=Used to cause explosions. Activated after placing by hitting, or with an electrical charge. +desc.bowl=Used to hold mushroom stew. You keep the bowl when the stew has been eaten. +desc.bucket=Used to hold and transport water, lava and milk. +desc.flintandsteel=Used to detonate TNT. +desc.fishingrod=Used to catch fish. +desc.clock=Displays positions of the Sun and Moon. +desc.compass=Points to your start point. +desc.map=Will create an image of an area explored while held. This can be used for path-finding. +desc.bow=Allows for ranged attacks by using arrows. +desc.arrow=Used as ammunition for bows. +desc.mushroomstew=Restores 5 hearts. +desc.cookie=Restores 0.5 Hearts. Can be stacked up to 8 times. +desc.cake=Restores 1.5 Hearts. Can be used 6 times. +desc.sugar=Used in the cake recipe. +desc.bread=Restores 2.5 Hearts. +desc.goldenapple=Restores 10 Hearts. +desc.lever=Used to send an electrical charge by being turned on or off. Stays in the on or off state until pressed again. +desc.redstonetorch=Constantly sends an electrical charge, or can be used as a receiver/transmitter when connected to the side of a block. +Can also be used for low-level lighting. +desc.redstonerepeater=Used in Redstone circuits as repeater, a delayer, and/or a diode +desc.button=Used to send an electrical charge by being pressed. Stays activated for approximately a second before shutting off again. +desc.dispenser=Used to hold and shoot out items in a random order when given a Redstone charge. +desc.noteblock=Plays a note when triggered. Hit it to change the pitch of the note. Placing this on top of different blocks will change the type of instrument. +desc.rail=Used to guide minecarts. +desc.poweredrail=When powered, accelerates minecarts that pass over it. When unpowered, causes minecarts to stop on it. +desc.detectorrail=Functions like a Pressure Plate (sends a Redstone signal when powered) but can only be activated by a minecart. +desc.minecart=Used to transport you, an animal, or a monster along rails. +desc.minecartwithchest=Used to transport goods along rails. +desc.minecartwithfurnace=Will move along rails and can push other minecarts when coal is put in it. +desc.boat=Used to travel in water more quickly than swimming. +desc.wool=Collected from sheep, and can be colored with dyes. +desc.woolstring=Used as a building material and can be colored with dyes. Can be easily obtained from Sheep. +desc.dyepowder.black=Used as a dye to create black wool. +desc.dyepowder.green=Used as a dye to create green wool. +desc.dyepowder.brown=Used as a dye to create brown wool. +desc.dyepowder.silver=Used as a dye to create silver wool. +desc.dyepowder.yellow=Used as a dye to create yellow wool. +desc.dyepowder.red=Used as a dye to create red wool. +desc.dyepowder.white=Used to instantly grow crops and flowers. Can be used in dye recipes. +desc.dyepowder.pink=Used as a dye to create pink wool. +desc.dyepowder.orange=Used as a dye to create orange wool. +desc.dyepowder.lime=Used as a dye to create lime wool. +desc.dyepowder.gray=Used as a dye to create gray wool. +desc.dyepowder.lightgray=Used as a dye to create light gray wool. +(Note: light gray dye can also be made by combining gray dye with bone meal, letting you make four light gray dyes from every ink sac instead of three.) +desc.dyepowder.lightblue=Used as a dye to create light blue wool. +desc.dyepowder.cyan=Used as a dye to create cyan wool. +desc.dyepowder.purple=Used as a dye to create purple wool. +desc.dyepowder.magenta=Used as a dye to create magenta wool. +desc.dyepowder.blue=Used as dye to create Blue Wool. +desc.jukebox=Plays Music Discs. +desc.diamonds=Use these to create very strong tools, weapons or armor +desc.emerald=Use these to create very strong tools, weapons or armor +desc.jackolantern=Used to create brighter light than torches. Melts snow/ice and can be used underwater. +desc.paper=Used to create books and maps. +desc.book=Used to create a bookshelf. +desc.bookshelf=Used as decoration. +desc.picture=Used as decoration. +desc.ore_gold=Can be mined with an iron pickaxe or better, then smelted in a furnace to produce gold ingots. +desc.ore_iron=Can be mined with a stone pickaxe or better, then smelted in a furnace to produce iron ingots. +desc.ore_coal=Can be mined with a pickaxe to collect coal. +desc.ore_lapis=Can be mined with a stone pickaxe or better to collect lapis lazuli. +desc.ore_diamond=Can be mined with an iron pickaxe or better to collect diamonds. +desc.ore_redstone=Can be mined with an iron pickaxe or better to collect redstone dust. +desc.stone=Can be mined with a pickaxe to collect cobblestone. +desc.dirt=Collected using a shovel. Can be used for construction. +desc.sapling=Can be planted and it will eventually grow into a tree. +desc.bedrock=This cannot be broken. +desc.lava=Sets fire to anything that touches it. Can be collected in a bucket. +desc.sand=Collected using a shovel. Can be smelted into glass using the furnace. Is affected by gravity if there is no other tile underneath it. +desc.gravel=Collected using a shovel. Sometimes produces flint when dug up. Is affected by gravity if there is no other tile underneath it. +desc.log=Chopped using an axe, and can be crafted into planks or used as a fuel. +desc.glass=Created in a furnace by smelting sand. Will break if you try to mine it. +desc.thinglass=Will break if you try to mine it. +desc.stone_brick=Mined from stone using a pickaxe. Can be used to construct a furnace or stone tools. +desc.brick=Baked from clay in a furnace. +desc.clay=Can be baked into bricks in a furnace. +desc.snow=A compact way to store snowballs. +desc.top_snow=Can be dug with a shovel to create snowballs. +desc.tall_grass=Sometimes produces seeds when broken. +desc.flower=Can be crafted into a dye. +desc.mushroom=Can be crafted with a bowl to make stew. +desc.obsidian=Can only be mined with a diamond pickaxe. Is produced by the meeting of water and still lava, and is used to build a portal. +desc.mob_spawner=Spawns monsters into the world. +desc.redstone_dust=Is placed on the ground to carry an electrical charge. +desc.crops=When fully grown, crops can be harvested to collect wheat. +desc.farmland=Ground that has been prepared ready to plant seeds. +desc.cactus=Can be crafted to create a dye. +desc.reeds=Can be crafted to create sugar. +desc.pumpkin=Can be worn as a helmet or crafted with a torch to create a Jack-O-Lantern. +desc.hell_rock=Burns forever if set alight. +desc.hell_sand=Slows the movement of anything walking over it. +desc.portal=Standing in the portal allows you to pass between the overworld and the nether. +desc.apple=Restores health, and can be crafted into a golden apple. +desc.melon=Can be broken into melon slices. +desc.coal=Used as a fuel in a furnace, or crafted to make a torch. +desc.string=Collected by killing a spider, and can be crafted into a bow. +desc.feather=Collected by killing a chicken, and can be crafted into an arrow. +desc.sulphur=Collected by killing a creeper, and can be crafted into TNT. +desc.shears=Used to obtain wool from sheep and to harvest placeable Leaf blocks. +desc.seeds=Can be planted in farmland to grow crops. +desc.wheat=Harvested from crops, and can be used to craft food items. +desc.flint=Collected by digging gravel, and can be used to craft a flint and steel. +desc.porkchopraw=Collected by killing a pig, and can be cooked in a furnace. Restores health. +desc.porkchopcooked=Created by cooking a porkchop in a furnace. Restores health. +desc.beefraw=Collected by killing a cow, and can be cooked in a furnace. Restores health. +desc.beefcooked=Created by cooking a beef in a furnace. Restores health. +desc.chickenraw=Collected by killing a chicken, and can be cooked in a furnace. Restores health. +desc.chickencooked=Created by cooking a chicken in a furnace. Restores health. +desc.saddle=When used on a pig it allows you to ride the pig. +desc.snowball=Collected by digging snow, and can be thrown. +desc.leather=Collected by killing a cow, and can be crafted into armor. +desc.slimeball=Collected by killing a slime. +desc.egg=Dropped randomly by chickens, and can be crafted into food items. +desc.yellow_dust=Collected by mining Glowstone, and can be crafted to make Glowstone blocks again. +desc.fish_raw=Can be eaten to restore health, or cooked in a furnace. +desc.fish_cooked=Created by cooking a raw fish in a furnace. Can be eaten to restore health. +desc.bone=Collected by killing a skeleton. Can be crafted into bone meal. +desc.record=Collected by getting a skeleton to kill a creeper. Can be played in a jukebox. +desc.water=Extinguishes fire and helps crops grow. Can be collected in a bucket. +desc.leaves=When broken sometimes drops a sapling which can then be replanted to grow into a tree. +desc.moss_stone=Can be used for construction and decoration. +desc.stonebricksmooth=Used as building material. +desc.netherreactor=Core of the Nether Reactor +desc.glowingobsidian=Obsidion activated by external source. +desc.lightgem=Used for illumination. +desc.painting=Used as decoration. +desc.hellrock=Is a stone material from the Nether. +desc.netherbrick=Construction block made from Nether bricks. +desc.netherbrickitem=Used to form blocks of Nether bricks. +desc.netherquartz=Quartz from the Nether, used to create Blocks of Quartz. +desc.quartzblock=Decorative block, used to create other kinds of Quartz blocks. +desc.stonecutter=For crafting stoneblocks. +desc.seedsmelon=Allows for more melons. +desc.tile.melon=Can be cut up and eaten. diff --git a/minecraftcpp-master/handheld/data/sound/aac/damage/fallbig1.m4a b/minecraftcpp-master/handheld/data/sound/aac/damage/fallbig1.m4a new file mode 100644 index 0000000..7deb7d1 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/damage/fallbig1.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/damage/fallbig2.m4a b/minecraftcpp-master/handheld/data/sound/aac/damage/fallbig2.m4a new file mode 100644 index 0000000..ec02cd7 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/damage/fallbig2.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/damage/fallsmall.m4a b/minecraftcpp-master/handheld/data/sound/aac/damage/fallsmall.m4a new file mode 100644 index 0000000..a210f49 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/damage/fallsmall.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/chicken1.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/chicken1.m4a new file mode 100644 index 0000000..b81ee44 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/chicken1.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/chicken2.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/chicken2.m4a new file mode 100644 index 0000000..b098825 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/chicken2.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/chicken3.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/chicken3.m4a new file mode 100644 index 0000000..4d4181a Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/chicken3.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/chickenhurt1.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/chickenhurt1.m4a new file mode 100644 index 0000000..c0ab742 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/chickenhurt1.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/chickenhurt2.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/chickenhurt2.m4a new file mode 100644 index 0000000..1b5d468 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/chickenhurt2.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/chickenplop.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/chickenplop.m4a new file mode 100644 index 0000000..4459597 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/chickenplop.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/cow1.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/cow1.m4a new file mode 100644 index 0000000..6f0e2cb Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/cow1.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/cow2.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/cow2.m4a new file mode 100644 index 0000000..f2a9fea Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/cow2.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/cow3.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/cow3.m4a new file mode 100644 index 0000000..fba2ac0 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/cow3.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/cow4.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/cow4.m4a new file mode 100644 index 0000000..3956a60 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/cow4.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/cowhurt1.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/cowhurt1.m4a new file mode 100644 index 0000000..5446a94 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/cowhurt1.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/cowhurt2.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/cowhurt2.m4a new file mode 100644 index 0000000..1cdcc6b Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/cowhurt2.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/cowhurt3.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/cowhurt3.m4a new file mode 100644 index 0000000..9c33b08 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/cowhurt3.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/creeper1.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/creeper1.m4a new file mode 100644 index 0000000..f3750a5 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/creeper1.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/creeper2.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/creeper2.m4a new file mode 100644 index 0000000..2cb020f Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/creeper2.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/creeper3.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/creeper3.m4a new file mode 100644 index 0000000..ef3624f Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/creeper3.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/creeper4.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/creeper4.m4a new file mode 100644 index 0000000..fe28a48 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/creeper4.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/creeperdeath.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/creeperdeath.m4a new file mode 100644 index 0000000..b50b774 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/creeperdeath.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/pig1.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/pig1.m4a new file mode 100644 index 0000000..8a9ca5d Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/pig1.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/pig2.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/pig2.m4a new file mode 100644 index 0000000..7718831 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/pig2.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/pig3.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/pig3.m4a new file mode 100644 index 0000000..5327349 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/pig3.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/pigdeath.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/pigdeath.m4a new file mode 100644 index 0000000..807b909 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/pigdeath.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/sheep1.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/sheep1.m4a new file mode 100644 index 0000000..8c21e4e Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/sheep1.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/sheep2.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/sheep2.m4a new file mode 100644 index 0000000..0dc9b9a Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/sheep2.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/sheep3.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/sheep3.m4a new file mode 100644 index 0000000..7654ff5 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/sheep3.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/skeleton1.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/skeleton1.m4a new file mode 100644 index 0000000..ed5f81b Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/skeleton1.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/skeleton2.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/skeleton2.m4a new file mode 100644 index 0000000..2b2c2ef Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/skeleton2.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/skeleton3.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/skeleton3.m4a new file mode 100644 index 0000000..8fa8a29 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/skeleton3.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/skeletonhurt1.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/skeletonhurt1.m4a new file mode 100644 index 0000000..4f38e25 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/skeletonhurt1.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/skeletonhurt2.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/skeletonhurt2.m4a new file mode 100644 index 0000000..0d8ec22 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/skeletonhurt2.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/skeletonhurt3.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/skeletonhurt3.m4a new file mode 100644 index 0000000..95e1e59 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/skeletonhurt3.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/skeletonhurt4.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/skeletonhurt4.m4a new file mode 100644 index 0000000..28d124f Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/skeletonhurt4.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/spider1.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/spider1.m4a new file mode 100644 index 0000000..dcbcc42 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/spider1.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/spider2.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/spider2.m4a new file mode 100644 index 0000000..06f9575 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/spider2.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/spider3.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/spider3.m4a new file mode 100644 index 0000000..2dcb724 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/spider3.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/spider4.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/spider4.m4a new file mode 100644 index 0000000..ce4ce53 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/spider4.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/spiderdeath.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/spiderdeath.m4a new file mode 100644 index 0000000..bde5b4d Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/spiderdeath.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/zombie1.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/zombie1.m4a new file mode 100644 index 0000000..de6e8bb Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/zombie1.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/zombie2.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/zombie2.m4a new file mode 100644 index 0000000..a50b1c1 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/zombie2.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/zombie3.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/zombie3.m4a new file mode 100644 index 0000000..0eb3d75 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/zombie3.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/zombiedeath.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/zombiedeath.m4a new file mode 100644 index 0000000..3c41e1b Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/zombiedeath.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/zombiehurt1.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/zombiehurt1.m4a new file mode 100644 index 0000000..9256b34 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/zombiehurt1.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/zombiehurt2.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/zombiehurt2.m4a new file mode 100644 index 0000000..6e6d1ac Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/zombiehurt2.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/zpig1.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/zpig1.m4a new file mode 100644 index 0000000..051c3d6 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/zpig1.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/zpig2.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/zpig2.m4a new file mode 100644 index 0000000..79df964 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/zpig2.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/zpig3.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/zpig3.m4a new file mode 100644 index 0000000..2ba80f6 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/zpig3.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/zpig4.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/zpig4.m4a new file mode 100644 index 0000000..8b46124 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/zpig4.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/zpigangry1.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/zpigangry1.m4a new file mode 100644 index 0000000..4747a8e Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/zpigangry1.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/zpigangry2.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/zpigangry2.m4a new file mode 100644 index 0000000..f6c4ccb Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/zpigangry2.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/zpigangry3.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/zpigangry3.m4a new file mode 100644 index 0000000..991425d Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/zpigangry3.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/zpigangry4.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/zpigangry4.m4a new file mode 100644 index 0000000..78bf37e Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/zpigangry4.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/zpigdeath.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/zpigdeath.m4a new file mode 100644 index 0000000..8226965 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/zpigdeath.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/zpighurt1.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/zpighurt1.m4a new file mode 100644 index 0000000..d75fb6c Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/zpighurt1.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/mob/zpighurt2.m4a b/minecraftcpp-master/handheld/data/sound/aac/mob/zpighurt2.m4a new file mode 100644 index 0000000..b0ca26d Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/mob/zpighurt2.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/random/bow.m4a b/minecraftcpp-master/handheld/data/sound/aac/random/bow.m4a new file mode 100644 index 0000000..f0e1387 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/random/bow.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/random/bowhit1.m4a b/minecraftcpp-master/handheld/data/sound/aac/random/bowhit1.m4a new file mode 100644 index 0000000..53a8233 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/random/bowhit1.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/random/bowhit2.m4a b/minecraftcpp-master/handheld/data/sound/aac/random/bowhit2.m4a new file mode 100644 index 0000000..b6f453a Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/random/bowhit2.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/random/bowhit3.m4a b/minecraftcpp-master/handheld/data/sound/aac/random/bowhit3.m4a new file mode 100644 index 0000000..9904b7b Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/random/bowhit3.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/random/bowhit4.m4a b/minecraftcpp-master/handheld/data/sound/aac/random/bowhit4.m4a new file mode 100644 index 0000000..6690a6f Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/random/bowhit4.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/random/click.m4a b/minecraftcpp-master/handheld/data/sound/aac/random/click.m4a new file mode 100644 index 0000000..b1bb549 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/random/click.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/random/door_close.m4a b/minecraftcpp-master/handheld/data/sound/aac/random/door_close.m4a new file mode 100644 index 0000000..0f6b9ab Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/random/door_close.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/random/door_open.m4a b/minecraftcpp-master/handheld/data/sound/aac/random/door_open.m4a new file mode 100644 index 0000000..a30297b Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/random/door_open.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/random/eat1.m4a b/minecraftcpp-master/handheld/data/sound/aac/random/eat1.m4a new file mode 100644 index 0000000..570c77f Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/random/eat1.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/random/eat2.m4a b/minecraftcpp-master/handheld/data/sound/aac/random/eat2.m4a new file mode 100644 index 0000000..0f80252 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/random/eat2.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/random/eat3.m4a b/minecraftcpp-master/handheld/data/sound/aac/random/eat3.m4a new file mode 100644 index 0000000..f1fa988 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/random/eat3.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/random/explode.m4a b/minecraftcpp-master/handheld/data/sound/aac/random/explode.m4a new file mode 100644 index 0000000..6066a6c Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/random/explode.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/random/fuse.m4a b/minecraftcpp-master/handheld/data/sound/aac/random/fuse.m4a new file mode 100644 index 0000000..448935e Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/random/fuse.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/random/glass1.m4a b/minecraftcpp-master/handheld/data/sound/aac/random/glass1.m4a new file mode 100644 index 0000000..00df16a Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/random/glass1.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/random/glass2.m4a b/minecraftcpp-master/handheld/data/sound/aac/random/glass2.m4a new file mode 100644 index 0000000..aed1a00 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/random/glass2.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/random/glass3.m4a b/minecraftcpp-master/handheld/data/sound/aac/random/glass3.m4a new file mode 100644 index 0000000..da6db26 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/random/glass3.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/random/hurt.m4a b/minecraftcpp-master/handheld/data/sound/aac/random/hurt.m4a new file mode 100644 index 0000000..1e34fac Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/random/hurt.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/random/pop.m4a b/minecraftcpp-master/handheld/data/sound/aac/random/pop.m4a new file mode 100644 index 0000000..6dcc598 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/random/pop.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/random/splash.m4a b/minecraftcpp-master/handheld/data/sound/aac/random/splash.m4a new file mode 100644 index 0000000..00af208 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/random/splash.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/random/water.m4a b/minecraftcpp-master/handheld/data/sound/aac/random/water.m4a new file mode 100644 index 0000000..9a4ed3b Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/random/water.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/cloth1.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/cloth1.m4a new file mode 100644 index 0000000..c43079a Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/cloth1.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/cloth2.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/cloth2.m4a new file mode 100644 index 0000000..2815459 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/cloth2.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/cloth3.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/cloth3.m4a new file mode 100644 index 0000000..b83ec05 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/cloth3.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/cloth4.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/cloth4.m4a new file mode 100644 index 0000000..8f4009a Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/cloth4.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/grass1.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/grass1.m4a new file mode 100644 index 0000000..7973ed5 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/grass1.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/grass2.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/grass2.m4a new file mode 100644 index 0000000..dfbb292 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/grass2.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/grass3.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/grass3.m4a new file mode 100644 index 0000000..bf6ae03 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/grass3.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/grass4.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/grass4.m4a new file mode 100644 index 0000000..dfc9bf7 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/grass4.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/gravel2.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/gravel2.m4a new file mode 100644 index 0000000..2252c60 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/gravel2.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/gravel3.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/gravel3.m4a new file mode 100644 index 0000000..4643055 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/gravel3.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/gravel4.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/gravel4.m4a new file mode 100644 index 0000000..1fb0010 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/gravel4.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/ladder1.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/ladder1.m4a new file mode 100644 index 0000000..8289f9b Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/ladder1.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/ladder2.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/ladder2.m4a new file mode 100644 index 0000000..f55ed27 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/ladder2.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/ladder3.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/ladder3.m4a new file mode 100644 index 0000000..4aab8bf Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/ladder3.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/ladder4.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/ladder4.m4a new file mode 100644 index 0000000..c27ca96 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/ladder4.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/sand1.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/sand1.m4a new file mode 100644 index 0000000..5588276 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/sand1.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/sand2.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/sand2.m4a new file mode 100644 index 0000000..1f6501a Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/sand2.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/sand3.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/sand3.m4a new file mode 100644 index 0000000..520b7cb Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/sand3.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/sand4.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/sand4.m4a new file mode 100644 index 0000000..c8b3f31 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/sand4.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/snow1.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/snow1.m4a new file mode 100644 index 0000000..03d961d Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/snow1.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/snow2.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/snow2.m4a new file mode 100644 index 0000000..d658bf3 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/snow2.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/snow3.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/snow3.m4a new file mode 100644 index 0000000..eb2b0bc Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/snow3.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/snow4.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/snow4.m4a new file mode 100644 index 0000000..2fc45ce Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/snow4.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/stone1.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/stone1.m4a new file mode 100644 index 0000000..797cdc0 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/stone1.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/stone2.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/stone2.m4a new file mode 100644 index 0000000..ca27b87 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/stone2.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/stone3.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/stone3.m4a new file mode 100644 index 0000000..30d4589 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/stone3.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/stone4.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/stone4.m4a new file mode 100644 index 0000000..5bd9c71 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/stone4.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/wood1.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/wood1.m4a new file mode 100644 index 0000000..93fa4a0 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/wood1.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/wood2.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/wood2.m4a new file mode 100644 index 0000000..a2539ae Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/wood2.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/wood3.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/wood3.m4a new file mode 100644 index 0000000..475d4b0 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/wood3.m4a differ diff --git a/minecraftcpp-master/handheld/data/sound/aac/step/wood4.m4a b/minecraftcpp-master/handheld/data/sound/aac/step/wood4.m4a new file mode 100644 index 0000000..3d02fc6 Binary files /dev/null and b/minecraftcpp-master/handheld/data/sound/aac/step/wood4.m4a differ diff --git a/minecraftcpp-master/handheld/lib/bin/MinecraftWin32.exe b/minecraftcpp-master/handheld/lib/bin/MinecraftWin32.exe new file mode 100644 index 0000000..8139f26 Binary files /dev/null and b/minecraftcpp-master/handheld/lib/bin/MinecraftWin32.exe differ diff --git a/minecraftcpp-master/handheld/lib/bin/MinecraftWin321.exe b/minecraftcpp-master/handheld/lib/bin/MinecraftWin321.exe new file mode 100644 index 0000000..b7c0d98 Binary files /dev/null and b/minecraftcpp-master/handheld/lib/bin/MinecraftWin321.exe differ diff --git a/minecraftcpp-master/handheld/lib/bin/dbghelp.dll b/minecraftcpp-master/handheld/lib/bin/dbghelp.dll new file mode 100644 index 0000000..62d8508 Binary files /dev/null and b/minecraftcpp-master/handheld/lib/bin/dbghelp.dll differ diff --git a/minecraftcpp-master/handheld/lib/bin/games/com.mojang/minecraftWorlds/perf/chunks.dat b/minecraftcpp-master/handheld/lib/bin/games/com.mojang/minecraftWorlds/perf/chunks.dat new file mode 100644 index 0000000..0cd0e59 Binary files /dev/null and b/minecraftcpp-master/handheld/lib/bin/games/com.mojang/minecraftWorlds/perf/chunks.dat differ diff --git a/minecraftcpp-master/handheld/lib/bin/games/com.mojang/minecraftWorlds/perf/entities.dat b/minecraftcpp-master/handheld/lib/bin/games/com.mojang/minecraftWorlds/perf/entities.dat new file mode 100644 index 0000000..eacb360 Binary files /dev/null and b/minecraftcpp-master/handheld/lib/bin/games/com.mojang/minecraftWorlds/perf/entities.dat differ diff --git a/minecraftcpp-master/handheld/lib/bin/games/com.mojang/minecraftWorlds/perf/level.dat b/minecraftcpp-master/handheld/lib/bin/games/com.mojang/minecraftWorlds/perf/level.dat new file mode 100644 index 0000000..bc66dea Binary files /dev/null and b/minecraftcpp-master/handheld/lib/bin/games/com.mojang/minecraftWorlds/perf/level.dat differ diff --git a/minecraftcpp-master/handheld/lib/bin/games/com.mojang/minecraftWorlds/perf/level.dat_old b/minecraftcpp-master/handheld/lib/bin/games/com.mojang/minecraftWorlds/perf/level.dat_old new file mode 100644 index 0000000..da04687 Binary files /dev/null and b/minecraftcpp-master/handheld/lib/bin/games/com.mojang/minecraftWorlds/perf/level.dat_old differ diff --git a/minecraftcpp-master/handheld/lib/bin/glew32.dll b/minecraftcpp-master/handheld/lib/bin/glew32.dll new file mode 100644 index 0000000..7bc5f07 Binary files /dev/null and b/minecraftcpp-master/handheld/lib/bin/glew32.dll differ diff --git a/minecraftcpp-master/handheld/lib/bin/libEGL.dll b/minecraftcpp-master/handheld/lib/bin/libEGL.dll new file mode 100644 index 0000000..b3c9167 Binary files /dev/null and b/minecraftcpp-master/handheld/lib/bin/libEGL.dll differ diff --git a/minecraftcpp-master/handheld/lib/bin/libgles_cm.dll b/minecraftcpp-master/handheld/lib/bin/libgles_cm.dll new file mode 100644 index 0000000..9682d6c Binary files /dev/null and b/minecraftcpp-master/handheld/lib/bin/libgles_cm.dll differ diff --git a/minecraftcpp-master/handheld/lib/bin/libpng12.dll b/minecraftcpp-master/handheld/lib/bin/libpng12.dll new file mode 100644 index 0000000..25c0a7c Binary files /dev/null and b/minecraftcpp-master/handheld/lib/bin/libpng12.dll differ diff --git a/minecraftcpp-master/handheld/lib/bin/libpng3.dll b/minecraftcpp-master/handheld/lib/bin/libpng3.dll new file mode 100644 index 0000000..649ec64 Binary files /dev/null and b/minecraftcpp-master/handheld/lib/bin/libpng3.dll differ diff --git a/minecraftcpp-master/handheld/lib/bin/options.txt b/minecraftcpp-master/handheld/lib/bin/options.txt new file mode 100644 index 0000000..e69de29 diff --git a/minecraftcpp-master/handheld/lib/bin/vld_win32/dbghelp.dll b/minecraftcpp-master/handheld/lib/bin/vld_win32/dbghelp.dll new file mode 100644 index 0000000..62d8508 Binary files /dev/null and b/minecraftcpp-master/handheld/lib/bin/vld_win32/dbghelp.dll differ diff --git a/minecraftcpp-master/handheld/lib/bin/vld_win32/vld_x86.dll b/minecraftcpp-master/handheld/lib/bin/vld_win32/vld_x86.dll new file mode 100644 index 0000000..4c1e920 Binary files /dev/null and b/minecraftcpp-master/handheld/lib/bin/vld_win32/vld_x86.dll differ diff --git a/minecraftcpp-master/handheld/lib/bin/vld_win64/dbghelp.dll b/minecraftcpp-master/handheld/lib/bin/vld_win64/dbghelp.dll new file mode 100644 index 0000000..499fa29 Binary files /dev/null and b/minecraftcpp-master/handheld/lib/bin/vld_win64/dbghelp.dll differ diff --git a/minecraftcpp-master/handheld/lib/bin/vld_win64/vld_x64.dll b/minecraftcpp-master/handheld/lib/bin/vld_win64/vld_x64.dll new file mode 100644 index 0000000..a77a28d Binary files /dev/null and b/minecraftcpp-master/handheld/lib/bin/vld_win64/vld_x64.dll differ diff --git a/minecraftcpp-master/handheld/lib/bin/vld_x86.dll b/minecraftcpp-master/handheld/lib/bin/vld_x86.dll new file mode 100644 index 0000000..4c1e920 Binary files /dev/null and b/minecraftcpp-master/handheld/lib/bin/vld_x86.dll differ diff --git a/minecraftcpp-master/handheld/lib/bin/zlib1.dll b/minecraftcpp-master/handheld/lib/bin/zlib1.dll new file mode 100644 index 0000000..31996cd Binary files /dev/null and b/minecraftcpp-master/handheld/lib/bin/zlib1.dll differ diff --git a/minecraftcpp-master/handheld/lib/include/EGL/egl.h b/minecraftcpp-master/handheld/lib/include/EGL/egl.h new file mode 100644 index 0000000..22eba93 --- /dev/null +++ b/minecraftcpp-master/handheld/lib/include/EGL/egl.h @@ -0,0 +1,329 @@ +/* -*- mode: c; tab-width: 8; -*- */ +/* vi: set sw=4 ts=8: */ +/* Reference version of egl.h for EGL 1.4. + */ + +/* +** Copyright (c) 2007-2009 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be included +** in all copies or substantial portions of the Materials. +** +** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ + +#ifndef __egl_h_ +#define __egl_h_ + +/* All platform-dependent types and macro boilerplate (such as EGLAPI + * and EGLAPIENTRY) should go in eglplatform.h. + */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* EGL Types */ +/* EGLint is defined in eglplatform.h */ +typedef unsigned int EGLBoolean; +typedef unsigned int EGLenum; +typedef void *EGLConfig; +typedef void *EGLContext; +typedef void *EGLDisplay; +typedef void *EGLSurface; +typedef void *EGLClientBuffer; + +/* EGL Versioning */ +#define EGL_VERSION_1_0 1 +#define EGL_VERSION_1_1 1 +#define EGL_VERSION_1_2 1 +#define EGL_VERSION_1_3 1 +#define EGL_VERSION_1_4 1 + +/* EGL Enumerants. Bitmasks and other exceptional cases aside, most + * enums are assigned unique values starting at 0x3000. + */ + +/* EGL aliases */ +#define EGL_FALSE 0 +#define EGL_TRUE 1 + +/* Out-of-band handle values */ +#define EGL_DEFAULT_DISPLAY ((EGLNativeDisplayType)0) +#define EGL_NO_CONTEXT ((EGLContext)0) +#define EGL_NO_DISPLAY ((EGLDisplay)0) +#define EGL_NO_SURFACE ((EGLSurface)0) + +/* Out-of-band attribute value */ +#define EGL_DONT_CARE ((EGLint)-1) + +/* Errors / GetError return values */ +#define EGL_SUCCESS 0x3000 +#define EGL_NOT_INITIALIZED 0x3001 +#define EGL_BAD_ACCESS 0x3002 +#define EGL_BAD_ALLOC 0x3003 +#define EGL_BAD_ATTRIBUTE 0x3004 +#define EGL_BAD_CONFIG 0x3005 +#define EGL_BAD_CONTEXT 0x3006 +#define EGL_BAD_CURRENT_SURFACE 0x3007 +#define EGL_BAD_DISPLAY 0x3008 +#define EGL_BAD_MATCH 0x3009 +#define EGL_BAD_NATIVE_PIXMAP 0x300A +#define EGL_BAD_NATIVE_WINDOW 0x300B +#define EGL_BAD_PARAMETER 0x300C +#define EGL_BAD_SURFACE 0x300D +#define EGL_CONTEXT_LOST 0x300E /* EGL 1.1 - IMG_power_management */ + +/* Reserved 0x300F-0x301F for additional errors */ + +/* Config attributes */ +#define EGL_BUFFER_SIZE 0x3020 +#define EGL_ALPHA_SIZE 0x3021 +#define EGL_BLUE_SIZE 0x3022 +#define EGL_GREEN_SIZE 0x3023 +#define EGL_RED_SIZE 0x3024 +#define EGL_DEPTH_SIZE 0x3025 +#define EGL_STENCIL_SIZE 0x3026 +#define EGL_CONFIG_CAVEAT 0x3027 +#define EGL_CONFIG_ID 0x3028 +#define EGL_LEVEL 0x3029 +#define EGL_MAX_PBUFFER_HEIGHT 0x302A +#define EGL_MAX_PBUFFER_PIXELS 0x302B +#define EGL_MAX_PBUFFER_WIDTH 0x302C +#define EGL_NATIVE_RENDERABLE 0x302D +#define EGL_NATIVE_VISUAL_ID 0x302E +#define EGL_NATIVE_VISUAL_TYPE 0x302F +#define EGL_PRESERVED_RESOURCES 0x3030 +#define EGL_SAMPLES 0x3031 +#define EGL_SAMPLE_BUFFERS 0x3032 +#define EGL_SURFACE_TYPE 0x3033 +#define EGL_TRANSPARENT_TYPE 0x3034 +#define EGL_TRANSPARENT_BLUE_VALUE 0x3035 +#define EGL_TRANSPARENT_GREEN_VALUE 0x3036 +#define EGL_TRANSPARENT_RED_VALUE 0x3037 +#define EGL_NONE 0x3038 /* Attrib list terminator */ +#define EGL_BIND_TO_TEXTURE_RGB 0x3039 +#define EGL_BIND_TO_TEXTURE_RGBA 0x303A +#define EGL_MIN_SWAP_INTERVAL 0x303B +#define EGL_MAX_SWAP_INTERVAL 0x303C +#define EGL_LUMINANCE_SIZE 0x303D +#define EGL_ALPHA_MASK_SIZE 0x303E +#define EGL_COLOR_BUFFER_TYPE 0x303F +#define EGL_RENDERABLE_TYPE 0x3040 +#define EGL_MATCH_NATIVE_PIXMAP 0x3041 /* Pseudo-attribute (not queryable) */ +#define EGL_CONFORMANT 0x3042 + +/* Reserved 0x3041-0x304F for additional config attributes */ + +/* Config attribute values */ +#define EGL_SLOW_CONFIG 0x3050 /* EGL_CONFIG_CAVEAT value */ +#define EGL_NON_CONFORMANT_CONFIG 0x3051 /* EGL_CONFIG_CAVEAT value */ +#define EGL_TRANSPARENT_RGB 0x3052 /* EGL_TRANSPARENT_TYPE value */ +#define EGL_RGB_BUFFER 0x308E /* EGL_COLOR_BUFFER_TYPE value */ +#define EGL_LUMINANCE_BUFFER 0x308F /* EGL_COLOR_BUFFER_TYPE value */ + +/* More config attribute values, for EGL_TEXTURE_FORMAT */ +#define EGL_NO_TEXTURE 0x305C +#define EGL_TEXTURE_RGB 0x305D +#define EGL_TEXTURE_RGBA 0x305E +#define EGL_TEXTURE_2D 0x305F + +/* Config attribute mask bits */ +#define EGL_PBUFFER_BIT 0x0001 /* EGL_SURFACE_TYPE mask bits */ +#define EGL_PIXMAP_BIT 0x0002 /* EGL_SURFACE_TYPE mask bits */ +#define EGL_WINDOW_BIT 0x0004 /* EGL_SURFACE_TYPE mask bits */ +#define EGL_VG_COLORSPACE_LINEAR_BIT 0x0020 /* EGL_SURFACE_TYPE mask bits */ +#define EGL_VG_ALPHA_FORMAT_PRE_BIT 0x0040 /* EGL_SURFACE_TYPE mask bits */ +#define EGL_MULTISAMPLE_RESOLVE_BOX_BIT 0x0200 /* EGL_SURFACE_TYPE mask bits */ +#define EGL_SWAP_BEHAVIOR_PRESERVED_BIT 0x0400 /* EGL_SURFACE_TYPE mask bits */ + +#define EGL_OPENGL_ES_BIT 0x0001 /* EGL_RENDERABLE_TYPE mask bits */ +#define EGL_OPENVG_BIT 0x0002 /* EGL_RENDERABLE_TYPE mask bits */ +#define EGL_OPENGL_ES2_BIT 0x0004 /* EGL_RENDERABLE_TYPE mask bits */ +#define EGL_OPENGL_BIT 0x0008 /* EGL_RENDERABLE_TYPE mask bits */ + +/* QueryString targets */ +#define EGL_VENDOR 0x3053 +#define EGL_VERSION 0x3054 +#define EGL_EXTENSIONS 0x3055 +#define EGL_CLIENT_APIS 0x308D + +/* QuerySurface / SurfaceAttrib / CreatePbufferSurface targets */ +#define EGL_HEIGHT 0x3056 +#define EGL_WIDTH 0x3057 +#define EGL_LARGEST_PBUFFER 0x3058 +#define EGL_TEXTURE_FORMAT 0x3080 +#define EGL_TEXTURE_TARGET 0x3081 +#define EGL_MIPMAP_TEXTURE 0x3082 +#define EGL_MIPMAP_LEVEL 0x3083 +#define EGL_RENDER_BUFFER 0x3086 +#define EGL_VG_COLORSPACE 0x3087 +#define EGL_VG_ALPHA_FORMAT 0x3088 +#define EGL_HORIZONTAL_RESOLUTION 0x3090 +#define EGL_VERTICAL_RESOLUTION 0x3091 +#define EGL_PIXEL_ASPECT_RATIO 0x3092 +#define EGL_SWAP_BEHAVIOR 0x3093 +#define EGL_MULTISAMPLE_RESOLVE 0x3099 + +/* EGL_RENDER_BUFFER values / BindTexImage / ReleaseTexImage buffer targets */ +#define EGL_BACK_BUFFER 0x3084 +#define EGL_SINGLE_BUFFER 0x3085 + +/* OpenVG color spaces */ +#define EGL_VG_COLORSPACE_sRGB 0x3089 /* EGL_VG_COLORSPACE value */ +#define EGL_VG_COLORSPACE_LINEAR 0x308A /* EGL_VG_COLORSPACE value */ + +/* OpenVG alpha formats */ +#define EGL_VG_ALPHA_FORMAT_NONPRE 0x308B /* EGL_ALPHA_FORMAT value */ +#define EGL_VG_ALPHA_FORMAT_PRE 0x308C /* EGL_ALPHA_FORMAT value */ + +/* Constant scale factor by which fractional display resolutions & + * aspect ratio are scaled when queried as integer values. + */ +#define EGL_DISPLAY_SCALING 10000 + +/* Unknown display resolution/aspect ratio */ +#define EGL_UNKNOWN ((EGLint)-1) + +/* Back buffer swap behaviors */ +#define EGL_BUFFER_PRESERVED 0x3094 /* EGL_SWAP_BEHAVIOR value */ +#define EGL_BUFFER_DESTROYED 0x3095 /* EGL_SWAP_BEHAVIOR value */ + +/* CreatePbufferFromClientBuffer buffer types */ +#define EGL_OPENVG_IMAGE 0x3096 + +/* QueryContext targets */ +#define EGL_CONTEXT_CLIENT_TYPE 0x3097 + +/* CreateContext attributes */ +#define EGL_CONTEXT_CLIENT_VERSION 0x3098 + +/* Multisample resolution behaviors */ +#define EGL_MULTISAMPLE_RESOLVE_DEFAULT 0x309A /* EGL_MULTISAMPLE_RESOLVE value */ +#define EGL_MULTISAMPLE_RESOLVE_BOX 0x309B /* EGL_MULTISAMPLE_RESOLVE value */ + +/* BindAPI/QueryAPI targets */ +#define EGL_OPENGL_ES_API 0x30A0 +#define EGL_OPENVG_API 0x30A1 +#define EGL_OPENGL_API 0x30A2 + +/* GetCurrentSurface targets */ +#define EGL_DRAW 0x3059 +#define EGL_READ 0x305A + +/* WaitNative engines */ +#define EGL_CORE_NATIVE_ENGINE 0x305B + +/* EGL 1.2 tokens renamed for consistency in EGL 1.3 */ +#define EGL_COLORSPACE EGL_VG_COLORSPACE +#define EGL_ALPHA_FORMAT EGL_VG_ALPHA_FORMAT +#define EGL_COLORSPACE_sRGB EGL_VG_COLORSPACE_sRGB +#define EGL_COLORSPACE_LINEAR EGL_VG_COLORSPACE_LINEAR +#define EGL_ALPHA_FORMAT_NONPRE EGL_VG_ALPHA_FORMAT_NONPRE +#define EGL_ALPHA_FORMAT_PRE EGL_VG_ALPHA_FORMAT_PRE + +/* EGL extensions must request enum blocks from the Khronos + * API Registrar, who maintains the enumerant registry. Submit + * a bug in Khronos Bugzilla against task "Registry". + */ + + + +/* EGL Functions */ + +EGLAPI EGLint EGLAPIENTRY eglGetError(void); + +EGLAPI EGLDisplay EGLAPIENTRY eglGetDisplay(EGLNativeDisplayType display_id); +EGLAPI EGLBoolean EGLAPIENTRY eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor); +EGLAPI EGLBoolean EGLAPIENTRY eglTerminate(EGLDisplay dpy); + +EGLAPI const char * EGLAPIENTRY eglQueryString(EGLDisplay dpy, EGLint name); + +EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigs(EGLDisplay dpy, EGLConfig *configs, + EGLint config_size, EGLint *num_config); +EGLAPI EGLBoolean EGLAPIENTRY eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, + EGLConfig *configs, EGLint config_size, + EGLint *num_config); +EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, + EGLint attribute, EGLint *value); + +EGLAPI EGLSurface EGLAPIENTRY eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, + EGLNativeWindowType win, + const EGLint *attrib_list); +EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, + const EGLint *attrib_list); +EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, + EGLNativePixmapType pixmap, + const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroySurface(EGLDisplay dpy, EGLSurface surface); +EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurface(EGLDisplay dpy, EGLSurface surface, + EGLint attribute, EGLint *value); + +EGLAPI EGLBoolean EGLAPIENTRY eglBindAPI(EGLenum api); +EGLAPI EGLenum EGLAPIENTRY eglQueryAPI(void); + +EGLAPI EGLBoolean EGLAPIENTRY eglWaitClient(void); + +EGLAPI EGLBoolean EGLAPIENTRY eglReleaseThread(void); + +EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferFromClientBuffer( + EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, + EGLConfig config, const EGLint *attrib_list); + +EGLAPI EGLBoolean EGLAPIENTRY eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, + EGLint attribute, EGLint value); +EGLAPI EGLBoolean EGLAPIENTRY eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer); +EGLAPI EGLBoolean EGLAPIENTRY eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer); + + +EGLAPI EGLBoolean EGLAPIENTRY eglSwapInterval(EGLDisplay dpy, EGLint interval); + + +EGLAPI EGLContext EGLAPIENTRY eglCreateContext(EGLDisplay dpy, EGLConfig config, + EGLContext share_context, + const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroyContext(EGLDisplay dpy, EGLContext ctx); +EGLAPI EGLBoolean EGLAPIENTRY eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, + EGLSurface read, EGLContext ctx); + +EGLAPI EGLContext EGLAPIENTRY eglGetCurrentContext(void); +EGLAPI EGLSurface EGLAPIENTRY eglGetCurrentSurface(EGLint readdraw); +EGLAPI EGLDisplay EGLAPIENTRY eglGetCurrentDisplay(void); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryContext(EGLDisplay dpy, EGLContext ctx, + EGLint attribute, EGLint *value); + +EGLAPI EGLBoolean EGLAPIENTRY eglWaitGL(void); +EGLAPI EGLBoolean EGLAPIENTRY eglWaitNative(EGLint engine); +EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surface); +EGLAPI EGLBoolean EGLAPIENTRY eglCopyBuffers(EGLDisplay dpy, EGLSurface surface, + EGLNativePixmapType target); + +/* This is a generic function pointer type, whose name indicates it must + * be cast to the proper type *and calling convention* before use. + */ +typedef void (*__eglMustCastToProperFunctionPointerType)(void); + +/* Now, define eglGetProcAddress using the generic function ptr. type */ +EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY + eglGetProcAddress(const char *procname); + +#ifdef __cplusplus +} +#endif + +#endif /* __egl_h_ */ diff --git a/minecraftcpp-master/handheld/lib/include/EGL/eglext.h b/minecraftcpp-master/handheld/lib/include/EGL/eglext.h new file mode 100644 index 0000000..b05fd96 --- /dev/null +++ b/minecraftcpp-master/handheld/lib/include/EGL/eglext.h @@ -0,0 +1,175 @@ +#ifndef __eglext_h_ +#define __eglext_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Copyright (c) 2007-2009 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be included +** in all copies or substantial portions of the Materials. +** +** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ + +#include + +/*************************************************************/ + +/* Header file version number */ +/* Current version at http://www.khronos.org/registry/egl/ */ +#define EGL_EGLEXT_VERSION 4 + +#ifndef EGL_KHR_config_attribs +#define EGL_KHR_config_attribs 1 +#define EGL_CONFORMANT_KHR 0x3042 /* EGLConfig attribute */ +#define EGL_VG_COLORSPACE_LINEAR_BIT_KHR 0x0020 /* EGL_SURFACE_TYPE bitfield */ +#define EGL_VG_ALPHA_FORMAT_PRE_BIT_KHR 0x0040 /* EGL_SURFACE_TYPE bitfield */ +#endif + +#ifndef EGL_KHR_lock_surface +#define EGL_KHR_lock_surface 1 +#define EGL_READ_SURFACE_BIT_KHR 0x0001 /* EGL_LOCK_USAGE_HINT_KHR bitfield */ +#define EGL_WRITE_SURFACE_BIT_KHR 0x0002 /* EGL_LOCK_USAGE_HINT_KHR bitfield */ +#define EGL_LOCK_SURFACE_BIT_KHR 0x0080 /* EGL_SURFACE_TYPE bitfield */ +#define EGL_OPTIMAL_FORMAT_BIT_KHR 0x0100 /* EGL_SURFACE_TYPE bitfield */ +#define EGL_MATCH_FORMAT_KHR 0x3043 /* EGLConfig attribute */ +#define EGL_FORMAT_RGB_565_EXACT_KHR 0x30C0 /* EGL_MATCH_FORMAT_KHR value */ +#define EGL_FORMAT_RGB_565_KHR 0x30C1 /* EGL_MATCH_FORMAT_KHR value */ +#define EGL_FORMAT_RGBA_8888_EXACT_KHR 0x30C2 /* EGL_MATCH_FORMAT_KHR value */ +#define EGL_FORMAT_RGBA_8888_KHR 0x30C3 /* EGL_MATCH_FORMAT_KHR value */ +#define EGL_MAP_PRESERVE_PIXELS_KHR 0x30C4 /* eglLockSurfaceKHR attribute */ +#define EGL_LOCK_USAGE_HINT_KHR 0x30C5 /* eglLockSurfaceKHR attribute */ +#define EGL_BITMAP_POINTER_KHR 0x30C6 /* eglQuerySurface attribute */ +#define EGL_BITMAP_PITCH_KHR 0x30C7 /* eglQuerySurface attribute */ +#define EGL_BITMAP_ORIGIN_KHR 0x30C8 /* eglQuerySurface attribute */ +#define EGL_BITMAP_PIXEL_RED_OFFSET_KHR 0x30C9 /* eglQuerySurface attribute */ +#define EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR 0x30CA /* eglQuerySurface attribute */ +#define EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR 0x30CB /* eglQuerySurface attribute */ +#define EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR 0x30CC /* eglQuerySurface attribute */ +#define EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR 0x30CD /* eglQuerySurface attribute */ +#define EGL_LOWER_LEFT_KHR 0x30CE /* EGL_BITMAP_ORIGIN_KHR value */ +#define EGL_UPPER_LEFT_KHR 0x30CF /* EGL_BITMAP_ORIGIN_KHR value */ +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglLockSurfaceKHR (EGLDisplay display, EGLSurface surface, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglUnlockSurfaceKHR (EGLDisplay display, EGLSurface surface); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLBoolean (EGLAPIENTRYP PFNEGLLOCKSURFACEKHRPROC) (EGLDisplay display, EGLSurface surface, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNLOCKSURFACEKHRPROC) (EGLDisplay display, EGLSurface surface); +#endif + +#ifndef EGL_KHR_image +#define EGL_KHR_image 1 +#define EGL_NATIVE_PIXMAP_KHR 0x30B0 /* eglCreateImageKHR target */ +typedef void *EGLImageKHR; +#define EGL_NO_IMAGE_KHR ((EGLImageKHR)0) +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLImageKHR EGLAPIENTRY eglCreateImageKHR (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImageKHR (EGLDisplay dpy, EGLImageKHR image); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLImageKHR (EGLAPIENTRYP PFNEGLCREATEIMAGEKHRPROC) (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYIMAGEKHRPROC) (EGLDisplay dpy, EGLImageKHR image); +#endif + +#ifndef EGL_KHR_vg_parent_image +#define EGL_KHR_vg_parent_image 1 +#define EGL_VG_PARENT_IMAGE_KHR 0x30BA /* eglCreateImageKHR target */ +#endif + +#ifndef EGL_KHR_gl_texture_2D_image +#define EGL_KHR_gl_texture_2D_image 1 +#define EGL_GL_TEXTURE_2D_KHR 0x30B1 /* eglCreateImageKHR target */ +#define EGL_GL_TEXTURE_LEVEL_KHR 0x30BC /* eglCreateImageKHR attribute */ +#endif + +#ifndef EGL_KHR_gl_texture_cubemap_image +#define EGL_KHR_gl_texture_cubemap_image 1 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR 0x30B3 /* eglCreateImageKHR target */ +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR 0x30B4 /* eglCreateImageKHR target */ +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR 0x30B5 /* eglCreateImageKHR target */ +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR 0x30B6 /* eglCreateImageKHR target */ +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR 0x30B7 /* eglCreateImageKHR target */ +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR 0x30B8 /* eglCreateImageKHR target */ +#endif + +#ifndef EGL_KHR_gl_texture_3D_image +#define EGL_KHR_gl_texture_3D_image 1 +#define EGL_GL_TEXTURE_3D_KHR 0x30B2 /* eglCreateImageKHR target */ +#define EGL_GL_TEXTURE_ZOFFSET_KHR 0x30BD /* eglCreateImageKHR attribute */ +#endif + +#ifndef EGL_KHR_gl_renderbuffer_image +#define EGL_KHR_gl_renderbuffer_image 1 +#define EGL_GL_RENDERBUFFER_KHR 0x30B9 /* eglCreateImageKHR target */ +#endif + +#ifndef EGL_KHR_reusable_sync +#define EGL_KHR_reusable_sync 1 + +typedef void* EGLSyncKHR; +typedef khronos_utime_nanoseconds_t EGLTimeKHR; + +#define EGL_SYNC_STATUS_KHR 0x30F1 +#define EGL_SIGNALED_KHR 0x30F2 +#define EGL_UNSIGNALED_KHR 0x30F3 +#define EGL_TIMEOUT_EXPIRED_KHR 0x30F5 +#define EGL_CONDITION_SATISFIED_KHR 0x30F6 +#define EGL_SYNC_TYPE_KHR 0x30F7 +#define EGL_SYNC_REUSABLE_KHR 0x30FA +#define EGL_SYNC_FLUSH_COMMANDS_BIT_KHR 0x0001 /* eglClientWaitSyncKHR bitfield */ +#define EGL_FOREVER_KHR 0xFFFFFFFFFFFFFFFFull +#define EGL_NO_SYNC_KHR ((EGLSyncKHR)0) +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync); +EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout); +EGLAPI EGLBoolean EGLAPIENTRY eglSignalSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode); +EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value); +#endif /* EGL_EGLEXT_PROTOTYPES */ +typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESYNCKHR) (EGLDisplay dpy, EGLenum type, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCKHR) (EGLDisplay dpy, EGLSyncKHR sync); +typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCKHR) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSIGNALSYNCKHR) (EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBKHR) (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value); +#endif + +#ifndef EGL_KHR_image_base +#define EGL_KHR_image_base 1 +/* Most interfaces defined by EGL_KHR_image_pixmap above */ +#define EGL_IMAGE_PRESERVED_KHR 0x30D2 /* eglCreateImageKHR attribute */ +#endif + +#ifndef EGL_KHR_image_pixmap +#define EGL_KHR_image_pixmap 1 +/* Interfaces defined by EGL_KHR_image above */ +#endif + +#ifndef EGL_IMG_context_priority +#define EGL_IMG_context_priority 1 +#define EGL_CONTEXT_PRIORITY_LEVEL_IMG 0x3100 +#define EGL_CONTEXT_PRIORITY_HIGH_IMG 0x3101 +#define EGL_CONTEXT_PRIORITY_MEDIUM_IMG 0x3102 +#define EGL_CONTEXT_PRIORITY_LOW_IMG 0x3103 +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/minecraftcpp-master/handheld/lib/include/EGL/eglplatform.h b/minecraftcpp-master/handheld/lib/include/EGL/eglplatform.h new file mode 100644 index 0000000..e8a18f2 --- /dev/null +++ b/minecraftcpp-master/handheld/lib/include/EGL/eglplatform.h @@ -0,0 +1,124 @@ +#ifndef __eglplatform_h_ +#define __eglplatform_h_ + +/* +** Copyright (c) 2007-2009 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be included +** in all copies or substantial portions of the Materials. +** +** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ + +/* Platform-specific types and definitions for egl.h + * + * Adopters may modify khrplatform.h and this file to suit their platform. + * You are encouraged to submit all modifications to the Khronos group so that + * they can be included in future versions of this file. Please submit changes + * by sending them to the public Khronos Bugzilla (http://khronos.org/bugzilla) + * by filing a bug against product "EGL" component "Registry". + */ + +#include + +/* Macros used in EGL function prototype declarations. + * + * EGL functions should be prototyped as: + * + * EGLAPI return-type EGLAPIENTRY eglFunction(arguments); + * typedef return-type (EXPAPIENTRYP PFNEGLFUNCTIONPROC) (arguments); + * + * KHRONOS_APICALL and KHRONOS_APIENTRY are defined in KHR/khrplatform.h + */ + +#ifndef EGLAPI +#define EGLAPI KHRONOS_APICALL +#endif + +#define EGLAPIENTRY KHRONOS_APIENTRY +#define EGLAPIENTRYP KHRONOS_APIENTRY* + +/* The types NativeDisplayType, NativeWindowType, and NativePixmapType + * are aliases of window-system-dependent types, such as X Display * or + * Windows Device Context. They must be defined in platform-specific + * code below. The EGL-prefixed versions of Native*Type are the same + * types, renamed in EGL 1.3 so all types in the API start with "EGL". + */ + +#if defined(_WIN32) && !defined(__WINSCW__) || defined(__VC32__) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) /* Win32 and WinCE */ +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN 1 +#endif +#include + +typedef HDC EGLNativeDisplayType; +typedef HBITMAP EGLNativePixmapType; +typedef HWND EGLNativeWindowType; + +#elif defined(SUPPORT_X11) + +/* X11 (tentative) */ +#include +#include + +typedef Display *EGLNativeDisplayType; +typedef Pixmap EGLNativePixmapType; +typedef Window EGLNativeWindowType; + + +#elif defined(ANDROID) + +struct android_native_window_t; +struct egl_native_pixmap_t; + +typedef struct android_native_window_t* EGLNativeWindowType; +typedef struct egl_native_pixmap_t* EGLNativePixmapType; +typedef void* EGLNativeDisplayType; + +#else + +#if defined(_WIN64) || __WORDSIZE == 64 +typedef khronos_int64_t EGLNativeDisplayType; +#else +typedef int EGLNativeDisplayType; +#endif + +typedef void *EGLNativeWindowType; +typedef void *EGLNativePixmapType; + +#endif + +/* EGL 1.2 types, renamed for consistency in EGL 1.3 */ +typedef EGLNativeDisplayType NativeDisplayType; +typedef EGLNativePixmapType NativePixmapType; +typedef EGLNativeWindowType NativeWindowType; + + +/* Define EGLint. This must be a signed integral type large enough to contain + * all legal attribute names and values passed into and out of EGL, whether + * their type is boolean, bitmask, enumerant (symbolic constant), integer, + * handle, or other. While in general a 32-bit integer will suffice, if + * handles are 64 bit types, then EGLint should be defined as a signed 64-bit + * integer type. + */ +#if defined(_WIN64) || __WORDSIZE == 64 +typedef khronos_int64_t EGLint; +#else +typedef khronos_int32_t EGLint; +#endif + +#endif /* __eglplatform_h */ diff --git a/minecraftcpp-master/handheld/lib/include/GL/glew.h b/minecraftcpp-master/handheld/lib/include/GL/glew.h new file mode 100644 index 0000000..13bb8a6 --- /dev/null +++ b/minecraftcpp-master/handheld/lib/include/GL/glew.h @@ -0,0 +1,15343 @@ +/* +** The OpenGL Extension Wrangler Library +** Copyright (C) 2002-2008, Milan Ikits +** Copyright (C) 2002-2008, Marcelo E. Magallon +** Copyright (C) 2002, Lev Povalahev +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** +** * Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** * The name of the author may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Mesa 3-D graphics library + * Version: 7.0 + * + * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* +** Copyright (c) 2007 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be included +** in all copies or substantial portions of the Materials. +** +** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ + +#ifndef __glew_h__ +#define __glew_h__ +#define __GLEW_H__ + +#if defined(__gl_h_) || defined(__GL_H__) || defined(__X_GL_H) +#error gl.h included before glew.h +#endif +#if defined(__glext_h_) || defined(__GLEXT_H_) +#error glext.h included before glew.h +#endif +#if defined(__gl_ATI_h_) +#error glATI.h included before glew.h +#endif + +#define __gl_h_ +#define __GL_H__ +#define __X_GL_H +#define __glext_h_ +#define __GLEXT_H_ +#define __gl_ATI_h_ + +#if defined(_WIN32) + +/* + * GLEW does not include to avoid name space pollution. + * GL needs GLAPI and GLAPIENTRY, GLU needs APIENTRY, CALLBACK, and wchar_t + * defined properly. + */ +/* */ +#ifndef APIENTRY +#define GLEW_APIENTRY_DEFINED +# if defined(__MINGW32__) || defined(__CYGWIN__) +# define APIENTRY __stdcall +# elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__) +# define APIENTRY __stdcall +# else +# define APIENTRY +# endif +#endif +#ifndef GLAPI +# if defined(__MINGW32__) || defined(__CYGWIN__) +# define GLAPI extern +# endif +#endif +/* */ +#ifndef CALLBACK +#define GLEW_CALLBACK_DEFINED +# if defined(__MINGW32__) || defined(__CYGWIN__) +# define CALLBACK __attribute__ ((__stdcall__)) +# elif (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS) +# define CALLBACK __stdcall +# else +# define CALLBACK +# endif +#endif +/* and */ +#ifndef WINGDIAPI +#define GLEW_WINGDIAPI_DEFINED +#define WINGDIAPI __declspec(dllimport) +#endif +/* */ +#if (defined(_MSC_VER) || defined(__BORLANDC__)) && !defined(_WCHAR_T_DEFINED) +typedef unsigned short wchar_t; +# define _WCHAR_T_DEFINED +#endif +/* */ +#if !defined(_W64) +# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && defined(_MSC_VER) && _MSC_VER >= 1300 +# define _W64 __w64 +# else +# define _W64 +# endif +#endif +#if !defined(_PTRDIFF_T_DEFINED) && !defined(_PTRDIFF_T_) && !defined(__MINGW64__) +# ifdef _WIN64 +typedef __int64 ptrdiff_t; +# else +typedef _W64 int ptrdiff_t; +# endif +# define _PTRDIFF_T_DEFINED +# define _PTRDIFF_T_ +#endif + +#ifndef GLAPI +# if defined(__MINGW32__) || defined(__CYGWIN__) +# define GLAPI extern +# else +# define GLAPI WINGDIAPI +# endif +#endif + +#ifndef GLAPIENTRY +#define GLAPIENTRY APIENTRY +#endif + +/* + * GLEW_STATIC is defined for static library. + * GLEW_BUILD is defined for building the DLL library. + */ + +#ifdef GLEW_STATIC +# define GLEWAPI extern +#else +# ifdef GLEW_BUILD +# define GLEWAPI extern __declspec(dllexport) +# else +# define GLEWAPI extern __declspec(dllimport) +# endif +#endif + +#else /* _UNIX */ + +/* + * Needed for ptrdiff_t in turn needed by VBO. This is defined by ISO + * C. On my system, this amounts to _3 lines_ of included code, all of + * them pretty much harmless. If you know of a way of detecting 32 vs + * 64 _targets_ at compile time you are free to replace this with + * something that's portable. For now, _this_ is the portable solution. + * (mem, 2004-01-04) + */ + +#include + +/* SGI MIPSPro doesn't like stdint.h in C++ mode */ + +#if defined(__sgi) && !defined(__GNUC__) +#include +#else +#include +#endif + +#define GLEW_APIENTRY_DEFINED +#define APIENTRY + +/* + * GLEW_STATIC is defined for static library. + */ + +#ifdef GLEW_STATIC +# define GLEWAPI extern +#else +# if defined(__GNUC__) && __GNUC__>=4 +# define GLEWAPI extern __attribute__ ((visibility("default"))) +# elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) +# define GLEWAPI extern __global +# else +# define GLEWAPI extern +# endif +#endif + +/* */ +#ifndef GLAPI +#define GLAPI extern +#endif +#ifndef GLAPIENTRY +#define GLAPIENTRY +#endif + +#endif /* _WIN32 */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* ----------------------------- GL_VERSION_1_1 ---------------------------- */ + +#ifndef GL_VERSION_1_1 +#define GL_VERSION_1_1 1 + +typedef unsigned int GLenum; +typedef unsigned int GLbitfield; +typedef unsigned int GLuint; +typedef int GLint; +typedef int GLsizei; +typedef unsigned char GLboolean; +typedef signed char GLbyte; +typedef short GLshort; +typedef unsigned char GLubyte; +typedef unsigned short GLushort; +typedef unsigned long GLulong; +typedef float GLfloat; +typedef float GLclampf; +typedef double GLdouble; +typedef double GLclampd; +typedef void GLvoid; +#if defined(_MSC_VER) && _MSC_VER < 1400 +typedef __int64 GLint64EXT; +typedef unsigned __int64 GLuint64EXT; +#elif defined(_MSC_VER) || defined(__BORLANDC__) +typedef signed long long GLint64EXT; +typedef unsigned long long GLuint64EXT; +#else +# if defined(__MINGW32__) || defined(__CYGWIN__) +#include +# endif +typedef int64_t GLint64EXT; +typedef uint64_t GLuint64EXT; +#endif +typedef GLint64EXT GLint64; +typedef GLuint64EXT GLuint64; +typedef struct __GLsync *GLsync; + +typedef char GLchar; + +#define GL_ZERO 0 +#define GL_FALSE 0 +#define GL_LOGIC_OP 0x0BF1 +#define GL_NONE 0 +#define GL_TEXTURE_COMPONENTS 0x1003 +#define GL_NO_ERROR 0 +#define GL_POINTS 0x0000 +#define GL_CURRENT_BIT 0x00000001 +#define GL_TRUE 1 +#define GL_ONE 1 +#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 +#define GL_LINES 0x0001 +#define GL_LINE_LOOP 0x0002 +#define GL_POINT_BIT 0x00000002 +#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 +#define GL_LINE_STRIP 0x0003 +#define GL_LINE_BIT 0x00000004 +#define GL_TRIANGLES 0x0004 +#define GL_TRIANGLE_STRIP 0x0005 +#define GL_TRIANGLE_FAN 0x0006 +#define GL_QUADS 0x0007 +#define GL_QUAD_STRIP 0x0008 +#define GL_POLYGON_BIT 0x00000008 +#define GL_POLYGON 0x0009 +#define GL_POLYGON_STIPPLE_BIT 0x00000010 +#define GL_PIXEL_MODE_BIT 0x00000020 +#define GL_LIGHTING_BIT 0x00000040 +#define GL_FOG_BIT 0x00000080 +#define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_ACCUM 0x0100 +#define GL_LOAD 0x0101 +#define GL_RETURN 0x0102 +#define GL_MULT 0x0103 +#define GL_ADD 0x0104 +#define GL_NEVER 0x0200 +#define GL_ACCUM_BUFFER_BIT 0x00000200 +#define GL_LESS 0x0201 +#define GL_EQUAL 0x0202 +#define GL_LEQUAL 0x0203 +#define GL_GREATER 0x0204 +#define GL_NOTEQUAL 0x0205 +#define GL_GEQUAL 0x0206 +#define GL_ALWAYS 0x0207 +#define GL_SRC_COLOR 0x0300 +#define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_SRC_ALPHA 0x0302 +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_DST_ALPHA 0x0304 +#define GL_ONE_MINUS_DST_ALPHA 0x0305 +#define GL_DST_COLOR 0x0306 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_SRC_ALPHA_SATURATE 0x0308 +#define GL_STENCIL_BUFFER_BIT 0x00000400 +#define GL_FRONT_LEFT 0x0400 +#define GL_FRONT_RIGHT 0x0401 +#define GL_BACK_LEFT 0x0402 +#define GL_BACK_RIGHT 0x0403 +#define GL_FRONT 0x0404 +#define GL_BACK 0x0405 +#define GL_LEFT 0x0406 +#define GL_RIGHT 0x0407 +#define GL_FRONT_AND_BACK 0x0408 +#define GL_AUX0 0x0409 +#define GL_AUX1 0x040A +#define GL_AUX2 0x040B +#define GL_AUX3 0x040C +#define GL_INVALID_ENUM 0x0500 +#define GL_INVALID_VALUE 0x0501 +#define GL_INVALID_OPERATION 0x0502 +#define GL_STACK_OVERFLOW 0x0503 +#define GL_STACK_UNDERFLOW 0x0504 +#define GL_OUT_OF_MEMORY 0x0505 +#define GL_2D 0x0600 +#define GL_3D 0x0601 +#define GL_3D_COLOR 0x0602 +#define GL_3D_COLOR_TEXTURE 0x0603 +#define GL_4D_COLOR_TEXTURE 0x0604 +#define GL_PASS_THROUGH_TOKEN 0x0700 +#define GL_POINT_TOKEN 0x0701 +#define GL_LINE_TOKEN 0x0702 +#define GL_POLYGON_TOKEN 0x0703 +#define GL_BITMAP_TOKEN 0x0704 +#define GL_DRAW_PIXEL_TOKEN 0x0705 +#define GL_COPY_PIXEL_TOKEN 0x0706 +#define GL_LINE_RESET_TOKEN 0x0707 +#define GL_EXP 0x0800 +#define GL_VIEWPORT_BIT 0x00000800 +#define GL_EXP2 0x0801 +#define GL_CW 0x0900 +#define GL_CCW 0x0901 +#define GL_COEFF 0x0A00 +#define GL_ORDER 0x0A01 +#define GL_DOMAIN 0x0A02 +#define GL_CURRENT_COLOR 0x0B00 +#define GL_CURRENT_INDEX 0x0B01 +#define GL_CURRENT_NORMAL 0x0B02 +#define GL_CURRENT_TEXTURE_COORDS 0x0B03 +#define GL_CURRENT_RASTER_COLOR 0x0B04 +#define GL_CURRENT_RASTER_INDEX 0x0B05 +#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 +#define GL_CURRENT_RASTER_POSITION 0x0B07 +#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 +#define GL_CURRENT_RASTER_DISTANCE 0x0B09 +#define GL_POINT_SMOOTH 0x0B10 +#define GL_POINT_SIZE 0x0B11 +#define GL_POINT_SIZE_RANGE 0x0B12 +#define GL_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_LINE_SMOOTH 0x0B20 +#define GL_LINE_WIDTH 0x0B21 +#define GL_LINE_WIDTH_RANGE 0x0B22 +#define GL_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_LINE_STIPPLE 0x0B24 +#define GL_LINE_STIPPLE_PATTERN 0x0B25 +#define GL_LINE_STIPPLE_REPEAT 0x0B26 +#define GL_LIST_MODE 0x0B30 +#define GL_MAX_LIST_NESTING 0x0B31 +#define GL_LIST_BASE 0x0B32 +#define GL_LIST_INDEX 0x0B33 +#define GL_POLYGON_MODE 0x0B40 +#define GL_POLYGON_SMOOTH 0x0B41 +#define GL_POLYGON_STIPPLE 0x0B42 +#define GL_EDGE_FLAG 0x0B43 +#define GL_CULL_FACE 0x0B44 +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_FRONT_FACE 0x0B46 +#define GL_LIGHTING 0x0B50 +#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 +#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 +#define GL_LIGHT_MODEL_AMBIENT 0x0B53 +#define GL_SHADE_MODEL 0x0B54 +#define GL_COLOR_MATERIAL_FACE 0x0B55 +#define GL_COLOR_MATERIAL_PARAMETER 0x0B56 +#define GL_COLOR_MATERIAL 0x0B57 +#define GL_FOG 0x0B60 +#define GL_FOG_INDEX 0x0B61 +#define GL_FOG_DENSITY 0x0B62 +#define GL_FOG_START 0x0B63 +#define GL_FOG_END 0x0B64 +#define GL_FOG_MODE 0x0B65 +#define GL_FOG_COLOR 0x0B66 +#define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_TEST 0x0B71 +#define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DEPTH_CLEAR_VALUE 0x0B73 +#define GL_DEPTH_FUNC 0x0B74 +#define GL_ACCUM_CLEAR_VALUE 0x0B80 +#define GL_STENCIL_TEST 0x0B90 +#define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_FUNC 0x0B92 +#define GL_STENCIL_VALUE_MASK 0x0B93 +#define GL_STENCIL_FAIL 0x0B94 +#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 +#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 +#define GL_STENCIL_REF 0x0B97 +#define GL_STENCIL_WRITEMASK 0x0B98 +#define GL_MATRIX_MODE 0x0BA0 +#define GL_NORMALIZE 0x0BA1 +#define GL_VIEWPORT 0x0BA2 +#define GL_MODELVIEW_STACK_DEPTH 0x0BA3 +#define GL_PROJECTION_STACK_DEPTH 0x0BA4 +#define GL_TEXTURE_STACK_DEPTH 0x0BA5 +#define GL_MODELVIEW_MATRIX 0x0BA6 +#define GL_PROJECTION_MATRIX 0x0BA7 +#define GL_TEXTURE_MATRIX 0x0BA8 +#define GL_ATTRIB_STACK_DEPTH 0x0BB0 +#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 +#define GL_ALPHA_TEST 0x0BC0 +#define GL_ALPHA_TEST_FUNC 0x0BC1 +#define GL_ALPHA_TEST_REF 0x0BC2 +#define GL_DITHER 0x0BD0 +#define GL_BLEND_DST 0x0BE0 +#define GL_BLEND_SRC 0x0BE1 +#define GL_BLEND 0x0BE2 +#define GL_LOGIC_OP_MODE 0x0BF0 +#define GL_INDEX_LOGIC_OP 0x0BF1 +#define GL_COLOR_LOGIC_OP 0x0BF2 +#define GL_AUX_BUFFERS 0x0C00 +#define GL_DRAW_BUFFER 0x0C01 +#define GL_READ_BUFFER 0x0C02 +#define GL_SCISSOR_BOX 0x0C10 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_INDEX_CLEAR_VALUE 0x0C20 +#define GL_INDEX_WRITEMASK 0x0C21 +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_INDEX_MODE 0x0C30 +#define GL_RGBA_MODE 0x0C31 +#define GL_DOUBLEBUFFER 0x0C32 +#define GL_STEREO 0x0C33 +#define GL_RENDER_MODE 0x0C40 +#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 +#define GL_POINT_SMOOTH_HINT 0x0C51 +#define GL_LINE_SMOOTH_HINT 0x0C52 +#define GL_POLYGON_SMOOTH_HINT 0x0C53 +#define GL_FOG_HINT 0x0C54 +#define GL_TEXTURE_GEN_S 0x0C60 +#define GL_TEXTURE_GEN_T 0x0C61 +#define GL_TEXTURE_GEN_R 0x0C62 +#define GL_TEXTURE_GEN_Q 0x0C63 +#define GL_PIXEL_MAP_I_TO_I 0x0C70 +#define GL_PIXEL_MAP_S_TO_S 0x0C71 +#define GL_PIXEL_MAP_I_TO_R 0x0C72 +#define GL_PIXEL_MAP_I_TO_G 0x0C73 +#define GL_PIXEL_MAP_I_TO_B 0x0C74 +#define GL_PIXEL_MAP_I_TO_A 0x0C75 +#define GL_PIXEL_MAP_R_TO_R 0x0C76 +#define GL_PIXEL_MAP_G_TO_G 0x0C77 +#define GL_PIXEL_MAP_B_TO_B 0x0C78 +#define GL_PIXEL_MAP_A_TO_A 0x0C79 +#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0 +#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 +#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2 +#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3 +#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4 +#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5 +#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6 +#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7 +#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8 +#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 +#define GL_UNPACK_SWAP_BYTES 0x0CF0 +#define GL_UNPACK_LSB_FIRST 0x0CF1 +#define GL_UNPACK_ROW_LENGTH 0x0CF2 +#define GL_UNPACK_SKIP_ROWS 0x0CF3 +#define GL_UNPACK_SKIP_PIXELS 0x0CF4 +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_PACK_SWAP_BYTES 0x0D00 +#define GL_PACK_LSB_FIRST 0x0D01 +#define GL_PACK_ROW_LENGTH 0x0D02 +#define GL_PACK_SKIP_ROWS 0x0D03 +#define GL_PACK_SKIP_PIXELS 0x0D04 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_MAP_COLOR 0x0D10 +#define GL_MAP_STENCIL 0x0D11 +#define GL_INDEX_SHIFT 0x0D12 +#define GL_INDEX_OFFSET 0x0D13 +#define GL_RED_SCALE 0x0D14 +#define GL_RED_BIAS 0x0D15 +#define GL_ZOOM_X 0x0D16 +#define GL_ZOOM_Y 0x0D17 +#define GL_GREEN_SCALE 0x0D18 +#define GL_GREEN_BIAS 0x0D19 +#define GL_BLUE_SCALE 0x0D1A +#define GL_BLUE_BIAS 0x0D1B +#define GL_ALPHA_SCALE 0x0D1C +#define GL_ALPHA_BIAS 0x0D1D +#define GL_DEPTH_SCALE 0x0D1E +#define GL_DEPTH_BIAS 0x0D1F +#define GL_MAX_EVAL_ORDER 0x0D30 +#define GL_MAX_LIGHTS 0x0D31 +#define GL_MAX_CLIP_PLANES 0x0D32 +#define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_PIXEL_MAP_TABLE 0x0D34 +#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 +#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 +#define GL_MAX_NAME_STACK_DEPTH 0x0D37 +#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 +#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_INDEX_BITS 0x0D51 +#define GL_RED_BITS 0x0D52 +#define GL_GREEN_BITS 0x0D53 +#define GL_BLUE_BITS 0x0D54 +#define GL_ALPHA_BITS 0x0D55 +#define GL_DEPTH_BITS 0x0D56 +#define GL_STENCIL_BITS 0x0D57 +#define GL_ACCUM_RED_BITS 0x0D58 +#define GL_ACCUM_GREEN_BITS 0x0D59 +#define GL_ACCUM_BLUE_BITS 0x0D5A +#define GL_ACCUM_ALPHA_BITS 0x0D5B +#define GL_NAME_STACK_DEPTH 0x0D70 +#define GL_AUTO_NORMAL 0x0D80 +#define GL_MAP1_COLOR_4 0x0D90 +#define GL_MAP1_INDEX 0x0D91 +#define GL_MAP1_NORMAL 0x0D92 +#define GL_MAP1_TEXTURE_COORD_1 0x0D93 +#define GL_MAP1_TEXTURE_COORD_2 0x0D94 +#define GL_MAP1_TEXTURE_COORD_3 0x0D95 +#define GL_MAP1_TEXTURE_COORD_4 0x0D96 +#define GL_MAP1_VERTEX_3 0x0D97 +#define GL_MAP1_VERTEX_4 0x0D98 +#define GL_MAP2_COLOR_4 0x0DB0 +#define GL_MAP2_INDEX 0x0DB1 +#define GL_MAP2_NORMAL 0x0DB2 +#define GL_MAP2_TEXTURE_COORD_1 0x0DB3 +#define GL_MAP2_TEXTURE_COORD_2 0x0DB4 +#define GL_MAP2_TEXTURE_COORD_3 0x0DB5 +#define GL_MAP2_TEXTURE_COORD_4 0x0DB6 +#define GL_MAP2_VERTEX_3 0x0DB7 +#define GL_MAP2_VERTEX_4 0x0DB8 +#define GL_MAP1_GRID_DOMAIN 0x0DD0 +#define GL_MAP1_GRID_SEGMENTS 0x0DD1 +#define GL_MAP2_GRID_DOMAIN 0x0DD2 +#define GL_MAP2_GRID_SEGMENTS 0x0DD3 +#define GL_TEXTURE_1D 0x0DE0 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0 +#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 +#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 +#define GL_SELECTION_BUFFER_POINTER 0x0DF3 +#define GL_SELECTION_BUFFER_SIZE 0x0DF4 +#define GL_TEXTURE_WIDTH 0x1000 +#define GL_TRANSFORM_BIT 0x00001000 +#define GL_TEXTURE_HEIGHT 0x1001 +#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 +#define GL_TEXTURE_BORDER_COLOR 0x1004 +#define GL_TEXTURE_BORDER 0x1005 +#define GL_DONT_CARE 0x1100 +#define GL_FASTEST 0x1101 +#define GL_NICEST 0x1102 +#define GL_AMBIENT 0x1200 +#define GL_DIFFUSE 0x1201 +#define GL_SPECULAR 0x1202 +#define GL_POSITION 0x1203 +#define GL_SPOT_DIRECTION 0x1204 +#define GL_SPOT_EXPONENT 0x1205 +#define GL_SPOT_CUTOFF 0x1206 +#define GL_CONSTANT_ATTENUATION 0x1207 +#define GL_LINEAR_ATTENUATION 0x1208 +#define GL_QUADRATIC_ATTENUATION 0x1209 +#define GL_COMPILE 0x1300 +#define GL_COMPILE_AND_EXECUTE 0x1301 +#define GL_BYTE 0x1400 +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_SHORT 0x1402 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_INT 0x1404 +#define GL_UNSIGNED_INT 0x1405 +#define GL_FLOAT 0x1406 +#define GL_2_BYTES 0x1407 +#define GL_3_BYTES 0x1408 +#define GL_4_BYTES 0x1409 +#define GL_DOUBLE 0x140A +#define GL_CLEAR 0x1500 +#define GL_AND 0x1501 +#define GL_AND_REVERSE 0x1502 +#define GL_COPY 0x1503 +#define GL_AND_INVERTED 0x1504 +#define GL_NOOP 0x1505 +#define GL_XOR 0x1506 +#define GL_OR 0x1507 +#define GL_NOR 0x1508 +#define GL_EQUIV 0x1509 +#define GL_INVERT 0x150A +#define GL_OR_REVERSE 0x150B +#define GL_COPY_INVERTED 0x150C +#define GL_OR_INVERTED 0x150D +#define GL_NAND 0x150E +#define GL_SET 0x150F +#define GL_EMISSION 0x1600 +#define GL_SHININESS 0x1601 +#define GL_AMBIENT_AND_DIFFUSE 0x1602 +#define GL_COLOR_INDEXES 0x1603 +#define GL_MODELVIEW 0x1700 +#define GL_PROJECTION 0x1701 +#define GL_TEXTURE 0x1702 +#define GL_COLOR 0x1800 +#define GL_DEPTH 0x1801 +#define GL_STENCIL 0x1802 +#define GL_COLOR_INDEX 0x1900 +#define GL_STENCIL_INDEX 0x1901 +#define GL_DEPTH_COMPONENT 0x1902 +#define GL_RED 0x1903 +#define GL_GREEN 0x1904 +#define GL_BLUE 0x1905 +#define GL_ALPHA 0x1906 +#define GL_RGB 0x1907 +#define GL_RGBA 0x1908 +#define GL_LUMINANCE 0x1909 +#define GL_LUMINANCE_ALPHA 0x190A +#define GL_BITMAP 0x1A00 +#define GL_POINT 0x1B00 +#define GL_LINE 0x1B01 +#define GL_FILL 0x1B02 +#define GL_RENDER 0x1C00 +#define GL_FEEDBACK 0x1C01 +#define GL_SELECT 0x1C02 +#define GL_FLAT 0x1D00 +#define GL_SMOOTH 0x1D01 +#define GL_KEEP 0x1E00 +#define GL_REPLACE 0x1E01 +#define GL_INCR 0x1E02 +#define GL_DECR 0x1E03 +#define GL_VENDOR 0x1F00 +#define GL_RENDERER 0x1F01 +#define GL_VERSION 0x1F02 +#define GL_EXTENSIONS 0x1F03 +#define GL_S 0x2000 +#define GL_ENABLE_BIT 0x00002000 +#define GL_T 0x2001 +#define GL_R 0x2002 +#define GL_Q 0x2003 +#define GL_MODULATE 0x2100 +#define GL_DECAL 0x2101 +#define GL_TEXTURE_ENV_MODE 0x2200 +#define GL_TEXTURE_ENV_COLOR 0x2201 +#define GL_TEXTURE_ENV 0x2300 +#define GL_EYE_LINEAR 0x2400 +#define GL_OBJECT_LINEAR 0x2401 +#define GL_SPHERE_MAP 0x2402 +#define GL_TEXTURE_GEN_MODE 0x2500 +#define GL_OBJECT_PLANE 0x2501 +#define GL_EYE_PLANE 0x2502 +#define GL_NEAREST 0x2600 +#define GL_LINEAR 0x2601 +#define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_LINEAR_MIPMAP_NEAREST 0x2701 +#define GL_NEAREST_MIPMAP_LINEAR 0x2702 +#define GL_LINEAR_MIPMAP_LINEAR 0x2703 +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_WRAP_S 0x2802 +#define GL_TEXTURE_WRAP_T 0x2803 +#define GL_CLAMP 0x2900 +#define GL_REPEAT 0x2901 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +#define GL_POLYGON_OFFSET_POINT 0x2A01 +#define GL_POLYGON_OFFSET_LINE 0x2A02 +#define GL_R3_G3_B2 0x2A10 +#define GL_V2F 0x2A20 +#define GL_V3F 0x2A21 +#define GL_C4UB_V2F 0x2A22 +#define GL_C4UB_V3F 0x2A23 +#define GL_C3F_V3F 0x2A24 +#define GL_N3F_V3F 0x2A25 +#define GL_C4F_N3F_V3F 0x2A26 +#define GL_T2F_V3F 0x2A27 +#define GL_T4F_V4F 0x2A28 +#define GL_T2F_C4UB_V3F 0x2A29 +#define GL_T2F_C3F_V3F 0x2A2A +#define GL_T2F_N3F_V3F 0x2A2B +#define GL_T2F_C4F_N3F_V3F 0x2A2C +#define GL_T4F_C4F_N3F_V4F 0x2A2D +#define GL_CLIP_PLANE0 0x3000 +#define GL_CLIP_PLANE1 0x3001 +#define GL_CLIP_PLANE2 0x3002 +#define GL_CLIP_PLANE3 0x3003 +#define GL_CLIP_PLANE4 0x3004 +#define GL_CLIP_PLANE5 0x3005 +#define GL_LIGHT0 0x4000 +#define GL_COLOR_BUFFER_BIT 0x00004000 +#define GL_LIGHT1 0x4001 +#define GL_LIGHT2 0x4002 +#define GL_LIGHT3 0x4003 +#define GL_LIGHT4 0x4004 +#define GL_LIGHT5 0x4005 +#define GL_LIGHT6 0x4006 +#define GL_LIGHT7 0x4007 +#define GL_HINT_BIT 0x00008000 +#define GL_POLYGON_OFFSET_FILL 0x8037 +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_ALPHA4 0x803B +#define GL_ALPHA8 0x803C +#define GL_ALPHA12 0x803D +#define GL_ALPHA16 0x803E +#define GL_LUMINANCE4 0x803F +#define GL_LUMINANCE8 0x8040 +#define GL_LUMINANCE12 0x8041 +#define GL_LUMINANCE16 0x8042 +#define GL_LUMINANCE4_ALPHA4 0x8043 +#define GL_LUMINANCE6_ALPHA2 0x8044 +#define GL_LUMINANCE8_ALPHA8 0x8045 +#define GL_LUMINANCE12_ALPHA4 0x8046 +#define GL_LUMINANCE12_ALPHA12 0x8047 +#define GL_LUMINANCE16_ALPHA16 0x8048 +#define GL_INTENSITY 0x8049 +#define GL_INTENSITY4 0x804A +#define GL_INTENSITY8 0x804B +#define GL_INTENSITY12 0x804C +#define GL_INTENSITY16 0x804D +#define GL_RGB4 0x804F +#define GL_RGB5 0x8050 +#define GL_RGB8 0x8051 +#define GL_RGB10 0x8052 +#define GL_RGB12 0x8053 +#define GL_RGB16 0x8054 +#define GL_RGBA2 0x8055 +#define GL_RGBA4 0x8056 +#define GL_RGB5_A1 0x8057 +#define GL_RGBA8 0x8058 +#define GL_RGB10_A2 0x8059 +#define GL_RGBA12 0x805A +#define GL_RGBA16 0x805B +#define GL_TEXTURE_RED_SIZE 0x805C +#define GL_TEXTURE_GREEN_SIZE 0x805D +#define GL_TEXTURE_BLUE_SIZE 0x805E +#define GL_TEXTURE_ALPHA_SIZE 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE 0x8061 +#define GL_PROXY_TEXTURE_1D 0x8063 +#define GL_PROXY_TEXTURE_2D 0x8064 +#define GL_TEXTURE_PRIORITY 0x8066 +#define GL_TEXTURE_RESIDENT 0x8067 +#define GL_TEXTURE_BINDING_1D 0x8068 +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_VERTEX_ARRAY 0x8074 +#define GL_NORMAL_ARRAY 0x8075 +#define GL_COLOR_ARRAY 0x8076 +#define GL_INDEX_ARRAY 0x8077 +#define GL_TEXTURE_COORD_ARRAY 0x8078 +#define GL_EDGE_FLAG_ARRAY 0x8079 +#define GL_VERTEX_ARRAY_SIZE 0x807A +#define GL_VERTEX_ARRAY_TYPE 0x807B +#define GL_VERTEX_ARRAY_STRIDE 0x807C +#define GL_NORMAL_ARRAY_TYPE 0x807E +#define GL_NORMAL_ARRAY_STRIDE 0x807F +#define GL_COLOR_ARRAY_SIZE 0x8081 +#define GL_COLOR_ARRAY_TYPE 0x8082 +#define GL_COLOR_ARRAY_STRIDE 0x8083 +#define GL_INDEX_ARRAY_TYPE 0x8085 +#define GL_INDEX_ARRAY_STRIDE 0x8086 +#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A +#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C +#define GL_VERTEX_ARRAY_POINTER 0x808E +#define GL_NORMAL_ARRAY_POINTER 0x808F +#define GL_COLOR_ARRAY_POINTER 0x8090 +#define GL_INDEX_ARRAY_POINTER 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093 +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 +#define GL_EVAL_BIT 0x00010000 +#define GL_LIST_BIT 0x00020000 +#define GL_TEXTURE_BIT 0x00040000 +#define GL_SCISSOR_BIT 0x00080000 +#define GL_ALL_ATTRIB_BITS 0x000fffff +#define GL_CLIENT_ALL_ATTRIB_BITS 0xffffffff + +GLAPI void GLAPIENTRY glAccum (GLenum op, GLfloat value); +GLAPI void GLAPIENTRY glAlphaFunc (GLenum func, GLclampf ref); +GLAPI GLboolean GLAPIENTRY glAreTexturesResident (GLsizei n, const GLuint *textures, GLboolean *residences); +GLAPI void GLAPIENTRY glArrayElement (GLint i); +GLAPI void GLAPIENTRY glBegin (GLenum mode); +GLAPI void GLAPIENTRY glBindTexture (GLenum target, GLuint texture); +GLAPI void GLAPIENTRY glBitmap (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); +GLAPI void GLAPIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); +GLAPI void GLAPIENTRY glCallList (GLuint list); +GLAPI void GLAPIENTRY glCallLists (GLsizei n, GLenum type, const GLvoid *lists); +GLAPI void GLAPIENTRY glClear (GLbitfield mask); +GLAPI void GLAPIENTRY glClearAccum (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GLAPI void GLAPIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +GLAPI void GLAPIENTRY glClearDepth (GLclampd depth); +GLAPI void GLAPIENTRY glClearIndex (GLfloat c); +GLAPI void GLAPIENTRY glClearStencil (GLint s); +GLAPI void GLAPIENTRY glClipPlane (GLenum plane, const GLdouble *equation); +GLAPI void GLAPIENTRY glColor3b (GLbyte red, GLbyte green, GLbyte blue); +GLAPI void GLAPIENTRY glColor3bv (const GLbyte *v); +GLAPI void GLAPIENTRY glColor3d (GLdouble red, GLdouble green, GLdouble blue); +GLAPI void GLAPIENTRY glColor3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glColor3f (GLfloat red, GLfloat green, GLfloat blue); +GLAPI void GLAPIENTRY glColor3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glColor3i (GLint red, GLint green, GLint blue); +GLAPI void GLAPIENTRY glColor3iv (const GLint *v); +GLAPI void GLAPIENTRY glColor3s (GLshort red, GLshort green, GLshort blue); +GLAPI void GLAPIENTRY glColor3sv (const GLshort *v); +GLAPI void GLAPIENTRY glColor3ub (GLubyte red, GLubyte green, GLubyte blue); +GLAPI void GLAPIENTRY glColor3ubv (const GLubyte *v); +GLAPI void GLAPIENTRY glColor3ui (GLuint red, GLuint green, GLuint blue); +GLAPI void GLAPIENTRY glColor3uiv (const GLuint *v); +GLAPI void GLAPIENTRY glColor3us (GLushort red, GLushort green, GLushort blue); +GLAPI void GLAPIENTRY glColor3usv (const GLushort *v); +GLAPI void GLAPIENTRY glColor4b (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); +GLAPI void GLAPIENTRY glColor4bv (const GLbyte *v); +GLAPI void GLAPIENTRY glColor4d (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); +GLAPI void GLAPIENTRY glColor4dv (const GLdouble *v); +GLAPI void GLAPIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GLAPI void GLAPIENTRY glColor4fv (const GLfloat *v); +GLAPI void GLAPIENTRY glColor4i (GLint red, GLint green, GLint blue, GLint alpha); +GLAPI void GLAPIENTRY glColor4iv (const GLint *v); +GLAPI void GLAPIENTRY glColor4s (GLshort red, GLshort green, GLshort blue, GLshort alpha); +GLAPI void GLAPIENTRY glColor4sv (const GLshort *v); +GLAPI void GLAPIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); +GLAPI void GLAPIENTRY glColor4ubv (const GLubyte *v); +GLAPI void GLAPIENTRY glColor4ui (GLuint red, GLuint green, GLuint blue, GLuint alpha); +GLAPI void GLAPIENTRY glColor4uiv (const GLuint *v); +GLAPI void GLAPIENTRY glColor4us (GLushort red, GLushort green, GLushort blue, GLushort alpha); +GLAPI void GLAPIENTRY glColor4usv (const GLushort *v); +GLAPI void GLAPIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +GLAPI void GLAPIENTRY glColorMaterial (GLenum face, GLenum mode); +GLAPI void GLAPIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void GLAPIENTRY glCopyPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); +GLAPI void GLAPIENTRY glCopyTexImage1D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void GLAPIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void GLAPIENTRY glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void GLAPIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void GLAPIENTRY glCullFace (GLenum mode); +GLAPI void GLAPIENTRY glDeleteLists (GLuint list, GLsizei range); +GLAPI void GLAPIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); +GLAPI void GLAPIENTRY glDepthFunc (GLenum func); +GLAPI void GLAPIENTRY glDepthMask (GLboolean flag); +GLAPI void GLAPIENTRY glDepthRange (GLclampd zNear, GLclampd zFar); +GLAPI void GLAPIENTRY glDisable (GLenum cap); +GLAPI void GLAPIENTRY glDisableClientState (GLenum array); +GLAPI void GLAPIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); +GLAPI void GLAPIENTRY glDrawBuffer (GLenum mode); +GLAPI void GLAPIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); +GLAPI void GLAPIENTRY glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void GLAPIENTRY glEdgeFlag (GLboolean flag); +GLAPI void GLAPIENTRY glEdgeFlagPointer (GLsizei stride, const GLvoid *pointer); +GLAPI void GLAPIENTRY glEdgeFlagv (const GLboolean *flag); +GLAPI void GLAPIENTRY glEnable (GLenum cap); +GLAPI void GLAPIENTRY glEnableClientState (GLenum array); +GLAPI void GLAPIENTRY glEnd (void); +GLAPI void GLAPIENTRY glEndList (void); +GLAPI void GLAPIENTRY glEvalCoord1d (GLdouble u); +GLAPI void GLAPIENTRY glEvalCoord1dv (const GLdouble *u); +GLAPI void GLAPIENTRY glEvalCoord1f (GLfloat u); +GLAPI void GLAPIENTRY glEvalCoord1fv (const GLfloat *u); +GLAPI void GLAPIENTRY glEvalCoord2d (GLdouble u, GLdouble v); +GLAPI void GLAPIENTRY glEvalCoord2dv (const GLdouble *u); +GLAPI void GLAPIENTRY glEvalCoord2f (GLfloat u, GLfloat v); +GLAPI void GLAPIENTRY glEvalCoord2fv (const GLfloat *u); +GLAPI void GLAPIENTRY glEvalMesh1 (GLenum mode, GLint i1, GLint i2); +GLAPI void GLAPIENTRY glEvalMesh2 (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); +GLAPI void GLAPIENTRY glEvalPoint1 (GLint i); +GLAPI void GLAPIENTRY glEvalPoint2 (GLint i, GLint j); +GLAPI void GLAPIENTRY glFeedbackBuffer (GLsizei size, GLenum type, GLfloat *buffer); +GLAPI void GLAPIENTRY glFinish (void); +GLAPI void GLAPIENTRY glFlush (void); +GLAPI void GLAPIENTRY glFogf (GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glFogfv (GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glFogi (GLenum pname, GLint param); +GLAPI void GLAPIENTRY glFogiv (GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glFrontFace (GLenum mode); +GLAPI void GLAPIENTRY glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI GLuint GLAPIENTRY glGenLists (GLsizei range); +GLAPI void GLAPIENTRY glGenTextures (GLsizei n, GLuint *textures); +GLAPI void GLAPIENTRY glGetBooleanv (GLenum pname, GLboolean *params); +GLAPI void GLAPIENTRY glGetClipPlane (GLenum plane, GLdouble *equation); +GLAPI void GLAPIENTRY glGetDoublev (GLenum pname, GLdouble *params); +GLAPI GLenum GLAPIENTRY glGetError (void); +GLAPI void GLAPIENTRY glGetFloatv (GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetIntegerv (GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetLightiv (GLenum light, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetMapdv (GLenum target, GLenum query, GLdouble *v); +GLAPI void GLAPIENTRY glGetMapfv (GLenum target, GLenum query, GLfloat *v); +GLAPI void GLAPIENTRY glGetMapiv (GLenum target, GLenum query, GLint *v); +GLAPI void GLAPIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetMaterialiv (GLenum face, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetPixelMapfv (GLenum map, GLfloat *values); +GLAPI void GLAPIENTRY glGetPixelMapuiv (GLenum map, GLuint *values); +GLAPI void GLAPIENTRY glGetPixelMapusv (GLenum map, GLushort *values); +GLAPI void GLAPIENTRY glGetPointerv (GLenum pname, GLvoid* *params); +GLAPI void GLAPIENTRY glGetPolygonStipple (GLubyte *mask); +GLAPI const GLubyte * GLAPIENTRY glGetString (GLenum name); +GLAPI void GLAPIENTRY glGetTexEnvfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexEnviv (GLenum target, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetTexGendv (GLenum coord, GLenum pname, GLdouble *params); +GLAPI void GLAPIENTRY glGetTexGenfv (GLenum coord, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexGeniv (GLenum coord, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); +GLAPI void GLAPIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glHint (GLenum target, GLenum mode); +GLAPI void GLAPIENTRY glIndexMask (GLuint mask); +GLAPI void GLAPIENTRY glIndexPointer (GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void GLAPIENTRY glIndexd (GLdouble c); +GLAPI void GLAPIENTRY glIndexdv (const GLdouble *c); +GLAPI void GLAPIENTRY glIndexf (GLfloat c); +GLAPI void GLAPIENTRY glIndexfv (const GLfloat *c); +GLAPI void GLAPIENTRY glIndexi (GLint c); +GLAPI void GLAPIENTRY glIndexiv (const GLint *c); +GLAPI void GLAPIENTRY glIndexs (GLshort c); +GLAPI void GLAPIENTRY glIndexsv (const GLshort *c); +GLAPI void GLAPIENTRY glIndexub (GLubyte c); +GLAPI void GLAPIENTRY glIndexubv (const GLubyte *c); +GLAPI void GLAPIENTRY glInitNames (void); +GLAPI void GLAPIENTRY glInterleavedArrays (GLenum format, GLsizei stride, const GLvoid *pointer); +GLAPI GLboolean GLAPIENTRY glIsEnabled (GLenum cap); +GLAPI GLboolean GLAPIENTRY glIsList (GLuint list); +GLAPI GLboolean GLAPIENTRY glIsTexture (GLuint texture); +GLAPI void GLAPIENTRY glLightModelf (GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glLightModelfv (GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glLightModeli (GLenum pname, GLint param); +GLAPI void GLAPIENTRY glLightModeliv (GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glLightf (GLenum light, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glLighti (GLenum light, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glLightiv (GLenum light, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glLineStipple (GLint factor, GLushort pattern); +GLAPI void GLAPIENTRY glLineWidth (GLfloat width); +GLAPI void GLAPIENTRY glListBase (GLuint base); +GLAPI void GLAPIENTRY glLoadIdentity (void); +GLAPI void GLAPIENTRY glLoadMatrixd (const GLdouble *m); +GLAPI void GLAPIENTRY glLoadMatrixf (const GLfloat *m); +GLAPI void GLAPIENTRY glLoadName (GLuint name); +GLAPI void GLAPIENTRY glLogicOp (GLenum opcode); +GLAPI void GLAPIENTRY glMap1d (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); +GLAPI void GLAPIENTRY glMap1f (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); +GLAPI void GLAPIENTRY glMap2d (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); +GLAPI void GLAPIENTRY glMap2f (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); +GLAPI void GLAPIENTRY glMapGrid1d (GLint un, GLdouble u1, GLdouble u2); +GLAPI void GLAPIENTRY glMapGrid1f (GLint un, GLfloat u1, GLfloat u2); +GLAPI void GLAPIENTRY glMapGrid2d (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); +GLAPI void GLAPIENTRY glMapGrid2f (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); +GLAPI void GLAPIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glMateriali (GLenum face, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glMaterialiv (GLenum face, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glMatrixMode (GLenum mode); +GLAPI void GLAPIENTRY glMultMatrixd (const GLdouble *m); +GLAPI void GLAPIENTRY glMultMatrixf (const GLfloat *m); +GLAPI void GLAPIENTRY glNewList (GLuint list, GLenum mode); +GLAPI void GLAPIENTRY glNormal3b (GLbyte nx, GLbyte ny, GLbyte nz); +GLAPI void GLAPIENTRY glNormal3bv (const GLbyte *v); +GLAPI void GLAPIENTRY glNormal3d (GLdouble nx, GLdouble ny, GLdouble nz); +GLAPI void GLAPIENTRY glNormal3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz); +GLAPI void GLAPIENTRY glNormal3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glNormal3i (GLint nx, GLint ny, GLint nz); +GLAPI void GLAPIENTRY glNormal3iv (const GLint *v); +GLAPI void GLAPIENTRY glNormal3s (GLshort nx, GLshort ny, GLshort nz); +GLAPI void GLAPIENTRY glNormal3sv (const GLshort *v); +GLAPI void GLAPIENTRY glNormalPointer (GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void GLAPIENTRY glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI void GLAPIENTRY glPassThrough (GLfloat token); +GLAPI void GLAPIENTRY glPixelMapfv (GLenum map, GLsizei mapsize, const GLfloat *values); +GLAPI void GLAPIENTRY glPixelMapuiv (GLenum map, GLsizei mapsize, const GLuint *values); +GLAPI void GLAPIENTRY glPixelMapusv (GLenum map, GLsizei mapsize, const GLushort *values); +GLAPI void GLAPIENTRY glPixelStoref (GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glPixelStorei (GLenum pname, GLint param); +GLAPI void GLAPIENTRY glPixelTransferf (GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glPixelTransferi (GLenum pname, GLint param); +GLAPI void GLAPIENTRY glPixelZoom (GLfloat xfactor, GLfloat yfactor); +GLAPI void GLAPIENTRY glPointSize (GLfloat size); +GLAPI void GLAPIENTRY glPolygonMode (GLenum face, GLenum mode); +GLAPI void GLAPIENTRY glPolygonOffset (GLfloat factor, GLfloat units); +GLAPI void GLAPIENTRY glPolygonStipple (const GLubyte *mask); +GLAPI void GLAPIENTRY glPopAttrib (void); +GLAPI void GLAPIENTRY glPopClientAttrib (void); +GLAPI void GLAPIENTRY glPopMatrix (void); +GLAPI void GLAPIENTRY glPopName (void); +GLAPI void GLAPIENTRY glPrioritizeTextures (GLsizei n, const GLuint *textures, const GLclampf *priorities); +GLAPI void GLAPIENTRY glPushAttrib (GLbitfield mask); +GLAPI void GLAPIENTRY glPushClientAttrib (GLbitfield mask); +GLAPI void GLAPIENTRY glPushMatrix (void); +GLAPI void GLAPIENTRY glPushName (GLuint name); +GLAPI void GLAPIENTRY glRasterPos2d (GLdouble x, GLdouble y); +GLAPI void GLAPIENTRY glRasterPos2dv (const GLdouble *v); +GLAPI void GLAPIENTRY glRasterPos2f (GLfloat x, GLfloat y); +GLAPI void GLAPIENTRY glRasterPos2fv (const GLfloat *v); +GLAPI void GLAPIENTRY glRasterPos2i (GLint x, GLint y); +GLAPI void GLAPIENTRY glRasterPos2iv (const GLint *v); +GLAPI void GLAPIENTRY glRasterPos2s (GLshort x, GLshort y); +GLAPI void GLAPIENTRY glRasterPos2sv (const GLshort *v); +GLAPI void GLAPIENTRY glRasterPos3d (GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glRasterPos3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glRasterPos3f (GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glRasterPos3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glRasterPos3i (GLint x, GLint y, GLint z); +GLAPI void GLAPIENTRY glRasterPos3iv (const GLint *v); +GLAPI void GLAPIENTRY glRasterPos3s (GLshort x, GLshort y, GLshort z); +GLAPI void GLAPIENTRY glRasterPos3sv (const GLshort *v); +GLAPI void GLAPIENTRY glRasterPos4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void GLAPIENTRY glRasterPos4dv (const GLdouble *v); +GLAPI void GLAPIENTRY glRasterPos4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void GLAPIENTRY glRasterPos4fv (const GLfloat *v); +GLAPI void GLAPIENTRY glRasterPos4i (GLint x, GLint y, GLint z, GLint w); +GLAPI void GLAPIENTRY glRasterPos4iv (const GLint *v); +GLAPI void GLAPIENTRY glRasterPos4s (GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void GLAPIENTRY glRasterPos4sv (const GLshort *v); +GLAPI void GLAPIENTRY glReadBuffer (GLenum mode); +GLAPI void GLAPIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels); +GLAPI void GLAPIENTRY glRectd (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); +GLAPI void GLAPIENTRY glRectdv (const GLdouble *v1, const GLdouble *v2); +GLAPI void GLAPIENTRY glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); +GLAPI void GLAPIENTRY glRectfv (const GLfloat *v1, const GLfloat *v2); +GLAPI void GLAPIENTRY glRecti (GLint x1, GLint y1, GLint x2, GLint y2); +GLAPI void GLAPIENTRY glRectiv (const GLint *v1, const GLint *v2); +GLAPI void GLAPIENTRY glRects (GLshort x1, GLshort y1, GLshort x2, GLshort y2); +GLAPI void GLAPIENTRY glRectsv (const GLshort *v1, const GLshort *v2); +GLAPI GLint GLAPIENTRY glRenderMode (GLenum mode); +GLAPI void GLAPIENTRY glRotated (GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glScaled (GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void GLAPIENTRY glSelectBuffer (GLsizei size, GLuint *buffer); +GLAPI void GLAPIENTRY glShadeModel (GLenum mode); +GLAPI void GLAPIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); +GLAPI void GLAPIENTRY glStencilMask (GLuint mask); +GLAPI void GLAPIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); +GLAPI void GLAPIENTRY glTexCoord1d (GLdouble s); +GLAPI void GLAPIENTRY glTexCoord1dv (const GLdouble *v); +GLAPI void GLAPIENTRY glTexCoord1f (GLfloat s); +GLAPI void GLAPIENTRY glTexCoord1fv (const GLfloat *v); +GLAPI void GLAPIENTRY glTexCoord1i (GLint s); +GLAPI void GLAPIENTRY glTexCoord1iv (const GLint *v); +GLAPI void GLAPIENTRY glTexCoord1s (GLshort s); +GLAPI void GLAPIENTRY glTexCoord1sv (const GLshort *v); +GLAPI void GLAPIENTRY glTexCoord2d (GLdouble s, GLdouble t); +GLAPI void GLAPIENTRY glTexCoord2dv (const GLdouble *v); +GLAPI void GLAPIENTRY glTexCoord2f (GLfloat s, GLfloat t); +GLAPI void GLAPIENTRY glTexCoord2fv (const GLfloat *v); +GLAPI void GLAPIENTRY glTexCoord2i (GLint s, GLint t); +GLAPI void GLAPIENTRY glTexCoord2iv (const GLint *v); +GLAPI void GLAPIENTRY glTexCoord2s (GLshort s, GLshort t); +GLAPI void GLAPIENTRY glTexCoord2sv (const GLshort *v); +GLAPI void GLAPIENTRY glTexCoord3d (GLdouble s, GLdouble t, GLdouble r); +GLAPI void GLAPIENTRY glTexCoord3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glTexCoord3f (GLfloat s, GLfloat t, GLfloat r); +GLAPI void GLAPIENTRY glTexCoord3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glTexCoord3i (GLint s, GLint t, GLint r); +GLAPI void GLAPIENTRY glTexCoord3iv (const GLint *v); +GLAPI void GLAPIENTRY glTexCoord3s (GLshort s, GLshort t, GLshort r); +GLAPI void GLAPIENTRY glTexCoord3sv (const GLshort *v); +GLAPI void GLAPIENTRY glTexCoord4d (GLdouble s, GLdouble t, GLdouble r, GLdouble q); +GLAPI void GLAPIENTRY glTexCoord4dv (const GLdouble *v); +GLAPI void GLAPIENTRY glTexCoord4f (GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GLAPI void GLAPIENTRY glTexCoord4fv (const GLfloat *v); +GLAPI void GLAPIENTRY glTexCoord4i (GLint s, GLint t, GLint r, GLint q); +GLAPI void GLAPIENTRY glTexCoord4iv (const GLint *v); +GLAPI void GLAPIENTRY glTexCoord4s (GLshort s, GLshort t, GLshort r, GLshort q); +GLAPI void GLAPIENTRY glTexCoord4sv (const GLshort *v); +GLAPI void GLAPIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void GLAPIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glTexGend (GLenum coord, GLenum pname, GLdouble param); +GLAPI void GLAPIENTRY glTexGendv (GLenum coord, GLenum pname, const GLdouble *params); +GLAPI void GLAPIENTRY glTexGenf (GLenum coord, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glTexGenfv (GLenum coord, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glTexGeni (GLenum coord, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glTexGeniv (GLenum coord, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void GLAPIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void GLAPIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void GLAPIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +GLAPI void GLAPIENTRY glTranslated (GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glVertex2d (GLdouble x, GLdouble y); +GLAPI void GLAPIENTRY glVertex2dv (const GLdouble *v); +GLAPI void GLAPIENTRY glVertex2f (GLfloat x, GLfloat y); +GLAPI void GLAPIENTRY glVertex2fv (const GLfloat *v); +GLAPI void GLAPIENTRY glVertex2i (GLint x, GLint y); +GLAPI void GLAPIENTRY glVertex2iv (const GLint *v); +GLAPI void GLAPIENTRY glVertex2s (GLshort x, GLshort y); +GLAPI void GLAPIENTRY glVertex2sv (const GLshort *v); +GLAPI void GLAPIENTRY glVertex3d (GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glVertex3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glVertex3f (GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glVertex3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glVertex3i (GLint x, GLint y, GLint z); +GLAPI void GLAPIENTRY glVertex3iv (const GLint *v); +GLAPI void GLAPIENTRY glVertex3s (GLshort x, GLshort y, GLshort z); +GLAPI void GLAPIENTRY glVertex3sv (const GLshort *v); +GLAPI void GLAPIENTRY glVertex4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void GLAPIENTRY glVertex4dv (const GLdouble *v); +GLAPI void GLAPIENTRY glVertex4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void GLAPIENTRY glVertex4fv (const GLfloat *v); +GLAPI void GLAPIENTRY glVertex4i (GLint x, GLint y, GLint z, GLint w); +GLAPI void GLAPIENTRY glVertex4iv (const GLint *v); +GLAPI void GLAPIENTRY glVertex4s (GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void GLAPIENTRY glVertex4sv (const GLshort *v); +GLAPI void GLAPIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GLAPI void GLAPIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); + +#define GLEW_VERSION_1_1 GLEW_GET_VAR(__GLEW_VERSION_1_1) + +#endif /* GL_VERSION_1_1 */ + +/* ---------------------------------- GLU ---------------------------------- */ + +/* this is where we can safely include GLU */ +#if defined(__APPLE__) && defined(__MACH__) +#include +#else +#include +#endif + +/* ----------------------------- GL_VERSION_1_2 ---------------------------- */ + +#ifndef GL_VERSION_1_2 +#define GL_VERSION_1_2 1 + +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_RESCALE_NORMAL 0x803A +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E + +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); +typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); + +#define glCopyTexSubImage3D GLEW_GET_FUN(__glewCopyTexSubImage3D) +#define glDrawRangeElements GLEW_GET_FUN(__glewDrawRangeElements) +#define glTexImage3D GLEW_GET_FUN(__glewTexImage3D) +#define glTexSubImage3D GLEW_GET_FUN(__glewTexSubImage3D) + +#define GLEW_VERSION_1_2 GLEW_GET_VAR(__GLEW_VERSION_1_2) + +#endif /* GL_VERSION_1_2 */ + +/* ---------------------------- GL_VERSION_1_2_1 --------------------------- */ + +#ifndef GL_VERSION_1_2_1 +#define GL_VERSION_1_2_1 1 + +#define GLEW_VERSION_1_2_1 GLEW_GET_VAR(__GLEW_VERSION_1_2_1) + +#endif /* GL_VERSION_1_2_1 */ + +/* ----------------------------- GL_VERSION_1_3 ---------------------------- */ + +#ifndef GL_VERSION_1_3 +#define GL_VERSION_1_3 1 + +#define GL_MULTISAMPLE 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_CLAMP_TO_BORDER 0x812D +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +#define GL_SUBTRACT 0x84E7 +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_INTENSITY 0x84EC +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_NORMAL_MAP 0x8511 +#define GL_REFLECTION_MAP 0x8512 +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_COMBINE 0x8570 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_RGB_SCALE 0x8573 +#define GL_ADD_SIGNED 0x8574 +#define GL_INTERPOLATE 0x8575 +#define GL_CONSTANT 0x8576 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PREVIOUS 0x8578 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE2_RGB 0x8582 +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_RGB 0x8592 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF +#define GL_MULTISAMPLE_BIT 0x20000000 + +typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, GLvoid *img); +typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble m[16]); +typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat m[16]); +typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble m[16]); +typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat m[16]); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); + +#define glActiveTexture GLEW_GET_FUN(__glewActiveTexture) +#define glClientActiveTexture GLEW_GET_FUN(__glewClientActiveTexture) +#define glCompressedTexImage1D GLEW_GET_FUN(__glewCompressedTexImage1D) +#define glCompressedTexImage2D GLEW_GET_FUN(__glewCompressedTexImage2D) +#define glCompressedTexImage3D GLEW_GET_FUN(__glewCompressedTexImage3D) +#define glCompressedTexSubImage1D GLEW_GET_FUN(__glewCompressedTexSubImage1D) +#define glCompressedTexSubImage2D GLEW_GET_FUN(__glewCompressedTexSubImage2D) +#define glCompressedTexSubImage3D GLEW_GET_FUN(__glewCompressedTexSubImage3D) +#define glGetCompressedTexImage GLEW_GET_FUN(__glewGetCompressedTexImage) +#define glLoadTransposeMatrixd GLEW_GET_FUN(__glewLoadTransposeMatrixd) +#define glLoadTransposeMatrixf GLEW_GET_FUN(__glewLoadTransposeMatrixf) +#define glMultTransposeMatrixd GLEW_GET_FUN(__glewMultTransposeMatrixd) +#define glMultTransposeMatrixf GLEW_GET_FUN(__glewMultTransposeMatrixf) +#define glMultiTexCoord1d GLEW_GET_FUN(__glewMultiTexCoord1d) +#define glMultiTexCoord1dv GLEW_GET_FUN(__glewMultiTexCoord1dv) +#define glMultiTexCoord1f GLEW_GET_FUN(__glewMultiTexCoord1f) +#define glMultiTexCoord1fv GLEW_GET_FUN(__glewMultiTexCoord1fv) +#define glMultiTexCoord1i GLEW_GET_FUN(__glewMultiTexCoord1i) +#define glMultiTexCoord1iv GLEW_GET_FUN(__glewMultiTexCoord1iv) +#define glMultiTexCoord1s GLEW_GET_FUN(__glewMultiTexCoord1s) +#define glMultiTexCoord1sv GLEW_GET_FUN(__glewMultiTexCoord1sv) +#define glMultiTexCoord2d GLEW_GET_FUN(__glewMultiTexCoord2d) +#define glMultiTexCoord2dv GLEW_GET_FUN(__glewMultiTexCoord2dv) +#define glMultiTexCoord2f GLEW_GET_FUN(__glewMultiTexCoord2f) +#define glMultiTexCoord2fv GLEW_GET_FUN(__glewMultiTexCoord2fv) +#define glMultiTexCoord2i GLEW_GET_FUN(__glewMultiTexCoord2i) +#define glMultiTexCoord2iv GLEW_GET_FUN(__glewMultiTexCoord2iv) +#define glMultiTexCoord2s GLEW_GET_FUN(__glewMultiTexCoord2s) +#define glMultiTexCoord2sv GLEW_GET_FUN(__glewMultiTexCoord2sv) +#define glMultiTexCoord3d GLEW_GET_FUN(__glewMultiTexCoord3d) +#define glMultiTexCoord3dv GLEW_GET_FUN(__glewMultiTexCoord3dv) +#define glMultiTexCoord3f GLEW_GET_FUN(__glewMultiTexCoord3f) +#define glMultiTexCoord3fv GLEW_GET_FUN(__glewMultiTexCoord3fv) +#define glMultiTexCoord3i GLEW_GET_FUN(__glewMultiTexCoord3i) +#define glMultiTexCoord3iv GLEW_GET_FUN(__glewMultiTexCoord3iv) +#define glMultiTexCoord3s GLEW_GET_FUN(__glewMultiTexCoord3s) +#define glMultiTexCoord3sv GLEW_GET_FUN(__glewMultiTexCoord3sv) +#define glMultiTexCoord4d GLEW_GET_FUN(__glewMultiTexCoord4d) +#define glMultiTexCoord4dv GLEW_GET_FUN(__glewMultiTexCoord4dv) +#define glMultiTexCoord4f GLEW_GET_FUN(__glewMultiTexCoord4f) +#define glMultiTexCoord4fv GLEW_GET_FUN(__glewMultiTexCoord4fv) +#define glMultiTexCoord4i GLEW_GET_FUN(__glewMultiTexCoord4i) +#define glMultiTexCoord4iv GLEW_GET_FUN(__glewMultiTexCoord4iv) +#define glMultiTexCoord4s GLEW_GET_FUN(__glewMultiTexCoord4s) +#define glMultiTexCoord4sv GLEW_GET_FUN(__glewMultiTexCoord4sv) +#define glSampleCoverage GLEW_GET_FUN(__glewSampleCoverage) + +#define GLEW_VERSION_1_3 GLEW_GET_VAR(__GLEW_VERSION_1_3) + +#endif /* GL_VERSION_1_3 */ + +/* ----------------------------- GL_VERSION_1_4 ---------------------------- */ + +#ifndef GL_VERSION_1_4 +#define GL_VERSION_1_4 1 + +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_POINT_SIZE_MIN 0x8126 +#define GL_POINT_SIZE_MAX 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION 0x8129 +#define GL_GENERATE_MIPMAP 0x8191 +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT24 0x81A6 +#define GL_DEPTH_COMPONENT32 0x81A7 +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_FOG_COORDINATE_SOURCE 0x8450 +#define GL_FOG_COORDINATE 0x8451 +#define GL_FRAGMENT_DEPTH 0x8452 +#define GL_CURRENT_FOG_COORDINATE 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 +#define GL_FOG_COORDINATE_ARRAY 0x8457 +#define GL_COLOR_SUM 0x8458 +#define GL_CURRENT_SECONDARY_COLOR 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D +#define GL_SECONDARY_COLOR_ARRAY 0x845E +#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD +#define GL_TEXTURE_FILTER_CONTROL 0x8500 +#define GL_TEXTURE_LOD_BIAS 0x8501 +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 +#define GL_TEXTURE_DEPTH_SIZE 0x884A +#define GL_DEPTH_TEXTURE_MODE 0x884B +#define GL_TEXTURE_COMPARE_MODE 0x884C +#define GL_TEXTURE_COMPARE_FUNC 0x884D +#define GL_COMPARE_R_TO_TEXTURE 0x884E + +typedef void (GLAPIENTRY * PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONPROC) (GLenum mode); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLFOGCOORDDPROC) (GLdouble coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDDVPROC) (const GLdouble *coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFPROC) (GLfloat coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFVPROC) (const GLfloat *coord); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, GLsizei *count, GLenum type, const GLvoid **indices, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVPROC) (const GLdouble *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVPROC) (const GLfloat *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVPROC) (const GLint *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVPROC) (const GLshort *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVPROC) (const GLdouble *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVPROC) (const GLfloat *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVPROC) (const GLint *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVPROC) (const GLshort *p); + +#define glBlendColor GLEW_GET_FUN(__glewBlendColor) +#define glBlendEquation GLEW_GET_FUN(__glewBlendEquation) +#define glBlendFuncSeparate GLEW_GET_FUN(__glewBlendFuncSeparate) +#define glFogCoordPointer GLEW_GET_FUN(__glewFogCoordPointer) +#define glFogCoordd GLEW_GET_FUN(__glewFogCoordd) +#define glFogCoorddv GLEW_GET_FUN(__glewFogCoorddv) +#define glFogCoordf GLEW_GET_FUN(__glewFogCoordf) +#define glFogCoordfv GLEW_GET_FUN(__glewFogCoordfv) +#define glMultiDrawArrays GLEW_GET_FUN(__glewMultiDrawArrays) +#define glMultiDrawElements GLEW_GET_FUN(__glewMultiDrawElements) +#define glPointParameterf GLEW_GET_FUN(__glewPointParameterf) +#define glPointParameterfv GLEW_GET_FUN(__glewPointParameterfv) +#define glPointParameteri GLEW_GET_FUN(__glewPointParameteri) +#define glPointParameteriv GLEW_GET_FUN(__glewPointParameteriv) +#define glSecondaryColor3b GLEW_GET_FUN(__glewSecondaryColor3b) +#define glSecondaryColor3bv GLEW_GET_FUN(__glewSecondaryColor3bv) +#define glSecondaryColor3d GLEW_GET_FUN(__glewSecondaryColor3d) +#define glSecondaryColor3dv GLEW_GET_FUN(__glewSecondaryColor3dv) +#define glSecondaryColor3f GLEW_GET_FUN(__glewSecondaryColor3f) +#define glSecondaryColor3fv GLEW_GET_FUN(__glewSecondaryColor3fv) +#define glSecondaryColor3i GLEW_GET_FUN(__glewSecondaryColor3i) +#define glSecondaryColor3iv GLEW_GET_FUN(__glewSecondaryColor3iv) +#define glSecondaryColor3s GLEW_GET_FUN(__glewSecondaryColor3s) +#define glSecondaryColor3sv GLEW_GET_FUN(__glewSecondaryColor3sv) +#define glSecondaryColor3ub GLEW_GET_FUN(__glewSecondaryColor3ub) +#define glSecondaryColor3ubv GLEW_GET_FUN(__glewSecondaryColor3ubv) +#define glSecondaryColor3ui GLEW_GET_FUN(__glewSecondaryColor3ui) +#define glSecondaryColor3uiv GLEW_GET_FUN(__glewSecondaryColor3uiv) +#define glSecondaryColor3us GLEW_GET_FUN(__glewSecondaryColor3us) +#define glSecondaryColor3usv GLEW_GET_FUN(__glewSecondaryColor3usv) +#define glSecondaryColorPointer GLEW_GET_FUN(__glewSecondaryColorPointer) +#define glWindowPos2d GLEW_GET_FUN(__glewWindowPos2d) +#define glWindowPos2dv GLEW_GET_FUN(__glewWindowPos2dv) +#define glWindowPos2f GLEW_GET_FUN(__glewWindowPos2f) +#define glWindowPos2fv GLEW_GET_FUN(__glewWindowPos2fv) +#define glWindowPos2i GLEW_GET_FUN(__glewWindowPos2i) +#define glWindowPos2iv GLEW_GET_FUN(__glewWindowPos2iv) +#define glWindowPos2s GLEW_GET_FUN(__glewWindowPos2s) +#define glWindowPos2sv GLEW_GET_FUN(__glewWindowPos2sv) +#define glWindowPos3d GLEW_GET_FUN(__glewWindowPos3d) +#define glWindowPos3dv GLEW_GET_FUN(__glewWindowPos3dv) +#define glWindowPos3f GLEW_GET_FUN(__glewWindowPos3f) +#define glWindowPos3fv GLEW_GET_FUN(__glewWindowPos3fv) +#define glWindowPos3i GLEW_GET_FUN(__glewWindowPos3i) +#define glWindowPos3iv GLEW_GET_FUN(__glewWindowPos3iv) +#define glWindowPos3s GLEW_GET_FUN(__glewWindowPos3s) +#define glWindowPos3sv GLEW_GET_FUN(__glewWindowPos3sv) + +#define GLEW_VERSION_1_4 GLEW_GET_VAR(__GLEW_VERSION_1_4) + +#endif /* GL_VERSION_1_4 */ + +/* ----------------------------- GL_VERSION_1_5 ---------------------------- */ + +#ifndef GL_VERSION_1_5 +#define GL_VERSION_1_5 1 + +#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE +#define GL_FOG_COORD GL_FOG_COORDINATE +#define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY +#define GL_SRC0_RGB GL_SOURCE0_RGB +#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER +#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE +#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA +#define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE +#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE +#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA +#define GL_SRC1_RGB GL_SOURCE1_RGB +#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING +#define GL_SRC2_ALPHA GL_SOURCE2_ALPHA +#define GL_SRC2_RGB GL_SOURCE2_RGB +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 +#define GL_QUERY_COUNTER_BITS 0x8864 +#define GL_CURRENT_QUERY 0x8865 +#define GL_QUERY_RESULT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE 0x8867 +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_READ_ONLY 0x88B8 +#define GL_WRITE_ONLY 0x88B9 +#define GL_READ_WRITE 0x88BA +#define GL_BUFFER_ACCESS 0x88BB +#define GL_BUFFER_MAPPED 0x88BC +#define GL_BUFFER_MAP_POINTER 0x88BD +#define GL_STREAM_DRAW 0x88E0 +#define GL_STREAM_READ 0x88E1 +#define GL_STREAM_COPY 0x88E2 +#define GL_STATIC_DRAW 0x88E4 +#define GL_STATIC_READ 0x88E5 +#define GL_STATIC_COPY 0x88E6 +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_DYNAMIC_READ 0x88E9 +#define GL_DYNAMIC_COPY 0x88EA +#define GL_SAMPLES_PASSED 0x8914 + +typedef ptrdiff_t GLintptr; +typedef ptrdiff_t GLsizeiptr; + +typedef void (GLAPIENTRY * PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage); +typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data); +typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLENDQUERYPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGENBUFFERSPROC) (GLsizei n, GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLGENQUERIESPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, GLvoid** params); +typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid* data); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERPROC) (GLuint buffer); +typedef GLboolean (GLAPIENTRY * PFNGLISQUERYPROC) (GLuint id); +typedef GLvoid* (GLAPIENTRY * PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); +typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERPROC) (GLenum target); + +#define glBeginQuery GLEW_GET_FUN(__glewBeginQuery) +#define glBindBuffer GLEW_GET_FUN(__glewBindBuffer) +#define glBufferData GLEW_GET_FUN(__glewBufferData) +#define glBufferSubData GLEW_GET_FUN(__glewBufferSubData) +#define glDeleteBuffers GLEW_GET_FUN(__glewDeleteBuffers) +#define glDeleteQueries GLEW_GET_FUN(__glewDeleteQueries) +#define glEndQuery GLEW_GET_FUN(__glewEndQuery) +#define glGenBuffers GLEW_GET_FUN(__glewGenBuffers) +#define glGenQueries GLEW_GET_FUN(__glewGenQueries) +#define glGetBufferParameteriv GLEW_GET_FUN(__glewGetBufferParameteriv) +#define glGetBufferPointerv GLEW_GET_FUN(__glewGetBufferPointerv) +#define glGetBufferSubData GLEW_GET_FUN(__glewGetBufferSubData) +#define glGetQueryObjectiv GLEW_GET_FUN(__glewGetQueryObjectiv) +#define glGetQueryObjectuiv GLEW_GET_FUN(__glewGetQueryObjectuiv) +#define glGetQueryiv GLEW_GET_FUN(__glewGetQueryiv) +#define glIsBuffer GLEW_GET_FUN(__glewIsBuffer) +#define glIsQuery GLEW_GET_FUN(__glewIsQuery) +#define glMapBuffer GLEW_GET_FUN(__glewMapBuffer) +#define glUnmapBuffer GLEW_GET_FUN(__glewUnmapBuffer) + +#define GLEW_VERSION_1_5 GLEW_GET_VAR(__GLEW_VERSION_1_5) + +#endif /* GL_VERSION_1_5 */ + +/* ----------------------------- GL_VERSION_2_0 ---------------------------- */ + +#ifndef GL_VERSION_2_0 +#define GL_VERSION_2_0 1 + +#define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_MAX_DRAW_BUFFERS 0x8824 +#define GL_DRAW_BUFFER0 0x8825 +#define GL_DRAW_BUFFER1 0x8826 +#define GL_DRAW_BUFFER2 0x8827 +#define GL_DRAW_BUFFER3 0x8828 +#define GL_DRAW_BUFFER4 0x8829 +#define GL_DRAW_BUFFER5 0x882A +#define GL_DRAW_BUFFER6 0x882B +#define GL_DRAW_BUFFER7 0x882C +#define GL_DRAW_BUFFER8 0x882D +#define GL_DRAW_BUFFER9 0x882E +#define GL_DRAW_BUFFER10 0x882F +#define GL_DRAW_BUFFER11 0x8830 +#define GL_DRAW_BUFFER12 0x8831 +#define GL_DRAW_BUFFER13 0x8832 +#define GL_DRAW_BUFFER14 0x8833 +#define GL_DRAW_BUFFER15 0x8834 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_POINT_SPRITE 0x8861 +#define GL_COORD_REPLACE 0x8862 +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_MAX_TEXTURE_COORDS 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A +#define GL_MAX_VARYING_FLOATS 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_SHADER_TYPE 0x8B4F +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT4 0x8B5C +#define GL_SAMPLER_1D 0x8B5D +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_3D 0x8B5F +#define GL_SAMPLER_CUBE 0x8B60 +#define GL_SAMPLER_1D_SHADOW 0x8B61 +#define GL_SAMPLER_2D_SHADOW 0x8B62 +#define GL_DELETE_STATUS 0x8B80 +#define GL_COMPILE_STATUS 0x8B81 +#define GL_LINK_STATUS 0x8B82 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 +#define GL_LOWER_LEFT 0x8CA1 +#define GL_UPPER_LEFT 0x8CA2 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 + +typedef void (GLAPIENTRY * PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum, GLenum); +typedef void (GLAPIENTRY * PFNGLCOMPILESHADERPROC) (GLuint shader); +typedef GLuint (GLAPIENTRY * PFNGLCREATEPROGRAMPROC) (void); +typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROC) (GLenum type); +typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLDELETESHADERPROC) (GLuint shader); +typedef void (GLAPIENTRY * PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint); +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum* bufs); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint); +typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders); +typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog); +typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEPROC) (GLuint obj, GLsizei maxLength, GLsizei* length, GLchar* source); +typedef void (GLAPIENTRY * PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint* param); +typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint, GLenum, GLvoid**); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVPROC) (GLuint, GLenum, GLdouble*); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVPROC) (GLuint, GLenum, GLfloat*); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVPROC) (GLuint, GLenum, GLint*); +typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPROC) (GLuint program); +typedef GLboolean (GLAPIENTRY * PFNGLISSHADERPROC) (GLuint shader); +typedef void (GLAPIENTRY * PFNGLLINKPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar** strings, const GLint* lengths); +typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +typedef void (GLAPIENTRY * PFNGLSTENCILMASKSEPARATEPROC) (GLenum, GLuint); +typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (GLAPIENTRY * PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1IPROC) (GLint location, GLint v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUSEPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* pointer); + +#define glAttachShader GLEW_GET_FUN(__glewAttachShader) +#define glBindAttribLocation GLEW_GET_FUN(__glewBindAttribLocation) +#define glBlendEquationSeparate GLEW_GET_FUN(__glewBlendEquationSeparate) +#define glCompileShader GLEW_GET_FUN(__glewCompileShader) +#define glCreateProgram GLEW_GET_FUN(__glewCreateProgram) +#define glCreateShader GLEW_GET_FUN(__glewCreateShader) +#define glDeleteProgram GLEW_GET_FUN(__glewDeleteProgram) +#define glDeleteShader GLEW_GET_FUN(__glewDeleteShader) +#define glDetachShader GLEW_GET_FUN(__glewDetachShader) +#define glDisableVertexAttribArray GLEW_GET_FUN(__glewDisableVertexAttribArray) +#define glDrawBuffers GLEW_GET_FUN(__glewDrawBuffers) +#define glEnableVertexAttribArray GLEW_GET_FUN(__glewEnableVertexAttribArray) +#define glGetActiveAttrib GLEW_GET_FUN(__glewGetActiveAttrib) +#define glGetActiveUniform GLEW_GET_FUN(__glewGetActiveUniform) +#define glGetAttachedShaders GLEW_GET_FUN(__glewGetAttachedShaders) +#define glGetAttribLocation GLEW_GET_FUN(__glewGetAttribLocation) +#define glGetProgramInfoLog GLEW_GET_FUN(__glewGetProgramInfoLog) +#define glGetProgramiv GLEW_GET_FUN(__glewGetProgramiv) +#define glGetShaderInfoLog GLEW_GET_FUN(__glewGetShaderInfoLog) +#define glGetShaderSource GLEW_GET_FUN(__glewGetShaderSource) +#define glGetShaderiv GLEW_GET_FUN(__glewGetShaderiv) +#define glGetUniformLocation GLEW_GET_FUN(__glewGetUniformLocation) +#define glGetUniformfv GLEW_GET_FUN(__glewGetUniformfv) +#define glGetUniformiv GLEW_GET_FUN(__glewGetUniformiv) +#define glGetVertexAttribPointerv GLEW_GET_FUN(__glewGetVertexAttribPointerv) +#define glGetVertexAttribdv GLEW_GET_FUN(__glewGetVertexAttribdv) +#define glGetVertexAttribfv GLEW_GET_FUN(__glewGetVertexAttribfv) +#define glGetVertexAttribiv GLEW_GET_FUN(__glewGetVertexAttribiv) +#define glIsProgram GLEW_GET_FUN(__glewIsProgram) +#define glIsShader GLEW_GET_FUN(__glewIsShader) +#define glLinkProgram GLEW_GET_FUN(__glewLinkProgram) +#define glShaderSource GLEW_GET_FUN(__glewShaderSource) +#define glStencilFuncSeparate GLEW_GET_FUN(__glewStencilFuncSeparate) +#define glStencilMaskSeparate GLEW_GET_FUN(__glewStencilMaskSeparate) +#define glStencilOpSeparate GLEW_GET_FUN(__glewStencilOpSeparate) +#define glUniform1f GLEW_GET_FUN(__glewUniform1f) +#define glUniform1fv GLEW_GET_FUN(__glewUniform1fv) +#define glUniform1i GLEW_GET_FUN(__glewUniform1i) +#define glUniform1iv GLEW_GET_FUN(__glewUniform1iv) +#define glUniform2f GLEW_GET_FUN(__glewUniform2f) +#define glUniform2fv GLEW_GET_FUN(__glewUniform2fv) +#define glUniform2i GLEW_GET_FUN(__glewUniform2i) +#define glUniform2iv GLEW_GET_FUN(__glewUniform2iv) +#define glUniform3f GLEW_GET_FUN(__glewUniform3f) +#define glUniform3fv GLEW_GET_FUN(__glewUniform3fv) +#define glUniform3i GLEW_GET_FUN(__glewUniform3i) +#define glUniform3iv GLEW_GET_FUN(__glewUniform3iv) +#define glUniform4f GLEW_GET_FUN(__glewUniform4f) +#define glUniform4fv GLEW_GET_FUN(__glewUniform4fv) +#define glUniform4i GLEW_GET_FUN(__glewUniform4i) +#define glUniform4iv GLEW_GET_FUN(__glewUniform4iv) +#define glUniformMatrix2fv GLEW_GET_FUN(__glewUniformMatrix2fv) +#define glUniformMatrix3fv GLEW_GET_FUN(__glewUniformMatrix3fv) +#define glUniformMatrix4fv GLEW_GET_FUN(__glewUniformMatrix4fv) +#define glUseProgram GLEW_GET_FUN(__glewUseProgram) +#define glValidateProgram GLEW_GET_FUN(__glewValidateProgram) +#define glVertexAttrib1d GLEW_GET_FUN(__glewVertexAttrib1d) +#define glVertexAttrib1dv GLEW_GET_FUN(__glewVertexAttrib1dv) +#define glVertexAttrib1f GLEW_GET_FUN(__glewVertexAttrib1f) +#define glVertexAttrib1fv GLEW_GET_FUN(__glewVertexAttrib1fv) +#define glVertexAttrib1s GLEW_GET_FUN(__glewVertexAttrib1s) +#define glVertexAttrib1sv GLEW_GET_FUN(__glewVertexAttrib1sv) +#define glVertexAttrib2d GLEW_GET_FUN(__glewVertexAttrib2d) +#define glVertexAttrib2dv GLEW_GET_FUN(__glewVertexAttrib2dv) +#define glVertexAttrib2f GLEW_GET_FUN(__glewVertexAttrib2f) +#define glVertexAttrib2fv GLEW_GET_FUN(__glewVertexAttrib2fv) +#define glVertexAttrib2s GLEW_GET_FUN(__glewVertexAttrib2s) +#define glVertexAttrib2sv GLEW_GET_FUN(__glewVertexAttrib2sv) +#define glVertexAttrib3d GLEW_GET_FUN(__glewVertexAttrib3d) +#define glVertexAttrib3dv GLEW_GET_FUN(__glewVertexAttrib3dv) +#define glVertexAttrib3f GLEW_GET_FUN(__glewVertexAttrib3f) +#define glVertexAttrib3fv GLEW_GET_FUN(__glewVertexAttrib3fv) +#define glVertexAttrib3s GLEW_GET_FUN(__glewVertexAttrib3s) +#define glVertexAttrib3sv GLEW_GET_FUN(__glewVertexAttrib3sv) +#define glVertexAttrib4Nbv GLEW_GET_FUN(__glewVertexAttrib4Nbv) +#define glVertexAttrib4Niv GLEW_GET_FUN(__glewVertexAttrib4Niv) +#define glVertexAttrib4Nsv GLEW_GET_FUN(__glewVertexAttrib4Nsv) +#define glVertexAttrib4Nub GLEW_GET_FUN(__glewVertexAttrib4Nub) +#define glVertexAttrib4Nubv GLEW_GET_FUN(__glewVertexAttrib4Nubv) +#define glVertexAttrib4Nuiv GLEW_GET_FUN(__glewVertexAttrib4Nuiv) +#define glVertexAttrib4Nusv GLEW_GET_FUN(__glewVertexAttrib4Nusv) +#define glVertexAttrib4bv GLEW_GET_FUN(__glewVertexAttrib4bv) +#define glVertexAttrib4d GLEW_GET_FUN(__glewVertexAttrib4d) +#define glVertexAttrib4dv GLEW_GET_FUN(__glewVertexAttrib4dv) +#define glVertexAttrib4f GLEW_GET_FUN(__glewVertexAttrib4f) +#define glVertexAttrib4fv GLEW_GET_FUN(__glewVertexAttrib4fv) +#define glVertexAttrib4iv GLEW_GET_FUN(__glewVertexAttrib4iv) +#define glVertexAttrib4s GLEW_GET_FUN(__glewVertexAttrib4s) +#define glVertexAttrib4sv GLEW_GET_FUN(__glewVertexAttrib4sv) +#define glVertexAttrib4ubv GLEW_GET_FUN(__glewVertexAttrib4ubv) +#define glVertexAttrib4uiv GLEW_GET_FUN(__glewVertexAttrib4uiv) +#define glVertexAttrib4usv GLEW_GET_FUN(__glewVertexAttrib4usv) +#define glVertexAttribPointer GLEW_GET_FUN(__glewVertexAttribPointer) + +#define GLEW_VERSION_2_0 GLEW_GET_VAR(__GLEW_VERSION_2_0) + +#endif /* GL_VERSION_2_0 */ + +/* ----------------------------- GL_VERSION_2_1 ---------------------------- */ + +#ifndef GL_VERSION_2_1 +#define GL_VERSION_2_1 1 + +#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F +#define GL_PIXEL_PACK_BUFFER 0x88EB +#define GL_PIXEL_UNPACK_BUFFER 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF +#define GL_FLOAT_MAT2x3 0x8B65 +#define GL_FLOAT_MAT2x4 0x8B66 +#define GL_FLOAT_MAT3x2 0x8B67 +#define GL_FLOAT_MAT3x4 0x8B68 +#define GL_FLOAT_MAT4x2 0x8B69 +#define GL_FLOAT_MAT4x3 0x8B6A +#define GL_SRGB 0x8C40 +#define GL_SRGB8 0x8C41 +#define GL_SRGB_ALPHA 0x8C42 +#define GL_SRGB8_ALPHA8 0x8C43 +#define GL_SLUMINANCE_ALPHA 0x8C44 +#define GL_SLUMINANCE8_ALPHA8 0x8C45 +#define GL_SLUMINANCE 0x8C46 +#define GL_SLUMINANCE8 0x8C47 +#define GL_COMPRESSED_SRGB 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 +#define GL_COMPRESSED_SLUMINANCE 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B + +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + +#define glUniformMatrix2x3fv GLEW_GET_FUN(__glewUniformMatrix2x3fv) +#define glUniformMatrix2x4fv GLEW_GET_FUN(__glewUniformMatrix2x4fv) +#define glUniformMatrix3x2fv GLEW_GET_FUN(__glewUniformMatrix3x2fv) +#define glUniformMatrix3x4fv GLEW_GET_FUN(__glewUniformMatrix3x4fv) +#define glUniformMatrix4x2fv GLEW_GET_FUN(__glewUniformMatrix4x2fv) +#define glUniformMatrix4x3fv GLEW_GET_FUN(__glewUniformMatrix4x3fv) + +#define GLEW_VERSION_2_1 GLEW_GET_VAR(__GLEW_VERSION_2_1) + +#endif /* GL_VERSION_2_1 */ + +/* ----------------------------- GL_VERSION_3_0 ---------------------------- */ + +#ifndef GL_VERSION_3_0 +#define GL_VERSION_3_0 1 + +#define GL_MAX_CLIP_DISTANCES GL_MAX_CLIP_PLANES +#define GL_CLIP_DISTANCE5 GL_CLIP_PLANE5 +#define GL_CLIP_DISTANCE1 GL_CLIP_PLANE1 +#define GL_CLIP_DISTANCE3 GL_CLIP_PLANE3 +#define GL_COMPARE_REF_TO_TEXTURE GL_COMPARE_R_TO_TEXTURE_ARB +#define GL_CLIP_DISTANCE0 GL_CLIP_PLANE0 +#define GL_CLIP_DISTANCE4 GL_CLIP_PLANE4 +#define GL_CLIP_DISTANCE2 GL_CLIP_PLANE2 +#define GL_MAX_VARYING_COMPONENTS GL_MAX_VARYING_FLOATS +#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001 +#define GL_MAJOR_VERSION 0x821B +#define GL_MINOR_VERSION 0x821C +#define GL_NUM_EXTENSIONS 0x821D +#define GL_CONTEXT_FLAGS 0x821E +#define GL_DEPTH_BUFFER 0x8223 +#define GL_STENCIL_BUFFER 0x8224 +#define GL_COMPRESSED_RED 0x8225 +#define GL_COMPRESSED_RG 0x8226 +#define GL_RGBA32F 0x8814 +#define GL_RGB32F 0x8815 +#define GL_RGBA16F 0x881A +#define GL_RGB16F 0x881B +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD +#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF +#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 +#define GL_CLAMP_VERTEX_COLOR 0x891A +#define GL_CLAMP_FRAGMENT_COLOR 0x891B +#define GL_CLAMP_READ_COLOR 0x891C +#define GL_FIXED_ONLY 0x891D +#define GL_TEXTURE_RED_TYPE 0x8C10 +#define GL_TEXTURE_GREEN_TYPE 0x8C11 +#define GL_TEXTURE_BLUE_TYPE 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE 0x8C13 +#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE 0x8C15 +#define GL_TEXTURE_DEPTH_TYPE 0x8C16 +#define GL_UNSIGNED_NORMALIZED 0x8C17 +#define GL_TEXTURE_1D_ARRAY 0x8C18 +#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 +#define GL_TEXTURE_2D_ARRAY 0x8C1A +#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B +#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C +#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D +#define GL_R11F_G11F_B10F 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B +#define GL_RGB9_E5 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E +#define GL_TEXTURE_SHARED_SIZE 0x8C3F +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 +#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 +#define GL_PRIMITIVES_GENERATED 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 +#define GL_RASTERIZER_DISCARD 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B +#define GL_INTERLEAVED_ATTRIBS 0x8C8C +#define GL_SEPARATE_ATTRIBS 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F +#define GL_RGBA32UI 0x8D70 +#define GL_RGB32UI 0x8D71 +#define GL_RGBA16UI 0x8D76 +#define GL_RGB16UI 0x8D77 +#define GL_RGBA8UI 0x8D7C +#define GL_RGB8UI 0x8D7D +#define GL_RGBA32I 0x8D82 +#define GL_RGB32I 0x8D83 +#define GL_RGBA16I 0x8D88 +#define GL_RGB16I 0x8D89 +#define GL_RGBA8I 0x8D8E +#define GL_RGB8I 0x8D8F +#define GL_RED_INTEGER 0x8D94 +#define GL_GREEN_INTEGER 0x8D95 +#define GL_BLUE_INTEGER 0x8D96 +#define GL_ALPHA_INTEGER 0x8D97 +#define GL_RGB_INTEGER 0x8D98 +#define GL_RGBA_INTEGER 0x8D99 +#define GL_BGR_INTEGER 0x8D9A +#define GL_BGRA_INTEGER 0x8D9B +#define GL_SAMPLER_1D_ARRAY 0x8DC0 +#define GL_SAMPLER_2D_ARRAY 0x8DC1 +#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 +#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 +#define GL_UNSIGNED_INT_VEC2 0x8DC6 +#define GL_UNSIGNED_INT_VEC3 0x8DC7 +#define GL_UNSIGNED_INT_VEC4 0x8DC8 +#define GL_INT_SAMPLER_1D 0x8DC9 +#define GL_INT_SAMPLER_2D 0x8DCA +#define GL_INT_SAMPLER_3D 0x8DCB +#define GL_INT_SAMPLER_CUBE 0x8DCC +#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE +#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF +#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 +#define GL_QUERY_WAIT 0x8E13 +#define GL_QUERY_NO_WAIT 0x8E14 +#define GL_QUERY_BY_REGION_WAIT 0x8E15 +#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 + +typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERPROC) (GLuint, GLenum); +typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum); +typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONPROC) (GLuint, GLuint, const GLchar*); +typedef void (GLAPIENTRY * PFNGLCLAMPCOLORPROC) (GLenum, GLenum); +typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFIPROC) (GLenum, GLint, GLfloat, GLint); +typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFVPROC) (GLenum, GLint, const GLfloat*); +typedef void (GLAPIENTRY * PFNGLCLEARBUFFERIVPROC) (GLenum, GLint, const GLint*); +typedef void (GLAPIENTRY * PFNGLCLEARBUFFERUIVPROC) (GLenum, GLint, const GLuint*); +typedef void (GLAPIENTRY * PFNGLCOLORMASKIPROC) (GLuint, GLboolean, GLboolean, GLboolean, GLboolean); +typedef void (GLAPIENTRY * PFNGLDISABLEIPROC) (GLenum, GLuint); +typedef void (GLAPIENTRY * PFNGLENABLEIPROC) (GLenum, GLuint); +typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERPROC) (void); +typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKPROC) (void); +typedef void (GLAPIENTRY * PFNGLGETBOOLEANI_VPROC) (GLenum, GLuint, GLboolean*); +typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONPROC) (GLuint, const GLchar*); +typedef const GLubyte* (GLAPIENTRY * PFNGLGETSTRINGIPROC) (GLenum, GLuint); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVPROC) (GLenum, GLenum, GLint*); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVPROC) (GLenum, GLenum, GLuint*); +typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint, GLuint, GLsizei, GLsizei *, GLsizei *, GLenum *, GLchar *); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVPROC) (GLuint, GLint, GLuint*); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVPROC) (GLuint, GLenum, GLint*); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint, GLenum, GLuint*); +typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDIPROC) (GLenum, GLuint); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVPROC) (GLenum, GLenum, const GLint*); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVPROC) (GLenum, GLenum, const GLuint*); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint, GLsizei, const GLchar **, GLenum); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UIPROC) (GLint, GLuint); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVPROC) (GLint, GLsizei, const GLuint*); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UIPROC) (GLint, GLuint, GLuint); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UIVPROC) (GLint, GLsizei, const GLuint*); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UIPROC) (GLint, GLuint, GLuint, GLuint); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UIVPROC) (GLint, GLsizei, const GLuint*); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UIPROC) (GLint, GLuint, GLuint, GLuint, GLuint); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UIVPROC) (GLint, GLsizei, const GLuint*); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IPROC) (GLuint, GLint); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVPROC) (GLuint, const GLint*); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIPROC) (GLuint, GLuint); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVPROC) (GLuint, const GLuint*); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IPROC) (GLuint, GLint, GLint); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVPROC) (GLuint, const GLint*); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIPROC) (GLuint, GLuint, GLuint); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVPROC) (GLuint, const GLuint*); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IPROC) (GLuint, GLint, GLint, GLint); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVPROC) (GLuint, const GLint*); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIPROC) (GLuint, GLuint, GLuint, GLuint); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVPROC) (GLuint, const GLuint*); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVPROC) (GLuint, const GLbyte*); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IPROC) (GLuint, GLint, GLint, GLint, GLint); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVPROC) (GLuint, const GLint*); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVPROC) (GLuint, const GLshort*); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVPROC) (GLuint, const GLubyte*); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIPROC) (GLuint, GLuint, GLuint, GLuint, GLuint); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVPROC) (GLuint, const GLuint*); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVPROC) (GLuint, const GLushort*); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint, GLint, GLenum, GLsizei, const GLvoid*); + +#define glBeginConditionalRender GLEW_GET_FUN(__glewBeginConditionalRender) +#define glBeginTransformFeedback GLEW_GET_FUN(__glewBeginTransformFeedback) +#define glBindFragDataLocation GLEW_GET_FUN(__glewBindFragDataLocation) +#define glClampColor GLEW_GET_FUN(__glewClampColor) +#define glClearBufferfi GLEW_GET_FUN(__glewClearBufferfi) +#define glClearBufferfv GLEW_GET_FUN(__glewClearBufferfv) +#define glClearBufferiv GLEW_GET_FUN(__glewClearBufferiv) +#define glClearBufferuiv GLEW_GET_FUN(__glewClearBufferuiv) +#define glColorMaski GLEW_GET_FUN(__glewColorMaski) +#define glDisablei GLEW_GET_FUN(__glewDisablei) +#define glEnablei GLEW_GET_FUN(__glewEnablei) +#define glEndConditionalRender GLEW_GET_FUN(__glewEndConditionalRender) +#define glEndTransformFeedback GLEW_GET_FUN(__glewEndTransformFeedback) +#define glGetBooleani_v GLEW_GET_FUN(__glewGetBooleani_v) +#define glGetFragDataLocation GLEW_GET_FUN(__glewGetFragDataLocation) +#define glGetStringi GLEW_GET_FUN(__glewGetStringi) +#define glGetTexParameterIiv GLEW_GET_FUN(__glewGetTexParameterIiv) +#define glGetTexParameterIuiv GLEW_GET_FUN(__glewGetTexParameterIuiv) +#define glGetTransformFeedbackVarying GLEW_GET_FUN(__glewGetTransformFeedbackVarying) +#define glGetUniformuiv GLEW_GET_FUN(__glewGetUniformuiv) +#define glGetVertexAttribIiv GLEW_GET_FUN(__glewGetVertexAttribIiv) +#define glGetVertexAttribIuiv GLEW_GET_FUN(__glewGetVertexAttribIuiv) +#define glIsEnabledi GLEW_GET_FUN(__glewIsEnabledi) +#define glTexParameterIiv GLEW_GET_FUN(__glewTexParameterIiv) +#define glTexParameterIuiv GLEW_GET_FUN(__glewTexParameterIuiv) +#define glTransformFeedbackVaryings GLEW_GET_FUN(__glewTransformFeedbackVaryings) +#define glUniform1ui GLEW_GET_FUN(__glewUniform1ui) +#define glUniform1uiv GLEW_GET_FUN(__glewUniform1uiv) +#define glUniform2ui GLEW_GET_FUN(__glewUniform2ui) +#define glUniform2uiv GLEW_GET_FUN(__glewUniform2uiv) +#define glUniform3ui GLEW_GET_FUN(__glewUniform3ui) +#define glUniform3uiv GLEW_GET_FUN(__glewUniform3uiv) +#define glUniform4ui GLEW_GET_FUN(__glewUniform4ui) +#define glUniform4uiv GLEW_GET_FUN(__glewUniform4uiv) +#define glVertexAttribI1i GLEW_GET_FUN(__glewVertexAttribI1i) +#define glVertexAttribI1iv GLEW_GET_FUN(__glewVertexAttribI1iv) +#define glVertexAttribI1ui GLEW_GET_FUN(__glewVertexAttribI1ui) +#define glVertexAttribI1uiv GLEW_GET_FUN(__glewVertexAttribI1uiv) +#define glVertexAttribI2i GLEW_GET_FUN(__glewVertexAttribI2i) +#define glVertexAttribI2iv GLEW_GET_FUN(__glewVertexAttribI2iv) +#define glVertexAttribI2ui GLEW_GET_FUN(__glewVertexAttribI2ui) +#define glVertexAttribI2uiv GLEW_GET_FUN(__glewVertexAttribI2uiv) +#define glVertexAttribI3i GLEW_GET_FUN(__glewVertexAttribI3i) +#define glVertexAttribI3iv GLEW_GET_FUN(__glewVertexAttribI3iv) +#define glVertexAttribI3ui GLEW_GET_FUN(__glewVertexAttribI3ui) +#define glVertexAttribI3uiv GLEW_GET_FUN(__glewVertexAttribI3uiv) +#define glVertexAttribI4bv GLEW_GET_FUN(__glewVertexAttribI4bv) +#define glVertexAttribI4i GLEW_GET_FUN(__glewVertexAttribI4i) +#define glVertexAttribI4iv GLEW_GET_FUN(__glewVertexAttribI4iv) +#define glVertexAttribI4sv GLEW_GET_FUN(__glewVertexAttribI4sv) +#define glVertexAttribI4ubv GLEW_GET_FUN(__glewVertexAttribI4ubv) +#define glVertexAttribI4ui GLEW_GET_FUN(__glewVertexAttribI4ui) +#define glVertexAttribI4uiv GLEW_GET_FUN(__glewVertexAttribI4uiv) +#define glVertexAttribI4usv GLEW_GET_FUN(__glewVertexAttribI4usv) +#define glVertexAttribIPointer GLEW_GET_FUN(__glewVertexAttribIPointer) + +#define GLEW_VERSION_3_0 GLEW_GET_VAR(__GLEW_VERSION_3_0) + +#endif /* GL_VERSION_3_0 */ + +/* ----------------------------- GL_VERSION_3_1 ---------------------------- */ + +#ifndef GL_VERSION_3_1 +#define GL_VERSION_3_1 1 + +#define GL_TEXTURE_RECTANGLE 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 +#define GL_SAMPLER_2D_RECT 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 +#define GL_TEXTURE_BUFFER 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT 0x8C2E +#define GL_SAMPLER_BUFFER 0x8DC2 +#define GL_INT_SAMPLER_2D_RECT 0x8DCD +#define GL_INT_SAMPLER_BUFFER 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 +#define GL_RED_SNORM 0x8F90 +#define GL_RG_SNORM 0x8F91 +#define GL_RGB_SNORM 0x8F92 +#define GL_RGBA_SNORM 0x8F93 +#define GL_R8_SNORM 0x8F94 +#define GL_RG8_SNORM 0x8F95 +#define GL_RGB8_SNORM 0x8F96 +#define GL_RGBA8_SNORM 0x8F97 +#define GL_R16_SNORM 0x8F98 +#define GL_RG16_SNORM 0x8F99 +#define GL_RGB16_SNORM 0x8F9A +#define GL_RGBA16_SNORM 0x8F9B +#define GL_SIGNED_NORMALIZED 0x8F9C +#define GL_PRIMITIVE_RESTART 0x8F9D +#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E +#define GL_BUFFER_ACCESS_FLAGS 0x911F +#define GL_BUFFER_MAP_LENGTH 0x9120 +#define GL_BUFFER_MAP_OFFSET 0x9121 + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum, GLint, GLsizei, GLsizei); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum, GLsizei, GLenum, const GLvoid*, GLsizei); +typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint); +typedef void (GLAPIENTRY * PFNGLTEXBUFFERPROC) (GLenum, GLenum, GLuint); + +#define glDrawArraysInstanced GLEW_GET_FUN(__glewDrawArraysInstanced) +#define glDrawElementsInstanced GLEW_GET_FUN(__glewDrawElementsInstanced) +#define glPrimitiveRestartIndex GLEW_GET_FUN(__glewPrimitiveRestartIndex) +#define glTexBuffer GLEW_GET_FUN(__glewTexBuffer) + +#define GLEW_VERSION_3_1 GLEW_GET_VAR(__GLEW_VERSION_3_1) + +#endif /* GL_VERSION_3_1 */ + +/* ----------------------------- GL_VERSION_3_2 ---------------------------- */ + +#ifndef GL_VERSION_3_2 +#define GL_VERSION_3_2 1 + +#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 +#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define GL_LINES_ADJACENCY 0x000A +#define GL_LINE_STRIP_ADJACENCY 0x000B +#define GL_TRIANGLES_ADJACENCY 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D +#define GL_PROGRAM_POINT_SIZE 0x8642 +#define GL_GEOMETRY_VERTICES_OUT 0x8916 +#define GL_GEOMETRY_INPUT_TYPE 0x8917 +#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 +#define GL_GEOMETRY_SHADER 0x8DD9 +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 +#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 +#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 +#define GL_CONTEXT_PROFILE_MASK 0x9126 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum, GLenum, GLuint, GLint); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum, GLenum, GLint64 *); +typedef void (GLAPIENTRY * PFNGLGETINTEGER64I_VPROC) (GLenum, GLuint, GLint64 *); + +#define glFramebufferTexture GLEW_GET_FUN(__glewFramebufferTexture) +#define glGetBufferParameteri64v GLEW_GET_FUN(__glewGetBufferParameteri64v) +#define glGetInteger64i_v GLEW_GET_FUN(__glewGetInteger64i_v) + +#define GLEW_VERSION_3_2 GLEW_GET_VAR(__GLEW_VERSION_3_2) + +#endif /* GL_VERSION_3_2 */ + +/* ----------------------------- GL_VERSION_3_3 ---------------------------- */ + +#ifndef GL_VERSION_3_3 +#define GL_VERSION_3_3 1 + +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE +#define GL_ANY_SAMPLES_PASSED 0x8C2F +#define GL_TEXTURE_SWIZZLE_R 0x8E42 +#define GL_TEXTURE_SWIZZLE_G 0x8E43 +#define GL_TEXTURE_SWIZZLE_B 0x8E44 +#define GL_TEXTURE_SWIZZLE_A 0x8E45 +#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 +#define GL_RGB10_A2UI 0x906F + +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); + +#define glVertexAttribDivisor GLEW_GET_FUN(__glewVertexAttribDivisor) + +#define GLEW_VERSION_3_3 GLEW_GET_VAR(__GLEW_VERSION_3_3) + +#endif /* GL_VERSION_3_3 */ + +/* ----------------------------- GL_VERSION_4_0 ---------------------------- */ + +#ifndef GL_VERSION_4_0 +#define GL_VERSION_4_0 1 + +#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F +#define GL_SAMPLE_SHADING 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C +#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F +#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS 0x8F9F +#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B +#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F + +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGPROC) (GLclampf value); + +#define glBlendEquationSeparatei GLEW_GET_FUN(__glewBlendEquationSeparatei) +#define glBlendEquationi GLEW_GET_FUN(__glewBlendEquationi) +#define glBlendFuncSeparatei GLEW_GET_FUN(__glewBlendFuncSeparatei) +#define glBlendFunci GLEW_GET_FUN(__glewBlendFunci) +#define glMinSampleShading GLEW_GET_FUN(__glewMinSampleShading) + +#define GLEW_VERSION_4_0 GLEW_GET_VAR(__GLEW_VERSION_4_0) + +#endif /* GL_VERSION_4_0 */ + +/* ----------------------------- GL_VERSION_4_1 ---------------------------- */ + +#ifndef GL_VERSION_4_1 +#define GL_VERSION_4_1 1 + +#define GLEW_VERSION_4_1 GLEW_GET_VAR(__GLEW_VERSION_4_1) + +#endif /* GL_VERSION_4_1 */ + +/* -------------------------- GL_3DFX_multisample -------------------------- */ + +#ifndef GL_3DFX_multisample +#define GL_3DFX_multisample 1 + +#define GL_MULTISAMPLE_3DFX 0x86B2 +#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 +#define GL_SAMPLES_3DFX 0x86B4 +#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 + +#define GLEW_3DFX_multisample GLEW_GET_VAR(__GLEW_3DFX_multisample) + +#endif /* GL_3DFX_multisample */ + +/* ---------------------------- GL_3DFX_tbuffer ---------------------------- */ + +#ifndef GL_3DFX_tbuffer +#define GL_3DFX_tbuffer 1 + +typedef void (GLAPIENTRY * PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); + +#define glTbufferMask3DFX GLEW_GET_FUN(__glewTbufferMask3DFX) + +#define GLEW_3DFX_tbuffer GLEW_GET_VAR(__GLEW_3DFX_tbuffer) + +#endif /* GL_3DFX_tbuffer */ + +/* -------------------- GL_3DFX_texture_compression_FXT1 ------------------- */ + +#ifndef GL_3DFX_texture_compression_FXT1 +#define GL_3DFX_texture_compression_FXT1 1 + +#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 +#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 + +#define GLEW_3DFX_texture_compression_FXT1 GLEW_GET_VAR(__GLEW_3DFX_texture_compression_FXT1) + +#endif /* GL_3DFX_texture_compression_FXT1 */ + +/* ----------------------- GL_AMD_conservative_depth ----------------------- */ + +#ifndef GL_AMD_conservative_depth +#define GL_AMD_conservative_depth 1 + +#define GLEW_AMD_conservative_depth GLEW_GET_VAR(__GLEW_AMD_conservative_depth) + +#endif /* GL_AMD_conservative_depth */ + +/* -------------------------- GL_AMD_debug_output -------------------------- */ + +#ifndef GL_AMD_debug_output +#define GL_AMD_debug_output 1 + +#define GL_MAX_DEBUG_MESSAGE_LENGTH_AMD 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_AMD 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_AMD 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_AMD 0x9147 +#define GL_DEBUG_SEVERITY_LOW_AMD 0x9148 +#define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149 +#define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A +#define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B +#define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C +#define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D +#define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E +#define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F +#define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150 + +typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id, GLenum category, GLenum severity, GLsizei length, const GLchar* message, GLvoid* userParam); + +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, void* userParam); +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const char* buf); +typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufsize, GLenum* categories, GLuint* severities, GLuint* ids, GLsizei* lengths, char* message); + +#define glDebugMessageCallbackAMD GLEW_GET_FUN(__glewDebugMessageCallbackAMD) +#define glDebugMessageEnableAMD GLEW_GET_FUN(__glewDebugMessageEnableAMD) +#define glDebugMessageInsertAMD GLEW_GET_FUN(__glewDebugMessageInsertAMD) +#define glGetDebugMessageLogAMD GLEW_GET_FUN(__glewGetDebugMessageLogAMD) + +#define GLEW_AMD_debug_output GLEW_GET_VAR(__GLEW_AMD_debug_output) + +#endif /* GL_AMD_debug_output */ + +/* ---------------------- GL_AMD_depth_clamp_separate ---------------------- */ + +#ifndef GL_AMD_depth_clamp_separate +#define GL_AMD_depth_clamp_separate 1 + +#define GL_DEPTH_CLAMP_NEAR_AMD 0x901E +#define GL_DEPTH_CLAMP_FAR_AMD 0x901F + +#define GLEW_AMD_depth_clamp_separate GLEW_GET_VAR(__GLEW_AMD_depth_clamp_separate) + +#endif /* GL_AMD_depth_clamp_separate */ + +/* ----------------------- GL_AMD_draw_buffers_blend ----------------------- */ + +#ifndef GL_AMD_draw_buffers_blend +#define GL_AMD_draw_buffers_blend 1 + +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONINDEXEDAMDPROC) (GLuint buf, GLenum mode); +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCINDEXEDAMDPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); + +#define glBlendEquationIndexedAMD GLEW_GET_FUN(__glewBlendEquationIndexedAMD) +#define glBlendEquationSeparateIndexedAMD GLEW_GET_FUN(__glewBlendEquationSeparateIndexedAMD) +#define glBlendFuncIndexedAMD GLEW_GET_FUN(__glewBlendFuncIndexedAMD) +#define glBlendFuncSeparateIndexedAMD GLEW_GET_FUN(__glewBlendFuncSeparateIndexedAMD) + +#define GLEW_AMD_draw_buffers_blend GLEW_GET_VAR(__GLEW_AMD_draw_buffers_blend) + +#endif /* GL_AMD_draw_buffers_blend */ + +/* ------------------------- GL_AMD_name_gen_delete ------------------------ */ + +#ifndef GL_AMD_name_gen_delete +#define GL_AMD_name_gen_delete 1 + +#define GL_DATA_BUFFER_AMD 0x9151 +#define GL_PERFORMANCE_MONITOR_AMD 0x9152 +#define GL_QUERY_OBJECT_AMD 0x9153 +#define GL_VERTEX_ARRAY_OBJECT_AMD 0x9154 +#define GL_SAMPLER_OBJECT_AMD 0x9155 + +typedef void (GLAPIENTRY * PFNGLDELETENAMESAMDPROC) (GLenum identifier, GLuint num, const GLuint* names); +typedef void (GLAPIENTRY * PFNGLGENNAMESAMDPROC) (GLenum identifier, GLuint num, GLuint* names); +typedef GLboolean (GLAPIENTRY * PFNGLISNAMEAMDPROC) (GLenum identifier, GLuint name); + +#define glDeleteNamesAMD GLEW_GET_FUN(__glewDeleteNamesAMD) +#define glGenNamesAMD GLEW_GET_FUN(__glewGenNamesAMD) +#define glIsNameAMD GLEW_GET_FUN(__glewIsNameAMD) + +#define GLEW_AMD_name_gen_delete GLEW_GET_VAR(__GLEW_AMD_name_gen_delete) + +#endif /* GL_AMD_name_gen_delete */ + +/* ----------------------- GL_AMD_performance_monitor ---------------------- */ + +#ifndef GL_AMD_performance_monitor +#define GL_AMD_performance_monitor 1 + +#define GL_UNSIGNED_INT 0x1405 +#define GL_FLOAT 0x1406 +#define GL_COUNTER_TYPE_AMD 0x8BC0 +#define GL_COUNTER_RANGE_AMD 0x8BC1 +#define GL_UNSIGNED_INT64_AMD 0x8BC2 +#define GL_PERCENTAGE_AMD 0x8BC3 +#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 +#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 +#define GL_PERFMON_RESULT_AMD 0x8BC6 + +typedef void (GLAPIENTRY * PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); +typedef void (GLAPIENTRY * PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors); +typedef void (GLAPIENTRY * PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); +typedef void (GLAPIENTRY * PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors); +typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint *bytesWritten); +typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void* data); +typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, char *counterString); +typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint* numCounters, GLint *maxActiveCounters, GLsizei countersSize, GLuint *counters); +typedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei* length, char *groupString); +typedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint* numGroups, GLsizei groupsSize, GLuint *groups); +typedef void (GLAPIENTRY * PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* counterList); + +#define glBeginPerfMonitorAMD GLEW_GET_FUN(__glewBeginPerfMonitorAMD) +#define glDeletePerfMonitorsAMD GLEW_GET_FUN(__glewDeletePerfMonitorsAMD) +#define glEndPerfMonitorAMD GLEW_GET_FUN(__glewEndPerfMonitorAMD) +#define glGenPerfMonitorsAMD GLEW_GET_FUN(__glewGenPerfMonitorsAMD) +#define glGetPerfMonitorCounterDataAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterDataAMD) +#define glGetPerfMonitorCounterInfoAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterInfoAMD) +#define glGetPerfMonitorCounterStringAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterStringAMD) +#define glGetPerfMonitorCountersAMD GLEW_GET_FUN(__glewGetPerfMonitorCountersAMD) +#define glGetPerfMonitorGroupStringAMD GLEW_GET_FUN(__glewGetPerfMonitorGroupStringAMD) +#define glGetPerfMonitorGroupsAMD GLEW_GET_FUN(__glewGetPerfMonitorGroupsAMD) +#define glSelectPerfMonitorCountersAMD GLEW_GET_FUN(__glewSelectPerfMonitorCountersAMD) + +#define GLEW_AMD_performance_monitor GLEW_GET_VAR(__GLEW_AMD_performance_monitor) + +#endif /* GL_AMD_performance_monitor */ + +/* ------------------ GL_AMD_seamless_cubemap_per_texture ------------------ */ + +#ifndef GL_AMD_seamless_cubemap_per_texture +#define GL_AMD_seamless_cubemap_per_texture 1 + +#define GL_TEXTURE_CUBE_MAP_SEAMLESS_ARB 0x884F + +#define GLEW_AMD_seamless_cubemap_per_texture GLEW_GET_VAR(__GLEW_AMD_seamless_cubemap_per_texture) + +#endif /* GL_AMD_seamless_cubemap_per_texture */ + +/* ---------------------- GL_AMD_shader_stencil_export --------------------- */ + +#ifndef GL_AMD_shader_stencil_export +#define GL_AMD_shader_stencil_export 1 + +#define GLEW_AMD_shader_stencil_export GLEW_GET_VAR(__GLEW_AMD_shader_stencil_export) + +#endif /* GL_AMD_shader_stencil_export */ + +/* ------------------------ GL_AMD_texture_texture4 ------------------------ */ + +#ifndef GL_AMD_texture_texture4 +#define GL_AMD_texture_texture4 1 + +#define GLEW_AMD_texture_texture4 GLEW_GET_VAR(__GLEW_AMD_texture_texture4) + +#endif /* GL_AMD_texture_texture4 */ + +/* --------------- GL_AMD_transform_feedback3_lines_triangles -------------- */ + +#ifndef GL_AMD_transform_feedback3_lines_triangles +#define GL_AMD_transform_feedback3_lines_triangles 1 + +#define GLEW_AMD_transform_feedback3_lines_triangles GLEW_GET_VAR(__GLEW_AMD_transform_feedback3_lines_triangles) + +#endif /* GL_AMD_transform_feedback3_lines_triangles */ + +/* -------------------- GL_AMD_vertex_shader_tessellator ------------------- */ + +#ifndef GL_AMD_vertex_shader_tessellator +#define GL_AMD_vertex_shader_tessellator 1 + +#define GL_SAMPLER_BUFFER_AMD 0x9001 +#define GL_INT_SAMPLER_BUFFER_AMD 0x9002 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003 +#define GL_TESSELLATION_MODE_AMD 0x9004 +#define GL_TESSELLATION_FACTOR_AMD 0x9005 +#define GL_DISCRETE_AMD 0x9006 +#define GL_CONTINUOUS_AMD 0x9007 + +typedef void (GLAPIENTRY * PFNGLTESSELLATIONFACTORAMDPROC) (GLfloat factor); +typedef void (GLAPIENTRY * PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode); + +#define glTessellationFactorAMD GLEW_GET_FUN(__glewTessellationFactorAMD) +#define glTessellationModeAMD GLEW_GET_FUN(__glewTessellationModeAMD) + +#define GLEW_AMD_vertex_shader_tessellator GLEW_GET_VAR(__GLEW_AMD_vertex_shader_tessellator) + +#endif /* GL_AMD_vertex_shader_tessellator */ + +/* ----------------------- GL_APPLE_aux_depth_stencil ---------------------- */ + +#ifndef GL_APPLE_aux_depth_stencil +#define GL_APPLE_aux_depth_stencil 1 + +#define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14 + +#define GLEW_APPLE_aux_depth_stencil GLEW_GET_VAR(__GLEW_APPLE_aux_depth_stencil) + +#endif /* GL_APPLE_aux_depth_stencil */ + +/* ------------------------ GL_APPLE_client_storage ------------------------ */ + +#ifndef GL_APPLE_client_storage +#define GL_APPLE_client_storage 1 + +#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 + +#define GLEW_APPLE_client_storage GLEW_GET_VAR(__GLEW_APPLE_client_storage) + +#endif /* GL_APPLE_client_storage */ + +/* ------------------------- GL_APPLE_element_array ------------------------ */ + +#ifndef GL_APPLE_element_array +#define GL_APPLE_element_array 1 + +#define GL_ELEMENT_ARRAY_APPLE 0x8A0C +#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8A0D +#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x8A0E + +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const void* pointer); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint* first, const GLsizei *count, GLsizei primcount); + +#define glDrawElementArrayAPPLE GLEW_GET_FUN(__glewDrawElementArrayAPPLE) +#define glDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewDrawRangeElementArrayAPPLE) +#define glElementPointerAPPLE GLEW_GET_FUN(__glewElementPointerAPPLE) +#define glMultiDrawElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawElementArrayAPPLE) +#define glMultiDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawRangeElementArrayAPPLE) + +#define GLEW_APPLE_element_array GLEW_GET_VAR(__GLEW_APPLE_element_array) + +#endif /* GL_APPLE_element_array */ + +/* ----------------------------- GL_APPLE_fence ---------------------------- */ + +#ifndef GL_APPLE_fence +#define GL_APPLE_fence 1 + +#define GL_DRAW_PIXELS_APPLE 0x8A0A +#define GL_FENCE_APPLE 0x8A0B + +typedef void (GLAPIENTRY * PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint* fences); +typedef void (GLAPIENTRY * PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); +typedef void (GLAPIENTRY * PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); +typedef void (GLAPIENTRY * PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint* fences); +typedef GLboolean (GLAPIENTRY * PFNGLISFENCEAPPLEPROC) (GLuint fence); +typedef void (GLAPIENTRY * PFNGLSETFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (GLAPIENTRY * PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); + +#define glDeleteFencesAPPLE GLEW_GET_FUN(__glewDeleteFencesAPPLE) +#define glFinishFenceAPPLE GLEW_GET_FUN(__glewFinishFenceAPPLE) +#define glFinishObjectAPPLE GLEW_GET_FUN(__glewFinishObjectAPPLE) +#define glGenFencesAPPLE GLEW_GET_FUN(__glewGenFencesAPPLE) +#define glIsFenceAPPLE GLEW_GET_FUN(__glewIsFenceAPPLE) +#define glSetFenceAPPLE GLEW_GET_FUN(__glewSetFenceAPPLE) +#define glTestFenceAPPLE GLEW_GET_FUN(__glewTestFenceAPPLE) +#define glTestObjectAPPLE GLEW_GET_FUN(__glewTestObjectAPPLE) + +#define GLEW_APPLE_fence GLEW_GET_VAR(__GLEW_APPLE_fence) + +#endif /* GL_APPLE_fence */ + +/* ------------------------- GL_APPLE_float_pixels ------------------------- */ + +#ifndef GL_APPLE_float_pixels +#define GL_APPLE_float_pixels 1 + +#define GL_HALF_APPLE 0x140B +#define GL_RGBA_FLOAT32_APPLE 0x8814 +#define GL_RGB_FLOAT32_APPLE 0x8815 +#define GL_ALPHA_FLOAT32_APPLE 0x8816 +#define GL_INTENSITY_FLOAT32_APPLE 0x8817 +#define GL_LUMINANCE_FLOAT32_APPLE 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 +#define GL_RGBA_FLOAT16_APPLE 0x881A +#define GL_RGB_FLOAT16_APPLE 0x881B +#define GL_ALPHA_FLOAT16_APPLE 0x881C +#define GL_INTENSITY_FLOAT16_APPLE 0x881D +#define GL_LUMINANCE_FLOAT16_APPLE 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F +#define GL_COLOR_FLOAT_APPLE 0x8A0F + +#define GLEW_APPLE_float_pixels GLEW_GET_VAR(__GLEW_APPLE_float_pixels) + +#endif /* GL_APPLE_float_pixels */ + +/* ---------------------- GL_APPLE_flush_buffer_range ---------------------- */ + +#ifndef GL_APPLE_flush_buffer_range +#define GL_APPLE_flush_buffer_range 1 + +#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12 +#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13 + +typedef void (GLAPIENTRY * PFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size); + +#define glBufferParameteriAPPLE GLEW_GET_FUN(__glewBufferParameteriAPPLE) +#define glFlushMappedBufferRangeAPPLE GLEW_GET_FUN(__glewFlushMappedBufferRangeAPPLE) + +#define GLEW_APPLE_flush_buffer_range GLEW_GET_VAR(__GLEW_APPLE_flush_buffer_range) + +#endif /* GL_APPLE_flush_buffer_range */ + +/* ----------------------- GL_APPLE_object_purgeable ----------------------- */ + +#ifndef GL_APPLE_object_purgeable +#define GL_APPLE_object_purgeable 1 + +#define GL_BUFFER_OBJECT_APPLE 0x85B3 +#define GL_RELEASED_APPLE 0x8A19 +#define GL_VOLATILE_APPLE 0x8A1A +#define GL_RETAINED_APPLE 0x8A1B +#define GL_UNDEFINED_APPLE 0x8A1C +#define GL_PURGEABLE_APPLE 0x8A1D + +typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint* params); +typedef GLenum (GLAPIENTRY * PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); +typedef GLenum (GLAPIENTRY * PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); + +#define glGetObjectParameterivAPPLE GLEW_GET_FUN(__glewGetObjectParameterivAPPLE) +#define glObjectPurgeableAPPLE GLEW_GET_FUN(__glewObjectPurgeableAPPLE) +#define glObjectUnpurgeableAPPLE GLEW_GET_FUN(__glewObjectUnpurgeableAPPLE) + +#define GLEW_APPLE_object_purgeable GLEW_GET_VAR(__GLEW_APPLE_object_purgeable) + +#endif /* GL_APPLE_object_purgeable */ + +/* ------------------------- GL_APPLE_pixel_buffer ------------------------- */ + +#ifndef GL_APPLE_pixel_buffer +#define GL_APPLE_pixel_buffer 1 + +#define GL_MIN_PBUFFER_VIEWPORT_DIMS_APPLE 0x8A10 + +#define GLEW_APPLE_pixel_buffer GLEW_GET_VAR(__GLEW_APPLE_pixel_buffer) + +#endif /* GL_APPLE_pixel_buffer */ + +/* ---------------------------- GL_APPLE_rgb_422 --------------------------- */ + +#ifndef GL_APPLE_rgb_422 +#define GL_APPLE_rgb_422 1 + +#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB +#define GL_RGB_422_APPLE 0x8A1F + +#define GLEW_APPLE_rgb_422 GLEW_GET_VAR(__GLEW_APPLE_rgb_422) + +#endif /* GL_APPLE_rgb_422 */ + +/* --------------------------- GL_APPLE_row_bytes -------------------------- */ + +#ifndef GL_APPLE_row_bytes +#define GL_APPLE_row_bytes 1 + +#define GL_PACK_ROW_BYTES_APPLE 0x8A15 +#define GL_UNPACK_ROW_BYTES_APPLE 0x8A16 + +#define GLEW_APPLE_row_bytes GLEW_GET_VAR(__GLEW_APPLE_row_bytes) + +#endif /* GL_APPLE_row_bytes */ + +/* ------------------------ GL_APPLE_specular_vector ----------------------- */ + +#ifndef GL_APPLE_specular_vector +#define GL_APPLE_specular_vector 1 + +#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 + +#define GLEW_APPLE_specular_vector GLEW_GET_VAR(__GLEW_APPLE_specular_vector) + +#endif /* GL_APPLE_specular_vector */ + +/* ------------------------- GL_APPLE_texture_range ------------------------ */ + +#ifndef GL_APPLE_texture_range +#define GL_APPLE_texture_range 1 + +#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7 +#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8 +#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC +#define GL_STORAGE_PRIVATE_APPLE 0x85BD +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_SHARED_APPLE 0x85BF + +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, GLvoid **params); +typedef void (GLAPIENTRY * PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, GLvoid *pointer); + +#define glGetTexParameterPointervAPPLE GLEW_GET_FUN(__glewGetTexParameterPointervAPPLE) +#define glTextureRangeAPPLE GLEW_GET_FUN(__glewTextureRangeAPPLE) + +#define GLEW_APPLE_texture_range GLEW_GET_VAR(__GLEW_APPLE_texture_range) + +#endif /* GL_APPLE_texture_range */ + +/* ------------------------ GL_APPLE_transform_hint ------------------------ */ + +#ifndef GL_APPLE_transform_hint +#define GL_APPLE_transform_hint 1 + +#define GL_TRANSFORM_HINT_APPLE 0x85B1 + +#define GLEW_APPLE_transform_hint GLEW_GET_VAR(__GLEW_APPLE_transform_hint) + +#endif /* GL_APPLE_transform_hint */ + +/* ---------------------- GL_APPLE_vertex_array_object --------------------- */ + +#ifndef GL_APPLE_vertex_array_object +#define GL_APPLE_vertex_array_object 1 + +#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 + +typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); +typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays); +typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays); +typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); + +#define glBindVertexArrayAPPLE GLEW_GET_FUN(__glewBindVertexArrayAPPLE) +#define glDeleteVertexArraysAPPLE GLEW_GET_FUN(__glewDeleteVertexArraysAPPLE) +#define glGenVertexArraysAPPLE GLEW_GET_FUN(__glewGenVertexArraysAPPLE) +#define glIsVertexArrayAPPLE GLEW_GET_FUN(__glewIsVertexArrayAPPLE) + +#define GLEW_APPLE_vertex_array_object GLEW_GET_VAR(__GLEW_APPLE_vertex_array_object) + +#endif /* GL_APPLE_vertex_array_object */ + +/* ---------------------- GL_APPLE_vertex_array_range ---------------------- */ + +#ifndef GL_APPLE_vertex_array_range +#define GL_APPLE_vertex_array_range 1 + +#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E +#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_APPLE 0x8520 +#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 +#define GL_STORAGE_CLIENT_APPLE 0x85B4 +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_SHARED_APPLE 0x85BF + +typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void* pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void* pointer); + +#define glFlushVertexArrayRangeAPPLE GLEW_GET_FUN(__glewFlushVertexArrayRangeAPPLE) +#define glVertexArrayParameteriAPPLE GLEW_GET_FUN(__glewVertexArrayParameteriAPPLE) +#define glVertexArrayRangeAPPLE GLEW_GET_FUN(__glewVertexArrayRangeAPPLE) + +#define GLEW_APPLE_vertex_array_range GLEW_GET_VAR(__GLEW_APPLE_vertex_array_range) + +#endif /* GL_APPLE_vertex_array_range */ + +/* ------------------- GL_APPLE_vertex_program_evaluators ------------------ */ + +#ifndef GL_APPLE_vertex_program_evaluators +#define GL_APPLE_vertex_program_evaluators 1 + +#define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00 +#define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01 +#define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02 +#define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03 +#define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04 +#define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05 +#define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06 +#define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07 +#define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08 +#define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09 + +typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); +typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname); +typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble* points); +typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat* points); +typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB2DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble* points); +typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat* points); + +#define glDisableVertexAttribAPPLE GLEW_GET_FUN(__glewDisableVertexAttribAPPLE) +#define glEnableVertexAttribAPPLE GLEW_GET_FUN(__glewEnableVertexAttribAPPLE) +#define glIsVertexAttribEnabledAPPLE GLEW_GET_FUN(__glewIsVertexAttribEnabledAPPLE) +#define glMapVertexAttrib1dAPPLE GLEW_GET_FUN(__glewMapVertexAttrib1dAPPLE) +#define glMapVertexAttrib1fAPPLE GLEW_GET_FUN(__glewMapVertexAttrib1fAPPLE) +#define glMapVertexAttrib2dAPPLE GLEW_GET_FUN(__glewMapVertexAttrib2dAPPLE) +#define glMapVertexAttrib2fAPPLE GLEW_GET_FUN(__glewMapVertexAttrib2fAPPLE) + +#define GLEW_APPLE_vertex_program_evaluators GLEW_GET_VAR(__GLEW_APPLE_vertex_program_evaluators) + +#endif /* GL_APPLE_vertex_program_evaluators */ + +/* --------------------------- GL_APPLE_ycbcr_422 -------------------------- */ + +#ifndef GL_APPLE_ycbcr_422 +#define GL_APPLE_ycbcr_422 1 + +#define GL_YCBCR_422_APPLE 0x85B9 +#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB + +#define GLEW_APPLE_ycbcr_422 GLEW_GET_VAR(__GLEW_APPLE_ycbcr_422) + +#endif /* GL_APPLE_ycbcr_422 */ + +/* ------------------------ GL_ARB_ES2_compatibility ----------------------- */ + +#ifndef GL_ARB_ES2_compatibility +#define GL_ARB_ES2_compatibility 1 + +#define GL_FIXED 0x140C +#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B +#define GL_LOW_FLOAT 0x8DF0 +#define GL_MEDIUM_FLOAT 0x8DF1 +#define GL_HIGH_FLOAT 0x8DF2 +#define GL_LOW_INT 0x8DF3 +#define GL_MEDIUM_INT 0x8DF4 +#define GL_HIGH_INT 0x8DF5 +#define GL_SHADER_BINARY_FORMATS 0x8DF8 +#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 +#define GL_SHADER_COMPILER 0x8DFA +#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB +#define GL_MAX_VARYING_VECTORS 0x8DFC +#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD + +typedef void (GLAPIENTRY * PFNGLCLEARDEPTHFPROC) (GLclampf d); +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEFPROC) (GLclampf n, GLclampf f); +typedef void (GLAPIENTRY * PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint* range, GLint *precision); +typedef void (GLAPIENTRY * PFNGLRELEASESHADERCOMPILERPROC) (void); +typedef void (GLAPIENTRY * PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint* shaders, GLenum binaryformat, const GLvoid*binary, GLsizei length); + +#define glClearDepthf GLEW_GET_FUN(__glewClearDepthf) +#define glDepthRangef GLEW_GET_FUN(__glewDepthRangef) +#define glGetShaderPrecisionFormat GLEW_GET_FUN(__glewGetShaderPrecisionFormat) +#define glReleaseShaderCompiler GLEW_GET_FUN(__glewReleaseShaderCompiler) +#define glShaderBinary GLEW_GET_FUN(__glewShaderBinary) + +#define GLEW_ARB_ES2_compatibility GLEW_GET_VAR(__GLEW_ARB_ES2_compatibility) + +#endif /* GL_ARB_ES2_compatibility */ + +/* ----------------------- GL_ARB_blend_func_extended ---------------------- */ + +#ifndef GL_ARB_blend_func_extended +#define GL_ARB_blend_func_extended 1 + +#define GL_SRC1_COLOR 0x88F9 +#define GL_ONE_MINUS_SRC1_COLOR 0x88FA +#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB +#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC + +typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const char * name); +typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const char * name); + +#define glBindFragDataLocationIndexed GLEW_GET_FUN(__glewBindFragDataLocationIndexed) +#define glGetFragDataIndex GLEW_GET_FUN(__glewGetFragDataIndex) + +#define GLEW_ARB_blend_func_extended GLEW_GET_VAR(__GLEW_ARB_blend_func_extended) + +#endif /* GL_ARB_blend_func_extended */ + +/* ---------------------------- GL_ARB_cl_event ---------------------------- */ + +#ifndef GL_ARB_cl_event +#define GL_ARB_cl_event 1 + +#define GL_SYNC_CL_EVENT_ARB 0x8240 +#define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241 + +typedef struct _cl_context *cl_context; +typedef struct _cl_event *cl_event; + +typedef GLsync (GLAPIENTRY * PFNGLCREATESYNCFROMCLEVENTARBPROC) (cl_context context, cl_event event, GLbitfield flags); + +#define glCreateSyncFromCLeventARB GLEW_GET_FUN(__glewCreateSyncFromCLeventARB) + +#define GLEW_ARB_cl_event GLEW_GET_VAR(__GLEW_ARB_cl_event) + +#endif /* GL_ARB_cl_event */ + +/* ----------------------- GL_ARB_color_buffer_float ----------------------- */ + +#ifndef GL_ARB_color_buffer_float +#define GL_ARB_color_buffer_float 1 + +#define GL_RGBA_FLOAT_MODE_ARB 0x8820 +#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A +#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B +#define GL_CLAMP_READ_COLOR_ARB 0x891C +#define GL_FIXED_ONLY_ARB 0x891D + +typedef void (GLAPIENTRY * PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); + +#define glClampColorARB GLEW_GET_FUN(__glewClampColorARB) + +#define GLEW_ARB_color_buffer_float GLEW_GET_VAR(__GLEW_ARB_color_buffer_float) + +#endif /* GL_ARB_color_buffer_float */ + +/* -------------------------- GL_ARB_compatibility ------------------------- */ + +#ifndef GL_ARB_compatibility +#define GL_ARB_compatibility 1 + +#define GLEW_ARB_compatibility GLEW_GET_VAR(__GLEW_ARB_compatibility) + +#endif /* GL_ARB_compatibility */ + +/* --------------------------- GL_ARB_copy_buffer -------------------------- */ + +#ifndef GL_ARB_copy_buffer +#define GL_ARB_copy_buffer 1 + +#define GL_COPY_READ_BUFFER 0x8F36 +#define GL_COPY_WRITE_BUFFER 0x8F37 + +typedef void (GLAPIENTRY * PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size); + +#define glCopyBufferSubData GLEW_GET_FUN(__glewCopyBufferSubData) + +#define GLEW_ARB_copy_buffer GLEW_GET_VAR(__GLEW_ARB_copy_buffer) + +#endif /* GL_ARB_copy_buffer */ + +/* -------------------------- GL_ARB_debug_output -------------------------- */ + +#ifndef GL_ARB_debug_output +#define GL_ARB_debug_output 1 + +#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245 +#define GL_DEBUG_SOURCE_API_ARB 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A +#define GL_DEBUG_SOURCE_OTHER_ARB 0x824B +#define GL_DEBUG_TYPE_ERROR_ARB 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E +#define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250 +#define GL_DEBUG_TYPE_OTHER_ARB 0x8251 +#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147 +#define GL_DEBUG_SEVERITY_LOW_ARB 0x9148 + +typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, GLvoid* userParam); + +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, void* userParam); +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const char* buf); +typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufsize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, char* messageLog); + +#define glDebugMessageCallbackARB GLEW_GET_FUN(__glewDebugMessageCallbackARB) +#define glDebugMessageControlARB GLEW_GET_FUN(__glewDebugMessageControlARB) +#define glDebugMessageInsertARB GLEW_GET_FUN(__glewDebugMessageInsertARB) +#define glGetDebugMessageLogARB GLEW_GET_FUN(__glewGetDebugMessageLogARB) + +#define GLEW_ARB_debug_output GLEW_GET_VAR(__GLEW_ARB_debug_output) + +#endif /* GL_ARB_debug_output */ + +/* ----------------------- GL_ARB_depth_buffer_float ----------------------- */ + +#ifndef GL_ARB_depth_buffer_float +#define GL_ARB_depth_buffer_float 1 + +#define GL_DEPTH_COMPONENT32F 0x8CAC +#define GL_DEPTH32F_STENCIL8 0x8CAD +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD + +#define GLEW_ARB_depth_buffer_float GLEW_GET_VAR(__GLEW_ARB_depth_buffer_float) + +#endif /* GL_ARB_depth_buffer_float */ + +/* --------------------------- GL_ARB_depth_clamp -------------------------- */ + +#ifndef GL_ARB_depth_clamp +#define GL_ARB_depth_clamp 1 + +#define GL_DEPTH_CLAMP 0x864F + +#define GLEW_ARB_depth_clamp GLEW_GET_VAR(__GLEW_ARB_depth_clamp) + +#endif /* GL_ARB_depth_clamp */ + +/* -------------------------- GL_ARB_depth_texture ------------------------- */ + +#ifndef GL_ARB_depth_texture +#define GL_ARB_depth_texture 1 + +#define GL_DEPTH_COMPONENT16_ARB 0x81A5 +#define GL_DEPTH_COMPONENT24_ARB 0x81A6 +#define GL_DEPTH_COMPONENT32_ARB 0x81A7 +#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A +#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B + +#define GLEW_ARB_depth_texture GLEW_GET_VAR(__GLEW_ARB_depth_texture) + +#endif /* GL_ARB_depth_texture */ + +/* -------------------------- GL_ARB_draw_buffers -------------------------- */ + +#ifndef GL_ARB_draw_buffers +#define GL_ARB_draw_buffers 1 + +#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 +#define GL_DRAW_BUFFER0_ARB 0x8825 +#define GL_DRAW_BUFFER1_ARB 0x8826 +#define GL_DRAW_BUFFER2_ARB 0x8827 +#define GL_DRAW_BUFFER3_ARB 0x8828 +#define GL_DRAW_BUFFER4_ARB 0x8829 +#define GL_DRAW_BUFFER5_ARB 0x882A +#define GL_DRAW_BUFFER6_ARB 0x882B +#define GL_DRAW_BUFFER7_ARB 0x882C +#define GL_DRAW_BUFFER8_ARB 0x882D +#define GL_DRAW_BUFFER9_ARB 0x882E +#define GL_DRAW_BUFFER10_ARB 0x882F +#define GL_DRAW_BUFFER11_ARB 0x8830 +#define GL_DRAW_BUFFER12_ARB 0x8831 +#define GL_DRAW_BUFFER13_ARB 0x8832 +#define GL_DRAW_BUFFER14_ARB 0x8833 +#define GL_DRAW_BUFFER15_ARB 0x8834 + +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum* bufs); + +#define glDrawBuffersARB GLEW_GET_FUN(__glewDrawBuffersARB) + +#define GLEW_ARB_draw_buffers GLEW_GET_VAR(__GLEW_ARB_draw_buffers) + +#endif /* GL_ARB_draw_buffers */ + +/* ----------------------- GL_ARB_draw_buffers_blend ----------------------- */ + +#ifndef GL_ARB_draw_buffers_blend +#define GL_ARB_draw_buffers_blend 1 + +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst); + +#define glBlendEquationSeparateiARB GLEW_GET_FUN(__glewBlendEquationSeparateiARB) +#define glBlendEquationiARB GLEW_GET_FUN(__glewBlendEquationiARB) +#define glBlendFuncSeparateiARB GLEW_GET_FUN(__glewBlendFuncSeparateiARB) +#define glBlendFunciARB GLEW_GET_FUN(__glewBlendFunciARB) + +#define GLEW_ARB_draw_buffers_blend GLEW_GET_VAR(__GLEW_ARB_draw_buffers_blend) + +#endif /* GL_ARB_draw_buffers_blend */ + +/* -------------------- GL_ARB_draw_elements_base_vertex ------------------- */ + +#ifndef GL_ARB_draw_elements_base_vertex +#define GL_ARB_draw_elements_base_vertex 1 + +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, void* indices, GLint basevertex); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount, GLint basevertex); +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, void* indices, GLint basevertex); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei* count, GLenum type, GLvoid**indices, GLsizei primcount, GLint *basevertex); + +#define glDrawElementsBaseVertex GLEW_GET_FUN(__glewDrawElementsBaseVertex) +#define glDrawElementsInstancedBaseVertex GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertex) +#define glDrawRangeElementsBaseVertex GLEW_GET_FUN(__glewDrawRangeElementsBaseVertex) +#define glMultiDrawElementsBaseVertex GLEW_GET_FUN(__glewMultiDrawElementsBaseVertex) + +#define GLEW_ARB_draw_elements_base_vertex GLEW_GET_VAR(__GLEW_ARB_draw_elements_base_vertex) + +#endif /* GL_ARB_draw_elements_base_vertex */ + +/* -------------------------- GL_ARB_draw_indirect ------------------------- */ + +#ifndef GL_ARB_draw_indirect +#define GL_ARB_draw_indirect 1 + +#define GL_DRAW_INDIRECT_BUFFER 0x8F3F +#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void* indirect); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void* indirect); + +#define glDrawArraysIndirect GLEW_GET_FUN(__glewDrawArraysIndirect) +#define glDrawElementsIndirect GLEW_GET_FUN(__glewDrawElementsIndirect) + +#define GLEW_ARB_draw_indirect GLEW_GET_VAR(__GLEW_ARB_draw_indirect) + +#endif /* GL_ARB_draw_indirect */ + +/* ------------------------- GL_ARB_draw_instanced ------------------------- */ + +#ifndef GL_ARB_draw_instanced +#define GL_ARB_draw_instanced 1 + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount); + +#define glDrawArraysInstancedARB GLEW_GET_FUN(__glewDrawArraysInstancedARB) +#define glDrawElementsInstancedARB GLEW_GET_FUN(__glewDrawElementsInstancedARB) + +#define GLEW_ARB_draw_instanced GLEW_GET_VAR(__GLEW_ARB_draw_instanced) + +#endif /* GL_ARB_draw_instanced */ + +/* -------------------- GL_ARB_explicit_attrib_location -------------------- */ + +#ifndef GL_ARB_explicit_attrib_location +#define GL_ARB_explicit_attrib_location 1 + +#define GLEW_ARB_explicit_attrib_location GLEW_GET_VAR(__GLEW_ARB_explicit_attrib_location) + +#endif /* GL_ARB_explicit_attrib_location */ + +/* ------------------- GL_ARB_fragment_coord_conventions ------------------- */ + +#ifndef GL_ARB_fragment_coord_conventions +#define GL_ARB_fragment_coord_conventions 1 + +#define GLEW_ARB_fragment_coord_conventions GLEW_GET_VAR(__GLEW_ARB_fragment_coord_conventions) + +#endif /* GL_ARB_fragment_coord_conventions */ + +/* ------------------------ GL_ARB_fragment_program ------------------------ */ + +#ifndef GL_ARB_fragment_program +#define GL_ARB_fragment_program 1 + +#define GL_FRAGMENT_PROGRAM_ARB 0x8804 +#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 +#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 +#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 +#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 +#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 +#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A +#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B +#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C +#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D +#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E +#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F +#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 +#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 + +#define GLEW_ARB_fragment_program GLEW_GET_VAR(__GLEW_ARB_fragment_program) + +#endif /* GL_ARB_fragment_program */ + +/* --------------------- GL_ARB_fragment_program_shadow -------------------- */ + +#ifndef GL_ARB_fragment_program_shadow +#define GL_ARB_fragment_program_shadow 1 + +#define GLEW_ARB_fragment_program_shadow GLEW_GET_VAR(__GLEW_ARB_fragment_program_shadow) + +#endif /* GL_ARB_fragment_program_shadow */ + +/* ------------------------- GL_ARB_fragment_shader ------------------------ */ + +#ifndef GL_ARB_fragment_shader +#define GL_ARB_fragment_shader 1 + +#define GL_FRAGMENT_SHADER_ARB 0x8B30 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B + +#define GLEW_ARB_fragment_shader GLEW_GET_VAR(__GLEW_ARB_fragment_shader) + +#endif /* GL_ARB_fragment_shader */ + +/* ----------------------- GL_ARB_framebuffer_object ----------------------- */ + +#ifndef GL_ARB_framebuffer_object +#define GL_ARB_framebuffer_object 1 + +#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 +#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 +#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 +#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 +#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 +#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 +#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 +#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 +#define GL_FRAMEBUFFER_DEFAULT 0x8218 +#define GL_FRAMEBUFFER_UNDEFINED 0x8219 +#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A +#define GL_INDEX 0x8222 +#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 +#define GL_DEPTH_STENCIL 0x84F9 +#define GL_UNSIGNED_INT_24_8 0x84FA +#define GL_DEPTH24_STENCIL8 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE 0x88F1 +#define GL_UNSIGNED_NORMALIZED 0x8C17 +#define GL_SRGB 0x8C40 +#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_RENDERBUFFER_BINDING 0x8CA7 +#define GL_READ_FRAMEBUFFER 0x8CA8 +#define GL_DRAW_FRAMEBUFFER 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA +#define GL_RENDERBUFFER_SAMPLES 0x8CAB +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF +#define GL_COLOR_ATTACHMENT0 0x8CE0 +#define GL_COLOR_ATTACHMENT1 0x8CE1 +#define GL_COLOR_ATTACHMENT2 0x8CE2 +#define GL_COLOR_ATTACHMENT3 0x8CE3 +#define GL_COLOR_ATTACHMENT4 0x8CE4 +#define GL_COLOR_ATTACHMENT5 0x8CE5 +#define GL_COLOR_ATTACHMENT6 0x8CE6 +#define GL_COLOR_ATTACHMENT7 0x8CE7 +#define GL_COLOR_ATTACHMENT8 0x8CE8 +#define GL_COLOR_ATTACHMENT9 0x8CE9 +#define GL_COLOR_ATTACHMENT10 0x8CEA +#define GL_COLOR_ATTACHMENT11 0x8CEB +#define GL_COLOR_ATTACHMENT12 0x8CEC +#define GL_COLOR_ATTACHMENT13 0x8CED +#define GL_COLOR_ATTACHMENT14 0x8CEE +#define GL_COLOR_ATTACHMENT15 0x8CEF +#define GL_DEPTH_ATTACHMENT 0x8D00 +#define GL_STENCIL_ATTACHMENT 0x8D20 +#define GL_FRAMEBUFFER 0x8D40 +#define GL_RENDERBUFFER 0x8D41 +#define GL_RENDERBUFFER_WIDTH 0x8D42 +#define GL_RENDERBUFFER_HEIGHT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 +#define GL_STENCIL_INDEX1 0x8D46 +#define GL_STENCIL_INDEX4 0x8D47 +#define GL_STENCIL_INDEX8 0x8D48 +#define GL_STENCIL_INDEX16 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 +#define GL_MAX_SAMPLES 0x8D57 + +typedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); +typedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint* framebuffers); +typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint* renderbuffers); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint layer); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target,GLenum attachment, GLuint texture,GLint level,GLint layer); +typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint* framebuffers); +typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint* renderbuffers); +typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); +typedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + +#define glBindFramebuffer GLEW_GET_FUN(__glewBindFramebuffer) +#define glBindRenderbuffer GLEW_GET_FUN(__glewBindRenderbuffer) +#define glBlitFramebuffer GLEW_GET_FUN(__glewBlitFramebuffer) +#define glCheckFramebufferStatus GLEW_GET_FUN(__glewCheckFramebufferStatus) +#define glDeleteFramebuffers GLEW_GET_FUN(__glewDeleteFramebuffers) +#define glDeleteRenderbuffers GLEW_GET_FUN(__glewDeleteRenderbuffers) +#define glFramebufferRenderbuffer GLEW_GET_FUN(__glewFramebufferRenderbuffer) +#define glFramebufferTexture1D GLEW_GET_FUN(__glewFramebufferTexture1D) +#define glFramebufferTexture2D GLEW_GET_FUN(__glewFramebufferTexture2D) +#define glFramebufferTexture3D GLEW_GET_FUN(__glewFramebufferTexture3D) +#define glFramebufferTextureLayer GLEW_GET_FUN(__glewFramebufferTextureLayer) +#define glGenFramebuffers GLEW_GET_FUN(__glewGenFramebuffers) +#define glGenRenderbuffers GLEW_GET_FUN(__glewGenRenderbuffers) +#define glGenerateMipmap GLEW_GET_FUN(__glewGenerateMipmap) +#define glGetFramebufferAttachmentParameteriv GLEW_GET_FUN(__glewGetFramebufferAttachmentParameteriv) +#define glGetRenderbufferParameteriv GLEW_GET_FUN(__glewGetRenderbufferParameteriv) +#define glIsFramebuffer GLEW_GET_FUN(__glewIsFramebuffer) +#define glIsRenderbuffer GLEW_GET_FUN(__glewIsRenderbuffer) +#define glRenderbufferStorage GLEW_GET_FUN(__glewRenderbufferStorage) +#define glRenderbufferStorageMultisample GLEW_GET_FUN(__glewRenderbufferStorageMultisample) + +#define GLEW_ARB_framebuffer_object GLEW_GET_VAR(__GLEW_ARB_framebuffer_object) + +#endif /* GL_ARB_framebuffer_object */ + +/* ------------------------ GL_ARB_framebuffer_sRGB ------------------------ */ + +#ifndef GL_ARB_framebuffer_sRGB +#define GL_ARB_framebuffer_sRGB 1 + +#define GL_FRAMEBUFFER_SRGB 0x8DB9 + +#define GLEW_ARB_framebuffer_sRGB GLEW_GET_VAR(__GLEW_ARB_framebuffer_sRGB) + +#endif /* GL_ARB_framebuffer_sRGB */ + +/* ------------------------ GL_ARB_geometry_shader4 ------------------------ */ + +#ifndef GL_ARB_geometry_shader4 +#define GL_ARB_geometry_shader4 1 + +#define GL_LINES_ADJACENCY_ARB 0xA +#define GL_LINE_STRIP_ADJACENCY_ARB 0xB +#define GL_TRIANGLES_ADJACENCY_ARB 0xC +#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0xD +#define GL_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9 +#define GL_GEOMETRY_SHADER_ARB 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value); + +#define glFramebufferTextureARB GLEW_GET_FUN(__glewFramebufferTextureARB) +#define glFramebufferTextureFaceARB GLEW_GET_FUN(__glewFramebufferTextureFaceARB) +#define glFramebufferTextureLayerARB GLEW_GET_FUN(__glewFramebufferTextureLayerARB) +#define glProgramParameteriARB GLEW_GET_FUN(__glewProgramParameteriARB) + +#define GLEW_ARB_geometry_shader4 GLEW_GET_VAR(__GLEW_ARB_geometry_shader4) + +#endif /* GL_ARB_geometry_shader4 */ + +/* ----------------------- GL_ARB_get_program_binary ----------------------- */ + +#ifndef GL_ARB_get_program_binary +#define GL_ARB_get_program_binary 1 + +#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 +#define GL_PROGRAM_BINARY_LENGTH 0x8741 +#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE +#define GL_PROGRAM_BINARY_FORMATS 0x87FF + +typedef void (GLAPIENTRY * PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLenum *binaryFormat, GLvoid*binary); +typedef void (GLAPIENTRY * PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void* binary, GLsizei length); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); + +#define glGetProgramBinary GLEW_GET_FUN(__glewGetProgramBinary) +#define glProgramBinary GLEW_GET_FUN(__glewProgramBinary) +#define glProgramParameteri GLEW_GET_FUN(__glewProgramParameteri) + +#define GLEW_ARB_get_program_binary GLEW_GET_VAR(__GLEW_ARB_get_program_binary) + +#endif /* GL_ARB_get_program_binary */ + +/* --------------------------- GL_ARB_gpu_shader5 -------------------------- */ + +#ifndef GL_ARB_gpu_shader5 +#define GL_ARB_gpu_shader5 1 + +#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C +#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D +#define GL_MAX_VERTEX_STREAMS 0x8E71 + +#define GLEW_ARB_gpu_shader5 GLEW_GET_VAR(__GLEW_ARB_gpu_shader5) + +#endif /* GL_ARB_gpu_shader5 */ + +/* ------------------------- GL_ARB_gpu_shader_fp64 ------------------------ */ + +#ifndef GL_ARB_gpu_shader_fp64 +#define GL_ARB_gpu_shader_fp64 1 + +#define GL_DOUBLE_MAT2 0x8F46 +#define GL_DOUBLE_MAT3 0x8F47 +#define GL_DOUBLE_MAT4 0x8F48 +#define GL_DOUBLE_MAT2x3 0x8F49 +#define GL_DOUBLE_MAT2x4 0x8F4A +#define GL_DOUBLE_MAT3x2 0x8F4B +#define GL_DOUBLE_MAT3x4 0x8F4C +#define GL_DOUBLE_MAT4x2 0x8F4D +#define GL_DOUBLE_MAT4x3 0x8F4E +#define GL_DOUBLE_VEC2 0x8FFC +#define GL_DOUBLE_VEC3 0x8FFD +#define GL_DOUBLE_VEC4 0x8FFE + +typedef void (GLAPIENTRY * PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DEXTPROC) (GLuint program, GLint location, GLdouble x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1DPROC) (GLint location, GLdouble x); +typedef void (GLAPIENTRY * PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); + +#define glGetUniformdv GLEW_GET_FUN(__glewGetUniformdv) +#define glProgramUniform1dEXT GLEW_GET_FUN(__glewProgramUniform1dEXT) +#define glProgramUniform1dvEXT GLEW_GET_FUN(__glewProgramUniform1dvEXT) +#define glProgramUniform2dEXT GLEW_GET_FUN(__glewProgramUniform2dEXT) +#define glProgramUniform2dvEXT GLEW_GET_FUN(__glewProgramUniform2dvEXT) +#define glProgramUniform3dEXT GLEW_GET_FUN(__glewProgramUniform3dEXT) +#define glProgramUniform3dvEXT GLEW_GET_FUN(__glewProgramUniform3dvEXT) +#define glProgramUniform4dEXT GLEW_GET_FUN(__glewProgramUniform4dEXT) +#define glProgramUniform4dvEXT GLEW_GET_FUN(__glewProgramUniform4dvEXT) +#define glProgramUniformMatrix2dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2dvEXT) +#define glProgramUniformMatrix2x3dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x3dvEXT) +#define glProgramUniformMatrix2x4dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x4dvEXT) +#define glProgramUniformMatrix3dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3dvEXT) +#define glProgramUniformMatrix3x2dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x2dvEXT) +#define glProgramUniformMatrix3x4dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x4dvEXT) +#define glProgramUniformMatrix4dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4dvEXT) +#define glProgramUniformMatrix4x2dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x2dvEXT) +#define glProgramUniformMatrix4x3dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x3dvEXT) +#define glUniform1d GLEW_GET_FUN(__glewUniform1d) +#define glUniform1dv GLEW_GET_FUN(__glewUniform1dv) +#define glUniform2d GLEW_GET_FUN(__glewUniform2d) +#define glUniform2dv GLEW_GET_FUN(__glewUniform2dv) +#define glUniform3d GLEW_GET_FUN(__glewUniform3d) +#define glUniform3dv GLEW_GET_FUN(__glewUniform3dv) +#define glUniform4d GLEW_GET_FUN(__glewUniform4d) +#define glUniform4dv GLEW_GET_FUN(__glewUniform4dv) +#define glUniformMatrix2dv GLEW_GET_FUN(__glewUniformMatrix2dv) +#define glUniformMatrix2x3dv GLEW_GET_FUN(__glewUniformMatrix2x3dv) +#define glUniformMatrix2x4dv GLEW_GET_FUN(__glewUniformMatrix2x4dv) +#define glUniformMatrix3dv GLEW_GET_FUN(__glewUniformMatrix3dv) +#define glUniformMatrix3x2dv GLEW_GET_FUN(__glewUniformMatrix3x2dv) +#define glUniformMatrix3x4dv GLEW_GET_FUN(__glewUniformMatrix3x4dv) +#define glUniformMatrix4dv GLEW_GET_FUN(__glewUniformMatrix4dv) +#define glUniformMatrix4x2dv GLEW_GET_FUN(__glewUniformMatrix4x2dv) +#define glUniformMatrix4x3dv GLEW_GET_FUN(__glewUniformMatrix4x3dv) + +#define GLEW_ARB_gpu_shader_fp64 GLEW_GET_VAR(__GLEW_ARB_gpu_shader_fp64) + +#endif /* GL_ARB_gpu_shader_fp64 */ + +/* ------------------------ GL_ARB_half_float_pixel ------------------------ */ + +#ifndef GL_ARB_half_float_pixel +#define GL_ARB_half_float_pixel 1 + +#define GL_HALF_FLOAT_ARB 0x140B + +#define GLEW_ARB_half_float_pixel GLEW_GET_VAR(__GLEW_ARB_half_float_pixel) + +#endif /* GL_ARB_half_float_pixel */ + +/* ------------------------ GL_ARB_half_float_vertex ----------------------- */ + +#ifndef GL_ARB_half_float_vertex +#define GL_ARB_half_float_vertex 1 + +#define GL_HALF_FLOAT 0x140B + +#define GLEW_ARB_half_float_vertex GLEW_GET_VAR(__GLEW_ARB_half_float_vertex) + +#endif /* GL_ARB_half_float_vertex */ + +/* ----------------------------- GL_ARB_imaging ---------------------------- */ + +#ifndef GL_ARB_imaging +#define GL_ARB_imaging 1 + +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_BLEND_COLOR 0x8005 +#define GL_FUNC_ADD 0x8006 +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_BLEND_EQUATION 0x8009 +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_CONVOLUTION_1D 0x8010 +#define GL_CONVOLUTION_2D 0x8011 +#define GL_SEPARABLE_2D 0x8012 +#define GL_CONVOLUTION_BORDER_MODE 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS 0x8015 +#define GL_REDUCE 0x8016 +#define GL_CONVOLUTION_FORMAT 0x8017 +#define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_CONVOLUTION_HEIGHT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 +#define GL_HISTOGRAM 0x8024 +#define GL_PROXY_HISTOGRAM 0x8025 +#define GL_HISTOGRAM_WIDTH 0x8026 +#define GL_HISTOGRAM_FORMAT 0x8027 +#define GL_HISTOGRAM_RED_SIZE 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C +#define GL_HISTOGRAM_SINK 0x802D +#define GL_MINMAX 0x802E +#define GL_MINMAX_FORMAT 0x802F +#define GL_MINMAX_SINK 0x8030 +#define GL_TABLE_TOO_LARGE 0x8031 +#define GL_COLOR_MATRIX 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB +#define GL_COLOR_TABLE 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 +#define GL_PROXY_COLOR_TABLE 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 +#define GL_COLOR_TABLE_SCALE 0x80D6 +#define GL_COLOR_TABLE_BIAS 0x80D7 +#define GL_COLOR_TABLE_FORMAT 0x80D8 +#define GL_COLOR_TABLE_WIDTH 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF +#define GL_IGNORE_BORDER 0x8150 +#define GL_CONSTANT_BORDER 0x8151 +#define GL_WRAP_BORDER 0x8152 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 + +typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid *data); +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const GLvoid *image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLvoid *table); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *image); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum types, GLvoid *values); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span); +typedef void (GLAPIENTRY * PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRY * PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLRESETMINMAXPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *row, const GLvoid *column); + +#define glColorSubTable GLEW_GET_FUN(__glewColorSubTable) +#define glColorTable GLEW_GET_FUN(__glewColorTable) +#define glColorTableParameterfv GLEW_GET_FUN(__glewColorTableParameterfv) +#define glColorTableParameteriv GLEW_GET_FUN(__glewColorTableParameteriv) +#define glConvolutionFilter1D GLEW_GET_FUN(__glewConvolutionFilter1D) +#define glConvolutionFilter2D GLEW_GET_FUN(__glewConvolutionFilter2D) +#define glConvolutionParameterf GLEW_GET_FUN(__glewConvolutionParameterf) +#define glConvolutionParameterfv GLEW_GET_FUN(__glewConvolutionParameterfv) +#define glConvolutionParameteri GLEW_GET_FUN(__glewConvolutionParameteri) +#define glConvolutionParameteriv GLEW_GET_FUN(__glewConvolutionParameteriv) +#define glCopyColorSubTable GLEW_GET_FUN(__glewCopyColorSubTable) +#define glCopyColorTable GLEW_GET_FUN(__glewCopyColorTable) +#define glCopyConvolutionFilter1D GLEW_GET_FUN(__glewCopyConvolutionFilter1D) +#define glCopyConvolutionFilter2D GLEW_GET_FUN(__glewCopyConvolutionFilter2D) +#define glGetColorTable GLEW_GET_FUN(__glewGetColorTable) +#define glGetColorTableParameterfv GLEW_GET_FUN(__glewGetColorTableParameterfv) +#define glGetColorTableParameteriv GLEW_GET_FUN(__glewGetColorTableParameteriv) +#define glGetConvolutionFilter GLEW_GET_FUN(__glewGetConvolutionFilter) +#define glGetConvolutionParameterfv GLEW_GET_FUN(__glewGetConvolutionParameterfv) +#define glGetConvolutionParameteriv GLEW_GET_FUN(__glewGetConvolutionParameteriv) +#define glGetHistogram GLEW_GET_FUN(__glewGetHistogram) +#define glGetHistogramParameterfv GLEW_GET_FUN(__glewGetHistogramParameterfv) +#define glGetHistogramParameteriv GLEW_GET_FUN(__glewGetHistogramParameteriv) +#define glGetMinmax GLEW_GET_FUN(__glewGetMinmax) +#define glGetMinmaxParameterfv GLEW_GET_FUN(__glewGetMinmaxParameterfv) +#define glGetMinmaxParameteriv GLEW_GET_FUN(__glewGetMinmaxParameteriv) +#define glGetSeparableFilter GLEW_GET_FUN(__glewGetSeparableFilter) +#define glHistogram GLEW_GET_FUN(__glewHistogram) +#define glMinmax GLEW_GET_FUN(__glewMinmax) +#define glResetHistogram GLEW_GET_FUN(__glewResetHistogram) +#define glResetMinmax GLEW_GET_FUN(__glewResetMinmax) +#define glSeparableFilter2D GLEW_GET_FUN(__glewSeparableFilter2D) + +#define GLEW_ARB_imaging GLEW_GET_VAR(__GLEW_ARB_imaging) + +#endif /* GL_ARB_imaging */ + +/* ------------------------ GL_ARB_instanced_arrays ------------------------ */ + +#ifndef GL_ARB_instanced_arrays +#define GL_ARB_instanced_arrays 1 + +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE + +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor); + +#define glVertexAttribDivisorARB GLEW_GET_FUN(__glewVertexAttribDivisorARB) + +#define GLEW_ARB_instanced_arrays GLEW_GET_VAR(__GLEW_ARB_instanced_arrays) + +#endif /* GL_ARB_instanced_arrays */ + +/* ------------------------ GL_ARB_map_buffer_range ------------------------ */ + +#ifndef GL_ARB_map_buffer_range +#define GL_ARB_map_buffer_range 1 + +#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 +#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 +#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 +#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 + +typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); +typedef GLvoid * (GLAPIENTRY * PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); + +#define glFlushMappedBufferRange GLEW_GET_FUN(__glewFlushMappedBufferRange) +#define glMapBufferRange GLEW_GET_FUN(__glewMapBufferRange) + +#define GLEW_ARB_map_buffer_range GLEW_GET_VAR(__GLEW_ARB_map_buffer_range) + +#endif /* GL_ARB_map_buffer_range */ + +/* ------------------------- GL_ARB_matrix_palette ------------------------- */ + +#ifndef GL_ARB_matrix_palette +#define GL_ARB_matrix_palette 1 + +#define GL_MATRIX_PALETTE_ARB 0x8840 +#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 +#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 +#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 +#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 +#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 +#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 +#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 +#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 +#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 + +typedef void (GLAPIENTRY * PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); +typedef void (GLAPIENTRY * PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUBVARBPROC) (GLint size, GLubyte *indices); +typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUIVARBPROC) (GLint size, GLuint *indices); +typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUSVARBPROC) (GLint size, GLushort *indices); + +#define glCurrentPaletteMatrixARB GLEW_GET_FUN(__glewCurrentPaletteMatrixARB) +#define glMatrixIndexPointerARB GLEW_GET_FUN(__glewMatrixIndexPointerARB) +#define glMatrixIndexubvARB GLEW_GET_FUN(__glewMatrixIndexubvARB) +#define glMatrixIndexuivARB GLEW_GET_FUN(__glewMatrixIndexuivARB) +#define glMatrixIndexusvARB GLEW_GET_FUN(__glewMatrixIndexusvARB) + +#define GLEW_ARB_matrix_palette GLEW_GET_VAR(__GLEW_ARB_matrix_palette) + +#endif /* GL_ARB_matrix_palette */ + +/* --------------------------- GL_ARB_multisample -------------------------- */ + +#ifndef GL_ARB_multisample +#define GL_ARB_multisample 1 + +#define GL_MULTISAMPLE_ARB 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F +#define GL_SAMPLE_COVERAGE_ARB 0x80A0 +#define GL_SAMPLE_BUFFERS_ARB 0x80A8 +#define GL_SAMPLES_ARB 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB +#define GL_MULTISAMPLE_BIT_ARB 0x20000000 + +typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); + +#define glSampleCoverageARB GLEW_GET_FUN(__glewSampleCoverageARB) + +#define GLEW_ARB_multisample GLEW_GET_VAR(__GLEW_ARB_multisample) + +#endif /* GL_ARB_multisample */ + +/* -------------------------- GL_ARB_multitexture -------------------------- */ + +#ifndef GL_ARB_multitexture +#define GL_ARB_multitexture 1 + +#define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9_ARB 0x84C9 +#define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19_ARB 0x84D3 +#define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29_ARB 0x84DD +#define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31_ARB 0x84DF +#define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 + +typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); + +#define glActiveTextureARB GLEW_GET_FUN(__glewActiveTextureARB) +#define glClientActiveTextureARB GLEW_GET_FUN(__glewClientActiveTextureARB) +#define glMultiTexCoord1dARB GLEW_GET_FUN(__glewMultiTexCoord1dARB) +#define glMultiTexCoord1dvARB GLEW_GET_FUN(__glewMultiTexCoord1dvARB) +#define glMultiTexCoord1fARB GLEW_GET_FUN(__glewMultiTexCoord1fARB) +#define glMultiTexCoord1fvARB GLEW_GET_FUN(__glewMultiTexCoord1fvARB) +#define glMultiTexCoord1iARB GLEW_GET_FUN(__glewMultiTexCoord1iARB) +#define glMultiTexCoord1ivARB GLEW_GET_FUN(__glewMultiTexCoord1ivARB) +#define glMultiTexCoord1sARB GLEW_GET_FUN(__glewMultiTexCoord1sARB) +#define glMultiTexCoord1svARB GLEW_GET_FUN(__glewMultiTexCoord1svARB) +#define glMultiTexCoord2dARB GLEW_GET_FUN(__glewMultiTexCoord2dARB) +#define glMultiTexCoord2dvARB GLEW_GET_FUN(__glewMultiTexCoord2dvARB) +#define glMultiTexCoord2fARB GLEW_GET_FUN(__glewMultiTexCoord2fARB) +#define glMultiTexCoord2fvARB GLEW_GET_FUN(__glewMultiTexCoord2fvARB) +#define glMultiTexCoord2iARB GLEW_GET_FUN(__glewMultiTexCoord2iARB) +#define glMultiTexCoord2ivARB GLEW_GET_FUN(__glewMultiTexCoord2ivARB) +#define glMultiTexCoord2sARB GLEW_GET_FUN(__glewMultiTexCoord2sARB) +#define glMultiTexCoord2svARB GLEW_GET_FUN(__glewMultiTexCoord2svARB) +#define glMultiTexCoord3dARB GLEW_GET_FUN(__glewMultiTexCoord3dARB) +#define glMultiTexCoord3dvARB GLEW_GET_FUN(__glewMultiTexCoord3dvARB) +#define glMultiTexCoord3fARB GLEW_GET_FUN(__glewMultiTexCoord3fARB) +#define glMultiTexCoord3fvARB GLEW_GET_FUN(__glewMultiTexCoord3fvARB) +#define glMultiTexCoord3iARB GLEW_GET_FUN(__glewMultiTexCoord3iARB) +#define glMultiTexCoord3ivARB GLEW_GET_FUN(__glewMultiTexCoord3ivARB) +#define glMultiTexCoord3sARB GLEW_GET_FUN(__glewMultiTexCoord3sARB) +#define glMultiTexCoord3svARB GLEW_GET_FUN(__glewMultiTexCoord3svARB) +#define glMultiTexCoord4dARB GLEW_GET_FUN(__glewMultiTexCoord4dARB) +#define glMultiTexCoord4dvARB GLEW_GET_FUN(__glewMultiTexCoord4dvARB) +#define glMultiTexCoord4fARB GLEW_GET_FUN(__glewMultiTexCoord4fARB) +#define glMultiTexCoord4fvARB GLEW_GET_FUN(__glewMultiTexCoord4fvARB) +#define glMultiTexCoord4iARB GLEW_GET_FUN(__glewMultiTexCoord4iARB) +#define glMultiTexCoord4ivARB GLEW_GET_FUN(__glewMultiTexCoord4ivARB) +#define glMultiTexCoord4sARB GLEW_GET_FUN(__glewMultiTexCoord4sARB) +#define glMultiTexCoord4svARB GLEW_GET_FUN(__glewMultiTexCoord4svARB) + +#define GLEW_ARB_multitexture GLEW_GET_VAR(__GLEW_ARB_multitexture) + +#endif /* GL_ARB_multitexture */ + +/* ------------------------- GL_ARB_occlusion_query ------------------------ */ + +#ifndef GL_ARB_occlusion_query +#define GL_ARB_occlusion_query 1 + +#define GL_QUERY_COUNTER_BITS_ARB 0x8864 +#define GL_CURRENT_QUERY_ARB 0x8865 +#define GL_QUERY_RESULT_ARB 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 +#define GL_SAMPLES_PASSED_ARB 0x8914 + +typedef void (GLAPIENTRY * PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLENDQUERYARBPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISQUERYARBPROC) (GLuint id); + +#define glBeginQueryARB GLEW_GET_FUN(__glewBeginQueryARB) +#define glDeleteQueriesARB GLEW_GET_FUN(__glewDeleteQueriesARB) +#define glEndQueryARB GLEW_GET_FUN(__glewEndQueryARB) +#define glGenQueriesARB GLEW_GET_FUN(__glewGenQueriesARB) +#define glGetQueryObjectivARB GLEW_GET_FUN(__glewGetQueryObjectivARB) +#define glGetQueryObjectuivARB GLEW_GET_FUN(__glewGetQueryObjectuivARB) +#define glGetQueryivARB GLEW_GET_FUN(__glewGetQueryivARB) +#define glIsQueryARB GLEW_GET_FUN(__glewIsQueryARB) + +#define GLEW_ARB_occlusion_query GLEW_GET_VAR(__GLEW_ARB_occlusion_query) + +#endif /* GL_ARB_occlusion_query */ + +/* ------------------------ GL_ARB_occlusion_query2 ------------------------ */ + +#ifndef GL_ARB_occlusion_query2 +#define GL_ARB_occlusion_query2 1 + +#define GL_ANY_SAMPLES_PASSED 0x8C2F + +#define GLEW_ARB_occlusion_query2 GLEW_GET_VAR(__GLEW_ARB_occlusion_query2) + +#endif /* GL_ARB_occlusion_query2 */ + +/* ----------------------- GL_ARB_pixel_buffer_object ---------------------- */ + +#ifndef GL_ARB_pixel_buffer_object +#define GL_ARB_pixel_buffer_object 1 + +#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF + +#define GLEW_ARB_pixel_buffer_object GLEW_GET_VAR(__GLEW_ARB_pixel_buffer_object) + +#endif /* GL_ARB_pixel_buffer_object */ + +/* ------------------------ GL_ARB_point_parameters ------------------------ */ + +#ifndef GL_ARB_point_parameters +#define GL_ARB_point_parameters 1 + +#define GL_POINT_SIZE_MIN_ARB 0x8126 +#define GL_POINT_SIZE_MAX_ARB 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 + +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat* params); + +#define glPointParameterfARB GLEW_GET_FUN(__glewPointParameterfARB) +#define glPointParameterfvARB GLEW_GET_FUN(__glewPointParameterfvARB) + +#define GLEW_ARB_point_parameters GLEW_GET_VAR(__GLEW_ARB_point_parameters) + +#endif /* GL_ARB_point_parameters */ + +/* -------------------------- GL_ARB_point_sprite -------------------------- */ + +#ifndef GL_ARB_point_sprite +#define GL_ARB_point_sprite 1 + +#define GL_POINT_SPRITE_ARB 0x8861 +#define GL_COORD_REPLACE_ARB 0x8862 + +#define GLEW_ARB_point_sprite GLEW_GET_VAR(__GLEW_ARB_point_sprite) + +#endif /* GL_ARB_point_sprite */ + +/* ------------------------ GL_ARB_provoking_vertex ------------------------ */ + +#ifndef GL_ARB_provoking_vertex +#define GL_ARB_provoking_vertex 1 + +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C +#define GL_FIRST_VERTEX_CONVENTION 0x8E4D +#define GL_LAST_VERTEX_CONVENTION 0x8E4E +#define GL_PROVOKING_VERTEX 0x8E4F + +typedef void (GLAPIENTRY * PFNGLPROVOKINGVERTEXPROC) (GLenum mode); + +#define glProvokingVertex GLEW_GET_FUN(__glewProvokingVertex) + +#define GLEW_ARB_provoking_vertex GLEW_GET_VAR(__GLEW_ARB_provoking_vertex) + +#endif /* GL_ARB_provoking_vertex */ + +/* --------------------------- GL_ARB_robustness --------------------------- */ + +#ifndef GL_ARB_robustness +#define GL_ARB_robustness 1 + +#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004 +#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 +#define GL_GUILTY_CONTEXT_RESET_ARB 0x8253 +#define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255 +#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 +#define GL_NO_RESET_NOTIFICATION_ARB 0x8261 + +typedef void (GLAPIENTRY * PFNGLGETNCOLORTABLEARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* table); +typedef void (GLAPIENTRY * PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, void* img); +typedef void (GLAPIENTRY * PFNGLGETNCONVOLUTIONFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* image); +typedef void (GLAPIENTRY * PFNGLGETNHISTOGRAMARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values); +typedef void (GLAPIENTRY * PFNGLGETNMAPDVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble* v); +typedef void (GLAPIENTRY * PFNGLGETNMAPFVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat* v); +typedef void (GLAPIENTRY * PFNGLGETNMAPIVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint* v); +typedef void (GLAPIENTRY * PFNGLGETNMINMAXARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values); +typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPFVARBPROC) (GLenum map, GLsizei bufSize, GLfloat* values); +typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPUIVARBPROC) (GLenum map, GLsizei bufSize, GLuint* values); +typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPUSVARBPROC) (GLenum map, GLsizei bufSize, GLushort* values); +typedef void (GLAPIENTRY * PFNGLGETNPOLYGONSTIPPLEARBPROC) (GLsizei bufSize, GLubyte* pattern); +typedef void (GLAPIENTRY * PFNGLGETNSEPARABLEFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void* row, GLsizei columnBufSize, GLvoid*column, GLvoid*span); +typedef void (GLAPIENTRY * PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* img); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint* params); +typedef void (GLAPIENTRY * PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void* data); + +#define glGetnColorTableARB GLEW_GET_FUN(__glewGetnColorTableARB) +#define glGetnCompressedTexImageARB GLEW_GET_FUN(__glewGetnCompressedTexImageARB) +#define glGetnConvolutionFilterARB GLEW_GET_FUN(__glewGetnConvolutionFilterARB) +#define glGetnHistogramARB GLEW_GET_FUN(__glewGetnHistogramARB) +#define glGetnMapdvARB GLEW_GET_FUN(__glewGetnMapdvARB) +#define glGetnMapfvARB GLEW_GET_FUN(__glewGetnMapfvARB) +#define glGetnMapivARB GLEW_GET_FUN(__glewGetnMapivARB) +#define glGetnMinmaxARB GLEW_GET_FUN(__glewGetnMinmaxARB) +#define glGetnPixelMapfvARB GLEW_GET_FUN(__glewGetnPixelMapfvARB) +#define glGetnPixelMapuivARB GLEW_GET_FUN(__glewGetnPixelMapuivARB) +#define glGetnPixelMapusvARB GLEW_GET_FUN(__glewGetnPixelMapusvARB) +#define glGetnPolygonStippleARB GLEW_GET_FUN(__glewGetnPolygonStippleARB) +#define glGetnSeparableFilterARB GLEW_GET_FUN(__glewGetnSeparableFilterARB) +#define glGetnTexImageARB GLEW_GET_FUN(__glewGetnTexImageARB) +#define glGetnUniformdvARB GLEW_GET_FUN(__glewGetnUniformdvARB) +#define glGetnUniformfvARB GLEW_GET_FUN(__glewGetnUniformfvARB) +#define glGetnUniformivARB GLEW_GET_FUN(__glewGetnUniformivARB) +#define glGetnUniformuivARB GLEW_GET_FUN(__glewGetnUniformuivARB) +#define glReadnPixelsARB GLEW_GET_FUN(__glewReadnPixelsARB) + +#define GLEW_ARB_robustness GLEW_GET_VAR(__GLEW_ARB_robustness) + +#endif /* GL_ARB_robustness */ + +/* ------------------------- GL_ARB_sample_shading ------------------------- */ + +#ifndef GL_ARB_sample_shading +#define GL_ARB_sample_shading 1 + +#define GL_SAMPLE_SHADING_ARB 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37 + +typedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGARBPROC) (GLclampf value); + +#define glMinSampleShadingARB GLEW_GET_FUN(__glewMinSampleShadingARB) + +#define GLEW_ARB_sample_shading GLEW_GET_VAR(__GLEW_ARB_sample_shading) + +#endif /* GL_ARB_sample_shading */ + +/* ------------------------- GL_ARB_sampler_objects ------------------------ */ + +#ifndef GL_ARB_sampler_objects +#define GL_ARB_sampler_objects 1 + +#define GL_SAMPLER_BINDING 0x8919 + +typedef void (GLAPIENTRY * PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); +typedef void (GLAPIENTRY * PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint * samplers); +typedef void (GLAPIENTRY * PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint* samplers); +typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISSAMPLERPROC) (GLuint sampler); +typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint* params); +typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint* params); + +#define glBindSampler GLEW_GET_FUN(__glewBindSampler) +#define glDeleteSamplers GLEW_GET_FUN(__glewDeleteSamplers) +#define glGenSamplers GLEW_GET_FUN(__glewGenSamplers) +#define glGetSamplerParameterIiv GLEW_GET_FUN(__glewGetSamplerParameterIiv) +#define glGetSamplerParameterIuiv GLEW_GET_FUN(__glewGetSamplerParameterIuiv) +#define glGetSamplerParameterfv GLEW_GET_FUN(__glewGetSamplerParameterfv) +#define glGetSamplerParameteriv GLEW_GET_FUN(__glewGetSamplerParameteriv) +#define glIsSampler GLEW_GET_FUN(__glewIsSampler) +#define glSamplerParameterIiv GLEW_GET_FUN(__glewSamplerParameterIiv) +#define glSamplerParameterIuiv GLEW_GET_FUN(__glewSamplerParameterIuiv) +#define glSamplerParameterf GLEW_GET_FUN(__glewSamplerParameterf) +#define glSamplerParameterfv GLEW_GET_FUN(__glewSamplerParameterfv) +#define glSamplerParameteri GLEW_GET_FUN(__glewSamplerParameteri) +#define glSamplerParameteriv GLEW_GET_FUN(__glewSamplerParameteriv) + +#define GLEW_ARB_sampler_objects GLEW_GET_VAR(__GLEW_ARB_sampler_objects) + +#endif /* GL_ARB_sampler_objects */ + +/* ------------------------ GL_ARB_seamless_cube_map ----------------------- */ + +#ifndef GL_ARB_seamless_cube_map +#define GL_ARB_seamless_cube_map 1 + +#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F + +#define GLEW_ARB_seamless_cube_map GLEW_GET_VAR(__GLEW_ARB_seamless_cube_map) + +#endif /* GL_ARB_seamless_cube_map */ + +/* --------------------- GL_ARB_separate_shader_objects -------------------- */ + +#ifndef GL_ARB_separate_shader_objects +#define GL_ARB_separate_shader_objects 1 + +#define GL_VERTEX_SHADER_BIT 0x00000001 +#define GL_FRAGMENT_SHADER_BIT 0x00000002 +#define GL_GEOMETRY_SHADER_BIT 0x00000004 +#define GL_TESS_CONTROL_SHADER_BIT 0x00000008 +#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 +#define GL_PROGRAM_SEPARABLE 0x8258 +#define GL_ACTIVE_PROGRAM 0x8259 +#define GL_PROGRAM_PIPELINE_BINDING 0x825A +#define GL_ALL_SHADER_BITS 0xFFFFFFFF + +typedef void (GLAPIENTRY * PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); +typedef void (GLAPIENTRY * PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const char ** strings); +typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint* pipelines); +typedef void (GLAPIENTRY * PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint* pipelines); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei* length, char *infoLog); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint x, GLuint y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint x, GLuint y, GLuint z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); +typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); + +#define glActiveShaderProgram GLEW_GET_FUN(__glewActiveShaderProgram) +#define glBindProgramPipeline GLEW_GET_FUN(__glewBindProgramPipeline) +#define glCreateShaderProgramv GLEW_GET_FUN(__glewCreateShaderProgramv) +#define glDeleteProgramPipelines GLEW_GET_FUN(__glewDeleteProgramPipelines) +#define glGenProgramPipelines GLEW_GET_FUN(__glewGenProgramPipelines) +#define glGetProgramPipelineInfoLog GLEW_GET_FUN(__glewGetProgramPipelineInfoLog) +#define glGetProgramPipelineiv GLEW_GET_FUN(__glewGetProgramPipelineiv) +#define glIsProgramPipeline GLEW_GET_FUN(__glewIsProgramPipeline) +#define glProgramUniform1d GLEW_GET_FUN(__glewProgramUniform1d) +#define glProgramUniform1dv GLEW_GET_FUN(__glewProgramUniform1dv) +#define glProgramUniform1f GLEW_GET_FUN(__glewProgramUniform1f) +#define glProgramUniform1fv GLEW_GET_FUN(__glewProgramUniform1fv) +#define glProgramUniform1i GLEW_GET_FUN(__glewProgramUniform1i) +#define glProgramUniform1iv GLEW_GET_FUN(__glewProgramUniform1iv) +#define glProgramUniform1ui GLEW_GET_FUN(__glewProgramUniform1ui) +#define glProgramUniform1uiv GLEW_GET_FUN(__glewProgramUniform1uiv) +#define glProgramUniform2d GLEW_GET_FUN(__glewProgramUniform2d) +#define glProgramUniform2dv GLEW_GET_FUN(__glewProgramUniform2dv) +#define glProgramUniform2f GLEW_GET_FUN(__glewProgramUniform2f) +#define glProgramUniform2fv GLEW_GET_FUN(__glewProgramUniform2fv) +#define glProgramUniform2i GLEW_GET_FUN(__glewProgramUniform2i) +#define glProgramUniform2iv GLEW_GET_FUN(__glewProgramUniform2iv) +#define glProgramUniform2ui GLEW_GET_FUN(__glewProgramUniform2ui) +#define glProgramUniform2uiv GLEW_GET_FUN(__glewProgramUniform2uiv) +#define glProgramUniform3d GLEW_GET_FUN(__glewProgramUniform3d) +#define glProgramUniform3dv GLEW_GET_FUN(__glewProgramUniform3dv) +#define glProgramUniform3f GLEW_GET_FUN(__glewProgramUniform3f) +#define glProgramUniform3fv GLEW_GET_FUN(__glewProgramUniform3fv) +#define glProgramUniform3i GLEW_GET_FUN(__glewProgramUniform3i) +#define glProgramUniform3iv GLEW_GET_FUN(__glewProgramUniform3iv) +#define glProgramUniform3ui GLEW_GET_FUN(__glewProgramUniform3ui) +#define glProgramUniform3uiv GLEW_GET_FUN(__glewProgramUniform3uiv) +#define glProgramUniform4d GLEW_GET_FUN(__glewProgramUniform4d) +#define glProgramUniform4dv GLEW_GET_FUN(__glewProgramUniform4dv) +#define glProgramUniform4f GLEW_GET_FUN(__glewProgramUniform4f) +#define glProgramUniform4fv GLEW_GET_FUN(__glewProgramUniform4fv) +#define glProgramUniform4i GLEW_GET_FUN(__glewProgramUniform4i) +#define glProgramUniform4iv GLEW_GET_FUN(__glewProgramUniform4iv) +#define glProgramUniform4ui GLEW_GET_FUN(__glewProgramUniform4ui) +#define glProgramUniform4uiv GLEW_GET_FUN(__glewProgramUniform4uiv) +#define glProgramUniformMatrix2dv GLEW_GET_FUN(__glewProgramUniformMatrix2dv) +#define glProgramUniformMatrix2fv GLEW_GET_FUN(__glewProgramUniformMatrix2fv) +#define glProgramUniformMatrix2x3dv GLEW_GET_FUN(__glewProgramUniformMatrix2x3dv) +#define glProgramUniformMatrix2x3fv GLEW_GET_FUN(__glewProgramUniformMatrix2x3fv) +#define glProgramUniformMatrix2x4dv GLEW_GET_FUN(__glewProgramUniformMatrix2x4dv) +#define glProgramUniformMatrix2x4fv GLEW_GET_FUN(__glewProgramUniformMatrix2x4fv) +#define glProgramUniformMatrix3dv GLEW_GET_FUN(__glewProgramUniformMatrix3dv) +#define glProgramUniformMatrix3fv GLEW_GET_FUN(__glewProgramUniformMatrix3fv) +#define glProgramUniformMatrix3x2dv GLEW_GET_FUN(__glewProgramUniformMatrix3x2dv) +#define glProgramUniformMatrix3x2fv GLEW_GET_FUN(__glewProgramUniformMatrix3x2fv) +#define glProgramUniformMatrix3x4dv GLEW_GET_FUN(__glewProgramUniformMatrix3x4dv) +#define glProgramUniformMatrix3x4fv GLEW_GET_FUN(__glewProgramUniformMatrix3x4fv) +#define glProgramUniformMatrix4dv GLEW_GET_FUN(__glewProgramUniformMatrix4dv) +#define glProgramUniformMatrix4fv GLEW_GET_FUN(__glewProgramUniformMatrix4fv) +#define glProgramUniformMatrix4x2dv GLEW_GET_FUN(__glewProgramUniformMatrix4x2dv) +#define glProgramUniformMatrix4x2fv GLEW_GET_FUN(__glewProgramUniformMatrix4x2fv) +#define glProgramUniformMatrix4x3dv GLEW_GET_FUN(__glewProgramUniformMatrix4x3dv) +#define glProgramUniformMatrix4x3fv GLEW_GET_FUN(__glewProgramUniformMatrix4x3fv) +#define glUseProgramStages GLEW_GET_FUN(__glewUseProgramStages) +#define glValidateProgramPipeline GLEW_GET_FUN(__glewValidateProgramPipeline) + +#define GLEW_ARB_separate_shader_objects GLEW_GET_VAR(__GLEW_ARB_separate_shader_objects) + +#endif /* GL_ARB_separate_shader_objects */ + +/* ----------------------- GL_ARB_shader_bit_encoding ---------------------- */ + +#ifndef GL_ARB_shader_bit_encoding +#define GL_ARB_shader_bit_encoding 1 + +#define GLEW_ARB_shader_bit_encoding GLEW_GET_VAR(__GLEW_ARB_shader_bit_encoding) + +#endif /* GL_ARB_shader_bit_encoding */ + +/* ------------------------- GL_ARB_shader_objects ------------------------- */ + +#ifndef GL_ARB_shader_objects +#define GL_ARB_shader_objects 1 + +#define GL_PROGRAM_OBJECT_ARB 0x8B40 +#define GL_SHADER_OBJECT_ARB 0x8B48 +#define GL_OBJECT_TYPE_ARB 0x8B4E +#define GL_OBJECT_SUBTYPE_ARB 0x8B4F +#define GL_FLOAT_VEC2_ARB 0x8B50 +#define GL_FLOAT_VEC3_ARB 0x8B51 +#define GL_FLOAT_VEC4_ARB 0x8B52 +#define GL_INT_VEC2_ARB 0x8B53 +#define GL_INT_VEC3_ARB 0x8B54 +#define GL_INT_VEC4_ARB 0x8B55 +#define GL_BOOL_ARB 0x8B56 +#define GL_BOOL_VEC2_ARB 0x8B57 +#define GL_BOOL_VEC3_ARB 0x8B58 +#define GL_BOOL_VEC4_ARB 0x8B59 +#define GL_FLOAT_MAT2_ARB 0x8B5A +#define GL_FLOAT_MAT3_ARB 0x8B5B +#define GL_FLOAT_MAT4_ARB 0x8B5C +#define GL_SAMPLER_1D_ARB 0x8B5D +#define GL_SAMPLER_2D_ARB 0x8B5E +#define GL_SAMPLER_3D_ARB 0x8B5F +#define GL_SAMPLER_CUBE_ARB 0x8B60 +#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 +#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 +#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 +#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 +#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 +#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 +#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 +#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 +#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 +#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 +#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 + +typedef char GLcharARB; +typedef unsigned int GLhandleARB; + +typedef void (GLAPIENTRY * PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); +typedef void (GLAPIENTRY * PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); +typedef GLhandleARB (GLAPIENTRY * PFNGLCREATEPROGRAMOBJECTARBPROC) (void); +typedef GLhandleARB (GLAPIENTRY * PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); +typedef void (GLAPIENTRY * PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); +typedef void (GLAPIENTRY * PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); +typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name); +typedef void (GLAPIENTRY * PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei* count, GLhandleARB *obj); +typedef GLhandleARB (GLAPIENTRY * PFNGLGETHANDLEARBPROC) (GLenum pname); +typedef void (GLAPIENTRY * PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *infoLog); +typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *source); +typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint* params); +typedef void (GLAPIENTRY * PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (GLAPIENTRY * PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB ** string, const GLint *length); +typedef void (GLAPIENTRY * PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); +typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); + +#define glAttachObjectARB GLEW_GET_FUN(__glewAttachObjectARB) +#define glCompileShaderARB GLEW_GET_FUN(__glewCompileShaderARB) +#define glCreateProgramObjectARB GLEW_GET_FUN(__glewCreateProgramObjectARB) +#define glCreateShaderObjectARB GLEW_GET_FUN(__glewCreateShaderObjectARB) +#define glDeleteObjectARB GLEW_GET_FUN(__glewDeleteObjectARB) +#define glDetachObjectARB GLEW_GET_FUN(__glewDetachObjectARB) +#define glGetActiveUniformARB GLEW_GET_FUN(__glewGetActiveUniformARB) +#define glGetAttachedObjectsARB GLEW_GET_FUN(__glewGetAttachedObjectsARB) +#define glGetHandleARB GLEW_GET_FUN(__glewGetHandleARB) +#define glGetInfoLogARB GLEW_GET_FUN(__glewGetInfoLogARB) +#define glGetObjectParameterfvARB GLEW_GET_FUN(__glewGetObjectParameterfvARB) +#define glGetObjectParameterivARB GLEW_GET_FUN(__glewGetObjectParameterivARB) +#define glGetShaderSourceARB GLEW_GET_FUN(__glewGetShaderSourceARB) +#define glGetUniformLocationARB GLEW_GET_FUN(__glewGetUniformLocationARB) +#define glGetUniformfvARB GLEW_GET_FUN(__glewGetUniformfvARB) +#define glGetUniformivARB GLEW_GET_FUN(__glewGetUniformivARB) +#define glLinkProgramARB GLEW_GET_FUN(__glewLinkProgramARB) +#define glShaderSourceARB GLEW_GET_FUN(__glewShaderSourceARB) +#define glUniform1fARB GLEW_GET_FUN(__glewUniform1fARB) +#define glUniform1fvARB GLEW_GET_FUN(__glewUniform1fvARB) +#define glUniform1iARB GLEW_GET_FUN(__glewUniform1iARB) +#define glUniform1ivARB GLEW_GET_FUN(__glewUniform1ivARB) +#define glUniform2fARB GLEW_GET_FUN(__glewUniform2fARB) +#define glUniform2fvARB GLEW_GET_FUN(__glewUniform2fvARB) +#define glUniform2iARB GLEW_GET_FUN(__glewUniform2iARB) +#define glUniform2ivARB GLEW_GET_FUN(__glewUniform2ivARB) +#define glUniform3fARB GLEW_GET_FUN(__glewUniform3fARB) +#define glUniform3fvARB GLEW_GET_FUN(__glewUniform3fvARB) +#define glUniform3iARB GLEW_GET_FUN(__glewUniform3iARB) +#define glUniform3ivARB GLEW_GET_FUN(__glewUniform3ivARB) +#define glUniform4fARB GLEW_GET_FUN(__glewUniform4fARB) +#define glUniform4fvARB GLEW_GET_FUN(__glewUniform4fvARB) +#define glUniform4iARB GLEW_GET_FUN(__glewUniform4iARB) +#define glUniform4ivARB GLEW_GET_FUN(__glewUniform4ivARB) +#define glUniformMatrix2fvARB GLEW_GET_FUN(__glewUniformMatrix2fvARB) +#define glUniformMatrix3fvARB GLEW_GET_FUN(__glewUniformMatrix3fvARB) +#define glUniformMatrix4fvARB GLEW_GET_FUN(__glewUniformMatrix4fvARB) +#define glUseProgramObjectARB GLEW_GET_FUN(__glewUseProgramObjectARB) +#define glValidateProgramARB GLEW_GET_FUN(__glewValidateProgramARB) + +#define GLEW_ARB_shader_objects GLEW_GET_VAR(__GLEW_ARB_shader_objects) + +#endif /* GL_ARB_shader_objects */ + +/* ------------------------ GL_ARB_shader_precision ------------------------ */ + +#ifndef GL_ARB_shader_precision +#define GL_ARB_shader_precision 1 + +#define GLEW_ARB_shader_precision GLEW_GET_VAR(__GLEW_ARB_shader_precision) + +#endif /* GL_ARB_shader_precision */ + +/* ---------------------- GL_ARB_shader_stencil_export --------------------- */ + +#ifndef GL_ARB_shader_stencil_export +#define GL_ARB_shader_stencil_export 1 + +#define GLEW_ARB_shader_stencil_export GLEW_GET_VAR(__GLEW_ARB_shader_stencil_export) + +#endif /* GL_ARB_shader_stencil_export */ + +/* ------------------------ GL_ARB_shader_subroutine ----------------------- */ + +#ifndef GL_ARB_shader_subroutine +#define GL_ARB_shader_subroutine 1 + +#define GL_ACTIVE_SUBROUTINES 0x8DE5 +#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 +#define GL_MAX_SUBROUTINES 0x8DE7 +#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 +#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 +#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A +#define GL_COMPATIBLE_SUBROUTINES 0x8E4B + +typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, char *name); +typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, char *name); +typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint* values); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint* values); +typedef GLuint (GLAPIENTRY * PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const char* name); +typedef GLint (GLAPIENTRY * PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const char* name); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint* params); +typedef void (GLAPIENTRY * PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint* indices); + +#define glGetActiveSubroutineName GLEW_GET_FUN(__glewGetActiveSubroutineName) +#define glGetActiveSubroutineUniformName GLEW_GET_FUN(__glewGetActiveSubroutineUniformName) +#define glGetActiveSubroutineUniformiv GLEW_GET_FUN(__glewGetActiveSubroutineUniformiv) +#define glGetProgramStageiv GLEW_GET_FUN(__glewGetProgramStageiv) +#define glGetSubroutineIndex GLEW_GET_FUN(__glewGetSubroutineIndex) +#define glGetSubroutineUniformLocation GLEW_GET_FUN(__glewGetSubroutineUniformLocation) +#define glGetUniformSubroutineuiv GLEW_GET_FUN(__glewGetUniformSubroutineuiv) +#define glUniformSubroutinesuiv GLEW_GET_FUN(__glewUniformSubroutinesuiv) + +#define GLEW_ARB_shader_subroutine GLEW_GET_VAR(__GLEW_ARB_shader_subroutine) + +#endif /* GL_ARB_shader_subroutine */ + +/* ----------------------- GL_ARB_shader_texture_lod ----------------------- */ + +#ifndef GL_ARB_shader_texture_lod +#define GL_ARB_shader_texture_lod 1 + +#define GLEW_ARB_shader_texture_lod GLEW_GET_VAR(__GLEW_ARB_shader_texture_lod) + +#endif /* GL_ARB_shader_texture_lod */ + +/* ---------------------- GL_ARB_shading_language_100 ---------------------- */ + +#ifndef GL_ARB_shading_language_100 +#define GL_ARB_shading_language_100 1 + +#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C + +#define GLEW_ARB_shading_language_100 GLEW_GET_VAR(__GLEW_ARB_shading_language_100) + +#endif /* GL_ARB_shading_language_100 */ + +/* -------------------- GL_ARB_shading_language_include -------------------- */ + +#ifndef GL_ARB_shading_language_include +#define GL_ARB_shading_language_include 1 + +#define GL_SHADER_INCLUDE_ARB 0x8DAE +#define GL_NAMED_STRING_LENGTH_ARB 0x8DE9 +#define GL_NAMED_STRING_TYPE_ARB 0x8DEA + +typedef void (GLAPIENTRY * PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const char ** path, const GLint *length); +typedef void (GLAPIENTRY * PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const char* name); +typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const char* name, GLsizei bufSize, GLint *stringlen, char *string); +typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const char* name, GLenum pname, GLint *params); +typedef GLboolean (GLAPIENTRY * PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const char* name); +typedef void (GLAPIENTRY * PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const char* name, GLint stringlen, const char *string); + +#define glCompileShaderIncludeARB GLEW_GET_FUN(__glewCompileShaderIncludeARB) +#define glDeleteNamedStringARB GLEW_GET_FUN(__glewDeleteNamedStringARB) +#define glGetNamedStringARB GLEW_GET_FUN(__glewGetNamedStringARB) +#define glGetNamedStringivARB GLEW_GET_FUN(__glewGetNamedStringivARB) +#define glIsNamedStringARB GLEW_GET_FUN(__glewIsNamedStringARB) +#define glNamedStringARB GLEW_GET_FUN(__glewNamedStringARB) + +#define GLEW_ARB_shading_language_include GLEW_GET_VAR(__GLEW_ARB_shading_language_include) + +#endif /* GL_ARB_shading_language_include */ + +/* ----------------------------- GL_ARB_shadow ----------------------------- */ + +#ifndef GL_ARB_shadow +#define GL_ARB_shadow 1 + +#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C +#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D +#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E + +#define GLEW_ARB_shadow GLEW_GET_VAR(__GLEW_ARB_shadow) + +#endif /* GL_ARB_shadow */ + +/* ------------------------- GL_ARB_shadow_ambient ------------------------- */ + +#ifndef GL_ARB_shadow_ambient +#define GL_ARB_shadow_ambient 1 + +#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF + +#define GLEW_ARB_shadow_ambient GLEW_GET_VAR(__GLEW_ARB_shadow_ambient) + +#endif /* GL_ARB_shadow_ambient */ + +/* ------------------------------ GL_ARB_sync ------------------------------ */ + +#ifndef GL_ARB_sync +#define GL_ARB_sync 1 + +#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 +#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 +#define GL_OBJECT_TYPE 0x9112 +#define GL_SYNC_CONDITION 0x9113 +#define GL_SYNC_STATUS 0x9114 +#define GL_SYNC_FLAGS 0x9115 +#define GL_SYNC_FENCE 0x9116 +#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 +#define GL_UNSIGNALED 0x9118 +#define GL_SIGNALED 0x9119 +#define GL_ALREADY_SIGNALED 0x911A +#define GL_TIMEOUT_EXPIRED 0x911B +#define GL_CONDITION_SATISFIED 0x911C +#define GL_WAIT_FAILED 0x911D +#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFF + +typedef GLenum (GLAPIENTRY * PFNGLCLIENTWAITSYNCPROC) (GLsync GLsync,GLbitfield flags,GLuint64 timeout); +typedef void (GLAPIENTRY * PFNGLDELETESYNCPROC) (GLsync GLsync); +typedef GLsync (GLAPIENTRY * PFNGLFENCESYNCPROC) (GLenum condition,GLbitfield flags); +typedef void (GLAPIENTRY * PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64* params); +typedef void (GLAPIENTRY * PFNGLGETSYNCIVPROC) (GLsync GLsync,GLenum pname,GLsizei bufSize,GLsizei* length, GLint *values); +typedef GLboolean (GLAPIENTRY * PFNGLISSYNCPROC) (GLsync GLsync); +typedef void (GLAPIENTRY * PFNGLWAITSYNCPROC) (GLsync GLsync,GLbitfield flags,GLuint64 timeout); + +#define glClientWaitSync GLEW_GET_FUN(__glewClientWaitSync) +#define glDeleteSync GLEW_GET_FUN(__glewDeleteSync) +#define glFenceSync GLEW_GET_FUN(__glewFenceSync) +#define glGetInteger64v GLEW_GET_FUN(__glewGetInteger64v) +#define glGetSynciv GLEW_GET_FUN(__glewGetSynciv) +#define glIsSync GLEW_GET_FUN(__glewIsSync) +#define glWaitSync GLEW_GET_FUN(__glewWaitSync) + +#define GLEW_ARB_sync GLEW_GET_VAR(__GLEW_ARB_sync) + +#endif /* GL_ARB_sync */ + +/* ----------------------- GL_ARB_tessellation_shader ---------------------- */ + +#ifndef GL_ARB_tessellation_shader +#define GL_ARB_tessellation_shader 1 + +#define GL_PATCHES 0xE +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 +#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C +#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D +#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E +#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F +#define GL_PATCH_VERTICES 0x8E72 +#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 +#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 +#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 +#define GL_TESS_GEN_MODE 0x8E76 +#define GL_TESS_GEN_SPACING 0x8E77 +#define GL_TESS_GEN_VERTEX_ORDER 0x8E78 +#define GL_TESS_GEN_POINT_MODE 0x8E79 +#define GL_ISOLINES 0x8E7A +#define GL_FRACTIONAL_ODD 0x8E7B +#define GL_FRACTIONAL_EVEN 0x8E7C +#define GL_MAX_PATCH_VERTICES 0x8E7D +#define GL_MAX_TESS_GEN_LEVEL 0x8E7E +#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F +#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 +#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 +#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 +#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 +#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 +#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 +#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 +#define GL_TESS_EVALUATION_SHADER 0x8E87 +#define GL_TESS_CONTROL_SHADER 0x8E88 +#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 +#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A + +typedef void (GLAPIENTRY * PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat* values); +typedef void (GLAPIENTRY * PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); + +#define glPatchParameterfv GLEW_GET_FUN(__glewPatchParameterfv) +#define glPatchParameteri GLEW_GET_FUN(__glewPatchParameteri) + +#define GLEW_ARB_tessellation_shader GLEW_GET_VAR(__GLEW_ARB_tessellation_shader) + +#endif /* GL_ARB_tessellation_shader */ + +/* ---------------------- GL_ARB_texture_border_clamp ---------------------- */ + +#ifndef GL_ARB_texture_border_clamp +#define GL_ARB_texture_border_clamp 1 + +#define GL_CLAMP_TO_BORDER_ARB 0x812D + +#define GLEW_ARB_texture_border_clamp GLEW_GET_VAR(__GLEW_ARB_texture_border_clamp) + +#endif /* GL_ARB_texture_border_clamp */ + +/* ---------------------- GL_ARB_texture_buffer_object --------------------- */ + +#ifndef GL_ARB_texture_buffer_object +#define GL_ARB_texture_buffer_object 1 + +#define GL_TEXTURE_BUFFER_ARB 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E + +typedef void (GLAPIENTRY * PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer); + +#define glTexBufferARB GLEW_GET_FUN(__glewTexBufferARB) + +#define GLEW_ARB_texture_buffer_object GLEW_GET_VAR(__GLEW_ARB_texture_buffer_object) + +#endif /* GL_ARB_texture_buffer_object */ + +/* ------------------- GL_ARB_texture_buffer_object_rgb32 ------------------ */ + +#ifndef GL_ARB_texture_buffer_object_rgb32 +#define GL_ARB_texture_buffer_object_rgb32 1 + +#define GLEW_ARB_texture_buffer_object_rgb32 GLEW_GET_VAR(__GLEW_ARB_texture_buffer_object_rgb32) + +#endif /* GL_ARB_texture_buffer_object_rgb32 */ + +/* ----------------------- GL_ARB_texture_compression ---------------------- */ + +#ifndef GL_ARB_texture_compression +#define GL_ARB_texture_compression 1 + +#define GL_COMPRESSED_ALPHA_ARB 0x84E9 +#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB +#define GL_COMPRESSED_INTENSITY_ARB 0x84EC +#define GL_COMPRESSED_RGB_ARB 0x84ED +#define GL_COMPRESSED_RGBA_ARB 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 +#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 + +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, void* img); + +#define glCompressedTexImage1DARB GLEW_GET_FUN(__glewCompressedTexImage1DARB) +#define glCompressedTexImage2DARB GLEW_GET_FUN(__glewCompressedTexImage2DARB) +#define glCompressedTexImage3DARB GLEW_GET_FUN(__glewCompressedTexImage3DARB) +#define glCompressedTexSubImage1DARB GLEW_GET_FUN(__glewCompressedTexSubImage1DARB) +#define glCompressedTexSubImage2DARB GLEW_GET_FUN(__glewCompressedTexSubImage2DARB) +#define glCompressedTexSubImage3DARB GLEW_GET_FUN(__glewCompressedTexSubImage3DARB) +#define glGetCompressedTexImageARB GLEW_GET_FUN(__glewGetCompressedTexImageARB) + +#define GLEW_ARB_texture_compression GLEW_GET_VAR(__GLEW_ARB_texture_compression) + +#endif /* GL_ARB_texture_compression */ + +/* -------------------- GL_ARB_texture_compression_bptc -------------------- */ + +#ifndef GL_ARB_texture_compression_bptc +#define GL_ARB_texture_compression_bptc 1 + +#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F + +#define GLEW_ARB_texture_compression_bptc GLEW_GET_VAR(__GLEW_ARB_texture_compression_bptc) + +#endif /* GL_ARB_texture_compression_bptc */ + +/* -------------------- GL_ARB_texture_compression_rgtc -------------------- */ + +#ifndef GL_ARB_texture_compression_rgtc +#define GL_ARB_texture_compression_rgtc 1 + +#define GL_COMPRESSED_RED_RGTC1 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC +#define GL_COMPRESSED_RG_RGTC2 0x8DBD +#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE + +#define GLEW_ARB_texture_compression_rgtc GLEW_GET_VAR(__GLEW_ARB_texture_compression_rgtc) + +#endif /* GL_ARB_texture_compression_rgtc */ + +/* ------------------------ GL_ARB_texture_cube_map ------------------------ */ + +#ifndef GL_ARB_texture_cube_map +#define GL_ARB_texture_cube_map 1 + +#define GL_NORMAL_MAP_ARB 0x8511 +#define GL_REFLECTION_MAP_ARB 0x8512 +#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C + +#define GLEW_ARB_texture_cube_map GLEW_GET_VAR(__GLEW_ARB_texture_cube_map) + +#endif /* GL_ARB_texture_cube_map */ + +/* --------------------- GL_ARB_texture_cube_map_array --------------------- */ + +#ifndef GL_ARB_texture_cube_map_array +#define GL_ARB_texture_cube_map_array 1 + +#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B +#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F + +#define GLEW_ARB_texture_cube_map_array GLEW_GET_VAR(__GLEW_ARB_texture_cube_map_array) + +#endif /* GL_ARB_texture_cube_map_array */ + +/* ------------------------- GL_ARB_texture_env_add ------------------------ */ + +#ifndef GL_ARB_texture_env_add +#define GL_ARB_texture_env_add 1 + +#define GLEW_ARB_texture_env_add GLEW_GET_VAR(__GLEW_ARB_texture_env_add) + +#endif /* GL_ARB_texture_env_add */ + +/* ----------------------- GL_ARB_texture_env_combine ---------------------- */ + +#ifndef GL_ARB_texture_env_combine +#define GL_ARB_texture_env_combine 1 + +#define GL_SUBTRACT_ARB 0x84E7 +#define GL_COMBINE_ARB 0x8570 +#define GL_COMBINE_RGB_ARB 0x8571 +#define GL_COMBINE_ALPHA_ARB 0x8572 +#define GL_RGB_SCALE_ARB 0x8573 +#define GL_ADD_SIGNED_ARB 0x8574 +#define GL_INTERPOLATE_ARB 0x8575 +#define GL_CONSTANT_ARB 0x8576 +#define GL_PRIMARY_COLOR_ARB 0x8577 +#define GL_PREVIOUS_ARB 0x8578 +#define GL_SOURCE0_RGB_ARB 0x8580 +#define GL_SOURCE1_RGB_ARB 0x8581 +#define GL_SOURCE2_RGB_ARB 0x8582 +#define GL_SOURCE0_ALPHA_ARB 0x8588 +#define GL_SOURCE1_ALPHA_ARB 0x8589 +#define GL_SOURCE2_ALPHA_ARB 0x858A +#define GL_OPERAND0_RGB_ARB 0x8590 +#define GL_OPERAND1_RGB_ARB 0x8591 +#define GL_OPERAND2_RGB_ARB 0x8592 +#define GL_OPERAND0_ALPHA_ARB 0x8598 +#define GL_OPERAND1_ALPHA_ARB 0x8599 +#define GL_OPERAND2_ALPHA_ARB 0x859A + +#define GLEW_ARB_texture_env_combine GLEW_GET_VAR(__GLEW_ARB_texture_env_combine) + +#endif /* GL_ARB_texture_env_combine */ + +/* ---------------------- GL_ARB_texture_env_crossbar ---------------------- */ + +#ifndef GL_ARB_texture_env_crossbar +#define GL_ARB_texture_env_crossbar 1 + +#define GLEW_ARB_texture_env_crossbar GLEW_GET_VAR(__GLEW_ARB_texture_env_crossbar) + +#endif /* GL_ARB_texture_env_crossbar */ + +/* ------------------------ GL_ARB_texture_env_dot3 ------------------------ */ + +#ifndef GL_ARB_texture_env_dot3 +#define GL_ARB_texture_env_dot3 1 + +#define GL_DOT3_RGB_ARB 0x86AE +#define GL_DOT3_RGBA_ARB 0x86AF + +#define GLEW_ARB_texture_env_dot3 GLEW_GET_VAR(__GLEW_ARB_texture_env_dot3) + +#endif /* GL_ARB_texture_env_dot3 */ + +/* -------------------------- GL_ARB_texture_float ------------------------- */ + +#ifndef GL_ARB_texture_float +#define GL_ARB_texture_float 1 + +#define GL_RGBA32F_ARB 0x8814 +#define GL_RGB32F_ARB 0x8815 +#define GL_ALPHA32F_ARB 0x8816 +#define GL_INTENSITY32F_ARB 0x8817 +#define GL_LUMINANCE32F_ARB 0x8818 +#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 +#define GL_RGBA16F_ARB 0x881A +#define GL_RGB16F_ARB 0x881B +#define GL_ALPHA16F_ARB 0x881C +#define GL_INTENSITY16F_ARB 0x881D +#define GL_LUMINANCE16F_ARB 0x881E +#define GL_LUMINANCE_ALPHA16F_ARB 0x881F +#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 +#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 +#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 +#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 +#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 +#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 + +#define GLEW_ARB_texture_float GLEW_GET_VAR(__GLEW_ARB_texture_float) + +#endif /* GL_ARB_texture_float */ + +/* ------------------------- GL_ARB_texture_gather ------------------------- */ + +#ifndef GL_ARB_texture_gather +#define GL_ARB_texture_gather 1 + +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F +#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F + +#define GLEW_ARB_texture_gather GLEW_GET_VAR(__GLEW_ARB_texture_gather) + +#endif /* GL_ARB_texture_gather */ + +/* --------------------- GL_ARB_texture_mirrored_repeat -------------------- */ + +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_ARB_texture_mirrored_repeat 1 + +#define GL_MIRRORED_REPEAT_ARB 0x8370 + +#define GLEW_ARB_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_ARB_texture_mirrored_repeat) + +#endif /* GL_ARB_texture_mirrored_repeat */ + +/* ----------------------- GL_ARB_texture_multisample ---------------------- */ + +#ifndef GL_ARB_texture_multisample +#define GL_ARB_texture_multisample 1 + +#define GL_SAMPLE_POSITION 0x8E50 +#define GL_SAMPLE_MASK 0x8E51 +#define GL_SAMPLE_MASK_VALUE 0x8E52 +#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 +#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 +#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 +#define GL_TEXTURE_SAMPLES 0x9106 +#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 +#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 +#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A +#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B +#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D +#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E +#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F +#define GL_MAX_INTEGER_SAMPLES 0x9110 + +typedef void (GLAPIENTRY * PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat* val); +typedef void (GLAPIENTRY * PFNGLSAMPLEMASKIPROC) (GLuint index, GLbitfield mask); +typedef void (GLAPIENTRY * PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); + +#define glGetMultisamplefv GLEW_GET_FUN(__glewGetMultisamplefv) +#define glSampleMaski GLEW_GET_FUN(__glewSampleMaski) +#define glTexImage2DMultisample GLEW_GET_FUN(__glewTexImage2DMultisample) +#define glTexImage3DMultisample GLEW_GET_FUN(__glewTexImage3DMultisample) + +#define GLEW_ARB_texture_multisample GLEW_GET_VAR(__GLEW_ARB_texture_multisample) + +#endif /* GL_ARB_texture_multisample */ + +/* -------------------- GL_ARB_texture_non_power_of_two -------------------- */ + +#ifndef GL_ARB_texture_non_power_of_two +#define GL_ARB_texture_non_power_of_two 1 + +#define GLEW_ARB_texture_non_power_of_two GLEW_GET_VAR(__GLEW_ARB_texture_non_power_of_two) + +#endif /* GL_ARB_texture_non_power_of_two */ + +/* ------------------------ GL_ARB_texture_query_lod ----------------------- */ + +#ifndef GL_ARB_texture_query_lod +#define GL_ARB_texture_query_lod 1 + +#define GLEW_ARB_texture_query_lod GLEW_GET_VAR(__GLEW_ARB_texture_query_lod) + +#endif /* GL_ARB_texture_query_lod */ + +/* ------------------------ GL_ARB_texture_rectangle ----------------------- */ + +#ifndef GL_ARB_texture_rectangle +#define GL_ARB_texture_rectangle 1 + +#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 + +#define GLEW_ARB_texture_rectangle GLEW_GET_VAR(__GLEW_ARB_texture_rectangle) + +#endif /* GL_ARB_texture_rectangle */ + +/* --------------------------- GL_ARB_texture_rg --------------------------- */ + +#ifndef GL_ARB_texture_rg +#define GL_ARB_texture_rg 1 + +#define GL_RED 0x1903 +#define GL_COMPRESSED_RED 0x8225 +#define GL_COMPRESSED_RG 0x8226 +#define GL_RG 0x8227 +#define GL_RG_INTEGER 0x8228 +#define GL_R8 0x8229 +#define GL_R16 0x822A +#define GL_RG8 0x822B +#define GL_RG16 0x822C +#define GL_R16F 0x822D +#define GL_R32F 0x822E +#define GL_RG16F 0x822F +#define GL_RG32F 0x8230 +#define GL_R8I 0x8231 +#define GL_R8UI 0x8232 +#define GL_R16I 0x8233 +#define GL_R16UI 0x8234 +#define GL_R32I 0x8235 +#define GL_R32UI 0x8236 +#define GL_RG8I 0x8237 +#define GL_RG8UI 0x8238 +#define GL_RG16I 0x8239 +#define GL_RG16UI 0x823A +#define GL_RG32I 0x823B +#define GL_RG32UI 0x823C + +#define GLEW_ARB_texture_rg GLEW_GET_VAR(__GLEW_ARB_texture_rg) + +#endif /* GL_ARB_texture_rg */ + +/* ----------------------- GL_ARB_texture_rgb10_a2ui ----------------------- */ + +#ifndef GL_ARB_texture_rgb10_a2ui +#define GL_ARB_texture_rgb10_a2ui 1 + +#define GL_RGB10_A2UI 0x906F + +#define GLEW_ARB_texture_rgb10_a2ui GLEW_GET_VAR(__GLEW_ARB_texture_rgb10_a2ui) + +#endif /* GL_ARB_texture_rgb10_a2ui */ + +/* ------------------------- GL_ARB_texture_swizzle ------------------------ */ + +#ifndef GL_ARB_texture_swizzle +#define GL_ARB_texture_swizzle 1 + +#define GL_TEXTURE_SWIZZLE_R 0x8E42 +#define GL_TEXTURE_SWIZZLE_G 0x8E43 +#define GL_TEXTURE_SWIZZLE_B 0x8E44 +#define GL_TEXTURE_SWIZZLE_A 0x8E45 +#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 + +#define GLEW_ARB_texture_swizzle GLEW_GET_VAR(__GLEW_ARB_texture_swizzle) + +#endif /* GL_ARB_texture_swizzle */ + +/* --------------------------- GL_ARB_timer_query -------------------------- */ + +#ifndef GL_ARB_timer_query +#define GL_ARB_timer_query 1 + +#define GL_TIME_ELAPSED 0x88BF +#define GL_TIMESTAMP 0x8E28 + +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64* params); +typedef void (GLAPIENTRY * PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target); + +#define glGetQueryObjecti64v GLEW_GET_FUN(__glewGetQueryObjecti64v) +#define glGetQueryObjectui64v GLEW_GET_FUN(__glewGetQueryObjectui64v) +#define glQueryCounter GLEW_GET_FUN(__glewQueryCounter) + +#define GLEW_ARB_timer_query GLEW_GET_VAR(__GLEW_ARB_timer_query) + +#endif /* GL_ARB_timer_query */ + +/* ----------------------- GL_ARB_transform_feedback2 ---------------------- */ + +#ifndef GL_ARB_transform_feedback2 +#define GL_ARB_transform_feedback2 1 + +#define GL_TRANSFORM_FEEDBACK 0x8E22 +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 + +typedef void (GLAPIENTRY * PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id); +typedef void (GLAPIENTRY * PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint* ids); +typedef GLboolean (GLAPIENTRY * PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLPAUSETRANSFORMFEEDBACKPROC) (void); +typedef void (GLAPIENTRY * PFNGLRESUMETRANSFORMFEEDBACKPROC) (void); + +#define glBindTransformFeedback GLEW_GET_FUN(__glewBindTransformFeedback) +#define glDeleteTransformFeedbacks GLEW_GET_FUN(__glewDeleteTransformFeedbacks) +#define glDrawTransformFeedback GLEW_GET_FUN(__glewDrawTransformFeedback) +#define glGenTransformFeedbacks GLEW_GET_FUN(__glewGenTransformFeedbacks) +#define glIsTransformFeedback GLEW_GET_FUN(__glewIsTransformFeedback) +#define glPauseTransformFeedback GLEW_GET_FUN(__glewPauseTransformFeedback) +#define glResumeTransformFeedback GLEW_GET_FUN(__glewResumeTransformFeedback) + +#define GLEW_ARB_transform_feedback2 GLEW_GET_VAR(__GLEW_ARB_transform_feedback2) + +#endif /* GL_ARB_transform_feedback2 */ + +/* ----------------------- GL_ARB_transform_feedback3 ---------------------- */ + +#ifndef GL_ARB_transform_feedback3 +#define GL_ARB_transform_feedback3 1 + +#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 +#define GL_MAX_VERTEX_STREAMS 0x8E71 + +typedef void (GLAPIENTRY * PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id); +typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream); +typedef void (GLAPIENTRY * PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRY * PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params); + +#define glBeginQueryIndexed GLEW_GET_FUN(__glewBeginQueryIndexed) +#define glDrawTransformFeedbackStream GLEW_GET_FUN(__glewDrawTransformFeedbackStream) +#define glEndQueryIndexed GLEW_GET_FUN(__glewEndQueryIndexed) +#define glGetQueryIndexediv GLEW_GET_FUN(__glewGetQueryIndexediv) + +#define GLEW_ARB_transform_feedback3 GLEW_GET_VAR(__GLEW_ARB_transform_feedback3) + +#endif /* GL_ARB_transform_feedback3 */ + +/* ------------------------ GL_ARB_transpose_matrix ------------------------ */ + +#ifndef GL_ARB_transpose_matrix +#define GL_ARB_transpose_matrix 1 + +#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 + +typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]); +typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]); +typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]); +typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]); + +#define glLoadTransposeMatrixdARB GLEW_GET_FUN(__glewLoadTransposeMatrixdARB) +#define glLoadTransposeMatrixfARB GLEW_GET_FUN(__glewLoadTransposeMatrixfARB) +#define glMultTransposeMatrixdARB GLEW_GET_FUN(__glewMultTransposeMatrixdARB) +#define glMultTransposeMatrixfARB GLEW_GET_FUN(__glewMultTransposeMatrixfARB) + +#define GLEW_ARB_transpose_matrix GLEW_GET_VAR(__GLEW_ARB_transpose_matrix) + +#endif /* GL_ARB_transpose_matrix */ + +/* ---------------------- GL_ARB_uniform_buffer_object --------------------- */ + +#ifndef GL_ARB_uniform_buffer_object +#define GL_ARB_uniform_buffer_object 1 + +#define GL_UNIFORM_BUFFER 0x8A11 +#define GL_UNIFORM_BUFFER_BINDING 0x8A28 +#define GL_UNIFORM_BUFFER_START 0x8A29 +#define GL_UNIFORM_BUFFER_SIZE 0x8A2A +#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C +#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D +#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E +#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F +#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 +#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 +#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 +#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 +#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 +#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 +#define GL_UNIFORM_TYPE 0x8A37 +#define GL_UNIFORM_SIZE 0x8A38 +#define GL_UNIFORM_NAME_LENGTH 0x8A39 +#define GL_UNIFORM_BLOCK_INDEX 0x8A3A +#define GL_UNIFORM_OFFSET 0x8A3B +#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C +#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D +#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E +#define GL_UNIFORM_BLOCK_BINDING 0x8A3F +#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 +#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 +#define GL_INVALID_INDEX 0xFFFFFFFF + +typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, char* uniformBlockName); +typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei* length, char* uniformName); +typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint* data); +typedef GLuint (GLAPIENTRY * PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const char* uniformBlockName); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const char** uniformNames, GLuint* uniformIndices); +typedef void (GLAPIENTRY * PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); + +#define glBindBufferBase GLEW_GET_FUN(__glewBindBufferBase) +#define glBindBufferRange GLEW_GET_FUN(__glewBindBufferRange) +#define glGetActiveUniformBlockName GLEW_GET_FUN(__glewGetActiveUniformBlockName) +#define glGetActiveUniformBlockiv GLEW_GET_FUN(__glewGetActiveUniformBlockiv) +#define glGetActiveUniformName GLEW_GET_FUN(__glewGetActiveUniformName) +#define glGetActiveUniformsiv GLEW_GET_FUN(__glewGetActiveUniformsiv) +#define glGetIntegeri_v GLEW_GET_FUN(__glewGetIntegeri_v) +#define glGetUniformBlockIndex GLEW_GET_FUN(__glewGetUniformBlockIndex) +#define glGetUniformIndices GLEW_GET_FUN(__glewGetUniformIndices) +#define glUniformBlockBinding GLEW_GET_FUN(__glewUniformBlockBinding) + +#define GLEW_ARB_uniform_buffer_object GLEW_GET_VAR(__GLEW_ARB_uniform_buffer_object) + +#endif /* GL_ARB_uniform_buffer_object */ + +/* ------------------------ GL_ARB_vertex_array_bgra ----------------------- */ + +#ifndef GL_ARB_vertex_array_bgra +#define GL_ARB_vertex_array_bgra 1 + +#define GL_BGRA 0x80E1 + +#define GLEW_ARB_vertex_array_bgra GLEW_GET_VAR(__GLEW_ARB_vertex_array_bgra) + +#endif /* GL_ARB_vertex_array_bgra */ + +/* ----------------------- GL_ARB_vertex_array_object ---------------------- */ + +#ifndef GL_ARB_vertex_array_object +#define GL_ARB_vertex_array_object 1 + +#define GL_VERTEX_ARRAY_BINDING 0x85B5 + +typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYPROC) (GLuint array); +typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint* arrays); +typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint* arrays); +typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYPROC) (GLuint array); + +#define glBindVertexArray GLEW_GET_FUN(__glewBindVertexArray) +#define glDeleteVertexArrays GLEW_GET_FUN(__glewDeleteVertexArrays) +#define glGenVertexArrays GLEW_GET_FUN(__glewGenVertexArrays) +#define glIsVertexArray GLEW_GET_FUN(__glewIsVertexArray) + +#define GLEW_ARB_vertex_array_object GLEW_GET_VAR(__GLEW_ARB_vertex_array_object) + +#endif /* GL_ARB_vertex_array_object */ + +/* ----------------------- GL_ARB_vertex_attrib_64bit ---------------------- */ + +#ifndef GL_ARB_vertex_attrib_64bit +#define GL_ARB_vertex_attrib_64bit 1 + +#define GL_DOUBLE_MAT2 0x8F46 +#define GL_DOUBLE_MAT3 0x8F47 +#define GL_DOUBLE_MAT4 0x8F48 +#define GL_DOUBLE_VEC2 0x8FFC +#define GL_DOUBLE_VEC3 0x8FFD +#define GL_DOUBLE_VEC4 0x8FFE + +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer); + +#define glGetVertexAttribLdv GLEW_GET_FUN(__glewGetVertexAttribLdv) +#define glVertexAttribL1d GLEW_GET_FUN(__glewVertexAttribL1d) +#define glVertexAttribL1dv GLEW_GET_FUN(__glewVertexAttribL1dv) +#define glVertexAttribL2d GLEW_GET_FUN(__glewVertexAttribL2d) +#define glVertexAttribL2dv GLEW_GET_FUN(__glewVertexAttribL2dv) +#define glVertexAttribL3d GLEW_GET_FUN(__glewVertexAttribL3d) +#define glVertexAttribL3dv GLEW_GET_FUN(__glewVertexAttribL3dv) +#define glVertexAttribL4d GLEW_GET_FUN(__glewVertexAttribL4d) +#define glVertexAttribL4dv GLEW_GET_FUN(__glewVertexAttribL4dv) +#define glVertexAttribLPointer GLEW_GET_FUN(__glewVertexAttribLPointer) + +#define GLEW_ARB_vertex_attrib_64bit GLEW_GET_VAR(__GLEW_ARB_vertex_attrib_64bit) + +#endif /* GL_ARB_vertex_attrib_64bit */ + +/* -------------------------- GL_ARB_vertex_blend -------------------------- */ + +#ifndef GL_ARB_vertex_blend +#define GL_ARB_vertex_blend 1 + +#define GL_MODELVIEW0_ARB 0x1700 +#define GL_MODELVIEW1_ARB 0x850A +#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 +#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 +#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 +#define GL_VERTEX_BLEND_ARB 0x86A7 +#define GL_CURRENT_WEIGHT_ARB 0x86A8 +#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 +#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA +#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB +#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC +#define GL_WEIGHT_ARRAY_ARB 0x86AD +#define GL_MODELVIEW2_ARB 0x8722 +#define GL_MODELVIEW3_ARB 0x8723 +#define GL_MODELVIEW4_ARB 0x8724 +#define GL_MODELVIEW5_ARB 0x8725 +#define GL_MODELVIEW6_ARB 0x8726 +#define GL_MODELVIEW7_ARB 0x8727 +#define GL_MODELVIEW8_ARB 0x8728 +#define GL_MODELVIEW9_ARB 0x8729 +#define GL_MODELVIEW10_ARB 0x872A +#define GL_MODELVIEW11_ARB 0x872B +#define GL_MODELVIEW12_ARB 0x872C +#define GL_MODELVIEW13_ARB 0x872D +#define GL_MODELVIEW14_ARB 0x872E +#define GL_MODELVIEW15_ARB 0x872F +#define GL_MODELVIEW16_ARB 0x8730 +#define GL_MODELVIEW17_ARB 0x8731 +#define GL_MODELVIEW18_ARB 0x8732 +#define GL_MODELVIEW19_ARB 0x8733 +#define GL_MODELVIEW20_ARB 0x8734 +#define GL_MODELVIEW21_ARB 0x8735 +#define GL_MODELVIEW22_ARB 0x8736 +#define GL_MODELVIEW23_ARB 0x8737 +#define GL_MODELVIEW24_ARB 0x8738 +#define GL_MODELVIEW25_ARB 0x8739 +#define GL_MODELVIEW26_ARB 0x873A +#define GL_MODELVIEW27_ARB 0x873B +#define GL_MODELVIEW28_ARB 0x873C +#define GL_MODELVIEW29_ARB 0x873D +#define GL_MODELVIEW30_ARB 0x873E +#define GL_MODELVIEW31_ARB 0x873F + +typedef void (GLAPIENTRY * PFNGLVERTEXBLENDARBPROC) (GLint count); +typedef void (GLAPIENTRY * PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLWEIGHTBVARBPROC) (GLint size, GLbyte *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTDVARBPROC) (GLint size, GLdouble *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTFVARBPROC) (GLint size, GLfloat *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTIVARBPROC) (GLint size, GLint *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTSVARBPROC) (GLint size, GLshort *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTUBVARBPROC) (GLint size, GLubyte *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTUIVARBPROC) (GLint size, GLuint *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTUSVARBPROC) (GLint size, GLushort *weights); + +#define glVertexBlendARB GLEW_GET_FUN(__glewVertexBlendARB) +#define glWeightPointerARB GLEW_GET_FUN(__glewWeightPointerARB) +#define glWeightbvARB GLEW_GET_FUN(__glewWeightbvARB) +#define glWeightdvARB GLEW_GET_FUN(__glewWeightdvARB) +#define glWeightfvARB GLEW_GET_FUN(__glewWeightfvARB) +#define glWeightivARB GLEW_GET_FUN(__glewWeightivARB) +#define glWeightsvARB GLEW_GET_FUN(__glewWeightsvARB) +#define glWeightubvARB GLEW_GET_FUN(__glewWeightubvARB) +#define glWeightuivARB GLEW_GET_FUN(__glewWeightuivARB) +#define glWeightusvARB GLEW_GET_FUN(__glewWeightusvARB) + +#define GLEW_ARB_vertex_blend GLEW_GET_VAR(__GLEW_ARB_vertex_blend) + +#endif /* GL_ARB_vertex_blend */ + +/* ---------------------- GL_ARB_vertex_buffer_object ---------------------- */ + +#ifndef GL_ARB_vertex_buffer_object +#define GL_ARB_vertex_buffer_object 1 + +#define GL_BUFFER_SIZE_ARB 0x8764 +#define GL_BUFFER_USAGE_ARB 0x8765 +#define GL_ARRAY_BUFFER_ARB 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 +#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F +#define GL_READ_ONLY_ARB 0x88B8 +#define GL_WRITE_ONLY_ARB 0x88B9 +#define GL_READ_WRITE_ARB 0x88BA +#define GL_BUFFER_ACCESS_ARB 0x88BB +#define GL_BUFFER_MAPPED_ARB 0x88BC +#define GL_BUFFER_MAP_POINTER_ARB 0x88BD +#define GL_STREAM_DRAW_ARB 0x88E0 +#define GL_STREAM_READ_ARB 0x88E1 +#define GL_STREAM_COPY_ARB 0x88E2 +#define GL_STATIC_DRAW_ARB 0x88E4 +#define GL_STATIC_READ_ARB 0x88E5 +#define GL_STATIC_COPY_ARB 0x88E6 +#define GL_DYNAMIC_DRAW_ARB 0x88E8 +#define GL_DYNAMIC_READ_ARB 0x88E9 +#define GL_DYNAMIC_COPY_ARB 0x88EA + +typedef ptrdiff_t GLintptrARB; +typedef ptrdiff_t GLsizeiptrARB; + +typedef void (GLAPIENTRY * PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid* data, GLenum usage); +typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid* data); +typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid** params); +typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid* data); +typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERARBPROC) (GLuint buffer); +typedef GLvoid * (GLAPIENTRY * PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); +typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERARBPROC) (GLenum target); + +#define glBindBufferARB GLEW_GET_FUN(__glewBindBufferARB) +#define glBufferDataARB GLEW_GET_FUN(__glewBufferDataARB) +#define glBufferSubDataARB GLEW_GET_FUN(__glewBufferSubDataARB) +#define glDeleteBuffersARB GLEW_GET_FUN(__glewDeleteBuffersARB) +#define glGenBuffersARB GLEW_GET_FUN(__glewGenBuffersARB) +#define glGetBufferParameterivARB GLEW_GET_FUN(__glewGetBufferParameterivARB) +#define glGetBufferPointervARB GLEW_GET_FUN(__glewGetBufferPointervARB) +#define glGetBufferSubDataARB GLEW_GET_FUN(__glewGetBufferSubDataARB) +#define glIsBufferARB GLEW_GET_FUN(__glewIsBufferARB) +#define glMapBufferARB GLEW_GET_FUN(__glewMapBufferARB) +#define glUnmapBufferARB GLEW_GET_FUN(__glewUnmapBufferARB) + +#define GLEW_ARB_vertex_buffer_object GLEW_GET_VAR(__GLEW_ARB_vertex_buffer_object) + +#endif /* GL_ARB_vertex_buffer_object */ + +/* ------------------------- GL_ARB_vertex_program ------------------------- */ + +#ifndef GL_ARB_vertex_program +#define GL_ARB_vertex_program 1 + +#define GL_COLOR_SUM_ARB 0x8458 +#define GL_VERTEX_PROGRAM_ARB 0x8620 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 +#define GL_PROGRAM_LENGTH_ARB 0x8627 +#define GL_PROGRAM_STRING_ARB 0x8628 +#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E +#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F +#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 +#define GL_CURRENT_MATRIX_ARB 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 +#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B +#define GL_PROGRAM_BINDING_ARB 0x8677 +#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A +#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 +#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 +#define GL_PROGRAM_FORMAT_ARB 0x8876 +#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 +#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 +#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 +#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 +#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 +#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 +#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 +#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 +#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 +#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 +#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA +#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB +#define GL_PROGRAM_ATTRIBS_ARB 0x88AC +#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD +#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE +#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF +#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 +#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 +#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 +#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 +#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 +#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 +#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 +#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 +#define GL_MATRIX0_ARB 0x88C0 +#define GL_MATRIX1_ARB 0x88C1 +#define GL_MATRIX2_ARB 0x88C2 +#define GL_MATRIX3_ARB 0x88C3 +#define GL_MATRIX4_ARB 0x88C4 +#define GL_MATRIX5_ARB 0x88C5 +#define GL_MATRIX6_ARB 0x88C6 +#define GL_MATRIX7_ARB 0x88C7 +#define GL_MATRIX8_ARB 0x88C8 +#define GL_MATRIX9_ARB 0x88C9 +#define GL_MATRIX10_ARB 0x88CA +#define GL_MATRIX11_ARB 0x88CB +#define GL_MATRIX12_ARB 0x88CC +#define GL_MATRIX13_ARB 0x88CD +#define GL_MATRIX14_ARB 0x88CE +#define GL_MATRIX15_ARB 0x88CF +#define GL_MATRIX16_ARB 0x88D0 +#define GL_MATRIX17_ARB 0x88D1 +#define GL_MATRIX18_ARB 0x88D2 +#define GL_MATRIX19_ARB 0x88D3 +#define GL_MATRIX20_ARB 0x88D4 +#define GL_MATRIX21_ARB 0x88D5 +#define GL_MATRIX22_ARB 0x88D6 +#define GL_MATRIX23_ARB 0x88D7 +#define GL_MATRIX24_ARB 0x88D8 +#define GL_MATRIX25_ARB 0x88D9 +#define GL_MATRIX26_ARB 0x88DA +#define GL_MATRIX27_ARB 0x88DB +#define GL_MATRIX28_ARB 0x88DC +#define GL_MATRIX29_ARB 0x88DD +#define GL_MATRIX30_ARB 0x88DE +#define GL_MATRIX31_ARB 0x88DF + +typedef void (GLAPIENTRY * PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); +typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint* programs); +typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (GLAPIENTRY * PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint* programs); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void* string); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid** pointer); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMARBPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void* string); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer); + +#define glBindProgramARB GLEW_GET_FUN(__glewBindProgramARB) +#define glDeleteProgramsARB GLEW_GET_FUN(__glewDeleteProgramsARB) +#define glDisableVertexAttribArrayARB GLEW_GET_FUN(__glewDisableVertexAttribArrayARB) +#define glEnableVertexAttribArrayARB GLEW_GET_FUN(__glewEnableVertexAttribArrayARB) +#define glGenProgramsARB GLEW_GET_FUN(__glewGenProgramsARB) +#define glGetProgramEnvParameterdvARB GLEW_GET_FUN(__glewGetProgramEnvParameterdvARB) +#define glGetProgramEnvParameterfvARB GLEW_GET_FUN(__glewGetProgramEnvParameterfvARB) +#define glGetProgramLocalParameterdvARB GLEW_GET_FUN(__glewGetProgramLocalParameterdvARB) +#define glGetProgramLocalParameterfvARB GLEW_GET_FUN(__glewGetProgramLocalParameterfvARB) +#define glGetProgramStringARB GLEW_GET_FUN(__glewGetProgramStringARB) +#define glGetProgramivARB GLEW_GET_FUN(__glewGetProgramivARB) +#define glGetVertexAttribPointervARB GLEW_GET_FUN(__glewGetVertexAttribPointervARB) +#define glGetVertexAttribdvARB GLEW_GET_FUN(__glewGetVertexAttribdvARB) +#define glGetVertexAttribfvARB GLEW_GET_FUN(__glewGetVertexAttribfvARB) +#define glGetVertexAttribivARB GLEW_GET_FUN(__glewGetVertexAttribivARB) +#define glIsProgramARB GLEW_GET_FUN(__glewIsProgramARB) +#define glProgramEnvParameter4dARB GLEW_GET_FUN(__glewProgramEnvParameter4dARB) +#define glProgramEnvParameter4dvARB GLEW_GET_FUN(__glewProgramEnvParameter4dvARB) +#define glProgramEnvParameter4fARB GLEW_GET_FUN(__glewProgramEnvParameter4fARB) +#define glProgramEnvParameter4fvARB GLEW_GET_FUN(__glewProgramEnvParameter4fvARB) +#define glProgramLocalParameter4dARB GLEW_GET_FUN(__glewProgramLocalParameter4dARB) +#define glProgramLocalParameter4dvARB GLEW_GET_FUN(__glewProgramLocalParameter4dvARB) +#define glProgramLocalParameter4fARB GLEW_GET_FUN(__glewProgramLocalParameter4fARB) +#define glProgramLocalParameter4fvARB GLEW_GET_FUN(__glewProgramLocalParameter4fvARB) +#define glProgramStringARB GLEW_GET_FUN(__glewProgramStringARB) +#define glVertexAttrib1dARB GLEW_GET_FUN(__glewVertexAttrib1dARB) +#define glVertexAttrib1dvARB GLEW_GET_FUN(__glewVertexAttrib1dvARB) +#define glVertexAttrib1fARB GLEW_GET_FUN(__glewVertexAttrib1fARB) +#define glVertexAttrib1fvARB GLEW_GET_FUN(__glewVertexAttrib1fvARB) +#define glVertexAttrib1sARB GLEW_GET_FUN(__glewVertexAttrib1sARB) +#define glVertexAttrib1svARB GLEW_GET_FUN(__glewVertexAttrib1svARB) +#define glVertexAttrib2dARB GLEW_GET_FUN(__glewVertexAttrib2dARB) +#define glVertexAttrib2dvARB GLEW_GET_FUN(__glewVertexAttrib2dvARB) +#define glVertexAttrib2fARB GLEW_GET_FUN(__glewVertexAttrib2fARB) +#define glVertexAttrib2fvARB GLEW_GET_FUN(__glewVertexAttrib2fvARB) +#define glVertexAttrib2sARB GLEW_GET_FUN(__glewVertexAttrib2sARB) +#define glVertexAttrib2svARB GLEW_GET_FUN(__glewVertexAttrib2svARB) +#define glVertexAttrib3dARB GLEW_GET_FUN(__glewVertexAttrib3dARB) +#define glVertexAttrib3dvARB GLEW_GET_FUN(__glewVertexAttrib3dvARB) +#define glVertexAttrib3fARB GLEW_GET_FUN(__glewVertexAttrib3fARB) +#define glVertexAttrib3fvARB GLEW_GET_FUN(__glewVertexAttrib3fvARB) +#define glVertexAttrib3sARB GLEW_GET_FUN(__glewVertexAttrib3sARB) +#define glVertexAttrib3svARB GLEW_GET_FUN(__glewVertexAttrib3svARB) +#define glVertexAttrib4NbvARB GLEW_GET_FUN(__glewVertexAttrib4NbvARB) +#define glVertexAttrib4NivARB GLEW_GET_FUN(__glewVertexAttrib4NivARB) +#define glVertexAttrib4NsvARB GLEW_GET_FUN(__glewVertexAttrib4NsvARB) +#define glVertexAttrib4NubARB GLEW_GET_FUN(__glewVertexAttrib4NubARB) +#define glVertexAttrib4NubvARB GLEW_GET_FUN(__glewVertexAttrib4NubvARB) +#define glVertexAttrib4NuivARB GLEW_GET_FUN(__glewVertexAttrib4NuivARB) +#define glVertexAttrib4NusvARB GLEW_GET_FUN(__glewVertexAttrib4NusvARB) +#define glVertexAttrib4bvARB GLEW_GET_FUN(__glewVertexAttrib4bvARB) +#define glVertexAttrib4dARB GLEW_GET_FUN(__glewVertexAttrib4dARB) +#define glVertexAttrib4dvARB GLEW_GET_FUN(__glewVertexAttrib4dvARB) +#define glVertexAttrib4fARB GLEW_GET_FUN(__glewVertexAttrib4fARB) +#define glVertexAttrib4fvARB GLEW_GET_FUN(__glewVertexAttrib4fvARB) +#define glVertexAttrib4ivARB GLEW_GET_FUN(__glewVertexAttrib4ivARB) +#define glVertexAttrib4sARB GLEW_GET_FUN(__glewVertexAttrib4sARB) +#define glVertexAttrib4svARB GLEW_GET_FUN(__glewVertexAttrib4svARB) +#define glVertexAttrib4ubvARB GLEW_GET_FUN(__glewVertexAttrib4ubvARB) +#define glVertexAttrib4uivARB GLEW_GET_FUN(__glewVertexAttrib4uivARB) +#define glVertexAttrib4usvARB GLEW_GET_FUN(__glewVertexAttrib4usvARB) +#define glVertexAttribPointerARB GLEW_GET_FUN(__glewVertexAttribPointerARB) + +#define GLEW_ARB_vertex_program GLEW_GET_VAR(__GLEW_ARB_vertex_program) + +#endif /* GL_ARB_vertex_program */ + +/* -------------------------- GL_ARB_vertex_shader ------------------------- */ + +#ifndef GL_ARB_vertex_shader +#define GL_ARB_vertex_shader 1 + +#define GL_VERTEX_SHADER_ARB 0x8B31 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A +#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D +#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 +#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A + +typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB* name); +typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name); +typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name); + +#define glBindAttribLocationARB GLEW_GET_FUN(__glewBindAttribLocationARB) +#define glGetActiveAttribARB GLEW_GET_FUN(__glewGetActiveAttribARB) +#define glGetAttribLocationARB GLEW_GET_FUN(__glewGetAttribLocationARB) + +#define GLEW_ARB_vertex_shader GLEW_GET_VAR(__GLEW_ARB_vertex_shader) + +#endif /* GL_ARB_vertex_shader */ + +/* ------------------- GL_ARB_vertex_type_2_10_10_10_rev ------------------- */ + +#ifndef GL_ARB_vertex_type_2_10_10_10_rev +#define GL_ARB_vertex_type_2_10_10_10_rev 1 + +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_INT_2_10_10_10_REV 0x8D9F + +typedef void (GLAPIENTRY * PFNGLCOLORP3UIPROC) (GLenum type, GLuint color); +typedef void (GLAPIENTRY * PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint* color); +typedef void (GLAPIENTRY * PFNGLCOLORP4UIPROC) (GLenum type, GLuint color); +typedef void (GLAPIENTRY * PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint* color); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint* color); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value); +typedef void (GLAPIENTRY * PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value); +typedef void (GLAPIENTRY * PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value); +typedef void (GLAPIENTRY * PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint* value); + +#define glColorP3ui GLEW_GET_FUN(__glewColorP3ui) +#define glColorP3uiv GLEW_GET_FUN(__glewColorP3uiv) +#define glColorP4ui GLEW_GET_FUN(__glewColorP4ui) +#define glColorP4uiv GLEW_GET_FUN(__glewColorP4uiv) +#define glMultiTexCoordP1ui GLEW_GET_FUN(__glewMultiTexCoordP1ui) +#define glMultiTexCoordP1uiv GLEW_GET_FUN(__glewMultiTexCoordP1uiv) +#define glMultiTexCoordP2ui GLEW_GET_FUN(__glewMultiTexCoordP2ui) +#define glMultiTexCoordP2uiv GLEW_GET_FUN(__glewMultiTexCoordP2uiv) +#define glMultiTexCoordP3ui GLEW_GET_FUN(__glewMultiTexCoordP3ui) +#define glMultiTexCoordP3uiv GLEW_GET_FUN(__glewMultiTexCoordP3uiv) +#define glMultiTexCoordP4ui GLEW_GET_FUN(__glewMultiTexCoordP4ui) +#define glMultiTexCoordP4uiv GLEW_GET_FUN(__glewMultiTexCoordP4uiv) +#define glNormalP3ui GLEW_GET_FUN(__glewNormalP3ui) +#define glNormalP3uiv GLEW_GET_FUN(__glewNormalP3uiv) +#define glSecondaryColorP3ui GLEW_GET_FUN(__glewSecondaryColorP3ui) +#define glSecondaryColorP3uiv GLEW_GET_FUN(__glewSecondaryColorP3uiv) +#define glTexCoordP1ui GLEW_GET_FUN(__glewTexCoordP1ui) +#define glTexCoordP1uiv GLEW_GET_FUN(__glewTexCoordP1uiv) +#define glTexCoordP2ui GLEW_GET_FUN(__glewTexCoordP2ui) +#define glTexCoordP2uiv GLEW_GET_FUN(__glewTexCoordP2uiv) +#define glTexCoordP3ui GLEW_GET_FUN(__glewTexCoordP3ui) +#define glTexCoordP3uiv GLEW_GET_FUN(__glewTexCoordP3uiv) +#define glTexCoordP4ui GLEW_GET_FUN(__glewTexCoordP4ui) +#define glTexCoordP4uiv GLEW_GET_FUN(__glewTexCoordP4uiv) +#define glVertexAttribP1ui GLEW_GET_FUN(__glewVertexAttribP1ui) +#define glVertexAttribP1uiv GLEW_GET_FUN(__glewVertexAttribP1uiv) +#define glVertexAttribP2ui GLEW_GET_FUN(__glewVertexAttribP2ui) +#define glVertexAttribP2uiv GLEW_GET_FUN(__glewVertexAttribP2uiv) +#define glVertexAttribP3ui GLEW_GET_FUN(__glewVertexAttribP3ui) +#define glVertexAttribP3uiv GLEW_GET_FUN(__glewVertexAttribP3uiv) +#define glVertexAttribP4ui GLEW_GET_FUN(__glewVertexAttribP4ui) +#define glVertexAttribP4uiv GLEW_GET_FUN(__glewVertexAttribP4uiv) +#define glVertexP2ui GLEW_GET_FUN(__glewVertexP2ui) +#define glVertexP2uiv GLEW_GET_FUN(__glewVertexP2uiv) +#define glVertexP3ui GLEW_GET_FUN(__glewVertexP3ui) +#define glVertexP3uiv GLEW_GET_FUN(__glewVertexP3uiv) +#define glVertexP4ui GLEW_GET_FUN(__glewVertexP4ui) +#define glVertexP4uiv GLEW_GET_FUN(__glewVertexP4uiv) + +#define GLEW_ARB_vertex_type_2_10_10_10_rev GLEW_GET_VAR(__GLEW_ARB_vertex_type_2_10_10_10_rev) + +#endif /* GL_ARB_vertex_type_2_10_10_10_rev */ + +/* ------------------------- GL_ARB_viewport_array ------------------------- */ + +#ifndef GL_ARB_viewport_array +#define GL_ARB_viewport_array 1 + +#define GL_DEPTH_RANGE 0x0B70 +#define GL_VIEWPORT 0x0BA2 +#define GL_SCISSOR_BOX 0x0C10 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_MAX_VIEWPORTS 0x825B +#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C +#define GL_VIEWPORT_BOUNDS_RANGE 0x825D +#define GL_LAYER_PROVOKING_VERTEX 0x825E +#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F +#define GL_UNDEFINED_VERTEX 0x8260 +#define GL_FIRST_VERTEX_CONVENTION 0x8E4D +#define GL_LAST_VERTEX_CONVENTION 0x8E4E +#define GL_PROVOKING_VERTEX 0x8E4F + +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLclampd * v); +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLclampd n, GLclampd f); +typedef void (GLAPIENTRY * PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble* data); +typedef void (GLAPIENTRY * PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat* data); +typedef void (GLAPIENTRY * PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint * v); +typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint * v); +typedef void (GLAPIENTRY * PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat * v); +typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat * v); + +#define glDepthRangeArrayv GLEW_GET_FUN(__glewDepthRangeArrayv) +#define glDepthRangeIndexed GLEW_GET_FUN(__glewDepthRangeIndexed) +#define glGetDoublei_v GLEW_GET_FUN(__glewGetDoublei_v) +#define glGetFloati_v GLEW_GET_FUN(__glewGetFloati_v) +#define glScissorArrayv GLEW_GET_FUN(__glewScissorArrayv) +#define glScissorIndexed GLEW_GET_FUN(__glewScissorIndexed) +#define glScissorIndexedv GLEW_GET_FUN(__glewScissorIndexedv) +#define glViewportArrayv GLEW_GET_FUN(__glewViewportArrayv) +#define glViewportIndexedf GLEW_GET_FUN(__glewViewportIndexedf) +#define glViewportIndexedfv GLEW_GET_FUN(__glewViewportIndexedfv) + +#define GLEW_ARB_viewport_array GLEW_GET_VAR(__GLEW_ARB_viewport_array) + +#endif /* GL_ARB_viewport_array */ + +/* --------------------------- GL_ARB_window_pos --------------------------- */ + +#ifndef GL_ARB_window_pos +#define GL_ARB_window_pos 1 + +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVARBPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVARBPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVARBPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVARBPROC) (const GLshort* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVARBPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVARBPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVARBPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVARBPROC) (const GLshort* p); + +#define glWindowPos2dARB GLEW_GET_FUN(__glewWindowPos2dARB) +#define glWindowPos2dvARB GLEW_GET_FUN(__glewWindowPos2dvARB) +#define glWindowPos2fARB GLEW_GET_FUN(__glewWindowPos2fARB) +#define glWindowPos2fvARB GLEW_GET_FUN(__glewWindowPos2fvARB) +#define glWindowPos2iARB GLEW_GET_FUN(__glewWindowPos2iARB) +#define glWindowPos2ivARB GLEW_GET_FUN(__glewWindowPos2ivARB) +#define glWindowPos2sARB GLEW_GET_FUN(__glewWindowPos2sARB) +#define glWindowPos2svARB GLEW_GET_FUN(__glewWindowPos2svARB) +#define glWindowPos3dARB GLEW_GET_FUN(__glewWindowPos3dARB) +#define glWindowPos3dvARB GLEW_GET_FUN(__glewWindowPos3dvARB) +#define glWindowPos3fARB GLEW_GET_FUN(__glewWindowPos3fARB) +#define glWindowPos3fvARB GLEW_GET_FUN(__glewWindowPos3fvARB) +#define glWindowPos3iARB GLEW_GET_FUN(__glewWindowPos3iARB) +#define glWindowPos3ivARB GLEW_GET_FUN(__glewWindowPos3ivARB) +#define glWindowPos3sARB GLEW_GET_FUN(__glewWindowPos3sARB) +#define glWindowPos3svARB GLEW_GET_FUN(__glewWindowPos3svARB) + +#define GLEW_ARB_window_pos GLEW_GET_VAR(__GLEW_ARB_window_pos) + +#endif /* GL_ARB_window_pos */ + +/* ------------------------- GL_ATIX_point_sprites ------------------------- */ + +#ifndef GL_ATIX_point_sprites +#define GL_ATIX_point_sprites 1 + +#define GL_TEXTURE_POINT_MODE_ATIX 0x60B0 +#define GL_TEXTURE_POINT_ONE_COORD_ATIX 0x60B1 +#define GL_TEXTURE_POINT_SPRITE_ATIX 0x60B2 +#define GL_POINT_SPRITE_CULL_MODE_ATIX 0x60B3 +#define GL_POINT_SPRITE_CULL_CENTER_ATIX 0x60B4 +#define GL_POINT_SPRITE_CULL_CLIP_ATIX 0x60B5 + +#define GLEW_ATIX_point_sprites GLEW_GET_VAR(__GLEW_ATIX_point_sprites) + +#endif /* GL_ATIX_point_sprites */ + +/* ---------------------- GL_ATIX_texture_env_combine3 --------------------- */ + +#ifndef GL_ATIX_texture_env_combine3 +#define GL_ATIX_texture_env_combine3 1 + +#define GL_MODULATE_ADD_ATIX 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATIX 0x8745 +#define GL_MODULATE_SUBTRACT_ATIX 0x8746 + +#define GLEW_ATIX_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATIX_texture_env_combine3) + +#endif /* GL_ATIX_texture_env_combine3 */ + +/* ----------------------- GL_ATIX_texture_env_route ----------------------- */ + +#ifndef GL_ATIX_texture_env_route +#define GL_ATIX_texture_env_route 1 + +#define GL_SECONDARY_COLOR_ATIX 0x8747 +#define GL_TEXTURE_OUTPUT_RGB_ATIX 0x8748 +#define GL_TEXTURE_OUTPUT_ALPHA_ATIX 0x8749 + +#define GLEW_ATIX_texture_env_route GLEW_GET_VAR(__GLEW_ATIX_texture_env_route) + +#endif /* GL_ATIX_texture_env_route */ + +/* ---------------- GL_ATIX_vertex_shader_output_point_size ---------------- */ + +#ifndef GL_ATIX_vertex_shader_output_point_size +#define GL_ATIX_vertex_shader_output_point_size 1 + +#define GL_OUTPUT_POINT_SIZE_ATIX 0x610E + +#define GLEW_ATIX_vertex_shader_output_point_size GLEW_GET_VAR(__GLEW_ATIX_vertex_shader_output_point_size) + +#endif /* GL_ATIX_vertex_shader_output_point_size */ + +/* -------------------------- GL_ATI_draw_buffers -------------------------- */ + +#ifndef GL_ATI_draw_buffers +#define GL_ATI_draw_buffers 1 + +#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 +#define GL_DRAW_BUFFER0_ATI 0x8825 +#define GL_DRAW_BUFFER1_ATI 0x8826 +#define GL_DRAW_BUFFER2_ATI 0x8827 +#define GL_DRAW_BUFFER3_ATI 0x8828 +#define GL_DRAW_BUFFER4_ATI 0x8829 +#define GL_DRAW_BUFFER5_ATI 0x882A +#define GL_DRAW_BUFFER6_ATI 0x882B +#define GL_DRAW_BUFFER7_ATI 0x882C +#define GL_DRAW_BUFFER8_ATI 0x882D +#define GL_DRAW_BUFFER9_ATI 0x882E +#define GL_DRAW_BUFFER10_ATI 0x882F +#define GL_DRAW_BUFFER11_ATI 0x8830 +#define GL_DRAW_BUFFER12_ATI 0x8831 +#define GL_DRAW_BUFFER13_ATI 0x8832 +#define GL_DRAW_BUFFER14_ATI 0x8833 +#define GL_DRAW_BUFFER15_ATI 0x8834 + +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum* bufs); + +#define glDrawBuffersATI GLEW_GET_FUN(__glewDrawBuffersATI) + +#define GLEW_ATI_draw_buffers GLEW_GET_VAR(__GLEW_ATI_draw_buffers) + +#endif /* GL_ATI_draw_buffers */ + +/* -------------------------- GL_ATI_element_array ------------------------- */ + +#ifndef GL_ATI_element_array +#define GL_ATI_element_array 1 + +#define GL_ELEMENT_ARRAY_ATI 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A + +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); +typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERATIPROC) (GLenum type, const void* pointer); + +#define glDrawElementArrayATI GLEW_GET_FUN(__glewDrawElementArrayATI) +#define glDrawRangeElementArrayATI GLEW_GET_FUN(__glewDrawRangeElementArrayATI) +#define glElementPointerATI GLEW_GET_FUN(__glewElementPointerATI) + +#define GLEW_ATI_element_array GLEW_GET_VAR(__GLEW_ATI_element_array) + +#endif /* GL_ATI_element_array */ + +/* ------------------------- GL_ATI_envmap_bumpmap ------------------------- */ + +#ifndef GL_ATI_envmap_bumpmap +#define GL_ATI_envmap_bumpmap 1 + +#define GL_BUMP_ROT_MATRIX_ATI 0x8775 +#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 +#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 +#define GL_BUMP_TEX_UNITS_ATI 0x8778 +#define GL_DUDV_ATI 0x8779 +#define GL_DU8DV8_ATI 0x877A +#define GL_BUMP_ENVMAP_ATI 0x877B +#define GL_BUMP_TARGET_ATI 0x877C + +typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); +typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); +typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); +typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); + +#define glGetTexBumpParameterfvATI GLEW_GET_FUN(__glewGetTexBumpParameterfvATI) +#define glGetTexBumpParameterivATI GLEW_GET_FUN(__glewGetTexBumpParameterivATI) +#define glTexBumpParameterfvATI GLEW_GET_FUN(__glewTexBumpParameterfvATI) +#define glTexBumpParameterivATI GLEW_GET_FUN(__glewTexBumpParameterivATI) + +#define GLEW_ATI_envmap_bumpmap GLEW_GET_VAR(__GLEW_ATI_envmap_bumpmap) + +#endif /* GL_ATI_envmap_bumpmap */ + +/* ------------------------- GL_ATI_fragment_shader ------------------------ */ + +#ifndef GL_ATI_fragment_shader +#define GL_ATI_fragment_shader 1 + +#define GL_RED_BIT_ATI 0x00000001 +#define GL_2X_BIT_ATI 0x00000001 +#define GL_4X_BIT_ATI 0x00000002 +#define GL_GREEN_BIT_ATI 0x00000002 +#define GL_COMP_BIT_ATI 0x00000002 +#define GL_BLUE_BIT_ATI 0x00000004 +#define GL_8X_BIT_ATI 0x00000004 +#define GL_NEGATE_BIT_ATI 0x00000004 +#define GL_BIAS_BIT_ATI 0x00000008 +#define GL_HALF_BIT_ATI 0x00000008 +#define GL_QUARTER_BIT_ATI 0x00000010 +#define GL_EIGHTH_BIT_ATI 0x00000020 +#define GL_SATURATE_BIT_ATI 0x00000040 +#define GL_FRAGMENT_SHADER_ATI 0x8920 +#define GL_REG_0_ATI 0x8921 +#define GL_REG_1_ATI 0x8922 +#define GL_REG_2_ATI 0x8923 +#define GL_REG_3_ATI 0x8924 +#define GL_REG_4_ATI 0x8925 +#define GL_REG_5_ATI 0x8926 +#define GL_CON_0_ATI 0x8941 +#define GL_CON_1_ATI 0x8942 +#define GL_CON_2_ATI 0x8943 +#define GL_CON_3_ATI 0x8944 +#define GL_CON_4_ATI 0x8945 +#define GL_CON_5_ATI 0x8946 +#define GL_CON_6_ATI 0x8947 +#define GL_CON_7_ATI 0x8948 +#define GL_MOV_ATI 0x8961 +#define GL_ADD_ATI 0x8963 +#define GL_MUL_ATI 0x8964 +#define GL_SUB_ATI 0x8965 +#define GL_DOT3_ATI 0x8966 +#define GL_DOT4_ATI 0x8967 +#define GL_MAD_ATI 0x8968 +#define GL_LERP_ATI 0x8969 +#define GL_CND_ATI 0x896A +#define GL_CND0_ATI 0x896B +#define GL_DOT2_ADD_ATI 0x896C +#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D +#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E +#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F +#define GL_NUM_PASSES_ATI 0x8970 +#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 +#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 +#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 +#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 +#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 +#define GL_SWIZZLE_STR_ATI 0x8976 +#define GL_SWIZZLE_STQ_ATI 0x8977 +#define GL_SWIZZLE_STR_DR_ATI 0x8978 +#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 +#define GL_SWIZZLE_STRQ_ATI 0x897A +#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B + +typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (GLAPIENTRY * PFNGLBEGINFRAGMENTSHADERATIPROC) (void); +typedef void (GLAPIENTRY * PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (GLAPIENTRY * PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLENDFRAGMENTSHADERATIPROC) (void); +typedef GLuint (GLAPIENTRY * PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); +typedef void (GLAPIENTRY * PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); +typedef void (GLAPIENTRY * PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); +typedef void (GLAPIENTRY * PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat* value); + +#define glAlphaFragmentOp1ATI GLEW_GET_FUN(__glewAlphaFragmentOp1ATI) +#define glAlphaFragmentOp2ATI GLEW_GET_FUN(__glewAlphaFragmentOp2ATI) +#define glAlphaFragmentOp3ATI GLEW_GET_FUN(__glewAlphaFragmentOp3ATI) +#define glBeginFragmentShaderATI GLEW_GET_FUN(__glewBeginFragmentShaderATI) +#define glBindFragmentShaderATI GLEW_GET_FUN(__glewBindFragmentShaderATI) +#define glColorFragmentOp1ATI GLEW_GET_FUN(__glewColorFragmentOp1ATI) +#define glColorFragmentOp2ATI GLEW_GET_FUN(__glewColorFragmentOp2ATI) +#define glColorFragmentOp3ATI GLEW_GET_FUN(__glewColorFragmentOp3ATI) +#define glDeleteFragmentShaderATI GLEW_GET_FUN(__glewDeleteFragmentShaderATI) +#define glEndFragmentShaderATI GLEW_GET_FUN(__glewEndFragmentShaderATI) +#define glGenFragmentShadersATI GLEW_GET_FUN(__glewGenFragmentShadersATI) +#define glPassTexCoordATI GLEW_GET_FUN(__glewPassTexCoordATI) +#define glSampleMapATI GLEW_GET_FUN(__glewSampleMapATI) +#define glSetFragmentShaderConstantATI GLEW_GET_FUN(__glewSetFragmentShaderConstantATI) + +#define GLEW_ATI_fragment_shader GLEW_GET_VAR(__GLEW_ATI_fragment_shader) + +#endif /* GL_ATI_fragment_shader */ + +/* ------------------------ GL_ATI_map_object_buffer ----------------------- */ + +#ifndef GL_ATI_map_object_buffer +#define GL_ATI_map_object_buffer 1 + +typedef void* (GLAPIENTRY * PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); + +#define glMapObjectBufferATI GLEW_GET_FUN(__glewMapObjectBufferATI) +#define glUnmapObjectBufferATI GLEW_GET_FUN(__glewUnmapObjectBufferATI) + +#define GLEW_ATI_map_object_buffer GLEW_GET_VAR(__GLEW_ATI_map_object_buffer) + +#endif /* GL_ATI_map_object_buffer */ + +/* ----------------------------- GL_ATI_meminfo ---------------------------- */ + +#ifndef GL_ATI_meminfo +#define GL_ATI_meminfo 1 + +#define GL_VBO_FREE_MEMORY_ATI 0x87FB +#define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC +#define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD + +#define GLEW_ATI_meminfo GLEW_GET_VAR(__GLEW_ATI_meminfo) + +#endif /* GL_ATI_meminfo */ + +/* -------------------------- GL_ATI_pn_triangles -------------------------- */ + +#ifndef GL_ATI_pn_triangles +#define GL_ATI_pn_triangles 1 + +#define GL_PN_TRIANGLES_ATI 0x87F0 +#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 +#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 +#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 +#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 +#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 +#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 +#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 +#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 + +typedef void (GLAPIENTRY * PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); + +#define glPNTrianglesfATI GLEW_GET_FUN(__glPNTrianglewesfATI) +#define glPNTrianglesiATI GLEW_GET_FUN(__glPNTrianglewesiATI) + +#define GLEW_ATI_pn_triangles GLEW_GET_VAR(__GLEW_ATI_pn_triangles) + +#endif /* GL_ATI_pn_triangles */ + +/* ------------------------ GL_ATI_separate_stencil ------------------------ */ + +#ifndef GL_ATI_separate_stencil +#define GL_ATI_separate_stencil 1 + +#define GL_STENCIL_BACK_FUNC_ATI 0x8800 +#define GL_STENCIL_BACK_FAIL_ATI 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 + +typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); + +#define glStencilFuncSeparateATI GLEW_GET_FUN(__glewStencilFuncSeparateATI) +#define glStencilOpSeparateATI GLEW_GET_FUN(__glewStencilOpSeparateATI) + +#define GLEW_ATI_separate_stencil GLEW_GET_VAR(__GLEW_ATI_separate_stencil) + +#endif /* GL_ATI_separate_stencil */ + +/* ----------------------- GL_ATI_shader_texture_lod ----------------------- */ + +#ifndef GL_ATI_shader_texture_lod +#define GL_ATI_shader_texture_lod 1 + +#define GLEW_ATI_shader_texture_lod GLEW_GET_VAR(__GLEW_ATI_shader_texture_lod) + +#endif /* GL_ATI_shader_texture_lod */ + +/* ---------------------- GL_ATI_text_fragment_shader ---------------------- */ + +#ifndef GL_ATI_text_fragment_shader +#define GL_ATI_text_fragment_shader 1 + +#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 + +#define GLEW_ATI_text_fragment_shader GLEW_GET_VAR(__GLEW_ATI_text_fragment_shader) + +#endif /* GL_ATI_text_fragment_shader */ + +/* --------------------- GL_ATI_texture_compression_3dc -------------------- */ + +#ifndef GL_ATI_texture_compression_3dc +#define GL_ATI_texture_compression_3dc 1 + +#define GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI 0x8837 + +#define GLEW_ATI_texture_compression_3dc GLEW_GET_VAR(__GLEW_ATI_texture_compression_3dc) + +#endif /* GL_ATI_texture_compression_3dc */ + +/* ---------------------- GL_ATI_texture_env_combine3 ---------------------- */ + +#ifndef GL_ATI_texture_env_combine3 +#define GL_ATI_texture_env_combine3 1 + +#define GL_MODULATE_ADD_ATI 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 +#define GL_MODULATE_SUBTRACT_ATI 0x8746 + +#define GLEW_ATI_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATI_texture_env_combine3) + +#endif /* GL_ATI_texture_env_combine3 */ + +/* -------------------------- GL_ATI_texture_float ------------------------- */ + +#ifndef GL_ATI_texture_float +#define GL_ATI_texture_float 1 + +#define GL_RGBA_FLOAT32_ATI 0x8814 +#define GL_RGB_FLOAT32_ATI 0x8815 +#define GL_ALPHA_FLOAT32_ATI 0x8816 +#define GL_INTENSITY_FLOAT32_ATI 0x8817 +#define GL_LUMINANCE_FLOAT32_ATI 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 +#define GL_RGBA_FLOAT16_ATI 0x881A +#define GL_RGB_FLOAT16_ATI 0x881B +#define GL_ALPHA_FLOAT16_ATI 0x881C +#define GL_INTENSITY_FLOAT16_ATI 0x881D +#define GL_LUMINANCE_FLOAT16_ATI 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F + +#define GLEW_ATI_texture_float GLEW_GET_VAR(__GLEW_ATI_texture_float) + +#endif /* GL_ATI_texture_float */ + +/* ----------------------- GL_ATI_texture_mirror_once ---------------------- */ + +#ifndef GL_ATI_texture_mirror_once +#define GL_ATI_texture_mirror_once 1 + +#define GL_MIRROR_CLAMP_ATI 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 + +#define GLEW_ATI_texture_mirror_once GLEW_GET_VAR(__GLEW_ATI_texture_mirror_once) + +#endif /* GL_ATI_texture_mirror_once */ + +/* ----------------------- GL_ATI_vertex_array_object ---------------------- */ + +#ifndef GL_ATI_vertex_array_object +#define GL_ATI_vertex_array_object 1 + +#define GL_STATIC_ATI 0x8760 +#define GL_DYNAMIC_ATI 0x8761 +#define GL_PRESERVE_ATI 0x8762 +#define GL_DISCARD_ATI 0x8763 +#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 +#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 +#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 +#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 + +typedef void (GLAPIENTRY * PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (GLAPIENTRY * PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); +typedef GLuint (GLAPIENTRY * PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const void* pointer, GLenum usage); +typedef void (GLAPIENTRY * PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const void* pointer, GLenum preserve); +typedef void (GLAPIENTRY * PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); + +#define glArrayObjectATI GLEW_GET_FUN(__glewArrayObjectATI) +#define glFreeObjectBufferATI GLEW_GET_FUN(__glewFreeObjectBufferATI) +#define glGetArrayObjectfvATI GLEW_GET_FUN(__glewGetArrayObjectfvATI) +#define glGetArrayObjectivATI GLEW_GET_FUN(__glewGetArrayObjectivATI) +#define glGetObjectBufferfvATI GLEW_GET_FUN(__glewGetObjectBufferfvATI) +#define glGetObjectBufferivATI GLEW_GET_FUN(__glewGetObjectBufferivATI) +#define glGetVariantArrayObjectfvATI GLEW_GET_FUN(__glewGetVariantArrayObjectfvATI) +#define glGetVariantArrayObjectivATI GLEW_GET_FUN(__glewGetVariantArrayObjectivATI) +#define glIsObjectBufferATI GLEW_GET_FUN(__glewIsObjectBufferATI) +#define glNewObjectBufferATI GLEW_GET_FUN(__glewNewObjectBufferATI) +#define glUpdateObjectBufferATI GLEW_GET_FUN(__glewUpdateObjectBufferATI) +#define glVariantArrayObjectATI GLEW_GET_FUN(__glewVariantArrayObjectATI) + +#define GLEW_ATI_vertex_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_array_object) + +#endif /* GL_ATI_vertex_array_object */ + +/* ------------------- GL_ATI_vertex_attrib_array_object ------------------- */ + +#ifndef GL_ATI_vertex_attrib_array_object +#define GL_ATI_vertex_attrib_array_object 1 + +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); + +#define glGetVertexAttribArrayObjectfvATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectfvATI) +#define glGetVertexAttribArrayObjectivATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectivATI) +#define glVertexAttribArrayObjectATI GLEW_GET_FUN(__glewVertexAttribArrayObjectATI) + +#define GLEW_ATI_vertex_attrib_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_attrib_array_object) + +#endif /* GL_ATI_vertex_attrib_array_object */ + +/* ------------------------- GL_ATI_vertex_streams ------------------------- */ + +#ifndef GL_ATI_vertex_streams +#define GL_ATI_vertex_streams 1 + +#define GL_MAX_VERTEX_STREAMS_ATI 0x876B +#define GL_VERTEX_SOURCE_ATI 0x876C +#define GL_VERTEX_STREAM0_ATI 0x876D +#define GL_VERTEX_STREAM1_ATI 0x876E +#define GL_VERTEX_STREAM2_ATI 0x876F +#define GL_VERTEX_STREAM3_ATI 0x8770 +#define GL_VERTEX_STREAM4_ATI 0x8771 +#define GL_VERTEX_STREAM5_ATI 0x8772 +#define GL_VERTEX_STREAM6_ATI 0x8773 +#define GL_VERTEX_STREAM7_ATI 0x8774 + +typedef void (GLAPIENTRY * PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte x, GLbyte y, GLbyte z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *v); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *v); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *v); + +#define glClientActiveVertexStreamATI GLEW_GET_FUN(__glewClientActiveVertexStreamATI) +#define glNormalStream3bATI GLEW_GET_FUN(__glewNormalStream3bATI) +#define glNormalStream3bvATI GLEW_GET_FUN(__glewNormalStream3bvATI) +#define glNormalStream3dATI GLEW_GET_FUN(__glewNormalStream3dATI) +#define glNormalStream3dvATI GLEW_GET_FUN(__glewNormalStream3dvATI) +#define glNormalStream3fATI GLEW_GET_FUN(__glewNormalStream3fATI) +#define glNormalStream3fvATI GLEW_GET_FUN(__glewNormalStream3fvATI) +#define glNormalStream3iATI GLEW_GET_FUN(__glewNormalStream3iATI) +#define glNormalStream3ivATI GLEW_GET_FUN(__glewNormalStream3ivATI) +#define glNormalStream3sATI GLEW_GET_FUN(__glewNormalStream3sATI) +#define glNormalStream3svATI GLEW_GET_FUN(__glewNormalStream3svATI) +#define glVertexBlendEnvfATI GLEW_GET_FUN(__glewVertexBlendEnvfATI) +#define glVertexBlendEnviATI GLEW_GET_FUN(__glewVertexBlendEnviATI) +#define glVertexStream2dATI GLEW_GET_FUN(__glewVertexStream2dATI) +#define glVertexStream2dvATI GLEW_GET_FUN(__glewVertexStream2dvATI) +#define glVertexStream2fATI GLEW_GET_FUN(__glewVertexStream2fATI) +#define glVertexStream2fvATI GLEW_GET_FUN(__glewVertexStream2fvATI) +#define glVertexStream2iATI GLEW_GET_FUN(__glewVertexStream2iATI) +#define glVertexStream2ivATI GLEW_GET_FUN(__glewVertexStream2ivATI) +#define glVertexStream2sATI GLEW_GET_FUN(__glewVertexStream2sATI) +#define glVertexStream2svATI GLEW_GET_FUN(__glewVertexStream2svATI) +#define glVertexStream3dATI GLEW_GET_FUN(__glewVertexStream3dATI) +#define glVertexStream3dvATI GLEW_GET_FUN(__glewVertexStream3dvATI) +#define glVertexStream3fATI GLEW_GET_FUN(__glewVertexStream3fATI) +#define glVertexStream3fvATI GLEW_GET_FUN(__glewVertexStream3fvATI) +#define glVertexStream3iATI GLEW_GET_FUN(__glewVertexStream3iATI) +#define glVertexStream3ivATI GLEW_GET_FUN(__glewVertexStream3ivATI) +#define glVertexStream3sATI GLEW_GET_FUN(__glewVertexStream3sATI) +#define glVertexStream3svATI GLEW_GET_FUN(__glewVertexStream3svATI) +#define glVertexStream4dATI GLEW_GET_FUN(__glewVertexStream4dATI) +#define glVertexStream4dvATI GLEW_GET_FUN(__glewVertexStream4dvATI) +#define glVertexStream4fATI GLEW_GET_FUN(__glewVertexStream4fATI) +#define glVertexStream4fvATI GLEW_GET_FUN(__glewVertexStream4fvATI) +#define glVertexStream4iATI GLEW_GET_FUN(__glewVertexStream4iATI) +#define glVertexStream4ivATI GLEW_GET_FUN(__glewVertexStream4ivATI) +#define glVertexStream4sATI GLEW_GET_FUN(__glewVertexStream4sATI) +#define glVertexStream4svATI GLEW_GET_FUN(__glewVertexStream4svATI) + +#define GLEW_ATI_vertex_streams GLEW_GET_VAR(__GLEW_ATI_vertex_streams) + +#endif /* GL_ATI_vertex_streams */ + +/* --------------------------- GL_EXT_422_pixels --------------------------- */ + +#ifndef GL_EXT_422_pixels +#define GL_EXT_422_pixels 1 + +#define GL_422_EXT 0x80CC +#define GL_422_REV_EXT 0x80CD +#define GL_422_AVERAGE_EXT 0x80CE +#define GL_422_REV_AVERAGE_EXT 0x80CF + +#define GLEW_EXT_422_pixels GLEW_GET_VAR(__GLEW_EXT_422_pixels) + +#endif /* GL_EXT_422_pixels */ + +/* ---------------------------- GL_EXT_Cg_shader --------------------------- */ + +#ifndef GL_EXT_Cg_shader +#define GL_EXT_Cg_shader 1 + +#define GL_CG_VERTEX_SHADER_EXT 0x890E +#define GL_CG_FRAGMENT_SHADER_EXT 0x890F + +#define GLEW_EXT_Cg_shader GLEW_GET_VAR(__GLEW_EXT_Cg_shader) + +#endif /* GL_EXT_Cg_shader */ + +/* ------------------------------ GL_EXT_abgr ------------------------------ */ + +#ifndef GL_EXT_abgr +#define GL_EXT_abgr 1 + +#define GL_ABGR_EXT 0x8000 + +#define GLEW_EXT_abgr GLEW_GET_VAR(__GLEW_EXT_abgr) + +#endif /* GL_EXT_abgr */ + +/* ------------------------------ GL_EXT_bgra ------------------------------ */ + +#ifndef GL_EXT_bgra +#define GL_EXT_bgra 1 + +#define GL_BGR_EXT 0x80E0 +#define GL_BGRA_EXT 0x80E1 + +#define GLEW_EXT_bgra GLEW_GET_VAR(__GLEW_EXT_bgra) + +#endif /* GL_EXT_bgra */ + +/* ------------------------ GL_EXT_bindable_uniform ------------------------ */ + +#ifndef GL_EXT_bindable_uniform +#define GL_EXT_bindable_uniform 1 + +#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 +#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 +#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 +#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED +#define GL_UNIFORM_BUFFER_EXT 0x8DEE +#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF + +typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); +typedef GLintptr (GLAPIENTRY * PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location); +typedef void (GLAPIENTRY * PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); + +#define glGetUniformBufferSizeEXT GLEW_GET_FUN(__glewGetUniformBufferSizeEXT) +#define glGetUniformOffsetEXT GLEW_GET_FUN(__glewGetUniformOffsetEXT) +#define glUniformBufferEXT GLEW_GET_FUN(__glewUniformBufferEXT) + +#define GLEW_EXT_bindable_uniform GLEW_GET_VAR(__GLEW_EXT_bindable_uniform) + +#endif /* GL_EXT_bindable_uniform */ + +/* --------------------------- GL_EXT_blend_color -------------------------- */ + +#ifndef GL_EXT_blend_color +#define GL_EXT_blend_color 1 + +#define GL_CONSTANT_COLOR_EXT 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 +#define GL_CONSTANT_ALPHA_EXT 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 +#define GL_BLEND_COLOR_EXT 0x8005 + +typedef void (GLAPIENTRY * PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); + +#define glBlendColorEXT GLEW_GET_FUN(__glewBlendColorEXT) + +#define GLEW_EXT_blend_color GLEW_GET_VAR(__GLEW_EXT_blend_color) + +#endif /* GL_EXT_blend_color */ + +/* --------------------- GL_EXT_blend_equation_separate -------------------- */ + +#ifndef GL_EXT_blend_equation_separate +#define GL_EXT_blend_equation_separate 1 + +#define GL_BLEND_EQUATION_RGB_EXT 0x8009 +#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D + +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); + +#define glBlendEquationSeparateEXT GLEW_GET_FUN(__glewBlendEquationSeparateEXT) + +#define GLEW_EXT_blend_equation_separate GLEW_GET_VAR(__GLEW_EXT_blend_equation_separate) + +#endif /* GL_EXT_blend_equation_separate */ + +/* ----------------------- GL_EXT_blend_func_separate ---------------------- */ + +#ifndef GL_EXT_blend_func_separate +#define GL_EXT_blend_func_separate 1 + +#define GL_BLEND_DST_RGB_EXT 0x80C8 +#define GL_BLEND_SRC_RGB_EXT 0x80C9 +#define GL_BLEND_DST_ALPHA_EXT 0x80CA +#define GL_BLEND_SRC_ALPHA_EXT 0x80CB + +typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); + +#define glBlendFuncSeparateEXT GLEW_GET_FUN(__glewBlendFuncSeparateEXT) + +#define GLEW_EXT_blend_func_separate GLEW_GET_VAR(__GLEW_EXT_blend_func_separate) + +#endif /* GL_EXT_blend_func_separate */ + +/* ------------------------- GL_EXT_blend_logic_op ------------------------- */ + +#ifndef GL_EXT_blend_logic_op +#define GL_EXT_blend_logic_op 1 + +#define GLEW_EXT_blend_logic_op GLEW_GET_VAR(__GLEW_EXT_blend_logic_op) + +#endif /* GL_EXT_blend_logic_op */ + +/* -------------------------- GL_EXT_blend_minmax -------------------------- */ + +#ifndef GL_EXT_blend_minmax +#define GL_EXT_blend_minmax 1 + +#define GL_FUNC_ADD_EXT 0x8006 +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 +#define GL_BLEND_EQUATION_EXT 0x8009 + +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); + +#define glBlendEquationEXT GLEW_GET_FUN(__glewBlendEquationEXT) + +#define GLEW_EXT_blend_minmax GLEW_GET_VAR(__GLEW_EXT_blend_minmax) + +#endif /* GL_EXT_blend_minmax */ + +/* ------------------------- GL_EXT_blend_subtract ------------------------- */ + +#ifndef GL_EXT_blend_subtract +#define GL_EXT_blend_subtract 1 + +#define GL_FUNC_SUBTRACT_EXT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B + +#define GLEW_EXT_blend_subtract GLEW_GET_VAR(__GLEW_EXT_blend_subtract) + +#endif /* GL_EXT_blend_subtract */ + +/* ------------------------ GL_EXT_clip_volume_hint ------------------------ */ + +#ifndef GL_EXT_clip_volume_hint +#define GL_EXT_clip_volume_hint 1 + +#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 + +#define GLEW_EXT_clip_volume_hint GLEW_GET_VAR(__GLEW_EXT_clip_volume_hint) + +#endif /* GL_EXT_clip_volume_hint */ + +/* ------------------------------ GL_EXT_cmyka ----------------------------- */ + +#ifndef GL_EXT_cmyka +#define GL_EXT_cmyka 1 + +#define GL_CMYK_EXT 0x800C +#define GL_CMYKA_EXT 0x800D +#define GL_PACK_CMYK_HINT_EXT 0x800E +#define GL_UNPACK_CMYK_HINT_EXT 0x800F + +#define GLEW_EXT_cmyka GLEW_GET_VAR(__GLEW_EXT_cmyka) + +#endif /* GL_EXT_cmyka */ + +/* ------------------------- GL_EXT_color_subtable ------------------------- */ + +#ifndef GL_EXT_color_subtable +#define GL_EXT_color_subtable 1 + +typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void* data); +typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); + +#define glColorSubTableEXT GLEW_GET_FUN(__glewColorSubTableEXT) +#define glCopyColorSubTableEXT GLEW_GET_FUN(__glewCopyColorSubTableEXT) + +#define GLEW_EXT_color_subtable GLEW_GET_VAR(__GLEW_EXT_color_subtable) + +#endif /* GL_EXT_color_subtable */ + +/* ---------------------- GL_EXT_compiled_vertex_array --------------------- */ + +#ifndef GL_EXT_compiled_vertex_array +#define GL_EXT_compiled_vertex_array 1 + +#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 +#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 + +typedef void (GLAPIENTRY * PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); +typedef void (GLAPIENTRY * PFNGLUNLOCKARRAYSEXTPROC) (void); + +#define glLockArraysEXT GLEW_GET_FUN(__glewLockArraysEXT) +#define glUnlockArraysEXT GLEW_GET_FUN(__glewUnlockArraysEXT) + +#define GLEW_EXT_compiled_vertex_array GLEW_GET_VAR(__GLEW_EXT_compiled_vertex_array) + +#endif /* GL_EXT_compiled_vertex_array */ + +/* --------------------------- GL_EXT_convolution -------------------------- */ + +#ifndef GL_EXT_convolution +#define GL_EXT_convolution 1 + +#define GL_CONVOLUTION_1D_EXT 0x8010 +#define GL_CONVOLUTION_2D_EXT 0x8011 +#define GL_SEPARABLE_2D_EXT 0x8012 +#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 +#define GL_REDUCE_EXT 0x8016 +#define GL_CONVOLUTION_FORMAT_EXT 0x8017 +#define GL_CONVOLUTION_WIDTH_EXT 0x8018 +#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 + +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void* image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void* image); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void* row, void* column, void* span); +typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* row, const void* column); + +#define glConvolutionFilter1DEXT GLEW_GET_FUN(__glewConvolutionFilter1DEXT) +#define glConvolutionFilter2DEXT GLEW_GET_FUN(__glewConvolutionFilter2DEXT) +#define glConvolutionParameterfEXT GLEW_GET_FUN(__glewConvolutionParameterfEXT) +#define glConvolutionParameterfvEXT GLEW_GET_FUN(__glewConvolutionParameterfvEXT) +#define glConvolutionParameteriEXT GLEW_GET_FUN(__glewConvolutionParameteriEXT) +#define glConvolutionParameterivEXT GLEW_GET_FUN(__glewConvolutionParameterivEXT) +#define glCopyConvolutionFilter1DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter1DEXT) +#define glCopyConvolutionFilter2DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter2DEXT) +#define glGetConvolutionFilterEXT GLEW_GET_FUN(__glewGetConvolutionFilterEXT) +#define glGetConvolutionParameterfvEXT GLEW_GET_FUN(__glewGetConvolutionParameterfvEXT) +#define glGetConvolutionParameterivEXT GLEW_GET_FUN(__glewGetConvolutionParameterivEXT) +#define glGetSeparableFilterEXT GLEW_GET_FUN(__glewGetSeparableFilterEXT) +#define glSeparableFilter2DEXT GLEW_GET_FUN(__glewSeparableFilter2DEXT) + +#define GLEW_EXT_convolution GLEW_GET_VAR(__GLEW_EXT_convolution) + +#endif /* GL_EXT_convolution */ + +/* ------------------------ GL_EXT_coordinate_frame ------------------------ */ + +#ifndef GL_EXT_coordinate_frame +#define GL_EXT_coordinate_frame 1 + +#define GL_TANGENT_ARRAY_EXT 0x8439 +#define GL_BINORMAL_ARRAY_EXT 0x843A +#define GL_CURRENT_TANGENT_EXT 0x843B +#define GL_CURRENT_BINORMAL_EXT 0x843C +#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E +#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F +#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 +#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 +#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 +#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 +#define GL_MAP1_TANGENT_EXT 0x8444 +#define GL_MAP2_TANGENT_EXT 0x8445 +#define GL_MAP1_BINORMAL_EXT 0x8446 +#define GL_MAP2_BINORMAL_EXT 0x8447 + +typedef void (GLAPIENTRY * PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, void* pointer); +typedef void (GLAPIENTRY * PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, void* pointer); + +#define glBinormalPointerEXT GLEW_GET_FUN(__glewBinormalPointerEXT) +#define glTangentPointerEXT GLEW_GET_FUN(__glewTangentPointerEXT) + +#define GLEW_EXT_coordinate_frame GLEW_GET_VAR(__GLEW_EXT_coordinate_frame) + +#endif /* GL_EXT_coordinate_frame */ + +/* -------------------------- GL_EXT_copy_texture -------------------------- */ + +#ifndef GL_EXT_copy_texture +#define GL_EXT_copy_texture 1 + +typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); + +#define glCopyTexImage1DEXT GLEW_GET_FUN(__glewCopyTexImage1DEXT) +#define glCopyTexImage2DEXT GLEW_GET_FUN(__glewCopyTexImage2DEXT) +#define glCopyTexSubImage1DEXT GLEW_GET_FUN(__glewCopyTexSubImage1DEXT) +#define glCopyTexSubImage2DEXT GLEW_GET_FUN(__glewCopyTexSubImage2DEXT) +#define glCopyTexSubImage3DEXT GLEW_GET_FUN(__glewCopyTexSubImage3DEXT) + +#define GLEW_EXT_copy_texture GLEW_GET_VAR(__GLEW_EXT_copy_texture) + +#endif /* GL_EXT_copy_texture */ + +/* --------------------------- GL_EXT_cull_vertex -------------------------- */ + +#ifndef GL_EXT_cull_vertex +#define GL_EXT_cull_vertex 1 + +#define GL_CULL_VERTEX_EXT 0x81AA +#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB +#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC + +typedef void (GLAPIENTRY * PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat* params); + +#define glCullParameterdvEXT GLEW_GET_FUN(__glewCullParameterdvEXT) +#define glCullParameterfvEXT GLEW_GET_FUN(__glewCullParameterfvEXT) + +#define GLEW_EXT_cull_vertex GLEW_GET_VAR(__GLEW_EXT_cull_vertex) + +#endif /* GL_EXT_cull_vertex */ + +/* ------------------------ GL_EXT_depth_bounds_test ----------------------- */ + +#ifndef GL_EXT_depth_bounds_test +#define GL_EXT_depth_bounds_test 1 + +#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 +#define GL_DEPTH_BOUNDS_EXT 0x8891 + +typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); + +#define glDepthBoundsEXT GLEW_GET_FUN(__glewDepthBoundsEXT) + +#define GLEW_EXT_depth_bounds_test GLEW_GET_VAR(__GLEW_EXT_depth_bounds_test) + +#endif /* GL_EXT_depth_bounds_test */ + +/* ----------------------- GL_EXT_direct_state_access ---------------------- */ + +#ifndef GL_EXT_direct_state_access +#define GL_EXT_direct_state_access 1 + +#define GL_PROGRAM_MATRIX_EXT 0x8E2D +#define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E +#define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F + +typedef void (GLAPIENTRY * PFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture); +typedef GLenum (GLAPIENTRY * PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target); +typedef void (GLAPIENTRY * PFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data); +typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); +typedef void (GLAPIENTRY * PFNGLDISABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); +typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); +typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); +typedef void (GLAPIENTRY * PFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); +typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum* bufs); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); +typedef void (GLAPIENTRY * PFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target); +typedef void (GLAPIENTRY * PFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, void* img); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, void* img); +typedef void (GLAPIENTRY * PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETFLOATI_VEXTPROC) (GLenum pname, GLuint index, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void* pixels); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, void** params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void* data); +typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, void* string); +typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLvoid** params); +typedef void (GLAPIENTRY * PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, GLvoid** params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void* pixels); +typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINTEGERVEXTPROC) (GLuint vaobj, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLvoid** param); +typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYPOINTERVEXTPROC) (GLuint vaobj, GLenum pname, GLvoid** param); +typedef GLvoid * (GLAPIENTRY * PFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access); +typedef GLvoid * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (GLAPIENTRY * PFNGLMATRIXFRUSTUMEXTPROC) (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f); +typedef void (GLAPIENTRY * PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum matrixMode); +typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum matrixMode, const GLdouble* m); +typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXLOADDEXTPROC) (GLenum matrixMode, const GLdouble* m); +typedef void (GLAPIENTRY * PFNGLMATRIXLOADFEXTPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum matrixMode, const GLdouble* m); +typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXMULTDEXTPROC) (GLenum matrixMode, const GLdouble* m); +typedef void (GLAPIENTRY * PFNGLMATRIXMULTFEXTPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXORTHOEXTPROC) (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f); +typedef void (GLAPIENTRY * PFNGLMATRIXPOPEXTPROC) (GLenum matrixMode); +typedef void (GLAPIENTRY * PFNGLMATRIXPUSHEXTPROC) (GLenum matrixMode); +typedef void (GLAPIENTRY * PFNGLMATRIXROTATEDEXTPROC) (GLenum matrixMode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLMATRIXROTATEFEXTPROC) (GLenum matrixMode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLMATRIXSCALEDEXTPROC) (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLMATRIXSCALEFEXTPROC) (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void* pointer); +typedef void (GLAPIENTRY * PFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); +typedef void (GLAPIENTRY * PFNGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint* params); +typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat* param); +typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* param); +typedef void (GLAPIENTRY * PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const void* data, GLenum usage); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data); +typedef void (GLAPIENTRY * PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint* params); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint* params); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint* params); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint* params); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const void* string); +typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); +typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint* params); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat* param); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint* param); +typedef void (GLAPIENTRY * PFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels); +typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYINDEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYNORMALOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); + +#define glBindMultiTextureEXT GLEW_GET_FUN(__glewBindMultiTextureEXT) +#define glCheckNamedFramebufferStatusEXT GLEW_GET_FUN(__glewCheckNamedFramebufferStatusEXT) +#define glClientAttribDefaultEXT GLEW_GET_FUN(__glewClientAttribDefaultEXT) +#define glCompressedMultiTexImage1DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage1DEXT) +#define glCompressedMultiTexImage2DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage2DEXT) +#define glCompressedMultiTexImage3DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage3DEXT) +#define glCompressedMultiTexSubImage1DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage1DEXT) +#define glCompressedMultiTexSubImage2DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage2DEXT) +#define glCompressedMultiTexSubImage3DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage3DEXT) +#define glCompressedTextureImage1DEXT GLEW_GET_FUN(__glewCompressedTextureImage1DEXT) +#define glCompressedTextureImage2DEXT GLEW_GET_FUN(__glewCompressedTextureImage2DEXT) +#define glCompressedTextureImage3DEXT GLEW_GET_FUN(__glewCompressedTextureImage3DEXT) +#define glCompressedTextureSubImage1DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage1DEXT) +#define glCompressedTextureSubImage2DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage2DEXT) +#define glCompressedTextureSubImage3DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage3DEXT) +#define glCopyMultiTexImage1DEXT GLEW_GET_FUN(__glewCopyMultiTexImage1DEXT) +#define glCopyMultiTexImage2DEXT GLEW_GET_FUN(__glewCopyMultiTexImage2DEXT) +#define glCopyMultiTexSubImage1DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage1DEXT) +#define glCopyMultiTexSubImage2DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage2DEXT) +#define glCopyMultiTexSubImage3DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage3DEXT) +#define glCopyTextureImage1DEXT GLEW_GET_FUN(__glewCopyTextureImage1DEXT) +#define glCopyTextureImage2DEXT GLEW_GET_FUN(__glewCopyTextureImage2DEXT) +#define glCopyTextureSubImage1DEXT GLEW_GET_FUN(__glewCopyTextureSubImage1DEXT) +#define glCopyTextureSubImage2DEXT GLEW_GET_FUN(__glewCopyTextureSubImage2DEXT) +#define glCopyTextureSubImage3DEXT GLEW_GET_FUN(__glewCopyTextureSubImage3DEXT) +#define glDisableClientStateIndexedEXT GLEW_GET_FUN(__glewDisableClientStateIndexedEXT) +#define glDisableClientStateiEXT GLEW_GET_FUN(__glewDisableClientStateiEXT) +#define glDisableVertexArrayAttribEXT GLEW_GET_FUN(__glewDisableVertexArrayAttribEXT) +#define glDisableVertexArrayEXT GLEW_GET_FUN(__glewDisableVertexArrayEXT) +#define glEnableClientStateIndexedEXT GLEW_GET_FUN(__glewEnableClientStateIndexedEXT) +#define glEnableClientStateiEXT GLEW_GET_FUN(__glewEnableClientStateiEXT) +#define glEnableVertexArrayAttribEXT GLEW_GET_FUN(__glewEnableVertexArrayAttribEXT) +#define glEnableVertexArrayEXT GLEW_GET_FUN(__glewEnableVertexArrayEXT) +#define glFlushMappedNamedBufferRangeEXT GLEW_GET_FUN(__glewFlushMappedNamedBufferRangeEXT) +#define glFramebufferDrawBufferEXT GLEW_GET_FUN(__glewFramebufferDrawBufferEXT) +#define glFramebufferDrawBuffersEXT GLEW_GET_FUN(__glewFramebufferDrawBuffersEXT) +#define glFramebufferReadBufferEXT GLEW_GET_FUN(__glewFramebufferReadBufferEXT) +#define glGenerateMultiTexMipmapEXT GLEW_GET_FUN(__glewGenerateMultiTexMipmapEXT) +#define glGenerateTextureMipmapEXT GLEW_GET_FUN(__glewGenerateTextureMipmapEXT) +#define glGetCompressedMultiTexImageEXT GLEW_GET_FUN(__glewGetCompressedMultiTexImageEXT) +#define glGetCompressedTextureImageEXT GLEW_GET_FUN(__glewGetCompressedTextureImageEXT) +#define glGetDoubleIndexedvEXT GLEW_GET_FUN(__glewGetDoubleIndexedvEXT) +#define glGetDoublei_vEXT GLEW_GET_FUN(__glewGetDoublei_vEXT) +#define glGetFloatIndexedvEXT GLEW_GET_FUN(__glewGetFloatIndexedvEXT) +#define glGetFloati_vEXT GLEW_GET_FUN(__glewGetFloati_vEXT) +#define glGetFramebufferParameterivEXT GLEW_GET_FUN(__glewGetFramebufferParameterivEXT) +#define glGetMultiTexEnvfvEXT GLEW_GET_FUN(__glewGetMultiTexEnvfvEXT) +#define glGetMultiTexEnvivEXT GLEW_GET_FUN(__glewGetMultiTexEnvivEXT) +#define glGetMultiTexGendvEXT GLEW_GET_FUN(__glewGetMultiTexGendvEXT) +#define glGetMultiTexGenfvEXT GLEW_GET_FUN(__glewGetMultiTexGenfvEXT) +#define glGetMultiTexGenivEXT GLEW_GET_FUN(__glewGetMultiTexGenivEXT) +#define glGetMultiTexImageEXT GLEW_GET_FUN(__glewGetMultiTexImageEXT) +#define glGetMultiTexLevelParameterfvEXT GLEW_GET_FUN(__glewGetMultiTexLevelParameterfvEXT) +#define glGetMultiTexLevelParameterivEXT GLEW_GET_FUN(__glewGetMultiTexLevelParameterivEXT) +#define glGetMultiTexParameterIivEXT GLEW_GET_FUN(__glewGetMultiTexParameterIivEXT) +#define glGetMultiTexParameterIuivEXT GLEW_GET_FUN(__glewGetMultiTexParameterIuivEXT) +#define glGetMultiTexParameterfvEXT GLEW_GET_FUN(__glewGetMultiTexParameterfvEXT) +#define glGetMultiTexParameterivEXT GLEW_GET_FUN(__glewGetMultiTexParameterivEXT) +#define glGetNamedBufferParameterivEXT GLEW_GET_FUN(__glewGetNamedBufferParameterivEXT) +#define glGetNamedBufferPointervEXT GLEW_GET_FUN(__glewGetNamedBufferPointervEXT) +#define glGetNamedBufferSubDataEXT GLEW_GET_FUN(__glewGetNamedBufferSubDataEXT) +#define glGetNamedFramebufferAttachmentParameterivEXT GLEW_GET_FUN(__glewGetNamedFramebufferAttachmentParameterivEXT) +#define glGetNamedProgramLocalParameterIivEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterIivEXT) +#define glGetNamedProgramLocalParameterIuivEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterIuivEXT) +#define glGetNamedProgramLocalParameterdvEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterdvEXT) +#define glGetNamedProgramLocalParameterfvEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterfvEXT) +#define glGetNamedProgramStringEXT GLEW_GET_FUN(__glewGetNamedProgramStringEXT) +#define glGetNamedProgramivEXT GLEW_GET_FUN(__glewGetNamedProgramivEXT) +#define glGetNamedRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetNamedRenderbufferParameterivEXT) +#define glGetPointerIndexedvEXT GLEW_GET_FUN(__glewGetPointerIndexedvEXT) +#define glGetPointeri_vEXT GLEW_GET_FUN(__glewGetPointeri_vEXT) +#define glGetTextureImageEXT GLEW_GET_FUN(__glewGetTextureImageEXT) +#define glGetTextureLevelParameterfvEXT GLEW_GET_FUN(__glewGetTextureLevelParameterfvEXT) +#define glGetTextureLevelParameterivEXT GLEW_GET_FUN(__glewGetTextureLevelParameterivEXT) +#define glGetTextureParameterIivEXT GLEW_GET_FUN(__glewGetTextureParameterIivEXT) +#define glGetTextureParameterIuivEXT GLEW_GET_FUN(__glewGetTextureParameterIuivEXT) +#define glGetTextureParameterfvEXT GLEW_GET_FUN(__glewGetTextureParameterfvEXT) +#define glGetTextureParameterivEXT GLEW_GET_FUN(__glewGetTextureParameterivEXT) +#define glGetVertexArrayIntegeri_vEXT GLEW_GET_FUN(__glewGetVertexArrayIntegeri_vEXT) +#define glGetVertexArrayIntegervEXT GLEW_GET_FUN(__glewGetVertexArrayIntegervEXT) +#define glGetVertexArrayPointeri_vEXT GLEW_GET_FUN(__glewGetVertexArrayPointeri_vEXT) +#define glGetVertexArrayPointervEXT GLEW_GET_FUN(__glewGetVertexArrayPointervEXT) +#define glMapNamedBufferEXT GLEW_GET_FUN(__glewMapNamedBufferEXT) +#define glMapNamedBufferRangeEXT GLEW_GET_FUN(__glewMapNamedBufferRangeEXT) +#define glMatrixFrustumEXT GLEW_GET_FUN(__glewMatrixFrustumEXT) +#define glMatrixLoadIdentityEXT GLEW_GET_FUN(__glewMatrixLoadIdentityEXT) +#define glMatrixLoadTransposedEXT GLEW_GET_FUN(__glewMatrixLoadTransposedEXT) +#define glMatrixLoadTransposefEXT GLEW_GET_FUN(__glewMatrixLoadTransposefEXT) +#define glMatrixLoaddEXT GLEW_GET_FUN(__glewMatrixLoaddEXT) +#define glMatrixLoadfEXT GLEW_GET_FUN(__glewMatrixLoadfEXT) +#define glMatrixMultTransposedEXT GLEW_GET_FUN(__glewMatrixMultTransposedEXT) +#define glMatrixMultTransposefEXT GLEW_GET_FUN(__glewMatrixMultTransposefEXT) +#define glMatrixMultdEXT GLEW_GET_FUN(__glewMatrixMultdEXT) +#define glMatrixMultfEXT GLEW_GET_FUN(__glewMatrixMultfEXT) +#define glMatrixOrthoEXT GLEW_GET_FUN(__glewMatrixOrthoEXT) +#define glMatrixPopEXT GLEW_GET_FUN(__glewMatrixPopEXT) +#define glMatrixPushEXT GLEW_GET_FUN(__glewMatrixPushEXT) +#define glMatrixRotatedEXT GLEW_GET_FUN(__glewMatrixRotatedEXT) +#define glMatrixRotatefEXT GLEW_GET_FUN(__glewMatrixRotatefEXT) +#define glMatrixScaledEXT GLEW_GET_FUN(__glewMatrixScaledEXT) +#define glMatrixScalefEXT GLEW_GET_FUN(__glewMatrixScalefEXT) +#define glMatrixTranslatedEXT GLEW_GET_FUN(__glewMatrixTranslatedEXT) +#define glMatrixTranslatefEXT GLEW_GET_FUN(__glewMatrixTranslatefEXT) +#define glMultiTexBufferEXT GLEW_GET_FUN(__glewMultiTexBufferEXT) +#define glMultiTexCoordPointerEXT GLEW_GET_FUN(__glewMultiTexCoordPointerEXT) +#define glMultiTexEnvfEXT GLEW_GET_FUN(__glewMultiTexEnvfEXT) +#define glMultiTexEnvfvEXT GLEW_GET_FUN(__glewMultiTexEnvfvEXT) +#define glMultiTexEnviEXT GLEW_GET_FUN(__glewMultiTexEnviEXT) +#define glMultiTexEnvivEXT GLEW_GET_FUN(__glewMultiTexEnvivEXT) +#define glMultiTexGendEXT GLEW_GET_FUN(__glewMultiTexGendEXT) +#define glMultiTexGendvEXT GLEW_GET_FUN(__glewMultiTexGendvEXT) +#define glMultiTexGenfEXT GLEW_GET_FUN(__glewMultiTexGenfEXT) +#define glMultiTexGenfvEXT GLEW_GET_FUN(__glewMultiTexGenfvEXT) +#define glMultiTexGeniEXT GLEW_GET_FUN(__glewMultiTexGeniEXT) +#define glMultiTexGenivEXT GLEW_GET_FUN(__glewMultiTexGenivEXT) +#define glMultiTexImage1DEXT GLEW_GET_FUN(__glewMultiTexImage1DEXT) +#define glMultiTexImage2DEXT GLEW_GET_FUN(__glewMultiTexImage2DEXT) +#define glMultiTexImage3DEXT GLEW_GET_FUN(__glewMultiTexImage3DEXT) +#define glMultiTexParameterIivEXT GLEW_GET_FUN(__glewMultiTexParameterIivEXT) +#define glMultiTexParameterIuivEXT GLEW_GET_FUN(__glewMultiTexParameterIuivEXT) +#define glMultiTexParameterfEXT GLEW_GET_FUN(__glewMultiTexParameterfEXT) +#define glMultiTexParameterfvEXT GLEW_GET_FUN(__glewMultiTexParameterfvEXT) +#define glMultiTexParameteriEXT GLEW_GET_FUN(__glewMultiTexParameteriEXT) +#define glMultiTexParameterivEXT GLEW_GET_FUN(__glewMultiTexParameterivEXT) +#define glMultiTexRenderbufferEXT GLEW_GET_FUN(__glewMultiTexRenderbufferEXT) +#define glMultiTexSubImage1DEXT GLEW_GET_FUN(__glewMultiTexSubImage1DEXT) +#define glMultiTexSubImage2DEXT GLEW_GET_FUN(__glewMultiTexSubImage2DEXT) +#define glMultiTexSubImage3DEXT GLEW_GET_FUN(__glewMultiTexSubImage3DEXT) +#define glNamedBufferDataEXT GLEW_GET_FUN(__glewNamedBufferDataEXT) +#define glNamedBufferSubDataEXT GLEW_GET_FUN(__glewNamedBufferSubDataEXT) +#define glNamedCopyBufferSubDataEXT GLEW_GET_FUN(__glewNamedCopyBufferSubDataEXT) +#define glNamedFramebufferRenderbufferEXT GLEW_GET_FUN(__glewNamedFramebufferRenderbufferEXT) +#define glNamedFramebufferTexture1DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture1DEXT) +#define glNamedFramebufferTexture2DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture2DEXT) +#define glNamedFramebufferTexture3DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture3DEXT) +#define glNamedFramebufferTextureEXT GLEW_GET_FUN(__glewNamedFramebufferTextureEXT) +#define glNamedFramebufferTextureFaceEXT GLEW_GET_FUN(__glewNamedFramebufferTextureFaceEXT) +#define glNamedFramebufferTextureLayerEXT GLEW_GET_FUN(__glewNamedFramebufferTextureLayerEXT) +#define glNamedProgramLocalParameter4dEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4dEXT) +#define glNamedProgramLocalParameter4dvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4dvEXT) +#define glNamedProgramLocalParameter4fEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4fEXT) +#define glNamedProgramLocalParameter4fvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4fvEXT) +#define glNamedProgramLocalParameterI4iEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4iEXT) +#define glNamedProgramLocalParameterI4ivEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4ivEXT) +#define glNamedProgramLocalParameterI4uiEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4uiEXT) +#define glNamedProgramLocalParameterI4uivEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4uivEXT) +#define glNamedProgramLocalParameters4fvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameters4fvEXT) +#define glNamedProgramLocalParametersI4ivEXT GLEW_GET_FUN(__glewNamedProgramLocalParametersI4ivEXT) +#define glNamedProgramLocalParametersI4uivEXT GLEW_GET_FUN(__glewNamedProgramLocalParametersI4uivEXT) +#define glNamedProgramStringEXT GLEW_GET_FUN(__glewNamedProgramStringEXT) +#define glNamedRenderbufferStorageEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageEXT) +#define glNamedRenderbufferStorageMultisampleCoverageEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleCoverageEXT) +#define glNamedRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleEXT) +#define glProgramUniform1fEXT GLEW_GET_FUN(__glewProgramUniform1fEXT) +#define glProgramUniform1fvEXT GLEW_GET_FUN(__glewProgramUniform1fvEXT) +#define glProgramUniform1iEXT GLEW_GET_FUN(__glewProgramUniform1iEXT) +#define glProgramUniform1ivEXT GLEW_GET_FUN(__glewProgramUniform1ivEXT) +#define glProgramUniform1uiEXT GLEW_GET_FUN(__glewProgramUniform1uiEXT) +#define glProgramUniform1uivEXT GLEW_GET_FUN(__glewProgramUniform1uivEXT) +#define glProgramUniform2fEXT GLEW_GET_FUN(__glewProgramUniform2fEXT) +#define glProgramUniform2fvEXT GLEW_GET_FUN(__glewProgramUniform2fvEXT) +#define glProgramUniform2iEXT GLEW_GET_FUN(__glewProgramUniform2iEXT) +#define glProgramUniform2ivEXT GLEW_GET_FUN(__glewProgramUniform2ivEXT) +#define glProgramUniform2uiEXT GLEW_GET_FUN(__glewProgramUniform2uiEXT) +#define glProgramUniform2uivEXT GLEW_GET_FUN(__glewProgramUniform2uivEXT) +#define glProgramUniform3fEXT GLEW_GET_FUN(__glewProgramUniform3fEXT) +#define glProgramUniform3fvEXT GLEW_GET_FUN(__glewProgramUniform3fvEXT) +#define glProgramUniform3iEXT GLEW_GET_FUN(__glewProgramUniform3iEXT) +#define glProgramUniform3ivEXT GLEW_GET_FUN(__glewProgramUniform3ivEXT) +#define glProgramUniform3uiEXT GLEW_GET_FUN(__glewProgramUniform3uiEXT) +#define glProgramUniform3uivEXT GLEW_GET_FUN(__glewProgramUniform3uivEXT) +#define glProgramUniform4fEXT GLEW_GET_FUN(__glewProgramUniform4fEXT) +#define glProgramUniform4fvEXT GLEW_GET_FUN(__glewProgramUniform4fvEXT) +#define glProgramUniform4iEXT GLEW_GET_FUN(__glewProgramUniform4iEXT) +#define glProgramUniform4ivEXT GLEW_GET_FUN(__glewProgramUniform4ivEXT) +#define glProgramUniform4uiEXT GLEW_GET_FUN(__glewProgramUniform4uiEXT) +#define glProgramUniform4uivEXT GLEW_GET_FUN(__glewProgramUniform4uivEXT) +#define glProgramUniformMatrix2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2fvEXT) +#define glProgramUniformMatrix2x3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x3fvEXT) +#define glProgramUniformMatrix2x4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x4fvEXT) +#define glProgramUniformMatrix3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3fvEXT) +#define glProgramUniformMatrix3x2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x2fvEXT) +#define glProgramUniformMatrix3x4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x4fvEXT) +#define glProgramUniformMatrix4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4fvEXT) +#define glProgramUniformMatrix4x2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x2fvEXT) +#define glProgramUniformMatrix4x3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x3fvEXT) +#define glPushClientAttribDefaultEXT GLEW_GET_FUN(__glewPushClientAttribDefaultEXT) +#define glTextureBufferEXT GLEW_GET_FUN(__glewTextureBufferEXT) +#define glTextureImage1DEXT GLEW_GET_FUN(__glewTextureImage1DEXT) +#define glTextureImage2DEXT GLEW_GET_FUN(__glewTextureImage2DEXT) +#define glTextureImage3DEXT GLEW_GET_FUN(__glewTextureImage3DEXT) +#define glTextureParameterIivEXT GLEW_GET_FUN(__glewTextureParameterIivEXT) +#define glTextureParameterIuivEXT GLEW_GET_FUN(__glewTextureParameterIuivEXT) +#define glTextureParameterfEXT GLEW_GET_FUN(__glewTextureParameterfEXT) +#define glTextureParameterfvEXT GLEW_GET_FUN(__glewTextureParameterfvEXT) +#define glTextureParameteriEXT GLEW_GET_FUN(__glewTextureParameteriEXT) +#define glTextureParameterivEXT GLEW_GET_FUN(__glewTextureParameterivEXT) +#define glTextureRenderbufferEXT GLEW_GET_FUN(__glewTextureRenderbufferEXT) +#define glTextureSubImage1DEXT GLEW_GET_FUN(__glewTextureSubImage1DEXT) +#define glTextureSubImage2DEXT GLEW_GET_FUN(__glewTextureSubImage2DEXT) +#define glTextureSubImage3DEXT GLEW_GET_FUN(__glewTextureSubImage3DEXT) +#define glUnmapNamedBufferEXT GLEW_GET_FUN(__glewUnmapNamedBufferEXT) +#define glVertexArrayColorOffsetEXT GLEW_GET_FUN(__glewVertexArrayColorOffsetEXT) +#define glVertexArrayEdgeFlagOffsetEXT GLEW_GET_FUN(__glewVertexArrayEdgeFlagOffsetEXT) +#define glVertexArrayFogCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayFogCoordOffsetEXT) +#define glVertexArrayIndexOffsetEXT GLEW_GET_FUN(__glewVertexArrayIndexOffsetEXT) +#define glVertexArrayMultiTexCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayMultiTexCoordOffsetEXT) +#define glVertexArrayNormalOffsetEXT GLEW_GET_FUN(__glewVertexArrayNormalOffsetEXT) +#define glVertexArraySecondaryColorOffsetEXT GLEW_GET_FUN(__glewVertexArraySecondaryColorOffsetEXT) +#define glVertexArrayTexCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayTexCoordOffsetEXT) +#define glVertexArrayVertexAttribIOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribIOffsetEXT) +#define glVertexArrayVertexAttribOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribOffsetEXT) +#define glVertexArrayVertexOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexOffsetEXT) + +#define GLEW_EXT_direct_state_access GLEW_GET_VAR(__GLEW_EXT_direct_state_access) + +#endif /* GL_EXT_direct_state_access */ + +/* -------------------------- GL_EXT_draw_buffers2 ------------------------- */ + +#ifndef GL_EXT_draw_buffers2 +#define GL_EXT_draw_buffers2 1 + +typedef void (GLAPIENTRY * PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef void (GLAPIENTRY * PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRY * PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum value, GLuint index, GLboolean* data); +typedef void (GLAPIENTRY * PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum value, GLuint index, GLint* data); +typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); + +#define glColorMaskIndexedEXT GLEW_GET_FUN(__glewColorMaskIndexedEXT) +#define glDisableIndexedEXT GLEW_GET_FUN(__glewDisableIndexedEXT) +#define glEnableIndexedEXT GLEW_GET_FUN(__glewEnableIndexedEXT) +#define glGetBooleanIndexedvEXT GLEW_GET_FUN(__glewGetBooleanIndexedvEXT) +#define glGetIntegerIndexedvEXT GLEW_GET_FUN(__glewGetIntegerIndexedvEXT) +#define glIsEnabledIndexedEXT GLEW_GET_FUN(__glewIsEnabledIndexedEXT) + +#define GLEW_EXT_draw_buffers2 GLEW_GET_VAR(__GLEW_EXT_draw_buffers2) + +#endif /* GL_EXT_draw_buffers2 */ + +/* ------------------------- GL_EXT_draw_instanced ------------------------- */ + +#ifndef GL_EXT_draw_instanced +#define GL_EXT_draw_instanced 1 + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); + +#define glDrawArraysInstancedEXT GLEW_GET_FUN(__glewDrawArraysInstancedEXT) +#define glDrawElementsInstancedEXT GLEW_GET_FUN(__glewDrawElementsInstancedEXT) + +#define GLEW_EXT_draw_instanced GLEW_GET_VAR(__GLEW_EXT_draw_instanced) + +#endif /* GL_EXT_draw_instanced */ + +/* ----------------------- GL_EXT_draw_range_elements ---------------------- */ + +#ifndef GL_EXT_draw_range_elements +#define GL_EXT_draw_range_elements 1 + +#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 +#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 + +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); + +#define glDrawRangeElementsEXT GLEW_GET_FUN(__glewDrawRangeElementsEXT) + +#define GLEW_EXT_draw_range_elements GLEW_GET_VAR(__GLEW_EXT_draw_range_elements) + +#endif /* GL_EXT_draw_range_elements */ + +/* ---------------------------- GL_EXT_fog_coord --------------------------- */ + +#ifndef GL_EXT_fog_coord +#define GL_EXT_fog_coord 1 + +#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 +#define GL_FOG_COORDINATE_EXT 0x8451 +#define GL_FRAGMENT_DEPTH_EXT 0x8452 +#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 +#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 + +typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (GLAPIENTRY * PFNGLFOGCOORDDEXTPROC) (GLdouble coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFEXTPROC) (GLfloat coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); + +#define glFogCoordPointerEXT GLEW_GET_FUN(__glewFogCoordPointerEXT) +#define glFogCoorddEXT GLEW_GET_FUN(__glewFogCoorddEXT) +#define glFogCoorddvEXT GLEW_GET_FUN(__glewFogCoorddvEXT) +#define glFogCoordfEXT GLEW_GET_FUN(__glewFogCoordfEXT) +#define glFogCoordfvEXT GLEW_GET_FUN(__glewFogCoordfvEXT) + +#define GLEW_EXT_fog_coord GLEW_GET_VAR(__GLEW_EXT_fog_coord) + +#endif /* GL_EXT_fog_coord */ + +/* ------------------------ GL_EXT_fragment_lighting ----------------------- */ + +#ifndef GL_EXT_fragment_lighting +#define GL_EXT_fragment_lighting 1 + +#define GL_FRAGMENT_LIGHTING_EXT 0x8400 +#define GL_FRAGMENT_COLOR_MATERIAL_EXT 0x8401 +#define GL_FRAGMENT_COLOR_MATERIAL_FACE_EXT 0x8402 +#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_EXT 0x8403 +#define GL_MAX_FRAGMENT_LIGHTS_EXT 0x8404 +#define GL_MAX_ACTIVE_LIGHTS_EXT 0x8405 +#define GL_CURRENT_RASTER_NORMAL_EXT 0x8406 +#define GL_LIGHT_ENV_MODE_EXT 0x8407 +#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_EXT 0x8408 +#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_EXT 0x8409 +#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_EXT 0x840A +#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_EXT 0x840B +#define GL_FRAGMENT_LIGHT0_EXT 0x840C +#define GL_FRAGMENT_LIGHT7_EXT 0x8413 + +typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALEXTPROC) (GLenum face, GLenum mode); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFEXTPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVEXTPROC) (GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIEXTPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVEXTPROC) (GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFEXTPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIEXTPROC) (GLenum light, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFEXTPROC) (GLenum face, GLenum pname, const GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIEXTPROC) (GLenum face, GLenum pname, const GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLLIGHTENVIEXTPROC) (GLenum pname, GLint param); + +#define glFragmentColorMaterialEXT GLEW_GET_FUN(__glewFragmentColorMaterialEXT) +#define glFragmentLightModelfEXT GLEW_GET_FUN(__glewFragmentLightModelfEXT) +#define glFragmentLightModelfvEXT GLEW_GET_FUN(__glewFragmentLightModelfvEXT) +#define glFragmentLightModeliEXT GLEW_GET_FUN(__glewFragmentLightModeliEXT) +#define glFragmentLightModelivEXT GLEW_GET_FUN(__glewFragmentLightModelivEXT) +#define glFragmentLightfEXT GLEW_GET_FUN(__glewFragmentLightfEXT) +#define glFragmentLightfvEXT GLEW_GET_FUN(__glewFragmentLightfvEXT) +#define glFragmentLightiEXT GLEW_GET_FUN(__glewFragmentLightiEXT) +#define glFragmentLightivEXT GLEW_GET_FUN(__glewFragmentLightivEXT) +#define glFragmentMaterialfEXT GLEW_GET_FUN(__glewFragmentMaterialfEXT) +#define glFragmentMaterialfvEXT GLEW_GET_FUN(__glewFragmentMaterialfvEXT) +#define glFragmentMaterialiEXT GLEW_GET_FUN(__glewFragmentMaterialiEXT) +#define glFragmentMaterialivEXT GLEW_GET_FUN(__glewFragmentMaterialivEXT) +#define glGetFragmentLightfvEXT GLEW_GET_FUN(__glewGetFragmentLightfvEXT) +#define glGetFragmentLightivEXT GLEW_GET_FUN(__glewGetFragmentLightivEXT) +#define glGetFragmentMaterialfvEXT GLEW_GET_FUN(__glewGetFragmentMaterialfvEXT) +#define glGetFragmentMaterialivEXT GLEW_GET_FUN(__glewGetFragmentMaterialivEXT) +#define glLightEnviEXT GLEW_GET_FUN(__glewLightEnviEXT) + +#define GLEW_EXT_fragment_lighting GLEW_GET_VAR(__GLEW_EXT_fragment_lighting) + +#endif /* GL_EXT_fragment_lighting */ + +/* ------------------------ GL_EXT_framebuffer_blit ------------------------ */ + +#ifndef GL_EXT_framebuffer_blit +#define GL_EXT_framebuffer_blit 1 + +#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA + +typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); + +#define glBlitFramebufferEXT GLEW_GET_FUN(__glewBlitFramebufferEXT) + +#define GLEW_EXT_framebuffer_blit GLEW_GET_VAR(__GLEW_EXT_framebuffer_blit) + +#endif /* GL_EXT_framebuffer_blit */ + +/* --------------------- GL_EXT_framebuffer_multisample -------------------- */ + +#ifndef GL_EXT_framebuffer_multisample +#define GL_EXT_framebuffer_multisample 1 + +#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 +#define GL_MAX_SAMPLES_EXT 0x8D57 + +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + +#define glRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewRenderbufferStorageMultisampleEXT) + +#define GLEW_EXT_framebuffer_multisample GLEW_GET_VAR(__GLEW_EXT_framebuffer_multisample) + +#endif /* GL_EXT_framebuffer_multisample */ + +/* ----------------------- GL_EXT_framebuffer_object ----------------------- */ + +#ifndef GL_EXT_framebuffer_object +#define GL_EXT_framebuffer_object 1 + +#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 +#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 +#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 +#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF +#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 +#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 +#define GL_FRAMEBUFFER_EXT 0x8D40 +#define GL_RENDERBUFFER_EXT 0x8D41 +#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 +#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 +#define GL_STENCIL_INDEX1_EXT 0x8D46 +#define GL_STENCIL_INDEX4_EXT 0x8D47 +#define GL_STENCIL_INDEX8_EXT 0x8D48 +#define GL_STENCIL_INDEX16_EXT 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 + +typedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); +typedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); +typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint* framebuffers); +typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint* renderbuffers); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint* framebuffers); +typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint* renderbuffers); +typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); +typedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); + +#define glBindFramebufferEXT GLEW_GET_FUN(__glewBindFramebufferEXT) +#define glBindRenderbufferEXT GLEW_GET_FUN(__glewBindRenderbufferEXT) +#define glCheckFramebufferStatusEXT GLEW_GET_FUN(__glewCheckFramebufferStatusEXT) +#define glDeleteFramebuffersEXT GLEW_GET_FUN(__glewDeleteFramebuffersEXT) +#define glDeleteRenderbuffersEXT GLEW_GET_FUN(__glewDeleteRenderbuffersEXT) +#define glFramebufferRenderbufferEXT GLEW_GET_FUN(__glewFramebufferRenderbufferEXT) +#define glFramebufferTexture1DEXT GLEW_GET_FUN(__glewFramebufferTexture1DEXT) +#define glFramebufferTexture2DEXT GLEW_GET_FUN(__glewFramebufferTexture2DEXT) +#define glFramebufferTexture3DEXT GLEW_GET_FUN(__glewFramebufferTexture3DEXT) +#define glGenFramebuffersEXT GLEW_GET_FUN(__glewGenFramebuffersEXT) +#define glGenRenderbuffersEXT GLEW_GET_FUN(__glewGenRenderbuffersEXT) +#define glGenerateMipmapEXT GLEW_GET_FUN(__glewGenerateMipmapEXT) +#define glGetFramebufferAttachmentParameterivEXT GLEW_GET_FUN(__glewGetFramebufferAttachmentParameterivEXT) +#define glGetRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetRenderbufferParameterivEXT) +#define glIsFramebufferEXT GLEW_GET_FUN(__glewIsFramebufferEXT) +#define glIsRenderbufferEXT GLEW_GET_FUN(__glewIsRenderbufferEXT) +#define glRenderbufferStorageEXT GLEW_GET_FUN(__glewRenderbufferStorageEXT) + +#define GLEW_EXT_framebuffer_object GLEW_GET_VAR(__GLEW_EXT_framebuffer_object) + +#endif /* GL_EXT_framebuffer_object */ + +/* ------------------------ GL_EXT_framebuffer_sRGB ------------------------ */ + +#ifndef GL_EXT_framebuffer_sRGB +#define GL_EXT_framebuffer_sRGB 1 + +#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 +#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA + +#define GLEW_EXT_framebuffer_sRGB GLEW_GET_VAR(__GLEW_EXT_framebuffer_sRGB) + +#endif /* GL_EXT_framebuffer_sRGB */ + +/* ------------------------ GL_EXT_geometry_shader4 ------------------------ */ + +#ifndef GL_EXT_geometry_shader4 +#define GL_EXT_geometry_shader4 1 + +#define GL_LINES_ADJACENCY_EXT 0xA +#define GL_LINE_STRIP_ADJACENCY_EXT 0xB +#define GL_TRIANGLES_ADJACENCY_EXT 0xC +#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD +#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 +#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 +#define GL_GEOMETRY_SHADER_EXT 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); + +#define glFramebufferTextureEXT GLEW_GET_FUN(__glewFramebufferTextureEXT) +#define glFramebufferTextureFaceEXT GLEW_GET_FUN(__glewFramebufferTextureFaceEXT) +#define glFramebufferTextureLayerEXT GLEW_GET_FUN(__glewFramebufferTextureLayerEXT) +#define glProgramParameteriEXT GLEW_GET_FUN(__glewProgramParameteriEXT) + +#define GLEW_EXT_geometry_shader4 GLEW_GET_VAR(__GLEW_EXT_geometry_shader4) + +#endif /* GL_EXT_geometry_shader4 */ + +/* --------------------- GL_EXT_gpu_program_parameters --------------------- */ + +#ifndef GL_EXT_gpu_program_parameters +#define GL_EXT_gpu_program_parameters 1 + +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params); + +#define glProgramEnvParameters4fvEXT GLEW_GET_FUN(__glewProgramEnvParameters4fvEXT) +#define glProgramLocalParameters4fvEXT GLEW_GET_FUN(__glewProgramLocalParameters4fvEXT) + +#define GLEW_EXT_gpu_program_parameters GLEW_GET_VAR(__GLEW_EXT_gpu_program_parameters) + +#endif /* GL_EXT_gpu_program_parameters */ + +/* --------------------------- GL_EXT_gpu_shader4 -------------------------- */ + +#ifndef GL_EXT_gpu_shader4 +#define GL_EXT_gpu_shader4 1 + +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD +#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 +#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 +#define GL_SAMPLER_BUFFER_EXT 0x8DC2 +#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 +#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 +#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 +#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 +#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 +#define GL_INT_SAMPLER_1D_EXT 0x8DC9 +#define GL_INT_SAMPLER_2D_EXT 0x8DCA +#define GL_INT_SAMPLER_3D_EXT 0x8DCB +#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC +#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD +#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE +#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF +#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 + +typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); +typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); + +#define glBindFragDataLocationEXT GLEW_GET_FUN(__glewBindFragDataLocationEXT) +#define glGetFragDataLocationEXT GLEW_GET_FUN(__glewGetFragDataLocationEXT) +#define glGetUniformuivEXT GLEW_GET_FUN(__glewGetUniformuivEXT) +#define glGetVertexAttribIivEXT GLEW_GET_FUN(__glewGetVertexAttribIivEXT) +#define glGetVertexAttribIuivEXT GLEW_GET_FUN(__glewGetVertexAttribIuivEXT) +#define glUniform1uiEXT GLEW_GET_FUN(__glewUniform1uiEXT) +#define glUniform1uivEXT GLEW_GET_FUN(__glewUniform1uivEXT) +#define glUniform2uiEXT GLEW_GET_FUN(__glewUniform2uiEXT) +#define glUniform2uivEXT GLEW_GET_FUN(__glewUniform2uivEXT) +#define glUniform3uiEXT GLEW_GET_FUN(__glewUniform3uiEXT) +#define glUniform3uivEXT GLEW_GET_FUN(__glewUniform3uivEXT) +#define glUniform4uiEXT GLEW_GET_FUN(__glewUniform4uiEXT) +#define glUniform4uivEXT GLEW_GET_FUN(__glewUniform4uivEXT) +#define glVertexAttribI1iEXT GLEW_GET_FUN(__glewVertexAttribI1iEXT) +#define glVertexAttribI1ivEXT GLEW_GET_FUN(__glewVertexAttribI1ivEXT) +#define glVertexAttribI1uiEXT GLEW_GET_FUN(__glewVertexAttribI1uiEXT) +#define glVertexAttribI1uivEXT GLEW_GET_FUN(__glewVertexAttribI1uivEXT) +#define glVertexAttribI2iEXT GLEW_GET_FUN(__glewVertexAttribI2iEXT) +#define glVertexAttribI2ivEXT GLEW_GET_FUN(__glewVertexAttribI2ivEXT) +#define glVertexAttribI2uiEXT GLEW_GET_FUN(__glewVertexAttribI2uiEXT) +#define glVertexAttribI2uivEXT GLEW_GET_FUN(__glewVertexAttribI2uivEXT) +#define glVertexAttribI3iEXT GLEW_GET_FUN(__glewVertexAttribI3iEXT) +#define glVertexAttribI3ivEXT GLEW_GET_FUN(__glewVertexAttribI3ivEXT) +#define glVertexAttribI3uiEXT GLEW_GET_FUN(__glewVertexAttribI3uiEXT) +#define glVertexAttribI3uivEXT GLEW_GET_FUN(__glewVertexAttribI3uivEXT) +#define glVertexAttribI4bvEXT GLEW_GET_FUN(__glewVertexAttribI4bvEXT) +#define glVertexAttribI4iEXT GLEW_GET_FUN(__glewVertexAttribI4iEXT) +#define glVertexAttribI4ivEXT GLEW_GET_FUN(__glewVertexAttribI4ivEXT) +#define glVertexAttribI4svEXT GLEW_GET_FUN(__glewVertexAttribI4svEXT) +#define glVertexAttribI4ubvEXT GLEW_GET_FUN(__glewVertexAttribI4ubvEXT) +#define glVertexAttribI4uiEXT GLEW_GET_FUN(__glewVertexAttribI4uiEXT) +#define glVertexAttribI4uivEXT GLEW_GET_FUN(__glewVertexAttribI4uivEXT) +#define glVertexAttribI4usvEXT GLEW_GET_FUN(__glewVertexAttribI4usvEXT) +#define glVertexAttribIPointerEXT GLEW_GET_FUN(__glewVertexAttribIPointerEXT) + +#define GLEW_EXT_gpu_shader4 GLEW_GET_VAR(__GLEW_EXT_gpu_shader4) + +#endif /* GL_EXT_gpu_shader4 */ + +/* ---------------------------- GL_EXT_histogram --------------------------- */ + +#ifndef GL_EXT_histogram +#define GL_EXT_histogram 1 + +#define GL_HISTOGRAM_EXT 0x8024 +#define GL_PROXY_HISTOGRAM_EXT 0x8025 +#define GL_HISTOGRAM_WIDTH_EXT 0x8026 +#define GL_HISTOGRAM_FORMAT_EXT 0x8027 +#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C +#define GL_HISTOGRAM_SINK_EXT 0x802D +#define GL_MINMAX_EXT 0x802E +#define GL_MINMAX_FORMAT_EXT 0x802F +#define GL_MINMAX_SINK_EXT 0x8030 + +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void* values); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void* values); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRY * PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLRESETMINMAXEXTPROC) (GLenum target); + +#define glGetHistogramEXT GLEW_GET_FUN(__glewGetHistogramEXT) +#define glGetHistogramParameterfvEXT GLEW_GET_FUN(__glewGetHistogramParameterfvEXT) +#define glGetHistogramParameterivEXT GLEW_GET_FUN(__glewGetHistogramParameterivEXT) +#define glGetMinmaxEXT GLEW_GET_FUN(__glewGetMinmaxEXT) +#define glGetMinmaxParameterfvEXT GLEW_GET_FUN(__glewGetMinmaxParameterfvEXT) +#define glGetMinmaxParameterivEXT GLEW_GET_FUN(__glewGetMinmaxParameterivEXT) +#define glHistogramEXT GLEW_GET_FUN(__glewHistogramEXT) +#define glMinmaxEXT GLEW_GET_FUN(__glewMinmaxEXT) +#define glResetHistogramEXT GLEW_GET_FUN(__glewResetHistogramEXT) +#define glResetMinmaxEXT GLEW_GET_FUN(__glewResetMinmaxEXT) + +#define GLEW_EXT_histogram GLEW_GET_VAR(__GLEW_EXT_histogram) + +#endif /* GL_EXT_histogram */ + +/* ----------------------- GL_EXT_index_array_formats ---------------------- */ + +#ifndef GL_EXT_index_array_formats +#define GL_EXT_index_array_formats 1 + +#define GLEW_EXT_index_array_formats GLEW_GET_VAR(__GLEW_EXT_index_array_formats) + +#endif /* GL_EXT_index_array_formats */ + +/* --------------------------- GL_EXT_index_func --------------------------- */ + +#ifndef GL_EXT_index_func +#define GL_EXT_index_func 1 + +typedef void (GLAPIENTRY * PFNGLINDEXFUNCEXTPROC) (GLenum func, GLfloat ref); + +#define glIndexFuncEXT GLEW_GET_FUN(__glewIndexFuncEXT) + +#define GLEW_EXT_index_func GLEW_GET_VAR(__GLEW_EXT_index_func) + +#endif /* GL_EXT_index_func */ + +/* ------------------------- GL_EXT_index_material ------------------------- */ + +#ifndef GL_EXT_index_material +#define GL_EXT_index_material 1 + +typedef void (GLAPIENTRY * PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); + +#define glIndexMaterialEXT GLEW_GET_FUN(__glewIndexMaterialEXT) + +#define GLEW_EXT_index_material GLEW_GET_VAR(__GLEW_EXT_index_material) + +#endif /* GL_EXT_index_material */ + +/* -------------------------- GL_EXT_index_texture ------------------------- */ + +#ifndef GL_EXT_index_texture +#define GL_EXT_index_texture 1 + +#define GLEW_EXT_index_texture GLEW_GET_VAR(__GLEW_EXT_index_texture) + +#endif /* GL_EXT_index_texture */ + +/* -------------------------- GL_EXT_light_texture ------------------------- */ + +#ifndef GL_EXT_light_texture +#define GL_EXT_light_texture 1 + +#define GL_FRAGMENT_MATERIAL_EXT 0x8349 +#define GL_FRAGMENT_NORMAL_EXT 0x834A +#define GL_FRAGMENT_COLOR_EXT 0x834C +#define GL_ATTENUATION_EXT 0x834D +#define GL_SHADOW_ATTENUATION_EXT 0x834E +#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F +#define GL_TEXTURE_LIGHT_EXT 0x8350 +#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 +#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 +#define GL_FRAGMENT_DEPTH_EXT 0x8452 + +typedef void (GLAPIENTRY * PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); +typedef void (GLAPIENTRY * PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); +typedef void (GLAPIENTRY * PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); + +#define glApplyTextureEXT GLEW_GET_FUN(__glewApplyTextureEXT) +#define glTextureLightEXT GLEW_GET_FUN(__glewTextureLightEXT) +#define glTextureMaterialEXT GLEW_GET_FUN(__glewTextureMaterialEXT) + +#define GLEW_EXT_light_texture GLEW_GET_VAR(__GLEW_EXT_light_texture) + +#endif /* GL_EXT_light_texture */ + +/* ------------------------- GL_EXT_misc_attribute ------------------------- */ + +#ifndef GL_EXT_misc_attribute +#define GL_EXT_misc_attribute 1 + +#define GLEW_EXT_misc_attribute GLEW_GET_VAR(__GLEW_EXT_misc_attribute) + +#endif /* GL_EXT_misc_attribute */ + +/* ------------------------ GL_EXT_multi_draw_arrays ----------------------- */ + +#ifndef GL_EXT_multi_draw_arrays +#define GL_EXT_multi_draw_arrays 1 + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, GLsizei* count, GLenum type, const GLvoid **indices, GLsizei primcount); + +#define glMultiDrawArraysEXT GLEW_GET_FUN(__glewMultiDrawArraysEXT) +#define glMultiDrawElementsEXT GLEW_GET_FUN(__glewMultiDrawElementsEXT) + +#define GLEW_EXT_multi_draw_arrays GLEW_GET_VAR(__GLEW_EXT_multi_draw_arrays) + +#endif /* GL_EXT_multi_draw_arrays */ + +/* --------------------------- GL_EXT_multisample -------------------------- */ + +#ifndef GL_EXT_multisample +#define GL_EXT_multisample 1 + +#define GL_MULTISAMPLE_EXT 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F +#define GL_SAMPLE_MASK_EXT 0x80A0 +#define GL_1PASS_EXT 0x80A1 +#define GL_2PASS_0_EXT 0x80A2 +#define GL_2PASS_1_EXT 0x80A3 +#define GL_4PASS_0_EXT 0x80A4 +#define GL_4PASS_1_EXT 0x80A5 +#define GL_4PASS_2_EXT 0x80A6 +#define GL_4PASS_3_EXT 0x80A7 +#define GL_SAMPLE_BUFFERS_EXT 0x80A8 +#define GL_SAMPLES_EXT 0x80A9 +#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA +#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB +#define GL_SAMPLE_PATTERN_EXT 0x80AC +#define GL_MULTISAMPLE_BIT_EXT 0x20000000 + +typedef void (GLAPIENTRY * PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); +typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); + +#define glSampleMaskEXT GLEW_GET_FUN(__glewSampleMaskEXT) +#define glSamplePatternEXT GLEW_GET_FUN(__glewSamplePatternEXT) + +#define GLEW_EXT_multisample GLEW_GET_VAR(__GLEW_EXT_multisample) + +#endif /* GL_EXT_multisample */ + +/* ---------------------- GL_EXT_packed_depth_stencil ---------------------- */ + +#ifndef GL_EXT_packed_depth_stencil +#define GL_EXT_packed_depth_stencil 1 + +#define GL_DEPTH_STENCIL_EXT 0x84F9 +#define GL_UNSIGNED_INT_24_8_EXT 0x84FA +#define GL_DEPTH24_STENCIL8_EXT 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 + +#define GLEW_EXT_packed_depth_stencil GLEW_GET_VAR(__GLEW_EXT_packed_depth_stencil) + +#endif /* GL_EXT_packed_depth_stencil */ + +/* -------------------------- GL_EXT_packed_float -------------------------- */ + +#ifndef GL_EXT_packed_float +#define GL_EXT_packed_float 1 + +#define GL_R11F_G11F_B10F_EXT 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B +#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C + +#define GLEW_EXT_packed_float GLEW_GET_VAR(__GLEW_EXT_packed_float) + +#endif /* GL_EXT_packed_float */ + +/* -------------------------- GL_EXT_packed_pixels ------------------------- */ + +#ifndef GL_EXT_packed_pixels +#define GL_EXT_packed_pixels 1 + +#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 + +#define GLEW_EXT_packed_pixels GLEW_GET_VAR(__GLEW_EXT_packed_pixels) + +#endif /* GL_EXT_packed_pixels */ + +/* ------------------------ GL_EXT_paletted_texture ------------------------ */ + +#ifndef GL_EXT_paletted_texture +#define GL_EXT_paletted_texture 1 + +#define GL_TEXTURE_1D 0x0DE0 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_PROXY_TEXTURE_1D 0x8063 +#define GL_PROXY_TEXTURE_2D 0x8064 +#define GL_TEXTURE_3D_EXT 0x806F +#define GL_PROXY_TEXTURE_3D_EXT 0x8070 +#define GL_COLOR_TABLE_FORMAT_EXT 0x80D8 +#define GL_COLOR_TABLE_WIDTH_EXT 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE_EXT 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE_EXT 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE_EXT 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE_EXT 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE_EXT 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE_EXT 0x80DF +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 +#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED +#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 +#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B + +typedef void (GLAPIENTRY * PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void* data); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, void* data); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); + +#define glColorTableEXT GLEW_GET_FUN(__glewColorTableEXT) +#define glGetColorTableEXT GLEW_GET_FUN(__glewGetColorTableEXT) +#define glGetColorTableParameterfvEXT GLEW_GET_FUN(__glewGetColorTableParameterfvEXT) +#define glGetColorTableParameterivEXT GLEW_GET_FUN(__glewGetColorTableParameterivEXT) + +#define GLEW_EXT_paletted_texture GLEW_GET_VAR(__GLEW_EXT_paletted_texture) + +#endif /* GL_EXT_paletted_texture */ + +/* ----------------------- GL_EXT_pixel_buffer_object ---------------------- */ + +#ifndef GL_EXT_pixel_buffer_object +#define GL_EXT_pixel_buffer_object 1 + +#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF + +#define GLEW_EXT_pixel_buffer_object GLEW_GET_VAR(__GLEW_EXT_pixel_buffer_object) + +#endif /* GL_EXT_pixel_buffer_object */ + +/* ------------------------- GL_EXT_pixel_transform ------------------------ */ + +#ifndef GL_EXT_pixel_transform +#define GL_EXT_pixel_transform 1 + +#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 +#define GL_PIXEL_MAG_FILTER_EXT 0x8331 +#define GL_PIXEL_MIN_FILTER_EXT 0x8332 +#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 +#define GL_CUBIC_EXT 0x8334 +#define GL_AVERAGE_EXT 0x8335 +#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 +#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 +#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 + +typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, const GLfloat param); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, const GLint param); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); + +#define glGetPixelTransformParameterfvEXT GLEW_GET_FUN(__glewGetPixelTransformParameterfvEXT) +#define glGetPixelTransformParameterivEXT GLEW_GET_FUN(__glewGetPixelTransformParameterivEXT) +#define glPixelTransformParameterfEXT GLEW_GET_FUN(__glewPixelTransformParameterfEXT) +#define glPixelTransformParameterfvEXT GLEW_GET_FUN(__glewPixelTransformParameterfvEXT) +#define glPixelTransformParameteriEXT GLEW_GET_FUN(__glewPixelTransformParameteriEXT) +#define glPixelTransformParameterivEXT GLEW_GET_FUN(__glewPixelTransformParameterivEXT) + +#define GLEW_EXT_pixel_transform GLEW_GET_VAR(__GLEW_EXT_pixel_transform) + +#endif /* GL_EXT_pixel_transform */ + +/* ------------------- GL_EXT_pixel_transform_color_table ------------------ */ + +#ifndef GL_EXT_pixel_transform_color_table +#define GL_EXT_pixel_transform_color_table 1 + +#define GLEW_EXT_pixel_transform_color_table GLEW_GET_VAR(__GLEW_EXT_pixel_transform_color_table) + +#endif /* GL_EXT_pixel_transform_color_table */ + +/* ------------------------ GL_EXT_point_parameters ------------------------ */ + +#ifndef GL_EXT_point_parameters +#define GL_EXT_point_parameters 1 + +#define GL_POINT_SIZE_MIN_EXT 0x8126 +#define GL_POINT_SIZE_MAX_EXT 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 +#define GL_DISTANCE_ATTENUATION_EXT 0x8129 + +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat* params); + +#define glPointParameterfEXT GLEW_GET_FUN(__glewPointParameterfEXT) +#define glPointParameterfvEXT GLEW_GET_FUN(__glewPointParameterfvEXT) + +#define GLEW_EXT_point_parameters GLEW_GET_VAR(__GLEW_EXT_point_parameters) + +#endif /* GL_EXT_point_parameters */ + +/* ------------------------- GL_EXT_polygon_offset ------------------------- */ + +#ifndef GL_EXT_polygon_offset +#define GL_EXT_polygon_offset 1 + +#define GL_POLYGON_OFFSET_EXT 0x8037 +#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 +#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 + +typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); + +#define glPolygonOffsetEXT GLEW_GET_FUN(__glewPolygonOffsetEXT) + +#define GLEW_EXT_polygon_offset GLEW_GET_VAR(__GLEW_EXT_polygon_offset) + +#endif /* GL_EXT_polygon_offset */ + +/* ------------------------ GL_EXT_provoking_vertex ------------------------ */ + +#ifndef GL_EXT_provoking_vertex +#define GL_EXT_provoking_vertex 1 + +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C +#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D +#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E +#define GL_PROVOKING_VERTEX_EXT 0x8E4F + +typedef void (GLAPIENTRY * PFNGLPROVOKINGVERTEXEXTPROC) (GLenum mode); + +#define glProvokingVertexEXT GLEW_GET_FUN(__glewProvokingVertexEXT) + +#define GLEW_EXT_provoking_vertex GLEW_GET_VAR(__GLEW_EXT_provoking_vertex) + +#endif /* GL_EXT_provoking_vertex */ + +/* ------------------------- GL_EXT_rescale_normal ------------------------- */ + +#ifndef GL_EXT_rescale_normal +#define GL_EXT_rescale_normal 1 + +#define GL_RESCALE_NORMAL_EXT 0x803A + +#define GLEW_EXT_rescale_normal GLEW_GET_VAR(__GLEW_EXT_rescale_normal) + +#endif /* GL_EXT_rescale_normal */ + +/* -------------------------- GL_EXT_scene_marker -------------------------- */ + +#ifndef GL_EXT_scene_marker +#define GL_EXT_scene_marker 1 + +typedef void (GLAPIENTRY * PFNGLBEGINSCENEEXTPROC) (void); +typedef void (GLAPIENTRY * PFNGLENDSCENEEXTPROC) (void); + +#define glBeginSceneEXT GLEW_GET_FUN(__glewBeginSceneEXT) +#define glEndSceneEXT GLEW_GET_FUN(__glewEndSceneEXT) + +#define GLEW_EXT_scene_marker GLEW_GET_VAR(__GLEW_EXT_scene_marker) + +#endif /* GL_EXT_scene_marker */ + +/* ------------------------- GL_EXT_secondary_color ------------------------ */ + +#ifndef GL_EXT_secondary_color +#define GL_EXT_secondary_color 1 + +#define GL_COLOR_SUM_EXT 0x8458 +#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D +#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E + +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); + +#define glSecondaryColor3bEXT GLEW_GET_FUN(__glewSecondaryColor3bEXT) +#define glSecondaryColor3bvEXT GLEW_GET_FUN(__glewSecondaryColor3bvEXT) +#define glSecondaryColor3dEXT GLEW_GET_FUN(__glewSecondaryColor3dEXT) +#define glSecondaryColor3dvEXT GLEW_GET_FUN(__glewSecondaryColor3dvEXT) +#define glSecondaryColor3fEXT GLEW_GET_FUN(__glewSecondaryColor3fEXT) +#define glSecondaryColor3fvEXT GLEW_GET_FUN(__glewSecondaryColor3fvEXT) +#define glSecondaryColor3iEXT GLEW_GET_FUN(__glewSecondaryColor3iEXT) +#define glSecondaryColor3ivEXT GLEW_GET_FUN(__glewSecondaryColor3ivEXT) +#define glSecondaryColor3sEXT GLEW_GET_FUN(__glewSecondaryColor3sEXT) +#define glSecondaryColor3svEXT GLEW_GET_FUN(__glewSecondaryColor3svEXT) +#define glSecondaryColor3ubEXT GLEW_GET_FUN(__glewSecondaryColor3ubEXT) +#define glSecondaryColor3ubvEXT GLEW_GET_FUN(__glewSecondaryColor3ubvEXT) +#define glSecondaryColor3uiEXT GLEW_GET_FUN(__glewSecondaryColor3uiEXT) +#define glSecondaryColor3uivEXT GLEW_GET_FUN(__glewSecondaryColor3uivEXT) +#define glSecondaryColor3usEXT GLEW_GET_FUN(__glewSecondaryColor3usEXT) +#define glSecondaryColor3usvEXT GLEW_GET_FUN(__glewSecondaryColor3usvEXT) +#define glSecondaryColorPointerEXT GLEW_GET_FUN(__glewSecondaryColorPointerEXT) + +#define GLEW_EXT_secondary_color GLEW_GET_VAR(__GLEW_EXT_secondary_color) + +#endif /* GL_EXT_secondary_color */ + +/* --------------------- GL_EXT_separate_shader_objects -------------------- */ + +#ifndef GL_EXT_separate_shader_objects +#define GL_EXT_separate_shader_objects 1 + +#define GL_ACTIVE_PROGRAM_EXT 0x8B8D + +typedef void (GLAPIENTRY * PFNGLACTIVEPROGRAMEXTPROC) (GLuint program); +typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const char* string); +typedef void (GLAPIENTRY * PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program); + +#define glActiveProgramEXT GLEW_GET_FUN(__glewActiveProgramEXT) +#define glCreateShaderProgramEXT GLEW_GET_FUN(__glewCreateShaderProgramEXT) +#define glUseShaderProgramEXT GLEW_GET_FUN(__glewUseShaderProgramEXT) + +#define GLEW_EXT_separate_shader_objects GLEW_GET_VAR(__GLEW_EXT_separate_shader_objects) + +#endif /* GL_EXT_separate_shader_objects */ + +/* --------------------- GL_EXT_separate_specular_color -------------------- */ + +#ifndef GL_EXT_separate_specular_color +#define GL_EXT_separate_specular_color 1 + +#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 +#define GL_SINGLE_COLOR_EXT 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA + +#define GLEW_EXT_separate_specular_color GLEW_GET_VAR(__GLEW_EXT_separate_specular_color) + +#endif /* GL_EXT_separate_specular_color */ + +/* --------------------- GL_EXT_shader_image_load_store -------------------- */ + +#ifndef GL_EXT_shader_image_load_store +#define GL_EXT_shader_image_load_store 1 + +#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT 0x00000001 +#define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT 0x00000002 +#define GL_UNIFORM_BARRIER_BIT_EXT 0x00000004 +#define GL_TEXTURE_FETCH_BARRIER_BIT_EXT 0x00000008 +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT 0x00000020 +#define GL_COMMAND_BARRIER_BIT_EXT 0x00000040 +#define GL_PIXEL_BUFFER_BARRIER_BIT_EXT 0x00000080 +#define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT 0x00000100 +#define GL_BUFFER_UPDATE_BARRIER_BIT_EXT 0x00000200 +#define GL_FRAMEBUFFER_BARRIER_BIT_EXT 0x00000400 +#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT 0x00000800 +#define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT 0x00001000 +#define GL_MAX_IMAGE_UNITS_EXT 0x8F38 +#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT 0x8F39 +#define GL_IMAGE_BINDING_NAME_EXT 0x8F3A +#define GL_IMAGE_BINDING_LEVEL_EXT 0x8F3B +#define GL_IMAGE_BINDING_LAYERED_EXT 0x8F3C +#define GL_IMAGE_BINDING_LAYER_EXT 0x8F3D +#define GL_IMAGE_BINDING_ACCESS_EXT 0x8F3E +#define GL_IMAGE_1D_EXT 0x904C +#define GL_IMAGE_2D_EXT 0x904D +#define GL_IMAGE_3D_EXT 0x904E +#define GL_IMAGE_2D_RECT_EXT 0x904F +#define GL_IMAGE_CUBE_EXT 0x9050 +#define GL_IMAGE_BUFFER_EXT 0x9051 +#define GL_IMAGE_1D_ARRAY_EXT 0x9052 +#define GL_IMAGE_2D_ARRAY_EXT 0x9053 +#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 +#define GL_IMAGE_2D_MULTISAMPLE_EXT 0x9055 +#define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9056 +#define GL_INT_IMAGE_1D_EXT 0x9057 +#define GL_INT_IMAGE_2D_EXT 0x9058 +#define GL_INT_IMAGE_3D_EXT 0x9059 +#define GL_INT_IMAGE_2D_RECT_EXT 0x905A +#define GL_INT_IMAGE_CUBE_EXT 0x905B +#define GL_INT_IMAGE_BUFFER_EXT 0x905C +#define GL_INT_IMAGE_1D_ARRAY_EXT 0x905D +#define GL_INT_IMAGE_2D_ARRAY_EXT 0x905E +#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F +#define GL_INT_IMAGE_2D_MULTISAMPLE_EXT 0x9060 +#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9061 +#define GL_UNSIGNED_INT_IMAGE_1D_EXT 0x9062 +#define GL_UNSIGNED_INT_IMAGE_2D_EXT 0x9063 +#define GL_UNSIGNED_INT_IMAGE_3D_EXT 0x9064 +#define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT 0x9065 +#define GL_UNSIGNED_INT_IMAGE_CUBE_EXT 0x9066 +#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067 +#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT 0x9068 +#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT 0x9069 +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT 0x906B +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x906C +#define GL_MAX_IMAGE_SAMPLES_EXT 0x906D +#define GL_IMAGE_BINDING_FORMAT_EXT 0x906E +#define GL_ALL_BARRIER_BITS_EXT 0xFFFFFFFF + +typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTUREEXTPROC) (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); +typedef void (GLAPIENTRY * PFNGLMEMORYBARRIEREXTPROC) (GLbitfield barriers); + +#define glBindImageTextureEXT GLEW_GET_FUN(__glewBindImageTextureEXT) +#define glMemoryBarrierEXT GLEW_GET_FUN(__glewMemoryBarrierEXT) + +#define GLEW_EXT_shader_image_load_store GLEW_GET_VAR(__GLEW_EXT_shader_image_load_store) + +#endif /* GL_EXT_shader_image_load_store */ + +/* -------------------------- GL_EXT_shadow_funcs -------------------------- */ + +#ifndef GL_EXT_shadow_funcs +#define GL_EXT_shadow_funcs 1 + +#define GLEW_EXT_shadow_funcs GLEW_GET_VAR(__GLEW_EXT_shadow_funcs) + +#endif /* GL_EXT_shadow_funcs */ + +/* --------------------- GL_EXT_shared_texture_palette --------------------- */ + +#ifndef GL_EXT_shared_texture_palette +#define GL_EXT_shared_texture_palette 1 + +#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB + +#define GLEW_EXT_shared_texture_palette GLEW_GET_VAR(__GLEW_EXT_shared_texture_palette) + +#endif /* GL_EXT_shared_texture_palette */ + +/* ------------------------ GL_EXT_stencil_clear_tag ----------------------- */ + +#ifndef GL_EXT_stencil_clear_tag +#define GL_EXT_stencil_clear_tag 1 + +#define GL_STENCIL_TAG_BITS_EXT 0x88F2 +#define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3 + +#define GLEW_EXT_stencil_clear_tag GLEW_GET_VAR(__GLEW_EXT_stencil_clear_tag) + +#endif /* GL_EXT_stencil_clear_tag */ + +/* ------------------------ GL_EXT_stencil_two_side ------------------------ */ + +#ifndef GL_EXT_stencil_two_side +#define GL_EXT_stencil_two_side 1 + +#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 +#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 + +typedef void (GLAPIENTRY * PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); + +#define glActiveStencilFaceEXT GLEW_GET_FUN(__glewActiveStencilFaceEXT) + +#define GLEW_EXT_stencil_two_side GLEW_GET_VAR(__GLEW_EXT_stencil_two_side) + +#endif /* GL_EXT_stencil_two_side */ + +/* -------------------------- GL_EXT_stencil_wrap -------------------------- */ + +#ifndef GL_EXT_stencil_wrap +#define GL_EXT_stencil_wrap 1 + +#define GL_INCR_WRAP_EXT 0x8507 +#define GL_DECR_WRAP_EXT 0x8508 + +#define GLEW_EXT_stencil_wrap GLEW_GET_VAR(__GLEW_EXT_stencil_wrap) + +#endif /* GL_EXT_stencil_wrap */ + +/* --------------------------- GL_EXT_subtexture --------------------------- */ + +#ifndef GL_EXT_subtexture +#define GL_EXT_subtexture 1 + +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels); + +#define glTexSubImage1DEXT GLEW_GET_FUN(__glewTexSubImage1DEXT) +#define glTexSubImage2DEXT GLEW_GET_FUN(__glewTexSubImage2DEXT) +#define glTexSubImage3DEXT GLEW_GET_FUN(__glewTexSubImage3DEXT) + +#define GLEW_EXT_subtexture GLEW_GET_VAR(__GLEW_EXT_subtexture) + +#endif /* GL_EXT_subtexture */ + +/* ----------------------------- GL_EXT_texture ---------------------------- */ + +#ifndef GL_EXT_texture +#define GL_EXT_texture 1 + +#define GL_ALPHA4_EXT 0x803B +#define GL_ALPHA8_EXT 0x803C +#define GL_ALPHA12_EXT 0x803D +#define GL_ALPHA16_EXT 0x803E +#define GL_LUMINANCE4_EXT 0x803F +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE12_EXT 0x8041 +#define GL_LUMINANCE16_EXT 0x8042 +#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 +#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 +#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 +#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 +#define GL_INTENSITY_EXT 0x8049 +#define GL_INTENSITY4_EXT 0x804A +#define GL_INTENSITY8_EXT 0x804B +#define GL_INTENSITY12_EXT 0x804C +#define GL_INTENSITY16_EXT 0x804D +#define GL_RGB2_EXT 0x804E +#define GL_RGB4_EXT 0x804F +#define GL_RGB5_EXT 0x8050 +#define GL_RGB8_EXT 0x8051 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB12_EXT 0x8053 +#define GL_RGB16_EXT 0x8054 +#define GL_RGBA2_EXT 0x8055 +#define GL_RGBA4_EXT 0x8056 +#define GL_RGB5_A1_EXT 0x8057 +#define GL_RGBA8_EXT 0x8058 +#define GL_RGB10_A2_EXT 0x8059 +#define GL_RGBA12_EXT 0x805A +#define GL_RGBA16_EXT 0x805B +#define GL_TEXTURE_RED_SIZE_EXT 0x805C +#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D +#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E +#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 +#define GL_REPLACE_EXT 0x8062 +#define GL_PROXY_TEXTURE_1D_EXT 0x8063 +#define GL_PROXY_TEXTURE_2D_EXT 0x8064 + +#define GLEW_EXT_texture GLEW_GET_VAR(__GLEW_EXT_texture) + +#endif /* GL_EXT_texture */ + +/* ---------------------------- GL_EXT_texture3D --------------------------- */ + +#ifndef GL_EXT_texture3D +#define GL_EXT_texture3D 1 + +#define GL_PACK_SKIP_IMAGES_EXT 0x806B +#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C +#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D +#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E +#define GL_TEXTURE_3D_EXT 0x806F +#define GL_PROXY_TEXTURE_3D_EXT 0x8070 +#define GL_TEXTURE_DEPTH_EXT 0x8071 +#define GL_TEXTURE_WRAP_R_EXT 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 + +typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels); + +#define glTexImage3DEXT GLEW_GET_FUN(__glewTexImage3DEXT) + +#define GLEW_EXT_texture3D GLEW_GET_VAR(__GLEW_EXT_texture3D) + +#endif /* GL_EXT_texture3D */ + +/* -------------------------- GL_EXT_texture_array ------------------------- */ + +#ifndef GL_EXT_texture_array +#define GL_EXT_texture_array 1 + +#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E +#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF +#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 +#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 +#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A +#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B +#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C +#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D + +#define GLEW_EXT_texture_array GLEW_GET_VAR(__GLEW_EXT_texture_array) + +#endif /* GL_EXT_texture_array */ + +/* ---------------------- GL_EXT_texture_buffer_object --------------------- */ + +#ifndef GL_EXT_texture_buffer_object +#define GL_EXT_texture_buffer_object 1 + +#define GL_TEXTURE_BUFFER_EXT 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E + +typedef void (GLAPIENTRY * PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); + +#define glTexBufferEXT GLEW_GET_FUN(__glewTexBufferEXT) + +#define GLEW_EXT_texture_buffer_object GLEW_GET_VAR(__GLEW_EXT_texture_buffer_object) + +#endif /* GL_EXT_texture_buffer_object */ + +/* -------------------- GL_EXT_texture_compression_dxt1 -------------------- */ + +#ifndef GL_EXT_texture_compression_dxt1 +#define GL_EXT_texture_compression_dxt1 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 + +#define GLEW_EXT_texture_compression_dxt1 GLEW_GET_VAR(__GLEW_EXT_texture_compression_dxt1) + +#endif /* GL_EXT_texture_compression_dxt1 */ + +/* -------------------- GL_EXT_texture_compression_latc -------------------- */ + +#ifndef GL_EXT_texture_compression_latc +#define GL_EXT_texture_compression_latc 1 + +#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 +#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 +#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 +#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 + +#define GLEW_EXT_texture_compression_latc GLEW_GET_VAR(__GLEW_EXT_texture_compression_latc) + +#endif /* GL_EXT_texture_compression_latc */ + +/* -------------------- GL_EXT_texture_compression_rgtc -------------------- */ + +#ifndef GL_EXT_texture_compression_rgtc +#define GL_EXT_texture_compression_rgtc 1 + +#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC +#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD +#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE + +#define GLEW_EXT_texture_compression_rgtc GLEW_GET_VAR(__GLEW_EXT_texture_compression_rgtc) + +#endif /* GL_EXT_texture_compression_rgtc */ + +/* -------------------- GL_EXT_texture_compression_s3tc -------------------- */ + +#ifndef GL_EXT_texture_compression_s3tc +#define GL_EXT_texture_compression_s3tc 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 + +#define GLEW_EXT_texture_compression_s3tc GLEW_GET_VAR(__GLEW_EXT_texture_compression_s3tc) + +#endif /* GL_EXT_texture_compression_s3tc */ + +/* ------------------------ GL_EXT_texture_cube_map ------------------------ */ + +#ifndef GL_EXT_texture_cube_map +#define GL_EXT_texture_cube_map 1 + +#define GL_NORMAL_MAP_EXT 0x8511 +#define GL_REFLECTION_MAP_EXT 0x8512 +#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C + +#define GLEW_EXT_texture_cube_map GLEW_GET_VAR(__GLEW_EXT_texture_cube_map) + +#endif /* GL_EXT_texture_cube_map */ + +/* ----------------------- GL_EXT_texture_edge_clamp ----------------------- */ + +#ifndef GL_EXT_texture_edge_clamp +#define GL_EXT_texture_edge_clamp 1 + +#define GL_CLAMP_TO_EDGE_EXT 0x812F + +#define GLEW_EXT_texture_edge_clamp GLEW_GET_VAR(__GLEW_EXT_texture_edge_clamp) + +#endif /* GL_EXT_texture_edge_clamp */ + +/* --------------------------- GL_EXT_texture_env -------------------------- */ + +#ifndef GL_EXT_texture_env +#define GL_EXT_texture_env 1 + +#define GL_TEXTURE_ENV0_EXT 0 +#define GL_ENV_BLEND_EXT 0 +#define GL_TEXTURE_ENV_SHIFT_EXT 0 +#define GL_ENV_REPLACE_EXT 0 +#define GL_ENV_ADD_EXT 0 +#define GL_ENV_SUBTRACT_EXT 0 +#define GL_TEXTURE_ENV_MODE_ALPHA_EXT 0 +#define GL_ENV_REVERSE_SUBTRACT_EXT 0 +#define GL_ENV_REVERSE_BLEND_EXT 0 +#define GL_ENV_COPY_EXT 0 +#define GL_ENV_MODULATE_EXT 0 + +#define GLEW_EXT_texture_env GLEW_GET_VAR(__GLEW_EXT_texture_env) + +#endif /* GL_EXT_texture_env */ + +/* ------------------------- GL_EXT_texture_env_add ------------------------ */ + +#ifndef GL_EXT_texture_env_add +#define GL_EXT_texture_env_add 1 + +#define GLEW_EXT_texture_env_add GLEW_GET_VAR(__GLEW_EXT_texture_env_add) + +#endif /* GL_EXT_texture_env_add */ + +/* ----------------------- GL_EXT_texture_env_combine ---------------------- */ + +#ifndef GL_EXT_texture_env_combine +#define GL_EXT_texture_env_combine 1 + +#define GL_COMBINE_EXT 0x8570 +#define GL_COMBINE_RGB_EXT 0x8571 +#define GL_COMBINE_ALPHA_EXT 0x8572 +#define GL_RGB_SCALE_EXT 0x8573 +#define GL_ADD_SIGNED_EXT 0x8574 +#define GL_INTERPOLATE_EXT 0x8575 +#define GL_CONSTANT_EXT 0x8576 +#define GL_PRIMARY_COLOR_EXT 0x8577 +#define GL_PREVIOUS_EXT 0x8578 +#define GL_SOURCE0_RGB_EXT 0x8580 +#define GL_SOURCE1_RGB_EXT 0x8581 +#define GL_SOURCE2_RGB_EXT 0x8582 +#define GL_SOURCE0_ALPHA_EXT 0x8588 +#define GL_SOURCE1_ALPHA_EXT 0x8589 +#define GL_SOURCE2_ALPHA_EXT 0x858A +#define GL_OPERAND0_RGB_EXT 0x8590 +#define GL_OPERAND1_RGB_EXT 0x8591 +#define GL_OPERAND2_RGB_EXT 0x8592 +#define GL_OPERAND0_ALPHA_EXT 0x8598 +#define GL_OPERAND1_ALPHA_EXT 0x8599 +#define GL_OPERAND2_ALPHA_EXT 0x859A + +#define GLEW_EXT_texture_env_combine GLEW_GET_VAR(__GLEW_EXT_texture_env_combine) + +#endif /* GL_EXT_texture_env_combine */ + +/* ------------------------ GL_EXT_texture_env_dot3 ------------------------ */ + +#ifndef GL_EXT_texture_env_dot3 +#define GL_EXT_texture_env_dot3 1 + +#define GL_DOT3_RGB_EXT 0x8740 +#define GL_DOT3_RGBA_EXT 0x8741 + +#define GLEW_EXT_texture_env_dot3 GLEW_GET_VAR(__GLEW_EXT_texture_env_dot3) + +#endif /* GL_EXT_texture_env_dot3 */ + +/* ------------------- GL_EXT_texture_filter_anisotropic ------------------- */ + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_EXT_texture_filter_anisotropic 1 + +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF + +#define GLEW_EXT_texture_filter_anisotropic GLEW_GET_VAR(__GLEW_EXT_texture_filter_anisotropic) + +#endif /* GL_EXT_texture_filter_anisotropic */ + +/* ------------------------- GL_EXT_texture_integer ------------------------ */ + +#ifndef GL_EXT_texture_integer +#define GL_EXT_texture_integer 1 + +#define GL_RGBA32UI_EXT 0x8D70 +#define GL_RGB32UI_EXT 0x8D71 +#define GL_ALPHA32UI_EXT 0x8D72 +#define GL_INTENSITY32UI_EXT 0x8D73 +#define GL_LUMINANCE32UI_EXT 0x8D74 +#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 +#define GL_RGBA16UI_EXT 0x8D76 +#define GL_RGB16UI_EXT 0x8D77 +#define GL_ALPHA16UI_EXT 0x8D78 +#define GL_INTENSITY16UI_EXT 0x8D79 +#define GL_LUMINANCE16UI_EXT 0x8D7A +#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B +#define GL_RGBA8UI_EXT 0x8D7C +#define GL_RGB8UI_EXT 0x8D7D +#define GL_ALPHA8UI_EXT 0x8D7E +#define GL_INTENSITY8UI_EXT 0x8D7F +#define GL_LUMINANCE8UI_EXT 0x8D80 +#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 +#define GL_RGBA32I_EXT 0x8D82 +#define GL_RGB32I_EXT 0x8D83 +#define GL_ALPHA32I_EXT 0x8D84 +#define GL_INTENSITY32I_EXT 0x8D85 +#define GL_LUMINANCE32I_EXT 0x8D86 +#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 +#define GL_RGBA16I_EXT 0x8D88 +#define GL_RGB16I_EXT 0x8D89 +#define GL_ALPHA16I_EXT 0x8D8A +#define GL_INTENSITY16I_EXT 0x8D8B +#define GL_LUMINANCE16I_EXT 0x8D8C +#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D +#define GL_RGBA8I_EXT 0x8D8E +#define GL_RGB8I_EXT 0x8D8F +#define GL_ALPHA8I_EXT 0x8D90 +#define GL_INTENSITY8I_EXT 0x8D91 +#define GL_LUMINANCE8I_EXT 0x8D92 +#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 +#define GL_RED_INTEGER_EXT 0x8D94 +#define GL_GREEN_INTEGER_EXT 0x8D95 +#define GL_BLUE_INTEGER_EXT 0x8D96 +#define GL_ALPHA_INTEGER_EXT 0x8D97 +#define GL_RGB_INTEGER_EXT 0x8D98 +#define GL_RGBA_INTEGER_EXT 0x8D99 +#define GL_BGR_INTEGER_EXT 0x8D9A +#define GL_BGRA_INTEGER_EXT 0x8D9B +#define GL_LUMINANCE_INTEGER_EXT 0x8D9C +#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D +#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E + +typedef void (GLAPIENTRY * PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha); +typedef void (GLAPIENTRY * PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); + +#define glClearColorIiEXT GLEW_GET_FUN(__glewClearColorIiEXT) +#define glClearColorIuiEXT GLEW_GET_FUN(__glewClearColorIuiEXT) +#define glGetTexParameterIivEXT GLEW_GET_FUN(__glewGetTexParameterIivEXT) +#define glGetTexParameterIuivEXT GLEW_GET_FUN(__glewGetTexParameterIuivEXT) +#define glTexParameterIivEXT GLEW_GET_FUN(__glewTexParameterIivEXT) +#define glTexParameterIuivEXT GLEW_GET_FUN(__glewTexParameterIuivEXT) + +#define GLEW_EXT_texture_integer GLEW_GET_VAR(__GLEW_EXT_texture_integer) + +#endif /* GL_EXT_texture_integer */ + +/* ------------------------ GL_EXT_texture_lod_bias ------------------------ */ + +#ifndef GL_EXT_texture_lod_bias +#define GL_EXT_texture_lod_bias 1 + +#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD +#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 +#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 + +#define GLEW_EXT_texture_lod_bias GLEW_GET_VAR(__GLEW_EXT_texture_lod_bias) + +#endif /* GL_EXT_texture_lod_bias */ + +/* ---------------------- GL_EXT_texture_mirror_clamp ---------------------- */ + +#ifndef GL_EXT_texture_mirror_clamp +#define GL_EXT_texture_mirror_clamp 1 + +#define GL_MIRROR_CLAMP_EXT 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 +#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 + +#define GLEW_EXT_texture_mirror_clamp GLEW_GET_VAR(__GLEW_EXT_texture_mirror_clamp) + +#endif /* GL_EXT_texture_mirror_clamp */ + +/* ------------------------- GL_EXT_texture_object ------------------------- */ + +#ifndef GL_EXT_texture_object +#define GL_EXT_texture_object 1 + +#define GL_TEXTURE_PRIORITY_EXT 0x8066 +#define GL_TEXTURE_RESIDENT_EXT 0x8067 +#define GL_TEXTURE_1D_BINDING_EXT 0x8068 +#define GL_TEXTURE_2D_BINDING_EXT 0x8069 +#define GL_TEXTURE_3D_BINDING_EXT 0x806A + +typedef GLboolean (GLAPIENTRY * PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint* textures, GLboolean* residences); +typedef void (GLAPIENTRY * PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); +typedef void (GLAPIENTRY * PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint* textures); +typedef void (GLAPIENTRY * PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint* textures); +typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREEXTPROC) (GLuint texture); +typedef void (GLAPIENTRY * PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint* textures, const GLclampf* priorities); + +#define glAreTexturesResidentEXT GLEW_GET_FUN(__glewAreTexturesResidentEXT) +#define glBindTextureEXT GLEW_GET_FUN(__glewBindTextureEXT) +#define glDeleteTexturesEXT GLEW_GET_FUN(__glewDeleteTexturesEXT) +#define glGenTexturesEXT GLEW_GET_FUN(__glewGenTexturesEXT) +#define glIsTextureEXT GLEW_GET_FUN(__glewIsTextureEXT) +#define glPrioritizeTexturesEXT GLEW_GET_FUN(__glewPrioritizeTexturesEXT) + +#define GLEW_EXT_texture_object GLEW_GET_VAR(__GLEW_EXT_texture_object) + +#endif /* GL_EXT_texture_object */ + +/* --------------------- GL_EXT_texture_perturb_normal --------------------- */ + +#ifndef GL_EXT_texture_perturb_normal +#define GL_EXT_texture_perturb_normal 1 + +#define GL_PERTURB_EXT 0x85AE +#define GL_TEXTURE_NORMAL_EXT 0x85AF + +typedef void (GLAPIENTRY * PFNGLTEXTURENORMALEXTPROC) (GLenum mode); + +#define glTextureNormalEXT GLEW_GET_FUN(__glewTextureNormalEXT) + +#define GLEW_EXT_texture_perturb_normal GLEW_GET_VAR(__GLEW_EXT_texture_perturb_normal) + +#endif /* GL_EXT_texture_perturb_normal */ + +/* ------------------------ GL_EXT_texture_rectangle ----------------------- */ + +#ifndef GL_EXT_texture_rectangle +#define GL_EXT_texture_rectangle 1 + +#define GL_TEXTURE_RECTANGLE_EXT 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_EXT 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_EXT 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT 0x84F8 + +#define GLEW_EXT_texture_rectangle GLEW_GET_VAR(__GLEW_EXT_texture_rectangle) + +#endif /* GL_EXT_texture_rectangle */ + +/* -------------------------- GL_EXT_texture_sRGB -------------------------- */ + +#ifndef GL_EXT_texture_sRGB +#define GL_EXT_texture_sRGB 1 + +#define GL_SRGB_EXT 0x8C40 +#define GL_SRGB8_EXT 0x8C41 +#define GL_SRGB_ALPHA_EXT 0x8C42 +#define GL_SRGB8_ALPHA8_EXT 0x8C43 +#define GL_SLUMINANCE_ALPHA_EXT 0x8C44 +#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 +#define GL_SLUMINANCE_EXT 0x8C46 +#define GL_SLUMINANCE8_EXT 0x8C47 +#define GL_COMPRESSED_SRGB_EXT 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 +#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B +#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F + +#define GLEW_EXT_texture_sRGB GLEW_GET_VAR(__GLEW_EXT_texture_sRGB) + +#endif /* GL_EXT_texture_sRGB */ + +/* ----------------------- GL_EXT_texture_sRGB_decode ---------------------- */ + +#ifndef GL_EXT_texture_sRGB_decode +#define GL_EXT_texture_sRGB_decode 1 + +#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 +#define GL_DECODE_EXT 0x8A49 +#define GL_SKIP_DECODE_EXT 0x8A4A + +#define GLEW_EXT_texture_sRGB_decode GLEW_GET_VAR(__GLEW_EXT_texture_sRGB_decode) + +#endif /* GL_EXT_texture_sRGB_decode */ + +/* --------------------- GL_EXT_texture_shared_exponent -------------------- */ + +#ifndef GL_EXT_texture_shared_exponent +#define GL_EXT_texture_shared_exponent 1 + +#define GL_RGB9_E5_EXT 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E +#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F + +#define GLEW_EXT_texture_shared_exponent GLEW_GET_VAR(__GLEW_EXT_texture_shared_exponent) + +#endif /* GL_EXT_texture_shared_exponent */ + +/* -------------------------- GL_EXT_texture_snorm ------------------------- */ + +#ifndef GL_EXT_texture_snorm +#define GL_EXT_texture_snorm 1 + +#define GL_RED_SNORM 0x8F90 +#define GL_RG_SNORM 0x8F91 +#define GL_RGB_SNORM 0x8F92 +#define GL_RGBA_SNORM 0x8F93 +#define GL_R8_SNORM 0x8F94 +#define GL_RG8_SNORM 0x8F95 +#define GL_RGB8_SNORM 0x8F96 +#define GL_RGBA8_SNORM 0x8F97 +#define GL_R16_SNORM 0x8F98 +#define GL_RG16_SNORM 0x8F99 +#define GL_RGB16_SNORM 0x8F9A +#define GL_RGBA16_SNORM 0x8F9B +#define GL_SIGNED_NORMALIZED 0x8F9C +#define GL_ALPHA_SNORM 0x9010 +#define GL_LUMINANCE_SNORM 0x9011 +#define GL_LUMINANCE_ALPHA_SNORM 0x9012 +#define GL_INTENSITY_SNORM 0x9013 +#define GL_ALPHA8_SNORM 0x9014 +#define GL_LUMINANCE8_SNORM 0x9015 +#define GL_LUMINANCE8_ALPHA8_SNORM 0x9016 +#define GL_INTENSITY8_SNORM 0x9017 +#define GL_ALPHA16_SNORM 0x9018 +#define GL_LUMINANCE16_SNORM 0x9019 +#define GL_LUMINANCE16_ALPHA16_SNORM 0x901A +#define GL_INTENSITY16_SNORM 0x901B + +#define GLEW_EXT_texture_snorm GLEW_GET_VAR(__GLEW_EXT_texture_snorm) + +#endif /* GL_EXT_texture_snorm */ + +/* ------------------------- GL_EXT_texture_swizzle ------------------------ */ + +#ifndef GL_EXT_texture_swizzle +#define GL_EXT_texture_swizzle 1 + +#define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42 +#define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43 +#define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44 +#define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45 +#define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46 + +#define GLEW_EXT_texture_swizzle GLEW_GET_VAR(__GLEW_EXT_texture_swizzle) + +#endif /* GL_EXT_texture_swizzle */ + +/* --------------------------- GL_EXT_timer_query -------------------------- */ + +#ifndef GL_EXT_timer_query +#define GL_EXT_timer_query 1 + +#define GL_TIME_ELAPSED_EXT 0x88BF + +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64EXT *params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64EXT *params); + +#define glGetQueryObjecti64vEXT GLEW_GET_FUN(__glewGetQueryObjecti64vEXT) +#define glGetQueryObjectui64vEXT GLEW_GET_FUN(__glewGetQueryObjectui64vEXT) + +#define GLEW_EXT_timer_query GLEW_GET_VAR(__GLEW_EXT_timer_query) + +#endif /* GL_EXT_timer_query */ + +/* ----------------------- GL_EXT_transform_feedback ----------------------- */ + +#ifndef GL_EXT_transform_feedback +#define GL_EXT_transform_feedback 1 + +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76 +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85 +#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88 +#define GL_RASTERIZER_DISCARD_EXT 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B +#define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C +#define GL_SEPARATE_ATTRIBS_EXT 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F + +typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKEXTPROC) (void); +typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei *size, GLenum *type, char *name); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const char ** varyings, GLenum bufferMode); + +#define glBeginTransformFeedbackEXT GLEW_GET_FUN(__glewBeginTransformFeedbackEXT) +#define glBindBufferBaseEXT GLEW_GET_FUN(__glewBindBufferBaseEXT) +#define glBindBufferOffsetEXT GLEW_GET_FUN(__glewBindBufferOffsetEXT) +#define glBindBufferRangeEXT GLEW_GET_FUN(__glewBindBufferRangeEXT) +#define glEndTransformFeedbackEXT GLEW_GET_FUN(__glewEndTransformFeedbackEXT) +#define glGetTransformFeedbackVaryingEXT GLEW_GET_FUN(__glewGetTransformFeedbackVaryingEXT) +#define glTransformFeedbackVaryingsEXT GLEW_GET_FUN(__glewTransformFeedbackVaryingsEXT) + +#define GLEW_EXT_transform_feedback GLEW_GET_VAR(__GLEW_EXT_transform_feedback) + +#endif /* GL_EXT_transform_feedback */ + +/* -------------------------- GL_EXT_vertex_array -------------------------- */ + +#ifndef GL_EXT_vertex_array +#define GL_EXT_vertex_array 1 + +#define GL_DOUBLE_EXT 0x140A +#define GL_VERTEX_ARRAY_EXT 0x8074 +#define GL_NORMAL_ARRAY_EXT 0x8075 +#define GL_COLOR_ARRAY_EXT 0x8076 +#define GL_INDEX_ARRAY_EXT 0x8077 +#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 +#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 +#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A +#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B +#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C +#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D +#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E +#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F +#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 +#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 +#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 +#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 +#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 +#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 +#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 +#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 +#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A +#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B +#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C +#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D +#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E +#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F +#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 +#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 + +typedef void (GLAPIENTRY * PFNGLARRAYELEMENTEXTPROC) (GLint i); +typedef void (GLAPIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer); +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean* pointer); +typedef void (GLAPIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void* pointer); +typedef void (GLAPIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void* pointer); +typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer); + +#define glArrayElementEXT GLEW_GET_FUN(__glewArrayElementEXT) +#define glColorPointerEXT GLEW_GET_FUN(__glewColorPointerEXT) +#define glDrawArraysEXT GLEW_GET_FUN(__glewDrawArraysEXT) +#define glEdgeFlagPointerEXT GLEW_GET_FUN(__glewEdgeFlagPointerEXT) +#define glIndexPointerEXT GLEW_GET_FUN(__glewIndexPointerEXT) +#define glNormalPointerEXT GLEW_GET_FUN(__glewNormalPointerEXT) +#define glTexCoordPointerEXT GLEW_GET_FUN(__glewTexCoordPointerEXT) +#define glVertexPointerEXT GLEW_GET_FUN(__glewVertexPointerEXT) + +#define GLEW_EXT_vertex_array GLEW_GET_VAR(__GLEW_EXT_vertex_array) + +#endif /* GL_EXT_vertex_array */ + +/* ------------------------ GL_EXT_vertex_array_bgra ----------------------- */ + +#ifndef GL_EXT_vertex_array_bgra +#define GL_EXT_vertex_array_bgra 1 + +#define GL_BGRA 0x80E1 + +#define GLEW_EXT_vertex_array_bgra GLEW_GET_VAR(__GLEW_EXT_vertex_array_bgra) + +#endif /* GL_EXT_vertex_array_bgra */ + +/* ----------------------- GL_EXT_vertex_attrib_64bit ---------------------- */ + +#ifndef GL_EXT_vertex_attrib_64bit +#define GL_EXT_vertex_attrib_64bit 1 + +#define GL_DOUBLE_MAT2_EXT 0x8F46 +#define GL_DOUBLE_MAT3_EXT 0x8F47 +#define GL_DOUBLE_MAT4_EXT 0x8F48 +#define GL_DOUBLE_MAT2x3_EXT 0x8F49 +#define GL_DOUBLE_MAT2x4_EXT 0x8F4A +#define GL_DOUBLE_MAT3x2_EXT 0x8F4B +#define GL_DOUBLE_MAT3x4_EXT 0x8F4C +#define GL_DOUBLE_MAT4x2_EXT 0x8F4D +#define GL_DOUBLE_MAT4x3_EXT 0x8F4E +#define GL_DOUBLE_VEC2_EXT 0x8FFC +#define GL_DOUBLE_VEC3_EXT 0x8FFD +#define GL_DOUBLE_VEC4_EXT 0x8FFE + +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLDVEXTPROC) (GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DEXTPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DVEXTPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DEXTPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DVEXTPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DVEXTPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DVEXTPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer); + +#define glGetVertexAttribLdvEXT GLEW_GET_FUN(__glewGetVertexAttribLdvEXT) +#define glVertexArrayVertexAttribLOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribLOffsetEXT) +#define glVertexAttribL1dEXT GLEW_GET_FUN(__glewVertexAttribL1dEXT) +#define glVertexAttribL1dvEXT GLEW_GET_FUN(__glewVertexAttribL1dvEXT) +#define glVertexAttribL2dEXT GLEW_GET_FUN(__glewVertexAttribL2dEXT) +#define glVertexAttribL2dvEXT GLEW_GET_FUN(__glewVertexAttribL2dvEXT) +#define glVertexAttribL3dEXT GLEW_GET_FUN(__glewVertexAttribL3dEXT) +#define glVertexAttribL3dvEXT GLEW_GET_FUN(__glewVertexAttribL3dvEXT) +#define glVertexAttribL4dEXT GLEW_GET_FUN(__glewVertexAttribL4dEXT) +#define glVertexAttribL4dvEXT GLEW_GET_FUN(__glewVertexAttribL4dvEXT) +#define glVertexAttribLPointerEXT GLEW_GET_FUN(__glewVertexAttribLPointerEXT) + +#define GLEW_EXT_vertex_attrib_64bit GLEW_GET_VAR(__GLEW_EXT_vertex_attrib_64bit) + +#endif /* GL_EXT_vertex_attrib_64bit */ + +/* -------------------------- GL_EXT_vertex_shader ------------------------- */ + +#ifndef GL_EXT_vertex_shader +#define GL_EXT_vertex_shader 1 + +#define GL_VERTEX_SHADER_EXT 0x8780 +#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 +#define GL_OP_INDEX_EXT 0x8782 +#define GL_OP_NEGATE_EXT 0x8783 +#define GL_OP_DOT3_EXT 0x8784 +#define GL_OP_DOT4_EXT 0x8785 +#define GL_OP_MUL_EXT 0x8786 +#define GL_OP_ADD_EXT 0x8787 +#define GL_OP_MADD_EXT 0x8788 +#define GL_OP_FRAC_EXT 0x8789 +#define GL_OP_MAX_EXT 0x878A +#define GL_OP_MIN_EXT 0x878B +#define GL_OP_SET_GE_EXT 0x878C +#define GL_OP_SET_LT_EXT 0x878D +#define GL_OP_CLAMP_EXT 0x878E +#define GL_OP_FLOOR_EXT 0x878F +#define GL_OP_ROUND_EXT 0x8790 +#define GL_OP_EXP_BASE_2_EXT 0x8791 +#define GL_OP_LOG_BASE_2_EXT 0x8792 +#define GL_OP_POWER_EXT 0x8793 +#define GL_OP_RECIP_EXT 0x8794 +#define GL_OP_RECIP_SQRT_EXT 0x8795 +#define GL_OP_SUB_EXT 0x8796 +#define GL_OP_CROSS_PRODUCT_EXT 0x8797 +#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 +#define GL_OP_MOV_EXT 0x8799 +#define GL_OUTPUT_VERTEX_EXT 0x879A +#define GL_OUTPUT_COLOR0_EXT 0x879B +#define GL_OUTPUT_COLOR1_EXT 0x879C +#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D +#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E +#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F +#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 +#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 +#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 +#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 +#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 +#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 +#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 +#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 +#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 +#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 +#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA +#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB +#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC +#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD +#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE +#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF +#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 +#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 +#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 +#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 +#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 +#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 +#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 +#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 +#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 +#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 +#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA +#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB +#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC +#define GL_OUTPUT_FOG_EXT 0x87BD +#define GL_SCALAR_EXT 0x87BE +#define GL_VECTOR_EXT 0x87BF +#define GL_MATRIX_EXT 0x87C0 +#define GL_VARIANT_EXT 0x87C1 +#define GL_INVARIANT_EXT 0x87C2 +#define GL_LOCAL_CONSTANT_EXT 0x87C3 +#define GL_LOCAL_EXT 0x87C4 +#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 +#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 +#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 +#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 +#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CC +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CD +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE +#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF +#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 +#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 +#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 +#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 +#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 +#define GL_X_EXT 0x87D5 +#define GL_Y_EXT 0x87D6 +#define GL_Z_EXT 0x87D7 +#define GL_W_EXT 0x87D8 +#define GL_NEGATIVE_X_EXT 0x87D9 +#define GL_NEGATIVE_Y_EXT 0x87DA +#define GL_NEGATIVE_Z_EXT 0x87DB +#define GL_NEGATIVE_W_EXT 0x87DC +#define GL_ZERO_EXT 0x87DD +#define GL_ONE_EXT 0x87DE +#define GL_NEGATIVE_ONE_EXT 0x87DF +#define GL_NORMALIZED_RANGE_EXT 0x87E0 +#define GL_FULL_RANGE_EXT 0x87E1 +#define GL_CURRENT_VERTEX_EXT 0x87E2 +#define GL_MVP_MATRIX_EXT 0x87E3 +#define GL_VARIANT_VALUE_EXT 0x87E4 +#define GL_VARIANT_DATATYPE_EXT 0x87E5 +#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 +#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 +#define GL_VARIANT_ARRAY_EXT 0x87E8 +#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 +#define GL_INVARIANT_VALUE_EXT 0x87EA +#define GL_INVARIANT_DATATYPE_EXT 0x87EB +#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC +#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED + +typedef void (GLAPIENTRY * PFNGLBEGINVERTEXSHADEREXTPROC) (void); +typedef GLuint (GLAPIENTRY * PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); +typedef GLuint (GLAPIENTRY * PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); +typedef GLuint (GLAPIENTRY * PFNGLBINDPARAMETEREXTPROC) (GLenum value); +typedef GLuint (GLAPIENTRY * PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); +typedef GLuint (GLAPIENTRY * PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); +typedef void (GLAPIENTRY * PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLENDVERTEXSHADEREXTPROC) (void); +typedef void (GLAPIENTRY * PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef GLuint (GLAPIENTRY * PFNGLGENSYMBOLSEXTPROC) (GLenum dataType, GLenum storageType, GLenum range, GLuint components); +typedef GLuint (GLAPIENTRY * PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); +typedef void (GLAPIENTRY * PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (GLAPIENTRY * PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (GLAPIENTRY * PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (GLAPIENTRY * PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (GLAPIENTRY * PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (GLAPIENTRY * PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (GLAPIENTRY * PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, GLvoid **data); +typedef void (GLAPIENTRY * PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef GLboolean (GLAPIENTRY * PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); +typedef void (GLAPIENTRY * PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, GLvoid *addr); +typedef void (GLAPIENTRY * PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, GLvoid *addr); +typedef void (GLAPIENTRY * PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); +typedef void (GLAPIENTRY * PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +typedef void (GLAPIENTRY * PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +typedef void (GLAPIENTRY * PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (GLAPIENTRY * PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, GLvoid *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTBVEXTPROC) (GLuint id, GLbyte *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTDVEXTPROC) (GLuint id, GLdouble *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTFVEXTPROC) (GLuint id, GLfloat *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTIVEXTPROC) (GLuint id, GLint *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTSVEXTPROC) (GLuint id, GLshort *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTUBVEXTPROC) (GLuint id, GLubyte *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTUIVEXTPROC) (GLuint id, GLuint *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTUSVEXTPROC) (GLuint id, GLushort *addr); +typedef void (GLAPIENTRY * PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); + +#define glBeginVertexShaderEXT GLEW_GET_FUN(__glewBeginVertexShaderEXT) +#define glBindLightParameterEXT GLEW_GET_FUN(__glewBindLightParameterEXT) +#define glBindMaterialParameterEXT GLEW_GET_FUN(__glewBindMaterialParameterEXT) +#define glBindParameterEXT GLEW_GET_FUN(__glewBindParameterEXT) +#define glBindTexGenParameterEXT GLEW_GET_FUN(__glewBindTexGenParameterEXT) +#define glBindTextureUnitParameterEXT GLEW_GET_FUN(__glewBindTextureUnitParameterEXT) +#define glBindVertexShaderEXT GLEW_GET_FUN(__glewBindVertexShaderEXT) +#define glDeleteVertexShaderEXT GLEW_GET_FUN(__glewDeleteVertexShaderEXT) +#define glDisableVariantClientStateEXT GLEW_GET_FUN(__glewDisableVariantClientStateEXT) +#define glEnableVariantClientStateEXT GLEW_GET_FUN(__glewEnableVariantClientStateEXT) +#define glEndVertexShaderEXT GLEW_GET_FUN(__glewEndVertexShaderEXT) +#define glExtractComponentEXT GLEW_GET_FUN(__glewExtractComponentEXT) +#define glGenSymbolsEXT GLEW_GET_FUN(__glewGenSymbolsEXT) +#define glGenVertexShadersEXT GLEW_GET_FUN(__glewGenVertexShadersEXT) +#define glGetInvariantBooleanvEXT GLEW_GET_FUN(__glewGetInvariantBooleanvEXT) +#define glGetInvariantFloatvEXT GLEW_GET_FUN(__glewGetInvariantFloatvEXT) +#define glGetInvariantIntegervEXT GLEW_GET_FUN(__glewGetInvariantIntegervEXT) +#define glGetLocalConstantBooleanvEXT GLEW_GET_FUN(__glewGetLocalConstantBooleanvEXT) +#define glGetLocalConstantFloatvEXT GLEW_GET_FUN(__glewGetLocalConstantFloatvEXT) +#define glGetLocalConstantIntegervEXT GLEW_GET_FUN(__glewGetLocalConstantIntegervEXT) +#define glGetVariantBooleanvEXT GLEW_GET_FUN(__glewGetVariantBooleanvEXT) +#define glGetVariantFloatvEXT GLEW_GET_FUN(__glewGetVariantFloatvEXT) +#define glGetVariantIntegervEXT GLEW_GET_FUN(__glewGetVariantIntegervEXT) +#define glGetVariantPointervEXT GLEW_GET_FUN(__glewGetVariantPointervEXT) +#define glInsertComponentEXT GLEW_GET_FUN(__glewInsertComponentEXT) +#define glIsVariantEnabledEXT GLEW_GET_FUN(__glewIsVariantEnabledEXT) +#define glSetInvariantEXT GLEW_GET_FUN(__glewSetInvariantEXT) +#define glSetLocalConstantEXT GLEW_GET_FUN(__glewSetLocalConstantEXT) +#define glShaderOp1EXT GLEW_GET_FUN(__glewShaderOp1EXT) +#define glShaderOp2EXT GLEW_GET_FUN(__glewShaderOp2EXT) +#define glShaderOp3EXT GLEW_GET_FUN(__glewShaderOp3EXT) +#define glSwizzleEXT GLEW_GET_FUN(__glewSwizzleEXT) +#define glVariantPointerEXT GLEW_GET_FUN(__glewVariantPointerEXT) +#define glVariantbvEXT GLEW_GET_FUN(__glewVariantbvEXT) +#define glVariantdvEXT GLEW_GET_FUN(__glewVariantdvEXT) +#define glVariantfvEXT GLEW_GET_FUN(__glewVariantfvEXT) +#define glVariantivEXT GLEW_GET_FUN(__glewVariantivEXT) +#define glVariantsvEXT GLEW_GET_FUN(__glewVariantsvEXT) +#define glVariantubvEXT GLEW_GET_FUN(__glewVariantubvEXT) +#define glVariantuivEXT GLEW_GET_FUN(__glewVariantuivEXT) +#define glVariantusvEXT GLEW_GET_FUN(__glewVariantusvEXT) +#define glWriteMaskEXT GLEW_GET_FUN(__glewWriteMaskEXT) + +#define GLEW_EXT_vertex_shader GLEW_GET_VAR(__GLEW_EXT_vertex_shader) + +#endif /* GL_EXT_vertex_shader */ + +/* ------------------------ GL_EXT_vertex_weighting ------------------------ */ + +#ifndef GL_EXT_vertex_weighting +#define GL_EXT_vertex_weighting 1 + +#define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3 +#define GL_MODELVIEW0_MATRIX_EXT 0x0BA6 +#define GL_MODELVIEW0_EXT 0x1700 +#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 +#define GL_MODELVIEW1_MATRIX_EXT 0x8506 +#define GL_VERTEX_WEIGHTING_EXT 0x8509 +#define GL_MODELVIEW1_EXT 0x850A +#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B +#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C +#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D +#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E +#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F +#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 + +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, void* pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFVEXTPROC) (GLfloat* weight); + +#define glVertexWeightPointerEXT GLEW_GET_FUN(__glewVertexWeightPointerEXT) +#define glVertexWeightfEXT GLEW_GET_FUN(__glewVertexWeightfEXT) +#define glVertexWeightfvEXT GLEW_GET_FUN(__glewVertexWeightfvEXT) + +#define GLEW_EXT_vertex_weighting GLEW_GET_VAR(__GLEW_EXT_vertex_weighting) + +#endif /* GL_EXT_vertex_weighting */ + +/* ---------------------- GL_GREMEDY_frame_terminator ---------------------- */ + +#ifndef GL_GREMEDY_frame_terminator +#define GL_GREMEDY_frame_terminator 1 + +typedef void (GLAPIENTRY * PFNGLFRAMETERMINATORGREMEDYPROC) (void); + +#define glFrameTerminatorGREMEDY GLEW_GET_FUN(__glewFrameTerminatorGREMEDY) + +#define GLEW_GREMEDY_frame_terminator GLEW_GET_VAR(__GLEW_GREMEDY_frame_terminator) + +#endif /* GL_GREMEDY_frame_terminator */ + +/* ------------------------ GL_GREMEDY_string_marker ----------------------- */ + +#ifndef GL_GREMEDY_string_marker +#define GL_GREMEDY_string_marker 1 + +typedef void (GLAPIENTRY * PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const void* string); + +#define glStringMarkerGREMEDY GLEW_GET_FUN(__glewStringMarkerGREMEDY) + +#define GLEW_GREMEDY_string_marker GLEW_GET_VAR(__GLEW_GREMEDY_string_marker) + +#endif /* GL_GREMEDY_string_marker */ + +/* --------------------- GL_HP_convolution_border_modes -------------------- */ + +#ifndef GL_HP_convolution_border_modes +#define GL_HP_convolution_border_modes 1 + +#define GLEW_HP_convolution_border_modes GLEW_GET_VAR(__GLEW_HP_convolution_border_modes) + +#endif /* GL_HP_convolution_border_modes */ + +/* ------------------------- GL_HP_image_transform ------------------------- */ + +#ifndef GL_HP_image_transform +#define GL_HP_image_transform 1 + +typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, const GLfloat param); +typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, const GLint param); +typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params); + +#define glGetImageTransformParameterfvHP GLEW_GET_FUN(__glewGetImageTransformParameterfvHP) +#define glGetImageTransformParameterivHP GLEW_GET_FUN(__glewGetImageTransformParameterivHP) +#define glImageTransformParameterfHP GLEW_GET_FUN(__glewImageTransformParameterfHP) +#define glImageTransformParameterfvHP GLEW_GET_FUN(__glewImageTransformParameterfvHP) +#define glImageTransformParameteriHP GLEW_GET_FUN(__glewImageTransformParameteriHP) +#define glImageTransformParameterivHP GLEW_GET_FUN(__glewImageTransformParameterivHP) + +#define GLEW_HP_image_transform GLEW_GET_VAR(__GLEW_HP_image_transform) + +#endif /* GL_HP_image_transform */ + +/* -------------------------- GL_HP_occlusion_test ------------------------- */ + +#ifndef GL_HP_occlusion_test +#define GL_HP_occlusion_test 1 + +#define GL_OCCLUSION_TEST_HP 0x8165 +#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 + +#define GLEW_HP_occlusion_test GLEW_GET_VAR(__GLEW_HP_occlusion_test) + +#endif /* GL_HP_occlusion_test */ + +/* ------------------------- GL_HP_texture_lighting ------------------------ */ + +#ifndef GL_HP_texture_lighting +#define GL_HP_texture_lighting 1 + +#define GLEW_HP_texture_lighting GLEW_GET_VAR(__GLEW_HP_texture_lighting) + +#endif /* GL_HP_texture_lighting */ + +/* --------------------------- GL_IBM_cull_vertex -------------------------- */ + +#ifndef GL_IBM_cull_vertex +#define GL_IBM_cull_vertex 1 + +#define GL_CULL_VERTEX_IBM 103050 + +#define GLEW_IBM_cull_vertex GLEW_GET_VAR(__GLEW_IBM_cull_vertex) + +#endif /* GL_IBM_cull_vertex */ + +/* ---------------------- GL_IBM_multimode_draw_arrays --------------------- */ + +#ifndef GL_IBM_multimode_draw_arrays +#define GL_IBM_multimode_draw_arrays 1 + +typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum* mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); +typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum* mode, const GLsizei *count, GLenum type, const GLvoid * const *indices, GLsizei primcount, GLint modestride); + +#define glMultiModeDrawArraysIBM GLEW_GET_FUN(__glewMultiModeDrawArraysIBM) +#define glMultiModeDrawElementsIBM GLEW_GET_FUN(__glewMultiModeDrawElementsIBM) + +#define GLEW_IBM_multimode_draw_arrays GLEW_GET_VAR(__GLEW_IBM_multimode_draw_arrays) + +#endif /* GL_IBM_multimode_draw_arrays */ + +/* ------------------------- GL_IBM_rasterpos_clip ------------------------- */ + +#ifndef GL_IBM_rasterpos_clip +#define GL_IBM_rasterpos_clip 1 + +#define GL_RASTER_POSITION_UNCLIPPED_IBM 103010 + +#define GLEW_IBM_rasterpos_clip GLEW_GET_VAR(__GLEW_IBM_rasterpos_clip) + +#endif /* GL_IBM_rasterpos_clip */ + +/* --------------------------- GL_IBM_static_data -------------------------- */ + +#ifndef GL_IBM_static_data +#define GL_IBM_static_data 1 + +#define GL_ALL_STATIC_DATA_IBM 103060 +#define GL_STATIC_VERTEX_ARRAY_IBM 103061 + +#define GLEW_IBM_static_data GLEW_GET_VAR(__GLEW_IBM_static_data) + +#endif /* GL_IBM_static_data */ + +/* --------------------- GL_IBM_texture_mirrored_repeat -------------------- */ + +#ifndef GL_IBM_texture_mirrored_repeat +#define GL_IBM_texture_mirrored_repeat 1 + +#define GL_MIRRORED_REPEAT_IBM 0x8370 + +#define GLEW_IBM_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_IBM_texture_mirrored_repeat) + +#endif /* GL_IBM_texture_mirrored_repeat */ + +/* ----------------------- GL_IBM_vertex_array_lists ----------------------- */ + +#ifndef GL_IBM_vertex_array_lists +#define GL_IBM_vertex_array_lists 1 + +#define GL_VERTEX_ARRAY_LIST_IBM 103070 +#define GL_NORMAL_ARRAY_LIST_IBM 103071 +#define GL_COLOR_ARRAY_LIST_IBM 103072 +#define GL_INDEX_ARRAY_LIST_IBM 103073 +#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 +#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 +#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 +#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 +#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 +#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 +#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 +#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 +#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 +#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 +#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 +#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 + +typedef void (GLAPIENTRY * PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const GLvoid ** pointer, GLint ptrstride); + +#define glColorPointerListIBM GLEW_GET_FUN(__glewColorPointerListIBM) +#define glEdgeFlagPointerListIBM GLEW_GET_FUN(__glewEdgeFlagPointerListIBM) +#define glFogCoordPointerListIBM GLEW_GET_FUN(__glewFogCoordPointerListIBM) +#define glIndexPointerListIBM GLEW_GET_FUN(__glewIndexPointerListIBM) +#define glNormalPointerListIBM GLEW_GET_FUN(__glewNormalPointerListIBM) +#define glSecondaryColorPointerListIBM GLEW_GET_FUN(__glewSecondaryColorPointerListIBM) +#define glTexCoordPointerListIBM GLEW_GET_FUN(__glewTexCoordPointerListIBM) +#define glVertexPointerListIBM GLEW_GET_FUN(__glewVertexPointerListIBM) + +#define GLEW_IBM_vertex_array_lists GLEW_GET_VAR(__GLEW_IBM_vertex_array_lists) + +#endif /* GL_IBM_vertex_array_lists */ + +/* -------------------------- GL_INGR_color_clamp -------------------------- */ + +#ifndef GL_INGR_color_clamp +#define GL_INGR_color_clamp 1 + +#define GL_RED_MIN_CLAMP_INGR 0x8560 +#define GL_GREEN_MIN_CLAMP_INGR 0x8561 +#define GL_BLUE_MIN_CLAMP_INGR 0x8562 +#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 +#define GL_RED_MAX_CLAMP_INGR 0x8564 +#define GL_GREEN_MAX_CLAMP_INGR 0x8565 +#define GL_BLUE_MAX_CLAMP_INGR 0x8566 +#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 + +#define GLEW_INGR_color_clamp GLEW_GET_VAR(__GLEW_INGR_color_clamp) + +#endif /* GL_INGR_color_clamp */ + +/* ------------------------- GL_INGR_interlace_read ------------------------ */ + +#ifndef GL_INGR_interlace_read +#define GL_INGR_interlace_read 1 + +#define GL_INTERLACE_READ_INGR 0x8568 + +#define GLEW_INGR_interlace_read GLEW_GET_VAR(__GLEW_INGR_interlace_read) + +#endif /* GL_INGR_interlace_read */ + +/* ------------------------ GL_INTEL_parallel_arrays ----------------------- */ + +#ifndef GL_INTEL_parallel_arrays +#define GL_INTEL_parallel_arrays 1 + +#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 +#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 +#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 +#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 +#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 + +typedef void (GLAPIENTRY * PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); +typedef void (GLAPIENTRY * PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const void** pointer); +typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); + +#define glColorPointervINTEL GLEW_GET_FUN(__glewColorPointervINTEL) +#define glNormalPointervINTEL GLEW_GET_FUN(__glewNormalPointervINTEL) +#define glTexCoordPointervINTEL GLEW_GET_FUN(__glewTexCoordPointervINTEL) +#define glVertexPointervINTEL GLEW_GET_FUN(__glewVertexPointervINTEL) + +#define GLEW_INTEL_parallel_arrays GLEW_GET_VAR(__GLEW_INTEL_parallel_arrays) + +#endif /* GL_INTEL_parallel_arrays */ + +/* ------------------------ GL_INTEL_texture_scissor ----------------------- */ + +#ifndef GL_INTEL_texture_scissor +#define GL_INTEL_texture_scissor 1 + +typedef void (GLAPIENTRY * PFNGLTEXSCISSORFUNCINTELPROC) (GLenum target, GLenum lfunc, GLenum hfunc); +typedef void (GLAPIENTRY * PFNGLTEXSCISSORINTELPROC) (GLenum target, GLclampf tlow, GLclampf thigh); + +#define glTexScissorFuncINTEL GLEW_GET_FUN(__glewTexScissorFuncINTEL) +#define glTexScissorINTEL GLEW_GET_FUN(__glewTexScissorINTEL) + +#define GLEW_INTEL_texture_scissor GLEW_GET_VAR(__GLEW_INTEL_texture_scissor) + +#endif /* GL_INTEL_texture_scissor */ + +/* -------------------------- GL_KTX_buffer_region ------------------------- */ + +#ifndef GL_KTX_buffer_region +#define GL_KTX_buffer_region 1 + +#define GL_KTX_FRONT_REGION 0x0 +#define GL_KTX_BACK_REGION 0x1 +#define GL_KTX_Z_REGION 0x2 +#define GL_KTX_STENCIL_REGION 0x3 + +typedef GLuint (GLAPIENTRY * PFNGLBUFFERREGIONENABLEDEXTPROC) (void); +typedef void (GLAPIENTRY * PFNGLDELETEBUFFERREGIONEXTPROC) (GLenum region); +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERREGIONEXTPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height, GLint xDest, GLint yDest); +typedef GLuint (GLAPIENTRY * PFNGLNEWBUFFERREGIONEXTPROC) (GLenum region); +typedef void (GLAPIENTRY * PFNGLREADBUFFERREGIONEXTPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height); + +#define glBufferRegionEnabledEXT GLEW_GET_FUN(__glewBufferRegionEnabledEXT) +#define glDeleteBufferRegionEXT GLEW_GET_FUN(__glewDeleteBufferRegionEXT) +#define glDrawBufferRegionEXT GLEW_GET_FUN(__glewDrawBufferRegionEXT) +#define glNewBufferRegionEXT GLEW_GET_FUN(__glewNewBufferRegionEXT) +#define glReadBufferRegionEXT GLEW_GET_FUN(__glewReadBufferRegionEXT) + +#define GLEW_KTX_buffer_region GLEW_GET_VAR(__GLEW_KTX_buffer_region) + +#endif /* GL_KTX_buffer_region */ + +/* ------------------------- GL_MESAX_texture_stack ------------------------ */ + +#ifndef GL_MESAX_texture_stack +#define GL_MESAX_texture_stack 1 + +#define GL_TEXTURE_1D_STACK_MESAX 0x8759 +#define GL_TEXTURE_2D_STACK_MESAX 0x875A +#define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B +#define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C +#define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D +#define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E + +#define GLEW_MESAX_texture_stack GLEW_GET_VAR(__GLEW_MESAX_texture_stack) + +#endif /* GL_MESAX_texture_stack */ + +/* -------------------------- GL_MESA_pack_invert -------------------------- */ + +#ifndef GL_MESA_pack_invert +#define GL_MESA_pack_invert 1 + +#define GL_PACK_INVERT_MESA 0x8758 + +#define GLEW_MESA_pack_invert GLEW_GET_VAR(__GLEW_MESA_pack_invert) + +#endif /* GL_MESA_pack_invert */ + +/* ------------------------- GL_MESA_resize_buffers ------------------------ */ + +#ifndef GL_MESA_resize_buffers +#define GL_MESA_resize_buffers 1 + +typedef void (GLAPIENTRY * PFNGLRESIZEBUFFERSMESAPROC) (void); + +#define glResizeBuffersMESA GLEW_GET_FUN(__glewResizeBuffersMESA) + +#define GLEW_MESA_resize_buffers GLEW_GET_VAR(__GLEW_MESA_resize_buffers) + +#endif /* GL_MESA_resize_buffers */ + +/* --------------------------- GL_MESA_window_pos -------------------------- */ + +#ifndef GL_MESA_window_pos +#define GL_MESA_window_pos 1 + +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVMESAPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVMESAPROC) (const GLshort* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVMESAPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVMESAPROC) (const GLshort* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IVMESAPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SVMESAPROC) (const GLshort* p); + +#define glWindowPos2dMESA GLEW_GET_FUN(__glewWindowPos2dMESA) +#define glWindowPos2dvMESA GLEW_GET_FUN(__glewWindowPos2dvMESA) +#define glWindowPos2fMESA GLEW_GET_FUN(__glewWindowPos2fMESA) +#define glWindowPos2fvMESA GLEW_GET_FUN(__glewWindowPos2fvMESA) +#define glWindowPos2iMESA GLEW_GET_FUN(__glewWindowPos2iMESA) +#define glWindowPos2ivMESA GLEW_GET_FUN(__glewWindowPos2ivMESA) +#define glWindowPos2sMESA GLEW_GET_FUN(__glewWindowPos2sMESA) +#define glWindowPos2svMESA GLEW_GET_FUN(__glewWindowPos2svMESA) +#define glWindowPos3dMESA GLEW_GET_FUN(__glewWindowPos3dMESA) +#define glWindowPos3dvMESA GLEW_GET_FUN(__glewWindowPos3dvMESA) +#define glWindowPos3fMESA GLEW_GET_FUN(__glewWindowPos3fMESA) +#define glWindowPos3fvMESA GLEW_GET_FUN(__glewWindowPos3fvMESA) +#define glWindowPos3iMESA GLEW_GET_FUN(__glewWindowPos3iMESA) +#define glWindowPos3ivMESA GLEW_GET_FUN(__glewWindowPos3ivMESA) +#define glWindowPos3sMESA GLEW_GET_FUN(__glewWindowPos3sMESA) +#define glWindowPos3svMESA GLEW_GET_FUN(__glewWindowPos3svMESA) +#define glWindowPos4dMESA GLEW_GET_FUN(__glewWindowPos4dMESA) +#define glWindowPos4dvMESA GLEW_GET_FUN(__glewWindowPos4dvMESA) +#define glWindowPos4fMESA GLEW_GET_FUN(__glewWindowPos4fMESA) +#define glWindowPos4fvMESA GLEW_GET_FUN(__glewWindowPos4fvMESA) +#define glWindowPos4iMESA GLEW_GET_FUN(__glewWindowPos4iMESA) +#define glWindowPos4ivMESA GLEW_GET_FUN(__glewWindowPos4ivMESA) +#define glWindowPos4sMESA GLEW_GET_FUN(__glewWindowPos4sMESA) +#define glWindowPos4svMESA GLEW_GET_FUN(__glewWindowPos4svMESA) + +#define GLEW_MESA_window_pos GLEW_GET_VAR(__GLEW_MESA_window_pos) + +#endif /* GL_MESA_window_pos */ + +/* ------------------------- GL_MESA_ycbcr_texture ------------------------- */ + +#ifndef GL_MESA_ycbcr_texture +#define GL_MESA_ycbcr_texture 1 + +#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB +#define GL_YCBCR_MESA 0x8757 + +#define GLEW_MESA_ycbcr_texture GLEW_GET_VAR(__GLEW_MESA_ycbcr_texture) + +#endif /* GL_MESA_ycbcr_texture */ + +/* ------------------------- GL_NVX_gpu_memory_info ------------------------ */ + +#ifndef GL_NVX_gpu_memory_info +#define GL_NVX_gpu_memory_info 1 + +#define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047 +#define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048 +#define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049 +#define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A +#define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B + +#define GLEW_NVX_gpu_memory_info GLEW_GET_VAR(__GLEW_NVX_gpu_memory_info) + +#endif /* GL_NVX_gpu_memory_info */ + +/* --------------------------- GL_NV_blend_square -------------------------- */ + +#ifndef GL_NV_blend_square +#define GL_NV_blend_square 1 + +#define GLEW_NV_blend_square GLEW_GET_VAR(__GLEW_NV_blend_square) + +#endif /* GL_NV_blend_square */ + +/* ------------------------ GL_NV_conditional_render ----------------------- */ + +#ifndef GL_NV_conditional_render +#define GL_NV_conditional_render 1 + +#define GL_QUERY_WAIT_NV 0x8E13 +#define GL_QUERY_NO_WAIT_NV 0x8E14 +#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 +#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 + +typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode); +typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERNVPROC) (void); + +#define glBeginConditionalRenderNV GLEW_GET_FUN(__glewBeginConditionalRenderNV) +#define glEndConditionalRenderNV GLEW_GET_FUN(__glewEndConditionalRenderNV) + +#define GLEW_NV_conditional_render GLEW_GET_VAR(__GLEW_NV_conditional_render) + +#endif /* GL_NV_conditional_render */ + +/* ----------------------- GL_NV_copy_depth_to_color ----------------------- */ + +#ifndef GL_NV_copy_depth_to_color +#define GL_NV_copy_depth_to_color 1 + +#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E +#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F + +#define GLEW_NV_copy_depth_to_color GLEW_GET_VAR(__GLEW_NV_copy_depth_to_color) + +#endif /* GL_NV_copy_depth_to_color */ + +/* ---------------------------- GL_NV_copy_image --------------------------- */ + +#ifndef GL_NV_copy_image +#define GL_NV_copy_image 1 + +typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATANVPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); + +#define glCopyImageSubDataNV GLEW_GET_FUN(__glewCopyImageSubDataNV) + +#define GLEW_NV_copy_image GLEW_GET_VAR(__GLEW_NV_copy_image) + +#endif /* GL_NV_copy_image */ + +/* ------------------------ GL_NV_depth_buffer_float ----------------------- */ + +#ifndef GL_NV_depth_buffer_float +#define GL_NV_depth_buffer_float 1 + +#define GL_DEPTH_COMPONENT32F_NV 0x8DAB +#define GL_DEPTH32F_STENCIL8_NV 0x8DAC +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD +#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF + +typedef void (GLAPIENTRY * PFNGLCLEARDEPTHDNVPROC) (GLdouble depth); +typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); + +#define glClearDepthdNV GLEW_GET_FUN(__glewClearDepthdNV) +#define glDepthBoundsdNV GLEW_GET_FUN(__glewDepthBoundsdNV) +#define glDepthRangedNV GLEW_GET_FUN(__glewDepthRangedNV) + +#define GLEW_NV_depth_buffer_float GLEW_GET_VAR(__GLEW_NV_depth_buffer_float) + +#endif /* GL_NV_depth_buffer_float */ + +/* --------------------------- GL_NV_depth_clamp --------------------------- */ + +#ifndef GL_NV_depth_clamp +#define GL_NV_depth_clamp 1 + +#define GL_DEPTH_CLAMP_NV 0x864F + +#define GLEW_NV_depth_clamp GLEW_GET_VAR(__GLEW_NV_depth_clamp) + +#endif /* GL_NV_depth_clamp */ + +/* ---------------------- GL_NV_depth_range_unclamped ---------------------- */ + +#ifndef GL_NV_depth_range_unclamped +#define GL_NV_depth_range_unclamped 1 + +#define GL_SAMPLE_COUNT_BITS_NV 0x8864 +#define GL_CURRENT_SAMPLE_COUNT_QUERY_NV 0x8865 +#define GL_QUERY_RESULT_NV 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_NV 0x8867 +#define GL_SAMPLE_COUNT_NV 0x8914 + +#define GLEW_NV_depth_range_unclamped GLEW_GET_VAR(__GLEW_NV_depth_range_unclamped) + +#endif /* GL_NV_depth_range_unclamped */ + +/* ---------------------------- GL_NV_evaluators --------------------------- */ + +#ifndef GL_NV_evaluators +#define GL_NV_evaluators 1 + +#define GL_EVAL_2D_NV 0x86C0 +#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 +#define GL_MAP_TESSELLATION_NV 0x86C2 +#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 +#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 +#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 +#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 +#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 +#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 +#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 +#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA +#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB +#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC +#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD +#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE +#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF +#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 +#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 +#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 +#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 +#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 +#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 +#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 +#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 + +typedef void (GLAPIENTRY * PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); +typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void* points); +typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void* points); +typedef void (GLAPIENTRY * PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint* params); + +#define glEvalMapsNV GLEW_GET_FUN(__glewEvalMapsNV) +#define glGetMapAttribParameterfvNV GLEW_GET_FUN(__glewGetMapAttribParameterfvNV) +#define glGetMapAttribParameterivNV GLEW_GET_FUN(__glewGetMapAttribParameterivNV) +#define glGetMapControlPointsNV GLEW_GET_FUN(__glewGetMapControlPointsNV) +#define glGetMapParameterfvNV GLEW_GET_FUN(__glewGetMapParameterfvNV) +#define glGetMapParameterivNV GLEW_GET_FUN(__glewGetMapParameterivNV) +#define glMapControlPointsNV GLEW_GET_FUN(__glewMapControlPointsNV) +#define glMapParameterfvNV GLEW_GET_FUN(__glewMapParameterfvNV) +#define glMapParameterivNV GLEW_GET_FUN(__glewMapParameterivNV) + +#define GLEW_NV_evaluators GLEW_GET_VAR(__GLEW_NV_evaluators) + +#endif /* GL_NV_evaluators */ + +/* ----------------------- GL_NV_explicit_multisample ---------------------- */ + +#ifndef GL_NV_explicit_multisample +#define GL_NV_explicit_multisample 1 + +#define GL_SAMPLE_POSITION_NV 0x8E50 +#define GL_SAMPLE_MASK_NV 0x8E51 +#define GL_SAMPLE_MASK_VALUE_NV 0x8E52 +#define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53 +#define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54 +#define GL_TEXTURE_RENDERBUFFER_NV 0x8E55 +#define GL_SAMPLER_RENDERBUFFER_NV 0x8E56 +#define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57 +#define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58 +#define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59 + +typedef void (GLAPIENTRY * PFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat* val); +typedef void (GLAPIENTRY * PFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask); +typedef void (GLAPIENTRY * PFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint renderbuffer); + +#define glGetMultisamplefvNV GLEW_GET_FUN(__glewGetMultisamplefvNV) +#define glSampleMaskIndexedNV GLEW_GET_FUN(__glewSampleMaskIndexedNV) +#define glTexRenderbufferNV GLEW_GET_FUN(__glewTexRenderbufferNV) + +#define GLEW_NV_explicit_multisample GLEW_GET_VAR(__GLEW_NV_explicit_multisample) + +#endif /* GL_NV_explicit_multisample */ + +/* ------------------------------ GL_NV_fence ------------------------------ */ + +#ifndef GL_NV_fence +#define GL_NV_fence 1 + +#define GL_ALL_COMPLETED_NV 0x84F2 +#define GL_FENCE_STATUS_NV 0x84F3 +#define GL_FENCE_CONDITION_NV 0x84F4 + +typedef void (GLAPIENTRY * PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint* fences); +typedef void (GLAPIENTRY * PFNGLFINISHFENCENVPROC) (GLuint fence); +typedef void (GLAPIENTRY * PFNGLGENFENCESNVPROC) (GLsizei n, GLuint* fences); +typedef void (GLAPIENTRY * PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISFENCENVPROC) (GLuint fence); +typedef void (GLAPIENTRY * PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); +typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCENVPROC) (GLuint fence); + +#define glDeleteFencesNV GLEW_GET_FUN(__glewDeleteFencesNV) +#define glFinishFenceNV GLEW_GET_FUN(__glewFinishFenceNV) +#define glGenFencesNV GLEW_GET_FUN(__glewGenFencesNV) +#define glGetFenceivNV GLEW_GET_FUN(__glewGetFenceivNV) +#define glIsFenceNV GLEW_GET_FUN(__glewIsFenceNV) +#define glSetFenceNV GLEW_GET_FUN(__glewSetFenceNV) +#define glTestFenceNV GLEW_GET_FUN(__glewTestFenceNV) + +#define GLEW_NV_fence GLEW_GET_VAR(__GLEW_NV_fence) + +#endif /* GL_NV_fence */ + +/* --------------------------- GL_NV_float_buffer -------------------------- */ + +#ifndef GL_NV_float_buffer +#define GL_NV_float_buffer 1 + +#define GL_FLOAT_R_NV 0x8880 +#define GL_FLOAT_RG_NV 0x8881 +#define GL_FLOAT_RGB_NV 0x8882 +#define GL_FLOAT_RGBA_NV 0x8883 +#define GL_FLOAT_R16_NV 0x8884 +#define GL_FLOAT_R32_NV 0x8885 +#define GL_FLOAT_RG16_NV 0x8886 +#define GL_FLOAT_RG32_NV 0x8887 +#define GL_FLOAT_RGB16_NV 0x8888 +#define GL_FLOAT_RGB32_NV 0x8889 +#define GL_FLOAT_RGBA16_NV 0x888A +#define GL_FLOAT_RGBA32_NV 0x888B +#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C +#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D +#define GL_FLOAT_RGBA_MODE_NV 0x888E + +#define GLEW_NV_float_buffer GLEW_GET_VAR(__GLEW_NV_float_buffer) + +#endif /* GL_NV_float_buffer */ + +/* --------------------------- GL_NV_fog_distance -------------------------- */ + +#ifndef GL_NV_fog_distance +#define GL_NV_fog_distance 1 + +#define GL_FOG_DISTANCE_MODE_NV 0x855A +#define GL_EYE_RADIAL_NV 0x855B +#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C + +#define GLEW_NV_fog_distance GLEW_GET_VAR(__GLEW_NV_fog_distance) + +#endif /* GL_NV_fog_distance */ + +/* ------------------------- GL_NV_fragment_program ------------------------ */ + +#ifndef GL_NV_fragment_program +#define GL_NV_fragment_program 1 + +#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 +#define GL_FRAGMENT_PROGRAM_NV 0x8870 +#define GL_MAX_TEXTURE_COORDS_NV 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 +#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 +#define GL_PROGRAM_ERROR_STRING_NV 0x8874 + +typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble *params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLdouble v[]); +typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLfloat v[]); + +#define glGetProgramNamedParameterdvNV GLEW_GET_FUN(__glewGetProgramNamedParameterdvNV) +#define glGetProgramNamedParameterfvNV GLEW_GET_FUN(__glewGetProgramNamedParameterfvNV) +#define glProgramNamedParameter4dNV GLEW_GET_FUN(__glewProgramNamedParameter4dNV) +#define glProgramNamedParameter4dvNV GLEW_GET_FUN(__glewProgramNamedParameter4dvNV) +#define glProgramNamedParameter4fNV GLEW_GET_FUN(__glewProgramNamedParameter4fNV) +#define glProgramNamedParameter4fvNV GLEW_GET_FUN(__glewProgramNamedParameter4fvNV) + +#define GLEW_NV_fragment_program GLEW_GET_VAR(__GLEW_NV_fragment_program) + +#endif /* GL_NV_fragment_program */ + +/* ------------------------ GL_NV_fragment_program2 ------------------------ */ + +#ifndef GL_NV_fragment_program2 +#define GL_NV_fragment_program2 1 + +#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 +#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 +#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 +#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 +#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 + +#define GLEW_NV_fragment_program2 GLEW_GET_VAR(__GLEW_NV_fragment_program2) + +#endif /* GL_NV_fragment_program2 */ + +/* ------------------------ GL_NV_fragment_program4 ------------------------ */ + +#ifndef GL_NV_fragment_program4 +#define GL_NV_fragment_program4 1 + +#define GLEW_NV_fragment_program4 GLEW_GET_VAR(__GLEW_NV_fragment_program4) + +#endif /* GL_NV_fragment_program4 */ + +/* --------------------- GL_NV_fragment_program_option --------------------- */ + +#ifndef GL_NV_fragment_program_option +#define GL_NV_fragment_program_option 1 + +#define GLEW_NV_fragment_program_option GLEW_GET_VAR(__GLEW_NV_fragment_program_option) + +#endif /* GL_NV_fragment_program_option */ + +/* ----------------- GL_NV_framebuffer_multisample_coverage ---------------- */ + +#ifndef GL_NV_framebuffer_multisample_coverage +#define GL_NV_framebuffer_multisample_coverage 1 + +#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB +#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 +#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 +#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 + +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); + +#define glRenderbufferStorageMultisampleCoverageNV GLEW_GET_FUN(__glewRenderbufferStorageMultisampleCoverageNV) + +#define GLEW_NV_framebuffer_multisample_coverage GLEW_GET_VAR(__GLEW_NV_framebuffer_multisample_coverage) + +#endif /* GL_NV_framebuffer_multisample_coverage */ + +/* ------------------------ GL_NV_geometry_program4 ------------------------ */ + +#ifndef GL_NV_geometry_program4 +#define GL_NV_geometry_program4 1 + +#define GL_GEOMETRY_PROGRAM_NV 0x8C26 +#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 +#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 + +typedef void (GLAPIENTRY * PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit); + +#define glProgramVertexLimitNV GLEW_GET_FUN(__glewProgramVertexLimitNV) + +#define GLEW_NV_geometry_program4 GLEW_GET_VAR(__GLEW_NV_geometry_program4) + +#endif /* GL_NV_geometry_program4 */ + +/* ------------------------- GL_NV_geometry_shader4 ------------------------ */ + +#ifndef GL_NV_geometry_shader4 +#define GL_NV_geometry_shader4 1 + +#define GLEW_NV_geometry_shader4 GLEW_GET_VAR(__GLEW_NV_geometry_shader4) + +#endif /* GL_NV_geometry_shader4 */ + +/* --------------------------- GL_NV_gpu_program4 -------------------------- */ + +#ifndef GL_NV_gpu_program4 +#define GL_NV_gpu_program4 1 + +#define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905 +#define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 +#define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907 +#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908 +#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 +#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 +#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 + +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); + +#define glProgramEnvParameterI4iNV GLEW_GET_FUN(__glewProgramEnvParameterI4iNV) +#define glProgramEnvParameterI4ivNV GLEW_GET_FUN(__glewProgramEnvParameterI4ivNV) +#define glProgramEnvParameterI4uiNV GLEW_GET_FUN(__glewProgramEnvParameterI4uiNV) +#define glProgramEnvParameterI4uivNV GLEW_GET_FUN(__glewProgramEnvParameterI4uivNV) +#define glProgramEnvParametersI4ivNV GLEW_GET_FUN(__glewProgramEnvParametersI4ivNV) +#define glProgramEnvParametersI4uivNV GLEW_GET_FUN(__glewProgramEnvParametersI4uivNV) +#define glProgramLocalParameterI4iNV GLEW_GET_FUN(__glewProgramLocalParameterI4iNV) +#define glProgramLocalParameterI4ivNV GLEW_GET_FUN(__glewProgramLocalParameterI4ivNV) +#define glProgramLocalParameterI4uiNV GLEW_GET_FUN(__glewProgramLocalParameterI4uiNV) +#define glProgramLocalParameterI4uivNV GLEW_GET_FUN(__glewProgramLocalParameterI4uivNV) +#define glProgramLocalParametersI4ivNV GLEW_GET_FUN(__glewProgramLocalParametersI4ivNV) +#define glProgramLocalParametersI4uivNV GLEW_GET_FUN(__glewProgramLocalParametersI4uivNV) + +#define GLEW_NV_gpu_program4 GLEW_GET_VAR(__GLEW_NV_gpu_program4) + +#endif /* GL_NV_gpu_program4 */ + +/* --------------------------- GL_NV_gpu_program5 -------------------------- */ + +#ifndef GL_NV_gpu_program5 +#define GL_NV_gpu_program5 1 + +#define GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV 0x8E5A +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C +#define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV 0x8E5D +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5F + +#define GLEW_NV_gpu_program5 GLEW_GET_VAR(__GLEW_NV_gpu_program5) + +#endif /* GL_NV_gpu_program5 */ + +/* ------------------------- GL_NV_gpu_program_fp64 ------------------------ */ + +#ifndef GL_NV_gpu_program_fp64 +#define GL_NV_gpu_program_fp64 1 + +#define GLEW_NV_gpu_program_fp64 GLEW_GET_VAR(__GLEW_NV_gpu_program_fp64) + +#endif /* GL_NV_gpu_program_fp64 */ + +/* --------------------------- GL_NV_gpu_shader5 --------------------------- */ + +#ifndef GL_NV_gpu_shader5 +#define GL_NV_gpu_shader5 1 + +#define GL_INT64_NV 0x140E +#define GL_UNSIGNED_INT64_NV 0x140F +#define GL_INT8_NV 0x8FE0 +#define GL_INT8_VEC2_NV 0x8FE1 +#define GL_INT8_VEC3_NV 0x8FE2 +#define GL_INT8_VEC4_NV 0x8FE3 +#define GL_INT16_NV 0x8FE4 +#define GL_INT16_VEC2_NV 0x8FE5 +#define GL_INT16_VEC3_NV 0x8FE6 +#define GL_INT16_VEC4_NV 0x8FE7 +#define GL_INT64_VEC2_NV 0x8FE9 +#define GL_INT64_VEC3_NV 0x8FEA +#define GL_INT64_VEC4_NV 0x8FEB +#define GL_UNSIGNED_INT8_NV 0x8FEC +#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED +#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE +#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF +#define GL_UNSIGNED_INT16_NV 0x8FF0 +#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 +#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 +#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 +#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 +#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 +#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 +#define GL_FLOAT16_NV 0x8FF8 +#define GL_FLOAT16_VEC2_NV 0x8FF9 +#define GL_FLOAT16_VEC3_NV 0x8FFA +#define GL_FLOAT16_VEC4_NV 0x8FFB + +typedef void (GLAPIENTRY * PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT* params); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x); +typedef void (GLAPIENTRY * PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y); +typedef void (GLAPIENTRY * PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (GLAPIENTRY * PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (GLAPIENTRY * PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); + +#define glGetUniformi64vNV GLEW_GET_FUN(__glewGetUniformi64vNV) +#define glGetUniformui64vNV GLEW_GET_FUN(__glewGetUniformui64vNV) +#define glProgramUniform1i64NV GLEW_GET_FUN(__glewProgramUniform1i64NV) +#define glProgramUniform1i64vNV GLEW_GET_FUN(__glewProgramUniform1i64vNV) +#define glProgramUniform1ui64NV GLEW_GET_FUN(__glewProgramUniform1ui64NV) +#define glProgramUniform1ui64vNV GLEW_GET_FUN(__glewProgramUniform1ui64vNV) +#define glProgramUniform2i64NV GLEW_GET_FUN(__glewProgramUniform2i64NV) +#define glProgramUniform2i64vNV GLEW_GET_FUN(__glewProgramUniform2i64vNV) +#define glProgramUniform2ui64NV GLEW_GET_FUN(__glewProgramUniform2ui64NV) +#define glProgramUniform2ui64vNV GLEW_GET_FUN(__glewProgramUniform2ui64vNV) +#define glProgramUniform3i64NV GLEW_GET_FUN(__glewProgramUniform3i64NV) +#define glProgramUniform3i64vNV GLEW_GET_FUN(__glewProgramUniform3i64vNV) +#define glProgramUniform3ui64NV GLEW_GET_FUN(__glewProgramUniform3ui64NV) +#define glProgramUniform3ui64vNV GLEW_GET_FUN(__glewProgramUniform3ui64vNV) +#define glProgramUniform4i64NV GLEW_GET_FUN(__glewProgramUniform4i64NV) +#define glProgramUniform4i64vNV GLEW_GET_FUN(__glewProgramUniform4i64vNV) +#define glProgramUniform4ui64NV GLEW_GET_FUN(__glewProgramUniform4ui64NV) +#define glProgramUniform4ui64vNV GLEW_GET_FUN(__glewProgramUniform4ui64vNV) +#define glUniform1i64NV GLEW_GET_FUN(__glewUniform1i64NV) +#define glUniform1i64vNV GLEW_GET_FUN(__glewUniform1i64vNV) +#define glUniform1ui64NV GLEW_GET_FUN(__glewUniform1ui64NV) +#define glUniform1ui64vNV GLEW_GET_FUN(__glewUniform1ui64vNV) +#define glUniform2i64NV GLEW_GET_FUN(__glewUniform2i64NV) +#define glUniform2i64vNV GLEW_GET_FUN(__glewUniform2i64vNV) +#define glUniform2ui64NV GLEW_GET_FUN(__glewUniform2ui64NV) +#define glUniform2ui64vNV GLEW_GET_FUN(__glewUniform2ui64vNV) +#define glUniform3i64NV GLEW_GET_FUN(__glewUniform3i64NV) +#define glUniform3i64vNV GLEW_GET_FUN(__glewUniform3i64vNV) +#define glUniform3ui64NV GLEW_GET_FUN(__glewUniform3ui64NV) +#define glUniform3ui64vNV GLEW_GET_FUN(__glewUniform3ui64vNV) +#define glUniform4i64NV GLEW_GET_FUN(__glewUniform4i64NV) +#define glUniform4i64vNV GLEW_GET_FUN(__glewUniform4i64vNV) +#define glUniform4ui64NV GLEW_GET_FUN(__glewUniform4ui64NV) +#define glUniform4ui64vNV GLEW_GET_FUN(__glewUniform4ui64vNV) + +#define GLEW_NV_gpu_shader5 GLEW_GET_VAR(__GLEW_NV_gpu_shader5) + +#endif /* GL_NV_gpu_shader5 */ + +/* ---------------------------- GL_NV_half_float --------------------------- */ + +#ifndef GL_NV_half_float +#define GL_NV_half_float 1 + +#define GL_HALF_FLOAT_NV 0x140B + +typedef unsigned short GLhalf; + +typedef void (GLAPIENTRY * PFNGLCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue); +typedef void (GLAPIENTRY * PFNGLCOLOR3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLCOLOR4HNVPROC) (GLhalf red, GLhalf green, GLhalf blue, GLhalf alpha); +typedef void (GLAPIENTRY * PFNGLCOLOR4HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLFOGCOORDHNVPROC) (GLhalf fog); +typedef void (GLAPIENTRY * PFNGLFOGCOORDHVNVPROC) (const GLhalf* fog); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalf s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalf s, GLhalf t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r, GLhalf q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLNORMAL3HNVPROC) (GLhalf nx, GLhalf ny, GLhalf nz); +typedef void (GLAPIENTRY * PFNGLNORMAL3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD1HNVPROC) (GLhalf s); +typedef void (GLAPIENTRY * PFNGLTEXCOORD1HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2HNVPROC) (GLhalf s, GLhalf t); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD3HNVPROC) (GLhalf s, GLhalf t, GLhalf r); +typedef void (GLAPIENTRY * PFNGLTEXCOORD3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4HNVPROC) (GLhalf s, GLhalf t, GLhalf r, GLhalf q); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEX2HNVPROC) (GLhalf x, GLhalf y); +typedef void (GLAPIENTRY * PFNGLVERTEX2HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEX3HNVPROC) (GLhalf x, GLhalf y, GLhalf z); +typedef void (GLAPIENTRY * PFNGLVERTEX3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEX4HNVPROC) (GLhalf x, GLhalf y, GLhalf z, GLhalf w); +typedef void (GLAPIENTRY * PFNGLVERTEX4HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalf x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalf x, GLhalf y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z, GLhalf w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHNVPROC) (GLhalf weight); +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalf* weight); + +#define glColor3hNV GLEW_GET_FUN(__glewColor3hNV) +#define glColor3hvNV GLEW_GET_FUN(__glewColor3hvNV) +#define glColor4hNV GLEW_GET_FUN(__glewColor4hNV) +#define glColor4hvNV GLEW_GET_FUN(__glewColor4hvNV) +#define glFogCoordhNV GLEW_GET_FUN(__glewFogCoordhNV) +#define glFogCoordhvNV GLEW_GET_FUN(__glewFogCoordhvNV) +#define glMultiTexCoord1hNV GLEW_GET_FUN(__glewMultiTexCoord1hNV) +#define glMultiTexCoord1hvNV GLEW_GET_FUN(__glewMultiTexCoord1hvNV) +#define glMultiTexCoord2hNV GLEW_GET_FUN(__glewMultiTexCoord2hNV) +#define glMultiTexCoord2hvNV GLEW_GET_FUN(__glewMultiTexCoord2hvNV) +#define glMultiTexCoord3hNV GLEW_GET_FUN(__glewMultiTexCoord3hNV) +#define glMultiTexCoord3hvNV GLEW_GET_FUN(__glewMultiTexCoord3hvNV) +#define glMultiTexCoord4hNV GLEW_GET_FUN(__glewMultiTexCoord4hNV) +#define glMultiTexCoord4hvNV GLEW_GET_FUN(__glewMultiTexCoord4hvNV) +#define glNormal3hNV GLEW_GET_FUN(__glewNormal3hNV) +#define glNormal3hvNV GLEW_GET_FUN(__glewNormal3hvNV) +#define glSecondaryColor3hNV GLEW_GET_FUN(__glewSecondaryColor3hNV) +#define glSecondaryColor3hvNV GLEW_GET_FUN(__glewSecondaryColor3hvNV) +#define glTexCoord1hNV GLEW_GET_FUN(__glewTexCoord1hNV) +#define glTexCoord1hvNV GLEW_GET_FUN(__glewTexCoord1hvNV) +#define glTexCoord2hNV GLEW_GET_FUN(__glewTexCoord2hNV) +#define glTexCoord2hvNV GLEW_GET_FUN(__glewTexCoord2hvNV) +#define glTexCoord3hNV GLEW_GET_FUN(__glewTexCoord3hNV) +#define glTexCoord3hvNV GLEW_GET_FUN(__glewTexCoord3hvNV) +#define glTexCoord4hNV GLEW_GET_FUN(__glewTexCoord4hNV) +#define glTexCoord4hvNV GLEW_GET_FUN(__glewTexCoord4hvNV) +#define glVertex2hNV GLEW_GET_FUN(__glewVertex2hNV) +#define glVertex2hvNV GLEW_GET_FUN(__glewVertex2hvNV) +#define glVertex3hNV GLEW_GET_FUN(__glewVertex3hNV) +#define glVertex3hvNV GLEW_GET_FUN(__glewVertex3hvNV) +#define glVertex4hNV GLEW_GET_FUN(__glewVertex4hNV) +#define glVertex4hvNV GLEW_GET_FUN(__glewVertex4hvNV) +#define glVertexAttrib1hNV GLEW_GET_FUN(__glewVertexAttrib1hNV) +#define glVertexAttrib1hvNV GLEW_GET_FUN(__glewVertexAttrib1hvNV) +#define glVertexAttrib2hNV GLEW_GET_FUN(__glewVertexAttrib2hNV) +#define glVertexAttrib2hvNV GLEW_GET_FUN(__glewVertexAttrib2hvNV) +#define glVertexAttrib3hNV GLEW_GET_FUN(__glewVertexAttrib3hNV) +#define glVertexAttrib3hvNV GLEW_GET_FUN(__glewVertexAttrib3hvNV) +#define glVertexAttrib4hNV GLEW_GET_FUN(__glewVertexAttrib4hNV) +#define glVertexAttrib4hvNV GLEW_GET_FUN(__glewVertexAttrib4hvNV) +#define glVertexAttribs1hvNV GLEW_GET_FUN(__glewVertexAttribs1hvNV) +#define glVertexAttribs2hvNV GLEW_GET_FUN(__glewVertexAttribs2hvNV) +#define glVertexAttribs3hvNV GLEW_GET_FUN(__glewVertexAttribs3hvNV) +#define glVertexAttribs4hvNV GLEW_GET_FUN(__glewVertexAttribs4hvNV) +#define glVertexWeighthNV GLEW_GET_FUN(__glewVertexWeighthNV) +#define glVertexWeighthvNV GLEW_GET_FUN(__glewVertexWeighthvNV) + +#define GLEW_NV_half_float GLEW_GET_VAR(__GLEW_NV_half_float) + +#endif /* GL_NV_half_float */ + +/* ------------------------ GL_NV_light_max_exponent ----------------------- */ + +#ifndef GL_NV_light_max_exponent +#define GL_NV_light_max_exponent 1 + +#define GL_MAX_SHININESS_NV 0x8504 +#define GL_MAX_SPOT_EXPONENT_NV 0x8505 + +#define GLEW_NV_light_max_exponent GLEW_GET_VAR(__GLEW_NV_light_max_exponent) + +#endif /* GL_NV_light_max_exponent */ + +/* ----------------------- GL_NV_multisample_coverage ---------------------- */ + +#ifndef GL_NV_multisample_coverage +#define GL_NV_multisample_coverage 1 + +#define GL_COVERAGE_SAMPLES_NV 0x80A9 +#define GL_COLOR_SAMPLES_NV 0x8E20 + +#define GLEW_NV_multisample_coverage GLEW_GET_VAR(__GLEW_NV_multisample_coverage) + +#endif /* GL_NV_multisample_coverage */ + +/* --------------------- GL_NV_multisample_filter_hint --------------------- */ + +#ifndef GL_NV_multisample_filter_hint +#define GL_NV_multisample_filter_hint 1 + +#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 + +#define GLEW_NV_multisample_filter_hint GLEW_GET_VAR(__GLEW_NV_multisample_filter_hint) + +#endif /* GL_NV_multisample_filter_hint */ + +/* ------------------------- GL_NV_occlusion_query ------------------------- */ + +#ifndef GL_NV_occlusion_query +#define GL_NV_occlusion_query 1 + +#define GL_PIXEL_COUNTER_BITS_NV 0x8864 +#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 +#define GL_PIXEL_COUNT_NV 0x8866 +#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 + +typedef void (GLAPIENTRY * PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLENDOCCLUSIONQUERYNVPROC) (void); +typedef void (GLAPIENTRY * PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); + +#define glBeginOcclusionQueryNV GLEW_GET_FUN(__glewBeginOcclusionQueryNV) +#define glDeleteOcclusionQueriesNV GLEW_GET_FUN(__glewDeleteOcclusionQueriesNV) +#define glEndOcclusionQueryNV GLEW_GET_FUN(__glewEndOcclusionQueryNV) +#define glGenOcclusionQueriesNV GLEW_GET_FUN(__glewGenOcclusionQueriesNV) +#define glGetOcclusionQueryivNV GLEW_GET_FUN(__glewGetOcclusionQueryivNV) +#define glGetOcclusionQueryuivNV GLEW_GET_FUN(__glewGetOcclusionQueryuivNV) +#define glIsOcclusionQueryNV GLEW_GET_FUN(__glewIsOcclusionQueryNV) + +#define GLEW_NV_occlusion_query GLEW_GET_VAR(__GLEW_NV_occlusion_query) + +#endif /* GL_NV_occlusion_query */ + +/* ----------------------- GL_NV_packed_depth_stencil ---------------------- */ + +#ifndef GL_NV_packed_depth_stencil +#define GL_NV_packed_depth_stencil 1 + +#define GL_DEPTH_STENCIL_NV 0x84F9 +#define GL_UNSIGNED_INT_24_8_NV 0x84FA + +#define GLEW_NV_packed_depth_stencil GLEW_GET_VAR(__GLEW_NV_packed_depth_stencil) + +#endif /* GL_NV_packed_depth_stencil */ + +/* --------------------- GL_NV_parameter_buffer_object --------------------- */ + +#ifndef GL_NV_parameter_buffer_object +#define GL_NV_parameter_buffer_object 1 + +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1 +#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2 +#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3 +#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4 + +typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params); + +#define glProgramBufferParametersIivNV GLEW_GET_FUN(__glewProgramBufferParametersIivNV) +#define glProgramBufferParametersIuivNV GLEW_GET_FUN(__glewProgramBufferParametersIuivNV) +#define glProgramBufferParametersfvNV GLEW_GET_FUN(__glewProgramBufferParametersfvNV) + +#define GLEW_NV_parameter_buffer_object GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object) + +#endif /* GL_NV_parameter_buffer_object */ + +/* --------------------- GL_NV_parameter_buffer_object2 -------------------- */ + +#ifndef GL_NV_parameter_buffer_object2 +#define GL_NV_parameter_buffer_object2 1 + +#define GLEW_NV_parameter_buffer_object2 GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object2) + +#endif /* GL_NV_parameter_buffer_object2 */ + +/* ------------------------- GL_NV_pixel_data_range ------------------------ */ + +#ifndef GL_NV_pixel_data_range +#define GL_NV_pixel_data_range 1 + +#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 +#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 +#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A +#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B +#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C +#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D + +typedef void (GLAPIENTRY * PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, void* pointer); + +#define glFlushPixelDataRangeNV GLEW_GET_FUN(__glewFlushPixelDataRangeNV) +#define glPixelDataRangeNV GLEW_GET_FUN(__glewPixelDataRangeNV) + +#define GLEW_NV_pixel_data_range GLEW_GET_VAR(__GLEW_NV_pixel_data_range) + +#endif /* GL_NV_pixel_data_range */ + +/* --------------------------- GL_NV_point_sprite -------------------------- */ + +#ifndef GL_NV_point_sprite +#define GL_NV_point_sprite 1 + +#define GL_POINT_SPRITE_NV 0x8861 +#define GL_COORD_REPLACE_NV 0x8862 +#define GL_POINT_SPRITE_R_MODE_NV 0x8863 + +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint* params); + +#define glPointParameteriNV GLEW_GET_FUN(__glewPointParameteriNV) +#define glPointParameterivNV GLEW_GET_FUN(__glewPointParameterivNV) + +#define GLEW_NV_point_sprite GLEW_GET_VAR(__GLEW_NV_point_sprite) + +#endif /* GL_NV_point_sprite */ + +/* -------------------------- GL_NV_present_video -------------------------- */ + +#ifndef GL_NV_present_video +#define GL_NV_present_video 1 + +#define GL_FRAME_NV 0x8E26 +#define GL_FIELDS_NV 0x8E27 +#define GL_CURRENT_TIME_NV 0x8E28 +#define GL_NUM_FILL_STREAMS_NV 0x8E29 +#define GL_PRESENT_TIME_NV 0x8E2A +#define GL_PRESENT_DURATION_NV 0x8E2B + +typedef void (GLAPIENTRY * PFNGLGETVIDEOI64VNVPROC) (GLuint video_slot, GLenum pname, GLint64EXT* params); +typedef void (GLAPIENTRY * PFNGLGETVIDEOIVNVPROC) (GLuint video_slot, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVIDEOUI64VNVPROC) (GLuint video_slot, GLenum pname, GLuint64EXT* params); +typedef void (GLAPIENTRY * PFNGLGETVIDEOUIVNVPROC) (GLuint video_slot, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLPRESENTFRAMEDUALFILLNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); +typedef void (GLAPIENTRY * PFNGLPRESENTFRAMEKEYEDNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); + +#define glGetVideoi64vNV GLEW_GET_FUN(__glewGetVideoi64vNV) +#define glGetVideoivNV GLEW_GET_FUN(__glewGetVideoivNV) +#define glGetVideoui64vNV GLEW_GET_FUN(__glewGetVideoui64vNV) +#define glGetVideouivNV GLEW_GET_FUN(__glewGetVideouivNV) +#define glPresentFrameDualFillNV GLEW_GET_FUN(__glewPresentFrameDualFillNV) +#define glPresentFrameKeyedNV GLEW_GET_FUN(__glewPresentFrameKeyedNV) + +#define GLEW_NV_present_video GLEW_GET_VAR(__GLEW_NV_present_video) + +#endif /* GL_NV_present_video */ + +/* ------------------------ GL_NV_primitive_restart ------------------------ */ + +#ifndef GL_NV_primitive_restart +#define GL_NV_primitive_restart 1 + +#define GL_PRIMITIVE_RESTART_NV 0x8558 +#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 + +typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); +typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTNVPROC) (void); + +#define glPrimitiveRestartIndexNV GLEW_GET_FUN(__glewPrimitiveRestartIndexNV) +#define glPrimitiveRestartNV GLEW_GET_FUN(__glewPrimitiveRestartNV) + +#define GLEW_NV_primitive_restart GLEW_GET_VAR(__GLEW_NV_primitive_restart) + +#endif /* GL_NV_primitive_restart */ + +/* ------------------------ GL_NV_register_combiners ----------------------- */ + +#ifndef GL_NV_register_combiners +#define GL_NV_register_combiners 1 + +#define GL_REGISTER_COMBINERS_NV 0x8522 +#define GL_VARIABLE_A_NV 0x8523 +#define GL_VARIABLE_B_NV 0x8524 +#define GL_VARIABLE_C_NV 0x8525 +#define GL_VARIABLE_D_NV 0x8526 +#define GL_VARIABLE_E_NV 0x8527 +#define GL_VARIABLE_F_NV 0x8528 +#define GL_VARIABLE_G_NV 0x8529 +#define GL_CONSTANT_COLOR0_NV 0x852A +#define GL_CONSTANT_COLOR1_NV 0x852B +#define GL_PRIMARY_COLOR_NV 0x852C +#define GL_SECONDARY_COLOR_NV 0x852D +#define GL_SPARE0_NV 0x852E +#define GL_SPARE1_NV 0x852F +#define GL_DISCARD_NV 0x8530 +#define GL_E_TIMES_F_NV 0x8531 +#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 +#define GL_UNSIGNED_IDENTITY_NV 0x8536 +#define GL_UNSIGNED_INVERT_NV 0x8537 +#define GL_EXPAND_NORMAL_NV 0x8538 +#define GL_EXPAND_NEGATE_NV 0x8539 +#define GL_HALF_BIAS_NORMAL_NV 0x853A +#define GL_HALF_BIAS_NEGATE_NV 0x853B +#define GL_SIGNED_IDENTITY_NV 0x853C +#define GL_SIGNED_NEGATE_NV 0x853D +#define GL_SCALE_BY_TWO_NV 0x853E +#define GL_SCALE_BY_FOUR_NV 0x853F +#define GL_SCALE_BY_ONE_HALF_NV 0x8540 +#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 +#define GL_COMBINER_INPUT_NV 0x8542 +#define GL_COMBINER_MAPPING_NV 0x8543 +#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 +#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 +#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 +#define GL_COMBINER_MUX_SUM_NV 0x8547 +#define GL_COMBINER_SCALE_NV 0x8548 +#define GL_COMBINER_BIAS_NV 0x8549 +#define GL_COMBINER_AB_OUTPUT_NV 0x854A +#define GL_COMBINER_CD_OUTPUT_NV 0x854B +#define GL_COMBINER_SUM_OUTPUT_NV 0x854C +#define GL_MAX_GENERAL_COMBINERS_NV 0x854D +#define GL_NUM_GENERAL_COMBINERS_NV 0x854E +#define GL_COLOR_SUM_CLAMP_NV 0x854F +#define GL_COMBINER0_NV 0x8550 +#define GL_COMBINER1_NV 0x8551 +#define GL_COMBINER2_NV 0x8552 +#define GL_COMBINER3_NV 0x8553 +#define GL_COMBINER4_NV 0x8554 +#define GL_COMBINER5_NV 0x8555 +#define GL_COMBINER6_NV 0x8556 +#define GL_COMBINER7_NV 0x8557 + +typedef void (GLAPIENTRY * PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (GLAPIENTRY * PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint* params); + +#define glCombinerInputNV GLEW_GET_FUN(__glewCombinerInputNV) +#define glCombinerOutputNV GLEW_GET_FUN(__glewCombinerOutputNV) +#define glCombinerParameterfNV GLEW_GET_FUN(__glewCombinerParameterfNV) +#define glCombinerParameterfvNV GLEW_GET_FUN(__glewCombinerParameterfvNV) +#define glCombinerParameteriNV GLEW_GET_FUN(__glewCombinerParameteriNV) +#define glCombinerParameterivNV GLEW_GET_FUN(__glewCombinerParameterivNV) +#define glFinalCombinerInputNV GLEW_GET_FUN(__glewFinalCombinerInputNV) +#define glGetCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetCombinerInputParameterfvNV) +#define glGetCombinerInputParameterivNV GLEW_GET_FUN(__glewGetCombinerInputParameterivNV) +#define glGetCombinerOutputParameterfvNV GLEW_GET_FUN(__glewGetCombinerOutputParameterfvNV) +#define glGetCombinerOutputParameterivNV GLEW_GET_FUN(__glewGetCombinerOutputParameterivNV) +#define glGetFinalCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterfvNV) +#define glGetFinalCombinerInputParameterivNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterivNV) + +#define GLEW_NV_register_combiners GLEW_GET_VAR(__GLEW_NV_register_combiners) + +#endif /* GL_NV_register_combiners */ + +/* ----------------------- GL_NV_register_combiners2 ----------------------- */ + +#ifndef GL_NV_register_combiners2 +#define GL_NV_register_combiners2 1 + +#define GL_PER_STAGE_CONSTANTS_NV 0x8535 + +typedef void (GLAPIENTRY * PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat* params); + +#define glCombinerStageParameterfvNV GLEW_GET_FUN(__glewCombinerStageParameterfvNV) +#define glGetCombinerStageParameterfvNV GLEW_GET_FUN(__glewGetCombinerStageParameterfvNV) + +#define GLEW_NV_register_combiners2 GLEW_GET_VAR(__GLEW_NV_register_combiners2) + +#endif /* GL_NV_register_combiners2 */ + +/* ------------------------ GL_NV_shader_buffer_load ----------------------- */ + +#ifndef GL_NV_shader_buffer_load +#define GL_NV_shader_buffer_load 1 + +#define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D +#define GL_GPU_ADDRESS_NV 0x8F34 +#define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35 + +typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT* params); +typedef void (GLAPIENTRY * PFNGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT* result); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT* params); +typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERRESIDENTNVPROC) (GLenum target); +typedef GLboolean (GLAPIENTRY * PFNGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access); +typedef void (GLAPIENTRY * PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value); +typedef void (GLAPIENTRY * PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); + +#define glGetBufferParameterui64vNV GLEW_GET_FUN(__glewGetBufferParameterui64vNV) +#define glGetIntegerui64vNV GLEW_GET_FUN(__glewGetIntegerui64vNV) +#define glGetNamedBufferParameterui64vNV GLEW_GET_FUN(__glewGetNamedBufferParameterui64vNV) +#define glIsBufferResidentNV GLEW_GET_FUN(__glewIsBufferResidentNV) +#define glIsNamedBufferResidentNV GLEW_GET_FUN(__glewIsNamedBufferResidentNV) +#define glMakeBufferNonResidentNV GLEW_GET_FUN(__glewMakeBufferNonResidentNV) +#define glMakeBufferResidentNV GLEW_GET_FUN(__glewMakeBufferResidentNV) +#define glMakeNamedBufferNonResidentNV GLEW_GET_FUN(__glewMakeNamedBufferNonResidentNV) +#define glMakeNamedBufferResidentNV GLEW_GET_FUN(__glewMakeNamedBufferResidentNV) +#define glProgramUniformui64NV GLEW_GET_FUN(__glewProgramUniformui64NV) +#define glProgramUniformui64vNV GLEW_GET_FUN(__glewProgramUniformui64vNV) +#define glUniformui64NV GLEW_GET_FUN(__glewUniformui64NV) +#define glUniformui64vNV GLEW_GET_FUN(__glewUniformui64vNV) + +#define GLEW_NV_shader_buffer_load GLEW_GET_VAR(__GLEW_NV_shader_buffer_load) + +#endif /* GL_NV_shader_buffer_load */ + +/* ---------------------- GL_NV_tessellation_program5 ---------------------- */ + +#ifndef GL_NV_tessellation_program5 +#define GL_NV_tessellation_program5 1 + +#define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV 0x86D8 +#define GL_TESS_CONTROL_PROGRAM_NV 0x891E +#define GL_TESS_EVALUATION_PROGRAM_NV 0x891F +#define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74 +#define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75 + +#define GLEW_NV_tessellation_program5 GLEW_GET_VAR(__GLEW_NV_tessellation_program5) + +#endif /* GL_NV_tessellation_program5 */ + +/* -------------------------- GL_NV_texgen_emboss -------------------------- */ + +#ifndef GL_NV_texgen_emboss +#define GL_NV_texgen_emboss 1 + +#define GL_EMBOSS_LIGHT_NV 0x855D +#define GL_EMBOSS_CONSTANT_NV 0x855E +#define GL_EMBOSS_MAP_NV 0x855F + +#define GLEW_NV_texgen_emboss GLEW_GET_VAR(__GLEW_NV_texgen_emboss) + +#endif /* GL_NV_texgen_emboss */ + +/* ------------------------ GL_NV_texgen_reflection ------------------------ */ + +#ifndef GL_NV_texgen_reflection +#define GL_NV_texgen_reflection 1 + +#define GL_NORMAL_MAP_NV 0x8511 +#define GL_REFLECTION_MAP_NV 0x8512 + +#define GLEW_NV_texgen_reflection GLEW_GET_VAR(__GLEW_NV_texgen_reflection) + +#endif /* GL_NV_texgen_reflection */ + +/* ------------------------- GL_NV_texture_barrier ------------------------- */ + +#ifndef GL_NV_texture_barrier +#define GL_NV_texture_barrier 1 + +typedef void (GLAPIENTRY * PFNGLTEXTUREBARRIERNVPROC) (void); + +#define glTextureBarrierNV GLEW_GET_FUN(__glewTextureBarrierNV) + +#define GLEW_NV_texture_barrier GLEW_GET_VAR(__GLEW_NV_texture_barrier) + +#endif /* GL_NV_texture_barrier */ + +/* --------------------- GL_NV_texture_compression_vtc --------------------- */ + +#ifndef GL_NV_texture_compression_vtc +#define GL_NV_texture_compression_vtc 1 + +#define GLEW_NV_texture_compression_vtc GLEW_GET_VAR(__GLEW_NV_texture_compression_vtc) + +#endif /* GL_NV_texture_compression_vtc */ + +/* ----------------------- GL_NV_texture_env_combine4 ---------------------- */ + +#ifndef GL_NV_texture_env_combine4 +#define GL_NV_texture_env_combine4 1 + +#define GL_COMBINE4_NV 0x8503 +#define GL_SOURCE3_RGB_NV 0x8583 +#define GL_SOURCE3_ALPHA_NV 0x858B +#define GL_OPERAND3_RGB_NV 0x8593 +#define GL_OPERAND3_ALPHA_NV 0x859B + +#define GLEW_NV_texture_env_combine4 GLEW_GET_VAR(__GLEW_NV_texture_env_combine4) + +#endif /* GL_NV_texture_env_combine4 */ + +/* ---------------------- GL_NV_texture_expand_normal ---------------------- */ + +#ifndef GL_NV_texture_expand_normal +#define GL_NV_texture_expand_normal 1 + +#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F + +#define GLEW_NV_texture_expand_normal GLEW_GET_VAR(__GLEW_NV_texture_expand_normal) + +#endif /* GL_NV_texture_expand_normal */ + +/* ------------------------ GL_NV_texture_rectangle ------------------------ */ + +#ifndef GL_NV_texture_rectangle +#define GL_NV_texture_rectangle 1 + +#define GL_TEXTURE_RECTANGLE_NV 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 + +#define GLEW_NV_texture_rectangle GLEW_GET_VAR(__GLEW_NV_texture_rectangle) + +#endif /* GL_NV_texture_rectangle */ + +/* -------------------------- GL_NV_texture_shader ------------------------- */ + +#ifndef GL_NV_texture_shader +#define GL_NV_texture_shader 1 + +#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C +#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D +#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E +#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_SHADER_CONSISTENT_NV 0x86DD +#define GL_TEXTURE_SHADER_NV 0x86DE +#define GL_SHADER_OPERATION_NV 0x86DF +#define GL_CULL_MODES_NV 0x86E0 +#define GL_OFFSET_TEXTURE_2D_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_2D_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 +#define GL_OFFSET_TEXTURE_2D_BIAS_NV 0x86E3 +#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 +#define GL_CONST_EYE_NV 0x86E5 +#define GL_PASS_THROUGH_NV 0x86E6 +#define GL_CULL_FRAGMENT_NV 0x86E7 +#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 +#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 +#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA +#define GL_DOT_PRODUCT_NV 0x86EC +#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED +#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE +#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 +#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 +#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 +#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D +#define GL_HI_SCALE_NV 0x870E +#define GL_LO_SCALE_NV 0x870F +#define GL_DS_SCALE_NV 0x8710 +#define GL_DT_SCALE_NV 0x8711 +#define GL_MAGNITUDE_SCALE_NV 0x8712 +#define GL_VIBRANCE_SCALE_NV 0x8713 +#define GL_HI_BIAS_NV 0x8714 +#define GL_LO_BIAS_NV 0x8715 +#define GL_DS_BIAS_NV 0x8716 +#define GL_DT_BIAS_NV 0x8717 +#define GL_MAGNITUDE_BIAS_NV 0x8718 +#define GL_VIBRANCE_BIAS_NV 0x8719 +#define GL_TEXTURE_BORDER_VALUES_NV 0x871A +#define GL_TEXTURE_HI_SIZE_NV 0x871B +#define GL_TEXTURE_LO_SIZE_NV 0x871C +#define GL_TEXTURE_DS_SIZE_NV 0x871D +#define GL_TEXTURE_DT_SIZE_NV 0x871E +#define GL_TEXTURE_MAG_SIZE_NV 0x871F + +#define GLEW_NV_texture_shader GLEW_GET_VAR(__GLEW_NV_texture_shader) + +#endif /* GL_NV_texture_shader */ + +/* ------------------------- GL_NV_texture_shader2 ------------------------- */ + +#ifndef GL_NV_texture_shader2 +#define GL_NV_texture_shader2 1 + +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D + +#define GLEW_NV_texture_shader2 GLEW_GET_VAR(__GLEW_NV_texture_shader2) + +#endif /* GL_NV_texture_shader2 */ + +/* ------------------------- GL_NV_texture_shader3 ------------------------- */ + +#ifndef GL_NV_texture_shader3 +#define GL_NV_texture_shader3 1 + +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 +#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 +#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 +#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 +#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 +#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A +#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B +#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C +#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D +#define GL_HILO8_NV 0x885E +#define GL_SIGNED_HILO8_NV 0x885F +#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 + +#define GLEW_NV_texture_shader3 GLEW_GET_VAR(__GLEW_NV_texture_shader3) + +#endif /* GL_NV_texture_shader3 */ + +/* ------------------------ GL_NV_transform_feedback ----------------------- */ + +#ifndef GL_NV_transform_feedback +#define GL_NV_transform_feedback 1 + +#define GL_BACK_PRIMARY_COLOR_NV 0x8C77 +#define GL_BACK_SECONDARY_COLOR_NV 0x8C78 +#define GL_TEXTURE_COORD_NV 0x8C79 +#define GL_CLIP_DISTANCE_NV 0x8C7A +#define GL_VERTEX_ID_NV 0x8C7B +#define GL_PRIMITIVE_ID_NV 0x8C7C +#define GL_GENERIC_ATTRIB_NV 0x8C7D +#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 +#define GL_ACTIVE_VARYINGS_NV 0x8C81 +#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 +#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 +#define GL_PRIMITIVES_GENERATED_NV 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 +#define GL_RASTERIZER_DISCARD_NV 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B +#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C +#define GL_SEPARATE_ATTRIBS_NV 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F + +typedef void (GLAPIENTRY * PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name); +typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKNVPROC) (void); +typedef void (GLAPIENTRY * PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location); +typedef GLint (GLAPIENTRY * PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLuint count, const GLint *attribs, GLenum bufferMode); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); + +#define glActiveVaryingNV GLEW_GET_FUN(__glewActiveVaryingNV) +#define glBeginTransformFeedbackNV GLEW_GET_FUN(__glewBeginTransformFeedbackNV) +#define glBindBufferBaseNV GLEW_GET_FUN(__glewBindBufferBaseNV) +#define glBindBufferOffsetNV GLEW_GET_FUN(__glewBindBufferOffsetNV) +#define glBindBufferRangeNV GLEW_GET_FUN(__glewBindBufferRangeNV) +#define glEndTransformFeedbackNV GLEW_GET_FUN(__glewEndTransformFeedbackNV) +#define glGetActiveVaryingNV GLEW_GET_FUN(__glewGetActiveVaryingNV) +#define glGetTransformFeedbackVaryingNV GLEW_GET_FUN(__glewGetTransformFeedbackVaryingNV) +#define glGetVaryingLocationNV GLEW_GET_FUN(__glewGetVaryingLocationNV) +#define glTransformFeedbackAttribsNV GLEW_GET_FUN(__glewTransformFeedbackAttribsNV) +#define glTransformFeedbackVaryingsNV GLEW_GET_FUN(__glewTransformFeedbackVaryingsNV) + +#define GLEW_NV_transform_feedback GLEW_GET_VAR(__GLEW_NV_transform_feedback) + +#endif /* GL_NV_transform_feedback */ + +/* ----------------------- GL_NV_transform_feedback2 ----------------------- */ + +#ifndef GL_NV_transform_feedback2 +#define GL_NV_transform_feedback2 1 + +#define GL_TRANSFORM_FEEDBACK_NV 0x8E22 +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23 +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25 + +typedef void (GLAPIENTRY * PFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id); +typedef void (GLAPIENTRY * PFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint* ids); +typedef GLboolean (GLAPIENTRY * PFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLPAUSETRANSFORMFEEDBACKNVPROC) (void); +typedef void (GLAPIENTRY * PFNGLRESUMETRANSFORMFEEDBACKNVPROC) (void); + +#define glBindTransformFeedbackNV GLEW_GET_FUN(__glewBindTransformFeedbackNV) +#define glDeleteTransformFeedbacksNV GLEW_GET_FUN(__glewDeleteTransformFeedbacksNV) +#define glDrawTransformFeedbackNV GLEW_GET_FUN(__glewDrawTransformFeedbackNV) +#define glGenTransformFeedbacksNV GLEW_GET_FUN(__glewGenTransformFeedbacksNV) +#define glIsTransformFeedbackNV GLEW_GET_FUN(__glewIsTransformFeedbackNV) +#define glPauseTransformFeedbackNV GLEW_GET_FUN(__glewPauseTransformFeedbackNV) +#define glResumeTransformFeedbackNV GLEW_GET_FUN(__glewResumeTransformFeedbackNV) + +#define GLEW_NV_transform_feedback2 GLEW_GET_VAR(__GLEW_NV_transform_feedback2) + +#endif /* GL_NV_transform_feedback2 */ + +/* -------------------------- GL_NV_vdpau_interop -------------------------- */ + +#ifndef GL_NV_vdpau_interop +#define GL_NV_vdpau_interop 1 + +#define GL_SURFACE_STATE_NV 0x86EB +#define GL_SURFACE_REGISTERED_NV 0x86FD +#define GL_SURFACE_MAPPED_NV 0x8700 +#define GL_WRITE_DISCARD_NV 0x88BE + +typedef GLintptr GLvdpauSurfaceNV; + +typedef void (GLAPIENTRY * PFNGLVDPAUFININVPROC) (void); +typedef void (GLAPIENTRY * PFNGLVDPAUGETSURFACEIVNVPROC) (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei* length, GLint *values); +typedef void (GLAPIENTRY * PFNGLVDPAUINITNVPROC) (const void* vdpDevice, const GLvoid*getProcAddress); +typedef void (GLAPIENTRY * PFNGLVDPAUISSURFACENVPROC) (GLvdpauSurfaceNV surface); +typedef void (GLAPIENTRY * PFNGLVDPAUMAPSURFACESNVPROC) (GLsizei numSurfaces, const GLvdpauSurfaceNV* surfaces); +typedef GLvdpauSurfaceNV (GLAPIENTRY * PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC) (const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +typedef GLvdpauSurfaceNV (GLAPIENTRY * PFNGLVDPAUREGISTERVIDEOSURFACENVPROC) (const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +typedef void (GLAPIENTRY * PFNGLVDPAUSURFACEACCESSNVPROC) (GLvdpauSurfaceNV surface, GLenum access); +typedef void (GLAPIENTRY * PFNGLVDPAUUNMAPSURFACESNVPROC) (GLsizei numSurface, const GLvdpauSurfaceNV* surfaces); +typedef void (GLAPIENTRY * PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV surface); + +#define glVDPAUFiniNV GLEW_GET_FUN(__glewVDPAUFiniNV) +#define glVDPAUGetSurfaceivNV GLEW_GET_FUN(__glewVDPAUGetSurfaceivNV) +#define glVDPAUInitNV GLEW_GET_FUN(__glewVDPAUInitNV) +#define glVDPAUIsSurfaceNV GLEW_GET_FUN(__glewVDPAUIsSurfaceNV) +#define glVDPAUMapSurfacesNV GLEW_GET_FUN(__glewVDPAUMapSurfacesNV) +#define glVDPAURegisterOutputSurfaceNV GLEW_GET_FUN(__glewVDPAURegisterOutputSurfaceNV) +#define glVDPAURegisterVideoSurfaceNV GLEW_GET_FUN(__glewVDPAURegisterVideoSurfaceNV) +#define glVDPAUSurfaceAccessNV GLEW_GET_FUN(__glewVDPAUSurfaceAccessNV) +#define glVDPAUUnmapSurfacesNV GLEW_GET_FUN(__glewVDPAUUnmapSurfacesNV) +#define glVDPAUUnregisterSurfaceNV GLEW_GET_FUN(__glewVDPAUUnregisterSurfaceNV) + +#define GLEW_NV_vdpau_interop GLEW_GET_VAR(__GLEW_NV_vdpau_interop) + +#endif /* GL_NV_vdpau_interop */ + +/* ------------------------ GL_NV_vertex_array_range ----------------------- */ + +#ifndef GL_NV_vertex_array_range +#define GL_NV_vertex_array_range 1 + +#define GL_VERTEX_ARRAY_RANGE_NV 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E +#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 +#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 + +typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, void* pointer); + +#define glFlushVertexArrayRangeNV GLEW_GET_FUN(__glewFlushVertexArrayRangeNV) +#define glVertexArrayRangeNV GLEW_GET_FUN(__glewVertexArrayRangeNV) + +#define GLEW_NV_vertex_array_range GLEW_GET_VAR(__GLEW_NV_vertex_array_range) + +#endif /* GL_NV_vertex_array_range */ + +/* ----------------------- GL_NV_vertex_array_range2 ----------------------- */ + +#ifndef GL_NV_vertex_array_range2 +#define GL_NV_vertex_array_range2 1 + +#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 + +#define GLEW_NV_vertex_array_range2 GLEW_GET_VAR(__GLEW_NV_vertex_array_range2) + +#endif /* GL_NV_vertex_array_range2 */ + +/* ------------------- GL_NV_vertex_attrib_integer_64bit ------------------- */ + +#ifndef GL_NV_vertex_attrib_integer_64bit +#define GL_NV_vertex_attrib_integer_64bit 1 + +#define GL_INT64_NV 0x140E +#define GL_UNSIGNED_INT64_NV 0x140F + +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLI64VNVPROC) (GLuint index, GLenum pname, GLint64EXT* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLUI64VNVPROC) (GLuint index, GLenum pname, GLuint64EXT* params); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1I64NVPROC) (GLuint index, GLint64EXT x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1I64VNVPROC) (GLuint index, const GLint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64NVPROC) (GLuint index, GLuint64EXT x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64VNVPROC) (GLuint index, const GLuint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2I64VNVPROC) (GLuint index, const GLint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2UI64VNVPROC) (GLuint index, const GLuint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3I64VNVPROC) (GLuint index, const GLint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3UI64VNVPROC) (GLuint index, const GLuint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4I64VNVPROC) (GLuint index, const GLint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4UI64VNVPROC) (GLuint index, const GLuint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); + +#define glGetVertexAttribLi64vNV GLEW_GET_FUN(__glewGetVertexAttribLi64vNV) +#define glGetVertexAttribLui64vNV GLEW_GET_FUN(__glewGetVertexAttribLui64vNV) +#define glVertexAttribL1i64NV GLEW_GET_FUN(__glewVertexAttribL1i64NV) +#define glVertexAttribL1i64vNV GLEW_GET_FUN(__glewVertexAttribL1i64vNV) +#define glVertexAttribL1ui64NV GLEW_GET_FUN(__glewVertexAttribL1ui64NV) +#define glVertexAttribL1ui64vNV GLEW_GET_FUN(__glewVertexAttribL1ui64vNV) +#define glVertexAttribL2i64NV GLEW_GET_FUN(__glewVertexAttribL2i64NV) +#define glVertexAttribL2i64vNV GLEW_GET_FUN(__glewVertexAttribL2i64vNV) +#define glVertexAttribL2ui64NV GLEW_GET_FUN(__glewVertexAttribL2ui64NV) +#define glVertexAttribL2ui64vNV GLEW_GET_FUN(__glewVertexAttribL2ui64vNV) +#define glVertexAttribL3i64NV GLEW_GET_FUN(__glewVertexAttribL3i64NV) +#define glVertexAttribL3i64vNV GLEW_GET_FUN(__glewVertexAttribL3i64vNV) +#define glVertexAttribL3ui64NV GLEW_GET_FUN(__glewVertexAttribL3ui64NV) +#define glVertexAttribL3ui64vNV GLEW_GET_FUN(__glewVertexAttribL3ui64vNV) +#define glVertexAttribL4i64NV GLEW_GET_FUN(__glewVertexAttribL4i64NV) +#define glVertexAttribL4i64vNV GLEW_GET_FUN(__glewVertexAttribL4i64vNV) +#define glVertexAttribL4ui64NV GLEW_GET_FUN(__glewVertexAttribL4ui64NV) +#define glVertexAttribL4ui64vNV GLEW_GET_FUN(__glewVertexAttribL4ui64vNV) +#define glVertexAttribLFormatNV GLEW_GET_FUN(__glewVertexAttribLFormatNV) + +#define GLEW_NV_vertex_attrib_integer_64bit GLEW_GET_VAR(__GLEW_NV_vertex_attrib_integer_64bit) + +#endif /* GL_NV_vertex_attrib_integer_64bit */ + +/* ------------------- GL_NV_vertex_buffer_unified_memory ------------------ */ + +#ifndef GL_NV_vertex_buffer_unified_memory +#define GL_NV_vertex_buffer_unified_memory 1 + +#define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E +#define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F +#define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20 +#define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21 +#define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22 +#define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23 +#define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24 +#define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25 +#define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26 +#define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27 +#define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28 +#define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29 +#define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A +#define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B +#define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C +#define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D +#define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E +#define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F +#define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30 +#define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31 +#define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32 +#define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33 +#define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40 +#define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41 +#define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42 + +typedef void (GLAPIENTRY * PFNGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); +typedef void (GLAPIENTRY * PFNGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLEDGEFLAGFORMATNVPROC) (GLsizei stride); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT result[]); +typedef void (GLAPIENTRY * PFNGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); + +#define glBufferAddressRangeNV GLEW_GET_FUN(__glewBufferAddressRangeNV) +#define glColorFormatNV GLEW_GET_FUN(__glewColorFormatNV) +#define glEdgeFlagFormatNV GLEW_GET_FUN(__glewEdgeFlagFormatNV) +#define glFogCoordFormatNV GLEW_GET_FUN(__glewFogCoordFormatNV) +#define glGetIntegerui64i_vNV GLEW_GET_FUN(__glewGetIntegerui64i_vNV) +#define glIndexFormatNV GLEW_GET_FUN(__glewIndexFormatNV) +#define glNormalFormatNV GLEW_GET_FUN(__glewNormalFormatNV) +#define glSecondaryColorFormatNV GLEW_GET_FUN(__glewSecondaryColorFormatNV) +#define glTexCoordFormatNV GLEW_GET_FUN(__glewTexCoordFormatNV) +#define glVertexAttribFormatNV GLEW_GET_FUN(__glewVertexAttribFormatNV) +#define glVertexAttribIFormatNV GLEW_GET_FUN(__glewVertexAttribIFormatNV) +#define glVertexFormatNV GLEW_GET_FUN(__glewVertexFormatNV) + +#define GLEW_NV_vertex_buffer_unified_memory GLEW_GET_VAR(__GLEW_NV_vertex_buffer_unified_memory) + +#endif /* GL_NV_vertex_buffer_unified_memory */ + +/* -------------------------- GL_NV_vertex_program ------------------------- */ + +#ifndef GL_NV_vertex_program +#define GL_NV_vertex_program 1 + +#define GL_VERTEX_PROGRAM_NV 0x8620 +#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 +#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 +#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 +#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 +#define GL_CURRENT_ATTRIB_NV 0x8626 +#define GL_PROGRAM_LENGTH_NV 0x8627 +#define GL_PROGRAM_STRING_NV 0x8628 +#define GL_MODELVIEW_PROJECTION_NV 0x8629 +#define GL_IDENTITY_NV 0x862A +#define GL_INVERSE_NV 0x862B +#define GL_TRANSPOSE_NV 0x862C +#define GL_INVERSE_TRANSPOSE_NV 0x862D +#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E +#define GL_MAX_TRACK_MATRICES_NV 0x862F +#define GL_MATRIX0_NV 0x8630 +#define GL_MATRIX1_NV 0x8631 +#define GL_MATRIX2_NV 0x8632 +#define GL_MATRIX3_NV 0x8633 +#define GL_MATRIX4_NV 0x8634 +#define GL_MATRIX5_NV 0x8635 +#define GL_MATRIX6_NV 0x8636 +#define GL_MATRIX7_NV 0x8637 +#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 +#define GL_CURRENT_MATRIX_NV 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 +#define GL_PROGRAM_PARAMETER_NV 0x8644 +#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 +#define GL_PROGRAM_TARGET_NV 0x8646 +#define GL_PROGRAM_RESIDENT_NV 0x8647 +#define GL_TRACK_MATRIX_NV 0x8648 +#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 +#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A +#define GL_PROGRAM_ERROR_POSITION_NV 0x864B +#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 +#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 +#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 +#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 +#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 +#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 +#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 +#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 +#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 +#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 +#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A +#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B +#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C +#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D +#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E +#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F +#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 +#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 +#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 +#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 +#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 +#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 +#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 +#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 +#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 +#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 +#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A +#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B +#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C +#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D +#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E +#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F +#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 +#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 +#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 +#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 +#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 +#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 +#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 +#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 +#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 +#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 +#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A +#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B +#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C +#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D +#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E +#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F + +typedef GLboolean (GLAPIENTRY * PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint* ids, GLboolean *residences); +typedef void (GLAPIENTRY * PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte* program); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, GLvoid** pointer); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMNVPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte* program); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLsizei num, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLsizei num, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei n, const GLubyte* v); + +#define glAreProgramsResidentNV GLEW_GET_FUN(__glewAreProgramsResidentNV) +#define glBindProgramNV GLEW_GET_FUN(__glewBindProgramNV) +#define glDeleteProgramsNV GLEW_GET_FUN(__glewDeleteProgramsNV) +#define glExecuteProgramNV GLEW_GET_FUN(__glewExecuteProgramNV) +#define glGenProgramsNV GLEW_GET_FUN(__glewGenProgramsNV) +#define glGetProgramParameterdvNV GLEW_GET_FUN(__glewGetProgramParameterdvNV) +#define glGetProgramParameterfvNV GLEW_GET_FUN(__glewGetProgramParameterfvNV) +#define glGetProgramStringNV GLEW_GET_FUN(__glewGetProgramStringNV) +#define glGetProgramivNV GLEW_GET_FUN(__glewGetProgramivNV) +#define glGetTrackMatrixivNV GLEW_GET_FUN(__glewGetTrackMatrixivNV) +#define glGetVertexAttribPointervNV GLEW_GET_FUN(__glewGetVertexAttribPointervNV) +#define glGetVertexAttribdvNV GLEW_GET_FUN(__glewGetVertexAttribdvNV) +#define glGetVertexAttribfvNV GLEW_GET_FUN(__glewGetVertexAttribfvNV) +#define glGetVertexAttribivNV GLEW_GET_FUN(__glewGetVertexAttribivNV) +#define glIsProgramNV GLEW_GET_FUN(__glewIsProgramNV) +#define glLoadProgramNV GLEW_GET_FUN(__glewLoadProgramNV) +#define glProgramParameter4dNV GLEW_GET_FUN(__glewProgramParameter4dNV) +#define glProgramParameter4dvNV GLEW_GET_FUN(__glewProgramParameter4dvNV) +#define glProgramParameter4fNV GLEW_GET_FUN(__glewProgramParameter4fNV) +#define glProgramParameter4fvNV GLEW_GET_FUN(__glewProgramParameter4fvNV) +#define glProgramParameters4dvNV GLEW_GET_FUN(__glewProgramParameters4dvNV) +#define glProgramParameters4fvNV GLEW_GET_FUN(__glewProgramParameters4fvNV) +#define glRequestResidentProgramsNV GLEW_GET_FUN(__glewRequestResidentProgramsNV) +#define glTrackMatrixNV GLEW_GET_FUN(__glewTrackMatrixNV) +#define glVertexAttrib1dNV GLEW_GET_FUN(__glewVertexAttrib1dNV) +#define glVertexAttrib1dvNV GLEW_GET_FUN(__glewVertexAttrib1dvNV) +#define glVertexAttrib1fNV GLEW_GET_FUN(__glewVertexAttrib1fNV) +#define glVertexAttrib1fvNV GLEW_GET_FUN(__glewVertexAttrib1fvNV) +#define glVertexAttrib1sNV GLEW_GET_FUN(__glewVertexAttrib1sNV) +#define glVertexAttrib1svNV GLEW_GET_FUN(__glewVertexAttrib1svNV) +#define glVertexAttrib2dNV GLEW_GET_FUN(__glewVertexAttrib2dNV) +#define glVertexAttrib2dvNV GLEW_GET_FUN(__glewVertexAttrib2dvNV) +#define glVertexAttrib2fNV GLEW_GET_FUN(__glewVertexAttrib2fNV) +#define glVertexAttrib2fvNV GLEW_GET_FUN(__glewVertexAttrib2fvNV) +#define glVertexAttrib2sNV GLEW_GET_FUN(__glewVertexAttrib2sNV) +#define glVertexAttrib2svNV GLEW_GET_FUN(__glewVertexAttrib2svNV) +#define glVertexAttrib3dNV GLEW_GET_FUN(__glewVertexAttrib3dNV) +#define glVertexAttrib3dvNV GLEW_GET_FUN(__glewVertexAttrib3dvNV) +#define glVertexAttrib3fNV GLEW_GET_FUN(__glewVertexAttrib3fNV) +#define glVertexAttrib3fvNV GLEW_GET_FUN(__glewVertexAttrib3fvNV) +#define glVertexAttrib3sNV GLEW_GET_FUN(__glewVertexAttrib3sNV) +#define glVertexAttrib3svNV GLEW_GET_FUN(__glewVertexAttrib3svNV) +#define glVertexAttrib4dNV GLEW_GET_FUN(__glewVertexAttrib4dNV) +#define glVertexAttrib4dvNV GLEW_GET_FUN(__glewVertexAttrib4dvNV) +#define glVertexAttrib4fNV GLEW_GET_FUN(__glewVertexAttrib4fNV) +#define glVertexAttrib4fvNV GLEW_GET_FUN(__glewVertexAttrib4fvNV) +#define glVertexAttrib4sNV GLEW_GET_FUN(__glewVertexAttrib4sNV) +#define glVertexAttrib4svNV GLEW_GET_FUN(__glewVertexAttrib4svNV) +#define glVertexAttrib4ubNV GLEW_GET_FUN(__glewVertexAttrib4ubNV) +#define glVertexAttrib4ubvNV GLEW_GET_FUN(__glewVertexAttrib4ubvNV) +#define glVertexAttribPointerNV GLEW_GET_FUN(__glewVertexAttribPointerNV) +#define glVertexAttribs1dvNV GLEW_GET_FUN(__glewVertexAttribs1dvNV) +#define glVertexAttribs1fvNV GLEW_GET_FUN(__glewVertexAttribs1fvNV) +#define glVertexAttribs1svNV GLEW_GET_FUN(__glewVertexAttribs1svNV) +#define glVertexAttribs2dvNV GLEW_GET_FUN(__glewVertexAttribs2dvNV) +#define glVertexAttribs2fvNV GLEW_GET_FUN(__glewVertexAttribs2fvNV) +#define glVertexAttribs2svNV GLEW_GET_FUN(__glewVertexAttribs2svNV) +#define glVertexAttribs3dvNV GLEW_GET_FUN(__glewVertexAttribs3dvNV) +#define glVertexAttribs3fvNV GLEW_GET_FUN(__glewVertexAttribs3fvNV) +#define glVertexAttribs3svNV GLEW_GET_FUN(__glewVertexAttribs3svNV) +#define glVertexAttribs4dvNV GLEW_GET_FUN(__glewVertexAttribs4dvNV) +#define glVertexAttribs4fvNV GLEW_GET_FUN(__glewVertexAttribs4fvNV) +#define glVertexAttribs4svNV GLEW_GET_FUN(__glewVertexAttribs4svNV) +#define glVertexAttribs4ubvNV GLEW_GET_FUN(__glewVertexAttribs4ubvNV) + +#define GLEW_NV_vertex_program GLEW_GET_VAR(__GLEW_NV_vertex_program) + +#endif /* GL_NV_vertex_program */ + +/* ------------------------ GL_NV_vertex_program1_1 ------------------------ */ + +#ifndef GL_NV_vertex_program1_1 +#define GL_NV_vertex_program1_1 1 + +#define GLEW_NV_vertex_program1_1 GLEW_GET_VAR(__GLEW_NV_vertex_program1_1) + +#endif /* GL_NV_vertex_program1_1 */ + +/* ------------------------- GL_NV_vertex_program2 ------------------------- */ + +#ifndef GL_NV_vertex_program2 +#define GL_NV_vertex_program2 1 + +#define GLEW_NV_vertex_program2 GLEW_GET_VAR(__GLEW_NV_vertex_program2) + +#endif /* GL_NV_vertex_program2 */ + +/* ---------------------- GL_NV_vertex_program2_option --------------------- */ + +#ifndef GL_NV_vertex_program2_option +#define GL_NV_vertex_program2_option 1 + +#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 +#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 + +#define GLEW_NV_vertex_program2_option GLEW_GET_VAR(__GLEW_NV_vertex_program2_option) + +#endif /* GL_NV_vertex_program2_option */ + +/* ------------------------- GL_NV_vertex_program3 ------------------------- */ + +#ifndef GL_NV_vertex_program3 +#define GL_NV_vertex_program3 1 + +#define MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C + +#define GLEW_NV_vertex_program3 GLEW_GET_VAR(__GLEW_NV_vertex_program3) + +#endif /* GL_NV_vertex_program3 */ + +/* ------------------------- GL_NV_vertex_program4 ------------------------- */ + +#ifndef GL_NV_vertex_program4 +#define GL_NV_vertex_program4 1 + +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD + +#define GLEW_NV_vertex_program4 GLEW_GET_VAR(__GLEW_NV_vertex_program4) + +#endif /* GL_NV_vertex_program4 */ + +/* ------------------------ GL_OES_byte_coordinates ------------------------ */ + +#ifndef GL_OES_byte_coordinates +#define GL_OES_byte_coordinates 1 + +#define GL_BYTE 0x1400 + +#define GLEW_OES_byte_coordinates GLEW_GET_VAR(__GLEW_OES_byte_coordinates) + +#endif /* GL_OES_byte_coordinates */ + +/* ------------------- GL_OES_compressed_paletted_texture ------------------ */ + +#ifndef GL_OES_compressed_paletted_texture +#define GL_OES_compressed_paletted_texture 1 + +#define GL_PALETTE4_RGB8_OES 0x8B90 +#define GL_PALETTE4_RGBA8_OES 0x8B91 +#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 +#define GL_PALETTE4_RGBA4_OES 0x8B93 +#define GL_PALETTE4_RGB5_A1_OES 0x8B94 +#define GL_PALETTE8_RGB8_OES 0x8B95 +#define GL_PALETTE8_RGBA8_OES 0x8B96 +#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 +#define GL_PALETTE8_RGBA4_OES 0x8B98 +#define GL_PALETTE8_RGB5_A1_OES 0x8B99 + +#define GLEW_OES_compressed_paletted_texture GLEW_GET_VAR(__GLEW_OES_compressed_paletted_texture) + +#endif /* GL_OES_compressed_paletted_texture */ + +/* --------------------------- GL_OES_read_format -------------------------- */ + +#ifndef GL_OES_read_format +#define GL_OES_read_format 1 + +#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B + +#define GLEW_OES_read_format GLEW_GET_VAR(__GLEW_OES_read_format) + +#endif /* GL_OES_read_format */ + +/* ------------------------ GL_OES_single_precision ------------------------ */ + +#ifndef GL_OES_single_precision +#define GL_OES_single_precision 1 + +typedef void (GLAPIENTRY * PFNGLCLEARDEPTHFOESPROC) (GLclampd depth); +typedef void (GLAPIENTRY * PFNGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat* equation); +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEFOESPROC) (GLclampf n, GLclampf f); +typedef void (GLAPIENTRY * PFNGLFRUSTUMFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEFOESPROC) (GLenum plane, GLfloat* equation); +typedef void (GLAPIENTRY * PFNGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); + +#define glClearDepthfOES GLEW_GET_FUN(__glewClearDepthfOES) +#define glClipPlanefOES GLEW_GET_FUN(__glewClipPlanefOES) +#define glDepthRangefOES GLEW_GET_FUN(__glewDepthRangefOES) +#define glFrustumfOES GLEW_GET_FUN(__glewFrustumfOES) +#define glGetClipPlanefOES GLEW_GET_FUN(__glewGetClipPlanefOES) +#define glOrthofOES GLEW_GET_FUN(__glewOrthofOES) + +#define GLEW_OES_single_precision GLEW_GET_VAR(__GLEW_OES_single_precision) + +#endif /* GL_OES_single_precision */ + +/* ---------------------------- GL_OML_interlace --------------------------- */ + +#ifndef GL_OML_interlace +#define GL_OML_interlace 1 + +#define GL_INTERLACE_OML 0x8980 +#define GL_INTERLACE_READ_OML 0x8981 + +#define GLEW_OML_interlace GLEW_GET_VAR(__GLEW_OML_interlace) + +#endif /* GL_OML_interlace */ + +/* ---------------------------- GL_OML_resample ---------------------------- */ + +#ifndef GL_OML_resample +#define GL_OML_resample 1 + +#define GL_PACK_RESAMPLE_OML 0x8984 +#define GL_UNPACK_RESAMPLE_OML 0x8985 +#define GL_RESAMPLE_REPLICATE_OML 0x8986 +#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 +#define GL_RESAMPLE_AVERAGE_OML 0x8988 +#define GL_RESAMPLE_DECIMATE_OML 0x8989 + +#define GLEW_OML_resample GLEW_GET_VAR(__GLEW_OML_resample) + +#endif /* GL_OML_resample */ + +/* ---------------------------- GL_OML_subsample --------------------------- */ + +#ifndef GL_OML_subsample +#define GL_OML_subsample 1 + +#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 +#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 + +#define GLEW_OML_subsample GLEW_GET_VAR(__GLEW_OML_subsample) + +#endif /* GL_OML_subsample */ + +/* --------------------------- GL_PGI_misc_hints --------------------------- */ + +#ifndef GL_PGI_misc_hints +#define GL_PGI_misc_hints 1 + +#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 107000 +#define GL_CONSERVE_MEMORY_HINT_PGI 107005 +#define GL_RECLAIM_MEMORY_HINT_PGI 107006 +#define GL_NATIVE_GRAPHICS_HANDLE_PGI 107010 +#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 107011 +#define GL_NATIVE_GRAPHICS_END_HINT_PGI 107012 +#define GL_ALWAYS_FAST_HINT_PGI 107020 +#define GL_ALWAYS_SOFT_HINT_PGI 107021 +#define GL_ALLOW_DRAW_OBJ_HINT_PGI 107022 +#define GL_ALLOW_DRAW_WIN_HINT_PGI 107023 +#define GL_ALLOW_DRAW_FRG_HINT_PGI 107024 +#define GL_ALLOW_DRAW_MEM_HINT_PGI 107025 +#define GL_STRICT_DEPTHFUNC_HINT_PGI 107030 +#define GL_STRICT_LIGHTING_HINT_PGI 107031 +#define GL_STRICT_SCISSOR_HINT_PGI 107032 +#define GL_FULL_STIPPLE_HINT_PGI 107033 +#define GL_CLIP_NEAR_HINT_PGI 107040 +#define GL_CLIP_FAR_HINT_PGI 107041 +#define GL_WIDE_LINE_HINT_PGI 107042 +#define GL_BACK_NORMALS_HINT_PGI 107043 + +#define GLEW_PGI_misc_hints GLEW_GET_VAR(__GLEW_PGI_misc_hints) + +#endif /* GL_PGI_misc_hints */ + +/* -------------------------- GL_PGI_vertex_hints -------------------------- */ + +#ifndef GL_PGI_vertex_hints +#define GL_PGI_vertex_hints 1 + +#define GL_VERTEX23_BIT_PGI 0x00000004 +#define GL_VERTEX4_BIT_PGI 0x00000008 +#define GL_COLOR3_BIT_PGI 0x00010000 +#define GL_COLOR4_BIT_PGI 0x00020000 +#define GL_EDGEFLAG_BIT_PGI 0x00040000 +#define GL_INDEX_BIT_PGI 0x00080000 +#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 +#define GL_VERTEX_DATA_HINT_PGI 107050 +#define GL_VERTEX_CONSISTENT_HINT_PGI 107051 +#define GL_MATERIAL_SIDE_HINT_PGI 107052 +#define GL_MAX_VERTEX_HINT_PGI 107053 +#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 +#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 +#define GL_MAT_EMISSION_BIT_PGI 0x00800000 +#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 +#define GL_MAT_SHININESS_BIT_PGI 0x02000000 +#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 +#define GL_NORMAL_BIT_PGI 0x08000000 +#define GL_TEXCOORD1_BIT_PGI 0x10000000 +#define GL_TEXCOORD2_BIT_PGI 0x20000000 +#define GL_TEXCOORD3_BIT_PGI 0x40000000 +#define GL_TEXCOORD4_BIT_PGI 0x80000000 + +#define GLEW_PGI_vertex_hints GLEW_GET_VAR(__GLEW_PGI_vertex_hints) + +#endif /* GL_PGI_vertex_hints */ + +/* ----------------------- GL_REND_screen_coordinates ---------------------- */ + +#ifndef GL_REND_screen_coordinates +#define GL_REND_screen_coordinates 1 + +#define GL_SCREEN_COORDINATES_REND 0x8490 +#define GL_INVERTED_SCREEN_W_REND 0x8491 + +#define GLEW_REND_screen_coordinates GLEW_GET_VAR(__GLEW_REND_screen_coordinates) + +#endif /* GL_REND_screen_coordinates */ + +/* ------------------------------- GL_S3_s3tc ------------------------------ */ + +#ifndef GL_S3_s3tc +#define GL_S3_s3tc 1 + +#define GL_RGB_S3TC 0x83A0 +#define GL_RGB4_S3TC 0x83A1 +#define GL_RGBA_S3TC 0x83A2 +#define GL_RGBA4_S3TC 0x83A3 +#define GL_RGBA_DXT5_S3TC 0x83A4 +#define GL_RGBA4_DXT5_S3TC 0x83A5 + +#define GLEW_S3_s3tc GLEW_GET_VAR(__GLEW_S3_s3tc) + +#endif /* GL_S3_s3tc */ + +/* -------------------------- GL_SGIS_color_range -------------------------- */ + +#ifndef GL_SGIS_color_range +#define GL_SGIS_color_range 1 + +#define GL_EXTENDED_RANGE_SGIS 0x85A5 +#define GL_MIN_RED_SGIS 0x85A6 +#define GL_MAX_RED_SGIS 0x85A7 +#define GL_MIN_GREEN_SGIS 0x85A8 +#define GL_MAX_GREEN_SGIS 0x85A9 +#define GL_MIN_BLUE_SGIS 0x85AA +#define GL_MAX_BLUE_SGIS 0x85AB +#define GL_MIN_ALPHA_SGIS 0x85AC +#define GL_MAX_ALPHA_SGIS 0x85AD + +#define GLEW_SGIS_color_range GLEW_GET_VAR(__GLEW_SGIS_color_range) + +#endif /* GL_SGIS_color_range */ + +/* ------------------------- GL_SGIS_detail_texture ------------------------ */ + +#ifndef GL_SGIS_detail_texture +#define GL_SGIS_detail_texture 1 + +typedef void (GLAPIENTRY * PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points); +typedef void (GLAPIENTRY * PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat* points); + +#define glDetailTexFuncSGIS GLEW_GET_FUN(__glewDetailTexFuncSGIS) +#define glGetDetailTexFuncSGIS GLEW_GET_FUN(__glewGetDetailTexFuncSGIS) + +#define GLEW_SGIS_detail_texture GLEW_GET_VAR(__GLEW_SGIS_detail_texture) + +#endif /* GL_SGIS_detail_texture */ + +/* -------------------------- GL_SGIS_fog_function ------------------------- */ + +#ifndef GL_SGIS_fog_function +#define GL_SGIS_fog_function 1 + +typedef void (GLAPIENTRY * PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat* points); +typedef void (GLAPIENTRY * PFNGLGETFOGFUNCSGISPROC) (GLfloat* points); + +#define glFogFuncSGIS GLEW_GET_FUN(__glewFogFuncSGIS) +#define glGetFogFuncSGIS GLEW_GET_FUN(__glewGetFogFuncSGIS) + +#define GLEW_SGIS_fog_function GLEW_GET_VAR(__GLEW_SGIS_fog_function) + +#endif /* GL_SGIS_fog_function */ + +/* ------------------------ GL_SGIS_generate_mipmap ------------------------ */ + +#ifndef GL_SGIS_generate_mipmap +#define GL_SGIS_generate_mipmap 1 + +#define GL_GENERATE_MIPMAP_SGIS 0x8191 +#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 + +#define GLEW_SGIS_generate_mipmap GLEW_GET_VAR(__GLEW_SGIS_generate_mipmap) + +#endif /* GL_SGIS_generate_mipmap */ + +/* -------------------------- GL_SGIS_multisample -------------------------- */ + +#ifndef GL_SGIS_multisample +#define GL_SGIS_multisample 1 + +#define GL_MULTISAMPLE_SGIS 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F +#define GL_SAMPLE_MASK_SGIS 0x80A0 +#define GL_1PASS_SGIS 0x80A1 +#define GL_2PASS_0_SGIS 0x80A2 +#define GL_2PASS_1_SGIS 0x80A3 +#define GL_4PASS_0_SGIS 0x80A4 +#define GL_4PASS_1_SGIS 0x80A5 +#define GL_4PASS_2_SGIS 0x80A6 +#define GL_4PASS_3_SGIS 0x80A7 +#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 +#define GL_SAMPLES_SGIS 0x80A9 +#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA +#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB +#define GL_SAMPLE_PATTERN_SGIS 0x80AC +#define GL_MULTISAMPLE_BIT_EXT 0x20000000 + +typedef void (GLAPIENTRY * PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); +typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); + +#define glSampleMaskSGIS GLEW_GET_FUN(__glewSampleMaskSGIS) +#define glSamplePatternSGIS GLEW_GET_FUN(__glewSamplePatternSGIS) + +#define GLEW_SGIS_multisample GLEW_GET_VAR(__GLEW_SGIS_multisample) + +#endif /* GL_SGIS_multisample */ + +/* ------------------------- GL_SGIS_pixel_texture ------------------------- */ + +#ifndef GL_SGIS_pixel_texture +#define GL_SGIS_pixel_texture 1 + +#define GLEW_SGIS_pixel_texture GLEW_GET_VAR(__GLEW_SGIS_pixel_texture) + +#endif /* GL_SGIS_pixel_texture */ + +/* ----------------------- GL_SGIS_point_line_texgen ----------------------- */ + +#ifndef GL_SGIS_point_line_texgen +#define GL_SGIS_point_line_texgen 1 + +#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 +#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 +#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 +#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 +#define GL_EYE_POINT_SGIS 0x81F4 +#define GL_OBJECT_POINT_SGIS 0x81F5 +#define GL_EYE_LINE_SGIS 0x81F6 +#define GL_OBJECT_LINE_SGIS 0x81F7 + +#define GLEW_SGIS_point_line_texgen GLEW_GET_VAR(__GLEW_SGIS_point_line_texgen) + +#endif /* GL_SGIS_point_line_texgen */ + +/* ------------------------ GL_SGIS_sharpen_texture ------------------------ */ + +#ifndef GL_SGIS_sharpen_texture +#define GL_SGIS_sharpen_texture 1 + +typedef void (GLAPIENTRY * PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat* points); +typedef void (GLAPIENTRY * PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points); + +#define glGetSharpenTexFuncSGIS GLEW_GET_FUN(__glewGetSharpenTexFuncSGIS) +#define glSharpenTexFuncSGIS GLEW_GET_FUN(__glewSharpenTexFuncSGIS) + +#define GLEW_SGIS_sharpen_texture GLEW_GET_VAR(__GLEW_SGIS_sharpen_texture) + +#endif /* GL_SGIS_sharpen_texture */ + +/* --------------------------- GL_SGIS_texture4D --------------------------- */ + +#ifndef GL_SGIS_texture4D +#define GL_SGIS_texture4D 1 + +typedef void (GLAPIENTRY * PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLint border, GLenum format, GLenum type, const void* pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLenum format, GLenum type, const void* pixels); + +#define glTexImage4DSGIS GLEW_GET_FUN(__glewTexImage4DSGIS) +#define glTexSubImage4DSGIS GLEW_GET_FUN(__glewTexSubImage4DSGIS) + +#define GLEW_SGIS_texture4D GLEW_GET_VAR(__GLEW_SGIS_texture4D) + +#endif /* GL_SGIS_texture4D */ + +/* ---------------------- GL_SGIS_texture_border_clamp --------------------- */ + +#ifndef GL_SGIS_texture_border_clamp +#define GL_SGIS_texture_border_clamp 1 + +#define GL_CLAMP_TO_BORDER_SGIS 0x812D + +#define GLEW_SGIS_texture_border_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_border_clamp) + +#endif /* GL_SGIS_texture_border_clamp */ + +/* ----------------------- GL_SGIS_texture_edge_clamp ---------------------- */ + +#ifndef GL_SGIS_texture_edge_clamp +#define GL_SGIS_texture_edge_clamp 1 + +#define GL_CLAMP_TO_EDGE_SGIS 0x812F + +#define GLEW_SGIS_texture_edge_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_edge_clamp) + +#endif /* GL_SGIS_texture_edge_clamp */ + +/* ------------------------ GL_SGIS_texture_filter4 ------------------------ */ + +#ifndef GL_SGIS_texture_filter4 +#define GL_SGIS_texture_filter4 1 + +typedef void (GLAPIENTRY * PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat* weights); +typedef void (GLAPIENTRY * PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat* weights); + +#define glGetTexFilterFuncSGIS GLEW_GET_FUN(__glewGetTexFilterFuncSGIS) +#define glTexFilterFuncSGIS GLEW_GET_FUN(__glewTexFilterFuncSGIS) + +#define GLEW_SGIS_texture_filter4 GLEW_GET_VAR(__GLEW_SGIS_texture_filter4) + +#endif /* GL_SGIS_texture_filter4 */ + +/* -------------------------- GL_SGIS_texture_lod -------------------------- */ + +#ifndef GL_SGIS_texture_lod +#define GL_SGIS_texture_lod 1 + +#define GL_TEXTURE_MIN_LOD_SGIS 0x813A +#define GL_TEXTURE_MAX_LOD_SGIS 0x813B +#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C +#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D + +#define GLEW_SGIS_texture_lod GLEW_GET_VAR(__GLEW_SGIS_texture_lod) + +#endif /* GL_SGIS_texture_lod */ + +/* ------------------------- GL_SGIS_texture_select ------------------------ */ + +#ifndef GL_SGIS_texture_select +#define GL_SGIS_texture_select 1 + +#define GLEW_SGIS_texture_select GLEW_GET_VAR(__GLEW_SGIS_texture_select) + +#endif /* GL_SGIS_texture_select */ + +/* ----------------------------- GL_SGIX_async ----------------------------- */ + +#ifndef GL_SGIX_async +#define GL_SGIX_async 1 + +#define GL_ASYNC_MARKER_SGIX 0x8329 + +typedef void (GLAPIENTRY * PFNGLASYNCMARKERSGIXPROC) (GLuint marker); +typedef void (GLAPIENTRY * PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); +typedef GLint (GLAPIENTRY * PFNGLFINISHASYNCSGIXPROC) (GLuint* markerp); +typedef GLuint (GLAPIENTRY * PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); +typedef GLboolean (GLAPIENTRY * PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); +typedef GLint (GLAPIENTRY * PFNGLPOLLASYNCSGIXPROC) (GLuint* markerp); + +#define glAsyncMarkerSGIX GLEW_GET_FUN(__glewAsyncMarkerSGIX) +#define glDeleteAsyncMarkersSGIX GLEW_GET_FUN(__glewDeleteAsyncMarkersSGIX) +#define glFinishAsyncSGIX GLEW_GET_FUN(__glewFinishAsyncSGIX) +#define glGenAsyncMarkersSGIX GLEW_GET_FUN(__glewGenAsyncMarkersSGIX) +#define glIsAsyncMarkerSGIX GLEW_GET_FUN(__glewIsAsyncMarkerSGIX) +#define glPollAsyncSGIX GLEW_GET_FUN(__glewPollAsyncSGIX) + +#define GLEW_SGIX_async GLEW_GET_VAR(__GLEW_SGIX_async) + +#endif /* GL_SGIX_async */ + +/* ------------------------ GL_SGIX_async_histogram ------------------------ */ + +#ifndef GL_SGIX_async_histogram +#define GL_SGIX_async_histogram 1 + +#define GL_ASYNC_HISTOGRAM_SGIX 0x832C +#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D + +#define GLEW_SGIX_async_histogram GLEW_GET_VAR(__GLEW_SGIX_async_histogram) + +#endif /* GL_SGIX_async_histogram */ + +/* -------------------------- GL_SGIX_async_pixel -------------------------- */ + +#ifndef GL_SGIX_async_pixel +#define GL_SGIX_async_pixel 1 + +#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C +#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D +#define GL_ASYNC_READ_PIXELS_SGIX 0x835E +#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F +#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 +#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 + +#define GLEW_SGIX_async_pixel GLEW_GET_VAR(__GLEW_SGIX_async_pixel) + +#endif /* GL_SGIX_async_pixel */ + +/* ----------------------- GL_SGIX_blend_alpha_minmax ---------------------- */ + +#ifndef GL_SGIX_blend_alpha_minmax +#define GL_SGIX_blend_alpha_minmax 1 + +#define GL_ALPHA_MIN_SGIX 0x8320 +#define GL_ALPHA_MAX_SGIX 0x8321 + +#define GLEW_SGIX_blend_alpha_minmax GLEW_GET_VAR(__GLEW_SGIX_blend_alpha_minmax) + +#endif /* GL_SGIX_blend_alpha_minmax */ + +/* ---------------------------- GL_SGIX_clipmap ---------------------------- */ + +#ifndef GL_SGIX_clipmap +#define GL_SGIX_clipmap 1 + +#define GLEW_SGIX_clipmap GLEW_GET_VAR(__GLEW_SGIX_clipmap) + +#endif /* GL_SGIX_clipmap */ + +/* ---------------------- GL_SGIX_convolution_accuracy --------------------- */ + +#ifndef GL_SGIX_convolution_accuracy +#define GL_SGIX_convolution_accuracy 1 + +#define GL_CONVOLUTION_HINT_SGIX 0x8316 + +#define GLEW_SGIX_convolution_accuracy GLEW_GET_VAR(__GLEW_SGIX_convolution_accuracy) + +#endif /* GL_SGIX_convolution_accuracy */ + +/* ------------------------- GL_SGIX_depth_texture ------------------------- */ + +#ifndef GL_SGIX_depth_texture +#define GL_SGIX_depth_texture 1 + +#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 +#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 +#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 + +#define GLEW_SGIX_depth_texture GLEW_GET_VAR(__GLEW_SGIX_depth_texture) + +#endif /* GL_SGIX_depth_texture */ + +/* -------------------------- GL_SGIX_flush_raster ------------------------- */ + +#ifndef GL_SGIX_flush_raster +#define GL_SGIX_flush_raster 1 + +typedef void (GLAPIENTRY * PFNGLFLUSHRASTERSGIXPROC) (void); + +#define glFlushRasterSGIX GLEW_GET_FUN(__glewFlushRasterSGIX) + +#define GLEW_SGIX_flush_raster GLEW_GET_VAR(__GLEW_SGIX_flush_raster) + +#endif /* GL_SGIX_flush_raster */ + +/* --------------------------- GL_SGIX_fog_offset -------------------------- */ + +#ifndef GL_SGIX_fog_offset +#define GL_SGIX_fog_offset 1 + +#define GL_FOG_OFFSET_SGIX 0x8198 +#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 + +#define GLEW_SGIX_fog_offset GLEW_GET_VAR(__GLEW_SGIX_fog_offset) + +#endif /* GL_SGIX_fog_offset */ + +/* -------------------------- GL_SGIX_fog_texture -------------------------- */ + +#ifndef GL_SGIX_fog_texture +#define GL_SGIX_fog_texture 1 + +#define GL_TEXTURE_FOG_SGIX 0 +#define GL_FOG_PATCHY_FACTOR_SGIX 0 +#define GL_FRAGMENT_FOG_SGIX 0 + +typedef void (GLAPIENTRY * PFNGLTEXTUREFOGSGIXPROC) (GLenum pname); + +#define glTextureFogSGIX GLEW_GET_FUN(__glewTextureFogSGIX) + +#define GLEW_SGIX_fog_texture GLEW_GET_VAR(__GLEW_SGIX_fog_texture) + +#endif /* GL_SGIX_fog_texture */ + +/* ------------------- GL_SGIX_fragment_specular_lighting ------------------ */ + +#ifndef GL_SGIX_fragment_specular_lighting +#define GL_SGIX_fragment_specular_lighting 1 + +typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, const GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, const GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum value, GLfloat* data); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum value, GLint* data); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* data); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* data); + +#define glFragmentColorMaterialSGIX GLEW_GET_FUN(__glewFragmentColorMaterialSGIX) +#define glFragmentLightModelfSGIX GLEW_GET_FUN(__glewFragmentLightModelfSGIX) +#define glFragmentLightModelfvSGIX GLEW_GET_FUN(__glewFragmentLightModelfvSGIX) +#define glFragmentLightModeliSGIX GLEW_GET_FUN(__glewFragmentLightModeliSGIX) +#define glFragmentLightModelivSGIX GLEW_GET_FUN(__glewFragmentLightModelivSGIX) +#define glFragmentLightfSGIX GLEW_GET_FUN(__glewFragmentLightfSGIX) +#define glFragmentLightfvSGIX GLEW_GET_FUN(__glewFragmentLightfvSGIX) +#define glFragmentLightiSGIX GLEW_GET_FUN(__glewFragmentLightiSGIX) +#define glFragmentLightivSGIX GLEW_GET_FUN(__glewFragmentLightivSGIX) +#define glFragmentMaterialfSGIX GLEW_GET_FUN(__glewFragmentMaterialfSGIX) +#define glFragmentMaterialfvSGIX GLEW_GET_FUN(__glewFragmentMaterialfvSGIX) +#define glFragmentMaterialiSGIX GLEW_GET_FUN(__glewFragmentMaterialiSGIX) +#define glFragmentMaterialivSGIX GLEW_GET_FUN(__glewFragmentMaterialivSGIX) +#define glGetFragmentLightfvSGIX GLEW_GET_FUN(__glewGetFragmentLightfvSGIX) +#define glGetFragmentLightivSGIX GLEW_GET_FUN(__glewGetFragmentLightivSGIX) +#define glGetFragmentMaterialfvSGIX GLEW_GET_FUN(__glewGetFragmentMaterialfvSGIX) +#define glGetFragmentMaterialivSGIX GLEW_GET_FUN(__glewGetFragmentMaterialivSGIX) + +#define GLEW_SGIX_fragment_specular_lighting GLEW_GET_VAR(__GLEW_SGIX_fragment_specular_lighting) + +#endif /* GL_SGIX_fragment_specular_lighting */ + +/* --------------------------- GL_SGIX_framezoom --------------------------- */ + +#ifndef GL_SGIX_framezoom +#define GL_SGIX_framezoom 1 + +typedef void (GLAPIENTRY * PFNGLFRAMEZOOMSGIXPROC) (GLint factor); + +#define glFrameZoomSGIX GLEW_GET_FUN(__glewFrameZoomSGIX) + +#define GLEW_SGIX_framezoom GLEW_GET_VAR(__GLEW_SGIX_framezoom) + +#endif /* GL_SGIX_framezoom */ + +/* --------------------------- GL_SGIX_interlace --------------------------- */ + +#ifndef GL_SGIX_interlace +#define GL_SGIX_interlace 1 + +#define GL_INTERLACE_SGIX 0x8094 + +#define GLEW_SGIX_interlace GLEW_GET_VAR(__GLEW_SGIX_interlace) + +#endif /* GL_SGIX_interlace */ + +/* ------------------------- GL_SGIX_ir_instrument1 ------------------------ */ + +#ifndef GL_SGIX_ir_instrument1 +#define GL_SGIX_ir_instrument1 1 + +#define GLEW_SGIX_ir_instrument1 GLEW_GET_VAR(__GLEW_SGIX_ir_instrument1) + +#endif /* GL_SGIX_ir_instrument1 */ + +/* ------------------------- GL_SGIX_list_priority ------------------------- */ + +#ifndef GL_SGIX_list_priority +#define GL_SGIX_list_priority 1 + +#define GLEW_SGIX_list_priority GLEW_GET_VAR(__GLEW_SGIX_list_priority) + +#endif /* GL_SGIX_list_priority */ + +/* ------------------------- GL_SGIX_pixel_texture ------------------------- */ + +#ifndef GL_SGIX_pixel_texture +#define GL_SGIX_pixel_texture 1 + +typedef void (GLAPIENTRY * PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); + +#define glPixelTexGenSGIX GLEW_GET_FUN(__glewPixelTexGenSGIX) + +#define GLEW_SGIX_pixel_texture GLEW_GET_VAR(__GLEW_SGIX_pixel_texture) + +#endif /* GL_SGIX_pixel_texture */ + +/* ----------------------- GL_SGIX_pixel_texture_bits ---------------------- */ + +#ifndef GL_SGIX_pixel_texture_bits +#define GL_SGIX_pixel_texture_bits 1 + +#define GLEW_SGIX_pixel_texture_bits GLEW_GET_VAR(__GLEW_SGIX_pixel_texture_bits) + +#endif /* GL_SGIX_pixel_texture_bits */ + +/* ------------------------ GL_SGIX_reference_plane ------------------------ */ + +#ifndef GL_SGIX_reference_plane +#define GL_SGIX_reference_plane 1 + +typedef void (GLAPIENTRY * PFNGLREFERENCEPLANESGIXPROC) (const GLdouble* equation); + +#define glReferencePlaneSGIX GLEW_GET_FUN(__glewReferencePlaneSGIX) + +#define GLEW_SGIX_reference_plane GLEW_GET_VAR(__GLEW_SGIX_reference_plane) + +#endif /* GL_SGIX_reference_plane */ + +/* ---------------------------- GL_SGIX_resample --------------------------- */ + +#ifndef GL_SGIX_resample +#define GL_SGIX_resample 1 + +#define GL_PACK_RESAMPLE_SGIX 0x842E +#define GL_UNPACK_RESAMPLE_SGIX 0x842F +#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 +#define GL_RESAMPLE_REPLICATE_SGIX 0x8433 +#define GL_RESAMPLE_ZERO_FILL_SGIX 0x8434 + +#define GLEW_SGIX_resample GLEW_GET_VAR(__GLEW_SGIX_resample) + +#endif /* GL_SGIX_resample */ + +/* ----------------------------- GL_SGIX_shadow ---------------------------- */ + +#ifndef GL_SGIX_shadow +#define GL_SGIX_shadow 1 + +#define GL_TEXTURE_COMPARE_SGIX 0x819A +#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B +#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C +#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D + +#define GLEW_SGIX_shadow GLEW_GET_VAR(__GLEW_SGIX_shadow) + +#endif /* GL_SGIX_shadow */ + +/* ------------------------- GL_SGIX_shadow_ambient ------------------------ */ + +#ifndef GL_SGIX_shadow_ambient +#define GL_SGIX_shadow_ambient 1 + +#define GL_SHADOW_AMBIENT_SGIX 0x80BF + +#define GLEW_SGIX_shadow_ambient GLEW_GET_VAR(__GLEW_SGIX_shadow_ambient) + +#endif /* GL_SGIX_shadow_ambient */ + +/* ----------------------------- GL_SGIX_sprite ---------------------------- */ + +#ifndef GL_SGIX_sprite +#define GL_SGIX_sprite 1 + +typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, GLint* params); + +#define glSpriteParameterfSGIX GLEW_GET_FUN(__glewSpriteParameterfSGIX) +#define glSpriteParameterfvSGIX GLEW_GET_FUN(__glewSpriteParameterfvSGIX) +#define glSpriteParameteriSGIX GLEW_GET_FUN(__glewSpriteParameteriSGIX) +#define glSpriteParameterivSGIX GLEW_GET_FUN(__glewSpriteParameterivSGIX) + +#define GLEW_SGIX_sprite GLEW_GET_VAR(__GLEW_SGIX_sprite) + +#endif /* GL_SGIX_sprite */ + +/* ----------------------- GL_SGIX_tag_sample_buffer ----------------------- */ + +#ifndef GL_SGIX_tag_sample_buffer +#define GL_SGIX_tag_sample_buffer 1 + +typedef void (GLAPIENTRY * PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); + +#define glTagSampleBufferSGIX GLEW_GET_FUN(__glewTagSampleBufferSGIX) + +#define GLEW_SGIX_tag_sample_buffer GLEW_GET_VAR(__GLEW_SGIX_tag_sample_buffer) + +#endif /* GL_SGIX_tag_sample_buffer */ + +/* ------------------------ GL_SGIX_texture_add_env ------------------------ */ + +#ifndef GL_SGIX_texture_add_env +#define GL_SGIX_texture_add_env 1 + +#define GLEW_SGIX_texture_add_env GLEW_GET_VAR(__GLEW_SGIX_texture_add_env) + +#endif /* GL_SGIX_texture_add_env */ + +/* -------------------- GL_SGIX_texture_coordinate_clamp ------------------- */ + +#ifndef GL_SGIX_texture_coordinate_clamp +#define GL_SGIX_texture_coordinate_clamp 1 + +#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 +#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A +#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B + +#define GLEW_SGIX_texture_coordinate_clamp GLEW_GET_VAR(__GLEW_SGIX_texture_coordinate_clamp) + +#endif /* GL_SGIX_texture_coordinate_clamp */ + +/* ------------------------ GL_SGIX_texture_lod_bias ----------------------- */ + +#ifndef GL_SGIX_texture_lod_bias +#define GL_SGIX_texture_lod_bias 1 + +#define GLEW_SGIX_texture_lod_bias GLEW_GET_VAR(__GLEW_SGIX_texture_lod_bias) + +#endif /* GL_SGIX_texture_lod_bias */ + +/* ---------------------- GL_SGIX_texture_multi_buffer --------------------- */ + +#ifndef GL_SGIX_texture_multi_buffer +#define GL_SGIX_texture_multi_buffer 1 + +#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E + +#define GLEW_SGIX_texture_multi_buffer GLEW_GET_VAR(__GLEW_SGIX_texture_multi_buffer) + +#endif /* GL_SGIX_texture_multi_buffer */ + +/* ------------------------- GL_SGIX_texture_range ------------------------- */ + +#ifndef GL_SGIX_texture_range +#define GL_SGIX_texture_range 1 + +#define GL_RGB_SIGNED_SGIX 0x85E0 +#define GL_RGBA_SIGNED_SGIX 0x85E1 +#define GL_ALPHA_SIGNED_SGIX 0x85E2 +#define GL_LUMINANCE_SIGNED_SGIX 0x85E3 +#define GL_INTENSITY_SIGNED_SGIX 0x85E4 +#define GL_LUMINANCE_ALPHA_SIGNED_SGIX 0x85E5 +#define GL_RGB16_SIGNED_SGIX 0x85E6 +#define GL_RGBA16_SIGNED_SGIX 0x85E7 +#define GL_ALPHA16_SIGNED_SGIX 0x85E8 +#define GL_LUMINANCE16_SIGNED_SGIX 0x85E9 +#define GL_INTENSITY16_SIGNED_SGIX 0x85EA +#define GL_LUMINANCE16_ALPHA16_SIGNED_SGIX 0x85EB +#define GL_RGB_EXTENDED_RANGE_SGIX 0x85EC +#define GL_RGBA_EXTENDED_RANGE_SGIX 0x85ED +#define GL_ALPHA_EXTENDED_RANGE_SGIX 0x85EE +#define GL_LUMINANCE_EXTENDED_RANGE_SGIX 0x85EF +#define GL_INTENSITY_EXTENDED_RANGE_SGIX 0x85F0 +#define GL_LUMINANCE_ALPHA_EXTENDED_RANGE_SGIX 0x85F1 +#define GL_RGB16_EXTENDED_RANGE_SGIX 0x85F2 +#define GL_RGBA16_EXTENDED_RANGE_SGIX 0x85F3 +#define GL_ALPHA16_EXTENDED_RANGE_SGIX 0x85F4 +#define GL_LUMINANCE16_EXTENDED_RANGE_SGIX 0x85F5 +#define GL_INTENSITY16_EXTENDED_RANGE_SGIX 0x85F6 +#define GL_LUMINANCE16_ALPHA16_EXTENDED_RANGE_SGIX 0x85F7 +#define GL_MIN_LUMINANCE_SGIS 0x85F8 +#define GL_MAX_LUMINANCE_SGIS 0x85F9 +#define GL_MIN_INTENSITY_SGIS 0x85FA +#define GL_MAX_INTENSITY_SGIS 0x85FB + +#define GLEW_SGIX_texture_range GLEW_GET_VAR(__GLEW_SGIX_texture_range) + +#endif /* GL_SGIX_texture_range */ + +/* ----------------------- GL_SGIX_texture_scale_bias ---------------------- */ + +#ifndef GL_SGIX_texture_scale_bias +#define GL_SGIX_texture_scale_bias 1 + +#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 +#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A +#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B +#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C + +#define GLEW_SGIX_texture_scale_bias GLEW_GET_VAR(__GLEW_SGIX_texture_scale_bias) + +#endif /* GL_SGIX_texture_scale_bias */ + +/* ------------------------- GL_SGIX_vertex_preclip ------------------------ */ + +#ifndef GL_SGIX_vertex_preclip +#define GL_SGIX_vertex_preclip 1 + +#define GL_VERTEX_PRECLIP_SGIX 0x83EE +#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF + +#define GLEW_SGIX_vertex_preclip GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip) + +#endif /* GL_SGIX_vertex_preclip */ + +/* ---------------------- GL_SGIX_vertex_preclip_hint ---------------------- */ + +#ifndef GL_SGIX_vertex_preclip_hint +#define GL_SGIX_vertex_preclip_hint 1 + +#define GL_VERTEX_PRECLIP_SGIX 0x83EE +#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF + +#define GLEW_SGIX_vertex_preclip_hint GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip_hint) + +#endif /* GL_SGIX_vertex_preclip_hint */ + +/* ----------------------------- GL_SGIX_ycrcb ----------------------------- */ + +#ifndef GL_SGIX_ycrcb +#define GL_SGIX_ycrcb 1 + +#define GLEW_SGIX_ycrcb GLEW_GET_VAR(__GLEW_SGIX_ycrcb) + +#endif /* GL_SGIX_ycrcb */ + +/* -------------------------- GL_SGI_color_matrix -------------------------- */ + +#ifndef GL_SGI_color_matrix +#define GL_SGI_color_matrix 1 + +#define GL_COLOR_MATRIX_SGI 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB + +#define GLEW_SGI_color_matrix GLEW_GET_VAR(__GLEW_SGI_color_matrix) + +#endif /* GL_SGI_color_matrix */ + +/* --------------------------- GL_SGI_color_table -------------------------- */ + +#ifndef GL_SGI_color_table +#define GL_SGI_color_table 1 + +#define GL_COLOR_TABLE_SGI 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 +#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 +#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 +#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 +#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 +#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF + +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void* table); +typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, void* table); + +#define glColorTableParameterfvSGI GLEW_GET_FUN(__glewColorTableParameterfvSGI) +#define glColorTableParameterivSGI GLEW_GET_FUN(__glewColorTableParameterivSGI) +#define glColorTableSGI GLEW_GET_FUN(__glewColorTableSGI) +#define glCopyColorTableSGI GLEW_GET_FUN(__glewCopyColorTableSGI) +#define glGetColorTableParameterfvSGI GLEW_GET_FUN(__glewGetColorTableParameterfvSGI) +#define glGetColorTableParameterivSGI GLEW_GET_FUN(__glewGetColorTableParameterivSGI) +#define glGetColorTableSGI GLEW_GET_FUN(__glewGetColorTableSGI) + +#define GLEW_SGI_color_table GLEW_GET_VAR(__GLEW_SGI_color_table) + +#endif /* GL_SGI_color_table */ + +/* ----------------------- GL_SGI_texture_color_table ---------------------- */ + +#ifndef GL_SGI_texture_color_table +#define GL_SGI_texture_color_table 1 + +#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC +#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD + +#define GLEW_SGI_texture_color_table GLEW_GET_VAR(__GLEW_SGI_texture_color_table) + +#endif /* GL_SGI_texture_color_table */ + +/* ------------------------- GL_SUNX_constant_data ------------------------- */ + +#ifndef GL_SUNX_constant_data +#define GL_SUNX_constant_data 1 + +#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 +#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 + +typedef void (GLAPIENTRY * PFNGLFINISHTEXTURESUNXPROC) (void); + +#define glFinishTextureSUNX GLEW_GET_FUN(__glewFinishTextureSUNX) + +#define GLEW_SUNX_constant_data GLEW_GET_VAR(__GLEW_SUNX_constant_data) + +#endif /* GL_SUNX_constant_data */ + +/* -------------------- GL_SUN_convolution_border_modes -------------------- */ + +#ifndef GL_SUN_convolution_border_modes +#define GL_SUN_convolution_border_modes 1 + +#define GL_WRAP_BORDER_SUN 0x81D4 + +#define GLEW_SUN_convolution_border_modes GLEW_GET_VAR(__GLEW_SUN_convolution_border_modes) + +#endif /* GL_SUN_convolution_border_modes */ + +/* -------------------------- GL_SUN_global_alpha -------------------------- */ + +#ifndef GL_SUN_global_alpha +#define GL_SUN_global_alpha 1 + +#define GL_GLOBAL_ALPHA_SUN 0x81D9 +#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA + +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); + +#define glGlobalAlphaFactorbSUN GLEW_GET_FUN(__glewGlobalAlphaFactorbSUN) +#define glGlobalAlphaFactordSUN GLEW_GET_FUN(__glewGlobalAlphaFactordSUN) +#define glGlobalAlphaFactorfSUN GLEW_GET_FUN(__glewGlobalAlphaFactorfSUN) +#define glGlobalAlphaFactoriSUN GLEW_GET_FUN(__glewGlobalAlphaFactoriSUN) +#define glGlobalAlphaFactorsSUN GLEW_GET_FUN(__glewGlobalAlphaFactorsSUN) +#define glGlobalAlphaFactorubSUN GLEW_GET_FUN(__glewGlobalAlphaFactorubSUN) +#define glGlobalAlphaFactoruiSUN GLEW_GET_FUN(__glewGlobalAlphaFactoruiSUN) +#define glGlobalAlphaFactorusSUN GLEW_GET_FUN(__glewGlobalAlphaFactorusSUN) + +#define GLEW_SUN_global_alpha GLEW_GET_VAR(__GLEW_SUN_global_alpha) + +#endif /* GL_SUN_global_alpha */ + +/* --------------------------- GL_SUN_mesh_array --------------------------- */ + +#ifndef GL_SUN_mesh_array +#define GL_SUN_mesh_array 1 + +#define GL_QUAD_MESH_SUN 0x8614 +#define GL_TRIANGLE_MESH_SUN 0x8615 + +#define GLEW_SUN_mesh_array GLEW_GET_VAR(__GLEW_SUN_mesh_array) + +#endif /* GL_SUN_mesh_array */ + +/* ------------------------ GL_SUN_read_video_pixels ----------------------- */ + +#ifndef GL_SUN_read_video_pixels +#define GL_SUN_read_video_pixels 1 + +typedef void (GLAPIENTRY * PFNGLREADVIDEOPIXELSSUNPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels); + +#define glReadVideoPixelsSUN GLEW_GET_FUN(__glewReadVideoPixelsSUN) + +#define GLEW_SUN_read_video_pixels GLEW_GET_VAR(__GLEW_SUN_read_video_pixels) + +#endif /* GL_SUN_read_video_pixels */ + +/* --------------------------- GL_SUN_slice_accum -------------------------- */ + +#ifndef GL_SUN_slice_accum +#define GL_SUN_slice_accum 1 + +#define GL_SLICE_ACCUM_SUN 0x85CC + +#define GLEW_SUN_slice_accum GLEW_GET_VAR(__GLEW_SUN_slice_accum) + +#endif /* GL_SUN_slice_accum */ + +/* -------------------------- GL_SUN_triangle_list ------------------------- */ + +#ifndef GL_SUN_triangle_list +#define GL_SUN_triangle_list 1 + +#define GL_RESTART_SUN 0x01 +#define GL_REPLACE_MIDDLE_SUN 0x02 +#define GL_REPLACE_OLDEST_SUN 0x03 +#define GL_TRIANGLE_LIST_SUN 0x81D7 +#define GL_REPLACEMENT_CODE_SUN 0x81D8 +#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 +#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 +#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 +#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 +#define GL_R1UI_V3F_SUN 0x85C4 +#define GL_R1UI_C4UB_V3F_SUN 0x85C5 +#define GL_R1UI_C3F_V3F_SUN 0x85C6 +#define GL_R1UI_N3F_V3F_SUN 0x85C7 +#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 +#define GL_R1UI_T2F_V3F_SUN 0x85C9 +#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA +#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB + +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const void* pointer); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte* code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint* code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort* code); + +#define glReplacementCodePointerSUN GLEW_GET_FUN(__glewReplacementCodePointerSUN) +#define glReplacementCodeubSUN GLEW_GET_FUN(__glewReplacementCodeubSUN) +#define glReplacementCodeubvSUN GLEW_GET_FUN(__glewReplacementCodeubvSUN) +#define glReplacementCodeuiSUN GLEW_GET_FUN(__glewReplacementCodeuiSUN) +#define glReplacementCodeuivSUN GLEW_GET_FUN(__glewReplacementCodeuivSUN) +#define glReplacementCodeusSUN GLEW_GET_FUN(__glewReplacementCodeusSUN) +#define glReplacementCodeusvSUN GLEW_GET_FUN(__glewReplacementCodeusvSUN) + +#define GLEW_SUN_triangle_list GLEW_GET_VAR(__GLEW_SUN_triangle_list) + +#endif /* GL_SUN_triangle_list */ + +/* ----------------------------- GL_SUN_vertex ----------------------------- */ + +#ifndef GL_SUN_vertex +#define GL_SUN_vertex 1 + +typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte* c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte* c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint* rc, const GLubyte *c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat* tc, const GLubyte *c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *v); + +#define glColor3fVertex3fSUN GLEW_GET_FUN(__glewColor3fVertex3fSUN) +#define glColor3fVertex3fvSUN GLEW_GET_FUN(__glewColor3fVertex3fvSUN) +#define glColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fSUN) +#define glColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fvSUN) +#define glColor4ubVertex2fSUN GLEW_GET_FUN(__glewColor4ubVertex2fSUN) +#define glColor4ubVertex2fvSUN GLEW_GET_FUN(__glewColor4ubVertex2fvSUN) +#define glColor4ubVertex3fSUN GLEW_GET_FUN(__glewColor4ubVertex3fSUN) +#define glColor4ubVertex3fvSUN GLEW_GET_FUN(__glewColor4ubVertex3fvSUN) +#define glNormal3fVertex3fSUN GLEW_GET_FUN(__glewNormal3fVertex3fSUN) +#define glNormal3fVertex3fvSUN GLEW_GET_FUN(__glewNormal3fVertex3fvSUN) +#define glReplacementCodeuiColor3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fSUN) +#define glReplacementCodeuiColor3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fvSUN) +#define glReplacementCodeuiColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fSUN) +#define glReplacementCodeuiColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fvSUN) +#define glReplacementCodeuiColor4ubVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fSUN) +#define glReplacementCodeuiColor4ubVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fvSUN) +#define glReplacementCodeuiNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fSUN) +#define glReplacementCodeuiNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fvSUN) +#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN) +#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN) +#define glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN) +#define glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN) +#define glReplacementCodeuiTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fSUN) +#define glReplacementCodeuiTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fvSUN) +#define glReplacementCodeuiVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fSUN) +#define glReplacementCodeuiVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fvSUN) +#define glTexCoord2fColor3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fSUN) +#define glTexCoord2fColor3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fvSUN) +#define glTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fSUN) +#define glTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fvSUN) +#define glTexCoord2fColor4ubVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fSUN) +#define glTexCoord2fColor4ubVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fvSUN) +#define glTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fSUN) +#define glTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fvSUN) +#define glTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fSUN) +#define glTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fvSUN) +#define glTexCoord4fColor4fNormal3fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fSUN) +#define glTexCoord4fColor4fNormal3fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fvSUN) +#define glTexCoord4fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fSUN) +#define glTexCoord4fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fvSUN) + +#define GLEW_SUN_vertex GLEW_GET_VAR(__GLEW_SUN_vertex) + +#endif /* GL_SUN_vertex */ + +/* -------------------------- GL_WIN_phong_shading ------------------------- */ + +#ifndef GL_WIN_phong_shading +#define GL_WIN_phong_shading 1 + +#define GL_PHONG_WIN 0x80EA +#define GL_PHONG_HINT_WIN 0x80EB + +#define GLEW_WIN_phong_shading GLEW_GET_VAR(__GLEW_WIN_phong_shading) + +#endif /* GL_WIN_phong_shading */ + +/* -------------------------- GL_WIN_specular_fog -------------------------- */ + +#ifndef GL_WIN_specular_fog +#define GL_WIN_specular_fog 1 + +#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC + +#define GLEW_WIN_specular_fog GLEW_GET_VAR(__GLEW_WIN_specular_fog) + +#endif /* GL_WIN_specular_fog */ + +/* ---------------------------- GL_WIN_swap_hint --------------------------- */ + +#ifndef GL_WIN_swap_hint +#define GL_WIN_swap_hint 1 + +typedef void (GLAPIENTRY * PFNGLADDSWAPHINTRECTWINPROC) (GLint x, GLint y, GLsizei width, GLsizei height); + +#define glAddSwapHintRectWIN GLEW_GET_FUN(__glewAddSwapHintRectWIN) + +#define GLEW_WIN_swap_hint GLEW_GET_VAR(__GLEW_WIN_swap_hint) + +#endif /* GL_WIN_swap_hint */ + +/* ------------------------------------------------------------------------- */ + +#if defined(GLEW_MX) && defined(_WIN32) +#define GLEW_FUN_EXPORT +#else +#define GLEW_FUN_EXPORT GLEWAPI +#endif /* GLEW_MX */ + +#if defined(GLEW_MX) +#define GLEW_VAR_EXPORT +#else +#define GLEW_VAR_EXPORT GLEWAPI +#endif /* GLEW_MX */ + +#if defined(GLEW_MX) && defined(_WIN32) +struct GLEWContextStruct +{ +#endif /* GLEW_MX */ + +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D; +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements; +GLEW_FUN_EXPORT PFNGLTEXIMAGE3DPROC __glewTexImage3D; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D; + +GLEW_FUN_EXPORT PFNGLACTIVETEXTUREPROC __glewActiveTexture; +GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREPROC __glewClientActiveTexture; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DPROC __glewCompressedTexImage1D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DPROC __glewCompressedTexImage2D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DPROC __glewCompressedTexImage3D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC __glewCompressedTexSubImage1D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC __glewCompressedTexSubImage2D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC __glewCompressedTexSubImage3D; +GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEPROC __glewGetCompressedTexImage; +GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDPROC __glewLoadTransposeMatrixd; +GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFPROC __glewLoadTransposeMatrixf; +GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDPROC __glewMultTransposeMatrixd; +GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFPROC __glewMultTransposeMatrixf; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DPROC __glewMultiTexCoord1d; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVPROC __glewMultiTexCoord1dv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FPROC __glewMultiTexCoord1f; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVPROC __glewMultiTexCoord1fv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IPROC __glewMultiTexCoord1i; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVPROC __glewMultiTexCoord1iv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SPROC __glewMultiTexCoord1s; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVPROC __glewMultiTexCoord1sv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DPROC __glewMultiTexCoord2d; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVPROC __glewMultiTexCoord2dv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FPROC __glewMultiTexCoord2f; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVPROC __glewMultiTexCoord2fv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IPROC __glewMultiTexCoord2i; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVPROC __glewMultiTexCoord2iv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SPROC __glewMultiTexCoord2s; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVPROC __glewMultiTexCoord2sv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DPROC __glewMultiTexCoord3d; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVPROC __glewMultiTexCoord3dv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FPROC __glewMultiTexCoord3f; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVPROC __glewMultiTexCoord3fv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IPROC __glewMultiTexCoord3i; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVPROC __glewMultiTexCoord3iv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SPROC __glewMultiTexCoord3s; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVPROC __glewMultiTexCoord3sv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DPROC __glewMultiTexCoord4d; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVPROC __glewMultiTexCoord4dv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FPROC __glewMultiTexCoord4f; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVPROC __glewMultiTexCoord4fv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IPROC __glewMultiTexCoord4i; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVPROC __glewMultiTexCoord4iv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SPROC __glewMultiTexCoord4s; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVPROC __glewMultiTexCoord4sv; +GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEPROC __glewSampleCoverage; + +GLEW_FUN_EXPORT PFNGLBLENDCOLORPROC __glewBlendColor; +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONPROC __glewBlendEquation; +GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEPROC __glewBlendFuncSeparate; +GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERPROC __glewFogCoordPointer; +GLEW_FUN_EXPORT PFNGLFOGCOORDDPROC __glewFogCoordd; +GLEW_FUN_EXPORT PFNGLFOGCOORDDVPROC __glewFogCoorddv; +GLEW_FUN_EXPORT PFNGLFOGCOORDFPROC __glewFogCoordf; +GLEW_FUN_EXPORT PFNGLFOGCOORDFVPROC __glewFogCoordfv; +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSPROC __glewMultiDrawArrays; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSPROC __glewMultiDrawElements; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFPROC __glewPointParameterf; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVPROC __glewPointParameterfv; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIPROC __glewPointParameteri; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVPROC __glewPointParameteriv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BPROC __glewSecondaryColor3b; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVPROC __glewSecondaryColor3bv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DPROC __glewSecondaryColor3d; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVPROC __glewSecondaryColor3dv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FPROC __glewSecondaryColor3f; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVPROC __glewSecondaryColor3fv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IPROC __glewSecondaryColor3i; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVPROC __glewSecondaryColor3iv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SPROC __glewSecondaryColor3s; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVPROC __glewSecondaryColor3sv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBPROC __glewSecondaryColor3ub; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVPROC __glewSecondaryColor3ubv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIPROC __glewSecondaryColor3ui; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVPROC __glewSecondaryColor3uiv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USPROC __glewSecondaryColor3us; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVPROC __glewSecondaryColor3usv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERPROC __glewSecondaryColorPointer; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DPROC __glewWindowPos2d; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVPROC __glewWindowPos2dv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FPROC __glewWindowPos2f; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVPROC __glewWindowPos2fv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IPROC __glewWindowPos2i; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVPROC __glewWindowPos2iv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SPROC __glewWindowPos2s; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVPROC __glewWindowPos2sv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DPROC __glewWindowPos3d; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVPROC __glewWindowPos3dv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FPROC __glewWindowPos3f; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVPROC __glewWindowPos3fv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IPROC __glewWindowPos3i; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVPROC __glewWindowPos3iv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SPROC __glewWindowPos3s; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVPROC __glewWindowPos3sv; + +GLEW_FUN_EXPORT PFNGLBEGINQUERYPROC __glewBeginQuery; +GLEW_FUN_EXPORT PFNGLBINDBUFFERPROC __glewBindBuffer; +GLEW_FUN_EXPORT PFNGLBUFFERDATAPROC __glewBufferData; +GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAPROC __glewBufferSubData; +GLEW_FUN_EXPORT PFNGLDELETEBUFFERSPROC __glewDeleteBuffers; +GLEW_FUN_EXPORT PFNGLDELETEQUERIESPROC __glewDeleteQueries; +GLEW_FUN_EXPORT PFNGLENDQUERYPROC __glewEndQuery; +GLEW_FUN_EXPORT PFNGLGENBUFFERSPROC __glewGenBuffers; +GLEW_FUN_EXPORT PFNGLGENQUERIESPROC __glewGenQueries; +GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVPROC __glewGetBufferParameteriv; +GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVPROC __glewGetBufferPointerv; +GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAPROC __glewGetBufferSubData; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVPROC __glewGetQueryObjectiv; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVPROC __glewGetQueryObjectuiv; +GLEW_FUN_EXPORT PFNGLGETQUERYIVPROC __glewGetQueryiv; +GLEW_FUN_EXPORT PFNGLISBUFFERPROC __glewIsBuffer; +GLEW_FUN_EXPORT PFNGLISQUERYPROC __glewIsQuery; +GLEW_FUN_EXPORT PFNGLMAPBUFFERPROC __glewMapBuffer; +GLEW_FUN_EXPORT PFNGLUNMAPBUFFERPROC __glewUnmapBuffer; + +GLEW_FUN_EXPORT PFNGLATTACHSHADERPROC __glewAttachShader; +GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONPROC __glewBindAttribLocation; +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEPROC __glewBlendEquationSeparate; +GLEW_FUN_EXPORT PFNGLCOMPILESHADERPROC __glewCompileShader; +GLEW_FUN_EXPORT PFNGLCREATEPROGRAMPROC __glewCreateProgram; +GLEW_FUN_EXPORT PFNGLCREATESHADERPROC __glewCreateShader; +GLEW_FUN_EXPORT PFNGLDELETEPROGRAMPROC __glewDeleteProgram; +GLEW_FUN_EXPORT PFNGLDELETESHADERPROC __glewDeleteShader; +GLEW_FUN_EXPORT PFNGLDETACHSHADERPROC __glewDetachShader; +GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYPROC __glewDisableVertexAttribArray; +GLEW_FUN_EXPORT PFNGLDRAWBUFFERSPROC __glewDrawBuffers; +GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYPROC __glewEnableVertexAttribArray; +GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBPROC __glewGetActiveAttrib; +GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMPROC __glewGetActiveUniform; +GLEW_FUN_EXPORT PFNGLGETATTACHEDSHADERSPROC __glewGetAttachedShaders; +GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONPROC __glewGetAttribLocation; +GLEW_FUN_EXPORT PFNGLGETPROGRAMINFOLOGPROC __glewGetProgramInfoLog; +GLEW_FUN_EXPORT PFNGLGETPROGRAMIVPROC __glewGetProgramiv; +GLEW_FUN_EXPORT PFNGLGETSHADERINFOLOGPROC __glewGetShaderInfoLog; +GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEPROC __glewGetShaderSource; +GLEW_FUN_EXPORT PFNGLGETSHADERIVPROC __glewGetShaderiv; +GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONPROC __glewGetUniformLocation; +GLEW_FUN_EXPORT PFNGLGETUNIFORMFVPROC __glewGetUniformfv; +GLEW_FUN_EXPORT PFNGLGETUNIFORMIVPROC __glewGetUniformiv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVPROC __glewGetVertexAttribPointerv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVPROC __glewGetVertexAttribdv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVPROC __glewGetVertexAttribfv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVPROC __glewGetVertexAttribiv; +GLEW_FUN_EXPORT PFNGLISPROGRAMPROC __glewIsProgram; +GLEW_FUN_EXPORT PFNGLISSHADERPROC __glewIsShader; +GLEW_FUN_EXPORT PFNGLLINKPROGRAMPROC __glewLinkProgram; +GLEW_FUN_EXPORT PFNGLSHADERSOURCEPROC __glewShaderSource; +GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEPROC __glewStencilFuncSeparate; +GLEW_FUN_EXPORT PFNGLSTENCILMASKSEPARATEPROC __glewStencilMaskSeparate; +GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEPROC __glewStencilOpSeparate; +GLEW_FUN_EXPORT PFNGLUNIFORM1FPROC __glewUniform1f; +GLEW_FUN_EXPORT PFNGLUNIFORM1FVPROC __glewUniform1fv; +GLEW_FUN_EXPORT PFNGLUNIFORM1IPROC __glewUniform1i; +GLEW_FUN_EXPORT PFNGLUNIFORM1IVPROC __glewUniform1iv; +GLEW_FUN_EXPORT PFNGLUNIFORM2FPROC __glewUniform2f; +GLEW_FUN_EXPORT PFNGLUNIFORM2FVPROC __glewUniform2fv; +GLEW_FUN_EXPORT PFNGLUNIFORM2IPROC __glewUniform2i; +GLEW_FUN_EXPORT PFNGLUNIFORM2IVPROC __glewUniform2iv; +GLEW_FUN_EXPORT PFNGLUNIFORM3FPROC __glewUniform3f; +GLEW_FUN_EXPORT PFNGLUNIFORM3FVPROC __glewUniform3fv; +GLEW_FUN_EXPORT PFNGLUNIFORM3IPROC __glewUniform3i; +GLEW_FUN_EXPORT PFNGLUNIFORM3IVPROC __glewUniform3iv; +GLEW_FUN_EXPORT PFNGLUNIFORM4FPROC __glewUniform4f; +GLEW_FUN_EXPORT PFNGLUNIFORM4FVPROC __glewUniform4fv; +GLEW_FUN_EXPORT PFNGLUNIFORM4IPROC __glewUniform4i; +GLEW_FUN_EXPORT PFNGLUNIFORM4IVPROC __glewUniform4iv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVPROC __glewUniformMatrix2fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVPROC __glewUniformMatrix3fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVPROC __glewUniformMatrix4fv; +GLEW_FUN_EXPORT PFNGLUSEPROGRAMPROC __glewUseProgram; +GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMPROC __glewValidateProgram; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DPROC __glewVertexAttrib1d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVPROC __glewVertexAttrib1dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FPROC __glewVertexAttrib1f; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVPROC __glewVertexAttrib1fv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SPROC __glewVertexAttrib1s; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVPROC __glewVertexAttrib1sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DPROC __glewVertexAttrib2d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVPROC __glewVertexAttrib2dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FPROC __glewVertexAttrib2f; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVPROC __glewVertexAttrib2fv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SPROC __glewVertexAttrib2s; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVPROC __glewVertexAttrib2sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DPROC __glewVertexAttrib3d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVPROC __glewVertexAttrib3dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FPROC __glewVertexAttrib3f; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVPROC __glewVertexAttrib3fv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SPROC __glewVertexAttrib3s; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVPROC __glewVertexAttrib3sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVPROC __glewVertexAttrib4Nbv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVPROC __glewVertexAttrib4Niv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVPROC __glewVertexAttrib4Nsv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBPROC __glewVertexAttrib4Nub; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVPROC __glewVertexAttrib4Nubv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVPROC __glewVertexAttrib4Nuiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVPROC __glewVertexAttrib4Nusv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVPROC __glewVertexAttrib4bv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DPROC __glewVertexAttrib4d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVPROC __glewVertexAttrib4dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FPROC __glewVertexAttrib4f; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVPROC __glewVertexAttrib4fv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVPROC __glewVertexAttrib4iv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SPROC __glewVertexAttrib4s; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVPROC __glewVertexAttrib4sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVPROC __glewVertexAttrib4ubv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVPROC __glewVertexAttrib4uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVPROC __glewVertexAttrib4usv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERPROC __glewVertexAttribPointer; + +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3FVPROC __glewUniformMatrix2x3fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4FVPROC __glewUniformMatrix2x4fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2FVPROC __glewUniformMatrix3x2fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4FVPROC __glewUniformMatrix3x4fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2FVPROC __glewUniformMatrix4x2fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3FVPROC __glewUniformMatrix4x3fv; + +GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERPROC __glewBeginConditionalRender; +GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKPROC __glewBeginTransformFeedback; +GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONPROC __glewBindFragDataLocation; +GLEW_FUN_EXPORT PFNGLCLAMPCOLORPROC __glewClampColor; +GLEW_FUN_EXPORT PFNGLCLEARBUFFERFIPROC __glewClearBufferfi; +GLEW_FUN_EXPORT PFNGLCLEARBUFFERFVPROC __glewClearBufferfv; +GLEW_FUN_EXPORT PFNGLCLEARBUFFERIVPROC __glewClearBufferiv; +GLEW_FUN_EXPORT PFNGLCLEARBUFFERUIVPROC __glewClearBufferuiv; +GLEW_FUN_EXPORT PFNGLCOLORMASKIPROC __glewColorMaski; +GLEW_FUN_EXPORT PFNGLDISABLEIPROC __glewDisablei; +GLEW_FUN_EXPORT PFNGLENABLEIPROC __glewEnablei; +GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERPROC __glewEndConditionalRender; +GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKPROC __glewEndTransformFeedback; +GLEW_FUN_EXPORT PFNGLGETBOOLEANI_VPROC __glewGetBooleani_v; +GLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONPROC __glewGetFragDataLocation; +GLEW_FUN_EXPORT PFNGLGETSTRINGIPROC __glewGetStringi; +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVPROC __glewGetTexParameterIiv; +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVPROC __glewGetTexParameterIuiv; +GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGPROC __glewGetTransformFeedbackVarying; +GLEW_FUN_EXPORT PFNGLGETUNIFORMUIVPROC __glewGetUniformuiv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIIVPROC __glewGetVertexAttribIiv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIUIVPROC __glewGetVertexAttribIuiv; +GLEW_FUN_EXPORT PFNGLISENABLEDIPROC __glewIsEnabledi; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVPROC __glewTexParameterIiv; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVPROC __glewTexParameterIuiv; +GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSPROC __glewTransformFeedbackVaryings; +GLEW_FUN_EXPORT PFNGLUNIFORM1UIPROC __glewUniform1ui; +GLEW_FUN_EXPORT PFNGLUNIFORM1UIVPROC __glewUniform1uiv; +GLEW_FUN_EXPORT PFNGLUNIFORM2UIPROC __glewUniform2ui; +GLEW_FUN_EXPORT PFNGLUNIFORM2UIVPROC __glewUniform2uiv; +GLEW_FUN_EXPORT PFNGLUNIFORM3UIPROC __glewUniform3ui; +GLEW_FUN_EXPORT PFNGLUNIFORM3UIVPROC __glewUniform3uiv; +GLEW_FUN_EXPORT PFNGLUNIFORM4UIPROC __glewUniform4ui; +GLEW_FUN_EXPORT PFNGLUNIFORM4UIVPROC __glewUniform4uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IPROC __glewVertexAttribI1i; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IVPROC __glewVertexAttribI1iv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIPROC __glewVertexAttribI1ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIVPROC __glewVertexAttribI1uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IPROC __glewVertexAttribI2i; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IVPROC __glewVertexAttribI2iv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIPROC __glewVertexAttribI2ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIVPROC __glewVertexAttribI2uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IPROC __glewVertexAttribI3i; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IVPROC __glewVertexAttribI3iv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIPROC __glewVertexAttribI3ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIVPROC __glewVertexAttribI3uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4BVPROC __glewVertexAttribI4bv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IPROC __glewVertexAttribI4i; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IVPROC __glewVertexAttribI4iv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4SVPROC __glewVertexAttribI4sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UBVPROC __glewVertexAttribI4ubv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIPROC __glewVertexAttribI4ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVPROC __glewVertexAttribI4uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVPROC __glewVertexAttribI4usv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTERPROC __glewVertexAttribIPointer; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDPROC __glewDrawArraysInstanced; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDPROC __glewDrawElementsInstanced; +GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXPROC __glewPrimitiveRestartIndex; +GLEW_FUN_EXPORT PFNGLTEXBUFFERPROC __glewTexBuffer; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREPROC __glewFramebufferTexture; +GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERI64VPROC __glewGetBufferParameteri64v; +GLEW_FUN_EXPORT PFNGLGETINTEGER64I_VPROC __glewGetInteger64i_v; + +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORPROC __glewVertexAttribDivisor; + +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIPROC __glewBlendEquationSeparatei; +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIPROC __glewBlendEquationi; +GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIPROC __glewBlendFuncSeparatei; +GLEW_FUN_EXPORT PFNGLBLENDFUNCIPROC __glewBlendFunci; +GLEW_FUN_EXPORT PFNGLMINSAMPLESHADINGPROC __glewMinSampleShading; + +GLEW_FUN_EXPORT PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX; + +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKAMDPROC __glewDebugMessageCallbackAMD; +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEENABLEAMDPROC __glewDebugMessageEnableAMD; +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTAMDPROC __glewDebugMessageInsertAMD; +GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGAMDPROC __glewGetDebugMessageLogAMD; + +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONINDEXEDAMDPROC __glewBlendEquationIndexedAMD; +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC __glewBlendEquationSeparateIndexedAMD; +GLEW_FUN_EXPORT PFNGLBLENDFUNCINDEXEDAMDPROC __glewBlendFuncIndexedAMD; +GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC __glewBlendFuncSeparateIndexedAMD; + +GLEW_FUN_EXPORT PFNGLDELETENAMESAMDPROC __glewDeleteNamesAMD; +GLEW_FUN_EXPORT PFNGLGENNAMESAMDPROC __glewGenNamesAMD; +GLEW_FUN_EXPORT PFNGLISNAMEAMDPROC __glewIsNameAMD; + +GLEW_FUN_EXPORT PFNGLBEGINPERFMONITORAMDPROC __glewBeginPerfMonitorAMD; +GLEW_FUN_EXPORT PFNGLDELETEPERFMONITORSAMDPROC __glewDeletePerfMonitorsAMD; +GLEW_FUN_EXPORT PFNGLENDPERFMONITORAMDPROC __glewEndPerfMonitorAMD; +GLEW_FUN_EXPORT PFNGLGENPERFMONITORSAMDPROC __glewGenPerfMonitorsAMD; +GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERDATAAMDPROC __glewGetPerfMonitorCounterDataAMD; +GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERINFOAMDPROC __glewGetPerfMonitorCounterInfoAMD; +GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC __glewGetPerfMonitorCounterStringAMD; +GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERSAMDPROC __glewGetPerfMonitorCountersAMD; +GLEW_FUN_EXPORT PFNGLGETPERFMONITORGROUPSTRINGAMDPROC __glewGetPerfMonitorGroupStringAMD; +GLEW_FUN_EXPORT PFNGLGETPERFMONITORGROUPSAMDPROC __glewGetPerfMonitorGroupsAMD; +GLEW_FUN_EXPORT PFNGLSELECTPERFMONITORCOUNTERSAMDPROC __glewSelectPerfMonitorCountersAMD; + +GLEW_FUN_EXPORT PFNGLTESSELLATIONFACTORAMDPROC __glewTessellationFactorAMD; +GLEW_FUN_EXPORT PFNGLTESSELLATIONMODEAMDPROC __glewTessellationModeAMD; + +GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE; +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE; +GLEW_FUN_EXPORT PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC __glewMultiDrawElementArrayAPPLE; +GLEW_FUN_EXPORT PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC __glewMultiDrawRangeElementArrayAPPLE; + +GLEW_FUN_EXPORT PFNGLDELETEFENCESAPPLEPROC __glewDeleteFencesAPPLE; +GLEW_FUN_EXPORT PFNGLFINISHFENCEAPPLEPROC __glewFinishFenceAPPLE; +GLEW_FUN_EXPORT PFNGLFINISHOBJECTAPPLEPROC __glewFinishObjectAPPLE; +GLEW_FUN_EXPORT PFNGLGENFENCESAPPLEPROC __glewGenFencesAPPLE; +GLEW_FUN_EXPORT PFNGLISFENCEAPPLEPROC __glewIsFenceAPPLE; +GLEW_FUN_EXPORT PFNGLSETFENCEAPPLEPROC __glewSetFenceAPPLE; +GLEW_FUN_EXPORT PFNGLTESTFENCEAPPLEPROC __glewTestFenceAPPLE; +GLEW_FUN_EXPORT PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE; + +GLEW_FUN_EXPORT PFNGLBUFFERPARAMETERIAPPLEPROC __glewBufferParameteriAPPLE; +GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC __glewFlushMappedBufferRangeAPPLE; + +GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVAPPLEPROC __glewGetObjectParameterivAPPLE; +GLEW_FUN_EXPORT PFNGLOBJECTPURGEABLEAPPLEPROC __glewObjectPurgeableAPPLE; +GLEW_FUN_EXPORT PFNGLOBJECTUNPURGEABLEAPPLEPROC __glewObjectUnpurgeableAPPLE; + +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE; +GLEW_FUN_EXPORT PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE; + +GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYAPPLEPROC __glewBindVertexArrayAPPLE; +GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSAPPLEPROC __glewDeleteVertexArraysAPPLE; +GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSAPPLEPROC __glewGenVertexArraysAPPLE; +GLEW_FUN_EXPORT PFNGLISVERTEXARRAYAPPLEPROC __glewIsVertexArrayAPPLE; + +GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE; + +GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBAPPLEPROC __glewDisableVertexAttribAPPLE; +GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBAPPLEPROC __glewEnableVertexAttribAPPLE; +GLEW_FUN_EXPORT PFNGLISVERTEXATTRIBENABLEDAPPLEPROC __glewIsVertexAttribEnabledAPPLE; +GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB1DAPPLEPROC __glewMapVertexAttrib1dAPPLE; +GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB1FAPPLEPROC __glewMapVertexAttrib1fAPPLE; +GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB2DAPPLEPROC __glewMapVertexAttrib2dAPPLE; +GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB2FAPPLEPROC __glewMapVertexAttrib2fAPPLE; + +GLEW_FUN_EXPORT PFNGLCLEARDEPTHFPROC __glewClearDepthf; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEFPROC __glewDepthRangef; +GLEW_FUN_EXPORT PFNGLGETSHADERPRECISIONFORMATPROC __glewGetShaderPrecisionFormat; +GLEW_FUN_EXPORT PFNGLRELEASESHADERCOMPILERPROC __glewReleaseShaderCompiler; +GLEW_FUN_EXPORT PFNGLSHADERBINARYPROC __glewShaderBinary; + +GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONINDEXEDPROC __glewBindFragDataLocationIndexed; +GLEW_FUN_EXPORT PFNGLGETFRAGDATAINDEXPROC __glewGetFragDataIndex; + +GLEW_FUN_EXPORT PFNGLCREATESYNCFROMCLEVENTARBPROC __glewCreateSyncFromCLeventARB; + +GLEW_FUN_EXPORT PFNGLCLAMPCOLORARBPROC __glewClampColorARB; + +GLEW_FUN_EXPORT PFNGLCOPYBUFFERSUBDATAPROC __glewCopyBufferSubData; + +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKARBPROC __glewDebugMessageCallbackARB; +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECONTROLARBPROC __glewDebugMessageControlARB; +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTARBPROC __glewDebugMessageInsertARB; +GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGARBPROC __glewGetDebugMessageLogARB; + +GLEW_FUN_EXPORT PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB; + +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIARBPROC __glewBlendEquationSeparateiARB; +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIARBPROC __glewBlendEquationiARB; +GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIARBPROC __glewBlendFuncSeparateiARB; +GLEW_FUN_EXPORT PFNGLBLENDFUNCIARBPROC __glewBlendFunciARB; + +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSBASEVERTEXPROC __glewDrawElementsBaseVertex; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __glewDrawElementsInstancedBaseVertex; +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC __glewDrawRangeElementsBaseVertex; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC __glewMultiDrawElementsBaseVertex; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINDIRECTPROC __glewDrawArraysIndirect; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINDIRECTPROC __glewDrawElementsIndirect; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDARBPROC __glewDrawArraysInstancedARB; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDARBPROC __glewDrawElementsInstancedARB; + +GLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFERPROC __glewBindFramebuffer; +GLEW_FUN_EXPORT PFNGLBINDRENDERBUFFERPROC __glewBindRenderbuffer; +GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFERPROC __glewBlitFramebuffer; +GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSPROC __glewCheckFramebufferStatus; +GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSPROC __glewDeleteFramebuffers; +GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSPROC __glewDeleteRenderbuffers; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFERPROC __glewFramebufferRenderbuffer; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DPROC __glewFramebufferTexture1D; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DPROC __glewFramebufferTexture2D; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DPROC __glewFramebufferTexture3D; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer; +GLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSPROC __glewGenFramebuffers; +GLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSPROC __glewGenRenderbuffers; +GLEW_FUN_EXPORT PFNGLGENERATEMIPMAPPROC __glewGenerateMipmap; +GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetFramebufferAttachmentParameteriv; +GLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVPROC __glewGetRenderbufferParameteriv; +GLEW_FUN_EXPORT PFNGLISFRAMEBUFFERPROC __glewIsFramebuffer; +GLEW_FUN_EXPORT PFNGLISRENDERBUFFERPROC __glewIsRenderbuffer; +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEPROC __glewRenderbufferStorage; +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewRenderbufferStorageMultisample; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREARBPROC __glewFramebufferTextureARB; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEARBPROC __glewFramebufferTextureFaceARB; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERARBPROC __glewFramebufferTextureLayerARB; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIARBPROC __glewProgramParameteriARB; + +GLEW_FUN_EXPORT PFNGLGETPROGRAMBINARYPROC __glewGetProgramBinary; +GLEW_FUN_EXPORT PFNGLPROGRAMBINARYPROC __glewProgramBinary; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIPROC __glewProgramParameteri; + +GLEW_FUN_EXPORT PFNGLGETUNIFORMDVPROC __glewGetUniformdv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DEXTPROC __glewProgramUniform1dEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DVEXTPROC __glewProgramUniform1dvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DEXTPROC __glewProgramUniform2dEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DVEXTPROC __glewProgramUniform2dvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DEXTPROC __glewProgramUniform3dEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DVEXTPROC __glewProgramUniform3dvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DEXTPROC __glewProgramUniform4dEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DVEXTPROC __glewProgramUniform4dvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC __glewProgramUniformMatrix2dvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC __glewProgramUniformMatrix2x3dvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC __glewProgramUniformMatrix2x4dvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC __glewProgramUniformMatrix3dvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC __glewProgramUniformMatrix3x2dvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC __glewProgramUniformMatrix3x4dvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC __glewProgramUniformMatrix4dvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC __glewProgramUniformMatrix4x2dvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC __glewProgramUniformMatrix4x3dvEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM1DPROC __glewUniform1d; +GLEW_FUN_EXPORT PFNGLUNIFORM1DVPROC __glewUniform1dv; +GLEW_FUN_EXPORT PFNGLUNIFORM2DPROC __glewUniform2d; +GLEW_FUN_EXPORT PFNGLUNIFORM2DVPROC __glewUniform2dv; +GLEW_FUN_EXPORT PFNGLUNIFORM3DPROC __glewUniform3d; +GLEW_FUN_EXPORT PFNGLUNIFORM3DVPROC __glewUniform3dv; +GLEW_FUN_EXPORT PFNGLUNIFORM4DPROC __glewUniform4d; +GLEW_FUN_EXPORT PFNGLUNIFORM4DVPROC __glewUniform4dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2DVPROC __glewUniformMatrix2dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3DVPROC __glewUniformMatrix2x3dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4DVPROC __glewUniformMatrix2x4dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3DVPROC __glewUniformMatrix3dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2DVPROC __glewUniformMatrix3x2dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4DVPROC __glewUniformMatrix3x4dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4DVPROC __glewUniformMatrix4dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2DVPROC __glewUniformMatrix4x2dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3DVPROC __glewUniformMatrix4x3dv; + +GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEPROC __glewColorSubTable; +GLEW_FUN_EXPORT PFNGLCOLORTABLEPROC __glewColorTable; +GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv; +GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVPROC __glewColorTableParameteriv; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DPROC __glewConvolutionFilter1D; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DPROC __glewConvolutionFilter2D; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFPROC __glewConvolutionParameterf; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVPROC __glewConvolutionParameterfv; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIPROC __glewConvolutionParameteri; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVPROC __glewConvolutionParameteriv; +GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEPROC __glewCopyColorSubTable; +GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLEPROC __glewCopyColorTable; +GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DPROC __glewCopyConvolutionFilter1D; +GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DPROC __glewCopyConvolutionFilter2D; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPROC __glewGetColorTable; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVPROC __glewGetColorTableParameterfv; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVPROC __glewGetColorTableParameteriv; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTERPROC __glewGetConvolutionFilter; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVPROC __glewGetConvolutionParameterfv; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVPROC __glewGetConvolutionParameteriv; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPROC __glewGetHistogram; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVPROC __glewGetHistogramParameterfv; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVPROC __glewGetHistogramParameteriv; +GLEW_FUN_EXPORT PFNGLGETMINMAXPROC __glewGetMinmax; +GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVPROC __glewGetMinmaxParameterfv; +GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVPROC __glewGetMinmaxParameteriv; +GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTERPROC __glewGetSeparableFilter; +GLEW_FUN_EXPORT PFNGLHISTOGRAMPROC __glewHistogram; +GLEW_FUN_EXPORT PFNGLMINMAXPROC __glewMinmax; +GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMPROC __glewResetHistogram; +GLEW_FUN_EXPORT PFNGLRESETMINMAXPROC __glewResetMinmax; +GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D; + +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORARBPROC __glewVertexAttribDivisorARB; + +GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEPROC __glewFlushMappedBufferRange; +GLEW_FUN_EXPORT PFNGLMAPBUFFERRANGEPROC __glewMapBufferRange; + +GLEW_FUN_EXPORT PFNGLCURRENTPALETTEMATRIXARBPROC __glewCurrentPaletteMatrixARB; +GLEW_FUN_EXPORT PFNGLMATRIXINDEXPOINTERARBPROC __glewMatrixIndexPointerARB; +GLEW_FUN_EXPORT PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB; +GLEW_FUN_EXPORT PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB; +GLEW_FUN_EXPORT PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB; + +GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEARBPROC __glewSampleCoverageARB; + +GLEW_FUN_EXPORT PFNGLACTIVETEXTUREARBPROC __glewActiveTextureARB; +GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREARBPROC __glewClientActiveTextureARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DARBPROC __glewMultiTexCoord1dARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVARBPROC __glewMultiTexCoord1dvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FARBPROC __glewMultiTexCoord1fARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVARBPROC __glewMultiTexCoord1fvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IARBPROC __glewMultiTexCoord1iARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVARBPROC __glewMultiTexCoord1ivARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SARBPROC __glewMultiTexCoord1sARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVARBPROC __glewMultiTexCoord1svARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DARBPROC __glewMultiTexCoord2dARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVARBPROC __glewMultiTexCoord2dvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FARBPROC __glewMultiTexCoord2fARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVARBPROC __glewMultiTexCoord2fvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IARBPROC __glewMultiTexCoord2iARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVARBPROC __glewMultiTexCoord2ivARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SARBPROC __glewMultiTexCoord2sARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVARBPROC __glewMultiTexCoord2svARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DARBPROC __glewMultiTexCoord3dARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVARBPROC __glewMultiTexCoord3dvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FARBPROC __glewMultiTexCoord3fARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVARBPROC __glewMultiTexCoord3fvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IARBPROC __glewMultiTexCoord3iARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVARBPROC __glewMultiTexCoord3ivARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SARBPROC __glewMultiTexCoord3sARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVARBPROC __glewMultiTexCoord3svARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DARBPROC __glewMultiTexCoord4dARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVARBPROC __glewMultiTexCoord4dvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FARBPROC __glewMultiTexCoord4fARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVARBPROC __glewMultiTexCoord4fvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IARBPROC __glewMultiTexCoord4iARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVARBPROC __glewMultiTexCoord4ivARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SARBPROC __glewMultiTexCoord4sARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVARBPROC __glewMultiTexCoord4svARB; + +GLEW_FUN_EXPORT PFNGLBEGINQUERYARBPROC __glewBeginQueryARB; +GLEW_FUN_EXPORT PFNGLDELETEQUERIESARBPROC __glewDeleteQueriesARB; +GLEW_FUN_EXPORT PFNGLENDQUERYARBPROC __glewEndQueryARB; +GLEW_FUN_EXPORT PFNGLGENQUERIESARBPROC __glewGenQueriesARB; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVARBPROC __glewGetQueryObjectivARB; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVARBPROC __glewGetQueryObjectuivARB; +GLEW_FUN_EXPORT PFNGLGETQUERYIVARBPROC __glewGetQueryivARB; +GLEW_FUN_EXPORT PFNGLISQUERYARBPROC __glewIsQueryARB; + +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB; + +GLEW_FUN_EXPORT PFNGLPROVOKINGVERTEXPROC __glewProvokingVertex; + +GLEW_FUN_EXPORT PFNGLGETNCOLORTABLEARBPROC __glewGetnColorTableARB; +GLEW_FUN_EXPORT PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC __glewGetnCompressedTexImageARB; +GLEW_FUN_EXPORT PFNGLGETNCONVOLUTIONFILTERARBPROC __glewGetnConvolutionFilterARB; +GLEW_FUN_EXPORT PFNGLGETNHISTOGRAMARBPROC __glewGetnHistogramARB; +GLEW_FUN_EXPORT PFNGLGETNMAPDVARBPROC __glewGetnMapdvARB; +GLEW_FUN_EXPORT PFNGLGETNMAPFVARBPROC __glewGetnMapfvARB; +GLEW_FUN_EXPORT PFNGLGETNMAPIVARBPROC __glewGetnMapivARB; +GLEW_FUN_EXPORT PFNGLGETNMINMAXARBPROC __glewGetnMinmaxARB; +GLEW_FUN_EXPORT PFNGLGETNPIXELMAPFVARBPROC __glewGetnPixelMapfvARB; +GLEW_FUN_EXPORT PFNGLGETNPIXELMAPUIVARBPROC __glewGetnPixelMapuivARB; +GLEW_FUN_EXPORT PFNGLGETNPIXELMAPUSVARBPROC __glewGetnPixelMapusvARB; +GLEW_FUN_EXPORT PFNGLGETNPOLYGONSTIPPLEARBPROC __glewGetnPolygonStippleARB; +GLEW_FUN_EXPORT PFNGLGETNSEPARABLEFILTERARBPROC __glewGetnSeparableFilterARB; +GLEW_FUN_EXPORT PFNGLGETNTEXIMAGEARBPROC __glewGetnTexImageARB; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMDVARBPROC __glewGetnUniformdvARB; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMFVARBPROC __glewGetnUniformfvARB; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMIVARBPROC __glewGetnUniformivARB; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMUIVARBPROC __glewGetnUniformuivARB; +GLEW_FUN_EXPORT PFNGLREADNPIXELSARBPROC __glewReadnPixelsARB; + +GLEW_FUN_EXPORT PFNGLMINSAMPLESHADINGARBPROC __glewMinSampleShadingARB; + +GLEW_FUN_EXPORT PFNGLBINDSAMPLERPROC __glewBindSampler; +GLEW_FUN_EXPORT PFNGLDELETESAMPLERSPROC __glewDeleteSamplers; +GLEW_FUN_EXPORT PFNGLGENSAMPLERSPROC __glewGenSamplers; +GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIIVPROC __glewGetSamplerParameterIiv; +GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIUIVPROC __glewGetSamplerParameterIuiv; +GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERFVPROC __glewGetSamplerParameterfv; +GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIVPROC __glewGetSamplerParameteriv; +GLEW_FUN_EXPORT PFNGLISSAMPLERPROC __glewIsSampler; +GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIIVPROC __glewSamplerParameterIiv; +GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIUIVPROC __glewSamplerParameterIuiv; +GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERFPROC __glewSamplerParameterf; +GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERFVPROC __glewSamplerParameterfv; +GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIPROC __glewSamplerParameteri; +GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIVPROC __glewSamplerParameteriv; + +GLEW_FUN_EXPORT PFNGLACTIVESHADERPROGRAMPROC __glewActiveShaderProgram; +GLEW_FUN_EXPORT PFNGLBINDPROGRAMPIPELINEPROC __glewBindProgramPipeline; +GLEW_FUN_EXPORT PFNGLCREATESHADERPROGRAMVPROC __glewCreateShaderProgramv; +GLEW_FUN_EXPORT PFNGLDELETEPROGRAMPIPELINESPROC __glewDeleteProgramPipelines; +GLEW_FUN_EXPORT PFNGLGENPROGRAMPIPELINESPROC __glewGenProgramPipelines; +GLEW_FUN_EXPORT PFNGLGETPROGRAMPIPELINEINFOLOGPROC __glewGetProgramPipelineInfoLog; +GLEW_FUN_EXPORT PFNGLGETPROGRAMPIPELINEIVPROC __glewGetProgramPipelineiv; +GLEW_FUN_EXPORT PFNGLISPROGRAMPIPELINEPROC __glewIsProgramPipeline; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DPROC __glewProgramUniform1d; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DVPROC __glewProgramUniform1dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FPROC __glewProgramUniform1f; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FVPROC __glewProgramUniform1fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IPROC __glewProgramUniform1i; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IVPROC __glewProgramUniform1iv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIPROC __glewProgramUniform1ui; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIVPROC __glewProgramUniform1uiv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DPROC __glewProgramUniform2d; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DVPROC __glewProgramUniform2dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FPROC __glewProgramUniform2f; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FVPROC __glewProgramUniform2fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IPROC __glewProgramUniform2i; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IVPROC __glewProgramUniform2iv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIPROC __glewProgramUniform2ui; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIVPROC __glewProgramUniform2uiv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DPROC __glewProgramUniform3d; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DVPROC __glewProgramUniform3dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FPROC __glewProgramUniform3f; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FVPROC __glewProgramUniform3fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IPROC __glewProgramUniform3i; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IVPROC __glewProgramUniform3iv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIPROC __glewProgramUniform3ui; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIVPROC __glewProgramUniform3uiv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DPROC __glewProgramUniform4d; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DVPROC __glewProgramUniform4dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FPROC __glewProgramUniform4f; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FVPROC __glewProgramUniform4fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IPROC __glewProgramUniform4i; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IVPROC __glewProgramUniform4iv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIPROC __glewProgramUniform4ui; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIVPROC __glewProgramUniform4uiv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2DVPROC __glewProgramUniformMatrix2dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2FVPROC __glewProgramUniformMatrix2fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC __glewProgramUniformMatrix2x3dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC __glewProgramUniformMatrix2x3fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC __glewProgramUniformMatrix2x4dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC __glewProgramUniformMatrix2x4fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3DVPROC __glewProgramUniformMatrix3dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3FVPROC __glewProgramUniformMatrix3fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC __glewProgramUniformMatrix3x2dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC __glewProgramUniformMatrix3x2fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC __glewProgramUniformMatrix3x4dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC __glewProgramUniformMatrix3x4fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4DVPROC __glewProgramUniformMatrix4dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4FVPROC __glewProgramUniformMatrix4fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC __glewProgramUniformMatrix4x2dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC __glewProgramUniformMatrix4x2fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC __glewProgramUniformMatrix4x3dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC __glewProgramUniformMatrix4x3fv; +GLEW_FUN_EXPORT PFNGLUSEPROGRAMSTAGESPROC __glewUseProgramStages; +GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMPIPELINEPROC __glewValidateProgramPipeline; + +GLEW_FUN_EXPORT PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB; +GLEW_FUN_EXPORT PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB; +GLEW_FUN_EXPORT PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB; +GLEW_FUN_EXPORT PFNGLCREATESHADEROBJECTARBPROC __glewCreateShaderObjectARB; +GLEW_FUN_EXPORT PFNGLDELETEOBJECTARBPROC __glewDeleteObjectARB; +GLEW_FUN_EXPORT PFNGLDETACHOBJECTARBPROC __glewDetachObjectARB; +GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMARBPROC __glewGetActiveUniformARB; +GLEW_FUN_EXPORT PFNGLGETATTACHEDOBJECTSARBPROC __glewGetAttachedObjectsARB; +GLEW_FUN_EXPORT PFNGLGETHANDLEARBPROC __glewGetHandleARB; +GLEW_FUN_EXPORT PFNGLGETINFOLOGARBPROC __glewGetInfoLogARB; +GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERFVARBPROC __glewGetObjectParameterfvARB; +GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVARBPROC __glewGetObjectParameterivARB; +GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEARBPROC __glewGetShaderSourceARB; +GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONARBPROC __glewGetUniformLocationARB; +GLEW_FUN_EXPORT PFNGLGETUNIFORMFVARBPROC __glewGetUniformfvARB; +GLEW_FUN_EXPORT PFNGLGETUNIFORMIVARBPROC __glewGetUniformivARB; +GLEW_FUN_EXPORT PFNGLLINKPROGRAMARBPROC __glewLinkProgramARB; +GLEW_FUN_EXPORT PFNGLSHADERSOURCEARBPROC __glewShaderSourceARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1FARBPROC __glewUniform1fARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1FVARBPROC __glewUniform1fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1IARBPROC __glewUniform1iARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1IVARBPROC __glewUniform1ivARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2FARBPROC __glewUniform2fARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2FVARBPROC __glewUniform2fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2IARBPROC __glewUniform2iARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2IVARBPROC __glewUniform2ivARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3FARBPROC __glewUniform3fARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3FVARBPROC __glewUniform3fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3IARBPROC __glewUniform3iARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3IVARBPROC __glewUniform3ivARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4FARBPROC __glewUniform4fARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4FVARBPROC __glewUniform4fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4IARBPROC __glewUniform4iARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4IVARBPROC __glewUniform4ivARB; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVARBPROC __glewUniformMatrix2fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVARBPROC __glewUniformMatrix3fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB; +GLEW_FUN_EXPORT PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB; +GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB; + +GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINENAMEPROC __glewGetActiveSubroutineName; +GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC __glewGetActiveSubroutineUniformName; +GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC __glewGetActiveSubroutineUniformiv; +GLEW_FUN_EXPORT PFNGLGETPROGRAMSTAGEIVPROC __glewGetProgramStageiv; +GLEW_FUN_EXPORT PFNGLGETSUBROUTINEINDEXPROC __glewGetSubroutineIndex; +GLEW_FUN_EXPORT PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC __glewGetSubroutineUniformLocation; +GLEW_FUN_EXPORT PFNGLGETUNIFORMSUBROUTINEUIVPROC __glewGetUniformSubroutineuiv; +GLEW_FUN_EXPORT PFNGLUNIFORMSUBROUTINESUIVPROC __glewUniformSubroutinesuiv; + +GLEW_FUN_EXPORT PFNGLCOMPILESHADERINCLUDEARBPROC __glewCompileShaderIncludeARB; +GLEW_FUN_EXPORT PFNGLDELETENAMEDSTRINGARBPROC __glewDeleteNamedStringARB; +GLEW_FUN_EXPORT PFNGLGETNAMEDSTRINGARBPROC __glewGetNamedStringARB; +GLEW_FUN_EXPORT PFNGLGETNAMEDSTRINGIVARBPROC __glewGetNamedStringivARB; +GLEW_FUN_EXPORT PFNGLISNAMEDSTRINGARBPROC __glewIsNamedStringARB; +GLEW_FUN_EXPORT PFNGLNAMEDSTRINGARBPROC __glewNamedStringARB; + +GLEW_FUN_EXPORT PFNGLCLIENTWAITSYNCPROC __glewClientWaitSync; +GLEW_FUN_EXPORT PFNGLDELETESYNCPROC __glewDeleteSync; +GLEW_FUN_EXPORT PFNGLFENCESYNCPROC __glewFenceSync; +GLEW_FUN_EXPORT PFNGLGETINTEGER64VPROC __glewGetInteger64v; +GLEW_FUN_EXPORT PFNGLGETSYNCIVPROC __glewGetSynciv; +GLEW_FUN_EXPORT PFNGLISSYNCPROC __glewIsSync; +GLEW_FUN_EXPORT PFNGLWAITSYNCPROC __glewWaitSync; + +GLEW_FUN_EXPORT PFNGLPATCHPARAMETERFVPROC __glewPatchParameterfv; +GLEW_FUN_EXPORT PFNGLPATCHPARAMETERIPROC __glewPatchParameteri; + +GLEW_FUN_EXPORT PFNGLTEXBUFFERARBPROC __glewTexBufferARB; + +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DARBPROC __glewCompressedTexImage2DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DARBPROC __glewCompressedTexImage3DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __glewCompressedTexSubImage1DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB; +GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB; + +GLEW_FUN_EXPORT PFNGLGETMULTISAMPLEFVPROC __glewGetMultisamplefv; +GLEW_FUN_EXPORT PFNGLSAMPLEMASKIPROC __glewSampleMaski; +GLEW_FUN_EXPORT PFNGLTEXIMAGE2DMULTISAMPLEPROC __glewTexImage2DMultisample; +GLEW_FUN_EXPORT PFNGLTEXIMAGE3DMULTISAMPLEPROC __glewTexImage3DMultisample; + +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VPROC __glewGetQueryObjecti64v; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VPROC __glewGetQueryObjectui64v; +GLEW_FUN_EXPORT PFNGLQUERYCOUNTERPROC __glewQueryCounter; + +GLEW_FUN_EXPORT PFNGLBINDTRANSFORMFEEDBACKPROC __glewBindTransformFeedback; +GLEW_FUN_EXPORT PFNGLDELETETRANSFORMFEEDBACKSPROC __glewDeleteTransformFeedbacks; +GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKPROC __glewDrawTransformFeedback; +GLEW_FUN_EXPORT PFNGLGENTRANSFORMFEEDBACKSPROC __glewGenTransformFeedbacks; +GLEW_FUN_EXPORT PFNGLISTRANSFORMFEEDBACKPROC __glewIsTransformFeedback; +GLEW_FUN_EXPORT PFNGLPAUSETRANSFORMFEEDBACKPROC __glewPauseTransformFeedback; +GLEW_FUN_EXPORT PFNGLRESUMETRANSFORMFEEDBACKPROC __glewResumeTransformFeedback; + +GLEW_FUN_EXPORT PFNGLBEGINQUERYINDEXEDPROC __glewBeginQueryIndexed; +GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC __glewDrawTransformFeedbackStream; +GLEW_FUN_EXPORT PFNGLENDQUERYINDEXEDPROC __glewEndQueryIndexed; +GLEW_FUN_EXPORT PFNGLGETQUERYINDEXEDIVPROC __glewGetQueryIndexediv; + +GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB; +GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB; +GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB; +GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB; + +GLEW_FUN_EXPORT PFNGLBINDBUFFERBASEPROC __glewBindBufferBase; +GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGEPROC __glewBindBufferRange; +GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC __glewGetActiveUniformBlockName; +GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMBLOCKIVPROC __glewGetActiveUniformBlockiv; +GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMNAMEPROC __glewGetActiveUniformName; +GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMSIVPROC __glewGetActiveUniformsiv; +GLEW_FUN_EXPORT PFNGLGETINTEGERI_VPROC __glewGetIntegeri_v; +GLEW_FUN_EXPORT PFNGLGETUNIFORMBLOCKINDEXPROC __glewGetUniformBlockIndex; +GLEW_FUN_EXPORT PFNGLGETUNIFORMINDICESPROC __glewGetUniformIndices; +GLEW_FUN_EXPORT PFNGLUNIFORMBLOCKBINDINGPROC __glewUniformBlockBinding; + +GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYPROC __glewBindVertexArray; +GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSPROC __glewDeleteVertexArrays; +GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSPROC __glewGenVertexArrays; +GLEW_FUN_EXPORT PFNGLISVERTEXARRAYPROC __glewIsVertexArray; + +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLDVPROC __glewGetVertexAttribLdv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DPROC __glewVertexAttribL1d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DVPROC __glewVertexAttribL1dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DPROC __glewVertexAttribL2d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DVPROC __glewVertexAttribL2dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DPROC __glewVertexAttribL3d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DVPROC __glewVertexAttribL3dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DPROC __glewVertexAttribL4d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DVPROC __glewVertexAttribL4dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLPOINTERPROC __glewVertexAttribLPointer; + +GLEW_FUN_EXPORT PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB; +GLEW_FUN_EXPORT PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB; +GLEW_FUN_EXPORT PFNGLWEIGHTBVARBPROC __glewWeightbvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTDVARBPROC __glewWeightdvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTFVARBPROC __glewWeightfvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTIVARBPROC __glewWeightivARB; +GLEW_FUN_EXPORT PFNGLWEIGHTSVARBPROC __glewWeightsvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTUBVARBPROC __glewWeightubvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTUIVARBPROC __glewWeightuivARB; +GLEW_FUN_EXPORT PFNGLWEIGHTUSVARBPROC __glewWeightusvARB; + +GLEW_FUN_EXPORT PFNGLBINDBUFFERARBPROC __glewBindBufferARB; +GLEW_FUN_EXPORT PFNGLBUFFERDATAARBPROC __glewBufferDataARB; +GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAARBPROC __glewBufferSubDataARB; +GLEW_FUN_EXPORT PFNGLDELETEBUFFERSARBPROC __glewDeleteBuffersARB; +GLEW_FUN_EXPORT PFNGLGENBUFFERSARBPROC __glewGenBuffersARB; +GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVARBPROC __glewGetBufferParameterivARB; +GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVARBPROC __glewGetBufferPointervARB; +GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAARBPROC __glewGetBufferSubDataARB; +GLEW_FUN_EXPORT PFNGLISBUFFERARBPROC __glewIsBufferARB; +GLEW_FUN_EXPORT PFNGLMAPBUFFERARBPROC __glewMapBufferARB; +GLEW_FUN_EXPORT PFNGLUNMAPBUFFERARBPROC __glewUnmapBufferARB; + +GLEW_FUN_EXPORT PFNGLBINDPROGRAMARBPROC __glewBindProgramARB; +GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSARBPROC __glewDeleteProgramsARB; +GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYARBPROC __glewDisableVertexAttribArrayARB; +GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYARBPROC __glewEnableVertexAttribArrayARB; +GLEW_FUN_EXPORT PFNGLGENPROGRAMSARBPROC __glewGenProgramsARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERDVARBPROC __glewGetProgramEnvParameterdvARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERFVARBPROC __glewGetProgramEnvParameterfvARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC __glewGetProgramLocalParameterdvARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC __glewGetProgramLocalParameterfvARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGARBPROC __glewGetProgramStringARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMIVARBPROC __glewGetProgramivARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVARBPROC __glewGetVertexAttribPointervARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVARBPROC __glewGetVertexAttribdvARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVARBPROC __glewGetVertexAttribfvARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVARBPROC __glewGetVertexAttribivARB; +GLEW_FUN_EXPORT PFNGLISPROGRAMARBPROC __glewIsProgramARB; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DARBPROC __glewProgramEnvParameter4dARB; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DVARBPROC __glewProgramEnvParameter4dvARB; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FARBPROC __glewProgramEnvParameter4fARB; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FVARBPROC __glewProgramEnvParameter4fvARB; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DARBPROC __glewProgramLocalParameter4dARB; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DVARBPROC __glewProgramLocalParameter4dvARB; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FARBPROC __glewProgramLocalParameter4fARB; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FVARBPROC __glewProgramLocalParameter4fvARB; +GLEW_FUN_EXPORT PFNGLPROGRAMSTRINGARBPROC __glewProgramStringARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DARBPROC __glewVertexAttrib1dARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVARBPROC __glewVertexAttrib1dvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FARBPROC __glewVertexAttrib1fARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVARBPROC __glewVertexAttrib1fvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SARBPROC __glewVertexAttrib1sARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVARBPROC __glewVertexAttrib1svARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DARBPROC __glewVertexAttrib2dARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVARBPROC __glewVertexAttrib2dvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FARBPROC __glewVertexAttrib2fARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVARBPROC __glewVertexAttrib2fvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SARBPROC __glewVertexAttrib2sARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVARBPROC __glewVertexAttrib2svARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DARBPROC __glewVertexAttrib3dARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVARBPROC __glewVertexAttrib3dvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FARBPROC __glewVertexAttrib3fARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVARBPROC __glewVertexAttrib3fvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SARBPROC __glewVertexAttrib3sARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVARBPROC __glewVertexAttrib3svARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVARBPROC __glewVertexAttrib4NbvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVARBPROC __glewVertexAttrib4NivARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVARBPROC __glewVertexAttrib4NsvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBARBPROC __glewVertexAttrib4NubARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVARBPROC __glewVertexAttrib4NubvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVARBPROC __glewVertexAttrib4NuivARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVARBPROC __glewVertexAttrib4NusvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVARBPROC __glewVertexAttrib4bvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DARBPROC __glewVertexAttrib4dARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVARBPROC __glewVertexAttrib4dvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FARBPROC __glewVertexAttrib4fARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVARBPROC __glewVertexAttrib4fvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVARBPROC __glewVertexAttrib4ivARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SARBPROC __glewVertexAttrib4sARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVARBPROC __glewVertexAttrib4svARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVARBPROC __glewVertexAttrib4ubvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVARBPROC __glewVertexAttrib4uivARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVARBPROC __glewVertexAttrib4usvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERARBPROC __glewVertexAttribPointerARB; + +GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB; +GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB; +GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB; + +GLEW_FUN_EXPORT PFNGLCOLORP3UIPROC __glewColorP3ui; +GLEW_FUN_EXPORT PFNGLCOLORP3UIVPROC __glewColorP3uiv; +GLEW_FUN_EXPORT PFNGLCOLORP4UIPROC __glewColorP4ui; +GLEW_FUN_EXPORT PFNGLCOLORP4UIVPROC __glewColorP4uiv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP1UIPROC __glewMultiTexCoordP1ui; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP1UIVPROC __glewMultiTexCoordP1uiv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP2UIPROC __glewMultiTexCoordP2ui; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP2UIVPROC __glewMultiTexCoordP2uiv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP3UIPROC __glewMultiTexCoordP3ui; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP3UIVPROC __glewMultiTexCoordP3uiv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP4UIPROC __glewMultiTexCoordP4ui; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP4UIVPROC __glewMultiTexCoordP4uiv; +GLEW_FUN_EXPORT PFNGLNORMALP3UIPROC __glewNormalP3ui; +GLEW_FUN_EXPORT PFNGLNORMALP3UIVPROC __glewNormalP3uiv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORP3UIPROC __glewSecondaryColorP3ui; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORP3UIVPROC __glewSecondaryColorP3uiv; +GLEW_FUN_EXPORT PFNGLTEXCOORDP1UIPROC __glewTexCoordP1ui; +GLEW_FUN_EXPORT PFNGLTEXCOORDP1UIVPROC __glewTexCoordP1uiv; +GLEW_FUN_EXPORT PFNGLTEXCOORDP2UIPROC __glewTexCoordP2ui; +GLEW_FUN_EXPORT PFNGLTEXCOORDP2UIVPROC __glewTexCoordP2uiv; +GLEW_FUN_EXPORT PFNGLTEXCOORDP3UIPROC __glewTexCoordP3ui; +GLEW_FUN_EXPORT PFNGLTEXCOORDP3UIVPROC __glewTexCoordP3uiv; +GLEW_FUN_EXPORT PFNGLTEXCOORDP4UIPROC __glewTexCoordP4ui; +GLEW_FUN_EXPORT PFNGLTEXCOORDP4UIVPROC __glewTexCoordP4uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP1UIPROC __glewVertexAttribP1ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP1UIVPROC __glewVertexAttribP1uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP2UIPROC __glewVertexAttribP2ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP2UIVPROC __glewVertexAttribP2uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP3UIPROC __glewVertexAttribP3ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP3UIVPROC __glewVertexAttribP3uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP4UIPROC __glewVertexAttribP4ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP4UIVPROC __glewVertexAttribP4uiv; +GLEW_FUN_EXPORT PFNGLVERTEXP2UIPROC __glewVertexP2ui; +GLEW_FUN_EXPORT PFNGLVERTEXP2UIVPROC __glewVertexP2uiv; +GLEW_FUN_EXPORT PFNGLVERTEXP3UIPROC __glewVertexP3ui; +GLEW_FUN_EXPORT PFNGLVERTEXP3UIVPROC __glewVertexP3uiv; +GLEW_FUN_EXPORT PFNGLVERTEXP4UIPROC __glewVertexP4ui; +GLEW_FUN_EXPORT PFNGLVERTEXP4UIVPROC __glewVertexP4uiv; + +GLEW_FUN_EXPORT PFNGLDEPTHRANGEARRAYVPROC __glewDepthRangeArrayv; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEINDEXEDPROC __glewDepthRangeIndexed; +GLEW_FUN_EXPORT PFNGLGETDOUBLEI_VPROC __glewGetDoublei_v; +GLEW_FUN_EXPORT PFNGLGETFLOATI_VPROC __glewGetFloati_v; +GLEW_FUN_EXPORT PFNGLSCISSORARRAYVPROC __glewScissorArrayv; +GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDPROC __glewScissorIndexed; +GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDVPROC __glewScissorIndexedv; +GLEW_FUN_EXPORT PFNGLVIEWPORTARRAYVPROC __glewViewportArrayv; +GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFPROC __glewViewportIndexedf; +GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFVPROC __glewViewportIndexedfv; + +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVARBPROC __glewWindowPos2fvARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IARBPROC __glewWindowPos2iARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVARBPROC __glewWindowPos2ivARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SARBPROC __glewWindowPos2sARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVARBPROC __glewWindowPos2svARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DARBPROC __glewWindowPos3dARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVARBPROC __glewWindowPos3dvARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FARBPROC __glewWindowPos3fARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVARBPROC __glewWindowPos3fvARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IARBPROC __glewWindowPos3iARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVARBPROC __glewWindowPos3ivARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SARBPROC __glewWindowPos3sARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVARBPROC __glewWindowPos3svARB; + +GLEW_FUN_EXPORT PFNGLDRAWBUFFERSATIPROC __glewDrawBuffersATI; + +GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYATIPROC __glewDrawElementArrayATI; +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYATIPROC __glewDrawRangeElementArrayATI; +GLEW_FUN_EXPORT PFNGLELEMENTPOINTERATIPROC __glewElementPointerATI; + +GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERFVATIPROC __glewGetTexBumpParameterfvATI; +GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERIVATIPROC __glewGetTexBumpParameterivATI; +GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERFVATIPROC __glewTexBumpParameterfvATI; +GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERIVATIPROC __glewTexBumpParameterivATI; + +GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP1ATIPROC __glewAlphaFragmentOp1ATI; +GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP2ATIPROC __glewAlphaFragmentOp2ATI; +GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP3ATIPROC __glewAlphaFragmentOp3ATI; +GLEW_FUN_EXPORT PFNGLBEGINFRAGMENTSHADERATIPROC __glewBeginFragmentShaderATI; +GLEW_FUN_EXPORT PFNGLBINDFRAGMENTSHADERATIPROC __glewBindFragmentShaderATI; +GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP1ATIPROC __glewColorFragmentOp1ATI; +GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP2ATIPROC __glewColorFragmentOp2ATI; +GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP3ATIPROC __glewColorFragmentOp3ATI; +GLEW_FUN_EXPORT PFNGLDELETEFRAGMENTSHADERATIPROC __glewDeleteFragmentShaderATI; +GLEW_FUN_EXPORT PFNGLENDFRAGMENTSHADERATIPROC __glewEndFragmentShaderATI; +GLEW_FUN_EXPORT PFNGLGENFRAGMENTSHADERSATIPROC __glewGenFragmentShadersATI; +GLEW_FUN_EXPORT PFNGLPASSTEXCOORDATIPROC __glewPassTexCoordATI; +GLEW_FUN_EXPORT PFNGLSAMPLEMAPATIPROC __glewSampleMapATI; +GLEW_FUN_EXPORT PFNGLSETFRAGMENTSHADERCONSTANTATIPROC __glewSetFragmentShaderConstantATI; + +GLEW_FUN_EXPORT PFNGLMAPOBJECTBUFFERATIPROC __glewMapObjectBufferATI; +GLEW_FUN_EXPORT PFNGLUNMAPOBJECTBUFFERATIPROC __glewUnmapObjectBufferATI; + +GLEW_FUN_EXPORT PFNGLPNTRIANGLESFATIPROC __glPNTrianglewesfATI; +GLEW_FUN_EXPORT PFNGLPNTRIANGLESIATIPROC __glPNTrianglewesiATI; + +GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEATIPROC __glewStencilFuncSeparateATI; +GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEATIPROC __glewStencilOpSeparateATI; + +GLEW_FUN_EXPORT PFNGLARRAYOBJECTATIPROC __glewArrayObjectATI; +GLEW_FUN_EXPORT PFNGLFREEOBJECTBUFFERATIPROC __glewFreeObjectBufferATI; +GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTFVATIPROC __glewGetArrayObjectfvATI; +GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTIVATIPROC __glewGetArrayObjectivATI; +GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERFVATIPROC __glewGetObjectBufferfvATI; +GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERIVATIPROC __glewGetObjectBufferivATI; +GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTFVATIPROC __glewGetVariantArrayObjectfvATI; +GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTIVATIPROC __glewGetVariantArrayObjectivATI; +GLEW_FUN_EXPORT PFNGLISOBJECTBUFFERATIPROC __glewIsObjectBufferATI; +GLEW_FUN_EXPORT PFNGLNEWOBJECTBUFFERATIPROC __glewNewObjectBufferATI; +GLEW_FUN_EXPORT PFNGLUPDATEOBJECTBUFFERATIPROC __glewUpdateObjectBufferATI; +GLEW_FUN_EXPORT PFNGLVARIANTARRAYOBJECTATIPROC __glewVariantArrayObjectATI; + +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC __glewGetVertexAttribArrayObjectfvATI; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC __glewGetVertexAttribArrayObjectivATI; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBARRAYOBJECTATIPROC __glewVertexAttribArrayObjectATI; + +GLEW_FUN_EXPORT PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC __glewClientActiveVertexStreamATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BATIPROC __glewNormalStream3bATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BVATIPROC __glewNormalStream3bvATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DATIPROC __glewNormalStream3dATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DVATIPROC __glewNormalStream3dvATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FATIPROC __glewNormalStream3fATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FVATIPROC __glewNormalStream3fvATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IATIPROC __glewNormalStream3iATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IVATIPROC __glewNormalStream3ivATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SATIPROC __glewNormalStream3sATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SVATIPROC __glewNormalStream3svATI; +GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVFATIPROC __glewVertexBlendEnvfATI; +GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVIATIPROC __glewVertexBlendEnviATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DATIPROC __glewVertexStream2dATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DVATIPROC __glewVertexStream2dvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FATIPROC __glewVertexStream2fATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FVATIPROC __glewVertexStream2fvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IATIPROC __glewVertexStream2iATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IVATIPROC __glewVertexStream2ivATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SATIPROC __glewVertexStream2sATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SVATIPROC __glewVertexStream2svATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DATIPROC __glewVertexStream3dATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DVATIPROC __glewVertexStream3dvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FATIPROC __glewVertexStream3fATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FVATIPROC __glewVertexStream3fvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IATIPROC __glewVertexStream3iATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IVATIPROC __glewVertexStream3ivATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SATIPROC __glewVertexStream3sATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SVATIPROC __glewVertexStream3svATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DATIPROC __glewVertexStream4dATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DVATIPROC __glewVertexStream4dvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FATIPROC __glewVertexStream4fATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FVATIPROC __glewVertexStream4fvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IATIPROC __glewVertexStream4iATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IVATIPROC __glewVertexStream4ivATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SATIPROC __glewVertexStream4sATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SVATIPROC __glewVertexStream4svATI; + +GLEW_FUN_EXPORT PFNGLGETUNIFORMBUFFERSIZEEXTPROC __glewGetUniformBufferSizeEXT; +GLEW_FUN_EXPORT PFNGLGETUNIFORMOFFSETEXTPROC __glewGetUniformOffsetEXT; +GLEW_FUN_EXPORT PFNGLUNIFORMBUFFEREXTPROC __glewUniformBufferEXT; + +GLEW_FUN_EXPORT PFNGLBLENDCOLOREXTPROC __glewBlendColorEXT; + +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEEXTPROC __glewBlendEquationSeparateEXT; + +GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT; + +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT; + +GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEEXTPROC __glewColorSubTableEXT; +GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEEXTPROC __glewCopyColorSubTableEXT; + +GLEW_FUN_EXPORT PFNGLLOCKARRAYSEXTPROC __glewLockArraysEXT; +GLEW_FUN_EXPORT PFNGLUNLOCKARRAYSEXTPROC __glewUnlockArraysEXT; + +GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DEXTPROC __glewConvolutionFilter1DEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DEXTPROC __glewConvolutionFilter2DEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFEXTPROC __glewConvolutionParameterfEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVEXTPROC __glewConvolutionParameterfvEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIEXTPROC __glewConvolutionParameteriEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVEXTPROC __glewConvolutionParameterivEXT; +GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC __glewCopyConvolutionFilter1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC __glewCopyConvolutionFilter2DEXT; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTEREXTPROC __glewGetConvolutionFilterEXT; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC __glewGetConvolutionParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC __glewGetConvolutionParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTEREXTPROC __glewGetSeparableFilterEXT; +GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DEXTPROC __glewSeparableFilter2DEXT; + +GLEW_FUN_EXPORT PFNGLBINORMALPOINTEREXTPROC __glewBinormalPointerEXT; +GLEW_FUN_EXPORT PFNGLTANGENTPOINTEREXTPROC __glewTangentPointerEXT; + +GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE1DEXTPROC __glewCopyTexImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE2DEXTPROC __glewCopyTexImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE1DEXTPROC __glewCopyTexSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE2DEXTPROC __glewCopyTexSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DEXTPROC __glewCopyTexSubImage3DEXT; + +GLEW_FUN_EXPORT PFNGLCULLPARAMETERDVEXTPROC __glewCullParameterdvEXT; +GLEW_FUN_EXPORT PFNGLCULLPARAMETERFVEXTPROC __glewCullParameterfvEXT; + +GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSEXTPROC __glewDepthBoundsEXT; + +GLEW_FUN_EXPORT PFNGLBINDMULTITEXTUREEXTPROC __glewBindMultiTextureEXT; +GLEW_FUN_EXPORT PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC __glewCheckNamedFramebufferStatusEXT; +GLEW_FUN_EXPORT PFNGLCLIENTATTRIBDEFAULTEXTPROC __glewClientAttribDefaultEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC __glewCompressedMultiTexImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC __glewCompressedMultiTexImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC __glewCompressedMultiTexImage3DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC __glewCompressedMultiTexSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC __glewCompressedMultiTexSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC __glewCompressedMultiTexSubImage3DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC __glewCompressedTextureImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC __glewCompressedTextureImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC __glewCompressedTextureImage3DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC __glewCompressedTextureSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC __glewCompressedTextureSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC __glewCompressedTextureSubImage3DEXT; +GLEW_FUN_EXPORT PFNGLCOPYMULTITEXIMAGE1DEXTPROC __glewCopyMultiTexImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYMULTITEXIMAGE2DEXTPROC __glewCopyMultiTexImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC __glewCopyMultiTexSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC __glewCopyMultiTexSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC __glewCopyMultiTexSubImage3DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXTUREIMAGE1DEXTPROC __glewCopyTextureImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXTUREIMAGE2DEXTPROC __glewCopyTextureImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC __glewCopyTextureSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC __glewCopyTextureSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC __glewCopyTextureSubImage3DEXT; +GLEW_FUN_EXPORT PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC __glewDisableClientStateIndexedEXT; +GLEW_FUN_EXPORT PFNGLDISABLECLIENTSTATEIEXTPROC __glewDisableClientStateiEXT; +GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC __glewDisableVertexArrayAttribEXT; +GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYEXTPROC __glewDisableVertexArrayEXT; +GLEW_FUN_EXPORT PFNGLENABLECLIENTSTATEINDEXEDEXTPROC __glewEnableClientStateIndexedEXT; +GLEW_FUN_EXPORT PFNGLENABLECLIENTSTATEIEXTPROC __glewEnableClientStateiEXT; +GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYATTRIBEXTPROC __glewEnableVertexArrayAttribEXT; +GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYEXTPROC __glewEnableVertexArrayEXT; +GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC __glewFlushMappedNamedBufferRangeEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC __glewFramebufferDrawBufferEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC __glewFramebufferDrawBuffersEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERREADBUFFEREXTPROC __glewFramebufferReadBufferEXT; +GLEW_FUN_EXPORT PFNGLGENERATEMULTITEXMIPMAPEXTPROC __glewGenerateMultiTexMipmapEXT; +GLEW_FUN_EXPORT PFNGLGENERATETEXTUREMIPMAPEXTPROC __glewGenerateTextureMipmapEXT; +GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC __glewGetCompressedMultiTexImageEXT; +GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC __glewGetCompressedTextureImageEXT; +GLEW_FUN_EXPORT PFNGLGETDOUBLEINDEXEDVEXTPROC __glewGetDoubleIndexedvEXT; +GLEW_FUN_EXPORT PFNGLGETDOUBLEI_VEXTPROC __glewGetDoublei_vEXT; +GLEW_FUN_EXPORT PFNGLGETFLOATINDEXEDVEXTPROC __glewGetFloatIndexedvEXT; +GLEW_FUN_EXPORT PFNGLGETFLOATI_VEXTPROC __glewGetFloati_vEXT; +GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC __glewGetFramebufferParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXENVFVEXTPROC __glewGetMultiTexEnvfvEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXENVIVEXTPROC __glewGetMultiTexEnvivEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXGENDVEXTPROC __glewGetMultiTexGendvEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXGENFVEXTPROC __glewGetMultiTexGenfvEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXGENIVEXTPROC __glewGetMultiTexGenivEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXIMAGEEXTPROC __glewGetMultiTexImageEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC __glewGetMultiTexLevelParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC __glewGetMultiTexLevelParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIIVEXTPROC __glewGetMultiTexParameterIivEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIUIVEXTPROC __glewGetMultiTexParameterIuivEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERFVEXTPROC __glewGetMultiTexParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIVEXTPROC __glewGetMultiTexParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC __glewGetNamedBufferParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPOINTERVEXTPROC __glewGetNamedBufferPointervEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERSUBDATAEXTPROC __glewGetNamedBufferSubDataEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetNamedFramebufferAttachmentParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC __glewGetNamedProgramLocalParameterIivEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC __glewGetNamedProgramLocalParameterIuivEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC __glewGetNamedProgramLocalParameterdvEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC __glewGetNamedProgramLocalParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMSTRINGEXTPROC __glewGetNamedProgramStringEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMIVEXTPROC __glewGetNamedProgramivEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC __glewGetNamedRenderbufferParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETPOINTERINDEXEDVEXTPROC __glewGetPointerIndexedvEXT; +GLEW_FUN_EXPORT PFNGLGETPOINTERI_VEXTPROC __glewGetPointeri_vEXT; +GLEW_FUN_EXPORT PFNGLGETTEXTUREIMAGEEXTPROC __glewGetTextureImageEXT; +GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC __glewGetTextureLevelParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC __glewGetTextureLevelParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIIVEXTPROC __glewGetTextureParameterIivEXT; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIUIVEXTPROC __glewGetTextureParameterIuivEXT; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERFVEXTPROC __glewGetTextureParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIVEXTPROC __glewGetTextureParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC __glewGetVertexArrayIntegeri_vEXT; +GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINTEGERVEXTPROC __glewGetVertexArrayIntegervEXT; +GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC __glewGetVertexArrayPointeri_vEXT; +GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYPOINTERVEXTPROC __glewGetVertexArrayPointervEXT; +GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFEREXTPROC __glewMapNamedBufferEXT; +GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERRANGEEXTPROC __glewMapNamedBufferRangeEXT; +GLEW_FUN_EXPORT PFNGLMATRIXFRUSTUMEXTPROC __glewMatrixFrustumEXT; +GLEW_FUN_EXPORT PFNGLMATRIXLOADIDENTITYEXTPROC __glewMatrixLoadIdentityEXT; +GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSEDEXTPROC __glewMatrixLoadTransposedEXT; +GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSEFEXTPROC __glewMatrixLoadTransposefEXT; +GLEW_FUN_EXPORT PFNGLMATRIXLOADDEXTPROC __glewMatrixLoaddEXT; +GLEW_FUN_EXPORT PFNGLMATRIXLOADFEXTPROC __glewMatrixLoadfEXT; +GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSEDEXTPROC __glewMatrixMultTransposedEXT; +GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSEFEXTPROC __glewMatrixMultTransposefEXT; +GLEW_FUN_EXPORT PFNGLMATRIXMULTDEXTPROC __glewMatrixMultdEXT; +GLEW_FUN_EXPORT PFNGLMATRIXMULTFEXTPROC __glewMatrixMultfEXT; +GLEW_FUN_EXPORT PFNGLMATRIXORTHOEXTPROC __glewMatrixOrthoEXT; +GLEW_FUN_EXPORT PFNGLMATRIXPOPEXTPROC __glewMatrixPopEXT; +GLEW_FUN_EXPORT PFNGLMATRIXPUSHEXTPROC __glewMatrixPushEXT; +GLEW_FUN_EXPORT PFNGLMATRIXROTATEDEXTPROC __glewMatrixRotatedEXT; +GLEW_FUN_EXPORT PFNGLMATRIXROTATEFEXTPROC __glewMatrixRotatefEXT; +GLEW_FUN_EXPORT PFNGLMATRIXSCALEDEXTPROC __glewMatrixScaledEXT; +GLEW_FUN_EXPORT PFNGLMATRIXSCALEFEXTPROC __glewMatrixScalefEXT; +GLEW_FUN_EXPORT PFNGLMATRIXTRANSLATEDEXTPROC __glewMatrixTranslatedEXT; +GLEW_FUN_EXPORT PFNGLMATRIXTRANSLATEFEXTPROC __glewMatrixTranslatefEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXBUFFEREXTPROC __glewMultiTexBufferEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDPOINTEREXTPROC __glewMultiTexCoordPointerEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXENVFEXTPROC __glewMultiTexEnvfEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXENVFVEXTPROC __glewMultiTexEnvfvEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXENVIEXTPROC __glewMultiTexEnviEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXENVIVEXTPROC __glewMultiTexEnvivEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXGENDEXTPROC __glewMultiTexGendEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXGENDVEXTPROC __glewMultiTexGendvEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXGENFEXTPROC __glewMultiTexGenfEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXGENFVEXTPROC __glewMultiTexGenfvEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXGENIEXTPROC __glewMultiTexGeniEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXGENIVEXTPROC __glewMultiTexGenivEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE1DEXTPROC __glewMultiTexImage1DEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE2DEXTPROC __glewMultiTexImage2DEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE3DEXTPROC __glewMultiTexImage3DEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIIVEXTPROC __glewMultiTexParameterIivEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIUIVEXTPROC __glewMultiTexParameterIuivEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERFEXTPROC __glewMultiTexParameterfEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERFVEXTPROC __glewMultiTexParameterfvEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIEXTPROC __glewMultiTexParameteriEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIVEXTPROC __glewMultiTexParameterivEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXRENDERBUFFEREXTPROC __glewMultiTexRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE1DEXTPROC __glewMultiTexSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE2DEXTPROC __glewMultiTexSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE3DEXTPROC __glewMultiTexSubImage3DEXT; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERDATAEXTPROC __glewNamedBufferDataEXT; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSUBDATAEXTPROC __glewNamedBufferSubDataEXT; +GLEW_FUN_EXPORT PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC __glewNamedCopyBufferSubDataEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC __glewNamedFramebufferRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC __glewNamedFramebufferTexture1DEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC __glewNamedFramebufferTexture2DEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC __glewNamedFramebufferTexture3DEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC __glewNamedFramebufferTextureEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC __glewNamedFramebufferTextureFaceEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC __glewNamedFramebufferTextureLayerEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC __glewNamedProgramLocalParameter4dEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC __glewNamedProgramLocalParameter4dvEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC __glewNamedProgramLocalParameter4fEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC __glewNamedProgramLocalParameter4fvEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC __glewNamedProgramLocalParameterI4iEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC __glewNamedProgramLocalParameterI4ivEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC __glewNamedProgramLocalParameterI4uiEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC __glewNamedProgramLocalParameterI4uivEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC __glewNamedProgramLocalParameters4fvEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC __glewNamedProgramLocalParametersI4ivEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC __glewNamedProgramLocalParametersI4uivEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMSTRINGEXTPROC __glewNamedProgramStringEXT; +GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC __glewNamedRenderbufferStorageEXT; +GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC __glewNamedRenderbufferStorageMultisampleCoverageEXT; +GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewNamedRenderbufferStorageMultisampleEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FEXTPROC __glewProgramUniform1fEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FVEXTPROC __glewProgramUniform1fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IEXTPROC __glewProgramUniform1iEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IVEXTPROC __glewProgramUniform1ivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIEXTPROC __glewProgramUniform1uiEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIVEXTPROC __glewProgramUniform1uivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FEXTPROC __glewProgramUniform2fEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FVEXTPROC __glewProgramUniform2fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IEXTPROC __glewProgramUniform2iEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IVEXTPROC __glewProgramUniform2ivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIEXTPROC __glewProgramUniform2uiEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIVEXTPROC __glewProgramUniform2uivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FEXTPROC __glewProgramUniform3fEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FVEXTPROC __glewProgramUniform3fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IEXTPROC __glewProgramUniform3iEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IVEXTPROC __glewProgramUniform3ivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIEXTPROC __glewProgramUniform3uiEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIVEXTPROC __glewProgramUniform3uivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FEXTPROC __glewProgramUniform4fEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FVEXTPROC __glewProgramUniform4fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IEXTPROC __glewProgramUniform4iEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IVEXTPROC __glewProgramUniform4ivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIEXTPROC __glewProgramUniform4uiEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIVEXTPROC __glewProgramUniform4uivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC __glewProgramUniformMatrix2fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __glewProgramUniformMatrix2x3fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __glewProgramUniformMatrix2x4fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC __glewProgramUniformMatrix3fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __glewProgramUniformMatrix3x2fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __glewProgramUniformMatrix3x4fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC __glewProgramUniformMatrix4fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __glewProgramUniformMatrix4x2fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __glewProgramUniformMatrix4x3fvEXT; +GLEW_FUN_EXPORT PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC __glewPushClientAttribDefaultEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREBUFFEREXTPROC __glewTextureBufferEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE1DEXTPROC __glewTextureImage1DEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DEXTPROC __glewTextureImage2DEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DEXTPROC __glewTextureImage3DEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIIVEXTPROC __glewTextureParameterIivEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIUIVEXTPROC __glewTextureParameterIuivEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFEXTPROC __glewTextureParameterfEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFVEXTPROC __glewTextureParameterfvEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIEXTPROC __glewTextureParameteriEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIVEXTPROC __glewTextureParameterivEXT; +GLEW_FUN_EXPORT PFNGLTEXTURERENDERBUFFEREXTPROC __glewTextureRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE1DEXTPROC __glewTextureSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE2DEXTPROC __glewTextureSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE3DEXTPROC __glewTextureSubImage3DEXT; +GLEW_FUN_EXPORT PFNGLUNMAPNAMEDBUFFEREXTPROC __glewUnmapNamedBufferEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYCOLOROFFSETEXTPROC __glewVertexArrayColorOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC __glewVertexArrayEdgeFlagOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC __glewVertexArrayFogCoordOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYINDEXOFFSETEXTPROC __glewVertexArrayIndexOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC __glewVertexArrayMultiTexCoordOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYNORMALOFFSETEXTPROC __glewVertexArrayNormalOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC __glewVertexArraySecondaryColorOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC __glewVertexArrayTexCoordOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC __glewVertexArrayVertexAttribIOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC __glewVertexArrayVertexAttribOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC __glewVertexArrayVertexOffsetEXT; + +GLEW_FUN_EXPORT PFNGLCOLORMASKINDEXEDEXTPROC __glewColorMaskIndexedEXT; +GLEW_FUN_EXPORT PFNGLDISABLEINDEXEDEXTPROC __glewDisableIndexedEXT; +GLEW_FUN_EXPORT PFNGLENABLEINDEXEDEXTPROC __glewEnableIndexedEXT; +GLEW_FUN_EXPORT PFNGLGETBOOLEANINDEXEDVEXTPROC __glewGetBooleanIndexedvEXT; +GLEW_FUN_EXPORT PFNGLGETINTEGERINDEXEDVEXTPROC __glewGetIntegerIndexedvEXT; +GLEW_FUN_EXPORT PFNGLISENABLEDINDEXEDEXTPROC __glewIsEnabledIndexedEXT; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDEXTPROC __glewDrawArraysInstancedEXT; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDEXTPROC __glewDrawElementsInstancedEXT; + +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT; + +GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTEREXTPROC __glewFogCoordPointerEXT; +GLEW_FUN_EXPORT PFNGLFOGCOORDDEXTPROC __glewFogCoorddEXT; +GLEW_FUN_EXPORT PFNGLFOGCOORDDVEXTPROC __glewFogCoorddvEXT; +GLEW_FUN_EXPORT PFNGLFOGCOORDFEXTPROC __glewFogCoordfEXT; +GLEW_FUN_EXPORT PFNGLFOGCOORDFVEXTPROC __glewFogCoordfvEXT; + +GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALEXTPROC __glewFragmentColorMaterialEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFEXTPROC __glewFragmentLightModelfEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVEXTPROC __glewFragmentLightModelfvEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIEXTPROC __glewFragmentLightModeliEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVEXTPROC __glewFragmentLightModelivEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFEXTPROC __glewFragmentLightfEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVEXTPROC __glewFragmentLightfvEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIEXTPROC __glewFragmentLightiEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVEXTPROC __glewFragmentLightivEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFEXTPROC __glewFragmentMaterialfEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVEXTPROC __glewFragmentMaterialfvEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIEXTPROC __glewFragmentMaterialiEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVEXTPROC __glewFragmentMaterialivEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVEXTPROC __glewGetFragmentLightfvEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVEXTPROC __glewGetFragmentLightivEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVEXTPROC __glewGetFragmentMaterialfvEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVEXTPROC __glewGetFragmentMaterialivEXT; +GLEW_FUN_EXPORT PFNGLLIGHTENVIEXTPROC __glewLightEnviEXT; + +GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFEREXTPROC __glewBlitFramebufferEXT; + +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewRenderbufferStorageMultisampleEXT; + +GLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFEREXTPROC __glewBindFramebufferEXT; +GLEW_FUN_EXPORT PFNGLBINDRENDERBUFFEREXTPROC __glewBindRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC __glewCheckFramebufferStatusEXT; +GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSEXTPROC __glewDeleteFramebuffersEXT; +GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSEXTPROC __glewDeleteRenderbuffersEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC __glewFramebufferRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DEXTPROC __glewFramebufferTexture1DEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DEXTPROC __glewFramebufferTexture2DEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DEXTPROC __glewFramebufferTexture3DEXT; +GLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSEXTPROC __glewGenFramebuffersEXT; +GLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSEXTPROC __glewGenRenderbuffersEXT; +GLEW_FUN_EXPORT PFNGLGENERATEMIPMAPEXTPROC __glewGenerateMipmapEXT; +GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetFramebufferAttachmentParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC __glewGetRenderbufferParameterivEXT; +GLEW_FUN_EXPORT PFNGLISFRAMEBUFFEREXTPROC __glewIsFramebufferEXT; +GLEW_FUN_EXPORT PFNGLISRENDERBUFFEREXTPROC __glewIsRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEEXTPROC __glewRenderbufferStorageEXT; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREEXTPROC __glewFramebufferTextureEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC __glewFramebufferTextureFaceEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC __glewFramebufferTextureLayerEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIEXTPROC __glewProgramParameteriEXT; + +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERS4FVEXTPROC __glewProgramEnvParameters4fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC __glewProgramLocalParameters4fvEXT; + +GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONEXTPROC __glewBindFragDataLocationEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONEXTPROC __glewGetFragDataLocationEXT; +GLEW_FUN_EXPORT PFNGLGETUNIFORMUIVEXTPROC __glewGetUniformuivEXT; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIIVEXTPROC __glewGetVertexAttribIivEXT; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIUIVEXTPROC __glewGetVertexAttribIuivEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM1UIEXTPROC __glewUniform1uiEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM1UIVEXTPROC __glewUniform1uivEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM2UIEXTPROC __glewUniform2uiEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM2UIVEXTPROC __glewUniform2uivEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM3UIEXTPROC __glewUniform3uiEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM3UIVEXTPROC __glewUniform3uivEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM4UIEXTPROC __glewUniform4uiEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM4UIVEXTPROC __glewUniform4uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IEXTPROC __glewVertexAttribI1iEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IVEXTPROC __glewVertexAttribI1ivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIEXTPROC __glewVertexAttribI1uiEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIVEXTPROC __glewVertexAttribI1uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IEXTPROC __glewVertexAttribI2iEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IVEXTPROC __glewVertexAttribI2ivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIEXTPROC __glewVertexAttribI2uiEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIVEXTPROC __glewVertexAttribI2uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IEXTPROC __glewVertexAttribI3iEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IVEXTPROC __glewVertexAttribI3ivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIEXTPROC __glewVertexAttribI3uiEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIVEXTPROC __glewVertexAttribI3uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4BVEXTPROC __glewVertexAttribI4bvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IEXTPROC __glewVertexAttribI4iEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IVEXTPROC __glewVertexAttribI4ivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4SVEXTPROC __glewVertexAttribI4svEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UBVEXTPROC __glewVertexAttribI4ubvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIEXTPROC __glewVertexAttribI4uiEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVEXTPROC __glewVertexAttribI4uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVEXTPROC __glewVertexAttribI4usvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTEREXTPROC __glewVertexAttribIPointerEXT; + +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMEXTPROC __glewGetHistogramEXT; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVEXTPROC __glewGetHistogramParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVEXTPROC __glewGetHistogramParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETMINMAXEXTPROC __glewGetMinmaxEXT; +GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVEXTPROC __glewGetMinmaxParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVEXTPROC __glewGetMinmaxParameterivEXT; +GLEW_FUN_EXPORT PFNGLHISTOGRAMEXTPROC __glewHistogramEXT; +GLEW_FUN_EXPORT PFNGLMINMAXEXTPROC __glewMinmaxEXT; +GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMEXTPROC __glewResetHistogramEXT; +GLEW_FUN_EXPORT PFNGLRESETMINMAXEXTPROC __glewResetMinmaxEXT; + +GLEW_FUN_EXPORT PFNGLINDEXFUNCEXTPROC __glewIndexFuncEXT; + +GLEW_FUN_EXPORT PFNGLINDEXMATERIALEXTPROC __glewIndexMaterialEXT; + +GLEW_FUN_EXPORT PFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT; +GLEW_FUN_EXPORT PFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT; + +GLEW_FUN_EXPORT PFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT; +GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT; + +GLEW_FUN_EXPORT PFNGLCOLORTABLEEXTPROC __glewColorTableEXT; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEEXTPROC __glewGetColorTableEXT; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVEXTPROC __glewGetColorTableParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVEXTPROC __glewGetColorTableParameterivEXT; + +GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC __glewGetPixelTransformParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC __glewGetPixelTransformParameterivEXT; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFEXTPROC __glewPixelTransformParameterfEXT; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC __glewPixelTransformParameterfvEXT; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIEXTPROC __glewPixelTransformParameteriEXT; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC __glewPixelTransformParameterivEXT; + +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFEXTPROC __glewPointParameterfEXT; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT; + +GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT; + +GLEW_FUN_EXPORT PFNGLPROVOKINGVERTEXEXTPROC __glewProvokingVertexEXT; + +GLEW_FUN_EXPORT PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT; +GLEW_FUN_EXPORT PFNGLENDSCENEEXTPROC __glewEndSceneEXT; + +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BEXTPROC __glewSecondaryColor3bEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVEXTPROC __glewSecondaryColor3bvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DEXTPROC __glewSecondaryColor3dEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVEXTPROC __glewSecondaryColor3dvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FEXTPROC __glewSecondaryColor3fEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVEXTPROC __glewSecondaryColor3fvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IEXTPROC __glewSecondaryColor3iEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVEXTPROC __glewSecondaryColor3ivEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SEXTPROC __glewSecondaryColor3sEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVEXTPROC __glewSecondaryColor3svEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBEXTPROC __glewSecondaryColor3ubEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVEXTPROC __glewSecondaryColor3ubvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIEXTPROC __glewSecondaryColor3uiEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVEXTPROC __glewSecondaryColor3uivEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT; + +GLEW_FUN_EXPORT PFNGLACTIVEPROGRAMEXTPROC __glewActiveProgramEXT; +GLEW_FUN_EXPORT PFNGLCREATESHADERPROGRAMEXTPROC __glewCreateShaderProgramEXT; +GLEW_FUN_EXPORT PFNGLUSESHADERPROGRAMEXTPROC __glewUseShaderProgramEXT; + +GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTUREEXTPROC __glewBindImageTextureEXT; +GLEW_FUN_EXPORT PFNGLMEMORYBARRIEREXTPROC __glewMemoryBarrierEXT; + +GLEW_FUN_EXPORT PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT; + +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE2DEXTPROC __glewTexSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DEXTPROC __glewTexSubImage3DEXT; + +GLEW_FUN_EXPORT PFNGLTEXIMAGE3DEXTPROC __glewTexImage3DEXT; + +GLEW_FUN_EXPORT PFNGLTEXBUFFEREXTPROC __glewTexBufferEXT; + +GLEW_FUN_EXPORT PFNGLCLEARCOLORIIEXTPROC __glewClearColorIiEXT; +GLEW_FUN_EXPORT PFNGLCLEARCOLORIUIEXTPROC __glewClearColorIuiEXT; +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVEXTPROC __glewGetTexParameterIivEXT; +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVEXTPROC __glewGetTexParameterIuivEXT; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVEXTPROC __glewTexParameterIivEXT; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVEXTPROC __glewTexParameterIuivEXT; + +GLEW_FUN_EXPORT PFNGLARETEXTURESRESIDENTEXTPROC __glewAreTexturesResidentEXT; +GLEW_FUN_EXPORT PFNGLBINDTEXTUREEXTPROC __glewBindTextureEXT; +GLEW_FUN_EXPORT PFNGLDELETETEXTURESEXTPROC __glewDeleteTexturesEXT; +GLEW_FUN_EXPORT PFNGLGENTEXTURESEXTPROC __glewGenTexturesEXT; +GLEW_FUN_EXPORT PFNGLISTEXTUREEXTPROC __glewIsTextureEXT; +GLEW_FUN_EXPORT PFNGLPRIORITIZETEXTURESEXTPROC __glewPrioritizeTexturesEXT; + +GLEW_FUN_EXPORT PFNGLTEXTURENORMALEXTPROC __glewTextureNormalEXT; + +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VEXTPROC __glewGetQueryObjecti64vEXT; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VEXTPROC __glewGetQueryObjectui64vEXT; + +GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKEXTPROC __glewBeginTransformFeedbackEXT; +GLEW_FUN_EXPORT PFNGLBINDBUFFERBASEEXTPROC __glewBindBufferBaseEXT; +GLEW_FUN_EXPORT PFNGLBINDBUFFEROFFSETEXTPROC __glewBindBufferOffsetEXT; +GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGEEXTPROC __glewBindBufferRangeEXT; +GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKEXTPROC __glewEndTransformFeedbackEXT; +GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC __glewGetTransformFeedbackVaryingEXT; +GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC __glewTransformFeedbackVaryingsEXT; + +GLEW_FUN_EXPORT PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT; +GLEW_FUN_EXPORT PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT; +GLEW_FUN_EXPORT PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT; +GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT; +GLEW_FUN_EXPORT PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT; +GLEW_FUN_EXPORT PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT; +GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT; +GLEW_FUN_EXPORT PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT; + +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLDVEXTPROC __glewGetVertexAttribLdvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC __glewVertexArrayVertexAttribLOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DEXTPROC __glewVertexAttribL1dEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DVEXTPROC __glewVertexAttribL1dvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DEXTPROC __glewVertexAttribL2dEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DVEXTPROC __glewVertexAttribL2dvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DEXTPROC __glewVertexAttribL3dEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DVEXTPROC __glewVertexAttribL3dvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DEXTPROC __glewVertexAttribL4dEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DVEXTPROC __glewVertexAttribL4dvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLPOINTEREXTPROC __glewVertexAttribLPointerEXT; + +GLEW_FUN_EXPORT PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT; +GLEW_FUN_EXPORT PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDPARAMETEREXTPROC __glewBindParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDTEXGENPARAMETEREXTPROC __glewBindTexGenParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDTEXTUREUNITPARAMETEREXTPROC __glewBindTextureUnitParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDVERTEXSHADEREXTPROC __glewBindVertexShaderEXT; +GLEW_FUN_EXPORT PFNGLDELETEVERTEXSHADEREXTPROC __glewDeleteVertexShaderEXT; +GLEW_FUN_EXPORT PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC __glewDisableVariantClientStateEXT; +GLEW_FUN_EXPORT PFNGLENABLEVARIANTCLIENTSTATEEXTPROC __glewEnableVariantClientStateEXT; +GLEW_FUN_EXPORT PFNGLENDVERTEXSHADEREXTPROC __glewEndVertexShaderEXT; +GLEW_FUN_EXPORT PFNGLEXTRACTCOMPONENTEXTPROC __glewExtractComponentEXT; +GLEW_FUN_EXPORT PFNGLGENSYMBOLSEXTPROC __glewGenSymbolsEXT; +GLEW_FUN_EXPORT PFNGLGENVERTEXSHADERSEXTPROC __glewGenVertexShadersEXT; +GLEW_FUN_EXPORT PFNGLGETINVARIANTBOOLEANVEXTPROC __glewGetInvariantBooleanvEXT; +GLEW_FUN_EXPORT PFNGLGETINVARIANTFLOATVEXTPROC __glewGetInvariantFloatvEXT; +GLEW_FUN_EXPORT PFNGLGETINVARIANTINTEGERVEXTPROC __glewGetInvariantIntegervEXT; +GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC __glewGetLocalConstantBooleanvEXT; +GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTFLOATVEXTPROC __glewGetLocalConstantFloatvEXT; +GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTINTEGERVEXTPROC __glewGetLocalConstantIntegervEXT; +GLEW_FUN_EXPORT PFNGLGETVARIANTBOOLEANVEXTPROC __glewGetVariantBooleanvEXT; +GLEW_FUN_EXPORT PFNGLGETVARIANTFLOATVEXTPROC __glewGetVariantFloatvEXT; +GLEW_FUN_EXPORT PFNGLGETVARIANTINTEGERVEXTPROC __glewGetVariantIntegervEXT; +GLEW_FUN_EXPORT PFNGLGETVARIANTPOINTERVEXTPROC __glewGetVariantPointervEXT; +GLEW_FUN_EXPORT PFNGLINSERTCOMPONENTEXTPROC __glewInsertComponentEXT; +GLEW_FUN_EXPORT PFNGLISVARIANTENABLEDEXTPROC __glewIsVariantEnabledEXT; +GLEW_FUN_EXPORT PFNGLSETINVARIANTEXTPROC __glewSetInvariantEXT; +GLEW_FUN_EXPORT PFNGLSETLOCALCONSTANTEXTPROC __glewSetLocalConstantEXT; +GLEW_FUN_EXPORT PFNGLSHADEROP1EXTPROC __glewShaderOp1EXT; +GLEW_FUN_EXPORT PFNGLSHADEROP2EXTPROC __glewShaderOp2EXT; +GLEW_FUN_EXPORT PFNGLSHADEROP3EXTPROC __glewShaderOp3EXT; +GLEW_FUN_EXPORT PFNGLSWIZZLEEXTPROC __glewSwizzleEXT; +GLEW_FUN_EXPORT PFNGLVARIANTPOINTEREXTPROC __glewVariantPointerEXT; +GLEW_FUN_EXPORT PFNGLVARIANTBVEXTPROC __glewVariantbvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTDVEXTPROC __glewVariantdvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTFVEXTPROC __glewVariantfvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTIVEXTPROC __glewVariantivEXT; +GLEW_FUN_EXPORT PFNGLVARIANTSVEXTPROC __glewVariantsvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTUBVEXTPROC __glewVariantubvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTUIVEXTPROC __glewVariantuivEXT; +GLEW_FUN_EXPORT PFNGLVARIANTUSVEXTPROC __glewVariantusvEXT; +GLEW_FUN_EXPORT PFNGLWRITEMASKEXTPROC __glewWriteMaskEXT; + +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTPOINTEREXTPROC __glewVertexWeightPointerEXT; +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFEXTPROC __glewVertexWeightfEXT; +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFVEXTPROC __glewVertexWeightfvEXT; + +GLEW_FUN_EXPORT PFNGLFRAMETERMINATORGREMEDYPROC __glewFrameTerminatorGREMEDY; + +GLEW_FUN_EXPORT PFNGLSTRINGMARKERGREMEDYPROC __glewStringMarkerGREMEDY; + +GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC __glewGetImageTransformParameterfvHP; +GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC __glewGetImageTransformParameterivHP; +GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFHPPROC __glewImageTransformParameterfHP; +GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFVHPPROC __glewImageTransformParameterfvHP; +GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIHPPROC __glewImageTransformParameteriHP; +GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIVHPPROC __glewImageTransformParameterivHP; + +GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWARRAYSIBMPROC __glewMultiModeDrawArraysIBM; +GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWELEMENTSIBMPROC __glewMultiModeDrawElementsIBM; + +GLEW_FUN_EXPORT PFNGLCOLORPOINTERLISTIBMPROC __glewColorPointerListIBM; +GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTERLISTIBMPROC __glewEdgeFlagPointerListIBM; +GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERLISTIBMPROC __glewFogCoordPointerListIBM; +GLEW_FUN_EXPORT PFNGLINDEXPOINTERLISTIBMPROC __glewIndexPointerListIBM; +GLEW_FUN_EXPORT PFNGLNORMALPOINTERLISTIBMPROC __glewNormalPointerListIBM; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM; +GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM; +GLEW_FUN_EXPORT PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM; + +GLEW_FUN_EXPORT PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL; +GLEW_FUN_EXPORT PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL; +GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL; +GLEW_FUN_EXPORT PFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL; + +GLEW_FUN_EXPORT PFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL; +GLEW_FUN_EXPORT PFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL; + +GLEW_FUN_EXPORT PFNGLBUFFERREGIONENABLEDEXTPROC __glewBufferRegionEnabledEXT; +GLEW_FUN_EXPORT PFNGLDELETEBUFFERREGIONEXTPROC __glewDeleteBufferRegionEXT; +GLEW_FUN_EXPORT PFNGLDRAWBUFFERREGIONEXTPROC __glewDrawBufferRegionEXT; +GLEW_FUN_EXPORT PFNGLNEWBUFFERREGIONEXTPROC __glewNewBufferRegionEXT; +GLEW_FUN_EXPORT PFNGLREADBUFFERREGIONEXTPROC __glewReadBufferRegionEXT; + +GLEW_FUN_EXPORT PFNGLRESIZEBUFFERSMESAPROC __glewResizeBuffersMESA; + +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DMESAPROC __glewWindowPos2dMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVMESAPROC __glewWindowPos2dvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FMESAPROC __glewWindowPos2fMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVMESAPROC __glewWindowPos2fvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IMESAPROC __glewWindowPos2iMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVMESAPROC __glewWindowPos2ivMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SMESAPROC __glewWindowPos2sMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVMESAPROC __glewWindowPos2svMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DMESAPROC __glewWindowPos3dMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVMESAPROC __glewWindowPos3dvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FMESAPROC __glewWindowPos3fMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVMESAPROC __glewWindowPos3fvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IMESAPROC __glewWindowPos3iMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVMESAPROC __glewWindowPos3ivMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SMESAPROC __glewWindowPos3sMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVMESAPROC __glewWindowPos3svMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4DMESAPROC __glewWindowPos4dMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4DVMESAPROC __glewWindowPos4dvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4FMESAPROC __glewWindowPos4fMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4FVMESAPROC __glewWindowPos4fvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4IMESAPROC __glewWindowPos4iMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA; + +GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERNVPROC __glewBeginConditionalRenderNV; +GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERNVPROC __glewEndConditionalRenderNV; + +GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATANVPROC __glewCopyImageSubDataNV; + +GLEW_FUN_EXPORT PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV; +GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV; + +GLEW_FUN_EXPORT PFNGLEVALMAPSNVPROC __glewEvalMapsNV; +GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV; +GLEW_FUN_EXPORT PFNGLGETMAPCONTROLPOINTSNVPROC __glewGetMapControlPointsNV; +GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERFVNVPROC __glewGetMapParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERIVNVPROC __glewGetMapParameterivNV; +GLEW_FUN_EXPORT PFNGLMAPCONTROLPOINTSNVPROC __glewMapControlPointsNV; +GLEW_FUN_EXPORT PFNGLMAPPARAMETERFVNVPROC __glewMapParameterfvNV; +GLEW_FUN_EXPORT PFNGLMAPPARAMETERIVNVPROC __glewMapParameterivNV; + +GLEW_FUN_EXPORT PFNGLGETMULTISAMPLEFVNVPROC __glewGetMultisamplefvNV; +GLEW_FUN_EXPORT PFNGLSAMPLEMASKINDEXEDNVPROC __glewSampleMaskIndexedNV; +GLEW_FUN_EXPORT PFNGLTEXRENDERBUFFERNVPROC __glewTexRenderbufferNV; + +GLEW_FUN_EXPORT PFNGLDELETEFENCESNVPROC __glewDeleteFencesNV; +GLEW_FUN_EXPORT PFNGLFINISHFENCENVPROC __glewFinishFenceNV; +GLEW_FUN_EXPORT PFNGLGENFENCESNVPROC __glewGenFencesNV; +GLEW_FUN_EXPORT PFNGLGETFENCEIVNVPROC __glewGetFenceivNV; +GLEW_FUN_EXPORT PFNGLISFENCENVPROC __glewIsFenceNV; +GLEW_FUN_EXPORT PFNGLSETFENCENVPROC __glewSetFenceNV; +GLEW_FUN_EXPORT PFNGLTESTFENCENVPROC __glewTestFenceNV; + +GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC __glewGetProgramNamedParameterdvNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC __glewGetProgramNamedParameterfvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DNVPROC __glewProgramNamedParameter4dNV; +GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC __glewProgramNamedParameter4dvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FNVPROC __glewProgramNamedParameter4fNV; +GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC __glewProgramNamedParameter4fvNV; + +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __glewRenderbufferStorageMultisampleCoverageNV; + +GLEW_FUN_EXPORT PFNGLPROGRAMVERTEXLIMITNVPROC __glewProgramVertexLimitNV; + +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4INVPROC __glewProgramEnvParameterI4iNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4IVNVPROC __glewProgramEnvParameterI4ivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UINVPROC __glewProgramEnvParameterI4uiNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UIVNVPROC __glewProgramEnvParameterI4uivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4IVNVPROC __glewProgramEnvParametersI4ivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC __glewProgramEnvParametersI4uivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4INVPROC __glewProgramLocalParameterI4iNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC __glewProgramLocalParameterI4ivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UINVPROC __glewProgramLocalParameterI4uiNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC __glewProgramLocalParameterI4uivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC __glewProgramLocalParametersI4ivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC __glewProgramLocalParametersI4uivNV; + +GLEW_FUN_EXPORT PFNGLGETUNIFORMI64VNVPROC __glewGetUniformi64vNV; +GLEW_FUN_EXPORT PFNGLGETUNIFORMUI64VNVPROC __glewGetUniformui64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64NVPROC __glewProgramUniform1i64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64VNVPROC __glewProgramUniform1i64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64NVPROC __glewProgramUniform1ui64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64VNVPROC __glewProgramUniform1ui64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64NVPROC __glewProgramUniform2i64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64VNVPROC __glewProgramUniform2i64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64NVPROC __glewProgramUniform2ui64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64VNVPROC __glewProgramUniform2ui64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64NVPROC __glewProgramUniform3i64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64VNVPROC __glewProgramUniform3i64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64NVPROC __glewProgramUniform3ui64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64VNVPROC __glewProgramUniform3ui64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64NVPROC __glewProgramUniform4i64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64VNVPROC __glewProgramUniform4i64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64NVPROC __glewProgramUniform4ui64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64VNVPROC __glewProgramUniform4ui64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM1I64NVPROC __glewUniform1i64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM1I64VNVPROC __glewUniform1i64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM1UI64NVPROC __glewUniform1ui64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM1UI64VNVPROC __glewUniform1ui64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM2I64NVPROC __glewUniform2i64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM2I64VNVPROC __glewUniform2i64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM2UI64NVPROC __glewUniform2ui64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM2UI64VNVPROC __glewUniform2ui64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM3I64NVPROC __glewUniform3i64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM3I64VNVPROC __glewUniform3i64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM3UI64NVPROC __glewUniform3ui64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM3UI64VNVPROC __glewUniform3ui64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM4I64NVPROC __glewUniform4i64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM4I64VNVPROC __glewUniform4i64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM4UI64NVPROC __glewUniform4ui64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM4UI64VNVPROC __glewUniform4ui64vNV; + +GLEW_FUN_EXPORT PFNGLCOLOR3HNVPROC __glewColor3hNV; +GLEW_FUN_EXPORT PFNGLCOLOR3HVNVPROC __glewColor3hvNV; +GLEW_FUN_EXPORT PFNGLCOLOR4HNVPROC __glewColor4hNV; +GLEW_FUN_EXPORT PFNGLCOLOR4HVNVPROC __glewColor4hvNV; +GLEW_FUN_EXPORT PFNGLFOGCOORDHNVPROC __glewFogCoordhNV; +GLEW_FUN_EXPORT PFNGLFOGCOORDHVNVPROC __glewFogCoordhvNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HNVPROC __glewMultiTexCoord1hNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HVNVPROC __glewMultiTexCoord1hvNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HNVPROC __glewMultiTexCoord2hNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HVNVPROC __glewMultiTexCoord2hvNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HNVPROC __glewMultiTexCoord3hNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HVNVPROC __glewMultiTexCoord3hvNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HNVPROC __glewMultiTexCoord4hNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HVNVPROC __glewMultiTexCoord4hvNV; +GLEW_FUN_EXPORT PFNGLNORMAL3HNVPROC __glewNormal3hNV; +GLEW_FUN_EXPORT PFNGLNORMAL3HVNVPROC __glewNormal3hvNV; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HNVPROC __glewSecondaryColor3hNV; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HVNVPROC __glewSecondaryColor3hvNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD1HNVPROC __glewTexCoord1hNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD1HVNVPROC __glewTexCoord1hvNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD2HNVPROC __glewTexCoord2hNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD2HVNVPROC __glewTexCoord2hvNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD3HNVPROC __glewTexCoord3hNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD3HVNVPROC __glewTexCoord3hvNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD4HNVPROC __glewTexCoord4hNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD4HVNVPROC __glewTexCoord4hvNV; +GLEW_FUN_EXPORT PFNGLVERTEX2HNVPROC __glewVertex2hNV; +GLEW_FUN_EXPORT PFNGLVERTEX2HVNVPROC __glewVertex2hvNV; +GLEW_FUN_EXPORT PFNGLVERTEX3HNVPROC __glewVertex3hNV; +GLEW_FUN_EXPORT PFNGLVERTEX3HVNVPROC __glewVertex3hvNV; +GLEW_FUN_EXPORT PFNGLVERTEX4HNVPROC __glewVertex4hNV; +GLEW_FUN_EXPORT PFNGLVERTEX4HVNVPROC __glewVertex4hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HNVPROC __glewVertexAttrib1hNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HVNVPROC __glewVertexAttrib1hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HNVPROC __glewVertexAttrib2hNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HVNVPROC __glewVertexAttrib2hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HNVPROC __glewVertexAttrib3hNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HVNVPROC __glewVertexAttrib3hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HNVPROC __glewVertexAttrib4hNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HVNVPROC __glewVertexAttrib4hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1HVNVPROC __glewVertexAttribs1hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2HVNVPROC __glewVertexAttribs2hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3HVNVPROC __glewVertexAttribs3hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4HVNVPROC __glewVertexAttribs4hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHNVPROC __glewVertexWeighthNV; +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHVNVPROC __glewVertexWeighthvNV; + +GLEW_FUN_EXPORT PFNGLBEGINOCCLUSIONQUERYNVPROC __glewBeginOcclusionQueryNV; +GLEW_FUN_EXPORT PFNGLDELETEOCCLUSIONQUERIESNVPROC __glewDeleteOcclusionQueriesNV; +GLEW_FUN_EXPORT PFNGLENDOCCLUSIONQUERYNVPROC __glewEndOcclusionQueryNV; +GLEW_FUN_EXPORT PFNGLGENOCCLUSIONQUERIESNVPROC __glewGenOcclusionQueriesNV; +GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYIVNVPROC __glewGetOcclusionQueryivNV; +GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYUIVNVPROC __glewGetOcclusionQueryuivNV; +GLEW_FUN_EXPORT PFNGLISOCCLUSIONQUERYNVPROC __glewIsOcclusionQueryNV; + +GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC __glewProgramBufferParametersIivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC __glewProgramBufferParametersIuivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC __glewProgramBufferParametersfvNV; + +GLEW_FUN_EXPORT PFNGLFLUSHPIXELDATARANGENVPROC __glewFlushPixelDataRangeNV; +GLEW_FUN_EXPORT PFNGLPIXELDATARANGENVPROC __glewPixelDataRangeNV; + +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERINVPROC __glewPointParameteriNV; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVNVPROC __glewPointParameterivNV; + +GLEW_FUN_EXPORT PFNGLGETVIDEOI64VNVPROC __glewGetVideoi64vNV; +GLEW_FUN_EXPORT PFNGLGETVIDEOIVNVPROC __glewGetVideoivNV; +GLEW_FUN_EXPORT PFNGLGETVIDEOUI64VNVPROC __glewGetVideoui64vNV; +GLEW_FUN_EXPORT PFNGLGETVIDEOUIVNVPROC __glewGetVideouivNV; +GLEW_FUN_EXPORT PFNGLPRESENTFRAMEDUALFILLNVPROC __glewPresentFrameDualFillNV; +GLEW_FUN_EXPORT PFNGLPRESENTFRAMEKEYEDNVPROC __glewPresentFrameKeyedNV; + +GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV; +GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV; + +GLEW_FUN_EXPORT PFNGLCOMBINERINPUTNVPROC __glewCombinerInputNV; +GLEW_FUN_EXPORT PFNGLCOMBINEROUTPUTNVPROC __glewCombinerOutputNV; +GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFNVPROC __glewCombinerParameterfNV; +GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFVNVPROC __glewCombinerParameterfvNV; +GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERINVPROC __glewCombinerParameteriNV; +GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERIVNVPROC __glewCombinerParameterivNV; +GLEW_FUN_EXPORT PFNGLFINALCOMBINERINPUTNVPROC __glewFinalCombinerInputNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC __glewGetCombinerInputParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC __glewGetCombinerInputParameterivNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC __glewGetCombinerOutputParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC __glewGetCombinerOutputParameterivNV; +GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC __glewGetFinalCombinerInputParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameterivNV; + +GLEW_FUN_EXPORT PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV; + +GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERUI64VNVPROC __glewGetBufferParameterui64vNV; +GLEW_FUN_EXPORT PFNGLGETINTEGERUI64VNVPROC __glewGetIntegerui64vNV; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC __glewGetNamedBufferParameterui64vNV; +GLEW_FUN_EXPORT PFNGLISBUFFERRESIDENTNVPROC __glewIsBufferResidentNV; +GLEW_FUN_EXPORT PFNGLISNAMEDBUFFERRESIDENTNVPROC __glewIsNamedBufferResidentNV; +GLEW_FUN_EXPORT PFNGLMAKEBUFFERNONRESIDENTNVPROC __glewMakeBufferNonResidentNV; +GLEW_FUN_EXPORT PFNGLMAKEBUFFERRESIDENTNVPROC __glewMakeBufferResidentNV; +GLEW_FUN_EXPORT PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC __glewMakeNamedBufferNonResidentNV; +GLEW_FUN_EXPORT PFNGLMAKENAMEDBUFFERRESIDENTNVPROC __glewMakeNamedBufferResidentNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMUI64NVPROC __glewProgramUniformui64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMUI64VNVPROC __glewProgramUniformui64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORMUI64NVPROC __glewUniformui64NV; +GLEW_FUN_EXPORT PFNGLUNIFORMUI64VNVPROC __glewUniformui64vNV; + +GLEW_FUN_EXPORT PFNGLTEXTUREBARRIERNVPROC __glewTextureBarrierNV; + +GLEW_FUN_EXPORT PFNGLACTIVEVARYINGNVPROC __glewActiveVaryingNV; +GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKNVPROC __glewBeginTransformFeedbackNV; +GLEW_FUN_EXPORT PFNGLBINDBUFFERBASENVPROC __glewBindBufferBaseNV; +GLEW_FUN_EXPORT PFNGLBINDBUFFEROFFSETNVPROC __glewBindBufferOffsetNV; +GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGENVPROC __glewBindBufferRangeNV; +GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKNVPROC __glewEndTransformFeedbackNV; +GLEW_FUN_EXPORT PFNGLGETACTIVEVARYINGNVPROC __glewGetActiveVaryingNV; +GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC __glewGetTransformFeedbackVaryingNV; +GLEW_FUN_EXPORT PFNGLGETVARYINGLOCATIONNVPROC __glewGetVaryingLocationNV; +GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC __glewTransformFeedbackAttribsNV; +GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC __glewTransformFeedbackVaryingsNV; + +GLEW_FUN_EXPORT PFNGLBINDTRANSFORMFEEDBACKNVPROC __glewBindTransformFeedbackNV; +GLEW_FUN_EXPORT PFNGLDELETETRANSFORMFEEDBACKSNVPROC __glewDeleteTransformFeedbacksNV; +GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKNVPROC __glewDrawTransformFeedbackNV; +GLEW_FUN_EXPORT PFNGLGENTRANSFORMFEEDBACKSNVPROC __glewGenTransformFeedbacksNV; +GLEW_FUN_EXPORT PFNGLISTRANSFORMFEEDBACKNVPROC __glewIsTransformFeedbackNV; +GLEW_FUN_EXPORT PFNGLPAUSETRANSFORMFEEDBACKNVPROC __glewPauseTransformFeedbackNV; +GLEW_FUN_EXPORT PFNGLRESUMETRANSFORMFEEDBACKNVPROC __glewResumeTransformFeedbackNV; + +GLEW_FUN_EXPORT PFNGLVDPAUFININVPROC __glewVDPAUFiniNV; +GLEW_FUN_EXPORT PFNGLVDPAUGETSURFACEIVNVPROC __glewVDPAUGetSurfaceivNV; +GLEW_FUN_EXPORT PFNGLVDPAUINITNVPROC __glewVDPAUInitNV; +GLEW_FUN_EXPORT PFNGLVDPAUISSURFACENVPROC __glewVDPAUIsSurfaceNV; +GLEW_FUN_EXPORT PFNGLVDPAUMAPSURFACESNVPROC __glewVDPAUMapSurfacesNV; +GLEW_FUN_EXPORT PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC __glewVDPAURegisterOutputSurfaceNV; +GLEW_FUN_EXPORT PFNGLVDPAUREGISTERVIDEOSURFACENVPROC __glewVDPAURegisterVideoSurfaceNV; +GLEW_FUN_EXPORT PFNGLVDPAUSURFACEACCESSNVPROC __glewVDPAUSurfaceAccessNV; +GLEW_FUN_EXPORT PFNGLVDPAUUNMAPSURFACESNVPROC __glewVDPAUUnmapSurfacesNV; +GLEW_FUN_EXPORT PFNGLVDPAUUNREGISTERSURFACENVPROC __glewVDPAUUnregisterSurfaceNV; + +GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV; + +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLI64VNVPROC __glewGetVertexAttribLi64vNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLUI64VNVPROC __glewGetVertexAttribLui64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1I64NVPROC __glewVertexAttribL1i64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1I64VNVPROC __glewVertexAttribL1i64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64NVPROC __glewVertexAttribL1ui64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64VNVPROC __glewVertexAttribL1ui64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2I64NVPROC __glewVertexAttribL2i64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2I64VNVPROC __glewVertexAttribL2i64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2UI64NVPROC __glewVertexAttribL2ui64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2UI64VNVPROC __glewVertexAttribL2ui64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3I64NVPROC __glewVertexAttribL3i64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3I64VNVPROC __glewVertexAttribL3i64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3UI64NVPROC __glewVertexAttribL3ui64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3UI64VNVPROC __glewVertexAttribL3ui64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4I64NVPROC __glewVertexAttribL4i64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4I64VNVPROC __glewVertexAttribL4i64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4UI64NVPROC __glewVertexAttribL4ui64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4UI64VNVPROC __glewVertexAttribL4ui64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLFORMATNVPROC __glewVertexAttribLFormatNV; + +GLEW_FUN_EXPORT PFNGLBUFFERADDRESSRANGENVPROC __glewBufferAddressRangeNV; +GLEW_FUN_EXPORT PFNGLCOLORFORMATNVPROC __glewColorFormatNV; +GLEW_FUN_EXPORT PFNGLEDGEFLAGFORMATNVPROC __glewEdgeFlagFormatNV; +GLEW_FUN_EXPORT PFNGLFOGCOORDFORMATNVPROC __glewFogCoordFormatNV; +GLEW_FUN_EXPORT PFNGLGETINTEGERUI64I_VNVPROC __glewGetIntegerui64i_vNV; +GLEW_FUN_EXPORT PFNGLINDEXFORMATNVPROC __glewIndexFormatNV; +GLEW_FUN_EXPORT PFNGLNORMALFORMATNVPROC __glewNormalFormatNV; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORFORMATNVPROC __glewSecondaryColorFormatNV; +GLEW_FUN_EXPORT PFNGLTEXCOORDFORMATNVPROC __glewTexCoordFormatNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBFORMATNVPROC __glewVertexAttribFormatNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIFORMATNVPROC __glewVertexAttribIFormatNV; +GLEW_FUN_EXPORT PFNGLVERTEXFORMATNVPROC __glewVertexFormatNV; + +GLEW_FUN_EXPORT PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV; +GLEW_FUN_EXPORT PFNGLBINDPROGRAMNVPROC __glewBindProgramNV; +GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV; +GLEW_FUN_EXPORT PFNGLEXECUTEPROGRAMNVPROC __glewExecuteProgramNV; +GLEW_FUN_EXPORT PFNGLGENPROGRAMSNVPROC __glewGenProgramsNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERDVNVPROC __glewGetProgramParameterdvNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERFVNVPROC __glewGetProgramParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGNVPROC __glewGetProgramStringNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMIVNVPROC __glewGetProgramivNV; +GLEW_FUN_EXPORT PFNGLGETTRACKMATRIXIVNVPROC __glewGetTrackMatrixivNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVNVPROC __glewGetVertexAttribPointervNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVNVPROC __glewGetVertexAttribdvNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVNVPROC __glewGetVertexAttribfvNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVNVPROC __glewGetVertexAttribivNV; +GLEW_FUN_EXPORT PFNGLISPROGRAMNVPROC __glewIsProgramNV; +GLEW_FUN_EXPORT PFNGLLOADPROGRAMNVPROC __glewLoadProgramNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DNVPROC __glewProgramParameter4dNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DVNVPROC __glewProgramParameter4dvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FNVPROC __glewProgramParameter4fNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FVNVPROC __glewProgramParameter4fvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4DVNVPROC __glewProgramParameters4dvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4FVNVPROC __glewProgramParameters4fvNV; +GLEW_FUN_EXPORT PFNGLREQUESTRESIDENTPROGRAMSNVPROC __glewRequestResidentProgramsNV; +GLEW_FUN_EXPORT PFNGLTRACKMATRIXNVPROC __glewTrackMatrixNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DNVPROC __glewVertexAttrib1dNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVNVPROC __glewVertexAttrib1dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FNVPROC __glewVertexAttrib1fNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVNVPROC __glewVertexAttrib1fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SNVPROC __glewVertexAttrib1sNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVNVPROC __glewVertexAttrib1svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DNVPROC __glewVertexAttrib2dNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVNVPROC __glewVertexAttrib2dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FNVPROC __glewVertexAttrib2fNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVNVPROC __glewVertexAttrib2fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SNVPROC __glewVertexAttrib2sNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVNVPROC __glewVertexAttrib2svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DNVPROC __glewVertexAttrib3dNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVNVPROC __glewVertexAttrib3dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FNVPROC __glewVertexAttrib3fNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVNVPROC __glewVertexAttrib3fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SNVPROC __glewVertexAttrib3sNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVNVPROC __glewVertexAttrib3svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DNVPROC __glewVertexAttrib4dNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVNVPROC __glewVertexAttrib4dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FNVPROC __glewVertexAttrib4fNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVNVPROC __glewVertexAttrib4fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SNVPROC __glewVertexAttrib4sNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVNVPROC __glewVertexAttrib4svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBNVPROC __glewVertexAttrib4ubNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVNVPROC __glewVertexAttrib4ubvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERNVPROC __glewVertexAttribPointerNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1DVNVPROC __glewVertexAttribs1dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1FVNVPROC __glewVertexAttribs1fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1SVNVPROC __glewVertexAttribs1svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2DVNVPROC __glewVertexAttribs2dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2FVNVPROC __glewVertexAttribs2fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2SVNVPROC __glewVertexAttribs2svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3DVNVPROC __glewVertexAttribs3dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3FVNVPROC __glewVertexAttribs3fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3SVNVPROC __glewVertexAttribs3svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4DVNVPROC __glewVertexAttribs4dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4FVNVPROC __glewVertexAttribs4fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4SVNVPROC __glewVertexAttribs4svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4UBVNVPROC __glewVertexAttribs4ubvNV; + +GLEW_FUN_EXPORT PFNGLCLEARDEPTHFOESPROC __glewClearDepthfOES; +GLEW_FUN_EXPORT PFNGLCLIPPLANEFOESPROC __glewClipPlanefOES; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEFOESPROC __glewDepthRangefOES; +GLEW_FUN_EXPORT PFNGLFRUSTUMFOESPROC __glewFrustumfOES; +GLEW_FUN_EXPORT PFNGLGETCLIPPLANEFOESPROC __glewGetClipPlanefOES; +GLEW_FUN_EXPORT PFNGLORTHOFOESPROC __glewOrthofOES; + +GLEW_FUN_EXPORT PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS; +GLEW_FUN_EXPORT PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS; + +GLEW_FUN_EXPORT PFNGLFOGFUNCSGISPROC __glewFogFuncSGIS; +GLEW_FUN_EXPORT PFNGLGETFOGFUNCSGISPROC __glewGetFogFuncSGIS; + +GLEW_FUN_EXPORT PFNGLSAMPLEMASKSGISPROC __glewSampleMaskSGIS; +GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNSGISPROC __glewSamplePatternSGIS; + +GLEW_FUN_EXPORT PFNGLGETSHARPENTEXFUNCSGISPROC __glewGetSharpenTexFuncSGIS; +GLEW_FUN_EXPORT PFNGLSHARPENTEXFUNCSGISPROC __glewSharpenTexFuncSGIS; + +GLEW_FUN_EXPORT PFNGLTEXIMAGE4DSGISPROC __glewTexImage4DSGIS; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE4DSGISPROC __glewTexSubImage4DSGIS; + +GLEW_FUN_EXPORT PFNGLGETTEXFILTERFUNCSGISPROC __glewGetTexFilterFuncSGIS; +GLEW_FUN_EXPORT PFNGLTEXFILTERFUNCSGISPROC __glewTexFilterFuncSGIS; + +GLEW_FUN_EXPORT PFNGLASYNCMARKERSGIXPROC __glewAsyncMarkerSGIX; +GLEW_FUN_EXPORT PFNGLDELETEASYNCMARKERSSGIXPROC __glewDeleteAsyncMarkersSGIX; +GLEW_FUN_EXPORT PFNGLFINISHASYNCSGIXPROC __glewFinishAsyncSGIX; +GLEW_FUN_EXPORT PFNGLGENASYNCMARKERSSGIXPROC __glewGenAsyncMarkersSGIX; +GLEW_FUN_EXPORT PFNGLISASYNCMARKERSGIXPROC __glewIsAsyncMarkerSGIX; +GLEW_FUN_EXPORT PFNGLPOLLASYNCSGIXPROC __glewPollAsyncSGIX; + +GLEW_FUN_EXPORT PFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX; + +GLEW_FUN_EXPORT PFNGLTEXTUREFOGSGIXPROC __glewTextureFogSGIX; + +GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALSGIXPROC __glewFragmentColorMaterialSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFSGIXPROC __glewFragmentLightModelfSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVSGIXPROC __glewFragmentLightModelfvSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELISGIXPROC __glewFragmentLightModeliSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVSGIXPROC __glewFragmentLightModelivSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFSGIXPROC __glewFragmentLightfSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVSGIXPROC __glewFragmentLightfvSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTISGIXPROC __glewFragmentLightiSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVSGIXPROC __glewFragmentLightivSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFSGIXPROC __glewFragmentMaterialfSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVSGIXPROC __glewFragmentMaterialfvSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALISGIXPROC __glewFragmentMaterialiSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVSGIXPROC __glewFragmentMaterialivSGIX; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVSGIXPROC __glewGetFragmentLightfvSGIX; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVSGIXPROC __glewGetFragmentLightivSGIX; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVSGIXPROC __glewGetFragmentMaterialfvSGIX; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVSGIXPROC __glewGetFragmentMaterialivSGIX; + +GLEW_FUN_EXPORT PFNGLFRAMEZOOMSGIXPROC __glewFrameZoomSGIX; + +GLEW_FUN_EXPORT PFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX; + +GLEW_FUN_EXPORT PFNGLREFERENCEPLANESGIXPROC __glewReferencePlaneSGIX; + +GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFSGIXPROC __glewSpriteParameterfSGIX; +GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFVSGIXPROC __glewSpriteParameterfvSGIX; +GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERISGIXPROC __glewSpriteParameteriSGIX; +GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERIVSGIXPROC __glewSpriteParameterivSGIX; + +GLEW_FUN_EXPORT PFNGLTAGSAMPLEBUFFERSGIXPROC __glewTagSampleBufferSGIX; + +GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVSGIPROC __glewColorTableParameterfvSGI; +GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVSGIPROC __glewColorTableParameterivSGI; +GLEW_FUN_EXPORT PFNGLCOLORTABLESGIPROC __glewColorTableSGI; +GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLESGIPROC __glewCopyColorTableSGI; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVSGIPROC __glewGetColorTableParameterfvSGI; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVSGIPROC __glewGetColorTableParameterivSGI; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLESGIPROC __glewGetColorTableSGI; + +GLEW_FUN_EXPORT PFNGLFINISHTEXTURESUNXPROC __glewFinishTextureSUNX; + +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORBSUNPROC __glewGlobalAlphaFactorbSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORDSUNPROC __glewGlobalAlphaFactordSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORFSUNPROC __glewGlobalAlphaFactorfSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORISUNPROC __glewGlobalAlphaFactoriSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORSSUNPROC __glewGlobalAlphaFactorsSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUBSUNPROC __glewGlobalAlphaFactorubSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUISUNPROC __glewGlobalAlphaFactoruiSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUSSUNPROC __glewGlobalAlphaFactorusSUN; + +GLEW_FUN_EXPORT PFNGLREADVIDEOPIXELSSUNPROC __glewReadVideoPixelsSUN; + +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEPOINTERSUNPROC __glewReplacementCodePointerSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBSUNPROC __glewReplacementCodeubSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBVSUNPROC __glewReplacementCodeubvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUISUNPROC __glewReplacementCodeuiSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVSUNPROC __glewReplacementCodeuivSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSSUNPROC __glewReplacementCodeusSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSVSUNPROC __glewReplacementCodeusvSUN; + +GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FSUNPROC __glewColor3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FVSUNPROC __glewColor3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewColor4fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewColor4fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FSUNPROC __glewColor4ubVertex2fSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FVSUNPROC __glewColor4ubVertex2fvSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FSUNPROC __glewColor4ubVertex3fSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FVSUNPROC __glewColor4ubVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FSUNPROC __glewNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FVSUNPROC __glewNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC __glewReplacementCodeuiColor3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC __glewReplacementCodeuiColor4ubVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC __glewReplacementCodeuiColor4ubVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC __glewReplacementCodeuiVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC __glewReplacementCodeuiVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC __glewTexCoord2fColor3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC __glewTexCoord2fColor3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC __glewTexCoord2fColor4ubVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC __glewTexCoord2fColor4ubVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FSUNPROC __glewTexCoord2fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FVSUNPROC __glewTexCoord2fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FSUNPROC __glewTexCoord4fVertex4fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FVSUNPROC __glewTexCoord4fVertex4fvSUN; + +GLEW_FUN_EXPORT PFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN; + +#if defined(GLEW_MX) && !defined(_WIN32) +struct GLEWContextStruct +{ +#endif /* GLEW_MX */ + +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_1; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2_1; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_3; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_4; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_5; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_0; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_1; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_0; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_1; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_2; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_3; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_0; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_1; +GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_tbuffer; +GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_texture_compression_FXT1; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_conservative_depth; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_debug_output; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_depth_clamp_separate; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_draw_buffers_blend; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_name_gen_delete; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_performance_monitor; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_seamless_cubemap_per_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_stencil_export; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_texture_texture4; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_transform_feedback3_lines_triangles; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_tessellator; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_aux_depth_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_client_storage; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_element_array; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_fence; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_float_pixels; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_flush_buffer_range; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_object_purgeable; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_pixel_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_rgb_422; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_row_bytes; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_specular_vector; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_range; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_transform_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_object; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_range; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_program_evaluators; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_ycbcr_422; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES2_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_blend_func_extended; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_cl_event; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_color_buffer_float; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_copy_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_debug_output; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_buffer_float; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers_blend; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_elements_base_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_indirect; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_instanced; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_explicit_attrib_location; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_coord_conventions; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program_shadow; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_sRGB; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_geometry_shader4; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_get_program_binary; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader5; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader_fp64; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_pixel; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_imaging; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_instanced_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_map_buffer_range; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_matrix_palette; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multitexture; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query2; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_pixel_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_sprite; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_provoking_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sample_shading; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sampler_objects; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_seamless_cube_map; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_separate_shader_objects; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_bit_encoding; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_objects; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_precision; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_stencil_export; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_subroutine; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_texture_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_100; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_include; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow_ambient; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sync; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_tessellation_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_border_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_object_rgb32; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression_bptc; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression_rgtc; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map_array; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_add; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_combine; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_crossbar; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_dot3; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_float; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_gather; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirrored_repeat; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_non_power_of_two; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_query_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rectangle; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rg; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rgb10_a2ui; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_swizzle; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_timer_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback2; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback3; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transpose_matrix; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_uniform_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_array_bgra; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_array_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_attrib_64bit; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_blend; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_program; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_type_2_10_10_10_rev; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_viewport_array; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_window_pos; +GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_point_sprites; +GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_combine3; +GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_route; +GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_vertex_shader_output_point_size; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_draw_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_element_array; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_envmap_bumpmap; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_fragment_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_map_object_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_meminfo; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_pn_triangles; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_separate_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_shader_texture_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_text_fragment_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_compression_3dc; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_env_combine3; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_float; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_mirror_once; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_array_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_attrib_array_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_streams; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_422_pixels; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_Cg_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_abgr; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bgra; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bindable_uniform; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_color; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_equation_separate; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_func_separate; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_logic_op; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_minmax; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_subtract; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clip_volume_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cmyka; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_subtable; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_compiled_vertex_array; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_convolution; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_coordinate_frame; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_copy_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cull_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_depth_bounds_test; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_direct_state_access; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_buffers2; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_instanced; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_range_elements; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fog_coord; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fragment_lighting; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_blit; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_sRGB; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_geometry_shader4; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_program_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_shader4; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_histogram; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_array_formats; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_func; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_material; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_light_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_misc_attribute; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multi_draw_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_depth_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_float; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_pixels; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_paletted_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform_color_table; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_point_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_polygon_offset; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_provoking_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_rescale_normal; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_scene_marker; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_secondary_color; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_shader_objects; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_specular_color; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_image_load_store; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shadow_funcs; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shared_texture_palette; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_clear_tag; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_two_side; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_wrap; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_subtexture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture3D; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_array; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_dxt1; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_latc; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_rgtc; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_s3tc; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_cube_map; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_edge_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_add; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_combine; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_dot3; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_filter_anisotropic; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_integer; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_lod_bias; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_mirror_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_perturb_normal; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_rectangle; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB_decode; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_shared_exponent; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_snorm; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_swizzle; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_timer_query; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_transform_feedback; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array_bgra; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_attrib_64bit; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_weighting; +GLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_frame_terminator; +GLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_string_marker; +GLEW_VAR_EXPORT GLboolean __GLEW_HP_convolution_border_modes; +GLEW_VAR_EXPORT GLboolean __GLEW_HP_image_transform; +GLEW_VAR_EXPORT GLboolean __GLEW_HP_occlusion_test; +GLEW_VAR_EXPORT GLboolean __GLEW_HP_texture_lighting; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_cull_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_multimode_draw_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_rasterpos_clip; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_static_data; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_texture_mirrored_repeat; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_vertex_array_lists; +GLEW_VAR_EXPORT GLboolean __GLEW_INGR_color_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_INGR_interlace_read; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_parallel_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_texture_scissor; +GLEW_VAR_EXPORT GLboolean __GLEW_KTX_buffer_region; +GLEW_VAR_EXPORT GLboolean __GLEW_MESAX_texture_stack; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_pack_invert; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_resize_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_window_pos; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_ycbcr_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_NVX_gpu_memory_info; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_square; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_conditional_render; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_depth_to_color; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_image; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_buffer_float; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_range_unclamped; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_evaluators; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_explicit_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fence; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_float_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fog_distance; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program_option; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_multisample_coverage; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_program4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_shader4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program5; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program_fp64; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_shader5; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_half_float; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_light_max_exponent; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_coverage; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_filter_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_occlusion_query; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_depth_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_pixel_data_range; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_point_sprite; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_present_video; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_primitive_restart; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_buffer_load; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_tessellation_program5; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_emboss; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_reflection; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_barrier; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_vtc; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_env_combine4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_expand_normal; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_rectangle; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader3; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vdpau_interop; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_attrib_integer_64bit; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_buffer_unified_memory; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program1_1; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2_option; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program3; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program4; +GLEW_VAR_EXPORT GLboolean __GLEW_OES_byte_coordinates; +GLEW_VAR_EXPORT GLboolean __GLEW_OES_compressed_paletted_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_OES_read_format; +GLEW_VAR_EXPORT GLboolean __GLEW_OES_single_precision; +GLEW_VAR_EXPORT GLboolean __GLEW_OML_interlace; +GLEW_VAR_EXPORT GLboolean __GLEW_OML_resample; +GLEW_VAR_EXPORT GLboolean __GLEW_OML_subsample; +GLEW_VAR_EXPORT GLboolean __GLEW_PGI_misc_hints; +GLEW_VAR_EXPORT GLboolean __GLEW_PGI_vertex_hints; +GLEW_VAR_EXPORT GLboolean __GLEW_REND_screen_coordinates; +GLEW_VAR_EXPORT GLboolean __GLEW_S3_s3tc; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_color_range; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_detail_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_fog_function; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_generate_mipmap; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_pixel_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_point_line_texgen; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_sharpen_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture4D; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_border_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_edge_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_filter4; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_select; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_histogram; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_pixel; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_alpha_minmax; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_clipmap; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_convolution_accuracy; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_depth_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_flush_raster; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_offset; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragment_specular_lighting; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_framezoom; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_interlace; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ir_instrument1; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_list_priority; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture_bits; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_reference_plane; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_resample; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow_ambient; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_sprite; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_tag_sample_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_add_env; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_coordinate_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_lod_bias; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_multi_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_range; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_scale_bias; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ycrcb; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_matrix; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_table; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_texture_color_table; +GLEW_VAR_EXPORT GLboolean __GLEW_SUNX_constant_data; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_convolution_border_modes; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_global_alpha; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_mesh_array; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_read_video_pixels; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_slice_accum; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_triangle_list; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_WIN_phong_shading; +GLEW_VAR_EXPORT GLboolean __GLEW_WIN_specular_fog; +GLEW_VAR_EXPORT GLboolean __GLEW_WIN_swap_hint; + +#ifdef GLEW_MX +}; /* GLEWContextStruct */ +#endif /* GLEW_MX */ + +/* ------------------------------------------------------------------------- */ + +/* error codes */ +#define GLEW_OK 0 +#define GLEW_NO_ERROR 0 +#define GLEW_ERROR_NO_GL_VERSION 1 /* missing GL version */ +#define GLEW_ERROR_GL_VERSION_10_ONLY 2 /* Need at least OpenGL 1.1 */ +#define GLEW_ERROR_GLX_VERSION_11_ONLY 3 /* Need at least GLX 1.2 */ + +/* string codes */ +#define GLEW_VERSION 1 +#define GLEW_VERSION_MAJOR 2 +#define GLEW_VERSION_MINOR 3 +#define GLEW_VERSION_MICRO 4 + +/* API */ +#ifdef GLEW_MX + +typedef struct GLEWContextStruct GLEWContext; +GLEWAPI GLenum glewContextInit (GLEWContext* ctx); +GLEWAPI GLboolean glewContextIsSupported (const GLEWContext* ctx, const char* name); + +#define glewInit() glewContextInit(glewGetContext()) +#define glewIsSupported(x) glewContextIsSupported(glewGetContext(), x) +#define glewIsExtensionSupported(x) glewIsSupported(x) + +#define GLEW_GET_VAR(x) (*(const GLboolean*)&(glewGetContext()->x)) +#ifdef _WIN32 +# define GLEW_GET_FUN(x) glewGetContext()->x +#else +# define GLEW_GET_FUN(x) x +#endif + +#else /* GLEW_MX */ + +GLEWAPI GLenum glewInit (); +GLEWAPI GLboolean glewIsSupported (const char* name); +#define glewIsExtensionSupported(x) glewIsSupported(x) + +#define GLEW_GET_VAR(x) (*(const GLboolean*)&x) +#define GLEW_GET_FUN(x) x + +#endif /* GLEW_MX */ + +GLEWAPI GLboolean glewExperimental; +GLEWAPI GLboolean glewGetExtension (const char* name); +GLEWAPI const GLubyte* glewGetErrorString (GLenum error); +GLEWAPI const GLubyte* glewGetString (GLenum name); + +#ifdef __cplusplus +} +#endif + +#ifdef GLEW_APIENTRY_DEFINED +#undef GLEW_APIENTRY_DEFINED +#undef APIENTRY +#undef GLAPIENTRY +#define GLAPIENTRY +#endif + +#ifdef GLEW_CALLBACK_DEFINED +#undef GLEW_CALLBACK_DEFINED +#undef CALLBACK +#endif + +#ifdef GLEW_WINGDIAPI_DEFINED +#undef GLEW_WINGDIAPI_DEFINED +#undef WINGDIAPI +#endif + +#undef GLAPI +/* #undef GLEWAPI */ + +#endif /* __glew_h__ */ diff --git a/minecraftcpp-master/handheld/lib/include/GL/glxew.h b/minecraftcpp-master/handheld/lib/include/GL/glxew.h new file mode 100644 index 0000000..68fcac2 --- /dev/null +++ b/minecraftcpp-master/handheld/lib/include/GL/glxew.h @@ -0,0 +1,1537 @@ +/* +** The OpenGL Extension Wrangler Library +** Copyright (C) 2002-2008, Milan Ikits +** Copyright (C) 2002-2008, Marcelo E. Magallon +** Copyright (C) 2002, Lev Povalahev +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** +** * Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** * The name of the author may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Mesa 3-D graphics library + * Version: 7.0 + * + * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* +** Copyright (c) 2007 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be included +** in all copies or substantial portions of the Materials. +** +** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ + +#ifndef __glxew_h__ +#define __glxew_h__ +#define __GLXEW_H__ + +#ifdef __glxext_h_ +#error glxext.h included before glxew.h +#endif + +#if defined(GLX_H) || defined(__GLX_glx_h__) || defined(__glx_h__) +#error glx.h included before glxew.h +#endif + +#define __glxext_h_ + +#define GLX_H +#define __GLX_glx_h__ +#define __glx_h__ + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* ---------------------------- GLX_VERSION_1_0 --------------------------- */ + +#ifndef GLX_VERSION_1_0 +#define GLX_VERSION_1_0 1 + +#define GLX_USE_GL 1 +#define GLX_BUFFER_SIZE 2 +#define GLX_LEVEL 3 +#define GLX_RGBA 4 +#define GLX_DOUBLEBUFFER 5 +#define GLX_STEREO 6 +#define GLX_AUX_BUFFERS 7 +#define GLX_RED_SIZE 8 +#define GLX_GREEN_SIZE 9 +#define GLX_BLUE_SIZE 10 +#define GLX_ALPHA_SIZE 11 +#define GLX_DEPTH_SIZE 12 +#define GLX_STENCIL_SIZE 13 +#define GLX_ACCUM_RED_SIZE 14 +#define GLX_ACCUM_GREEN_SIZE 15 +#define GLX_ACCUM_BLUE_SIZE 16 +#define GLX_ACCUM_ALPHA_SIZE 17 +#define GLX_BAD_SCREEN 1 +#define GLX_BAD_ATTRIBUTE 2 +#define GLX_NO_EXTENSION 3 +#define GLX_BAD_VISUAL 4 +#define GLX_BAD_CONTEXT 5 +#define GLX_BAD_VALUE 6 +#define GLX_BAD_ENUM 7 + +typedef XID GLXDrawable; +typedef XID GLXPixmap; +#ifdef __sun +typedef struct __glXContextRec *GLXContext; +#else +typedef struct __GLXcontextRec *GLXContext; +#endif + +typedef unsigned int GLXVideoDeviceNV; + +extern Bool glXQueryExtension (Display *dpy, int *errorBase, int *eventBase); +extern Bool glXQueryVersion (Display *dpy, int *major, int *minor); +extern int glXGetConfig (Display *dpy, XVisualInfo *vis, int attrib, int *value); +extern XVisualInfo* glXChooseVisual (Display *dpy, int screen, int *attribList); +extern GLXPixmap glXCreateGLXPixmap (Display *dpy, XVisualInfo *vis, Pixmap pixmap); +extern void glXDestroyGLXPixmap (Display *dpy, GLXPixmap pix); +extern GLXContext glXCreateContext (Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct); +extern void glXDestroyContext (Display *dpy, GLXContext ctx); +extern Bool glXIsDirect (Display *dpy, GLXContext ctx); +extern void glXCopyContext (Display *dpy, GLXContext src, GLXContext dst, GLulong mask); +extern Bool glXMakeCurrent (Display *dpy, GLXDrawable drawable, GLXContext ctx); +extern GLXContext glXGetCurrentContext (void); +extern GLXDrawable glXGetCurrentDrawable (void); +extern void glXWaitGL (void); +extern void glXWaitX (void); +extern void glXSwapBuffers (Display *dpy, GLXDrawable drawable); +extern void glXUseXFont (Font font, int first, int count, int listBase); + +#define GLXEW_VERSION_1_0 GLXEW_GET_VAR(__GLXEW_VERSION_1_0) + +#endif /* GLX_VERSION_1_0 */ + +/* ---------------------------- GLX_VERSION_1_1 --------------------------- */ + +#ifndef GLX_VERSION_1_1 +#define GLX_VERSION_1_1 + +#define GLX_VENDOR 0x1 +#define GLX_VERSION 0x2 +#define GLX_EXTENSIONS 0x3 + +extern const char* glXQueryExtensionsString (Display *dpy, int screen); +extern const char* glXGetClientString (Display *dpy, int name); +extern const char* glXQueryServerString (Display *dpy, int screen, int name); + +#define GLXEW_VERSION_1_1 GLXEW_GET_VAR(__GLXEW_VERSION_1_1) + +#endif /* GLX_VERSION_1_1 */ + +/* ---------------------------- GLX_VERSION_1_2 ---------------------------- */ + +#ifndef GLX_VERSION_1_2 +#define GLX_VERSION_1_2 1 + +typedef Display* ( * PFNGLXGETCURRENTDISPLAYPROC) (void); + +#define glXGetCurrentDisplay GLXEW_GET_FUN(__glewXGetCurrentDisplay) + +#define GLXEW_VERSION_1_2 GLXEW_GET_VAR(__GLXEW_VERSION_1_2) + +#endif /* GLX_VERSION_1_2 */ + +/* ---------------------------- GLX_VERSION_1_3 ---------------------------- */ + +#ifndef GLX_VERSION_1_3 +#define GLX_VERSION_1_3 1 + +#define GLX_RGBA_BIT 0x00000001 +#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001 +#define GLX_WINDOW_BIT 0x00000001 +#define GLX_COLOR_INDEX_BIT 0x00000002 +#define GLX_PIXMAP_BIT 0x00000002 +#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002 +#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004 +#define GLX_PBUFFER_BIT 0x00000004 +#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008 +#define GLX_AUX_BUFFERS_BIT 0x00000010 +#define GLX_CONFIG_CAVEAT 0x20 +#define GLX_DEPTH_BUFFER_BIT 0x00000020 +#define GLX_X_VISUAL_TYPE 0x22 +#define GLX_TRANSPARENT_TYPE 0x23 +#define GLX_TRANSPARENT_INDEX_VALUE 0x24 +#define GLX_TRANSPARENT_RED_VALUE 0x25 +#define GLX_TRANSPARENT_GREEN_VALUE 0x26 +#define GLX_TRANSPARENT_BLUE_VALUE 0x27 +#define GLX_TRANSPARENT_ALPHA_VALUE 0x28 +#define GLX_STENCIL_BUFFER_BIT 0x00000040 +#define GLX_ACCUM_BUFFER_BIT 0x00000080 +#define GLX_NONE 0x8000 +#define GLX_SLOW_CONFIG 0x8001 +#define GLX_TRUE_COLOR 0x8002 +#define GLX_DIRECT_COLOR 0x8003 +#define GLX_PSEUDO_COLOR 0x8004 +#define GLX_STATIC_COLOR 0x8005 +#define GLX_GRAY_SCALE 0x8006 +#define GLX_STATIC_GRAY 0x8007 +#define GLX_TRANSPARENT_RGB 0x8008 +#define GLX_TRANSPARENT_INDEX 0x8009 +#define GLX_VISUAL_ID 0x800B +#define GLX_SCREEN 0x800C +#define GLX_NON_CONFORMANT_CONFIG 0x800D +#define GLX_DRAWABLE_TYPE 0x8010 +#define GLX_RENDER_TYPE 0x8011 +#define GLX_X_RENDERABLE 0x8012 +#define GLX_FBCONFIG_ID 0x8013 +#define GLX_RGBA_TYPE 0x8014 +#define GLX_COLOR_INDEX_TYPE 0x8015 +#define GLX_MAX_PBUFFER_WIDTH 0x8016 +#define GLX_MAX_PBUFFER_HEIGHT 0x8017 +#define GLX_MAX_PBUFFER_PIXELS 0x8018 +#define GLX_PRESERVED_CONTENTS 0x801B +#define GLX_LARGEST_PBUFFER 0x801C +#define GLX_WIDTH 0x801D +#define GLX_HEIGHT 0x801E +#define GLX_EVENT_MASK 0x801F +#define GLX_DAMAGED 0x8020 +#define GLX_SAVED 0x8021 +#define GLX_WINDOW 0x8022 +#define GLX_PBUFFER 0x8023 +#define GLX_PBUFFER_HEIGHT 0x8040 +#define GLX_PBUFFER_WIDTH 0x8041 +#define GLX_PBUFFER_CLOBBER_MASK 0x08000000 +#define GLX_DONT_CARE 0xFFFFFFFF + +typedef XID GLXFBConfigID; +typedef XID GLXPbuffer; +typedef XID GLXWindow; +typedef struct __GLXFBConfigRec *GLXFBConfig; + +typedef struct { + int event_type; + int draw_type; + unsigned long serial; + Bool send_event; + Display *display; + GLXDrawable drawable; + unsigned int buffer_mask; + unsigned int aux_buffer; + int x, y; + int width, height; + int count; +} GLXPbufferClobberEvent; +typedef union __GLXEvent { + GLXPbufferClobberEvent glxpbufferclobber; + long pad[24]; +} GLXEvent; + +typedef GLXFBConfig* ( * PFNGLXCHOOSEFBCONFIGPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); +typedef GLXContext ( * PFNGLXCREATENEWCONTEXTPROC) (Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); +typedef GLXPbuffer ( * PFNGLXCREATEPBUFFERPROC) (Display *dpy, GLXFBConfig config, const int *attrib_list); +typedef GLXPixmap ( * PFNGLXCREATEPIXMAPPROC) (Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list); +typedef GLXWindow ( * PFNGLXCREATEWINDOWPROC) (Display *dpy, GLXFBConfig config, Window win, const int *attrib_list); +typedef void ( * PFNGLXDESTROYPBUFFERPROC) (Display *dpy, GLXPbuffer pbuf); +typedef void ( * PFNGLXDESTROYPIXMAPPROC) (Display *dpy, GLXPixmap pixmap); +typedef void ( * PFNGLXDESTROYWINDOWPROC) (Display *dpy, GLXWindow win); +typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLEPROC) (void); +typedef int ( * PFNGLXGETFBCONFIGATTRIBPROC) (Display *dpy, GLXFBConfig config, int attribute, int *value); +typedef GLXFBConfig* ( * PFNGLXGETFBCONFIGSPROC) (Display *dpy, int screen, int *nelements); +typedef void ( * PFNGLXGETSELECTEDEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long *event_mask); +typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGPROC) (Display *dpy, GLXFBConfig config); +typedef Bool ( * PFNGLXMAKECONTEXTCURRENTPROC) (Display *display, GLXDrawable draw, GLXDrawable read, GLXContext ctx); +typedef int ( * PFNGLXQUERYCONTEXTPROC) (Display *dpy, GLXContext ctx, int attribute, int *value); +typedef void ( * PFNGLXQUERYDRAWABLEPROC) (Display *dpy, GLXDrawable draw, int attribute, unsigned int *value); +typedef void ( * PFNGLXSELECTEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long event_mask); + +#define glXChooseFBConfig GLXEW_GET_FUN(__glewXChooseFBConfig) +#define glXCreateNewContext GLXEW_GET_FUN(__glewXCreateNewContext) +#define glXCreatePbuffer GLXEW_GET_FUN(__glewXCreatePbuffer) +#define glXCreatePixmap GLXEW_GET_FUN(__glewXCreatePixmap) +#define glXCreateWindow GLXEW_GET_FUN(__glewXCreateWindow) +#define glXDestroyPbuffer GLXEW_GET_FUN(__glewXDestroyPbuffer) +#define glXDestroyPixmap GLXEW_GET_FUN(__glewXDestroyPixmap) +#define glXDestroyWindow GLXEW_GET_FUN(__glewXDestroyWindow) +#define glXGetCurrentReadDrawable GLXEW_GET_FUN(__glewXGetCurrentReadDrawable) +#define glXGetFBConfigAttrib GLXEW_GET_FUN(__glewXGetFBConfigAttrib) +#define glXGetFBConfigs GLXEW_GET_FUN(__glewXGetFBConfigs) +#define glXGetSelectedEvent GLXEW_GET_FUN(__glewXGetSelectedEvent) +#define glXGetVisualFromFBConfig GLXEW_GET_FUN(__glewXGetVisualFromFBConfig) +#define glXMakeContextCurrent GLXEW_GET_FUN(__glewXMakeContextCurrent) +#define glXQueryContext GLXEW_GET_FUN(__glewXQueryContext) +#define glXQueryDrawable GLXEW_GET_FUN(__glewXQueryDrawable) +#define glXSelectEvent GLXEW_GET_FUN(__glewXSelectEvent) + +#define GLXEW_VERSION_1_3 GLXEW_GET_VAR(__GLXEW_VERSION_1_3) + +#endif /* GLX_VERSION_1_3 */ + +/* ---------------------------- GLX_VERSION_1_4 ---------------------------- */ + +#ifndef GLX_VERSION_1_4 +#define GLX_VERSION_1_4 1 + +#define GLX_SAMPLE_BUFFERS 100000 +#define GLX_SAMPLES 100001 + +extern void ( * glXGetProcAddress (const GLubyte *procName)) (void); + +#define GLXEW_VERSION_1_4 GLXEW_GET_VAR(__GLXEW_VERSION_1_4) + +#endif /* GLX_VERSION_1_4 */ + +/* -------------------------- GLX_3DFX_multisample ------------------------- */ + +#ifndef GLX_3DFX_multisample +#define GLX_3DFX_multisample 1 + +#define GLX_SAMPLE_BUFFERS_3DFX 0x8050 +#define GLX_SAMPLES_3DFX 0x8051 + +#define GLXEW_3DFX_multisample GLXEW_GET_VAR(__GLXEW_3DFX_multisample) + +#endif /* GLX_3DFX_multisample */ + +/* ------------------------ GLX_AMD_gpu_association ------------------------ */ + +#ifndef GLX_AMD_gpu_association +#define GLX_AMD_gpu_association 1 + +#define GLX_GPU_VENDOR_AMD 0x1F00 +#define GLX_GPU_RENDERER_STRING_AMD 0x1F01 +#define GLX_GPU_OPENGL_VERSION_STRING_AMD 0x1F02 +#define GLX_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2 +#define GLX_GPU_RAM_AMD 0x21A3 +#define GLX_GPU_CLOCK_AMD 0x21A4 +#define GLX_GPU_NUM_PIPES_AMD 0x21A5 +#define GLX_GPU_NUM_SIMD_AMD 0x21A6 +#define GLX_GPU_NUM_RB_AMD 0x21A7 +#define GLX_GPU_NUM_SPI_AMD 0x21A8 + +#define GLXEW_AMD_gpu_association GLXEW_GET_VAR(__GLXEW_AMD_gpu_association) + +#endif /* GLX_AMD_gpu_association */ + +/* ------------------------- GLX_ARB_create_context ------------------------ */ + +#ifndef GLX_ARB_create_context +#define GLX_ARB_create_context 1 + +#define GLX_CONTEXT_DEBUG_BIT_ARB 0x0001 +#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 +#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091 +#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092 +#define GLX_CONTEXT_FLAGS_ARB 0x2094 + +typedef GLXContext ( * PFNGLXCREATECONTEXTATTRIBSARBPROC) (Display* dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list); + +#define glXCreateContextAttribsARB GLXEW_GET_FUN(__glewXCreateContextAttribsARB) + +#define GLXEW_ARB_create_context GLXEW_GET_VAR(__GLXEW_ARB_create_context) + +#endif /* GLX_ARB_create_context */ + +/* --------------------- GLX_ARB_create_context_profile -------------------- */ + +#ifndef GLX_ARB_create_context_profile +#define GLX_ARB_create_context_profile 1 + +#define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 +#define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 +#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126 + +#define GLXEW_ARB_create_context_profile GLXEW_GET_VAR(__GLXEW_ARB_create_context_profile) + +#endif /* GLX_ARB_create_context_profile */ + +/* ------------------- GLX_ARB_create_context_robustness ------------------- */ + +#ifndef GLX_ARB_create_context_robustness +#define GLX_ARB_create_context_robustness 1 + +#define GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004 +#define GLX_LOSE_CONTEXT_ON_RESET_ARB 0x8252 +#define GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 +#define GLX_NO_RESET_NOTIFICATION_ARB 0x8261 + +#define GLXEW_ARB_create_context_robustness GLXEW_GET_VAR(__GLXEW_ARB_create_context_robustness) + +#endif /* GLX_ARB_create_context_robustness */ + +/* ------------------------- GLX_ARB_fbconfig_float ------------------------ */ + +#ifndef GLX_ARB_fbconfig_float +#define GLX_ARB_fbconfig_float 1 + +#define GLX_RGBA_FLOAT_BIT 0x00000004 +#define GLX_RGBA_FLOAT_TYPE 0x20B9 + +#define GLXEW_ARB_fbconfig_float GLXEW_GET_VAR(__GLXEW_ARB_fbconfig_float) + +#endif /* GLX_ARB_fbconfig_float */ + +/* ------------------------ GLX_ARB_framebuffer_sRGB ----------------------- */ + +#ifndef GLX_ARB_framebuffer_sRGB +#define GLX_ARB_framebuffer_sRGB 1 + +#define GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20B2 + +#define GLXEW_ARB_framebuffer_sRGB GLXEW_GET_VAR(__GLXEW_ARB_framebuffer_sRGB) + +#endif /* GLX_ARB_framebuffer_sRGB */ + +/* ------------------------ GLX_ARB_get_proc_address ----------------------- */ + +#ifndef GLX_ARB_get_proc_address +#define GLX_ARB_get_proc_address 1 + +extern void ( * glXGetProcAddressARB (const GLubyte *procName)) (void); + +#define GLXEW_ARB_get_proc_address GLXEW_GET_VAR(__GLXEW_ARB_get_proc_address) + +#endif /* GLX_ARB_get_proc_address */ + +/* -------------------------- GLX_ARB_multisample -------------------------- */ + +#ifndef GLX_ARB_multisample +#define GLX_ARB_multisample 1 + +#define GLX_SAMPLE_BUFFERS_ARB 100000 +#define GLX_SAMPLES_ARB 100001 + +#define GLXEW_ARB_multisample GLXEW_GET_VAR(__GLXEW_ARB_multisample) + +#endif /* GLX_ARB_multisample */ + +/* ---------------------- GLX_ARB_vertex_buffer_object --------------------- */ + +#ifndef GLX_ARB_vertex_buffer_object +#define GLX_ARB_vertex_buffer_object 1 + +#define GLX_CONTEXT_ALLOW_BUFFER_BYTE_ORDER_MISMATCH_ARB 0x2095 + +#define GLXEW_ARB_vertex_buffer_object GLXEW_GET_VAR(__GLXEW_ARB_vertex_buffer_object) + +#endif /* GLX_ARB_vertex_buffer_object */ + +/* ----------------------- GLX_ATI_pixel_format_float ---------------------- */ + +#ifndef GLX_ATI_pixel_format_float +#define GLX_ATI_pixel_format_float 1 + +#define GLX_RGBA_FLOAT_ATI_BIT 0x00000100 + +#define GLXEW_ATI_pixel_format_float GLXEW_GET_VAR(__GLXEW_ATI_pixel_format_float) + +#endif /* GLX_ATI_pixel_format_float */ + +/* ------------------------- GLX_ATI_render_texture ------------------------ */ + +#ifndef GLX_ATI_render_texture +#define GLX_ATI_render_texture 1 + +#define GLX_BIND_TO_TEXTURE_RGB_ATI 0x9800 +#define GLX_BIND_TO_TEXTURE_RGBA_ATI 0x9801 +#define GLX_TEXTURE_FORMAT_ATI 0x9802 +#define GLX_TEXTURE_TARGET_ATI 0x9803 +#define GLX_MIPMAP_TEXTURE_ATI 0x9804 +#define GLX_TEXTURE_RGB_ATI 0x9805 +#define GLX_TEXTURE_RGBA_ATI 0x9806 +#define GLX_NO_TEXTURE_ATI 0x9807 +#define GLX_TEXTURE_CUBE_MAP_ATI 0x9808 +#define GLX_TEXTURE_1D_ATI 0x9809 +#define GLX_TEXTURE_2D_ATI 0x980A +#define GLX_MIPMAP_LEVEL_ATI 0x980B +#define GLX_CUBE_MAP_FACE_ATI 0x980C +#define GLX_TEXTURE_CUBE_MAP_POSITIVE_X_ATI 0x980D +#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_X_ATI 0x980E +#define GLX_TEXTURE_CUBE_MAP_POSITIVE_Y_ATI 0x980F +#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Y_ATI 0x9810 +#define GLX_TEXTURE_CUBE_MAP_POSITIVE_Z_ATI 0x9811 +#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Z_ATI 0x9812 +#define GLX_FRONT_LEFT_ATI 0x9813 +#define GLX_FRONT_RIGHT_ATI 0x9814 +#define GLX_BACK_LEFT_ATI 0x9815 +#define GLX_BACK_RIGHT_ATI 0x9816 +#define GLX_AUX0_ATI 0x9817 +#define GLX_AUX1_ATI 0x9818 +#define GLX_AUX2_ATI 0x9819 +#define GLX_AUX3_ATI 0x981A +#define GLX_AUX4_ATI 0x981B +#define GLX_AUX5_ATI 0x981C +#define GLX_AUX6_ATI 0x981D +#define GLX_AUX7_ATI 0x981E +#define GLX_AUX8_ATI 0x981F +#define GLX_AUX9_ATI 0x9820 +#define GLX_BIND_TO_TEXTURE_LUMINANCE_ATI 0x9821 +#define GLX_BIND_TO_TEXTURE_INTENSITY_ATI 0x9822 + +typedef void ( * PFNGLXBINDTEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer); +typedef void ( * PFNGLXDRAWABLEATTRIBATIPROC) (Display *dpy, GLXDrawable draw, const int *attrib_list); +typedef void ( * PFNGLXRELEASETEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer); + +#define glXBindTexImageATI GLXEW_GET_FUN(__glewXBindTexImageATI) +#define glXDrawableAttribATI GLXEW_GET_FUN(__glewXDrawableAttribATI) +#define glXReleaseTexImageATI GLXEW_GET_FUN(__glewXReleaseTexImageATI) + +#define GLXEW_ATI_render_texture GLXEW_GET_VAR(__GLXEW_ATI_render_texture) + +#endif /* GLX_ATI_render_texture */ + +/* ------------------- GLX_EXT_create_context_es2_profile ------------------ */ + +#ifndef GLX_EXT_create_context_es2_profile +#define GLX_EXT_create_context_es2_profile 1 + +#define GLX_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004 + +#define GLXEW_EXT_create_context_es2_profile GLXEW_GET_VAR(__GLXEW_EXT_create_context_es2_profile) + +#endif /* GLX_EXT_create_context_es2_profile */ + +/* --------------------- GLX_EXT_fbconfig_packed_float --------------------- */ + +#ifndef GLX_EXT_fbconfig_packed_float +#define GLX_EXT_fbconfig_packed_float 1 + +#define GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT 0x00000008 +#define GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT 0x20B1 + +#define GLXEW_EXT_fbconfig_packed_float GLXEW_GET_VAR(__GLXEW_EXT_fbconfig_packed_float) + +#endif /* GLX_EXT_fbconfig_packed_float */ + +/* ------------------------ GLX_EXT_framebuffer_sRGB ----------------------- */ + +#ifndef GLX_EXT_framebuffer_sRGB +#define GLX_EXT_framebuffer_sRGB 1 + +#define GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20B2 + +#define GLXEW_EXT_framebuffer_sRGB GLXEW_GET_VAR(__GLXEW_EXT_framebuffer_sRGB) + +#endif /* GLX_EXT_framebuffer_sRGB */ + +/* ------------------------- GLX_EXT_import_context ------------------------ */ + +#ifndef GLX_EXT_import_context +#define GLX_EXT_import_context 1 + +#define GLX_SHARE_CONTEXT_EXT 0x800A +#define GLX_VISUAL_ID_EXT 0x800B +#define GLX_SCREEN_EXT 0x800C + +typedef XID GLXContextID; + +typedef void ( * PFNGLXFREECONTEXTEXTPROC) (Display* dpy, GLXContext context); +typedef GLXContextID ( * PFNGLXGETCONTEXTIDEXTPROC) (const GLXContext context); +typedef GLXContext ( * PFNGLXIMPORTCONTEXTEXTPROC) (Display* dpy, GLXContextID contextID); +typedef int ( * PFNGLXQUERYCONTEXTINFOEXTPROC) (Display* dpy, GLXContext context, int attribute,int *value); + +#define glXFreeContextEXT GLXEW_GET_FUN(__glewXFreeContextEXT) +#define glXGetContextIDEXT GLXEW_GET_FUN(__glewXGetContextIDEXT) +#define glXImportContextEXT GLXEW_GET_FUN(__glewXImportContextEXT) +#define glXQueryContextInfoEXT GLXEW_GET_FUN(__glewXQueryContextInfoEXT) + +#define GLXEW_EXT_import_context GLXEW_GET_VAR(__GLXEW_EXT_import_context) + +#endif /* GLX_EXT_import_context */ + +/* -------------------------- GLX_EXT_scene_marker ------------------------- */ + +#ifndef GLX_EXT_scene_marker +#define GLX_EXT_scene_marker 1 + +#define GLXEW_EXT_scene_marker GLXEW_GET_VAR(__GLXEW_EXT_scene_marker) + +#endif /* GLX_EXT_scene_marker */ + +/* -------------------------- GLX_EXT_swap_control ------------------------- */ + +#ifndef GLX_EXT_swap_control +#define GLX_EXT_swap_control 1 + +#define GLX_SWAP_INTERVAL_EXT 0x20F1 +#define GLX_MAX_SWAP_INTERVAL_EXT 0x20F2 + +typedef void ( * PFNGLXSWAPINTERVALEXTPROC) (Display* dpy, GLXDrawable drawable, int interval); + +#define glXSwapIntervalEXT GLXEW_GET_FUN(__glewXSwapIntervalEXT) + +#define GLXEW_EXT_swap_control GLXEW_GET_VAR(__GLXEW_EXT_swap_control) + +#endif /* GLX_EXT_swap_control */ + +/* ---------------------- GLX_EXT_texture_from_pixmap ---------------------- */ + +#ifndef GLX_EXT_texture_from_pixmap +#define GLX_EXT_texture_from_pixmap 1 + +#define GLX_TEXTURE_1D_BIT_EXT 0x00000001 +#define GLX_TEXTURE_2D_BIT_EXT 0x00000002 +#define GLX_TEXTURE_RECTANGLE_BIT_EXT 0x00000004 +#define GLX_BIND_TO_TEXTURE_RGB_EXT 0x20D0 +#define GLX_BIND_TO_TEXTURE_RGBA_EXT 0x20D1 +#define GLX_BIND_TO_MIPMAP_TEXTURE_EXT 0x20D2 +#define GLX_BIND_TO_TEXTURE_TARGETS_EXT 0x20D3 +#define GLX_Y_INVERTED_EXT 0x20D4 +#define GLX_TEXTURE_FORMAT_EXT 0x20D5 +#define GLX_TEXTURE_TARGET_EXT 0x20D6 +#define GLX_MIPMAP_TEXTURE_EXT 0x20D7 +#define GLX_TEXTURE_FORMAT_NONE_EXT 0x20D8 +#define GLX_TEXTURE_FORMAT_RGB_EXT 0x20D9 +#define GLX_TEXTURE_FORMAT_RGBA_EXT 0x20DA +#define GLX_TEXTURE_1D_EXT 0x20DB +#define GLX_TEXTURE_2D_EXT 0x20DC +#define GLX_TEXTURE_RECTANGLE_EXT 0x20DD +#define GLX_FRONT_LEFT_EXT 0x20DE +#define GLX_FRONT_RIGHT_EXT 0x20DF +#define GLX_BACK_LEFT_EXT 0x20E0 +#define GLX_BACK_RIGHT_EXT 0x20E1 +#define GLX_AUX0_EXT 0x20E2 +#define GLX_AUX1_EXT 0x20E3 +#define GLX_AUX2_EXT 0x20E4 +#define GLX_AUX3_EXT 0x20E5 +#define GLX_AUX4_EXT 0x20E6 +#define GLX_AUX5_EXT 0x20E7 +#define GLX_AUX6_EXT 0x20E8 +#define GLX_AUX7_EXT 0x20E9 +#define GLX_AUX8_EXT 0x20EA +#define GLX_AUX9_EXT 0x20EB + +typedef void ( * PFNGLXBINDTEXIMAGEEXTPROC) (Display* display, GLXDrawable drawable, int buffer, const int *attrib_list); +typedef void ( * PFNGLXRELEASETEXIMAGEEXTPROC) (Display* display, GLXDrawable drawable, int buffer); + +#define glXBindTexImageEXT GLXEW_GET_FUN(__glewXBindTexImageEXT) +#define glXReleaseTexImageEXT GLXEW_GET_FUN(__glewXReleaseTexImageEXT) + +#define GLXEW_EXT_texture_from_pixmap GLXEW_GET_VAR(__GLXEW_EXT_texture_from_pixmap) + +#endif /* GLX_EXT_texture_from_pixmap */ + +/* -------------------------- GLX_EXT_visual_info -------------------------- */ + +#ifndef GLX_EXT_visual_info +#define GLX_EXT_visual_info 1 + +#define GLX_X_VISUAL_TYPE_EXT 0x22 +#define GLX_TRANSPARENT_TYPE_EXT 0x23 +#define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24 +#define GLX_TRANSPARENT_RED_VALUE_EXT 0x25 +#define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26 +#define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27 +#define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28 +#define GLX_NONE_EXT 0x8000 +#define GLX_TRUE_COLOR_EXT 0x8002 +#define GLX_DIRECT_COLOR_EXT 0x8003 +#define GLX_PSEUDO_COLOR_EXT 0x8004 +#define GLX_STATIC_COLOR_EXT 0x8005 +#define GLX_GRAY_SCALE_EXT 0x8006 +#define GLX_STATIC_GRAY_EXT 0x8007 +#define GLX_TRANSPARENT_RGB_EXT 0x8008 +#define GLX_TRANSPARENT_INDEX_EXT 0x8009 + +#define GLXEW_EXT_visual_info GLXEW_GET_VAR(__GLXEW_EXT_visual_info) + +#endif /* GLX_EXT_visual_info */ + +/* ------------------------- GLX_EXT_visual_rating ------------------------- */ + +#ifndef GLX_EXT_visual_rating +#define GLX_EXT_visual_rating 1 + +#define GLX_VISUAL_CAVEAT_EXT 0x20 +#define GLX_SLOW_VISUAL_EXT 0x8001 +#define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D + +#define GLXEW_EXT_visual_rating GLXEW_GET_VAR(__GLXEW_EXT_visual_rating) + +#endif /* GLX_EXT_visual_rating */ + +/* -------------------------- GLX_INTEL_swap_event ------------------------- */ + +#ifndef GLX_INTEL_swap_event +#define GLX_INTEL_swap_event 1 + +#define GLX_EXCHANGE_COMPLETE_INTEL 0x8180 +#define GLX_COPY_COMPLETE_INTEL 0x8181 +#define GLX_FLIP_COMPLETE_INTEL 0x8182 +#define GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK 0x04000000 + +#define GLXEW_INTEL_swap_event GLXEW_GET_VAR(__GLXEW_INTEL_swap_event) + +#endif /* GLX_INTEL_swap_event */ + +/* -------------------------- GLX_MESA_agp_offset -------------------------- */ + +#ifndef GLX_MESA_agp_offset +#define GLX_MESA_agp_offset 1 + +typedef unsigned int ( * PFNGLXGETAGPOFFSETMESAPROC) (const void* pointer); + +#define glXGetAGPOffsetMESA GLXEW_GET_FUN(__glewXGetAGPOffsetMESA) + +#define GLXEW_MESA_agp_offset GLXEW_GET_VAR(__GLXEW_MESA_agp_offset) + +#endif /* GLX_MESA_agp_offset */ + +/* ------------------------ GLX_MESA_copy_sub_buffer ----------------------- */ + +#ifndef GLX_MESA_copy_sub_buffer +#define GLX_MESA_copy_sub_buffer 1 + +typedef void ( * PFNGLXCOPYSUBBUFFERMESAPROC) (Display* dpy, GLXDrawable drawable, int x, int y, int width, int height); + +#define glXCopySubBufferMESA GLXEW_GET_FUN(__glewXCopySubBufferMESA) + +#define GLXEW_MESA_copy_sub_buffer GLXEW_GET_VAR(__GLXEW_MESA_copy_sub_buffer) + +#endif /* GLX_MESA_copy_sub_buffer */ + +/* ------------------------ GLX_MESA_pixmap_colormap ----------------------- */ + +#ifndef GLX_MESA_pixmap_colormap +#define GLX_MESA_pixmap_colormap 1 + +typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPMESAPROC) (Display* dpy, XVisualInfo *visual, Pixmap pixmap, Colormap cmap); + +#define glXCreateGLXPixmapMESA GLXEW_GET_FUN(__glewXCreateGLXPixmapMESA) + +#define GLXEW_MESA_pixmap_colormap GLXEW_GET_VAR(__GLXEW_MESA_pixmap_colormap) + +#endif /* GLX_MESA_pixmap_colormap */ + +/* ------------------------ GLX_MESA_release_buffers ----------------------- */ + +#ifndef GLX_MESA_release_buffers +#define GLX_MESA_release_buffers 1 + +typedef Bool ( * PFNGLXRELEASEBUFFERSMESAPROC) (Display* dpy, GLXDrawable d); + +#define glXReleaseBuffersMESA GLXEW_GET_FUN(__glewXReleaseBuffersMESA) + +#define GLXEW_MESA_release_buffers GLXEW_GET_VAR(__GLXEW_MESA_release_buffers) + +#endif /* GLX_MESA_release_buffers */ + +/* ------------------------- GLX_MESA_set_3dfx_mode ------------------------ */ + +#ifndef GLX_MESA_set_3dfx_mode +#define GLX_MESA_set_3dfx_mode 1 + +#define GLX_3DFX_WINDOW_MODE_MESA 0x1 +#define GLX_3DFX_FULLSCREEN_MODE_MESA 0x2 + +typedef GLboolean ( * PFNGLXSET3DFXMODEMESAPROC) (GLint mode); + +#define glXSet3DfxModeMESA GLXEW_GET_FUN(__glewXSet3DfxModeMESA) + +#define GLXEW_MESA_set_3dfx_mode GLXEW_GET_VAR(__GLXEW_MESA_set_3dfx_mode) + +#endif /* GLX_MESA_set_3dfx_mode */ + +/* --------------------------- GLX_NV_copy_image --------------------------- */ + +#ifndef GLX_NV_copy_image +#define GLX_NV_copy_image 1 + +typedef void ( * PFNGLXCOPYIMAGESUBDATANVPROC) (Display *dpy, GLXContext srcCtx, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLXContext dstCtx, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); + +#define glXCopyImageSubDataNV GLXEW_GET_FUN(__glewXCopyImageSubDataNV) + +#define GLXEW_NV_copy_image GLXEW_GET_VAR(__GLXEW_NV_copy_image) + +#endif /* GLX_NV_copy_image */ + +/* -------------------------- GLX_NV_float_buffer -------------------------- */ + +#ifndef GLX_NV_float_buffer +#define GLX_NV_float_buffer 1 + +#define GLX_FLOAT_COMPONENTS_NV 0x20B0 + +#define GLXEW_NV_float_buffer GLXEW_GET_VAR(__GLXEW_NV_float_buffer) + +#endif /* GLX_NV_float_buffer */ + +/* ---------------------- GLX_NV_multisample_coverage ---------------------- */ + +#ifndef GLX_NV_multisample_coverage +#define GLX_NV_multisample_coverage 1 + +#define GLX_COLOR_SAMPLES_NV 0x20B3 +#define GLX_COVERAGE_SAMPLES_NV 100001 + +#define GLXEW_NV_multisample_coverage GLXEW_GET_VAR(__GLXEW_NV_multisample_coverage) + +#endif /* GLX_NV_multisample_coverage */ + +/* -------------------------- GLX_NV_present_video ------------------------- */ + +#ifndef GLX_NV_present_video +#define GLX_NV_present_video 1 + +#define GLX_NUM_VIDEO_SLOTS_NV 0x20F0 + +typedef int ( * PFNGLXBINDVIDEODEVICENVPROC) (Display* dpy, unsigned int video_slot, unsigned int video_device, const int *attrib_list); +typedef unsigned int* ( * PFNGLXENUMERATEVIDEODEVICESNVPROC) (Display *dpy, int screen, int *nelements); + +#define glXBindVideoDeviceNV GLXEW_GET_FUN(__glewXBindVideoDeviceNV) +#define glXEnumerateVideoDevicesNV GLXEW_GET_FUN(__glewXEnumerateVideoDevicesNV) + +#define GLXEW_NV_present_video GLXEW_GET_VAR(__GLXEW_NV_present_video) + +#endif /* GLX_NV_present_video */ + +/* --------------------------- GLX_NV_swap_group --------------------------- */ + +#ifndef GLX_NV_swap_group +#define GLX_NV_swap_group 1 + +typedef Bool ( * PFNGLXBINDSWAPBARRIERNVPROC) (Display* dpy, GLuint group, GLuint barrier); +typedef Bool ( * PFNGLXJOINSWAPGROUPNVPROC) (Display* dpy, GLXDrawable drawable, GLuint group); +typedef Bool ( * PFNGLXQUERYFRAMECOUNTNVPROC) (Display* dpy, int screen, GLuint *count); +typedef Bool ( * PFNGLXQUERYMAXSWAPGROUPSNVPROC) (Display* dpy, int screen, GLuint *maxGroups, GLuint *maxBarriers); +typedef Bool ( * PFNGLXQUERYSWAPGROUPNVPROC) (Display* dpy, GLXDrawable drawable, GLuint *group, GLuint *barrier); +typedef Bool ( * PFNGLXRESETFRAMECOUNTNVPROC) (Display* dpy, int screen); + +#define glXBindSwapBarrierNV GLXEW_GET_FUN(__glewXBindSwapBarrierNV) +#define glXJoinSwapGroupNV GLXEW_GET_FUN(__glewXJoinSwapGroupNV) +#define glXQueryFrameCountNV GLXEW_GET_FUN(__glewXQueryFrameCountNV) +#define glXQueryMaxSwapGroupsNV GLXEW_GET_FUN(__glewXQueryMaxSwapGroupsNV) +#define glXQuerySwapGroupNV GLXEW_GET_FUN(__glewXQuerySwapGroupNV) +#define glXResetFrameCountNV GLXEW_GET_FUN(__glewXResetFrameCountNV) + +#define GLXEW_NV_swap_group GLXEW_GET_VAR(__GLXEW_NV_swap_group) + +#endif /* GLX_NV_swap_group */ + +/* ----------------------- GLX_NV_vertex_array_range ----------------------- */ + +#ifndef GLX_NV_vertex_array_range +#define GLX_NV_vertex_array_range 1 + +typedef void * ( * PFNGLXALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority); +typedef void ( * PFNGLXFREEMEMORYNVPROC) (void *pointer); + +#define glXAllocateMemoryNV GLXEW_GET_FUN(__glewXAllocateMemoryNV) +#define glXFreeMemoryNV GLXEW_GET_FUN(__glewXFreeMemoryNV) + +#define GLXEW_NV_vertex_array_range GLXEW_GET_VAR(__GLXEW_NV_vertex_array_range) + +#endif /* GLX_NV_vertex_array_range */ + +/* -------------------------- GLX_NV_video_output -------------------------- */ + +#ifndef GLX_NV_video_output +#define GLX_NV_video_output 1 + +#define GLX_VIDEO_OUT_COLOR_NV 0x20C3 +#define GLX_VIDEO_OUT_ALPHA_NV 0x20C4 +#define GLX_VIDEO_OUT_DEPTH_NV 0x20C5 +#define GLX_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6 +#define GLX_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7 +#define GLX_VIDEO_OUT_FRAME_NV 0x20C8 +#define GLX_VIDEO_OUT_FIELD_1_NV 0x20C9 +#define GLX_VIDEO_OUT_FIELD_2_NV 0x20CA +#define GLX_VIDEO_OUT_STACKED_FIELDS_1_2_NV 0x20CB +#define GLX_VIDEO_OUT_STACKED_FIELDS_2_1_NV 0x20CC + +typedef int ( * PFNGLXBINDVIDEOIMAGENVPROC) (Display* dpy, GLXVideoDeviceNV VideoDevice, GLXPbuffer pbuf, int iVideoBuffer); +typedef int ( * PFNGLXGETVIDEODEVICENVPROC) (Display* dpy, int screen, int numVideoDevices, GLXVideoDeviceNV *pVideoDevice); +typedef int ( * PFNGLXGETVIDEOINFONVPROC) (Display* dpy, int screen, GLXVideoDeviceNV VideoDevice, unsigned long *pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo); +typedef int ( * PFNGLXRELEASEVIDEODEVICENVPROC) (Display* dpy, int screen, GLXVideoDeviceNV VideoDevice); +typedef int ( * PFNGLXRELEASEVIDEOIMAGENVPROC) (Display* dpy, GLXPbuffer pbuf); +typedef int ( * PFNGLXSENDPBUFFERTOVIDEONVPROC) (Display* dpy, GLXPbuffer pbuf, int iBufferType, unsigned long *pulCounterPbuffer, GLboolean bBlock); + +#define glXBindVideoImageNV GLXEW_GET_FUN(__glewXBindVideoImageNV) +#define glXGetVideoDeviceNV GLXEW_GET_FUN(__glewXGetVideoDeviceNV) +#define glXGetVideoInfoNV GLXEW_GET_FUN(__glewXGetVideoInfoNV) +#define glXReleaseVideoDeviceNV GLXEW_GET_FUN(__glewXReleaseVideoDeviceNV) +#define glXReleaseVideoImageNV GLXEW_GET_FUN(__glewXReleaseVideoImageNV) +#define glXSendPbufferToVideoNV GLXEW_GET_FUN(__glewXSendPbufferToVideoNV) + +#define GLXEW_NV_video_output GLXEW_GET_VAR(__GLXEW_NV_video_output) + +#endif /* GLX_NV_video_output */ + +/* -------------------------- GLX_OML_swap_method -------------------------- */ + +#ifndef GLX_OML_swap_method +#define GLX_OML_swap_method 1 + +#define GLX_SWAP_METHOD_OML 0x8060 +#define GLX_SWAP_EXCHANGE_OML 0x8061 +#define GLX_SWAP_COPY_OML 0x8062 +#define GLX_SWAP_UNDEFINED_OML 0x8063 + +#define GLXEW_OML_swap_method GLXEW_GET_VAR(__GLXEW_OML_swap_method) + +#endif /* GLX_OML_swap_method */ + +/* -------------------------- GLX_OML_sync_control ------------------------- */ + +#if !defined(GLX_OML_sync_control) && defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) +#include +#define GLX_OML_sync_control 1 + +typedef Bool ( * PFNGLXGETMSCRATEOMLPROC) (Display* dpy, GLXDrawable drawable, int32_t* numerator, int32_t* denominator); +typedef Bool ( * PFNGLXGETSYNCVALUESOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t* ust, int64_t* msc, int64_t* sbc); +typedef int64_t ( * PFNGLXSWAPBUFFERSMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder); +typedef Bool ( * PFNGLXWAITFORMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t* ust, int64_t* msc, int64_t* sbc); +typedef Bool ( * PFNGLXWAITFORSBCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_sbc, int64_t* ust, int64_t* msc, int64_t* sbc); + +#define glXGetMscRateOML GLXEW_GET_FUN(__glewXGetMscRateOML) +#define glXGetSyncValuesOML GLXEW_GET_FUN(__glewXGetSyncValuesOML) +#define glXSwapBuffersMscOML GLXEW_GET_FUN(__glewXSwapBuffersMscOML) +#define glXWaitForMscOML GLXEW_GET_FUN(__glewXWaitForMscOML) +#define glXWaitForSbcOML GLXEW_GET_FUN(__glewXWaitForSbcOML) + +#define GLXEW_OML_sync_control GLXEW_GET_VAR(__GLXEW_OML_sync_control) + +#endif /* GLX_OML_sync_control */ + +/* ------------------------ GLX_SGIS_blended_overlay ----------------------- */ + +#ifndef GLX_SGIS_blended_overlay +#define GLX_SGIS_blended_overlay 1 + +#define GLX_BLENDED_RGBA_SGIS 0x8025 + +#define GLXEW_SGIS_blended_overlay GLXEW_GET_VAR(__GLXEW_SGIS_blended_overlay) + +#endif /* GLX_SGIS_blended_overlay */ + +/* -------------------------- GLX_SGIS_color_range ------------------------- */ + +#ifndef GLX_SGIS_color_range +#define GLX_SGIS_color_range 1 + +#define GLX_MIN_RED_SGIS 0 +#define GLX_MAX_GREEN_SGIS 0 +#define GLX_MIN_BLUE_SGIS 0 +#define GLX_MAX_ALPHA_SGIS 0 +#define GLX_MIN_GREEN_SGIS 0 +#define GLX_MIN_ALPHA_SGIS 0 +#define GLX_MAX_RED_SGIS 0 +#define GLX_EXTENDED_RANGE_SGIS 0 +#define GLX_MAX_BLUE_SGIS 0 + +#define GLXEW_SGIS_color_range GLXEW_GET_VAR(__GLXEW_SGIS_color_range) + +#endif /* GLX_SGIS_color_range */ + +/* -------------------------- GLX_SGIS_multisample ------------------------- */ + +#ifndef GLX_SGIS_multisample +#define GLX_SGIS_multisample 1 + +#define GLX_SAMPLE_BUFFERS_SGIS 100000 +#define GLX_SAMPLES_SGIS 100001 + +#define GLXEW_SGIS_multisample GLXEW_GET_VAR(__GLXEW_SGIS_multisample) + +#endif /* GLX_SGIS_multisample */ + +/* ---------------------- GLX_SGIS_shared_multisample ---------------------- */ + +#ifndef GLX_SGIS_shared_multisample +#define GLX_SGIS_shared_multisample 1 + +#define GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS 0x8026 +#define GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS 0x8027 + +#define GLXEW_SGIS_shared_multisample GLXEW_GET_VAR(__GLXEW_SGIS_shared_multisample) + +#endif /* GLX_SGIS_shared_multisample */ + +/* --------------------------- GLX_SGIX_fbconfig --------------------------- */ + +#ifndef GLX_SGIX_fbconfig +#define GLX_SGIX_fbconfig 1 + +#define GLX_WINDOW_BIT_SGIX 0x00000001 +#define GLX_RGBA_BIT_SGIX 0x00000001 +#define GLX_PIXMAP_BIT_SGIX 0x00000002 +#define GLX_COLOR_INDEX_BIT_SGIX 0x00000002 +#define GLX_SCREEN_EXT 0x800C +#define GLX_DRAWABLE_TYPE_SGIX 0x8010 +#define GLX_RENDER_TYPE_SGIX 0x8011 +#define GLX_X_RENDERABLE_SGIX 0x8012 +#define GLX_FBCONFIG_ID_SGIX 0x8013 +#define GLX_RGBA_TYPE_SGIX 0x8014 +#define GLX_COLOR_INDEX_TYPE_SGIX 0x8015 + +typedef XID GLXFBConfigIDSGIX; +typedef struct __GLXFBConfigRec *GLXFBConfigSGIX; + +typedef GLXFBConfigSGIX* ( * PFNGLXCHOOSEFBCONFIGSGIXPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); +typedef GLXContext ( * PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); +typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, Pixmap pixmap); +typedef int ( * PFNGLXGETFBCONFIGATTRIBSGIXPROC) (Display* dpy, GLXFBConfigSGIX config, int attribute, int *value); +typedef GLXFBConfigSGIX ( * PFNGLXGETFBCONFIGFROMVISUALSGIXPROC) (Display* dpy, XVisualInfo *vis); +typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display *dpy, GLXFBConfig config); + +#define glXChooseFBConfigSGIX GLXEW_GET_FUN(__glewXChooseFBConfigSGIX) +#define glXCreateContextWithConfigSGIX GLXEW_GET_FUN(__glewXCreateContextWithConfigSGIX) +#define glXCreateGLXPixmapWithConfigSGIX GLXEW_GET_FUN(__glewXCreateGLXPixmapWithConfigSGIX) +#define glXGetFBConfigAttribSGIX GLXEW_GET_FUN(__glewXGetFBConfigAttribSGIX) +#define glXGetFBConfigFromVisualSGIX GLXEW_GET_FUN(__glewXGetFBConfigFromVisualSGIX) +#define glXGetVisualFromFBConfigSGIX GLXEW_GET_FUN(__glewXGetVisualFromFBConfigSGIX) + +#define GLXEW_SGIX_fbconfig GLXEW_GET_VAR(__GLXEW_SGIX_fbconfig) + +#endif /* GLX_SGIX_fbconfig */ + +/* --------------------------- GLX_SGIX_hyperpipe -------------------------- */ + +#ifndef GLX_SGIX_hyperpipe +#define GLX_SGIX_hyperpipe 1 + +#define GLX_HYPERPIPE_DISPLAY_PIPE_SGIX 0x00000001 +#define GLX_PIPE_RECT_SGIX 0x00000001 +#define GLX_PIPE_RECT_LIMITS_SGIX 0x00000002 +#define GLX_HYPERPIPE_RENDER_PIPE_SGIX 0x00000002 +#define GLX_HYPERPIPE_STEREO_SGIX 0x00000003 +#define GLX_HYPERPIPE_PIXEL_AVERAGE_SGIX 0x00000004 +#define GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX 80 +#define GLX_BAD_HYPERPIPE_CONFIG_SGIX 91 +#define GLX_BAD_HYPERPIPE_SGIX 92 +#define GLX_HYPERPIPE_ID_SGIX 0x8030 + +typedef struct { + char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; + int networkId; +} GLXHyperpipeNetworkSGIX; +typedef struct { + char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; + int XOrigin; + int YOrigin; + int maxHeight; + int maxWidth; +} GLXPipeRectLimits; +typedef struct { + char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; + int channel; + unsigned int participationType; + int timeSlice; +} GLXHyperpipeConfigSGIX; +typedef struct { + char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; + int srcXOrigin; + int srcYOrigin; + int srcWidth; + int srcHeight; + int destXOrigin; + int destYOrigin; + int destWidth; + int destHeight; +} GLXPipeRect; + +typedef int ( * PFNGLXBINDHYPERPIPESGIXPROC) (Display *dpy, int hpId); +typedef int ( * PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC) (Display *dpy, int hpId); +typedef int ( * PFNGLXHYPERPIPEATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *attribList); +typedef int ( * PFNGLXHYPERPIPECONFIGSGIXPROC) (Display *dpy, int networkId, int npipes, GLXHyperpipeConfigSGIX *cfg, int *hpId); +typedef int ( * PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *returnAttribList); +typedef int ( * PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *attribList, void *returnAttribList); +typedef GLXHyperpipeConfigSGIX * ( * PFNGLXQUERYHYPERPIPECONFIGSGIXPROC) (Display *dpy, int hpId, int *npipes); +typedef GLXHyperpipeNetworkSGIX * ( * PFNGLXQUERYHYPERPIPENETWORKSGIXPROC) (Display *dpy, int *npipes); + +#define glXBindHyperpipeSGIX GLXEW_GET_FUN(__glewXBindHyperpipeSGIX) +#define glXDestroyHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXDestroyHyperpipeConfigSGIX) +#define glXHyperpipeAttribSGIX GLXEW_GET_FUN(__glewXHyperpipeAttribSGIX) +#define glXHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXHyperpipeConfigSGIX) +#define glXQueryHyperpipeAttribSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeAttribSGIX) +#define glXQueryHyperpipeBestAttribSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeBestAttribSGIX) +#define glXQueryHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeConfigSGIX) +#define glXQueryHyperpipeNetworkSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeNetworkSGIX) + +#define GLXEW_SGIX_hyperpipe GLXEW_GET_VAR(__GLXEW_SGIX_hyperpipe) + +#endif /* GLX_SGIX_hyperpipe */ + +/* ---------------------------- GLX_SGIX_pbuffer --------------------------- */ + +#ifndef GLX_SGIX_pbuffer +#define GLX_SGIX_pbuffer 1 + +#define GLX_FRONT_LEFT_BUFFER_BIT_SGIX 0x00000001 +#define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX 0x00000002 +#define GLX_PBUFFER_BIT_SGIX 0x00000004 +#define GLX_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004 +#define GLX_BACK_RIGHT_BUFFER_BIT_SGIX 0x00000008 +#define GLX_AUX_BUFFERS_BIT_SGIX 0x00000010 +#define GLX_DEPTH_BUFFER_BIT_SGIX 0x00000020 +#define GLX_STENCIL_BUFFER_BIT_SGIX 0x00000040 +#define GLX_ACCUM_BUFFER_BIT_SGIX 0x00000080 +#define GLX_SAMPLE_BUFFERS_BIT_SGIX 0x00000100 +#define GLX_MAX_PBUFFER_WIDTH_SGIX 0x8016 +#define GLX_MAX_PBUFFER_HEIGHT_SGIX 0x8017 +#define GLX_MAX_PBUFFER_PIXELS_SGIX 0x8018 +#define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019 +#define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A +#define GLX_PRESERVED_CONTENTS_SGIX 0x801B +#define GLX_LARGEST_PBUFFER_SGIX 0x801C +#define GLX_WIDTH_SGIX 0x801D +#define GLX_HEIGHT_SGIX 0x801E +#define GLX_EVENT_MASK_SGIX 0x801F +#define GLX_DAMAGED_SGIX 0x8020 +#define GLX_SAVED_SGIX 0x8021 +#define GLX_WINDOW_SGIX 0x8022 +#define GLX_PBUFFER_SGIX 0x8023 +#define GLX_BUFFER_CLOBBER_MASK_SGIX 0x08000000 + +typedef XID GLXPbufferSGIX; +typedef struct { int type; unsigned long serial; Bool send_event; Display *display; GLXDrawable drawable; int event_type; int draw_type; unsigned int mask; int x, y; int width, height; int count; } GLXBufferClobberEventSGIX; + +typedef GLXPbuffer ( * PFNGLXCREATEGLXPBUFFERSGIXPROC) (Display* dpy, GLXFBConfig config, unsigned int width, unsigned int height, int *attrib_list); +typedef void ( * PFNGLXDESTROYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf); +typedef void ( * PFNGLXGETSELECTEDEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long *mask); +typedef void ( * PFNGLXQUERYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf, int attribute, unsigned int *value); +typedef void ( * PFNGLXSELECTEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long mask); + +#define glXCreateGLXPbufferSGIX GLXEW_GET_FUN(__glewXCreateGLXPbufferSGIX) +#define glXDestroyGLXPbufferSGIX GLXEW_GET_FUN(__glewXDestroyGLXPbufferSGIX) +#define glXGetSelectedEventSGIX GLXEW_GET_FUN(__glewXGetSelectedEventSGIX) +#define glXQueryGLXPbufferSGIX GLXEW_GET_FUN(__glewXQueryGLXPbufferSGIX) +#define glXSelectEventSGIX GLXEW_GET_FUN(__glewXSelectEventSGIX) + +#define GLXEW_SGIX_pbuffer GLXEW_GET_VAR(__GLXEW_SGIX_pbuffer) + +#endif /* GLX_SGIX_pbuffer */ + +/* ------------------------- GLX_SGIX_swap_barrier ------------------------- */ + +#ifndef GLX_SGIX_swap_barrier +#define GLX_SGIX_swap_barrier 1 + +typedef void ( * PFNGLXBINDSWAPBARRIERSGIXPROC) (Display *dpy, GLXDrawable drawable, int barrier); +typedef Bool ( * PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC) (Display *dpy, int screen, int *max); + +#define glXBindSwapBarrierSGIX GLXEW_GET_FUN(__glewXBindSwapBarrierSGIX) +#define glXQueryMaxSwapBarriersSGIX GLXEW_GET_FUN(__glewXQueryMaxSwapBarriersSGIX) + +#define GLXEW_SGIX_swap_barrier GLXEW_GET_VAR(__GLXEW_SGIX_swap_barrier) + +#endif /* GLX_SGIX_swap_barrier */ + +/* -------------------------- GLX_SGIX_swap_group -------------------------- */ + +#ifndef GLX_SGIX_swap_group +#define GLX_SGIX_swap_group 1 + +typedef void ( * PFNGLXJOINSWAPGROUPSGIXPROC) (Display *dpy, GLXDrawable drawable, GLXDrawable member); + +#define glXJoinSwapGroupSGIX GLXEW_GET_FUN(__glewXJoinSwapGroupSGIX) + +#define GLXEW_SGIX_swap_group GLXEW_GET_VAR(__GLXEW_SGIX_swap_group) + +#endif /* GLX_SGIX_swap_group */ + +/* ------------------------- GLX_SGIX_video_resize ------------------------- */ + +#ifndef GLX_SGIX_video_resize +#define GLX_SGIX_video_resize 1 + +#define GLX_SYNC_FRAME_SGIX 0x00000000 +#define GLX_SYNC_SWAP_SGIX 0x00000001 + +typedef int ( * PFNGLXBINDCHANNELTOWINDOWSGIXPROC) (Display* display, int screen, int channel, Window window); +typedef int ( * PFNGLXCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int x, int y, int w, int h); +typedef int ( * PFNGLXCHANNELRECTSYNCSGIXPROC) (Display* display, int screen, int channel, GLenum synctype); +typedef int ( * PFNGLXQUERYCHANNELDELTASSGIXPROC) (Display* display, int screen, int channel, int *x, int *y, int *w, int *h); +typedef int ( * PFNGLXQUERYCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int *dx, int *dy, int *dw, int *dh); + +#define glXBindChannelToWindowSGIX GLXEW_GET_FUN(__glewXBindChannelToWindowSGIX) +#define glXChannelRectSGIX GLXEW_GET_FUN(__glewXChannelRectSGIX) +#define glXChannelRectSyncSGIX GLXEW_GET_FUN(__glewXChannelRectSyncSGIX) +#define glXQueryChannelDeltasSGIX GLXEW_GET_FUN(__glewXQueryChannelDeltasSGIX) +#define glXQueryChannelRectSGIX GLXEW_GET_FUN(__glewXQueryChannelRectSGIX) + +#define GLXEW_SGIX_video_resize GLXEW_GET_VAR(__GLXEW_SGIX_video_resize) + +#endif /* GLX_SGIX_video_resize */ + +/* ---------------------- GLX_SGIX_visual_select_group --------------------- */ + +#ifndef GLX_SGIX_visual_select_group +#define GLX_SGIX_visual_select_group 1 + +#define GLX_VISUAL_SELECT_GROUP_SGIX 0x8028 + +#define GLXEW_SGIX_visual_select_group GLXEW_GET_VAR(__GLXEW_SGIX_visual_select_group) + +#endif /* GLX_SGIX_visual_select_group */ + +/* ---------------------------- GLX_SGI_cushion ---------------------------- */ + +#ifndef GLX_SGI_cushion +#define GLX_SGI_cushion 1 + +typedef void ( * PFNGLXCUSHIONSGIPROC) (Display* dpy, Window window, float cushion); + +#define glXCushionSGI GLXEW_GET_FUN(__glewXCushionSGI) + +#define GLXEW_SGI_cushion GLXEW_GET_VAR(__GLXEW_SGI_cushion) + +#endif /* GLX_SGI_cushion */ + +/* ----------------------- GLX_SGI_make_current_read ----------------------- */ + +#ifndef GLX_SGI_make_current_read +#define GLX_SGI_make_current_read 1 + +typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLESGIPROC) (void); +typedef Bool ( * PFNGLXMAKECURRENTREADSGIPROC) (Display* dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx); + +#define glXGetCurrentReadDrawableSGI GLXEW_GET_FUN(__glewXGetCurrentReadDrawableSGI) +#define glXMakeCurrentReadSGI GLXEW_GET_FUN(__glewXMakeCurrentReadSGI) + +#define GLXEW_SGI_make_current_read GLXEW_GET_VAR(__GLXEW_SGI_make_current_read) + +#endif /* GLX_SGI_make_current_read */ + +/* -------------------------- GLX_SGI_swap_control ------------------------- */ + +#ifndef GLX_SGI_swap_control +#define GLX_SGI_swap_control 1 + +typedef int ( * PFNGLXSWAPINTERVALSGIPROC) (int interval); + +#define glXSwapIntervalSGI GLXEW_GET_FUN(__glewXSwapIntervalSGI) + +#define GLXEW_SGI_swap_control GLXEW_GET_VAR(__GLXEW_SGI_swap_control) + +#endif /* GLX_SGI_swap_control */ + +/* --------------------------- GLX_SGI_video_sync -------------------------- */ + +#ifndef GLX_SGI_video_sync +#define GLX_SGI_video_sync 1 + +typedef int ( * PFNGLXGETVIDEOSYNCSGIPROC) (unsigned int* count); +typedef int ( * PFNGLXWAITVIDEOSYNCSGIPROC) (int divisor, int remainder, unsigned int* count); + +#define glXGetVideoSyncSGI GLXEW_GET_FUN(__glewXGetVideoSyncSGI) +#define glXWaitVideoSyncSGI GLXEW_GET_FUN(__glewXWaitVideoSyncSGI) + +#define GLXEW_SGI_video_sync GLXEW_GET_VAR(__GLXEW_SGI_video_sync) + +#endif /* GLX_SGI_video_sync */ + +/* --------------------- GLX_SUN_get_transparent_index --------------------- */ + +#ifndef GLX_SUN_get_transparent_index +#define GLX_SUN_get_transparent_index 1 + +typedef Status ( * PFNGLXGETTRANSPARENTINDEXSUNPROC) (Display* dpy, Window overlay, Window underlay, unsigned long *pTransparentIndex); + +#define glXGetTransparentIndexSUN GLXEW_GET_FUN(__glewXGetTransparentIndexSUN) + +#define GLXEW_SUN_get_transparent_index GLXEW_GET_VAR(__GLXEW_SUN_get_transparent_index) + +#endif /* GLX_SUN_get_transparent_index */ + +/* -------------------------- GLX_SUN_video_resize ------------------------- */ + +#ifndef GLX_SUN_video_resize +#define GLX_SUN_video_resize 1 + +#define GLX_VIDEO_RESIZE_SUN 0x8171 +#define GL_VIDEO_RESIZE_COMPENSATION_SUN 0x85CD + +typedef int ( * PFNGLXGETVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float* factor); +typedef int ( * PFNGLXVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float factor); + +#define glXGetVideoResizeSUN GLXEW_GET_FUN(__glewXGetVideoResizeSUN) +#define glXVideoResizeSUN GLXEW_GET_FUN(__glewXVideoResizeSUN) + +#define GLXEW_SUN_video_resize GLXEW_GET_VAR(__GLXEW_SUN_video_resize) + +#endif /* GLX_SUN_video_resize */ + +/* ------------------------------------------------------------------------- */ + +#ifdef GLEW_MX +#define GLXEW_EXPORT +#else +#define GLXEW_EXPORT extern +#endif /* GLEW_MX */ + +extern PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay; + +extern PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig; +extern PFNGLXCREATENEWCONTEXTPROC __glewXCreateNewContext; +extern PFNGLXCREATEPBUFFERPROC __glewXCreatePbuffer; +extern PFNGLXCREATEPIXMAPPROC __glewXCreatePixmap; +extern PFNGLXCREATEWINDOWPROC __glewXCreateWindow; +extern PFNGLXDESTROYPBUFFERPROC __glewXDestroyPbuffer; +extern PFNGLXDESTROYPIXMAPPROC __glewXDestroyPixmap; +extern PFNGLXDESTROYWINDOWPROC __glewXDestroyWindow; +extern PFNGLXGETCURRENTREADDRAWABLEPROC __glewXGetCurrentReadDrawable; +extern PFNGLXGETFBCONFIGATTRIBPROC __glewXGetFBConfigAttrib; +extern PFNGLXGETFBCONFIGSPROC __glewXGetFBConfigs; +extern PFNGLXGETSELECTEDEVENTPROC __glewXGetSelectedEvent; +extern PFNGLXGETVISUALFROMFBCONFIGPROC __glewXGetVisualFromFBConfig; +extern PFNGLXMAKECONTEXTCURRENTPROC __glewXMakeContextCurrent; +extern PFNGLXQUERYCONTEXTPROC __glewXQueryContext; +extern PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable; +extern PFNGLXSELECTEVENTPROC __glewXSelectEvent; + +extern PFNGLXCREATECONTEXTATTRIBSARBPROC __glewXCreateContextAttribsARB; + +extern PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI; +extern PFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI; +extern PFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI; + +extern PFNGLXFREECONTEXTEXTPROC __glewXFreeContextEXT; +extern PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT; +extern PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT; +extern PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT; + +extern PFNGLXSWAPINTERVALEXTPROC __glewXSwapIntervalEXT; + +extern PFNGLXBINDTEXIMAGEEXTPROC __glewXBindTexImageEXT; +extern PFNGLXRELEASETEXIMAGEEXTPROC __glewXReleaseTexImageEXT; + +extern PFNGLXGETAGPOFFSETMESAPROC __glewXGetAGPOffsetMESA; + +extern PFNGLXCOPYSUBBUFFERMESAPROC __glewXCopySubBufferMESA; + +extern PFNGLXCREATEGLXPIXMAPMESAPROC __glewXCreateGLXPixmapMESA; + +extern PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA; + +extern PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA; + +extern PFNGLXCOPYIMAGESUBDATANVPROC __glewXCopyImageSubDataNV; + +extern PFNGLXBINDVIDEODEVICENVPROC __glewXBindVideoDeviceNV; +extern PFNGLXENUMERATEVIDEODEVICESNVPROC __glewXEnumerateVideoDevicesNV; + +extern PFNGLXBINDSWAPBARRIERNVPROC __glewXBindSwapBarrierNV; +extern PFNGLXJOINSWAPGROUPNVPROC __glewXJoinSwapGroupNV; +extern PFNGLXQUERYFRAMECOUNTNVPROC __glewXQueryFrameCountNV; +extern PFNGLXQUERYMAXSWAPGROUPSNVPROC __glewXQueryMaxSwapGroupsNV; +extern PFNGLXQUERYSWAPGROUPNVPROC __glewXQuerySwapGroupNV; +extern PFNGLXRESETFRAMECOUNTNVPROC __glewXResetFrameCountNV; + +extern PFNGLXALLOCATEMEMORYNVPROC __glewXAllocateMemoryNV; +extern PFNGLXFREEMEMORYNVPROC __glewXFreeMemoryNV; + +extern PFNGLXBINDVIDEOIMAGENVPROC __glewXBindVideoImageNV; +extern PFNGLXGETVIDEODEVICENVPROC __glewXGetVideoDeviceNV; +extern PFNGLXGETVIDEOINFONVPROC __glewXGetVideoInfoNV; +extern PFNGLXRELEASEVIDEODEVICENVPROC __glewXReleaseVideoDeviceNV; +extern PFNGLXRELEASEVIDEOIMAGENVPROC __glewXReleaseVideoImageNV; +extern PFNGLXSENDPBUFFERTOVIDEONVPROC __glewXSendPbufferToVideoNV; + +#ifdef GLX_OML_sync_control +extern PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML; +extern PFNGLXGETSYNCVALUESOMLPROC __glewXGetSyncValuesOML; +extern PFNGLXSWAPBUFFERSMSCOMLPROC __glewXSwapBuffersMscOML; +extern PFNGLXWAITFORMSCOMLPROC __glewXWaitForMscOML; +extern PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML; +#endif + +extern PFNGLXCHOOSEFBCONFIGSGIXPROC __glewXChooseFBConfigSGIX; +extern PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC __glewXCreateContextWithConfigSGIX; +extern PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC __glewXCreateGLXPixmapWithConfigSGIX; +extern PFNGLXGETFBCONFIGATTRIBSGIXPROC __glewXGetFBConfigAttribSGIX; +extern PFNGLXGETFBCONFIGFROMVISUALSGIXPROC __glewXGetFBConfigFromVisualSGIX; +extern PFNGLXGETVISUALFROMFBCONFIGSGIXPROC __glewXGetVisualFromFBConfigSGIX; + +extern PFNGLXBINDHYPERPIPESGIXPROC __glewXBindHyperpipeSGIX; +extern PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC __glewXDestroyHyperpipeConfigSGIX; +extern PFNGLXHYPERPIPEATTRIBSGIXPROC __glewXHyperpipeAttribSGIX; +extern PFNGLXHYPERPIPECONFIGSGIXPROC __glewXHyperpipeConfigSGIX; +extern PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC __glewXQueryHyperpipeAttribSGIX; +extern PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC __glewXQueryHyperpipeBestAttribSGIX; +extern PFNGLXQUERYHYPERPIPECONFIGSGIXPROC __glewXQueryHyperpipeConfigSGIX; +extern PFNGLXQUERYHYPERPIPENETWORKSGIXPROC __glewXQueryHyperpipeNetworkSGIX; + +extern PFNGLXCREATEGLXPBUFFERSGIXPROC __glewXCreateGLXPbufferSGIX; +extern PFNGLXDESTROYGLXPBUFFERSGIXPROC __glewXDestroyGLXPbufferSGIX; +extern PFNGLXGETSELECTEDEVENTSGIXPROC __glewXGetSelectedEventSGIX; +extern PFNGLXQUERYGLXPBUFFERSGIXPROC __glewXQueryGLXPbufferSGIX; +extern PFNGLXSELECTEVENTSGIXPROC __glewXSelectEventSGIX; + +extern PFNGLXBINDSWAPBARRIERSGIXPROC __glewXBindSwapBarrierSGIX; +extern PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC __glewXQueryMaxSwapBarriersSGIX; + +extern PFNGLXJOINSWAPGROUPSGIXPROC __glewXJoinSwapGroupSGIX; + +extern PFNGLXBINDCHANNELTOWINDOWSGIXPROC __glewXBindChannelToWindowSGIX; +extern PFNGLXCHANNELRECTSGIXPROC __glewXChannelRectSGIX; +extern PFNGLXCHANNELRECTSYNCSGIXPROC __glewXChannelRectSyncSGIX; +extern PFNGLXQUERYCHANNELDELTASSGIXPROC __glewXQueryChannelDeltasSGIX; +extern PFNGLXQUERYCHANNELRECTSGIXPROC __glewXQueryChannelRectSGIX; + +extern PFNGLXCUSHIONSGIPROC __glewXCushionSGI; + +extern PFNGLXGETCURRENTREADDRAWABLESGIPROC __glewXGetCurrentReadDrawableSGI; +extern PFNGLXMAKECURRENTREADSGIPROC __glewXMakeCurrentReadSGI; + +extern PFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI; + +extern PFNGLXGETVIDEOSYNCSGIPROC __glewXGetVideoSyncSGI; +extern PFNGLXWAITVIDEOSYNCSGIPROC __glewXWaitVideoSyncSGI; + +extern PFNGLXGETTRANSPARENTINDEXSUNPROC __glewXGetTransparentIndexSUN; + +extern PFNGLXGETVIDEORESIZESUNPROC __glewXGetVideoResizeSUN; +extern PFNGLXVIDEORESIZESUNPROC __glewXVideoResizeSUN; + +#if defined(GLEW_MX) +struct GLXEWContextStruct +{ +#endif /* GLEW_MX */ + +GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_0; +GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_1; +GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_2; +GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_3; +GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_4; +GLXEW_EXPORT GLboolean __GLXEW_3DFX_multisample; +GLXEW_EXPORT GLboolean __GLXEW_AMD_gpu_association; +GLXEW_EXPORT GLboolean __GLXEW_ARB_create_context; +GLXEW_EXPORT GLboolean __GLXEW_ARB_create_context_profile; +GLXEW_EXPORT GLboolean __GLXEW_ARB_create_context_robustness; +GLXEW_EXPORT GLboolean __GLXEW_ARB_fbconfig_float; +GLXEW_EXPORT GLboolean __GLXEW_ARB_framebuffer_sRGB; +GLXEW_EXPORT GLboolean __GLXEW_ARB_get_proc_address; +GLXEW_EXPORT GLboolean __GLXEW_ARB_multisample; +GLXEW_EXPORT GLboolean __GLXEW_ARB_vertex_buffer_object; +GLXEW_EXPORT GLboolean __GLXEW_ATI_pixel_format_float; +GLXEW_EXPORT GLboolean __GLXEW_ATI_render_texture; +GLXEW_EXPORT GLboolean __GLXEW_EXT_create_context_es2_profile; +GLXEW_EXPORT GLboolean __GLXEW_EXT_fbconfig_packed_float; +GLXEW_EXPORT GLboolean __GLXEW_EXT_framebuffer_sRGB; +GLXEW_EXPORT GLboolean __GLXEW_EXT_import_context; +GLXEW_EXPORT GLboolean __GLXEW_EXT_scene_marker; +GLXEW_EXPORT GLboolean __GLXEW_EXT_swap_control; +GLXEW_EXPORT GLboolean __GLXEW_EXT_texture_from_pixmap; +GLXEW_EXPORT GLboolean __GLXEW_EXT_visual_info; +GLXEW_EXPORT GLboolean __GLXEW_EXT_visual_rating; +GLXEW_EXPORT GLboolean __GLXEW_INTEL_swap_event; +GLXEW_EXPORT GLboolean __GLXEW_MESA_agp_offset; +GLXEW_EXPORT GLboolean __GLXEW_MESA_copy_sub_buffer; +GLXEW_EXPORT GLboolean __GLXEW_MESA_pixmap_colormap; +GLXEW_EXPORT GLboolean __GLXEW_MESA_release_buffers; +GLXEW_EXPORT GLboolean __GLXEW_MESA_set_3dfx_mode; +GLXEW_EXPORT GLboolean __GLXEW_NV_copy_image; +GLXEW_EXPORT GLboolean __GLXEW_NV_float_buffer; +GLXEW_EXPORT GLboolean __GLXEW_NV_multisample_coverage; +GLXEW_EXPORT GLboolean __GLXEW_NV_present_video; +GLXEW_EXPORT GLboolean __GLXEW_NV_swap_group; +GLXEW_EXPORT GLboolean __GLXEW_NV_vertex_array_range; +GLXEW_EXPORT GLboolean __GLXEW_NV_video_output; +GLXEW_EXPORT GLboolean __GLXEW_OML_swap_method; +GLXEW_EXPORT GLboolean __GLXEW_OML_sync_control; +GLXEW_EXPORT GLboolean __GLXEW_SGIS_blended_overlay; +GLXEW_EXPORT GLboolean __GLXEW_SGIS_color_range; +GLXEW_EXPORT GLboolean __GLXEW_SGIS_multisample; +GLXEW_EXPORT GLboolean __GLXEW_SGIS_shared_multisample; +GLXEW_EXPORT GLboolean __GLXEW_SGIX_fbconfig; +GLXEW_EXPORT GLboolean __GLXEW_SGIX_hyperpipe; +GLXEW_EXPORT GLboolean __GLXEW_SGIX_pbuffer; +GLXEW_EXPORT GLboolean __GLXEW_SGIX_swap_barrier; +GLXEW_EXPORT GLboolean __GLXEW_SGIX_swap_group; +GLXEW_EXPORT GLboolean __GLXEW_SGIX_video_resize; +GLXEW_EXPORT GLboolean __GLXEW_SGIX_visual_select_group; +GLXEW_EXPORT GLboolean __GLXEW_SGI_cushion; +GLXEW_EXPORT GLboolean __GLXEW_SGI_make_current_read; +GLXEW_EXPORT GLboolean __GLXEW_SGI_swap_control; +GLXEW_EXPORT GLboolean __GLXEW_SGI_video_sync; +GLXEW_EXPORT GLboolean __GLXEW_SUN_get_transparent_index; +GLXEW_EXPORT GLboolean __GLXEW_SUN_video_resize; + +#ifdef GLEW_MX +}; /* GLXEWContextStruct */ +#endif /* GLEW_MX */ + +/* ------------------------------------------------------------------------ */ + +#ifdef GLEW_MX + +typedef struct GLXEWContextStruct GLXEWContext; +extern GLenum glxewContextInit (GLXEWContext* ctx); +extern GLboolean glxewContextIsSupported (const GLXEWContext* ctx, const char* name); + +#define glxewInit() glxewContextInit(glxewGetContext()) +#define glxewIsSupported(x) glxewContextIsSupported(glxewGetContext(), x) + +#define GLXEW_GET_VAR(x) (*(const GLboolean*)&(glxewGetContext()->x)) +#define GLXEW_GET_FUN(x) x + +#else /* GLEW_MX */ + +#define GLXEW_GET_VAR(x) (*(const GLboolean*)&x) +#define GLXEW_GET_FUN(x) x + +extern GLboolean glxewIsSupported (const char* name); + +#endif /* GLEW_MX */ + +extern GLboolean glxewGetExtension (const char* name); + +#ifdef __cplusplus +} +#endif + +#endif /* __glxew_h__ */ diff --git a/minecraftcpp-master/handheld/lib/include/GL/wglew.h b/minecraftcpp-master/handheld/lib/include/GL/wglew.h new file mode 100644 index 0000000..39d4a61 --- /dev/null +++ b/minecraftcpp-master/handheld/lib/include/GL/wglew.h @@ -0,0 +1,1287 @@ +/* +** The OpenGL Extension Wrangler Library +** Copyright (C) 2002-2008, Milan Ikits +** Copyright (C) 2002-2008, Marcelo E. Magallon +** Copyright (C) 2002, Lev Povalahev +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** +** * Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** * The name of the author may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* +** Copyright (c) 2007 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be included +** in all copies or substantial portions of the Materials. +** +** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ + +#ifndef __wglew_h__ +#define __wglew_h__ +#define __WGLEW_H__ + +#ifdef __wglext_h_ +#error wglext.h included before wglew.h +#endif + +#define __wglext_h_ + +#if !defined(WINAPI) +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN 1 +# endif +#include +# undef WIN32_LEAN_AND_MEAN +#endif + +/* + * GLEW_STATIC needs to be set when using the static version. + * GLEW_BUILD is set when building the DLL version. + */ +#ifdef GLEW_STATIC +# define GLEWAPI extern +#else +# ifdef GLEW_BUILD +# define GLEWAPI extern __declspec(dllexport) +# else +# define GLEWAPI extern __declspec(dllimport) +# endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* -------------------------- WGL_3DFX_multisample ------------------------- */ + +#ifndef WGL_3DFX_multisample +#define WGL_3DFX_multisample 1 + +#define WGL_SAMPLE_BUFFERS_3DFX 0x2060 +#define WGL_SAMPLES_3DFX 0x2061 + +#define WGLEW_3DFX_multisample WGLEW_GET_VAR(__WGLEW_3DFX_multisample) + +#endif /* WGL_3DFX_multisample */ + +/* ------------------------- WGL_3DL_stereo_control ------------------------ */ + +#ifndef WGL_3DL_stereo_control +#define WGL_3DL_stereo_control 1 + +#define WGL_STEREO_EMITTER_ENABLE_3DL 0x2055 +#define WGL_STEREO_EMITTER_DISABLE_3DL 0x2056 +#define WGL_STEREO_POLARITY_NORMAL_3DL 0x2057 +#define WGL_STEREO_POLARITY_INVERT_3DL 0x2058 + +typedef BOOL (WINAPI * PFNWGLSETSTEREOEMITTERSTATE3DLPROC) (HDC hDC, UINT uState); + +#define wglSetStereoEmitterState3DL WGLEW_GET_FUN(__wglewSetStereoEmitterState3DL) + +#define WGLEW_3DL_stereo_control WGLEW_GET_VAR(__WGLEW_3DL_stereo_control) + +#endif /* WGL_3DL_stereo_control */ + +/* ------------------------ WGL_AMD_gpu_association ------------------------ */ + +#ifndef WGL_AMD_gpu_association +#define WGL_AMD_gpu_association 1 + +#define WGL_GPU_VENDOR_AMD 0x1F00 +#define WGL_GPU_RENDERER_STRING_AMD 0x1F01 +#define WGL_GPU_OPENGL_VERSION_STRING_AMD 0x1F02 +#define WGL_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2 +#define WGL_GPU_RAM_AMD 0x21A3 +#define WGL_GPU_CLOCK_AMD 0x21A4 +#define WGL_GPU_NUM_PIPES_AMD 0x21A5 +#define WGL_GPU_NUM_SIMD_AMD 0x21A6 +#define WGL_GPU_NUM_RB_AMD 0x21A7 +#define WGL_GPU_NUM_SPI_AMD 0x21A8 + +typedef VOID (WINAPI * PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC) (HGLRC dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC) (UINT id); +typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (UINT id, HGLRC hShareContext, const int* attribList); +typedef BOOL (WINAPI * PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC) (HGLRC hglrc); +typedef UINT (WINAPI * PFNWGLGETCONTEXTGPUIDAMDPROC) (HGLRC hglrc); +typedef HGLRC (WINAPI * PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void); +typedef UINT (WINAPI * PFNWGLGETGPUIDSAMDPROC) (UINT maxCount, UINT* ids); +typedef INT (WINAPI * PFNWGLGETGPUINFOAMDPROC) (UINT id, INT property, GLenum dataType, UINT size, void* data); +typedef BOOL (WINAPI * PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (HGLRC hglrc); + +#define wglBlitContextFramebufferAMD WGLEW_GET_FUN(__wglewBlitContextFramebufferAMD) +#define wglCreateAssociatedContextAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAMD) +#define wglCreateAssociatedContextAttribsAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAttribsAMD) +#define wglDeleteAssociatedContextAMD WGLEW_GET_FUN(__wglewDeleteAssociatedContextAMD) +#define wglGetContextGPUIDAMD WGLEW_GET_FUN(__wglewGetContextGPUIDAMD) +#define wglGetCurrentAssociatedContextAMD WGLEW_GET_FUN(__wglewGetCurrentAssociatedContextAMD) +#define wglGetGPUIDsAMD WGLEW_GET_FUN(__wglewGetGPUIDsAMD) +#define wglGetGPUInfoAMD WGLEW_GET_FUN(__wglewGetGPUInfoAMD) +#define wglMakeAssociatedContextCurrentAMD WGLEW_GET_FUN(__wglewMakeAssociatedContextCurrentAMD) + +#define WGLEW_AMD_gpu_association WGLEW_GET_VAR(__WGLEW_AMD_gpu_association) + +#endif /* WGL_AMD_gpu_association */ + +/* ------------------------- WGL_ARB_buffer_region ------------------------- */ + +#ifndef WGL_ARB_buffer_region +#define WGL_ARB_buffer_region 1 + +#define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001 +#define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002 +#define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004 +#define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008 + +typedef HANDLE (WINAPI * PFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType); +typedef VOID (WINAPI * PFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion); +typedef BOOL (WINAPI * PFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc); +typedef BOOL (WINAPI * PFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height); + +#define wglCreateBufferRegionARB WGLEW_GET_FUN(__wglewCreateBufferRegionARB) +#define wglDeleteBufferRegionARB WGLEW_GET_FUN(__wglewDeleteBufferRegionARB) +#define wglRestoreBufferRegionARB WGLEW_GET_FUN(__wglewRestoreBufferRegionARB) +#define wglSaveBufferRegionARB WGLEW_GET_FUN(__wglewSaveBufferRegionARB) + +#define WGLEW_ARB_buffer_region WGLEW_GET_VAR(__WGLEW_ARB_buffer_region) + +#endif /* WGL_ARB_buffer_region */ + +/* ------------------------- WGL_ARB_create_context ------------------------ */ + +#ifndef WGL_ARB_create_context +#define WGL_ARB_create_context 1 + +#define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001 +#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 +#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 +#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 +#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093 +#define WGL_CONTEXT_FLAGS_ARB 0x2094 + +typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int* attribList); + +#define wglCreateContextAttribsARB WGLEW_GET_FUN(__wglewCreateContextAttribsARB) + +#define WGLEW_ARB_create_context WGLEW_GET_VAR(__WGLEW_ARB_create_context) + +#endif /* WGL_ARB_create_context */ + +/* --------------------- WGL_ARB_create_context_profile -------------------- */ + +#ifndef WGL_ARB_create_context_profile +#define WGL_ARB_create_context_profile 1 + +#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 +#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 +#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126 + +#define WGLEW_ARB_create_context_profile WGLEW_GET_VAR(__WGLEW_ARB_create_context_profile) + +#endif /* WGL_ARB_create_context_profile */ + +/* ------------------- WGL_ARB_create_context_robustness ------------------- */ + +#ifndef WGL_ARB_create_context_robustness +#define WGL_ARB_create_context_robustness 1 + +#define WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004 +#define WGL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 +#define WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 +#define WGL_NO_RESET_NOTIFICATION_ARB 0x8261 + +#define WGLEW_ARB_create_context_robustness WGLEW_GET_VAR(__WGLEW_ARB_create_context_robustness) + +#endif /* WGL_ARB_create_context_robustness */ + +/* ----------------------- WGL_ARB_extensions_string ----------------------- */ + +#ifndef WGL_ARB_extensions_string +#define WGL_ARB_extensions_string 1 + +typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc); + +#define wglGetExtensionsStringARB WGLEW_GET_FUN(__wglewGetExtensionsStringARB) + +#define WGLEW_ARB_extensions_string WGLEW_GET_VAR(__WGLEW_ARB_extensions_string) + +#endif /* WGL_ARB_extensions_string */ + +/* ------------------------ WGL_ARB_framebuffer_sRGB ----------------------- */ + +#ifndef WGL_ARB_framebuffer_sRGB +#define WGL_ARB_framebuffer_sRGB 1 + +#define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9 + +#define WGLEW_ARB_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_ARB_framebuffer_sRGB) + +#endif /* WGL_ARB_framebuffer_sRGB */ + +/* ----------------------- WGL_ARB_make_current_read ----------------------- */ + +#ifndef WGL_ARB_make_current_read +#define WGL_ARB_make_current_read 1 + +#define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043 +#define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054 + +typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCARBPROC) (VOID); +typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); + +#define wglGetCurrentReadDCARB WGLEW_GET_FUN(__wglewGetCurrentReadDCARB) +#define wglMakeContextCurrentARB WGLEW_GET_FUN(__wglewMakeContextCurrentARB) + +#define WGLEW_ARB_make_current_read WGLEW_GET_VAR(__WGLEW_ARB_make_current_read) + +#endif /* WGL_ARB_make_current_read */ + +/* -------------------------- WGL_ARB_multisample -------------------------- */ + +#ifndef WGL_ARB_multisample +#define WGL_ARB_multisample 1 + +#define WGL_SAMPLE_BUFFERS_ARB 0x2041 +#define WGL_SAMPLES_ARB 0x2042 + +#define WGLEW_ARB_multisample WGLEW_GET_VAR(__WGLEW_ARB_multisample) + +#endif /* WGL_ARB_multisample */ + +/* ---------------------------- WGL_ARB_pbuffer ---------------------------- */ + +#ifndef WGL_ARB_pbuffer +#define WGL_ARB_pbuffer 1 + +#define WGL_DRAW_TO_PBUFFER_ARB 0x202D +#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E +#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F +#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030 +#define WGL_PBUFFER_LARGEST_ARB 0x2033 +#define WGL_PBUFFER_WIDTH_ARB 0x2034 +#define WGL_PBUFFER_HEIGHT_ARB 0x2035 +#define WGL_PBUFFER_LOST_ARB 0x2036 + +DECLARE_HANDLE(HPBUFFERARB); + +typedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList); +typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer); +typedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer); +typedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int* piValue); +typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC); + +#define wglCreatePbufferARB WGLEW_GET_FUN(__wglewCreatePbufferARB) +#define wglDestroyPbufferARB WGLEW_GET_FUN(__wglewDestroyPbufferARB) +#define wglGetPbufferDCARB WGLEW_GET_FUN(__wglewGetPbufferDCARB) +#define wglQueryPbufferARB WGLEW_GET_FUN(__wglewQueryPbufferARB) +#define wglReleasePbufferDCARB WGLEW_GET_FUN(__wglewReleasePbufferDCARB) + +#define WGLEW_ARB_pbuffer WGLEW_GET_VAR(__WGLEW_ARB_pbuffer) + +#endif /* WGL_ARB_pbuffer */ + +/* -------------------------- WGL_ARB_pixel_format ------------------------- */ + +#ifndef WGL_ARB_pixel_format +#define WGL_ARB_pixel_format 1 + +#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 +#define WGL_DRAW_TO_WINDOW_ARB 0x2001 +#define WGL_DRAW_TO_BITMAP_ARB 0x2002 +#define WGL_ACCELERATION_ARB 0x2003 +#define WGL_NEED_PALETTE_ARB 0x2004 +#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 +#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 +#define WGL_SWAP_METHOD_ARB 0x2007 +#define WGL_NUMBER_OVERLAYS_ARB 0x2008 +#define WGL_NUMBER_UNDERLAYS_ARB 0x2009 +#define WGL_TRANSPARENT_ARB 0x200A +#define WGL_SHARE_DEPTH_ARB 0x200C +#define WGL_SHARE_STENCIL_ARB 0x200D +#define WGL_SHARE_ACCUM_ARB 0x200E +#define WGL_SUPPORT_GDI_ARB 0x200F +#define WGL_SUPPORT_OPENGL_ARB 0x2010 +#define WGL_DOUBLE_BUFFER_ARB 0x2011 +#define WGL_STEREO_ARB 0x2012 +#define WGL_PIXEL_TYPE_ARB 0x2013 +#define WGL_COLOR_BITS_ARB 0x2014 +#define WGL_RED_BITS_ARB 0x2015 +#define WGL_RED_SHIFT_ARB 0x2016 +#define WGL_GREEN_BITS_ARB 0x2017 +#define WGL_GREEN_SHIFT_ARB 0x2018 +#define WGL_BLUE_BITS_ARB 0x2019 +#define WGL_BLUE_SHIFT_ARB 0x201A +#define WGL_ALPHA_BITS_ARB 0x201B +#define WGL_ALPHA_SHIFT_ARB 0x201C +#define WGL_ACCUM_BITS_ARB 0x201D +#define WGL_ACCUM_RED_BITS_ARB 0x201E +#define WGL_ACCUM_GREEN_BITS_ARB 0x201F +#define WGL_ACCUM_BLUE_BITS_ARB 0x2020 +#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 +#define WGL_DEPTH_BITS_ARB 0x2022 +#define WGL_STENCIL_BITS_ARB 0x2023 +#define WGL_AUX_BUFFERS_ARB 0x2024 +#define WGL_NO_ACCELERATION_ARB 0x2025 +#define WGL_GENERIC_ACCELERATION_ARB 0x2026 +#define WGL_FULL_ACCELERATION_ARB 0x2027 +#define WGL_SWAP_EXCHANGE_ARB 0x2028 +#define WGL_SWAP_COPY_ARB 0x2029 +#define WGL_SWAP_UNDEFINED_ARB 0x202A +#define WGL_TYPE_RGBA_ARB 0x202B +#define WGL_TYPE_COLORINDEX_ARB 0x202C +#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037 +#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038 +#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039 +#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A +#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B + +typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, FLOAT *pfValues); +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, int *piValues); + +#define wglChoosePixelFormatARB WGLEW_GET_FUN(__wglewChoosePixelFormatARB) +#define wglGetPixelFormatAttribfvARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvARB) +#define wglGetPixelFormatAttribivARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribivARB) + +#define WGLEW_ARB_pixel_format WGLEW_GET_VAR(__WGLEW_ARB_pixel_format) + +#endif /* WGL_ARB_pixel_format */ + +/* ----------------------- WGL_ARB_pixel_format_float ---------------------- */ + +#ifndef WGL_ARB_pixel_format_float +#define WGL_ARB_pixel_format_float 1 + +#define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0 + +#define WGLEW_ARB_pixel_format_float WGLEW_GET_VAR(__WGLEW_ARB_pixel_format_float) + +#endif /* WGL_ARB_pixel_format_float */ + +/* ------------------------- WGL_ARB_render_texture ------------------------ */ + +#ifndef WGL_ARB_render_texture +#define WGL_ARB_render_texture 1 + +#define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070 +#define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071 +#define WGL_TEXTURE_FORMAT_ARB 0x2072 +#define WGL_TEXTURE_TARGET_ARB 0x2073 +#define WGL_MIPMAP_TEXTURE_ARB 0x2074 +#define WGL_TEXTURE_RGB_ARB 0x2075 +#define WGL_TEXTURE_RGBA_ARB 0x2076 +#define WGL_NO_TEXTURE_ARB 0x2077 +#define WGL_TEXTURE_CUBE_MAP_ARB 0x2078 +#define WGL_TEXTURE_1D_ARB 0x2079 +#define WGL_TEXTURE_2D_ARB 0x207A +#define WGL_MIPMAP_LEVEL_ARB 0x207B +#define WGL_CUBE_MAP_FACE_ARB 0x207C +#define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D +#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E +#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F +#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080 +#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081 +#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082 +#define WGL_FRONT_LEFT_ARB 0x2083 +#define WGL_FRONT_RIGHT_ARB 0x2084 +#define WGL_BACK_LEFT_ARB 0x2085 +#define WGL_BACK_RIGHT_ARB 0x2086 +#define WGL_AUX0_ARB 0x2087 +#define WGL_AUX1_ARB 0x2088 +#define WGL_AUX2_ARB 0x2089 +#define WGL_AUX3_ARB 0x208A +#define WGL_AUX4_ARB 0x208B +#define WGL_AUX5_ARB 0x208C +#define WGL_AUX6_ARB 0x208D +#define WGL_AUX7_ARB 0x208E +#define WGL_AUX8_ARB 0x208F +#define WGL_AUX9_ARB 0x2090 + +typedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); +typedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); +typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int* piAttribList); + +#define wglBindTexImageARB WGLEW_GET_FUN(__wglewBindTexImageARB) +#define wglReleaseTexImageARB WGLEW_GET_FUN(__wglewReleaseTexImageARB) +#define wglSetPbufferAttribARB WGLEW_GET_FUN(__wglewSetPbufferAttribARB) + +#define WGLEW_ARB_render_texture WGLEW_GET_VAR(__WGLEW_ARB_render_texture) + +#endif /* WGL_ARB_render_texture */ + +/* ----------------------- WGL_ATI_pixel_format_float ---------------------- */ + +#ifndef WGL_ATI_pixel_format_float +#define WGL_ATI_pixel_format_float 1 + +#define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0 +#define GL_RGBA_FLOAT_MODE_ATI 0x8820 +#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 + +#define WGLEW_ATI_pixel_format_float WGLEW_GET_VAR(__WGLEW_ATI_pixel_format_float) + +#endif /* WGL_ATI_pixel_format_float */ + +/* -------------------- WGL_ATI_render_texture_rectangle ------------------- */ + +#ifndef WGL_ATI_render_texture_rectangle +#define WGL_ATI_render_texture_rectangle 1 + +#define WGL_TEXTURE_RECTANGLE_ATI 0x21A5 + +#define WGLEW_ATI_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_ATI_render_texture_rectangle) + +#endif /* WGL_ATI_render_texture_rectangle */ + +/* ------------------- WGL_EXT_create_context_es2_profile ------------------ */ + +#ifndef WGL_EXT_create_context_es2_profile +#define WGL_EXT_create_context_es2_profile 1 + +#define WGL_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004 + +#define WGLEW_EXT_create_context_es2_profile WGLEW_GET_VAR(__WGLEW_EXT_create_context_es2_profile) + +#endif /* WGL_EXT_create_context_es2_profile */ + +/* -------------------------- WGL_EXT_depth_float -------------------------- */ + +#ifndef WGL_EXT_depth_float +#define WGL_EXT_depth_float 1 + +#define WGL_DEPTH_FLOAT_EXT 0x2040 + +#define WGLEW_EXT_depth_float WGLEW_GET_VAR(__WGLEW_EXT_depth_float) + +#endif /* WGL_EXT_depth_float */ + +/* ---------------------- WGL_EXT_display_color_table ---------------------- */ + +#ifndef WGL_EXT_display_color_table +#define WGL_EXT_display_color_table 1 + +typedef GLboolean (WINAPI * PFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id); +typedef GLboolean (WINAPI * PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id); +typedef void (WINAPI * PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id); +typedef GLboolean (WINAPI * PFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (GLushort* table, GLuint length); + +#define wglBindDisplayColorTableEXT WGLEW_GET_FUN(__wglewBindDisplayColorTableEXT) +#define wglCreateDisplayColorTableEXT WGLEW_GET_FUN(__wglewCreateDisplayColorTableEXT) +#define wglDestroyDisplayColorTableEXT WGLEW_GET_FUN(__wglewDestroyDisplayColorTableEXT) +#define wglLoadDisplayColorTableEXT WGLEW_GET_FUN(__wglewLoadDisplayColorTableEXT) + +#define WGLEW_EXT_display_color_table WGLEW_GET_VAR(__WGLEW_EXT_display_color_table) + +#endif /* WGL_EXT_display_color_table */ + +/* ----------------------- WGL_EXT_extensions_string ----------------------- */ + +#ifndef WGL_EXT_extensions_string +#define WGL_EXT_extensions_string 1 + +typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (void); + +#define wglGetExtensionsStringEXT WGLEW_GET_FUN(__wglewGetExtensionsStringEXT) + +#define WGLEW_EXT_extensions_string WGLEW_GET_VAR(__WGLEW_EXT_extensions_string) + +#endif /* WGL_EXT_extensions_string */ + +/* ------------------------ WGL_EXT_framebuffer_sRGB ----------------------- */ + +#ifndef WGL_EXT_framebuffer_sRGB +#define WGL_EXT_framebuffer_sRGB 1 + +#define WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9 + +#define WGLEW_EXT_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_EXT_framebuffer_sRGB) + +#endif /* WGL_EXT_framebuffer_sRGB */ + +/* ----------------------- WGL_EXT_make_current_read ----------------------- */ + +#ifndef WGL_EXT_make_current_read +#define WGL_EXT_make_current_read 1 + +#define ERROR_INVALID_PIXEL_TYPE_EXT 0x2043 + +typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCEXTPROC) (VOID); +typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); + +#define wglGetCurrentReadDCEXT WGLEW_GET_FUN(__wglewGetCurrentReadDCEXT) +#define wglMakeContextCurrentEXT WGLEW_GET_FUN(__wglewMakeContextCurrentEXT) + +#define WGLEW_EXT_make_current_read WGLEW_GET_VAR(__WGLEW_EXT_make_current_read) + +#endif /* WGL_EXT_make_current_read */ + +/* -------------------------- WGL_EXT_multisample -------------------------- */ + +#ifndef WGL_EXT_multisample +#define WGL_EXT_multisample 1 + +#define WGL_SAMPLE_BUFFERS_EXT 0x2041 +#define WGL_SAMPLES_EXT 0x2042 + +#define WGLEW_EXT_multisample WGLEW_GET_VAR(__WGLEW_EXT_multisample) + +#endif /* WGL_EXT_multisample */ + +/* ---------------------------- WGL_EXT_pbuffer ---------------------------- */ + +#ifndef WGL_EXT_pbuffer +#define WGL_EXT_pbuffer 1 + +#define WGL_DRAW_TO_PBUFFER_EXT 0x202D +#define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E +#define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F +#define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030 +#define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031 +#define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032 +#define WGL_PBUFFER_LARGEST_EXT 0x2033 +#define WGL_PBUFFER_WIDTH_EXT 0x2034 +#define WGL_PBUFFER_HEIGHT_EXT 0x2035 + +DECLARE_HANDLE(HPBUFFEREXT); + +typedef HPBUFFEREXT (WINAPI * PFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList); +typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer); +typedef HDC (WINAPI * PFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer); +typedef BOOL (WINAPI * PFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int* piValue); +typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC); + +#define wglCreatePbufferEXT WGLEW_GET_FUN(__wglewCreatePbufferEXT) +#define wglDestroyPbufferEXT WGLEW_GET_FUN(__wglewDestroyPbufferEXT) +#define wglGetPbufferDCEXT WGLEW_GET_FUN(__wglewGetPbufferDCEXT) +#define wglQueryPbufferEXT WGLEW_GET_FUN(__wglewQueryPbufferEXT) +#define wglReleasePbufferDCEXT WGLEW_GET_FUN(__wglewReleasePbufferDCEXT) + +#define WGLEW_EXT_pbuffer WGLEW_GET_VAR(__WGLEW_EXT_pbuffer) + +#endif /* WGL_EXT_pbuffer */ + +/* -------------------------- WGL_EXT_pixel_format ------------------------- */ + +#ifndef WGL_EXT_pixel_format +#define WGL_EXT_pixel_format 1 + +#define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000 +#define WGL_DRAW_TO_WINDOW_EXT 0x2001 +#define WGL_DRAW_TO_BITMAP_EXT 0x2002 +#define WGL_ACCELERATION_EXT 0x2003 +#define WGL_NEED_PALETTE_EXT 0x2004 +#define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005 +#define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006 +#define WGL_SWAP_METHOD_EXT 0x2007 +#define WGL_NUMBER_OVERLAYS_EXT 0x2008 +#define WGL_NUMBER_UNDERLAYS_EXT 0x2009 +#define WGL_TRANSPARENT_EXT 0x200A +#define WGL_TRANSPARENT_VALUE_EXT 0x200B +#define WGL_SHARE_DEPTH_EXT 0x200C +#define WGL_SHARE_STENCIL_EXT 0x200D +#define WGL_SHARE_ACCUM_EXT 0x200E +#define WGL_SUPPORT_GDI_EXT 0x200F +#define WGL_SUPPORT_OPENGL_EXT 0x2010 +#define WGL_DOUBLE_BUFFER_EXT 0x2011 +#define WGL_STEREO_EXT 0x2012 +#define WGL_PIXEL_TYPE_EXT 0x2013 +#define WGL_COLOR_BITS_EXT 0x2014 +#define WGL_RED_BITS_EXT 0x2015 +#define WGL_RED_SHIFT_EXT 0x2016 +#define WGL_GREEN_BITS_EXT 0x2017 +#define WGL_GREEN_SHIFT_EXT 0x2018 +#define WGL_BLUE_BITS_EXT 0x2019 +#define WGL_BLUE_SHIFT_EXT 0x201A +#define WGL_ALPHA_BITS_EXT 0x201B +#define WGL_ALPHA_SHIFT_EXT 0x201C +#define WGL_ACCUM_BITS_EXT 0x201D +#define WGL_ACCUM_RED_BITS_EXT 0x201E +#define WGL_ACCUM_GREEN_BITS_EXT 0x201F +#define WGL_ACCUM_BLUE_BITS_EXT 0x2020 +#define WGL_ACCUM_ALPHA_BITS_EXT 0x2021 +#define WGL_DEPTH_BITS_EXT 0x2022 +#define WGL_STENCIL_BITS_EXT 0x2023 +#define WGL_AUX_BUFFERS_EXT 0x2024 +#define WGL_NO_ACCELERATION_EXT 0x2025 +#define WGL_GENERIC_ACCELERATION_EXT 0x2026 +#define WGL_FULL_ACCELERATION_EXT 0x2027 +#define WGL_SWAP_EXCHANGE_EXT 0x2028 +#define WGL_SWAP_COPY_EXT 0x2029 +#define WGL_SWAP_UNDEFINED_EXT 0x202A +#define WGL_TYPE_RGBA_EXT 0x202B +#define WGL_TYPE_COLORINDEX_EXT 0x202C + +typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, FLOAT *pfValues); +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, int *piValues); + +#define wglChoosePixelFormatEXT WGLEW_GET_FUN(__wglewChoosePixelFormatEXT) +#define wglGetPixelFormatAttribfvEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvEXT) +#define wglGetPixelFormatAttribivEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribivEXT) + +#define WGLEW_EXT_pixel_format WGLEW_GET_VAR(__WGLEW_EXT_pixel_format) + +#endif /* WGL_EXT_pixel_format */ + +/* ------------------- WGL_EXT_pixel_format_packed_float ------------------- */ + +#ifndef WGL_EXT_pixel_format_packed_float +#define WGL_EXT_pixel_format_packed_float 1 + +#define WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8 + +#define WGLEW_EXT_pixel_format_packed_float WGLEW_GET_VAR(__WGLEW_EXT_pixel_format_packed_float) + +#endif /* WGL_EXT_pixel_format_packed_float */ + +/* -------------------------- WGL_EXT_swap_control ------------------------- */ + +#ifndef WGL_EXT_swap_control +#define WGL_EXT_swap_control 1 + +typedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void); +typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval); + +#define wglGetSwapIntervalEXT WGLEW_GET_FUN(__wglewGetSwapIntervalEXT) +#define wglSwapIntervalEXT WGLEW_GET_FUN(__wglewSwapIntervalEXT) + +#define WGLEW_EXT_swap_control WGLEW_GET_VAR(__WGLEW_EXT_swap_control) + +#endif /* WGL_EXT_swap_control */ + +/* --------------------- WGL_I3D_digital_video_control --------------------- */ + +#ifndef WGL_I3D_digital_video_control +#define WGL_I3D_digital_video_control 1 + +#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050 +#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051 +#define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052 +#define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053 + +typedef BOOL (WINAPI * PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue); +typedef BOOL (WINAPI * PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue); + +#define wglGetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewGetDigitalVideoParametersI3D) +#define wglSetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewSetDigitalVideoParametersI3D) + +#define WGLEW_I3D_digital_video_control WGLEW_GET_VAR(__WGLEW_I3D_digital_video_control) + +#endif /* WGL_I3D_digital_video_control */ + +/* ----------------------------- WGL_I3D_gamma ----------------------------- */ + +#ifndef WGL_I3D_gamma +#define WGL_I3D_gamma 1 + +#define WGL_GAMMA_TABLE_SIZE_I3D 0x204E +#define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F + +typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, USHORT* puRed, USHORT *puGreen, USHORT *puBlue); +typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue); +typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, const USHORT* puRed, const USHORT *puGreen, const USHORT *puBlue); +typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue); + +#define wglGetGammaTableI3D WGLEW_GET_FUN(__wglewGetGammaTableI3D) +#define wglGetGammaTableParametersI3D WGLEW_GET_FUN(__wglewGetGammaTableParametersI3D) +#define wglSetGammaTableI3D WGLEW_GET_FUN(__wglewSetGammaTableI3D) +#define wglSetGammaTableParametersI3D WGLEW_GET_FUN(__wglewSetGammaTableParametersI3D) + +#define WGLEW_I3D_gamma WGLEW_GET_VAR(__WGLEW_I3D_gamma) + +#endif /* WGL_I3D_gamma */ + +/* ---------------------------- WGL_I3D_genlock ---------------------------- */ + +#ifndef WGL_I3D_genlock +#define WGL_I3D_genlock 1 + +#define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044 +#define WGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D 0x2045 +#define WGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D 0x2046 +#define WGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D 0x2047 +#define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048 +#define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049 +#define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A +#define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B +#define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C + +typedef BOOL (WINAPI * PFNWGLDISABLEGENLOCKI3DPROC) (HDC hDC); +typedef BOOL (WINAPI * PFNWGLENABLEGENLOCKI3DPROC) (HDC hDC); +typedef BOOL (WINAPI * PFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT uRate); +typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT uDelay); +typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT uEdge); +typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEI3DPROC) (HDC hDC, UINT uSource); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT* uRate); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT* uDelay); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT* uEdge); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hDC, UINT* uSource); +typedef BOOL (WINAPI * PFNWGLISENABLEDGENLOCKI3DPROC) (HDC hDC, BOOL* pFlag); +typedef BOOL (WINAPI * PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hDC, UINT* uMaxLineDelay, UINT *uMaxPixelDelay); + +#define wglDisableGenlockI3D WGLEW_GET_FUN(__wglewDisableGenlockI3D) +#define wglEnableGenlockI3D WGLEW_GET_FUN(__wglewEnableGenlockI3D) +#define wglGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGenlockSampleRateI3D) +#define wglGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGenlockSourceDelayI3D) +#define wglGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGenlockSourceEdgeI3D) +#define wglGenlockSourceI3D WGLEW_GET_FUN(__wglewGenlockSourceI3D) +#define wglGetGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGetGenlockSampleRateI3D) +#define wglGetGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGetGenlockSourceDelayI3D) +#define wglGetGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGetGenlockSourceEdgeI3D) +#define wglGetGenlockSourceI3D WGLEW_GET_FUN(__wglewGetGenlockSourceI3D) +#define wglIsEnabledGenlockI3D WGLEW_GET_FUN(__wglewIsEnabledGenlockI3D) +#define wglQueryGenlockMaxSourceDelayI3D WGLEW_GET_FUN(__wglewQueryGenlockMaxSourceDelayI3D) + +#define WGLEW_I3D_genlock WGLEW_GET_VAR(__WGLEW_I3D_genlock) + +#endif /* WGL_I3D_genlock */ + +/* -------------------------- WGL_I3D_image_buffer ------------------------- */ + +#ifndef WGL_I3D_image_buffer +#define WGL_I3D_image_buffer 1 + +#define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001 +#define WGL_IMAGE_BUFFER_LOCK_I3D 0x00000002 + +typedef BOOL (WINAPI * PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, HANDLE* pEvent, LPVOID *pAddress, DWORD *pSize, UINT count); +typedef LPVOID (WINAPI * PFNWGLCREATEIMAGEBUFFERI3DPROC) (HDC hDC, DWORD dwSize, UINT uFlags); +typedef BOOL (WINAPI * PFNWGLDESTROYIMAGEBUFFERI3DPROC) (HDC hDC, LPVOID pAddress); +typedef BOOL (WINAPI * PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, LPVOID* pAddress, UINT count); + +#define wglAssociateImageBufferEventsI3D WGLEW_GET_FUN(__wglewAssociateImageBufferEventsI3D) +#define wglCreateImageBufferI3D WGLEW_GET_FUN(__wglewCreateImageBufferI3D) +#define wglDestroyImageBufferI3D WGLEW_GET_FUN(__wglewDestroyImageBufferI3D) +#define wglReleaseImageBufferEventsI3D WGLEW_GET_FUN(__wglewReleaseImageBufferEventsI3D) + +#define WGLEW_I3D_image_buffer WGLEW_GET_VAR(__WGLEW_I3D_image_buffer) + +#endif /* WGL_I3D_image_buffer */ + +/* ------------------------ WGL_I3D_swap_frame_lock ------------------------ */ + +#ifndef WGL_I3D_swap_frame_lock +#define WGL_I3D_swap_frame_lock 1 + +typedef BOOL (WINAPI * PFNWGLDISABLEFRAMELOCKI3DPROC) (VOID); +typedef BOOL (WINAPI * PFNWGLENABLEFRAMELOCKI3DPROC) (VOID); +typedef BOOL (WINAPI * PFNWGLISENABLEDFRAMELOCKI3DPROC) (BOOL* pFlag); +typedef BOOL (WINAPI * PFNWGLQUERYFRAMELOCKMASTERI3DPROC) (BOOL* pFlag); + +#define wglDisableFrameLockI3D WGLEW_GET_FUN(__wglewDisableFrameLockI3D) +#define wglEnableFrameLockI3D WGLEW_GET_FUN(__wglewEnableFrameLockI3D) +#define wglIsEnabledFrameLockI3D WGLEW_GET_FUN(__wglewIsEnabledFrameLockI3D) +#define wglQueryFrameLockMasterI3D WGLEW_GET_FUN(__wglewQueryFrameLockMasterI3D) + +#define WGLEW_I3D_swap_frame_lock WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_lock) + +#endif /* WGL_I3D_swap_frame_lock */ + +/* ------------------------ WGL_I3D_swap_frame_usage ----------------------- */ + +#ifndef WGL_I3D_swap_frame_usage +#define WGL_I3D_swap_frame_usage 1 + +typedef BOOL (WINAPI * PFNWGLBEGINFRAMETRACKINGI3DPROC) (void); +typedef BOOL (WINAPI * PFNWGLENDFRAMETRACKINGI3DPROC) (void); +typedef BOOL (WINAPI * PFNWGLGETFRAMEUSAGEI3DPROC) (float* pUsage); +typedef BOOL (WINAPI * PFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD* pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage); + +#define wglBeginFrameTrackingI3D WGLEW_GET_FUN(__wglewBeginFrameTrackingI3D) +#define wglEndFrameTrackingI3D WGLEW_GET_FUN(__wglewEndFrameTrackingI3D) +#define wglGetFrameUsageI3D WGLEW_GET_FUN(__wglewGetFrameUsageI3D) +#define wglQueryFrameTrackingI3D WGLEW_GET_FUN(__wglewQueryFrameTrackingI3D) + +#define WGLEW_I3D_swap_frame_usage WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_usage) + +#endif /* WGL_I3D_swap_frame_usage */ + +/* --------------------------- WGL_NV_copy_image --------------------------- */ + +#ifndef WGL_NV_copy_image +#define WGL_NV_copy_image 1 + +typedef BOOL (WINAPI * PFNWGLCOPYIMAGESUBDATANVPROC) (HGLRC hSrcRC, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, HGLRC hDstRC, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); + +#define wglCopyImageSubDataNV WGLEW_GET_FUN(__wglewCopyImageSubDataNV) + +#define WGLEW_NV_copy_image WGLEW_GET_VAR(__WGLEW_NV_copy_image) + +#endif /* WGL_NV_copy_image */ + +/* -------------------------- WGL_NV_float_buffer -------------------------- */ + +#ifndef WGL_NV_float_buffer +#define WGL_NV_float_buffer 1 + +#define WGL_FLOAT_COMPONENTS_NV 0x20B0 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4 +#define WGL_TEXTURE_FLOAT_R_NV 0x20B5 +#define WGL_TEXTURE_FLOAT_RG_NV 0x20B6 +#define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7 +#define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8 + +#define WGLEW_NV_float_buffer WGLEW_GET_VAR(__WGLEW_NV_float_buffer) + +#endif /* WGL_NV_float_buffer */ + +/* -------------------------- WGL_NV_gpu_affinity -------------------------- */ + +#ifndef WGL_NV_gpu_affinity +#define WGL_NV_gpu_affinity 1 + +#define WGL_ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV 0x20D0 +#define WGL_ERROR_MISSING_AFFINITY_MASK_NV 0x20D1 + +DECLARE_HANDLE(HGPUNV); +typedef struct _GPU_DEVICE { + DWORD cb; + CHAR DeviceName[32]; + CHAR DeviceString[128]; + DWORD Flags; + RECT rcVirtualScreen; +} GPU_DEVICE, *PGPU_DEVICE; + +typedef HDC (WINAPI * PFNWGLCREATEAFFINITYDCNVPROC) (const HGPUNV *phGpuList); +typedef BOOL (WINAPI * PFNWGLDELETEDCNVPROC) (HDC hdc); +typedef BOOL (WINAPI * PFNWGLENUMGPUDEVICESNVPROC) (HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice); +typedef BOOL (WINAPI * PFNWGLENUMGPUSFROMAFFINITYDCNVPROC) (HDC hAffinityDC, UINT iGpuIndex, HGPUNV *hGpu); +typedef BOOL (WINAPI * PFNWGLENUMGPUSNVPROC) (UINT iGpuIndex, HGPUNV *phGpu); + +#define wglCreateAffinityDCNV WGLEW_GET_FUN(__wglewCreateAffinityDCNV) +#define wglDeleteDCNV WGLEW_GET_FUN(__wglewDeleteDCNV) +#define wglEnumGpuDevicesNV WGLEW_GET_FUN(__wglewEnumGpuDevicesNV) +#define wglEnumGpusFromAffinityDCNV WGLEW_GET_FUN(__wglewEnumGpusFromAffinityDCNV) +#define wglEnumGpusNV WGLEW_GET_FUN(__wglewEnumGpusNV) + +#define WGLEW_NV_gpu_affinity WGLEW_GET_VAR(__WGLEW_NV_gpu_affinity) + +#endif /* WGL_NV_gpu_affinity */ + +/* ---------------------- WGL_NV_multisample_coverage ---------------------- */ + +#ifndef WGL_NV_multisample_coverage +#define WGL_NV_multisample_coverage 1 + +#define WGL_COVERAGE_SAMPLES_NV 0x2042 +#define WGL_COLOR_SAMPLES_NV 0x20B9 + +#define WGLEW_NV_multisample_coverage WGLEW_GET_VAR(__WGLEW_NV_multisample_coverage) + +#endif /* WGL_NV_multisample_coverage */ + +/* -------------------------- WGL_NV_present_video ------------------------- */ + +#ifndef WGL_NV_present_video +#define WGL_NV_present_video 1 + +#define WGL_NUM_VIDEO_SLOTS_NV 0x20F0 + +DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV); + +typedef BOOL (WINAPI * PFNWGLBINDVIDEODEVICENVPROC) (HDC hDc, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int* piAttribList); +typedef int (WINAPI * PFNWGLENUMERATEVIDEODEVICESNVPROC) (HDC hDc, HVIDEOOUTPUTDEVICENV* phDeviceList); +typedef BOOL (WINAPI * PFNWGLQUERYCURRENTCONTEXTNVPROC) (int iAttribute, int* piValue); + +#define wglBindVideoDeviceNV WGLEW_GET_FUN(__wglewBindVideoDeviceNV) +#define wglEnumerateVideoDevicesNV WGLEW_GET_FUN(__wglewEnumerateVideoDevicesNV) +#define wglQueryCurrentContextNV WGLEW_GET_FUN(__wglewQueryCurrentContextNV) + +#define WGLEW_NV_present_video WGLEW_GET_VAR(__WGLEW_NV_present_video) + +#endif /* WGL_NV_present_video */ + +/* ---------------------- WGL_NV_render_depth_texture ---------------------- */ + +#ifndef WGL_NV_render_depth_texture +#define WGL_NV_render_depth_texture 1 + +#define WGL_NO_TEXTURE_ARB 0x2077 +#define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4 +#define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5 +#define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6 +#define WGL_DEPTH_COMPONENT_NV 0x20A7 + +#define WGLEW_NV_render_depth_texture WGLEW_GET_VAR(__WGLEW_NV_render_depth_texture) + +#endif /* WGL_NV_render_depth_texture */ + +/* -------------------- WGL_NV_render_texture_rectangle -------------------- */ + +#ifndef WGL_NV_render_texture_rectangle +#define WGL_NV_render_texture_rectangle 1 + +#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1 +#define WGL_TEXTURE_RECTANGLE_NV 0x20A2 + +#define WGLEW_NV_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_NV_render_texture_rectangle) + +#endif /* WGL_NV_render_texture_rectangle */ + +/* --------------------------- WGL_NV_swap_group --------------------------- */ + +#ifndef WGL_NV_swap_group +#define WGL_NV_swap_group 1 + +typedef BOOL (WINAPI * PFNWGLBINDSWAPBARRIERNVPROC) (GLuint group, GLuint barrier); +typedef BOOL (WINAPI * PFNWGLJOINSWAPGROUPNVPROC) (HDC hDC, GLuint group); +typedef BOOL (WINAPI * PFNWGLQUERYFRAMECOUNTNVPROC) (HDC hDC, GLuint* count); +typedef BOOL (WINAPI * PFNWGLQUERYMAXSWAPGROUPSNVPROC) (HDC hDC, GLuint* maxGroups, GLuint *maxBarriers); +typedef BOOL (WINAPI * PFNWGLQUERYSWAPGROUPNVPROC) (HDC hDC, GLuint* group, GLuint *barrier); +typedef BOOL (WINAPI * PFNWGLRESETFRAMECOUNTNVPROC) (HDC hDC); + +#define wglBindSwapBarrierNV WGLEW_GET_FUN(__wglewBindSwapBarrierNV) +#define wglJoinSwapGroupNV WGLEW_GET_FUN(__wglewJoinSwapGroupNV) +#define wglQueryFrameCountNV WGLEW_GET_FUN(__wglewQueryFrameCountNV) +#define wglQueryMaxSwapGroupsNV WGLEW_GET_FUN(__wglewQueryMaxSwapGroupsNV) +#define wglQuerySwapGroupNV WGLEW_GET_FUN(__wglewQuerySwapGroupNV) +#define wglResetFrameCountNV WGLEW_GET_FUN(__wglewResetFrameCountNV) + +#define WGLEW_NV_swap_group WGLEW_GET_VAR(__WGLEW_NV_swap_group) + +#endif /* WGL_NV_swap_group */ + +/* ----------------------- WGL_NV_vertex_array_range ----------------------- */ + +#ifndef WGL_NV_vertex_array_range +#define WGL_NV_vertex_array_range 1 + +typedef void * (WINAPI * PFNWGLALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority); +typedef void (WINAPI * PFNWGLFREEMEMORYNVPROC) (void *pointer); + +#define wglAllocateMemoryNV WGLEW_GET_FUN(__wglewAllocateMemoryNV) +#define wglFreeMemoryNV WGLEW_GET_FUN(__wglewFreeMemoryNV) + +#define WGLEW_NV_vertex_array_range WGLEW_GET_VAR(__WGLEW_NV_vertex_array_range) + +#endif /* WGL_NV_vertex_array_range */ + +/* -------------------------- WGL_NV_video_output -------------------------- */ + +#ifndef WGL_NV_video_output +#define WGL_NV_video_output 1 + +#define WGL_BIND_TO_VIDEO_RGB_NV 0x20C0 +#define WGL_BIND_TO_VIDEO_RGBA_NV 0x20C1 +#define WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV 0x20C2 +#define WGL_VIDEO_OUT_COLOR_NV 0x20C3 +#define WGL_VIDEO_OUT_ALPHA_NV 0x20C4 +#define WGL_VIDEO_OUT_DEPTH_NV 0x20C5 +#define WGL_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6 +#define WGL_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7 +#define WGL_VIDEO_OUT_FRAME 0x20C8 +#define WGL_VIDEO_OUT_FIELD_1 0x20C9 +#define WGL_VIDEO_OUT_FIELD_2 0x20CA +#define WGL_VIDEO_OUT_STACKED_FIELDS_1_2 0x20CB +#define WGL_VIDEO_OUT_STACKED_FIELDS_2_1 0x20CC + +DECLARE_HANDLE(HPVIDEODEV); + +typedef BOOL (WINAPI * PFNWGLBINDVIDEOIMAGENVPROC) (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer); +typedef BOOL (WINAPI * PFNWGLGETVIDEODEVICENVPROC) (HDC hDC, int numDevices, HPVIDEODEV* hVideoDevice); +typedef BOOL (WINAPI * PFNWGLGETVIDEOINFONVPROC) (HPVIDEODEV hpVideoDevice, unsigned long* pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo); +typedef BOOL (WINAPI * PFNWGLRELEASEVIDEODEVICENVPROC) (HPVIDEODEV hVideoDevice); +typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOIMAGENVPROC) (HPBUFFERARB hPbuffer, int iVideoBuffer); +typedef BOOL (WINAPI * PFNWGLSENDPBUFFERTOVIDEONVPROC) (HPBUFFERARB hPbuffer, int iBufferType, unsigned long* pulCounterPbuffer, BOOL bBlock); + +#define wglBindVideoImageNV WGLEW_GET_FUN(__wglewBindVideoImageNV) +#define wglGetVideoDeviceNV WGLEW_GET_FUN(__wglewGetVideoDeviceNV) +#define wglGetVideoInfoNV WGLEW_GET_FUN(__wglewGetVideoInfoNV) +#define wglReleaseVideoDeviceNV WGLEW_GET_FUN(__wglewReleaseVideoDeviceNV) +#define wglReleaseVideoImageNV WGLEW_GET_FUN(__wglewReleaseVideoImageNV) +#define wglSendPbufferToVideoNV WGLEW_GET_FUN(__wglewSendPbufferToVideoNV) + +#define WGLEW_NV_video_output WGLEW_GET_VAR(__WGLEW_NV_video_output) + +#endif /* WGL_NV_video_output */ + +/* -------------------------- WGL_OML_sync_control ------------------------- */ + +#ifndef WGL_OML_sync_control +#define WGL_OML_sync_control 1 + +typedef BOOL (WINAPI * PFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32* numerator, INT32 *denominator); +typedef BOOL (WINAPI * PFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64* ust, INT64 *msc, INT64 *sbc); +typedef INT64 (WINAPI * PFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder); +typedef INT64 (WINAPI * PFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, INT fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder); +typedef BOOL (WINAPI * PFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64* ust, INT64 *msc, INT64 *sbc); +typedef BOOL (WINAPI * PFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64* ust, INT64 *msc, INT64 *sbc); + +#define wglGetMscRateOML WGLEW_GET_FUN(__wglewGetMscRateOML) +#define wglGetSyncValuesOML WGLEW_GET_FUN(__wglewGetSyncValuesOML) +#define wglSwapBuffersMscOML WGLEW_GET_FUN(__wglewSwapBuffersMscOML) +#define wglSwapLayerBuffersMscOML WGLEW_GET_FUN(__wglewSwapLayerBuffersMscOML) +#define wglWaitForMscOML WGLEW_GET_FUN(__wglewWaitForMscOML) +#define wglWaitForSbcOML WGLEW_GET_FUN(__wglewWaitForSbcOML) + +#define WGLEW_OML_sync_control WGLEW_GET_VAR(__WGLEW_OML_sync_control) + +#endif /* WGL_OML_sync_control */ + +/* ------------------------------------------------------------------------- */ + +#ifdef GLEW_MX +#define WGLEW_EXPORT +#else +#define WGLEW_EXPORT GLEWAPI +#endif /* GLEW_MX */ + +#ifdef GLEW_MX +struct WGLEWContextStruct +{ +#endif /* GLEW_MX */ + +WGLEW_EXPORT PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL; + +WGLEW_EXPORT PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC __wglewBlitContextFramebufferAMD; +WGLEW_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC __wglewCreateAssociatedContextAMD; +WGLEW_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __wglewCreateAssociatedContextAttribsAMD; +WGLEW_EXPORT PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC __wglewDeleteAssociatedContextAMD; +WGLEW_EXPORT PFNWGLGETCONTEXTGPUIDAMDPROC __wglewGetContextGPUIDAMD; +WGLEW_EXPORT PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC __wglewGetCurrentAssociatedContextAMD; +WGLEW_EXPORT PFNWGLGETGPUIDSAMDPROC __wglewGetGPUIDsAMD; +WGLEW_EXPORT PFNWGLGETGPUINFOAMDPROC __wglewGetGPUInfoAMD; +WGLEW_EXPORT PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __wglewMakeAssociatedContextCurrentAMD; + +WGLEW_EXPORT PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB; +WGLEW_EXPORT PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB; +WGLEW_EXPORT PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB; +WGLEW_EXPORT PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB; + +WGLEW_EXPORT PFNWGLCREATECONTEXTATTRIBSARBPROC __wglewCreateContextAttribsARB; + +WGLEW_EXPORT PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB; + +WGLEW_EXPORT PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB; +WGLEW_EXPORT PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB; + +WGLEW_EXPORT PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB; +WGLEW_EXPORT PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB; +WGLEW_EXPORT PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB; +WGLEW_EXPORT PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB; +WGLEW_EXPORT PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB; + +WGLEW_EXPORT PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB; +WGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB; +WGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB; + +WGLEW_EXPORT PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB; +WGLEW_EXPORT PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB; +WGLEW_EXPORT PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB; + +WGLEW_EXPORT PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT; +WGLEW_EXPORT PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT; +WGLEW_EXPORT PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT; +WGLEW_EXPORT PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT; + +WGLEW_EXPORT PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT; + +WGLEW_EXPORT PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT; +WGLEW_EXPORT PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT; + +WGLEW_EXPORT PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT; +WGLEW_EXPORT PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT; +WGLEW_EXPORT PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT; +WGLEW_EXPORT PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT; +WGLEW_EXPORT PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT; + +WGLEW_EXPORT PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT; +WGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT; +WGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT; + +WGLEW_EXPORT PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT; +WGLEW_EXPORT PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT; + +WGLEW_EXPORT PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D; +WGLEW_EXPORT PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D; + +WGLEW_EXPORT PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D; +WGLEW_EXPORT PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D; +WGLEW_EXPORT PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D; +WGLEW_EXPORT PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D; + +WGLEW_EXPORT PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D; +WGLEW_EXPORT PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D; +WGLEW_EXPORT PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D; +WGLEW_EXPORT PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D; +WGLEW_EXPORT PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D; +WGLEW_EXPORT PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D; +WGLEW_EXPORT PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D; +WGLEW_EXPORT PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D; +WGLEW_EXPORT PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D; +WGLEW_EXPORT PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D; +WGLEW_EXPORT PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D; +WGLEW_EXPORT PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D; + +WGLEW_EXPORT PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D; +WGLEW_EXPORT PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D; +WGLEW_EXPORT PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D; +WGLEW_EXPORT PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D; + +WGLEW_EXPORT PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D; +WGLEW_EXPORT PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D; +WGLEW_EXPORT PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D; +WGLEW_EXPORT PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D; + +WGLEW_EXPORT PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D; +WGLEW_EXPORT PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D; +WGLEW_EXPORT PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D; +WGLEW_EXPORT PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D; + +WGLEW_EXPORT PFNWGLCOPYIMAGESUBDATANVPROC __wglewCopyImageSubDataNV; + +WGLEW_EXPORT PFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV; +WGLEW_EXPORT PFNWGLDELETEDCNVPROC __wglewDeleteDCNV; +WGLEW_EXPORT PFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV; +WGLEW_EXPORT PFNWGLENUMGPUSFROMAFFINITYDCNVPROC __wglewEnumGpusFromAffinityDCNV; +WGLEW_EXPORT PFNWGLENUMGPUSNVPROC __wglewEnumGpusNV; + +WGLEW_EXPORT PFNWGLBINDVIDEODEVICENVPROC __wglewBindVideoDeviceNV; +WGLEW_EXPORT PFNWGLENUMERATEVIDEODEVICESNVPROC __wglewEnumerateVideoDevicesNV; +WGLEW_EXPORT PFNWGLQUERYCURRENTCONTEXTNVPROC __wglewQueryCurrentContextNV; + +WGLEW_EXPORT PFNWGLBINDSWAPBARRIERNVPROC __wglewBindSwapBarrierNV; +WGLEW_EXPORT PFNWGLJOINSWAPGROUPNVPROC __wglewJoinSwapGroupNV; +WGLEW_EXPORT PFNWGLQUERYFRAMECOUNTNVPROC __wglewQueryFrameCountNV; +WGLEW_EXPORT PFNWGLQUERYMAXSWAPGROUPSNVPROC __wglewQueryMaxSwapGroupsNV; +WGLEW_EXPORT PFNWGLQUERYSWAPGROUPNVPROC __wglewQuerySwapGroupNV; +WGLEW_EXPORT PFNWGLRESETFRAMECOUNTNVPROC __wglewResetFrameCountNV; + +WGLEW_EXPORT PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV; +WGLEW_EXPORT PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV; + +WGLEW_EXPORT PFNWGLBINDVIDEOIMAGENVPROC __wglewBindVideoImageNV; +WGLEW_EXPORT PFNWGLGETVIDEODEVICENVPROC __wglewGetVideoDeviceNV; +WGLEW_EXPORT PFNWGLGETVIDEOINFONVPROC __wglewGetVideoInfoNV; +WGLEW_EXPORT PFNWGLRELEASEVIDEODEVICENVPROC __wglewReleaseVideoDeviceNV; +WGLEW_EXPORT PFNWGLRELEASEVIDEOIMAGENVPROC __wglewReleaseVideoImageNV; +WGLEW_EXPORT PFNWGLSENDPBUFFERTOVIDEONVPROC __wglewSendPbufferToVideoNV; + +WGLEW_EXPORT PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML; +WGLEW_EXPORT PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML; +WGLEW_EXPORT PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML; +WGLEW_EXPORT PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML; +WGLEW_EXPORT PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML; +WGLEW_EXPORT PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML; +WGLEW_EXPORT GLboolean __WGLEW_3DFX_multisample; +WGLEW_EXPORT GLboolean __WGLEW_3DL_stereo_control; +WGLEW_EXPORT GLboolean __WGLEW_AMD_gpu_association; +WGLEW_EXPORT GLboolean __WGLEW_ARB_buffer_region; +WGLEW_EXPORT GLboolean __WGLEW_ARB_create_context; +WGLEW_EXPORT GLboolean __WGLEW_ARB_create_context_profile; +WGLEW_EXPORT GLboolean __WGLEW_ARB_create_context_robustness; +WGLEW_EXPORT GLboolean __WGLEW_ARB_extensions_string; +WGLEW_EXPORT GLboolean __WGLEW_ARB_framebuffer_sRGB; +WGLEW_EXPORT GLboolean __WGLEW_ARB_make_current_read; +WGLEW_EXPORT GLboolean __WGLEW_ARB_multisample; +WGLEW_EXPORT GLboolean __WGLEW_ARB_pbuffer; +WGLEW_EXPORT GLboolean __WGLEW_ARB_pixel_format; +WGLEW_EXPORT GLboolean __WGLEW_ARB_pixel_format_float; +WGLEW_EXPORT GLboolean __WGLEW_ARB_render_texture; +WGLEW_EXPORT GLboolean __WGLEW_ATI_pixel_format_float; +WGLEW_EXPORT GLboolean __WGLEW_ATI_render_texture_rectangle; +WGLEW_EXPORT GLboolean __WGLEW_EXT_create_context_es2_profile; +WGLEW_EXPORT GLboolean __WGLEW_EXT_depth_float; +WGLEW_EXPORT GLboolean __WGLEW_EXT_display_color_table; +WGLEW_EXPORT GLboolean __WGLEW_EXT_extensions_string; +WGLEW_EXPORT GLboolean __WGLEW_EXT_framebuffer_sRGB; +WGLEW_EXPORT GLboolean __WGLEW_EXT_make_current_read; +WGLEW_EXPORT GLboolean __WGLEW_EXT_multisample; +WGLEW_EXPORT GLboolean __WGLEW_EXT_pbuffer; +WGLEW_EXPORT GLboolean __WGLEW_EXT_pixel_format; +WGLEW_EXPORT GLboolean __WGLEW_EXT_pixel_format_packed_float; +WGLEW_EXPORT GLboolean __WGLEW_EXT_swap_control; +WGLEW_EXPORT GLboolean __WGLEW_I3D_digital_video_control; +WGLEW_EXPORT GLboolean __WGLEW_I3D_gamma; +WGLEW_EXPORT GLboolean __WGLEW_I3D_genlock; +WGLEW_EXPORT GLboolean __WGLEW_I3D_image_buffer; +WGLEW_EXPORT GLboolean __WGLEW_I3D_swap_frame_lock; +WGLEW_EXPORT GLboolean __WGLEW_I3D_swap_frame_usage; +WGLEW_EXPORT GLboolean __WGLEW_NV_copy_image; +WGLEW_EXPORT GLboolean __WGLEW_NV_float_buffer; +WGLEW_EXPORT GLboolean __WGLEW_NV_gpu_affinity; +WGLEW_EXPORT GLboolean __WGLEW_NV_multisample_coverage; +WGLEW_EXPORT GLboolean __WGLEW_NV_present_video; +WGLEW_EXPORT GLboolean __WGLEW_NV_render_depth_texture; +WGLEW_EXPORT GLboolean __WGLEW_NV_render_texture_rectangle; +WGLEW_EXPORT GLboolean __WGLEW_NV_swap_group; +WGLEW_EXPORT GLboolean __WGLEW_NV_vertex_array_range; +WGLEW_EXPORT GLboolean __WGLEW_NV_video_output; +WGLEW_EXPORT GLboolean __WGLEW_OML_sync_control; + +#ifdef GLEW_MX +}; /* WGLEWContextStruct */ +#endif /* GLEW_MX */ + +/* ------------------------------------------------------------------------- */ + +#ifdef GLEW_MX + +typedef struct WGLEWContextStruct WGLEWContext; +GLEWAPI GLenum wglewContextInit (WGLEWContext* ctx); +GLEWAPI GLboolean wglewContextIsSupported (const WGLEWContext* ctx, const char* name); + +#define wglewInit() wglewContextInit(wglewGetContext()) +#define wglewIsSupported(x) wglewContextIsSupported(wglewGetContext(), x) + +#define WGLEW_GET_VAR(x) (*(const GLboolean*)&(wglewGetContext()->x)) +#define WGLEW_GET_FUN(x) wglewGetContext()->x + +#else /* GLEW_MX */ + +#define WGLEW_GET_VAR(x) (*(const GLboolean*)&x) +#define WGLEW_GET_FUN(x) x + +GLEWAPI GLboolean wglewIsSupported (const char* name); + +#endif /* GLEW_MX */ + +GLEWAPI GLboolean wglewGetExtension (const char* name); + +#ifdef __cplusplus +} +#endif + +#undef GLEWAPI + +#endif /* __wglew_h__ */ diff --git a/minecraftcpp-master/handheld/lib/include/GLES/egl.h b/minecraftcpp-master/handheld/lib/include/GLES/egl.h new file mode 100644 index 0000000..5524e47 --- /dev/null +++ b/minecraftcpp-master/handheld/lib/include/GLES/egl.h @@ -0,0 +1,13 @@ +/* + * Skeleton egl.h to provide compatibility for early GLES 1.0 + * applications. Several early implementations included gl.h + * in egl.h leading applications to include only egl.h + */ + +#ifndef __legacy_egl_h_ +#define __legacy_egl_h_ + +#include +#include + +#endif /* __legacy_egl_h_ */ diff --git a/minecraftcpp-master/handheld/lib/include/GLES/gl.h b/minecraftcpp-master/handheld/lib/include/GLES/gl.h new file mode 100644 index 0000000..cd1a21b --- /dev/null +++ b/minecraftcpp-master/handheld/lib/include/GLES/gl.h @@ -0,0 +1,767 @@ +#ifndef __gl_h_ +#define __gl_h_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * This document is licensed under the SGI Free Software B License Version + * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ . + */ + +typedef void GLvoid; +typedef unsigned int GLenum; +typedef unsigned char GLboolean; +typedef unsigned int GLbitfield; +typedef khronos_int8_t GLbyte; +typedef short GLshort; +typedef int GLint; +typedef int GLsizei; +typedef khronos_uint8_t GLubyte; +typedef unsigned short GLushort; +typedef unsigned int GLuint; +typedef khronos_float_t GLfloat; +typedef khronos_float_t GLclampf; +typedef khronos_int32_t GLfixed; +typedef khronos_int32_t GLclampx; + +typedef khronos_intptr_t GLintptr; +typedef khronos_ssize_t GLsizeiptr; + + +/*************************************************************/ + +/* OpenGL ES core versions */ +#define GL_VERSION_ES_CM_1_0 1 +#define GL_VERSION_ES_CL_1_0 1 +#define GL_VERSION_ES_CM_1_1 1 +#define GL_VERSION_ES_CL_1_1 1 + +/* ClearBufferMask */ +#define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_STENCIL_BUFFER_BIT 0x00000400 +#define GL_COLOR_BUFFER_BIT 0x00004000 + +/* Boolean */ +#define GL_FALSE 0 +#define GL_TRUE 1 + +/* BeginMode */ +#define GL_POINTS 0x0000 +#define GL_LINES 0x0001 +#define GL_LINE_LOOP 0x0002 +#define GL_LINE_STRIP 0x0003 +#define GL_TRIANGLES 0x0004 +#define GL_TRIANGLE_STRIP 0x0005 +#define GL_TRIANGLE_FAN 0x0006 + +/* AlphaFunction */ +#define GL_NEVER 0x0200 +#define GL_LESS 0x0201 +#define GL_EQUAL 0x0202 +#define GL_LEQUAL 0x0203 +#define GL_GREATER 0x0204 +#define GL_NOTEQUAL 0x0205 +#define GL_GEQUAL 0x0206 +#define GL_ALWAYS 0x0207 + +/* BlendingFactorDest */ +#define GL_ZERO 0 +#define GL_ONE 1 +#define GL_SRC_COLOR 0x0300 +#define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_SRC_ALPHA 0x0302 +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_DST_ALPHA 0x0304 +#define GL_ONE_MINUS_DST_ALPHA 0x0305 + +/* BlendingFactorSrc */ +/* GL_ZERO */ +/* GL_ONE */ +#define GL_DST_COLOR 0x0306 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_SRC_ALPHA_SATURATE 0x0308 +/* GL_SRC_ALPHA */ +/* GL_ONE_MINUS_SRC_ALPHA */ +/* GL_DST_ALPHA */ +/* GL_ONE_MINUS_DST_ALPHA */ + +/* ClipPlaneName */ +#define GL_CLIP_PLANE0 0x3000 +#define GL_CLIP_PLANE1 0x3001 +#define GL_CLIP_PLANE2 0x3002 +#define GL_CLIP_PLANE3 0x3003 +#define GL_CLIP_PLANE4 0x3004 +#define GL_CLIP_PLANE5 0x3005 + +/* ColorMaterialFace */ +/* GL_FRONT_AND_BACK */ + +/* ColorMaterialParameter */ +/* GL_AMBIENT_AND_DIFFUSE */ + +/* ColorPointerType */ +/* GL_UNSIGNED_BYTE */ +/* GL_FLOAT */ +/* GL_FIXED */ + +/* CullFaceMode */ +#define GL_FRONT 0x0404 +#define GL_BACK 0x0405 +#define GL_FRONT_AND_BACK 0x0408 + +/* DepthFunction */ +/* GL_NEVER */ +/* GL_LESS */ +/* GL_EQUAL */ +/* GL_LEQUAL */ +/* GL_GREATER */ +/* GL_NOTEQUAL */ +/* GL_GEQUAL */ +/* GL_ALWAYS */ + +/* EnableCap */ +#define GL_FOG 0x0B60 +#define GL_LIGHTING 0x0B50 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_CULL_FACE 0x0B44 +#define GL_ALPHA_TEST 0x0BC0 +#define GL_BLEND 0x0BE2 +#define GL_COLOR_LOGIC_OP 0x0BF2 +#define GL_DITHER 0x0BD0 +#define GL_STENCIL_TEST 0x0B90 +#define GL_DEPTH_TEST 0x0B71 +/* GL_LIGHT0 */ +/* GL_LIGHT1 */ +/* GL_LIGHT2 */ +/* GL_LIGHT3 */ +/* GL_LIGHT4 */ +/* GL_LIGHT5 */ +/* GL_LIGHT6 */ +/* GL_LIGHT7 */ +#define GL_POINT_SMOOTH 0x0B10 +#define GL_LINE_SMOOTH 0x0B20 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_COLOR_MATERIAL 0x0B57 +#define GL_NORMALIZE 0x0BA1 +#define GL_RESCALE_NORMAL 0x803A +#define GL_POLYGON_OFFSET_FILL 0x8037 +#define GL_VERTEX_ARRAY 0x8074 +#define GL_NORMAL_ARRAY 0x8075 +#define GL_COLOR_ARRAY 0x8076 +#define GL_TEXTURE_COORD_ARRAY 0x8078 +#define GL_MULTISAMPLE 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_COVERAGE 0x80A0 + +/* ErrorCode */ +#define GL_NO_ERROR 0 +#define GL_INVALID_ENUM 0x0500 +#define GL_INVALID_VALUE 0x0501 +#define GL_INVALID_OPERATION 0x0502 +#define GL_STACK_OVERFLOW 0x0503 +#define GL_STACK_UNDERFLOW 0x0504 +#define GL_OUT_OF_MEMORY 0x0505 + +/* FogMode */ +/* GL_LINEAR */ +#define GL_EXP 0x0800 +#define GL_EXP2 0x0801 + +/* FogParameter */ +#define GL_FOG_DENSITY 0x0B62 +#define GL_FOG_START 0x0B63 +#define GL_FOG_END 0x0B64 +#define GL_FOG_MODE 0x0B65 +#define GL_FOG_COLOR 0x0B66 + +/* FrontFaceDirection */ +#define GL_CW 0x0900 +#define GL_CCW 0x0901 + +/* GetPName */ +#define GL_CURRENT_COLOR 0x0B00 +#define GL_CURRENT_NORMAL 0x0B02 +#define GL_CURRENT_TEXTURE_COORDS 0x0B03 +#define GL_POINT_SIZE 0x0B11 +#define GL_POINT_SIZE_MIN 0x8126 +#define GL_POINT_SIZE_MAX 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION 0x8129 +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_LINE_WIDTH 0x0B21 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_FRONT_FACE 0x0B46 +#define GL_SHADE_MODEL 0x0B54 +#define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DEPTH_CLEAR_VALUE 0x0B73 +#define GL_DEPTH_FUNC 0x0B74 +#define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_FUNC 0x0B92 +#define GL_STENCIL_VALUE_MASK 0x0B93 +#define GL_STENCIL_FAIL 0x0B94 +#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 +#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 +#define GL_STENCIL_REF 0x0B97 +#define GL_STENCIL_WRITEMASK 0x0B98 +#define GL_MATRIX_MODE 0x0BA0 +#define GL_VIEWPORT 0x0BA2 +#define GL_MODELVIEW_STACK_DEPTH 0x0BA3 +#define GL_PROJECTION_STACK_DEPTH 0x0BA4 +#define GL_TEXTURE_STACK_DEPTH 0x0BA5 +#define GL_MODELVIEW_MATRIX 0x0BA6 +#define GL_PROJECTION_MATRIX 0x0BA7 +#define GL_TEXTURE_MATRIX 0x0BA8 +#define GL_ALPHA_TEST_FUNC 0x0BC1 +#define GL_ALPHA_TEST_REF 0x0BC2 +#define GL_BLEND_DST 0x0BE0 +#define GL_BLEND_SRC 0x0BE1 +#define GL_LOGIC_OP_MODE 0x0BF0 +#define GL_SCISSOR_BOX 0x0C10 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_MAX_LIGHTS 0x0D31 +#define GL_MAX_CLIP_PLANES 0x0D32 +#define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 +#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 +#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_MAX_TEXTURE_UNITS 0x84E2 +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_RED_BITS 0x0D52 +#define GL_GREEN_BITS 0x0D53 +#define GL_BLUE_BITS 0x0D54 +#define GL_ALPHA_BITS 0x0D55 +#define GL_DEPTH_BITS 0x0D56 +#define GL_STENCIL_BITS 0x0D57 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +#define GL_POLYGON_OFFSET_FILL 0x8037 +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_VERTEX_ARRAY_SIZE 0x807A +#define GL_VERTEX_ARRAY_TYPE 0x807B +#define GL_VERTEX_ARRAY_STRIDE 0x807C +#define GL_NORMAL_ARRAY_TYPE 0x807E +#define GL_NORMAL_ARRAY_STRIDE 0x807F +#define GL_COLOR_ARRAY_SIZE 0x8081 +#define GL_COLOR_ARRAY_TYPE 0x8082 +#define GL_COLOR_ARRAY_STRIDE 0x8083 +#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A +#define GL_VERTEX_ARRAY_POINTER 0x808E +#define GL_NORMAL_ARRAY_POINTER 0x808F +#define GL_COLOR_ARRAY_POINTER 0x8090 +#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB + +/* GetTextureParameter */ +/* GL_TEXTURE_MAG_FILTER */ +/* GL_TEXTURE_MIN_FILTER */ +/* GL_TEXTURE_WRAP_S */ +/* GL_TEXTURE_WRAP_T */ + +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 + +/* HintMode */ +#define GL_DONT_CARE 0x1100 +#define GL_FASTEST 0x1101 +#define GL_NICEST 0x1102 + +/* HintTarget */ +#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 +#define GL_POINT_SMOOTH_HINT 0x0C51 +#define GL_LINE_SMOOTH_HINT 0x0C52 +#define GL_FOG_HINT 0x0C54 +#define GL_GENERATE_MIPMAP_HINT 0x8192 + +/* LightModelParameter */ +#define GL_LIGHT_MODEL_AMBIENT 0x0B53 +#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 + +/* LightParameter */ +#define GL_AMBIENT 0x1200 +#define GL_DIFFUSE 0x1201 +#define GL_SPECULAR 0x1202 +#define GL_POSITION 0x1203 +#define GL_SPOT_DIRECTION 0x1204 +#define GL_SPOT_EXPONENT 0x1205 +#define GL_SPOT_CUTOFF 0x1206 +#define GL_CONSTANT_ATTENUATION 0x1207 +#define GL_LINEAR_ATTENUATION 0x1208 +#define GL_QUADRATIC_ATTENUATION 0x1209 + +/* DataType */ +#define GL_BYTE 0x1400 +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_SHORT 0x1402 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_FLOAT 0x1406 +#define GL_FIXED 0x140C + +/* LogicOp */ +#define GL_CLEAR 0x1500 +#define GL_AND 0x1501 +#define GL_AND_REVERSE 0x1502 +#define GL_COPY 0x1503 +#define GL_AND_INVERTED 0x1504 +#define GL_NOOP 0x1505 +#define GL_XOR 0x1506 +#define GL_OR 0x1507 +#define GL_NOR 0x1508 +#define GL_EQUIV 0x1509 +#define GL_INVERT 0x150A +#define GL_OR_REVERSE 0x150B +#define GL_COPY_INVERTED 0x150C +#define GL_OR_INVERTED 0x150D +#define GL_NAND 0x150E +#define GL_SET 0x150F + +/* MaterialFace */ +/* GL_FRONT_AND_BACK */ + +/* MaterialParameter */ +#define GL_EMISSION 0x1600 +#define GL_SHININESS 0x1601 +#define GL_AMBIENT_AND_DIFFUSE 0x1602 +/* GL_AMBIENT */ +/* GL_DIFFUSE */ +/* GL_SPECULAR */ + +/* MatrixMode */ +#define GL_MODELVIEW 0x1700 +#define GL_PROJECTION 0x1701 +#define GL_TEXTURE 0x1702 + +/* NormalPointerType */ +/* GL_BYTE */ +/* GL_SHORT */ +/* GL_FLOAT */ +/* GL_FIXED */ + +/* PixelFormat */ +#define GL_ALPHA 0x1906 +#define GL_RGB 0x1907 +#define GL_RGBA 0x1908 +#define GL_LUMINANCE 0x1909 +#define GL_LUMINANCE_ALPHA 0x190A + +/* PixelStoreParameter */ +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_PACK_ALIGNMENT 0x0D05 + +/* PixelType */ +/* GL_UNSIGNED_BYTE */ +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 + +/* ShadingModel */ +#define GL_FLAT 0x1D00 +#define GL_SMOOTH 0x1D01 + +/* StencilFunction */ +/* GL_NEVER */ +/* GL_LESS */ +/* GL_EQUAL */ +/* GL_LEQUAL */ +/* GL_GREATER */ +/* GL_NOTEQUAL */ +/* GL_GEQUAL */ +/* GL_ALWAYS */ + +/* StencilOp */ +/* GL_ZERO */ +#define GL_KEEP 0x1E00 +#define GL_REPLACE 0x1E01 +#define GL_INCR 0x1E02 +#define GL_DECR 0x1E03 +/* GL_INVERT */ + +/* StringName */ +#define GL_VENDOR 0x1F00 +#define GL_RENDERER 0x1F01 +#define GL_VERSION 0x1F02 +#define GL_EXTENSIONS 0x1F03 + +/* TexCoordPointerType */ +/* GL_SHORT */ +/* GL_FLOAT */ +/* GL_FIXED */ +/* GL_BYTE */ + +/* TextureEnvMode */ +#define GL_MODULATE 0x2100 +#define GL_DECAL 0x2101 +/* GL_BLEND */ +#define GL_ADD 0x0104 +/* GL_REPLACE */ + +/* TextureEnvParameter */ +#define GL_TEXTURE_ENV_MODE 0x2200 +#define GL_TEXTURE_ENV_COLOR 0x2201 + +/* TextureEnvTarget */ +#define GL_TEXTURE_ENV 0x2300 + +/* TextureMagFilter */ +#define GL_NEAREST 0x2600 +#define GL_LINEAR 0x2601 + +/* TextureMinFilter */ +/* GL_NEAREST */ +/* GL_LINEAR */ +#define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_LINEAR_MIPMAP_NEAREST 0x2701 +#define GL_NEAREST_MIPMAP_LINEAR 0x2702 +#define GL_LINEAR_MIPMAP_LINEAR 0x2703 + +/* TextureParameterName */ +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_WRAP_S 0x2802 +#define GL_TEXTURE_WRAP_T 0x2803 +#define GL_GENERATE_MIPMAP 0x8191 + +/* TextureTarget */ +/* GL_TEXTURE_2D */ + +/* TextureUnit */ +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 + +/* TextureWrapMode */ +#define GL_REPEAT 0x2901 +#define GL_CLAMP_TO_EDGE 0x812F + +/* VertexPointerType */ +/* GL_SHORT */ +/* GL_FLOAT */ +/* GL_FIXED */ +/* GL_BYTE */ + +/* LightName */ +#define GL_LIGHT0 0x4000 +#define GL_LIGHT1 0x4001 +#define GL_LIGHT2 0x4002 +#define GL_LIGHT3 0x4003 +#define GL_LIGHT4 0x4004 +#define GL_LIGHT5 0x4005 +#define GL_LIGHT6 0x4006 +#define GL_LIGHT7 0x4007 + +/* Buffer Objects */ +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 + +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A + +#define GL_STATIC_DRAW 0x88E4 +#define GL_DYNAMIC_DRAW 0x88E8 + +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 + +/* Texture combine + dot3 */ +#define GL_SUBTRACT 0x84E7 +#define GL_COMBINE 0x8570 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_RGB_SCALE 0x8573 +#define GL_ADD_SIGNED 0x8574 +#define GL_INTERPOLATE 0x8575 +#define GL_CONSTANT 0x8576 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PREVIOUS 0x8578 +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_RGB 0x8592 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND2_ALPHA 0x859A + +#define GL_ALPHA_SCALE 0x0D1C + +#define GL_SRC0_RGB 0x8580 +#define GL_SRC1_RGB 0x8581 +#define GL_SRC2_RGB 0x8582 +#define GL_SRC0_ALPHA 0x8588 +#define GL_SRC1_ALPHA 0x8589 +#define GL_SRC2_ALPHA 0x858A + +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF + +/*------------------------------------------------------------------------* + * required OES extension tokens + *------------------------------------------------------------------------*/ + +/* OES_read_format */ +#ifndef GL_OES_read_format +#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B +#endif + +/* GL_OES_compressed_paletted_texture */ +#ifndef GL_OES_compressed_paletted_texture +#define GL_PALETTE4_RGB8_OES 0x8B90 +#define GL_PALETTE4_RGBA8_OES 0x8B91 +#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 +#define GL_PALETTE4_RGBA4_OES 0x8B93 +#define GL_PALETTE4_RGB5_A1_OES 0x8B94 +#define GL_PALETTE8_RGB8_OES 0x8B95 +#define GL_PALETTE8_RGBA8_OES 0x8B96 +#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 +#define GL_PALETTE8_RGBA4_OES 0x8B98 +#define GL_PALETTE8_RGB5_A1_OES 0x8B99 +#endif + +/* OES_point_size_array */ +#ifndef GL_OES_point_size_array +#define GL_POINT_SIZE_ARRAY_OES 0x8B9C +#define GL_POINT_SIZE_ARRAY_TYPE_OES 0x898A +#define GL_POINT_SIZE_ARRAY_STRIDE_OES 0x898B +#define GL_POINT_SIZE_ARRAY_POINTER_OES 0x898C +#define GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES 0x8B9F +#endif + +/* GL_OES_point_sprite */ +#ifndef GL_OES_point_sprite +#define GL_POINT_SPRITE_OES 0x8861 +#define GL_COORD_REPLACE_OES 0x8862 +#endif + +/*************************************************************/ + +/* Available only in Common profile */ +GL_API void GL_APIENTRY glAlphaFunc (GLenum func, GLclampf ref); +GL_API void GL_APIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +GL_API void GL_APIENTRY glClearDepthf (GLclampf depth); +GL_API void GL_APIENTRY glClipPlanef (GLenum plane, const GLfloat *equation); +GL_API void GL_APIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GL_API void GL_APIENTRY glDepthRangef (GLclampf zNear, GLclampf zFar); +GL_API void GL_APIENTRY glFogf (GLenum pname, GLfloat param); +GL_API void GL_APIENTRY glFogfv (GLenum pname, const GLfloat *params); +GL_API void GL_APIENTRY glFrustumf (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); +GL_API void GL_APIENTRY glGetClipPlanef (GLenum pname, GLfloat eqn[4]); +GL_API void GL_APIENTRY glGetFloatv (GLenum pname, GLfloat *params); +GL_API void GL_APIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params); +GL_API void GL_APIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params); +GL_API void GL_APIENTRY glGetTexEnvfv (GLenum env, GLenum pname, GLfloat *params); +GL_API void GL_APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params); +GL_API void GL_APIENTRY glLightModelf (GLenum pname, GLfloat param); +GL_API void GL_APIENTRY glLightModelfv (GLenum pname, const GLfloat *params); +GL_API void GL_APIENTRY glLightf (GLenum light, GLenum pname, GLfloat param); +GL_API void GL_APIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params); +GL_API void GL_APIENTRY glLineWidth (GLfloat width); +GL_API void GL_APIENTRY glLoadMatrixf (const GLfloat *m); +GL_API void GL_APIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param); +GL_API void GL_APIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params); +GL_API void GL_APIENTRY glMultMatrixf (const GLfloat *m); +GL_API void GL_APIENTRY glMultiTexCoord4f (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GL_API void GL_APIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz); +GL_API void GL_APIENTRY glOrthof (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); +GL_API void GL_APIENTRY glPointParameterf (GLenum pname, GLfloat param); +GL_API void GL_APIENTRY glPointParameterfv (GLenum pname, const GLfloat *params); +GL_API void GL_APIENTRY glPointSize (GLfloat size); +GL_API void GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units); +GL_API void GL_APIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +GL_API void GL_APIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z); +GL_API void GL_APIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param); +GL_API void GL_APIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params); +GL_API void GL_APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); +GL_API void GL_APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params); +GL_API void GL_APIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z); + +/* Available in both Common and Common-Lite profiles */ +GL_API void GL_APIENTRY glActiveTexture (GLenum texture); +GL_API void GL_APIENTRY glAlphaFuncx (GLenum func, GLclampx ref); +GL_API void GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer); +GL_API void GL_APIENTRY glBindTexture (GLenum target, GLuint texture); +GL_API void GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); +GL_API void GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); +GL_API void GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); +GL_API void GL_APIENTRY glClear (GLbitfield mask); +GL_API void GL_APIENTRY glClearColorx (GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha); +GL_API void GL_APIENTRY glClearDepthx (GLclampx depth); +GL_API void GL_APIENTRY glClearStencil (GLint s); +GL_API void GL_APIENTRY glClientActiveTexture (GLenum texture); +GL_API void GL_APIENTRY glClipPlanex (GLenum plane, const GLfixed *equation); +GL_API void GL_APIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); +GL_API void GL_APIENTRY glColor4x (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +GL_API void GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +GL_API void GL_APIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GL_API void GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +GL_API void GL_APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +GL_API void GL_APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GL_API void GL_APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GL_API void GL_APIENTRY glCullFace (GLenum mode); +GL_API void GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers); +GL_API void GL_APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); +GL_API void GL_APIENTRY glDepthFunc (GLenum func); +GL_API void GL_APIENTRY glDepthMask (GLboolean flag); +GL_API void GL_APIENTRY glDepthRangex (GLclampx zNear, GLclampx zFar); +GL_API void GL_APIENTRY glDisable (GLenum cap); +GL_API void GL_APIENTRY glDisableClientState (GLenum array); +GL_API void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); +GL_API void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); +GL_API void GL_APIENTRY glEnable (GLenum cap); +GL_API void GL_APIENTRY glEnableClientState (GLenum array); +GL_API void GL_APIENTRY glFinish (void); +GL_API void GL_APIENTRY glFlush (void); +GL_API void GL_APIENTRY glFogx (GLenum pname, GLfixed param); +GL_API void GL_APIENTRY glFogxv (GLenum pname, const GLfixed *params); +GL_API void GL_APIENTRY glFrontFace (GLenum mode); +GL_API void GL_APIENTRY glFrustumx (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); +GL_API void GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean *params); +GL_API void GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params); +GL_API void GL_APIENTRY glGetClipPlanex (GLenum pname, GLfixed eqn[4]); +GL_API void GL_APIENTRY glGenBuffers (GLsizei n, GLuint *buffers); +GL_API void GL_APIENTRY glGenTextures (GLsizei n, GLuint *textures); +GL_API GLenum GL_APIENTRY glGetError (void); +GL_API void GL_APIENTRY glGetFixedv (GLenum pname, GLfixed *params); +GL_API void GL_APIENTRY glGetIntegerv (GLenum pname, GLint *params); +GL_API void GL_APIENTRY glGetLightxv (GLenum light, GLenum pname, GLfixed *params); +GL_API void GL_APIENTRY glGetMaterialxv (GLenum face, GLenum pname, GLfixed *params); +GL_API void GL_APIENTRY glGetPointerv (GLenum pname, void **params); +GL_API const GLubyte * GL_APIENTRY glGetString (GLenum name); +GL_API void GL_APIENTRY glGetTexEnviv (GLenum env, GLenum pname, GLint *params); +GL_API void GL_APIENTRY glGetTexEnvxv (GLenum env, GLenum pname, GLfixed *params); +GL_API void GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params); +GL_API void GL_APIENTRY glGetTexParameterxv (GLenum target, GLenum pname, GLfixed *params); +GL_API void GL_APIENTRY glHint (GLenum target, GLenum mode); +GL_API GLboolean GL_APIENTRY glIsBuffer (GLuint buffer); +GL_API GLboolean GL_APIENTRY glIsEnabled (GLenum cap); +GL_API GLboolean GL_APIENTRY glIsTexture (GLuint texture); +GL_API void GL_APIENTRY glLightModelx (GLenum pname, GLfixed param); +GL_API void GL_APIENTRY glLightModelxv (GLenum pname, const GLfixed *params); +GL_API void GL_APIENTRY glLightx (GLenum light, GLenum pname, GLfixed param); +GL_API void GL_APIENTRY glLightxv (GLenum light, GLenum pname, const GLfixed *params); +GL_API void GL_APIENTRY glLineWidthx (GLfixed width); +GL_API void GL_APIENTRY glLoadIdentity (void); +GL_API void GL_APIENTRY glLoadMatrixx (const GLfixed *m); +GL_API void GL_APIENTRY glLogicOp (GLenum opcode); +GL_API void GL_APIENTRY glMaterialx (GLenum face, GLenum pname, GLfixed param); +GL_API void GL_APIENTRY glMaterialxv (GLenum face, GLenum pname, const GLfixed *params); +GL_API void GL_APIENTRY glMatrixMode (GLenum mode); +GL_API void GL_APIENTRY glMultMatrixx (const GLfixed *m); +GL_API void GL_APIENTRY glMultiTexCoord4x (GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q); +GL_API void GL_APIENTRY glNormal3x (GLfixed nx, GLfixed ny, GLfixed nz); +GL_API void GL_APIENTRY glNormalPointer (GLenum type, GLsizei stride, const GLvoid *pointer); +GL_API void GL_APIENTRY glOrthox (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); +GL_API void GL_APIENTRY glPixelStorei (GLenum pname, GLint param); +GL_API void GL_APIENTRY glPointParameterx (GLenum pname, GLfixed param); +GL_API void GL_APIENTRY glPointParameterxv (GLenum pname, const GLfixed *params); +GL_API void GL_APIENTRY glPointSizex (GLfixed size); +GL_API void GL_APIENTRY glPolygonOffsetx (GLfixed factor, GLfixed units); +GL_API void GL_APIENTRY glPopMatrix (void); +GL_API void GL_APIENTRY glPushMatrix (void); +GL_API void GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels); +GL_API void GL_APIENTRY glRotatex (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); +GL_API void GL_APIENTRY glSampleCoverage (GLclampf value, GLboolean invert); +GL_API void GL_APIENTRY glSampleCoveragex (GLclampx value, GLboolean invert); +GL_API void GL_APIENTRY glScalex (GLfixed x, GLfixed y, GLfixed z); +GL_API void GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); +GL_API void GL_APIENTRY glShadeModel (GLenum mode); +GL_API void GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); +GL_API void GL_APIENTRY glStencilMask (GLuint mask); +GL_API void GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); +GL_API void GL_APIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GL_API void GL_APIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param); +GL_API void GL_APIENTRY glTexEnvx (GLenum target, GLenum pname, GLfixed param); +GL_API void GL_APIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params); +GL_API void GL_APIENTRY glTexEnvxv (GLenum target, GLenum pname, const GLfixed *params); +GL_API void GL_APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +GL_API void GL_APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); +GL_API void GL_APIENTRY glTexParameterx (GLenum target, GLenum pname, GLfixed param); +GL_API void GL_APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params); +GL_API void GL_APIENTRY glTexParameterxv (GLenum target, GLenum pname, const GLfixed *params); +GL_API void GL_APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); +GL_API void GL_APIENTRY glTranslatex (GLfixed x, GLfixed y, GLfixed z); +GL_API void GL_APIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GL_API void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); + +/*------------------------------------------------------------------------* + * Required OES extension functions + *------------------------------------------------------------------------*/ + +/* GL_OES_read_format */ +#ifndef GL_OES_read_format +#define GL_OES_read_format 1 +#endif + +/* GL_OES_compressed_paletted_texture */ +#ifndef GL_OES_compressed_paletted_texture +#define GL_OES_compressed_paletted_texture 1 +#endif + +/* GL_OES_point_size_array */ +#ifndef GL_OES_point_size_array +#define GL_OES_point_size_array 1 +GL_API void GL_APIENTRY glPointSizePointerOES (GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +/* GL_OES_point_sprite */ +#ifndef GL_OES_point_sprite +#define GL_OES_point_sprite 1 +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __gl_h_ */ + diff --git a/minecraftcpp-master/handheld/lib/include/GLES/glext.h b/minecraftcpp-master/handheld/lib/include/GLES/glext.h new file mode 100644 index 0000000..93c3f50 --- /dev/null +++ b/minecraftcpp-master/handheld/lib/include/GLES/glext.h @@ -0,0 +1,908 @@ +#ifndef __glext_h_ +#define __glext_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * This document is licensed under the SGI Free Software B License Version + * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ . + */ + +#ifndef GL_APIENTRYP +# define GL_APIENTRYP GL_APIENTRY* +#endif + +/*------------------------------------------------------------------------* + * OES extension tokens + *------------------------------------------------------------------------*/ + +/* GL_OES_blend_equation_separate */ +#ifndef GL_OES_blend_equation_separate +/* BLEND_EQUATION_RGB_OES same as BLEND_EQUATION_OES */ +#define GL_BLEND_EQUATION_RGB_OES 0x8009 +#define GL_BLEND_EQUATION_ALPHA_OES 0x883D +#endif + +/* GL_OES_blend_func_separate */ +#ifndef GL_OES_blend_func_separate +#define GL_BLEND_DST_RGB_OES 0x80C8 +#define GL_BLEND_SRC_RGB_OES 0x80C9 +#define GL_BLEND_DST_ALPHA_OES 0x80CA +#define GL_BLEND_SRC_ALPHA_OES 0x80CB +#endif + +/* GL_OES_blend_subtract */ +#ifndef GL_OES_blend_subtract +#define GL_BLEND_EQUATION_OES 0x8009 +#define GL_FUNC_ADD_OES 0x8006 +#define GL_FUNC_SUBTRACT_OES 0x800A +#define GL_FUNC_REVERSE_SUBTRACT_OES 0x800B +#endif + +/* GL_OES_compressed_ETC1_RGB8_texture */ +#ifndef GL_OES_compressed_ETC1_RGB8_texture +#define GL_ETC1_RGB8_OES 0x8D64 +#endif + +/* GL_OES_depth24 */ +#ifndef GL_OES_depth24 +#define GL_DEPTH_COMPONENT24_OES 0x81A6 +#endif + +/* GL_OES_depth32 */ +#ifndef GL_OES_depth32 +#define GL_DEPTH_COMPONENT32_OES 0x81A7 +#endif + +/* GL_OES_draw_texture */ +#ifndef GL_OES_draw_texture +#define GL_TEXTURE_CROP_RECT_OES 0x8B9D +#endif + +/* GL_OES_EGL_image */ +#ifndef GL_OES_EGL_image +typedef void* GLeglImageOES; +#endif + +/* GL_OES_fixed_point */ +#ifndef GL_OES_fixed_point +#define GL_FIXED_OES 0x140C +#endif + +/* GL_OES_framebuffer_object */ +#ifndef GL_OES_framebuffer_object +#define GL_NONE_OES 0 +#define GL_FRAMEBUFFER_OES 0x8D40 +#define GL_RENDERBUFFER_OES 0x8D41 +#define GL_RGBA4_OES 0x8056 +#define GL_RGB5_A1_OES 0x8057 +#define GL_RGB565_OES 0x8D62 +#define GL_DEPTH_COMPONENT16_OES 0x81A5 +#define GL_RENDERBUFFER_WIDTH_OES 0x8D42 +#define GL_RENDERBUFFER_HEIGHT_OES 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT_OES 0x8D44 +#define GL_RENDERBUFFER_RED_SIZE_OES 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE_OES 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE_OES 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE_OES 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE_OES 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE_OES 0x8D55 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_OES 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_OES 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_OES 0x8CD3 +#define GL_COLOR_ATTACHMENT0_OES 0x8CE0 +#define GL_DEPTH_ATTACHMENT_OES 0x8D00 +#define GL_STENCIL_ATTACHMENT_OES 0x8D20 +#define GL_FRAMEBUFFER_COMPLETE_OES 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES 0x8CD9 +#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_OES 0x8CDA +#define GL_FRAMEBUFFER_UNSUPPORTED_OES 0x8CDD +#define GL_FRAMEBUFFER_BINDING_OES 0x8CA6 +#define GL_RENDERBUFFER_BINDING_OES 0x8CA7 +#define GL_MAX_RENDERBUFFER_SIZE_OES 0x84E8 +#define GL_INVALID_FRAMEBUFFER_OPERATION_OES 0x0506 +#endif + +/* GL_OES_mapbuffer */ +#ifndef GL_OES_mapbuffer +#define GL_WRITE_ONLY_OES 0x88B9 +#define GL_BUFFER_ACCESS_OES 0x88BB +#define GL_BUFFER_MAPPED_OES 0x88BC +#define GL_BUFFER_MAP_POINTER_OES 0x88BD +#endif + +/* GL_OES_matrix_get */ +#ifndef GL_OES_matrix_get +#define GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES 0x898D +#define GL_PROJECTION_MATRIX_FLOAT_AS_INT_BITS_OES 0x898E +#define GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS_OES 0x898F +#endif + +/* GL_OES_matrix_palette */ +#ifndef GL_OES_matrix_palette +#define GL_MAX_VERTEX_UNITS_OES 0x86A4 +#define GL_MAX_PALETTE_MATRICES_OES 0x8842 +#define GL_MATRIX_PALETTE_OES 0x8840 +#define GL_MATRIX_INDEX_ARRAY_OES 0x8844 +#define GL_WEIGHT_ARRAY_OES 0x86AD +#define GL_CURRENT_PALETTE_MATRIX_OES 0x8843 +#define GL_MATRIX_INDEX_ARRAY_SIZE_OES 0x8846 +#define GL_MATRIX_INDEX_ARRAY_TYPE_OES 0x8847 +#define GL_MATRIX_INDEX_ARRAY_STRIDE_OES 0x8848 +#define GL_MATRIX_INDEX_ARRAY_POINTER_OES 0x8849 +#define GL_MATRIX_INDEX_ARRAY_BUFFER_BINDING_OES 0x8B9E +#define GL_WEIGHT_ARRAY_SIZE_OES 0x86AB +#define GL_WEIGHT_ARRAY_TYPE_OES 0x86A9 +#define GL_WEIGHT_ARRAY_STRIDE_OES 0x86AA +#define GL_WEIGHT_ARRAY_POINTER_OES 0x86AC +#define GL_WEIGHT_ARRAY_BUFFER_BINDING_OES 0x889E +#endif + +/* GL_OES_packed_depth_stencil */ +#ifndef GL_OES_packed_depth_stencil +#define GL_DEPTH_STENCIL_OES 0x84F9 +#define GL_UNSIGNED_INT_24_8_OES 0x84FA +#define GL_DEPTH24_STENCIL8_OES 0x88F0 +#endif + +/* GL_OES_rgb8_rgba8 */ +#ifndef GL_OES_rgb8_rgba8 +#define GL_RGB8_OES 0x8051 +#define GL_RGBA8_OES 0x8058 +#endif + +/* GL_OES_stencil1 */ +#ifndef GL_OES_stencil1 +#define GL_STENCIL_INDEX1_OES 0x8D46 +#endif + +/* GL_OES_stencil4 */ +#ifndef GL_OES_stencil4 +#define GL_STENCIL_INDEX4_OES 0x8D47 +#endif + +/* GL_OES_stencil8 */ +#ifndef GL_OES_stencil8 +#define GL_STENCIL_INDEX8_OES 0x8D48 +#endif + +/* GL_OES_stencil_wrap */ +#ifndef GL_OES_stencil_wrap +#define GL_INCR_WRAP_OES 0x8507 +#define GL_DECR_WRAP_OES 0x8508 +#endif + +/* GL_OES_texture_cube_map */ +#ifndef GL_OES_texture_cube_map +#define GL_NORMAL_MAP_OES 0x8511 +#define GL_REFLECTION_MAP_OES 0x8512 +#define GL_TEXTURE_CUBE_MAP_OES 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_OES 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_OES 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_OES 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_OES 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_OES 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_OES 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_OES 0x851A +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_OES 0x851C +#define GL_TEXTURE_GEN_MODE_OES 0x2500 +#define GL_TEXTURE_GEN_STR_OES 0x8D60 +#endif + +/* GL_OES_texture_mirrored_repeat */ +#ifndef GL_OES_texture_mirrored_repeat +#define GL_MIRRORED_REPEAT_OES 0x8370 +#endif + +/*------------------------------------------------------------------------* + * AMD extension tokens + *------------------------------------------------------------------------*/ + +/* GL_AMD_compressed_3DC_texture */ +#ifndef GL_AMD_compressed_3DC_texture +#define GL_3DC_X_AMD 0x87F9 +#define GL_3DC_XY_AMD 0x87FA +#endif + +/* GL_AMD_compressed_ATC_texture */ +#ifndef GL_AMD_compressed_ATC_texture +#define GL_ATC_RGB_AMD 0x8C92 +#define GL_ATC_RGBA_EXPLICIT_ALPHA_AMD 0x8C93 +#define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD 0x87EE +#endif + +/*------------------------------------------------------------------------* + * APPLE extension tokens + *------------------------------------------------------------------------*/ + +/* GL_APPLE_texture_2D_limited_npot */ +/* No new tokens introduced by this extension. */ + +/*------------------------------------------------------------------------* + * EXT extension tokens + *------------------------------------------------------------------------*/ + +/* GL_EXT_blend_minmax */ +#ifndef GL_EXT_blend_minmax +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 +#endif + +/* GL_EXT_discard_framebuffer */ +#ifndef GL_EXT_discard_framebuffer +#define GL_COLOR_EXT 0x1800 +#define GL_DEPTH_EXT 0x1801 +#define GL_STENCIL_EXT 0x1802 +#endif + +/* GL_EXT_multi_draw_arrays */ +/* No new tokens introduced by this extension. */ + +/* GL_EXT_read_format_bgra */ +#ifndef GL_EXT_read_format_bgra +#define GL_BGRA_EXT 0x80E1 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT 0x8366 +#endif + +/* GL_EXT_texture_filter_anisotropic */ +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +#endif + +/* GL_EXT_texture_format_BGRA8888 */ +#ifndef GL_EXT_texture_format_BGRA8888 +#define GL_BGRA_EXT 0x80E1 +#endif + +/* GL_EXT_texture_lod_bias */ +#ifndef GL_EXT_texture_lod_bias +#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD +#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 +#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 +#endif + +/*------------------------------------------------------------------------* + * IMG extension tokens + *------------------------------------------------------------------------*/ + +/* GL_IMG_read_format */ +#ifndef GL_IMG_read_format +#define GL_BGRA_IMG 0x80E1 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV_IMG 0x8365 +#endif + +/* GL_IMG_texture_compression_pvrtc */ +#ifndef GL_IMG_texture_compression_pvrtc +#define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00 +#define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01 +#define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02 +#define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03 +#endif + +/* GL_IMG_texture_env_enhanced_fixed_function */ +#ifndef GL_IMG_texture_env_enhanced_fixed_function +#define GL_MODULATE_COLOR_IMG 0x8C04 +#define GL_RECIP_ADD_SIGNED_ALPHA_IMG 0x8C05 +#define GL_TEXTURE_ALPHA_MODULATE_IMG 0x8C06 +#define GL_FACTOR_ALPHA_MODULATE_IMG 0x8C07 +#define GL_FRAGMENT_ALPHA_MODULATE_IMG 0x8C08 +#define GL_ADD_BLEND_IMG 0x8C09 +#define GL_DOT3_RGBA_IMG 0x86AF +#endif + +/* GL_IMG_user_clip_plane */ +#ifndef GL_IMG_user_clip_plane +#define GL_CLIP_PLANE0_IMG 0x3000 +#define GL_CLIP_PLANE1_IMG 0x3001 +#define GL_CLIP_PLANE2_IMG 0x3002 +#define GL_CLIP_PLANE3_IMG 0x3003 +#define GL_CLIP_PLANE4_IMG 0x3004 +#define GL_CLIP_PLANE5_IMG 0x3005 +#define GL_MAX_CLIP_PLANES_IMG 0x0D32 +#endif + +/*------------------------------------------------------------------------* + * NV extension tokens + *------------------------------------------------------------------------*/ + +/* GL_NV_fence */ +#ifndef GL_NV_fence +#define GL_ALL_COMPLETED_NV 0x84F2 +#define GL_FENCE_STATUS_NV 0x84F3 +#define GL_FENCE_CONDITION_NV 0x84F4 +#endif + +/*------------------------------------------------------------------------* + * QCOM extension tokens + *------------------------------------------------------------------------*/ + +/* GL_QCOM_driver_control */ +/* No new tokens introduced by this extension. */ + +/* GL_QCOM_extended_get */ +#ifndef GL_QCOM_extended_get +#define GL_TEXTURE_WIDTH_QCOM 0x8BD2 +#define GL_TEXTURE_HEIGHT_QCOM 0x8BD3 +#define GL_TEXTURE_DEPTH_QCOM 0x8BD4 +#define GL_TEXTURE_INTERNAL_FORMAT_QCOM 0x8BD5 +#define GL_TEXTURE_FORMAT_QCOM 0x8BD6 +#define GL_TEXTURE_TYPE_QCOM 0x8BD7 +#define GL_TEXTURE_IMAGE_VALID_QCOM 0x8BD8 +#define GL_TEXTURE_NUM_LEVELS_QCOM 0x8BD9 +#define GL_TEXTURE_TARGET_QCOM 0x8BDA +#define GL_TEXTURE_OBJECT_VALID_QCOM 0x8BDB +#define GL_STATE_RESTORE 0x8BDC +#endif + +/* GL_QCOM_extended_get2 */ +/* No new tokens introduced by this extension. */ + +/* GL_QCOM_perfmon_global_mode */ +#ifndef GL_QCOM_perfmon_global_mode +#define GL_PERFMON_GLOBAL_MODE_QCOM 0x8FA0 +#endif + +/* GL_QCOM_writeonly_rendering */ +#ifndef GL_QCOM_writeonly_rendering +#define GL_WRITEONLY_RENDERING_QCOM 0x8823 +#endif + +/*------------------------------------------------------------------------* + * End of extension tokens, start of corresponding extension functions + *------------------------------------------------------------------------*/ + +/*------------------------------------------------------------------------* + * OES extension functions + *------------------------------------------------------------------------*/ + +/* GL_OES_blend_equation_separate */ +#ifndef GL_OES_blend_equation_separate +#define GL_OES_blend_equation_separate 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_API void GL_APIENTRY glBlendEquationSeparateOES (GLenum modeRGB, GLenum modeAlpha); +#endif +typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATEOESPROC) (GLenum modeRGB, GLenum modeAlpha); +#endif + +/* GL_OES_blend_func_separate */ +#ifndef GL_OES_blend_func_separate +#define GL_OES_blend_func_separate 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_API void GL_APIENTRY glBlendFuncSeparateOES (GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +#endif +typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATEOESPROC) (GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +#endif + +/* GL_OES_blend_subtract */ +#ifndef GL_OES_blend_subtract +#define GL_OES_blend_subtract 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_API void GL_APIENTRY glBlendEquationOES (GLenum mode); +#endif +typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONOESPROC) (GLenum mode); +#endif + +/* GL_OES_byte_coordinates */ +#ifndef GL_OES_byte_coordinates +#define GL_OES_byte_coordinates 1 +#endif + +/* GL_OES_compressed_ETC1_RGB8_texture */ +#ifndef GL_OES_compressed_ETC1_RGB8_texture +#define GL_OES_compressed_ETC1_RGB8_texture 1 +#endif + +/* GL_OES_depth24 */ +#ifndef GL_OES_depth24 +#define GL_OES_depth24 1 +#endif + +/* GL_OES_depth32 */ +#ifndef GL_OES_depth32 +#define GL_OES_depth32 1 +#endif + +/* GL_OES_draw_texture */ +#ifndef GL_OES_draw_texture +#define GL_OES_draw_texture 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_API void GL_APIENTRY glDrawTexsOES (GLshort x, GLshort y, GLshort z, GLshort width, GLshort height); +GL_API void GL_APIENTRY glDrawTexiOES (GLint x, GLint y, GLint z, GLint width, GLint height); +GL_API void GL_APIENTRY glDrawTexxOES (GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height); +GL_API void GL_APIENTRY glDrawTexsvOES (const GLshort *coords); +GL_API void GL_APIENTRY glDrawTexivOES (const GLint *coords); +GL_API void GL_APIENTRY glDrawTexxvOES (const GLfixed *coords); +GL_API void GL_APIENTRY glDrawTexfOES (GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height); +GL_API void GL_APIENTRY glDrawTexfvOES (const GLfloat *coords); +#endif +typedef void (GL_APIENTRYP PFNGLDRAWTEXSOESPROC) (GLshort x, GLshort y, GLshort z, GLshort width, GLshort height); +typedef void (GL_APIENTRYP PFNGLDRAWTEXIOESPROC) (GLint x, GLint y, GLint z, GLint width, GLint height); +typedef void (GL_APIENTRYP PFNGLDRAWTEXXOESPROC) (GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height); +typedef void (GL_APIENTRYP PFNGLDRAWTEXSVOESPROC) (const GLshort *coords); +typedef void (GL_APIENTRYP PFNGLDRAWTEXIVOESPROC) (const GLint *coords); +typedef void (GL_APIENTRYP PFNGLDRAWTEXXVOESPROC) (const GLfixed *coords); +typedef void (GL_APIENTRYP PFNGLDRAWTEXFOESPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height); +typedef void (GL_APIENTRYP PFNGLDRAWTEXFVOESPROC) (const GLfloat *coords); +#endif + +/* GL_OES_EGL_image */ +#ifndef GL_OES_EGL_image +#define GL_OES_EGL_image 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_API void GL_APIENTRY glEGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image); +GL_API void GL_APIENTRY glEGLImageTargetRenderbufferStorageOES (GLenum target, GLeglImageOES image); +#endif +typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, GLeglImageOES image); +typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLeglImageOES image); +#endif + +/* GL_OES_element_index_uint */ +#ifndef GL_OES_element_index_uint +#define GL_OES_element_index_uint 1 +#endif + +/* GL_OES_extended_matrix_palette */ +#ifndef GL_OES_extended_matrix_palette +#define GL_OES_extended_matrix_palette 1 +#endif + +/* GL_OES_fbo_render_mipmap */ +#ifndef GL_OES_fbo_render_mipmap +#define GL_OES_fbo_render_mipmap 1 +#endif + +/* GL_OES_fixed_point */ +#ifndef GL_OES_fixed_point +#define GL_OES_fixed_point 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_API void GL_APIENTRY glAlphaFuncxOES (GLenum func, GLclampx ref); +GL_API void GL_APIENTRY glClearColorxOES (GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha); +GL_API void GL_APIENTRY glClearDepthxOES (GLclampx depth); +GL_API void GL_APIENTRY glClipPlanexOES (GLenum plane, const GLfixed *equation); +GL_API void GL_APIENTRY glColor4xOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +GL_API void GL_APIENTRY glDepthRangexOES (GLclampx zNear, GLclampx zFar); +GL_API void GL_APIENTRY glFogxOES (GLenum pname, GLfixed param); +GL_API void GL_APIENTRY glFogxvOES (GLenum pname, const GLfixed *params); +GL_API void GL_APIENTRY glFrustumxOES (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); +GL_API void GL_APIENTRY glGetClipPlanexOES (GLenum pname, GLfixed eqn[4]); +GL_API void GL_APIENTRY glGetFixedvOES (GLenum pname, GLfixed *params); +GL_API void GL_APIENTRY glGetLightxvOES (GLenum light, GLenum pname, GLfixed *params); +GL_API void GL_APIENTRY glGetMaterialxvOES (GLenum face, GLenum pname, GLfixed *params); +GL_API void GL_APIENTRY glGetTexEnvxvOES (GLenum env, GLenum pname, GLfixed *params); +GL_API void GL_APIENTRY glGetTexParameterxvOES (GLenum target, GLenum pname, GLfixed *params); +GL_API void GL_APIENTRY glLightModelxOES (GLenum pname, GLfixed param); +GL_API void GL_APIENTRY glLightModelxvOES (GLenum pname, const GLfixed *params); +GL_API void GL_APIENTRY glLightxOES (GLenum light, GLenum pname, GLfixed param); +GL_API void GL_APIENTRY glLightxvOES (GLenum light, GLenum pname, const GLfixed *params); +GL_API void GL_APIENTRY glLineWidthxOES (GLfixed width); +GL_API void GL_APIENTRY glLoadMatrixxOES (const GLfixed *m); +GL_API void GL_APIENTRY glMaterialxOES (GLenum face, GLenum pname, GLfixed param); +GL_API void GL_APIENTRY glMaterialxvOES (GLenum face, GLenum pname, const GLfixed *params); +GL_API void GL_APIENTRY glMultMatrixxOES (const GLfixed *m); +GL_API void GL_APIENTRY glMultiTexCoord4xOES (GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q); +GL_API void GL_APIENTRY glNormal3xOES (GLfixed nx, GLfixed ny, GLfixed nz); +GL_API void GL_APIENTRY glOrthoxOES (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); +GL_API void GL_APIENTRY glPointParameterxOES (GLenum pname, GLfixed param); +GL_API void GL_APIENTRY glPointParameterxvOES (GLenum pname, const GLfixed *params); +GL_API void GL_APIENTRY glPointSizexOES (GLfixed size); +GL_API void GL_APIENTRY glPolygonOffsetxOES (GLfixed factor, GLfixed units); +GL_API void GL_APIENTRY glRotatexOES (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); +GL_API void GL_APIENTRY glSampleCoveragexOES (GLclampx value, GLboolean invert); +GL_API void GL_APIENTRY glScalexOES (GLfixed x, GLfixed y, GLfixed z); +GL_API void GL_APIENTRY glTexEnvxOES (GLenum target, GLenum pname, GLfixed param); +GL_API void GL_APIENTRY glTexEnvxvOES (GLenum target, GLenum pname, const GLfixed *params); +GL_API void GL_APIENTRY glTexParameterxOES (GLenum target, GLenum pname, GLfixed param); +GL_API void GL_APIENTRY glTexParameterxvOES (GLenum target, GLenum pname, const GLfixed *params); +GL_API void GL_APIENTRY glTranslatexOES (GLfixed x, GLfixed y, GLfixed z); +#endif +typedef void (GL_APIENTRYP PFNGLALPHAFUNCXOESPROC) (GLenum func, GLclampx ref); +typedef void (GL_APIENTRYP PFNGLCLEARCOLORXOESPROC) (GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha); +typedef void (GL_APIENTRYP PFNGLCLEARDEPTHXOESPROC) (GLclampx depth); +typedef void (GL_APIENTRYP PFNGLCLIPPLANEXOESPROC) (GLenum plane, const GLfixed *equation); +typedef void (GL_APIENTRYP PFNGLCOLOR4XOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (GL_APIENTRYP PFNGLDEPTHRANGEXOESPROC) (GLclampx zNear, GLclampx zFar); +typedef void (GL_APIENTRYP PFNGLFOGXOESPROC) (GLenum pname, GLfixed param); +typedef void (GL_APIENTRYP PFNGLFOGXVOESPROC) (GLenum pname, const GLfixed *params); +typedef void (GL_APIENTRYP PFNGLFRUSTUMXOESPROC) (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); +typedef void (GL_APIENTRYP PFNGLGETCLIPPLANEXOESPROC) (GLenum pname, GLfixed eqn[4]); +typedef void (GL_APIENTRYP PFNGLGETFIXEDVOESPROC) (GLenum pname, GLfixed *params); +typedef void (GL_APIENTRYP PFNGLGETLIGHTXVOESPROC) (GLenum light, GLenum pname, GLfixed *params); +typedef void (GL_APIENTRYP PFNGLGETMATERIALXVOESPROC) (GLenum face, GLenum pname, GLfixed *params); +typedef void (GL_APIENTRYP PFNGLGETTEXENVXVOESPROC) (GLenum env, GLenum pname, GLfixed *params); +typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); +typedef void (GL_APIENTRYP PFNGLLIGHTMODELXOESPROC) (GLenum pname, GLfixed param); +typedef void (GL_APIENTRYP PFNGLLIGHTMODELXVOESPROC) (GLenum pname, const GLfixed *params); +typedef void (GL_APIENTRYP PFNGLLIGHTXOESPROC) (GLenum light, GLenum pname, GLfixed param); +typedef void (GL_APIENTRYP PFNGLLIGHTXVOESPROC) (GLenum light, GLenum pname, const GLfixed *params); +typedef void (GL_APIENTRYP PFNGLLINEWIDTHXOESPROC) (GLfixed width); +typedef void (GL_APIENTRYP PFNGLLOADMATRIXXOESPROC) (const GLfixed *m); +typedef void (GL_APIENTRYP PFNGLMATERIALXOESPROC) (GLenum face, GLenum pname, GLfixed param); +typedef void (GL_APIENTRYP PFNGLMATERIALXVOESPROC) (GLenum face, GLenum pname, const GLfixed *params); +typedef void (GL_APIENTRYP PFNGLMULTMATRIXXOESPROC) (const GLfixed *m); +typedef void (GL_APIENTRYP PFNGLMULTITEXCOORD4XOESPROC) (GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q); +typedef void (GL_APIENTRYP PFNGLNORMAL3XOESPROC) (GLfixed nx, GLfixed ny, GLfixed nz); +typedef void (GL_APIENTRYP PFNGLORTHOXOESPROC) (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); +typedef void (GL_APIENTRYP PFNGLPOINTPARAMETERXOESPROC) (GLenum pname, GLfixed param); +typedef void (GL_APIENTRYP PFNGLPOINTPARAMETERXVOESPROC) (GLenum pname, const GLfixed *params); +typedef void (GL_APIENTRYP PFNGLPOINTSIZEXOESPROC) (GLfixed size); +typedef void (GL_APIENTRYP PFNGLPOLYGONOFFSETXOESPROC) (GLfixed factor, GLfixed units); +typedef void (GL_APIENTRYP PFNGLROTATEXOESPROC) (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); +typedef void (GL_APIENTRYP PFNGLSAMPLECOVERAGEXOESPROC) (GLclampx value, GLboolean invert); +typedef void (GL_APIENTRYP PFNGLSCALEXOESPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (GL_APIENTRYP PFNGLTEXENVXOESPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (GL_APIENTRYP PFNGLTEXENVXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); +typedef void (GL_APIENTRYP PFNGLTEXPARAMETERXOESPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (GL_APIENTRYP PFNGLTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); +typedef void (GL_APIENTRYP PFNGLTRANSLATEXOESPROC) (GLfixed x, GLfixed y, GLfixed z); +#endif + +/* GL_OES_framebuffer_object */ +#ifndef GL_OES_framebuffer_object +#define GL_OES_framebuffer_object 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_API GLboolean GL_APIENTRY glIsRenderbufferOES (GLuint renderbuffer); +GL_API void GL_APIENTRY glBindRenderbufferOES (GLenum target, GLuint renderbuffer); +GL_API void GL_APIENTRY glDeleteRenderbuffersOES (GLsizei n, const GLuint* renderbuffers); +GL_API void GL_APIENTRY glGenRenderbuffersOES (GLsizei n, GLuint* renderbuffers); +GL_API void GL_APIENTRY glRenderbufferStorageOES (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +GL_API void GL_APIENTRY glGetRenderbufferParameterivOES (GLenum target, GLenum pname, GLint* params); +GL_API GLboolean GL_APIENTRY glIsFramebufferOES (GLuint framebuffer); +GL_API void GL_APIENTRY glBindFramebufferOES (GLenum target, GLuint framebuffer); +GL_API void GL_APIENTRY glDeleteFramebuffersOES (GLsizei n, const GLuint* framebuffers); +GL_API void GL_APIENTRY glGenFramebuffersOES (GLsizei n, GLuint* framebuffers); +GL_API GLenum GL_APIENTRY glCheckFramebufferStatusOES (GLenum target); +GL_API void GL_APIENTRY glFramebufferRenderbufferOES (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GL_API void GL_APIENTRY glFramebufferTexture2DOES (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GL_API void GL_APIENTRY glGetFramebufferAttachmentParameterivOES (GLenum target, GLenum attachment, GLenum pname, GLint* params); +GL_API void GL_APIENTRY glGenerateMipmapOES (GLenum target); +#endif +typedef GLboolean (GL_APIENTRYP PFNGLISRENDERBUFFEROESPROC) (GLuint renderbuffer); +typedef void (GL_APIENTRYP PFNGLBINDRENDERBUFFEROESPROC) (GLenum target, GLuint renderbuffer); +typedef void (GL_APIENTRYP PFNGLDELETERENDERBUFFERSOESPROC) (GLsizei n, const GLuint* renderbuffers); +typedef void (GL_APIENTRYP PFNGLGENRENDERBUFFERSOESPROC) (GLsizei n, GLuint* renderbuffers); +typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVOESPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GL_APIENTRYP PFNGLISFRAMEBUFFEROESPROC) (GLuint framebuffer); +typedef void (GL_APIENTRYP PFNGLBINDFRAMEBUFFEROESPROC) (GLenum target, GLuint framebuffer); +typedef void (GL_APIENTRYP PFNGLDELETEFRAMEBUFFERSOESPROC) (GLsizei n, const GLuint* framebuffers); +typedef void (GL_APIENTRYP PFNGLGENFRAMEBUFFERSOESPROC) (GLsizei n, GLuint* framebuffers); +typedef GLenum (GL_APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSOESPROC) (GLenum target); +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEROESPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DOESPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOESPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params); +typedef void (GL_APIENTRYP PFNGLGENERATEMIPMAPOESPROC) (GLenum target); +#endif + +/* GL_OES_mapbuffer */ +#ifndef GL_OES_mapbuffer +#define GL_OES_mapbuffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_API void* GL_APIENTRY glMapBufferOES (GLenum target, GLenum access); +GL_API GLboolean GL_APIENTRY glUnmapBufferOES (GLenum target); +GL_API void GL_APIENTRY glGetBufferPointervOES (GLenum target, GLenum pname, void** params); +#endif +typedef void* (GL_APIENTRYP PFNGLMAPBUFFEROESPROC) (GLenum target, GLenum access); +typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFEROESPROC) (GLenum target); +typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVOESPROC) (GLenum target, GLenum pname, void** params); +#endif + +/* GL_OES_matrix_get */ +#ifndef GL_OES_matrix_get +#define GL_OES_matrix_get 1 +#endif + +/* GL_OES_matrix_palette */ +#ifndef GL_OES_matrix_palette +#define GL_OES_matrix_palette 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_API void GL_APIENTRY glCurrentPaletteMatrixOES (GLuint matrixpaletteindex); +GL_API void GL_APIENTRY glLoadPaletteFromModelViewMatrixOES (void); +GL_API void GL_APIENTRY glMatrixIndexPointerOES (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +GL_API void GL_APIENTRY glWeightPointerOES (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +#endif +typedef void (GL_APIENTRYP PFNGLCURRENTPALETTEMATRIXOESPROC) (GLuint matrixpaletteindex); +typedef void (GL_APIENTRYP PFNGLLOADPALETTEFROMMODELVIEWMATRIXOESPROC) (void); +typedef void (GL_APIENTRYP PFNGLMATRIXINDEXPOINTEROESPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (GL_APIENTRYP PFNGLWEIGHTPOINTEROESPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +#endif + +/* GL_OES_packed_depth_stencil */ +#ifndef GL_OES_packed_depth_stencil +#define GL_OES_packed_depth_stencil 1 +#endif + +/* GL_OES_query_matrix */ +#ifndef GL_OES_query_matrix +#define GL_OES_query_matrix 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_API GLbitfield GL_APIENTRY glQueryMatrixxOES (GLfixed mantissa[16], GLint exponent[16]); +#endif +typedef GLbitfield (GL_APIENTRYP PFNGLQUERYMATRIXXOESPROC) (GLfixed mantissa[16], GLint exponent[16]); +#endif + +/* GL_OES_rgb8_rgba8 */ +#ifndef GL_OES_rgb8_rgba8 +#define GL_OES_rgb8_rgba8 1 +#endif + +/* GL_OES_single_precision */ +#ifndef GL_OES_single_precision +#define GL_OES_single_precision 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_API void GL_APIENTRY glDepthRangefOES (GLclampf zNear, GLclampf zFar); +GL_API void GL_APIENTRY glFrustumfOES (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); +GL_API void GL_APIENTRY glOrthofOES (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); +GL_API void GL_APIENTRY glClipPlanefOES (GLenum plane, const GLfloat *equation); +GL_API void GL_APIENTRY glGetClipPlanefOES (GLenum pname, GLfloat eqn[4]); +GL_API void GL_APIENTRY glClearDepthfOES (GLclampf depth); +#endif +typedef void (GL_APIENTRYP PFNGLDEPTHRANGEFOESPROC) (GLclampf zNear, GLclampf zFar); +typedef void (GL_APIENTRYP PFNGLFRUSTUMFOESPROC) (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); +typedef void (GL_APIENTRYP PFNGLORTHOFOESPROC) (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); +typedef void (GL_APIENTRYP PFNGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat *equation); +typedef void (GL_APIENTRYP PFNGLGETCLIPPLANEFOESPROC) (GLenum pname, GLfloat eqn[4]); +typedef void (GL_APIENTRYP PFNGLCLEARDEPTHFOESPROC) (GLclampf depth); +#endif + +/* GL_OES_stencil1 */ +#ifndef GL_OES_stencil1 +#define GL_OES_stencil1 1 +#endif + +/* GL_OES_stencil4 */ +#ifndef GL_OES_stencil4 +#define GL_OES_stencil4 1 +#endif + +/* GL_OES_stencil8 */ +#ifndef GL_OES_stencil8 +#define GL_OES_stencil8 1 +#endif + +/* GL_OES_stencil_wrap */ +#ifndef GL_OES_stencil_wrap +#define GL_OES_stencil_wrap 1 +#endif + +/* GL_OES_texture_cube_map */ +#ifndef GL_OES_texture_cube_map +#define GL_OES_texture_cube_map 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_API void GL_APIENTRY glTexGenfOES (GLenum coord, GLenum pname, GLfloat param); +GL_API void GL_APIENTRY glTexGenfvOES (GLenum coord, GLenum pname, const GLfloat *params); +GL_API void GL_APIENTRY glTexGeniOES (GLenum coord, GLenum pname, GLint param); +GL_API void GL_APIENTRY glTexGenivOES (GLenum coord, GLenum pname, const GLint *params); +GL_API void GL_APIENTRY glTexGenxOES (GLenum coord, GLenum pname, GLfixed param); +GL_API void GL_APIENTRY glTexGenxvOES (GLenum coord, GLenum pname, const GLfixed *params); +GL_API void GL_APIENTRY glGetTexGenfvOES (GLenum coord, GLenum pname, GLfloat *params); +GL_API void GL_APIENTRY glGetTexGenivOES (GLenum coord, GLenum pname, GLint *params); +GL_API void GL_APIENTRY glGetTexGenxvOES (GLenum coord, GLenum pname, GLfixed *params); +#endif +typedef void (GL_APIENTRYP PFNGLTEXGENFOESPROC) (GLenum coord, GLenum pname, GLfloat param); +typedef void (GL_APIENTRYP PFNGLTEXGENFVOESPROC) (GLenum coord, GLenum pname, const GLfloat *params); +typedef void (GL_APIENTRYP PFNGLTEXGENIOESPROC) (GLenum coord, GLenum pname, GLint param); +typedef void (GL_APIENTRYP PFNGLTEXGENIVOESPROC) (GLenum coord, GLenum pname, const GLint *params); +typedef void (GL_APIENTRYP PFNGLTEXGENXOESPROC) (GLenum coord, GLenum pname, GLfixed param); +typedef void (GL_APIENTRYP PFNGLTEXGENXVOESPROC) (GLenum coord, GLenum pname, const GLfixed *params); +typedef void (GL_APIENTRYP PFNGLGETTEXGENFVOESPROC) (GLenum coord, GLenum pname, GLfloat *params); +typedef void (GL_APIENTRYP PFNGLGETTEXGENIVOESPROC) (GLenum coord, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETTEXGENXVOESPROC) (GLenum coord, GLenum pname, GLfixed *params); +#endif + +/* GL_OES_texture_env_crossbar */ +#ifndef GL_OES_texture_env_crossbar +#define GL_OES_texture_env_crossbar 1 +#endif + +/* GL_OES_texture_mirrored_repeat */ +#ifndef GL_OES_texture_mirrored_repeat +#define GL_OES_texture_mirrored_repeat 1 +#endif + +/*------------------------------------------------------------------------* + * AMD extension functions + *------------------------------------------------------------------------*/ + +/* GL_AMD_compressed_3DC_texture */ +#ifndef GL_AMD_compressed_3DC_texture +#define GL_AMD_compressed_3DC_texture 1 +#endif + +/* GL_AMD_compressed_ATC_texture */ +#ifndef GL_AMD_compressed_ATC_texture +#define GL_AMD_compressed_ATC_texture 1 +#endif + +/*------------------------------------------------------------------------* + * APPLE extension functions + *------------------------------------------------------------------------*/ + +/* GL_APPLE_texture_2D_limited_npot */ +#ifndef GL_APPLE_texture_2D_limited_npot +#define GL_APPLE_texture_2D_limited_npot 1 +#endif + +/*------------------------------------------------------------------------* + * EXT extension functions + *------------------------------------------------------------------------*/ + +/* GL_EXT_blend_minmax */ +#ifndef GL_EXT_blend_minmax +#define GL_EXT_blend_minmax 1 +#endif + +/* GL_EXT_discard_framebuffer */ +#ifndef GL_EXT_discard_framebuffer +#define GL_EXT_discard_framebuffer 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_API void GL_APIENTRY glDiscardFramebufferEXT (GLenum target, GLsizei numAttachments, const GLenum *attachments); +#endif +typedef void (GL_APIENTRYP PFNGLDISCARDFRAMEBUFFEREXTPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); +#endif + +/* GL_EXT_multi_draw_arrays */ +#ifndef GL_EXT_multi_draw_arrays +#define GL_EXT_multi_draw_arrays 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_API void GL_APIENTRY glMultiDrawArraysEXT (GLenum, GLint *, GLsizei *, GLsizei); +GL_API void GL_APIENTRY glMultiDrawElementsEXT (GLenum, const GLsizei *, GLenum, const GLvoid* *, GLsizei); +#endif /* GL_GLEXT_PROTOTYPES */ +typedef void (GL_APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); +typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount); +#endif + +/* GL_EXT_read_format_bgra */ +#ifndef GL_EXT_read_format_bgra +#define GL_EXT_read_format_bgra 1 +#endif + +/* GL_EXT_texture_filter_anisotropic */ +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_EXT_texture_filter_anisotropic 1 +#endif + +/* GL_EXT_texture_format_BGRA8888 */ +#ifndef GL_EXT_texture_format_BGRA8888 +#define GL_EXT_texture_format_BGRA8888 1 +#endif + +/* GL_EXT_texture_lod_bias */ +#ifndef GL_EXT_texture_lod_bias +#define GL_EXT_texture_lod_bias 1 +#endif + +/*------------------------------------------------------------------------* + * IMG extension functions + *------------------------------------------------------------------------*/ + +/* GL_IMG_read_format */ +#ifndef GL_IMG_read_format +#define GL_IMG_read_format 1 +#endif + +/* GL_IMG_texture_compression_pvrtc */ +#ifndef GL_IMG_texture_compression_pvrtc +#define GL_IMG_texture_compression_pvrtc 1 +#endif + +/* GL_IMG_texture_env_enhanced_fixed_function */ +#ifndef GL_IMG_texture_env_enhanced_fixed_function +#define GL_IMG_texture_env_enhanced_fixed_function 1 +#endif + +/* GL_IMG_user_clip_plane */ +#ifndef GL_IMG_user_clip_plane +#define GL_IMG_user_clip_plane 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_API void GL_APIENTRY glClipPlanefIMG (GLenum, const GLfloat *); +GL_API void GL_APIENTRY glClipPlanexIMG (GLenum, const GLfixed *); +#endif +typedef void (GL_APIENTRYP PFNGLCLIPPLANEFIMGPROC) (GLenum p, const GLfloat *eqn); +typedef void (GL_APIENTRYP PFNGLCLIPPLANEXIMGPROC) (GLenum p, const GLfixed *eqn); +#endif + +/*------------------------------------------------------------------------* + * NV extension functions + *------------------------------------------------------------------------*/ + +/* NV_fence */ +#ifndef GL_NV_fence +#define GL_NV_fence 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_API void GL_APIENTRY glDeleteFencesNV (GLsizei, const GLuint *); +GL_API void GL_APIENTRY glGenFencesNV (GLsizei, GLuint *); +GL_API GLboolean GL_APIENTRY glIsFenceNV (GLuint); +GL_API GLboolean GL_APIENTRY glTestFenceNV (GLuint); +GL_API void GL_APIENTRY glGetFenceivNV (GLuint, GLenum, GLint *); +GL_API void GL_APIENTRY glFinishFenceNV (GLuint); +GL_API void GL_APIENTRY glSetFenceNV (GLuint, GLenum); +#endif +typedef void (GL_APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); +typedef void (GL_APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); +typedef GLboolean (GL_APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); +typedef GLboolean (GL_APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); +typedef void (GL_APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); +typedef void (GL_APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); +#endif + +/*------------------------------------------------------------------------* + * QCOM extension functions + *------------------------------------------------------------------------*/ + +/* GL_QCOM_driver_control */ +#ifndef GL_QCOM_driver_control +#define GL_QCOM_driver_control 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_API void GL_APIENTRY glGetDriverControlsQCOM (GLint *num, GLsizei size, GLuint *driverControls); +GL_API void GL_APIENTRY glGetDriverControlStringQCOM (GLuint driverControl, GLsizei bufSize, GLsizei *length, char *driverControlString); +GL_API void GL_APIENTRY glEnableDriverControlQCOM (GLuint driverControl); +GL_API void GL_APIENTRY glDisableDriverControlQCOM (GLuint driverControl); +#endif +typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSQCOMPROC) (GLint *num, GLsizei size, GLuint *driverControls); +typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSTRINGQCOMPROC) (GLuint driverControl, GLsizei bufSize, GLsizei *length, char *driverControlString); +typedef void (GL_APIENTRYP PFNGLENABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); +typedef void (GL_APIENTRYP PFNGLDISABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); +#endif + +/* GL_QCOM_extended_get */ +#ifndef GL_QCOM_extended_get +#define GL_QCOM_extended_get 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_API void GL_APIENTRY glExtGetTexturesQCOM (GLuint *textures, GLint maxTextures, GLint *numTextures); +GL_API void GL_APIENTRY glExtGetBuffersQCOM (GLuint *buffers, GLint maxBuffers, GLint *numBuffers); +GL_API void GL_APIENTRY glExtGetRenderbuffersQCOM (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers); +GL_API void GL_APIENTRY glExtGetFramebuffersQCOM (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers); +GL_API void GL_APIENTRY glExtGetTexLevelParameterivQCOM (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params); +GL_API void GL_APIENTRY glExtTexObjectStateOverrideiQCOM (GLenum target, GLenum pname, GLint param); +GL_API void GL_APIENTRY glExtGetTexSubImageQCOM (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void *texels); +GL_API void GL_APIENTRY glExtGetBufferPointervQCOM (GLenum target, void **params); +#endif +typedef void (GL_APIENTRYP PFNGLEXTGETTEXTURESQCOMPROC) (GLuint *textures, GLint maxTextures, GLint *numTextures); +typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERSQCOMPROC) (GLuint *buffers, GLint maxBuffers, GLint *numBuffers); +typedef void (GL_APIENTRYP PFNGLEXTGETRENDERBUFFERSQCOMPROC) (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers); +typedef void (GL_APIENTRYP PFNGLEXTGETFRAMEBUFFERSQCOMPROC) (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers); +typedef void (GL_APIENTRYP PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC) (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GL_APIENTRYP PFNGLEXTGETTEXSUBIMAGEQCOMPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void *texels); +typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERPOINTERVQCOMPROC) (GLenum target, void **params); +#endif + +/* GL_QCOM_extended_get2 */ +#ifndef GL_QCOM_extended_get2 +#define GL_QCOM_extended_get2 1 +#ifdef GL_GLEXT_PROTOTYPES +GL_API void GL_APIENTRY glExtGetShadersQCOM (GLuint *shaders, GLint maxShaders, GLint *numShaders); +GL_API void GL_APIENTRY glExtGetProgramsQCOM (GLuint *programs, GLint maxPrograms, GLint *numPrograms); +GL_API GLboolean GL_APIENTRY glExtIsProgramBinaryQCOM (GLuint program); +GL_API void GL_APIENTRY glExtGetProgramBinarySourceQCOM (GLuint program, GLenum shadertype, char *source, GLint *length); +#endif +typedef void (GL_APIENTRYP PFNGLEXTGETSHADERSQCOMPROC) (GLuint *shaders, GLint maxShaders, GLint *numShaders); +typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMSQCOMPROC) (GLuint *programs, GLint maxPrograms, GLint *numPrograms); +typedef GLboolean (GL_APIENTRYP PFNGLEXTISPROGRAMBINARYQCOMPROC) (GLuint program); +typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC) (GLuint program, GLenum shadertype, char *source, GLint *length); +#endif + +/* GL_QCOM_perfmon_global_mode */ +#ifndef GL_QCOM_perfmon_global_mode +#define GL_QCOM_perfmon_global_mode 1 +#endif + +/* GL_QCOM_writeonly_rendering */ +#ifndef GL_QCOM_writeonly_rendering +#define GL_QCOM_writeonly_rendering 1 +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __glext_h_ */ + diff --git a/minecraftcpp-master/handheld/lib/include/GLES/glplatform.h b/minecraftcpp-master/handheld/lib/include/GLES/glplatform.h new file mode 100644 index 0000000..d1af077 --- /dev/null +++ b/minecraftcpp-master/handheld/lib/include/GLES/glplatform.h @@ -0,0 +1,27 @@ +#ifndef __glplatform_h_ +#define __glplatform_h_ + +/* + * This document is licensed under the SGI Free Software B License Version + * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ . + */ + +/* Platform-specific types and definitions for OpenGL ES 1.X gl.h + * Last modified on 2008/12/19 + * + * Adopters may modify khrplatform.h and this file to suit their platform. + * You are encouraged to submit all modifications to the Khronos group so that + * they can be included in future versions of this file. Please submit changes + * by sending them to the public Khronos Bugzilla (http://khronos.org/bugzilla) + * by filing a bug against product "OpenGL-ES" component "Registry". + */ + +#include + +#ifndef GL_API +#define GL_API KHRONOS_APICALL +#endif + +#define GL_APIENTRY KHRONOS_APIENTRY + +#endif /* __glplatform_h_ */ diff --git a/minecraftcpp-master/handheld/lib/include/KHR/khrplatform.h b/minecraftcpp-master/handheld/lib/include/KHR/khrplatform.h new file mode 100644 index 0000000..ee2ab4f --- /dev/null +++ b/minecraftcpp-master/handheld/lib/include/KHR/khrplatform.h @@ -0,0 +1,302 @@ +#ifndef __khrplatform_h_ +#define __khrplatform_h_ + +/* +** Copyright (c) 2008-2009 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be included +** in all copies or substantial portions of the Materials. +** +** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ + +/* Khronos platform-specific types and definitions. + * + * $Revision: 1.5 $ on $Date: 2010/06/03 16:51:55 $ + * + * Adopters may modify this file to suit their platform. Adopters are + * encouraged to submit platform specific modifications to the Khronos + * group so that they can be included in future versions of this file. + * Please submit changes by sending them to the public Khronos Bugzilla + * (http://khronos.org/bugzilla) by filing a bug against product + * "Khronos (general)" component "Registry". + * + * A predefined template which fills in some of the bug fields can be + * reached using http://tinyurl.com/khrplatform-h-bugreport, but you + * must create a Bugzilla login first. + * + * + * See the Implementer's Guidelines for information about where this file + * should be located on your system and for more details of its use: + * http://www.khronos.org/registry/implementers_guide.pdf + * + * This file should be included as + * #include + * by Khronos client API header files that use its types and defines. + * + * The types in khrplatform.h should only be used to define API-specific types. + * + * Types defined in khrplatform.h: + * khronos_int8_t signed 8 bit + * khronos_uint8_t unsigned 8 bit + * khronos_int16_t signed 16 bit + * khronos_uint16_t unsigned 16 bit + * khronos_int32_t signed 32 bit + * khronos_uint32_t unsigned 32 bit + * khronos_int64_t signed 64 bit + * khronos_uint64_t unsigned 64 bit + * khronos_intptr_t signed same number of bits as a pointer + * khronos_uintptr_t unsigned same number of bits as a pointer + * khronos_ssize_t signed size + * khronos_usize_t unsigned size + * khronos_float_t signed 32 bit floating point + * khronos_time_ns_t unsigned 64 bit time in nanoseconds + * khronos_utime_nanoseconds_t unsigned time interval or absolute time in + * nanoseconds + * khronos_stime_nanoseconds_t signed time interval in nanoseconds + * khronos_boolean_enum_t enumerated boolean type. This should + * only be used as a base type when a client API's boolean type is + * an enum. Client APIs which use an integer or other type for + * booleans cannot use this as the base type for their boolean. + * + * Tokens defined in khrplatform.h: + * + * KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values. + * + * KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0. + * KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0. + * + * Calling convention macros defined in this file: + * KHRONOS_APICALL + * KHRONOS_APIENTRY + * KHRONOS_APIATTRIBUTES + * + * These may be used in function prototypes as: + * + * KHRONOS_APICALL void KHRONOS_APIENTRY funcname( + * int arg1, + * int arg2) KHRONOS_APIATTRIBUTES; + */ + +/*------------------------------------------------------------------------- + * Definition of KHRONOS_APICALL + *------------------------------------------------------------------------- + * This precedes the return type of the function in the function prototype. + */ + +#if (defined(_WIN32) || defined(__VC32__)) && !defined(__SCITECH_SNAP__) && !defined(__WINSCW__) +# if defined (_DLL_EXPORTS) +# define KHRONOS_APICALL __declspec(dllexport) +# else +# define KHRONOS_APICALL __declspec(dllimport) +# endif +#elif defined (__SYMBIAN32__) +# if defined (__GCC32__) +# define KHRONOS_APICALL __declspec(dllexport) +# else +# define KHRONOS_APICALL IMPORT_C +# endif +#else +# define KHRONOS_APICALL +#endif + +/*------------------------------------------------------------------------- + * Definition of KHRONOS_APIENTRY + *------------------------------------------------------------------------- + * This follows the return type of the function and precedes the function + * name in the function prototype. + */ +#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__) && !defined(__WINSCW__) + /* Win32 but not WinCE */ +# define KHRONOS_APIENTRY __stdcall +#else +# define KHRONOS_APIENTRY +#endif + +/*------------------------------------------------------------------------- + * Definition of KHRONOS_APIATTRIBUTES + *------------------------------------------------------------------------- + * This follows the closing parenthesis of the function prototype arguments. + */ +#if defined (__ARMCC_2__) +#define KHRONOS_APIATTRIBUTES __softfp +#else +#define KHRONOS_APIATTRIBUTES +#endif + +/*------------------------------------------------------------------------- + * basic type definitions + *-----------------------------------------------------------------------*/ +#if defined(__SYMBIAN32__) + +#include + +typedef TInt32 khronos_int32_t; +typedef TUint32 khronos_uint32_t; +typedef TInt64 khronos_int64_t; +typedef TUint64 khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__) + + +/* + * Using + */ +#include +typedef int32_t khronos_int32_t; +typedef uint32_t khronos_uint32_t; +typedef int64_t khronos_int64_t; +typedef uint64_t khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif defined(__VMS ) || defined(__sgi) + +/* + * Using + */ +#include +typedef int32_t khronos_int32_t; +typedef uint32_t khronos_uint32_t; +typedef int64_t khronos_int64_t; +typedef uint64_t khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif defined(_WIN32) && !defined(__SCITECH_SNAP__) + +/* + * Win32 + */ +typedef __int32 khronos_int32_t; +typedef unsigned __int32 khronos_uint32_t; +typedef __int64 khronos_int64_t; +typedef unsigned __int64 khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif defined(__sun__) || defined(__digital__) + +/* + * Sun or Digital + */ +typedef int khronos_int32_t; +typedef unsigned int khronos_uint32_t; +#if defined(__arch64__) || defined(_LP64) +typedef long int khronos_int64_t; +typedef unsigned long int khronos_uint64_t; +#else +typedef long long int khronos_int64_t; +typedef unsigned long long int khronos_uint64_t; +#endif /* __arch64__ */ +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif defined(_UITRON_) + +/* + * uITRON + */ +typedef signed int khronos_int32_t; +typedef unsigned int khronos_uint32_t; +typedef long long khronos_int64_t; +typedef unsigned long long khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + + +#elif 0 + +/* + * Hypothetical platform with no float or int64 support + */ +typedef int khronos_int32_t; +typedef unsigned int khronos_uint32_t; +#define KHRONOS_SUPPORT_INT64 0 +#define KHRONOS_SUPPORT_FLOAT 0 + +#else + +/* + * Generic fallback + */ +#include +typedef int32_t khronos_int32_t; +typedef uint32_t khronos_uint32_t; +typedef int64_t khronos_int64_t; +typedef uint64_t khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#endif + + +/* + * Types that are (so far) the same on all platforms + */ +typedef signed char khronos_int8_t; +typedef unsigned char khronos_uint8_t; +typedef signed short int khronos_int16_t; +typedef unsigned short int khronos_uint16_t; +typedef signed long int khronos_intptr_t; +typedef unsigned long int khronos_uintptr_t; +typedef signed long int khronos_ssize_t; +typedef unsigned long int khronos_usize_t; + +#if KHRONOS_SUPPORT_FLOAT +/* + * Float type + */ +typedef float khronos_float_t; +#endif + +#if KHRONOS_SUPPORT_INT64 +/* Time types + * + * These types can be used to represent a time interval in nanoseconds or + * an absolute Unadjusted System Time. Unadjusted System Time is the number + * of nanoseconds since some arbitrary system event (e.g. since the last + * time the system booted). The Unadjusted System Time is an unsigned + * 64 bit value that wraps back to 0 every 584 years. Time intervals + * may be either signed or unsigned. + */ +typedef khronos_uint64_t khronos_utime_nanoseconds_t; +typedef khronos_int64_t khronos_stime_nanoseconds_t; +#endif + +/* + * Dummy value used to pad enum types to 32 bits. + */ +#ifndef KHRONOS_MAX_ENUM +#define KHRONOS_MAX_ENUM 0x7FFFFFFF +#endif + +/* + * Enumerated boolean type + * + * Values other than zero should be considered to be true. Therefore + * comparisons should not be made against KHRONOS_TRUE. + */ +typedef enum { + KHRONOS_FALSE = 0, + KHRONOS_TRUE = 1, + KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM +} khronos_boolean_enum_t; + +#endif /* __khrplatform_h_ */ diff --git a/minecraftcpp-master/handheld/lib/include/SLES/OpenSLES.h b/minecraftcpp-master/handheld/lib/include/SLES/OpenSLES.h new file mode 100644 index 0000000..7dbdbd3 --- /dev/null +++ b/minecraftcpp-master/handheld/lib/include/SLES/OpenSLES.h @@ -0,0 +1,2774 @@ +/* + * Copyright (c) 2007-2009 The Khronos Group Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and /or associated documentation files (the "Materials "), to + * deal in the Materials without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Materials, and to permit persons to whom the Materials are + * furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Materials. + * + * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS IN THE + * MATERIALS. + * + * OpenSLES.h - OpenSL ES version 1.0.1 + * + */ + +/****************************************************************************/ +/* NOTE: This file is a standard OpenSL ES header file and should not be */ +/* modified in any way. */ +/****************************************************************************/ + +#ifndef OPENSL_ES_H_ +#define OPENSL_ES_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "OpenSLES_Platform.h" + + +/*****************************************************************************/ +/* Common types, structures, and defines */ +/*****************************************************************************/ + +#ifndef _KHRONOS_KEYS_ +#define _KHRONOS_KEYS_ + +#define KHRONOS_TITLE "KhronosTitle" +#define KHRONOS_ALBUM "KhronosAlbum" +#define KHRONOS_TRACK_NUMBER "KhronosTrackNumber" +#define KHRONOS_ARTIST "KhronosArtist" +#define KHRONOS_GENRE "KhronosGenre" +#define KHRONOS_YEAR "KhronosYear" +#define KHRONOS_COMMENT "KhronosComment" +#define KHRONOS_ARTIST_URL "KhronosArtistURL" +#define KHRONOS_CONTENT_URL "KhronosContentURL" +#define KHRONOS_RATING "KhronosRating" +#define KHRONOS_ALBUM_ART "KhronosAlbumArt" +#define KHRONOS_COPYRIGHT "KhronosCopyright" + +#endif + + +/* remap common types to SL types for clarity */ +typedef sl_int8_t SLint8; /* 8 bit signed integer */ +typedef sl_uint8_t SLuint8; /* 8 bit unsigned integer */ +typedef sl_int16_t SLint16; /* 16 bit signed integer */ +typedef sl_uint16_t SLuint16; /* 16 bit unsigned integer */ +typedef sl_int32_t SLint32; /* 32 bit signed integer */ +typedef sl_uint32_t SLuint32; /* 32 bit unsigned integer */ + +typedef SLuint32 SLboolean; +#define SL_BOOLEAN_FALSE ((SLboolean) 0x00000000) +#define SL_BOOLEAN_TRUE ((SLboolean) 0x00000001) + +typedef SLuint8 SLchar; /* UTF-8 is to be used */ +typedef SLint16 SLmillibel; +typedef SLuint32 SLmillisecond; +typedef SLuint32 SLmilliHertz; +typedef SLint32 SLmillimeter; +typedef SLint32 SLmillidegree; +typedef SLint16 SLpermille; +typedef SLuint32 SLmicrosecond; +typedef SLuint32 SLresult; + +#define SL_MILLIBEL_MAX ((SLmillibel) 0x7FFF) +#define SL_MILLIBEL_MIN ((SLmillibel) (-SL_MILLIBEL_MAX-1)) + +#define SL_MILLIHERTZ_MAX ((SLmilliHertz) 0xFFFFFFFF) +#define SL_MILLIMETER_MAX ((SLmillimeter) 0x7FFFFFFF) + +/** Interface ID defined as a UUID */ +typedef const struct SLInterfaceID_ { + SLuint32 time_low; + SLuint16 time_mid; + SLuint16 time_hi_and_version; + SLuint16 clock_seq; + SLuint8 node[6]; +} * SLInterfaceID; + +/* Forward declaration for the object interface */ +struct SLObjectItf_; + +typedef const struct SLObjectItf_ * const * SLObjectItf; + +/* Objects ID's */ + +#define SL_OBJECTID_ENGINE ((SLuint32) 0x00001001) +#define SL_OBJECTID_LEDDEVICE ((SLuint32) 0x00001002) +#define SL_OBJECTID_VIBRADEVICE ((SLuint32) 0x00001003) +#define SL_OBJECTID_AUDIOPLAYER ((SLuint32) 0x00001004) +#define SL_OBJECTID_AUDIORECORDER ((SLuint32) 0x00001005) +#define SL_OBJECTID_MIDIPLAYER ((SLuint32) 0x00001006) +#define SL_OBJECTID_LISTENER ((SLuint32) 0x00001007) +#define SL_OBJECTID_3DGROUP ((SLuint32) 0x00001008) +#define SL_OBJECTID_OUTPUTMIX ((SLuint32) 0x00001009) +#define SL_OBJECTID_METADATAEXTRACTOR ((SLuint32) 0x0000100A) + + +/* SL Profiles */ + +#define SL_PROFILES_PHONE ((SLuint16) 0x0001) +#define SL_PROFILES_MUSIC ((SLuint16) 0x0002) +#define SL_PROFILES_GAME ((SLuint16) 0x0004) + +/* Types of voices supported by the system */ + +#define SL_VOICETYPE_2D_AUDIO ((SLuint16) 0x0001) +#define SL_VOICETYPE_MIDI ((SLuint16) 0x0002) +#define SL_VOICETYPE_3D_AUDIO ((SLuint16) 0x0004) +#define SL_VOICETYPE_3D_MIDIOUTPUT ((SLuint16) 0x0008) + +/* Convenient macros representing various different priority levels, for use with the SetPriority method */ + +#define SL_PRIORITY_LOWEST ((SLint32) (-0x7FFFFFFF-1)) +#define SL_PRIORITY_VERYLOW ((SLint32) -0x60000000) +#define SL_PRIORITY_LOW ((SLint32) -0x40000000) +#define SL_PRIORITY_BELOWNORMAL ((SLint32) -0x20000000) +#define SL_PRIORITY_NORMAL ((SLint32) 0x00000000) +#define SL_PRIORITY_ABOVENORMAL ((SLint32) 0x20000000) +#define SL_PRIORITY_HIGH ((SLint32) 0x40000000) +#define SL_PRIORITY_VERYHIGH ((SLint32) 0x60000000) +#define SL_PRIORITY_HIGHEST ((SLint32) 0x7FFFFFFF) + + +/** These macros list the various sample formats that are possible on audio input and output devices. */ + +#define SL_PCMSAMPLEFORMAT_FIXED_8 ((SLuint16) 0x0008) +#define SL_PCMSAMPLEFORMAT_FIXED_16 ((SLuint16) 0x0010) +#define SL_PCMSAMPLEFORMAT_FIXED_20 ((SLuint16) 0x0014) +#define SL_PCMSAMPLEFORMAT_FIXED_24 ((SLuint16) 0x0018) +#define SL_PCMSAMPLEFORMAT_FIXED_28 ((SLuint16) 0x001C) +#define SL_PCMSAMPLEFORMAT_FIXED_32 ((SLuint16) 0x0020) + + +/** These macros specify the commonly used sampling rates (in milliHertz) supported by most audio I/O devices. */ + +#define SL_SAMPLINGRATE_8 ((SLuint32) 8000000) +#define SL_SAMPLINGRATE_11_025 ((SLuint32) 11025000) +#define SL_SAMPLINGRATE_12 ((SLuint32) 12000000) +#define SL_SAMPLINGRATE_16 ((SLuint32) 16000000) +#define SL_SAMPLINGRATE_22_05 ((SLuint32) 22050000) +#define SL_SAMPLINGRATE_24 ((SLuint32) 24000000) +#define SL_SAMPLINGRATE_32 ((SLuint32) 32000000) +#define SL_SAMPLINGRATE_44_1 ((SLuint32) 44100000) +#define SL_SAMPLINGRATE_48 ((SLuint32) 48000000) +#define SL_SAMPLINGRATE_64 ((SLuint32) 64000000) +#define SL_SAMPLINGRATE_88_2 ((SLuint32) 88200000) +#define SL_SAMPLINGRATE_96 ((SLuint32) 96000000) +#define SL_SAMPLINGRATE_192 ((SLuint32) 192000000) + +#define SL_SPEAKER_FRONT_LEFT ((SLuint32) 0x00000001) +#define SL_SPEAKER_FRONT_RIGHT ((SLuint32) 0x00000002) +#define SL_SPEAKER_FRONT_CENTER ((SLuint32) 0x00000004) +#define SL_SPEAKER_LOW_FREQUENCY ((SLuint32) 0x00000008) +#define SL_SPEAKER_BACK_LEFT ((SLuint32) 0x00000010) +#define SL_SPEAKER_BACK_RIGHT ((SLuint32) 0x00000020) +#define SL_SPEAKER_FRONT_LEFT_OF_CENTER ((SLuint32) 0x00000040) +#define SL_SPEAKER_FRONT_RIGHT_OF_CENTER ((SLuint32) 0x00000080) +#define SL_SPEAKER_BACK_CENTER ((SLuint32) 0x00000100) +#define SL_SPEAKER_SIDE_LEFT ((SLuint32) 0x00000200) +#define SL_SPEAKER_SIDE_RIGHT ((SLuint32) 0x00000400) +#define SL_SPEAKER_TOP_CENTER ((SLuint32) 0x00000800) +#define SL_SPEAKER_TOP_FRONT_LEFT ((SLuint32) 0x00001000) +#define SL_SPEAKER_TOP_FRONT_CENTER ((SLuint32) 0x00002000) +#define SL_SPEAKER_TOP_FRONT_RIGHT ((SLuint32) 0x00004000) +#define SL_SPEAKER_TOP_BACK_LEFT ((SLuint32) 0x00008000) +#define SL_SPEAKER_TOP_BACK_CENTER ((SLuint32) 0x00010000) +#define SL_SPEAKER_TOP_BACK_RIGHT ((SLuint32) 0x00020000) + + +/*****************************************************************************/ +/* Errors */ +/* */ +/*****************************************************************************/ + +#define SL_RESULT_SUCCESS ((SLuint32) 0x00000000) +#define SL_RESULT_PRECONDITIONS_VIOLATED ((SLuint32) 0x00000001) +#define SL_RESULT_PARAMETER_INVALID ((SLuint32) 0x00000002) +#define SL_RESULT_MEMORY_FAILURE ((SLuint32) 0x00000003) +#define SL_RESULT_RESOURCE_ERROR ((SLuint32) 0x00000004) +#define SL_RESULT_RESOURCE_LOST ((SLuint32) 0x00000005) +#define SL_RESULT_IO_ERROR ((SLuint32) 0x00000006) +#define SL_RESULT_BUFFER_INSUFFICIENT ((SLuint32) 0x00000007) +#define SL_RESULT_CONTENT_CORRUPTED ((SLuint32) 0x00000008) +#define SL_RESULT_CONTENT_UNSUPPORTED ((SLuint32) 0x00000009) +#define SL_RESULT_CONTENT_NOT_FOUND ((SLuint32) 0x0000000A) +#define SL_RESULT_PERMISSION_DENIED ((SLuint32) 0x0000000B) +#define SL_RESULT_FEATURE_UNSUPPORTED ((SLuint32) 0x0000000C) +#define SL_RESULT_INTERNAL_ERROR ((SLuint32) 0x0000000D) +#define SL_RESULT_UNKNOWN_ERROR ((SLuint32) 0x0000000E) +#define SL_RESULT_OPERATION_ABORTED ((SLuint32) 0x0000000F) +#define SL_RESULT_CONTROL_LOST ((SLuint32) 0x00000010) + + +/* Object state definitions */ + +#define SL_OBJECT_STATE_UNREALIZED ((SLuint32) 0x00000001) +#define SL_OBJECT_STATE_REALIZED ((SLuint32) 0x00000002) +#define SL_OBJECT_STATE_SUSPENDED ((SLuint32) 0x00000003) + +/* Object event definitions */ + +#define SL_OBJECT_EVENT_RUNTIME_ERROR ((SLuint32) 0x00000001) +#define SL_OBJECT_EVENT_ASYNC_TERMINATION ((SLuint32) 0x00000002) +#define SL_OBJECT_EVENT_RESOURCES_LOST ((SLuint32) 0x00000003) +#define SL_OBJECT_EVENT_RESOURCES_AVAILABLE ((SLuint32) 0x00000004) +#define SL_OBJECT_EVENT_ITF_CONTROL_TAKEN ((SLuint32) 0x00000005) +#define SL_OBJECT_EVENT_ITF_CONTROL_RETURNED ((SLuint32) 0x00000006) +#define SL_OBJECT_EVENT_ITF_PARAMETERS_CHANGED ((SLuint32) 0x00000007) + + +/*****************************************************************************/ +/* Interface definitions */ +/*****************************************************************************/ + +/** NULL Interface */ + +extern const SLInterfaceID SL_IID_NULL; + +/*---------------------------------------------------------------------------*/ +/* Data Source and Data Sink Structures */ +/*---------------------------------------------------------------------------*/ + +/** Data locator macros */ +#define SL_DATALOCATOR_URI ((SLuint32) 0x00000001) +#define SL_DATALOCATOR_ADDRESS ((SLuint32) 0x00000002) +#define SL_DATALOCATOR_IODEVICE ((SLuint32) 0x00000003) +#define SL_DATALOCATOR_OUTPUTMIX ((SLuint32) 0x00000004) +#define SL_DATALOCATOR_RESERVED5 ((SLuint32) 0x00000005) +#define SL_DATALOCATOR_BUFFERQUEUE ((SLuint32) 0x00000006) +#define SL_DATALOCATOR_MIDIBUFFERQUEUE ((SLuint32) 0x00000007) +#define SL_DATALOCATOR_RESERVED8 ((SLuint32) 0x00000008) + + + +/** URI-based data locator definition where locatorType must be SL_DATALOCATOR_URI*/ +typedef struct SLDataLocator_URI_ { + SLuint32 locatorType; + SLchar * URI; +} SLDataLocator_URI; + +/** Address-based data locator definition where locatorType must be SL_DATALOCATOR_ADDRESS*/ +typedef struct SLDataLocator_Address_ { + SLuint32 locatorType; + void *pAddress; + SLuint32 length; +} SLDataLocator_Address; + +/** IODevice-types */ +#define SL_IODEVICE_AUDIOINPUT ((SLuint32) 0x00000001) +#define SL_IODEVICE_LEDARRAY ((SLuint32) 0x00000002) +#define SL_IODEVICE_VIBRA ((SLuint32) 0x00000003) +#define SL_IODEVICE_RESERVED4 ((SLuint32) 0x00000004) +#define SL_IODEVICE_RESERVED5 ((SLuint32) 0x00000005) + +/** IODevice-based data locator definition where locatorType must be SL_DATALOCATOR_IODEVICE*/ +typedef struct SLDataLocator_IODevice_ { + SLuint32 locatorType; + SLuint32 deviceType; + SLuint32 deviceID; + SLObjectItf device; +} SLDataLocator_IODevice; + +/** OutputMix-based data locator definition where locatorType must be SL_DATALOCATOR_OUTPUTMIX*/ +typedef struct SLDataLocator_OutputMix { + SLuint32 locatorType; + SLObjectItf outputMix; +} SLDataLocator_OutputMix; + + +/** BufferQueue-based data locator definition where locatorType must be SL_DATALOCATOR_BUFFERQUEUE*/ +typedef struct SLDataLocator_BufferQueue { + SLuint32 locatorType; + SLuint32 numBuffers; +} SLDataLocator_BufferQueue; + +/** MidiBufferQueue-based data locator definition where locatorType must be SL_DATALOCATOR_MIDIBUFFERQUEUE*/ +typedef struct SLDataLocator_MIDIBufferQueue { + SLuint32 locatorType; + SLuint32 tpqn; + SLuint32 numBuffers; +} SLDataLocator_MIDIBufferQueue; + +/** Data format defines */ +#define SL_DATAFORMAT_MIME ((SLuint32) 0x00000001) +#define SL_DATAFORMAT_PCM ((SLuint32) 0x00000002) +#define SL_DATAFORMAT_RESERVED3 ((SLuint32) 0x00000003) + + +/** MIME-type-based data format definition where formatType must be SL_DATAFORMAT_MIME*/ +typedef struct SLDataFormat_MIME_ { + SLuint32 formatType; + SLchar * mimeType; + SLuint32 containerType; +} SLDataFormat_MIME; + +/* Byte order of a block of 16- or 32-bit data */ +#define SL_BYTEORDER_BIGENDIAN ((SLuint32) 0x00000001) +#define SL_BYTEORDER_LITTLEENDIAN ((SLuint32) 0x00000002) + +/* Container type */ +#define SL_CONTAINERTYPE_UNSPECIFIED ((SLuint32) 0x00000001) +#define SL_CONTAINERTYPE_RAW ((SLuint32) 0x00000002) +#define SL_CONTAINERTYPE_ASF ((SLuint32) 0x00000003) +#define SL_CONTAINERTYPE_AVI ((SLuint32) 0x00000004) +#define SL_CONTAINERTYPE_BMP ((SLuint32) 0x00000005) +#define SL_CONTAINERTYPE_JPG ((SLuint32) 0x00000006) +#define SL_CONTAINERTYPE_JPG2000 ((SLuint32) 0x00000007) +#define SL_CONTAINERTYPE_M4A ((SLuint32) 0x00000008) +#define SL_CONTAINERTYPE_MP3 ((SLuint32) 0x00000009) +#define SL_CONTAINERTYPE_MP4 ((SLuint32) 0x0000000A) +#define SL_CONTAINERTYPE_MPEG_ES ((SLuint32) 0x0000000B) +#define SL_CONTAINERTYPE_MPEG_PS ((SLuint32) 0x0000000C) +#define SL_CONTAINERTYPE_MPEG_TS ((SLuint32) 0x0000000D) +#define SL_CONTAINERTYPE_QT ((SLuint32) 0x0000000E) +#define SL_CONTAINERTYPE_WAV ((SLuint32) 0x0000000F) +#define SL_CONTAINERTYPE_XMF_0 ((SLuint32) 0x00000010) +#define SL_CONTAINERTYPE_XMF_1 ((SLuint32) 0x00000011) +#define SL_CONTAINERTYPE_XMF_2 ((SLuint32) 0x00000012) +#define SL_CONTAINERTYPE_XMF_3 ((SLuint32) 0x00000013) +#define SL_CONTAINERTYPE_XMF_GENERIC ((SLuint32) 0x00000014) +#define SL_CONTAINERTYPE_AMR ((SLuint32) 0x00000015) +#define SL_CONTAINERTYPE_AAC ((SLuint32) 0x00000016) +#define SL_CONTAINERTYPE_3GPP ((SLuint32) 0x00000017) +#define SL_CONTAINERTYPE_3GA ((SLuint32) 0x00000018) +#define SL_CONTAINERTYPE_RM ((SLuint32) 0x00000019) +#define SL_CONTAINERTYPE_DMF ((SLuint32) 0x0000001A) +#define SL_CONTAINERTYPE_SMF ((SLuint32) 0x0000001B) +#define SL_CONTAINERTYPE_MOBILE_DLS ((SLuint32) 0x0000001C) +#define SL_CONTAINERTYPE_OGG ((SLuint32) 0x0000001D) + + +/** PCM-type-based data format definition where formatType must be SL_DATAFORMAT_PCM*/ +typedef struct SLDataFormat_PCM_ { + SLuint32 formatType; + SLuint32 numChannels; + SLuint32 samplesPerSec; + SLuint32 bitsPerSample; + SLuint32 containerSize; + SLuint32 channelMask; + SLuint32 endianness; +} SLDataFormat_PCM; + +typedef struct SLDataSource_ { + void *pLocator; + void *pFormat; +} SLDataSource; + + +typedef struct SLDataSink_ { + void *pLocator; + void *pFormat; +} SLDataSink; + + + + + + +/*---------------------------------------------------------------------------*/ +/* Standard Object Interface */ +/*---------------------------------------------------------------------------*/ + +extern const SLInterfaceID SL_IID_OBJECT; + +/** Object callback */ + + +typedef void (SLAPIENTRY *slObjectCallback) ( + SLObjectItf caller, + const void * pContext, + SLuint32 event, + SLresult result, + SLuint32 param, + void *pInterface +); + + +struct SLObjectItf_ { + SLresult (*Realize) ( + SLObjectItf self, + SLboolean async + ); + SLresult (*Resume) ( + SLObjectItf self, + SLboolean async + ); + SLresult (*GetState) ( + SLObjectItf self, + SLuint32 * pState + ); + SLresult (*GetInterface) ( + SLObjectItf self, + const SLInterfaceID iid, + void * pInterface + ); + SLresult (*RegisterCallback) ( + SLObjectItf self, + slObjectCallback callback, + void * pContext + ); + void (*AbortAsyncOperation) ( + SLObjectItf self + ); + void (*Destroy) ( + SLObjectItf self + ); + SLresult (*SetPriority) ( + SLObjectItf self, + SLint32 priority, + SLboolean preemptable + ); + SLresult (*GetPriority) ( + SLObjectItf self, + SLint32 *pPriority, + SLboolean *pPreemptable + ); + SLresult (*SetLossOfControlInterfaces) ( + SLObjectItf self, + SLint16 numInterfaces, + SLInterfaceID * pInterfaceIDs, + SLboolean enabled + ); +}; + + +/*---------------------------------------------------------------------------*/ +/* Audio IO Device capabilities interface */ +/*---------------------------------------------------------------------------*/ + +#define SL_DEFAULTDEVICEID_AUDIOINPUT ((SLuint32) 0xFFFFFFFF) +#define SL_DEFAULTDEVICEID_AUDIOOUTPUT ((SLuint32) 0xFFFFFFFE) +#define SL_DEFAULTDEVICEID_LED ((SLuint32) 0xFFFFFFFD) +#define SL_DEFAULTDEVICEID_VIBRA ((SLuint32) 0xFFFFFFFC) +#define SL_DEFAULTDEVICEID_RESERVED1 ((SLuint32) 0xFFFFFFFB) + + +#define SL_DEVCONNECTION_INTEGRATED ((SLint16) 0x0001) +#define SL_DEVCONNECTION_ATTACHED_WIRED ((SLint16) 0x0100) +#define SL_DEVCONNECTION_ATTACHED_WIRELESS ((SLint16) 0x0200) +#define SL_DEVCONNECTION_NETWORK ((SLint16) 0x0400) + + +#define SL_DEVLOCATION_HANDSET ((SLuint16) 0x0001) +#define SL_DEVLOCATION_HEADSET ((SLuint16) 0x0002) +#define SL_DEVLOCATION_CARKIT ((SLuint16) 0x0003) +#define SL_DEVLOCATION_DOCK ((SLuint16) 0x0004) +#define SL_DEVLOCATION_REMOTE ((SLuint16) 0x0005) +/* Note: SL_DEVLOCATION_RESLTE is deprecated, use SL_DEVLOCATION_REMOTE instead. */ +#define SL_DEVLOCATION_RESLTE ((SLuint16) 0x0005) + + +#define SL_DEVSCOPE_UNKNOWN ((SLuint16) 0x0001) +#define SL_DEVSCOPE_ENVIRONMENT ((SLuint16) 0x0002) +#define SL_DEVSCOPE_USER ((SLuint16) 0x0003) + + +typedef struct SLAudioInputDescriptor_ { + SLchar *deviceName; + SLint16 deviceConnection; + SLint16 deviceScope; + SLint16 deviceLocation; + SLboolean isForTelephony; + SLmilliHertz minSampleRate; + SLmilliHertz maxSampleRate; + SLboolean isFreqRangeContinuous; + SLmilliHertz *samplingRatesSupported; + SLint16 numOfSamplingRatesSupported; + SLint16 maxChannels; +} SLAudioInputDescriptor; + + +typedef struct SLAudioOutputDescriptor_ { + SLchar *pDeviceName; + SLint16 deviceConnection; + SLint16 deviceScope; + SLint16 deviceLocation; + SLboolean isForTelephony; + SLmilliHertz minSampleRate; + SLmilliHertz maxSampleRate; + SLboolean isFreqRangeContinuous; + SLmilliHertz *samplingRatesSupported; + SLint16 numOfSamplingRatesSupported; + SLint16 maxChannels; +} SLAudioOutputDescriptor; + + + +extern const SLInterfaceID SL_IID_AUDIOIODEVICECAPABILITIES; + +struct SLAudioIODeviceCapabilitiesItf_; +typedef const struct SLAudioIODeviceCapabilitiesItf_ * const * SLAudioIODeviceCapabilitiesItf; + + +typedef void (SLAPIENTRY *slAvailableAudioInputsChangedCallback) ( + SLAudioIODeviceCapabilitiesItf caller, + void *pContext, + SLuint32 deviceID, + SLint32 numInputs, + SLboolean isNew +); + + +typedef void (SLAPIENTRY *slAvailableAudioOutputsChangedCallback) ( + SLAudioIODeviceCapabilitiesItf caller, + void *pContext, + SLuint32 deviceID, + SLint32 numOutputs, + SLboolean isNew +); + +typedef void (SLAPIENTRY *slDefaultDeviceIDMapChangedCallback) ( + SLAudioIODeviceCapabilitiesItf caller, + void *pContext, + SLboolean isOutput, + SLint32 numDevices +); + + +struct SLAudioIODeviceCapabilitiesItf_ { + SLresult (*GetAvailableAudioInputs)( + SLAudioIODeviceCapabilitiesItf self, + SLint32 *pNumInputs, + SLuint32 *pInputDeviceIDs + ); + SLresult (*QueryAudioInputCapabilities)( + SLAudioIODeviceCapabilitiesItf self, + SLuint32 deviceId, + SLAudioInputDescriptor *pDescriptor + ); + SLresult (*RegisterAvailableAudioInputsChangedCallback) ( + SLAudioIODeviceCapabilitiesItf self, + slAvailableAudioInputsChangedCallback callback, + void *pContext + ); + SLresult (*GetAvailableAudioOutputs)( + SLAudioIODeviceCapabilitiesItf self, + SLint32 *pNumOutputs, + SLuint32 *pOutputDeviceIDs + ); + SLresult (*QueryAudioOutputCapabilities)( + SLAudioIODeviceCapabilitiesItf self, + SLuint32 deviceId, + SLAudioOutputDescriptor *pDescriptor + ); + SLresult (*RegisterAvailableAudioOutputsChangedCallback) ( + SLAudioIODeviceCapabilitiesItf self, + slAvailableAudioOutputsChangedCallback callback, + void *pContext + ); + SLresult (*RegisterDefaultDeviceIDMapChangedCallback) ( + SLAudioIODeviceCapabilitiesItf self, + slDefaultDeviceIDMapChangedCallback callback, + void *pContext + ); + SLresult (*GetAssociatedAudioInputs) ( + SLAudioIODeviceCapabilitiesItf self, + SLuint32 deviceId, + SLint32 *pNumAudioInputs, + SLuint32 *pAudioInputDeviceIDs + ); + SLresult (*GetAssociatedAudioOutputs) ( + SLAudioIODeviceCapabilitiesItf self, + SLuint32 deviceId, + SLint32 *pNumAudioOutputs, + SLuint32 *pAudioOutputDeviceIDs + ); + SLresult (*GetDefaultAudioDevices) ( + SLAudioIODeviceCapabilitiesItf self, + SLuint32 defaultDeviceID, + SLint32 *pNumAudioDevices, + SLuint32 *pAudioDeviceIDs + ); + SLresult (*QuerySampleFormatsSupported)( + SLAudioIODeviceCapabilitiesItf self, + SLuint32 deviceId, + SLmilliHertz samplingRate, + SLint32 *pSampleFormats, + SLint32 *pNumOfSampleFormats + ); +}; + + + +/*---------------------------------------------------------------------------*/ +/* Capabilities of the LED array IODevice */ +/*---------------------------------------------------------------------------*/ + +typedef struct SLLEDDescriptor_ { + SLuint8 ledCount; + SLuint8 primaryLED; + SLuint32 colorMask; +} SLLEDDescriptor; + + +/*---------------------------------------------------------------------------*/ +/* LED Array interface */ +/*---------------------------------------------------------------------------*/ + +typedef struct SLHSL_ { + SLmillidegree hue; + SLpermille saturation; + SLpermille lightness; +} SLHSL; + + +extern const SLInterfaceID SL_IID_LED; + +struct SLLEDArrayItf_; +typedef const struct SLLEDArrayItf_ * const * SLLEDArrayItf; + +struct SLLEDArrayItf_ { + SLresult (*ActivateLEDArray) ( + SLLEDArrayItf self, + SLuint32 lightMask + ); + SLresult (*IsLEDArrayActivated) ( + SLLEDArrayItf self, + SLuint32 *lightMask + ); + SLresult (*SetColor) ( + SLLEDArrayItf self, + SLuint8 index, + const SLHSL *color + ); + SLresult (*GetColor) ( + SLLEDArrayItf self, + SLuint8 index, + SLHSL *color + ); +}; + +/*---------------------------------------------------------------------------*/ +/* Capabilities of the Vibra IODevice */ +/*---------------------------------------------------------------------------*/ + +typedef struct SLVibraDescriptor_ { + SLboolean supportsFrequency; + SLboolean supportsIntensity; + SLmilliHertz minFrequency; + SLmilliHertz maxFrequency; +} SLVibraDescriptor; + + + +/*---------------------------------------------------------------------------*/ +/* Vibra interface */ +/*---------------------------------------------------------------------------*/ + + +extern const SLInterfaceID SL_IID_VIBRA; + + +struct SLVibraItf_; +typedef const struct SLVibraItf_ * const * SLVibraItf; + +struct SLVibraItf_ { + SLresult (*Vibrate) ( + SLVibraItf self, + SLboolean vibrate + ); + SLresult (*IsVibrating) ( + SLVibraItf self, + SLboolean *pVibrating + ); + SLresult (*SetFrequency) ( + SLVibraItf self, + SLmilliHertz frequency + ); + SLresult (*GetFrequency) ( + SLVibraItf self, + SLmilliHertz *pFrequency + ); + SLresult (*SetIntensity) ( + SLVibraItf self, + SLpermille intensity + ); + SLresult (*GetIntensity) ( + SLVibraItf self, + SLpermille *pIntensity + ); +}; + + +/*---------------------------------------------------------------------------*/ +/* Meta data extraction related types and interface */ +/*---------------------------------------------------------------------------*/ + +#define SL_CHARACTERENCODING_UNKNOWN ((SLuint32) 0x00000000) +#define SL_CHARACTERENCODING_BINARY ((SLuint32) 0x00000001) +#define SL_CHARACTERENCODING_ASCII ((SLuint32) 0x00000002) +#define SL_CHARACTERENCODING_BIG5 ((SLuint32) 0x00000003) +#define SL_CHARACTERENCODING_CODEPAGE1252 ((SLuint32) 0x00000004) +#define SL_CHARACTERENCODING_GB2312 ((SLuint32) 0x00000005) +#define SL_CHARACTERENCODING_HZGB2312 ((SLuint32) 0x00000006) +#define SL_CHARACTERENCODING_GB12345 ((SLuint32) 0x00000007) +#define SL_CHARACTERENCODING_GB18030 ((SLuint32) 0x00000008) +#define SL_CHARACTERENCODING_GBK ((SLuint32) 0x00000009) +#define SL_CHARACTERENCODING_IMAPUTF7 ((SLuint32) 0x0000000A) +#define SL_CHARACTERENCODING_ISO2022JP ((SLuint32) 0x0000000B) +#define SL_CHARACTERENCODING_ISO2022JP1 ((SLuint32) 0x0000000B) +#define SL_CHARACTERENCODING_ISO88591 ((SLuint32) 0x0000000C) +#define SL_CHARACTERENCODING_ISO885910 ((SLuint32) 0x0000000D) +#define SL_CHARACTERENCODING_ISO885913 ((SLuint32) 0x0000000E) +#define SL_CHARACTERENCODING_ISO885914 ((SLuint32) 0x0000000F) +#define SL_CHARACTERENCODING_ISO885915 ((SLuint32) 0x00000010) +#define SL_CHARACTERENCODING_ISO88592 ((SLuint32) 0x00000011) +#define SL_CHARACTERENCODING_ISO88593 ((SLuint32) 0x00000012) +#define SL_CHARACTERENCODING_ISO88594 ((SLuint32) 0x00000013) +#define SL_CHARACTERENCODING_ISO88595 ((SLuint32) 0x00000014) +#define SL_CHARACTERENCODING_ISO88596 ((SLuint32) 0x00000015) +#define SL_CHARACTERENCODING_ISO88597 ((SLuint32) 0x00000016) +#define SL_CHARACTERENCODING_ISO88598 ((SLuint32) 0x00000017) +#define SL_CHARACTERENCODING_ISO88599 ((SLuint32) 0x00000018) +#define SL_CHARACTERENCODING_ISOEUCJP ((SLuint32) 0x00000019) +#define SL_CHARACTERENCODING_SHIFTJIS ((SLuint32) 0x0000001A) +#define SL_CHARACTERENCODING_SMS7BIT ((SLuint32) 0x0000001B) +#define SL_CHARACTERENCODING_UTF7 ((SLuint32) 0x0000001C) +#define SL_CHARACTERENCODING_UTF8 ((SLuint32) 0x0000001D) +#define SL_CHARACTERENCODING_JAVACONFORMANTUTF8 ((SLuint32) 0x0000001E) +#define SL_CHARACTERENCODING_UTF16BE ((SLuint32) 0x0000001F) +#define SL_CHARACTERENCODING_UTF16LE ((SLuint32) 0x00000020) + + +#define SL_METADATA_FILTER_KEY ((SLuint8) 0x01) +#define SL_METADATA_FILTER_LANG ((SLuint8) 0x02) +#define SL_METADATA_FILTER_ENCODING ((SLuint8) 0x04) + + +typedef struct SLMetadataInfo_ { + SLuint32 size; + SLuint32 encoding; + SLchar langCountry[16]; + SLuint8 data[1]; +} SLMetadataInfo; + +extern const SLInterfaceID SL_IID_METADATAEXTRACTION; + +struct SLMetadataExtractionItf_; +typedef const struct SLMetadataExtractionItf_ * const * SLMetadataExtractionItf; + + +struct SLMetadataExtractionItf_ { + SLresult (*GetItemCount) ( + SLMetadataExtractionItf self, + SLuint32 *pItemCount + ); + SLresult (*GetKeySize) ( + SLMetadataExtractionItf self, + SLuint32 index, + SLuint32 *pKeySize + ); + SLresult (*GetKey) ( + SLMetadataExtractionItf self, + SLuint32 index, + SLuint32 keySize, + SLMetadataInfo *pKey + ); + SLresult (*GetValueSize) ( + SLMetadataExtractionItf self, + SLuint32 index, + SLuint32 *pValueSize + ); + SLresult (*GetValue) ( + SLMetadataExtractionItf self, + SLuint32 index, + SLuint32 valueSize, + SLMetadataInfo *pValue + ); + SLresult (*AddKeyFilter) ( + SLMetadataExtractionItf self, + SLuint32 keySize, + const void *pKey, + SLuint32 keyEncoding, + const SLchar *pValueLangCountry, + SLuint32 valueEncoding, + SLuint8 filterMask + ); + SLresult (*ClearKeyFilter) ( + SLMetadataExtractionItf self + ); +}; + + +/*---------------------------------------------------------------------------*/ +/* Meta data traversal related types and interface */ +/*---------------------------------------------------------------------------*/ + +#define SL_METADATATRAVERSALMODE_ALL ((SLuint32) 0x00000001) +#define SL_METADATATRAVERSALMODE_NODE ((SLuint32) 0x00000002) + + +#define SL_NODETYPE_UNSPECIFIED ((SLuint32) 0x00000001) +#define SL_NODETYPE_AUDIO ((SLuint32) 0x00000002) +#define SL_NODETYPE_VIDEO ((SLuint32) 0x00000003) +#define SL_NODETYPE_IMAGE ((SLuint32) 0x00000004) + +#define SL_NODE_PARENT 0xFFFFFFFF + +extern const SLInterfaceID SL_IID_METADATATRAVERSAL; + +struct SLMetadataTraversalItf_; +typedef const struct SLMetadataTraversalItf_ * const * SLMetadataTraversalItf; + +struct SLMetadataTraversalItf_ { + SLresult (*SetMode) ( + SLMetadataTraversalItf self, + SLuint32 mode + ); + SLresult (*GetChildCount) ( + SLMetadataTraversalItf self, + SLuint32 *pCount + ); + SLresult (*GetChildMIMETypeSize) ( + SLMetadataTraversalItf self, + SLuint32 index, + SLuint32 *pSize + ); + SLresult (*GetChildInfo) ( + SLMetadataTraversalItf self, + SLuint32 index, + SLint32 *pNodeID, + SLuint32 *pType, + SLuint32 size, + SLchar *pMimeType + ); + SLresult (*SetActiveNode) ( + SLMetadataTraversalItf self, + SLuint32 index + ); +}; + +/*---------------------------------------------------------------------------*/ +/* Dynamic Source types and interface */ +/*---------------------------------------------------------------------------*/ + +extern const SLInterfaceID SL_IID_DYNAMICSOURCE; + +struct SLDynamicSourceItf_; +typedef const struct SLDynamicSourceItf_ * const * SLDynamicSourceItf; + +struct SLDynamicSourceItf_ { + SLresult (*SetSource) ( + SLDynamicSourceItf self, + SLDataSource *pDataSource + ); +}; + +/*---------------------------------------------------------------------------*/ +/* Output Mix interface */ +/*---------------------------------------------------------------------------*/ + +extern const SLInterfaceID SL_IID_OUTPUTMIX; + +struct SLOutputMixItf_; +typedef const struct SLOutputMixItf_ * const * SLOutputMixItf; + +typedef void (SLAPIENTRY *slMixDeviceChangeCallback) ( + SLOutputMixItf caller, + void *pContext +); + + +struct SLOutputMixItf_ { + SLresult (*GetDestinationOutputDeviceIDs) ( + SLOutputMixItf self, + SLint32 *pNumDevices, + SLuint32 *pDeviceIDs + ); + SLresult (*RegisterDeviceChangeCallback) ( + SLOutputMixItf self, + slMixDeviceChangeCallback callback, + void *pContext + ); + SLresult (*ReRoute)( + SLOutputMixItf self, + SLint32 numOutputDevices, + SLuint32 *pOutputDeviceIDs + ); +}; + + +/*---------------------------------------------------------------------------*/ +/* Playback interface */ +/*---------------------------------------------------------------------------*/ + +/** Playback states */ +#define SL_PLAYSTATE_STOPPED ((SLuint32) 0x00000001) +#define SL_PLAYSTATE_PAUSED ((SLuint32) 0x00000002) +#define SL_PLAYSTATE_PLAYING ((SLuint32) 0x00000003) + +/** Play events **/ +#define SL_PLAYEVENT_HEADATEND ((SLuint32) 0x00000001) +#define SL_PLAYEVENT_HEADATMARKER ((SLuint32) 0x00000002) +#define SL_PLAYEVENT_HEADATNEWPOS ((SLuint32) 0x00000004) +#define SL_PLAYEVENT_HEADMOVING ((SLuint32) 0x00000008) +#define SL_PLAYEVENT_HEADSTALLED ((SLuint32) 0x00000010) + +#define SL_TIME_UNKNOWN ((SLuint32) 0xFFFFFFFF) + + +extern const SLInterfaceID SL_IID_PLAY; + +/** Playback interface methods */ + +struct SLPlayItf_; +typedef const struct SLPlayItf_ * const * SLPlayItf; + +typedef void (SLAPIENTRY *slPlayCallback) ( + SLPlayItf caller, + void *pContext, + SLuint32 event +); + +struct SLPlayItf_ { + SLresult (*SetPlayState) ( + SLPlayItf self, + SLuint32 state + ); + SLresult (*GetPlayState) ( + SLPlayItf self, + SLuint32 *pState + ); + SLresult (*GetDuration) ( + SLPlayItf self, + SLmillisecond *pMsec + ); + SLresult (*GetPosition) ( + SLPlayItf self, + SLmillisecond *pMsec + ); + SLresult (*RegisterCallback) ( + SLPlayItf self, + slPlayCallback callback, + void *pContext + ); + SLresult (*SetCallbackEventsMask) ( + SLPlayItf self, + SLuint32 eventFlags + ); + SLresult (*GetCallbackEventsMask) ( + SLPlayItf self, + SLuint32 *pEventFlags + ); + SLresult (*SetMarkerPosition) ( + SLPlayItf self, + SLmillisecond mSec + ); + SLresult (*ClearMarkerPosition) ( + SLPlayItf self + ); + SLresult (*GetMarkerPosition) ( + SLPlayItf self, + SLmillisecond *pMsec + ); + SLresult (*SetPositionUpdatePeriod) ( + SLPlayItf self, + SLmillisecond mSec + ); + SLresult (*GetPositionUpdatePeriod) ( + SLPlayItf self, + SLmillisecond *pMsec + ); +}; + +/*---------------------------------------------------------------------------*/ +/* Prefetch status interface */ +/*---------------------------------------------------------------------------*/ + +#define SL_PREFETCHEVENT_STATUSCHANGE ((SLuint32) 0x00000001) +#define SL_PREFETCHEVENT_FILLLEVELCHANGE ((SLuint32) 0x00000002) + +#define SL_PREFETCHSTATUS_UNDERFLOW ((SLuint32) 0x00000001) +#define SL_PREFETCHSTATUS_SUFFICIENTDATA ((SLuint32) 0x00000002) +#define SL_PREFETCHSTATUS_OVERFLOW ((SLuint32) 0x00000003) + + +extern const SLInterfaceID SL_IID_PREFETCHSTATUS; + + +/** Prefetch status interface methods */ + +struct SLPrefetchStatusItf_; +typedef const struct SLPrefetchStatusItf_ * const * SLPrefetchStatusItf; + +typedef void (SLAPIENTRY *slPrefetchCallback) ( + SLPrefetchStatusItf caller, + void *pContext, + SLuint32 event +); + +struct SLPrefetchStatusItf_ { + SLresult (*GetPrefetchStatus) ( + SLPrefetchStatusItf self, + SLuint32 *pStatus + ); + SLresult (*GetFillLevel) ( + SLPrefetchStatusItf self, + SLpermille *pLevel + ); + SLresult (*RegisterCallback) ( + SLPrefetchStatusItf self, + slPrefetchCallback callback, + void *pContext + ); + SLresult (*SetCallbackEventsMask) ( + SLPrefetchStatusItf self, + SLuint32 eventFlags + ); + SLresult (*GetCallbackEventsMask) ( + SLPrefetchStatusItf self, + SLuint32 *pEventFlags + ); + SLresult (*SetFillUpdatePeriod) ( + SLPrefetchStatusItf self, + SLpermille period + ); + SLresult (*GetFillUpdatePeriod) ( + SLPrefetchStatusItf self, + SLpermille *pPeriod + ); +}; + +/*---------------------------------------------------------------------------*/ +/* Playback Rate interface */ +/*---------------------------------------------------------------------------*/ + +#define SL_RATEPROP_RESERVED1 ((SLuint32) 0x00000001) +#define SL_RATEPROP_RESERVED2 ((SLuint32) 0x00000002) +#define SL_RATEPROP_SILENTAUDIO ((SLuint32) 0x00000100) +#define SL_RATEPROP_STAGGEREDAUDIO ((SLuint32) 0x00000200) +#define SL_RATEPROP_NOPITCHCORAUDIO ((SLuint32) 0x00000400) +#define SL_RATEPROP_PITCHCORAUDIO ((SLuint32) 0x00000800) + + +extern const SLInterfaceID SL_IID_PLAYBACKRATE; + +struct SLPlaybackRateItf_; +typedef const struct SLPlaybackRateItf_ * const * SLPlaybackRateItf; + +struct SLPlaybackRateItf_ { + SLresult (*SetRate)( + SLPlaybackRateItf self, + SLpermille rate + ); + SLresult (*GetRate)( + SLPlaybackRateItf self, + SLpermille *pRate + ); + SLresult (*SetPropertyConstraints)( + SLPlaybackRateItf self, + SLuint32 constraints + ); + SLresult (*GetProperties)( + SLPlaybackRateItf self, + SLuint32 *pProperties + ); + SLresult (*GetCapabilitiesOfRate)( + SLPlaybackRateItf self, + SLpermille rate, + SLuint32 *pCapabilities + ); + SLresult (*GetRateRange) ( + SLPlaybackRateItf self, + SLuint8 index, + SLpermille *pMinRate, + SLpermille *pMaxRate, + SLpermille *pStepSize, + SLuint32 *pCapabilities + ); +}; + +/*---------------------------------------------------------------------------*/ +/* Seek Interface */ +/*---------------------------------------------------------------------------*/ + +#define SL_SEEKMODE_FAST ((SLuint32) 0x0001) +#define SL_SEEKMODE_ACCURATE ((SLuint32) 0x0002) + +extern const SLInterfaceID SL_IID_SEEK; + +struct SLSeekItf_; +typedef const struct SLSeekItf_ * const * SLSeekItf; + +struct SLSeekItf_ { + SLresult (*SetPosition)( + SLSeekItf self, + SLmillisecond pos, + SLuint32 seekMode + ); + SLresult (*SetLoop)( + SLSeekItf self, + SLboolean loopEnable, + SLmillisecond startPos, + SLmillisecond endPos + ); + SLresult (*GetLoop)( + SLSeekItf self, + SLboolean *pLoopEnabled, + SLmillisecond *pStartPos, + SLmillisecond *pEndPos + ); +}; + +/*---------------------------------------------------------------------------*/ +/* Standard Recording Interface */ +/*---------------------------------------------------------------------------*/ + +/** Recording states */ +#define SL_RECORDSTATE_STOPPED ((SLuint32) 0x00000001) +#define SL_RECORDSTATE_PAUSED ((SLuint32) 0x00000002) +#define SL_RECORDSTATE_RECORDING ((SLuint32) 0x00000003) + + +/** Record event **/ +#define SL_RECORDEVENT_HEADATLIMIT ((SLuint32) 0x00000001) +#define SL_RECORDEVENT_HEADATMARKER ((SLuint32) 0x00000002) +#define SL_RECORDEVENT_HEADATNEWPOS ((SLuint32) 0x00000004) +#define SL_RECORDEVENT_HEADMOVING ((SLuint32) 0x00000008) +#define SL_RECORDEVENT_HEADSTALLED ((SLuint32) 0x00000010) +/* Note: SL_RECORDEVENT_BUFFER_INSUFFICIENT is deprecated, use SL_RECORDEVENT_BUFFER_FULL instead. */ +#define SL_RECORDEVENT_BUFFER_INSUFFICIENT ((SLuint32) 0x00000020) +#define SL_RECORDEVENT_BUFFER_FULL ((SLuint32) 0x00000020) + + +extern const SLInterfaceID SL_IID_RECORD; + +struct SLRecordItf_; +typedef const struct SLRecordItf_ * const * SLRecordItf; + +typedef void (SLAPIENTRY *slRecordCallback) ( + SLRecordItf caller, + void *pContext, + SLuint32 event +); + +/** Recording interface methods */ +struct SLRecordItf_ { + SLresult (*SetRecordState) ( + SLRecordItf self, + SLuint32 state + ); + SLresult (*GetRecordState) ( + SLRecordItf self, + SLuint32 *pState + ); + SLresult (*SetDurationLimit) ( + SLRecordItf self, + SLmillisecond msec + ); + SLresult (*GetPosition) ( + SLRecordItf self, + SLmillisecond *pMsec + ); + SLresult (*RegisterCallback) ( + SLRecordItf self, + slRecordCallback callback, + void *pContext + ); + SLresult (*SetCallbackEventsMask) ( + SLRecordItf self, + SLuint32 eventFlags + ); + SLresult (*GetCallbackEventsMask) ( + SLRecordItf self, + SLuint32 *pEventFlags + ); + SLresult (*SetMarkerPosition) ( + SLRecordItf self, + SLmillisecond mSec + ); + SLresult (*ClearMarkerPosition) ( + SLRecordItf self + ); + SLresult (*GetMarkerPosition) ( + SLRecordItf self, + SLmillisecond *pMsec + ); + SLresult (*SetPositionUpdatePeriod) ( + SLRecordItf self, + SLmillisecond mSec + ); + SLresult (*GetPositionUpdatePeriod) ( + SLRecordItf self, + SLmillisecond *pMsec + ); +}; + +/*---------------------------------------------------------------------------*/ +/* Equalizer interface */ +/*---------------------------------------------------------------------------*/ + +#define SL_EQUALIZER_UNDEFINED ((SLuint16) 0xFFFF) + +extern const SLInterfaceID SL_IID_EQUALIZER; + +struct SLEqualizerItf_; +typedef const struct SLEqualizerItf_ * const * SLEqualizerItf; + +struct SLEqualizerItf_ { + SLresult (*SetEnabled)( + SLEqualizerItf self, + SLboolean enabled + ); + SLresult (*IsEnabled)( + SLEqualizerItf self, + SLboolean *pEnabled + ); + SLresult (*GetNumberOfBands)( + SLEqualizerItf self, + SLuint16 *pAmount + ); + SLresult (*GetBandLevelRange)( + SLEqualizerItf self, + SLmillibel *pMin, + SLmillibel *pMax + ); + SLresult (*SetBandLevel)( + SLEqualizerItf self, + SLuint16 band, + SLmillibel level + ); + SLresult (*GetBandLevel)( + SLEqualizerItf self, + SLuint16 band, + SLmillibel *pLevel + ); + SLresult (*GetCenterFreq)( + SLEqualizerItf self, + SLuint16 band, + SLmilliHertz *pCenter + ); + SLresult (*GetBandFreqRange)( + SLEqualizerItf self, + SLuint16 band, + SLmilliHertz *pMin, + SLmilliHertz *pMax + ); + SLresult (*GetBand)( + SLEqualizerItf self, + SLmilliHertz frequency, + SLuint16 *pBand + ); + SLresult (*GetCurrentPreset)( + SLEqualizerItf self, + SLuint16 *pPreset + ); + SLresult (*UsePreset)( + SLEqualizerItf self, + SLuint16 index + ); + SLresult (*GetNumberOfPresets)( + SLEqualizerItf self, + SLuint16 *pNumPresets + ); + SLresult (*GetPresetName)( + SLEqualizerItf self, + SLuint16 index, + const SLchar ** ppName + ); +}; + +/*---------------------------------------------------------------------------*/ +/* Volume Interface */ +/* --------------------------------------------------------------------------*/ + +extern const SLInterfaceID SL_IID_VOLUME; + +struct SLVolumeItf_; +typedef const struct SLVolumeItf_ * const * SLVolumeItf; + +struct SLVolumeItf_ { + SLresult (*SetVolumeLevel) ( + SLVolumeItf self, + SLmillibel level + ); + SLresult (*GetVolumeLevel) ( + SLVolumeItf self, + SLmillibel *pLevel + ); + SLresult (*GetMaxVolumeLevel) ( + SLVolumeItf self, + SLmillibel *pMaxLevel + ); + SLresult (*SetMute) ( + SLVolumeItf self, + SLboolean mute + ); + SLresult (*GetMute) ( + SLVolumeItf self, + SLboolean *pMute + ); + SLresult (*EnableStereoPosition) ( + SLVolumeItf self, + SLboolean enable + ); + SLresult (*IsEnabledStereoPosition) ( + SLVolumeItf self, + SLboolean *pEnable + ); + SLresult (*SetStereoPosition) ( + SLVolumeItf self, + SLpermille stereoPosition + ); + SLresult (*GetStereoPosition) ( + SLVolumeItf self, + SLpermille *pStereoPosition + ); +}; + + +/*---------------------------------------------------------------------------*/ +/* Device Volume Interface */ +/* --------------------------------------------------------------------------*/ + +extern const SLInterfaceID SL_IID_DEVICEVOLUME; + +struct SLDeviceVolumeItf_; +typedef const struct SLDeviceVolumeItf_ * const * SLDeviceVolumeItf; + +struct SLDeviceVolumeItf_ { + SLresult (*GetVolumeScale) ( + SLDeviceVolumeItf self, + SLuint32 deviceID, + SLint32 *pMinValue, + SLint32 *pMaxValue, + SLboolean *pIsMillibelScale + ); + SLresult (*SetVolume) ( + SLDeviceVolumeItf self, + SLuint32 deviceID, + SLint32 volume + ); + SLresult (*GetVolume) ( + SLDeviceVolumeItf self, + SLuint32 deviceID, + SLint32 *pVolume + ); +}; + + +/*---------------------------------------------------------------------------*/ +/* Buffer Queue Interface */ +/*---------------------------------------------------------------------------*/ + +extern const SLInterfaceID SL_IID_BUFFERQUEUE; + +struct SLBufferQueueItf_; +typedef const struct SLBufferQueueItf_ * const * SLBufferQueueItf; + +typedef void (SLAPIENTRY *slBufferQueueCallback)( + SLBufferQueueItf caller, + void *pContext +); + +/** Buffer queue state **/ + +typedef struct SLBufferQueueState_ { + SLuint32 count; + SLuint32 playIndex; +} SLBufferQueueState; + + +struct SLBufferQueueItf_ { + SLresult (*Enqueue) ( + SLBufferQueueItf self, + const void *pBuffer, + SLuint32 size + ); + SLresult (*Clear) ( + SLBufferQueueItf self + ); + SLresult (*GetState) ( + SLBufferQueueItf self, + SLBufferQueueState *pState + ); + SLresult (*RegisterCallback) ( + SLBufferQueueItf self, + slBufferQueueCallback callback, + void* pContext + ); +}; + + +/*---------------------------------------------------------------------------*/ +/* PresetReverb */ +/*---------------------------------------------------------------------------*/ + +#define SL_REVERBPRESET_NONE ((SLuint16) 0x0000) +#define SL_REVERBPRESET_SMALLROOM ((SLuint16) 0x0001) +#define SL_REVERBPRESET_MEDIUMROOM ((SLuint16) 0x0002) +#define SL_REVERBPRESET_LARGEROOM ((SLuint16) 0x0003) +#define SL_REVERBPRESET_MEDIUMHALL ((SLuint16) 0x0004) +#define SL_REVERBPRESET_LARGEHALL ((SLuint16) 0x0005) +#define SL_REVERBPRESET_PLATE ((SLuint16) 0x0006) + + +extern const SLInterfaceID SL_IID_PRESETREVERB; + +struct SLPresetReverbItf_; +typedef const struct SLPresetReverbItf_ * const * SLPresetReverbItf; + +struct SLPresetReverbItf_ { + SLresult (*SetPreset) ( + SLPresetReverbItf self, + SLuint16 preset + ); + SLresult (*GetPreset) ( + SLPresetReverbItf self, + SLuint16 *pPreset + ); +}; + + +/*---------------------------------------------------------------------------*/ +/* EnvironmentalReverb */ +/*---------------------------------------------------------------------------*/ + +#define SL_I3DL2_ENVIRONMENT_PRESET_DEFAULT \ + { SL_MILLIBEL_MIN, 0, 1000, 500, SL_MILLIBEL_MIN, 20, SL_MILLIBEL_MIN, 40, 1000,1000 } +#define SL_I3DL2_ENVIRONMENT_PRESET_GENERIC \ + { -1000, -100, 1490, 830, -2602, 7, 200, 11, 1000,1000 } +#define SL_I3DL2_ENVIRONMENT_PRESET_PADDEDCELL \ + { -1000,-6000, 170, 100, -1204, 1, 207, 2, 1000,1000 } +#define SL_I3DL2_ENVIRONMENT_PRESET_ROOM \ + { -1000, -454, 400, 830, -1646, 2, 53, 3, 1000,1000 } +#define SL_I3DL2_ENVIRONMENT_PRESET_BATHROOM \ + { -1000,-1200, 1490, 540, -370, 7, 1030, 11, 1000, 600 } +#define SL_I3DL2_ENVIRONMENT_PRESET_LIVINGROOM \ + { -1000,-6000, 500, 100, -1376, 3, -1104, 4, 1000,1000 } +#define SL_I3DL2_ENVIRONMENT_PRESET_STONEROOM \ + { -1000, -300, 2310, 640, -711, 12, 83, 17, 1000,1000 } +#define SL_I3DL2_ENVIRONMENT_PRESET_AUDITORIUM \ + { -1000, -476, 4320, 590, -789, 20, -289, 30, 1000,1000 } +#define SL_I3DL2_ENVIRONMENT_PRESET_CONCERTHALL \ + { -1000, -500, 3920, 700, -1230, 20, -2, 29, 1000,1000 } +#define SL_I3DL2_ENVIRONMENT_PRESET_CAVE \ + { -1000, 0, 2910, 1300, -602, 15, -302, 22, 1000,1000 } +#define SL_I3DL2_ENVIRONMENT_PRESET_ARENA \ + { -1000, -698, 7240, 330, -1166, 20, 16, 30, 1000,1000 } +#define SL_I3DL2_ENVIRONMENT_PRESET_HANGAR \ + { -1000,-1000, 10050, 230, -602, 20, 198, 30, 1000,1000 } +#define SL_I3DL2_ENVIRONMENT_PRESET_CARPETEDHALLWAY \ + { -1000,-4000, 300, 100, -1831, 2, -1630, 30, 1000,1000 } +#define SL_I3DL2_ENVIRONMENT_PRESET_HALLWAY \ + { -1000, -300, 1490, 590, -1219, 7, 441, 11, 1000,1000 } +#define SL_I3DL2_ENVIRONMENT_PRESET_STONECORRIDOR \ + { -1000, -237, 2700, 790, -1214, 13, 395, 20, 1000,1000 } +#define SL_I3DL2_ENVIRONMENT_PRESET_ALLEY \ + { -1000, -270, 1490, 860, -1204, 7, -4, 11, 1000,1000 } +#define SL_I3DL2_ENVIRONMENT_PRESET_FOREST \ + { -1000,-3300, 1490, 540, -2560, 162, -613, 88, 790,1000 } +#define SL_I3DL2_ENVIRONMENT_PRESET_CITY \ + { -1000, -800, 1490, 670, -2273, 7, -2217, 11, 500,1000 } +#define SL_I3DL2_ENVIRONMENT_PRESET_MOUNTAINS \ + { -1000,-2500, 1490, 210, -2780, 300, -2014, 100, 270,1000 } +#define SL_I3DL2_ENVIRONMENT_PRESET_QUARRY \ + { -1000,-1000, 1490, 830, SL_MILLIBEL_MIN, 61, 500, 25, 1000,1000 } +#define SL_I3DL2_ENVIRONMENT_PRESET_PLAIN \ + { -1000,-2000, 1490, 500, -2466, 179, -2514, 100, 210,1000 } +#define SL_I3DL2_ENVIRONMENT_PRESET_PARKINGLOT \ + { -1000, 0, 1650, 1500, -1363, 8, -1153, 12, 1000,1000 } +#define SL_I3DL2_ENVIRONMENT_PRESET_SEWERPIPE \ + { -1000,-1000, 2810, 140, 429, 14, 648, 21, 800, 600 } +#define SL_I3DL2_ENVIRONMENT_PRESET_UNDERWATER \ + { -1000,-4000, 1490, 100, -449, 7, 1700, 11, 1000,1000 } +#define SL_I3DL2_ENVIRONMENT_PRESET_SMALLROOM \ + { -1000,-600, 1100, 830, -400, 5, 500, 10, 1000, 1000 } +#define SL_I3DL2_ENVIRONMENT_PRESET_MEDIUMROOM \ + { -1000,-600, 1300, 830, -1000, 20, -200, 20, 1000, 1000 } +#define SL_I3DL2_ENVIRONMENT_PRESET_LARGEROOM \ + { -1000,-600, 1500, 830, -1600, 5, -1000, 40, 1000, 1000 } +#define SL_I3DL2_ENVIRONMENT_PRESET_MEDIUMHALL \ + { -1000,-600, 1800, 700, -1300, 15, -800, 30, 1000, 1000 } +#define SL_I3DL2_ENVIRONMENT_PRESET_LARGEHALL \ + { -1000,-600, 1800, 700, -2000, 30, -1400, 60, 1000, 1000 } +#define SL_I3DL2_ENVIRONMENT_PRESET_PLATE \ + { -1000,-200, 1300, 900, 0, 2, 0, 10, 1000, 750 } + + +typedef struct SLEnvironmentalReverbSettings_ { + SLmillibel roomLevel; + SLmillibel roomHFLevel; + SLmillisecond decayTime; + SLpermille decayHFRatio; + SLmillibel reflectionsLevel; + SLmillisecond reflectionsDelay; + SLmillibel reverbLevel; + SLmillisecond reverbDelay; + SLpermille diffusion; + SLpermille density; +} SLEnvironmentalReverbSettings; + + + + +extern const SLInterfaceID SL_IID_ENVIRONMENTALREVERB; + + +struct SLEnvironmentalReverbItf_; +typedef const struct SLEnvironmentalReverbItf_ * const * SLEnvironmentalReverbItf; + +struct SLEnvironmentalReverbItf_ { + SLresult (*SetRoomLevel) ( + SLEnvironmentalReverbItf self, + SLmillibel room + ); + SLresult (*GetRoomLevel) ( + SLEnvironmentalReverbItf self, + SLmillibel *pRoom + ); + SLresult (*SetRoomHFLevel) ( + SLEnvironmentalReverbItf self, + SLmillibel roomHF + ); + SLresult (*GetRoomHFLevel) ( + SLEnvironmentalReverbItf self, + SLmillibel *pRoomHF + ); + SLresult (*SetDecayTime) ( + SLEnvironmentalReverbItf self, + SLmillisecond decayTime + ); + SLresult (*GetDecayTime) ( + SLEnvironmentalReverbItf self, + SLmillisecond *pDecayTime + ); + SLresult (*SetDecayHFRatio) ( + SLEnvironmentalReverbItf self, + SLpermille decayHFRatio + ); + SLresult (*GetDecayHFRatio) ( + SLEnvironmentalReverbItf self, + SLpermille *pDecayHFRatio + ); + SLresult (*SetReflectionsLevel) ( + SLEnvironmentalReverbItf self, + SLmillibel reflectionsLevel + ); + SLresult (*GetReflectionsLevel) ( + SLEnvironmentalReverbItf self, + SLmillibel *pReflectionsLevel + ); + SLresult (*SetReflectionsDelay) ( + SLEnvironmentalReverbItf self, + SLmillisecond reflectionsDelay + ); + SLresult (*GetReflectionsDelay) ( + SLEnvironmentalReverbItf self, + SLmillisecond *pReflectionsDelay + ); + SLresult (*SetReverbLevel) ( + SLEnvironmentalReverbItf self, + SLmillibel reverbLevel + ); + SLresult (*GetReverbLevel) ( + SLEnvironmentalReverbItf self, + SLmillibel *pReverbLevel + ); + SLresult (*SetReverbDelay) ( + SLEnvironmentalReverbItf self, + SLmillisecond reverbDelay + ); + SLresult (*GetReverbDelay) ( + SLEnvironmentalReverbItf self, + SLmillisecond *pReverbDelay + ); + SLresult (*SetDiffusion) ( + SLEnvironmentalReverbItf self, + SLpermille diffusion + ); + SLresult (*GetDiffusion) ( + SLEnvironmentalReverbItf self, + SLpermille *pDiffusion + ); + SLresult (*SetDensity) ( + SLEnvironmentalReverbItf self, + SLpermille density + ); + SLresult (*GetDensity) ( + SLEnvironmentalReverbItf self, + SLpermille *pDensity + ); + SLresult (*SetEnvironmentalReverbProperties) ( + SLEnvironmentalReverbItf self, + const SLEnvironmentalReverbSettings *pProperties + ); + SLresult (*GetEnvironmentalReverbProperties) ( + SLEnvironmentalReverbItf self, + SLEnvironmentalReverbSettings *pProperties + ); +}; + +/*---------------------------------------------------------------------------*/ +/* Effects Send Interface */ +/*---------------------------------------------------------------------------*/ + + +extern const SLInterfaceID SL_IID_EFFECTSEND; + +struct SLEffectSendItf_; +typedef const struct SLEffectSendItf_ * const * SLEffectSendItf; + +struct SLEffectSendItf_ { + SLresult (*EnableEffectSend) ( + SLEffectSendItf self, + const void *pAuxEffect, + SLboolean enable, + SLmillibel initialLevel + ); + SLresult (*IsEnabled) ( + SLEffectSendItf self, + const void * pAuxEffect, + SLboolean *pEnable + ); + SLresult (*SetDirectLevel) ( + SLEffectSendItf self, + SLmillibel directLevel + ); + SLresult (*GetDirectLevel) ( + SLEffectSendItf self, + SLmillibel *pDirectLevel + ); + SLresult (*SetSendLevel) ( + SLEffectSendItf self, + const void *pAuxEffect, + SLmillibel sendLevel + ); + SLresult (*GetSendLevel)( + SLEffectSendItf self, + const void *pAuxEffect, + SLmillibel *pSendLevel + ); +}; + + +/*---------------------------------------------------------------------------*/ +/* 3D Grouping Interface */ +/*---------------------------------------------------------------------------*/ + + +extern const SLInterfaceID SL_IID_3DGROUPING; + + +struct SL3DGroupingItf_ ; +typedef const struct SL3DGroupingItf_ * const * SL3DGroupingItf; + +struct SL3DGroupingItf_ { + SLresult (*Set3DGroup) ( + SL3DGroupingItf self, + SLObjectItf group + ); + SLresult (*Get3DGroup) ( + SL3DGroupingItf self, + SLObjectItf *pGroup + ); +}; + + +/*---------------------------------------------------------------------------*/ +/* 3D Commit Interface */ +/*---------------------------------------------------------------------------*/ + + +extern const SLInterfaceID SL_IID_3DCOMMIT; + +struct SL3DCommitItf_; +typedef const struct SL3DCommitItf_* const * SL3DCommitItf; + +struct SL3DCommitItf_ { + SLresult (*Commit) ( + SL3DCommitItf self + ); + SLresult (*SetDeferred) ( + SL3DCommitItf self, + SLboolean deferred + ); +}; + + +/*---------------------------------------------------------------------------*/ +/* 3D Location Interface */ +/*---------------------------------------------------------------------------*/ + +typedef struct SLVec3D_ { + SLint32 x; + SLint32 y; + SLint32 z; +} SLVec3D; + +extern const SLInterfaceID SL_IID_3DLOCATION; + +struct SL3DLocationItf_; +typedef const struct SL3DLocationItf_ * const * SL3DLocationItf; + +struct SL3DLocationItf_ { + SLresult (*SetLocationCartesian) ( + SL3DLocationItf self, + const SLVec3D *pLocation + ); + SLresult (*SetLocationSpherical) ( + SL3DLocationItf self, + SLmillidegree azimuth, + SLmillidegree elevation, + SLmillimeter distance + ); + SLresult (*Move) ( + SL3DLocationItf self, + const SLVec3D *pMovement + ); + SLresult (*GetLocationCartesian) ( + SL3DLocationItf self, + SLVec3D *pLocation + ); + SLresult (*SetOrientationVectors) ( + SL3DLocationItf self, + const SLVec3D *pFront, + const SLVec3D *pAbove + ); + SLresult (*SetOrientationAngles) ( + SL3DLocationItf self, + SLmillidegree heading, + SLmillidegree pitch, + SLmillidegree roll + ); + SLresult (*Rotate) ( + SL3DLocationItf self, + SLmillidegree theta, + const SLVec3D *pAxis + ); + SLresult (*GetOrientationVectors) ( + SL3DLocationItf self, + SLVec3D *pFront, + SLVec3D *pUp + ); +}; + + +/*---------------------------------------------------------------------------*/ +/* 3D Doppler Interface */ +/*---------------------------------------------------------------------------*/ + + +extern const SLInterfaceID SL_IID_3DDOPPLER; + +struct SL3DDopplerItf_; +typedef const struct SL3DDopplerItf_ * const * SL3DDopplerItf; + +struct SL3DDopplerItf_ { + SLresult (*SetVelocityCartesian) ( + SL3DDopplerItf self, + const SLVec3D *pVelocity + ); + SLresult (*SetVelocitySpherical) ( + SL3DDopplerItf self, + SLmillidegree azimuth, + SLmillidegree elevation, + SLmillimeter speed + ); + SLresult (*GetVelocityCartesian) ( + SL3DDopplerItf self, + SLVec3D *pVelocity + ); + SLresult (*SetDopplerFactor) ( + SL3DDopplerItf self, + SLpermille dopplerFactor + ); + SLresult (*GetDopplerFactor) ( + SL3DDopplerItf self, + SLpermille *pDopplerFactor + ); +}; + +/*---------------------------------------------------------------------------*/ +/* 3D Source Interface and associated defines */ +/* --------------------------------------------------------------------------*/ + +#define SL_ROLLOFFMODEL_EXPONENTIAL ((SLuint32) 0x00000000) +#define SL_ROLLOFFMODEL_LINEAR ((SLuint32) 0x00000001) + + +extern const SLInterfaceID SL_IID_3DSOURCE; + +struct SL3DSourceItf_; +typedef const struct SL3DSourceItf_ * const * SL3DSourceItf; + +struct SL3DSourceItf_ { + SLresult (*SetHeadRelative) ( + SL3DSourceItf self, + SLboolean headRelative + ); + SLresult (*GetHeadRelative) ( + SL3DSourceItf self, + SLboolean *pHeadRelative + ); + SLresult (*SetRolloffDistances) ( + SL3DSourceItf self, + SLmillimeter minDistance, + SLmillimeter maxDistance + ); + SLresult (*GetRolloffDistances) ( + SL3DSourceItf self, + SLmillimeter *pMinDistance, + SLmillimeter *pMaxDistance + ); + SLresult (*SetRolloffMaxDistanceMute) ( + SL3DSourceItf self, + SLboolean mute + ); + SLresult (*GetRolloffMaxDistanceMute) ( + SL3DSourceItf self, + SLboolean *pMute + ); + SLresult (*SetRolloffFactor) ( + SL3DSourceItf self, + SLpermille rolloffFactor + ); + SLresult (*GetRolloffFactor) ( + SL3DSourceItf self, + SLpermille *pRolloffFactor + ); + SLresult (*SetRoomRolloffFactor) ( + SL3DSourceItf self, + SLpermille roomRolloffFactor + ); + SLresult (*GetRoomRolloffFactor) ( + SL3DSourceItf self, + SLpermille *pRoomRolloffFactor + ); + SLresult (*SetRolloffModel) ( + SL3DSourceItf self, + SLuint8 model + ); + SLresult (*GetRolloffModel) ( + SL3DSourceItf self, + SLuint8 *pModel + ); + SLresult (*SetCone) ( + SL3DSourceItf self, + SLmillidegree innerAngle, + SLmillidegree outerAngle, + SLmillibel outerLevel + ); + SLresult (*GetCone) ( + SL3DSourceItf self, + SLmillidegree *pInnerAngle, + SLmillidegree *pOuterAngle, + SLmillibel *pOuterLevel + ); +}; + +/*---------------------------------------------------------------------------*/ +/* 3D Macroscopic Interface */ +/* --------------------------------------------------------------------------*/ + +extern const SLInterfaceID SL_IID_3DMACROSCOPIC; + +struct SL3DMacroscopicItf_; +typedef const struct SL3DMacroscopicItf_ * const * SL3DMacroscopicItf; + +struct SL3DMacroscopicItf_ { + SLresult (*SetSize) ( + SL3DMacroscopicItf self, + SLmillimeter width, + SLmillimeter height, + SLmillimeter depth + ); + SLresult (*GetSize) ( + SL3DMacroscopicItf self, + SLmillimeter *pWidth, + SLmillimeter *pHeight, + SLmillimeter *pDepth + ); + SLresult (*SetOrientationAngles) ( + SL3DMacroscopicItf self, + SLmillidegree heading, + SLmillidegree pitch, + SLmillidegree roll + ); + SLresult (*SetOrientationVectors) ( + SL3DMacroscopicItf self, + const SLVec3D *pFront, + const SLVec3D *pAbove + ); + SLresult (*Rotate) ( + SL3DMacroscopicItf self, + SLmillidegree theta, + const SLVec3D *pAxis + ); + SLresult (*GetOrientationVectors) ( + SL3DMacroscopicItf self, + SLVec3D *pFront, + SLVec3D *pUp + ); +}; + +/*---------------------------------------------------------------------------*/ +/* Mute Solo Interface */ +/* --------------------------------------------------------------------------*/ + + +extern const SLInterfaceID SL_IID_MUTESOLO; + +struct SLMuteSoloItf_; +typedef const struct SLMuteSoloItf_ * const * SLMuteSoloItf; + +struct SLMuteSoloItf_ { + SLresult (*SetChannelMute) ( + SLMuteSoloItf self, + SLuint8 chan, + SLboolean mute + ); + SLresult (*GetChannelMute) ( + SLMuteSoloItf self, + SLuint8 chan, + SLboolean *pMute + ); + SLresult (*SetChannelSolo) ( + SLMuteSoloItf self, + SLuint8 chan, + SLboolean solo + ); + SLresult (*GetChannelSolo) ( + SLMuteSoloItf self, + SLuint8 chan, + SLboolean *pSolo + ); + SLresult (*GetNumChannels) ( + SLMuteSoloItf self, + SLuint8 *pNumChannels + ); +}; + + +/*---------------------------------------------------------------------------*/ +/* Dynamic Interface Management Interface and associated types and macros */ +/* --------------------------------------------------------------------------*/ + +#define SL_DYNAMIC_ITF_EVENT_RUNTIME_ERROR ((SLuint32) 0x00000001) +#define SL_DYNAMIC_ITF_EVENT_ASYNC_TERMINATION ((SLuint32) 0x00000002) +#define SL_DYNAMIC_ITF_EVENT_RESOURCES_LOST ((SLuint32) 0x00000003) +#define SL_DYNAMIC_ITF_EVENT_RESOURCES_LOST_PERMANENTLY ((SLuint32) 0x00000004) +#define SL_DYNAMIC_ITF_EVENT_RESOURCES_AVAILABLE ((SLuint32) 0x00000005) + + + + +extern const SLInterfaceID SL_IID_DYNAMICINTERFACEMANAGEMENT; + +struct SLDynamicInterfaceManagementItf_; +typedef const struct SLDynamicInterfaceManagementItf_ * const * SLDynamicInterfaceManagementItf; + +typedef void (SLAPIENTRY *slDynamicInterfaceManagementCallback) ( + SLDynamicInterfaceManagementItf caller, + void * pContext, + SLuint32 event, + SLresult result, + const SLInterfaceID iid +); + + +struct SLDynamicInterfaceManagementItf_ { + SLresult (*AddInterface) ( + SLDynamicInterfaceManagementItf self, + const SLInterfaceID iid, + SLboolean async + ); + SLresult (*RemoveInterface) ( + SLDynamicInterfaceManagementItf self, + const SLInterfaceID iid + ); + SLresult (*ResumeInterface) ( + SLDynamicInterfaceManagementItf self, + const SLInterfaceID iid, + SLboolean async + ); + SLresult (*RegisterCallback) ( + SLDynamicInterfaceManagementItf self, + slDynamicInterfaceManagementCallback callback, + void * pContext + ); +}; + +/*---------------------------------------------------------------------------*/ +/* Midi Message Interface and associated types */ +/* --------------------------------------------------------------------------*/ + +#define SL_MIDIMESSAGETYPE_NOTE_ON_OFF ((SLuint32) 0x00000001) +#define SL_MIDIMESSAGETYPE_POLY_PRESSURE ((SLuint32) 0x00000002) +#define SL_MIDIMESSAGETYPE_CONTROL_CHANGE ((SLuint32) 0x00000003) +#define SL_MIDIMESSAGETYPE_PROGRAM_CHANGE ((SLuint32) 0x00000004) +#define SL_MIDIMESSAGETYPE_CHANNEL_PRESSURE ((SLuint32) 0x00000005) +#define SL_MIDIMESSAGETYPE_PITCH_BEND ((SLuint32) 0x00000006) +#define SL_MIDIMESSAGETYPE_SYSTEM_MESSAGE ((SLuint32) 0x00000007) + + +extern const SLInterfaceID SL_IID_MIDIMESSAGE; + +struct SLMIDIMessageItf_; +typedef const struct SLMIDIMessageItf_ * const * SLMIDIMessageItf; + +typedef void (SLAPIENTRY *slMetaEventCallback) ( + SLMIDIMessageItf caller, + void *pContext, + SLuint8 type, + SLuint32 length, + const SLuint8 *pData, + SLuint32 tick, + SLuint16 track +); + +typedef void (SLAPIENTRY *slMIDIMessageCallback) ( + SLMIDIMessageItf caller, + void *pContext, + SLuint8 statusByte, + SLuint32 length, + const SLuint8 *pData, + SLuint32 tick, + SLuint16 track +); + +struct SLMIDIMessageItf_ { + SLresult (*SendMessage) ( + SLMIDIMessageItf self, + const SLuint8 *data, + SLuint32 length + ); + SLresult (*RegisterMetaEventCallback) ( + SLMIDIMessageItf self, + slMetaEventCallback callback, + void *pContext + ); + SLresult (*RegisterMIDIMessageCallback) ( + SLMIDIMessageItf self, + slMIDIMessageCallback callback, + void *pContext + ); + SLresult (*AddMIDIMessageCallbackFilter) ( + SLMIDIMessageItf self, + SLuint32 messageType + ); + SLresult (*ClearMIDIMessageCallbackFilter) ( + SLMIDIMessageItf self + ); +}; + + +/*---------------------------------------------------------------------------*/ +/* Midi Mute Solo interface */ +/* --------------------------------------------------------------------------*/ + + +extern const SLInterfaceID SL_IID_MIDIMUTESOLO; + +struct SLMIDIMuteSoloItf_; +typedef const struct SLMIDIMuteSoloItf_ * const * SLMIDIMuteSoloItf; + +struct SLMIDIMuteSoloItf_ { + SLresult (*SetChannelMute) ( + SLMIDIMuteSoloItf self, + SLuint8 channel, + SLboolean mute + ); + SLresult (*GetChannelMute) ( + SLMIDIMuteSoloItf self, + SLuint8 channel, + SLboolean *pMute + ); + SLresult (*SetChannelSolo) ( + SLMIDIMuteSoloItf self, + SLuint8 channel, + SLboolean solo + ); + SLresult (*GetChannelSolo) ( + SLMIDIMuteSoloItf self, + SLuint8 channel, + SLboolean *pSolo + ); + SLresult (*GetTrackCount) ( + SLMIDIMuteSoloItf self, + SLuint16 *pCount + ); + SLresult (*SetTrackMute) ( + SLMIDIMuteSoloItf self, + SLuint16 track, + SLboolean mute + ); + SLresult (*GetTrackMute) ( + SLMIDIMuteSoloItf self, + SLuint16 track, + SLboolean *pMute + ); + SLresult (*SetTrackSolo) ( + SLMIDIMuteSoloItf self, + SLuint16 track, + SLboolean solo + ); + SLresult (*GetTrackSolo) ( + SLMIDIMuteSoloItf self, + SLuint16 track, + SLboolean *pSolo + ); +}; + + +/*---------------------------------------------------------------------------*/ +/* Midi Tempo interface */ +/* --------------------------------------------------------------------------*/ + + +extern const SLInterfaceID SL_IID_MIDITEMPO; + +struct SLMIDITempoItf_; +typedef const struct SLMIDITempoItf_ * const * SLMIDITempoItf; + +struct SLMIDITempoItf_ { + SLresult (*SetTicksPerQuarterNote) ( + SLMIDITempoItf self, + SLuint32 tpqn + ); + SLresult (*GetTicksPerQuarterNote) ( + SLMIDITempoItf self, + SLuint32 *pTpqn + ); + SLresult (*SetMicrosecondsPerQuarterNote) ( + SLMIDITempoItf self, + SLmicrosecond uspqn + ); + SLresult (*GetMicrosecondsPerQuarterNote) ( + SLMIDITempoItf self, + SLmicrosecond *uspqn + ); +}; + + +/*---------------------------------------------------------------------------*/ +/* Midi Time interface */ +/* --------------------------------------------------------------------------*/ + + +extern const SLInterfaceID SL_IID_MIDITIME; + +struct SLMIDITimeItf_; +typedef const struct SLMIDITimeItf_ * const * SLMIDITimeItf; + +struct SLMIDITimeItf_ { + SLresult (*GetDuration) ( + SLMIDITimeItf self, + SLuint32 *pDuration + ); + SLresult (*SetPosition) ( + SLMIDITimeItf self, + SLuint32 position + ); + SLresult (*GetPosition) ( + SLMIDITimeItf self, + SLuint32 *pPosition + ); + SLresult (*SetLoopPoints) ( + SLMIDITimeItf self, + SLuint32 startTick, + SLuint32 numTicks + ); + SLresult (*GetLoopPoints) ( + SLMIDITimeItf self, + SLuint32 *pStartTick, + SLuint32 *pNumTicks + ); +}; + + +/*---------------------------------------------------------------------------*/ +/* Audio Decoder Capabilities Interface */ +/* --------------------------------------------------------------------------*/ + +/*Audio Codec related defines*/ + +#define SL_RATECONTROLMODE_CONSTANTBITRATE ((SLuint32) 0x00000001) +#define SL_RATECONTROLMODE_VARIABLEBITRATE ((SLuint32) 0x00000002) + +#define SL_AUDIOCODEC_PCM ((SLuint32) 0x00000001) +#define SL_AUDIOCODEC_MP3 ((SLuint32) 0x00000002) +#define SL_AUDIOCODEC_AMR ((SLuint32) 0x00000003) +#define SL_AUDIOCODEC_AMRWB ((SLuint32) 0x00000004) +#define SL_AUDIOCODEC_AMRWBPLUS ((SLuint32) 0x00000005) +#define SL_AUDIOCODEC_AAC ((SLuint32) 0x00000006) +#define SL_AUDIOCODEC_WMA ((SLuint32) 0x00000007) +#define SL_AUDIOCODEC_REAL ((SLuint32) 0x00000008) + +#define SL_AUDIOPROFILE_PCM ((SLuint32) 0x00000001) + +#define SL_AUDIOPROFILE_MPEG1_L3 ((SLuint32) 0x00000001) +#define SL_AUDIOPROFILE_MPEG2_L3 ((SLuint32) 0x00000002) +#define SL_AUDIOPROFILE_MPEG25_L3 ((SLuint32) 0x00000003) + +#define SL_AUDIOCHANMODE_MP3_MONO ((SLuint32) 0x00000001) +#define SL_AUDIOCHANMODE_MP3_STEREO ((SLuint32) 0x00000002) +#define SL_AUDIOCHANMODE_MP3_JOINTSTEREO ((SLuint32) 0x00000003) +#define SL_AUDIOCHANMODE_MP3_DUAL ((SLuint32) 0x00000004) + +#define SL_AUDIOPROFILE_AMR ((SLuint32) 0x00000001) + +#define SL_AUDIOSTREAMFORMAT_CONFORMANCE ((SLuint32) 0x00000001) +#define SL_AUDIOSTREAMFORMAT_IF1 ((SLuint32) 0x00000002) +#define SL_AUDIOSTREAMFORMAT_IF2 ((SLuint32) 0x00000003) +#define SL_AUDIOSTREAMFORMAT_FSF ((SLuint32) 0x00000004) +#define SL_AUDIOSTREAMFORMAT_RTPPAYLOAD ((SLuint32) 0x00000005) +#define SL_AUDIOSTREAMFORMAT_ITU ((SLuint32) 0x00000006) + +#define SL_AUDIOPROFILE_AMRWB ((SLuint32) 0x00000001) + +#define SL_AUDIOPROFILE_AMRWBPLUS ((SLuint32) 0x00000001) + +#define SL_AUDIOPROFILE_AAC_AAC ((SLuint32) 0x00000001) + +#define SL_AUDIOMODE_AAC_MAIN ((SLuint32) 0x00000001) +#define SL_AUDIOMODE_AAC_LC ((SLuint32) 0x00000002) +#define SL_AUDIOMODE_AAC_SSR ((SLuint32) 0x00000003) +#define SL_AUDIOMODE_AAC_LTP ((SLuint32) 0x00000004) +#define SL_AUDIOMODE_AAC_HE ((SLuint32) 0x00000005) +#define SL_AUDIOMODE_AAC_SCALABLE ((SLuint32) 0x00000006) +#define SL_AUDIOMODE_AAC_ERLC ((SLuint32) 0x00000007) +#define SL_AUDIOMODE_AAC_LD ((SLuint32) 0x00000008) +#define SL_AUDIOMODE_AAC_HE_PS ((SLuint32) 0x00000009) +#define SL_AUDIOMODE_AAC_HE_MPS ((SLuint32) 0x0000000A) + +#define SL_AUDIOSTREAMFORMAT_MP2ADTS ((SLuint32) 0x00000001) +#define SL_AUDIOSTREAMFORMAT_MP4ADTS ((SLuint32) 0x00000002) +#define SL_AUDIOSTREAMFORMAT_MP4LOAS ((SLuint32) 0x00000003) +#define SL_AUDIOSTREAMFORMAT_MP4LATM ((SLuint32) 0x00000004) +#define SL_AUDIOSTREAMFORMAT_ADIF ((SLuint32) 0x00000005) +#define SL_AUDIOSTREAMFORMAT_MP4FF ((SLuint32) 0x00000006) +#define SL_AUDIOSTREAMFORMAT_RAW ((SLuint32) 0x00000007) + +#define SL_AUDIOPROFILE_WMA7 ((SLuint32) 0x00000001) +#define SL_AUDIOPROFILE_WMA8 ((SLuint32) 0x00000002) +#define SL_AUDIOPROFILE_WMA9 ((SLuint32) 0x00000003) +#define SL_AUDIOPROFILE_WMA10 ((SLuint32) 0x00000004) + +#define SL_AUDIOMODE_WMA_LEVEL1 ((SLuint32) 0x00000001) +#define SL_AUDIOMODE_WMA_LEVEL2 ((SLuint32) 0x00000002) +#define SL_AUDIOMODE_WMA_LEVEL3 ((SLuint32) 0x00000003) +#define SL_AUDIOMODE_WMA_LEVEL4 ((SLuint32) 0x00000004) +#define SL_AUDIOMODE_WMAPRO_LEVELM0 ((SLuint32) 0x00000005) +#define SL_AUDIOMODE_WMAPRO_LEVELM1 ((SLuint32) 0x00000006) +#define SL_AUDIOMODE_WMAPRO_LEVELM2 ((SLuint32) 0x00000007) +#define SL_AUDIOMODE_WMAPRO_LEVELM3 ((SLuint32) 0x00000008) + +#define SL_AUDIOPROFILE_REALAUDIO ((SLuint32) 0x00000001) + +#define SL_AUDIOMODE_REALAUDIO_G2 ((SLuint32) 0x00000001) +#define SL_AUDIOMODE_REALAUDIO_8 ((SLuint32) 0x00000002) +#define SL_AUDIOMODE_REALAUDIO_10 ((SLuint32) 0x00000003) +#define SL_AUDIOMODE_REALAUDIO_SURROUND ((SLuint32) 0x00000004) + +typedef struct SLAudioCodecDescriptor_ { + SLuint32 maxChannels; + SLuint32 minBitsPerSample; + SLuint32 maxBitsPerSample; + SLmilliHertz minSampleRate; + SLmilliHertz maxSampleRate; + SLboolean isFreqRangeContinuous; + SLmilliHertz *pSampleRatesSupported; + SLuint32 numSampleRatesSupported; + SLuint32 minBitRate; + SLuint32 maxBitRate; + SLboolean isBitrateRangeContinuous; + SLuint32 *pBitratesSupported; + SLuint32 numBitratesSupported; + SLuint32 profileSetting; + SLuint32 modeSetting; +} SLAudioCodecDescriptor; + +/*Structure used to retrieve the profile and level settings supported by an audio encoder */ + +typedef struct SLAudioCodecProfileMode_ { + SLuint32 profileSetting; + SLuint32 modeSetting; +} SLAudioCodecProfileMode; + +extern const SLInterfaceID SL_IID_AUDIODECODERCAPABILITIES; + +struct SLAudioDecoderCapabilitiesItf_; +typedef const struct SLAudioDecoderCapabilitiesItf_ * const * SLAudioDecoderCapabilitiesItf; + +struct SLAudioDecoderCapabilitiesItf_ { + SLresult (*GetAudioDecoders) ( + SLAudioDecoderCapabilitiesItf self, + SLuint32 * pNumDecoders , + SLuint32 *pDecoderIds + ); + SLresult (*GetAudioDecoderCapabilities) ( + SLAudioDecoderCapabilitiesItf self, + SLuint32 decoderId, + SLuint32 *pIndex, + SLAudioCodecDescriptor *pDescriptor + ); +}; + + + + +/*---------------------------------------------------------------------------*/ +/* Audio Encoder Capabilities Interface */ +/* --------------------------------------------------------------------------*/ + +/* Structure used when setting audio encoding parameters */ + +typedef struct SLAudioEncoderSettings_ { + SLuint32 encoderId; + SLuint32 channelsIn; + SLuint32 channelsOut; + SLmilliHertz sampleRate; + SLuint32 bitRate; + SLuint32 bitsPerSample; + SLuint32 rateControl; + SLuint32 profileSetting; + SLuint32 levelSetting; + SLuint32 channelMode; + SLuint32 streamFormat; + SLuint32 encodeOptions; + SLuint32 blockAlignment; +} SLAudioEncoderSettings; + +extern const SLInterfaceID SL_IID_AUDIOENCODERCAPABILITIES; + +struct SLAudioEncoderCapabilitiesItf_; +typedef const struct SLAudioEncoderCapabilitiesItf_ * const * SLAudioEncoderCapabilitiesItf; + +struct SLAudioEncoderCapabilitiesItf_ { + SLresult (*GetAudioEncoders) ( + SLAudioEncoderCapabilitiesItf self, + SLuint32 *pNumEncoders , + SLuint32 *pEncoderIds + ); + SLresult (*GetAudioEncoderCapabilities) ( + SLAudioEncoderCapabilitiesItf self, + SLuint32 encoderId, + SLuint32 *pIndex, + SLAudioCodecDescriptor * pDescriptor + ); +}; + + +/*---------------------------------------------------------------------------*/ +/* Audio Encoder Interface */ +/* --------------------------------------------------------------------------*/ + + +extern const SLInterfaceID SL_IID_AUDIOENCODER; + +struct SLAudioEncoderItf_; +typedef const struct SLAudioEncoderItf_ * const * SLAudioEncoderItf; + +struct SLAudioEncoderItf_ { + SLresult (*SetEncoderSettings) ( + SLAudioEncoderItf self, + SLAudioEncoderSettings *pSettings + ); + SLresult (*GetEncoderSettings) ( + SLAudioEncoderItf self, + SLAudioEncoderSettings *pSettings + ); +}; + + +/*---------------------------------------------------------------------------*/ +/* Bass Boost Interface */ +/* --------------------------------------------------------------------------*/ + + +extern const SLInterfaceID SL_IID_BASSBOOST; + +struct SLBassBoostItf_; +typedef const struct SLBassBoostItf_ * const * SLBassBoostItf; + +struct SLBassBoostItf_ { + SLresult (*SetEnabled)( + SLBassBoostItf self, + SLboolean enabled + ); + SLresult (*IsEnabled)( + SLBassBoostItf self, + SLboolean *pEnabled + ); + SLresult (*SetStrength)( + SLBassBoostItf self, + SLpermille strength + ); + SLresult (*GetRoundedStrength)( + SLBassBoostItf self, + SLpermille *pStrength + ); + SLresult (*IsStrengthSupported)( + SLBassBoostItf self, + SLboolean *pSupported + ); +}; + +/*---------------------------------------------------------------------------*/ +/* Pitch Interface */ +/* --------------------------------------------------------------------------*/ + + +extern const SLInterfaceID SL_IID_PITCH; + +struct SLPitchItf_; +typedef const struct SLPitchItf_ * const * SLPitchItf; + +struct SLPitchItf_ { + SLresult (*SetPitch) ( + SLPitchItf self, + SLpermille pitch + ); + SLresult (*GetPitch) ( + SLPitchItf self, + SLpermille *pPitch + ); + SLresult (*GetPitchCapabilities) ( + SLPitchItf self, + SLpermille *pMinPitch, + SLpermille *pMaxPitch + ); +}; + + +/*---------------------------------------------------------------------------*/ +/* Rate Pitch Interface */ +/* RatePitchItf is an interface for controlling the rate a sound is played */ +/* back. A change in rate will cause a change in pitch. */ +/* --------------------------------------------------------------------------*/ + + +extern const SLInterfaceID SL_IID_RATEPITCH; + +struct SLRatePitchItf_; +typedef const struct SLRatePitchItf_ * const * SLRatePitchItf; + +struct SLRatePitchItf_ { + SLresult (*SetRate) ( + SLRatePitchItf self, + SLpermille rate + ); + SLresult (*GetRate) ( + SLRatePitchItf self, + SLpermille *pRate + ); + SLresult (*GetRatePitchCapabilities) ( + SLRatePitchItf self, + SLpermille *pMinRate, + SLpermille *pMaxRate + ); +}; + + +/*---------------------------------------------------------------------------*/ +/* Virtualizer Interface */ +/* --------------------------------------------------------------------------*/ + + +extern const SLInterfaceID SL_IID_VIRTUALIZER; + +struct SLVirtualizerItf_; +typedef const struct SLVirtualizerItf_ * const * SLVirtualizerItf; + +struct SLVirtualizerItf_ { + SLresult (*SetEnabled)( + SLVirtualizerItf self, + SLboolean enabled + ); + SLresult (*IsEnabled)( + SLVirtualizerItf self, + SLboolean *pEnabled + ); + SLresult (*SetStrength)( + SLVirtualizerItf self, + SLpermille strength + ); + SLresult (*GetRoundedStrength)( + SLVirtualizerItf self, + SLpermille *pStrength + ); + SLresult (*IsStrengthSupported)( + SLVirtualizerItf self, + SLboolean *pSupported + ); +}; + +/*---------------------------------------------------------------------------*/ +/* Visualization Interface */ +/* --------------------------------------------------------------------------*/ + + +extern const SLInterfaceID SL_IID_VISUALIZATION; + +struct SLVisualizationItf_; +typedef const struct SLVisualizationItf_ * const * SLVisualizationItf; + +typedef void (SLAPIENTRY *slVisualizationCallback) ( + void *pContext, + const SLuint8 waveform[], + const SLuint8 fft[], + SLmilliHertz samplerate +); + +struct SLVisualizationItf_{ + SLresult (*RegisterVisualizationCallback)( + SLVisualizationItf self, + slVisualizationCallback callback, + void *pContext, + SLmilliHertz rate + ); + SLresult (*GetMaxRate)( + SLVisualizationItf self, + SLmilliHertz* pRate + ); +}; + + +/*---------------------------------------------------------------------------*/ +/* Engine Interface */ +/* --------------------------------------------------------------------------*/ + + +extern const SLInterfaceID SL_IID_ENGINE; + +struct SLEngineItf_; +typedef const struct SLEngineItf_ * const * SLEngineItf; + + +struct SLEngineItf_ { + + SLresult (*CreateLEDDevice) ( + SLEngineItf self, + SLObjectItf * pDevice, + SLuint32 deviceID, + SLuint32 numInterfaces, + const SLInterfaceID * pInterfaceIds, + const SLboolean * pInterfaceRequired + ); + SLresult (*CreateVibraDevice) ( + SLEngineItf self, + SLObjectItf * pDevice, + SLuint32 deviceID, + SLuint32 numInterfaces, + const SLInterfaceID * pInterfaceIds, + const SLboolean * pInterfaceRequired + ); + SLresult (*CreateAudioPlayer) ( + SLEngineItf self, + SLObjectItf * pPlayer, + SLDataSource *pAudioSrc, + SLDataSink *pAudioSnk, + SLuint32 numInterfaces, + const SLInterfaceID * pInterfaceIds, + const SLboolean * pInterfaceRequired + ); + SLresult (*CreateAudioRecorder) ( + SLEngineItf self, + SLObjectItf * pRecorder, + SLDataSource *pAudioSrc, + SLDataSink *pAudioSnk, + SLuint32 numInterfaces, + const SLInterfaceID * pInterfaceIds, + const SLboolean * pInterfaceRequired + ); + SLresult (*CreateMidiPlayer) ( + SLEngineItf self, + SLObjectItf * pPlayer, + SLDataSource *pMIDISrc, + SLDataSource *pBankSrc, + SLDataSink *pAudioOutput, + SLDataSink *pVibra, + SLDataSink *pLEDArray, + SLuint32 numInterfaces, + const SLInterfaceID * pInterfaceIds, + const SLboolean * pInterfaceRequired + ); + SLresult (*CreateListener) ( + SLEngineItf self, + SLObjectItf * pListener, + SLuint32 numInterfaces, + const SLInterfaceID * pInterfaceIds, + const SLboolean * pInterfaceRequired + ); + SLresult (*Create3DGroup) ( + SLEngineItf self, + SLObjectItf * pGroup, + SLuint32 numInterfaces, + const SLInterfaceID * pInterfaceIds, + const SLboolean * pInterfaceRequired + ); + SLresult (*CreateOutputMix) ( + SLEngineItf self, + SLObjectItf * pMix, + SLuint32 numInterfaces, + const SLInterfaceID * pInterfaceIds, + const SLboolean * pInterfaceRequired + ); + SLresult (*CreateMetadataExtractor) ( + SLEngineItf self, + SLObjectItf * pMetadataExtractor, + SLDataSource * pDataSource, + SLuint32 numInterfaces, + const SLInterfaceID * pInterfaceIds, + const SLboolean * pInterfaceRequired + ); + SLresult (*CreateExtensionObject) ( + SLEngineItf self, + SLObjectItf * pObject, + void * pParameters, + SLuint32 objectID, + SLuint32 numInterfaces, + const SLInterfaceID * pInterfaceIds, + const SLboolean * pInterfaceRequired + ); + SLresult (*QueryNumSupportedInterfaces) ( + SLEngineItf self, + SLuint32 objectID, + SLuint32 * pNumSupportedInterfaces + ); + SLresult (*QuerySupportedInterfaces) ( + SLEngineItf self, + SLuint32 objectID, + SLuint32 index, + SLInterfaceID * pInterfaceId + ); + SLresult (*QueryNumSupportedExtensions) ( + SLEngineItf self, + SLuint32 * pNumExtensions + ); + SLresult (*QuerySupportedExtension) ( + SLEngineItf self, + SLuint32 index, + SLchar * pExtensionName, + SLint16 * pNameLength + ); + SLresult (*IsExtensionSupported) ( + SLEngineItf self, + const SLchar * pExtensionName, + SLboolean * pSupported + ); +}; + + +/*---------------------------------------------------------------------------*/ +/* Engine Capabilities Interface */ +/* --------------------------------------------------------------------------*/ + + +extern const SLInterfaceID SL_IID_ENGINECAPABILITIES; + +struct SLEngineCapabilitiesItf_; +typedef const struct SLEngineCapabilitiesItf_ * const * SLEngineCapabilitiesItf; + +struct SLEngineCapabilitiesItf_ { + SLresult (*QuerySupportedProfiles) ( + SLEngineCapabilitiesItf self, + SLuint16 *pProfilesSupported + ); + SLresult (*QueryAvailableVoices) ( + SLEngineCapabilitiesItf self, + SLuint16 voiceType, + SLint16 *pNumMaxVoices, + SLboolean *pIsAbsoluteMax, + SLint16 *pNumFreeVoices + ); + SLresult (*QueryNumberOfMIDISynthesizers) ( + SLEngineCapabilitiesItf self, + SLint16 *pNumMIDIsynthesizers + ); + SLresult (*QueryAPIVersion) ( + SLEngineCapabilitiesItf self, + SLint16 *pMajor, + SLint16 *pMinor, + SLint16 *pStep + ); + SLresult (*QueryLEDCapabilities) ( + SLEngineCapabilitiesItf self, + SLuint32 *pIndex, + SLuint32 *pLEDDeviceID, + SLLEDDescriptor *pDescriptor + ); + SLresult (*QueryVibraCapabilities) ( + SLEngineCapabilitiesItf self, + SLuint32 *pIndex, + SLuint32 *pVibraDeviceID, + SLVibraDescriptor *pDescriptor + ); + SLresult (*IsThreadSafe) ( + SLEngineCapabilitiesItf self, + SLboolean *pIsThreadSafe + ); +}; + +/*---------------------------------------------------------------------------*/ +/* Thread Sync Interface */ +/* --------------------------------------------------------------------------*/ + + +extern const SLInterfaceID SL_IID_THREADSYNC; + +struct SLThreadSyncItf_; +typedef const struct SLThreadSyncItf_ * const * SLThreadSyncItf; + + +struct SLThreadSyncItf_ { + SLresult (*EnterCriticalSection) ( + SLThreadSyncItf self + ); + SLresult (*ExitCriticalSection) ( + SLThreadSyncItf self + ); +}; + + +/*****************************************************************************/ +/* SL engine constructor */ +/*****************************************************************************/ + +#define SL_ENGINEOPTION_THREADSAFE ((SLuint32) 0x00000001) +#define SL_ENGINEOPTION_LOSSOFCONTROL ((SLuint32) 0x00000002) + +typedef struct SLEngineOption_ { + SLuint32 feature; + SLuint32 data; +} SLEngineOption; + + +SLresult SLAPIENTRY slCreateEngine( + SLObjectItf *pEngine, + SLuint32 numOptions, + const SLEngineOption *pEngineOptions, + SLuint32 numInterfaces, + const SLInterfaceID *pInterfaceIds, + const SLboolean * pInterfaceRequired +); + +SLresult SLAPIENTRY slQueryNumSupportedEngineInterfaces( + SLuint32 * pNumSupportedInterfaces +); + +SLresult SLAPIENTRY slQuerySupportedEngineInterfaces( + SLuint32 index, + SLInterfaceID * pInterfaceId +); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* OPENSL_ES_H_ */ diff --git a/minecraftcpp-master/handheld/lib/include/SLES/OpenSLES_Platform.h b/minecraftcpp-master/handheld/lib/include/SLES/OpenSLES_Platform.h new file mode 100644 index 0000000..afce98a --- /dev/null +++ b/minecraftcpp-master/handheld/lib/include/SLES/OpenSLES_Platform.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2007-2009 The Khronos Group Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and /or associated documentation files (the "Materials "), to + * deal in the Materials without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Materials, and to permit persons to whom the Materials are + * furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Materials. + * + * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS IN THE + * MATERIALS. + * + * OpenSLES_Platform.h - OpenSL ES version 1.0 + * + */ + +/****************************************************************************/ +/* NOTE: This file contains definitions for the base types and the */ +/* SLAPIENTRY macro. This file **WILL NEED TO BE EDITED** to provide */ +/* the correct definitions specific to the platform being used. */ +/****************************************************************************/ + +#ifndef _OPENSLES_PLATFORM_H_ +#define _OPENSLES_PLATFORM_H_ + +typedef unsigned char sl_uint8_t; +typedef signed char sl_int8_t; +typedef unsigned short sl_uint16_t; +typedef signed short sl_int16_t; +typedef unsigned long sl_uint32_t; +typedef signed long sl_int32_t; + +#ifndef SLAPIENTRY +#define SLAPIENTRY /* override per-platform */ +#endif + +#endif /* _OPENSLES_PLATFORM_H_ */ diff --git a/minecraftcpp-master/handheld/lib/include/png.h b/minecraftcpp-master/handheld/lib/include/png.h new file mode 100644 index 0000000..9fc8cef --- /dev/null +++ b/minecraftcpp-master/handheld/lib/include/png.h @@ -0,0 +1,3687 @@ +/* png.h - header file for PNG reference library + * + * libpng version 1.2.37 - June 4, 2009 + * Copyright (c) 1998-2009 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * Authors and maintainers: + * libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat + * libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger + * libpng versions 0.97, January 1998, through 1.2.37 - June 4, 2009: Glenn + * See also "Contributing Authors", below. + * + * Note about libpng version numbers: + * + * Due to various miscommunications, unforeseen code incompatibilities + * and occasional factors outside the authors' control, version numbering + * on the library has not always been consistent and straightforward. + * The following table summarizes matters since version 0.89c, which was + * the first widely used release: + * + * source png.h png.h shared-lib + * version string int version + * ------- ------ ----- ---------- + * 0.89c "1.0 beta 3" 0.89 89 1.0.89 + * 0.90 "1.0 beta 4" 0.90 90 0.90 [should have been 2.0.90] + * 0.95 "1.0 beta 5" 0.95 95 0.95 [should have been 2.0.95] + * 0.96 "1.0 beta 6" 0.96 96 0.96 [should have been 2.0.96] + * 0.97b "1.00.97 beta 7" 1.00.97 97 1.0.1 [should have been 2.0.97] + * 0.97c 0.97 97 2.0.97 + * 0.98 0.98 98 2.0.98 + * 0.99 0.99 98 2.0.99 + * 0.99a-m 0.99 99 2.0.99 + * 1.00 1.00 100 2.1.0 [100 should be 10000] + * 1.0.0 (from here on, the 100 2.1.0 [100 should be 10000] + * 1.0.1 png.h string is 10001 2.1.0 + * 1.0.1a-e identical to the 10002 from here on, the shared library + * 1.0.2 source version) 10002 is 2.V where V is the source code + * 1.0.2a-b 10003 version, except as noted. + * 1.0.3 10003 + * 1.0.3a-d 10004 + * 1.0.4 10004 + * 1.0.4a-f 10005 + * 1.0.5 (+ 2 patches) 10005 + * 1.0.5a-d 10006 + * 1.0.5e-r 10100 (not source compatible) + * 1.0.5s-v 10006 (not binary compatible) + * 1.0.6 (+ 3 patches) 10006 (still binary incompatible) + * 1.0.6d-f 10007 (still binary incompatible) + * 1.0.6g 10007 + * 1.0.6h 10007 10.6h (testing xy.z so-numbering) + * 1.0.6i 10007 10.6i + * 1.0.6j 10007 2.1.0.6j (incompatible with 1.0.0) + * 1.0.7beta11-14 DLLNUM 10007 2.1.0.7beta11-14 (binary compatible) + * 1.0.7beta15-18 1 10007 2.1.0.7beta15-18 (binary compatible) + * 1.0.7rc1-2 1 10007 2.1.0.7rc1-2 (binary compatible) + * 1.0.7 1 10007 (still compatible) + * 1.0.8beta1-4 1 10008 2.1.0.8beta1-4 + * 1.0.8rc1 1 10008 2.1.0.8rc1 + * 1.0.8 1 10008 2.1.0.8 + * 1.0.9beta1-6 1 10009 2.1.0.9beta1-6 + * 1.0.9rc1 1 10009 2.1.0.9rc1 + * 1.0.9beta7-10 1 10009 2.1.0.9beta7-10 + * 1.0.9rc2 1 10009 2.1.0.9rc2 + * 1.0.9 1 10009 2.1.0.9 + * 1.0.10beta1 1 10010 2.1.0.10beta1 + * 1.0.10rc1 1 10010 2.1.0.10rc1 + * 1.0.10 1 10010 2.1.0.10 + * 1.0.11beta1-3 1 10011 2.1.0.11beta1-3 + * 1.0.11rc1 1 10011 2.1.0.11rc1 + * 1.0.11 1 10011 2.1.0.11 + * 1.0.12beta1-2 2 10012 2.1.0.12beta1-2 + * 1.0.12rc1 2 10012 2.1.0.12rc1 + * 1.0.12 2 10012 2.1.0.12 + * 1.1.0a-f - 10100 2.1.1.0a-f (branch abandoned) + * 1.2.0beta1-2 2 10200 2.1.2.0beta1-2 + * 1.2.0beta3-5 3 10200 3.1.2.0beta3-5 + * 1.2.0rc1 3 10200 3.1.2.0rc1 + * 1.2.0 3 10200 3.1.2.0 + * 1.2.1beta1-4 3 10201 3.1.2.1beta1-4 + * 1.2.1rc1-2 3 10201 3.1.2.1rc1-2 + * 1.2.1 3 10201 3.1.2.1 + * 1.2.2beta1-6 12 10202 12.so.0.1.2.2beta1-6 + * 1.0.13beta1 10 10013 10.so.0.1.0.13beta1 + * 1.0.13rc1 10 10013 10.so.0.1.0.13rc1 + * 1.2.2rc1 12 10202 12.so.0.1.2.2rc1 + * 1.0.13 10 10013 10.so.0.1.0.13 + * 1.2.2 12 10202 12.so.0.1.2.2 + * 1.2.3rc1-6 12 10203 12.so.0.1.2.3rc1-6 + * 1.2.3 12 10203 12.so.0.1.2.3 + * 1.2.4beta1-3 13 10204 12.so.0.1.2.4beta1-3 + * 1.0.14rc1 13 10014 10.so.0.1.0.14rc1 + * 1.2.4rc1 13 10204 12.so.0.1.2.4rc1 + * 1.0.14 10 10014 10.so.0.1.0.14 + * 1.2.4 13 10204 12.so.0.1.2.4 + * 1.2.5beta1-2 13 10205 12.so.0.1.2.5beta1-2 + * 1.0.15rc1-3 10 10015 10.so.0.1.0.15rc1-3 + * 1.2.5rc1-3 13 10205 12.so.0.1.2.5rc1-3 + * 1.0.15 10 10015 10.so.0.1.0.15 + * 1.2.5 13 10205 12.so.0.1.2.5 + * 1.2.6beta1-4 13 10206 12.so.0.1.2.6beta1-4 + * 1.0.16 10 10016 10.so.0.1.0.16 + * 1.2.6 13 10206 12.so.0.1.2.6 + * 1.2.7beta1-2 13 10207 12.so.0.1.2.7beta1-2 + * 1.0.17rc1 10 10017 10.so.0.1.0.17rc1 + * 1.2.7rc1 13 10207 12.so.0.1.2.7rc1 + * 1.0.17 10 10017 10.so.0.1.0.17 + * 1.2.7 13 10207 12.so.0.1.2.7 + * 1.2.8beta1-5 13 10208 12.so.0.1.2.8beta1-5 + * 1.0.18rc1-5 10 10018 10.so.0.1.0.18rc1-5 + * 1.2.8rc1-5 13 10208 12.so.0.1.2.8rc1-5 + * 1.0.18 10 10018 10.so.0.1.0.18 + * 1.2.8 13 10208 12.so.0.1.2.8 + * 1.2.9beta1-3 13 10209 12.so.0.1.2.9beta1-3 + * 1.2.9beta4-11 13 10209 12.so.0.9[.0] + * 1.2.9rc1 13 10209 12.so.0.9[.0] + * 1.2.9 13 10209 12.so.0.9[.0] + * 1.2.10beta1-8 13 10210 12.so.0.10[.0] + * 1.2.10rc1-3 13 10210 12.so.0.10[.0] + * 1.2.10 13 10210 12.so.0.10[.0] + * 1.2.11beta1-4 13 10211 12.so.0.11[.0] + * 1.0.19rc1-5 10 10019 10.so.0.19[.0] + * 1.2.11rc1-5 13 10211 12.so.0.11[.0] + * 1.0.19 10 10019 10.so.0.19[.0] + * 1.2.11 13 10211 12.so.0.11[.0] + * 1.0.20 10 10020 10.so.0.20[.0] + * 1.2.12 13 10212 12.so.0.12[.0] + * 1.2.13beta1 13 10213 12.so.0.13[.0] + * 1.0.21 10 10021 10.so.0.21[.0] + * 1.2.13 13 10213 12.so.0.13[.0] + * 1.2.14beta1-2 13 10214 12.so.0.14[.0] + * 1.0.22rc1 10 10022 10.so.0.22[.0] + * 1.2.14rc1 13 10214 12.so.0.14[.0] + * 1.0.22 10 10022 10.so.0.22[.0] + * 1.2.14 13 10214 12.so.0.14[.0] + * 1.2.15beta1-6 13 10215 12.so.0.15[.0] + * 1.0.23rc1-5 10 10023 10.so.0.23[.0] + * 1.2.15rc1-5 13 10215 12.so.0.15[.0] + * 1.0.23 10 10023 10.so.0.23[.0] + * 1.2.15 13 10215 12.so.0.15[.0] + * 1.2.16beta1-2 13 10216 12.so.0.16[.0] + * 1.2.16rc1 13 10216 12.so.0.16[.0] + * 1.0.24 10 10024 10.so.0.24[.0] + * 1.2.16 13 10216 12.so.0.16[.0] + * 1.2.17beta1-2 13 10217 12.so.0.17[.0] + * 1.0.25rc1 10 10025 10.so.0.25[.0] + * 1.2.17rc1-3 13 10217 12.so.0.17[.0] + * 1.0.25 10 10025 10.so.0.25[.0] + * 1.2.17 13 10217 12.so.0.17[.0] + * 1.0.26 10 10026 10.so.0.26[.0] + * 1.2.18 13 10218 12.so.0.18[.0] + * 1.2.19beta1-31 13 10219 12.so.0.19[.0] + * 1.0.27rc1-6 10 10027 10.so.0.27[.0] + * 1.2.19rc1-6 13 10219 12.so.0.19[.0] + * 1.0.27 10 10027 10.so.0.27[.0] + * 1.2.19 13 10219 12.so.0.19[.0] + * 1.2.20beta01-04 13 10220 12.so.0.20[.0] + * 1.0.28rc1-6 10 10028 10.so.0.28[.0] + * 1.2.20rc1-6 13 10220 12.so.0.20[.0] + * 1.0.28 10 10028 10.so.0.28[.0] + * 1.2.20 13 10220 12.so.0.20[.0] + * 1.2.21beta1-2 13 10221 12.so.0.21[.0] + * 1.2.21rc1-3 13 10221 12.so.0.21[.0] + * 1.0.29 10 10029 10.so.0.29[.0] + * 1.2.21 13 10221 12.so.0.21[.0] + * 1.2.22beta1-4 13 10222 12.so.0.22[.0] + * 1.0.30rc1 10 10030 10.so.0.30[.0] + * 1.2.22rc1 13 10222 12.so.0.22[.0] + * 1.0.30 10 10030 10.so.0.30[.0] + * 1.2.22 13 10222 12.so.0.22[.0] + * 1.2.23beta01-05 13 10223 12.so.0.23[.0] + * 1.2.23rc01 13 10223 12.so.0.23[.0] + * 1.2.23 13 10223 12.so.0.23[.0] + * 1.2.24beta01-02 13 10224 12.so.0.24[.0] + * 1.2.24rc01 13 10224 12.so.0.24[.0] + * 1.2.24 13 10224 12.so.0.24[.0] + * 1.2.25beta01-06 13 10225 12.so.0.25[.0] + * 1.2.25rc01-02 13 10225 12.so.0.25[.0] + * 1.0.31 10 10031 10.so.0.31[.0] + * 1.2.25 13 10225 12.so.0.25[.0] + * 1.2.26beta01-06 13 10226 12.so.0.26[.0] + * 1.2.26rc01 13 10226 12.so.0.26[.0] + * 1.2.26 13 10226 12.so.0.26[.0] + * 1.0.32 10 10032 10.so.0.32[.0] + * 1.2.27beta01-06 13 10227 12.so.0.27[.0] + * 1.2.27rc01 13 10227 12.so.0.27[.0] + * 1.0.33 10 10033 10.so.0.33[.0] + * 1.2.27 13 10227 12.so.0.27[.0] + * 1.0.34 10 10034 10.so.0.34[.0] + * 1.2.28 13 10228 12.so.0.28[.0] + * 1.2.29beta01-03 13 10229 12.so.0.29[.0] + * 1.2.29rc01 13 10229 12.so.0.29[.0] + * 1.0.35 10 10035 10.so.0.35[.0] + * 1.2.29 13 10229 12.so.0.29[.0] + * 1.0.37 10 10037 10.so.0.37[.0] + * 1.2.30beta01-04 13 10230 12.so.0.30[.0] + * 1.0.38rc01-08 10 10038 10.so.0.38[.0] + * 1.2.30rc01-08 13 10230 12.so.0.30[.0] + * 1.0.38 10 10038 10.so.0.38[.0] + * 1.2.30 13 10230 12.so.0.30[.0] + * 1.0.39rc01-03 10 10039 10.so.0.39[.0] + * 1.2.31rc01-03 13 10231 12.so.0.31[.0] + * 1.0.39 10 10039 10.so.0.39[.0] + * 1.2.31 13 10231 12.so.0.31[.0] + * 1.2.32beta01-02 13 10232 12.so.0.32[.0] + * 1.0.40rc01 10 10040 10.so.0.40[.0] + * 1.2.32rc01 13 10232 12.so.0.32[.0] + * 1.0.40 10 10040 10.so.0.40[.0] + * 1.2.32 13 10232 12.so.0.32[.0] + * 1.2.33beta01-02 13 10233 12.so.0.33[.0] + * 1.2.33rc01-02 13 10233 12.so.0.33[.0] + * 1.0.41rc01 10 10041 10.so.0.41[.0] + * 1.2.33 13 10233 12.so.0.33[.0] + * 1.0.41 10 10041 10.so.0.41[.0] + * 1.2.34beta01-07 13 10234 12.so.0.34[.0] + * 1.0.42rc01 10 10042 10.so.0.42[.0] + * 1.2.34rc01 13 10234 12.so.0.34[.0] + * 1.0.42 10 10042 10.so.0.42[.0] + * 1.2.34 13 10234 12.so.0.34[.0] + * 1.2.35beta01-03 13 10235 12.so.0.35[.0] + * 1.0.43rc01-02 10 10043 10.so.0.43[.0] + * 1.2.35rc01-02 13 10235 12.so.0.35[.0] + * 1.0.43 10 10043 10.so.0.43[.0] + * 1.2.35 13 10235 12.so.0.35[.0] + * 1.2.36beta01-05 13 10236 12.so.0.36[.0] + * 1.2.36rc01 13 10236 12.so.0.36[.0] + * 1.0.44 10 10044 10.so.0.44[.0] + * 1.2.36 13 10236 12.so.0.36[.0] + * 1.2.37beta01-03 13 10237 12.so.0.37[.0] + * 1.2.37rc01 13 10237 12.so.0.37[.0] + * 1.2.37 13 10237 12.so.0.37[.0] + * + * Henceforth the source version will match the shared-library major + * and minor numbers; the shared-library major version number will be + * used for changes in backward compatibility, as it is intended. The + * PNG_LIBPNG_VER macro, which is not used within libpng but is available + * for applications, is an unsigned integer of the form xyyzz corresponding + * to the source version x.y.z (leading zeros in y and z). Beta versions + * were given the previous public release number plus a letter, until + * version 1.0.6j; from then on they were given the upcoming public + * release number plus "betaNN" or "rcNN". + * + * Binary incompatibility exists only when applications make direct access + * to the info_ptr or png_ptr members through png.h, and the compiled + * application is loaded with a different version of the library. + * + * DLLNUM will change each time there are forward or backward changes + * in binary compatibility (e.g., when a new feature is added). + * + * See libpng.txt or libpng.3 for more information. The PNG specification + * is available as a W3C Recommendation and as an ISO Specification, + * defines should NOT be changed. + */ +#define PNG_INFO_gAMA 0x0001 +#define PNG_INFO_sBIT 0x0002 +#define PNG_INFO_cHRM 0x0004 +#define PNG_INFO_PLTE 0x0008 +#define PNG_INFO_tRNS 0x0010 +#define PNG_INFO_bKGD 0x0020 +#define PNG_INFO_hIST 0x0040 +#define PNG_INFO_pHYs 0x0080 +#define PNG_INFO_oFFs 0x0100 +#define PNG_INFO_tIME 0x0200 +#define PNG_INFO_pCAL 0x0400 +#define PNG_INFO_sRGB 0x0800 /* GR-P, 0.96a */ +#define PNG_INFO_iCCP 0x1000 /* ESR, 1.0.6 */ +#define PNG_INFO_sPLT 0x2000 /* ESR, 1.0.6 */ +#define PNG_INFO_sCAL 0x4000 /* ESR, 1.0.6 */ +#define PNG_INFO_IDAT 0x8000L /* ESR, 1.0.6 */ + +/* This is used for the transformation routines, as some of them + * change these values for the row. It also should enable using + * the routines for other purposes. + */ +typedef struct png_row_info_struct +{ + png_uint_32 width; /* width of row */ + png_uint_32 rowbytes; /* number of bytes in row */ + png_byte color_type; /* color type of row */ + png_byte bit_depth; /* bit depth of row */ + png_byte channels; /* number of channels (1, 2, 3, or 4) */ + png_byte pixel_depth; /* bits per pixel (depth * channels) */ +} png_row_info; + +typedef png_row_info FAR * png_row_infop; +typedef png_row_info FAR * FAR * png_row_infopp; + +/* These are the function types for the I/O functions and for the functions + * that allow the user to override the default I/O functions with his or her + * own. The png_error_ptr type should match that of user-supplied warning + * and error functions, while the png_rw_ptr type should match that of the + * user read/write data functions. + */ +typedef struct png_struct_def png_struct; +typedef png_struct FAR * png_structp; + +typedef void (PNGAPI *png_error_ptr) PNGARG((png_structp, png_const_charp)); +typedef void (PNGAPI *png_rw_ptr) PNGARG((png_structp, png_bytep, png_size_t)); +typedef void (PNGAPI *png_flush_ptr) PNGARG((png_structp)); +typedef void (PNGAPI *png_read_status_ptr) PNGARG((png_structp, png_uint_32, + int)); +typedef void (PNGAPI *png_write_status_ptr) PNGARG((png_structp, png_uint_32, + int)); + +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +typedef void (PNGAPI *png_progressive_info_ptr) PNGARG((png_structp, png_infop)); +typedef void (PNGAPI *png_progressive_end_ptr) PNGARG((png_structp, png_infop)); +typedef void (PNGAPI *png_progressive_row_ptr) PNGARG((png_structp, png_bytep, + png_uint_32, int)); +#endif + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_LEGACY_SUPPORTED) +typedef void (PNGAPI *png_user_transform_ptr) PNGARG((png_structp, + png_row_infop, png_bytep)); +#endif + +#if defined(PNG_USER_CHUNKS_SUPPORTED) +typedef int (PNGAPI *png_user_chunk_ptr) PNGARG((png_structp, png_unknown_chunkp)); +#endif +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) +typedef void (PNGAPI *png_unknown_chunk_ptr) PNGARG((png_structp)); +#endif + +/* Transform masks for the high-level interface */ +#define PNG_TRANSFORM_IDENTITY 0x0000 /* read and write */ +#define PNG_TRANSFORM_STRIP_16 0x0001 /* read only */ +#define PNG_TRANSFORM_STRIP_ALPHA 0x0002 /* read only */ +#define PNG_TRANSFORM_PACKING 0x0004 /* read and write */ +#define PNG_TRANSFORM_PACKSWAP 0x0008 /* read and write */ +#define PNG_TRANSFORM_EXPAND 0x0010 /* read only */ +#define PNG_TRANSFORM_INVERT_MONO 0x0020 /* read and write */ +#define PNG_TRANSFORM_SHIFT 0x0040 /* read and write */ +#define PNG_TRANSFORM_BGR 0x0080 /* read and write */ +#define PNG_TRANSFORM_SWAP_ALPHA 0x0100 /* read and write */ +#define PNG_TRANSFORM_SWAP_ENDIAN 0x0200 /* read and write */ +#define PNG_TRANSFORM_INVERT_ALPHA 0x0400 /* read and write */ +#define PNG_TRANSFORM_STRIP_FILLER 0x0800 /* WRITE only, deprecated */ +/* Added to libpng-1.2.34 */ +#define PNG_TRANSFORM_STRIP_FILLER_BEFORE 0x0800 /* WRITE only */ +#define PNG_TRANSFORM_STRIP_FILLER_AFTER 0x1000 /* WRITE only */ + +/* Flags for MNG supported features */ +#define PNG_FLAG_MNG_EMPTY_PLTE 0x01 +#define PNG_FLAG_MNG_FILTER_64 0x04 +#define PNG_ALL_MNG_FEATURES 0x05 + +typedef png_voidp (*png_malloc_ptr) PNGARG((png_structp, png_size_t)); +typedef void (*png_free_ptr) PNGARG((png_structp, png_voidp)); + +/* The structure that holds the information to read and write PNG files. + * The only people who need to care about what is inside of this are the + * people who will be modifying the library for their own special needs. + * It should NOT be accessed directly by an application, except to store + * the jmp_buf. + */ + +struct png_struct_def +{ +#ifdef PNG_SETJMP_SUPPORTED + jmp_buf jmpbuf; /* used in png_error */ +#endif + png_error_ptr error_fn; /* function for printing errors and aborting */ + png_error_ptr warning_fn; /* function for printing warnings */ + png_voidp error_ptr; /* user supplied struct for error functions */ + png_rw_ptr write_data_fn; /* function for writing output data */ + png_rw_ptr read_data_fn; /* function for reading input data */ + png_voidp io_ptr; /* ptr to application struct for I/O functions */ + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) + png_user_transform_ptr read_user_transform_fn; /* user read transform */ +#endif + +#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) + png_user_transform_ptr write_user_transform_fn; /* user write transform */ +#endif + +/* These were added in libpng-1.0.2 */ +#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) + png_voidp user_transform_ptr; /* user supplied struct for user transform */ + png_byte user_transform_depth; /* bit depth of user transformed pixels */ + png_byte user_transform_channels; /* channels in user transformed pixels */ +#endif +#endif + + png_uint_32 mode; /* tells us where we are in the PNG file */ + png_uint_32 flags; /* flags indicating various things to libpng */ + png_uint_32 transformations; /* which transformations to perform */ + + z_stream zstream; /* pointer to decompression structure (below) */ + png_bytep zbuf; /* buffer for zlib */ + png_size_t zbuf_size; /* size of zbuf */ + int zlib_level; /* holds zlib compression level */ + int zlib_method; /* holds zlib compression method */ + int zlib_window_bits; /* holds zlib compression window bits */ + int zlib_mem_level; /* holds zlib compression memory level */ + int zlib_strategy; /* holds zlib compression strategy */ + + png_uint_32 width; /* width of image in pixels */ + png_uint_32 height; /* height of image in pixels */ + png_uint_32 num_rows; /* number of rows in current pass */ + png_uint_32 usr_width; /* width of row at start of write */ + png_uint_32 rowbytes; /* size of row in bytes */ + png_uint_32 irowbytes; /* size of current interlaced row in bytes */ + png_uint_32 iwidth; /* width of current interlaced row in pixels */ + png_uint_32 row_number; /* current row in interlace pass */ + png_bytep prev_row; /* buffer to save previous (unfiltered) row */ + png_bytep row_buf; /* buffer to save current (unfiltered) row */ +#ifndef PNG_NO_WRITE_FILTER + png_bytep sub_row; /* buffer to save "sub" row when filtering */ + png_bytep up_row; /* buffer to save "up" row when filtering */ + png_bytep avg_row; /* buffer to save "avg" row when filtering */ + png_bytep paeth_row; /* buffer to save "Paeth" row when filtering */ +#endif + png_row_info row_info; /* used for transformation routines */ + + png_uint_32 idat_size; /* current IDAT size for read */ + png_uint_32 crc; /* current chunk CRC value */ + png_colorp palette; /* palette from the input file */ + png_uint_16 num_palette; /* number of color entries in palette */ + png_uint_16 num_trans; /* number of transparency values */ + png_byte chunk_name[5]; /* null-terminated name of current chunk */ + png_byte compression; /* file compression type (always 0) */ + png_byte filter; /* file filter type (always 0) */ + png_byte interlaced; /* PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */ + png_byte pass; /* current interlace pass (0 - 6) */ + png_byte do_filter; /* row filter flags (see PNG_FILTER_ below ) */ + png_byte color_type; /* color type of file */ + png_byte bit_depth; /* bit depth of file */ + png_byte usr_bit_depth; /* bit depth of users row */ + png_byte pixel_depth; /* number of bits per pixel */ + png_byte channels; /* number of channels in file */ + png_byte usr_channels; /* channels at start of write */ + png_byte sig_bytes; /* magic bytes read/written from start of file */ + +#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) +#ifdef PNG_LEGACY_SUPPORTED + png_byte filler; /* filler byte for pixel expansion */ +#else + png_uint_16 filler; /* filler bytes for pixel expansion */ +#endif +#endif + +#if defined(PNG_bKGD_SUPPORTED) + png_byte background_gamma_type; +# ifdef PNG_FLOATING_POINT_SUPPORTED + float background_gamma; +# endif + png_color_16 background; /* background color in screen gamma space */ +#if defined(PNG_READ_GAMMA_SUPPORTED) + png_color_16 background_1; /* background normalized to gamma 1.0 */ +#endif +#endif /* PNG_bKGD_SUPPORTED */ + +#if defined(PNG_WRITE_FLUSH_SUPPORTED) + png_flush_ptr output_flush_fn;/* Function for flushing output */ + png_uint_32 flush_dist; /* how many rows apart to flush, 0 - no flush */ + png_uint_32 flush_rows; /* number of rows written since last flush */ +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + int gamma_shift; /* number of "insignificant" bits 16-bit gamma */ +#ifdef PNG_FLOATING_POINT_SUPPORTED + float gamma; /* file gamma value */ + float screen_gamma; /* screen gamma value (display_exponent) */ +#endif +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + png_bytep gamma_table; /* gamma table for 8-bit depth files */ + png_bytep gamma_from_1; /* converts from 1.0 to screen */ + png_bytep gamma_to_1; /* converts from file to 1.0 */ + png_uint_16pp gamma_16_table; /* gamma table for 16-bit depth files */ + png_uint_16pp gamma_16_from_1; /* converts from 1.0 to screen */ + png_uint_16pp gamma_16_to_1; /* converts from file to 1.0 */ +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_sBIT_SUPPORTED) + png_color_8 sig_bit; /* significant bits in each available channel */ +#endif + +#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) + png_color_8 shift; /* shift for significant bit tranformation */ +#endif + +#if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) \ + || defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + png_bytep trans; /* transparency values for paletted files */ + png_color_16 trans_values; /* transparency values for non-paletted files */ +#endif + + png_read_status_ptr read_row_fn; /* called after each row is decoded */ + png_write_status_ptr write_row_fn; /* called after each row is encoded */ +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED + png_progressive_info_ptr info_fn; /* called after header data fully read */ + png_progressive_row_ptr row_fn; /* called after each prog. row is decoded */ + png_progressive_end_ptr end_fn; /* called after image is complete */ + png_bytep save_buffer_ptr; /* current location in save_buffer */ + png_bytep save_buffer; /* buffer for previously read data */ + png_bytep current_buffer_ptr; /* current location in current_buffer */ + png_bytep current_buffer; /* buffer for recently used data */ + png_uint_32 push_length; /* size of current input chunk */ + png_uint_32 skip_length; /* bytes to skip in input data */ + png_size_t save_buffer_size; /* amount of data now in save_buffer */ + png_size_t save_buffer_max; /* total size of save_buffer */ + png_size_t buffer_size; /* total amount of available input data */ + png_size_t current_buffer_size; /* amount of data now in current_buffer */ + int process_mode; /* what push library is currently doing */ + int cur_palette; /* current push library palette index */ + +# if defined(PNG_TEXT_SUPPORTED) + png_size_t current_text_size; /* current size of text input data */ + png_size_t current_text_left; /* how much text left to read in input */ + png_charp current_text; /* current text chunk buffer */ + png_charp current_text_ptr; /* current location in current_text */ +# endif /* PNG_TEXT_SUPPORTED */ +#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ + +#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) +/* for the Borland special 64K segment handler */ + png_bytepp offset_table_ptr; + png_bytep offset_table; + png_uint_16 offset_table_number; + png_uint_16 offset_table_count; + png_uint_16 offset_table_count_free; +#endif + +#if defined(PNG_READ_DITHER_SUPPORTED) + png_bytep palette_lookup; /* lookup table for dithering */ + png_bytep dither_index; /* index translation for palette files */ +#endif + +#if defined(PNG_READ_DITHER_SUPPORTED) || defined(PNG_hIST_SUPPORTED) + png_uint_16p hist; /* histogram */ +#endif + +#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) + png_byte heuristic_method; /* heuristic for row filter selection */ + png_byte num_prev_filters; /* number of weights for previous rows */ + png_bytep prev_filters; /* filter type(s) of previous row(s) */ + png_uint_16p filter_weights; /* weight(s) for previous line(s) */ + png_uint_16p inv_filter_weights; /* 1/weight(s) for previous line(s) */ + png_uint_16p filter_costs; /* relative filter calculation cost */ + png_uint_16p inv_filter_costs; /* 1/relative filter calculation cost */ +#endif + +#if defined(PNG_TIME_RFC1123_SUPPORTED) + png_charp time_buffer; /* String to hold RFC 1123 time text */ +#endif + +/* New members added in libpng-1.0.6 */ + +#ifdef PNG_FREE_ME_SUPPORTED + png_uint_32 free_me; /* flags items libpng is responsible for freeing */ +#endif + +#if defined(PNG_USER_CHUNKS_SUPPORTED) + png_voidp user_chunk_ptr; + png_user_chunk_ptr read_user_chunk_fn; /* user read chunk handler */ +#endif + +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) + int num_chunk_list; + png_bytep chunk_list; +#endif + +/* New members added in libpng-1.0.3 */ +#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) + png_byte rgb_to_gray_status; + /* These were changed from png_byte in libpng-1.0.6 */ + png_uint_16 rgb_to_gray_red_coeff; + png_uint_16 rgb_to_gray_green_coeff; + png_uint_16 rgb_to_gray_blue_coeff; +#endif + +/* New member added in libpng-1.0.4 (renamed in 1.0.9) */ +#if defined(PNG_MNG_FEATURES_SUPPORTED) || \ + defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ + defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) +/* changed from png_byte to png_uint_32 at version 1.2.0 */ +#ifdef PNG_1_0_X + png_byte mng_features_permitted; +#else + png_uint_32 mng_features_permitted; +#endif /* PNG_1_0_X */ +#endif + +/* New member added in libpng-1.0.7 */ +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + png_fixed_point int_gamma; +#endif + +/* New member added in libpng-1.0.9, ifdef'ed out in 1.0.12, enabled in 1.2.0 */ +#if defined(PNG_MNG_FEATURES_SUPPORTED) + png_byte filter_type; +#endif + +#if defined(PNG_1_0_X) +/* New member added in libpng-1.0.10, ifdef'ed out in 1.2.0 */ + png_uint_32 row_buf_size; +#endif + +/* New members added in libpng-1.2.0 */ +#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) +# if !defined(PNG_1_0_X) +# if defined(PNG_MMX_CODE_SUPPORTED) + png_byte mmx_bitdepth_threshold; + png_uint_32 mmx_rowbytes_threshold; +# endif + png_uint_32 asm_flags; +# endif +#endif + +/* New members added in libpng-1.0.2 but first enabled by default in 1.2.0 */ +#ifdef PNG_USER_MEM_SUPPORTED + png_voidp mem_ptr; /* user supplied struct for mem functions */ + png_malloc_ptr malloc_fn; /* function for allocating memory */ + png_free_ptr free_fn; /* function for freeing memory */ +#endif + +/* New member added in libpng-1.0.13 and 1.2.0 */ + png_bytep big_row_buf; /* buffer to save current (unfiltered) row */ + +#if defined(PNG_READ_DITHER_SUPPORTED) +/* The following three members were added at version 1.0.14 and 1.2.4 */ + png_bytep dither_sort; /* working sort array */ + png_bytep index_to_palette; /* where the original index currently is */ + /* in the palette */ + png_bytep palette_to_index; /* which original index points to this */ + /* palette color */ +#endif + +/* New members added in libpng-1.0.16 and 1.2.6 */ + png_byte compression_type; + +#ifdef PNG_SET_USER_LIMITS_SUPPORTED + png_uint_32 user_width_max; + png_uint_32 user_height_max; +#endif + +/* New member added in libpng-1.0.25 and 1.2.17 */ +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) + /* storage for unknown chunk that the library doesn't recognize. */ + png_unknown_chunk unknown_chunk; +#endif + +/* New members added in libpng-1.2.26 */ + png_uint_32 old_big_row_buf_size, old_prev_row_size; + +/* New member added in libpng-1.2.30 */ + png_charp chunkdata; /* buffer for reading chunk data */ + +}; + + +/* This triggers a compiler error in png.c, if png.c and png.h + * do not agree upon the version number. + */ +typedef png_structp version_1_2_37; + +typedef png_struct FAR * FAR * png_structpp; + +/* Here are the function definitions most commonly used. This is not + * the place to find out how to use libpng. See libpng.txt for the + * full explanation, see example.c for the summary. This just provides + * a simple one line description of the use of each function. + */ + +/* Returns the version number of the library */ +extern PNG_EXPORT(png_uint_32,png_access_version_number) PNGARG((void)); + +/* Tell lib we have already handled the first magic bytes. + * Handling more than 8 bytes from the beginning of the file is an error. + */ +extern PNG_EXPORT(void,png_set_sig_bytes) PNGARG((png_structp png_ptr, + int num_bytes)); + +/* Check sig[start] through sig[start + num_to_check - 1] to see if it's a + * PNG file. Returns zero if the supplied bytes match the 8-byte PNG + * signature, and non-zero otherwise. Having num_to_check == 0 or + * start > 7 will always fail (ie return non-zero). + */ +extern PNG_EXPORT(int,png_sig_cmp) PNGARG((png_bytep sig, png_size_t start, + png_size_t num_to_check)); + +/* Simple signature checking function. This is the same as calling + * png_check_sig(sig, n) := !png_sig_cmp(sig, 0, n). + */ +extern PNG_EXPORT(int,png_check_sig) PNGARG((png_bytep sig, int num)); + +/* Allocate and initialize png_ptr struct for reading, and any other memory. */ +extern PNG_EXPORT(png_structp,png_create_read_struct) + PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn)); + +/* Allocate and initialize png_ptr struct for writing, and any other memory */ +extern PNG_EXPORT(png_structp,png_create_write_struct) + PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn)); + +#ifdef PNG_WRITE_SUPPORTED +extern PNG_EXPORT(png_uint_32,png_get_compression_buffer_size) + PNGARG((png_structp png_ptr)); +#endif + +#ifdef PNG_WRITE_SUPPORTED +extern PNG_EXPORT(void,png_set_compression_buffer_size) + PNGARG((png_structp png_ptr, png_uint_32 size)); +#endif + +/* Reset the compression stream */ +extern PNG_EXPORT(int,png_reset_zstream) PNGARG((png_structp png_ptr)); + +/* New functions added in libpng-1.0.2 (not enabled by default until 1.2.0) */ +#ifdef PNG_USER_MEM_SUPPORTED +extern PNG_EXPORT(png_structp,png_create_read_struct_2) + PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, + png_malloc_ptr malloc_fn, png_free_ptr free_fn)); +extern PNG_EXPORT(png_structp,png_create_write_struct_2) + PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, + png_malloc_ptr malloc_fn, png_free_ptr free_fn)); +#endif + +/* Write a PNG chunk - size, type, (optional) data, CRC. */ +extern PNG_EXPORT(void,png_write_chunk) PNGARG((png_structp png_ptr, + png_bytep chunk_name, png_bytep data, png_size_t length)); + +/* Write the start of a PNG chunk - length and chunk name. */ +extern PNG_EXPORT(void,png_write_chunk_start) PNGARG((png_structp png_ptr, + png_bytep chunk_name, png_uint_32 length)); + +/* Write the data of a PNG chunk started with png_write_chunk_start(). */ +extern PNG_EXPORT(void,png_write_chunk_data) PNGARG((png_structp png_ptr, + png_bytep data, png_size_t length)); + +/* Finish a chunk started with png_write_chunk_start() (includes CRC). */ +extern PNG_EXPORT(void,png_write_chunk_end) PNGARG((png_structp png_ptr)); + +/* Allocate and initialize the info structure */ +extern PNG_EXPORT(png_infop,png_create_info_struct) + PNGARG((png_structp png_ptr)); + +#if defined(PNG_1_0_X) || defined (PNG_1_2_X) +/* Initialize the info structure (old interface - DEPRECATED) */ +extern PNG_EXPORT(void,png_info_init) PNGARG((png_infop info_ptr)); +#undef png_info_init +#define png_info_init(info_ptr) png_info_init_3(&info_ptr,\ + png_sizeof(png_info)); +#endif + +extern PNG_EXPORT(void,png_info_init_3) PNGARG((png_infopp info_ptr, + png_size_t png_info_struct_size)); + +/* Writes all the PNG information before the image. */ +extern PNG_EXPORT(void,png_write_info_before_PLTE) PNGARG((png_structp png_ptr, + png_infop info_ptr)); +extern PNG_EXPORT(void,png_write_info) PNGARG((png_structp png_ptr, + png_infop info_ptr)); + +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED +/* read the information before the actual image data. */ +extern PNG_EXPORT(void,png_read_info) PNGARG((png_structp png_ptr, + png_infop info_ptr)); +#endif + +#if defined(PNG_TIME_RFC1123_SUPPORTED) +extern PNG_EXPORT(png_charp,png_convert_to_rfc1123) + PNGARG((png_structp png_ptr, png_timep ptime)); +#endif + +#if !defined(_WIN32_WCE) +/* "time.h" functions are not supported on WindowsCE */ +#if defined(PNG_WRITE_tIME_SUPPORTED) +/* convert from a struct tm to png_time */ +extern PNG_EXPORT(void,png_convert_from_struct_tm) PNGARG((png_timep ptime, + struct tm FAR * ttime)); + +/* convert from time_t to png_time. Uses gmtime() */ +extern PNG_EXPORT(void,png_convert_from_time_t) PNGARG((png_timep ptime, + time_t ttime)); +#endif /* PNG_WRITE_tIME_SUPPORTED */ +#endif /* _WIN32_WCE */ + +#if defined(PNG_READ_EXPAND_SUPPORTED) +/* Expand data to 24-bit RGB, or 8-bit grayscale, with alpha if available. */ +extern PNG_EXPORT(void,png_set_expand) PNGARG((png_structp png_ptr)); +#if !defined(PNG_1_0_X) +extern PNG_EXPORT(void,png_set_expand_gray_1_2_4_to_8) PNGARG((png_structp + png_ptr)); +#endif +extern PNG_EXPORT(void,png_set_palette_to_rgb) PNGARG((png_structp png_ptr)); +extern PNG_EXPORT(void,png_set_tRNS_to_alpha) PNGARG((png_structp png_ptr)); +#if defined(PNG_1_0_X) || defined (PNG_1_2_X) +/* Deprecated */ +extern PNG_EXPORT(void,png_set_gray_1_2_4_to_8) PNGARG((png_structp png_ptr)); +#endif +#endif + +#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) +/* Use blue, green, red order for pixels. */ +extern PNG_EXPORT(void,png_set_bgr) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) +/* Expand the grayscale to 24-bit RGB if necessary. */ +extern PNG_EXPORT(void,png_set_gray_to_rgb) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) +/* Reduce RGB to grayscale. */ +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(void,png_set_rgb_to_gray) PNGARG((png_structp png_ptr, + int error_action, double red, double green )); +#endif +extern PNG_EXPORT(void,png_set_rgb_to_gray_fixed) PNGARG((png_structp png_ptr, + int error_action, png_fixed_point red, png_fixed_point green )); +extern PNG_EXPORT(png_byte,png_get_rgb_to_gray_status) PNGARG((png_structp + png_ptr)); +#endif + +extern PNG_EXPORT(void,png_build_grayscale_palette) PNGARG((int bit_depth, + png_colorp palette)); + +#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) +extern PNG_EXPORT(void,png_set_strip_alpha) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ + defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) +extern PNG_EXPORT(void,png_set_swap_alpha) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \ + defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) +extern PNG_EXPORT(void,png_set_invert_alpha) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) +/* Add a filler byte to 8-bit Gray or 24-bit RGB images. */ +extern PNG_EXPORT(void,png_set_filler) PNGARG((png_structp png_ptr, + png_uint_32 filler, int flags)); +/* The values of the PNG_FILLER_ defines should NOT be changed */ +#define PNG_FILLER_BEFORE 0 +#define PNG_FILLER_AFTER 1 +/* Add an alpha byte to 8-bit Gray or 24-bit RGB images. */ +#if !defined(PNG_1_0_X) +extern PNG_EXPORT(void,png_set_add_alpha) PNGARG((png_structp png_ptr, + png_uint_32 filler, int flags)); +#endif +#endif /* PNG_READ_FILLER_SUPPORTED || PNG_WRITE_FILLER_SUPPORTED */ + +#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) +/* Swap bytes in 16-bit depth files. */ +extern PNG_EXPORT(void,png_set_swap) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) +/* Use 1 byte per pixel in 1, 2, or 4-bit depth files. */ +extern PNG_EXPORT(void,png_set_packing) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_PACKSWAP_SUPPORTED) || defined(PNG_WRITE_PACKSWAP_SUPPORTED) +/* Swap packing order of pixels in bytes. */ +extern PNG_EXPORT(void,png_set_packswap) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) +/* Converts files to legal bit depths. */ +extern PNG_EXPORT(void,png_set_shift) PNGARG((png_structp png_ptr, + png_color_8p true_bits)); +#endif + +#if defined(PNG_READ_INTERLACING_SUPPORTED) || \ + defined(PNG_WRITE_INTERLACING_SUPPORTED) +/* Have the code handle the interlacing. Returns the number of passes. */ +extern PNG_EXPORT(int,png_set_interlace_handling) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) +/* Invert monochrome files */ +extern PNG_EXPORT(void,png_set_invert_mono) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_BACKGROUND_SUPPORTED) +/* Handle alpha and tRNS by replacing with a background color. */ +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(void,png_set_background) PNGARG((png_structp png_ptr, + png_color_16p background_color, int background_gamma_code, + int need_expand, double background_gamma)); +#endif +#define PNG_BACKGROUND_GAMMA_UNKNOWN 0 +#define PNG_BACKGROUND_GAMMA_SCREEN 1 +#define PNG_BACKGROUND_GAMMA_FILE 2 +#define PNG_BACKGROUND_GAMMA_UNIQUE 3 +#endif + +#if defined(PNG_READ_16_TO_8_SUPPORTED) +/* strip the second byte of information from a 16-bit depth file. */ +extern PNG_EXPORT(void,png_set_strip_16) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_DITHER_SUPPORTED) +/* Turn on dithering, and reduce the palette to the number of colors available. */ +extern PNG_EXPORT(void,png_set_dither) PNGARG((png_structp png_ptr, + png_colorp palette, int num_palette, int maximum_colors, + png_uint_16p histogram, int full_dither)); +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) +/* Handle gamma correction. Screen_gamma=(display_exponent) */ +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(void,png_set_gamma) PNGARG((png_structp png_ptr, + double screen_gamma, double default_file_gamma)); +#endif +#endif + +#if defined(PNG_1_0_X) || defined (PNG_1_2_X) +#if defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ + defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) +/* Permit or disallow empty PLTE (0: not permitted, 1: permitted) */ +/* Deprecated and will be removed. Use png_permit_mng_features() instead. */ +extern PNG_EXPORT(void,png_permit_empty_plte) PNGARG((png_structp png_ptr, + int empty_plte_permitted)); +#endif +#endif + +#if defined(PNG_WRITE_FLUSH_SUPPORTED) +/* Set how many lines between output flushes - 0 for no flushing */ +extern PNG_EXPORT(void,png_set_flush) PNGARG((png_structp png_ptr, int nrows)); +/* Flush the current PNG output buffer */ +extern PNG_EXPORT(void,png_write_flush) PNGARG((png_structp png_ptr)); +#endif + +/* optional update palette with requested transformations */ +extern PNG_EXPORT(void,png_start_read_image) PNGARG((png_structp png_ptr)); + +/* optional call to update the users info structure */ +extern PNG_EXPORT(void,png_read_update_info) PNGARG((png_structp png_ptr, + png_infop info_ptr)); + +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED +/* read one or more rows of image data. */ +extern PNG_EXPORT(void,png_read_rows) PNGARG((png_structp png_ptr, + png_bytepp row, png_bytepp display_row, png_uint_32 num_rows)); +#endif + +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED +/* read a row of data. */ +extern PNG_EXPORT(void,png_read_row) PNGARG((png_structp png_ptr, + png_bytep row, + png_bytep display_row)); +#endif + +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED +/* read the whole image into memory at once. */ +extern PNG_EXPORT(void,png_read_image) PNGARG((png_structp png_ptr, + png_bytepp image)); +#endif + +/* write a row of image data */ +extern PNG_EXPORT(void,png_write_row) PNGARG((png_structp png_ptr, + png_bytep row)); + +/* write a few rows of image data */ +extern PNG_EXPORT(void,png_write_rows) PNGARG((png_structp png_ptr, + png_bytepp row, png_uint_32 num_rows)); + +/* write the image data */ +extern PNG_EXPORT(void,png_write_image) PNGARG((png_structp png_ptr, + png_bytepp image)); + +/* writes the end of the PNG file. */ +extern PNG_EXPORT(void,png_write_end) PNGARG((png_structp png_ptr, + png_infop info_ptr)); + +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED +/* read the end of the PNG file. */ +extern PNG_EXPORT(void,png_read_end) PNGARG((png_structp png_ptr, + png_infop info_ptr)); +#endif + +/* free any memory associated with the png_info_struct */ +extern PNG_EXPORT(void,png_destroy_info_struct) PNGARG((png_structp png_ptr, + png_infopp info_ptr_ptr)); + +/* free any memory associated with the png_struct and the png_info_structs */ +extern PNG_EXPORT(void,png_destroy_read_struct) PNGARG((png_structpp + png_ptr_ptr, png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr)); + +/* free all memory used by the read (old method - NOT DLL EXPORTED) */ +/* Debian note: exporting as it is required by legacy applications */ +extern PNG_EXPORT(void,png_read_destroy) PNGARG((png_structp png_ptr, png_infop info_ptr, + png_infop end_info_ptr)); + +/* free any memory associated with the png_struct and the png_info_structs */ +extern PNG_EXPORT(void,png_destroy_write_struct) + PNGARG((png_structpp png_ptr_ptr, png_infopp info_ptr_ptr)); + +/* free any memory used in png_ptr struct (old method - NOT DLL EXPORTED) */ +/* Debian note: exporting as it is required by legacy applications */ +extern PNG_EXPORT(void,png_write_destroy) PNGARG((png_structp png_ptr)); + +/* set the libpng method of handling chunk CRC errors */ +extern PNG_EXPORT(void,png_set_crc_action) PNGARG((png_structp png_ptr, + int crit_action, int ancil_action)); + +/* Values for png_set_crc_action() to say how to handle CRC errors in + * ancillary and critical chunks, and whether to use the data contained + * therein. Note that it is impossible to "discard" data in a critical + * chunk. For versions prior to 0.90, the action was always error/quit, + * whereas in version 0.90 and later, the action for CRC errors in ancillary + * chunks is warn/discard. These values should NOT be changed. + * + * value action:critical action:ancillary + */ +#define PNG_CRC_DEFAULT 0 /* error/quit warn/discard data */ +#define PNG_CRC_ERROR_QUIT 1 /* error/quit error/quit */ +#define PNG_CRC_WARN_DISCARD 2 /* (INVALID) warn/discard data */ +#define PNG_CRC_WARN_USE 3 /* warn/use data warn/use data */ +#define PNG_CRC_QUIET_USE 4 /* quiet/use data quiet/use data */ +#define PNG_CRC_NO_CHANGE 5 /* use current value use current value */ + +/* These functions give the user control over the scan-line filtering in + * libpng and the compression methods used by zlib. These functions are + * mainly useful for testing, as the defaults should work with most users. + * Those users who are tight on memory or want faster performance at the + * expense of compression can modify them. See the compression library + * header file (zlib.h) for an explination of the compression functions. + */ + +/* set the filtering method(s) used by libpng. Currently, the only valid + * value for "method" is 0. + */ +extern PNG_EXPORT(void,png_set_filter) PNGARG((png_structp png_ptr, int method, + int filters)); + +/* Flags for png_set_filter() to say which filters to use. The flags + * are chosen so that they don't conflict with real filter types + * below, in case they are supplied instead of the #defined constants. + * These values should NOT be changed. + */ +#define PNG_NO_FILTERS 0x00 +#define PNG_FILTER_NONE 0x08 +#define PNG_FILTER_SUB 0x10 +#define PNG_FILTER_UP 0x20 +#define PNG_FILTER_AVG 0x40 +#define PNG_FILTER_PAETH 0x80 +#define PNG_ALL_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP | \ + PNG_FILTER_AVG | PNG_FILTER_PAETH) + +/* Filter values (not flags) - used in pngwrite.c, pngwutil.c for now. + * These defines should NOT be changed. + */ +#define PNG_FILTER_VALUE_NONE 0 +#define PNG_FILTER_VALUE_SUB 1 +#define PNG_FILTER_VALUE_UP 2 +#define PNG_FILTER_VALUE_AVG 3 +#define PNG_FILTER_VALUE_PAETH 4 +#define PNG_FILTER_VALUE_LAST 5 + +#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) /* EXPERIMENTAL */ +/* The "heuristic_method" is given by one of the PNG_FILTER_HEURISTIC_ + * defines, either the default (minimum-sum-of-absolute-differences), or + * the experimental method (weighted-minimum-sum-of-absolute-differences). + * + * Weights are factors >= 1.0, indicating how important it is to keep the + * filter type consistent between rows. Larger numbers mean the current + * filter is that many times as likely to be the same as the "num_weights" + * previous filters. This is cumulative for each previous row with a weight. + * There needs to be "num_weights" values in "filter_weights", or it can be + * NULL if the weights aren't being specified. Weights have no influence on + * the selection of the first row filter. Well chosen weights can (in theory) + * improve the compression for a given image. + * + * Costs are factors >= 1.0 indicating the relative decoding costs of a + * filter type. Higher costs indicate more decoding expense, and are + * therefore less likely to be selected over a filter with lower computational + * costs. There needs to be a value in "filter_costs" for each valid filter + * type (given by PNG_FILTER_VALUE_LAST), or it can be NULL if you aren't + * setting the costs. Costs try to improve the speed of decompression without + * unduly increasing the compressed image size. + * + * A negative weight or cost indicates the default value is to be used, and + * values in the range [0.0, 1.0) indicate the value is to remain unchanged. + * The default values for both weights and costs are currently 1.0, but may + * change if good general weighting/cost heuristics can be found. If both + * the weights and costs are set to 1.0, this degenerates the WEIGHTED method + * to the UNWEIGHTED method, but with added encoding time/computation. + */ +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(void,png_set_filter_heuristics) PNGARG((png_structp png_ptr, + int heuristic_method, int num_weights, png_doublep filter_weights, + png_doublep filter_costs)); +#endif +#endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ + +/* Heuristic used for row filter selection. These defines should NOT be + * changed. + */ +#define PNG_FILTER_HEURISTIC_DEFAULT 0 /* Currently "UNWEIGHTED" */ +#define PNG_FILTER_HEURISTIC_UNWEIGHTED 1 /* Used by libpng < 0.95 */ +#define PNG_FILTER_HEURISTIC_WEIGHTED 2 /* Experimental feature */ +#define PNG_FILTER_HEURISTIC_LAST 3 /* Not a valid value */ + +/* Set the library compression level. Currently, valid values range from + * 0 - 9, corresponding directly to the zlib compression levels 0 - 9 + * (0 - no compression, 9 - "maximal" compression). Note that tests have + * shown that zlib compression levels 3-6 usually perform as well as level 9 + * for PNG images, and do considerably fewer caclulations. In the future, + * these values may not correspond directly to the zlib compression levels. + */ +extern PNG_EXPORT(void,png_set_compression_level) PNGARG((png_structp png_ptr, + int level)); + +extern PNG_EXPORT(void,png_set_compression_mem_level) + PNGARG((png_structp png_ptr, int mem_level)); + +extern PNG_EXPORT(void,png_set_compression_strategy) + PNGARG((png_structp png_ptr, int strategy)); + +extern PNG_EXPORT(void,png_set_compression_window_bits) + PNGARG((png_structp png_ptr, int window_bits)); + +extern PNG_EXPORT(void,png_set_compression_method) PNGARG((png_structp png_ptr, + int method)); + +/* These next functions are called for input/output, memory, and error + * handling. They are in the file pngrio.c, pngwio.c, and pngerror.c, + * and call standard C I/O routines such as fread(), fwrite(), and + * fprintf(). These functions can be made to use other I/O routines + * at run time for those applications that need to handle I/O in a + * different manner by calling png_set_???_fn(). See libpng.txt for + * more information. + */ + +#if !defined(PNG_NO_STDIO) +/* Initialize the input/output for the PNG file to the default functions. */ +extern PNG_EXPORT(void,png_init_io) PNGARG((png_structp png_ptr, png_FILE_p fp)); +#endif + +/* Replace the (error and abort), and warning functions with user + * supplied functions. If no messages are to be printed you must still + * write and use replacement functions. The replacement error_fn should + * still do a longjmp to the last setjmp location if you are using this + * method of error handling. If error_fn or warning_fn is NULL, the + * default function will be used. + */ + +extern PNG_EXPORT(void,png_set_error_fn) PNGARG((png_structp png_ptr, + png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warning_fn)); + +/* Return the user pointer associated with the error functions */ +extern PNG_EXPORT(png_voidp,png_get_error_ptr) PNGARG((png_structp png_ptr)); + +/* Replace the default data output functions with a user supplied one(s). + * If buffered output is not used, then output_flush_fn can be set to NULL. + * If PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile time + * output_flush_fn will be ignored (and thus can be NULL). + * It is probably a mistake to use NULL for output_flush_fn if + * write_data_fn is not also NULL unless you have built libpng with + * PNG_WRITE_FLUSH_SUPPORTED undefined, because in this case libpng's + * default flush function, which uses the standard *FILE structure, will + * be used. + */ +extern PNG_EXPORT(void,png_set_write_fn) PNGARG((png_structp png_ptr, + png_voidp io_ptr, png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)); + +/* Replace the default data input function with a user supplied one. */ +extern PNG_EXPORT(void,png_set_read_fn) PNGARG((png_structp png_ptr, + png_voidp io_ptr, png_rw_ptr read_data_fn)); + +/* Return the user pointer associated with the I/O functions */ +extern PNG_EXPORT(png_voidp,png_get_io_ptr) PNGARG((png_structp png_ptr)); + +extern PNG_EXPORT(void,png_set_read_status_fn) PNGARG((png_structp png_ptr, + png_read_status_ptr read_row_fn)); + +extern PNG_EXPORT(void,png_set_write_status_fn) PNGARG((png_structp png_ptr, + png_write_status_ptr write_row_fn)); + +#ifdef PNG_USER_MEM_SUPPORTED +/* Replace the default memory allocation functions with user supplied one(s). */ +extern PNG_EXPORT(void,png_set_mem_fn) PNGARG((png_structp png_ptr, + png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn)); +/* Return the user pointer associated with the memory functions */ +extern PNG_EXPORT(png_voidp,png_get_mem_ptr) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_LEGACY_SUPPORTED) +extern PNG_EXPORT(void,png_set_read_user_transform_fn) PNGARG((png_structp + png_ptr, png_user_transform_ptr read_user_transform_fn)); +#endif + +#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_LEGACY_SUPPORTED) +extern PNG_EXPORT(void,png_set_write_user_transform_fn) PNGARG((png_structp + png_ptr, png_user_transform_ptr write_user_transform_fn)); +#endif + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_LEGACY_SUPPORTED) +extern PNG_EXPORT(void,png_set_user_transform_info) PNGARG((png_structp + png_ptr, png_voidp user_transform_ptr, int user_transform_depth, + int user_transform_channels)); +/* Return the user pointer associated with the user transform functions */ +extern PNG_EXPORT(png_voidp,png_get_user_transform_ptr) + PNGARG((png_structp png_ptr)); +#endif + +#ifdef PNG_USER_CHUNKS_SUPPORTED +extern PNG_EXPORT(void,png_set_read_user_chunk_fn) PNGARG((png_structp png_ptr, + png_voidp user_chunk_ptr, png_user_chunk_ptr read_user_chunk_fn)); +extern PNG_EXPORT(png_voidp,png_get_user_chunk_ptr) PNGARG((png_structp + png_ptr)); +#endif + +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +/* Sets the function callbacks for the push reader, and a pointer to a + * user-defined structure available to the callback functions. + */ +extern PNG_EXPORT(void,png_set_progressive_read_fn) PNGARG((png_structp png_ptr, + png_voidp progressive_ptr, + png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn, + png_progressive_end_ptr end_fn)); + +/* returns the user pointer associated with the push read functions */ +extern PNG_EXPORT(png_voidp,png_get_progressive_ptr) + PNGARG((png_structp png_ptr)); + +/* function to be called when data becomes available */ +extern PNG_EXPORT(void,png_process_data) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_bytep buffer, png_size_t buffer_size)); + +/* function that combines rows. Not very much different than the + * png_combine_row() call. Is this even used????? + */ +extern PNG_EXPORT(void,png_progressive_combine_row) PNGARG((png_structp png_ptr, + png_bytep old_row, png_bytep new_row)); +#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ + +extern PNG_EXPORT(png_voidp,png_malloc) PNGARG((png_structp png_ptr, + png_uint_32 size)); + +#if defined(PNG_1_0_X) +# define png_malloc_warn png_malloc +#else +/* Added at libpng version 1.2.4 */ +extern PNG_EXPORT(png_voidp,png_malloc_warn) PNGARG((png_structp png_ptr, + png_uint_32 size)); +#endif + +/* frees a pointer allocated by png_malloc() */ +extern PNG_EXPORT(void,png_free) PNGARG((png_structp png_ptr, png_voidp ptr)); + +#if defined(PNG_1_0_X) +/* Function to allocate memory for zlib. */ +extern PNG_EXPORT(voidpf,png_zalloc) PNGARG((voidpf png_ptr, uInt items, + uInt size)); + +/* Function to free memory for zlib */ +extern PNG_EXPORT(void,png_zfree) PNGARG((voidpf png_ptr, voidpf ptr)); +#endif + +/* Free data that was allocated internally */ +extern PNG_EXPORT(void,png_free_data) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 free_me, int num)); +#ifdef PNG_FREE_ME_SUPPORTED +/* Reassign responsibility for freeing existing data, whether allocated + * by libpng or by the application */ +extern PNG_EXPORT(void,png_data_freer) PNGARG((png_structp png_ptr, + png_infop info_ptr, int freer, png_uint_32 mask)); +#endif +/* assignments for png_data_freer */ +#define PNG_DESTROY_WILL_FREE_DATA 1 +#define PNG_SET_WILL_FREE_DATA 1 +#define PNG_USER_WILL_FREE_DATA 2 +/* Flags for png_ptr->free_me and info_ptr->free_me */ +#define PNG_FREE_HIST 0x0008 +#define PNG_FREE_ICCP 0x0010 +#define PNG_FREE_SPLT 0x0020 +#define PNG_FREE_ROWS 0x0040 +#define PNG_FREE_PCAL 0x0080 +#define PNG_FREE_SCAL 0x0100 +#define PNG_FREE_UNKN 0x0200 +#define PNG_FREE_LIST 0x0400 +#define PNG_FREE_PLTE 0x1000 +#define PNG_FREE_TRNS 0x2000 +#define PNG_FREE_TEXT 0x4000 +#define PNG_FREE_ALL 0x7fff +#define PNG_FREE_MUL 0x4220 /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */ + +#ifdef PNG_USER_MEM_SUPPORTED +extern PNG_EXPORT(png_voidp,png_malloc_default) PNGARG((png_structp png_ptr, + png_uint_32 size)); +extern PNG_EXPORT(void,png_free_default) PNGARG((png_structp png_ptr, + png_voidp ptr)); +#endif + +extern PNG_EXPORT(png_voidp,png_memcpy_check) PNGARG((png_structp png_ptr, + png_voidp s1, png_voidp s2, png_uint_32 size)); + +extern PNG_EXPORT(png_voidp,png_memset_check) PNGARG((png_structp png_ptr, + png_voidp s1, int value, png_uint_32 size)); + +#if defined(USE_FAR_KEYWORD) /* memory model conversion function */ +extern void *png_far_to_near PNGARG((png_structp png_ptr,png_voidp ptr, + int check)); +#endif /* USE_FAR_KEYWORD */ + +#ifndef PNG_NO_ERROR_TEXT +/* Fatal error in PNG image of libpng - can't continue */ +extern PNG_EXPORT(void,png_error) PNGARG((png_structp png_ptr, + png_const_charp error_message)); + +/* The same, but the chunk name is prepended to the error string. */ +extern PNG_EXPORT(void,png_chunk_error) PNGARG((png_structp png_ptr, + png_const_charp error_message)); +#else +/* Fatal error in PNG image of libpng - can't continue */ +extern PNG_EXPORT(void,png_err) PNGARG((png_structp png_ptr)); +#endif + +#ifndef PNG_NO_WARNINGS +/* Non-fatal error in libpng. Can continue, but may have a problem. */ +extern PNG_EXPORT(void,png_warning) PNGARG((png_structp png_ptr, + png_const_charp warning_message)); + +#ifdef PNG_READ_SUPPORTED +/* Non-fatal error in libpng, chunk name is prepended to message. */ +extern PNG_EXPORT(void,png_chunk_warning) PNGARG((png_structp png_ptr, + png_const_charp warning_message)); +#endif /* PNG_READ_SUPPORTED */ +#endif /* PNG_NO_WARNINGS */ + +/* The png_set_ functions are for storing values in the png_info_struct. + * Similarly, the png_get_ calls are used to read values from the + * png_info_struct, either storing the parameters in the passed variables, or + * setting pointers into the png_info_struct where the data is stored. The + * png_get_ functions return a non-zero value if the data was available + * in info_ptr, or return zero and do not change any of the parameters if the + * data was not available. + * + * These functions should be used instead of directly accessing png_info + * to avoid problems with future changes in the size and internal layout of + * png_info_struct. + */ +/* Returns "flag" if chunk data is valid in info_ptr. */ +extern PNG_EXPORT(png_uint_32,png_get_valid) PNGARG((png_structp png_ptr, +png_infop info_ptr, png_uint_32 flag)); + +/* Returns number of bytes needed to hold a transformed row. */ +extern PNG_EXPORT(png_uint_32,png_get_rowbytes) PNGARG((png_structp png_ptr, +png_infop info_ptr)); + +#if defined(PNG_INFO_IMAGE_SUPPORTED) +/* Returns row_pointers, which is an array of pointers to scanlines that was +returned from png_read_png(). */ +extern PNG_EXPORT(png_bytepp,png_get_rows) PNGARG((png_structp png_ptr, +png_infop info_ptr)); +/* Set row_pointers, which is an array of pointers to scanlines for use +by png_write_png(). */ +extern PNG_EXPORT(void,png_set_rows) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_bytepp row_pointers)); +#endif + +/* Returns number of color channels in image. */ +extern PNG_EXPORT(png_byte,png_get_channels) PNGARG((png_structp png_ptr, +png_infop info_ptr)); + +#ifdef PNG_EASY_ACCESS_SUPPORTED +/* Returns image width in pixels. */ +extern PNG_EXPORT(png_uint_32, png_get_image_width) PNGARG((png_structp +png_ptr, png_infop info_ptr)); + +/* Returns image height in pixels. */ +extern PNG_EXPORT(png_uint_32, png_get_image_height) PNGARG((png_structp +png_ptr, png_infop info_ptr)); + +/* Returns image bit_depth. */ +extern PNG_EXPORT(png_byte, png_get_bit_depth) PNGARG((png_structp +png_ptr, png_infop info_ptr)); + +/* Returns image color_type. */ +extern PNG_EXPORT(png_byte, png_get_color_type) PNGARG((png_structp +png_ptr, png_infop info_ptr)); + +/* Returns image filter_type. */ +extern PNG_EXPORT(png_byte, png_get_filter_type) PNGARG((png_structp +png_ptr, png_infop info_ptr)); + +/* Returns image interlace_type. */ +extern PNG_EXPORT(png_byte, png_get_interlace_type) PNGARG((png_structp +png_ptr, png_infop info_ptr)); + +/* Returns image compression_type. */ +extern PNG_EXPORT(png_byte, png_get_compression_type) PNGARG((png_structp +png_ptr, png_infop info_ptr)); + +/* Returns image resolution in pixels per meter, from pHYs chunk data. */ +extern PNG_EXPORT(png_uint_32, png_get_pixels_per_meter) PNGARG((png_structp +png_ptr, png_infop info_ptr)); +extern PNG_EXPORT(png_uint_32, png_get_x_pixels_per_meter) PNGARG((png_structp +png_ptr, png_infop info_ptr)); +extern PNG_EXPORT(png_uint_32, png_get_y_pixels_per_meter) PNGARG((png_structp +png_ptr, png_infop info_ptr)); + +/* Returns pixel aspect ratio, computed from pHYs chunk data. */ +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(float, png_get_pixel_aspect_ratio) PNGARG((png_structp +png_ptr, png_infop info_ptr)); +#endif + +/* Returns image x, y offset in pixels or microns, from oFFs chunk data. */ +extern PNG_EXPORT(png_int_32, png_get_x_offset_pixels) PNGARG((png_structp +png_ptr, png_infop info_ptr)); +extern PNG_EXPORT(png_int_32, png_get_y_offset_pixels) PNGARG((png_structp +png_ptr, png_infop info_ptr)); +extern PNG_EXPORT(png_int_32, png_get_x_offset_microns) PNGARG((png_structp +png_ptr, png_infop info_ptr)); +extern PNG_EXPORT(png_int_32, png_get_y_offset_microns) PNGARG((png_structp +png_ptr, png_infop info_ptr)); + +#endif /* PNG_EASY_ACCESS_SUPPORTED */ + +/* Returns pointer to signature string read from PNG header */ +extern PNG_EXPORT(png_bytep,png_get_signature) PNGARG((png_structp png_ptr, +png_infop info_ptr)); + +#if defined(PNG_bKGD_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_bKGD) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_color_16p *background)); +#endif + +#if defined(PNG_bKGD_SUPPORTED) +extern PNG_EXPORT(void,png_set_bKGD) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_color_16p background)); +#endif + +#if defined(PNG_cHRM_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(png_uint_32,png_get_cHRM) PNGARG((png_structp png_ptr, + png_infop info_ptr, double *white_x, double *white_y, double *red_x, + double *red_y, double *green_x, double *green_y, double *blue_x, + double *blue_y)); +#endif +#ifdef PNG_FIXED_POINT_SUPPORTED +extern PNG_EXPORT(png_uint_32,png_get_cHRM_fixed) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_fixed_point *int_white_x, png_fixed_point + *int_white_y, png_fixed_point *int_red_x, png_fixed_point *int_red_y, + png_fixed_point *int_green_x, png_fixed_point *int_green_y, png_fixed_point + *int_blue_x, png_fixed_point *int_blue_y)); +#endif +#endif + +#if defined(PNG_cHRM_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(void,png_set_cHRM) PNGARG((png_structp png_ptr, + png_infop info_ptr, double white_x, double white_y, double red_x, + double red_y, double green_x, double green_y, double blue_x, double blue_y)); +#endif +#ifdef PNG_FIXED_POINT_SUPPORTED +extern PNG_EXPORT(void,png_set_cHRM_fixed) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_fixed_point int_white_x, png_fixed_point int_white_y, + png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point + int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, + png_fixed_point int_blue_y)); +#endif +#endif + +#if defined(PNG_gAMA_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(png_uint_32,png_get_gAMA) PNGARG((png_structp png_ptr, + png_infop info_ptr, double *file_gamma)); +#endif +extern PNG_EXPORT(png_uint_32,png_get_gAMA_fixed) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_fixed_point *int_file_gamma)); +#endif + +#if defined(PNG_gAMA_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(void,png_set_gAMA) PNGARG((png_structp png_ptr, + png_infop info_ptr, double file_gamma)); +#endif +extern PNG_EXPORT(void,png_set_gAMA_fixed) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_fixed_point int_file_gamma)); +#endif + +#if defined(PNG_hIST_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_hIST) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_16p *hist)); +#endif + +#if defined(PNG_hIST_SUPPORTED) +extern PNG_EXPORT(void,png_set_hIST) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_16p hist)); +#endif + +extern PNG_EXPORT(png_uint_32,png_get_IHDR) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 *width, png_uint_32 *height, + int *bit_depth, int *color_type, int *interlace_method, + int *compression_method, int *filter_method)); + +extern PNG_EXPORT(void,png_set_IHDR) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 width, png_uint_32 height, int bit_depth, + int color_type, int interlace_method, int compression_method, + int filter_method)); + +#if defined(PNG_oFFs_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_oFFs) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_int_32 *offset_x, png_int_32 *offset_y, + int *unit_type)); +#endif + +#if defined(PNG_oFFs_SUPPORTED) +extern PNG_EXPORT(void,png_set_oFFs) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_int_32 offset_x, png_int_32 offset_y, + int unit_type)); +#endif + +#if defined(PNG_pCAL_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_pCAL) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_charp *purpose, png_int_32 *X0, png_int_32 *X1, + int *type, int *nparams, png_charp *units, png_charpp *params)); +#endif + +#if defined(PNG_pCAL_SUPPORTED) +extern PNG_EXPORT(void,png_set_pCAL) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_charp purpose, png_int_32 X0, png_int_32 X1, + int type, int nparams, png_charp units, png_charpp params)); +#endif + +#if defined(PNG_pHYs_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_pHYs) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)); +#endif + +#if defined(PNG_pHYs_SUPPORTED) +extern PNG_EXPORT(void,png_set_pHYs) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 res_x, png_uint_32 res_y, int unit_type)); +#endif + +extern PNG_EXPORT(png_uint_32,png_get_PLTE) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_colorp *palette, int *num_palette)); + +extern PNG_EXPORT(void,png_set_PLTE) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_colorp palette, int num_palette)); + +#if defined(PNG_sBIT_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_sBIT) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_color_8p *sig_bit)); +#endif + +#if defined(PNG_sBIT_SUPPORTED) +extern PNG_EXPORT(void,png_set_sBIT) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_color_8p sig_bit)); +#endif + +#if defined(PNG_sRGB_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_sRGB) PNGARG((png_structp png_ptr, + png_infop info_ptr, int *intent)); +#endif + +#if defined(PNG_sRGB_SUPPORTED) +extern PNG_EXPORT(void,png_set_sRGB) PNGARG((png_structp png_ptr, + png_infop info_ptr, int intent)); +extern PNG_EXPORT(void,png_set_sRGB_gAMA_and_cHRM) PNGARG((png_structp png_ptr, + png_infop info_ptr, int intent)); +#endif + +#if defined(PNG_iCCP_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_iCCP) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_charpp name, int *compression_type, + png_charpp profile, png_uint_32 *proflen)); + /* Note to maintainer: profile should be png_bytepp */ +#endif + +#if defined(PNG_iCCP_SUPPORTED) +extern PNG_EXPORT(void,png_set_iCCP) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_charp name, int compression_type, + png_charp profile, png_uint_32 proflen)); + /* Note to maintainer: profile should be png_bytep */ +#endif + +#if defined(PNG_sPLT_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_sPLT) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_sPLT_tpp entries)); +#endif + +#if defined(PNG_sPLT_SUPPORTED) +extern PNG_EXPORT(void,png_set_sPLT) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_sPLT_tp entries, int nentries)); +#endif + +#if defined(PNG_TEXT_SUPPORTED) +/* png_get_text also returns the number of text chunks in *num_text */ +extern PNG_EXPORT(png_uint_32,png_get_text) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_textp *text_ptr, int *num_text)); +#endif + +/* + * Note while png_set_text() will accept a structure whose text, + * language, and translated keywords are NULL pointers, the structure + * returned by png_get_text will always contain regular + * zero-terminated C strings. They might be empty strings but + * they will never be NULL pointers. + */ + +#if defined(PNG_TEXT_SUPPORTED) +extern PNG_EXPORT(void,png_set_text) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_textp text_ptr, int num_text)); +#endif + +#if defined(PNG_tIME_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_tIME) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_timep *mod_time)); +#endif + +#if defined(PNG_tIME_SUPPORTED) +extern PNG_EXPORT(void,png_set_tIME) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_timep mod_time)); +#endif + +#if defined(PNG_tRNS_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_tRNS) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_bytep *trans, int *num_trans, + png_color_16p *trans_values)); +#endif + +#if defined(PNG_tRNS_SUPPORTED) +extern PNG_EXPORT(void,png_set_tRNS) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_bytep trans, int num_trans, + png_color_16p trans_values)); +#endif + +#if defined(PNG_tRNS_SUPPORTED) +#endif + +#if defined(PNG_sCAL_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(png_uint_32,png_get_sCAL) PNGARG((png_structp png_ptr, + png_infop info_ptr, int *unit, double *width, double *height)); +#else +#ifdef PNG_FIXED_POINT_SUPPORTED +extern PNG_EXPORT(png_uint_32,png_get_sCAL_s) PNGARG((png_structp png_ptr, + png_infop info_ptr, int *unit, png_charpp swidth, png_charpp sheight)); +#endif +#endif +#endif /* PNG_sCAL_SUPPORTED */ + +#if defined(PNG_sCAL_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(void,png_set_sCAL) PNGARG((png_structp png_ptr, + png_infop info_ptr, int unit, double width, double height)); +#else +#ifdef PNG_FIXED_POINT_SUPPORTED +extern PNG_EXPORT(void,png_set_sCAL_s) PNGARG((png_structp png_ptr, + png_infop info_ptr, int unit, png_charp swidth, png_charp sheight)); +#endif +#endif +#endif /* PNG_sCAL_SUPPORTED || PNG_WRITE_sCAL_SUPPORTED */ + +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) +/* provide a list of chunks and how they are to be handled, if the built-in + handling or default unknown chunk handling is not desired. Any chunks not + listed will be handled in the default manner. The IHDR and IEND chunks + must not be listed. + keep = 0: follow default behaviour + = 1: do not keep + = 2: keep only if safe-to-copy + = 3: keep even if unsafe-to-copy +*/ +extern PNG_EXPORT(void, png_set_keep_unknown_chunks) PNGARG((png_structp + png_ptr, int keep, png_bytep chunk_list, int num_chunks)); +extern PNG_EXPORT(void, png_set_unknown_chunks) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_unknown_chunkp unknowns, int num_unknowns)); +extern PNG_EXPORT(void, png_set_unknown_chunk_location) + PNGARG((png_structp png_ptr, png_infop info_ptr, int chunk, int location)); +extern PNG_EXPORT(png_uint_32,png_get_unknown_chunks) PNGARG((png_structp + png_ptr, png_infop info_ptr, png_unknown_chunkpp entries)); +#endif +#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED +PNG_EXPORT(int,png_handle_as_unknown) PNGARG((png_structp png_ptr, png_bytep + chunk_name)); +#endif + +/* Png_free_data() will turn off the "valid" flag for anything it frees. + If you need to turn it off for a chunk that your application has freed, + you can use png_set_invalid(png_ptr, info_ptr, PNG_INFO_CHNK); */ +extern PNG_EXPORT(void, png_set_invalid) PNGARG((png_structp png_ptr, + png_infop info_ptr, int mask)); + +#if defined(PNG_INFO_IMAGE_SUPPORTED) +/* The "params" pointer is currently not used and is for future expansion. */ +extern PNG_EXPORT(void, png_read_png) PNGARG((png_structp png_ptr, + png_infop info_ptr, + int transforms, + png_voidp params)); +extern PNG_EXPORT(void, png_write_png) PNGARG((png_structp png_ptr, + png_infop info_ptr, + int transforms, + png_voidp params)); +#endif + +/* Define PNG_DEBUG at compile time for debugging information. Higher + * numbers for PNG_DEBUG mean more debugging information. This has + * only been added since version 0.95 so it is not implemented throughout + * libpng yet, but more support will be added as needed. + */ +#ifdef PNG_DEBUG +#if (PNG_DEBUG > 0) +#if !defined(PNG_DEBUG_FILE) && defined(_MSC_VER) +#include +#if (PNG_DEBUG > 1) +#ifndef _DEBUG +# define _DEBUG +#endif +#ifndef png_debug +#define png_debug(l,m) _RPT0(_CRT_WARN,m PNG_STRING_NEWLINE) +#endif +#ifndef png_debug1 +#define png_debug1(l,m,p1) _RPT1(_CRT_WARN,m PNG_STRING_NEWLINE,p1) +#endif +#ifndef png_debug2 +#define png_debug2(l,m,p1,p2) _RPT2(_CRT_WARN,m PNG_STRING_NEWLINE,p1,p2) +#endif +#endif +#else /* PNG_DEBUG_FILE || !_MSC_VER */ +#ifndef PNG_DEBUG_FILE +#define PNG_DEBUG_FILE stderr +#endif /* PNG_DEBUG_FILE */ + +#if (PNG_DEBUG > 1) +/* Note: ["%s"m PNG_STRING_NEWLINE] probably does not work on + * non-ISO compilers */ +# ifdef __STDC__ +# ifndef png_debug +# define png_debug(l,m) \ + { \ + int num_tabs=l; \ + fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":"")))); \ + } +# endif +# ifndef png_debug1 +# define png_debug1(l,m,p1) \ + { \ + int num_tabs=l; \ + fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1); \ + } +# endif +# ifndef png_debug2 +# define png_debug2(l,m,p1,p2) \ + { \ + int num_tabs=l; \ + fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1,p2); \ + } +# endif +# else /* __STDC __ */ +# ifndef png_debug +# define png_debug(l,m) \ + { \ + int num_tabs=l; \ + char format[256]; \ + snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ + m,PNG_STRING_NEWLINE); \ + fprintf(PNG_DEBUG_FILE,format); \ + } +# endif +# ifndef png_debug1 +# define png_debug1(l,m,p1) \ + { \ + int num_tabs=l; \ + char format[256]; \ + snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ + m,PNG_STRING_NEWLINE); \ + fprintf(PNG_DEBUG_FILE,format,p1); \ + } +# endif +# ifndef png_debug2 +# define png_debug2(l,m,p1,p2) \ + { \ + int num_tabs=l; \ + char format[256]; \ + snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ + m,PNG_STRING_NEWLINE); \ + fprintf(PNG_DEBUG_FILE,format,p1,p2); \ + } +# endif +# endif /* __STDC __ */ +#endif /* (PNG_DEBUG > 1) */ + +#endif /* _MSC_VER */ +#endif /* (PNG_DEBUG > 0) */ +#endif /* PNG_DEBUG */ +#ifndef png_debug +#define png_debug(l, m) +#endif +#ifndef png_debug1 +#define png_debug1(l, m, p1) +#endif +#ifndef png_debug2 +#define png_debug2(l, m, p1, p2) +#endif + +extern PNG_EXPORT(png_charp,png_get_copyright) PNGARG((png_structp png_ptr)); +extern PNG_EXPORT(png_charp,png_get_header_ver) PNGARG((png_structp png_ptr)); +extern PNG_EXPORT(png_charp,png_get_header_version) PNGARG((png_structp png_ptr)); +extern PNG_EXPORT(png_charp,png_get_libpng_ver) PNGARG((png_structp png_ptr)); + +#ifdef PNG_MNG_FEATURES_SUPPORTED +extern PNG_EXPORT(png_uint_32,png_permit_mng_features) PNGARG((png_structp + png_ptr, png_uint_32 mng_features_permitted)); +#endif + +/* For use in png_set_keep_unknown, added to version 1.2.6 */ +#define PNG_HANDLE_CHUNK_AS_DEFAULT 0 +#define PNG_HANDLE_CHUNK_NEVER 1 +#define PNG_HANDLE_CHUNK_IF_SAFE 2 +#define PNG_HANDLE_CHUNK_ALWAYS 3 + +/* Added to version 1.2.0 */ +#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) +#if defined(PNG_MMX_CODE_SUPPORTED) +#define PNG_ASM_FLAG_MMX_SUPPORT_COMPILED 0x01 /* not user-settable */ +#define PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU 0x02 /* not user-settable */ +#define PNG_ASM_FLAG_MMX_READ_COMBINE_ROW 0x04 +#define PNG_ASM_FLAG_MMX_READ_INTERLACE 0x08 +#define PNG_ASM_FLAG_MMX_READ_FILTER_SUB 0x10 +#define PNG_ASM_FLAG_MMX_READ_FILTER_UP 0x20 +#define PNG_ASM_FLAG_MMX_READ_FILTER_AVG 0x40 +#define PNG_ASM_FLAG_MMX_READ_FILTER_PAETH 0x80 +#define PNG_ASM_FLAGS_INITIALIZED 0x80000000 /* not user-settable */ + +#define PNG_MMX_READ_FLAGS ( PNG_ASM_FLAG_MMX_READ_COMBINE_ROW \ + | PNG_ASM_FLAG_MMX_READ_INTERLACE \ + | PNG_ASM_FLAG_MMX_READ_FILTER_SUB \ + | PNG_ASM_FLAG_MMX_READ_FILTER_UP \ + | PNG_ASM_FLAG_MMX_READ_FILTER_AVG \ + | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ) +#define PNG_MMX_WRITE_FLAGS ( 0 ) + +#define PNG_MMX_FLAGS ( PNG_ASM_FLAG_MMX_SUPPORT_COMPILED \ + | PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU \ + | PNG_MMX_READ_FLAGS \ + | PNG_MMX_WRITE_FLAGS ) + +#define PNG_SELECT_READ 1 +#define PNG_SELECT_WRITE 2 +#endif /* PNG_MMX_CODE_SUPPORTED */ + +#if !defined(PNG_1_0_X) +/* pngget.c */ +extern PNG_EXPORT(png_uint_32,png_get_mmx_flagmask) + PNGARG((int flag_select, int *compilerID)); + +/* pngget.c */ +extern PNG_EXPORT(png_uint_32,png_get_asm_flagmask) + PNGARG((int flag_select)); + +/* pngget.c */ +extern PNG_EXPORT(png_uint_32,png_get_asm_flags) + PNGARG((png_structp png_ptr)); + +/* pngget.c */ +extern PNG_EXPORT(png_byte,png_get_mmx_bitdepth_threshold) + PNGARG((png_structp png_ptr)); + +/* pngget.c */ +extern PNG_EXPORT(png_uint_32,png_get_mmx_rowbytes_threshold) + PNGARG((png_structp png_ptr)); + +/* pngset.c */ +extern PNG_EXPORT(void,png_set_asm_flags) + PNGARG((png_structp png_ptr, png_uint_32 asm_flags)); + +/* pngset.c */ +extern PNG_EXPORT(void,png_set_mmx_thresholds) + PNGARG((png_structp png_ptr, png_byte mmx_bitdepth_threshold, + png_uint_32 mmx_rowbytes_threshold)); + +#endif /* PNG_1_0_X */ + +#if !defined(PNG_1_0_X) +/* png.c, pnggccrd.c, or pngvcrd.c */ +extern PNG_EXPORT(int,png_mmx_support) PNGARG((void)); +#endif /* PNG_1_0_X */ +#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ + +/* Strip the prepended error numbers ("#nnn ") from error and warning + * messages before passing them to the error or warning handler. */ +#ifdef PNG_ERROR_NUMBERS_SUPPORTED +extern PNG_EXPORT(void,png_set_strip_error_numbers) PNGARG((png_structp + png_ptr, png_uint_32 strip_mode)); +#endif + +/* Added at libpng-1.2.6 */ +#ifdef PNG_SET_USER_LIMITS_SUPPORTED +extern PNG_EXPORT(void,png_set_user_limits) PNGARG((png_structp + png_ptr, png_uint_32 user_width_max, png_uint_32 user_height_max)); +extern PNG_EXPORT(png_uint_32,png_get_user_width_max) PNGARG((png_structp + png_ptr)); +extern PNG_EXPORT(png_uint_32,png_get_user_height_max) PNGARG((png_structp + png_ptr)); +#endif + + +/* Maintainer: Put new public prototypes here ^, in libpng.3, and project defs */ + +#ifdef PNG_READ_COMPOSITE_NODIV_SUPPORTED +/* With these routines we avoid an integer divide, which will be slower on + * most machines. However, it does take more operations than the corresponding + * divide method, so it may be slower on a few RISC systems. There are two + * shifts (by 8 or 16 bits) and an addition, versus a single integer divide. + * + * Note that the rounding factors are NOT supposed to be the same! 128 and + * 32768 are correct for the NODIV code; 127 and 32767 are correct for the + * standard method. + * + * [Optimized code by Greg Roelofs and Mark Adler...blame us for bugs. :-) ] + */ + + /* fg and bg should be in `gamma 1.0' space; alpha is the opacity */ + +# define png_composite(composite, fg, alpha, bg) \ + { png_uint_16 temp = (png_uint_16)((png_uint_16)(fg) * (png_uint_16)(alpha) \ + + (png_uint_16)(bg)*(png_uint_16)(255 - \ + (png_uint_16)(alpha)) + (png_uint_16)128); \ + (composite) = (png_byte)((temp + (temp >> 8)) >> 8); } + +# define png_composite_16(composite, fg, alpha, bg) \ + { png_uint_32 temp = (png_uint_32)((png_uint_32)(fg) * (png_uint_32)(alpha) \ + + (png_uint_32)(bg)*(png_uint_32)(65535L - \ + (png_uint_32)(alpha)) + (png_uint_32)32768L); \ + (composite) = (png_uint_16)((temp + (temp >> 16)) >> 16); } + +#else /* standard method using integer division */ + +# define png_composite(composite, fg, alpha, bg) \ + (composite) = (png_byte)(((png_uint_16)(fg) * (png_uint_16)(alpha) + \ + (png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \ + (png_uint_16)127) / 255) + +# define png_composite_16(composite, fg, alpha, bg) \ + (composite) = (png_uint_16)(((png_uint_32)(fg) * (png_uint_32)(alpha) + \ + (png_uint_32)(bg)*(png_uint_32)(65535L - (png_uint_32)(alpha)) + \ + (png_uint_32)32767) / (png_uint_32)65535L) + +#endif /* PNG_READ_COMPOSITE_NODIV_SUPPORTED */ + +/* Inline macros to do direct reads of bytes from the input buffer. These + * require that you are using an architecture that uses PNG byte ordering + * (MSB first) and supports unaligned data storage. I think that PowerPC + * in big-endian mode and 680x0 are the only ones that will support this. + * The x86 line of processors definitely do not. The png_get_int_32() + * routine also assumes we are using two's complement format for negative + * values, which is almost certainly true. + */ +#if defined(PNG_READ_BIG_ENDIAN_SUPPORTED) +# define png_get_uint_32(buf) ( *((png_uint_32p) (buf))) +# define png_get_uint_16(buf) ( *((png_uint_16p) (buf))) +# define png_get_int_32(buf) ( *((png_int_32p) (buf))) +#else +extern PNG_EXPORT(png_uint_32,png_get_uint_32) PNGARG((png_bytep buf)); +extern PNG_EXPORT(png_uint_16,png_get_uint_16) PNGARG((png_bytep buf)); +extern PNG_EXPORT(png_int_32,png_get_int_32) PNGARG((png_bytep buf)); +#endif /* !PNG_READ_BIG_ENDIAN_SUPPORTED */ +extern PNG_EXPORT(png_uint_32,png_get_uint_31) + PNGARG((png_structp png_ptr, png_bytep buf)); +/* No png_get_int_16 -- may be added if there's a real need for it. */ + +/* Place a 32-bit number into a buffer in PNG byte order (big-endian). + */ +extern PNG_EXPORT(void,png_save_uint_32) + PNGARG((png_bytep buf, png_uint_32 i)); +extern PNG_EXPORT(void,png_save_int_32) + PNGARG((png_bytep buf, png_int_32 i)); + +/* Place a 16-bit number into a buffer in PNG byte order. + * The parameter is declared unsigned int, not png_uint_16, + * just to avoid potential problems on pre-ANSI C compilers. + */ +extern PNG_EXPORT(void,png_save_uint_16) + PNGARG((png_bytep buf, unsigned int i)); +/* No png_save_int_16 -- may be added if there's a real need for it. */ + +/* ************************************************************************* */ + +/* These next functions are used internally in the code. They generally + * shouldn't be used unless you are writing code to add or replace some + * functionality in libpng. More information about most functions can + * be found in the files where the functions are located. + */ + + +/* Various modes of operation, that are visible to applications because + * they are used for unknown chunk location. + */ +#define PNG_HAVE_IHDR 0x01 +#define PNG_HAVE_PLTE 0x02 +#define PNG_HAVE_IDAT 0x04 +#define PNG_AFTER_IDAT 0x08 /* Have complete zlib datastream */ +#define PNG_HAVE_IEND 0x10 + +#if defined(PNG_INTERNAL) + +/* More modes of operation. Note that after an init, mode is set to + * zero automatically when the structure is created. + */ +#define PNG_HAVE_gAMA 0x20 +#define PNG_HAVE_cHRM 0x40 +#define PNG_HAVE_sRGB 0x80 +#define PNG_HAVE_CHUNK_HEADER 0x100 +#define PNG_WROTE_tIME 0x200 +#define PNG_WROTE_INFO_BEFORE_PLTE 0x400 +#define PNG_BACKGROUND_IS_GRAY 0x800 +#define PNG_HAVE_PNG_SIGNATURE 0x1000 +#define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000 /* Have another chunk after IDAT */ + +/* flags for the transformations the PNG library does on the image data */ +#define PNG_BGR 0x0001 +#define PNG_INTERLACE 0x0002 +#define PNG_PACK 0x0004 +#define PNG_SHIFT 0x0008 +#define PNG_SWAP_BYTES 0x0010 +#define PNG_INVERT_MONO 0x0020 +#define PNG_DITHER 0x0040 +#define PNG_BACKGROUND 0x0080 +#define PNG_BACKGROUND_EXPAND 0x0100 + /* 0x0200 unused */ +#define PNG_16_TO_8 0x0400 +#define PNG_RGBA 0x0800 +#define PNG_EXPAND 0x1000 +#define PNG_GAMMA 0x2000 +#define PNG_GRAY_TO_RGB 0x4000 +#define PNG_FILLER 0x8000L +#define PNG_PACKSWAP 0x10000L +#define PNG_SWAP_ALPHA 0x20000L +#define PNG_STRIP_ALPHA 0x40000L +#define PNG_INVERT_ALPHA 0x80000L +#define PNG_USER_TRANSFORM 0x100000L +#define PNG_RGB_TO_GRAY_ERR 0x200000L +#define PNG_RGB_TO_GRAY_WARN 0x400000L +#define PNG_RGB_TO_GRAY 0x600000L /* two bits, RGB_TO_GRAY_ERR|WARN */ + /* 0x800000L Unused */ +#define PNG_ADD_ALPHA 0x1000000L /* Added to libpng-1.2.7 */ +#define PNG_EXPAND_tRNS 0x2000000L /* Added to libpng-1.2.9 */ + /* 0x4000000L unused */ + /* 0x8000000L unused */ + /* 0x10000000L unused */ + /* 0x20000000L unused */ + /* 0x40000000L unused */ + +/* flags for png_create_struct */ +#define PNG_STRUCT_PNG 0x0001 +#define PNG_STRUCT_INFO 0x0002 + +/* Scaling factor for filter heuristic weighting calculations */ +#define PNG_WEIGHT_SHIFT 8 +#define PNG_WEIGHT_FACTOR (1<<(PNG_WEIGHT_SHIFT)) +#define PNG_COST_SHIFT 3 +#define PNG_COST_FACTOR (1<<(PNG_COST_SHIFT)) + +/* flags for the png_ptr->flags rather than declaring a byte for each one */ +#define PNG_FLAG_ZLIB_CUSTOM_STRATEGY 0x0001 +#define PNG_FLAG_ZLIB_CUSTOM_LEVEL 0x0002 +#define PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL 0x0004 +#define PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS 0x0008 +#define PNG_FLAG_ZLIB_CUSTOM_METHOD 0x0010 +#define PNG_FLAG_ZLIB_FINISHED 0x0020 +#define PNG_FLAG_ROW_INIT 0x0040 +#define PNG_FLAG_FILLER_AFTER 0x0080 +#define PNG_FLAG_CRC_ANCILLARY_USE 0x0100 +#define PNG_FLAG_CRC_ANCILLARY_NOWARN 0x0200 +#define PNG_FLAG_CRC_CRITICAL_USE 0x0400 +#define PNG_FLAG_CRC_CRITICAL_IGNORE 0x0800 +#define PNG_FLAG_FREE_PLTE 0x1000 +#define PNG_FLAG_FREE_TRNS 0x2000 +#define PNG_FLAG_FREE_HIST 0x4000 +#define PNG_FLAG_KEEP_UNKNOWN_CHUNKS 0x8000L +#define PNG_FLAG_KEEP_UNSAFE_CHUNKS 0x10000L +#define PNG_FLAG_LIBRARY_MISMATCH 0x20000L +#define PNG_FLAG_STRIP_ERROR_NUMBERS 0x40000L +#define PNG_FLAG_STRIP_ERROR_TEXT 0x80000L +#define PNG_FLAG_MALLOC_NULL_MEM_OK 0x100000L +#define PNG_FLAG_ADD_ALPHA 0x200000L /* Added to libpng-1.2.8 */ +#define PNG_FLAG_STRIP_ALPHA 0x400000L /* Added to libpng-1.2.8 */ + /* 0x800000L unused */ + /* 0x1000000L unused */ + /* 0x2000000L unused */ + /* 0x4000000L unused */ + /* 0x8000000L unused */ + /* 0x10000000L unused */ + /* 0x20000000L unused */ + /* 0x40000000L unused */ + +#define PNG_FLAG_CRC_ANCILLARY_MASK (PNG_FLAG_CRC_ANCILLARY_USE | \ + PNG_FLAG_CRC_ANCILLARY_NOWARN) + +#define PNG_FLAG_CRC_CRITICAL_MASK (PNG_FLAG_CRC_CRITICAL_USE | \ + PNG_FLAG_CRC_CRITICAL_IGNORE) + +#define PNG_FLAG_CRC_MASK (PNG_FLAG_CRC_ANCILLARY_MASK | \ + PNG_FLAG_CRC_CRITICAL_MASK) + +/* save typing and make code easier to understand */ + +#define PNG_COLOR_DIST(c1, c2) (abs((int)((c1).red) - (int)((c2).red)) + \ + abs((int)((c1).green) - (int)((c2).green)) + \ + abs((int)((c1).blue) - (int)((c2).blue))) + +/* Added to libpng-1.2.6 JB */ +#define PNG_ROWBYTES(pixel_bits, width) \ + ((pixel_bits) >= 8 ? \ + ((width) * (((png_uint_32)(pixel_bits)) >> 3)) : \ + (( ((width) * ((png_uint_32)(pixel_bits))) + 7) >> 3) ) + +/* PNG_OUT_OF_RANGE returns true if value is outside the range + ideal-delta..ideal+delta. Each argument is evaluated twice. + "ideal" and "delta" should be constants, normally simple + integers, "value" a variable. Added to libpng-1.2.6 JB */ +#define PNG_OUT_OF_RANGE(value, ideal, delta) \ + ( (value) < (ideal)-(delta) || (value) > (ideal)+(delta) ) + +/* variables declared in png.c - only it needs to define PNG_NO_EXTERN */ +#if !defined(PNG_NO_EXTERN) || defined(PNG_ALWAYS_EXTERN) +/* place to hold the signature string for a PNG file. */ +#ifdef PNG_USE_GLOBAL_ARRAYS + PNG_EXPORT_VAR (PNG_CONST png_byte FARDATA) png_sig[8]; +#else +#endif +#endif /* PNG_NO_EXTERN */ + +/* Constant strings for known chunk types. If you need to add a chunk, + * define the name here, and add an invocation of the macro in png.c and + * wherever it's needed. + */ +#define PNG_IHDR png_byte png_IHDR[5] = { 73, 72, 68, 82, '\0'} +#define PNG_IDAT png_byte png_IDAT[5] = { 73, 68, 65, 84, '\0'} +#define PNG_IEND png_byte png_IEND[5] = { 73, 69, 78, 68, '\0'} +#define PNG_PLTE png_byte png_PLTE[5] = { 80, 76, 84, 69, '\0'} +#define PNG_bKGD png_byte png_bKGD[5] = { 98, 75, 71, 68, '\0'} +#define PNG_cHRM png_byte png_cHRM[5] = { 99, 72, 82, 77, '\0'} +#define PNG_gAMA png_byte png_gAMA[5] = {103, 65, 77, 65, '\0'} +#define PNG_hIST png_byte png_hIST[5] = {104, 73, 83, 84, '\0'} +#define PNG_iCCP png_byte png_iCCP[5] = {105, 67, 67, 80, '\0'} +#define PNG_iTXt png_byte png_iTXt[5] = {105, 84, 88, 116, '\0'} +#define PNG_oFFs png_byte png_oFFs[5] = {111, 70, 70, 115, '\0'} +#define PNG_pCAL png_byte png_pCAL[5] = {112, 67, 65, 76, '\0'} +#define PNG_sCAL png_byte png_sCAL[5] = {115, 67, 65, 76, '\0'} +#define PNG_pHYs png_byte png_pHYs[5] = {112, 72, 89, 115, '\0'} +#define PNG_sBIT png_byte png_sBIT[5] = {115, 66, 73, 84, '\0'} +#define PNG_sPLT png_byte png_sPLT[5] = {115, 80, 76, 84, '\0'} +#define PNG_sRGB png_byte png_sRGB[5] = {115, 82, 71, 66, '\0'} +#define PNG_tEXt png_byte png_tEXt[5] = {116, 69, 88, 116, '\0'} +#define PNG_tIME png_byte png_tIME[5] = {116, 73, 77, 69, '\0'} +#define PNG_tRNS png_byte png_tRNS[5] = {116, 82, 78, 83, '\0'} +#define PNG_zTXt png_byte png_zTXt[5] = {122, 84, 88, 116, '\0'} + +#ifdef PNG_USE_GLOBAL_ARRAYS +PNG_EXPORT_VAR (png_byte FARDATA) png_IHDR[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_IDAT[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_IEND[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_PLTE[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_bKGD[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_cHRM[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_gAMA[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_hIST[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_iCCP[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_iTXt[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_oFFs[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_pCAL[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_sCAL[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_pHYs[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_sBIT[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_sPLT[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_sRGB[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_tEXt[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_tIME[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_tRNS[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_zTXt[5]; +#endif /* PNG_USE_GLOBAL_ARRAYS */ + +#if defined(PNG_1_0_X) || defined (PNG_1_2_X) +/* Initialize png_ptr struct for reading, and allocate any other memory. + * (old interface - DEPRECATED - use png_create_read_struct instead). + */ +extern PNG_EXPORT(void,png_read_init) PNGARG((png_structp png_ptr)); +#undef png_read_init +#define png_read_init(png_ptr) png_read_init_3(&png_ptr, \ + PNG_LIBPNG_VER_STRING, png_sizeof(png_struct)); +#endif + +extern PNG_EXPORT(void,png_read_init_3) PNGARG((png_structpp ptr_ptr, + png_const_charp user_png_ver, png_size_t png_struct_size)); +#if defined(PNG_1_0_X) || defined (PNG_1_2_X) +extern PNG_EXPORT(void,png_read_init_2) PNGARG((png_structp png_ptr, + png_const_charp user_png_ver, png_size_t png_struct_size, png_size_t + png_info_size)); +#endif + +#if defined(PNG_1_0_X) || defined (PNG_1_2_X) +/* Initialize png_ptr struct for writing, and allocate any other memory. + * (old interface - DEPRECATED - use png_create_write_struct instead). + */ +extern PNG_EXPORT(void,png_write_init) PNGARG((png_structp png_ptr)); +#undef png_write_init +#define png_write_init(png_ptr) png_write_init_3(&png_ptr, \ + PNG_LIBPNG_VER_STRING, png_sizeof(png_struct)); +#endif + +extern PNG_EXPORT(void,png_write_init_3) PNGARG((png_structpp ptr_ptr, + png_const_charp user_png_ver, png_size_t png_struct_size)); +extern PNG_EXPORT(void,png_write_init_2) PNGARG((png_structp png_ptr, + png_const_charp user_png_ver, png_size_t png_struct_size, png_size_t + png_info_size)); + +/* Allocate memory for an internal libpng struct */ +PNG_EXTERN png_voidp png_create_struct PNGARG((int type)); + +/* Free memory from internal libpng struct */ +PNG_EXTERN void png_destroy_struct PNGARG((png_voidp struct_ptr)); + +PNG_EXTERN png_voidp png_create_struct_2 PNGARG((int type, png_malloc_ptr + malloc_fn, png_voidp mem_ptr)); +PNG_EXTERN void png_destroy_struct_2 PNGARG((png_voidp struct_ptr, + png_free_ptr free_fn, png_voidp mem_ptr)); + +/* Free any memory that info_ptr points to and reset struct. */ +PNG_EXTERN void png_info_destroy PNGARG((png_structp png_ptr, + png_infop info_ptr)); + +#ifndef PNG_1_0_X +/* Function to allocate memory for zlib. */ +PNG_EXTERN voidpf png_zalloc PNGARG((voidpf png_ptr, uInt items, uInt size)); + +/* Function to free memory for zlib */ +PNG_EXTERN void png_zfree PNGARG((voidpf png_ptr, voidpf ptr)); + +#ifdef PNG_SIZE_T +/* Function to convert a sizeof an item to png_sizeof item */ + PNG_EXTERN png_size_t PNGAPI png_convert_size PNGARG((size_t size)); +#endif + +/* Next four functions are used internally as callbacks. PNGAPI is required + * but not PNG_EXPORT. PNGAPI added at libpng version 1.2.3. */ + +PNG_EXTERN void PNGAPI png_default_read_data PNGARG((png_structp png_ptr, + png_bytep data, png_size_t length)); + +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +PNG_EXTERN void PNGAPI png_push_fill_buffer PNGARG((png_structp png_ptr, + png_bytep buffer, png_size_t length)); +#endif + +PNG_EXTERN void PNGAPI png_default_write_data PNGARG((png_structp png_ptr, + png_bytep data, png_size_t length)); + +#if defined(PNG_WRITE_FLUSH_SUPPORTED) +#if !defined(PNG_NO_STDIO) +PNG_EXTERN void PNGAPI png_default_flush PNGARG((png_structp png_ptr)); +#endif +#endif +#else /* PNG_1_0_X */ +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +PNG_EXTERN void png_push_fill_buffer PNGARG((png_structp png_ptr, + png_bytep buffer, png_size_t length)); +#endif +#endif /* PNG_1_0_X */ + +/* Reset the CRC variable */ +PNG_EXTERN void png_reset_crc PNGARG((png_structp png_ptr)); + +/* Write the "data" buffer to whatever output you are using. */ +PNG_EXTERN void png_write_data PNGARG((png_structp png_ptr, png_bytep data, + png_size_t length)); + +/* Read data from whatever input you are using into the "data" buffer */ +PNG_EXTERN void png_read_data PNGARG((png_structp png_ptr, png_bytep data, + png_size_t length)); + +/* Read bytes into buf, and update png_ptr->crc */ +PNG_EXTERN void png_crc_read PNGARG((png_structp png_ptr, png_bytep buf, + png_size_t length)); + +/* Decompress data in a chunk that uses compression */ +#if defined(PNG_zTXt_SUPPORTED) || defined(PNG_iTXt_SUPPORTED) || \ + defined(PNG_iCCP_SUPPORTED) || defined(PNG_sPLT_SUPPORTED) +PNG_EXTERN void png_decompress_chunk PNGARG((png_structp png_ptr, + int comp_type, png_size_t chunklength, + png_size_t prefix_length, png_size_t *data_length)); +#endif + +/* Read "skip" bytes, read the file crc, and (optionally) verify png_ptr->crc */ +PNG_EXTERN int png_crc_finish PNGARG((png_structp png_ptr, png_uint_32 skip)); + +/* Read the CRC from the file and compare it to the libpng calculated CRC */ +PNG_EXTERN int png_crc_error PNGARG((png_structp png_ptr)); + +/* Calculate the CRC over a section of data. Note that we are only + * passing a maximum of 64K on systems that have this as a memory limit, + * since this is the maximum buffer size we can specify. + */ +PNG_EXTERN void png_calculate_crc PNGARG((png_structp png_ptr, png_bytep ptr, + png_size_t length)); + +#if defined(PNG_WRITE_FLUSH_SUPPORTED) +PNG_EXTERN void png_flush PNGARG((png_structp png_ptr)); +#endif + +/* simple function to write the signature */ +PNG_EXTERN void png_write_sig PNGARG((png_structp png_ptr)); + +/* write various chunks */ + +/* Write the IHDR chunk, and update the png_struct with the necessary + * information. + */ +PNG_EXTERN void png_write_IHDR PNGARG((png_structp png_ptr, png_uint_32 width, + png_uint_32 height, + int bit_depth, int color_type, int compression_method, int filter_method, + int interlace_method)); + +PNG_EXTERN void png_write_PLTE PNGARG((png_structp png_ptr, png_colorp palette, + png_uint_32 num_pal)); + +PNG_EXTERN void png_write_IDAT PNGARG((png_structp png_ptr, png_bytep data, + png_size_t length)); + +PNG_EXTERN void png_write_IEND PNGARG((png_structp png_ptr)); + +#if defined(PNG_WRITE_gAMA_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +PNG_EXTERN void png_write_gAMA PNGARG((png_structp png_ptr, double file_gamma)); +#endif +#ifdef PNG_FIXED_POINT_SUPPORTED +PNG_EXTERN void png_write_gAMA_fixed PNGARG((png_structp png_ptr, png_fixed_point + file_gamma)); +#endif +#endif + +#if defined(PNG_WRITE_sBIT_SUPPORTED) +PNG_EXTERN void png_write_sBIT PNGARG((png_structp png_ptr, png_color_8p sbit, + int color_type)); +#endif + +#if defined(PNG_WRITE_cHRM_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +PNG_EXTERN void png_write_cHRM PNGARG((png_structp png_ptr, + double white_x, double white_y, + double red_x, double red_y, double green_x, double green_y, + double blue_x, double blue_y)); +#endif +#ifdef PNG_FIXED_POINT_SUPPORTED +PNG_EXTERN void png_write_cHRM_fixed PNGARG((png_structp png_ptr, + png_fixed_point int_white_x, png_fixed_point int_white_y, + png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point + int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, + png_fixed_point int_blue_y)); +#endif +#endif + +#if defined(PNG_WRITE_sRGB_SUPPORTED) +PNG_EXTERN void png_write_sRGB PNGARG((png_structp png_ptr, + int intent)); +#endif + +#if defined(PNG_WRITE_iCCP_SUPPORTED) +PNG_EXTERN void png_write_iCCP PNGARG((png_structp png_ptr, + png_charp name, int compression_type, + png_charp profile, int proflen)); + /* Note to maintainer: profile should be png_bytep */ +#endif + +#if defined(PNG_WRITE_sPLT_SUPPORTED) +PNG_EXTERN void png_write_sPLT PNGARG((png_structp png_ptr, + png_sPLT_tp palette)); +#endif + +#if defined(PNG_WRITE_tRNS_SUPPORTED) +PNG_EXTERN void png_write_tRNS PNGARG((png_structp png_ptr, png_bytep trans, + png_color_16p values, int number, int color_type)); +#endif + +#if defined(PNG_WRITE_bKGD_SUPPORTED) +PNG_EXTERN void png_write_bKGD PNGARG((png_structp png_ptr, + png_color_16p values, int color_type)); +#endif + +#if defined(PNG_WRITE_hIST_SUPPORTED) +PNG_EXTERN void png_write_hIST PNGARG((png_structp png_ptr, png_uint_16p hist, + int num_hist)); +#endif + +#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \ + defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) +PNG_EXTERN png_size_t png_check_keyword PNGARG((png_structp png_ptr, + png_charp key, png_charpp new_key)); +#endif + +#if defined(PNG_WRITE_tEXt_SUPPORTED) +PNG_EXTERN void png_write_tEXt PNGARG((png_structp png_ptr, png_charp key, + png_charp text, png_size_t text_len)); +#endif + +#if defined(PNG_WRITE_zTXt_SUPPORTED) +PNG_EXTERN void png_write_zTXt PNGARG((png_structp png_ptr, png_charp key, + png_charp text, png_size_t text_len, int compression)); +#endif + +#if defined(PNG_WRITE_iTXt_SUPPORTED) +PNG_EXTERN void png_write_iTXt PNGARG((png_structp png_ptr, + int compression, png_charp key, png_charp lang, png_charp lang_key, + png_charp text)); +#endif + +#if defined(PNG_TEXT_SUPPORTED) /* Added at version 1.0.14 and 1.2.4 */ +PNG_EXTERN int png_set_text_2 PNGARG((png_structp png_ptr, + png_infop info_ptr, png_textp text_ptr, int num_text)); +#endif + +#if defined(PNG_WRITE_oFFs_SUPPORTED) +PNG_EXTERN void png_write_oFFs PNGARG((png_structp png_ptr, + png_int_32 x_offset, png_int_32 y_offset, int unit_type)); +#endif + +#if defined(PNG_WRITE_pCAL_SUPPORTED) +PNG_EXTERN void png_write_pCAL PNGARG((png_structp png_ptr, png_charp purpose, + png_int_32 X0, png_int_32 X1, int type, int nparams, + png_charp units, png_charpp params)); +#endif + +#if defined(PNG_WRITE_pHYs_SUPPORTED) +PNG_EXTERN void png_write_pHYs PNGARG((png_structp png_ptr, + png_uint_32 x_pixels_per_unit, png_uint_32 y_pixels_per_unit, + int unit_type)); +#endif + +#if defined(PNG_WRITE_tIME_SUPPORTED) +PNG_EXTERN void png_write_tIME PNGARG((png_structp png_ptr, + png_timep mod_time)); +#endif + +#if defined(PNG_WRITE_sCAL_SUPPORTED) +#if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO) +PNG_EXTERN void png_write_sCAL PNGARG((png_structp png_ptr, + int unit, double width, double height)); +#else +#ifdef PNG_FIXED_POINT_SUPPORTED +PNG_EXTERN void png_write_sCAL_s PNGARG((png_structp png_ptr, + int unit, png_charp width, png_charp height)); +#endif +#endif +#endif + +/* Called when finished processing a row of data */ +PNG_EXTERN void png_write_finish_row PNGARG((png_structp png_ptr)); + +/* Internal use only. Called before first row of data */ +PNG_EXTERN void png_write_start_row PNGARG((png_structp png_ptr)); + +#if defined(PNG_READ_GAMMA_SUPPORTED) +PNG_EXTERN void png_build_gamma_table PNGARG((png_structp png_ptr)); +#endif + +/* combine a row of data, dealing with alpha, etc. if requested */ +PNG_EXTERN void png_combine_row PNGARG((png_structp png_ptr, png_bytep row, + int mask)); + +#if defined(PNG_READ_INTERLACING_SUPPORTED) +/* expand an interlaced row */ +/* OLD pre-1.0.9 interface: +PNG_EXTERN void png_do_read_interlace PNGARG((png_row_infop row_info, + png_bytep row, int pass, png_uint_32 transformations)); + */ +PNG_EXTERN void png_do_read_interlace PNGARG((png_structp png_ptr)); +#endif + +/* GRR TO DO (2.0 or whenever): simplify other internal calling interfaces */ + +#if defined(PNG_WRITE_INTERLACING_SUPPORTED) +/* grab pixels out of a row for an interlaced pass */ +PNG_EXTERN void png_do_write_interlace PNGARG((png_row_infop row_info, + png_bytep row, int pass)); +#endif + +/* unfilter a row */ +PNG_EXTERN void png_read_filter_row PNGARG((png_structp png_ptr, + png_row_infop row_info, png_bytep row, png_bytep prev_row, int filter)); + +/* Choose the best filter to use and filter the row data */ +PNG_EXTERN void png_write_find_filter PNGARG((png_structp png_ptr, + png_row_infop row_info)); + +/* Write out the filtered row. */ +PNG_EXTERN void png_write_filtered_row PNGARG((png_structp png_ptr, + png_bytep filtered_row)); +/* finish a row while reading, dealing with interlacing passes, etc. */ +PNG_EXTERN void png_read_finish_row PNGARG((png_structp png_ptr)); + +/* initialize the row buffers, etc. */ +PNG_EXTERN void png_read_start_row PNGARG((png_structp png_ptr)); +/* optional call to update the users info structure */ +PNG_EXTERN void png_read_transform_info PNGARG((png_structp png_ptr, + png_infop info_ptr)); + +/* these are the functions that do the transformations */ +#if defined(PNG_READ_FILLER_SUPPORTED) +PNG_EXTERN void png_do_read_filler PNGARG((png_row_infop row_info, + png_bytep row, png_uint_32 filler, png_uint_32 flags)); +#endif + +#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) +PNG_EXTERN void png_do_read_swap_alpha PNGARG((png_row_infop row_info, + png_bytep row)); +#endif + +#if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) +PNG_EXTERN void png_do_write_swap_alpha PNGARG((png_row_infop row_info, + png_bytep row)); +#endif + +#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) +PNG_EXTERN void png_do_read_invert_alpha PNGARG((png_row_infop row_info, + png_bytep row)); +#endif + +#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) +PNG_EXTERN void png_do_write_invert_alpha PNGARG((png_row_infop row_info, + png_bytep row)); +#endif + +#if defined(PNG_WRITE_FILLER_SUPPORTED) || \ + defined(PNG_READ_STRIP_ALPHA_SUPPORTED) +PNG_EXTERN void png_do_strip_filler PNGARG((png_row_infop row_info, + png_bytep row, png_uint_32 flags)); +#endif + +#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) +PNG_EXTERN void png_do_swap PNGARG((png_row_infop row_info, png_bytep row)); +#endif + +#if defined(PNG_READ_PACKSWAP_SUPPORTED) || defined(PNG_WRITE_PACKSWAP_SUPPORTED) +PNG_EXTERN void png_do_packswap PNGARG((png_row_infop row_info, png_bytep row)); +#endif + +#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) +PNG_EXTERN int png_do_rgb_to_gray PNGARG((png_structp png_ptr, png_row_infop + row_info, png_bytep row)); +#endif + +#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) +PNG_EXTERN void png_do_gray_to_rgb PNGARG((png_row_infop row_info, + png_bytep row)); +#endif + +#if defined(PNG_READ_PACK_SUPPORTED) +PNG_EXTERN void png_do_unpack PNGARG((png_row_infop row_info, png_bytep row)); +#endif + +#if defined(PNG_READ_SHIFT_SUPPORTED) +PNG_EXTERN void png_do_unshift PNGARG((png_row_infop row_info, png_bytep row, + png_color_8p sig_bits)); +#endif + +#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) +PNG_EXTERN void png_do_invert PNGARG((png_row_infop row_info, png_bytep row)); +#endif + +#if defined(PNG_READ_16_TO_8_SUPPORTED) +PNG_EXTERN void png_do_chop PNGARG((png_row_infop row_info, png_bytep row)); +#endif + +#if defined(PNG_READ_DITHER_SUPPORTED) +PNG_EXTERN void png_do_dither PNGARG((png_row_infop row_info, + png_bytep row, png_bytep palette_lookup, png_bytep dither_lookup)); + +# if defined(PNG_CORRECT_PALETTE_SUPPORTED) +PNG_EXTERN void png_correct_palette PNGARG((png_structp png_ptr, + png_colorp palette, int num_palette)); +# endif +#endif + +#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) +PNG_EXTERN void png_do_bgr PNGARG((png_row_infop row_info, png_bytep row)); +#endif + +#if defined(PNG_WRITE_PACK_SUPPORTED) +PNG_EXTERN void png_do_pack PNGARG((png_row_infop row_info, + png_bytep row, png_uint_32 bit_depth)); +#endif + +#if defined(PNG_WRITE_SHIFT_SUPPORTED) +PNG_EXTERN void png_do_shift PNGARG((png_row_infop row_info, png_bytep row, + png_color_8p bit_depth)); +#endif + +#if defined(PNG_READ_BACKGROUND_SUPPORTED) +#if defined(PNG_READ_GAMMA_SUPPORTED) +PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, png_bytep row, + png_color_16p trans_values, png_color_16p background, + png_color_16p background_1, + png_bytep gamma_table, png_bytep gamma_from_1, png_bytep gamma_to_1, + png_uint_16pp gamma_16, png_uint_16pp gamma_16_from_1, + png_uint_16pp gamma_16_to_1, int gamma_shift)); +#else +PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, png_bytep row, + png_color_16p trans_values, png_color_16p background)); +#endif +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) +PNG_EXTERN void png_do_gamma PNGARG((png_row_infop row_info, png_bytep row, + png_bytep gamma_table, png_uint_16pp gamma_16_table, + int gamma_shift)); +#endif + +#if defined(PNG_READ_EXPAND_SUPPORTED) +PNG_EXTERN void png_do_expand_palette PNGARG((png_row_infop row_info, + png_bytep row, png_colorp palette, png_bytep trans, int num_trans)); +PNG_EXTERN void png_do_expand PNGARG((png_row_infop row_info, + png_bytep row, png_color_16p trans_value)); +#endif + +/* The following decodes the appropriate chunks, and does error correction, + * then calls the appropriate callback for the chunk if it is valid. + */ + +/* decode the IHDR chunk */ +PNG_EXTERN void png_handle_IHDR PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +PNG_EXTERN void png_handle_PLTE PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +PNG_EXTERN void png_handle_IEND PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); + +#if defined(PNG_READ_bKGD_SUPPORTED) +PNG_EXTERN void png_handle_bKGD PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_cHRM_SUPPORTED) +PNG_EXTERN void png_handle_cHRM PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_gAMA_SUPPORTED) +PNG_EXTERN void png_handle_gAMA PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_hIST_SUPPORTED) +PNG_EXTERN void png_handle_hIST PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_iCCP_SUPPORTED) +extern void png_handle_iCCP PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif /* PNG_READ_iCCP_SUPPORTED */ + +#if defined(PNG_READ_iTXt_SUPPORTED) +PNG_EXTERN void png_handle_iTXt PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_oFFs_SUPPORTED) +PNG_EXTERN void png_handle_oFFs PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_pCAL_SUPPORTED) +PNG_EXTERN void png_handle_pCAL PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_pHYs_SUPPORTED) +PNG_EXTERN void png_handle_pHYs PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_sBIT_SUPPORTED) +PNG_EXTERN void png_handle_sBIT PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_sCAL_SUPPORTED) +PNG_EXTERN void png_handle_sCAL PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_sPLT_SUPPORTED) +extern void png_handle_sPLT PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif /* PNG_READ_sPLT_SUPPORTED */ + +#if defined(PNG_READ_sRGB_SUPPORTED) +PNG_EXTERN void png_handle_sRGB PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_tEXt_SUPPORTED) +PNG_EXTERN void png_handle_tEXt PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_tIME_SUPPORTED) +PNG_EXTERN void png_handle_tIME PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_tRNS_SUPPORTED) +PNG_EXTERN void png_handle_tRNS PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_zTXt_SUPPORTED) +PNG_EXTERN void png_handle_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +PNG_EXTERN void png_handle_unknown PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 length)); + +PNG_EXTERN void png_check_chunk_name PNGARG((png_structp png_ptr, + png_bytep chunk_name)); + +/* handle the transformations for reading and writing */ +PNG_EXTERN void png_do_read_transformations PNGARG((png_structp png_ptr)); +PNG_EXTERN void png_do_write_transformations PNGARG((png_structp png_ptr)); + +PNG_EXTERN void png_init_read_transformations PNGARG((png_structp png_ptr)); + +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +PNG_EXTERN void png_push_read_chunk PNGARG((png_structp png_ptr, + png_infop info_ptr)); +PNG_EXTERN void png_push_read_sig PNGARG((png_structp png_ptr, + png_infop info_ptr)); +PNG_EXTERN void png_push_check_crc PNGARG((png_structp png_ptr)); +PNG_EXTERN void png_push_crc_skip PNGARG((png_structp png_ptr, + png_uint_32 length)); +PNG_EXTERN void png_push_crc_finish PNGARG((png_structp png_ptr)); +PNG_EXTERN void png_push_save_buffer PNGARG((png_structp png_ptr)); +PNG_EXTERN void png_push_restore_buffer PNGARG((png_structp png_ptr, + png_bytep buffer, png_size_t buffer_length)); +PNG_EXTERN void png_push_read_IDAT PNGARG((png_structp png_ptr)); +PNG_EXTERN void png_process_IDAT_data PNGARG((png_structp png_ptr, + png_bytep buffer, png_size_t buffer_length)); +PNG_EXTERN void png_push_process_row PNGARG((png_structp png_ptr)); +PNG_EXTERN void png_push_handle_unknown PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 length)); +PNG_EXTERN void png_push_have_info PNGARG((png_structp png_ptr, + png_infop info_ptr)); +PNG_EXTERN void png_push_have_end PNGARG((png_structp png_ptr, + png_infop info_ptr)); +PNG_EXTERN void png_push_have_row PNGARG((png_structp png_ptr, png_bytep row)); +PNG_EXTERN void png_push_read_end PNGARG((png_structp png_ptr, + png_infop info_ptr)); +PNG_EXTERN void png_process_some_data PNGARG((png_structp png_ptr, + png_infop info_ptr)); +PNG_EXTERN void png_read_push_finish_row PNGARG((png_structp png_ptr)); +#if defined(PNG_READ_tEXt_SUPPORTED) +PNG_EXTERN void png_push_handle_tEXt PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 length)); +PNG_EXTERN void png_push_read_tEXt PNGARG((png_structp png_ptr, + png_infop info_ptr)); +#endif +#if defined(PNG_READ_zTXt_SUPPORTED) +PNG_EXTERN void png_push_handle_zTXt PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 length)); +PNG_EXTERN void png_push_read_zTXt PNGARG((png_structp png_ptr, + png_infop info_ptr)); +#endif +#if defined(PNG_READ_iTXt_SUPPORTED) +PNG_EXTERN void png_push_handle_iTXt PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 length)); +PNG_EXTERN void png_push_read_iTXt PNGARG((png_structp png_ptr, + png_infop info_ptr)); +#endif + +#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ + +#ifdef PNG_MNG_FEATURES_SUPPORTED +PNG_EXTERN void png_do_read_intrapixel PNGARG((png_row_infop row_info, + png_bytep row)); +PNG_EXTERN void png_do_write_intrapixel PNGARG((png_row_infop row_info, + png_bytep row)); +#endif + +#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) +#if defined(PNG_MMX_CODE_SUPPORTED) +/* png.c */ /* PRIVATE */ +PNG_EXTERN void png_init_mmx_flags PNGARG((png_structp png_ptr)); +#endif +#endif + +#if defined(PNG_INCH_CONVERSIONS) && defined(PNG_FLOATING_POINT_SUPPORTED) +PNG_EXTERN png_uint_32 png_get_pixels_per_inch PNGARG((png_structp png_ptr, +png_infop info_ptr)); + +PNG_EXTERN png_uint_32 png_get_x_pixels_per_inch PNGARG((png_structp png_ptr, +png_infop info_ptr)); + +PNG_EXTERN png_uint_32 png_get_y_pixels_per_inch PNGARG((png_structp png_ptr, +png_infop info_ptr)); + +PNG_EXTERN float png_get_x_offset_inches PNGARG((png_structp png_ptr, +png_infop info_ptr)); + +PNG_EXTERN float png_get_y_offset_inches PNGARG((png_structp png_ptr, +png_infop info_ptr)); + +#if defined(PNG_pHYs_SUPPORTED) +PNG_EXTERN png_uint_32 png_get_pHYs_dpi PNGARG((png_structp png_ptr, +png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)); +#endif /* PNG_pHYs_SUPPORTED */ +#endif /* PNG_INCH_CONVERSIONS && PNG_FLOATING_POINT_SUPPORTED */ + +/* Read the chunk header (length + type name) */ +PNG_EXTERN png_uint_32 png_read_chunk_header PNGARG((png_structp png_ptr)); + +/* Added at libpng version 1.2.34 */ +#if defined(PNG_cHRM_SUPPORTED) +PNG_EXTERN int png_check_cHRM_fixed PNGARG((png_structp png_ptr, + png_fixed_point int_white_x, png_fixed_point int_white_y, + png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point + int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, + png_fixed_point int_blue_y)); +#endif + +/* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */ + +#endif /* PNG_INTERNAL */ + +#ifdef __cplusplus +} +#endif + +#endif /* PNG_VERSION_INFO_ONLY */ +/* do not put anything past this line */ +#endif /* PNG_H */ diff --git a/minecraftcpp-master/handheld/lib/include/pngconf.h b/minecraftcpp-master/handheld/lib/include/pngconf.h new file mode 100644 index 0000000..025368d --- /dev/null +++ b/minecraftcpp-master/handheld/lib/include/pngconf.h @@ -0,0 +1,1496 @@ + +/* pngconf.h - machine configurable file for libpng + * + * libpng version 1.2.37 - June 4, 2009 + * For conditions of distribution and use, see copyright notice in png.h + * Copyright (c) 1998-2009 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + */ + +/* Any machine specific code is near the front of this file, so if you + * are configuring libpng for a machine, you may want to read the section + * starting here down to where it starts to typedef png_color, png_text, + * and png_info. + */ + +#ifndef PNGCONF_H +#define PNGCONF_H + +#define PNG_1_2_X + +/* + * PNG_USER_CONFIG has to be defined on the compiler command line. This + * includes the resource compiler for Windows DLL configurations. + */ +#ifdef PNG_USER_CONFIG +# ifndef PNG_USER_PRIVATEBUILD +# define PNG_USER_PRIVATEBUILD +# endif +#include "pngusr.h" +#endif + +/* PNG_CONFIGURE_LIBPNG is set by the "configure" script. */ +#ifdef PNG_CONFIGURE_LIBPNG +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#endif + +/* + * Added at libpng-1.2.8 + * + * If you create a private DLL you need to define in "pngusr.h" the followings: + * #define PNG_USER_PRIVATEBUILD + * e.g. #define PNG_USER_PRIVATEBUILD "Build by MyCompany for xyz reasons." + * #define PNG_USER_DLLFNAME_POSTFIX + * e.g. // private DLL "libpng13gx.dll" + * #define PNG_USER_DLLFNAME_POSTFIX "gx" + * + * The following macros are also at your disposal if you want to complete the + * DLL VERSIONINFO structure. + * - PNG_USER_VERSIONINFO_COMMENTS + * - PNG_USER_VERSIONINFO_COMPANYNAME + * - PNG_USER_VERSIONINFO_LEGALTRADEMARKS + */ + +#ifdef __STDC__ +#ifdef SPECIALBUILD +# pragma message("PNG_LIBPNG_SPECIALBUILD (and deprecated SPECIALBUILD)\ + are now LIBPNG reserved macros. Use PNG_USER_PRIVATEBUILD instead.") +#endif + +#ifdef PRIVATEBUILD +# pragma message("PRIVATEBUILD is deprecated.\ + Use PNG_USER_PRIVATEBUILD instead.") +# define PNG_USER_PRIVATEBUILD PRIVATEBUILD +#endif +#endif /* __STDC__ */ + +#ifndef PNG_VERSION_INFO_ONLY + +/* End of material added to libpng-1.2.8 */ + +/* Added at libpng-1.2.19, removed at libpng-1.2.20 because it caused trouble + Restored at libpng-1.2.21 */ +#if !defined(PNG_NO_WARN_UNINITIALIZED_ROW) && \ + !defined(PNG_WARN_UNINITIALIZED_ROW) +# define PNG_WARN_UNINITIALIZED_ROW 1 +#endif +/* End of material added at libpng-1.2.19/1.2.21 */ + +/* This is the size of the compression buffer, and thus the size of + * an IDAT chunk. Make this whatever size you feel is best for your + * machine. One of these will be allocated per png_struct. When this + * is full, it writes the data to the disk, and does some other + * calculations. Making this an extremely small size will slow + * the library down, but you may want to experiment to determine + * where it becomes significant, if you are concerned with memory + * usage. Note that zlib allocates at least 32Kb also. For readers, + * this describes the size of the buffer available to read the data in. + * Unless this gets smaller than the size of a row (compressed), + * it should not make much difference how big this is. + */ + +#ifndef PNG_ZBUF_SIZE +# define PNG_ZBUF_SIZE 8192 +#endif + +/* Enable if you want a write-only libpng */ + +#ifndef PNG_NO_READ_SUPPORTED +# define PNG_READ_SUPPORTED +#endif + +/* Enable if you want a read-only libpng */ + +#ifndef PNG_NO_WRITE_SUPPORTED +# define PNG_WRITE_SUPPORTED +#endif + +/* Enabled by default in 1.2.0. You can disable this if you don't need to + support PNGs that are embedded in MNG datastreams */ +#if !defined(PNG_1_0_X) && !defined(PNG_NO_MNG_FEATURES) +# ifndef PNG_MNG_FEATURES_SUPPORTED +# define PNG_MNG_FEATURES_SUPPORTED +# endif +#endif + +#ifndef PNG_NO_FLOATING_POINT_SUPPORTED +# ifndef PNG_FLOATING_POINT_SUPPORTED +# define PNG_FLOATING_POINT_SUPPORTED +# endif +#endif + +/* If you are running on a machine where you cannot allocate more + * than 64K of memory at once, uncomment this. While libpng will not + * normally need that much memory in a chunk (unless you load up a very + * large file), zlib needs to know how big of a chunk it can use, and + * libpng thus makes sure to check any memory allocation to verify it + * will fit into memory. +#define PNG_MAX_MALLOC_64K + */ +#if defined(MAXSEG_64K) && !defined(PNG_MAX_MALLOC_64K) +# define PNG_MAX_MALLOC_64K +#endif + +/* Special munging to support doing things the 'cygwin' way: + * 'Normal' png-on-win32 defines/defaults: + * PNG_BUILD_DLL -- building dll + * PNG_USE_DLL -- building an application, linking to dll + * (no define) -- building static library, or building an + * application and linking to the static lib + * 'Cygwin' defines/defaults: + * PNG_BUILD_DLL -- (ignored) building the dll + * (no define) -- (ignored) building an application, linking to the dll + * PNG_STATIC -- (ignored) building the static lib, or building an + * application that links to the static lib. + * ALL_STATIC -- (ignored) building various static libs, or building an + * application that links to the static libs. + * Thus, + * a cygwin user should define either PNG_BUILD_DLL or PNG_STATIC, and + * this bit of #ifdefs will define the 'correct' config variables based on + * that. If a cygwin user *wants* to define 'PNG_USE_DLL' that's okay, but + * unnecessary. + * + * Also, the precedence order is: + * ALL_STATIC (since we can't #undef something outside our namespace) + * PNG_BUILD_DLL + * PNG_STATIC + * (nothing) == PNG_USE_DLL + * + * CYGWIN (2002-01-20): The preceding is now obsolete. With the advent + * of auto-import in binutils, we no longer need to worry about + * __declspec(dllexport) / __declspec(dllimport) and friends. Therefore, + * we don't need to worry about PNG_STATIC or ALL_STATIC when it comes + * to __declspec() stuff. However, we DO need to worry about + * PNG_BUILD_DLL and PNG_STATIC because those change some defaults + * such as CONSOLE_IO and whether GLOBAL_ARRAYS are allowed. + */ +#if defined(__CYGWIN__) +# if defined(ALL_STATIC) +# if defined(PNG_BUILD_DLL) +# undef PNG_BUILD_DLL +# endif +# if defined(PNG_USE_DLL) +# undef PNG_USE_DLL +# endif +# if defined(PNG_DLL) +# undef PNG_DLL +# endif +# if !defined(PNG_STATIC) +# define PNG_STATIC +# endif +# else +# if defined (PNG_BUILD_DLL) +# if defined(PNG_STATIC) +# undef PNG_STATIC +# endif +# if defined(PNG_USE_DLL) +# undef PNG_USE_DLL +# endif +# if !defined(PNG_DLL) +# define PNG_DLL +# endif +# else +# if defined(PNG_STATIC) +# if defined(PNG_USE_DLL) +# undef PNG_USE_DLL +# endif +# if defined(PNG_DLL) +# undef PNG_DLL +# endif +# else +# if !defined(PNG_USE_DLL) +# define PNG_USE_DLL +# endif +# if !defined(PNG_DLL) +# define PNG_DLL +# endif +# endif +# endif +# endif +#endif + +/* This protects us against compilers that run on a windowing system + * and thus don't have or would rather us not use the stdio types: + * stdin, stdout, and stderr. The only one currently used is stderr + * in png_error() and png_warning(). #defining PNG_NO_CONSOLE_IO will + * prevent these from being compiled and used. #defining PNG_NO_STDIO + * will also prevent these, plus will prevent the entire set of stdio + * macros and functions (FILE *, printf, etc.) from being compiled and used, + * unless (PNG_DEBUG > 0) has been #defined. + * + * #define PNG_NO_CONSOLE_IO + * #define PNG_NO_STDIO + */ + +#if defined(_WIN32_WCE) +# include + /* Console I/O functions are not supported on WindowsCE */ +# define PNG_NO_CONSOLE_IO + /* abort() may not be supported on some/all Windows CE platforms */ +# define PNG_ABORT() exit(-1) +# ifdef PNG_DEBUG +# undef PNG_DEBUG +# endif +#endif + +#ifdef PNG_BUILD_DLL +# ifndef PNG_CONSOLE_IO_SUPPORTED +# ifndef PNG_NO_CONSOLE_IO +# define PNG_NO_CONSOLE_IO +# endif +# endif +#endif + +# ifdef PNG_NO_STDIO +# ifndef PNG_NO_CONSOLE_IO +# define PNG_NO_CONSOLE_IO +# endif +# ifdef PNG_DEBUG +# if (PNG_DEBUG > 0) +# include +# endif +# endif +# else +# if !defined(_WIN32_WCE) +/* "stdio.h" functions are not supported on WindowsCE */ +# include +# endif +# endif + +/* This macro protects us against machines that don't have function + * prototypes (ie K&R style headers). If your compiler does not handle + * function prototypes, define this macro and use the included ansi2knr. + * I've always been able to use _NO_PROTO as the indicator, but you may + * need to drag the empty declaration out in front of here, or change the + * ifdef to suit your own needs. + */ +#ifndef PNGARG + +#ifdef OF /* zlib prototype munger */ +# define PNGARG(arglist) OF(arglist) +#else + +#ifdef _NO_PROTO +# define PNGARG(arglist) () +# ifndef PNG_TYPECAST_NULL +# define PNG_TYPECAST_NULL +# endif +#else +# define PNGARG(arglist) arglist +#endif /* _NO_PROTO */ + + +#endif /* OF */ + +#endif /* PNGARG */ + +/* Try to determine if we are compiling on a Mac. Note that testing for + * just __MWERKS__ is not good enough, because the Codewarrior is now used + * on non-Mac platforms. + */ +#ifndef MACOS +# if (defined(__MWERKS__) && defined(macintosh)) || defined(applec) || \ + defined(THINK_C) || defined(__SC__) || defined(TARGET_OS_MAC) +# define MACOS +# endif +#endif + +/* enough people need this for various reasons to include it here */ +#if !defined(MACOS) && !defined(RISCOS) && !defined(_WIN32_WCE) +# include +#endif + +#if !defined(PNG_SETJMP_NOT_SUPPORTED) && !defined(PNG_NO_SETJMP_SUPPORTED) +# define PNG_SETJMP_SUPPORTED +#endif + +#ifdef PNG_SETJMP_SUPPORTED +/* This is an attempt to force a single setjmp behaviour on Linux. If + * the X config stuff didn't define _BSD_SOURCE we wouldn't need this. + * + * You can bypass this test if you know that your application uses exactly + * the same setjmp.h that was included when libpng was built. Only define + * PNG_SKIP_SETJMP_CHECK while building your application, prior to the + * application's '#include "png.h"'. Don't define PNG_SKIP_SETJMP_CHECK + * while building a separate libpng library for general use. + */ + +# ifndef PNG_SKIP_SETJMP_CHECK +# ifdef __linux__ +# ifdef _BSD_SOURCE +# define PNG_SAVE_BSD_SOURCE +# undef _BSD_SOURCE +# endif +# ifdef _SETJMP_H + /* If you encounter a compiler error here, see the explanation + * near the end of INSTALL. + */ + __pngconf.h__ in libpng already includes setjmp.h; + __dont__ include it again.; +# endif +# endif /* __linux__ */ +# endif /* PNG_SKIP_SETJMP_CHECK */ + + /* include setjmp.h for error handling */ +# include + +# ifdef __linux__ +# ifdef PNG_SAVE_BSD_SOURCE +# ifndef _BSD_SOURCE +# define _BSD_SOURCE +# endif +# undef PNG_SAVE_BSD_SOURCE +# endif +# endif /* __linux__ */ +#endif /* PNG_SETJMP_SUPPORTED */ + +#ifdef BSD +# include +#else +# include +#endif + +/* Other defines for things like memory and the like can go here. */ +#ifdef PNG_INTERNAL + +#include + +/* The functions exported by PNG_EXTERN are PNG_INTERNAL functions, which + * aren't usually used outside the library (as far as I know), so it is + * debatable if they should be exported at all. In the future, when it is + * possible to have run-time registry of chunk-handling functions, some of + * these will be made available again. +#define PNG_EXTERN extern + */ +#define PNG_EXTERN + +/* Other defines specific to compilers can go here. Try to keep + * them inside an appropriate ifdef/endif pair for portability. + */ + +#if defined(PNG_FLOATING_POINT_SUPPORTED) +# if defined(MACOS) + /* We need to check that hasn't already been included earlier + * as it seems it doesn't agree with , yet we should really use + * if possible. + */ +# if !defined(__MATH_H__) && !defined(__MATH_H) && !defined(__cmath__) +# include +# endif +# else +# include +# endif +# if defined(_AMIGA) && defined(__SASC) && defined(_M68881) + /* Amiga SAS/C: We must include builtin FPU functions when compiling using + * MATH=68881 + */ +# include +# endif +#endif + +/* Codewarrior on NT has linking problems without this. */ +#if (defined(__MWERKS__) && defined(WIN32)) || defined(__STDC__) +# define PNG_ALWAYS_EXTERN +#endif + +/* This provides the non-ANSI (far) memory allocation routines. */ +#if defined(__TURBOC__) && defined(__MSDOS__) +# include +# include +#endif + +/* I have no idea why is this necessary... */ +#if defined(_MSC_VER) && (defined(WIN32) || defined(_Windows) || \ + defined(_WINDOWS) || defined(_WIN32) || defined(__WIN32__)) +# include +#endif + +/* This controls how fine the dithering gets. As this allocates + * a largish chunk of memory (32K), those who are not as concerned + * with dithering quality can decrease some or all of these. + */ +#ifndef PNG_DITHER_RED_BITS +# define PNG_DITHER_RED_BITS 5 +#endif +#ifndef PNG_DITHER_GREEN_BITS +# define PNG_DITHER_GREEN_BITS 5 +#endif +#ifndef PNG_DITHER_BLUE_BITS +# define PNG_DITHER_BLUE_BITS 5 +#endif + +/* This controls how fine the gamma correction becomes when you + * are only interested in 8 bits anyway. Increasing this value + * results in more memory being used, and more pow() functions + * being called to fill in the gamma tables. Don't set this value + * less then 8, and even that may not work (I haven't tested it). + */ + +#ifndef PNG_MAX_GAMMA_8 +# define PNG_MAX_GAMMA_8 11 +#endif + +/* This controls how much a difference in gamma we can tolerate before + * we actually start doing gamma conversion. + */ +#ifndef PNG_GAMMA_THRESHOLD +# define PNG_GAMMA_THRESHOLD 0.05 +#endif + +#endif /* PNG_INTERNAL */ + +/* The following uses const char * instead of char * for error + * and warning message functions, so some compilers won't complain. + * If you do not want to use const, define PNG_NO_CONST here. + */ + +#ifndef PNG_NO_CONST +# define PNG_CONST const +#else +# define PNG_CONST +#endif + +/* The following defines give you the ability to remove code from the + * library that you will not be using. I wish I could figure out how to + * automate this, but I can't do that without making it seriously hard + * on the users. So if you are not using an ability, change the #define + * to and #undef, and that part of the library will not be compiled. If + * your linker can't find a function, you may want to make sure the + * ability is defined here. Some of these depend upon some others being + * defined. I haven't figured out all the interactions here, so you may + * have to experiment awhile to get everything to compile. If you are + * creating or using a shared library, you probably shouldn't touch this, + * as it will affect the size of the structures, and this will cause bad + * things to happen if the library and/or application ever change. + */ + +/* Any features you will not be using can be undef'ed here */ + +/* GR-P, 0.96a: Set "*TRANSFORMS_SUPPORTED as default but allow user + * to turn it off with "*TRANSFORMS_NOT_SUPPORTED" or *PNG_NO_*_TRANSFORMS + * on the compile line, then pick and choose which ones to define without + * having to edit this file. It is safe to use the *TRANSFORMS_NOT_SUPPORTED + * if you only want to have a png-compliant reader/writer but don't need + * any of the extra transformations. This saves about 80 kbytes in a + * typical installation of the library. (PNG_NO_* form added in version + * 1.0.1c, for consistency) + */ + +/* The size of the png_text structure changed in libpng-1.0.6 when + * iTXt support was added. iTXt support was turned off by default through + * libpng-1.2.x, to support old apps that malloc the png_text structure + * instead of calling png_set_text() and letting libpng malloc it. It + * was turned on by default in libpng-1.3.0. + */ + +#if defined(PNG_1_0_X) || defined (PNG_1_2_X) +# ifndef PNG_NO_iTXt_SUPPORTED +# define PNG_NO_iTXt_SUPPORTED +# endif +# ifndef PNG_NO_READ_iTXt +# define PNG_NO_READ_iTXt +# endif +# ifndef PNG_NO_WRITE_iTXt +# define PNG_NO_WRITE_iTXt +# endif +#endif + +#if !defined(PNG_NO_iTXt_SUPPORTED) +# if !defined(PNG_READ_iTXt_SUPPORTED) && !defined(PNG_NO_READ_iTXt) +# define PNG_READ_iTXt +# endif +# if !defined(PNG_WRITE_iTXt_SUPPORTED) && !defined(PNG_NO_WRITE_iTXt) +# define PNG_WRITE_iTXt +# endif +#endif + +/* The following support, added after version 1.0.0, can be turned off here en + * masse by defining PNG_LEGACY_SUPPORTED in case you need binary compatibility + * with old applications that require the length of png_struct and png_info + * to remain unchanged. + */ + +#ifdef PNG_LEGACY_SUPPORTED +# define PNG_NO_FREE_ME +# define PNG_NO_READ_UNKNOWN_CHUNKS +# define PNG_NO_WRITE_UNKNOWN_CHUNKS +# define PNG_NO_READ_USER_CHUNKS +# define PNG_NO_READ_iCCP +# define PNG_NO_WRITE_iCCP +# define PNG_NO_READ_iTXt +# define PNG_NO_WRITE_iTXt +# define PNG_NO_READ_sCAL +# define PNG_NO_WRITE_sCAL +# define PNG_NO_READ_sPLT +# define PNG_NO_WRITE_sPLT +# define PNG_NO_INFO_IMAGE +# define PNG_NO_READ_RGB_TO_GRAY +# define PNG_NO_READ_USER_TRANSFORM +# define PNG_NO_WRITE_USER_TRANSFORM +# define PNG_NO_USER_MEM +# define PNG_NO_READ_EMPTY_PLTE +# define PNG_NO_MNG_FEATURES +# define PNG_NO_FIXED_POINT_SUPPORTED +#endif + +/* Ignore attempt to turn off both floating and fixed point support */ +#if !defined(PNG_FLOATING_POINT_SUPPORTED) || \ + !defined(PNG_NO_FIXED_POINT_SUPPORTED) +# define PNG_FIXED_POINT_SUPPORTED +#endif + +#ifndef PNG_NO_FREE_ME +# define PNG_FREE_ME_SUPPORTED +#endif + +#if defined(PNG_READ_SUPPORTED) + +#if !defined(PNG_READ_TRANSFORMS_NOT_SUPPORTED) && \ + !defined(PNG_NO_READ_TRANSFORMS) +# define PNG_READ_TRANSFORMS_SUPPORTED +#endif + +#ifdef PNG_READ_TRANSFORMS_SUPPORTED +# ifndef PNG_NO_READ_EXPAND +# define PNG_READ_EXPAND_SUPPORTED +# endif +# ifndef PNG_NO_READ_SHIFT +# define PNG_READ_SHIFT_SUPPORTED +# endif +# ifndef PNG_NO_READ_PACK +# define PNG_READ_PACK_SUPPORTED +# endif +# ifndef PNG_NO_READ_BGR +# define PNG_READ_BGR_SUPPORTED +# endif +# ifndef PNG_NO_READ_SWAP +# define PNG_READ_SWAP_SUPPORTED +# endif +# ifndef PNG_NO_READ_PACKSWAP +# define PNG_READ_PACKSWAP_SUPPORTED +# endif +# ifndef PNG_NO_READ_INVERT +# define PNG_READ_INVERT_SUPPORTED +# endif +# ifndef PNG_NO_READ_DITHER +# define PNG_READ_DITHER_SUPPORTED +# endif +# ifndef PNG_NO_READ_BACKGROUND +# define PNG_READ_BACKGROUND_SUPPORTED +# endif +# ifndef PNG_NO_READ_16_TO_8 +# define PNG_READ_16_TO_8_SUPPORTED +# endif +# ifndef PNG_NO_READ_FILLER +# define PNG_READ_FILLER_SUPPORTED +# endif +# ifndef PNG_NO_READ_GAMMA +# define PNG_READ_GAMMA_SUPPORTED +# endif +# ifndef PNG_NO_READ_GRAY_TO_RGB +# define PNG_READ_GRAY_TO_RGB_SUPPORTED +# endif +# ifndef PNG_NO_READ_SWAP_ALPHA +# define PNG_READ_SWAP_ALPHA_SUPPORTED +# endif +# ifndef PNG_NO_READ_INVERT_ALPHA +# define PNG_READ_INVERT_ALPHA_SUPPORTED +# endif +# ifndef PNG_NO_READ_STRIP_ALPHA +# define PNG_READ_STRIP_ALPHA_SUPPORTED +# endif +# ifndef PNG_NO_READ_USER_TRANSFORM +# define PNG_READ_USER_TRANSFORM_SUPPORTED +# endif +# ifndef PNG_NO_READ_RGB_TO_GRAY +# define PNG_READ_RGB_TO_GRAY_SUPPORTED +# endif +#endif /* PNG_READ_TRANSFORMS_SUPPORTED */ + +#if !defined(PNG_NO_PROGRESSIVE_READ) && \ + !defined(PNG_PROGRESSIVE_READ_SUPPORTED) /* if you don't do progressive */ +# define PNG_PROGRESSIVE_READ_SUPPORTED /* reading. This is not talking */ +#endif /* about interlacing capability! You'll */ + /* still have interlacing unless you change the following line: */ + +#define PNG_READ_INTERLACING_SUPPORTED /* required in PNG-compliant decoders */ + +#ifndef PNG_NO_READ_COMPOSITE_NODIV +# ifndef PNG_NO_READ_COMPOSITED_NODIV /* libpng-1.0.x misspelling */ +# define PNG_READ_COMPOSITE_NODIV_SUPPORTED /* well tested on Intel, SGI */ +# endif +#endif + +#if defined(PNG_1_0_X) || defined (PNG_1_2_X) +/* Deprecated, will be removed from version 2.0.0. + Use PNG_MNG_FEATURES_SUPPORTED instead. */ +#ifndef PNG_NO_READ_EMPTY_PLTE +# define PNG_READ_EMPTY_PLTE_SUPPORTED +#endif +#endif + +#endif /* PNG_READ_SUPPORTED */ + +#if defined(PNG_WRITE_SUPPORTED) + +# if !defined(PNG_WRITE_TRANSFORMS_NOT_SUPPORTED) && \ + !defined(PNG_NO_WRITE_TRANSFORMS) +# define PNG_WRITE_TRANSFORMS_SUPPORTED +#endif + +#ifdef PNG_WRITE_TRANSFORMS_SUPPORTED +# ifndef PNG_NO_WRITE_SHIFT +# define PNG_WRITE_SHIFT_SUPPORTED +# endif +# ifndef PNG_NO_WRITE_PACK +# define PNG_WRITE_PACK_SUPPORTED +# endif +# ifndef PNG_NO_WRITE_BGR +# define PNG_WRITE_BGR_SUPPORTED +# endif +# ifndef PNG_NO_WRITE_SWAP +# define PNG_WRITE_SWAP_SUPPORTED +# endif +# ifndef PNG_NO_WRITE_PACKSWAP +# define PNG_WRITE_PACKSWAP_SUPPORTED +# endif +# ifndef PNG_NO_WRITE_INVERT +# define PNG_WRITE_INVERT_SUPPORTED +# endif +# ifndef PNG_NO_WRITE_FILLER +# define PNG_WRITE_FILLER_SUPPORTED /* same as WRITE_STRIP_ALPHA */ +# endif +# ifndef PNG_NO_WRITE_SWAP_ALPHA +# define PNG_WRITE_SWAP_ALPHA_SUPPORTED +# endif +# ifndef PNG_NO_WRITE_INVERT_ALPHA +# define PNG_WRITE_INVERT_ALPHA_SUPPORTED +# endif +# ifndef PNG_NO_WRITE_USER_TRANSFORM +# define PNG_WRITE_USER_TRANSFORM_SUPPORTED +# endif +#endif /* PNG_WRITE_TRANSFORMS_SUPPORTED */ + +#if !defined(PNG_NO_WRITE_INTERLACING_SUPPORTED) && \ + !defined(PNG_WRITE_INTERLACING_SUPPORTED) +#define PNG_WRITE_INTERLACING_SUPPORTED /* not required for PNG-compliant + encoders, but can cause trouble + if left undefined */ +#endif + +#if !defined(PNG_NO_WRITE_WEIGHTED_FILTER) && \ + !defined(PNG_WRITE_WEIGHTED_FILTER) && \ + defined(PNG_FLOATING_POINT_SUPPORTED) +# define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED +#endif + +#ifndef PNG_NO_WRITE_FLUSH +# define PNG_WRITE_FLUSH_SUPPORTED +#endif + +#if defined(PNG_1_0_X) || defined (PNG_1_2_X) +/* Deprecated, see PNG_MNG_FEATURES_SUPPORTED, above */ +#ifndef PNG_NO_WRITE_EMPTY_PLTE +# define PNG_WRITE_EMPTY_PLTE_SUPPORTED +#endif +#endif + +#endif /* PNG_WRITE_SUPPORTED */ + +#ifndef PNG_1_0_X +# ifndef PNG_NO_ERROR_NUMBERS +# define PNG_ERROR_NUMBERS_SUPPORTED +# endif +#endif /* PNG_1_0_X */ + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) +# ifndef PNG_NO_USER_TRANSFORM_PTR +# define PNG_USER_TRANSFORM_PTR_SUPPORTED +# endif +#endif + +#ifndef PNG_NO_STDIO +# define PNG_TIME_RFC1123_SUPPORTED +#endif + +/* This adds extra functions in pngget.c for accessing data from the + * info pointer (added in version 0.99) + * png_get_image_width() + * png_get_image_height() + * png_get_bit_depth() + * png_get_color_type() + * png_get_compression_type() + * png_get_filter_type() + * png_get_interlace_type() + * png_get_pixel_aspect_ratio() + * png_get_pixels_per_meter() + * png_get_x_offset_pixels() + * png_get_y_offset_pixels() + * png_get_x_offset_microns() + * png_get_y_offset_microns() + */ +#if !defined(PNG_NO_EASY_ACCESS) && !defined(PNG_EASY_ACCESS_SUPPORTED) +# define PNG_EASY_ACCESS_SUPPORTED +#endif + +/* PNG_ASSEMBLER_CODE was enabled by default in version 1.2.0 + * and removed from version 1.2.20. The following will be removed + * from libpng-1.4.0 +*/ + +#if defined(PNG_READ_SUPPORTED) && !defined(PNG_NO_OPTIMIZED_CODE) +# ifndef PNG_OPTIMIZED_CODE_SUPPORTED +# define PNG_OPTIMIZED_CODE_SUPPORTED +# endif +#endif + +#if defined(PNG_READ_SUPPORTED) && !defined(PNG_NO_ASSEMBLER_CODE) && defined(__i386__) +# ifndef PNG_ASSEMBLER_CODE_SUPPORTED +# define PNG_ASSEMBLER_CODE_SUPPORTED +# endif + +# if defined(__GNUC__) && defined(__x86_64__) && (__GNUC__ < 4) + /* work around 64-bit gcc compiler bugs in gcc-3.x */ +# if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) +# define PNG_NO_MMX_CODE +# endif +# endif + +# if defined(__APPLE__) +# if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) +# define PNG_NO_MMX_CODE +# endif +# endif + +# if (defined(__MWERKS__) && ((__MWERKS__ < 0x0900) || macintosh)) +# if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) +# define PNG_NO_MMX_CODE +# endif +# endif + +# if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) +# define PNG_MMX_CODE_SUPPORTED +# endif + +#endif +/* end of obsolete code to be removed from libpng-1.4.0 */ + +#if !defined(PNG_1_0_X) +#if !defined(PNG_NO_USER_MEM) && !defined(PNG_USER_MEM_SUPPORTED) +# define PNG_USER_MEM_SUPPORTED +#endif +#endif /* PNG_1_0_X */ + +/* Added at libpng-1.2.6 */ +#if !defined(PNG_1_0_X) +#ifndef PNG_SET_USER_LIMITS_SUPPORTED +#if !defined(PNG_NO_SET_USER_LIMITS) && !defined(PNG_SET_USER_LIMITS_SUPPORTED) +# define PNG_SET_USER_LIMITS_SUPPORTED +#endif +#endif +#endif /* PNG_1_0_X */ + +/* Added at libpng-1.0.16 and 1.2.6. To accept all valid PNGS no matter + * how large, set these limits to 0x7fffffffL + */ +#ifndef PNG_USER_WIDTH_MAX +# define PNG_USER_WIDTH_MAX 1000000L +#endif +#ifndef PNG_USER_HEIGHT_MAX +# define PNG_USER_HEIGHT_MAX 1000000L +#endif + +/* Added at libpng-1.2.34 and 1.4.0 */ +#ifndef PNG_STRING_NEWLINE +#define PNG_STRING_NEWLINE "\n" +#endif + +/* These are currently experimental features, define them if you want */ + +/* very little testing */ +/* +#ifdef PNG_READ_SUPPORTED +# ifndef PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED +# define PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED +# endif +#endif +*/ + +/* This is only for PowerPC big-endian and 680x0 systems */ +/* some testing */ +/* +#ifndef PNG_READ_BIG_ENDIAN_SUPPORTED +# define PNG_READ_BIG_ENDIAN_SUPPORTED +#endif +*/ + +/* Buggy compilers (e.g., gcc 2.7.2.2) need this */ +/* +#define PNG_NO_POINTER_INDEXING +*/ + +/* These functions are turned off by default, as they will be phased out. */ +/* +#define PNG_USELESS_TESTS_SUPPORTED +#define PNG_CORRECT_PALETTE_SUPPORTED +*/ + +/* Any chunks you are not interested in, you can undef here. The + * ones that allocate memory may be expecially important (hIST, + * tEXt, zTXt, tRNS, pCAL). Others will just save time and make png_info + * a bit smaller. + */ + +#if defined(PNG_READ_SUPPORTED) && \ + !defined(PNG_READ_ANCILLARY_CHUNKS_NOT_SUPPORTED) && \ + !defined(PNG_NO_READ_ANCILLARY_CHUNKS) +# define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED +#endif + +#if defined(PNG_WRITE_SUPPORTED) && \ + !defined(PNG_WRITE_ANCILLARY_CHUNKS_NOT_SUPPORTED) && \ + !defined(PNG_NO_WRITE_ANCILLARY_CHUNKS) +# define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED +#endif + +#ifdef PNG_READ_ANCILLARY_CHUNKS_SUPPORTED + +#ifdef PNG_NO_READ_TEXT +# define PNG_NO_READ_iTXt +# define PNG_NO_READ_tEXt +# define PNG_NO_READ_zTXt +#endif +#ifndef PNG_NO_READ_bKGD +# define PNG_READ_bKGD_SUPPORTED +# define PNG_bKGD_SUPPORTED +#endif +#ifndef PNG_NO_READ_cHRM +# define PNG_READ_cHRM_SUPPORTED +# define PNG_cHRM_SUPPORTED +#endif +#ifndef PNG_NO_READ_gAMA +# define PNG_READ_gAMA_SUPPORTED +# define PNG_gAMA_SUPPORTED +#endif +#ifndef PNG_NO_READ_hIST +# define PNG_READ_hIST_SUPPORTED +# define PNG_hIST_SUPPORTED +#endif +#ifndef PNG_NO_READ_iCCP +# define PNG_READ_iCCP_SUPPORTED +# define PNG_iCCP_SUPPORTED +#endif +#ifndef PNG_NO_READ_iTXt +# ifndef PNG_READ_iTXt_SUPPORTED +# define PNG_READ_iTXt_SUPPORTED +# endif +# ifndef PNG_iTXt_SUPPORTED +# define PNG_iTXt_SUPPORTED +# endif +#endif +#ifndef PNG_NO_READ_oFFs +# define PNG_READ_oFFs_SUPPORTED +# define PNG_oFFs_SUPPORTED +#endif +#ifndef PNG_NO_READ_pCAL +# define PNG_READ_pCAL_SUPPORTED +# define PNG_pCAL_SUPPORTED +#endif +#ifndef PNG_NO_READ_sCAL +# define PNG_READ_sCAL_SUPPORTED +# define PNG_sCAL_SUPPORTED +#endif +#ifndef PNG_NO_READ_pHYs +# define PNG_READ_pHYs_SUPPORTED +# define PNG_pHYs_SUPPORTED +#endif +#ifndef PNG_NO_READ_sBIT +# define PNG_READ_sBIT_SUPPORTED +# define PNG_sBIT_SUPPORTED +#endif +#ifndef PNG_NO_READ_sPLT +# define PNG_READ_sPLT_SUPPORTED +# define PNG_sPLT_SUPPORTED +#endif +#ifndef PNG_NO_READ_sRGB +# define PNG_READ_sRGB_SUPPORTED +# define PNG_sRGB_SUPPORTED +#endif +#ifndef PNG_NO_READ_tEXt +# define PNG_READ_tEXt_SUPPORTED +# define PNG_tEXt_SUPPORTED +#endif +#ifndef PNG_NO_READ_tIME +# define PNG_READ_tIME_SUPPORTED +# define PNG_tIME_SUPPORTED +#endif +#ifndef PNG_NO_READ_tRNS +# define PNG_READ_tRNS_SUPPORTED +# define PNG_tRNS_SUPPORTED +#endif +#ifndef PNG_NO_READ_zTXt +# define PNG_READ_zTXt_SUPPORTED +# define PNG_zTXt_SUPPORTED +#endif +#ifndef PNG_NO_READ_UNKNOWN_CHUNKS +# define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED +# ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED +# define PNG_UNKNOWN_CHUNKS_SUPPORTED +# endif +# ifndef PNG_NO_HANDLE_AS_UNKNOWN +# define PNG_HANDLE_AS_UNKNOWN_SUPPORTED +# endif +#endif +#if !defined(PNG_NO_READ_USER_CHUNKS) && \ + defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) +# define PNG_READ_USER_CHUNKS_SUPPORTED +# define PNG_USER_CHUNKS_SUPPORTED +# ifdef PNG_NO_READ_UNKNOWN_CHUNKS +# undef PNG_NO_READ_UNKNOWN_CHUNKS +# endif +# ifdef PNG_NO_HANDLE_AS_UNKNOWN +# undef PNG_NO_HANDLE_AS_UNKNOWN +# endif +#endif +#ifndef PNG_NO_READ_OPT_PLTE +# define PNG_READ_OPT_PLTE_SUPPORTED /* only affects support of the */ +#endif /* optional PLTE chunk in RGB and RGBA images */ +#if defined(PNG_READ_iTXt_SUPPORTED) || defined(PNG_READ_tEXt_SUPPORTED) || \ + defined(PNG_READ_zTXt_SUPPORTED) +# define PNG_READ_TEXT_SUPPORTED +# define PNG_TEXT_SUPPORTED +#endif + +#endif /* PNG_READ_ANCILLARY_CHUNKS_SUPPORTED */ + +#ifdef PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED + +#ifdef PNG_NO_WRITE_TEXT +# define PNG_NO_WRITE_iTXt +# define PNG_NO_WRITE_tEXt +# define PNG_NO_WRITE_zTXt +#endif +#ifndef PNG_NO_WRITE_bKGD +# define PNG_WRITE_bKGD_SUPPORTED +# ifndef PNG_bKGD_SUPPORTED +# define PNG_bKGD_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_cHRM +# define PNG_WRITE_cHRM_SUPPORTED +# ifndef PNG_cHRM_SUPPORTED +# define PNG_cHRM_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_gAMA +# define PNG_WRITE_gAMA_SUPPORTED +# ifndef PNG_gAMA_SUPPORTED +# define PNG_gAMA_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_hIST +# define PNG_WRITE_hIST_SUPPORTED +# ifndef PNG_hIST_SUPPORTED +# define PNG_hIST_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_iCCP +# define PNG_WRITE_iCCP_SUPPORTED +# ifndef PNG_iCCP_SUPPORTED +# define PNG_iCCP_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_iTXt +# ifndef PNG_WRITE_iTXt_SUPPORTED +# define PNG_WRITE_iTXt_SUPPORTED +# endif +# ifndef PNG_iTXt_SUPPORTED +# define PNG_iTXt_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_oFFs +# define PNG_WRITE_oFFs_SUPPORTED +# ifndef PNG_oFFs_SUPPORTED +# define PNG_oFFs_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_pCAL +# define PNG_WRITE_pCAL_SUPPORTED +# ifndef PNG_pCAL_SUPPORTED +# define PNG_pCAL_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_sCAL +# define PNG_WRITE_sCAL_SUPPORTED +# ifndef PNG_sCAL_SUPPORTED +# define PNG_sCAL_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_pHYs +# define PNG_WRITE_pHYs_SUPPORTED +# ifndef PNG_pHYs_SUPPORTED +# define PNG_pHYs_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_sBIT +# define PNG_WRITE_sBIT_SUPPORTED +# ifndef PNG_sBIT_SUPPORTED +# define PNG_sBIT_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_sPLT +# define PNG_WRITE_sPLT_SUPPORTED +# ifndef PNG_sPLT_SUPPORTED +# define PNG_sPLT_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_sRGB +# define PNG_WRITE_sRGB_SUPPORTED +# ifndef PNG_sRGB_SUPPORTED +# define PNG_sRGB_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_tEXt +# define PNG_WRITE_tEXt_SUPPORTED +# ifndef PNG_tEXt_SUPPORTED +# define PNG_tEXt_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_tIME +# define PNG_WRITE_tIME_SUPPORTED +# ifndef PNG_tIME_SUPPORTED +# define PNG_tIME_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_tRNS +# define PNG_WRITE_tRNS_SUPPORTED +# ifndef PNG_tRNS_SUPPORTED +# define PNG_tRNS_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_zTXt +# define PNG_WRITE_zTXt_SUPPORTED +# ifndef PNG_zTXt_SUPPORTED +# define PNG_zTXt_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_UNKNOWN_CHUNKS +# define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED +# ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED +# define PNG_UNKNOWN_CHUNKS_SUPPORTED +# endif +# ifndef PNG_NO_HANDLE_AS_UNKNOWN +# ifndef PNG_HANDLE_AS_UNKNOWN_SUPPORTED +# define PNG_HANDLE_AS_UNKNOWN_SUPPORTED +# endif +# endif +#endif +#if defined(PNG_WRITE_iTXt_SUPPORTED) || defined(PNG_WRITE_tEXt_SUPPORTED) || \ + defined(PNG_WRITE_zTXt_SUPPORTED) +# define PNG_WRITE_TEXT_SUPPORTED +# ifndef PNG_TEXT_SUPPORTED +# define PNG_TEXT_SUPPORTED +# endif +#endif + +#endif /* PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED */ + +/* Turn this off to disable png_read_png() and + * png_write_png() and leave the row_pointers member + * out of the info structure. + */ +#ifndef PNG_NO_INFO_IMAGE +# define PNG_INFO_IMAGE_SUPPORTED +#endif + +/* need the time information for reading tIME chunks */ +#if defined(PNG_tIME_SUPPORTED) +# if !defined(_WIN32_WCE) + /* "time.h" functions are not supported on WindowsCE */ +# include +# endif +#endif + +/* Some typedefs to get us started. These should be safe on most of the + * common platforms. The typedefs should be at least as large as the + * numbers suggest (a png_uint_32 must be at least 32 bits long), but they + * don't have to be exactly that size. Some compilers dislike passing + * unsigned shorts as function parameters, so you may be better off using + * unsigned int for png_uint_16. Likewise, for 64-bit systems, you may + * want to have unsigned int for png_uint_32 instead of unsigned long. + */ + +typedef unsigned long png_uint_32; +typedef long png_int_32; +typedef unsigned short png_uint_16; +typedef short png_int_16; +typedef unsigned char png_byte; + +/* This is usually size_t. It is typedef'ed just in case you need it to + change (I'm not sure if you will or not, so I thought I'd be safe) */ +#ifdef PNG_SIZE_T + typedef PNG_SIZE_T png_size_t; +# define png_sizeof(x) png_convert_size(sizeof(x)) +#else + typedef size_t png_size_t; +# define png_sizeof(x) sizeof(x) +#endif + +/* The following is needed for medium model support. It cannot be in the + * PNG_INTERNAL section. Needs modification for other compilers besides + * MSC. Model independent support declares all arrays and pointers to be + * large using the far keyword. The zlib version used must also support + * model independent data. As of version zlib 1.0.4, the necessary changes + * have been made in zlib. The USE_FAR_KEYWORD define triggers other + * changes that are needed. (Tim Wegner) + */ + +/* Separate compiler dependencies (problem here is that zlib.h always + defines FAR. (SJT) */ +#ifdef __BORLANDC__ +# if defined(__LARGE__) || defined(__HUGE__) || defined(__COMPACT__) +# define LDATA 1 +# else +# define LDATA 0 +# endif + /* GRR: why is Cygwin in here? Cygwin is not Borland C... */ +# if !defined(__WIN32__) && !defined(__FLAT__) && !defined(__CYGWIN__) +# define PNG_MAX_MALLOC_64K +# if (LDATA != 1) +# ifndef FAR +# define FAR __far +# endif +# define USE_FAR_KEYWORD +# endif /* LDATA != 1 */ + /* Possibly useful for moving data out of default segment. + * Uncomment it if you want. Could also define FARDATA as + * const if your compiler supports it. (SJT) +# define FARDATA FAR + */ +# endif /* __WIN32__, __FLAT__, __CYGWIN__ */ +#endif /* __BORLANDC__ */ + + +/* Suggest testing for specific compiler first before testing for + * FAR. The Watcom compiler defines both __MEDIUM__ and M_I86MM, + * making reliance oncertain keywords suspect. (SJT) + */ + +/* MSC Medium model */ +#if defined(FAR) +# if defined(M_I86MM) +# define USE_FAR_KEYWORD +# define FARDATA FAR +# include +# endif +#endif + +/* SJT: default case */ +#ifndef FAR +# define FAR +#endif + +/* At this point FAR is always defined */ +#ifndef FARDATA +# define FARDATA +#endif + +/* Typedef for floating-point numbers that are converted + to fixed-point with a multiple of 100,000, e.g., int_gamma */ +typedef png_int_32 png_fixed_point; + +/* Add typedefs for pointers */ +typedef void FAR * png_voidp; +typedef png_byte FAR * png_bytep; +typedef png_uint_32 FAR * png_uint_32p; +typedef png_int_32 FAR * png_int_32p; +typedef png_uint_16 FAR * png_uint_16p; +typedef png_int_16 FAR * png_int_16p; +typedef PNG_CONST char FAR * png_const_charp; +typedef char FAR * png_charp; +typedef png_fixed_point FAR * png_fixed_point_p; + +#ifndef PNG_NO_STDIO +#if defined(_WIN32_WCE) +typedef HANDLE png_FILE_p; +#else +typedef FILE * png_FILE_p; +#endif +#endif + +#ifdef PNG_FLOATING_POINT_SUPPORTED +typedef double FAR * png_doublep; +#endif + +/* Pointers to pointers; i.e. arrays */ +typedef png_byte FAR * FAR * png_bytepp; +typedef png_uint_32 FAR * FAR * png_uint_32pp; +typedef png_int_32 FAR * FAR * png_int_32pp; +typedef png_uint_16 FAR * FAR * png_uint_16pp; +typedef png_int_16 FAR * FAR * png_int_16pp; +typedef PNG_CONST char FAR * FAR * png_const_charpp; +typedef char FAR * FAR * png_charpp; +typedef png_fixed_point FAR * FAR * png_fixed_point_pp; +#ifdef PNG_FLOATING_POINT_SUPPORTED +typedef double FAR * FAR * png_doublepp; +#endif + +/* Pointers to pointers to pointers; i.e., pointer to array */ +typedef char FAR * FAR * FAR * png_charppp; + +#if defined(PNG_1_0_X) || defined(PNG_1_2_X) +/* SPC - Is this stuff deprecated? */ +/* It'll be removed as of libpng-1.3.0 - GR-P */ +/* libpng typedefs for types in zlib. If zlib changes + * or another compression library is used, then change these. + * Eliminates need to change all the source files. + */ +typedef charf * png_zcharp; +typedef charf * FAR * png_zcharpp; +typedef z_stream FAR * png_zstreamp; +#endif /* (PNG_1_0_X) || defined(PNG_1_2_X) */ + +/* + * Define PNG_BUILD_DLL if the module being built is a Windows + * LIBPNG DLL. + * + * Define PNG_USE_DLL if you want to *link* to the Windows LIBPNG DLL. + * It is equivalent to Microsoft predefined macro _DLL that is + * automatically defined when you compile using the share + * version of the CRT (C Run-Time library) + * + * The cygwin mods make this behavior a little different: + * Define PNG_BUILD_DLL if you are building a dll for use with cygwin + * Define PNG_STATIC if you are building a static library for use with cygwin, + * -or- if you are building an application that you want to link to the + * static library. + * PNG_USE_DLL is defined by default (no user action needed) unless one of + * the other flags is defined. + */ + +#if !defined(PNG_DLL) && (defined(PNG_BUILD_DLL) || defined(PNG_USE_DLL)) +# define PNG_DLL +#endif +/* If CYGWIN, then disallow GLOBAL ARRAYS unless building a static lib. + * When building a static lib, default to no GLOBAL ARRAYS, but allow + * command-line override + */ +#if defined(__CYGWIN__) +# if !defined(PNG_STATIC) +# if defined(PNG_USE_GLOBAL_ARRAYS) +# undef PNG_USE_GLOBAL_ARRAYS +# endif +# if !defined(PNG_USE_LOCAL_ARRAYS) +# define PNG_USE_LOCAL_ARRAYS +# endif +# else +# if defined(PNG_USE_LOCAL_ARRAYS) || defined(PNG_NO_GLOBAL_ARRAYS) +# if defined(PNG_USE_GLOBAL_ARRAYS) +# undef PNG_USE_GLOBAL_ARRAYS +# endif +# endif +# endif +# if !defined(PNG_USE_LOCAL_ARRAYS) && !defined(PNG_USE_GLOBAL_ARRAYS) +# define PNG_USE_LOCAL_ARRAYS +# endif +#endif + +/* Do not use global arrays (helps with building DLL's) + * They are no longer used in libpng itself, since version 1.0.5c, + * but might be required for some pre-1.0.5c applications. + */ +#if !defined(PNG_USE_LOCAL_ARRAYS) && !defined(PNG_USE_GLOBAL_ARRAYS) +# if defined(PNG_NO_GLOBAL_ARRAYS) || \ + (defined(__GNUC__) && defined(PNG_DLL)) || defined(_MSC_VER) +# define PNG_USE_LOCAL_ARRAYS +# else +# define PNG_USE_GLOBAL_ARRAYS +# endif +#endif + +#if defined(__CYGWIN__) +# undef PNGAPI +# define PNGAPI __cdecl +# undef PNG_IMPEXP +# define PNG_IMPEXP +#endif + +/* If you define PNGAPI, e.g., with compiler option "-DPNGAPI=__stdcall", + * you may get warnings regarding the linkage of png_zalloc and png_zfree. + * Don't ignore those warnings; you must also reset the default calling + * convention in your compiler to match your PNGAPI, and you must build + * zlib and your applications the same way you build libpng. + */ + +#if defined(__MINGW32__) && !defined(PNG_MODULEDEF) +# ifndef PNG_NO_MODULEDEF +# define PNG_NO_MODULEDEF +# endif +#endif + +#if !defined(PNG_IMPEXP) && defined(PNG_BUILD_DLL) && !defined(PNG_NO_MODULEDEF) +# define PNG_IMPEXP +#endif + +#if defined(PNG_DLL) || defined(_DLL) || defined(__DLL__ ) || \ + (( defined(_Windows) || defined(_WINDOWS) || \ + defined(WIN32) || defined(_WIN32) || defined(__WIN32__) )) + +# ifndef PNGAPI +# if defined(__GNUC__) || (defined (_MSC_VER) && (_MSC_VER >= 800)) +# define PNGAPI __cdecl +# else +# define PNGAPI _cdecl +# endif +# endif + +# if !defined(PNG_IMPEXP) && (!defined(PNG_DLL) || \ + 0 /* WINCOMPILER_WITH_NO_SUPPORT_FOR_DECLIMPEXP */) +# define PNG_IMPEXP +# endif + +# if !defined(PNG_IMPEXP) + +# define PNG_EXPORT_TYPE1(type,symbol) PNG_IMPEXP type PNGAPI symbol +# define PNG_EXPORT_TYPE2(type,symbol) type PNG_IMPEXP PNGAPI symbol + + /* Borland/Microsoft */ +# if defined(_MSC_VER) || defined(__BORLANDC__) +# if (_MSC_VER >= 800) || (__BORLANDC__ >= 0x500) +# define PNG_EXPORT PNG_EXPORT_TYPE1 +# else +# define PNG_EXPORT PNG_EXPORT_TYPE2 +# if defined(PNG_BUILD_DLL) +# define PNG_IMPEXP __export +# else +# define PNG_IMPEXP /*__import */ /* doesn't exist AFAIK in + VC++ */ +# endif /* Exists in Borland C++ for + C++ classes (== huge) */ +# endif +# endif + +# if !defined(PNG_IMPEXP) +# if defined(PNG_BUILD_DLL) +# define PNG_IMPEXP __declspec(dllexport) +# else +# define PNG_IMPEXP __declspec(dllimport) +# endif +# endif +# endif /* PNG_IMPEXP */ +#else /* !(DLL || non-cygwin WINDOWS) */ +# if (defined(__IBMC__) || defined(__IBMCPP__)) && defined(__OS2__) +# ifndef PNGAPI +# define PNGAPI _System +# endif +# else +# if 0 /* ... other platforms, with other meanings */ +# endif +# endif +#endif + +#ifndef PNGAPI +# define PNGAPI +#endif +#ifndef PNG_IMPEXP +# define PNG_IMPEXP +#endif + +#ifdef PNG_BUILDSYMS +# ifndef PNG_EXPORT +# define PNG_EXPORT(type,symbol) PNG_FUNCTION_EXPORT symbol END +# endif +# ifdef PNG_USE_GLOBAL_ARRAYS +# ifndef PNG_EXPORT_VAR +# define PNG_EXPORT_VAR(type) PNG_DATA_EXPORT +# endif +# endif +#endif + +#ifndef PNG_EXPORT +# define PNG_EXPORT(type,symbol) PNG_IMPEXP type PNGAPI symbol +#endif + +#ifdef PNG_USE_GLOBAL_ARRAYS +# ifndef PNG_EXPORT_VAR +# define PNG_EXPORT_VAR(type) extern PNG_IMPEXP type +# endif +#endif + +/* User may want to use these so they are not in PNG_INTERNAL. Any library + * functions that are passed far data must be model independent. + */ + +#ifndef PNG_ABORT +# define PNG_ABORT() abort() +#endif + +#ifdef PNG_SETJMP_SUPPORTED +# define png_jmpbuf(png_ptr) ((png_ptr)->jmpbuf) +#else +# define png_jmpbuf(png_ptr) \ + (LIBPNG_WAS_COMPILED_WITH__PNG_SETJMP_NOT_SUPPORTED) +#endif + +#if defined(USE_FAR_KEYWORD) /* memory model independent fns */ +/* use this to make far-to-near assignments */ +# define CHECK 1 +# define NOCHECK 0 +# define CVT_PTR(ptr) (png_far_to_near(png_ptr,ptr,CHECK)) +# define CVT_PTR_NOCHECK(ptr) (png_far_to_near(png_ptr,ptr,NOCHECK)) +# define png_snprintf _fsnprintf /* Added to v 1.2.19 */ +# define png_strlen _fstrlen +# define png_memcmp _fmemcmp /* SJT: added */ +# define png_memcpy _fmemcpy +# define png_memset _fmemset +#else /* use the usual functions */ +# define CVT_PTR(ptr) (ptr) +# define CVT_PTR_NOCHECK(ptr) (ptr) +# ifndef PNG_NO_SNPRINTF +# ifdef _MSC_VER +# define png_snprintf _snprintf /* Added to v 1.2.19 */ +# define png_snprintf2 _snprintf +# define png_snprintf6 _snprintf +# else +# define png_snprintf snprintf /* Added to v 1.2.19 */ +# define png_snprintf2 snprintf +# define png_snprintf6 snprintf +# endif +# else + /* You don't have or don't want to use snprintf(). Caution: Using + * sprintf instead of snprintf exposes your application to accidental + * or malevolent buffer overflows. If you don't have snprintf() + * as a general rule you should provide one (you can get one from + * Portable OpenSSH). */ +# define png_snprintf(s1,n,fmt,x1) sprintf(s1,fmt,x1) +# define png_snprintf2(s1,n,fmt,x1,x2) sprintf(s1,fmt,x1,x2) +# define png_snprintf6(s1,n,fmt,x1,x2,x3,x4,x5,x6) \ + sprintf(s1,fmt,x1,x2,x3,x4,x5,x6) +# endif +# define png_strlen strlen +# define png_memcmp memcmp /* SJT: added */ +# define png_memcpy memcpy +# define png_memset memset +#endif +/* End of memory model independent support */ + +/* Just a little check that someone hasn't tried to define something + * contradictory. + */ +#if (PNG_ZBUF_SIZE > 65536L) && defined(PNG_MAX_MALLOC_64K) +# undef PNG_ZBUF_SIZE +# define PNG_ZBUF_SIZE 65536L +#endif + +/* Added at libpng-1.2.8 */ +#endif /* PNG_VERSION_INFO_ONLY */ + +#endif /* PNGCONF_H */ diff --git a/minecraftcpp-master/handheld/lib/include/vld.h b/minecraftcpp-master/handheld/lib/include/vld.h new file mode 100644 index 0000000..27d7b14 --- /dev/null +++ b/minecraftcpp-master/handheld/lib/include/vld.h @@ -0,0 +1,97 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Visual Leak Detector - Import Library Header +// Copyright (c) 2006 Dan Moulding +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +// +// See COPYING.txt for the full terms of the GNU Lesser General Public License. +// +//////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#ifdef _DEBUG + +#pragma comment(lib, "vld.lib") + +// Force a symbolic reference to the global VisualLeakDetector class object from +// the DLL. This enusres that the DLL is loaded and linked with the program, +// even if no code otherwise imports any of the DLL's exports. +#pragma comment(linker, "/include:__imp_?vld@@3VVisualLeakDetector@@A") + +//////////////////////////////////////////////////////////////////////////////// +// +// Visual Leak Detector APIs +// + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +// VLDDisable - Disables Visual Leak Detector's memory leak detection at +// runtime. If memory leak detection is already disabled, then calling this +// function has no effect. +// +// Note: In multithreaded programs, this function operates on a per-thread +// basis. In other words, if you call this function from one thread, then +// memory leak detection is only disabled for that thread. If memory leak +// detection is enabled for other threads, then it will remain enabled for +// those other threads. It was designed to work this way to insulate you, +// the programmer, from having to ensure thread synchronization when calling +// VLDEnable() and VLDDisable(). Without this, calling these two functions +// unsychronized could result in unpredictable and unintended behavior. +// But this also means that if you want to disable memory leak detection +// process-wide, then you need to call this function from every thread in +// the process. +// +// Return Value: +// +// None. +// +__declspec(dllimport) void VLDDisable (); + +// VLDEnable - Enables Visual Leak Detector's memory leak detection at runtime. +// If memory leak detection is already enabled, which it is by default, then +// calling this function has no effect. +// +// Note: In multithreaded programs, this function operates on a per-thread +// basis. In other words, if you call this function from one thread, then +// memory leak detection is only enabled for that thread. If memory leak +// detection is disabled for other threads, then it will remain disabled for +// those other threads. It was designed to work this way to insulate you, +// the programmer, from having to ensure thread synchronization when calling +// VLDEnable() and VLDDisable(). Without this, calling these two functions +// unsychronized could result in unpredictable and unintended behavior. +// But this also means that if you want to enable memory leak detection +// process-wide, then you need to call this function from every thread in +// the process. +// +// Return Value: +// +// None. +// +__declspec(dllimport) void VLDEnable (); + +#ifdef __cplusplus +} +#endif // __cplusplus + +#else // !_DEBUG + +#define VLDEnable() +#define VLDDisable() + +#endif // _DEBUG diff --git a/minecraftcpp-master/handheld/lib/include/zconf.h b/minecraftcpp-master/handheld/lib/include/zconf.h new file mode 100644 index 0000000..03a9431 --- /dev/null +++ b/minecraftcpp-master/handheld/lib/include/zconf.h @@ -0,0 +1,332 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + */ +#ifdef Z_PREFIX +# define deflateInit_ z_deflateInit_ +# define deflate z_deflate +# define deflateEnd z_deflateEnd +# define inflateInit_ z_inflateInit_ +# define inflate z_inflate +# define inflateEnd z_inflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateSetDictionary z_deflateSetDictionary +# define deflateCopy z_deflateCopy +# define deflateReset z_deflateReset +# define deflateParams z_deflateParams +# define deflateBound z_deflateBound +# define deflatePrime z_deflatePrime +# define inflateInit2_ z_inflateInit2_ +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateCopy z_inflateCopy +# define inflateReset z_inflateReset +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# define uncompress z_uncompress +# define adler32 z_adler32 +# define crc32 z_crc32 +# define get_crc_table z_get_crc_table +# define zError z_zError + +# define alloc_func z_alloc_func +# define free_func z_free_func +# define in_func z_in_func +# define out_func z_out_func +# define Byte z_Byte +# define uInt z_uInt +# define uLong z_uLong +# define Bytef z_Bytef +# define charf z_charf +# define intf z_intf +# define uIntf z_uIntf +# define uLongf z_uLongf +# define voidpf z_voidpf +# define voidp z_voidp +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +/* Some Mac compilers merge all .h files incorrectly: */ +#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) +# define NO_DUMMY_DECL +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ +# include /* for off_t */ +# include /* for SEEK_* and off_t */ +# ifdef VMS +# include /* for off_t */ +# endif +# define z_off_t off_t +#endif +#ifndef SEEK_SET +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif +#ifndef z_off_t +# define z_off_t long +#endif + +#if defined(__OS400__) +# define NO_vsnprintf +#endif + +#if defined(__MVS__) +# define NO_vsnprintf +# ifdef FAR +# undef FAR +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) +# pragma map(deflateInit_,"DEIN") +# pragma map(deflateInit2_,"DEIN2") +# pragma map(deflateEnd,"DEEND") +# pragma map(deflateBound,"DEBND") +# pragma map(inflateInit_,"ININ") +# pragma map(inflateInit2_,"ININ2") +# pragma map(inflateEnd,"INEND") +# pragma map(inflateSync,"INSY") +# pragma map(inflateSetDictionary,"INSEDI") +# pragma map(compressBound,"CMBND") +# pragma map(inflate_table,"INTABL") +# pragma map(inflate_fast,"INFA") +# pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/minecraftcpp-master/handheld/lib/include/zlib.h b/minecraftcpp-master/handheld/lib/include/zlib.h new file mode 100644 index 0000000..0228179 --- /dev/null +++ b/minecraftcpp-master/handheld/lib/include/zlib.h @@ -0,0 +1,1357 @@ +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.3, July 18th, 2005 + + Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt + (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). +*/ + +#ifndef ZLIB_H +#define ZLIB_H + +#include "zconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.2.3" +#define ZLIB_VERNUM 0x1230 + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed + data. This version of the library supports only one compression method + (deflation) but other algorithms will be added later and will have the same + stream interface. + + Compression can be done in a single step if the buffers are large + enough (for example if an input file is mmap'ed), or can be done by + repeated calls of the compression function. In the latter case, the + application must provide more input and/or consume the output + (providing more output space) before each call. + + The compressed data format used by default by the in-memory functions is + the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped + around a deflate stream, which is itself documented in RFC 1951. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio using the functions that start + with "gz". The gzip format is different from the zlib format. gzip is a + gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. + + This library can optionally read and write gzip streams in memory as well. + + The zlib format was designed to be compact and fast for use in memory + and on communications channels. The gzip format was designed for single- + file compression on file systems, has a larger header than zlib to maintain + directory information, and uses a different, slower check method than zlib. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never + crash even in case of corrupted input. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void (*free_func) OF((voidpf opaque, voidpf address)); + +struct internal_state; + +typedef struct z_stream_s { + Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total nb of input bytes read so far */ + + Bytef *next_out; /* next output byte should be put there */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total nb of bytes output so far */ + + char *msg; /* last error message, NULL if no error */ + struct internal_state FAR *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: binary or text */ + uLong adler; /* adler32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + gzip header information passed to and from zlib routines. See RFC 1952 + for more details on the meanings of these fields. +*/ +typedef struct gz_header_s { + int text; /* true if compressed data believed to be text */ + uLong time; /* modification time */ + int xflags; /* extra flags (not used when writing a gzip file) */ + int os; /* operating system */ + Bytef *extra; /* pointer to extra field or Z_NULL if none */ + uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ + uInt extra_max; /* space at extra (only when reading header) */ + Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ + uInt name_max; /* space at name (only when reading header) */ + Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ + uInt comm_max; /* space at comment (only when reading header) */ + int hcrc; /* true if there was or will be a header crc */ + int done; /* true when done reading gzip header (not used + when writing a gzip file) */ +} gz_header; + +typedef gz_header FAR *gz_headerp; + +/* + The application must update next_in and avail_in when avail_in has + dropped to zero. It must update next_out and avail_out when avail_out + has dropped to zero. The application must initialize zalloc, zfree and + opaque before calling the init function. All other fields are set by the + compression library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this + if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, + pointers returned by zalloc for objects of exactly 65536 bytes *must* + have their offset normalized to zero. The default allocation function + provided by this library ensures this (see zutil.c). To reduce memory + requirements and avoid any allocation of 64K objects, at the expense of + compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or + progress reports. After compression, total_in holds the total size of + the uncompressed data and may be saved for use in the decompressor + (particularly if the decompressor wants to decompress everything in + a single step). +*/ + + /* constants */ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +#define Z_BLOCK 5 +/* Allowed flush values; see deflate() and inflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative + * values are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_RLE 3 +#define Z_FIXED 4 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_TEXT 1 +#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ +#define Z_UNKNOWN 2 +/* Possible values of the data_type field (though see inflate()) */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + +#define zlib_version zlibVersion() +/* for compatibility with versions < 1.0.2 */ + + /* basic functions */ + +ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is + not compatible with the zlib.h header file used by the application. + This check is automatically made by deflateInit and inflateInit. + */ + +/* +ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. + If zalloc and zfree are set to Z_NULL, deflateInit updates them to + use default allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at + all (the input data is simply copied a block at a time). + Z_DEFAULT_COMPRESSION requests a default compromise between speed and + compression (currently equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if level is not a valid compression level, + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). + msg is set to null if there is no error message. deflateInit does not + perform any compression: this will be done by deflate(). +*/ + + +ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce some + output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary (in interactive applications). + Some output may be provided even if flush is not set. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating avail_in or avail_out accordingly; avail_out + should never be zero before the call. The application can consume the + compressed output when it wants, for example when the output buffer is full + (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK + and with zero avail_out, it must be called again after making room in the + output buffer because there might be more output pending. + + Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to + decide how much data to accumualte before producing output, in order to + maximize compression. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In particular + avail_in is zero after the call if enough output space has been provided + before the call.) Flushing may degrade compression for some compression + algorithms and so it should be used only when necessary. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out is greater than six to avoid repeated flush markers due to + avail_out == 0 on return. + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there + was enough output space; if deflate returns with Z_OK, this function must be + called again with Z_FINISH and more output space (updated avail_out) but no + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the + stream are deflateReset or deflateEnd. + + Z_FINISH can be used immediately after deflateInit if all the compression + is to be done in a single step. In this case, avail_out must be at least + the value returned by deflateBound (see below). If deflate does not return + Z_STREAM_END, then it must be called again as described above. + + deflate() sets strm->adler to the adler32 checksum of all input read + so far (that is, total_in bytes). + + deflate() may update strm->data_type if it can make a good guess about + the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered + binary. This field is only for information purposes and does not affect + the compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not + fatal, and deflate() can be called again with more input and more output + space to continue compressing. +*/ + + +ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, + msg may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. If next_in is not Z_NULL and avail_in is large enough (the exact + value depends on the compression method), inflateInit determines the + compression method from the zlib header and allocates all data structures + accordingly; otherwise the allocation will be deferred to the first call of + inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to + use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller. msg is set to null if there is no error + message. inflateInit does not perform any decompression apart from reading + the zlib header if present: this will be done by inflate(). (So next_in and + avail_in may be modified, but next_out and avail_out are unchanged.) +*/ + + +ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing + will resume at this point for the next call of inflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there + is no more input data or no more space in the output buffer (see below + about the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating the next_* and avail_* values accordingly. + The application can consume the uncompressed output when it wants, for + example when the output buffer is full (avail_out == 0), or after each + call of inflate(). If inflate returns Z_OK and with zero avail_out, it + must be called again after making room in the output buffer because there + might be more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, + Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() stop + if and when it gets to the next deflate block boundary. When decoding the + zlib or gzip format, this will cause inflate() to return immediately after + the header and before the first block. When doing a raw inflate, inflate() + will go ahead and process the first block, and will return when it gets to + the end of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + Also to assist in this, on return inflate() will set strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 + if inflate() is currently decoding the last block in the deflate stream, + plus 128 if inflate() returned immediately after decoding an end-of-block + code or decoding the complete header up to just before the first byte of the + deflate stream. The end-of-block will not be indicated until all of the + uncompressed data from that block has been written to strm->next_out. The + number of unused bits may in general be greater than seven, except when + bit 7 of data_type is set, in which case the number of unused bits will be + less than eight. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step + (a single call of inflate), the parameter flush should be set to + Z_FINISH. In this case all pending input is processed and all pending + output is flushed; avail_out must be large enough to hold all the + uncompressed data. (The size of the uncompressed data may have been saved + by the compressor for this purpose.) The next operation on this stream must + be inflateEnd to deallocate the decompression state. The use of Z_FINISH + is never required, but can be used to inform inflate that a faster approach + may be used for the single inflate() call. + + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the only effect of the flush parameter in this implementation + is on the return value of inflate(), as noted below, or when it returns early + because Z_BLOCK is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm->adler to the adler32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the adler32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed adler32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() will decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically. Any information + contained in the gzip header is not retained, so applications that need that + information should instead use raw inflate, see inflateInit2() below, or + inflateBack() and perform their own processing of the gzip header and + trailer. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect check + value), Z_STREAM_ERROR if the stream structure was inconsistent (for example + if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, + Z_BUF_ERROR if no progress is possible or if there was not enough room in the + output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may then + call inflateSync() to look for a good compression block if a partial recovery + of the data is desired. +*/ + + +ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state + was inconsistent. In the error case, msg may be set but then points to a + static string (which must not be deallocated). +*/ + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* +ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by + the caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data + with no zlib header or trailer, and will not compute an adler32 check value. + + windowBits can also be greater than 15 for optional gzip encoding. Add + 16 to windowBits to write a simple gzip header and trailer around the + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), + no header crc, and the operating system will be set to 255 (unknown). If a + gzip stream is being written, strm->adler is a crc32 instead of an adler32. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but + is slow and reduces compression ratio; memLevel=9 uses maximum memory + for optimal speed. The default value is 8. See zconf.h for total memory + usage as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match), or Z_RLE to limit match distances to one (run-length + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman + coding and less string matching; it is somewhat intermediate between + Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as + Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy + parameter only affects the compression ratio but not the correctness of the + compressed output even if it is not set appropriately. Z_FIXED prevents the + use of dynamic Huffman codes, allowing for a simpler decoder for special + applications. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid + method). msg is set to null if there is no error message. deflateInit2 does + not perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. This function must be called + immediately after deflateInit, deflateInit2 or deflateReset, before any + call of deflate. The compressor and decompressor must use exactly the same + dictionary (see inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size in + deflate or deflate2. Thus the strings most likely to be useful should be + put at the end of the dictionary, not at the front. In addition, the + current implementation of deflate will use at most the window size minus + 262 bytes of the provided dictionary. + + Upon return of this function, strm->adler is set to the adler32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The adler32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) If a raw deflate was requested, then the + adler32 value is not computed and strm->adler is not set. + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if the compression method is bsort). deflateSetDictionary does not + perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and + can consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +/* + This function is equivalent to deflateEnd followed by deflateInit, + but does not free and reallocate all the internal compression state. + The stream will keep the same compression level and any other attributes + that may have been set by deflateInit2. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + +ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, + int level, + int strategy)); +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2. This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different + strategy. If the compression level is changed, the input available so far + is compressed with the old level (and may be flushed); the new level will + take effect only at the next call of deflate(). + + Before the call of deflateParams, the stream state must be set as for + a call of deflate(), since the currently available input may have to + be compressed and flushed. In particular, strm->avail_out must be non-zero. + + deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR + if strm->avail_out was zero. +*/ + +ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain)); +/* + Fine tune deflate's internal compression parameters. This should only be + used by someone who understands the algorithm used by zlib's deflate for + searching for the best matching string, and even then only by the most + fanatic optimizer trying to squeeze out the last compressed bit for their + specific input data. Read the deflate.c source code for the meaning of the + max_lazy, good_length, nice_length, and max_chain parameters. + + deflateTune() can be called after deflateInit() or deflateInit2(), and + returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. + */ + +ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, + uLong sourceLen)); +/* + deflateBound() returns an upper bound on the compressed size after + deflation of sourceLen bytes. It must be called after deflateInit() + or deflateInit2(). This would be used to allocate an output buffer + for deflation in a single pass, and so would be called before deflate(). +*/ + +ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + deflatePrime() inserts bits in the deflate output stream. The intent + is that this function is used to start off the deflate output with the + bits leftover from a previous deflate stream when appending to it. As such, + this function can only be used for raw deflate, and must be used before the + first deflate() call after a deflateInit2() or deflateReset(). bits must be + less than or equal to 16, and that many of the least significant bits of + value will be inserted in the output. + + deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, + gz_headerp head)); +/* + deflateSetHeader() provides gzip header information for when a gzip + stream is requested by deflateInit2(). deflateSetHeader() may be called + after deflateInit2() or deflateReset() and before the first call of + deflate(). The text, time, os, extra field, name, and comment information + in the provided gz_header structure are written to the gzip header (xflag is + ignored -- the extra flags are set according to the compression level). The + caller must assure that, if not Z_NULL, name and comment are terminated with + a zero byte, and that if extra is not Z_NULL, that extra_len bytes are + available there. If hcrc is true, a gzip header crc is included. Note that + the current versions of the command-line version of gzip (up through version + 1.3.x) do not support header crc's, and will report that it is a "multi-part + gzip file" and give up. + + If deflateSetHeader is not used, the default gzip header has text false, + the time set to zero, and os set to 255, with no extra, name, or comment + fields. The gzip header is returned to the default state by deflateReset(). + + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an adler32 or a crc32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is + a crc32 instead of an adler32. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg + is set to null if there is no error message. inflateInit2 does not perform + any decompression apart from reading the zlib header if present: this will + be done by inflate(). (So next_in and avail_in may be modified, but next_out + and avail_out are unchanged.) +*/ + +ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the adler32 value returned by that call of inflate. + The compressor and decompressor must use exactly the same dictionary (see + deflateSetDictionary). For raw inflate, this function can be called + immediately after inflateInit2() or inflateReset() and before any call of + inflate() to set the dictionary. The application must insure that the + dictionary that was used for compression is provided. + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect adler32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +/* + Skips invalid compressed data until a full flush point (see above the + description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR + if no more input was provided, Z_DATA_ERROR if no flush point has been found, + or Z_STREAM_ERROR if the stream structure was inconsistent. In the success + case, the application may save the current current value of total_in which + indicates where valid compressed data was found. In the error case, the + application may repeatedly call inflateSync, providing more input each time, + until success or end of the input data. +*/ + +ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when randomly accessing a large stream. The + first pass through the stream can periodically record the inflate state, + allowing restarting inflate at those points when randomly accessing the + stream. + + inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate all the internal decompression state. + The stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + +ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + This function inserts bits in the inflate input stream. The intent is + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, + gz_headerp head)); +/* + inflateGetHeader() requests that gzip header information be stored in the + provided gz_header structure. inflateGetHeader() may be called after + inflateInit2() or inflateReset(), and before the first call of inflate(). + As inflate() processes the gzip stream, head->done is zero until the header + is completed, at which time head->done is set to one. If a zlib stream is + being decoded, then head->done is set to -1 to indicate that there will be + no gzip header information forthcoming. Note that Z_BLOCK can be used to + force inflate() to return immediately after header processing is complete + and before any actual data is decompressed. + + The text, time, xflags, and os fields are filled in with the gzip header + contents. hcrc is set to true if there is a header CRC. (The header CRC + was valid if done is set to one.) If extra is not Z_NULL, then extra_max + contains the maximum number of bytes to write to extra. Once done is true, + extra_len contains the actual extra field length, and extra contains the + extra field, or that field truncated if extra_max is less than extra_len. + If name is not Z_NULL, then up to name_max characters are written there, + terminated with a zero unless the length is greater than name_max. If + comment is not Z_NULL, then up to comm_max characters are written there, + terminated with a zero unless the length is greater than comm_max. When + any of extra, name, or comment are not Z_NULL and the respective field is + not present in the header, then that field is set to Z_NULL to signal its + absence. This allows the use of deflateSetHeader() with the returned + structure to duplicate the header. However if those fields are set to + allocated memory, then the application will need to save those pointers + elsewhere so that they can be eventually freed. + + If inflateGetHeader is not used, then the header information is simply + discarded. The header is always checked for validity, including the header + CRC if present. inflateReset() will reset the process to discard the header + information. The application would need to call inflateGetHeader() again to + retrieve the header from the next gzip stream. + + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, + unsigned char FAR *window)); + + Initialize the internal stream state for decompression using inflateBack() + calls. The fields zalloc, zfree and opaque in strm must be initialized + before the call. If zalloc and zfree are Z_NULL, then the default library- + derived memory allocation routines are used. windowBits is the base two + logarithm of the window size, in the range 8..15. window is a caller + supplied buffer of that size. Except for special applications where it is + assured that deflate was used with small window sizes, windowBits must be 15 + and a 32K byte window must be supplied to be able to decompress general + deflate streams. + + See inflateBack() for the usage of these routines. + + inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of + the paramaters are invalid, Z_MEM_ERROR if the internal state could not + be allocated, or Z_VERSION_ERROR if the version of the library does not + match the version of the header file. +*/ + +typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); +typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); + +ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +/* + inflateBack() does a raw inflate with a single call using a call-back + interface for input and output. This is more efficient than inflate() for + file i/o applications in that it avoids copying between the output and the + sliding window by simply making the window itself the output buffer. This + function trusts the application to not change the output buffer passed by + the output function, at least until inflateBack() returns. + + inflateBackInit() must be called first to allocate the internal state + and to initialize the state with the user-provided window buffer. + inflateBack() may then be used multiple times to inflate a complete, raw + deflate stream with each call. inflateBackEnd() is then called to free + the allocated state. + + A raw deflate stream is one with no zlib or gzip header or trailer. + This routine would normally be used in a utility that reads zip or gzip + files and writes out uncompressed files. The utility would decode the + header and process the trailer on its own, hence this routine expects + only the raw deflate stream to decompress. This is different from the + normal behavior of inflate(), which expects either a zlib or gzip header and + trailer around the deflate stream. + + inflateBack() uses two subroutines supplied by the caller that are then + called by inflateBack() for input and output. inflateBack() calls those + routines until it reads a complete deflate stream and writes out all of the + uncompressed data, or until it encounters an error. The function's + parameters and return types are defined above in the in_func and out_func + typedefs. inflateBack() will call in(in_desc, &buf) which should return the + number of bytes of provided input, and a pointer to that input in buf. If + there is no input available, in() must return zero--buf is ignored in that + case--and inflateBack() will return a buffer error. inflateBack() will call + out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() + should return zero on success, or non-zero on failure. If out() returns + non-zero, inflateBack() will return with an error. Neither in() nor out() + are permitted to change the contents of the window provided to + inflateBackInit(), which is also the buffer that out() uses to write from. + The length written by out() will be at most the window size. Any non-zero + amount of input may be provided by in(). + + For convenience, inflateBack() can be provided input on the first call by + setting strm->next_in and strm->avail_in. If that input is exhausted, then + in() will be called. Therefore strm->next_in must be initialized before + calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called + immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in + must also be initialized, and then if strm->avail_in is not zero, input will + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + + The in_desc and out_desc parameters of inflateBack() is passed as the + first parameter of in() and out() respectively when they are called. These + descriptors can be optionally used to pass any information that the caller- + supplied in() and out() functions need to do their job. + + On return, inflateBack() will set strm->next_in and strm->avail_in to + pass back any unused input that was provided by the last in() call. The + return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR + if in() or out() returned an error, Z_DATA_ERROR if there was a format + error in the deflate stream (in which case strm->msg is set to indicate the + nature of the error), or Z_STREAM_ERROR if the stream was not properly + initialized. In the case of Z_BUF_ERROR, an input or output error can be + distinguished using strm->next_in which will be Z_NULL only if in() returned + an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to + out() returning non-zero. (in() will always be called before out(), so + strm->next_in is assured to be defined if out() returns non-zero.) Note + that inflateBack() cannot return Z_OK. +*/ + +ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +/* + All memory allocated by inflateBackInit() is freed. + + inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream + state was inconsistent. +*/ + +ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +/* Return flags indicating compile-time options. + + Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: + 1.0: size of uInt + 3.2: size of uLong + 5.4: size of voidpf (pointer) + 7.6: size of z_off_t + + Compiler, assembler, and debug options: + 8: DEBUG + 9: ASMV or ASMINF -- use ASM code + 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention + 11: 0 (reserved) + + One-time table building (smaller code, but not thread-safe if true): + 12: BUILDFIXED -- build static block decoding tables when needed + 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed + 14,15: 0 (reserved) + + Library content (indicates missing functionality): + 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking + deflate code when not needed) + 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect + and decode gzip streams (to avoid linking crc code) + 18-19: 0 (reserved) + + Operation variations (changes in library functionality): + 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate + 21: FASTEST -- deflate algorithm with only one, lowest compression level + 22,23: 0 (reserved) + + The sprintf variant used by gzprintf (zero is best): + 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + + Remainder: + 27-31: 0 (reserved) + */ + + + /* utility functions */ + +/* + The following utility functions are implemented on top of the + basic stream-oriented functions. To simplify the interface, some + default options are assumed (compression level and memory usage, + standard memory allocation functions). The source code of these + utility functions can easily be modified if you need special options. +*/ + +ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be at least the value returned + by compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + This function can be used to compress a whole file at once if the + input file is mmap'ed. + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level)); +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +/* + compressBound() returns an upper bound on the compressed size after + compress() or compress2() on sourceLen bytes. It would be used before + a compress() or compress2() call to allocate the destination buffer. +*/ + +ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be large enough to hold the + entire uncompressed data. (The size of the uncompressed data must have + been saved previously by the compressor and transmitted to the decompressor + by some mechanism outside the scope of this compression library.) + Upon exit, destLen is the actual size of the compressed buffer. + This function can be used to decompress a whole file at once if the + input file is mmap'ed. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. +*/ + + +typedef voidp gzFile; + +ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); +/* + Opens a gzip (.gz) file for reading or writing. The mode parameter + is as in fopen ("rb" or "wb") but can also include a compression level + ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for + Huffman only compression as in "wb1h", or 'R' for run-length encoding + as in "wb1R". (See the description of deflateInit2 for more information + about the strategy parameter.) + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. + + gzopen returns NULL if the file could not be opened or if there was + insufficient memory to allocate the (de)compression state; errno + can be checked to distinguish the two cases (if errno is zero, the + zlib error is Z_MEM_ERROR). */ + +ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +/* + gzdopen() associates a gzFile with the file descriptor fd. File + descriptors are obtained from calls like open, dup, creat, pipe or + fileno (in the file has been previously opened with fopen). + The mode parameter is as in gzopen. + The next call of gzclose on the returned gzFile will also close the + file descriptor fd, just like fclose(fdopen(fd), mode) closes the file + descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). + gzdopen returns NULL if there was insufficient memory to allocate + the (de)compression state. +*/ + +ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. + gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not + opened for writing. +*/ + +ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +/* + Reads the given number of uncompressed bytes from the compressed file. + If the input file was not in gzip format, gzread copies the given number + of bytes into the buffer. + gzread returns the number of uncompressed bytes actually read (0 for + end of file, -1 for error). */ + +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, + voidpc buf, unsigned len)); +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes actually written + (0 in case of error). +*/ + +ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); +/* + Converts, formats, and writes the args to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written (0 in case of error). The number of + uncompressed bytes written is limited to 4095. The caller should assure that + this limit is not exceeded. If it is exceeded, then gzprintf() will return + return an error (0) with nothing written. In this case, there may also be a + buffer overflow with unpredictable consequences, which is possible only if + zlib was compiled with the insecure functions sprintf() or vsprintf() + because the secure snprintf() or vsnprintf() functions were not available. +*/ + +ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + gzputs returns the number of characters written, or -1 in case of error. +*/ + +ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +/* + Reads bytes from the compressed file until len-1 characters are read, or + a newline character is read and transferred to buf, or an end-of-file + condition is encountered. The string is then terminated with a null + character. + gzgets returns buf, or Z_NULL in case of error. +*/ + +ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +/* + Writes c, converted to an unsigned char, into the compressed file. + gzputc returns the value that was written, or -1 in case of error. +*/ + +ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +/* + Reads one byte from the compressed file. gzgetc returns this byte + or -1 in case of end of file or error. +*/ + +ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +/* + Push one character back onto the stream to be read again later. + Only one character of push-back is allowed. gzungetc() returns the + character pushed, or -1 on failure. gzungetc() will fail if a + character has been pushed but not read yet, or if c is -1. The pushed + character will be discarded if the stream is repositioned with gzseek() + or gzrewind(). +*/ + +ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +/* + Flushes all pending output into the compressed file. The parameter + flush is as in the deflate() function. The return value is the zlib + error number (see function gzerror below). gzflush returns Z_OK if + the flush parameter is Z_FINISH and all output could be flushed. + gzflush should be called only when strictly necessary because it can + degrade compression. +*/ + +ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, + z_off_t offset, int whence)); +/* + Sets the starting position for the next gzread or gzwrite on the + given compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); +/* + Returns the starting position for the next gzread or gzwrite on the + given compressed file. This position represents a number of bytes in the + uncompressed data stream. + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +/* + Returns 1 when EOF has previously been detected reading the given + input stream, otherwise zero. +*/ + +ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +/* + Returns 1 if file is being read directly without decompression, otherwise + zero. +*/ + +ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +/* + Flushes all pending output if necessary, closes the compressed file + and deallocates all the (de)compression state. The return value is the zlib + error number (see function gzerror below). +*/ + +ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +/* + Returns the error message for the last error which occurred on the + given compressed file. errnum is set to zlib error number. If an + error occurred in the file system and not in the compression library, + errnum is set to Z_ERRNO and the application may consult errno + to get the exact error code. +*/ + +ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +/* + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip + file that is being written concurrently. +*/ + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the + compression library. +*/ + +ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is NULL, this function returns + the required initial value for the checksum. + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, + z_off_t len2)); +/* + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 + and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for + each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. +*/ + +ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +/* + Update a running CRC-32 with the bytes buf[0..len-1] and return the + updated CRC-32. If buf is NULL, this function returns the required initial + value for the for the crc. Pre- and post-conditioning (one's complement) is + performed within this function so it shouldn't be done by the application. + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + +ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); + +/* + Combine two CRC-32 check values into one. For two sequences of bytes, + seq1 and seq2 with lengths len1 and len2, CRC-32 check values were + calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 + check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and + len2. +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size)); +ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size)); +#define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) +#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) +#define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, sizeof(z_stream)) + + +#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) + struct internal_state {int dummy;}; /* hack for buggy compilers */ +#endif + +ZEXTERN const char * ZEXPORT zError OF((int)); +ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); +ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); + +#ifdef __cplusplus +} +#endif + +#endif /* ZLIB_H */ diff --git a/minecraftcpp-master/handheld/lib/lib/glew32.lib b/minecraftcpp-master/handheld/lib/lib/glew32.lib new file mode 100644 index 0000000..d92df4d Binary files /dev/null and b/minecraftcpp-master/handheld/lib/lib/glew32.lib differ diff --git a/minecraftcpp-master/handheld/lib/lib/glew32s.lib b/minecraftcpp-master/handheld/lib/lib/glew32s.lib new file mode 100644 index 0000000..92db12d Binary files /dev/null and b/minecraftcpp-master/handheld/lib/lib/glew32s.lib differ diff --git a/minecraftcpp-master/handheld/lib/lib/libEGL.lib b/minecraftcpp-master/handheld/lib/lib/libEGL.lib new file mode 100644 index 0000000..effaf59 Binary files /dev/null and b/minecraftcpp-master/handheld/lib/lib/libEGL.lib differ diff --git a/minecraftcpp-master/handheld/lib/lib/libRakNet.so b/minecraftcpp-master/handheld/lib/lib/libRakNet.so new file mode 100644 index 0000000..6ad3653 Binary files /dev/null and b/minecraftcpp-master/handheld/lib/lib/libRakNet.so differ diff --git a/minecraftcpp-master/handheld/lib/lib/libgles_cm.lib b/minecraftcpp-master/handheld/lib/lib/libgles_cm.lib new file mode 100644 index 0000000..c3ed7dc Binary files /dev/null and b/minecraftcpp-master/handheld/lib/lib/libgles_cm.lib differ diff --git a/minecraftcpp-master/handheld/lib/lib/libpng.lib b/minecraftcpp-master/handheld/lib/lib/libpng.lib new file mode 100644 index 0000000..b693724 Binary files /dev/null and b/minecraftcpp-master/handheld/lib/lib/libpng.lib differ diff --git a/minecraftcpp-master/handheld/lib/lib/vld.lib b/minecraftcpp-master/handheld/lib/lib/vld.lib new file mode 100644 index 0000000..c7b2506 Binary files /dev/null and b/minecraftcpp-master/handheld/lib/lib/vld.lib differ diff --git a/minecraftcpp-master/handheld/lib/lib/zlib.lib b/minecraftcpp-master/handheld/lib/lib/zlib.lib new file mode 100644 index 0000000..d43be7f Binary files /dev/null and b/minecraftcpp-master/handheld/lib/lib/zlib.lib differ diff --git a/minecraftcpp-master/handheld/project/android/.classpath b/minecraftcpp-master/handheld/project/android/.classpath new file mode 100644 index 0000000..78dc9b3 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/minecraftcpp-master/handheld/project/android/.project b/minecraftcpp-master/handheld/project/android/.project new file mode 100644 index 0000000..3bca2bc --- /dev/null +++ b/minecraftcpp-master/handheld/project/android/.project @@ -0,0 +1,33 @@ + + + MinecraftPocketEdition + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/minecraftcpp-master/handheld/project/android/AndroidManifest.xml b/minecraftcpp-master/handheld/project/android/AndroidManifest.xml new file mode 100644 index 0000000..753c88d --- /dev/null +++ b/minecraftcpp-master/handheld/project/android/AndroidManifest.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/minecraftcpp-master/handheld/project/android/ManifestAddons.xml b/minecraftcpp-master/handheld/project/android/ManifestAddons.xml new file mode 100644 index 0000000..2bc3ba6 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android/ManifestAddons.xml @@ -0,0 +1,19 @@ + + + + + + android:debuggable="true" + + + + + + + + + + + + + \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/android/assets/armor/chain_1.png b/minecraftcpp-master/handheld/project/android/assets/armor/chain_1.png new file mode 100644 index 0000000..3632af5 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/armor/chain_1.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/armor/chain_2.png b/minecraftcpp-master/handheld/project/android/assets/armor/chain_2.png new file mode 100644 index 0000000..330425b Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/armor/chain_2.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/armor/cloth_1.png b/minecraftcpp-master/handheld/project/android/assets/armor/cloth_1.png new file mode 100644 index 0000000..f3cf4aa Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/armor/cloth_1.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/armor/cloth_2.png b/minecraftcpp-master/handheld/project/android/assets/armor/cloth_2.png new file mode 100644 index 0000000..15fb908 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/armor/cloth_2.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/armor/diamond_1.png b/minecraftcpp-master/handheld/project/android/assets/armor/diamond_1.png new file mode 100644 index 0000000..339da65 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/armor/diamond_1.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/armor/diamond_2.png b/minecraftcpp-master/handheld/project/android/assets/armor/diamond_2.png new file mode 100644 index 0000000..c220c12 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/armor/diamond_2.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/armor/gold_1.png b/minecraftcpp-master/handheld/project/android/assets/armor/gold_1.png new file mode 100644 index 0000000..885f309 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/armor/gold_1.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/armor/gold_2.png b/minecraftcpp-master/handheld/project/android/assets/armor/gold_2.png new file mode 100644 index 0000000..9d1ea3b Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/armor/gold_2.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/armor/iron_1.png b/minecraftcpp-master/handheld/project/android/assets/armor/iron_1.png new file mode 100644 index 0000000..374ab07 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/armor/iron_1.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/armor/iron_2.png b/minecraftcpp-master/handheld/project/android/assets/armor/iron_2.png new file mode 100644 index 0000000..53af4f4 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/armor/iron_2.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/art/kz.png b/minecraftcpp-master/handheld/project/android/assets/art/kz.png new file mode 100644 index 0000000..a336c94 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/art/kz.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/environment/clouds.png b/minecraftcpp-master/handheld/project/android/assets/environment/clouds.png new file mode 100644 index 0000000..7ad7fa4 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/environment/clouds.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/font/default.png b/minecraftcpp-master/handheld/project/android/assets/font/default.png new file mode 100644 index 0000000..780d2d8 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/font/default.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/font/default8.png b/minecraftcpp-master/handheld/project/android/assets/font/default8.png new file mode 100644 index 0000000..6179312 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/font/default8.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/gui/background.png b/minecraftcpp-master/handheld/project/android/assets/gui/background.png new file mode 100644 index 0000000..b29e009 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/gui/background.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/gui/badge/minecon140.png b/minecraftcpp-master/handheld/project/android/assets/gui/badge/minecon140.png new file mode 100644 index 0000000..07c83a3 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/gui/badge/minecon140.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/gui/bg32.png b/minecraftcpp-master/handheld/project/android/assets/gui/bg32.png new file mode 100644 index 0000000..d9796c4 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/gui/bg32.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/gui/default_world.png b/minecraftcpp-master/handheld/project/android/assets/gui/default_world.png new file mode 100644 index 0000000..17c9cdc Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/gui/default_world.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/gui/gui.png b/minecraftcpp-master/handheld/project/android/assets/gui/gui.png new file mode 100644 index 0000000..0ae80b9 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/gui/gui.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/gui/gui_blocks.png b/minecraftcpp-master/handheld/project/android/assets/gui/gui_blocks.png new file mode 100644 index 0000000..fa4df26 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/gui/gui_blocks.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/gui/icons.png b/minecraftcpp-master/handheld/project/android/assets/gui/icons.png new file mode 100644 index 0000000..8afc25a Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/gui/icons.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/gui/itemframe.png b/minecraftcpp-master/handheld/project/android/assets/gui/itemframe.png new file mode 100644 index 0000000..8e23979 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/gui/itemframe.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/gui/items.png b/minecraftcpp-master/handheld/project/android/assets/gui/items.png new file mode 100644 index 0000000..ace2e9a Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/gui/items.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/gui/spritesheet.png b/minecraftcpp-master/handheld/project/android/assets/gui/spritesheet.png new file mode 100644 index 0000000..b130262 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/gui/spritesheet.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/gui/title.png b/minecraftcpp-master/handheld/project/android/assets/gui/title.png new file mode 100644 index 0000000..5f2e4ff Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/gui/title.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/gui/touchgui.png b/minecraftcpp-master/handheld/project/android/assets/gui/touchgui.png new file mode 100644 index 0000000..3d2221f Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/gui/touchgui.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/item/arrows.png b/minecraftcpp-master/handheld/project/android/assets/item/arrows.png new file mode 100644 index 0000000..75c5828 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/item/arrows.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/item/camera.png b/minecraftcpp-master/handheld/project/android/assets/item/camera.png new file mode 100644 index 0000000..9725189 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/item/camera.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/item/sign.png b/minecraftcpp-master/handheld/project/android/assets/item/sign.png new file mode 100644 index 0000000..e829472 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/item/sign.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/lang/en_US.lang b/minecraftcpp-master/handheld/project/android/assets/lang/en_US.lang new file mode 100644 index 0000000..31a820f --- /dev/null +++ b/minecraftcpp-master/handheld/project/android/assets/lang/en_US.lang @@ -0,0 +1,967 @@ + +language.name=English +language.region=US +language.code=en_US + +gui.done=Done +gui.cancel=Cancel +gui.toMenu=Back to title screen +gui.up=Up +gui.down=Down +gui.yes=Yes +gui.no=No + +menu.singleplayer=Singleplayer +menu.multiplayer=Multiplayer +menu.mods=Texture Packs +menu.options=Options... +menu.quit=Quit Game +menu.returnToMenu=Save and Quit to Title +menu.disconnect=Disconnect +menu.returnToGame=Back to Game +menu.switchingLevel=Switching level +menu.generatingLevel=Generating level +menu.loadingLevel=Loading level +menu.generatingTerrain=Building terrain +menu.simulating=Simulating the world for a bit +menu.respawning=Respawning + +selectWorld.title=Select World +selectWorld.empty=empty +selectWorld.world=World +selectWorld.select=Play Selected World +selectWorld.create=Create New World +selectWorld.createDemo=Play New Demo World +selectWorld.delete=Delete +selectWorld.rename=Rename +selectWorld.deleteQuestion=Are you sure you want to delete this world? +selectWorld.deleteWarning=will be lost forever! (A long time!) +selectWorld.deleteButton=Delete +selectWorld.renameButton=Rename +selectWorld.renameTitle=Rename World +selectWorld.conversion=Must be converted! +selectWorld.newWorld=New World +selectWorld.enterName=World Name +selectWorld.resultFolder=Will be saved in: +selectWorld.enterSeed=Seed for the World Generator +selectWorld.seedInfo=Leave blank for a random seed + +gameMode.survival=Survival Mode +gameMode.creative=Creative Mode +gameMode.hardcore=Hardcore Mode! +gameMode.changed=Your game mode has been changed + +selectWorld.gameMode=Game Mode: +selectWorld.gameMode.survival=Survival +selectWorld.gameMode.survival.line1=Search for resources, crafting, gain +selectWorld.gameMode.survival.line2=levels, health and hunger +selectWorld.gameMode.creative=Creative +selectWorld.gameMode.creative.line1=Unlimited resources, free flying and +selectWorld.gameMode.creative.line2=destroy blocks instantly +selectWorld.gameMode.hardcore=Hardcore +selectWorld.gameMode.hardcore.line1=Same as survival mode, locked at hardest +selectWorld.gameMode.hardcore.line2=difficulty, and one life only +selectWorld.moreWorldOptions=More World Options... +selectWorld.mapFeatures=Generate Structures: +selectWorld.mapFeatures.info=Villages, dungeons etc +selectWorld.mapType=World Type: +selectWorld.mapType.normal=Normal +selectWorld.hardcoreMode=Hardcore: +selectWorld.hardcoreMode.info=World is deleted upon death + +generator.default=Default +generator.flat=Superflat + +selectServer.title=Select Server +selectServer.empty=empty +selectServer.select=Join Server +selectServer.direct=Direct Connect +selectServer.edit=Edit +selectServer.delete=Delete +selectServer.add=Add server +selectServer.defaultName=Minecraft Server +selectServer.deleteQuestion=Are you sure you want to remove this server? +selectServer.deleteWarning=will be lost forever! (A long time!) +selectServer.deleteButton=Delete +selectServer.refresh=Refresh +addServer.title=Edit Server Info +addServer.enterName=Server Name +addServer.enterIp=Server Address +addServer.add=Done + +multiplayer.title=Play Multiplayer +multiplayer.connect=Connect +multiplayer.info1=Minecraft Multiplayer is currently not finished, but there +multiplayer.info2=is some buggy early testing going on. +multiplayer.ipinfo=Enter the IP of a server to connect to it: + +multiplayer.downloadingTerrain=Downloading terrain + +multiplayer.stopSleeping=Leave Bed + +demo.day.1=This demo will last five game days, do your best! +demo.day.2=Day Two +demo.day.3=Day Three +demo.day.4=Day Four +demo.day.5=This is your last day! +demo.day.warning=Your time is almost up! +demo.day.6=You have passed your fifth day, use F2 to save a screenshot of your creation +demo.reminder=The demo time has expired, buy the game to continue or start a new world! +demo.help.movement=Use %1$s, %2$s, %3$s, %4$s and the mouse to move around +demo.help.jump=Jump by pressing %1$s +demo.help.inventory=Use %1$s to open your inventory + +connect.connecting=Connecting to the server... +connect.authorizing=Logging in... +connect.failed=Failed to connect to the server + +disconnect.genericReason=%s +disconnect.disconnected=Disconnected by Server +disconnect.lost=Connection Lost +disconnect.kicked=Was kicked from the game +disconnect.timeout=Timed out +disconnect.closed=Connection closed +disconnect.loginFailed=Failed to login +disconnect.loginFailedInfo=Failed to login: %s +disconnect.quitting=Quitting +disconnect.endOfStream=End of stream +disconnect.overflow=Buffer overflow + +options.off=OFF +options.on=ON +options.title=Options +options.controls=Controls... +options.video=Video Settings... +options.language=Language... +options.languageWarning=Language translations may not be 100% accurate +options.videoTitle=Video Settings +options.music=Music +options.sound=Sound +options.invertMouse=Invert Mouse +options.fov=FOV +options.fov.min=Normal +options.fov.max=Quake Pro +options.gamma=Brightness +options.gamma.min=Moody +options.gamma.max=Bright +options.sensitivity=Sensitivity +options.sensitivity.min=*yawn* +options.sensitivity.max=HYPERSPEED!!! +options.renderDistance=Render Distance +options.renderDistance.tiny=Tiny +options.renderDistance.short=Short +options.renderDistance.normal=Normal +options.renderDistance.far=Far +options.viewBobbing=View Bobbing +options.ao=Smooth Lighting +options.anaglyph=3D Anaglyph +options.framerateLimit=Performance +options.difficulty=Difficulty +options.difficulty.peaceful=Peaceful +options.difficulty.easy=Easy +options.difficulty.normal=Normal +options.difficulty.hard=Hard +options.difficulty.hardcore=Hardcore +options.graphics=Graphics +options.graphics.fancy=Fancy +options.graphics.fast=Fast +options.guiScale=GUI Scale +options.guiScale.auto=Auto +options.guiScale.small=Small +options.guiScale.normal=Normal +options.guiScale.large=Large +options.advancedOpengl=Advanced OpenGL +options.renderClouds=Clouds +options.farWarning1=A 64 bit Java installation is recommended +options.farWarning2=for 'Far' render distance (you have 32 bit) +options.particles=Particles +options.particles.all=All +options.particles.decreased=Decreased +options.particles.minimal=Minimal + +performance.max=Max FPS +performance.balanced=Balanced +performance.powersaver=Power saver + +controls.title=Controls + +key.forward=Forward +key.left=Left +key.back=Back +key.right=Right +key.jump=Jump +key.inventory=Inventory +key.drop=Drop +key.chat=Chat +key.fog=Toggle Fog +key.sneak=Sneak +key.playerlist=List Players +key.attack=Attack +key.use=Use Item +key.pickItem=Pick Block +key.mouseButton=Button %1$s + +texturePack.openFolder=Open texture pack folder +texturePack.title=Select Texture Pack +texturePack.folderInfo=(Place texture pack files here) + +tile.stone.name=Stone +tile.grass.name=Grass Block +tile.dirt.name=Dirt +tile.stonebrick.name=Cobblestone +tile.wood.name=Wooden Planks +tile.sapling.name=Sapling +tile.deadbush.name=Dead Bush +tile.bedrock.name=Bedrock +tile.water.name=Water +tile.lava.name=Lava +tile.sand.name=Sand +tile.sandStone.name=Sandstone +tile.gravel.name=Gravel +tile.oreGold.name=Gold Ore +tile.oreIron.name=Iron Ore +tile.oreCoal.name=Coal Ore +tile.log.name=Wood +tile.leaves.name=Leaves +tile.tallgrass.name=Grass +tile.tallgrass.shrub.name=Shrub +tile.tallgrass.grass.name=Grass +tile.tallgrass.fern.name=Fern +tile.sponge.name=Sponge +tile.glass.name=Glass +tile.thinGlass.name=Glass Pane +tile.cloth.name=Wool +tile.flower.name=Flower +tile.rose.name=Rose +tile.mushroom.name=Mushroom +tile.blockGold.name=Block of Gold +tile.blockIron.name=Block of Iron +tile.stoneSlab.stone.name=Stone Slab +tile.stoneSlab.sand.name=Sandstone Slab +tile.stoneSlab.wood.name=Wooden Slab +tile.stoneSlab.cobble.name=Cobblestone Slab +tile.stoneSlab.brick.name=Bricks Slab +tile.stoneSlab.smoothStoneBrick.name=Stone Bricks Slab +tile.brick.name=Bricks +tile.tnt.name=TNT +tile.bookshelf.name=Bookshelf +tile.stoneMoss.name=Moss Stone +tile.obsidian.name=Obsidian +tile.torch.name=Torch +tile.fire.name=Fire +tile.mobSpawner.name=Monster Spawner +tile.stairsWood.name=Wooden Stairs +tile.chest.name=Chest +tile.redstoneDust.name=Redstone Dust +tile.oreDiamond.name=Diamond Ore +tile.blockDiamond.name=Block of Diamond +tile.workbench.name=Crafting Table +tile.crops.name=Crops +tile.farmland.name=Farmland +tile.furnace.name=Furnace +tile.sign.name=Sign +tile.doorWood.name=Wooden Door +tile.ladder.name=Ladder +tile.rail.name=Rail +tile.goldenRail.name=Powered Rail +tile.detectorRail.name=Detector Rail +tile.stairsStone.name=Stone Stairs +tile.lever.name=Lever +tile.pressurePlate.name=Pressure Plate +tile.doorIron.name=Iron Door +tile.oreRedstone.name=Redstone Ore +tile.notGate.name=Redstone Torch +tile.button.name=Button +tile.snow.name=Snow +tile.ice.name=Ice +tile.cactus.name=Cactus +tile.clay.name=Clay +tile.reeds.name=Sugar cane +tile.jukebox.name=Jukebox +tile.fence.name=Fence +tile.fenceGate.name=Fence Gate +tile.pumpkin.name=Pumpkin +tile.litpumpkin.name=Jack 'o' Lantern +tile.hellrock.name=Netherrack +tile.hellsand.name=Soul Sand +tile.lightgem.name=Glowstone +tile.portal.name=Portal +tile.cloth.black.name=Black Wool +tile.cloth.red.name=Red Wool +tile.cloth.green.name=Green Wool +tile.cloth.brown.name=Brown Wool +tile.cloth.blue.name=Blue Wool +tile.cloth.purple.name=Purple Wool +tile.cloth.cyan.name=Cyan Wool +tile.cloth.silver.name=Light Gray Wool +tile.cloth.gray.name=Gray Wool +tile.cloth.pink.name=Pink Wool +tile.cloth.lime.name=Lime Wool +tile.cloth.yellow.name=Yellow Wool +tile.cloth.lightBlue.name=Blue Light Wool +tile.cloth.magenta.name=Magenta Wool +tile.cloth.orange.name=Orange Wool +tile.cloth.white.name=Wool +tile.oreLapis.name=Lapis Lazuli Ore +tile.blockLapis.name=Lapis Lazuli Block +tile.dispenser.name=Dispenser +tile.musicBlock.name=Note Block +tile.cake.name=Cake +tile.bed.name=Bed +tile.bed.occupied=This bed is occupied +tile.bed.noSleep=You can only sleep at night +tile.bed.notSafe=You may not rest now, there are monsters nearby +tile.bed.notValid=Your home bed was missing or obstructed +tile.lockedchest.name=Locked chest +tile.trapdoor.name=Trapdoor +tile.web.name=Cobweb +tile.stonebricksmooth.name=Stone Bricks +tile.pistonBase.name=Piston +tile.pistonStickyBase.name=Sticky Piston +tile.fenceIron.name=Iron Bars +tile.melon.name=Melon +tile.stairsBrick.name=Brick Stairs +tile.stairsStoneBrickSmooth.name=Stone Brick Stairs +tile.vine.name=Vines +tile.netherBrick.name=Nether Brick +tile.netherFence.name=Nether Brick Fence +tile.stairsNetherBrick.name=Nether Brick Stairs +tile.netherStalk.name=Nether Wart +tile.cauldron.name=Cauldron +tile.enchantmentTable.name=Enchantment Table +tile.whiteStone.name=End Stone +tile.mycel.name=Mycelium +tile.waterlily.name=Lily Pad +tile.dragonEgg.name=Dragon Egg +tile.redstoneLight.name=Redstone Lamp +tile.glowingobsidian.name=Glowing Obsidian +tile.netherreactor.name=Nether Reactor Core +tile.quartzBlock.name=Block of Quartz +tile.stairsQuartz.name=Quartz Stairs +tile.stairsSandStone.name=Sand Stone Stairs +tile.stonecutter.name=Stonecutter + +item.shovelIron.name=Iron Shovel +item.pickaxeIron.name=Iron Pickaxe +item.hatchetIron.name=Iron Axe +item.flintAndSteel.name=Flint and Steel +item.apple.name=Apple +item.cookie.name=Cookie +item.bow.name=Bow +item.arrow.name=Arrow +item.coal.name=Coal +item.charcoal.name=Charcoal +item.emerald.name=Diamond +item.ingotIron.name=Iron Ingot +item.ingotGold.name=Gold Ingot +item.swordIron.name=Iron Sword +item.swordWood.name=Wooden Sword +item.shovelWood.name=Wooden Shovel +item.pickaxeWood.name=Wooden Pickaxe +item.hatchetWood.name=Wooden Axe +item.swordStone.name=Stone Sword +item.shovelStone.name=Stone Shovel +item.pickaxeStone.name=Stone Pickaxe +item.hatchetStone.name=Stone Axe +item.swordDiamond.name=Diamond Sword +item.shovelDiamond.name=Diamond Shovel +item.pickaxeDiamond.name=Diamond Pickaxe +item.hatchetDiamond.name=Diamond Axe +item.stick.name=Stick +item.bowl.name=Bowl +item.mushroomStew.name=Mushroom Stew +item.swordGold.name=Golden Sword +item.shovelGold.name=Golden Shovel +item.pickaxeGold.name=Golden Pickaxe +item.hatchetGold.name=Golden Axe +item.string.name=String +item.feather.name=Feather +item.sulphur.name=Gunpowder +item.hoeWood.name=Wooden Hoe +item.hoeStone.name=Stone Hoe +item.hoeIron.name=Iron Hoe +item.hoeDiamond.name=Diamond Hoe +item.hoeGold.name=Golden Hoe +item.seeds.name=Seeds +item.seeds_pumpkin.name=Pumpkin Seeds +item.seeds_melon.name=Melon Seeds +item.melon.name=Melon +item.wheat.name=Wheat +item.bread.name=Bread +item.helmetCloth.name=Leather Cap +item.chestplateCloth.name=Leather Tunic +item.leggingsCloth.name=Leather Pants +item.bootsCloth.name=Leather Boots +item.helmetChain.name=Chain Helmet +item.chestplateChain.name=Chain Chestplate +item.leggingsChain.name=Chain Leggings +item.bootsChain.name=Chain Boots +item.helmetIron.name=Iron Helmet +item.chestplateIron.name=Iron Chestplate +item.leggingsIron.name=Iron Leggings +item.bootsIron.name=Iron Boots +item.helmetDiamond.name=Diamond Helmet +item.chestplateDiamond.name=Diamond Chestplate +item.leggingsDiamond.name=Diamond Leggings +item.bootsDiamond.name=Diamond Boots +item.helmetGold.name=Golden Helmet +item.chestplateGold.name=Golden Chestplate +item.leggingsGold.name=Golden Leggings +item.bootsGold.name=Golden Boots +item.flint.name=Flint +item.porkchopRaw.name=Raw Porkchop +item.porkchopCooked.name=Cooked Porkchop +item.chickenRaw.name=Raw Chicken +item.chickenCooked.name=Cooked Chicken +item.beefRaw.name=Raw Beef +item.beefCooked.name=Steak +item.painting.name=Painting +item.appleGold.name=Golden Apple +item.sign.name=Sign +item.doorWood.name=Wooden Door +item.bucket.name=Bucket +item.bucketWater.name=Water Bucket +item.bucketLava.name=Lava Bucket +item.minecart.name=Minecart +item.saddle.name=Saddle +item.doorIron.name=Iron Door +item.redstone.name=Redstone +item.snowball.name=Snowball +item.boat.name=Boat +item.leather.name=Leather +item.milk.name=Milk +item.brick.name=Brick +item.clay.name=Clay +item.reeds.name=Sugar Canes +item.paper.name=Paper +item.book.name=Book +item.slimeball.name=Slimeball +item.minecartChest.name=Minecart with Chest +item.minecartFurnace.name=Minecart with Furnace +item.egg.name=Egg +item.compass.name=Compass +item.fishingRod.name=Fishing Rod +item.clock.name=Clock +item.yellowDust.name=Glowstone Dust +item.fishRaw.name=Raw Fish +item.fishCooked.name=Cooked Fish +item.record.name=Music Disc +item.bone.name=Bone +item.dyePowder.black.name=Ink Sac +item.dyePowder.red.name=Rose Red +item.dyePowder.green.name=Cactus Green +item.dyePowder.brown.name=Cocoa Beans +item.dyePowder.blue.name=Lapis Lazuli +item.dyePowder.purple.name=Purple Dye +item.dyePowder.cyan.name=Cyan Dye +item.dyePowder.silver.name=Light Gray Dye +item.dyePowder.gray.name=Gray Dye +item.dyePowder.pink.name=Pink Dye +item.dyePowder.lime.name=Lime Dye +item.dyePowder.yellow.name=Dandelion Yellow +item.dyePowder.lightBlue.name=Light Blue Dye +item.dyePowder.magenta.name=Magenta Dye +item.dyePowder.orange.name=Orange Dye +item.dyePowder.white.name=Bone Meal +item.sugar.name=Sugar +item.cake.name=Cake +item.bed.name=Bed +item.diode.name=Redstone Repeater +item.map.name=Map +item.leaves.name=Leaves +item.shears.name=Shears +item.rottenFlesh.name=Rotten Flesh +item.enderPearl.name=Ender Pearl +item.blazeRod.name=Blaze Rod +item.ghastTear.name=Ghast Tear +item.netherStalkSeeds.name=Nether Wart +item.potion.name=Potion +item.emptyPotion.name=Water Bottle +item.goldNugget.name=Gold Nugget +item.glassBottle.name=Glass Bottle +item.spiderEye.name=Spider Eye +item.fermentedSpiderEye.name=Fermented Spider Eye +item.blazePowder.name=Blaze Powder +item.magmaCream.name=Magma Cream +item.cauldron.name=Cauldron +item.brewingStand.name=Brewing Stand +item.eyeOfEnder.name=Eye of Ender +item.speckledMelon.name=Glistering Melon +item.monsterPlacer.name=Spawn +item.expBottle.name=Bottle o' Enchanting +item.fireball.name=Fire Charge +item.netherbrickItem.name=Nether Brick +item.netherquartz.name=Nether Quartz + +container.inventory=Inventory +container.crafting=Crafting +container.dispenser=Dispenser +container.furnace=Furnace +container.enchant=Enchant +container.creative=Item Selection +container.brewing=Brewing Stand +container.chest=Chest +container.minecart=Minecart + +entity.Item.name=Item +entity.XPOrb.name=Experience Orb + +entity.Arrow.name=Arrow +entity.Snowball.name=Snowball +entity.Painting.name=Painting + +entity.Mob.name=Mob +entity.Monster.name=Monster + +entity.Creeper.name=Creeper +entity.Skeleton.name=Skeleton +entity.Spider.name=Spider +entity.Giant.name=Giant +entity.Zombie.name=Zombie +entity.Slime.name=Slime +entity.Ghast.name=Ghast +entity.PigZombie.name=Zombie Pigman +entity.Enderman.name=Enderman +entity.Silverfish.name=Silverfish +entity.CaveSpider.name=Cave Spider +entity.Blaze.name=Blaze +entity.LavaSlime.name=Magma Cube +entity.MushroomCow.name=Mooshroom +entity.Villager.name=Villager +entity.VillagerGolem.name=Iron Golem +entity.SnowMan.name=Snow Golem +entity.EnderDragon.name=Ender Dragon + +entity.Pig.name=Pig +entity.Sheep.name=Sheep +entity.Cow.name=Cow +entity.Chicken.name=Chicken +entity.Squid.name=Squid +entity.Wolf.name=Wolf +entity.Ozelot.name=Ocelot +entity.Cat.name=Cat + +entity.PrimedTnt.name=Block of TNT +entity.FallingSand.name=Falling Block + +entity.Minecart.name=Minecart +entity.Boat.name=Boat + +entity.Arrow.name=arrow +entity.generic.name=unknown + +death.inFire=%1$s went up in flames +death.onFire=%1$s burned to death +death.lava=%1$s tried to swim in lava +death.inWall=%1$s suffocated in a wall +death.drown=%1$s drowned +death.starve=%1$s starved to death +death.cactus=%1$s was pricked to death +death.fall=%1$s hit the ground too hard +death.outOfWorld=%1$s fell out of the world +death.generic=%1$s died +death.explosion=%1$s blew up +death.magic=%1$s was killed by magic +death.mob=%1$s was slain by %2$s +death.player=%1$s was slain by %2$s +death.arrow=%1$s was shot by %2$s +death.fireball=%1$s was fireballed by %2$s +death.thrown=%1$s was pummeled by %2$s +death.indirectMagic=%1$s was killed by %2$s + +deathScreen.respawn=Respawn +deathScreen.deleteWorld=Delete world +deathScreen.titleScreen=Title screen +deathScreen.score=Score +deathScreen.title.hardcore=Game over! +deathScreen.hardcoreInfo=You cannot respawn in hardcore mode! +deathScreen.title=You died! + +potion.empty=No Effects +potion.moveSpeed=Speed +potion.moveSlowdown=Slowness +potion.digSpeed=Haste +potion.digSlowDown=Mining Fatigue +potion.damageBoost=Strength +potion.weakness=Weakness +potion.heal=Instant Health +potion.harm=Instant Damage +potion.jump=Jump Boost +potion.confusion=Nausea +potion.regeneration=Regeneration +potion.resistance=Resistance +potion.fireResistance=Fire Resistance +potion.waterBreathing=Water Breathing +potion.invisibility=Invisibility +potion.blindness=Blindness +potion.nightVision=Night Vision +potion.hunger=Hunger +potion.poison=Poison + +potion.moveSpeed.postfix=Potion of Swiftness +potion.moveSlowdown.postfix=Potion of Slowness +potion.digSpeed.postfix=Potion of Haste +potion.digSlowDown.postfix=Potion of Dullness +potion.damageBoost.postfix=Potion of Strength +potion.weakness.postfix=Potion of Weakness +potion.heal.postfix=Potion of Healing +potion.harm.postfix=Potion of Harming +potion.jump.postfix=Potion of Leaping +potion.confusion.postfix=Potion of Nausea +potion.regeneration.postfix=Potion of Regeneration +potion.resistance.postfix=Potion of Resistance +potion.fireResistance.postfix=Potion of Fire Resistance +potion.waterBreathing.postfix=Potion of Water Breathing +potion.invisibility.postfix=Potion of Invisibility +potion.blindness.postfix=Potion of Blindness +potion.nightVision.postfix=Potion of Night Vision +potion.hunger.postfix=Potion of Hunger +potion.poison.postfix=Potion of Poison + +potion.potency.0= +potion.potency.1=II +potion.potency.2=III +potion.potency.3=IV + +potion.prefix.grenade=Splash +potion.prefix.mundane=Mundane +potion.prefix.uninteresting=Uninteresting +potion.prefix.bland=Bland +potion.prefix.clear=Clear +potion.prefix.milky=Milky +potion.prefix.diffuse=Diffuse +potion.prefix.artless=Artless +potion.prefix.thin=Thin +potion.prefix.awkward=Awkward +potion.prefix.flat=Flat +potion.prefix.bulky=Bulky +potion.prefix.bungling=Bungling +potion.prefix.buttered=Buttered +potion.prefix.smooth=Smooth +potion.prefix.suave=Suave +potion.prefix.debonair=Debonair +potion.prefix.thick=Thick +potion.prefix.elegant=Elegant +potion.prefix.fancy=Fancy +potion.prefix.charming=Charming +potion.prefix.dashing=Dashing +potion.prefix.refined=Refined +potion.prefix.cordial=Cordial +potion.prefix.sparkling=Sparkling +potion.prefix.potent=Potent +potion.prefix.foul=Foul +potion.prefix.odorless=Odorless +potion.prefix.rank=Rank +potion.prefix.harsh=Harsh +potion.prefix.acrid=Acrid +potion.prefix.gross=Gross +potion.prefix.stinky=Stinky + +enchantment.damage.all=Sharpness +enchantment.damage.undead=Smite +enchantment.damage.arthropods=Bane of Arthropods +enchantment.knockback=Knockback +enchantment.fire=Fire Aspect +enchantment.protect.all=Protection +enchantment.protect.fire=Fire Protection +enchantment.protect.fall=Feather Falling +enchantment.protect.explosion=Blast Protection +enchantment.protect.projectile=Projectile Protection +enchantment.oxygen=Respiration +enchantment.waterWorker=Aqua Affinity +enchantment.digging=Efficiency +enchantment.untouching=Silk Touch +enchantment.durability=Unbreaking +enchantment.lootBonus=Looting +enchantment.lootBonusDigger=Fortune +enchantment.arrowDamage=Power +enchantment.arrowFire=Flame +enchantment.arrowKnockback=Punch +enchantment.arrowInfinite=Infinity + +enchantment.level.1=I +enchantment.level.2=II +enchantment.level.3=III +enchantment.level.4=IV +enchantment.level.5=V +enchantment.level.6=VI +enchantment.level.7=VII +enchantment.level.8=VIII +enchantment.level.9=IX +enchantment.level.10=X + +gui.achievements=Achievements +gui.stats=Statistics + +stat.generalButton=General +stat.blocksButton=Blocks +stat.itemsButton=Items + +stat.used=Times Used +stat.mined=Times Mined +stat.depleted=Times Depleted +stat.crafted=Times Crafted + +stat.startGame=Times played +stat.createWorld=Worlds played +stat.loadWorld=Saves loaded +stat.joinMultiplayer=Multiplayer joins +stat.leaveGame=Games quit + +stat.playOneMinute=Minutes Played + +stat.walkOneCm=Distance Walked +stat.fallOneCm=Distance Fallen +stat.swimOneCm=Distance Swum +stat.flyOneCm=Distance Flown +stat.climbOneCm=Distance Climbed +stat.diveOneCm=Distance Dove +stat.minecartOneCm=Distance by Minecart +stat.boatOneCm=Distance by Boat +stat.pigOneCm=Distance by Pig +stat.jump=Jumps +stat.drop=Items Dropped + +stat.damageDealt=Damage Dealt +stat.damageTaken=Damage Taken +stat.deaths=Number of Deaths +stat.mobKills=Mob Kills +stat.playerKills=Player Kills +stat.fishCaught=Fish Caught + +stat.mineBlock=%1$s Mined +stat.craftItem=%1$s Crafted +stat.useItem=%1$s Used +stat.breakItem=%1$s Depleted + +achievement.get=Achievement get! + +achievement.taken=Taken! + +achievement.requires=Requires '%1$s' +achievement.openInventory=Taking Inventory +achievement.openInventory.desc=Press '%1$s' to open your inventory. +achievement.mineWood=Getting Wood +achievement.mineWood.desc=Attack a tree until a block of wood pops out +achievement.buildWorkBench=Benchmarking +achievement.buildWorkBench.desc=Craft a workbench with four blocks of planks +achievement.buildPickaxe=Time to Mine! +achievement.buildPickaxe.desc=Use planks and sticks to make a pickaxe +achievement.buildFurnace=Hot Topic +achievement.buildFurnace.desc=Construct a furnace out of eight stone blocks +achievement.acquireIron=Acquire Hardware +achievement.acquireIron.desc=Smelt an iron ingot +achievement.buildHoe=Time to Farm! +achievement.buildHoe.desc=Use planks and sticks to make a hoe +achievement.makeBread=Bake Bread +achievement.makeBread.desc=Turn wheat into bread +achievement.bakeCake=The Lie +achievement.bakeCake.desc=Wheat, sugar, milk and eggs! +achievement.buildBetterPickaxe=Getting an Upgrade +achievement.buildBetterPickaxe.desc=Construct a better pickaxe +achievement.cookFish=Delicious Fish +achievement.cookFish.desc=Catch and cook fish! +achievement.onARail=On A Rail +achievement.onARail.desc=Travel by minecart at least 1 km from where you started +achievement.buildSword=Time to Strike! +achievement.buildSword.desc=Use planks and sticks to make a sword +achievement.killEnemy=Monster Hunter +achievement.killEnemy.desc=Attack and destroy a monster +achievement.killCow=Cow Tipper +achievement.killCow.desc=Harvest some leather +achievement.flyPig=When Pigs Fly +achievement.flyPig.desc=Fly a pig off a cliff +achievement.snipeSkeleton=Sniper Duel +achievement.snipeSkeleton.desc=Kill a skeleton with an arrow from more than 50 meters +achievement.diamonds=DIAMONDS! +achievement.diamonds.desc=Acquire diamonds with your iron tools +achievement.portal=We Need to Go Deeper +achievement.portal.desc=Build a portal to the Nether +achievement.ghast=Return to Sender +achievement.ghast.desc=Destroy a Ghast with a fireball +achievement.blazeRod=Into Fire +achievement.blazeRod.desc=Relieve a Blaze of its rod +achievement.potion=Local Brewery +achievement.potion.desc=Brew a potion +achievement.theEnd=The End? +achievement.theEnd.desc=Locate the End +achievement.theEnd2=The End. +achievement.theEnd2.desc=Defeat the Ender Dragon +achievement.enchantments=Enchanter +achievement.enchantments.desc=Use a book, obsidian and diamonds to construct an enchantment table +achievement.overkill=Overkill +achievement.overkill.desc=Deal eight hearts of damage in a single hit +achievement.bookcase=Librarian +achievement.bookcase.desc=Build some bookshelves to improve your enchantment table + +desc.sword=Deals more damage than by hand. +desc.shovel=Used to dig dirt, grass, sand, gravel and snow faster than by hand. +desc.pickaxe=Required to mine stone-related blocks and ore. +desc.hatchet=Used to chop wood-related blocks faster than by hand. +desc.hoe=Used to till dirt and grass blocks to prepare for crops. +desc.doorwood=Wooden doors are activated by using, hitting them or with Redstone. +desc.dooriron=Iron doors can only be opened by Redstone, buttons or switches. +desc.helmet=Gives the user 1.5 Armor when worn. +desc.chestplate=Gives the user 4 Armor when worn. +desc.leggings=Gives the user 3 Armor when worn. +desc.boots=Gives the user 1.5 Armor when worn. +desc.ingot=A shiny ingot which can be used to craft tools made from this material. +desc.block=Used as an expensive building block or compact storage of the ore. +desc.pressureplate=Used to send an electrical charge when stepped on by a player, an animal, or a monster. Wooden Pressure Plates can also be activated by dropping something on them. +desc.stairs=Used for compact staircases. +desc.stairsstonebricksmooth=Used for compact staircases. +desc.stairsnetherbrick=Used for compact staircases. +desc.stairssandstone=Used for compact staircases. +desc.stairsquartzblock=Used for compact staircases. +desc.slab=Used for making long staircases. +desc.halfslab=Used for compact staircases. +desc.torch=Used to create light. Torches also melt snow and ice. +desc.wood=Used as a building material and can be crafted into many things. Can be crafted from any wood. +desc.sandstone=Used as a building material. +desc.sandstone.addon=Is not influenced by gravity like normal Sand. +desc.structblock=Used as a building material. +desc.stick=Used to craft torches, arrows, signs, ladders, fences and as handles for tools and weapons. +desc.bed=Used to sleep until dawn. Changes your spawn point to the bed's position. +desc.craftingtable=Allows you to craft a more varied selection of items than the normal crafting. +desc.furnace=Allows you to smelt ore, create charcoal and glass, and cook fish and porkchops. +desc.chest=Stores blocks and items inside. +desc.fence=Used as a barrier that cannot be jumped over. +desc.ladder=Used to climb vertically. +desc.trapdoor=Work like normal doors, but are a one by one block and lay flat on the ground. +desc.sign=Shows text entered by you or other players. +desc.glowstone=Used to create brighter light than torches. Melts snow/ice and can be used underwater. +desc.tnt=Used to cause explosions. Activated after placing by hitting, or with an electrical charge. +desc.bowl=Used to hold mushroom stew. You keep the bowl when the stew has been eaten. +desc.bucket=Used to hold and transport water, lava and milk. +desc.flintandsteel=Used to detonate TNT. +desc.fishingrod=Used to catch fish. +desc.clock=Displays positions of the Sun and Moon. +desc.compass=Points to your start point. +desc.map=Will create an image of an area explored while held. This can be used for path-finding. +desc.bow=Allows for ranged attacks by using arrows. +desc.arrow=Used as ammunition for bows. +desc.mushroomstew=Restores 5 hearts. +desc.cookie=Restores 0.5 Hearts. Can be stacked up to 8 times. +desc.cake=Restores 1.5 Hearts. Can be used 6 times. +desc.sugar=Used in the cake recipe. +desc.bread=Restores 2.5 Hearts. +desc.goldenapple=Restores 10 Hearts. +desc.lever=Used to send an electrical charge by being turned on or off. Stays in the on or off state until pressed again. +desc.redstonetorch=Constantly sends an electrical charge, or can be used as a receiver/transmitter when connected to the side of a block. +Can also be used for low-level lighting. +desc.redstonerepeater=Used in Redstone circuits as repeater, a delayer, and/or a diode +desc.button=Used to send an electrical charge by being pressed. Stays activated for approximately a second before shutting off again. +desc.dispenser=Used to hold and shoot out items in a random order when given a Redstone charge. +desc.noteblock=Plays a note when triggered. Hit it to change the pitch of the note. Placing this on top of different blocks will change the type of instrument. +desc.rail=Used to guide minecarts. +desc.poweredrail=When powered, accelerates minecarts that pass over it. When unpowered, causes minecarts to stop on it. +desc.detectorrail=Functions like a Pressure Plate (sends a Redstone signal when powered) but can only be activated by a minecart. +desc.minecart=Used to transport you, an animal, or a monster along rails. +desc.minecartwithchest=Used to transport goods along rails. +desc.minecartwithfurnace=Will move along rails and can push other minecarts when coal is put in it. +desc.boat=Used to travel in water more quickly than swimming. +desc.wool=Collected from sheep, and can be colored with dyes. +desc.woolstring=Used as a building material and can be colored with dyes. Can be easily obtained from Sheep. +desc.dyepowder.black=Used as a dye to create black wool. +desc.dyepowder.green=Used as a dye to create green wool. +desc.dyepowder.brown=Used as a dye to create brown wool. +desc.dyepowder.silver=Used as a dye to create silver wool. +desc.dyepowder.yellow=Used as a dye to create yellow wool. +desc.dyepowder.red=Used as a dye to create red wool. +desc.dyepowder.white=Used to instantly grow crops and flowers. Can be used in dye recipes. +desc.dyepowder.pink=Used as a dye to create pink wool. +desc.dyepowder.orange=Used as a dye to create orange wool. +desc.dyepowder.lime=Used as a dye to create lime wool. +desc.dyepowder.gray=Used as a dye to create gray wool. +desc.dyepowder.lightgray=Used as a dye to create light gray wool. +(Note: light gray dye can also be made by combining gray dye with bone meal, letting you make four light gray dyes from every ink sac instead of three.) +desc.dyepowder.lightblue=Used as a dye to create light blue wool. +desc.dyepowder.cyan=Used as a dye to create cyan wool. +desc.dyepowder.purple=Used as a dye to create purple wool. +desc.dyepowder.magenta=Used as a dye to create magenta wool. +desc.dyepowder.blue=Used as dye to create Blue Wool. +desc.jukebox=Plays Music Discs. +desc.diamonds=Use these to create very strong tools, weapons or armor +desc.emerald=Use these to create very strong tools, weapons or armor +desc.jackolantern=Used to create brighter light than torches. Melts snow/ice and can be used underwater. +desc.paper=Used to create books and maps. +desc.book=Used to create a bookshelf. +desc.bookshelf=Used as decoration. +desc.picture=Used as decoration. +desc.ore_gold=Can be mined with an iron pickaxe or better, then smelted in a furnace to produce gold ingots. +desc.ore_iron=Can be mined with a stone pickaxe or better, then smelted in a furnace to produce iron ingots. +desc.ore_coal=Can be mined with a pickaxe to collect coal. +desc.ore_lapis=Can be mined with a stone pickaxe or better to collect lapis lazuli. +desc.ore_diamond=Can be mined with an iron pickaxe or better to collect diamonds. +desc.ore_redstone=Can be mined with an iron pickaxe or better to collect redstone dust. +desc.stone=Can be mined with a pickaxe to collect cobblestone. +desc.dirt=Collected using a shovel. Can be used for construction. +desc.sapling=Can be planted and it will eventually grow into a tree. +desc.bedrock=This cannot be broken. +desc.lava=Sets fire to anything that touches it. Can be collected in a bucket. +desc.sand=Collected using a shovel. Can be smelted into glass using the furnace. Is affected by gravity if there is no other tile underneath it. +desc.gravel=Collected using a shovel. Sometimes produces flint when dug up. Is affected by gravity if there is no other tile underneath it. +desc.log=Chopped using an axe, and can be crafted into planks or used as a fuel. +desc.glass=Created in a furnace by smelting sand. Will break if you try to mine it. +desc.thinglass=Will break if you try to mine it. +desc.stone_brick=Mined from stone using a pickaxe. Can be used to construct a furnace or stone tools. +desc.brick=Baked from clay in a furnace. +desc.clay=Can be baked into bricks in a furnace. +desc.snow=A compact way to store snowballs. +desc.top_snow=Can be dug with a shovel to create snowballs. +desc.tall_grass=Sometimes produces seeds when broken. +desc.flower=Can be crafted into a dye. +desc.mushroom=Can be crafted with a bowl to make stew. +desc.obsidian=Can only be mined with a diamond pickaxe. Is produced by the meeting of water and still lava, and is used to build a portal. +desc.mob_spawner=Spawns monsters into the world. +desc.redstone_dust=Is placed on the ground to carry an electrical charge. +desc.crops=When fully grown, crops can be harvested to collect wheat. +desc.farmland=Ground that has been prepared ready to plant seeds. +desc.cactus=Can be crafted to create a dye. +desc.reeds=Can be crafted to create sugar. +desc.pumpkin=Can be worn as a helmet or crafted with a torch to create a Jack-O-Lantern. +desc.hell_rock=Burns forever if set alight. +desc.hell_sand=Slows the movement of anything walking over it. +desc.portal=Standing in the portal allows you to pass between the overworld and the nether. +desc.apple=Restores health, and can be crafted into a golden apple. +desc.melon=Can be broken into melon slices. +desc.coal=Used as a fuel in a furnace, or crafted to make a torch. +desc.string=Collected by killing a spider, and can be crafted into a bow. +desc.feather=Collected by killing a chicken, and can be crafted into an arrow. +desc.sulphur=Collected by killing a creeper, and can be crafted into TNT. +desc.shears=Used to obtain wool from sheep and to harvest placeable Leaf blocks. +desc.seeds=Can be planted in farmland to grow crops. +desc.wheat=Harvested from crops, and can be used to craft food items. +desc.flint=Collected by digging gravel, and can be used to craft a flint and steel. +desc.porkchopraw=Collected by killing a pig, and can be cooked in a furnace. Restores health. +desc.porkchopcooked=Created by cooking a porkchop in a furnace. Restores health. +desc.beefraw=Collected by killing a cow, and can be cooked in a furnace. Restores health. +desc.beefcooked=Created by cooking a beef in a furnace. Restores health. +desc.chickenraw=Collected by killing a chicken, and can be cooked in a furnace. Restores health. +desc.chickencooked=Created by cooking a chicken in a furnace. Restores health. +desc.saddle=When used on a pig it allows you to ride the pig. +desc.snowball=Collected by digging snow, and can be thrown. +desc.leather=Collected by killing a cow, and can be crafted into armor. +desc.slimeball=Collected by killing a slime. +desc.egg=Dropped randomly by chickens, and can be crafted into food items. +desc.yellow_dust=Collected by mining Glowstone, and can be crafted to make Glowstone blocks again. +desc.fish_raw=Can be eaten to restore health, or cooked in a furnace. +desc.fish_cooked=Created by cooking a raw fish in a furnace. Can be eaten to restore health. +desc.bone=Collected by killing a skeleton. Can be crafted into bone meal. +desc.record=Collected by getting a skeleton to kill a creeper. Can be played in a jukebox. +desc.water=Extinguishes fire and helps crops grow. Can be collected in a bucket. +desc.leaves=When broken sometimes drops a sapling which can then be replanted to grow into a tree. +desc.moss_stone=Can be used for construction and decoration. +desc.stonebricksmooth=Used as building material. +desc.netherreactor=Core of the Nether Reactor +desc.glowingobsidian=Obsidion activated by external source. +desc.lightgem=Used for illumination. +desc.painting=Used as decoration. +desc.hellrock=Is a stone material from the Nether. +desc.netherbrick=Construction block made from Nether bricks. +desc.netherbrickitem=Used to form blocks of Nether bricks. +desc.netherquartz=Quartz from the Nether, used to create Blocks of Quartz. +desc.quartzblock=Decorative block, used to create other kinds of Quartz blocks. +desc.stonecutter=For crafting stoneblocks. +desc.seedsmelon=Allows for more melons. +desc.tile.melon=Can be cut up and eaten. diff --git a/minecraftcpp-master/handheld/project/android/assets/mob/char.png b/minecraftcpp-master/handheld/project/android/assets/mob/char.png new file mode 100644 index 0000000..7cfa08a Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/mob/char.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/mob/chicken.png b/minecraftcpp-master/handheld/project/android/assets/mob/chicken.png new file mode 100644 index 0000000..d481293 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/mob/chicken.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/mob/cow.png b/minecraftcpp-master/handheld/project/android/assets/mob/cow.png new file mode 100644 index 0000000..bc0e89f Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/mob/cow.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/mob/creeper.png b/minecraftcpp-master/handheld/project/android/assets/mob/creeper.png new file mode 100644 index 0000000..e0a5e0a Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/mob/creeper.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/mob/pig.png b/minecraftcpp-master/handheld/project/android/assets/mob/pig.png new file mode 100644 index 0000000..1ed505b Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/mob/pig.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/mob/pigzombie.png b/minecraftcpp-master/handheld/project/android/assets/mob/pigzombie.png new file mode 100644 index 0000000..3521845 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/mob/pigzombie.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/mob/sheep.png b/minecraftcpp-master/handheld/project/android/assets/mob/sheep.png new file mode 100644 index 0000000..a6ed11d Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/mob/sheep.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/mob/sheep_fur.png b/minecraftcpp-master/handheld/project/android/assets/mob/sheep_fur.png new file mode 100644 index 0000000..b00aa8c Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/mob/sheep_fur.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/mob/skeleton.png b/minecraftcpp-master/handheld/project/android/assets/mob/skeleton.png new file mode 100644 index 0000000..9d22339 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/mob/skeleton.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/mob/spider.png b/minecraftcpp-master/handheld/project/android/assets/mob/spider.png new file mode 100644 index 0000000..08344a8 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/mob/spider.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/mob/zombie.png b/minecraftcpp-master/handheld/project/android/assets/mob/zombie.png new file mode 100644 index 0000000..4d47ccf Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/mob/zombie.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/particles.png b/minecraftcpp-master/handheld/project/android/assets/particles.png new file mode 100644 index 0000000..de34f1b Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/particles.png differ diff --git a/minecraftcpp-master/handheld/project/android/assets/terrain.png b/minecraftcpp-master/handheld/project/android/assets/terrain.png new file mode 100644 index 0000000..f14bbed Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/assets/terrain.png differ diff --git a/minecraftcpp-master/handheld/project/android/default.properties b/minecraftcpp-master/handheld/project/android/default.properties new file mode 100644 index 0000000..ccdc921 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android/default.properties @@ -0,0 +1,14 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "build.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-9 +android.library=false +proguard.config=proguard.cfg +android.library.reference.1=../lib_projects/market_licensing/library diff --git a/minecraftcpp-master/handheld/project/android/jni/Android.mk b/minecraftcpp-master/handheld/project/android/jni/Android.mk new file mode 100644 index 0000000..d837124 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android/jni/Android.mk @@ -0,0 +1,267 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_MODULE := minecraftpe +LOCAL_SRC_FILES := ../../../src/main.cpp \ + ../../../src/main_android.cpp \ + ../../../src/platform/audio/SoundSystemSL.cpp \ + ../../../src/platform/input/Controller.cpp \ + ../../../src/platform/input/Keyboard.cpp \ + ../../../src/platform/input/Mouse.cpp \ + ../../../src/platform/input/Multitouch.cpp \ + ../../../src/platform/time.cpp \ + ../../../src/platform/CThread.cpp \ +../../../src/NinecraftApp.cpp \ +../../../src/Performance.cpp \ +../../../src/SharedConstants.cpp \ +../../../src/client/IConfigListener.cpp \ +../../../src/client/Minecraft.cpp \ +../../../src/client/MouseHandler.cpp \ +../../../src/client/Options.cpp \ +../../../src/client/OptionsFile.cpp \ +../../../src/client/OptionStrings.cpp \ +../../../src/client/gamemode/GameMode.cpp \ +../../../src/client/gamemode/CreativeMode.cpp \ +../../../src/client/gamemode/SurvivalMode.cpp \ +../../../src/client/gui/components/Button.cpp \ +../../../src/client/gui/components/GuiElement.cpp \ +../../../src/client/gui/components/GuiElementContainer.cpp \ +../../../src/client/gui/components/ImageButton.cpp \ +../../../src/client/gui/components/ItemPane.cpp \ +../../../src/client/gui/components/InventoryPane.cpp \ +../../../src/client/gui/components/LargeImageButton.cpp \ +../../../src/client/gui/components/NinePatch.cpp \ +../../../src/client/gui/components/OptionsGroup.cpp \ +../../../src/client/gui/components/OptionsItem.cpp \ +../../../src/client/gui/components/OptionsPane.cpp \ +../../../src/client/gui/components/RolledSelectionListH.cpp \ +../../../src/client/gui/components/RolledSelectionListV.cpp \ +../../../src/client/gui/components/ScrolledSelectionList.cpp \ +../../../src/client/gui/components/ScrollingPane.cpp \ +../../../src/client/gui/components/Slider.cpp \ +../../../src/client/gui/components/SmallButton.cpp \ +../../../src/client/gui/Font.cpp \ +../../../src/client/gui/Gui.cpp \ +../../../src/client/gui/GuiComponent.cpp \ +../../../src/client/gui/Screen.cpp \ +../../../src/client/gui/screens/ScreenChooser.cpp \ +../../../src/client/gui/screens/ArmorScreen.cpp \ +../../../src/client/gui/screens/ChatScreen.cpp \ +../../../src/client/gui/screens/ConfirmScreen.cpp \ +../../../src/client/gui/screens/ChestScreen.cpp \ +../../../src/client/gui/screens/DeathScreen.cpp \ +../../../src/client/gui/screens/FurnaceScreen.cpp \ +../../../src/client/gui/screens/InBedScreen.cpp \ +../../../src/client/gui/screens/IngameBlockSelectionScreen.cpp \ +../../../src/client/gui/screens/JoinGameScreen.cpp \ +../../../src/client/gui/screens/OptionsScreen.cpp \ +../../../src/client/gui/screens/PauseScreen.cpp \ +../../../src/client/gui/screens/ProgressScreen.cpp \ +../../../src/client/gui/screens/RenameMPLevelScreen.cpp \ +../../../src/client/gui/screens/SelectWorldScreen.cpp \ +../../../src/client/gui/screens/StartMenuScreen.cpp \ +../../../src/client/gui/screens/TextEditScreen.cpp \ +../../../src/client/gui/screens/touch/TouchIngameBlockSelectionScreen.cpp \ +../../../src/client/gui/screens/touch/TouchJoinGameScreen.cpp \ +../../../src/client/gui/screens/touch/TouchSelectWorldScreen.cpp \ +../../../src/client/gui/screens/touch/TouchStartMenuScreen.cpp \ +../../../src/client/gui/screens/UploadPhotoScreen.cpp \ +../../../src/client/gui/screens/crafting/CraftingFilters.cpp \ +../../../src/client/gui/screens/crafting/PaneCraftingScreen.cpp \ +../../../src/client/gui/screens/crafting/StonecutterScreen.cpp \ +../../../src/client/gui/screens/crafting/WorkbenchScreen.cpp \ +../../../src/client/model/ChickenModel.cpp \ +../../../src/client/model/CowModel.cpp \ +../../../src/client/model/HumanoidModel.cpp \ +../../../src/client/model/PigModel.cpp \ +../../../src/client/model/SheepFurModel.cpp \ +../../../src/client/model/SheepModel.cpp \ +../../../src/client/model/QuadrupedModel.cpp \ +../../../src/client/model/geom/Cube.cpp \ +../../../src/client/model/geom/ModelPart.cpp \ +../../../src/client/model/geom/Polygon.cpp \ +../../../src/client/particle/Particle.cpp \ +../../../src/client/particle/ParticleEngine.cpp \ +../../../src/client/player/LocalPlayer.cpp \ +../../../src/client/player/RemotePlayer.cpp \ +../../../src/client/player/input/KeyboardInput.cpp \ +../../../src/client/player/input/touchscreen/TouchscreenInput.cpp \ +../../../src/client/renderer/Chunk.cpp \ +../../../src/client/renderer/EntityTileRenderer.cpp \ +../../../src/client/renderer/GameRenderer.cpp \ +../../../src/client/renderer/ItemInHandRenderer.cpp \ +../../../src/client/renderer/LevelRenderer.cpp \ +../../../src/client/renderer/RenderChunk.cpp \ +../../../src/client/renderer/RenderList.cpp \ +../../../src/client/renderer/Tesselator.cpp \ +../../../src/client/renderer/Textures.cpp \ +../../../src/client/renderer/TileRenderer.cpp \ +../../../src/client/renderer/gles.cpp \ +../../../src/client/renderer/culling/Frustum.cpp \ +../../../src/client/renderer/entity/ArrowRenderer.cpp \ +../../../src/client/renderer/entity/ChickenRenderer.cpp \ +../../../src/client/renderer/entity/EntityRenderDispatcher.cpp \ +../../../src/client/renderer/entity/EntityRenderer.cpp \ +../../../src/client/renderer/entity/FallingTileRenderer.cpp \ +../../../src/client/renderer/entity/HumanoidMobRenderer.cpp \ +../../../src/client/renderer/entity/ItemRenderer.cpp \ +../../../src/client/renderer/entity/ItemSpriteRenderer.cpp \ +../../../src/client/renderer/entity/MobRenderer.cpp \ +../../../src/client/renderer/entity/PaintingRenderer.cpp \ +../../../src/client/renderer/entity/PlayerRenderer.cpp \ +../../../src/client/renderer/entity/SheepRenderer.cpp \ +../../../src/client/renderer/entity/TntRenderer.cpp \ +../../../src/client/renderer/entity/TripodCameraRenderer.cpp \ +../../../src/client/renderer/ptexture/DynamicTexture.cpp \ +../../../src/client/renderer/tileentity/ChestRenderer.cpp \ +../../../src/client/renderer/tileentity/SignRenderer.cpp \ +../../../src/client/renderer/tileentity/TileEntityRenderDispatcher.cpp \ +../../../src/client/renderer/tileentity/TileEntityRenderer.cpp \ +../../../src/client/sound/Sound.cpp \ +../../../src/client/sound/SoundEngine.cpp \ +../../../src/locale/I18n.cpp \ +../../../src/nbt/Tag.cpp \ +../../../src/network/command/CommandServer.cpp \ +../../../src/network/ClientSideNetworkHandler.cpp \ +../../../src/network/NetEventCallback.cpp \ +../../../src/network/Packet.cpp \ +../../../src/network/RakNetInstance.cpp \ +../../../src/network/ServerSideNetworkHandler.cpp \ +../../../src/server/ServerLevel.cpp \ +../../../src/server/ServerPlayer.cpp \ +../../../src/util/DataIO.cpp \ +../../../src/util/Mth.cpp \ +../../../src/util/StringUtils.cpp \ +../../../src/util/PerfTimer.cpp \ +../../../src/util/PerfRenderer.cpp \ +../../../src/world/Direction.cpp \ +../../../src/world/entity/AgableMob.cpp \ +../../../src/world/entity/Entity.cpp \ +../../../src/world/entity/EntityFactory.cpp \ +../../../src/world/entity/FlyingMob.cpp \ +../../../src/world/entity/HangingEntity.cpp \ +../../../src/world/entity/Mob.cpp \ +../../../src/world/entity/MobCategory.cpp \ +../../../src/world/entity/Motive.cpp \ +../../../src/world/entity/Painting.cpp \ +../../../src/world/entity/PathfinderMob.cpp \ +../../../src/world/entity/SynchedEntityData.cpp \ +../../../src/world/entity/ai/control/MoveControl.cpp \ +../../../src/world/entity/animal/Animal.cpp \ +../../../src/world/entity/animal/Chicken.cpp \ +../../../src/world/entity/animal/Cow.cpp \ +../../../src/world/entity/animal/Pig.cpp \ +../../../src/world/entity/animal/Sheep.cpp \ +../../../src/world/entity/animal/WaterAnimal.cpp \ +../../../src/world/entity/item/FallingTile.cpp \ +../../../src/world/entity/item/ItemEntity.cpp \ +../../../src/world/entity/item/PrimedTnt.cpp \ +../../../src/world/entity/item/TripodCamera.cpp \ +../../../src/world/entity/monster/Creeper.cpp \ +../../../src/world/entity/monster/Monster.cpp \ +../../../src/world/entity/monster/PigZombie.cpp \ +../../../src/world/entity/monster/Skeleton.cpp \ +../../../src/world/entity/monster/Spider.cpp \ +../../../src/world/entity/monster/Zombie.cpp \ +../../../src/world/entity/projectile/Arrow.cpp \ +../../../src/world/entity/projectile/Throwable.cpp \ +../../../src/world/entity/player/Inventory.cpp \ +../../../src/world/entity/player/Player.cpp \ +../../../src/world/food/SimpleFoodData.cpp \ +../../../src/world/inventory/BaseContainerMenu.cpp \ +../../../src/world/inventory/ContainerMenu.cpp \ +../../../src/world/inventory/FillingContainer.cpp \ +../../../src/world/inventory/FurnaceMenu.cpp \ +../../../src/world/item/ArmorItem.cpp \ +../../../src/world/item/BedItem.cpp \ +../../../src/world/item/DyePowderItem.cpp \ +../../../src/world/item/Item.cpp \ +../../../src/world/item/ItemInstance.cpp \ +../../../src/world/item/HangingEntityItem.cpp \ +../../../src/world/item/HatchetItem.cpp \ +../../../src/world/item/HoeItem.cpp \ +../../../src/world/item/PickaxeItem.cpp \ +../../../src/world/item/ShovelItem.cpp \ +../../../src/world/item/crafting/ArmorRecipes.cpp \ +../../../src/world/item/crafting/Recipe.cpp \ +../../../src/world/item/crafting/Recipes.cpp \ +../../../src/world/item/crafting/FurnaceRecipes.cpp \ +../../../src/world/item/crafting/OreRecipes.cpp \ +../../../src/world/item/crafting/StructureRecipes.cpp \ +../../../src/world/item/crafting/ToolRecipes.cpp \ +../../../src/world/item/crafting/WeaponRecipes.cpp \ +../../../src/world/level/Explosion.cpp \ +../../../src/world/level/Level.cpp \ +../../../src/world/level/LightLayer.cpp \ +../../../src/world/level/LightUpdate.cpp \ +../../../src/world/level/MobSpawner.cpp \ +../../../src/world/level/Region.cpp \ +../../../src/world/level/TickNextTickData.cpp \ +../../../src/world/level/biome/Biome.cpp \ +../../../src/world/level/biome/BiomeSource.cpp \ +../../../src/world/level/chunk/LevelChunk.cpp \ +../../../src/world/level/dimension/Dimension.cpp \ +../../../src/world/level/levelgen/CanyonFeature.cpp \ +../../../src/world/level/levelgen/DungeonFeature.cpp \ +../../../src/world/level/levelgen/LargeCaveFeature.cpp \ +../../../src/world/level/levelgen/LargeFeature.cpp \ +../../../src/world/level/levelgen/RandomLevelSource.cpp \ +../../../src/world/level/levelgen/feature/Feature.cpp \ +../../../src/world/level/levelgen/synth/ImprovedNoise.cpp \ +../../../src/world/level/levelgen/synth/PerlinNoise.cpp \ +../../../src/world/level/levelgen/synth/Synth.cpp \ +../../../src/world/level/material/Material.cpp \ +../../../src/world/level/pathfinder/Path.cpp \ +../../../src/world/level/storage/ExternalFileLevelStorage.cpp \ +../../../src/world/level/storage/ExternalFileLevelStorageSource.cpp \ +../../../src/world/level/storage/FolderMethods.cpp \ +../../../src/world/level/storage/LevelData.cpp \ +../../../src/world/level/storage/LevelStorageSource.cpp \ +../../../src/world/level/storage/RegionFile.cpp \ +../../../src/world/level/tile/BedTile.cpp \ +../../../src/world/level/tile/ChestTile.cpp \ +../../../src/world/level/tile/CropTile.cpp \ +../../../src/world/level/tile/DoorTile.cpp \ +../../../src/world/level/tile/EntityTile.cpp \ +../../../src/world/level/tile/FurnaceTile.cpp \ +../../../src/world/level/tile/GrassTile.cpp \ +../../../src/world/level/tile/HeavyTile.cpp \ +../../../src/world/level/tile/LightGemTile.cpp \ +../../../src/world/level/tile/MelonTile.cpp \ +../../../src/world/level/tile/Mushroom.cpp \ +../../../src/world/level/tile/NetherReactor.cpp \ +../../../src/world/level/tile/NetherReactorPattern.cpp \ +../../../src/world/level/tile/StairTile.cpp \ +../../../src/world/level/tile/StemTile.cpp \ +../../../src/world/level/tile/StoneSlabTile.cpp \ +../../../src/world/level/tile/TallGrass.cpp \ +../../../src/world/level/tile/Tile.cpp \ +../../../src/world/level/tile/TrapDoorTile.cpp \ +../../../src/world/level/tile/entity/ChestTileEntity.cpp \ +../../../src/world/level/tile/entity/NetherReactorTileEntity.cpp \ +../../../src/world/level/tile/entity/SignTileEntity.cpp \ +../../../src/world/level/tile/entity/TileEntity.cpp \ +../../../src/world/level/tile/entity/FurnaceTileEntity.cpp \ +../../../src/world/phys/HitResult.cpp + +LOCAL_CFLAGS := -Wno-psabi $(LOCAL_CFLAGS) + +#LOCAL_CFLAGS := -DANDROID_PUBLISH -DDEMO_MODE $(LOCAL_CFLAGS) +#LOCAL_CFLAGS := -DANDROID_PUBLISH $(LOCAL_CFLAGS) + +#LOCAL_CFLAGS := -DDEMO_MODE -DGLDEBUG $(LOCAL_CFLAGS) +#LOCAL_CFLAGS := -DGLDEBUG $(LOCAL_CFLAGS) + +LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv1_CM -lOpenSLES +LOCAL_STATIC_LIBRARIES := android_native_app_glue RakNet + +#LOCAL_CPP_FEATURES := exceptions + +TARGET_ARCH_ABI := armeabi-v7a + +include $(BUILD_SHARED_LIBRARY) + +# NOTE: environment var NDK_MODULE_PATH needs to point to lib_projects folder +$(call import-module,android/native_app_glue) +$(call import-module, raknet/jni) diff --git a/minecraftcpp-master/handheld/project/android/jni/Application.mk b/minecraftcpp-master/handheld/project/android/jni/Application.mk new file mode 100644 index 0000000..4d20cc6 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android/jni/Application.mk @@ -0,0 +1,5 @@ +APP_PLATFORM := android-9 +APP_STL := stlport_static +APP_OPTIM := release +APP_ABI := armeabi-v7a +#APP_ABI := armeabi-v7a x86 diff --git a/minecraftcpp-master/handheld/project/android/proguard.cfg b/minecraftcpp-master/handheld/project/android/proguard.cfg new file mode 100644 index 0000000..2dddb62 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android/proguard.cfg @@ -0,0 +1,68 @@ +-optimizationpasses 5 +-dontusemixedcaseclassnames +-dontskipnonpubliclibraryclasses +-dontpreverify +-printseeds +-verbose +-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* + +-keep public class com.mojang.minecraftpe.GameModeButton +-keep public class com.mojang.android.StringValue +-keep public class * extends android.app.Activity +-keep public class * extends com.mojang.minecraftpe.MainActivity +-keep public class * extends MainActivity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class com.android.vending.licensing.ILicensingService + +-keep,allowobfuscation class com.mojang.** { *** *(...); } + +-keepclasseswithmembernames class * { + native ; +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet); +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keepclassmembers class * extends android.app.Activity { + static public void saveScreenshot(java.lang.String, int, int, int[]); + public int[] getImageData(java.lang.String); + public byte[] getFileDataBytes(java.lang.String); + public java.lang.String getPlatformStringVar(int); + public int getScreenWidth(); + public int getScreenHeight(); + public float getPixelsPerMillimeter(); + public int checkLicense(); + public boolean isNetworkEnabled(boolean); + public java.lang.String getDateString(int); + public boolean hasBuyButtonWhenInvalidLicense(); + public void postScreenshotToFacebook(java.lang.String, int, int, int[]); + public int getKeyFromKeyCode(int, int, int); + public void quit(); + public void displayDialog(int); + public void tick(); + public java.lang.String[] getOptionStrings(); + public void buyGame(); + public boolean isTouchscreen(); + public void setIsPowerVR(boolean); + public void initiateUserInput(int); + public int getUserInputStatus(); + public java.lang.String[] getUserInputString(); + public void vibrate(int); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} diff --git a/minecraftcpp-master/handheld/project/android/res/drawable-hdpi/icon.png b/minecraftcpp-master/handheld/project/android/res/drawable-hdpi/icon.png new file mode 100644 index 0000000..d738bc6 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/res/drawable-hdpi/icon.png differ diff --git a/minecraftcpp-master/handheld/project/android/res/drawable-hdpi/icon_demo.png b/minecraftcpp-master/handheld/project/android/res/drawable-hdpi/icon_demo.png new file mode 100644 index 0000000..283aada Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/res/drawable-hdpi/icon_demo.png differ diff --git a/minecraftcpp-master/handheld/project/android/res/drawable-ldpi/icon.png b/minecraftcpp-master/handheld/project/android/res/drawable-ldpi/icon.png new file mode 100644 index 0000000..4dc54a0 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/res/drawable-ldpi/icon.png differ diff --git a/minecraftcpp-master/handheld/project/android/res/drawable-ldpi/icon_demo.png b/minecraftcpp-master/handheld/project/android/res/drawable-ldpi/icon_demo.png new file mode 100644 index 0000000..5c0c553 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/res/drawable-ldpi/icon_demo.png differ diff --git a/minecraftcpp-master/handheld/project/android/res/drawable-mdpi/icon.png b/minecraftcpp-master/handheld/project/android/res/drawable-mdpi/icon.png new file mode 100644 index 0000000..01fb460 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/res/drawable-mdpi/icon.png differ diff --git a/minecraftcpp-master/handheld/project/android/res/drawable-mdpi/icon_demo.png b/minecraftcpp-master/handheld/project/android/res/drawable-mdpi/icon_demo.png new file mode 100644 index 0000000..edfde23 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/res/drawable-mdpi/icon_demo.png differ diff --git a/minecraftcpp-master/handheld/project/android/res/drawable-xhdpi/icon.png b/minecraftcpp-master/handheld/project/android/res/drawable-xhdpi/icon.png new file mode 100644 index 0000000..434fccc Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/res/drawable-xhdpi/icon.png differ diff --git a/minecraftcpp-master/handheld/project/android/res/drawable-xhdpi/icon_demo.png b/minecraftcpp-master/handheld/project/android/res/drawable-xhdpi/icon_demo.png new file mode 100644 index 0000000..d60b0d2 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/res/drawable-xhdpi/icon_demo.png differ diff --git a/minecraftcpp-master/handheld/project/android/res/drawable/bg32.png b/minecraftcpp-master/handheld/project/android/res/drawable/bg32.png new file mode 100644 index 0000000..d9796c4 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/res/drawable/bg32.png differ diff --git a/minecraftcpp-master/handheld/project/android/res/drawable/bgtiled.xml b/minecraftcpp-master/handheld/project/android/res/drawable/bgtiled.xml new file mode 100644 index 0000000..4935bb1 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android/res/drawable/bgtiled.xml @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/android/res/drawable/btn_nw_cancel.xml b/minecraftcpp-master/handheld/project/android/res/drawable/btn_nw_cancel.xml new file mode 100644 index 0000000..e7d53fa --- /dev/null +++ b/minecraftcpp-master/handheld/project/android/res/drawable/btn_nw_cancel.xml @@ -0,0 +1,5 @@ + + + + diff --git a/minecraftcpp-master/handheld/project/android/res/drawable/btn_nw_create.xml b/minecraftcpp-master/handheld/project/android/res/drawable/btn_nw_create.xml new file mode 100644 index 0000000..492930a --- /dev/null +++ b/minecraftcpp-master/handheld/project/android/res/drawable/btn_nw_create.xml @@ -0,0 +1,5 @@ + + + + diff --git a/minecraftcpp-master/handheld/project/android/res/drawable/btngamemode.xml b/minecraftcpp-master/handheld/project/android/res/drawable/btngamemode.xml new file mode 100644 index 0000000..eea1c73 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android/res/drawable/btngamemode.xml @@ -0,0 +1,5 @@ + + + + diff --git a/minecraftcpp-master/handheld/project/android/res/drawable/cancel_0_1.png b/minecraftcpp-master/handheld/project/android/res/drawable/cancel_0_1.png new file mode 100644 index 0000000..c43434a Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/res/drawable/cancel_0_1.png differ diff --git a/minecraftcpp-master/handheld/project/android/res/drawable/cancel_0_3.png b/minecraftcpp-master/handheld/project/android/res/drawable/cancel_0_3.png new file mode 100644 index 0000000..887322d Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/res/drawable/cancel_0_3.png differ diff --git a/minecraftcpp-master/handheld/project/android/res/drawable/cancel_1_1.png b/minecraftcpp-master/handheld/project/android/res/drawable/cancel_1_1.png new file mode 100644 index 0000000..abaa241 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/res/drawable/cancel_1_1.png differ diff --git a/minecraftcpp-master/handheld/project/android/res/drawable/cancel_1_3.png b/minecraftcpp-master/handheld/project/android/res/drawable/cancel_1_3.png new file mode 100644 index 0000000..8519c68 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/res/drawable/cancel_1_3.png differ diff --git a/minecraftcpp-master/handheld/project/android/res/drawable/create_0_1.png b/minecraftcpp-master/handheld/project/android/res/drawable/create_0_1.png new file mode 100644 index 0000000..4ebc3b2 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/res/drawable/create_0_1.png differ diff --git a/minecraftcpp-master/handheld/project/android/res/drawable/create_0_3.png b/minecraftcpp-master/handheld/project/android/res/drawable/create_0_3.png new file mode 100644 index 0000000..a771a56 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/res/drawable/create_0_3.png differ diff --git a/minecraftcpp-master/handheld/project/android/res/drawable/create_1_1.png b/minecraftcpp-master/handheld/project/android/res/drawable/create_1_1.png new file mode 100644 index 0000000..5db6202 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/res/drawable/create_1_1.png differ diff --git a/minecraftcpp-master/handheld/project/android/res/drawable/create_1_3.png b/minecraftcpp-master/handheld/project/android/res/drawable/create_1_3.png new file mode 100644 index 0000000..e1ea00e Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/res/drawable/create_1_3.png differ diff --git a/minecraftcpp-master/handheld/project/android/res/drawable/creative_3.png b/minecraftcpp-master/handheld/project/android/res/drawable/creative_3.png new file mode 100644 index 0000000..80940ba Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/res/drawable/creative_3.png differ diff --git a/minecraftcpp-master/handheld/project/android/res/drawable/iconx.png b/minecraftcpp-master/handheld/project/android/res/drawable/iconx.png new file mode 100644 index 0000000..38dcfcb Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/res/drawable/iconx.png differ diff --git a/minecraftcpp-master/handheld/project/android/res/drawable/survival_3.png b/minecraftcpp-master/handheld/project/android/res/drawable/survival_3.png new file mode 100644 index 0000000..cc8d738 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/res/drawable/survival_3.png differ diff --git a/minecraftcpp-master/handheld/project/android/res/drawable/worldname.png b/minecraftcpp-master/handheld/project/android/res/drawable/worldname.png new file mode 100644 index 0000000..b8f42a2 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/res/drawable/worldname.png differ diff --git a/minecraftcpp-master/handheld/project/android/res/drawable/worldname_3.png b/minecraftcpp-master/handheld/project/android/res/drawable/worldname_3.png new file mode 100644 index 0000000..adccd67 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android/res/drawable/worldname_3.png differ diff --git a/minecraftcpp-master/handheld/project/android/res/layout/create_new_world.xml b/minecraftcpp-master/handheld/project/android/res/layout/create_new_world.xml new file mode 100644 index 0000000..07b755f --- /dev/null +++ b/minecraftcpp-master/handheld/project/android/res/layout/create_new_world.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/android/res/layout/create_world_screen.xml b/minecraftcpp-master/handheld/project/android/res/layout/create_world_screen.xml new file mode 100644 index 0000000..deea75d --- /dev/null +++ b/minecraftcpp-master/handheld/project/android/res/layout/create_world_screen.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/android/res/layout/main.xml b/minecraftcpp-master/handheld/project/android/res/layout/main.xml new file mode 100644 index 0000000..d3ef19b --- /dev/null +++ b/minecraftcpp-master/handheld/project/android/res/layout/main.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + diff --git a/minecraftcpp-master/handheld/project/android/res/layout/mainmenu_options.xml b/minecraftcpp-master/handheld/project/android/res/layout/mainmenu_options.xml new file mode 100644 index 0000000..77e4217 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android/res/layout/mainmenu_options.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/minecraftcpp-master/handheld/project/android/res/layout/rename_mp_world.xml b/minecraftcpp-master/handheld/project/android/res/layout/rename_mp_world.xml new file mode 100644 index 0000000..7ab00ba --- /dev/null +++ b/minecraftcpp-master/handheld/project/android/res/layout/rename_mp_world.xml @@ -0,0 +1,29 @@ + + + + + + diff --git a/minecraftcpp-master/handheld/project/android/res/values/strings.xml b/minecraftcpp-master/handheld/project/android/res/values/strings.xml new file mode 100644 index 0000000..e0b8cd2 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android/res/values/strings.xml @@ -0,0 +1,40 @@ + + + Minecraft - Pocket Edition + Minecraft - Pocket Edition Demo + true + Minecraft PE + Minecraft PE Demo + + + World name + Unnamed world + World Generator seed. Leave blank for random. + Leave blank for random seed + Mobs, health and gather resources + Unlimited resources and flying + + + Save world as + Saved World + + + Username + Enter your username + Server visible by default + Sensitivity + Invert Y-axis + Lefty + Use touch screen + Split touch controls + Vibration + Slight vibration when blocks are destroyed + Fancy graphics + + + Lower graphics quality + Shorter view distance and disables fancy rendering + Peaceful mode + No hostile mobs, heal automatically + + diff --git a/minecraftcpp-master/handheld/project/android/res/xml/preferences.xml b/minecraftcpp-master/handheld/project/android/res/xml/preferences.xml new file mode 100644 index 0000000..9a531b1 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android/res/xml/preferences.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/android/src/com/mojang/android/EditTextAscii.java b/minecraftcpp-master/handheld/project/android/src/com/mojang/android/EditTextAscii.java new file mode 100644 index 0000000..5640c91 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android/src/com/mojang/android/EditTextAscii.java @@ -0,0 +1,58 @@ +package com.mojang.android; + +import android.content.Context; +import android.text.Editable; +import android.text.TextWatcher; +import android.util.AttributeSet; +import android.widget.EditText; + +public class EditTextAscii extends EditText + implements TextWatcher { + + public EditTextAscii(Context context) { + super(context); + _init(); + } + + public EditTextAscii(Context context, AttributeSet attrs) { + super(context, attrs); + _init(); + } + + public EditTextAscii(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + _init(); + } + + private void _init() { + this.addTextChangedListener(this); + } + + // + // TextWatcher + // + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) {} + //@Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { } + //@Override + public void afterTextChanged(Editable e) { + String s = e.toString(); + String sanitized = sanitize(s); + + if (!s.equals(sanitized)) { + e.replace(0, e.length(), sanitized); + } + } + + static public String sanitize(String s) { + StringBuilder sb = new StringBuilder(s.length()); + + for (int i = 0; i < s.length(); ++i) { + char ch = s.charAt(i); + if (ch < 128) + sb.append(ch); + } + return sb.toString(); + } +} diff --git a/minecraftcpp-master/handheld/project/android/src/com/mojang/android/StringValue.java b/minecraftcpp-master/handheld/project/android/src/com/mojang/android/StringValue.java new file mode 100644 index 0000000..4f3627e --- /dev/null +++ b/minecraftcpp-master/handheld/project/android/src/com/mojang/android/StringValue.java @@ -0,0 +1,5 @@ +package com.mojang.android; + +public interface StringValue { + public String getStringValue(); +} diff --git a/minecraftcpp-master/handheld/project/android/src/com/mojang/android/licensing/LicenseCodes.java b/minecraftcpp-master/handheld/project/android/src/com/mojang/android/licensing/LicenseCodes.java new file mode 100644 index 0000000..b6b9ad6 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android/src/com/mojang/android/licensing/LicenseCodes.java @@ -0,0 +1,29 @@ +package com.mojang.android.licensing; + +///see LicenseResult.h in C++ project +public class LicenseCodes { + + // Something's not ready, call again later + public static final int WAIT_PLATFORM_NOT_READY = -2; // Note used from java + public static final int WAIT_SERVER_NOT_READY = -1; + + // License is ok + public static final int LICENSE_OK = 0; + public static final int LICENSE_TRIAL_OK = 1; + + // License is not working in one way or another + public static final int LICENSE_VALIDATION_FAILED = 50; + public static final int ITEM_NOT_FOUND = 51; + public static final int LICENSE_NOT_FOUND = 52; + public static final int ERROR_CONTENT_HANDLER = 100; + public static final int ERROR_ILLEGAL_ARGUMENT = 101; + public static final int ERROR_SECURITY = 102; + public static final int ERROR_INPUT_OUTPUT = 103; + public static final int ERROR_ILLEGAL_STATE = 104; + public static final int ERROR_NULL_POINTER = 105; + public static final int ERROR_GENERAL = 106; + public static final int ERROR_UNABLE_TO_CONNECT_TO_CDS = 107; + + // The call went wrong so we didn't get a license value at all + public static final int LICENSE_CHECK_EXCEPTION = 200; +} diff --git a/minecraftcpp-master/handheld/project/android/src/com/mojang/android/preferences/SliderPreference.java b/minecraftcpp-master/handheld/project/android/src/com/mojang/android/preferences/SliderPreference.java new file mode 100644 index 0000000..cfcc2c2 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android/src/com/mojang/android/preferences/SliderPreference.java @@ -0,0 +1,233 @@ +package com.mojang.android.preferences; + +import android.content.Context; +import android.content.res.Resources; +import android.preference.DialogPreference; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.SeekBar; +import android.widget.TextView; + +public class SliderPreference extends DialogPreference implements SeekBar.OnSeekBarChangeListener { + + private static final String androidns = "http://schemas.android.com/apk/res/android"; + + private Context _context; + + //private TextView _minValueTextView; + private TextView _valueTextView; + //private TextView _maxValueTextView; + private SeekBar _seekBar; + + private String _valueSuffix; + + private int _defaultValue; // Stores the default preference value when none has been set + private int _maxValue; // Stores the upper preference value bound + private int _value; // Stores the value of the preference + private int _minValue; // Stores the minimum preference value bound + + public SliderPreference(Context context, AttributeSet attrs) { + super(context, attrs); + + _context = context; + + _valueSuffix = getResourceValueFromAttribute(attrs, androidns, "text", ""); + + _defaultValue = getResourceValueFromAttribute(attrs, androidns, "defaultValue", 0); + _maxValue = getResourceValueFromAttribute(attrs, androidns, "max", 100); + _minValue = getResourceValueFromAttribute(attrs, null, "min", 0); + + // Set the default value of the preference to the default value found in attribute + setDefaultValue((Integer) _defaultValue); + } + //public SliderPreference(Context context, AttributeSet attrs, int) + + @Override + protected View onCreateDialogView() { + LinearLayout.LayoutParams params; + LinearLayout layout = new LinearLayout(getContext()); + layout.setOrientation(LinearLayout.VERTICAL); + layout.setPadding(6,6,6,6); + +// mSplashText = new TextView(_context); +// if (mDialogMessage != null) +// mSplashText.setText(mDialogMessage); +// layout.addView(mSplashText); + + _valueTextView = new TextView(_context); + _valueTextView.setGravity(Gravity.CENTER_HORIZONTAL); + _valueTextView.setTextSize(32); + params = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.FILL_PARENT, + LinearLayout.LayoutParams.WRAP_CONTENT); + layout.addView(_valueTextView, params); + + _seekBar = new SeekBar(_context); + _seekBar.setOnSeekBarChangeListener(this); + layout.addView(_seekBar, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); + + if (shouldPersist()) + _value = getPersistedInt(_defaultValue); + + _seekBar.setMax(_maxValue); + _seekBar.setProgress(_value); + return layout; + } + + @Override + protected void onSetInitialValue(boolean restore, Object defaultValue) { + super.onSetInitialValue(restore, defaultValue); + if (restore) + _value = shouldPersist() ? getPersistedInt(_defaultValue) : 0; + else + _value = (Integer) defaultValue; + } + + +/* + @Override + protected void onBindView(View view) { + super.onBindView(view); + // Bind _seekBar to the layout's internal view + _seekBar = (SeekBar) view.findViewById(R.id.slider_preference_seekbar); + + // Setup it's listeners and parameters + _seekBar.setMax(translateValueToSeekBar(_maxValue)); + _seekBar.setProgress(translateValueToSeekBar(_value)); + _seekBar.setOnSeekBarChangeListener(this); + + // Bind mTextView to the layout's internal view + _valueTextView = (TextView) view.findViewById(R.id.slider_preference_value); + + // Setup it's parameters + _valueTextView.setText(getValueText(_value)); + + // Setup min and max value text views + _minValueTextView = (TextView) view.findViewById(R.id.slider_preference_min_value); + _minValueTextView.setText(getValueText(_minValue)); + _maxValueTextView = (TextView) view.findViewById(R.id.slider_preference_max_value); + _maxValueTextView.setText(getValueText(_maxValue)); + } +*/ + + //@Override + public void onProgressChanged(SeekBar seekBar, int value, boolean fromUser) { + // Change mTextView and _value to the current seekbar value + _value = translateValueFro_seekBar(value); + _valueTextView.setText(getValueText(_value)); + if (shouldPersist()) + persistInt(translateValueFro_seekBar(value)); + callChangeListener(new Integer(_value)); + } + + //@Override + public void onStartTrackingTouch(SeekBar seekBar) { + // Not used + } + + //@Override + public void onStopTrackingTouch(SeekBar seekBar) { + // Not used + } + + private String getValueText(int value) { + String t = String.valueOf(value); + return t.concat(_valueSuffix); + } + + /** + * Retrieves a value from the resources of this slider preference's context + * based on an attribute pointing to that resource. + * + * @param attrs + * The attribute set to search + * + * @param namespace + * The namespace of the attribute + * + * @param name + * The name of the attribute + * + * @param defaultValue + * The default value returned if no resource is found + * + * @return + * The resource value + */ + private int getResourceValueFromAttribute(AttributeSet attrs, String namespace, String name, int defaultValue) { + Resources res = getContext().getResources(); + int valueID = attrs.getAttributeResourceValue(namespace, name, 0); + if (valueID != 0) { + return res.getInteger(valueID); + } + else { + return attrs.getAttributeIntValue(namespace, name, defaultValue); + } + } + + /** + * Retrieves a value from the resources of this slider preference's context + * based on an attribute pointing to that resource. + * + * @param attrs + * The attribute set to search + * + * @param namespace + * The namespace of the attribute + * + * @param name + * The name of the attribute + * + * @param defaultValue + * The default value returned if no resource is found + * + * @return + * The resource value + */ + private String getResourceValueFromAttribute(AttributeSet attrs, String namespace, String name, String defaultValue) { + Resources res = getContext().getResources(); + int valueID = attrs.getAttributeResourceValue(namespace, name, 0); + if (valueID != 0) { + return res.getString(valueID); + } + else { + String value = attrs.getAttributeValue(namespace, name); + if (value != null) { + return value; + } + else { + return defaultValue; + } + } + } + + /** + * Translates a value from this slider preference's seekbar by + * adjusting it for a set perceived minimum value. + * + * @param value + * The value to be translated from the seekbar + * + * @return + * A value equal to the value passed plus the currently set minimum value. + */ + private int translateValueFro_seekBar(int value) { + return value + _minValue; + } + + /** + * Translates a value for when setting this slider preference's seekbar by + * adjusting it for a set perceived minimum value. + * + * @param value + * The value to be translated for use + * + * @return + * A value equal to the value passed minus the currently set minimum value. + */ + private int translateValueToSeekBar(int value) { + return value - _minValue; + } +} diff --git a/minecraftcpp-master/handheld/project/android/src/com/mojang/minecraftpe/GameModeButton.java b/minecraftcpp-master/handheld/project/android/src/com/mojang/minecraftpe/GameModeButton.java new file mode 100644 index 0000000..df32f0c --- /dev/null +++ b/minecraftcpp-master/handheld/project/android/src/com/mojang/minecraftpe/GameModeButton.java @@ -0,0 +1,77 @@ +package com.mojang.minecraftpe; + +import com.mojang.android.StringValue; +import com.mojang.minecraftpe.R; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.TextView; +import android.widget.ToggleButton; + +public class GameModeButton extends ToggleButton implements OnClickListener, StringValue { + public GameModeButton(Context context, AttributeSet attrs) { + super(context, attrs); + _init(); + } + + //@Override + public void onClick(View v) { + _update(); + } + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + _update(); + } + @Override + protected void onAttachedToWindow() { + if (!_attached) { + _update(); + _attached = true; + } + } + private boolean _attached = false; + + private void _init() { + setOnClickListener(this); + } + private void _update() { + _setGameType(isChecked()?Survival:Creative); + } + private void _setGameType(int i) { + _type = _clamp(i); + + int id = R.string.gamemode_creative_summary; + if (_type == Survival) + id = R.string.gamemode_survival_summary; + String desc = getContext().getString(id); + + View v = getRootView().findViewById(R.id.labelGameModeDesc); + System.out.println("Mode: " + _type + ", view? " + (v!=null)); + if (desc != null && v != null && v instanceof TextView) { + ((TextView)v).setText(desc); + } + } + + static private int _clamp(int i) { + if (i > Survival) return Survival; + if (i < Creative) return Creative; + return i; + } + + public String getStringValue() { + return getStringForType(_type); + } + static public String getStringForType(int i) { + return new String[] { + "creative", + "survival" + } [_clamp(i)]; + } + + private int _type = 0; + static final int Creative = 0; + static final int Survival = 1; +} diff --git a/minecraftcpp-master/handheld/project/android/src/com/mojang/minecraftpe/MainActivity.java b/minecraftcpp-master/handheld/project/android/src/com/mojang/minecraftpe/MainActivity.java new file mode 100644 index 0000000..95f33f7 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android/src/com/mojang/minecraftpe/MainActivity.java @@ -0,0 +1,531 @@ +package com.mojang.minecraftpe; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.Map; + +import com.mojang.android.StringValue; +import com.mojang.android.licensing.LicenseCodes; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.NativeActivity; +import android.content.Context; +import android.content.DialogInterface; +import android.content.DialogInterface.OnCancelListener; +import android.content.DialogInterface.OnClickListener; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.res.AssetFileDescriptor; +import android.content.res.AssetManager; +import android.graphics.Bitmap; +import android.graphics.Bitmap.CompressFormat; +import android.graphics.BitmapFactory; +import android.media.AudioManager; +import android.os.Bundle; +import android.os.Vibrator; +import android.preference.PreferenceManager; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.Display; +import android.view.InputDevice; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewGroup.LayoutParams; +import android.view.WindowManager; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.view.inputmethod.*; +import com.mojang.minecraftpe.R; + +public class MainActivity extends NativeActivity { + private boolean _isTouchscreen = true; + private int _viewDistance = 2; + + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle savedInstanceState) { + getOptionStrings(); // Updates settings + setVolumeControlStream(AudioManager.STREAM_MUSIC); + super.onCreate(savedInstanceState); + nativeRegisterThis(); + } + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + Log.w("MCPE", event.toString()); + if(event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) { + return false; + } + return super.dispatchKeyEvent(event); + } + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK) { + onBackPressed(); + return true; + } + return super.onKeyUp(keyCode, event); + } + @Override + public void onBackPressed() { + Log.w("MCPE", "Java - onBackPressed"); + return; + } + + private void createAlertDialog(boolean hasOkButton, boolean hasCancelButton, boolean preventBackKey) { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + + builder.setTitle(""); + if (preventBackKey) + builder.setCancelable(false); + + builder.setOnCancelListener(new OnCancelListener() { + //@Override + public void onCancel(DialogInterface dialog) { + onDialogCanceled(); + } + }); + + if (hasOkButton) + builder.setPositiveButton("Ok", new OnClickListener() { + public void onClick(DialogInterface dialog, int which) { onDialogCompleted(); }}); + + if (hasCancelButton) + builder.setNegativeButton("Cancel", new OnClickListener() { + public void onClick(DialogInterface dialog, int which) { onDialogCanceled(); }}); + + mDialog = builder.create(); + mDialog.setOwnerActivity(this); + } + + static private boolean _isPowerVr = false; + public void setIsPowerVR(boolean status) { MainActivity._isPowerVr = status; } + static public boolean isPowerVR() { return _isPowerVr; } + + public boolean supportsTouchscreen() { + return isXperiaPlay(); + //if (isXperiaPlay()) return false; + //return true; + } + + static public boolean isXperiaPlay() { + final String[] tags = { android.os.Build.MODEL, + android.os.Build.DEVICE, + android.os.Build.PRODUCT}; + for (String tag : tags) { + tag = tag.toLowerCase(); + if (tag.indexOf("r800") >= 0) return true; + if (tag.indexOf("so-01d") >= 0) return true; + if (tag.indexOf("xperia") >= 0 && tag.indexOf("play") >= 0) return true; + } + return false; + } + + @Override + public void onWindowFocusChanged(boolean hasFocus) { + // TODO Auto-generated method stub + //System.out.println("Focus has changed. Has Focus? " + hasFocus); + super.onWindowFocusChanged(hasFocus); + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + // TODO Auto-generated method stub + //System.out.println("KeyDown: " + keyCode); + Log.w("MCPE", "onKeyDown: " + keyCode); + return super.onKeyDown(keyCode, event); + } + public int getKeyFromKeyCode(int keyCode, int metaState, int deviceId) { + return InputDevice.getDevice(deviceId).getKeyCharacterMap().get(keyCode, metaState); + } + static public void saveScreenshot(String filename, int w, int h, int[] pixels) { + Bitmap bitmap = Bitmap.createBitmap(pixels, w, h, Bitmap.Config.ARGB_8888); + + //System.out.println("Save screenshot: " + filename); + + try { + FileOutputStream fos = new FileOutputStream(filename); + bitmap.compress(CompressFormat.JPEG, 85, fos); + //System.out.println("Compression completed!"); + + try { + fos.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + + try { + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + catch (FileNotFoundException e) { + System.err.println("Couldn't create file: " + filename); + e.printStackTrace(); + } + } + + public byte[] getFileDataBytes(String filename) { + AssetManager assets = getAssets(); + + BufferedInputStream bis; + try { + InputStream is = assets.open(filename); + bis = new BufferedInputStream(is); + } catch (IOException e) { + e.printStackTrace(); + return null; + } + + ByteArrayOutputStream s = new ByteArrayOutputStream(4096); + byte[] tmp = new byte[1024]; + + try { + while (true) { + int count = bis.read(tmp); + if (count <= 0) break; + s.write(tmp, 0, count); + } + } catch (IOException e) { + } finally { + try { bis.close(); } + catch (IOException e) {} + } + + return s.toByteArray(); + } + + public int[] getImageData(String filename) { + AssetManager assets = getAssets(); + + try { + /*String[] filenames = */assets.list("images"); + } catch (IOException e) { + System.err.println("getImageData: Could not list directory"); + return null; + } + + InputStream inputStream = null; + try { + inputStream = assets.open(filename); + } catch (IOException e) { + System.err.println("getImageData: Could not open image " + filename); + return null; + } + + Bitmap bm = BitmapFactory.decodeStream(inputStream); + int w = bm.getWidth(); + int h = bm.getHeight(); + + int[] pixels = new int[w * h + 2]; + pixels[0] = w; + pixels[1] = h; + bm.getPixels(pixels, 2, w, 0, 0, w, h); + + return pixels; + } + + public int getScreenWidth() { + Display display = ((WindowManager)this.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); + int out = Math.max(display.getWidth(), display.getHeight()); + System.out.println("getwidth: " + out); + return out; + } + public int getScreenHeight() { + Display display = ((WindowManager)this.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); + int out = Math.min(display.getWidth(), display.getHeight()); + System.out.println("getheight: " + out); + return out; + } + public float getPixelsPerMillimeter() { + DisplayMetrics metrics = new DisplayMetrics(); + getWindowManager().getDefaultDisplay().getMetrics(metrics); + //System.err.println("metrics: " + metrics.xdpi + ", " + metrics.ydpi); + return (metrics.xdpi + metrics.ydpi) * 0.5f / 25.4f; + } + + public int checkLicense() { return LicenseCodes.LICENSE_OK; } + + public String getDateString(int s) { + return DateFormat.format(new Date(s * 1000L)); + } + + public boolean hasBuyButtonWhenInvalidLicense() { return true; } + + public void postScreenshotToFacebook(String filename, int w, int h, int[] pixels) { + return; + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, + Intent data) { + + if (requestCode == DialogDefinitions.DIALOG_MAINMENU_OPTIONS) { + _userInputStatus = 1; + } + } + + public void quit() { + runOnUiThread(new Runnable() { + public void run() { finish(); } }); + } + + public void displayDialog(int dialogId) { + + if (dialogId == DialogDefinitions.DIALOG_CREATE_NEW_WORLD) { + chooseDialog(R.layout.create_new_world, + new int[] { R.id.editText_worldName, + R.id.editText_worldSeed, + R.id.button_gameMode}, + false, // Don't prevent back key + R.id.button_createworld_create, + R.id.button_createworld_cancel + ); + } else if (dialogId == DialogDefinitions.DIALOG_MAINMENU_OPTIONS) { + Intent intent = new Intent(this, MainMenuOptionsActivity.class); + intent.putExtra("preferenceId", R.xml.preferences); + startActivityForResult(intent, dialogId); + } else if (dialogId == DialogDefinitions.DIALOG_RENAME_MP_WORLD) { + chooseDialog(R.layout.rename_mp_world, + new int[] { R.id.editText_worldNameRename }, + false + ); + } + } + + void chooseDialog(final int layoutId, final int[] viewIds) { + chooseDialog(layoutId, viewIds, true); + } + void chooseDialog(final int layoutId, final int[] viewIds, final boolean hasCancelButton) { + chooseDialog(layoutId, viewIds, hasCancelButton, true); + } + void chooseDialog(final int layoutId, final int[] viewIds, final boolean hasCancelButton, final boolean preventBackKey) { + chooseDialog(layoutId, viewIds, preventBackKey, 0, hasCancelButton? 0 : -1); + } + void chooseDialog(final int layoutId, final int[] viewIds, final boolean preventBackKey, final int okButtonId, final int cancelButtonId) { + _userInputValues.clear(); + + runOnUiThread(new Runnable() { + public void run() { + createAlertDialog(okButtonId==0, cancelButtonId==0, preventBackKey); + LayoutInflater li = LayoutInflater.from(MainActivity.this); + + try { + View view = li.inflate(layoutId, null); + if (okButtonId != 0 && okButtonId != -1) { + View b = view.findViewById(okButtonId); + if (b != null) + b.setOnClickListener(new View.OnClickListener() + { public void onClick(View v) { if (mDialog != null) mDialog.dismiss(); onDialogCompleted(); }}); + } + if (cancelButtonId != 0 && cancelButtonId != -1) { + View b = view.findViewById(cancelButtonId); + if (b != null) + b.setOnClickListener(new View.OnClickListener() + { public void onClick(View v) { if (mDialog != null) mDialog.cancel(); onDialogCanceled(); }}); + } + + //mDialog.setO + MainActivity.this.mDialog.setView(view); + + if (viewIds != null) + for (int viewId : viewIds) { + View v = view.findViewById(viewId); + if (v instanceof StringValue) + _userInputValues.add( (StringValue) v ); + else if (v instanceof TextView) + _userInputValues.add(new TextViewReader((TextView)v)); + } + + } catch (Error e) { + e.printStackTrace(); + } + + MainActivity.this.mDialog.show(); + MainActivity.this.mDialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); + MainActivity.this.mDialog.getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.MATCH_PARENT); + //MainActivity.this.getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); + } + }); + } + + public void tick() {} + + public String[] getOptionStrings() { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); + Map m = prefs.getAll(); + + String[] tmpOut = new String[m.size() * 2]; + + int n = 0; + for (Map.Entry e : m.entrySet()) { + // @todo: Would be nice if the disabled settings could be stripped out here + + String key = e.getKey(); + String value = e.getValue().toString(); + + // + // Feel free to modify key or value! + // + // This can be used to correct differences between the different + // platforms, such as Android not supporting floating point + // ranges for Sliders/SeekBars: {0..100} - TRANSFORM -> {0..1} + // + if (key.equals(MainMenuOptionsActivity.Controls_UseTouchscreen)) + _isTouchscreen = !isXperiaPlay() || (Boolean) e.getValue(); + + if (key.equals(MainMenuOptionsActivity.Graphics_LowQuality)) + _viewDistance = ((Boolean) e.getValue()) ? 3 : 2; + + if (key.equals(MainMenuOptionsActivity.Internal_Game_DifficultyPeaceful)) { + key = MainMenuOptionsActivity.Game_DifficultyLevel; + value = ((Boolean) e.getValue()) ? "0" : "2"; + } + + try { + if (key.equals(MainMenuOptionsActivity.Controls_Sensitivity)) + value = new Double( 0.01 * Integer.parseInt(value) ).toString(); + } catch (Exception exc) {} + + tmpOut[n++] = key; + tmpOut[n++] = value; + + //System.out.println("Key: " + e.getKey()); + //System.out.println("Val: " + e.getValue().toString() + " (" + e.getValue().getClass().getName() + ")\n"); + } + + // Copy over the enabled preferences + String[] out = new String[n]; + for (int i = 0; i < n; ++i) + out[i] = tmpOut[i]; + + return out; + } + + public void buyGame() {} + + public String getPlatformStringVar(int id) { + if (id == 0) return android.os.Build.MODEL; + return null; + } + + public boolean isNetworkEnabled(boolean onlyWifiAllowed) { + return true; + /* + ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo info = onlyWifiAllowed? cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI) + : cm.getActiveNetworkInfo(); + //(info.getState() == NetworkInfo.State.CONNECTED || info.getState() == NetworkInfo.State.CONNECTING)); + return (info != null && info.isConnectedOrConnecting()); + */ + } + + private Bundle data; + private int _userInputStatus = -1; + private String[] _userInputText = null; + private ArrayList _userInputValues = new ArrayList(); + public void initiateUserInput(int id) { + _userInputText = null; + _userInputStatus = -1; + } + public int getUserInputStatus() { return _userInputStatus; } + public String[] getUserInputString() { return _userInputText; } + + private AlertDialog mDialog; + private final DateFormat DateFormat = new SimpleDateFormat(); +// public EditText mTextInputWidget; + + public void vibrate(int milliSeconds) { + Vibrator v = (Vibrator)this.getSystemService(VIBRATOR_SERVICE); + v.vibrate(milliSeconds); + } + + private void onDialogCanceled() { + _userInputStatus = 0; + } + + private void onDialogCompleted() { + int size = _userInputValues.size(); + _userInputText = new String[size]; + for (int i = 0; i < size; ++i) { + _userInputText[i] = _userInputValues.get(i).getStringValue(); + } + for (String s : _userInputText) System.out.println("js: " + s); + + _userInputStatus = 1; + InputMethodManager inputManager = (InputMethodManager)getSystemService("input_method"); + boolean result = inputManager.showSoftInput(this.getCurrentFocus(), InputMethodManager.SHOW_IMPLICIT); + } + + protected void onStart() { + //System.out.println("onStart"); + super.onStart(); + } + + protected void onResume() { + //System.out.println("onResume"); + super.onResume(); + } + + protected void onPause() { + //System.out.println("onPause"); + super.onPause(); + } + + protected void onStop() { + //System.out.println("onStop"); + nativeStopThis(); + super.onStop(); + } + protected void onDestroy() { + System.out.println("onDestroy"); + + nativeUnregisterThis(); + super.onDestroy(); + } + + protected boolean isDemo() { return false; } + + // + // Native interface + // + native void nativeRegisterThis(); + native void nativeUnregisterThis(); + native void nativeStopThis(); + + static { + System.loadLibrary("minecraftpe"); + } +} + +// see client/gui/screens/DialogDefinitions.h +class DialogDefinitions { + static final int DIALOG_CREATE_NEW_WORLD = 1; + static final int DIALOG_NEW_CHAT_MESSAGE = 2; + static final int DIALOG_MAINMENU_OPTIONS = 3; + static final int DIALOG_RENAME_MP_WORLD = 4; +} + +class TextViewReader implements StringValue { + public TextViewReader(TextView view) { + _view = view; + } + public String getStringValue() { + return _view.getText().toString(); + } + private TextView _view; +} diff --git a/minecraftcpp-master/handheld/project/android/src/com/mojang/minecraftpe/MainMenuOptionsActivity.java b/minecraftcpp-master/handheld/project/android/src/com/mojang/minecraftpe/MainMenuOptionsActivity.java new file mode 100644 index 0000000..5b9301b --- /dev/null +++ b/minecraftcpp-master/handheld/project/android/src/com/mojang/minecraftpe/MainMenuOptionsActivity.java @@ -0,0 +1,197 @@ +package com.mojang.minecraftpe; + +import java.util.ArrayList; + +import com.mojang.android.EditTextAscii; +//import com.mojang.minecraftpe.R; + +import android.content.SharedPreferences; +import android.content.SharedPreferences.Editor; +import android.os.Bundle; +import android.preference.CheckBoxPreference; +import android.preference.EditTextPreference; +import android.preference.Preference; +import android.preference.PreferenceActivity; +import android.preference.PreferenceCategory; +import android.preference.PreferenceGroup; +import android.preference.PreferenceManager; +import android.preference.PreferenceScreen; + +public class MainMenuOptionsActivity extends PreferenceActivity implements + SharedPreferences.OnSharedPreferenceChangeListener +{ + static public final String Multiplayer_Username = "mp_username"; + static public final String Multiplayer_ServerVisible = "mp_server_visible_default"; + static public final String Graphics_Fancy = "gfx_fancygraphics"; + static public final String Graphics_LowQuality = "gfx_lowquality"; + static public final String Controls_InvertMouse = "ctrl_invertmouse"; + static public final String Controls_Sensitivity = "ctrl_sensitivity"; + static public final String Controls_UseTouchscreen = "ctrl_usetouchscreen"; + static public final String Controls_UseTouchJoypad = "ctrl_usetouchjoypad"; + static public final String Controls_FeedbackVibration = "feedback_vibration"; + static public final String Game_DifficultyLevel = "game_difficulty"; + static public final String Internal_Game_DifficultyPeaceful = "game_difficultypeaceful"; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + Bundle extras = getIntent().getExtras(); + addPreferencesFromResource(extras.getInt("preferenceId"));//R.xml.preferences); + + //getPreferenceManager().setSharedPreferencesMode(MODE_PRIVATE); + + PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this); + PreferenceScreen s = getPreferenceScreen(); + + if (PreferenceManager.getDefaultSharedPreferences(this).contains(Multiplayer_Username)) { + previousName = PreferenceManager.getDefaultSharedPreferences(this).getString(Multiplayer_Username, null); + } + + _validator = new PreferenceValidator(this); + readBackAll(s); + _validator.commit(); + } + + private void readBackAll(PreferenceGroup g) { + traversePreferences(g, new PreferenceTraverser() { + void onPreference(Preference p) { readBack(p); _validator.validate(p); } + }); + } + private void traversePreferences(PreferenceGroup g, PreferenceTraverser pt) { + int size = g.getPreferenceCount(); + for (int i = 0; i < size; ++i) { + Preference p = g.getPreference(i); + if (p instanceof PreferenceGroup) { + PreferenceGroup pg = (PreferenceGroup)p; + pt.onPreferenceGroup(pg); + traversePreferences(pg, pt); + } + else + pt.onPreference(p); + } + } + private void readBack(Preference p) { + if (p == null) + return; + + //System.out.println("pref: " + p.toString()); + + if (p instanceof EditTextPreference) { + EditTextPreference e = (EditTextPreference) p; + p.setSummary("'" + e.getText() + "'"); + } + } + + //@Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + Preference p = findPreference(key); + _validator.validate(sharedPreferences, key); + + if (p instanceof EditTextPreference) { + EditTextPreference e = (EditTextPreference) p; + Editor editor = sharedPreferences.edit(); + + String s = e.getText(); + String sanitized = EditTextAscii.sanitize(s).trim(); + + if (key.equals(Multiplayer_Username) && sanitized == null || sanitized.length() == 0) { + sanitized = previousName; + if (sanitized == null || sanitized.equals("")) { + sanitized = "Steve"; + previousName = sanitized; + } + } + + if (!s.equals(sanitized)) { + editor.putString(key, sanitized); + editor.commit(); + e.setText(sanitized); + } + } + + readBack(p); + } + + String previousName; + PreferenceValidator _validator; +} + +class PreferenceValidator { + static private class Pref { + Pref(PreferenceGroup g, Preference p) { + this.g = g; + this.p = p; + } + PreferenceGroup g; + Preference p; + } + private PreferenceActivity _prefs; + private ArrayList _arrayList = new ArrayList(); + + public PreferenceValidator(PreferenceActivity prefs) { + _prefs = prefs; + } + + public void commit() { + //System.err.println("ERR: " + _arrayList.size()); + for (int i = 0; i < _arrayList.size(); ++i) { + PreferenceGroup g = _arrayList.get(i).g; + Preference p = _arrayList.get(i).p; + g.removePreference(p); + } + } + + public void validate(Preference p) { + validate(PreferenceManager.getDefaultSharedPreferences(_prefs), p.getKey()); + } + public void validate(SharedPreferences preferences, String key) { + Preference p = findPreference(key); + + if (p instanceof CheckBoxPreference) { + //CheckBoxPreference e = (CheckBoxPreference) p; + if (key.equals(MainMenuOptionsActivity.Graphics_LowQuality)) { + boolean isShort = preferences.getBoolean(MainMenuOptionsActivity.Graphics_LowQuality, false); + CheckBoxPreference fancyPref = (CheckBoxPreference)findPreference(MainMenuOptionsActivity.Graphics_Fancy); + if (fancyPref != null) { + fancyPref.setEnabled(isShort == false); + if (isShort) + fancyPref.setChecked(false); + } + } + if (key.equals(MainMenuOptionsActivity.Graphics_Fancy)) { + CheckBoxPreference fancyPref = (CheckBoxPreference) p; + //System.err.println("Is PowerVR? : " + MainActivity.isPowerVR()); + if (MainActivity.isPowerVR()) { + fancyPref.setSummary("Experimental on this device!"); + } + } + + if (p.getKey().equals(MainMenuOptionsActivity.Controls_UseTouchscreen)) { + boolean hasOtherPrimaryControls = MainActivity.isXperiaPlay(); + if (!hasOtherPrimaryControls) { + PreferenceCategory mCategory = (PreferenceCategory) findPreference("category_graphics"); + _arrayList.add(new Pref(mCategory, p)); + } + p.setEnabled(hasOtherPrimaryControls); + p.setDefaultValue( !hasOtherPrimaryControls ); + + if (hasOtherPrimaryControls) { + CheckBoxPreference pp = (CheckBoxPreference) p; + CheckBoxPreference j = (CheckBoxPreference)findPreference(MainMenuOptionsActivity.Controls_UseTouchJoypad); + j.setEnabled(pp.isChecked()); + } + } + } + } + + private Preference findPreference(String key) { + return _prefs.findPreference(key); + } +} + +abstract class PreferenceTraverser { + void onPreference(Preference p) {} + void onPreferenceGroup(PreferenceGroup p) {} + } + \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/android/src/com/mojang/minecraftpe/Minecraft_Market.java b/minecraftcpp-master/handheld/project/android/src/com/mojang/minecraftpe/Minecraft_Market.java new file mode 100644 index 0000000..aae5015 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android/src/com/mojang/minecraftpe/Minecraft_Market.java @@ -0,0 +1,14 @@ +package com.mojang.minecraftpe; + +import android.content.Intent; +import android.net.Uri; +import com.mojang.minecraftpe.MainActivity; + +public class Minecraft_Market extends MainActivity { + @Override + public void buyGame() { + final Uri buyLink = Uri.parse("market://details?id=com.mojang.minecraftpe"); + Intent marketIntent = new Intent( Intent.ACTION_VIEW, buyLink ); + startActivity(marketIntent); + } +} diff --git a/minecraftcpp-master/handheld/project/android/src/com/mojang/minecraftpe/Minecraft_Market_Demo.java b/minecraftcpp-master/handheld/project/android/src/com/mojang/minecraftpe/Minecraft_Market_Demo.java new file mode 100644 index 0000000..082c2d4 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android/src/com/mojang/minecraftpe/Minecraft_Market_Demo.java @@ -0,0 +1,17 @@ +package com.mojang.minecraftpe; + +import android.content.Intent; +import android.net.Uri; +import com.mojang.android.licensing.LicenseCodes; + +public class Minecraft_Market_Demo extends MainActivity { + @Override + public void buyGame() { + final Uri buyLink = Uri.parse("market://details?id=com.mojang.minecraftpe"); + Intent marketIntent = new Intent( Intent.ACTION_VIEW, buyLink ); + startActivity(marketIntent); + } + + @Override + protected boolean isDemo() { return true; } +} diff --git a/minecraftcpp-master/handheld/project/android/src/com/mojang/minecraftpe/Minecraft_Verizon.java b/minecraftcpp-master/handheld/project/android/src/com/mojang/minecraftpe/Minecraft_Verizon.java new file mode 100644 index 0000000..01d2f02 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android/src/com/mojang/minecraftpe/Minecraft_Verizon.java @@ -0,0 +1,89 @@ +package com.mojang.minecraftpe; + +import android.os.Bundle; + +import com.mojang.android.licensing.LicenseCodes; +import com.verizon.vcast.apps.LicenseAuthenticator; + + +public class Minecraft_Verizon extends MainActivity { + + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + + _licenseLib = new LicenseAuthenticator(this); + _verizonThread = new VerizonLicenseThread(_licenseLib, VCastMarketKeyword, false); + _verizonThread.start(); + } + + @Override + public int checkLicense() { + if (_verizonThread == null) + return _licenseCode; + + if (!_verizonThread.hasCode) + return -1; + + _licenseCode = _verizonThread.returnCode; + _verizonThread = null; + return _licenseCode; + } + @Override + public boolean hasBuyButtonWhenInvalidLicense() { return false; } + + private LicenseAuthenticator _licenseLib; + private VerizonLicenseThread _verizonThread; + private int _licenseCode; + static private final String VCastMarketKeyword = "Minecraft"; +} + +// +// Requests license code from the Verizon VCAST application on the phone +// +class VerizonLicenseThread extends Thread +{ + public VerizonLicenseThread(LicenseAuthenticator licenseLib, String keyword, boolean isTest) { + _keyword = keyword; + _isTest = isTest; + _licenseLib = licenseLib; + } + + public void run() { + if (_isTest) + validateTestLicense(); + else + validateLicense(); + } + + void validateTestLicense() { + try { + //final int status = LicenseAuthenticator.LICENSE_NOT_FOUND; + final int status = LicenseAuthenticator.LICENSE_OK; + returnCode = _licenseLib.checkTestLicense( _keyword, status ); + } + catch (Throwable e) { + returnCode = LicenseCodes.LICENSE_CHECK_EXCEPTION; + } + hasCode = true; + } + + void validateLicense() { + try { + returnCode = _licenseLib.checkLicense( _keyword ); + } + catch (Throwable e) { + returnCode = LicenseCodes.LICENSE_CHECK_EXCEPTION; + //e.printStackTrace(); + } + hasCode = true; + } + + public volatile boolean hasCode = false; + public volatile int returnCode = -1; + + private String _keyword; + private boolean _isTest; + private LicenseAuthenticator _licenseLib; +} diff --git a/minecraftcpp-master/handheld/project/android_java/.classpath b/minecraftcpp-master/handheld/project/android_java/.classpath new file mode 100644 index 0000000..5681cad --- /dev/null +++ b/minecraftcpp-master/handheld/project/android_java/.classpath @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/minecraftcpp-master/handheld/project/android_java/.project b/minecraftcpp-master/handheld/project/android_java/.project new file mode 100644 index 0000000..636e887 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android_java/.project @@ -0,0 +1,40 @@ + + + MinecraftPocketEdition_java + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + + + src_linked + 2 + C:/dev/subversion/mojang/minecraftcpp/trunk/handheld/project/android/src + + + diff --git a/minecraftcpp-master/handheld/project/android_java/AndroidManifest.xml b/minecraftcpp-master/handheld/project/android_java/AndroidManifest.xml new file mode 100644 index 0000000..3b41ed7 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android_java/AndroidManifest.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/minecraftcpp-master/handheld/project/android_java/ManifestAddons.xml b/minecraftcpp-master/handheld/project/android_java/ManifestAddons.xml new file mode 100644 index 0000000..c617173 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android_java/ManifestAddons.xml @@ -0,0 +1,13 @@ + + + + + + android:debuggable="true" + + + + + + + \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/android_java/assets/armor/chain_1.png b/minecraftcpp-master/handheld/project/android_java/assets/armor/chain_1.png new file mode 100644 index 0000000..3632af5 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/armor/chain_1.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/armor/chain_2.png b/minecraftcpp-master/handheld/project/android_java/assets/armor/chain_2.png new file mode 100644 index 0000000..330425b Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/armor/chain_2.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/armor/cloth_1.png b/minecraftcpp-master/handheld/project/android_java/assets/armor/cloth_1.png new file mode 100644 index 0000000..f3cf4aa Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/armor/cloth_1.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/armor/cloth_2.png b/minecraftcpp-master/handheld/project/android_java/assets/armor/cloth_2.png new file mode 100644 index 0000000..15fb908 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/armor/cloth_2.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/armor/diamond_1.png b/minecraftcpp-master/handheld/project/android_java/assets/armor/diamond_1.png new file mode 100644 index 0000000..339da65 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/armor/diamond_1.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/armor/diamond_2.png b/minecraftcpp-master/handheld/project/android_java/assets/armor/diamond_2.png new file mode 100644 index 0000000..c220c12 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/armor/diamond_2.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/armor/gold_1.png b/minecraftcpp-master/handheld/project/android_java/assets/armor/gold_1.png new file mode 100644 index 0000000..885f309 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/armor/gold_1.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/armor/gold_2.png b/minecraftcpp-master/handheld/project/android_java/assets/armor/gold_2.png new file mode 100644 index 0000000..9d1ea3b Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/armor/gold_2.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/armor/iron_1.png b/minecraftcpp-master/handheld/project/android_java/assets/armor/iron_1.png new file mode 100644 index 0000000..374ab07 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/armor/iron_1.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/armor/iron_2.png b/minecraftcpp-master/handheld/project/android_java/assets/armor/iron_2.png new file mode 100644 index 0000000..53af4f4 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/armor/iron_2.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/art/kz.png b/minecraftcpp-master/handheld/project/android_java/assets/art/kz.png new file mode 100644 index 0000000..a336c94 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/art/kz.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/font/default.png b/minecraftcpp-master/handheld/project/android_java/assets/font/default.png new file mode 100644 index 0000000..780d2d8 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/font/default.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/font/default8.png b/minecraftcpp-master/handheld/project/android_java/assets/font/default8.png new file mode 100644 index 0000000..6179312 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/font/default8.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/gui/background.png b/minecraftcpp-master/handheld/project/android_java/assets/gui/background.png new file mode 100644 index 0000000..b29e009 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/gui/background.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/gui/badge/minecon140.png b/minecraftcpp-master/handheld/project/android_java/assets/gui/badge/minecon140.png new file mode 100644 index 0000000..07c83a3 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/gui/badge/minecon140.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/gui/bg32.png b/minecraftcpp-master/handheld/project/android_java/assets/gui/bg32.png new file mode 100644 index 0000000..d9796c4 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/gui/bg32.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/gui/default_world.png b/minecraftcpp-master/handheld/project/android_java/assets/gui/default_world.png new file mode 100644 index 0000000..17c9cdc Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/gui/default_world.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/gui/gui.png b/minecraftcpp-master/handheld/project/android_java/assets/gui/gui.png new file mode 100644 index 0000000..40a708e Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/gui/gui.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/gui/gui_blocks.png b/minecraftcpp-master/handheld/project/android_java/assets/gui/gui_blocks.png new file mode 100644 index 0000000..fa4e8cc Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/gui/gui_blocks.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/gui/icons.png b/minecraftcpp-master/handheld/project/android_java/assets/gui/icons.png new file mode 100644 index 0000000..8afc25a Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/gui/icons.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/gui/itemframe.png b/minecraftcpp-master/handheld/project/android_java/assets/gui/itemframe.png new file mode 100644 index 0000000..8e23979 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/gui/itemframe.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/gui/items.png b/minecraftcpp-master/handheld/project/android_java/assets/gui/items.png new file mode 100644 index 0000000..51a9163 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/gui/items.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/gui/spritesheet.png b/minecraftcpp-master/handheld/project/android_java/assets/gui/spritesheet.png new file mode 100644 index 0000000..f736921 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/gui/spritesheet.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/gui/title.png b/minecraftcpp-master/handheld/project/android_java/assets/gui/title.png new file mode 100644 index 0000000..5f2e4ff Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/gui/title.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/gui/touchgui.png b/minecraftcpp-master/handheld/project/android_java/assets/gui/touchgui.png new file mode 100644 index 0000000..56b433f Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/gui/touchgui.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/item/arrows.png b/minecraftcpp-master/handheld/project/android_java/assets/item/arrows.png new file mode 100644 index 0000000..75c5828 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/item/arrows.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/item/camera.png b/minecraftcpp-master/handheld/project/android_java/assets/item/camera.png new file mode 100644 index 0000000..9725189 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/item/camera.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/item/sign.png b/minecraftcpp-master/handheld/project/android_java/assets/item/sign.png new file mode 100644 index 0000000..e829472 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/item/sign.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/lang/en_US.lang b/minecraftcpp-master/handheld/project/android_java/assets/lang/en_US.lang new file mode 100644 index 0000000..2bf5303 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android_java/assets/lang/en_US.lang @@ -0,0 +1,947 @@ + +language.name=English +language.region=US +language.code=en_US + +gui.done=Done +gui.cancel=Cancel +gui.toMenu=Back to title screen +gui.up=Up +gui.down=Down +gui.yes=Yes +gui.no=No + +menu.singleplayer=Singleplayer +menu.multiplayer=Multiplayer +menu.mods=Texture Packs +menu.options=Options... +menu.quit=Quit Game +menu.returnToMenu=Save and Quit to Title +menu.disconnect=Disconnect +menu.returnToGame=Back to Game +menu.switchingLevel=Switching level +menu.generatingLevel=Generating level +menu.loadingLevel=Loading level +menu.generatingTerrain=Building terrain +menu.simulating=Simulating the world for a bit +menu.respawning=Respawning + +selectWorld.title=Select World +selectWorld.empty=empty +selectWorld.world=World +selectWorld.select=Play Selected World +selectWorld.create=Create New World +selectWorld.createDemo=Play New Demo World +selectWorld.delete=Delete +selectWorld.rename=Rename +selectWorld.deleteQuestion=Are you sure you want to delete this world? +selectWorld.deleteWarning=will be lost forever! (A long time!) +selectWorld.deleteButton=Delete +selectWorld.renameButton=Rename +selectWorld.renameTitle=Rename World +selectWorld.conversion=Must be converted! +selectWorld.newWorld=New World +selectWorld.enterName=World Name +selectWorld.resultFolder=Will be saved in: +selectWorld.enterSeed=Seed for the World Generator +selectWorld.seedInfo=Leave blank for a random seed + +gameMode.survival=Survival Mode +gameMode.creative=Creative Mode +gameMode.hardcore=Hardcore Mode! +gameMode.changed=Your game mode has been changed + +selectWorld.gameMode=Game Mode: +selectWorld.gameMode.survival=Survival +selectWorld.gameMode.survival.line1=Search for resources, crafting, gain +selectWorld.gameMode.survival.line2=levels, health and hunger +selectWorld.gameMode.creative=Creative +selectWorld.gameMode.creative.line1=Unlimited resources, free flying and +selectWorld.gameMode.creative.line2=destroy blocks instantly +selectWorld.gameMode.hardcore=Hardcore +selectWorld.gameMode.hardcore.line1=Same as survival mode, locked at hardest +selectWorld.gameMode.hardcore.line2=difficulty, and one life only +selectWorld.moreWorldOptions=More World Options... +selectWorld.mapFeatures=Generate Structures: +selectWorld.mapFeatures.info=Villages, dungeons etc +selectWorld.mapType=World Type: +selectWorld.mapType.normal=Normal +selectWorld.hardcoreMode=Hardcore: +selectWorld.hardcoreMode.info=World is deleted upon death + +generator.default=Default +generator.flat=Superflat + +selectServer.title=Select Server +selectServer.empty=empty +selectServer.select=Join Server +selectServer.direct=Direct Connect +selectServer.edit=Edit +selectServer.delete=Delete +selectServer.add=Add server +selectServer.defaultName=Minecraft Server +selectServer.deleteQuestion=Are you sure you want to remove this server? +selectServer.deleteWarning=will be lost forever! (A long time!) +selectServer.deleteButton=Delete +selectServer.refresh=Refresh +addServer.title=Edit Server Info +addServer.enterName=Server Name +addServer.enterIp=Server Address +addServer.add=Done + +multiplayer.title=Play Multiplayer +multiplayer.connect=Connect +multiplayer.info1=Minecraft Multiplayer is currently not finished, but there +multiplayer.info2=is some buggy early testing going on. +multiplayer.ipinfo=Enter the IP of a server to connect to it: + +multiplayer.downloadingTerrain=Downloading terrain + +multiplayer.stopSleeping=Leave Bed + +demo.day.1=This demo will last five game days, do your best! +demo.day.2=Day Two +demo.day.3=Day Three +demo.day.4=Day Four +demo.day.5=This is your last day! +demo.day.warning=Your time is almost up! +demo.day.6=You have passed your fifth day, use F2 to save a screenshot of your creation +demo.reminder=The demo time has expired, buy the game to continue or start a new world! +demo.help.movement=Use %1$s, %2$s, %3$s, %4$s and the mouse to move around +demo.help.jump=Jump by pressing %1$s +demo.help.inventory=Use %1$s to open your inventory + +connect.connecting=Connecting to the server... +connect.authorizing=Logging in... +connect.failed=Failed to connect to the server + +disconnect.genericReason=%s +disconnect.disconnected=Disconnected by Server +disconnect.lost=Connection Lost +disconnect.kicked=Was kicked from the game +disconnect.timeout=Timed out +disconnect.closed=Connection closed +disconnect.loginFailed=Failed to login +disconnect.loginFailedInfo=Failed to login: %s +disconnect.quitting=Quitting +disconnect.endOfStream=End of stream +disconnect.overflow=Buffer overflow + +options.off=OFF +options.on=ON +options.title=Options +options.controls=Controls... +options.video=Video Settings... +options.language=Language... +options.languageWarning=Language translations may not be 100% accurate +options.videoTitle=Video Settings +options.music=Music +options.sound=Sound +options.invertMouse=Invert Mouse +options.fov=FOV +options.fov.min=Normal +options.fov.max=Quake Pro +options.gamma=Brightness +options.gamma.min=Moody +options.gamma.max=Bright +options.sensitivity=Sensitivity +options.sensitivity.min=*yawn* +options.sensitivity.max=HYPERSPEED!!! +options.renderDistance=Render Distance +options.renderDistance.tiny=Tiny +options.renderDistance.short=Short +options.renderDistance.normal=Normal +options.renderDistance.far=Far +options.viewBobbing=View Bobbing +options.ao=Smooth Lighting +options.anaglyph=3D Anaglyph +options.framerateLimit=Performance +options.difficulty=Difficulty +options.difficulty.peaceful=Peaceful +options.difficulty.easy=Easy +options.difficulty.normal=Normal +options.difficulty.hard=Hard +options.difficulty.hardcore=Hardcore +options.graphics=Graphics +options.graphics.fancy=Fancy +options.graphics.fast=Fast +options.guiScale=GUI Scale +options.guiScale.auto=Auto +options.guiScale.small=Small +options.guiScale.normal=Normal +options.guiScale.large=Large +options.advancedOpengl=Advanced OpenGL +options.renderClouds=Clouds +options.farWarning1=A 64 bit Java installation is recommended +options.farWarning2=for 'Far' render distance (you have 32 bit) +options.particles=Particles +options.particles.all=All +options.particles.decreased=Decreased +options.particles.minimal=Minimal + +performance.max=Max FPS +performance.balanced=Balanced +performance.powersaver=Power saver + +controls.title=Controls + +key.forward=Forward +key.left=Left +key.back=Back +key.right=Right +key.jump=Jump +key.inventory=Inventory +key.drop=Drop +key.chat=Chat +key.fog=Toggle Fog +key.sneak=Sneak +key.playerlist=List Players +key.attack=Attack +key.use=Use Item +key.pickItem=Pick Block +key.mouseButton=Button %1$s + +texturePack.openFolder=Open texture pack folder +texturePack.title=Select Texture Pack +texturePack.folderInfo=(Place texture pack files here) + +tile.stone.name=Stone +tile.grass.name=Grass Block +tile.dirt.name=Dirt +tile.stonebrick.name=Cobblestone +tile.wood.name=Wooden Planks +tile.sapling.name=Sapling +tile.deadbush.name=Dead Bush +tile.bedrock.name=Bedrock +tile.water.name=Water +tile.lava.name=Lava +tile.sand.name=Sand +tile.sandStone.name=Sandstone +tile.gravel.name=Gravel +tile.oreGold.name=Gold Ore +tile.oreIron.name=Iron Ore +tile.oreCoal.name=Coal Ore +tile.log.name=Wood +tile.leaves.name=Leaves +tile.tallgrass.name=Grass +tile.tallgrass.shrub.name=Shrub +tile.tallgrass.grass.name=Grass +tile.tallgrass.fern.name=Fern +tile.sponge.name=Sponge +tile.glass.name=Glass +tile.thinGlass.name=Glass Pane +tile.cloth.name=Wool +tile.flower.name=Flower +tile.rose.name=Rose +tile.mushroom.name=Mushroom +tile.blockGold.name=Block of Gold +tile.blockIron.name=Block of Iron +tile.stoneSlab.stone.name=Stone Slab +tile.stoneSlab.sand.name=Sandstone Slab +tile.stoneSlab.wood.name=Wooden Slab +tile.stoneSlab.cobble.name=Cobblestone Slab +tile.stoneSlab.brick.name=Bricks Slab +tile.stoneSlab.smoothStoneBrick.name=Stone Bricks Slab +tile.brick.name=Bricks +tile.tnt.name=TNT +tile.bookshelf.name=Bookshelf +tile.stoneMoss.name=Moss Stone +tile.obsidian.name=Obsidian +tile.torch.name=Torch +tile.fire.name=Fire +tile.mobSpawner.name=Monster Spawner +tile.stairsWood.name=Wooden Stairs +tile.chest.name=Chest +tile.redstoneDust.name=Redstone Dust +tile.oreDiamond.name=Diamond Ore +tile.blockDiamond.name=Block of Diamond +tile.workbench.name=Crafting Table +tile.crops.name=Crops +tile.farmland.name=Farmland +tile.furnace.name=Furnace +tile.sign.name=Sign +tile.doorWood.name=Wooden Door +tile.ladder.name=Ladder +tile.rail.name=Rail +tile.goldenRail.name=Powered Rail +tile.detectorRail.name=Detector Rail +tile.stairsStone.name=Stone Stairs +tile.lever.name=Lever +tile.pressurePlate.name=Pressure Plate +tile.doorIron.name=Iron Door +tile.oreRedstone.name=Redstone Ore +tile.notGate.name=Redstone Torch +tile.button.name=Button +tile.snow.name=Snow +tile.ice.name=Ice +tile.cactus.name=Cactus +tile.clay.name=Clay +tile.reeds.name=Sugar cane +tile.jukebox.name=Jukebox +tile.fence.name=Fence +tile.fenceGate.name=Fence Gate +tile.pumpkin.name=Pumpkin +tile.litpumpkin.name=Jack 'o' Lantern +tile.hellrock.name=Netherrack +tile.hellsand.name=Soul Sand +tile.lightgem.name=Glowstone +tile.portal.name=Portal +tile.cloth.black.name=Black Wool +tile.cloth.red.name=Red Wool +tile.cloth.green.name=Green Wool +tile.cloth.brown.name=Brown Wool +tile.cloth.blue.name=Blue Wool +tile.cloth.purple.name=Purple Wool +tile.cloth.cyan.name=Cyan Wool +tile.cloth.silver.name=Light Gray Wool +tile.cloth.gray.name=Gray Wool +tile.cloth.pink.name=Pink Wool +tile.cloth.lime.name=Lime Wool +tile.cloth.yellow.name=Yellow Wool +tile.cloth.lightBlue.name=Blue Light Wool +tile.cloth.magenta.name=Magenta Wool +tile.cloth.orange.name=Orange Wool +tile.cloth.white.name=Wool +tile.oreLapis.name=Lapis Lazuli Ore +tile.blockLapis.name=Lapis Lazuli Block +tile.dispenser.name=Dispenser +tile.musicBlock.name=Note Block +tile.cake.name=Cake +tile.bed.name=Bed +tile.bed.occupied=This bed is occupied +tile.bed.noSleep=You can only sleep at night +tile.bed.notSafe=You may not rest now, there are monsters nearby +tile.bed.notValid=Your home bed was missing or obstructed +tile.lockedchest.name=Locked chest +tile.trapdoor.name=Trapdoor +tile.web.name=Cobweb +tile.stonebricksmooth.name=Stone Bricks +tile.pistonBase.name=Piston +tile.pistonStickyBase.name=Sticky Piston +tile.fenceIron.name=Iron Bars +tile.melon.name=Melon +tile.stairsBrick.name=Brick Stairs +tile.stairsStoneBrickSmooth.name=Stone Brick Stairs +tile.vine.name=Vines +tile.netherBrick.name=Nether Brick +tile.netherFence.name=Nether Brick Fence +tile.stairsNetherBrick.name=Nether Brick Stairs +tile.netherStalk.name=Nether Wart +tile.cauldron.name=Cauldron +tile.enchantmentTable.name=Enchantment Table +tile.whiteStone.name=End Stone +tile.mycel.name=Mycelium +tile.waterlily.name=Lily Pad +tile.dragonEgg.name=Dragon Egg +tile.redstoneLight.name=Redstone Lamp +tile.glowingobsidian.name=Glowing Obsidian +tile.netherreactor.name=Nether Reactor Core + +item.shovelIron.name=Iron Shovel +item.pickaxeIron.name=Iron Pickaxe +item.hatchetIron.name=Iron Axe +item.flintAndSteel.name=Flint and Steel +item.apple.name=Apple +item.cookie.name=Cookie +item.bow.name=Bow +item.arrow.name=Arrow +item.coal.name=Coal +item.charcoal.name=Charcoal +item.emerald.name=Diamond +item.ingotIron.name=Iron Ingot +item.ingotGold.name=Gold Ingot +item.swordIron.name=Iron Sword +item.swordWood.name=Wooden Sword +item.shovelWood.name=Wooden Shovel +item.pickaxeWood.name=Wooden Pickaxe +item.hatchetWood.name=Wooden Axe +item.swordStone.name=Stone Sword +item.shovelStone.name=Stone Shovel +item.pickaxeStone.name=Stone Pickaxe +item.hatchetStone.name=Stone Axe +item.swordDiamond.name=Diamond Sword +item.shovelDiamond.name=Diamond Shovel +item.pickaxeDiamond.name=Diamond Pickaxe +item.hatchetDiamond.name=Diamond Axe +item.stick.name=Stick +item.bowl.name=Bowl +item.mushroomStew.name=Mushroom Stew +item.swordGold.name=Golden Sword +item.shovelGold.name=Golden Shovel +item.pickaxeGold.name=Golden Pickaxe +item.hatchetGold.name=Golden Axe +item.string.name=String +item.feather.name=Feather +item.sulphur.name=Gunpowder +item.hoeWood.name=Wooden Hoe +item.hoeStone.name=Stone Hoe +item.hoeIron.name=Iron Hoe +item.hoeDiamond.name=Diamond Hoe +item.hoeGold.name=Golden Hoe +item.seeds.name=Seeds +item.seeds_pumpkin.name=Pumpkin Seeds +item.seeds_melon.name=Melon Seeds +item.melon.name=Melon +item.wheat.name=Wheat +item.bread.name=Bread +item.helmetCloth.name=Leather Cap +item.chestplateCloth.name=Leather Tunic +item.leggingsCloth.name=Leather Pants +item.bootsCloth.name=Leather Boots +item.helmetChain.name=Chain Helmet +item.chestplateChain.name=Chain Chestplate +item.leggingsChain.name=Chain Leggings +item.bootsChain.name=Chain Boots +item.helmetIron.name=Iron Helmet +item.chestplateIron.name=Iron Chestplate +item.leggingsIron.name=Iron Leggings +item.bootsIron.name=Iron Boots +item.helmetDiamond.name=Diamond Helmet +item.chestplateDiamond.name=Diamond Chestplate +item.leggingsDiamond.name=Diamond Leggings +item.bootsDiamond.name=Diamond Boots +item.helmetGold.name=Golden Helmet +item.chestplateGold.name=Golden Chestplate +item.leggingsGold.name=Golden Leggings +item.bootsGold.name=Golden Boots +item.flint.name=Flint +item.porkchopRaw.name=Raw Porkchop +item.porkchopCooked.name=Cooked Porkchop +item.chickenRaw.name=Raw Chicken +item.chickenCooked.name=Cooked Chicken +item.beefRaw.name=Raw Beef +item.beefCooked.name=Steak +item.painting.name=Painting +item.appleGold.name=Golden Apple +item.sign.name=Sign +item.doorWood.name=Wooden Door +item.bucket.name=Bucket +item.bucketWater.name=Water Bucket +item.bucketLava.name=Lava Bucket +item.minecart.name=Minecart +item.saddle.name=Saddle +item.doorIron.name=Iron Door +item.redstone.name=Redstone +item.snowball.name=Snowball +item.boat.name=Boat +item.leather.name=Leather +item.milk.name=Milk +item.brick.name=Brick +item.clay.name=Clay +item.reeds.name=Sugar Canes +item.paper.name=Paper +item.book.name=Book +item.slimeball.name=Slimeball +item.minecartChest.name=Minecart with Chest +item.minecartFurnace.name=Minecart with Furnace +item.egg.name=Egg +item.compass.name=Compass +item.fishingRod.name=Fishing Rod +item.clock.name=Clock +item.yellowDust.name=Glowstone Dust +item.fishRaw.name=Raw Fish +item.fishCooked.name=Cooked Fish +item.record.name=Music Disc +item.bone.name=Bone +item.dyePowder.black.name=Ink Sac +item.dyePowder.red.name=Rose Red +item.dyePowder.green.name=Cactus Green +item.dyePowder.brown.name=Cocoa Beans +item.dyePowder.blue.name=Lapis Lazuli +item.dyePowder.purple.name=Purple Dye +item.dyePowder.cyan.name=Cyan Dye +item.dyePowder.silver.name=Light Gray Dye +item.dyePowder.gray.name=Gray Dye +item.dyePowder.pink.name=Pink Dye +item.dyePowder.lime.name=Lime Dye +item.dyePowder.yellow.name=Dandelion Yellow +item.dyePowder.lightBlue.name=Light Blue Dye +item.dyePowder.magenta.name=Magenta Dye +item.dyePowder.orange.name=Orange Dye +item.dyePowder.white.name=Bone Meal +item.sugar.name=Sugar +item.cake.name=Cake +item.bed.name=Bed +item.diode.name=Redstone Repeater +item.map.name=Map +item.leaves.name=Leaves +item.shears.name=Shears +item.rottenFlesh.name=Rotten Flesh +item.enderPearl.name=Ender Pearl +item.blazeRod.name=Blaze Rod +item.ghastTear.name=Ghast Tear +item.netherStalkSeeds.name=Nether Wart +item.potion.name=Potion +item.emptyPotion.name=Water Bottle +item.goldNugget.name=Gold Nugget +item.glassBottle.name=Glass Bottle +item.spiderEye.name=Spider Eye +item.fermentedSpiderEye.name=Fermented Spider Eye +item.blazePowder.name=Blaze Powder +item.magmaCream.name=Magma Cream +item.cauldron.name=Cauldron +item.brewingStand.name=Brewing Stand +item.eyeOfEnder.name=Eye of Ender +item.speckledMelon.name=Glistering Melon +item.monsterPlacer.name=Spawn +item.expBottle.name=Bottle o' Enchanting +item.fireball.name=Fire Charge + +container.inventory=Inventory +container.crafting=Crafting +container.dispenser=Dispenser +container.furnace=Furnace +container.enchant=Enchant +container.creative=Item Selection +container.brewing=Brewing Stand +container.chest=Chest +container.minecart=Minecart + +entity.Item.name=Item +entity.XPOrb.name=Experience Orb + +entity.Arrow.name=Arrow +entity.Snowball.name=Snowball +entity.Painting.name=Painting + +entity.Mob.name=Mob +entity.Monster.name=Monster + +entity.Creeper.name=Creeper +entity.Skeleton.name=Skeleton +entity.Spider.name=Spider +entity.Giant.name=Giant +entity.Zombie.name=Zombie +entity.Slime.name=Slime +entity.Ghast.name=Ghast +entity.PigZombie.name=Zombie Pigman +entity.Enderman.name=Enderman +entity.Silverfish.name=Silverfish +entity.CaveSpider.name=Cave Spider +entity.Blaze.name=Blaze +entity.LavaSlime.name=Magma Cube +entity.MushroomCow.name=Mooshroom +entity.Villager.name=Villager +entity.VillagerGolem.name=Iron Golem +entity.SnowMan.name=Snow Golem +entity.EnderDragon.name=Ender Dragon + +entity.Pig.name=Pig +entity.Sheep.name=Sheep +entity.Cow.name=Cow +entity.Chicken.name=Chicken +entity.Squid.name=Squid +entity.Wolf.name=Wolf +entity.Ozelot.name=Ocelot +entity.Cat.name=Cat + +entity.PrimedTnt.name=Block of TNT +entity.FallingSand.name=Falling Block + +entity.Minecart.name=Minecart +entity.Boat.name=Boat + +entity.Arrow.name=arrow +entity.generic.name=unknown + +death.inFire=%1$s went up in flames +death.onFire=%1$s burned to death +death.lava=%1$s tried to swim in lava +death.inWall=%1$s suffocated in a wall +death.drown=%1$s drowned +death.starve=%1$s starved to death +death.cactus=%1$s was pricked to death +death.fall=%1$s hit the ground too hard +death.outOfWorld=%1$s fell out of the world +death.generic=%1$s died +death.explosion=%1$s blew up +death.magic=%1$s was killed by magic +death.mob=%1$s was slain by %2$s +death.player=%1$s was slain by %2$s +death.arrow=%1$s was shot by %2$s +death.fireball=%1$s was fireballed by %2$s +death.thrown=%1$s was pummeled by %2$s +death.indirectMagic=%1$s was killed by %2$s + +deathScreen.respawn=Respawn +deathScreen.deleteWorld=Delete world +deathScreen.titleScreen=Title screen +deathScreen.score=Score +deathScreen.title.hardcore=Game over! +deathScreen.hardcoreInfo=You cannot respawn in hardcore mode! +deathScreen.title=You died! + +potion.empty=No Effects +potion.moveSpeed=Speed +potion.moveSlowdown=Slowness +potion.digSpeed=Haste +potion.digSlowDown=Mining Fatigue +potion.damageBoost=Strength +potion.weakness=Weakness +potion.heal=Instant Health +potion.harm=Instant Damage +potion.jump=Jump Boost +potion.confusion=Nausea +potion.regeneration=Regeneration +potion.resistance=Resistance +potion.fireResistance=Fire Resistance +potion.waterBreathing=Water Breathing +potion.invisibility=Invisibility +potion.blindness=Blindness +potion.nightVision=Night Vision +potion.hunger=Hunger +potion.poison=Poison + +potion.moveSpeed.postfix=Potion of Swiftness +potion.moveSlowdown.postfix=Potion of Slowness +potion.digSpeed.postfix=Potion of Haste +potion.digSlowDown.postfix=Potion of Dullness +potion.damageBoost.postfix=Potion of Strength +potion.weakness.postfix=Potion of Weakness +potion.heal.postfix=Potion of Healing +potion.harm.postfix=Potion of Harming +potion.jump.postfix=Potion of Leaping +potion.confusion.postfix=Potion of Nausea +potion.regeneration.postfix=Potion of Regeneration +potion.resistance.postfix=Potion of Resistance +potion.fireResistance.postfix=Potion of Fire Resistance +potion.waterBreathing.postfix=Potion of Water Breathing +potion.invisibility.postfix=Potion of Invisibility +potion.blindness.postfix=Potion of Blindness +potion.nightVision.postfix=Potion of Night Vision +potion.hunger.postfix=Potion of Hunger +potion.poison.postfix=Potion of Poison + +potion.potency.0= +potion.potency.1=II +potion.potency.2=III +potion.potency.3=IV + +potion.prefix.grenade=Splash +potion.prefix.mundane=Mundane +potion.prefix.uninteresting=Uninteresting +potion.prefix.bland=Bland +potion.prefix.clear=Clear +potion.prefix.milky=Milky +potion.prefix.diffuse=Diffuse +potion.prefix.artless=Artless +potion.prefix.thin=Thin +potion.prefix.awkward=Awkward +potion.prefix.flat=Flat +potion.prefix.bulky=Bulky +potion.prefix.bungling=Bungling +potion.prefix.buttered=Buttered +potion.prefix.smooth=Smooth +potion.prefix.suave=Suave +potion.prefix.debonair=Debonair +potion.prefix.thick=Thick +potion.prefix.elegant=Elegant +potion.prefix.fancy=Fancy +potion.prefix.charming=Charming +potion.prefix.dashing=Dashing +potion.prefix.refined=Refined +potion.prefix.cordial=Cordial +potion.prefix.sparkling=Sparkling +potion.prefix.potent=Potent +potion.prefix.foul=Foul +potion.prefix.odorless=Odorless +potion.prefix.rank=Rank +potion.prefix.harsh=Harsh +potion.prefix.acrid=Acrid +potion.prefix.gross=Gross +potion.prefix.stinky=Stinky + +enchantment.damage.all=Sharpness +enchantment.damage.undead=Smite +enchantment.damage.arthropods=Bane of Arthropods +enchantment.knockback=Knockback +enchantment.fire=Fire Aspect +enchantment.protect.all=Protection +enchantment.protect.fire=Fire Protection +enchantment.protect.fall=Feather Falling +enchantment.protect.explosion=Blast Protection +enchantment.protect.projectile=Projectile Protection +enchantment.oxygen=Respiration +enchantment.waterWorker=Aqua Affinity +enchantment.digging=Efficiency +enchantment.untouching=Silk Touch +enchantment.durability=Unbreaking +enchantment.lootBonus=Looting +enchantment.lootBonusDigger=Fortune +enchantment.arrowDamage=Power +enchantment.arrowFire=Flame +enchantment.arrowKnockback=Punch +enchantment.arrowInfinite=Infinity + +enchantment.level.1=I +enchantment.level.2=II +enchantment.level.3=III +enchantment.level.4=IV +enchantment.level.5=V +enchantment.level.6=VI +enchantment.level.7=VII +enchantment.level.8=VIII +enchantment.level.9=IX +enchantment.level.10=X + +gui.achievements=Achievements +gui.stats=Statistics + +stat.generalButton=General +stat.blocksButton=Blocks +stat.itemsButton=Items + +stat.used=Times Used +stat.mined=Times Mined +stat.depleted=Times Depleted +stat.crafted=Times Crafted + +stat.startGame=Times played +stat.createWorld=Worlds played +stat.loadWorld=Saves loaded +stat.joinMultiplayer=Multiplayer joins +stat.leaveGame=Games quit + +stat.playOneMinute=Minutes Played + +stat.walkOneCm=Distance Walked +stat.fallOneCm=Distance Fallen +stat.swimOneCm=Distance Swum +stat.flyOneCm=Distance Flown +stat.climbOneCm=Distance Climbed +stat.diveOneCm=Distance Dove +stat.minecartOneCm=Distance by Minecart +stat.boatOneCm=Distance by Boat +stat.pigOneCm=Distance by Pig +stat.jump=Jumps +stat.drop=Items Dropped + +stat.damageDealt=Damage Dealt +stat.damageTaken=Damage Taken +stat.deaths=Number of Deaths +stat.mobKills=Mob Kills +stat.playerKills=Player Kills +stat.fishCaught=Fish Caught + +stat.mineBlock=%1$s Mined +stat.craftItem=%1$s Crafted +stat.useItem=%1$s Used +stat.breakItem=%1$s Depleted + +achievement.get=Achievement get! + +achievement.taken=Taken! + +achievement.requires=Requires '%1$s' +achievement.openInventory=Taking Inventory +achievement.openInventory.desc=Press '%1$s' to open your inventory. +achievement.mineWood=Getting Wood +achievement.mineWood.desc=Attack a tree until a block of wood pops out +achievement.buildWorkBench=Benchmarking +achievement.buildWorkBench.desc=Craft a workbench with four blocks of planks +achievement.buildPickaxe=Time to Mine! +achievement.buildPickaxe.desc=Use planks and sticks to make a pickaxe +achievement.buildFurnace=Hot Topic +achievement.buildFurnace.desc=Construct a furnace out of eight stone blocks +achievement.acquireIron=Acquire Hardware +achievement.acquireIron.desc=Smelt an iron ingot +achievement.buildHoe=Time to Farm! +achievement.buildHoe.desc=Use planks and sticks to make a hoe +achievement.makeBread=Bake Bread +achievement.makeBread.desc=Turn wheat into bread +achievement.bakeCake=The Lie +achievement.bakeCake.desc=Wheat, sugar, milk and eggs! +achievement.buildBetterPickaxe=Getting an Upgrade +achievement.buildBetterPickaxe.desc=Construct a better pickaxe +achievement.cookFish=Delicious Fish +achievement.cookFish.desc=Catch and cook fish! +achievement.onARail=On A Rail +achievement.onARail.desc=Travel by minecart at least 1 km from where you started +achievement.buildSword=Time to Strike! +achievement.buildSword.desc=Use planks and sticks to make a sword +achievement.killEnemy=Monster Hunter +achievement.killEnemy.desc=Attack and destroy a monster +achievement.killCow=Cow Tipper +achievement.killCow.desc=Harvest some leather +achievement.flyPig=When Pigs Fly +achievement.flyPig.desc=Fly a pig off a cliff +achievement.snipeSkeleton=Sniper Duel +achievement.snipeSkeleton.desc=Kill a skeleton with an arrow from more than 50 meters +achievement.diamonds=DIAMONDS! +achievement.diamonds.desc=Acquire diamonds with your iron tools +achievement.portal=We Need to Go Deeper +achievement.portal.desc=Build a portal to the Nether +achievement.ghast=Return to Sender +achievement.ghast.desc=Destroy a Ghast with a fireball +achievement.blazeRod=Into Fire +achievement.blazeRod.desc=Relieve a Blaze of its rod +achievement.potion=Local Brewery +achievement.potion.desc=Brew a potion +achievement.theEnd=The End? +achievement.theEnd.desc=Locate the End +achievement.theEnd2=The End. +achievement.theEnd2.desc=Defeat the Ender Dragon +achievement.enchantments=Enchanter +achievement.enchantments.desc=Use a book, obsidian and diamonds to construct an enchantment table +achievement.overkill=Overkill +achievement.overkill.desc=Deal eight hearts of damage in a single hit +achievement.bookcase=Librarian +achievement.bookcase.desc=Build some bookshelves to improve your enchantment table + +desc.sword=Deals more damage than by hand. +desc.shovel=Used to dig dirt, grass, sand, gravel and snow faster than by hand. +desc.pickaxe=Required to mine stone-related blocks and ore. +desc.hatchet=Used to chop wood-related blocks faster than by hand. +desc.hoe=Used to till dirt and grass blocks to prepare for crops. +desc.doorwood=Wooden doors are activated by using, hitting them or with Redstone. +desc.dooriron=Iron doors can only be opened by Redstone, buttons or switches. +desc.helmet=Gives the user 1.5 Armor when worn. +desc.chestplate=Gives the user 4 Armor when worn. +desc.leggings=Gives the user 3 Armor when worn. +desc.boots=Gives the user 1.5 Armor when worn. +desc.ingot=A shiny ingot which can be used to craft tools made from this material. +desc.block=Allows ingots, gems, or dyes to be crafted into placeable blocks. Can be used as an expensive building block or compact storage of the ore. +desc.pressureplate=Used to send an electrical charge when stepped on by a player, an animal, or a monster. Wooden Pressure Plates can also be activated by dropping something on them. +desc.stairs=Used for compact staircases. +desc.slab=Used for making long staircases. +desc.halfslab=Used for compact staircases. +desc.torch=Used to create light. Torches also melt snow and ice. +desc.wood=Used as a building material and can be crafted into many things. Can be crafted from any wood. +desc.sandstone=Used as a building material. +desc.sandstone.addon=Is not influenced by gravity like normal Sand. +desc.structblock=Used as a building material. +desc.stick=Used to craft torches, arrows, signs, ladders, fences and as handles for tools and weapons. +desc.bed=Used to skip to dawn, if all players are sleeping. Changes your spawn point to the bed's position. +The colors of the bed are always the same, regardless of the colors of wool used. +desc.craftingtable=Allows you to craft a more varied selection of items than the normal crafting. +desc.furnace=Allows you to smelt ore, create charcoal and glass, and cook fish and porkchops. +desc.chest=Stores blocks and items inside. +desc.fence=Used as a barrier that cannot be jumped over. +desc.ladder=Used to climb vertically. +desc.trapdoor=Activated by using, hitting them or with redstone. They function as normal doors, but are a one by one block and lay flat on the ground. +desc.sign=Shows text entered by you or other players. +desc.glowstone=Used to create brighter light than torches. Melts snow/ice and can be used underwater. +desc.tnt=Used to cause explosions. Activated after placing by hitting, or with an electrical charge. +desc.bowl=Used to hold mushroom stew. You keep the bowl when the stew has been eaten. +desc.bucket=Used to hold and transport water, lava and milk. +desc.flintandsteel=Used to detonate TNT. +desc.fishingrod=Used to catch fish. +desc.clock=Displays positions of the Sun and Moon. +desc.compass=Points to your start point. +desc.map=Will create an image of an area explored while held. This can be used for path-finding. +desc.bow=Allows for ranged attacks by using arrows. +desc.arrow=Used as ammunition for bows. +desc.mushroomstew=Restores 5 hearts. +desc.cookie=Restores 0.5 Hearts. Can be stacked up to 8 times. +desc.cake=Restores 1.5 Hearts. Can be used 6 times. +desc.sugar=Used in the cake recipe. +desc.bread=Restores 2.5 Hearts. +desc.goldenapple=Restores 10 Hearts. +desc.lever=Used to send an electrical charge by being turned on or off. Stays in the on or off state until pressed again. +desc.redstonetorch=Constantly sends an electrical charge, or can be used as a receiver/transmitter when connected to the side of a block. +Can also be used for low-level lighting. +desc.redstonerepeater=Used in Redstone circuits as repeater, a delayer, and/or a diode +desc.button=Used to send an electrical charge by being pressed. Stays activated for approximately a second before shutting off again. +desc.dispenser=Used to hold and shoot out items in a random order when given a Redstone charge. +desc.noteblock=Plays a note when triggered. Hit it to change the pitch of the note. Placing this on top of different blocks will change the type of instrument. +desc.rail=Used to guide minecarts. +desc.poweredrail=When powered, accelerates minecarts that pass over it. When unpowered, causes minecarts to stop on it. +desc.detectorrail=Functions like a Pressure Plate (sends a Redstone signal when powered) but can only be activated by a minecart. +desc.minecart=Used to transport you, an animal, or a monster along rails. +desc.minecartwithchest=Used to transport goods along rails. +desc.minecartwithfurnace=Will move along rails and can push other minecarts when coal is put in it. +desc.boat=Used to travel in water more quickly than swimming. +desc.wool=Collected from sheep, and can be colored with dyes. +desc.woolstring=Used as a building material and can be colored with dyes. Can be easily obtained from Sheep. +desc.dyepowder.black=Used as a dye to create black wool. +desc.dyepowder.green=Used as a dye to create green wool. +desc.dyepowder.brown=Used as a dye to create brown wool. +desc.dyepowder.silver=Used as a dye to create silver wool. +desc.dyepowder.yellow=Used as a dye to create yellow wool. +desc.dyepowder.red=Used as a dye to create red wool. +desc.dyepowder.white=Used to instantly grow crops, trees, tall grass, huge mushrooms and flowers, and can be used in dye recipes. +desc.dyepowder.pink=Used as a dye to create pink wool. +desc.dyepowder.orange=Used as a dye to create orange wool. +desc.dyepowder.lime=Used as a dye to create lime wool. +desc.dyepowder.gray=Used as a dye to create gray wool. +desc.dyepowder.lightgray=Used as a dye to create light gray wool. +(Note: light gray dye can also be made by combining gray dye with bone meal, letting you make four light gray dyes from every ink sac instead of three.) +desc.dyepowder.lightblue=Used as a dye to create light blue wool. +desc.dyepowder.cyan=Used as a dye to create cyan wool. +desc.dyepowder.purple=Used as a dye to create purple wool. +desc.dyepowder.magenta=Used as a dye to create magenta wool. +desc.dyepowder.blue=Used as dye to create Blue Wool. +desc.jukebox=Plays Music Discs. +desc.diamonds=Use these to create very strong tools, weapons or armor +desc.emerald=Use these to create very strong tools, weapons or armor +desc.jackolantern=Used to create brighter light than torches. Melts snow/ice and can be used underwater. +desc.paper=Used to create books and maps. +desc.book=Used to create a bookshelf. +desc.bookshelf=Used as decoration. +desc.picture=Used as decoration. +desc.ore_gold=Can be mined with an iron pickaxe or better, then smelted in a furnace to produce gold ingots. +desc.ore_iron=Can be mined with a stone pickaxe or better, then smelted in a furnace to produce iron ingots. +desc.ore_coal=Can be mined with a pickaxe to collect coal. +desc.ore_lapis=Can be mined with a stone pickaxe or better to collect lapis lazuli. +desc.ore_diamond=Can be mined with an iron pickaxe or better to collect diamonds. +desc.ore_redstone=Can be mined with an iron pickaxe or better to collect redstone dust. +desc.stone=Can be mined with a pickaxe to collect cobblestone. +desc.dirt=Collected using a shovel. Can be used for construction. +desc.sapling=Can be planted and it will eventually grow into a tree. +desc.bedrock=This cannot be broken. +desc.lava=Sets fire to anything that touches it. Can be collected in a bucket. +desc.sand=Collected using a shovel. Can be smelted into glass using the furnace. Is affected by gravity if there is no other tile underneath it. +desc.gravel=Collected using a shovel. Sometimes produces flint when dug up. Is affected by gravity if there is no other tile underneath it. +desc.log=Chopped using an axe, and can be crafted into planks or used as a fuel. +desc.glass=Created in a furnace by smelting sand. Will break if you try to mine it. +desc.thinglass=Will break if you try to mine it. +desc.stone_brick=Mined from stone using a pickaxe. Can be used to construct a furnace or stone tools. +desc.brick=Baked from clay in a furnace. +desc.clay=Can be baked into bricks in a furnace. +desc.snow=A compact way to store snowballs. +desc.top_snow=Can be dug with a shovel to create snowballs. +desc.tall_grass=Sometimes produces seeds when broken. +desc.flower=Can be crafted into a dye. +desc.mushroom=Can be crafted with a bowl to make stew. +desc.obsidian=Can only be mined with a diamond pickaxe. Is produced by the meeting of water and still lava, and is used to build a portal. +desc.mob_spawner=Spawns monsters into the world. +desc.redstone_dust=Is placed on the ground to carry an electrical charge. +desc.crops=When fully grown, crops can be harvested to collect wheat. +desc.farmland=Ground that has been prepared ready to plant seeds. +desc.cactus=Can be crafted to create a dye. +desc.reeds=Can be crafted to create sugar. +desc.pumpkin=Can be worn as a helmet or crafted with a torch to create a Jack-O-Lantern. +desc.hell_rock=Burns forever if set alight. +desc.hell_sand=Slows the movement of anything walking over it. +desc.portal=Standing in the portal allows you to pass between the overworld and the nether. +desc.apple=Restores health, and can be crafted into a golden apple. +desc.coal=Used as a fuel in a furnace, or crafted to make a torch. +desc.string=Collected by killing a spider, and can be crafted into a bow. +desc.feather=Collected by killing a chicken, and can be crafted into an arrow. +desc.sulphur=Collected by killing a creeper, and can be crafted into TNT. +desc.shears=Used to obtain wool from sheep and to harvest placeable Leaf blocks. +desc.seeds=Can be planted in farmland to grow crops. +desc.wheat=Harvested from crops, and can be used to craft food items. +desc.flint=Collected by digging gravel, and can be used to craft a flint and steel. +desc.porkchopraw=Collected by killing a pig, and can be cooked in a furnace. Restores health. +desc.porkchopcooked=Created by cooking a porkchop in a furnace. Restores health. +desc.beefraw=Collected by killing a cow, and can be cooked in a furnace. Restores health. +desc.beefcooked=Created by cooking a beef in a furnace. Restores health. +desc.chickenraw=Collected by killing a chicken, and can be cooked in a furnace. Restores health. +desc.chickencooked=Created by cooking a chicken in a furnace. Restores health. +desc.saddle=When used on a pig it allows you to ride the pig. +desc.snowball=Collected by digging snow, and can be thrown. +desc.leather=Collected by killing a cow, and can be crafted into armor. +desc.slimeball=Collected by killing a slime. +desc.egg=Dropped randomly by chickens, and can be crafted into food items. +desc.yellow_dust=Collected by mining Glowstone, and can be crafted to make Glowstone blocks again. +desc.fish_raw=Can be eaten to restore health, or cooked in a furnace. +desc.fish_cooked=Created by cooking a raw fish in a furnace. Can be eaten to restore health. +desc.bone=Collected by killing a skeleton. Can be crafted into bone meal. +desc.record=Collected by getting a skeleton to kill a creeper. Can be played in a jukebox. +desc.water=Extinguishes fire and helps crops grow. Can be collected in a bucket. +desc.leaves=When broken sometimes drops a sapling which can then be replanted to grow into a tree. +desc.moss_stone=Can be used for construction and decoration. +desc.stonebricksmooth=Used as building material. +desc.netherreactor=Core of the Nether Reactor +desc.glowingobsidian=Obsidion activated by external source. \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/android_java/assets/mob/char.png b/minecraftcpp-master/handheld/project/android_java/assets/mob/char.png new file mode 100644 index 0000000..7cfa08a Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/mob/char.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/mob/chicken.png b/minecraftcpp-master/handheld/project/android_java/assets/mob/chicken.png new file mode 100644 index 0000000..d481293 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/mob/chicken.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/mob/cow.png b/minecraftcpp-master/handheld/project/android_java/assets/mob/cow.png new file mode 100644 index 0000000..77bd267 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/mob/cow.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/mob/creeper.png b/minecraftcpp-master/handheld/project/android_java/assets/mob/creeper.png new file mode 100644 index 0000000..e0a5e0a Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/mob/creeper.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/mob/pig.png b/minecraftcpp-master/handheld/project/android_java/assets/mob/pig.png new file mode 100644 index 0000000..1ed505b Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/mob/pig.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/mob/pigzombie.png b/minecraftcpp-master/handheld/project/android_java/assets/mob/pigzombie.png new file mode 100644 index 0000000..3521845 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/mob/pigzombie.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/mob/sheep.png b/minecraftcpp-master/handheld/project/android_java/assets/mob/sheep.png new file mode 100644 index 0000000..98cfa9a Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/mob/sheep.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/mob/sheep_fur.png b/minecraftcpp-master/handheld/project/android_java/assets/mob/sheep_fur.png new file mode 100644 index 0000000..c365286 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/mob/sheep_fur.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/mob/skeleton.png b/minecraftcpp-master/handheld/project/android_java/assets/mob/skeleton.png new file mode 100644 index 0000000..9d22339 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/mob/skeleton.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/mob/spider.png b/minecraftcpp-master/handheld/project/android_java/assets/mob/spider.png new file mode 100644 index 0000000..08344a8 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/mob/spider.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/mob/zombie.png b/minecraftcpp-master/handheld/project/android_java/assets/mob/zombie.png new file mode 100644 index 0000000..4d47ccf Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/mob/zombie.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/particles.png b/minecraftcpp-master/handheld/project/android_java/assets/particles.png new file mode 100644 index 0000000..de34f1b Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/particles.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/assets/terrain.png b/minecraftcpp-master/handheld/project/android_java/assets/terrain.png new file mode 100644 index 0000000..dd76030 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/assets/terrain.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/default.properties b/minecraftcpp-master/handheld/project/android_java/default.properties new file mode 100644 index 0000000..795e608 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android_java/default.properties @@ -0,0 +1,14 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "build.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-7 +android.library=false +proguard.config=proguard.cfg +android.library.reference.1=../lib_projects/market_licensing/library diff --git a/minecraftcpp-master/handheld/project/android_java/jni/Android.mk b/minecraftcpp-master/handheld/project/android_java/jni/Android.mk new file mode 100644 index 0000000..17b587f --- /dev/null +++ b/minecraftcpp-master/handheld/project/android_java/jni/Android.mk @@ -0,0 +1,250 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_MODULE := minecraftpe +LOCAL_SRC_FILES := ../../../src/main.cpp \ + ../../../src/main_android_java.cpp \ + ../../../src/platform/input/Controller.cpp \ + ../../../src/platform/input/Keyboard.cpp \ + ../../../src/platform/input/Mouse.cpp \ + ../../../src/platform/input/Multitouch.cpp \ + ../../../src/platform/time.cpp \ + ../../../src/platform/CThread.cpp \ +../../../src/NinecraftApp.cpp \ +../../../src/Performance.cpp \ +../../../src/SharedConstants.cpp \ +../../../src/client/IConfigListener.cpp \ +../../../src/client/Minecraft.cpp \ +../../../src/client/MouseHandler.cpp \ +../../../src/client/Options.cpp \ +../../../src/client/OptionStrings.cpp \ +../../../src/client/gamemode/GameMode.cpp \ +../../../src/client/gamemode/CreativeMode.cpp \ +../../../src/client/gamemode/SurvivalMode.cpp \ +../../../src/client/gui/components/Button.cpp \ +../../../src/client/gui/components/ImageButton.cpp \ +../../../src/client/gui/components/ItemPane.cpp \ +../../../src/client/gui/components/InventoryPane.cpp \ +../../../src/client/gui/components/LargeImageButton.cpp \ +../../../src/client/gui/components/RolledSelectionListH.cpp \ +../../../src/client/gui/components/RolledSelectionListV.cpp \ +../../../src/client/gui/components/ScrolledSelectionList.cpp \ +../../../src/client/gui/components/ScrollingPane.cpp \ +../../../src/client/gui/components/SmallButton.cpp \ +../../../src/client/gui/Font.cpp \ +../../../src/client/gui/Gui.cpp \ +../../../src/client/gui/GuiComponent.cpp \ +../../../src/client/gui/Screen.cpp \ +../../../src/client/gui/screens/ScreenChooser.cpp \ +../../../src/client/gui/screens/ChatScreen.cpp \ +../../../src/client/gui/screens/ChestScreen.cpp \ +../../../src/client/gui/screens/ConfirmScreen.cpp \ +../../../src/client/gui/screens/DeathScreen.cpp \ +../../../src/client/gui/screens/FurnaceScreen.cpp \ +../../../src/client/gui/screens/InBedScreen.cpp \ +../../../src/client/gui/screens/IngameBlockSelectionScreen.cpp \ +../../../src/client/gui/screens/JoinGameScreen.cpp \ +../../../src/client/gui/screens/OptionsScreen.cpp \ +../../../src/client/gui/screens/PauseScreen.cpp \ +../../../src/client/gui/screens/ProgressScreen.cpp \ +../../../src/client/gui/screens/RenameMPLevelScreen.cpp \ +../../../src/client/gui/screens/SelectWorldScreen.cpp \ +../../../src/client/gui/screens/StartMenuScreen.cpp \ +../../../src/client/gui/screens/TextEditScreen.cpp \ +../../../src/client/gui/screens/touch/TouchIngameBlockSelectionScreen.cpp \ +../../../src/client/gui/screens/touch/TouchJoinGameScreen.cpp \ +../../../src/client/gui/screens/touch/TouchSelectWorldScreen.cpp \ +../../../src/client/gui/screens/touch/TouchStartMenuScreen.cpp \ +../../../src/client/gui/screens/UploadPhotoScreen.cpp \ +../../../src/client/gui/screens/crafting/PaneCraftingScreen.cpp \ +../../../src/client/gui/screens/crafting/WorkbenchScreen.cpp \ +../../../src/client/model/ChickenModel.cpp \ +../../../src/client/model/CowModel.cpp \ +../../../src/client/model/HumanoidModel.cpp \ +../../../src/client/model/PigModel.cpp \ +../../../src/client/model/SheepFurModel.cpp \ +../../../src/client/model/SheepModel.cpp \ +../../../src/client/model/QuadrupedModel.cpp \ +../../../src/client/model/geom/Cube.cpp \ +../../../src/client/model/geom/ModelPart.cpp \ +../../../src/client/model/geom/Polygon.cpp \ +../../../src/client/particle/Particle.cpp \ +../../../src/client/particle/ParticleEngine.cpp \ +../../../src/client/player/LocalPlayer.cpp \ +../../../src/client/player/RemotePlayer.cpp \ +../../../src/client/player/input/KeyboardInput.cpp \ +../../../src/client/player/input/touchscreen/TouchscreenInput.cpp \ +../../../src/client/renderer/Chunk.cpp \ +../../../src/client/renderer/EntityTileRenderer.cpp \ +../../../src/client/renderer/GameRenderer.cpp \ +../../../src/client/renderer/ItemInHandRenderer.cpp \ +../../../src/client/renderer/LevelRenderer.cpp \ +../../../src/client/renderer/RenderChunk.cpp \ +../../../src/client/renderer/RenderList.cpp \ +../../../src/client/renderer/Tesselator.cpp \ +../../../src/client/renderer/Textures.cpp \ +../../../src/client/renderer/TileRenderer.cpp \ +../../../src/client/renderer/gles.cpp \ +../../../src/client/renderer/culling/Frustum.cpp \ +../../../src/client/renderer/entity/ArrowRenderer.cpp \ +../../../src/client/renderer/entity/ChickenRenderer.cpp \ +../../../src/client/renderer/entity/EntityRenderDispatcher.cpp \ +../../../src/client/renderer/entity/EntityRenderer.cpp \ +../../../src/client/renderer/entity/HumanoidMobRenderer.cpp \ +../../../src/client/renderer/entity/ItemRenderer.cpp \ +../../../src/client/renderer/entity/ItemSpriteRenderer.cpp \ +../../../src/client/renderer/entity/MobRenderer.cpp \ +../../../src/client/renderer/entity/PaintingRenderer.cpp \ +../../../src/client/renderer/entity/PlayerRenderer.cpp \ +../../../src/client/renderer/entity/SheepRenderer.cpp \ +../../../src/client/renderer/entity/TntRenderer.cpp \ +../../../src/client/renderer/entity/TripodCameraRenderer.cpp \ +../../../src/client/renderer/ptexture/DynamicTexture.cpp \ +../../../src/client/renderer/tileentity/ChestRenderer.cpp \ +../../../src/client/renderer/tileentity/SignRenderer.cpp \ +../../../src/client/renderer/tileentity/TileEntityRenderDispatcher.cpp \ +../../../src/client/renderer/tileentity/TileEntityRenderer.cpp \ +../../../src/client/sound/Sound.cpp \ +../../../src/client/sound/SoundEngine.cpp \ +../../../src/locale/I18n.cpp \ +../../../src/nbt/Tag.cpp \ +../../../src/network/command/CommandServer.cpp \ +../../../src/network/ClientSideNetworkHandler.cpp \ +../../../src/network/NetEventCallback.cpp \ +../../../src/network/Packet.cpp \ +../../../src/network/RakNetInstance.cpp \ +../../../src/network/ServerSideNetworkHandler.cpp \ +../../../src/server/ServerLevel.cpp \ +../../../src/server/ServerPlayer.cpp \ +../../../src/util/DataIO.cpp \ +../../../src/util/Mth.cpp \ +../../../src/util/StringUtils.cpp \ +../../../src/util/PerfTimer.cpp \ +../../../src/util/PerfRenderer.cpp \ +../../../src/world/Direction.cpp \ +../../../src/world/entity/AgableMob.cpp \ +../../../src/world/entity/Entity.cpp \ +../../../src/world/entity/EntityFactory.cpp \ +../../../src/world/entity/FlyingMob.cpp \ +../../../src/world/entity/HangingEntity.cpp \ +../../../src/world/entity/Mob.cpp \ +../../../src/world/entity/MobCategory.cpp \ +../../../src/world/entity/Motive.cpp \ +../../../src/world/entity/Painting.cpp \ +../../../src/world/entity/PathfinderMob.cpp \ +../../../src/world/entity/SynchedEntityData.cpp \ +../../../src/world/entity/ai/control/MoveControl.cpp \ +../../../src/world/entity/animal/Animal.cpp \ +../../../src/world/entity/animal/Chicken.cpp \ +../../../src/world/entity/animal/Cow.cpp \ +../../../src/world/entity/animal/Pig.cpp \ +../../../src/world/entity/animal/Sheep.cpp \ +../../../src/world/entity/animal/WaterAnimal.cpp \ +../../../src/world/entity/item/FallingTile.cpp \ +../../../src/world/entity/item/ItemEntity.cpp \ +../../../src/world/entity/item/PrimedTnt.cpp \ +../../../src/world/entity/item/TripodCamera.cpp \ +../../../src/world/entity/monster/Creeper.cpp \ +../../../src/world/entity/monster/Monster.cpp \ +../../../src/world/entity/monster/PigZombie.cpp \ +../../../src/world/entity/monster/Skeleton.cpp \ +../../../src/world/entity/monster/Spider.cpp \ +../../../src/world/entity/monster/Zombie.cpp \ +../../../src/world/entity/projectile/Arrow.cpp \ +../../../src/world/entity/projectile/Throwable.cpp \ +../../../src/world/entity/player/Inventory.cpp \ +../../../src/world/entity/player/Player.cpp \ +../../../src/world/food/SimpleFoodData.cpp \ +../../../src/world/inventory/BaseContainerMenu.cpp \ +../../../src/world/inventory/ContainerMenu.cpp \ +../../../src/world/inventory/FillingContainer.cpp \ +../../../src/world/inventory/FurnaceMenu.cpp \ +../../../src/world/item/BedItem.cpp \ +../../../src/world/item/DyePowderItem.cpp \ +../../../src/world/item/Item.cpp \ +../../../src/world/item/ItemInstance.cpp \ +../../../src/world/item/HangingEntityItem.cpp \ +../../../src/world/item/HatchetItem.cpp \ +../../../src/world/item/HoeItem.cpp \ +../../../src/world/item/PickaxeItem.cpp \ +../../../src/world/item/ShovelItem.cpp \ +../../../src/world/item/crafting/Recipe.cpp \ +../../../src/world/item/crafting/Recipes.cpp \ +../../../src/world/item/crafting/FurnaceRecipes.cpp \ +../../../src/world/item/crafting/OreRecipes.cpp \ +../../../src/world/item/crafting/StructureRecipes.cpp \ +../../../src/world/item/crafting/ToolRecipes.cpp \ +../../../src/world/item/crafting/WeaponRecipes.cpp \ +../../../src/world/level/Explosion.cpp \ +../../../src/world/level/Level.cpp \ +../../../src/world/level/LightLayer.cpp \ +../../../src/world/level/LightUpdate.cpp \ +../../../src/world/level/MobSpawner.cpp \ +../../../src/world/level/Region.cpp \ +../../../src/world/level/TickNextTickData.cpp \ +../../../src/world/level/biome/Biome.cpp \ +../../../src/world/level/biome/BiomeSource.cpp \ +../../../src/world/level/chunk/LevelChunk.cpp \ +../../../src/world/level/dimension/Dimension.cpp \ +../../../src/world/level/levelgen/CanyonFeature.cpp \ +../../../src/world/level/levelgen/DungeonFeature.cpp \ +../../../src/world/level/levelgen/LargeCaveFeature.cpp \ +../../../src/world/level/levelgen/LargeFeature.cpp \ +../../../src/world/level/levelgen/RandomLevelSource.cpp \ +../../../src/world/level/levelgen/feature/Feature.cpp \ +../../../src/world/level/levelgen/synth/ImprovedNoise.cpp \ +../../../src/world/level/levelgen/synth/PerlinNoise.cpp \ +../../../src/world/level/levelgen/synth/Synth.cpp \ +../../../src/world/level/material/Material.cpp \ +../../../src/world/level/pathfinder/Path.cpp \ +../../../src/world/level/storage/ExternalFileLevelStorage.cpp \ +../../../src/world/level/storage/ExternalFileLevelStorageSource.cpp \ +../../../src/world/level/storage/FolderMethods.cpp \ +../../../src/world/level/storage/LevelData.cpp \ +../../../src/world/level/storage/LevelStorageSource.cpp \ +../../../src/world/level/storage/RegionFile.cpp \ +../../../src/world/level/tile/BedTile.cpp \ +../../../src/world/level/tile/ChestTile.cpp \ +../../../src/world/level/tile/CropTile.cpp \ +../../../src/world/level/tile/DoorTile.cpp \ +../../../src/world/level/tile/EntityTile.cpp \ +../../../src/world/level/tile/FurnaceTile.cpp \ +../../../src/world/level/tile/GrassTile.cpp \ +../../../src/world/level/tile/LightGemTile.cpp \ +../../../src/world/level/tile/MelonTile.cpp \ +../../../src/world/level/tile/Mushroom.cpp \ +../../../src/world/level/tile/NetherReactor.cpp \ +../../../src/world/level/tile/NetherReactorPattern.cpp \ +../../../src/world/level/tile/SandTile.cpp \ +../../../src/world/level/tile/StemTile.cpp \ +../../../src/world/level/tile/StoneSlabTile.cpp \ +../../../src/world/level/tile/TallGrass.cpp \ +../../../src/world/level/tile/Tile.cpp \ +../../../src/world/level/tile/TrapDoorTile.cpp \ +../../../src/world/level/tile/entity/ChestTileEntity.cpp \ +../../../src/world/level/tile/entity/NetherReactorTileEntity.cpp \ +../../../src/world/level/tile/entity/SignTileEntity.cpp \ +../../../src/world/level/tile/entity/TileEntity.cpp \ +../../../src/world/level/tile/entity/FurnaceTileEntity.cpp \ +../../../src/world/phys/HitResult.cpp + +LOCAL_CFLAGS := -Wno-psabi $(LOCAL_CFLAGS) + +LOCAL_CFLAGS := -DPRE_ANDROID23 -DANDROID_PUBLISH $(LOCAL_CFLAGS) +#LOCAL_CFLAGS := -DPRE_ANDROID23 -DANDROID_PUBLISH -DDEMO_MODE $(LOCAL_CFLAGS) + +#LOCAL_CFLAGS := -DPRE_ANDROID23 -DDEMO_MODE $(LOCAL_CFLAGS) +#LOCAL_CFLAGS := -DPRE_ANDROID23 $(LOCAL_CFLAGS) + +LOCAL_LDLIBS := -llog -lEGL -lGLESv1_CM + +LOCAL_STATIC_LIBRARIES := RakNet + +TARGET_ARCH_ABI := armeabi-v7a + +include $(BUILD_SHARED_LIBRARY) + +# NOTE: environment var NDK_MODULE_PATH needs to point to lib_projects folder +$(call import-module, raknet/jni) + diff --git a/minecraftcpp-master/handheld/project/android_java/jni/Application.mk b/minecraftcpp-master/handheld/project/android_java/jni/Application.mk new file mode 100644 index 0000000..6c92946 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android_java/jni/Application.mk @@ -0,0 +1,4 @@ +APP_PLATFORM := android-9 +APP_STL := gnustl_static +APP_OPTIM := release +APP_ABI := armeabi-v7a \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/android_java/proguard.cfg b/minecraftcpp-master/handheld/project/android_java/proguard.cfg new file mode 100644 index 0000000..f960f08 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android_java/proguard.cfg @@ -0,0 +1,66 @@ +-optimizationpasses 5 +-dontusemixedcaseclassnames +-dontskipnonpubliclibraryclasses +-dontpreverify +-verbose +-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* + +-keep public class com.mojang.minecraftpe.GameModeButton +-keep public class com.mojang.android.StringValue +-keep public class * extends android.app.Activity +-keep public class * extends com.mojang.minecraftpe.MainActivity +-keep public class * extends MainActivity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class com.android.vending.licensing.ILicensingService +-keep,allowobfuscation class com.mojang.** { *** *(...); } + +-keepclasseswithmembernames class * { + native ; +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet); +} + +-keepclasseswithmembernames class * { + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keepclassmembers class * extends android.app.Activity { + static public void saveScreenshot(java.lang.String, int, int, int[]); + public int[] getImageData(java.lang.String); + public byte[] getFileDataBytes(java.lang.String); + public java.lang.String getPlatformStringVar(int); + public int getScreenWidth(); + public int getScreenHeight(); + public float getPixelsPerMillimeter(); + public int checkLicense(); + public boolean isNetworkEnabled(boolean); + public java.lang.String getDateString(int); + public boolean hasBuyButtonWhenInvalidLicense(); + public void postScreenshotToFacebook(java.lang.String, int, int, int[]); + public void quit(); + public void displayDialog(int); + public void tick(); + public java.lang.String[] getOptionStrings(); + public void buyGame(); + public void playSound(java.lang.String, float, float); + public boolean isTouchscreen(); + public void setIsPowerVR(boolean); + public void initiateUserInput(int); + public int getUserInputStatus(); + public java.lang.String[] getUserInputString(); + public void vibrate(int); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} diff --git a/minecraftcpp-master/handheld/project/android_java/res/drawable-hdpi/icon.png b/minecraftcpp-master/handheld/project/android_java/res/drawable-hdpi/icon.png new file mode 100644 index 0000000..d738bc6 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/drawable-hdpi/icon.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/drawable-hdpi/icon_demo.png b/minecraftcpp-master/handheld/project/android_java/res/drawable-hdpi/icon_demo.png new file mode 100644 index 0000000..283aada Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/drawable-hdpi/icon_demo.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/drawable-ldpi/icon.png b/minecraftcpp-master/handheld/project/android_java/res/drawable-ldpi/icon.png new file mode 100644 index 0000000..4dc54a0 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/drawable-ldpi/icon.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/drawable-ldpi/icon_demo.png b/minecraftcpp-master/handheld/project/android_java/res/drawable-ldpi/icon_demo.png new file mode 100644 index 0000000..5c0c553 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/drawable-ldpi/icon_demo.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/drawable-mdpi/icon.png b/minecraftcpp-master/handheld/project/android_java/res/drawable-mdpi/icon.png new file mode 100644 index 0000000..01fb460 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/drawable-mdpi/icon.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/drawable-mdpi/icon_demo.png b/minecraftcpp-master/handheld/project/android_java/res/drawable-mdpi/icon_demo.png new file mode 100644 index 0000000..edfde23 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/drawable-mdpi/icon_demo.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/drawable/bg32.png b/minecraftcpp-master/handheld/project/android_java/res/drawable/bg32.png new file mode 100644 index 0000000..d9796c4 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/drawable/bg32.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/drawable/bgtiled.xml b/minecraftcpp-master/handheld/project/android_java/res/drawable/bgtiled.xml new file mode 100644 index 0000000..4935bb1 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android_java/res/drawable/bgtiled.xml @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/android_java/res/drawable/btn_nw_cancel.xml b/minecraftcpp-master/handheld/project/android_java/res/drawable/btn_nw_cancel.xml new file mode 100644 index 0000000..5b43e9e --- /dev/null +++ b/minecraftcpp-master/handheld/project/android_java/res/drawable/btn_nw_cancel.xml @@ -0,0 +1,5 @@ + + + + diff --git a/minecraftcpp-master/handheld/project/android_java/res/drawable/btn_nw_create.xml b/minecraftcpp-master/handheld/project/android_java/res/drawable/btn_nw_create.xml new file mode 100644 index 0000000..8790435 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android_java/res/drawable/btn_nw_create.xml @@ -0,0 +1,5 @@ + + + + diff --git a/minecraftcpp-master/handheld/project/android_java/res/drawable/btngamemode.xml b/minecraftcpp-master/handheld/project/android_java/res/drawable/btngamemode.xml new file mode 100644 index 0000000..b8b7f4f --- /dev/null +++ b/minecraftcpp-master/handheld/project/android_java/res/drawable/btngamemode.xml @@ -0,0 +1,5 @@ + + + + diff --git a/minecraftcpp-master/handheld/project/android_java/res/drawable/cancel_0_1.png b/minecraftcpp-master/handheld/project/android_java/res/drawable/cancel_0_1.png new file mode 100644 index 0000000..c43434a Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/drawable/cancel_0_1.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/drawable/cancel_0_3.png b/minecraftcpp-master/handheld/project/android_java/res/drawable/cancel_0_3.png new file mode 100644 index 0000000..887322d Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/drawable/cancel_0_3.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/drawable/cancel_1_1.png b/minecraftcpp-master/handheld/project/android_java/res/drawable/cancel_1_1.png new file mode 100644 index 0000000..abaa241 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/drawable/cancel_1_1.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/drawable/cancel_1_3.png b/minecraftcpp-master/handheld/project/android_java/res/drawable/cancel_1_3.png new file mode 100644 index 0000000..8519c68 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/drawable/cancel_1_3.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/drawable/create_0_1.png b/minecraftcpp-master/handheld/project/android_java/res/drawable/create_0_1.png new file mode 100644 index 0000000..4ebc3b2 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/drawable/create_0_1.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/drawable/create_0_3.png b/minecraftcpp-master/handheld/project/android_java/res/drawable/create_0_3.png new file mode 100644 index 0000000..a771a56 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/drawable/create_0_3.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/drawable/create_1_1.png b/minecraftcpp-master/handheld/project/android_java/res/drawable/create_1_1.png new file mode 100644 index 0000000..5db6202 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/drawable/create_1_1.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/drawable/create_1_3.png b/minecraftcpp-master/handheld/project/android_java/res/drawable/create_1_3.png new file mode 100644 index 0000000..e1ea00e Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/drawable/create_1_3.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/drawable/creative_3.png b/minecraftcpp-master/handheld/project/android_java/res/drawable/creative_3.png new file mode 100644 index 0000000..80940ba Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/drawable/creative_3.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/drawable/iconx.png b/minecraftcpp-master/handheld/project/android_java/res/drawable/iconx.png new file mode 100644 index 0000000..38dcfcb Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/drawable/iconx.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/drawable/survival_3.png b/minecraftcpp-master/handheld/project/android_java/res/drawable/survival_3.png new file mode 100644 index 0000000..cc8d738 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/drawable/survival_3.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/drawable/worldname.png b/minecraftcpp-master/handheld/project/android_java/res/drawable/worldname.png new file mode 100644 index 0000000..b8f42a2 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/drawable/worldname.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/drawable/worldname_3.png b/minecraftcpp-master/handheld/project/android_java/res/drawable/worldname_3.png new file mode 100644 index 0000000..adccd67 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/drawable/worldname_3.png differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/layout/create_new_world.xml b/minecraftcpp-master/handheld/project/android_java/res/layout/create_new_world.xml new file mode 100644 index 0000000..795adf8 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android_java/res/layout/create_new_world.xml @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/android_java/res/layout/main.xml b/minecraftcpp-master/handheld/project/android_java/res/layout/main.xml new file mode 100644 index 0000000..94203a9 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android_java/res/layout/main.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + diff --git a/minecraftcpp-master/handheld/project/android_java/res/layout/mainmenu_options.xml b/minecraftcpp-master/handheld/project/android_java/res/layout/mainmenu_options.xml new file mode 100644 index 0000000..3ae67c6 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android_java/res/layout/mainmenu_options.xml @@ -0,0 +1,17 @@ + + + + + + diff --git a/minecraftcpp-master/handheld/project/android_java/res/layout/rename_mp_world.xml b/minecraftcpp-master/handheld/project/android_java/res/layout/rename_mp_world.xml new file mode 100644 index 0000000..375d529 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android_java/res/layout/rename_mp_world.xml @@ -0,0 +1,28 @@ + + + + + + diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/bow.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/bow.ogg new file mode 100644 index 0000000..fe684cf Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/bow.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/bowhit1.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/bowhit1.ogg new file mode 100644 index 0000000..77be5c5 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/bowhit1.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/bowhit2.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/bowhit2.ogg new file mode 100644 index 0000000..d3d4a5a Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/bowhit2.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/bowhit3.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/bowhit3.ogg new file mode 100644 index 0000000..db9d7f7 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/bowhit3.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/bowhit4.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/bowhit4.ogg new file mode 100644 index 0000000..771364c Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/bowhit4.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/chicken2.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/chicken2.ogg new file mode 100644 index 0000000..b181d8f Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/chicken2.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/chicken3.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/chicken3.ogg new file mode 100644 index 0000000..e217510 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/chicken3.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/chickenhurt1.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/chickenhurt1.ogg new file mode 100644 index 0000000..a56a08d Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/chickenhurt1.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/chickenhurt2.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/chickenhurt2.ogg new file mode 100644 index 0000000..06e65d2 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/chickenhurt2.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/click.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/click.ogg new file mode 100644 index 0000000..b4889da Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/click.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/cloth1.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/cloth1.ogg new file mode 100644 index 0000000..804aa88 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/cloth1.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/cloth2.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/cloth2.ogg new file mode 100644 index 0000000..81d8a18 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/cloth2.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/cloth3.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/cloth3.ogg new file mode 100644 index 0000000..c18cef0 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/cloth3.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/cloth4.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/cloth4.ogg new file mode 100644 index 0000000..57e51b6 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/cloth4.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/cow1.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/cow1.ogg new file mode 100644 index 0000000..5208de7 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/cow1.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/cow2.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/cow2.ogg new file mode 100644 index 0000000..a252e75 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/cow2.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/cow3.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/cow3.ogg new file mode 100644 index 0000000..7345ab2 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/cow3.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/cow4.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/cow4.ogg new file mode 100644 index 0000000..80d5063 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/cow4.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/cowhurt1.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/cowhurt1.ogg new file mode 100644 index 0000000..c579de2 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/cowhurt1.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/cowhurt2.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/cowhurt2.ogg new file mode 100644 index 0000000..5e487a8 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/cowhurt2.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/cowhurt3.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/cowhurt3.ogg new file mode 100644 index 0000000..8341bfa Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/cowhurt3.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/creeper1.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/creeper1.ogg new file mode 100644 index 0000000..d7c56ec Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/creeper1.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/creeper2.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/creeper2.ogg new file mode 100644 index 0000000..dd36749 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/creeper2.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/creeper3.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/creeper3.ogg new file mode 100644 index 0000000..55d60cf Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/creeper3.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/creeper4.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/creeper4.ogg new file mode 100644 index 0000000..479aee9 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/creeper4.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/creeperdeath.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/creeperdeath.ogg new file mode 100644 index 0000000..93efa45 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/creeperdeath.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/door_close.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/door_close.ogg new file mode 100644 index 0000000..793a5e2 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/door_close.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/door_open.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/door_open.ogg new file mode 100644 index 0000000..fb27d72 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/door_open.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/eat1.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/eat1.ogg new file mode 100644 index 0000000..83e70cb Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/eat1.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/eat2.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/eat2.ogg new file mode 100644 index 0000000..e76b0fb Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/eat2.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/eat3.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/eat3.ogg new file mode 100644 index 0000000..f89be37 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/eat3.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/explode.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/explode.ogg new file mode 100644 index 0000000..a414ea0 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/explode.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/fallbig1.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/fallbig1.ogg new file mode 100644 index 0000000..018c521 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/fallbig1.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/fallbig2.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/fallbig2.ogg new file mode 100644 index 0000000..51860ca Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/fallbig2.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/fallsmall.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/fallsmall.ogg new file mode 100644 index 0000000..363e6f3 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/fallsmall.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/fuse.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/fuse.ogg new file mode 100644 index 0000000..734d9df Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/fuse.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/glass1.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/glass1.ogg new file mode 100644 index 0000000..a8dab85 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/glass1.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/glass2.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/glass2.ogg new file mode 100644 index 0000000..3bd462d Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/glass2.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/glass3.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/glass3.ogg new file mode 100644 index 0000000..2577f40 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/glass3.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/grass1.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/grass1.ogg new file mode 100644 index 0000000..12f5751 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/grass1.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/grass2.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/grass2.ogg new file mode 100644 index 0000000..05dff55 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/grass2.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/grass3.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/grass3.ogg new file mode 100644 index 0000000..e792b34 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/grass3.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/grass4.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/grass4.ogg new file mode 100644 index 0000000..8421e6a Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/grass4.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/gravel2.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/gravel2.ogg new file mode 100644 index 0000000..76f6a2d Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/gravel2.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/gravel3.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/gravel3.ogg new file mode 100644 index 0000000..1ba9f3e Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/gravel3.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/gravel4.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/gravel4.ogg new file mode 100644 index 0000000..152c6cb Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/gravel4.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/hurt.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/hurt.ogg new file mode 100644 index 0000000..b4cbc12 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/hurt.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/ladder1.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/ladder1.ogg new file mode 100644 index 0000000..410c0e0 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/ladder1.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/ladder2.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/ladder2.ogg new file mode 100644 index 0000000..4942982 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/ladder2.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/ladder3.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/ladder3.ogg new file mode 100644 index 0000000..311d54a Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/ladder3.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/ladder4.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/ladder4.ogg new file mode 100644 index 0000000..f36ad46 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/ladder4.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/pig1.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/pig1.ogg new file mode 100644 index 0000000..8516b37 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/pig1.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/pig2.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/pig2.ogg new file mode 100644 index 0000000..bf67406 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/pig2.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/pig3.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/pig3.ogg new file mode 100644 index 0000000..3f45533 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/pig3.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/pigdeath.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/pigdeath.ogg new file mode 100644 index 0000000..959e98b Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/pigdeath.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/pop.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/pop.ogg new file mode 100644 index 0000000..2890baf Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/pop.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/pop2.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/pop2.ogg new file mode 100644 index 0000000..7549b42 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/pop2.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/sand1.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/sand1.ogg new file mode 100644 index 0000000..4307487 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/sand1.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/sand2.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/sand2.ogg new file mode 100644 index 0000000..92d7e20 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/sand2.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/sand3.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/sand3.ogg new file mode 100644 index 0000000..f4b0d19 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/sand3.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/sand4.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/sand4.ogg new file mode 100644 index 0000000..512e5a1 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/sand4.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/sheep1.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/sheep1.ogg new file mode 100644 index 0000000..dbc3b4b Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/sheep1.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/sheep2.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/sheep2.ogg new file mode 100644 index 0000000..d592dd2 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/sheep2.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/sheep3.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/sheep3.ogg new file mode 100644 index 0000000..2d333f3 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/sheep3.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/skeleton1.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/skeleton1.ogg new file mode 100644 index 0000000..8226808 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/skeleton1.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/skeleton2.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/skeleton2.ogg new file mode 100644 index 0000000..7ab35d4 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/skeleton2.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/skeleton3.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/skeleton3.ogg new file mode 100644 index 0000000..f0c4ea0 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/skeleton3.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/skeletondeath.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/skeletondeath.ogg new file mode 100644 index 0000000..632b9bc Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/skeletondeath.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/skeletonhurt1.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/skeletonhurt1.ogg new file mode 100644 index 0000000..2065679 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/skeletonhurt1.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/skeletonhurt2.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/skeletonhurt2.ogg new file mode 100644 index 0000000..ff5fde8 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/skeletonhurt2.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/skeletonhurt3.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/skeletonhurt3.ogg new file mode 100644 index 0000000..f882087 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/skeletonhurt3.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/skeletonhurt4.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/skeletonhurt4.ogg new file mode 100644 index 0000000..1ed44db Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/skeletonhurt4.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/snow1.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/snow1.ogg new file mode 100644 index 0000000..916b874 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/snow1.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/snow2.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/snow2.ogg new file mode 100644 index 0000000..3b23e02 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/snow2.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/snow3.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/snow3.ogg new file mode 100644 index 0000000..11c8ba7 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/snow3.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/snow4.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/snow4.ogg new file mode 100644 index 0000000..00da95b Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/snow4.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/spider1.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/spider1.ogg new file mode 100644 index 0000000..b4b4c5a Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/spider1.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/spider2.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/spider2.ogg new file mode 100644 index 0000000..ef6cd87 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/spider2.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/spider3.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/spider3.ogg new file mode 100644 index 0000000..bfaffb0 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/spider3.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/spider4.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/spider4.ogg new file mode 100644 index 0000000..ce7c315 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/spider4.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/spiderdeath.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/spiderdeath.ogg new file mode 100644 index 0000000..4128a55 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/spiderdeath.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/splash.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/splash.ogg new file mode 100644 index 0000000..8d91a23 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/splash.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/stone1.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/stone1.ogg new file mode 100644 index 0000000..1f652c2 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/stone1.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/stone2.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/stone2.ogg new file mode 100644 index 0000000..1fd1c04 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/stone2.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/stone3.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/stone3.ogg new file mode 100644 index 0000000..bbca544 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/stone3.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/stone4.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/stone4.ogg new file mode 100644 index 0000000..be2fd26 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/stone4.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/wood1.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/wood1.ogg new file mode 100644 index 0000000..072c970 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/wood1.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/wood2.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/wood2.ogg new file mode 100644 index 0000000..ff27e90 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/wood2.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/wood3.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/wood3.ogg new file mode 100644 index 0000000..5d6e7c0 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/wood3.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/wood4.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/wood4.ogg new file mode 100644 index 0000000..6eca813 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/wood4.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/zombie1.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/zombie1.ogg new file mode 100644 index 0000000..6c57de1 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/zombie1.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/zombie2.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/zombie2.ogg new file mode 100644 index 0000000..80e1918 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/zombie2.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/zombie3.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/zombie3.ogg new file mode 100644 index 0000000..c5d2f41 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/zombie3.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/zombiedeath.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/zombiedeath.ogg new file mode 100644 index 0000000..7c010fd Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/zombiedeath.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/zombiehurt1.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/zombiehurt1.ogg new file mode 100644 index 0000000..ce3cbde Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/zombiehurt1.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/zombiehurt2.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/zombiehurt2.ogg new file mode 100644 index 0000000..122ff24 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/zombiehurt2.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/zpig1.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/zpig1.ogg new file mode 100644 index 0000000..49f18ed Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/zpig1.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/zpig2.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/zpig2.ogg new file mode 100644 index 0000000..60a2739 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/zpig2.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/zpig3.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/zpig3.ogg new file mode 100644 index 0000000..6d37984 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/zpig3.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/zpig4.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/zpig4.ogg new file mode 100644 index 0000000..4f11239 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/zpig4.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/zpigangry1.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/zpigangry1.ogg new file mode 100644 index 0000000..a398129 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/zpigangry1.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/zpigangry2.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/zpigangry2.ogg new file mode 100644 index 0000000..79003db Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/zpigangry2.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/zpigangry3.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/zpigangry3.ogg new file mode 100644 index 0000000..23c530f Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/zpigangry3.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/zpigangry4.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/zpigangry4.ogg new file mode 100644 index 0000000..3ea06c5 Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/zpigangry4.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/zpigdeath.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/zpigdeath.ogg new file mode 100644 index 0000000..00d3f8d Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/zpigdeath.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/zpighurt1.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/zpighurt1.ogg new file mode 100644 index 0000000..0fa041d Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/zpighurt1.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/raw/zpighurt2.ogg b/minecraftcpp-master/handheld/project/android_java/res/raw/zpighurt2.ogg new file mode 100644 index 0000000..fb740aa Binary files /dev/null and b/minecraftcpp-master/handheld/project/android_java/res/raw/zpighurt2.ogg differ diff --git a/minecraftcpp-master/handheld/project/android_java/res/values/strings.xml b/minecraftcpp-master/handheld/project/android_java/res/values/strings.xml new file mode 100644 index 0000000..ed64e6b --- /dev/null +++ b/minecraftcpp-master/handheld/project/android_java/res/values/strings.xml @@ -0,0 +1,40 @@ + + + Minecraft - Pocket Edition + Minecraft - Pocket Edition Demo + true + Minecraft PE + Minecraft PE Demo + + + World name + Unnamed world + Seed for the World Generator + Leave blank for random seed + Mobs, health and gather resources + Unlimited resources and flying + + + Save world as + Saved World + + + Username + Enter your username + Server visible by default + Sensitivity + Invert Y-axis + Lefty + Use touch screen + Split touch controls + Vibration + Slight vibration when blocks are destroyed + Fancy graphics + + + Lower graphics quality + Shorter view distance and disables fancy rendering + Peaceful mode + No hostile mobs, heal automatically + + diff --git a/minecraftcpp-master/handheld/project/android_java/res/xml/preferences.xml b/minecraftcpp-master/handheld/project/android_java/res/xml/preferences.xml new file mode 100644 index 0000000..b4dfe42 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android_java/res/xml/preferences.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/android_java/src/com/mojang/minecraftpe/MainActivity.java b/minecraftcpp-master/handheld/project/android_java/src/com/mojang/minecraftpe/MainActivity.java new file mode 100644 index 0000000..200274c --- /dev/null +++ b/minecraftcpp-master/handheld/project/android_java/src/com/mojang/minecraftpe/MainActivity.java @@ -0,0 +1,726 @@ +package com.mojang.minecraftpe; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.Map; +import java.util.Vector; + +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.opengles.GL10; + +import com.mojang.android.StringValue; +import com.mojang.android.licensing.LicenseCodes; + +import android.app.ActivityManager; +import android.app.ActivityManager.MemoryInfo; +import android.app.AlertDialog; +import android.app.Activity; +import android.content.Context; +import android.content.DialogInterface; +import android.content.DialogInterface.OnCancelListener; +import android.content.DialogInterface.OnClickListener; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.res.AssetManager; +import android.graphics.Bitmap; +import android.graphics.Bitmap.CompressFormat; +import android.graphics.BitmapFactory; +import android.media.AudioManager; +import android.opengl.GLSurfaceView; +import android.os.Bundle; +import android.os.Vibrator; +import android.preference.PreferenceManager; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.Display; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.WindowManager; +import android.view.ViewGroup.LayoutParams; +import android.widget.EditText; +import android.widget.TextView; + +import com.mojang.minecraftpe.R; +import com.mojang.minecraftpe.sound.SoundPlayer; + +public class MainActivity extends Activity { + /** Called when the activity is first created. */ + + private GLView _glView; + public float invScale = 1.0f;// / 1.5f; + + Vector _touchEvents = new Vector(); + Vector _keyEvents = new Vector(); + + @Override + public void onCreate(Bundle savedInstanceState) { + setVolumeControlStream(AudioManager.STREAM_MUSIC); + super.onCreate(savedInstanceState); + nativeRegisterThis(); + + nativeOnCreate(); + + _glView = new GLView(getApplication(), this); + //_glView.setEGLConfigChooser(8, 8, 8, 8, 16, 0); + _glView.setEGLConfigChooser(true); + //_glView + +// _glView.setEGLConfigChooser( +// new GLSurfaceView.EGLConfigChooser() { +// +// @Override +// public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) { +// // TODO Auto-generated method stub +// +// // Specify a configuration for our opengl session +// // and grab the first configuration that matches is +// int[] configSpec = { +// EGL10.EGL_DEPTH_SIZE, 24, +// EGL10.EGL_NONE +// }; +// EGLConfig[] configs = new EGLConfig[1]; +// int[] num_config = new int[1]; +// egl.eglChooseConfig(display, configSpec, configs, 1, num_config); +// EGLConfig config = configs[0]; +// return config; +// +// //return null; +// } +// } ); + + _glView.commit(); + setContentView(_glView); + + _soundPlayer = new SoundPlayer(this, AudioManager.STREAM_MUSIC); + } + + public boolean isTouchscreen() { return true; } + static public boolean isXperiaPlay() { return false; } + + static private boolean _isPowerVr = false; + public void setIsPowerVR(boolean status) { MainActivity._isPowerVr = status; } + static public boolean isPowerVR() { return _isPowerVr; } + + public void vibrate(int milliSeconds) { + Vibrator v = (Vibrator)this.getSystemService(VIBRATOR_SERVICE); + v.vibrate(milliSeconds); + } + + private void createAlertDialog(boolean hasOkButton, boolean hasCancelButton, boolean preventBackKey) { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + + builder.setTitle(""); + if (preventBackKey) + builder.setCancelable(false); + + builder.setOnCancelListener(new OnCancelListener() { + //@Override + public void onCancel(DialogInterface dialog) { + onDialogCanceled(); + } + }); + + if (hasOkButton) + builder.setPositiveButton("Ok", new OnClickListener() { + public void onClick(DialogInterface dialog, int which) { onDialogCompleted(); }}); + + if (hasCancelButton) + builder.setNegativeButton("Cancel", new OnClickListener() { + public void onClick(DialogInterface dialog, int which) { onDialogCanceled(); }}); + + mDialog = builder.create(); + mDialog.setOwnerActivity(this); + } + + @Override + public void onWindowFocusChanged(boolean hasFocus) { + // TODO Auto-generated method stub + //System.out.println("Focus has changed. Has Focus? " + hasFocus); + super.onWindowFocusChanged(hasFocus); + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (event.getRepeatCount() <= 0) + _keyEvents.add(new KeyEvent(event)); + + boolean handled = (keyCode != KeyEvent.KEYCODE_VOLUME_DOWN + && keyCode != KeyEvent.KEYCODE_VOLUME_UP); + return handled; + } + + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) { + if (event.getRepeatCount() <= 0) + _keyEvents.add(new KeyEvent(event)); + + boolean handled = (keyCode != KeyEvent.KEYCODE_VOLUME_DOWN + && keyCode != KeyEvent.KEYCODE_VOLUME_UP); + return handled; + } + + public void handleKeyEvent(KeyEvent event) { + //System.out.println("KeyDown: " + keyCode); + + final int keyCode = event.getKeyCode(); + final boolean pressedBack = (keyCode == KeyEvent.KEYCODE_BACK); + + if (pressedBack) { + if (!nativeHandleBack(event.getAction() == KeyEvent.ACTION_DOWN)) { + // End game here + if (event.getAction() == KeyEvent.ACTION_DOWN) + finish(); + } + return; + } + + if (event.getAction() == KeyEvent.ACTION_DOWN) + nativeOnKeyDown(keyCode); + else if (event.getAction() == KeyEvent.ACTION_UP) + nativeOnKeyUp(keyCode); + } + + //private int _primaryPointerIdDown = -1; + @Override + public boolean onTouchEvent(MotionEvent e) { + //System.out.println("Adding touch event " + e.getActionMasked()); + _touchEvents.add(MotionEvent.obtainNoHistory(e)); + return super.onTouchEvent(e); + } + + public void handleTouchEvent(MotionEvent e) { + //printMemUsage(this); + + int fullAction = e.getAction(); + int action = (fullAction & MotionEvent.ACTION_MASK); + //int pointerIndex = (fullAction & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; + int pointerIndex = (fullAction & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT; + int pointerId = e.getPointerId(pointerIndex); + //System.out.println("Pointers: " + pointerId + ", " + pointerId222); + float x = e.getX(pointerIndex) * invScale; + float y = e.getY(pointerIndex) * invScale; + + switch (action) { + case MotionEvent.ACTION_DOWN: { + //System.err.println("D: " + pointerId + ": " + x + ", " + y); + nativeMouseDown(pointerId, 1, x, y); + break; + } + case MotionEvent.ACTION_POINTER_DOWN: { + //System.err.println("d: " + pointerId + ": " + x + ", " + y); + nativeMouseDown(pointerId, 1, x, y); + break; + } + case MotionEvent.ACTION_UP: { + //System.err.println("U: " + pointerId + ": " + x + ", " + y); + nativeMouseUp(pointerId, 1, x, y); + break; + } + case MotionEvent.ACTION_POINTER_UP: { + //System.err.println("u: " + pointerId + ": " + x + ", " + y); + nativeMouseUp(pointerId, 1, x, y); + break; + } + case MotionEvent.ACTION_MOVE: { + int pcount = e.getPointerCount(); + for (int i = 0; i < pcount; ++i) { + int pp = e.getPointerId(i); // @attn wtf? + float xx = e.getX(i) * invScale; + float yy = e.getY(i) * invScale; + // System.err.println(" " + p + " @ " + x + ", " + y); + nativeMouseMove(pp, xx, yy); + } + break; + } + } + + //return super.onTouchEvent(e); + } + + static private void printMemUsage(Context context) + { + final String TAG = "MEMdbg"; + + MemoryInfo mi = new MemoryInfo(); + ActivityManager activityManager = (ActivityManager) context.getSystemService(ACTIVITY_SERVICE); + activityManager.getMemoryInfo(mi); + long availableKbs = mi.availMem / 1024; + Log.i(TAG, "" + availableKbs); + } + + static public void saveScreenshot(String filename, int w, int h, int[] pixels) { + Bitmap bitmap = Bitmap.createBitmap(pixels, w, h, Bitmap.Config.ARGB_8888); + + //System.out.println("Save screenshot: " + filename); + + try { + FileOutputStream fos = new FileOutputStream(filename); + bitmap.compress(CompressFormat.JPEG, 85, fos); + //System.out.println("Compression completed!"); + + try { + fos.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + + try { + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + catch (FileNotFoundException e) { + System.err.println("Couldn't create file: " + filename); + e.printStackTrace(); + } + } + + public int[] getImageData(String filename) { + AssetManager assets = getAssets(); + + try { + /*String[] filenames = */assets.list("images"); + } catch (IOException e) { + System.err.println("getImageData: Could not list directory"); + return null; + } + + InputStream inputStream = null; + try { + inputStream = assets.open(filename); + } catch (IOException e) { + System.err.println("getImageData: Could not open image " + filename); + return null; + } + + Bitmap bm = BitmapFactory.decodeStream(inputStream); + int w = bm.getWidth(); + int h = bm.getHeight(); + + int[] pixels = new int[w * h + 2]; + pixels[0] = w; + pixels[1] = h; + bm.getPixels(pixels, 2, w, 0, 0, w, h); + + return pixels; + } + + public byte[] getFileDataBytes(String filename) { + AssetManager assets = getAssets(); + + BufferedInputStream bis; + try { + InputStream is = assets.open(filename); + bis = new BufferedInputStream(is); + } catch (IOException e) { + e.printStackTrace(); + return null; + } + + ByteArrayOutputStream s = new ByteArrayOutputStream(4096); + byte[] tmp = new byte[1024]; + + try { + while (true) { + int count = bis.read(tmp); + if (count <= 0) break; + s.write(tmp, 0, count); + } + } catch (IOException e) { + } finally { + try { bis.close(); } + catch (IOException e) {} + } + + return s.toByteArray(); + } + + public int getScreenWidth() { + Display display = ((WindowManager)this.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); + int out = Math.max(display.getWidth(), display.getHeight()); + //System.out.println("getwidth: " + out); + return out; + } + + public int getScreenHeight() { + Display display = ((WindowManager)this.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); + int out = Math.min(display.getWidth(), display.getHeight()); + //System.out.println("getheight: " + out); + return out; + } + + public float getPixelsPerMillimeter() { + DisplayMetrics metrics = new DisplayMetrics(); + getWindowManager().getDefaultDisplay().getMetrics(metrics); + return (metrics.xdpi + metrics.ydpi) * 0.5f / 25.4f; + } + + public int checkLicense() { return LicenseCodes.LICENSE_OK; } + + public String getDateString(int s) { + return DateFormat.format(new Date(s * 1000L)); + } + + public boolean hasBuyButtonWhenInvalidLicense() { return true; } + + public void postScreenshotToFacebook(String filename, int w, int h, int[] pixels) { + return; + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, + Intent data) { + + if (requestCode == DialogDefinitions.DIALOG_MAINMENU_OPTIONS) { + _userInputStatus = 1; + } + } + + public void quit() { + runOnUiThread(new Runnable() { + public void run() { finish(); } }); + } + + public void displayDialog(int dialogId) { + + if (dialogId == DialogDefinitions.DIALOG_CREATE_NEW_WORLD) { + chooseDialog(R.layout.create_new_world, + new int[] { R.id.editText_worldName, + R.id.editText_worldSeed, + R.id.button_gameMode}, + false, // Don't prevent back key + R.id.button_createworld_create, + R.id.button_createworld_cancel + ); + } else if (dialogId == DialogDefinitions.DIALOG_MAINMENU_OPTIONS) { + Intent intent = new Intent(this, MainMenuOptionsActivity.class); + intent.putExtra("preferenceId", R.xml.preferences); + startActivityForResult(intent, dialogId); + } else if (dialogId == DialogDefinitions.DIALOG_RENAME_MP_WORLD) { + chooseDialog(R.layout.rename_mp_world, + new int[] { R.id.editText_worldNameRename }, + false + ); + } + } + + void chooseDialog(final int layoutId, final int[] viewIds) { + chooseDialog(layoutId, viewIds, true); + } + void chooseDialog(final int layoutId, final int[] viewIds, final boolean hasCancelButton) { + chooseDialog(layoutId, viewIds, hasCancelButton, true); + } + void chooseDialog(final int layoutId, final int[] viewIds, final boolean hasCancelButton, final boolean preventBackKey) { + chooseDialog(layoutId, viewIds, preventBackKey, 0, hasCancelButton? 0 : -1); + } + void chooseDialog(final int layoutId, final int[] viewIds, final boolean preventBackKey, final int okButtonId, final int cancelButtonId) { + _userInputValues.clear(); + + runOnUiThread(new Runnable() { + public void run() { + createAlertDialog(okButtonId==0, cancelButtonId==0, preventBackKey); + LayoutInflater li = LayoutInflater.from(MainActivity.this); + + try { + View view = li.inflate(layoutId, null); + if (okButtonId != 0 && okButtonId != -1) { + View b = view.findViewById(okButtonId); + if (b != null) + b.setOnClickListener(new View.OnClickListener() + { public void onClick(View v) { if (mDialog != null) mDialog.dismiss(); onDialogCompleted(); }}); + } + if (cancelButtonId != 0 && cancelButtonId != -1) { + View b = view.findViewById(cancelButtonId); + if (b != null) + b.setOnClickListener(new View.OnClickListener() + { public void onClick(View v) { if (mDialog != null) mDialog.cancel(); onDialogCanceled(); }}); + } + + //mDialog.setO + MainActivity.this.mDialog.setView(view); + + if (viewIds != null) + for (int viewId : viewIds) { + View v = view.findViewById(viewId); + if (v instanceof StringValue) + _userInputValues.add( (StringValue) v ); + else if (v instanceof TextView) + _userInputValues.add(new TextViewReader((TextView)v)); + } + + } catch (Error e) { + e.printStackTrace(); + } + + MainActivity.this.mDialog.show(); + MainActivity.this.mDialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); + MainActivity.this.mDialog.getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); + //MainActivity.this.getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); + } + }); + } + + public void tick() {} + + public String[] getOptionStrings() { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); + Map m = prefs.getAll(); + + String[] tmpOut = new String[m.size() * 2]; + + int n = 0; + for (Map.Entry e : m.entrySet()) { + String key = e.getKey(); + String value = e.getValue().toString(); + // + // Feel free to modify key or value! + // + // This can be used to correct differences between the different + // platforms, such as Android not supporting floating point + // ranges for Sliders/SeekBars: {0..100} - TRANSFORM -> {0..1} + // + if (key.equals(MainMenuOptionsActivity.Internal_Game_DifficultyPeaceful)) { + key = MainMenuOptionsActivity.Game_DifficultyLevel; + value = ((Boolean) e.getValue()) ? "0" : "2"; + } + + try { + if (key.equals(MainMenuOptionsActivity.Controls_Sensitivity)) + value = new Double( 0.01 * Integer.parseInt(value) ).toString(); + } catch (Exception exc) {} + + tmpOut[n++] = key; + tmpOut[n++] = value; +// System.out.println("Key: " + e.getKey()); +// System.out.println("Val: " + e.getValue().toString() + "\n"); + } + + // Copy over the enabled preferences + String[] out = new String[n]; + for (int i = 0; i < n; ++i) + out[i] = tmpOut[i]; + + return out; + } + + public void buyGame() {} + + public String getPlatformStringVar(int id) { + if (id == 0) return android.os.Build.MODEL; + return null; + } + + public boolean isNetworkEnabled(boolean onlyWifiAllowed) { + return true; + /* + ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo info = onlyWifiAllowed? cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI) + : cm.getActiveNetworkInfo(); + //(info.getState() == NetworkInfo.State.CONNECTED || info.getState() == NetworkInfo.State.CONNECTING)); + return (info != null && info.isConnectedOrConnecting()); + */ + } + + private Bundle data; + private int _userInputStatus = -1; + private String[] _userInputText = null; + private ArrayList _userInputValues = new ArrayList(); + public void initiateUserInput(int id) { + _userInputText = null; + _userInputStatus = -1; + } + public int getUserInputStatus() { return _userInputStatus; } + public String[] getUserInputString() { return _userInputText; } + + private SoundPlayer _soundPlayer; + public void playSound(String s, float volume, float rate) { + _soundPlayer.play(s, volume, rate); + } + + private AlertDialog mDialog; + private final DateFormat DateFormat = new SimpleDateFormat(); +// public EditText mTextInputWidget; + + private void onDialogCanceled() { + _userInputStatus = 0; + } + + private void onDialogCompleted() { + int size = _userInputValues.size(); + _userInputText = new String[size]; + for (int i = 0; i < size; ++i) { + _userInputText[i] = _userInputValues.get(i).getStringValue(); + } + for (String s : _userInputText) System.out.println("js: " + s); + + _userInputStatus = 1; + } + + + protected void onStart() { + //System.out.println("onStart"); + super.onStart(); + } + + protected void onResume() { + //System.out.println("onResume"); + super.onResume(); + _glView.onResume(); + } + + protected void onPause() { + //System.out.println("onPause"); + super.onPause(); + _glView.onPause(); + } + + protected void onStop() { + //System.out.println("onStop"); + super.onStop(); + } + protected void onDestroy() { + //System.out.println("onDestroy"); + + nativeUnregisterThis(); + super.onDestroy(); + nativeOnDestroy(); + } + + protected boolean isDemo() { return false; } + + // + // Native interface + // + native void nativeRegisterThis(); + native void nativeUnregisterThis(); + native static void nativeOnCreate(); + native static void nativeOnDestroy(); + native static void nativeOnKeyDown(int key); + native static void nativeOnKeyUp(int key); + native static boolean nativeHandleBack(boolean isDown); + native static void nativeMouseDown(int pointerId, int buttonId, float x, float y); + native static void nativeMouseUp(int pointerId, int buttonId, float x, float y); + native static void nativeMouseMove(int pointerId, float x, float y); + + static { + System.loadLibrary("minecraftpe"); + } + + public void clearPendingEvents() { + _touchEvents.clear(); + _keyEvents.clear(); + } + public void processPendingEvents() { + int i = 0; + while (i < _touchEvents.size()) + handleTouchEvent(_touchEvents.get(i++)); + i = 0; + while (i < _keyEvents.size()) + handleKeyEvent(_keyEvents.get(i++)); + + clearPendingEvents(); + } +} + +// see client/gui/screens/DialogDefinitions.h +class DialogDefinitions { + static final int DIALOG_CREATE_NEW_WORLD = 1; + static final int DIALOG_NEW_CHAT_MESSAGE = 2; + static final int DIALOG_MAINMENU_OPTIONS = 3; + static final int DIALOG_RENAME_MP_WORLD = 4; +} + + +class GLView extends GLSurfaceView { + public GLView(Context context, MainActivity activity) { + super(context); + _activity = activity; + _renderer = new GLRenderer(activity); + + } + + @Override + public void onPause() { _renderer.paused = true; } + @Override + public void onResume() { _renderer.paused = false; } + + public void commit() { + setRenderer(_renderer); + } + + @Override + public void surfaceCreated(android.view.SurfaceHolder holder) { +// holder.setFixedSize((int)(_activity.getScreenWidth() * _activity.invScale), +// (int)(_activity.getScreenHeight() * _activity.invScale)); + System.out.println("w,h: " + _activity.getScreenWidth() + "," + _activity.getScreenHeight()); + super.surfaceCreated(holder); + } + +// public boolean onTouchEvent(final MotionEvent event) { +// if (event.getAction() == MotionEvent.ACTION_DOWN) { +// nativePause(); +// } +// return true; +// } + + private GLRenderer _renderer; + private MainActivity _activity; +} + +class GLRenderer implements GLSurfaceView.Renderer { + private MainActivity _activity; + + public GLRenderer(MainActivity a) { + _activity = a; + } + + public void onSurfaceCreated(GL10 gl, EGLConfig config) { + nativeOnSurfaceCreated(); + } + + public void onSurfaceChanged(GL10 gl, int w, int h) { + if (h > w) { + System.out.println("surfchanged ERROR. dimensions: " + w + ", " + h); + nativeOnSurfaceChanged(h, w); + } + else + nativeOnSurfaceChanged(w, h); + } + + public void onDrawFrame(GL10 gl) { + if (!paused) { + _activity.processPendingEvents(); + nativeUpdate(); + } else { + _activity.clearPendingEvents(); + } + } + + public boolean paused = false; + + private static native void nativeOnSurfaceCreated(); + private static native void nativeOnSurfaceChanged(int w, int h); + private static native void nativeUpdate(); + //private static native void nativeDone(); +} + +class TextViewReader implements StringValue { + public TextViewReader(TextView view) { + _view = view; + } + public String getStringValue() { + return _view.getText().toString(); + } + private TextView _view; +} diff --git a/minecraftcpp-master/handheld/project/android_java/src/com/mojang/minecraftpe/sound/SoundPlayer.java b/minecraftcpp-master/handheld/project/android_java/src/com/mojang/minecraftpe/sound/SoundPlayer.java new file mode 100644 index 0000000..0a9f5d3 --- /dev/null +++ b/minecraftcpp-master/handheld/project/android_java/src/com/mojang/minecraftpe/sound/SoundPlayer.java @@ -0,0 +1,221 @@ +package com.mojang.minecraftpe.sound; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; + +import android.content.Context; +import android.media.SoundPool; + +import com.mojang.minecraftpe.R; + +public class SoundPlayer +{ + public SoundPlayer(Context c, int streamType) { + _context = c; + _stream = streamType; + + _random = new Random(); + _pool = new SoundPool(4, _stream, 0); + + _init(); + } + + private void _init() { + // Sounds that needs to be preloaded (although asynchronous :p) + SoundId[] preLoaded = { + new SoundId(R.raw.click, "random.click"), + new SoundId(R.raw.explode, "random.explode"), + new SoundId(R.raw.splash, "random.splash"), + new SoundId(R.raw.hurt, "random.hurt"), + new SoundId(R.raw.pop, "random.pop"), + + new SoundId(R.raw.door_open, "random.door_open"), + new SoundId(R.raw.door_close, "random.door_close"), + + new SoundId(R.raw.cloth1, "step.cloth"), + new SoundId(R.raw.cloth2, "step.cloth"), + new SoundId(R.raw.cloth3, "step.cloth"), + new SoundId(R.raw.cloth4, "step.cloth"), + + new SoundId(R.raw.glass1, "random.glass"), + new SoundId(R.raw.glass2, "random.glass"), + new SoundId(R.raw.glass3, "random.glass"), + + new SoundId(R.raw.grass1, "step.grass"), + new SoundId(R.raw.grass2, "step.grass"), + new SoundId(R.raw.grass3, "step.grass"), + new SoundId(R.raw.grass4, "step.grass"), + + //new SoundId(R.raw.gravel1, "step.gravel"), + new SoundId(R.raw.gravel2, "step.gravel"), + new SoundId(R.raw.gravel3, "step.gravel"), + new SoundId(R.raw.gravel4, "step.gravel"), + + new SoundId(R.raw.sand1, "step.sand"), + new SoundId(R.raw.sand2, "step.sand"), + new SoundId(R.raw.sand3, "step.sand"), + new SoundId(R.raw.sand4, "step.sand"), + + new SoundId(R.raw.stone1, "step.stone"), + new SoundId(R.raw.stone2, "step.stone"), + new SoundId(R.raw.stone3, "step.stone"), + new SoundId(R.raw.stone4, "step.stone"), + + new SoundId(R.raw.wood1, "step.wood"), + new SoundId(R.raw.wood2, "step.wood"), + new SoundId(R.raw.wood3, "step.wood"), + new SoundId(R.raw.wood4, "step.wood"), + + new SoundId(R.raw.sheep1, "mob.sheep"), + new SoundId(R.raw.sheep2, "mob.sheep"), + new SoundId(R.raw.sheep3, "mob.sheep"), + + new SoundId(R.raw.chicken2, "mob.chicken"), + new SoundId(R.raw.chicken3, "mob.chicken"), + new SoundId(R.raw.chickenhurt1, "mob.chickenhurt"), + new SoundId(R.raw.chickenhurt2, "mob.chickenhurt"), + + new SoundId(R.raw.cow1, "mob.cow"), + new SoundId(R.raw.cow2, "mob.cow"), + new SoundId(R.raw.cow3, "mob.cow"), + new SoundId(R.raw.cow4, "mob.cow"), + new SoundId(R.raw.cowhurt1, "mob.cowhurt"), + new SoundId(R.raw.cowhurt2, "mob.cowhurt"), + + new SoundId(R.raw.pig1, "mob.pig"), + new SoundId(R.raw.pig2, "mob.pig"), + new SoundId(R.raw.pig3, "mob.pig"), + new SoundId(R.raw.pigdeath, "mob.pigdeath"), + + new SoundId(R.raw.zombie1, "mob.zombie"), + new SoundId(R.raw.zombie2, "mob.zombie"), + new SoundId(R.raw.zombie3, "mob.zombie"), + new SoundId(R.raw.zombiedeath, "mob.zombiedeath"), + new SoundId(R.raw.zombiehurt1, "mob.zombiehurt"), + new SoundId(R.raw.zombiehurt2, "mob.zombiehurt"), + + new SoundId(R.raw.skeleton1, "mob.skeleton"), + new SoundId(R.raw.skeleton2, "mob.skeleton"), + new SoundId(R.raw.skeleton3, "mob.skeleton"), + new SoundId(R.raw.skeletonhurt1, "mob.skeletonhurt"), + new SoundId(R.raw.skeletonhurt2, "mob.skeletonhurt"), + new SoundId(R.raw.skeletonhurt3, "mob.skeletonhurt"), + new SoundId(R.raw.skeletonhurt4, "mob.skeletonhurt"), + + new SoundId(R.raw.spider1, "mob.spider"), + new SoundId(R.raw.spider2, "mob.spider"), + new SoundId(R.raw.spider3, "mob.spider"), + new SoundId(R.raw.spider4, "mob.spider"), + new SoundId(R.raw.spiderdeath, "mob.spiderdeath"), + + new SoundId(R.raw.fallbig1, "damage.fallbig"), + new SoundId(R.raw.fallbig2, "damage.fallbig"), + new SoundId(R.raw.fallsmall, "damage.fallsmall"), + + new SoundId(R.raw.bow, "random.bow"), + new SoundId(R.raw.bowhit1, "random.bowhit"), + new SoundId(R.raw.bowhit2, "random.bowhit"), + new SoundId(R.raw.bowhit3, "random.bowhit"), + new SoundId(R.raw.bowhit4, "random.bowhit"), + + new SoundId(R.raw.creeper1, "mob.creeper"), + new SoundId(R.raw.creeper2, "mob.creeper"), + new SoundId(R.raw.creeper3, "mob.creeper"), + new SoundId(R.raw.creeper4, "mob.creeper"), + new SoundId(R.raw.creeperdeath, "mob.creeperdeath"), + new SoundId(R.raw.eat1, "random.eat"), + new SoundId(R.raw.eat2, "random.eat"), + new SoundId(R.raw.eat3, "random.eat"), + new SoundId(R.raw.fuse, "random.fuse"), + + new SoundId(R.raw.zpig1, "mob.zombiepig.zpig"), + new SoundId(R.raw.zpig2, "mob.zombiepig.zpig"), + new SoundId(R.raw.zpig3, "mob.zombiepig.zpig"), + new SoundId(R.raw.zpig4, "mob.zombiepig.zpig"), + new SoundId(R.raw.zpigangry1, "mob.zombiepig.zpigangry"), + new SoundId(R.raw.zpigangry2, "mob.zombiepig.zpigangry"), + new SoundId(R.raw.zpigangry3, "mob.zombiepig.zpigangry"), + new SoundId(R.raw.zpigangry4, "mob.zombiepig.zpigangry"), + new SoundId(R.raw.zpigdeath, "mob.zombiepig.zpigdeath"), + new SoundId(R.raw.zpighurt1, "mob.zombiepig.zpighurt"), + new SoundId(R.raw.zpighurt2, "mob.zombiepig.zpighurt"), + }; + + for (SoundId s: preLoaded) { + load(s.name, s.soundId); + } + // Sounds that are loaded in a separate thread + } + +// public void loadWithAlias(String filename, String alias) { +// int id = loadRaw(filename); +// addRaw(new SoundId(id, alias)); +// } + + public void play(String s, float volume, float pitch) { + SoundId sound = get(s);//load(s); + if (sound != null) { + volume *= getCurrentStreamVolume(); + //System.out.println("playing sound id: " + sound.soundId); + if (s.equals("step.sand") || s.equals("step.gravel")) volume *= 0.5f; + _pool.play(sound.soundId, volume, volume, 0, 0, pitch); + } + } + + private SoundId get(String s) { + List sounds = _sounds.get( s ); + if (sounds == null) return null; + + return sounds.get(_random.nextInt(sounds.size())); + } + + public float getCurrentStreamVolume() { + return 2.5f; + //AudioManager mgr = (AudioManager)_context.getSystemService(Context.AUDIO_SERVICE); + //return ((float)mgr.getStreamVolume(_stream)) / mgr.getStreamMaxVolume(_stream); + } + + synchronized public SoundId load(String id, int resId) { + if (id == null) + return null; + + List sounds = _sounds.get(id); + SoundId soundId = null; + + if (sounds == null) { + sounds = new ArrayList(); + _sounds.put(id, sounds); + } + + for (SoundId sid : sounds) + if (sid.soundId == resId) + return sid; + + int snd = _pool.load(_context, resId, DefaultPriority); + soundId = new SoundId(snd, id); + sounds.add(soundId); + + return soundId; + } + + private Context _context; + private Random _random; + private int _stream; + private SoundPool _pool; + + private Map> _sounds = new HashMap>(); + + static private final int DefaultPriority = 1; + + public class SoundId { + SoundId(int soundId, String name) { + this.soundId = soundId; + this.name = name; + } + int soundId; + String name; + } +} diff --git a/minecraftcpp-master/handheld/project/data/app/ios/bg128.png b/minecraftcpp-master/handheld/project/data/app/ios/bg128.png new file mode 100644 index 0000000..70e6aa1 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/bg128.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/bg64.png b/minecraftcpp-master/handheld/project/data/app/ios/bg64.png new file mode 100644 index 0000000..58abd82 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/bg64.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/cancel_0.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/cancel_0.png new file mode 100644 index 0000000..1e7215c Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/cancel_0.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/cancel_0_1.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/cancel_0_1.png new file mode 100644 index 0000000..c1c77de Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/cancel_0_1.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/cancel_0_3.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/cancel_0_3.png new file mode 100644 index 0000000..42227db Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/cancel_0_3.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/cancel_1.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/cancel_1.png new file mode 100644 index 0000000..fade487 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/cancel_1.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/cancel_1_1.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/cancel_1_1.png new file mode 100644 index 0000000..70abbc7 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/cancel_1_1.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/cancel_1_3.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/cancel_1_3.png new file mode 100644 index 0000000..3329d22 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/cancel_1_3.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/create_0.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/create_0.png new file mode 100644 index 0000000..a311524 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/create_0.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/create_0_1.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/create_0_1.png new file mode 100644 index 0000000..2ed050f Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/create_0_1.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/create_0_3.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/create_0_3.png new file mode 100644 index 0000000..ae26713 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/create_0_3.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/create_1.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/create_1.png new file mode 100644 index 0000000..1f1a3da Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/create_1.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/create_1_1.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/create_1_1.png new file mode 100644 index 0000000..e34ea69 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/create_1_1.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/create_1_3.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/create_1_3.png new file mode 100644 index 0000000..66f62c0 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/create_1_3.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/cancel_0_4.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/cancel_0_4.png new file mode 100644 index 0000000..e902dcd Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/cancel_0_4.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/cancel_1_4.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/cancel_1_4.png new file mode 100644 index 0000000..b54fbd7 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/cancel_1_4.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/create_0_4.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/create_0_4.png new file mode 100644 index 0000000..bfe8d8d Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/create_0_4.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/create_1_4.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/create_1_4.png new file mode 100644 index 0000000..c7bc56f Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/create_1_4.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/creative_0_4.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/creative_0_4.png new file mode 100644 index 0000000..89f8124 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/creative_0_4.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/creative_1_4.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/creative_1_4.png new file mode 100644 index 0000000..b847443 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/creative_1_4.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/creative_3_4.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/creative_3_4.png new file mode 100644 index 0000000..328db9d Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/creative_3_4.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/survival_0_4.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/survival_0_4.png new file mode 100644 index 0000000..d0ec675 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/survival_0_4.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/survival_1_4.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/survival_1_4.png new file mode 100644 index 0000000..19f8325 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/survival_1_4.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/survival_3_4.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/survival_3_4.png new file mode 100644 index 0000000..3d866f1 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/survival_3_4.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/worldname_ipad_4.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/worldname_ipad_4.png new file mode 100644 index 0000000..736e914 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/ipad/worldname_ipad_4.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/save_0.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/save_0.png new file mode 100644 index 0000000..03a89d6 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/save_0.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/save_0_3.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/save_0_3.png new file mode 100644 index 0000000..cdcd88d Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/save_0_3.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/save_1.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/save_1.png new file mode 100644 index 0000000..5ee6184 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/save_1.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/save_1_3.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/save_1_3.png new file mode 100644 index 0000000..c7b1fae Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/save_1_3.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/worldname_ipad.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/worldname_ipad.png new file mode 100644 index 0000000..afe50bb Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/worldname_ipad.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/worldname_ipad_3.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/worldname_ipad_3.png new file mode 100644 index 0000000..da5f34c Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/worldname_ipad_3.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/worldname_iphone.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/worldname_iphone.png new file mode 100644 index 0000000..1a3781a Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/worldname_iphone.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog/worldname_iphone_3.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog/worldname_iphone_3.png new file mode 100644 index 0000000..f65f34d Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog/worldname_iphone_3.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog2/cancel_0_1.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/cancel_0_1.png new file mode 100644 index 0000000..c43434a Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/cancel_0_1.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog2/cancel_0_3.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/cancel_0_3.png new file mode 100644 index 0000000..44f7b13 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/cancel_0_3.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog2/cancel_1_1.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/cancel_1_1.png new file mode 100644 index 0000000..abaa241 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/cancel_1_1.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog2/cancel_1_3.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/cancel_1_3.png new file mode 100644 index 0000000..304fc53 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/cancel_1_3.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog2/create_0_1.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/create_0_1.png new file mode 100644 index 0000000..4ebc3b2 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/create_0_1.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog2/create_0_3.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/create_0_3.png new file mode 100644 index 0000000..07fe661 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/create_0_3.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog2/create_1_1.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/create_1_1.png new file mode 100644 index 0000000..5db6202 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/create_1_1.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog2/create_1_3.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/create_1_3.png new file mode 100644 index 0000000..5b5fc4e Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/create_1_3.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog2/creative_0_3.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/creative_0_3.png new file mode 100644 index 0000000..299e830 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/creative_0_3.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog2/creative_1_3.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/creative_1_3.png new file mode 100644 index 0000000..7cac499 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/creative_1_3.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog2/survival_0_3.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/survival_0_3.png new file mode 100644 index 0000000..c5174f7 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/survival_0_3.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog2/survival_1_3.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/survival_1_3.png new file mode 100644 index 0000000..a2a1eb6 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/survival_1_3.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog2/worldname.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/worldname.png new file mode 100644 index 0000000..b8f42a2 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/worldname.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog2/worldname_3.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/worldname_3.png new file mode 100644 index 0000000..adccd67 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/worldname_3.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog2/worldname_ipad.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/worldname_ipad.png new file mode 100644 index 0000000..afe50bb Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/worldname_ipad.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog2/worldname_ipad_3.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/worldname_ipad_3.png new file mode 100644 index 0000000..da5f34c Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/worldname_ipad_3.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog2/worldname_iphone.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/worldname_iphone.png new file mode 100644 index 0000000..509f439 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/worldname_iphone.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog2/worldname_iphone5_3.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/worldname_iphone5_3.png new file mode 100644 index 0000000..ab2b0ba Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/worldname_iphone5_3.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/dialog2/worldname_iphone_3.png b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/worldname_iphone_3.png new file mode 100644 index 0000000..7f65500 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/dialog2/worldname_iphone_3.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon-72.png b/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon-72.png new file mode 100644 index 0000000..d198911 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon-72.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon-72_lite.png b/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon-72_lite.png new file mode 100644 index 0000000..ad32eb3 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon-72_lite.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon-Small-50.png b/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon-Small-50.png new file mode 100644 index 0000000..4413190 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon-Small-50.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon-Small-50_lite.png b/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon-Small-50_lite.png new file mode 100644 index 0000000..fe2162d Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon-Small-50_lite.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon-Small.png b/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon-Small.png new file mode 100644 index 0000000..65fe938 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon-Small.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon-Small@2x.png b/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon-Small@2x.png new file mode 100644 index 0000000..4218ed5 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon-Small@2x.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon-Small@2x_lite.png b/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon-Small@2x_lite.png new file mode 100644 index 0000000..5a790d0 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon-Small@2x_lite.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon-Small_lite.png b/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon-Small_lite.png new file mode 100644 index 0000000..7d50baa Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon-Small_lite.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon.png b/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon.png new file mode 100644 index 0000000..05824c1 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon@2x.png b/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon@2x.png new file mode 100644 index 0000000..6eea25c Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon@2x.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon@2x_lite.png b/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon@2x_lite.png new file mode 100644 index 0000000..491c13a Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon@2x_lite.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon_lite.png b/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon_lite.png new file mode 100644 index 0000000..22e4376 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/icons/Icon_lite.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/icons/mcpe_ios_icon.png b/minecraftcpp-master/handheld/project/data/app/ios/icons/mcpe_ios_icon.png new file mode 100644 index 0000000..e70d4cc Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/icons/mcpe_ios_icon.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/ios/icons/mcpe_lite_ios_icon.png b/minecraftcpp-master/handheld/project/data/app/ios/icons/mcpe_lite_ios_icon.png new file mode 100644 index 0000000..a6a6154 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/ios/icons/mcpe_lite_ios_icon.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/launch/Default-Landscape~ipad.png b/minecraftcpp-master/handheld/project/data/app/launch/Default-Landscape~ipad.png new file mode 100644 index 0000000..a4a061c Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/launch/Default-Landscape~ipad.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/launch/Default.png b/minecraftcpp-master/handheld/project/data/app/launch/Default.png new file mode 100644 index 0000000..dd2702a Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/launch/Default.png differ diff --git a/minecraftcpp-master/handheld/project/data/app/launch/Default@2x.png b/minecraftcpp-master/handheld/project/data/app/launch/Default@2x.png new file mode 100644 index 0000000..8bd9662 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/app/launch/Default@2x.png differ diff --git a/minecraftcpp-master/handheld/project/data/fonts/minecraft.ttf b/minecraftcpp-master/handheld/project/data/fonts/minecraft.ttf new file mode 100644 index 0000000..55c5075 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/fonts/minecraft.ttf differ diff --git a/minecraftcpp-master/handheld/project/data/images/armor/chain_1.png b/minecraftcpp-master/handheld/project/data/images/armor/chain_1.png new file mode 100644 index 0000000..3632af5 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/armor/chain_1.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/armor/chain_2.png b/minecraftcpp-master/handheld/project/data/images/armor/chain_2.png new file mode 100644 index 0000000..330425b Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/armor/chain_2.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/armor/cloth_1.png b/minecraftcpp-master/handheld/project/data/images/armor/cloth_1.png new file mode 100644 index 0000000..f3cf4aa Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/armor/cloth_1.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/armor/cloth_2.png b/minecraftcpp-master/handheld/project/data/images/armor/cloth_2.png new file mode 100644 index 0000000..15fb908 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/armor/cloth_2.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/armor/diamond_1.png b/minecraftcpp-master/handheld/project/data/images/armor/diamond_1.png new file mode 100644 index 0000000..339da65 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/armor/diamond_1.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/armor/diamond_2.png b/minecraftcpp-master/handheld/project/data/images/armor/diamond_2.png new file mode 100644 index 0000000..c220c12 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/armor/diamond_2.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/armor/gold_1.png b/minecraftcpp-master/handheld/project/data/images/armor/gold_1.png new file mode 100644 index 0000000..885f309 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/armor/gold_1.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/armor/gold_2.png b/minecraftcpp-master/handheld/project/data/images/armor/gold_2.png new file mode 100644 index 0000000..9d1ea3b Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/armor/gold_2.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/armor/iron_1.png b/minecraftcpp-master/handheld/project/data/images/armor/iron_1.png new file mode 100644 index 0000000..374ab07 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/armor/iron_1.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/armor/iron_2.png b/minecraftcpp-master/handheld/project/data/images/armor/iron_2.png new file mode 100644 index 0000000..53af4f4 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/armor/iron_2.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/art/kz.png b/minecraftcpp-master/handheld/project/data/images/art/kz.png new file mode 100644 index 0000000..c40ca22 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/art/kz.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/environment/clouds.png b/minecraftcpp-master/handheld/project/data/images/environment/clouds.png new file mode 100644 index 0000000..7ad7fa4 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/environment/clouds.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/font/default8.png b/minecraftcpp-master/handheld/project/data/images/font/default8.png new file mode 100644 index 0000000..6179312 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/font/default8.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/gui/background.png b/minecraftcpp-master/handheld/project/data/images/gui/background.png new file mode 100644 index 0000000..c8cadb4 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/gui/background.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/gui/badge/minecon140.png b/minecraftcpp-master/handheld/project/data/images/gui/badge/minecon140.png new file mode 100644 index 0000000..dd95dec Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/gui/badge/minecon140.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/gui/bg32.png b/minecraftcpp-master/handheld/project/data/images/gui/bg32.png new file mode 100644 index 0000000..d9796c4 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/gui/bg32.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/gui/cursor.png b/minecraftcpp-master/handheld/project/data/images/gui/cursor.png new file mode 100644 index 0000000..ec1012a Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/gui/cursor.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/gui/default_world.png b/minecraftcpp-master/handheld/project/data/images/gui/default_world.png new file mode 100644 index 0000000..17c9cdc Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/gui/default_world.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/gui/gui.png b/minecraftcpp-master/handheld/project/data/images/gui/gui.png new file mode 100644 index 0000000..0ae80b9 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/gui/gui.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/gui/gui2.png b/minecraftcpp-master/handheld/project/data/images/gui/gui2.png new file mode 100644 index 0000000..34ae051 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/gui/gui2.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/gui/gui_blocks.png b/minecraftcpp-master/handheld/project/data/images/gui/gui_blocks.png new file mode 100644 index 0000000..fa4df26 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/gui/gui_blocks.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/gui/icons.png b/minecraftcpp-master/handheld/project/data/images/gui/icons.png new file mode 100644 index 0000000..8afc25a Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/gui/icons.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/gui/itemframe.png b/minecraftcpp-master/handheld/project/data/images/gui/itemframe.png new file mode 100644 index 0000000..8e23979 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/gui/itemframe.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/gui/items.png b/minecraftcpp-master/handheld/project/data/images/gui/items.png new file mode 100644 index 0000000..ace2e9a Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/gui/items.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/gui/logo/raknet_high_72.png b/minecraftcpp-master/handheld/project/data/images/gui/logo/raknet_high_72.png new file mode 100644 index 0000000..fdd7d4e Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/gui/logo/raknet_high_72.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/gui/logo/raknet_low_18.png b/minecraftcpp-master/handheld/project/data/images/gui/logo/raknet_low_18.png new file mode 100644 index 0000000..1b9a869 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/gui/logo/raknet_low_18.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/gui/pi_title.png b/minecraftcpp-master/handheld/project/data/images/gui/pi_title.png new file mode 100644 index 0000000..b31eed9 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/gui/pi_title.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/gui/spritesheet.png b/minecraftcpp-master/handheld/project/data/images/gui/spritesheet.png new file mode 100644 index 0000000..b130262 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/gui/spritesheet.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/gui/title.png b/minecraftcpp-master/handheld/project/data/images/gui/title.png new file mode 100644 index 0000000..5f2e4ff Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/gui/title.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/gui/touchgui.png b/minecraftcpp-master/handheld/project/data/images/gui/touchgui.png new file mode 100644 index 0000000..3d2221f Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/gui/touchgui.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/item/arrows.png b/minecraftcpp-master/handheld/project/data/images/item/arrows.png new file mode 100644 index 0000000..75c5828 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/item/arrows.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/item/camera.png b/minecraftcpp-master/handheld/project/data/images/item/camera.png new file mode 100644 index 0000000..9725189 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/item/camera.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/item/sign.png b/minecraftcpp-master/handheld/project/data/images/item/sign.png new file mode 100644 index 0000000..e829472 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/item/sign.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/mob/char.png b/minecraftcpp-master/handheld/project/data/images/mob/char.png new file mode 100644 index 0000000..7cfa08a Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/mob/char.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/mob/chicken.png b/minecraftcpp-master/handheld/project/data/images/mob/chicken.png new file mode 100644 index 0000000..d481293 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/mob/chicken.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/mob/cow.png b/minecraftcpp-master/handheld/project/data/images/mob/cow.png new file mode 100644 index 0000000..bc0e89f Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/mob/cow.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/mob/creeper.png b/minecraftcpp-master/handheld/project/data/images/mob/creeper.png new file mode 100644 index 0000000..e0a5e0a Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/mob/creeper.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/mob/pig.png b/minecraftcpp-master/handheld/project/data/images/mob/pig.png new file mode 100644 index 0000000..1ed505b Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/mob/pig.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/mob/pigzombie.png b/minecraftcpp-master/handheld/project/data/images/mob/pigzombie.png new file mode 100644 index 0000000..3521845 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/mob/pigzombie.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/mob/sheep.png b/minecraftcpp-master/handheld/project/data/images/mob/sheep.png new file mode 100644 index 0000000..a6ed11d Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/mob/sheep.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/mob/sheep_fur.png b/minecraftcpp-master/handheld/project/data/images/mob/sheep_fur.png new file mode 100644 index 0000000..b00aa8c Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/mob/sheep_fur.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/mob/skeleton.png b/minecraftcpp-master/handheld/project/data/images/mob/skeleton.png new file mode 100644 index 0000000..9d22339 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/mob/skeleton.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/mob/spider.png b/minecraftcpp-master/handheld/project/data/images/mob/spider.png new file mode 100644 index 0000000..08344a8 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/mob/spider.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/mob/zombie.png b/minecraftcpp-master/handheld/project/data/images/mob/zombie.png new file mode 100644 index 0000000..4d47ccf Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/mob/zombie.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/particles.png b/minecraftcpp-master/handheld/project/data/images/particles.png new file mode 100644 index 0000000..de34f1b Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/particles.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/terrain.png b/minecraftcpp-master/handheld/project/data/images/terrain.png new file mode 100644 index 0000000..f14bbed Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/terrain.png differ diff --git a/minecraftcpp-master/handheld/project/data/images/terrain.pvr b/minecraftcpp-master/handheld/project/data/images/terrain.pvr new file mode 100644 index 0000000..6cb2065 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/terrain.pvr differ diff --git a/minecraftcpp-master/handheld/project/data/images/terrain.pvr4 b/minecraftcpp-master/handheld/project/data/images/terrain.pvr4 new file mode 100644 index 0000000..6c32892 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/terrain.pvr4 differ diff --git a/minecraftcpp-master/handheld/project/data/images/terrain.pvrtc b/minecraftcpp-master/handheld/project/data/images/terrain.pvrtc new file mode 100644 index 0000000..0c45ab1 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/images/terrain.pvrtc differ diff --git a/minecraftcpp-master/handheld/project/data/images/terrain_4444.h b/minecraftcpp-master/handheld/project/data/images/terrain_4444.h new file mode 100644 index 0000000..c222eb9 --- /dev/null +++ b/minecraftcpp-master/handheld/project/data/images/terrain_4444.h @@ -0,0 +1,1052 @@ +/********************************************************** + * PVRTexture Tool v 3.20 + * PVRTC Library v 1.106. 0. 0 Beta + **********************************************************/ + +#ifndef A32BIT + #define A32BIT static const unsigned long +#endif + +A32BIT terrain_4444[] = { + +/* Header */ +0x00000034, /* dwHeaderSize */ +0x00000100, /* dwHeight */ +0x00000100, /* dwWidth */ +0x00000000, /* dwMipMapCount */ +0x00008010, /* dwpfFlags */ +0x00020000, /* dwDataSize */ +0x00000010, /* dwBitCount */ +0x0000f000, /* dwRBitMask */ +0x00000f00, /* dwGBitMask */ +0x000000f0, /* dwBBitMask */ +0x0000000f, /* dwAlphaBitMask */ +0x21525650, /* dwPVR */ +0x00000001, /* dwNumSurfs */ + +/* Data */ +0x999f999f,0x888f999f,0x888f888f,0x888f777f,0x999f999f,0x888f888f,0x888f888f,0x888f777f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x888f666f,0x777f777f,0x777f777f,0x777f777f,0x964fb85f,0x753f964f,0xb85f753f,0x964f964f,0x753f753f,0x753f532f,0xb85f753f,0xb85f753f,0x7b4f7b4f,0x6a3f7b4f,0x6a4f6a3f,0x6a4f593f,0x7b4f7b5f,0x6a3f6a4f,0x6a3f6a3f,0x6a4f592f, +0x984fb96f,0x984f984f,0xb96f984f,0xb95fb96f,0xb96f984f,0xb96fb96f,0xb96fb96f,0x984fb96f,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xaaafcccf,0x888f888f,0x888f888f,0x888f888f,0x999f999f,0x999f777f,0x888f888f,0x888f888f,0x888f888f,0x943f943f,0xcccf943f,0x943f943f,0xa53f943f,0xa53f943f,0xdddf843f,0xa53f943f,0x943f943f, +0xc31fd41f,0xa31fb31f,0xc31fd41f,0xa31fb31f,0xc31fd41f,0xa31fb31f,0xc31fd41f,0xa31fb31f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0x0000ffff,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0xffff0000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x888f999f,0x999faaaf,0x888f999f,0x888f888f,0xaaaf777f,0x999faaaf,0x888f888f,0x888f888f,0x777f777f,0x888f888f,0x888f888f,0x888f888f,0x888f777f,0x888f888f,0x777f666f,0x777f777f,0x964f753f,0x753f532f,0x964f753f,0x532f888f,0xb85f753f,0x753f964f,0x964f753f,0x532f532f,0x6a4f7b4f,0x8b5f8b5f,0x532f8b5f,0x6a3f6a3f,0x9c6f593f,0x7b4f9b6f,0x6a4f6a3f,0x6a4f6a3f, +0xb96fb96f,0x753fb95f,0xb95fb95f,0x984f984f,0x984f984f,0xb95f984f,0xb95f984f,0x984fb96f,0xaaafcccf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfaaaf,0xbbbfbbbf,0xaaaf999f,0x888faaaf,0xaaaf888f,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfaaaf,0xbbbfbbbf,0xaaaf999f,0x888faaaf,0x732f732f,0xeeef842f,0x732fb54f,0x632f632f,0x732f732f,0xdddf842f,0x732f943f,0x732f732f, +0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0xffff0000,0x00000000,0x00000000,0x00000000,0xffffffff,0x0000ffff,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x4c2f0000,0x00000000,0x00000000, +0xbbbfaaaf,0x888fbbbf,0x888f888f,0x999f999f,0x999f999f,0xaaafaaaf,0x777f888f,0xbbbf888f,0x666f777f,0x777f777f,0x777f666f,0x777f777f,0x777f888f,0x777f777f,0x888f777f,0x777f777f,0x753fb85f,0x532f753f,0x753fb85f,0x753f753f,0x753fb85f,0x753f753f,0x532f532f,0x753fb85f,0x532f8b5f,0x6a3f9c6f,0x532f6a3f,0x532f7b4f,0x7b5f7b4f,0x9c6f9c6f,0x592f532f,0x532f6a3f, +0xb96fb96f,0x984f984f,0x984f984f,0xb95fb95f,0xb96fb96f,0xb95fb96f,0xb96f753f,0x984fb96f,0x999fcccf,0xaaafaaaf,0xaaaf999f,0xaaafaaaf,0xaaafbbbf,0xaaafaaaf,0xbbbfaaaf,0x888faaaf,0x999f888f,0xaaafaaaf,0xaaaf999f,0xaaafaaaf,0xaaafbbbf,0xaaafaaaf,0xbbbfaaaf,0x888faaaf,0x843f732f,0xdddf632f,0x732f943f,0x732f732f,0x732f732f,0xdddf732f,0x943f842f,0x843f732f, +0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0x888fd41f,0x921f555f,0x888fd41f,0x000f555f,0x555f000f,0x921f888f,0x555fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x00000000,0xffffffff,0xffffffff,0x00000000,0x0000ffff,0xffff0000,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x00000000,0x4c2f4c2f,0x00000000,0x00000000,0x060f4c2f,0x0000060f,0x00000000, +0x888f777f,0x999f888f,0x999f999f,0x777f777f,0x888f777f,0x999f888f,0x888f888f,0x777f888f,0x888f777f,0x777f777f,0x666f777f,0x888f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x666f964f,0x753fb85f,0x532f964f,0xb85f753f,0x964f964f,0x964f753f,0xb85f753f,0x753f964f,0x666f532f,0x532f532f,0x532f7b4f,0x532f532f,0x532f593f,0x532f6a4f,0x532f753f,0x753f532f, +0x653f653f,0x753f653f,0x753f753f,0x753f753f,0x753f753f,0x653f653f,0x653f653f,0x753f753f,0xbbbfcccf,0xaaafaaaf,0x999faaaf,0xbbbfaaaf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0x888faaaf,0xbbbf888f,0xaaafaaaf,0x999faaaf,0xbbbfaaaf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0x888faaaf,0xbbbfbbbf,0xdddfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xdddfbbbf,0xbbbfbbbf,0xbbbfbbbf, +0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0x921fa31f,0x555f921f,0x921fa31f,0x921f555f,0x000f555f,0x921f921f,0x921f555f,0x921f921f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0x00000000,0xffff0000,0x00000000,0xffffffff,0x0000ffff,0x00000000,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x00000000,0x060f4c2f,0x4c2f0000,0x060f4c2f,0x060f0000,0x0000962f,0x00000000, +0x888faaaf,0x888faaaf,0xaaafaaaf,0xaaaf888f,0x777fbbbf,0xaaaf888f,0x777faaaf,0x888f888f,0x888f777f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x888f888f,0x666f888f,0x753f964f,0xb85f964f,0x964f532f,0x753f753f,0x532f964f,0x666f753f,0x964f753f,0x753f532f,0x753f964f,0xb85f964f,0x964f532f,0x753f753f,0x532f532f,0x666f532f,0x964f753f,0x753f532f, +0x984fb96f,0x984f984f,0xb96f984f,0x984fb96f,0x984fb96f,0x753f984f,0xb95fb95f,0xb96fb95f,0xbbbfcccf,0xaaafbbbf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0xbbbfbbbf,0xbbbfbbbf,0x777fbbbf,0xbbbf888f,0xaaafbbbf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0xbbbfbbbf,0xbbbfbbbf,0x777fbbbf,0x943f843f,0x943f943f,0x943f943f,0xdddf943f,0xa53fa53f,0x943fa43f,0x943f943f,0xdddf943f, +0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xd41fd41f,0xa31fd41f,0xd41f555f,0xa31f555f,0xd41f555f,0x000f000f,0xd41f555f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0x00000000,0xffff0000,0x0000ffff,0xffff0000,0xffff0000,0xffff0000,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x4c2f0000,0x060f962f,0x0000060f,0x060f060f,0x962f530f,0x060f962f,0x00000000, +0x999f999f,0xaaaf777f,0x999f888f,0x999f999f,0x999f888f,0x888f888f,0x888f777f,0x999f888f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x666f777f,0x777f777f,0x777f777f,0x777f666f,0x532f753f,0x964f964f,0x964f753f,0x532f532f,0x753f532f,0x532f753f,0x753f753f,0xb85f753f,0x532f753f,0x964f964f,0x964f753f,0x532f532f,0x753f532f,0x532f753f,0x753f753f,0xb85f753f, +0x984f984f,0xb95f753f,0xb95fb95f,0x984fb96f,0xb95fb95f,0xb95fb95f,0x984f984f,0x984f984f,0xaaafcccf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0x999faaaf,0xaaafaaaf,0xaaafaaaf,0x888f999f,0xaaaf888f,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0x999faaaf,0xaaafaaaf,0xaaafaaaf,0x888f999f,0x732f943f,0x732f943f,0x732f632f,0xdddf732f,0x732f943f,0x732f732f,0x732f632f,0xdddf732f, +0xdddfdddf,0xcccfdddf,0xdddfdddf,0xdddfdddf,0xdddfcccf,0xcccfdddf,0xdddfcccf,0xcccfdddf,0x888fd41f,0x921f888f,0x000fd41f,0x921f000f,0x888f555f,0x555f555f,0x888f000f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x00000000,0x0000ffff,0xffff0000,0xffff0000,0x00000000,0x0000ffff,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x3bef0000,0x00003bef,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x060f0000,0x060f530f,0x0000060f,0x962f060f,0x530f962f,0x962f530f,0x00000000, +0x999f777f,0x999faaaf,0x888f999f,0x777f888f,0x888f888f,0xaaafbbbf,0xaaaf999f,0x888f999f,0x888f888f,0x888f777f,0x777f777f,0x888f888f,0x777f777f,0x777f777f,0x888f888f,0x666f888f,0x532fb85f,0x753f753f,0x753f888f,0xb85f753f,0x753fb85f,0xb85fb85f,0x964f753f,0x964f753f,0x532fb85f,0x753f753f,0x753f888f,0xb85f753f,0x753fb85f,0xb85fb85f,0x964f753f,0x964f753f, +0xb96fb96f,0xb95fb96f,0xb96fb96f,0x984fb96f,0x984f984f,0xb96f753f,0xb96fb96f,0xb96fb96f,0xbbbfcccf,0xaaafaaaf,0xaaafaaaf,0xbbbfbbbf,0xaaafaaaf,0xaaafaaaf,0xbbbfbbbf,0x777fbbbf,0xbbbf999f,0xaaafaaaf,0xaaafaaaf,0xbbbfbbbf,0xaaafaaaf,0xaaafaaaf,0xbbbfbbbf,0x777fbbbf,0x522f943f,0x632f842f,0x632f732f,0xdddf732f,0x632fa53f,0x732f842f,0x732f732f,0xdddf732f, +0xdddfcccf,0x000f000f,0xcccf000f,0xcccf000f,0x000fdddf,0x000fcccf,0x000f000f,0xcccfdddf,0x888fd41f,0x555f555f,0x888fd41f,0x555f000f,0x555f000f,0x555f000f,0x000f555f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x00000000,0x0000ffff,0x0000ffff,0xffffffff,0xffff0000,0xffff0000,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x379f3bef,0x39bf3acf,0x00003acf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x00000000,0x530f0000,0x530f962f,0x962f962f,0x060f530f,0x4c2f0000,0x0000060f, +0x888f888f,0x888f999f,0x777f999f,0x888faaaf,0xaaaf999f,0x888f888f,0xaaaf888f,0xaaaf777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x666f777f,0x777f777f,0x777f777f,0x777f777f,0x753fb85f,0xb85fb85f,0x964f964f,0x753f753f,0x532f964f,0x964f964f,0x753f753f,0x964f964f,0x753fb85f,0xb85fb85f,0x964f964f,0x753f753f,0x532f964f,0x964f964f,0x753f753f,0x964f964f, +0x753f753f,0x653f653f,0x653f653f,0x753f653f,0x753f753f,0x653f653f,0x653f653f,0x753f753f,0x888faaaf,0x888f888f,0x888f888f,0x888f888f,0x777f888f,0x888f888f,0x888f888f,0x888f888f,0xaaaf888f,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0x999faaaf,0xaaafaaaf,0xaaafaaaf,0x888faaaf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xdddfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xdddfbbbf, +0xcccfcccf,0x000fcccf,0xcccfcccf,0x000f000f,0x000fcccf,0xcccfcccf,0xcccf000f,0xcccfcccf,0x921fa31f,0x921f921f,0x000f555f,0x000f000f,0x000f000f,0x921f555f,0x000fa31f,0x921f921f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x0000ffff,0x00000000,0x0000ffff,0xffff0000, +0x00000000,0x00000000,0x3acf0000,0x3acf3acf,0x379f3bef,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x4c2f0000,0x0000060f,0x962f530f,0x4c2f4c2f,0x00000000,0x060f4c2f,0x0000060f, +0x999f888f,0xaaafbbbf,0x888faaaf,0x999faaaf,0xaaafbbbf,0x999f888f,0x999f888f,0x777f777f,0x888f777f,0x666f888f,0x777f888f,0x777f777f,0x888f777f,0x888f888f,0x888f888f,0x888f888f,0x753f964f,0x964f753f,0x964f753f,0x532f753f,0x964f753f,0x753f964f,0x753f753f,0x753f532f,0x753f964f,0x964f753f,0x964f753f,0x532f753f,0x964f753f,0x753f964f,0x753f753f,0x753f532f, +0xb96fb96f,0xb96fb96f,0x753fb96f,0xb96f984f,0xb95fb96f,0xb95fb95f,0xb96fb96f,0x984fb96f,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xbbbfcccf,0xbbbf888f,0x999fbbbf,0xaaafbbbf,0xaaafaaaf,0xbbbfaaaf,0xbbbfbbbf,0xbbbfbbbf,0x999fbbbf,0x943fa43f,0xdddf943f,0x943f943f,0xb54fa53f,0x943fa43f,0xdddf943f,0x943f943f,0x732fb54f, +0xcccfcccf,0x000fcccf,0xcccfcccf,0xcccf000f,0x000f000f,0xcccfcccf,0xcccf000f,0xcccfcccf,0xd41fd41f,0xa31fd41f,0xd41fd41f,0x000f000f,0x555f000f,0x555fd41f,0x000f555f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0x00000000,0x0000ffff,0x0000ffff,0xffff0000,0xffffffff,0xffffffff,0xffffffff,0xffffffff, +0x00000000,0x00000000,0x00000000,0x39bf3bef,0x379f379f,0x00003acf,0x00000000,0x00000000,0x00000000,0x00000000,0xcd0f0000,0x0000ff0f,0xbb0fff0f,0x0000ff0f,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x060f0000,0x962f0000,0x962f962f,0x060f060f,0x530f060f,0x060f0000,0x00000000, +0x888f999f,0x888fbbbf,0x999f888f,0x888faaaf,0x999f888f,0xaaaf999f,0xbbbf888f,0x888f888f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f666f,0x777f777f,0x777f777f,0x777f888f,0x964f964f,0x753f532f,0x532f753f,0x753f532f,0x753f753f,0x753f753f,0xb85fb85f,0x964f753f,0x964f964f,0x753f532f,0x532f753f,0x753f532f,0x753f753f,0x753f753f,0xb85fb85f,0x964f753f, +0x984f984f,0x984f984f,0xb96f984f,0xb95fb95f,0x984f984f,0x753f984f,0x984fb96f,0x984f984f,0xaaafcccf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0xaaaf999f,0xaaafaaaf,0xaaafaaaf,0x888fbbbf,0xaaaf888f,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0xaaaf999f,0xaaafaaaf,0xaaafaaaf,0x888fbbbf,0x732f732f,0xcccf732f,0x732f943f,0x732f732f,0x843f842f,0xcccf732f,0x842f943f,0x732f732f, +0xaaafcccf,0x000faaaf,0xaaafcccf,0xcccf000f,0x000fcccf,0xcccfcccf,0xaaaf000f,0xcccfaaaf,0x888fd41f,0x555f555f,0x000f000f,0x000f000f,0x000f000f,0x921f888f,0x555f000f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x00000000,0x0000ffff,0xffff0000,0xffffffff,0xffff0000,0x00000000,0x0000ffff,0xffff0000, +0x00000000,0x00000000,0x00000000,0x180f3acf,0x0000160f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xcd0fcd0f,0x890fff0f,0x00000000,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x00000000,0x962f060f,0x962f530f,0x060f962f,0x962f962f,0x962f962f,0x00004c2f, +0x999f999f,0xaaaf999f,0xbbbf888f,0x999f888f,0x777fcccf,0x888faaaf,0x888f888f,0x888f888f,0x777f777f,0x777f888f,0x888f777f,0x777f888f,0x777f666f,0x888f888f,0x777f888f,0x777f777f,0x964f964f,0xb85f753f,0x753fb85f,0x964fb85f,0xb85f532f,0x753fb85f,0x964f964f,0x753f888f,0x964f964f,0xb85f753f,0x753fb85f,0x964fb85f,0xb85f532f,0x753fb85f,0x964f964f,0x753f888f, +0xb95fb96f,0xb95fb95f,0xb96fb96f,0x984f984f,0x984f984f,0xb95fb95f,0xb95fb95f,0x984fb95f,0xaaafcccf,0xaaafbbbf,0xbbbfaaaf,0xaaafbbbf,0xaaaf999f,0xbbbfbbbf,0xaaafbbbf,0x888faaaf,0xaaaf888f,0xaaafbbbf,0xbbbfaaaf,0xaaafbbbf,0xaaaf999f,0xbbbfbbbf,0xaaafbbbf,0x888faaaf,0x732f843f,0xdddf842f,0x732f943f,0x732f522f,0x842f632f,0xdddf732f,0x732f943f,0x732f842f, +0xaaafaaaf,0xaaafcccf,0xcccfaaaf,0xaaafaaaf,0xcccfaaaf,0xaaafaaaf,0xaaafcccf,0xaaafaaaf,0x888fd41f,0x921f888f,0x000fd41f,0x000f000f,0x888f000f,0x921f555f,0x888f000f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x00000000,0x0000ffff,0xffff0000,0xffff0000,0x00000000,0x0000ffff,0x0000ffff,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x543f0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xff0f0000,0xbb0fff0f,0x890f890f,0x0000cd0f,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x4c2f0000,0x530f060f,0x4c2f0000,0x530f060f,0x4c2f530f,0x0000060f,0x060f060f, +0xaaaf888f,0xaaaf888f,0x888f999f,0x888f999f,0x999f999f,0x777f888f,0x777f777f,0x888f777f,0x777f666f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x777f777f,0x888f777f,0x666f888f,0x753f964f,0x964f753f,0xb85f964f,0x964f753f,0x964f666f,0x753f964f,0x964f532f,0x532f753f,0x753f964f,0x964f753f,0xb85f964f,0x964f753f,0x964f666f,0x753f964f,0x964f532f,0x532f753f, +0x653f753f,0x753f753f,0x653f653f,0x753f653f,0x753f753f,0x753f753f,0x653f653f,0x753f653f,0xaaafcccf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0xbbbfbbbf,0xaaafaaaf,0xbbbfaaaf,0x777fbbbf,0xaaaf777f,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0xbbbfbbbf,0xaaafaaaf,0xbbbfaaaf,0x777fbbbf,0xbbbfbbbf,0xdddfaaaf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xdddfbbbf,0xbbbfbbbf,0xbbbfbbbf, +0xa31fb31f,0x720f821f,0xa31fb31f,0x720f821f,0xa31fb31f,0x720f821f,0xa31fb31f,0x720f821f,0x921fa31f,0x921f921f,0x921f000f,0x921f000f,0x555f000f,0x000f921f,0x921f555f,0x921f921f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0x00000000,0xffff0000,0xffffffff,0xffff0000,0xffff0000,0xffffffff,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x180f543f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x180f0000,0x0000180f,0x00000000,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x060f4c2f,0x060f060f,0x060f0000,0x962f060f,0x0000530f,0x00000000,0x060f0000, +0x999fbbbf,0x888f888f,0x999f999f,0x777f888f,0x999f666f,0x777f888f,0xaaaf999f,0x888f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x777f777f,0x777f777f,0x777f777f,0x532f753f,0x753f964f,0x964f964f,0x753fb85f,0x753f753f,0x753f753f,0x753f753f,0xb85fb85f,0x532f753f,0x753f964f,0x964f964f,0x753fb85f,0x753f753f,0x753f753f,0x753f753f,0xb85fb85f, +0xb96fb96f,0xb96fb96f,0x984fb96f,0x984fb96f,0x984f984f,0x984f984f,0x753fb95f,0xb96fb96f,0xaaafcccf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0xbbbfbbbf,0xaaafaaaf,0xaaafaaaf,0x888faaaf,0xaaaf888f,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0xbbbfbbbf,0xaaafaaaf,0xaaafaaaf,0x888faaaf,0xa43f943f,0x943fa53f,0x943f943f,0xcccf943f,0xb54f943f,0x943f943f,0x943f943f,0xeeef943f, +0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xd41fd41f,0x555fd41f,0xd41fd41f,0xa31f555f,0x000f555f,0x555f000f,0xd41f555f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0xd41fd41f,0xa31fd41f,0x00000000,0xffff0000,0x0000ffff,0xffffffff,0x0000ffff,0x00000000,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x160f0000,0x0000180f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x180f0000,0x180f160f,0x0000160f,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x060f060f,0x060f0000,0x530f0000,0x4c2f962f,0x00004c2f,0x00000000,0x00000000, +0xaaafbbbf,0x777f777f,0x888f777f,0xcccf888f,0xcccfaaaf,0x999faaaf,0x888faaaf,0xaaafaaaf,0x888f777f,0x888f777f,0x777f666f,0x777f777f,0x777f777f,0x777f666f,0x777f777f,0x888f888f,0x964f753f,0x753f753f,0x753f754f,0x964f964f,0x532f753f,0x532fb85f,0xb85f753f,0x964f964f,0x964f753f,0x753f753f,0x753f532f,0x964f964f,0x532f753f,0x532fb85f,0xb85f753f,0x964f964f, +0x984fb95f,0xb96f753f,0xb96fb96f,0x984fb96f,0xb95fb96f,0x984fb95f,0x984f984f,0xb95f984f,0xbbbfcccf,0xbbbfaaaf,0xaaaf999f,0xaaafaaaf,0xaaafaaaf,0xaaaf999f,0xaaafaaaf,0x999fbbbf,0xbbbf888f,0xbbbfaaaf,0xaaaf999f,0xaaafaaaf,0xaaafaaaf,0xaaaf999f,0xaaafaaaf,0x999fbbbf,0x732f943f,0x732f732f,0x732f732f,0xcccf632f,0x732f943f,0x732f732f,0x732f732f,0xdddf832f, +0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0x888fd41f,0x921f555f,0x888fd41f,0x921f888f,0x555fd41f,0x921f888f,0x555fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x00000000,0x0000ffff,0xffff0000,0x0000ffff,0x00000000,0xffffffff,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x543f180f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x160f0000,0x180f180f,0x160f160f,0x00000000,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x00000000,0x00000000,0x962f0000,0x530f962f,0x0000060f,0x00000000,0x00000000, +0xaaafaaaf,0x777f888f,0xaaafbbbf,0x999f999f,0x999f777f,0x888f999f,0x999faaaf,0xaaaf888f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x777f777f,0x777f777f,0x753f964f,0xb85f532f,0x532f753f,0x532f753f,0x753f753f,0x532f753f,0x753f753f,0x964f964f,0x753f964f,0xb85f532f,0x532f753f,0x532f753f,0x753f753f,0x532f753f,0x753f753f,0x964f964f, +0xb96fb96f,0x984f984f,0xb96f984f,0x984fb96f,0xb96fb96f,0xb95f984f,0xb96fb96f,0xb96fb96f,0xaaafcccf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0xbbbfbbbf,0xaaafaaaf,0x888faaaf,0xaaaf888f,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0xbbbfbbbf,0xaaafaaaf,0x888faaaf,0x521f943f,0x732f842f,0x732f732f,0xdddf732f,0x732f943f,0x732f732f,0x732f842f,0xdddf832f, +0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0xc31fd41f,0x921fa31f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0x888fd41f,0x921f888f,0xffff0000,0x00000000,0x00000000,0xffffffff,0xffffffff,0x00000000,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x543f0000,0x0000160f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x180f160f,0x0000160f,0x00000000,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x00000000,0x00000000,0x962f0000,0x530f962f,0x00000000,0x00000000,0x00000000, +0x999f888f,0x777f888f,0x999faaaf,0xbbbf999f,0xbbbf888f,0x888f777f,0x999f888f,0x999f888f,0x777f777f,0x777f777f,0x888f666f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x753f964f,0x964fb85f,0x753f964f,0x964f888f,0x964f964f,0x753f753f,0x964f964f,0x532f753f,0x753f964f,0x964fb85f,0x753f964f,0x964f888f,0x964f964f,0x753f753f,0x964f964f,0x532f753f, +0x753f753f,0x763f753f,0x653f653f,0x653f763f,0x753f753f,0x653f753f,0x653f432f,0x753f653f,0x888faaaf,0x888f888f,0x999f777f,0x888f999f,0x888f888f,0x888f888f,0x888f888f,0x888f888f,0x888f888f,0x888f888f,0x999f777f,0x888f999f,0x888f888f,0x888f888f,0x888f888f,0x888f888f,0xbbbfbbbf,0xbbbfaaaf,0xbbbfbbbf,0xdddfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xcccfbbbf, +0xb31fc31f,0x921fa31f,0xb31fc31f,0x921fa31f,0xb31fc31f,0x921fa31f,0xb31fc31f,0x921fa31f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0x921fa31f,0x921f921f,0x0000ffff,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0xffff0000, +0x00000000,0x00000000,0x00000000,0x00000000,0x0000160f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x180f0000,0x0000160f,0x00000000,0x00000000,0x00000000,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x02ff02ff,0x00000000,0x00000000,0x00000000,0x530f0000,0x530f962f,0x00000000,0x00000000,0x00000000, +0xbbbfbbbf,0xaaafbbbf,0x777f999f,0x555f666f,0xbbbf555f,0xbbbfbbbf,0x555f888f,0x888fbbbf,0x333f555f,0x333f333f,0x555f333f,0x999f999f,0x999f000f,0x333f555f,0x333f333f,0x555f333f,0xddaf995f,0xdd9fdd9f,0xdd9fdd9f,0xdd9fdc9f,0xddafedaf,0xdd9fdd9f,0xdc9fdc9f,0xdd9fcc8f,0xbbbf554f,0x988f656f,0x988f988f,0x656f988f,0x656f777f,0x988f988f,0xa99f887f,0x988f766f, +0x653f432f,0x974f653f,0x653f331f,0x432f974f,0x653f653f,0x763f653f,0x763f653f,0x974f653f,0x653f653f,0x653f321f,0x653f653f,0x321f321f,0x653f321f,0x321f653f,0x653f653f,0x653f653f,0xaaafaaaf,0xbbbfaaaf,0xdddfcccf,0xdddfdddf,0xdddfdddf,0xdddfdddf,0xdddfdddf,0xeeefdddf,0xc81fc82f,0xda2fc91f,0xec3fdb2f,0xec3fed3f,0xec3fec3f,0xed4fed4f,0xed4fed4f,0xfe5ffd5f, +0x087f087f,0x098f087f,0x0bbf0aaf,0x0bbf0cbf,0x0bbf0bbf,0x0cbf0cbf,0x1ccf0ccf,0x4ddf1ccf,0x322f221f,0x322f322f,0x332f322f,0x332f332f,0x332f322f,0x332f332f,0x332f332f,0x221f332f,0x432f433f,0x432f432f,0x433f432f,0x433f433f,0x433f432f,0x433f433f,0x433f433f,0x322f433f,0x432f433f,0x432f432f,0x433f432f,0x433f433f,0x433f432f,0x433f433f,0x433f433f,0x322f433f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xbbbfbbbf,0x777f666f,0x555f222f,0xbbbfbbbf,0x777f555f,0x777f888f,0x333f999f,0x999f666f,0x555f555f,0x999f999f,0x999f999f,0x999f999f,0x999f333f,0x999f999f,0x555f000f,0x333f555f,0xdd9fddaf,0xedbfedaf,0xdc9fbb8f,0xdc9fdc9f,0xedafcb8f,0xdd9fffdf,0xdd9fdc9f,0xeeafdd9f,0x988f877f,0xbaaf988f,0xa9af878f,0x656f999f,0xbaafbaaf,0x988f665f,0xa99f544f,0x988f867f, +0x652f331f,0x321f653f,0x974f331f,0x653f432f,0x331f974f,0x974f653f,0x763f432f,0x974f432f,0xb95f653f,0xb95fb85f,0xb95fb95f,0xb95fb95f,0xb85fa85f,0xb95fb95f,0xb96fb95f,0x642fb95f,0xeeefdddf,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xdddfeeef,0xfe6fec4f,0xfe5ffe5f,0xff5fff5f,0xff5fff5f,0xff5fff5f,0xff5fff5f,0xff5fff5f,0xec3fff4f, +0x6ddf0bbf,0x6edf6ddf,0x8eef8eef,0x8eef8eef,0x7edf7edf,0x8eef8eef,0x7edf7edf,0x0bbf7edf,0x862f332f,0x962f962f,0x962f962f,0x752f752f,0x752f752f,0x962f752f,0x962f752f,0x322f862f,0xa72f433f,0xa61fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72f861f,0xa72f861f,0x221fa72f,0xa72f433f,0xa61fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72f861f,0xa72f861f,0x221fa72f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x777f555f,0x222f777f,0xbbbf555f,0x888fbbbf,0x222f333f,0x777f888f,0x555f333f,0x888f555f,0x000f555f,0x333f333f,0x333f000f,0x333f333f,0x333f999f,0x555f555f,0x999f555f,0x555f555f,0xeebfedaf,0xdc9ffecf,0xdd9fdd9f,0xdd9fdd9f,0xedafdd9f,0xedbfedaf,0xcc9fcc8f,0xfecfdc9f,0x766f876f,0xbaaf656f,0x888fbaaf,0x877fbbbf,0x544f656f,0xcbbf666f,0x876fcbbf,0x656f656f, +0x542f321f,0x432f642f,0x974f653f,0x653f331f,0x321f974f,0x763f653f,0x763f432f,0x974f432f,0xb95f321f,0x984f984f,0x974f984f,0x984f984f,0x984fa85f,0x984f984f,0xa85f984f,0x653fb95f,0xeeefdddf,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xdddfeeef,0xff6fed4f,0xff5fff5f,0xff5fff5f,0xff5fff5f,0xff5fff5f,0xff4fff5f,0xff4fff4f,0xec2fff3f, +0x8eef0cbf,0x8eef8eef,0x8eef9eef,0x8eef8eef,0x8eef8eef,0x8eef8eef,0x6ddf7edf,0x0bbf5ddf,0x962f332f,0x861f861f,0x861f861f,0xa72fa72f,0xa72fa72f,0xa72fa72f,0xa72fa61f,0x322f962f,0xa72f433f,0x861f861f,0x861f861f,0xa72fa72f,0xa72fa72f,0xa72fa72f,0xa72fa61f,0x221fa72f,0xa72f433f,0x861f861f,0x861f861f,0x851fa72f,0xa72f862f,0xa72fa72f,0xa72fa61f,0x221fa72f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x0000f60f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf60f0000, +0x444f777f,0x555f333f,0x666fbbbf,0x777f999f,0x555f333f,0x333f333f,0xaaaf555f,0x555fbbbf,0x999f555f,0x555f555f,0x000f555f,0x999f555f,0x555f555f,0x333f333f,0x333f333f,0x555f333f,0xdc9fcc8f,0xddafdd9f,0xddafdc9f,0xcc9fdc9f,0xdc9fdc9f,0xedafdd9f,0xdd9fdd9f,0xbb8fdd9f,0x777f888f,0xbaafbbbf,0x988f988f,0x656f877f,0x888f888f,0x766f998f,0x766f766f,0xa99fbaaf, +0x432f653f,0x432f642f,0x763f763f,0x653f331f,0x321f974f,0x974f653f,0x974f331f,0x763f432f,0xb95f653f,0xb95fa85f,0xb96fb96f,0xb96fb96f,0xb95fb96f,0xb95fb96f,0x984fb96f,0x321fb95f,0xeeefdddf,0xeeefeeef,0xeeefeeef,0xffffffff,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xdddfeeef,0xff5fed4f,0xff5fff5f,0xff5fff5f,0xff5fff5f,0xff5fff5f,0xff4fff4f,0xff4fff4f,0xec3fff4f, +0x9eef0cbf,0x8eef9eef,0x9eef8eef,0x9eef9eef,0x8eef9eef,0x8eef8eef,0x7edf7edf,0x0bbf7edf,0x862f322f,0xa61fa62f,0xa61fa61f,0xa61fa61f,0xa61fa61f,0xa62fa62f,0xa62fa62f,0x322f962f,0xa62f433f,0xa61fa62f,0xa61fa61f,0xa61fa61f,0xa61fa61f,0xa62fa62f,0xa62fa62f,0x221fa61f,0xa62f433f,0xa61fa62f,0xa61fa61f,0xcccf851f,0x851faaaf,0xa62fa62f,0xa62fa62f,0x221fa61f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x0000f60f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf60f0000, +0xbbbfbbbf,0x555f555f,0x888fbbbf,0x333f888f,0xaaaf555f,0x999f999f,0x777f555f,0x555faaaf,0x999f555f,0x333f999f,0x333f333f,0x333f333f,0x333f333f,0x999f999f,0x999f999f,0x000f999f,0xdc9fedaf,0xdc9fedbf,0xedbfedbf,0xedbfedaf,0xcc9fedaf,0xedafdc9f,0xcb8fdc9f,0xcc8fddaf,0xa99f656f,0x544f544f,0x555f999f,0x656f777f,0x766f999f,0xaaaf655f,0x888f988f,0x988faaaf, +0x432f653f,0x653f653f,0x763f763f,0x653f653f,0x432f653f,0x974f653f,0x974f331f,0x763f321f,0xb85f432f,0xb96f984f,0xb95fb95f,0xb95fb95f,0xb95fb95f,0xb95fb95f,0x984fb96f,0x653fb95f,0xffffdddf,0xeeefeeef,0xffffeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xdddfeeef,0xff5fed4f,0xff5fff5f,0xff4fff4f,0xff5fff4f,0xff5fff5f,0xff4fff4f,0xff4fff4f,0xed3fff4f, +0x9eef0cbf,0x9eef8eef,0x9eef8eef,0x9eef9eef,0x9eef9eef,0x7edf8eef,0x7edf7edf,0x0cbf7edf,0x752f332f,0x861f861f,0xa72f861f,0x861fa72f,0x861fa72f,0xa61f861f,0xa72fa72f,0x332f962f,0x752f433f,0x752f752f,0x962f752f,0x752f962f,0x752f962f,0x962f752f,0x962f962f,0x221f962f,0x752f433f,0x752f752f,0x962f752f,0xcccf752f,0x531f888f,0x962f752f,0x962f962f,0x221f962f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x0000f60f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf60f0000, +0x888f777f,0x555f777f,0x888f777f,0x333f777f,0xcccfaaaf,0x888f777f,0x555f666f,0x333f222f,0x333f333f,0x555f555f,0x333f555f,0x333f333f,0x000f555f,0x555f555f,0x333f333f,0x555f000f,0xddafcc8f,0xffffcc9f,0xeeafdc9f,0xddafddaf,0xfebfdd9f,0xcb8fdd9f,0xdc9fcc9f,0xcb8fdd9f,0xbbbf999f,0xa99f767f,0xaaaf778f,0x444f877f,0x765f444f,0xbbbf877f,0x555fcbcf,0x444f666f, +0x542f653f,0x653f653f,0x653f974f,0x653f653f,0x331f653f,0x864f653f,0x763f331f,0x653f432f,0xb95f321f,0xb96f984f,0x984fb95f,0xa85fa85f,0x984f984f,0xb95f984f,0x984fb95f,0x653fb95f,0xffffdddf,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xdddfeeef,0xff5fed4f,0xff4fff5f,0xff4fff4f,0xff4fff4f,0xff5fff5f,0xff4fff4f,0xff4fff4f,0xed3fff4f, +0x9eef0cbf,0x6ddf9eef,0x8eef6ddf,0x8eef8eef,0x8eef8eef,0x8eef8eef,0x7edf8eef,0x0cbf7edf,0x752f322f,0xa72fa61f,0xa72fa72f,0x861fa72f,0xa72fa72f,0xa72fa72f,0x861f861f,0x322f752f,0x322f432f,0x332f322f,0x332f332f,0x322f332f,0x332f332f,0x332f332f,0x322f322f,0x111f322f,0x322f432f,0x332f322f,0x332f332f,0xaaaf221f,0x221f777f,0x332f332f,0x322f322f,0x111f322f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x0000f60f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf00f0000, +0x777f777f,0x555f777f,0x333f666f,0x666f333f,0x888f666f,0x777faaaf,0x777f777f,0x555f777f,0x999f999f,0x666f555f,0x333f555f,0x999f999f,0x555f555f,0x555f555f,0x999f999f,0x000f999f,0xddafbb7f,0xdd9fcb9f,0xedafbb8f,0xdc9fdd9f,0xdd9fdc9f,0xffcfedbf,0xedafdd9f,0xdcafddaf,0xa99fa99f,0x988f777f,0xa99f988f,0xbaaf878f,0x766f998f,0x444f877f,0x888f444f,0x656f888f, +0x763f653f,0x653f432f,0x642f974f,0x321f653f,0x321f974f,0x542f763f,0x763f321f,0x653f331f,0xb95f321f,0xb96f984f,0x984fb95f,0xb96fb96f,0xb96fb96f,0xb95f984f,0x984fb95f,0x321fb95f,0xeeefdddf,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xdddfeeef,0xff5fed4f,0xff4fff5f,0xff4fff4f,0xff4fff4f,0xff4fff4f,0xff4fff4f,0xff4fff4f,0xec3fff4f, +0x9eef0cbf,0x8eef8eef,0x7edf8eef,0x8eef8eef,0x8eef8eef,0x8eef8eef,0x7edf8eef,0x0cbf6edf,0x962f332f,0xa72fa72f,0xa72fa72f,0x861fa72f,0x861f861f,0xa72fa61f,0xa72fa72f,0x332f962f,0x753f433f,0x752f753f,0x753f753f,0x652f753f,0x652f652f,0x753f752f,0x753f753f,0x221f753f,0x753f433f,0x752f753f,0x753f753f,0x999f642f,0x431f777f,0x753f752f,0x753f753f,0x221f753f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x0000f60f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf00ff60f, +0x777f777f,0x555f333f,0xbbbfaaaf,0x555f555f,0x444f555f,0x888f333f,0x333f777f,0xcccf666f,0x555f555f,0x333f555f,0x333f333f,0x333f333f,0x000f333f,0x333f333f,0x333f333f,0x555f555f,0xdd9fdd9f,0xdd9fedaf,0xdc9fdd9f,0xffbfedaf,0xdc9fddaf,0xdc9fdd9f,0xedafddaf,0xedafdc9f,0x656f656f,0xbbbfbbbf,0x888faaaf,0x444f988f,0xa88f656f,0x656f888f,0x666f877f,0x767f778f, +0x974f653f,0x653f331f,0x331f974f,0x432f974f,0x321f974f,0x432f763f,0x763f653f,0x653f331f,0xb95f321f,0xca6f984f,0x984fb95f,0xb95fb96f,0xb96fb95f,0xa85fa84f,0x984fb96f,0x753fb95f,0xffffdddf,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xdddfeeef,0xff6fed3f,0xff4fff5f,0xff4fff4f,0xff4fff4f,0xff4fff4f,0xff4fff4f,0xff4fff4f,0xec3fff3f, +0x9eef0cbf,0x8eef8eef,0x6ddf6ddf,0x6ddf6ddf,0x6edf6ddf,0x7edf7edf,0x7edf8eef,0x0bbf5ddf,0x962f322f,0xa62fa62f,0xa62fa62f,0xa61fa62f,0xa61fa61f,0xa62fa62f,0xa62fa62f,0x322f962f,0x962f432f,0x862f862f,0x862f862f,0x962f862f,0x962f962f,0x862f862f,0x862f862f,0x221f852f,0x962f432f,0x862f862f,0x862f862f,0x641f741f,0x751f641f,0x862f862f,0x862f862f,0x221f852f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf60ff00f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf00ff60f, +0x222f777f,0xbbbf555f,0x777fbbbf,0xbbbf666f,0x777faaaf,0x444f555f,0x222f333f,0xbbbfcccf,0x999f555f,0x000f999f,0x333f999f,0x555f555f,0x999f555f,0x999f999f,0x999f999f,0x999f999f,0xddafedaf,0xedafeebf,0xdc9fedaf,0xddafedbf,0xffdffebf,0xdd9fcb8f,0xdcafdc9f,0xdd9fdc9f,0x555f666f,0x544f544f,0x988f988f,0x877faa9f,0x655f999f,0x988f656f,0x656fbaaf,0x566f988f, +0x974f653f,0x753f331f,0x432f974f,0x432f653f,0x432f653f,0x321f974f,0x653f653f,0x763f331f,0xb95f653f,0xb96fa95f,0x984fb95f,0xb95fb96f,0xb96fb95f,0xb95f984f,0x984fb96f,0x653fb95f,0xffffdddf,0xeeefffff,0xeeefffff,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xcccfeeef,0xff6fed4f,0xff4fff6f,0xff4fff6f,0xff4fff4f,0xff4fff4f,0xff4fff4f,0xfe3fff4f,0xec2ffe3f, +0x9eef0cbf,0x8eefaeef,0x6ddfaeef,0x6ddf6ddf,0x6ddf6ddf,0x6ddf6ddf,0x5ddf6ddf,0x0bbf3dcf,0x962f332f,0xa72fa72f,0xa61fa72f,0xa72f861f,0xa72fa72f,0xa72fa72f,0xa72fa72f,0x322f962f,0xa72f433f,0xa72fa72f,0xa61fa72f,0xa72f861f,0xa72fa72f,0xa72fa72f,0xa72fa72f,0x221f962f,0xa72f433f,0xa72fa72f,0xa61fa72f,0xa72f861f,0xa72fa72f,0xa72fa72f,0xa72fa72f,0x221f962f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf60ff00f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf00ff60f, +0x555f888f,0xbbbfbbbf,0x333f888f,0x666fbbbf,0x999fbbbf,0x555f999f,0xcccf555f,0x777f777f,0x333f555f,0x333f333f,0x333f333f,0x555f333f,0x555f000f,0x333f555f,0x333f333f,0x555f999f,0xba7fcb8f,0xdd9fedaf,0xddafdd9f,0xdc9fedaf,0xdd9fdd9f,0xeebfdd9f,0xedafdd9f,0xeeafcb8f,0x656f988f,0xaaafaaaf,0x656f877f,0xcbcfcbcf,0x877f444f,0x765fbbbf,0x988f877f,0x444f666f, +0x974f653f,0x653f432f,0x974f653f,0x653f432f,0x321f653f,0x432f974f,0x974f653f,0x763f432f,0xb95f653f,0xb96f984f,0x974fb85f,0xb96fb96f,0xb96fb96f,0xb95f984f,0x984fb96f,0x653fb95f,0xffffdddf,0xeeefffff,0xffffffff,0xffffeeef,0xffffffff,0xffffffff,0xeeefffff,0xdddfeeef,0xff6fed4f,0xff4fff6f,0xff6fff6f,0xff5fff5f,0xff5fff5f,0xff5fff5f,0xff5fff5f,0xec3fff4f, +0x9eef0cbf,0x8eefaeef,0x9eef9eef,0x9eef9eef,0x9eef9eef,0x9eef9eef,0x8eef9eef,0x0cbf8eef,0x752f322f,0x861f861f,0xa72f861f,0xa72fa72f,0x861f861f,0xa61f861f,0x861fa72f,0x322f752f,0x861f432f,0x861f861f,0xa72f861f,0xa72fa72f,0x861f861f,0xa61f861f,0x861fa72f,0x221f752f,0x861f432f,0x861f861f,0xa72f861f,0xa72fa72f,0x861f861f,0xa61f861f,0x861fa72f,0x221f752f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf60ff00f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf00ff60f, +0xaaaf555f,0x777f777f,0x333f777f,0x999fbbbf,0x777f777f,0x333f888f,0x555f555f,0x888f999f,0x555f555f,0x333f999f,0x999f333f,0x333f999f,0x333f000f,0x999f999f,0x555f999f,0x555f555f,0xedafddaf,0xedafaa6f,0xeebfcc8f,0xdcafdd9f,0xfebffebf,0xdc9feeaf,0xdd9fdd9f,0xdd9fdd9f,0xbaaf656f,0x444fbaaf,0x544fa88f,0x766f665f,0x766f988f,0x988f656f,0x776f877f,0x655fbbbf, +0x763f432f,0x653f432f,0x974f653f,0x642f321f,0x542f331f,0x432f975f,0x974f653f,0x974f432f,0xb85f653f,0xb95f984f,0x984fb95f,0x984f984f,0x984f984f,0xb95f984f,0x984fb96f,0x653fb95f,0xffffdddf,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xeeefffff,0xcccfeeef,0xff7fed4f,0xff7fff7f,0xff6fff6f,0xff6fff6f,0xff6fff6f,0xff5fff5f,0xff5fff5f,0xec3ffe4f, +0xaeef0cbf,0xaeefaeef,0xaeefaeef,0xaeefaeef,0xaeefaeef,0xaeef9eef,0x8eef9eef,0x0baf6ddf,0x962f332f,0xa72fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72fa72f,0xa72fa72f,0x322f962f,0xa72f433f,0xa72fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72fa72f,0xa72fa72f,0x221f962f,0xa72f433f,0xa72fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72fa72f,0xa72fa72f,0x221f962f, +0x00000000,0x00000000,0x00000000,0xf22ff22f,0xe11ff22f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xc97fc97f,0x965fc97f,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf60ff00f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf00ff60f, +0x555f555f,0x777faaaf,0x333f666f,0x888f777f,0x777f999f,0x555f333f,0x555faaaf,0x333f555f,0x555f000f,0x555f555f,0x555f333f,0x555f555f,0x999f999f,0x555f555f,0x999f555f,0x000f999f,0xedafcc9f,0xcb9fedaf,0xdc9fddaf,0xdd9fdd9f,0xdd9fddaf,0xffcfdd9f,0xdc9fdc9f,0xbb7fdc9f,0xbaaf656f,0x655fbaaf,0x888f765f,0x555f777f,0x544fa99f,0x544faaaf,0x656f655f,0x988f777f, +0x763f331f,0x653f331f,0x974f653f,0x974f432f,0x542f321f,0x331f974f,0x974f653f,0x974f321f,0xb85f321f,0xb96f984f,0xb95fb85f,0xb85fb95f,0xb95fb95f,0xb95fb95f,0xa85fb96f,0x652fb95f,0xffffdddf,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xeeefffff,0xeeefeeef,0xcccfdddf,0xff7fed5f,0xff7fff7f,0xff7fff7f,0xff6fff7f,0xff6fff6f,0xff5fff6f,0xfe4ffe4f,0xeb2ffd4f, +0xaeef0cbf,0xaeefaeef,0xaeefaeef,0xaeefaeef,0x9eefaeef,0x8eef9eef,0x3dcf5ddf,0x0baf2dcf,0x862f322f,0xa61fa61f,0xa62fa62f,0xa61fa62f,0xa61fa61f,0xa61fa61f,0xa62fa62f,0x322f862f,0xa62f432f,0xa61fa61f,0xa62fa62f,0xa61fa62f,0xa61fa61f,0xa61fa61f,0xa62fa62f,0x221f862f,0xa62f432f,0xa61fa61f,0xa62fa62f,0xa61fa62f,0xa61fa61f,0xa61fa61f,0xa62fa62f,0x221f862f, +0x00000000,0x00000000,0xf22f0000,0xe11fffff,0xc12fe11f,0x0000911f,0x00000000,0x00000000,0x00000000,0x00000000,0xc97f0000,0x965fc97f,0x965f965f,0x0000754f,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf00ff00f,0x0000f60f,0x00000000,0x00000000,0x00000000,0x00000000,0xf60f0000,0xf00ff00f, +0xbbbfbbbf,0x333f333f,0x333f333f,0x777f666f,0x333f444f,0x999fbbbf,0x777f777f,0x555f555f,0x333f555f,0x333f333f,0x333f333f,0x333f333f,0x999f999f,0x333f333f,0x333f333f,0x555f333f,0xddafeebf,0xeebfdc9f,0xdc9fddaf,0xbb7fedaf,0xdd9fcb8f,0xdc9fdd9f,0xedafedaf,0xdc9fdc9f,0xa99fbaaf,0x545f988f,0xbaafbaaf,0x877fa9af,0x999faaaf,0xaaaf877f,0x554fa99f,0x887f877f, +0x974f321f,0x653f321f,0x974f653f,0x653f321f,0x652f331f,0x321f974f,0x642f653f,0x974f432f,0xb95f321f,0xb96f984f,0xb95fb96f,0xb96fb96f,0xb96fb96f,0xb96fb96f,0x984fb96f,0x321fb95f,0xffffdddf,0xffffffff,0xffffffff,0xffffffff,0xeeefffff,0xeeefeeef,0xdddfdddf,0xcccfdddf,0xff7fed5f,0xff7fff7f,0xff7fff7f,0xff6fff6f,0xff6fff6f,0xfe4fff5f,0xfd3ffd3f,0xeb2ffd3f, +0xaeef0cbf,0xaeefaeef,0xaeefaeef,0xaeefaeef,0x8eef9eef,0x5ddf7edf,0x0ccf1ccf,0x0baf0cbf,0x962f332f,0xa72fa72f,0x861fa72f,0x861fa72f,0x861f861f,0x861f861f,0xa61fa72f,0x332f962f,0xa72f433f,0xa72fa72f,0x861fa72f,0x861fa72f,0x861f861f,0x861f861f,0xa61fa72f,0x221f962f,0xa72f433f,0xa72fa72f,0x861fa72f,0x861fa72f,0x861f861f,0x861f861f,0xa61fa72f,0x221f962f, +0x00000000,0x00000000,0xe11ff22f,0xe11fe11f,0xcccfe11f,0x911f911f,0x00000000,0x00000000,0x00000000,0x00000000,0x965f0000,0x965f965f,0x754f965f,0x0000754f,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf60ff00f,0x0000f00f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf00ff60f, +0x777fbbbf,0xbbbf777f,0xbbbfaaaf,0x333f555f,0xcccf666f,0x777faaaf,0x777f999f,0x333f888f,0x999f555f,0x999f333f,0x555f000f,0x333f555f,0x333f333f,0x333f000f,0x555f555f,0x999f999f,0xedafffdf,0xba7fcc8f,0xdc9fdc9f,0xfebfdc9f,0xfebfedaf,0xddafedaf,0xdd9fedaf,0xdc9fedaf,0x998fbaaf,0xbaafbbbf,0x877fa99f,0xaaaf999f,0x877f888f,0x988f999f,0xb99f555f,0x544fbbbf, +0x653f432f,0x653f542f,0x763f653f,0x653f432f,0x642f653f,0x331f653f,0x974f653f,0x321f974f,0xb95f321f,0x984f974f,0x984fa85f,0x984f984f,0xa84f974f,0xa85f984f,0xa85fa85f,0x321fb85f,0xffffdddf,0xeeefffff,0xffffffff,0xffffffff,0xeeefeeef,0xeeefeeef,0xdddfdddf,0xcccfdddf,0xff6fed4f,0xff6fff6f,0xff6fff6f,0xff6fff6f,0xff5fff5f,0xfe3ffe4f,0xfd3ffd3f,0xeb2ffd3f, +0xaeef0cbf,0x9eef9eef,0xaeefaeef,0x9eefaeef,0x7edf8eef,0x2dcf4ddf,0x0ccf1ccf,0x0baf0ccf,0x752f332f,0xa72fa61f,0xa72fa72f,0x861fa72f,0xa72fa72f,0x861fa72f,0x861f861f,0x332f752f,0x861f433f,0xa72fa61f,0xa72fa72f,0x861fa72f,0xa72fa72f,0x861fa72f,0x861f861f,0x221f752f,0x861f433f,0xa72fa61f,0xa72fa72f,0x861fa72f,0xa72fa72f,0x861fa72f,0x861f861f,0x221f752f, +0x00000000,0x00000000,0xe11fcccf,0xcccfc12f,0x911fc12f,0x999f911f,0x00000000,0x00000000,0x00000000,0x00000000,0x965f0000,0x754f754f,0x754f754f,0x0000754f,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf60ff00f,0x00000000,0x0000f00f,0x0000f60f,0x00000000,0xf60f0000,0x0000f60f,0xf00ff00f, +0x888f777f,0xaaaf444f,0x777f888f,0x555f777f,0x555f555f,0x999f777f,0x999f888f,0x333f333f,0x555f555f,0x333f555f,0x333f333f,0x333f333f,0x555f555f,0x999f999f,0x333f555f,0x555f333f,0xdcafedaf,0xcc9fdc9f,0xdc9fddaf,0xedafdd9f,0xddafba7f,0xdd9fbb7f,0xcb9fedaf,0xedafcc9f,0x776f998f,0x877f666f,0x999f656f,0x544f877f,0xbaafbbbf,0xa99f887f,0x655f877f,0x877f766f, +0x653f321f,0x432f974f,0x763f653f,0x331f432f,0x653f974f,0x321f974f,0x763f652f,0x653f331f,0xb95f432f,0xb95fb95f,0xb95fb95f,0xa85fa85f,0xb95fb95f,0xb95fa85f,0xb95fb95f,0x653fb95f,0xffffdddf,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xdddfeeef,0xdddfdddf,0xcccfdddf,0xff5fed4f,0xff5fff5f,0xff5fff5f,0xff5fff5f,0xff5fff5f,0xfd3ffe4f,0xfc2ffd3f,0xeb2ffc2f, +0x9eef0cbf,0x7edf8eef,0x8eef8eef,0x7edf8eef,0x6edf7edf,0x0ccf3dcf,0x0cbf0cbf,0x0a9f0cbf,0x862f332f,0x752f752f,0x962f752f,0x752f962f,0x962f962f,0x962f752f,0x962f962f,0x332f862f,0x962f433f,0x752f752f,0x962f752f,0x752f962f,0x962f962f,0x962f752f,0x962f962f,0x221f862f,0x962f433f,0x752f752f,0x962f752f,0x752f962f,0x962f962f,0x962f752f,0x962f962f,0x221f862f, +0x00000000,0x00000000,0xc12f0000,0x911f911f,0x911f911f,0x0000911f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x655f0000,0x0000443f,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf60ff00f,0xf60ff00f,0xf60ff00f,0x0000f00f,0xf00f0000,0xf00ff60f,0xf60ff00f,0xf00ff00f, +0x777f777f,0x444f777f,0x222f222f,0x555f333f,0x888faaaf,0x555f555f,0x444f444f,0x666f333f,0x333f333f,0x333f333f,0x999f000f,0x555f999f,0x555f555f,0x333f555f,0x333f333f,0x555f555f,0xedafdc9f,0xcb8fdd9f,0xddafffdf,0xeebfcc8f,0xfebfdd9f,0xdc9fdc9f,0xdd9fdc9f,0xcc8fdd9f,0x988f544f,0xa99f444f,0x656f988f,0x988f544f,0x544f544f,0xa98f444f,0x656fbaaf,0x999fb88f, +0x653f542f,0x331f763f,0x653f642f,0x432f653f,0x653f653f,0x321f653f,0x653f653f,0x763f652f,0x653f653f,0x653f321f,0x653f653f,0x653f321f,0x653f653f,0x653f653f,0x321f321f,0x653f321f,0xeeefeeef,0xeeefeeef,0xdddfdddf,0xdddfdddf,0xdddfdddf,0xdddfdddf,0xdddfdddf,0xcccfdddf,0xff4fff4f,0xfe4ffe4f,0xfd3ffd3f,0xfc3ffd3f,0xfd3ffc3f,0xfc3ffc3f,0xfc3ffc3f,0xfb3ffc3f, +0x6ddf7edf,0x4ddf5ddf,0x1ccf2dcf,0x0cbf0cbf,0x0ccf0cbf,0x0cbf0cbf,0x0cbf0cbf,0x0bbf0bbf,0x322f221f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x211f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x211f221f, +0x00000000,0x00000000,0x00000000,0x744f0000,0x0000522f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x655f0000,0x0000443f,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f, +0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x888f666f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x888f666f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x888f666f,0x777f777f,0x777f777f,0x777f777f,0xb96fb96f,0xb95fb96f,0xb96fb96f,0x984fb96f,0x984f984f,0xb96f753f,0xb96fb96f,0x984fb96f, +0xbbbfbbbf,0xaaafbbbf,0x777f999f,0x141f242f,0xbbbf555f,0xbbbfbbbf,0x555f888f,0x888fbbbf,0x111f111f,0x001f111f,0x111f001f,0x001f001f,0x000f111f,0x111f001f,0x111f112f,0x111f000f,0x324f436f,0x038f000f,0x325f018f,0x112f325f,0x001f112f,0x000f038f,0x112f112f,0x112f000f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x432f433f,0x432f432f,0x433f432f,0x433f433f,0x433f432f,0x433f433f,0x433f433f,0x221f433f,0x432f433f,0x432f432f,0x433f432f,0x433f433f,0x433f432f,0x433f433f,0x433f433f,0x322f433f,0x110f110f,0x110f000f,0x110f110f,0x000f000f,0x110f000f,0x000f110f,0x110f110f,0x110f110f, +0x333f333f,0x333f333f,0x222f333f,0x222f222f,0x333f222f,0x333f333f,0x222f222f,0x333f333f,0x333f333f,0x333f333f,0x222f333f,0x222f222f,0x333f222f,0x333f333f,0x222f222f,0x333f333f,0x333f333f,0x333f333f,0x222f333f,0x222f222f,0x333f222f,0x333f333f,0x222f222f,0x333f333f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x777f777f,0x888f888f,0x888f888f,0x888f888f,0x888f777f,0x888f888f,0x777f666f,0x777f777f,0x777f777f,0x888f888f,0x888f888f,0x888f888f,0x888f777f,0x888f888f,0x777f666f,0x777f777f,0x777f777f,0x888f888f,0x888f888f,0x888f888f,0x888f777f,0x888f888f,0x777f666f,0x777f777f,0x221fb96f,0x211f211f,0x211f211f,0x570f781f,0x221f221f,0x211f211f,0x211f211f,0x984f221f, +0xbbbfbbbf,0x777f666f,0x141f222f,0x383f383f,0x777f141f,0x777f888f,0x121f999f,0x999f666f,0x111f001f,0x000f000f,0x111f000f,0x111f001f,0x325f000f,0x111f111f,0x000f111f,0x111f335f,0x324f436f,0x038f213f,0x325f018f,0x112f325f,0x325f112f,0x324f325f,0x001f324f,0x325f325f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa72f433f,0xa61fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72f861f,0xa72f861f,0x861f861f,0x861f861f,0xa61fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72f861f,0xa72f861f,0x221fa72f,0xb95f110f,0x221fb85f,0xa74fa74f,0xa74fa74f,0xa74fa64f,0xa74fa74f,0xb96f221f,0x110fb95f, +0x666f333f,0x666f555f,0x555f444f,0x777f777f,0x666f444f,0x666f666f,0x444f555f,0x333f555f,0x666f333f,0x666f555f,0x555f444f,0x777f777f,0x666f444f,0x666f666f,0x444f555f,0x333f555f,0x666f333f,0x666f555f,0x555f444f,0x777f777f,0x666f444f,0x666f666f,0x444f555f,0x333f555f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x666f777f,0x777f777f,0x777ffe4f,0x777f777f,0x777f888f,0x777f777f,0xfe4fffbf,0x777f777f,0x666f777f,0x777f777f,0x777fb98f,0x777f777f,0x777f888f,0x777f777f,0xb98fda9f,0x777f777f,0x666f777f,0x777f777f,0x777f333f,0x777f777f,0x777f888f,0x777f777f,0x333f333f,0x777f777f,0xb11fb96f,0x221f911f,0x247f358f,0x570f781f,0x321f321f,0x781f321f,0x321f570f,0x984f431f, +0x777f141f,0x121f777f,0x383f141f,0x262fbbbf,0x010f333f,0x777f888f,0x141f121f,0x888f141f,0x000f111f,0x335f325f,0x001f335f,0x000f001f,0x112f335f,0x001f111f,0x335f000f,0x111f112f,0x324f000f,0x038f038f,0x213f213f,0x112f112f,0x112f000f,0x213f213f,0x325f324f,0x038f038f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa72f433f,0x861f861f,0x861f861f,0xa72fa72f,0xa72fa72f,0xa72fa72f,0xa72fa61f,0x531fa72f,0xa72f531f,0x861f861f,0x861f861f,0xa72fa72f,0xa72fa72f,0xa72fa72f,0xa72fa61f,0x221fa72f,0xb95f000f,0xa63f211f,0x963fa63f,0xa63fa63f,0xa63fa74f,0xa63fa63f,0x221fa63f,0x110fb95f, +0x555f222f,0x555f777f,0x888f666f,0x777f888f,0x555f666f,0x777f888f,0x777f555f,0x333f555f,0x555f222f,0x555f777f,0x888f666f,0x777f888f,0x555f666f,0x777f888f,0x777f555f,0x333f555f,0x555f222f,0x555f777f,0x555f666f,0x777f555f,0x555f666f,0x777f888f,0x777f555f,0x333f555f,0x0000f60f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf60f0000, +0x888f777f,0x777f777f,0x666f777f,0xffbf777f,0x777ffa2f,0x777f777f,0x777f777f,0x777f777f,0x888f777f,0x777f777f,0x666f777f,0xda9f777f,0x777fa87f,0x777f777f,0x777f777f,0x777f777f,0x888f777f,0x777f777f,0x666f777f,0x333f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0xbbbf653f,0x186f888f,0x247f358f,0x570f781f,0x911fb11f,0x781f321f,0x186f570f,0x753f065f, +0x131f252f,0x141f121f,0x252fbbbf,0x777f999f,0x141f333f,0x333f121f,0xaaaf141f,0x141fbbbf,0x000f001f,0x212f112f,0x111f001f,0x436f111f,0x112f112f,0x111f001f,0x001f000f,0x111f111f,0x324f000f,0x018f038f,0x000f112f,0x324f436f,0x325f325f,0x213f112f,0x112f001f,0x018f038f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa62f433f,0xa61fa62f,0xa61fa61f,0xa61fa61f,0xa61fa61f,0xa62fa62f,0xa62fa62f,0xcccf851f,0x851faaaf,0xa61fa62f,0xa61fa61f,0xa61fa61f,0xa61fa61f,0xa62fa62f,0xa62fa62f,0x221fa61f,0x221f110f,0x532fa64f,0x532f421f,0x532f532f,0x421f421f,0x532f532f,0xa63f532f,0x000f221f, +0x555f222f,0x666f555f,0x222f666f,0x333f333f,0x222f222f,0x444f222f,0x888f666f,0x222f666f,0x555f222f,0x666f555f,0x666f999f,0x888f888f,0x666f555f,0x555f555f,0x888f666f,0x222f666f,0x555f222f,0xcccf555f,0x555fcccf,0x666f555f,0x666f666f,0xcccf666f,0x888fcccf,0x222f666f,0x0000f60f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf60f0000, +0x888f777f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x888f888f,0x666f888f,0x888f777f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x888f888f,0x666f888f,0x888f777f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x888f888f,0x666f888f,0xb11fb96f,0x186f911f,0x247f358f,0x333f444f,0x911fb11f,0x781f321f,0xbbbf570f,0xb96f888f, +0xbbbfbbbf,0x141f555f,0x888fbbbf,0x333f888f,0x373f141f,0x373f999f,0x777f141f,0x555faaaf,0x000f001f,0x111f112f,0x111f111f,0x111f001f,0x001f000f,0x001f111f,0x001f112f,0x111f111f,0x112f000f,0x018f038f,0x000f112f,0x213f436f,0x038f214f,0x213f038f,0x112f001f,0x018f038f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x752f433f,0x752f752f,0x962f752f,0x752f962f,0x752f962f,0x962f752f,0x962f962f,0xcccf752f,0x531f888f,0x752f752f,0x962f752f,0x752f962f,0x752f962f,0x962f752f,0x962f962f,0x221f962f,0xa74f100f,0x532fa63f,0xa53f953f,0xa74f532f,0x421fa74f,0xb74f953f,0xa63f532f,0x110fa74f, +0x777f333f,0x444f777f,0x000f333f,0x000f000f,0x000f000f,0x333f000f,0x888f555f,0x222f777f,0x777f333f,0x666f777f,0x777f888f,0x555f777f,0x888f666f,0x999f999f,0x888f777f,0x222f777f,0x777f333f,0xbbbf888f,0xbbbfbbbf,0x555f333f,0x888f888f,0xbbbfcccf,0x777fbbbf,0x222f777f,0x0000f60f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf60f0000, +0x777f777f,0x777f777f,0xffff777f,0x777fffbf,0x666f777f,0xffbfffff,0x777f777f,0x777f666f,0x777f777f,0x777f777f,0xecaf777f,0x777fda9f,0x666f777f,0xda9fecaf,0x777f777f,0x777f666f,0x777f777f,0x777f777f,0x444f777f,0x777f333f,0x666f777f,0x333f444f,0x777f777f,0x777f666f,0xb11f984f,0x186f911f,0x247f358f,0x333f444f,0xb11f431f,0x781f911f,0x186f570f,0x984f065f, +0x888f777f,0x141f777f,0x888f252f,0x121f777f,0xcccf383f,0x262f777f,0x555f666f,0x121f121f,0x111f111f,0x001f111f,0x000f000f,0x000f000f,0x001f111f,0x111f000f,0x111f111f,0x001f001f,0x112f000f,0x018f038f,0x436f112f,0x213f436f,0x038f213f,0x213f018f,0x325f001f,0x018f038f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x322f432f,0x332f322f,0x332f332f,0x322f332f,0x332f332f,0x332f332f,0x322f322f,0xaaaf221f,0x221f777f,0x332f322f,0x332f332f,0x322f332f,0x332f332f,0x332f332f,0x322f322f,0x111f322f,0xa74f000f,0x532fa63f,0xa63fa74f,0x952f421f,0x431fa63f,0x953f852f,0xa63f532f,0x110fa74f, +0x555f222f,0x222f777f,0x000f000f,0x000f000f,0x000f000f,0x000f000f,0x666faaaf,0x222f333f,0x555f222f,0x666f777f,0x777f777f,0x555f777f,0x999f999f,0x888f777f,0x666f777f,0x222f333f,0x555f222f,0x777f777f,0xbbbfbbbf,0x666f888f,0xcccf555f,0x777fbbbf,0x666f777f,0x222f333f,0x0000f60f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf00f0000, +0x888f888f,0xffff777f,0xfe4fffbf,0xfa2ffe4f,0x777f777f,0xfa2ffe4f,0x888f888f,0x666f888f,0x888f888f,0xecaf777f,0xb98fda9f,0xa87fb98f,0x777f777f,0xa87fb98f,0x888f888f,0x666f888f,0x888f888f,0x444f777f,0x333f333f,0x333f333f,0x777f777f,0x333f333f,0x888f888f,0x666f888f,0xb11fb96f,0x186f911f,0x247f358f,0x570f781f,0xb11f321f,0x781f911f,0x186f570f,0xb96f065f, +0x777f777f,0x141f262f,0x121f252f,0x242f333f,0x363f242f,0x262faaaf,0x777f777f,0x555f262f,0x111f111f,0x111f111f,0x335f335f,0x335f335f,0x000f001f,0x001f335f,0x000f000f,0x001f000f,0x112f325f,0x018f038f,0x111f112f,0x111f436f,0x038f111f,0x325f018f,0x213f324f,0x018f038f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x753f433f,0x752f753f,0x753f753f,0x652f753f,0x652f652f,0x753f752f,0x753f753f,0x999f642f,0x431f777f,0x752f753f,0x753f753f,0x652f753f,0x652f652f,0x753f752f,0x753f753f,0x221f753f,0xa74f000f,0x532fa63f,0x431f532f,0x532f532f,0x532f421f,0x421f431f,0xa63f532f,0x000fa74f, +0x666f333f,0x222f777f,0x000f000f,0x111f000f,0x111f111f,0x000f111f,0x888faaaf,0x222f666f,0x666f333f,0x666f777f,0x555f777f,0x777f666f,0x888f777f,0x777f888f,0x888f888f,0x222f666f,0x666f333f,0x666f777f,0x666f555f,0x555f555f,0x666f555f,0x666f777f,0x888f555f,0x222f666f,0x0000f60f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf00ff60f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x666f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x666f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x666f777f,0x777f777f,0x777f777f,0x777f777f,0x753f753f,0x653f653f,0x653f653f,0x753f653f,0x753f753f,0x653f653f,0x653f653f,0x753f753f, +0x777f777f,0x141f121f,0xbbbf383f,0x131f141f,0x131f242f,0x888f333f,0x333f777f,0xcccf242f,0x111f111f,0x001f000f,0x112f111f,0x112f112f,0x000f111f,0x000f112f,0x335f324f,0x112f112f,0x112f000f,0x018f213f,0x111f112f,0x325f325f,0x038f111f,0x213f018f,0x000f213f,0x112f038f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x962f432f,0x862f862f,0x862f862f,0x962f862f,0x962f962f,0x862f862f,0x862f862f,0x641f741f,0x751f641f,0x862f862f,0x862f862f,0x962f862f,0x962f962f,0x862f862f,0x862f862f,0x221f852f,0xa74f000f,0x532fa63f,0xa63fa74f,0xa74f532f,0x532fa74f,0xa64fa63f,0xa63f532f,0x110fa74f, +0x555f222f,0x222f555f,0xbbbf777f,0xaaafaaaf,0xaaafaaaf,0x666faaaf,0x555faaaf,0x333f555f,0x555f222f,0x666f555f,0x888f888f,0x666f666f,0x555f666f,0x777f555f,0x555f888f,0x333f555f,0x555f222f,0x666f666f,0x444f777f,0x888f444f,0x555f888f,0x444f666f,0x555f666f,0x333f555f,0xf60ff00f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf00ff60f, +0xffbf777f,0x666ffe4f,0x777f888f,0x777f777f,0xffbfffff,0x888f888f,0x888f888f,0x888f888f,0xda9f777f,0x666fb98f,0x777f888f,0x777f777f,0xda9fecaf,0x888f888f,0x888f888f,0x888f888f,0x333f777f,0x666f333f,0x777f888f,0x777f777f,0x333f444f,0x888f888f,0x888f888f,0x888f888f,0x984fb96f,0x984f984f,0xb96f984f,0xb95fb95f,0x984f984f,0x753f984f,0x984fb96f,0x984f984f, +0x010f777f,0xbbbf141f,0x262f383f,0xbbbf252f,0x262faaaf,0x131f242f,0x222f131f,0xbbbfcccf,0x000f001f,0x112f335f,0x111f001f,0x112f213f,0x001f111f,0x000f111f,0x112f112f,0x111f001f,0x112f000f,0x018f213f,0x111f112f,0x038f038f,0x038f111f,0x001f018f,0x000f038f,0x112f038f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa72f433f,0xa72fa72f,0xa61fa72f,0xa72f861f,0xa72fa72f,0xa72fa72f,0xa72fa72f,0xa72f861f,0xa72fa72f,0xa72fa72f,0xa61fa72f,0xa72f861f,0xa72fa72f,0xa72fa72f,0xa72fa72f,0x221f962f,0xa74f110f,0x532f953f,0xa63fa74f,0xa74f532f,0x532fa74f,0xa74fa63f,0xa63f532f,0x110fb74f, +0x444f222f,0x888f777f,0x555f555f,0x555f444f,0x555f555f,0x444f555f,0x555f777f,0x333f777f,0x444f222f,0x888f777f,0x777f999f,0x999f777f,0x888f999f,0x666f777f,0x555f666f,0x333f777f,0x444f222f,0x888f777f,0x555f555f,0x222f888f,0x666f222f,0x666f555f,0x555f777f,0x333f777f,0xf60ff00f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf00ff60f, +0x777f777f,0x777f777f,0x777f777f,0xffbf777f,0xfa2ffa2f,0x777ffa2f,0x777f777f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0xda9f777f,0xa87fa87f,0x777fa87f,0x777f777f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x333f333f,0x777f333f,0x777f777f,0x777f888f,0x211f984f,0x211f211f,0x211f211f,0x221f211f,0x221f221f,0x211f211f,0x247f358f,0x984f221f, +0x555f888f,0xbbbfbbbf,0x121f262f,0x666fbbbf,0x373fbbbf,0x141f999f,0xcccf555f,0x777f777f,0x111f001f,0x111f111f,0x111f111f,0x212f111f,0x001f001f,0x001f001f,0x001f112f,0x111f111f,0x000f000f,0x213f213f,0x324f112f,0x018f038f,0x038f111f,0x324f325f,0x000f038f,0x112f038f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x861f432f,0x861f861f,0xa72f861f,0xa72fa72f,0x861f861f,0xa61f861f,0x861fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72f861f,0xa72fa72f,0x861f861f,0xa61f861f,0x861fa72f,0x221f752f,0xb74f110f,0x421f842f,0x431f532f,0x532f532f,0x532f421f,0x532f431f,0xa63f532f,0x110fa74f, +0x888f444f,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0x333f888f,0x888f444f,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0x333f888f,0x888f444f,0xcccfcccf,0xcccfcccf,0x000f222f,0x222f000f,0xcccfcccf,0xcccfcccf,0x333f888f,0xf60ff00f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf00ff60f, +0x777f777f,0x777f888f,0x888ffe4f,0x777f888f,0x777f666f,0x888f888f,0x777f888f,0x777f777f,0x777f777f,0x777f888f,0x888fb98f,0x777f888f,0x777f666f,0x888f888f,0x777f888f,0x777f777f,0x777f777f,0x777f888f,0x888f333f,0x777f888f,0x777f666f,0x888f888f,0x777f888f,0x777f777f,0x211fb96f,0x321f321f,0x911fb11f,0x321f321f,0xa90f321f,0x221f870f,0x247f358f,0x984f321f, +0x383f555f,0x777f777f,0x333f777f,0x999fbbbf,0x262f777f,0x333f888f,0x555f242f,0x888f999f,0x111f111f,0x001f111f,0x111f001f,0x001f001f,0x000f111f,0x112f001f,0x001f111f,0x111f111f,0x112f324f,0x112f112f,0x213f000f,0x018f038f,0x038f213f,0x038f038f,0x000f038f,0x112f325f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa72f433f,0xa72fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72fa72f,0xa72fa72f,0x221f962f,0xa74f110f,0x421fa63f,0xa63f953f,0xa63f431f,0x421f852f,0xb74fa63f,0xa63f532f,0x110fa74f, +0x777f444f,0xbbbfbbbf,0x777fbbbf,0x444f444f,0x444f333f,0xbbbf777f,0xaaaf999f,0x333f777f,0x777f444f,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfaaaf,0xbbbfbbbf,0xaaaf999f,0x333f777f,0x777f444f,0xbbbfbbbf,0xbbbfaaaf,0x111f222f,0x222f111f,0xbbbfcccf,0xaaaf999f,0x333f777f,0xf60ff00f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf00ff60f, +0x777f666f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0xffbf777f,0x888ffa2f,0x666f888f,0x777f666f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0xda9f777f,0x888fa87f,0x666f888f,0x777f666f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x333f777f,0x888f333f,0x666f888f,0x830f753f,0x620f730f,0x911fb11f,0x431f321f,0xbbbf570f,0x911f888f,0x247f358f,0x753f186f, +0x141f141f,0x777f373f,0x333f666f,0x888f777f,0x777f999f,0x131f121f,0x141f383f,0x333f141f,0x000f112f,0x111f000f,0x001f001f,0x001f111f,0x335f000f,0x111f001f,0x435f000f,0x111f112f,0x112f214f,0x325f213f,0x213f000f,0x018f038f,0x325f213f,0x018f038f,0x000f038f,0x112f325f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa62f432f,0xa61fa61f,0xa62fa62f,0xa61fa62f,0xa61fa61f,0xa61fa61f,0xa62fa62f,0xa61fa62f,0xa61fa61f,0xa61fa61f,0xa62fa62f,0xa61fa62f,0xa61fa61f,0xa61fa61f,0xa62fa62f,0x221f862f,0xa74f000f,0x532fa63f,0xb74f953f,0xa74f532f,0x532fa74f,0xb74f953f,0xa64f532f,0x110fa74f, +0x777f444f,0x777faaaf,0x333f333f,0x000f000f,0x000f000f,0x333f333f,0xaaaf777f,0x333f777f,0x777f444f,0xaaafaaaf,0x999faaaf,0xbbbfaaaf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0x333f777f,0x777f444f,0xbbbfaaaf,0xbbbfbbbf,0x111fbbbf,0xcccf111f,0xbbbfaaaf,0xaaafbbbf,0x333f777f,0xf00ff00f,0x0000f60f,0x00000000,0x00000000,0x00000000,0x00000000,0xf60f0000,0xf00ff00f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0xffffffbf,0xfe4fffbf,0xfa2ffe4f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0xecafda9f,0xb98fda9f,0xa87fb98f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x444f333f,0x333f333f,0x333f333f,0x777f777f,0x830fb96f,0x620f730f,0x911fb11f,0x321f358f,0xbbbf570f,0x911f888f,0x247f358f,0xb96f186f, +0xbbbfbbbf,0x121f121f,0x121f121f,0x777f242f,0x121f131f,0x999fbbbf,0x777f262f,0x141f141f,0x335f111f,0x212f325f,0x000f001f,0x001f101f,0x325f000f,0x111f112f,0x111f111f,0x001f001f,0x112f213f,0x000f112f,0x000f000f,0x213f038f,0x324f213f,0x018f038f,0x324f000f,0x214f213f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa72f433f,0xa72fa72f,0x861fa72f,0x861fa72f,0x861f861f,0x861f861f,0xa61fa72f,0x861fa72f,0x861f861f,0xa72fa72f,0x861fa72f,0x861fa72f,0x861f861f,0x861f861f,0xa61fa72f,0x221f962f,0x221f000f,0x532fa63f,0x421f532f,0x532f532f,0x532f532f,0x532f532f,0xa63f532f,0x000f221f, +0x777f444f,0x333f777f,0x000f000f,0x000f000f,0x000f000f,0x000f000f,0xbbbf444f,0x222f777f,0x777f444f,0xaaafbbbf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0xbbbfbbbf,0xbbbfbbbf,0x222f777f,0x777f444f,0xbbbfbbbf,0xaaafbbbf,0xcccfbbbf,0xaaafcccf,0xbbbfbbbf,0xbbbfaaaf,0x222f777f,0xf60ff00f,0x0000f00f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf00ff60f, +0x888f777f,0xffbf777f,0x777ffa2f,0x777f777f,0xfa2f777f,0x777ffa2f,0x777f777f,0x888f888f,0x888f777f,0xda9f777f,0x777fa87f,0x777f777f,0xa87f777f,0x777fa87f,0x777f777f,0x888f888f,0x888f777f,0x333f777f,0x777f333f,0x777f777f,0x333f777f,0x777f333f,0x777f777f,0x888f888f,0x830fb95f,0x620f730f,0x911fb11f,0x570f358f,0xa90f321f,0x911f870f,0x247f358f,0xb95f186f, +0x777fbbbf,0xbbbf252f,0xbbbf383f,0x333f141f,0xcccf242f,0x777faaaf,0x777f999f,0x333f888f,0x111f002f,0x112f112f,0x000f111f,0x111f112f,0x213f000f,0x112f112f,0x111f111f,0x111f001f,0x000f112f,0x325f112f,0x324f325f,0x213f213f,0x325f111f,0x018f038f,0x000f325f,0x213f325f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x861f433f,0xa72fa61f,0xa72fa72f,0x861fa72f,0xa72fa72f,0x861fa72f,0x861f861f,0x861fa72f,0xa72fa72f,0xa72fa61f,0xa72fa72f,0x861fa72f,0xa72fa72f,0x861fa72f,0x861f861f,0x221f752f,0xb95f000f,0xa63f211f,0xa63fa64f,0xa63fa63f,0xa63f963f,0xa64fa63f,0x221fa74f,0x000fb85f, +0x777f444f,0x000f333f,0x111f111f,0x111f111f,0x111f111f,0x111f111f,0xbbbf000f,0x333f777f,0x777f444f,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0x999faaaf,0xaaafaaaf,0xaaafaaaf,0x333f777f,0x777f444f,0xbbbfbbbf,0xbbbfbbbf,0xaaafbbbf,0xaaafaaaf,0xaaafaaaf,0xaaafbbbf,0x333f777f,0xf60ff00f,0x00000000,0x0000f00f,0x0000f60f,0x00000000,0xf60f0000,0x0000f60f,0xf00ff00f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x777f777f,0x777f777f,0x830fb96f,0x620f730f,0x911fb11f,0x570f358f,0xa90f431f,0x911f870f,0x247f358f,0xb96f186f, +0x888f777f,0xaaaf131f,0x777f888f,0x141f777f,0x141f141f,0x999f777f,0x999f888f,0x121f333f,0x111f111f,0x112f111f,0x111f111f,0x001f001f,0x112f000f,0x112f112f,0x111f112f,0x001f001f,0x324f000f,0x213f325f,0x038f038f,0x324f213f,0x213f111f,0x214f038f,0x000f213f,0x112f325f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x962f433f,0x752f752f,0x962f752f,0x752f962f,0x962f962f,0x962f752f,0x962f962f,0x752f962f,0x962f962f,0x752f752f,0x962f752f,0x752f962f,0x962f962f,0x962f752f,0x962f962f,0x221f862f,0xb95f100f,0x221fb95f,0xb74fa74f,0xa64fa64f,0xa74fa74f,0xa74fa64f,0xb95f221f,0x110fb95f, +0x777f444f,0x111f333f,0x222f222f,0x222f222f,0x222f222f,0x222f222f,0xbbbf111f,0x222f777f,0x777f444f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x222f777f,0x777f444f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x222f777f,0xf60ff00f,0xf60ff00f,0xf60ff00f,0x0000f00f,0xf00f0000,0xf00ff60f,0xf60ff00f,0xf00ff00f, +0x777f777f,0x777f777f,0x888f666f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x888f666f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x888f666f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x753f753f,0x763f753f,0x653f653f,0x653f763f,0x753f753f,0x653f753f,0x653f432f,0x753f653f, +0x777f777f,0x131f777f,0x010f020f,0x141f121f,0x888f383f,0x242f555f,0x131f131f,0x666f121f,0x001f111f,0x001f111f,0x111f111f,0x111f111f,0x111f111f,0x111f111f,0x111f111f,0x111f001f,0x436f436f,0x213f000f,0x018f038f,0x324f112f,0x213f111f,0x213f038f,0x325f112f,0x112f000f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x211f221f,0x110f110f,0x110f000f,0x521f110f,0x521f421f,0x521f521f,0x110f521f,0x000f000f,0x110f000f, +0x666f333f,0x222f333f,0x222f222f,0x222f222f,0x222f222f,0x222f222f,0xaaaf222f,0x333f666f,0x333f333f,0x333f333f,0x333f333f,0x333f333f,0x222f333f,0x333f333f,0x333f333f,0x333f333f,0x333f333f,0x222f333f,0x222f222f,0x333f333f,0x333f333f,0x222f222f,0x333f222f,0x333f333f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f, +0xcc4fdd4f,0xcc4fbb2f,0xcc4fcc4f,0xcc4fcc4f,0xcc4fdd5f,0xee4f550f,0xcc4fdd5f,0xcc4fcc4f,0xffffffff,0x0000ffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xcfffffff,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x888f666f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x888f666f,0x777f777f,0x777f777f,0x777f777f, +0x0000999f,0x999faaaf,0x0000555f,0x00000000,0x0000777f,0x00000000,0x555f0000,0xaaaf0000,0x222f999f,0x999faaaf,0x222f555f,0x222f222f,0x222f777f,0x222f222f,0x555f222f,0xaaaf222f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x432f433f,0x432f432f,0x433f432f,0x433f433f,0x433f432f,0x433f433f,0x433f433f,0x221f433f,0x433f433f,0x432f432f,0x433f432f,0x433f433f,0x433f432f,0x433f433f,0x433f433f,0x322f433f,0x984f110f,0x984f984f,0x221f984f,0x521fb74f,0xb74f521f,0xb96f221f,0xb96fb96f,0x110fb96f, +0x984f110f,0x984f984f,0x221f984f,0x521fb74f,0xb74f521f,0xb96f221f,0xb96fb96f,0x110fb96f,0x333f333f,0x333f333f,0x222f333f,0x222f222f,0x333f222f,0x333f333f,0x222f222f,0x333f333f,0x333f333f,0x333f333f,0x222f333f,0x222f222f,0x333f222f,0x333f333f,0x222f222f,0x333f333f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x330fcc3f,0xcc4fee4f,0xcc4fcc3f,0x330f330f,0xdd4fcc4f,0xcc4fcc4f,0xcc4fcc4f,0xcc4f220f,0x0000ffff,0x00000000,0x00000000,0xcfff0000,0x00000000,0x00000000,0x00000000,0xbddf0000,0x777f777f,0x888f888f,0x888f888f,0x888f888f,0x888f777f,0x888f888f,0x777f666f,0x777f777f,0x777f777f,0x888f888f,0x888f888f,0x888f888f,0x888f777f,0x888f888f,0x777f666f,0x777f777f, +0x0000888f,0x999fbbbf,0x555f0000,0x00000000,0x444f555f,0xbbbf0000,0x555fbbbf,0x555f0000,0x222f888f,0x999fbbbf,0x555f222f,0x222f222f,0x444f555f,0xbbbf222f,0x555fbbbf,0x555f222f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa72f433f,0xa61fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72f861f,0xa72f861f,0x861f861f,0x861f861f,0xa61fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72f861f,0xa72f861f,0x221fa72f,0xb96f110f,0x753fb95f,0xb95fb95f,0x521f221f,0x221f521f,0xb95f984f,0xb95f984f,0x110fb96f, +0xb96f110f,0x753fb95f,0xb95fb95f,0x521f221f,0x221f521f,0xb95f984f,0xb95f984f,0x110fb96f,0x666f333f,0x666f555f,0x555f444f,0x777f777f,0x666f444f,0x666f666f,0x444f555f,0x333f555f,0x666f333f,0x666f555f,0x555f444f,0x777f777f,0x666f444f,0x666f666f,0x444f555f,0x333f555f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xcc4fcc4f,0xdd4fcc4f,0xdd5fcc4f,0x660f550f,0xcc4fdd4f,0xee5fbb3f,0xcc4f330f,0xcc4fff6f,0x0000ffff,0xffff0000,0x00000000,0x0000cfff,0x00000000,0x00000000,0x00000000,0x00000000,0x666f777f,0x777f777f,0x777f7cff,0x777f777f,0x777f888f,0x777f777f,0x7cffceff,0x777f777f,0x666f777f,0x777f777f,0x777f900f,0x777f777f,0x777f888f,0x777f777f,0x900ff00f,0x777f777f, +0x00000000,0x0000888f,0xaaaf555f,0x0000aaaf,0xaaaf999f,0xbbbf555f,0x0000999f,0xaaafbbbf,0x222f222f,0x222f888f,0xaaaf555f,0x222faaaf,0xaaaf999f,0xbbbf555f,0x222f999f,0xaaafbbbf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa72f433f,0x861f861f,0x861f861f,0xa72fa72f,0xa72fa72f,0xa72fa72f,0xa72fa61f,0xa72fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72fa72f,0xa72fa72f,0xa72fa72f,0xa72fa61f,0x221fa72f,0xb96f110f,0x984f984f,0x984f753f,0x221fb95f,0xb96f221f,0xb95fb96f,0xb96f753f,0x110fb96f, +0xb96f110f,0x984f984f,0x984f753f,0x221fb95f,0xb96f221f,0xb95fb96f,0xb96f753f,0x110fb96f,0x555f222f,0x555f777f,0x888f666f,0x777f888f,0x555f666f,0x777f888f,0x777f555f,0x333f555f,0x555f222f,0x555f777f,0x888f666f,0x777f888f,0x555f666f,0x777f888f,0x777f555f,0x333f555f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xcc3fcc4f,0x330fdd5f,0xdd4f330f,0x330fee4f,0xcc3fee4f,0x220fcc3f,0xcc3f660f,0xdd5fcc4f,0x0000ffff,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xbddfcfff,0x888f777f,0x777f777f,0x666f777f,0xceff777f,0x777f5eff,0x777f777f,0x777f777f,0x777f777f,0x888f777f,0x777f777f,0x666f777f,0xf00f777f,0x777f800f,0x777f777f,0x777f777f,0x777f777f, +0x00000000,0x00000000,0xaaaf0000,0x0000888f,0x999faaaf,0xaaaf444f,0x0000888f,0x999faaaf,0x222f222f,0x222f222f,0xaaaf222f,0x222f888f,0x999faaaf,0xaaaf444f,0x222f888f,0x999faaaf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa62f433f,0xa61fa62f,0xa61fa61f,0xa61fa61f,0xa61fa61f,0xa62fa62f,0xa62fa62f,0xa61fa61f,0xa61fa61f,0xa61fa62f,0xa61fa61f,0xa61fa61f,0xa61fa61f,0xa62fa62f,0xa62fa62f,0x221fa61f,0x653f110f,0x432f653f,0x753f432f,0x110f753f,0x753f110f,0x653f432f,0x653f653f,0x110f753f, +0x653f110f,0x432f653f,0x753f432f,0x110f753f,0x753f110f,0x210f432f,0x210f210f,0x110f753f,0x555f222f,0x666f555f,0x222f666f,0x333f333f,0x222f222f,0x444f222f,0x888f666f,0x222f666f,0x555f222f,0x666f555f,0x666f999f,0x888f888f,0x666f555f,0x555f555f,0x888f666f,0x222f666f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xcc4fcc4f,0x660fcc4f,0xcc4f660f,0xcc3faa1f,0xbb3fcc4f,0xcc4fcc4f,0xcc4fee4f,0xcc4fff7f,0xffffffff,0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0xcfff0000,0xbddf0000,0x888f777f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x888f888f,0x666f888f,0x888f777f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x888f888f,0x666f888f, +0xaaaf0000,0x0000aaaf,0xaaaf0000,0x0000555f,0x888f999f,0x00000000,0x0000888f,0x888f999f,0xaaaf222f,0x222faaaf,0xaaaf222f,0x222f555f,0x888f999f,0x222f222f,0x222f888f,0x888f999f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x752f433f,0x752f752f,0x962f752f,0x752f962f,0x752f962f,0x962f752f,0x962f962f,0x752f962f,0x752f962f,0x752f752f,0x962f752f,0x752f962f,0x752f962f,0x962f752f,0x962f962f,0x221f962f,0x984f110f,0x753f984f,0xb96f984f,0x221fb96f,0x984f221f,0x753f753f,0xb95fb95f,0x110fb95f, +0x984f110f,0x753f984f,0xb96f984f,0x221fb96f,0x984f221f,0x210f753f,0x210f753f,0x110f753f,0x777f333f,0x444f777f,0x000f333f,0x000f000f,0x000f000f,0x333f000f,0x888f555f,0x222f777f,0x777f333f,0x666f777f,0x777f888f,0x555f777f,0x888f666f,0x999f999f,0x888f777f,0x222f777f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xbb3fcc4f,0xcc4fcc4f,0xbb3fee4f,0xdd4fcc4f,0xcc4f220f,0xcc4fdd4f,0xdd5f660f,0xcc4fdd4f,0x0000ffff,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x0000cfff,0x00000000,0x777f777f,0x777f777f,0xffff777f,0x777fceff,0x666f777f,0xceffffff,0x777f777f,0x777f666f,0x777f777f,0x777f777f,0xf00f777f,0x777fa00f,0x666f777f,0xa00ff00f,0x777f777f,0x777f666f, +0xbbbf0000,0x0000888f,0x888f444f,0x0000555f,0x999f555f,0x555f0000,0x555f0000,0x888f0000,0xbbbf222f,0x222f888f,0x888f444f,0x222f555f,0x999f555f,0x555f222f,0x555f222f,0x888f222f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x322f432f,0x332f322f,0x332f332f,0x322f332f,0x332f332f,0x332f332f,0x322f322f,0x322f332f,0x332f332f,0x332f322f,0x332f332f,0x322f332f,0x332f332f,0x332f332f,0x322f322f,0x111f322f,0x984f110f,0x210f753f,0x210fb95f,0x221fb96f,0xb95f221f,0xb95f963f,0x984f984f,0x110f984f, +0x984f110f,0x210f753f,0xb95fb95f,0x221fb96f,0xb95f221f,0x210f963f,0x210f210f,0x110f653f,0x555f222f,0x222f777f,0x000f000f,0x000f000f,0x000f000f,0x000f000f,0x666faaaf,0x222f333f,0x555f222f,0x666f777f,0x777f777f,0x555f777f,0x999f999f,0x888f777f,0x666f777f,0x222f333f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x330fdd5f,0xee6fcc4f,0xcc4f660f,0xcc4fcc4f,0xdd4fee4f,0xbb2fcc4f,0xee4fff6f,0xcc4fcc4f,0x00000000,0x00000000,0x00000000,0xcfff0000,0x00000000,0x00000000,0x00000000,0xbddf0000,0x888f888f,0xffff777f,0x7cffceff,0x5eff7cff,0x777f777f,0x5eff7cff,0x888f888f,0x666f888f,0x888f888f,0xb00f777f,0x900fa00f,0x800f900f,0x777f777f,0x800f900f,0x888f888f,0x666f888f, +0x999f555f,0x555f0000,0x0000555f,0xaaafaaaf,0x00000000,0x0000666f,0x555f0000,0x555f555f,0x999f555f,0x555f222f,0x222f555f,0xaaafaaaf,0x222f222f,0x222f666f,0x555f222f,0x555f555f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x753f433f,0x752f753f,0x753f753f,0x652f753f,0x652f652f,0x753f752f,0x753f753f,0x652f753f,0x652f652f,0x752f753f,0x753f753f,0x652f753f,0x652f652f,0x753f752f,0x753f753f,0x221f753f,0xb96f110f,0x210fb96f,0x210f753f,0x221f753f,0x984f221f,0xb96f432f,0xb96fb96f,0x110fb96f, +0xb96f110f,0x210fb96f,0xb96fb96f,0x221fb96f,0x984f221f,0xdddf432f,0xbbbfdddf,0x110f753f,0x666f333f,0x222f777f,0x000f000f,0x111f000f,0x111f111f,0x000f111f,0x888faaaf,0x222f666f,0x666f333f,0x666f777f,0x555f777f,0x777f666f,0x888f777f,0x777f888f,0x888f888f,0x222f666f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x660fbb3f,0xdd4fee4f,0xdd5fee4f,0xcc4fcc3f,0xcc4fcc4f,0xbb2fdd4f,0xcc4f991f,0xcc4fdd5f,0x0000ffff,0x0000cfff,0x00000000,0x0000cfff,0x00000000,0x00000000,0x00000000,0xbddf0000,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x666f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x666f777f,0x777f777f,0x777f777f,0x777f777f, +0xbbbfaaaf,0xaaaf0000,0x555fbbbf,0x999faaaf,0xaaaf0000,0x555fbbbf,0x555f0000,0x666f0000,0xbbbfaaaf,0xaaaf222f,0x555fbbbf,0x999faaaf,0xaaaf222f,0x555fbbbf,0x555f222f,0x666f222f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x962f432f,0x862f862f,0x862f862f,0x962f862f,0x962f962f,0x862f862f,0x862f862f,0x962f862f,0x962f962f,0x862f862f,0x862f862f,0x962f862f,0x962f962f,0x862f862f,0x862f862f,0x221f852f,0x753f110f,0x653f653f,0x653fdddf,0x110f653f,0x753f110f,0x432f653f,0x653f653f,0x110f753f, +0x753f110f,0x210f653f,0x653f653f,0x110f653f,0x753f110f,0xffff653f,0xbbbfdddf,0x110f432f,0x555f222f,0x222f555f,0xbbbf777f,0xaaafaaaf,0xaaafaaaf,0x666faaaf,0x555faaaf,0x333f555f,0x555f222f,0x666f555f,0x888f888f,0x666f666f,0x555f666f,0x777f555f,0x555f888f,0x333f555f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xee4fcc4f,0xdd4fdd4f,0xcc4fdd4f,0x330fcc3f,0x330fee4f,0x330f330f,0xcc4fbb2f,0xcc4f330f,0xcfffffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xbddf0000,0xceff777f,0x666f7cff,0x777f888f,0x777f777f,0xceffffff,0x888f888f,0x888f888f,0x888f888f,0xf00f777f,0x666f900f,0x777f888f,0x777f777f,0xa00ff00f,0x888f888f,0x888f888f,0x888f888f, +0x888fbbbf,0x999f0000,0x555f999f,0x999f999f,0x999f0000,0x0000999f,0xbbbf0000,0x555f999f,0x888fbbbf,0x999f222f,0x555f999f,0x999f999f,0x999f222f,0x222f999f,0xbbbf222f,0x555f999f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa72f433f,0xa72fa72f,0xa61fa72f,0xa72f861f,0xa72fa72f,0xa72fa72f,0xa72fa72f,0xa72f861f,0xa72fa72f,0xa72fa72f,0xa61fa72f,0xa72f861f,0xa72fa72f,0xa72fa72f,0xa72fa72f,0x221f962f,0xb96f110f,0xdddfb96f,0xdddf753f,0x221f653f,0xb95f221f,0xb95fb95f,0xb96fb96f,0x110fb96f, +0xb96f110f,0x210fb96f,0x753fbbbf,0x221f984f,0xb95f221f,0x753fb95f,0xbbbfdddf,0x110f753f,0x444f222f,0x888f777f,0x888f555f,0x999f888f,0x999f999f,0x444f888f,0x555f777f,0x333f777f,0x444f222f,0x888f777f,0x777faaaf,0x999f666f,0x888f999f,0x666f777f,0x444f555f,0x333f777f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xcc4fcc4f,0x330fcc4f,0xcc4fcc4f,0xdd4fdd5f,0x660fcc4f,0x660f550f,0x330fee4f,0x660f660f,0x0000ffff,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x777f777f,0x777f777f,0x777f777f,0xceff777f,0x5eff5eff,0x777f5eff,0x777f777f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0xa00f777f,0x800f800f,0x777f800f,0x777f777f,0x777f888f, +0x444f888f,0x555f0000,0x0000888f,0x0000999f,0x0000555f,0x0000999f,0xaaaf555f,0x0000999f,0x444f888f,0x555f222f,0x222f888f,0x222f999f,0x222f555f,0x222f999f,0xaaaf555f,0x222f999f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x861f432f,0x861f861f,0xa72f861f,0xa72fa72f,0x861f861f,0xa61f861f,0x861fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72f861f,0xa72fa72f,0x861f861f,0xa61f861f,0x861fa72f,0x221f752f,0x984f110f,0xbbbf984f,0xbbbf653f,0x221f753f,0x984f221f,0x753f984f,0x984fb96f,0x110f984f, +0x984f110f,0xdddfbbbf,0x753fbbbf,0x221fb95f,0x984f221f,0x753f984f,0xbbbfffff,0x110f653f,0x888f444f,0xdddfcccf,0xeeefdddf,0xffffffff,0xffffffff,0xdddfeeef,0xcccfdddf,0x333f888f,0x555f222f,0x999f999f,0x555f777f,0x777f999f,0x888f999f,0x666f888f,0x999f666f,0x333f555f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdd4fcc4f,0xee4fcc4f,0xcc3fcc4f,0xdd4f110f,0xdd5fee6f,0xee4fee5f,0xff6fcc4f,0xcc3f550f,0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0x00000000,0xffff0000,0x00000000,0x777f777f,0x777f888f,0x888f7cff,0x777f888f,0x777f666f,0x888f888f,0x777f888f,0x777f777f,0x777f777f,0x777f888f,0x888f900f,0x777f888f,0x777f666f,0x888f888f,0x777f888f,0x777f777f, +0x0000555f,0x00000000,0x444f0000,0x0000555f,0xaaafaaaf,0x00000000,0x999f555f,0x00000000,0x222f555f,0x222f222f,0x444f222f,0x222f555f,0xaaafaaaf,0x222f222f,0x999f555f,0x222f222f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa72f433f,0xa72fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72fa72f,0xa72fa72f,0x861f861f,0x861f861f,0xa72fa72f,0xa72fa72f,0x221f962f,0xb95f110f,0xb95fb95f,0xb96fb96f,0x110f984f,0x984f221f,0xb95fb95f,0xb95f963f,0x110fb95f, +0xb95f110f,0x753f753f,0x753fbbbf,0x110f984f,0x984f221f,0xb95fb95f,0xbbbfdddf,0x110f753f,0x777f444f,0xdddfcccf,0xeeefeeef,0x444f444f,0x444f333f,0xeeefeeef,0xcccfdddf,0x333f777f,0x555f222f,0x777f777f,0x555f777f,0x888f999f,0x777f777f,0x555f777f,0x666f666f,0x222f666f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdd4f110f,0xcc4fcc4f,0xcc4fcc4f,0xdd4fdd3f,0xcc4fcc4f,0x110fcc4f,0xcc4fcc4f,0xcc4fee4f,0x0000ffff,0x00000000,0x00000000,0x0000cfff,0x00000000,0x00000000,0x0000ffff,0xbddf0000,0x777f666f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0xceff777f,0x888f5eff,0x666f888f,0x777f666f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0xf00f777f,0x888f800f,0x666f888f, +0x0000aaaf,0xbbbfaaaf,0x00000000,0x00000000,0x999faaaf,0xaaaf0000,0x0000888f,0xaaaf555f,0x222faaaf,0xbbbfaaaf,0x222f222f,0x222f222f,0x999faaaf,0xaaaf222f,0x222f888f,0xaaaf555f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa62f432f,0xa61fa61f,0xa62fa62f,0xa61fa62f,0xa61fa61f,0xa61fa61f,0xa62fa62f,0xa61fa62f,0xa61fa61f,0xa61fa61f,0xa62fa62f,0xa61fa62f,0xa61fa61f,0xa61fa61f,0xa62fa62f,0x221f862f,0x653f110f,0x753f753f,0x653f653f,0x100f653f,0x753f110f,0x753f753f,0x653f432f,0x110f653f, +0x653f110f,0x753f753f,0x431f431f,0x100f653f,0x753f110f,0x753f753f,0xbbbf221f,0x110f431f,0xaaaf444f,0xdddfdddf,0x333f333f,0xc00ff00f,0xc00ff00f,0x333f333f,0xdddfdddf,0x333faaaf,0x777f333f,0x777f888f,0x555f777f,0x777f777f,0x777f888f,0x666f555f,0x666f888f,0x222f777f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xff5f660f,0x330fcc4f,0xdd4f110f,0xcc3fcc4f,0x220f330f,0xcc4fdd4f,0xaa2fdd4f,0xee4f660f,0xcfff0000,0x00000000,0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0xbddf0000,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0xffffceff,0x7cffceff,0x5eff7cff,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0xf00fa00f,0x900fa00f,0x800f900f,0x777f777f, +0x0000888f,0x999fbbbf,0xaaaf0000,0x0000bbbf,0x888f0000,0x999f0000,0x0000999f,0xaaaf444f,0x222f888f,0x999fbbbf,0xaaaf222f,0x222fbbbf,0x888f222f,0x999f222f,0x222f999f,0xaaaf444f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa72f433f,0xa72fa72f,0x861fa72f,0x861fa72f,0x861f861f,0x861f861f,0xa61fa72f,0x861fa72f,0x861f861f,0xa72fa72f,0x861fa72f,0x861fa72f,0x861f861f,0x861f861f,0xa61fa72f,0x221f962f,0xb96f110f,0xa73fb96f,0x984fb96f,0x110fb96f,0x984f221f,0x984f984f,0x753f963f,0x110fb96f, +0xb96f110f,0xa73fb96f,0x984fb96f,0x110fb96f,0x984f221f,0x984f984f,0xffff963f,0x110f753f,0xcccf888f,0x333feeef,0xc00fc00f,0xc00ffa0f,0xf00ffa0f,0xc00fc00f,0xeeef444f,0x222faaaf,0x555f222f,0x555f555f,0x555f555f,0x777f666f,0x555f666f,0x888f999f,0x777f777f,0x222f333f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xee4fee4f,0x660fdd4f,0xee4f660f,0x330fcc3f,0x660f660f,0xdd4f550f,0xcc4fcc4f,0xcc4fcc4f,0x0000cfff,0x00000000,0x00000000,0x00000000,0x00000000,0x0000cfff,0x00000000,0xbddf0000,0x888f777f,0xceff777f,0x777f5eff,0x777f777f,0x5eff777f,0x777f5eff,0x777f777f,0x888f888f,0x888f777f,0xf00f777f,0x777f800f,0x777f777f,0x800f777f,0x777f800f,0x777f777f,0x888f888f, +0x0000999f,0x999f555f,0xaaaf0000,0x0000888f,0x555f0000,0x999f0000,0xaaaf444f,0x0000aaaf,0x222f999f,0x999f555f,0xaaaf222f,0x222f888f,0x555f222f,0x999f222f,0xaaaf444f,0x222faaaf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x861f433f,0xa72fa61f,0xa72fa72f,0x861fa72f,0xa72fa72f,0x861fa72f,0x861f861f,0x861fa72f,0xa72fa72f,0xa72fa61f,0xa72fa72f,0x861fa72f,0xa72fa72f,0x861fa72f,0x861f861f,0x221f752f,0x984f110f,0xa73f753f,0xb96fb96f,0x221fb96f,0xb95f221f,0x984fb95f,0x984f984f,0x110f984f, +0x984f110f,0xa73f753f,0xb96fb96f,0x221fb96f,0xb95f221f,0x984fb95f,0x653f984f,0x110f653f,0xdddf888f,0xf00f333f,0xfa0ffa0f,0xf00ffa0f,0xfa0fff0f,0xf00ff00f,0xeeeff00f,0x333faaaf,0x666f333f,0x999f777f,0x999f888f,0x555f666f,0x999f666f,0x777f888f,0x777f888f,0x222f666f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xcc3fcc4f,0xee6fbb3f,0xbb2fee4f,0xcc4fdd5f,0x660f660f,0xcc4fee4f,0xee4f660f,0xcc3fcc4f,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xcfff0000,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x777f777f,0x777f777f, +0x0000666f,0x555f0000,0x888f555f,0x00000000,0x666f0000,0x999f555f,0xbbbf0000,0x555f999f,0x222f666f,0x555f222f,0x888f555f,0x222f222f,0x666f222f,0x999f555f,0xbbbf222f,0x555f999f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x962f433f,0x752f752f,0x962f752f,0x752f962f,0x962f962f,0x962f752f,0x962f962f,0x752f962f,0x962f962f,0x752f752f,0x962f752f,0x752f962f,0x962f962f,0x962f752f,0x962f962f,0x221f862f,0xb96f110f,0x753f984f,0xb96f984f,0x221fb96f,0xb96f221f,0xb95f984f,0xb96fb96f,0x110fb96f, +0xb96f110f,0x753f984f,0xb96f984f,0x221fb96f,0xb96f221f,0xb95f984f,0xb96fb96f,0x110fb96f,0xeeef888f,0xfa0f333f,0xff0fff0f,0xfa0fff0f,0xff0ffa0f,0xfa0fff0f,0xeeeffa0f,0x222faaaf,0x666f333f,0x666f555f,0x555f444f,0x777f777f,0x666f444f,0x666f666f,0x444f555f,0x333f555f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xbb3fee5f,0xcc4fbb2f,0xcc4fbb2f,0xcc4fdd4f,0xee5fff6f,0xdd4fdd5f,0xcc4fee4f,0xcc4fcc4f,0xbddfcfff,0xbddfbddf,0xbddfbddf,0x00000000,0xbddfbddf,0xbddf0000,0xbddfbddf,0xcfffbddf,0x777f777f,0x777f777f,0x888f666f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x888f666f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x777f777f, +0x0000aaaf,0x00000000,0x999f0000,0x555f0000,0xaaafaaaf,0x0000555f,0x888f0000,0xaaaf555f,0x222faaaf,0x222f222f,0x999f222f,0x555f222f,0xaaafaaaf,0x222f555f,0x888f222f,0xaaaf555f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x221f221f,0x211f221f,0x753f110f,0x763f753f,0x653f653f,0x110f763f,0x753f110f,0x653f753f,0x653f432f,0x110f653f, +0x753f110f,0x763f753f,0x653f653f,0x110f763f,0x753f110f,0x653f753f,0x653f432f,0x110f653f,0xdddf888f,0xf00f333f,0xf00ffa0f,0xff0ffa0f,0xfa0ff00f,0xfa0fff0f,0xeeeff00f,0x333f999f,0x333f333f,0x333f333f,0x222f333f,0x222f222f,0x333f222f,0x333f333f,0x222f222f,0x333f333f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdddfcccf,0xcccfcccf,0xeeefdddf,0xdddfcccf,0xeeefeeef,0xcccfbbbf,0xeeefeeef,0xcccfcccf,0x157f235f,0x157f245f,0x245f046f,0x036f258f,0x157f157f,0x157f245f,0x356f258f,0x245f157f,0xffffffff,0xefffffff,0xffffffff,0xffffefff,0xffffffff,0xefffefff,0xefffefff,0xffffffff,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9, +0xffffffff,0xefffffff,0xffffffff,0xffffefff,0xffffffff,0xefffefff,0xefffefff,0xffffffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x041f0000,0x181f181f,0x181f182f,0x061f182f,0x172f041f,0x182f172f,0x181f182f,0x0000061f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xaabf889f,0x9abfaabf,0x9abf9aaf,0x9aaf9aaf,0xaabfaabf,0x9aaf9aaf,0x9aaf9aaf,0x9aaf99af,0xeedf0000,0x00009c6f,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0x322f222f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x222f322f,0x322f222f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x222f322f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0xeeefdddf,0xffffffff,0xeeefeeef,0xdddfdddf,0xcccfcccf,0xdddfdddf,0xcccfbbbf,0xdddfdddf,0x0000157f,0x0000157f,0x157f0000,0x00000000,0x00000000,0x0000157f,0x157f0000,0x147f0000,0xffffffff,0xefffffff,0xefffefff,0xefffefff,0xffffefff,0xefffefff,0xffffefff,0xefffffff,0x7af97af9,0x7af97af9,0x7af97af9,0x8bf97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9, +0xffffffff,0xefffffff,0x532fefff,0xefffefff,0xffffefff,0xefffefff,0xffffefff,0xefffffff,0x061f0000,0x000f061f,0x061f020f,0x000f020f,0x061f061f,0x000f061f,0x061f020f,0x0000061f,0x041f0000,0x181f171f,0x182f071f,0x000f051f,0x171f041f,0x182f172f,0x181f182f,0x0000061f,0x061f0000,0x061f061f,0x061f061f,0x061f061f,0x061f061f,0x061f061f,0x061f061f,0x0000061f, +0x9aafaabf,0xaabfaabf,0x9aaf99af,0x9aaf9aaf,0xaabf99af,0xaabfabcf,0x9aaf9aaf,0xaabf9aaf,0x8a5f0000,0x0000684f,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0xeedf0000,0x00009c6f,0x754f322f,0x853f854f,0x854f854f,0x753f753f,0x753f753f,0x854f753f,0x854f753f,0x322f754f,0x754f322f,0x853f854f,0x854f854f,0x753f753f,0x753f753f,0x854f753f,0x854f753f,0x322f754f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xffffeeef,0xdddfdddf,0xffffffff,0xdddfeeef,0xffffeeef,0xeeefeeef,0xffffffff,0xeeefeeef,0x157f134f,0x157f245f,0x356f157f,0x157f157f,0x157f147f,0x157f134f,0x235f157f,0x245f036f,0xffffefff,0xefffefff,0xefffefff,0xefffefff,0xefffffff,0xefffefff,0xffffffff,0xefffefff,0x7af97af9,0xfff97af9,0x7af97af9,0x7af98bf9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9, +0x532fefff,0xefffefff,0x532fefff,0x532fefff,0xefffffff,0xefffefff,0xffff532f,0x532fefff,0x061f0000,0x051f182f,0x171f181f,0x051f171f,0x181f182f,0x061f182f,0x181f182f,0x0000061f,0x000f000f,0x171f061f,0x182f071f,0x031f061f,0x171f041f,0x182f172f,0x051f182f,0x000f000f,0x061f0000,0xdd9fdd9f,0xdd9fdd9f,0xdd9fdd9f,0xdd9fdd9f,0xdd9fdd9f,0xdd9fddaf,0x0000061f, +0xaabfaabf,0x9aafabcf,0x9aaf9aaf,0x9abf9abf,0xaabfaabf,0xaabfaabf,0x9aaf99af,0xabcf9aaf,0xad7f0000,0x9e3f8a5f,0xad7f0000,0x00008a5f,0xad7f0000,0x7c2f8a5f,0x8a5f0000,0x0000684f,0x854f322f,0x853f532f,0x853f532f,0x954f532f,0x964f532f,0x954f532f,0x964f532f,0x322f854f,0x854f322f,0x853f853f,0x853f853f,0x753f954f,0x964f753f,0x954f964f,0x964f953f,0x322f854f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdddfdddf,0xffffeeef,0xdddfdddf,0xffffdddf,0xdddfcccf,0xffffffff,0xdddfdddf,0xffffffff,0x0000157f,0x0000157f,0x258f0000,0x00000000,0x00000000,0x0000258f,0x157f0000,0x258f0000,0xefffffff,0xefffefff,0xffffffff,0xffffefff,0xefffffff,0xefffefff,0xffffffff,0xefffefff,0x7af97af9,0x7af9fff9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af98bf9, +0x666f532f,0x532f532f,0x532fffff,0x532f532f,0x532fffff,0x532fefff,0x532f753f,0x753f532f,0x000f0000,0x192f051f,0x182f181f,0x000f061f,0x181f061f,0x000f061f,0x181f061f,0x0000061f,0x020f0000,0x171f061f,0x182f071f,0x061f171f,0x051f000f,0x182f172f,0x071f182f,0x0000061f,0x061f0000,0xdd9fdd9f,0xdd9fdd9f,0xdd9fdd9f,0xdd9fdd9f,0xdd9fdd9f,0xdd9fddaf,0x0000061f, +0x9aaf99af,0xaabf9aaf,0xaabf9aaf,0x9aaf9aaf,0x9aaf9aaf,0xaabf9aaf,0x9aaf9abf,0x99af9abf,0xad7f0000,0x7c2f8a5f,0xad7f0000,0x9e3f8a5f,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0x853f322f,0x953f421f,0x953f421f,0x953f421f,0x953f421f,0x954f421f,0x954f421f,0x322f853f,0x853f322f,0x953f954f,0x953f953f,0x111f753f,0x753f111f,0x954f954f,0x954f954f,0x322f853f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdddfeeef,0xdddfcccf,0xeeefeeef,0xbbbfbbbf,0xeeefdddf,0xcccfdddf,0xeeefeeef,0xbbbfcccf,0x0000157f,0x0000157f,0x157f0000,0x00000000,0x00000000,0x0000157f,0x157f0000,0x046f0000,0xffffffff,0xefffefff,0xffffefff,0xffffefff,0xefffefff,0xffffefff,0xefffffff,0xefffefff,0xfff97af9,0x7af97af9,0x7af97af9,0x7af97af9,0xfff97af9,0x7af97af9,0x8bf97af9,0x7af97af9, +0x753f964f,0xb85f964f,0x964f532f,0x753f753f,0x532f532f,0x666f532f,0x964f753f,0x753f532f,0x020f0000,0x181f182f,0x182f061f,0x061f182f,0x181f182f,0x061f182f,0x181f182f,0x0000061f,0x041f0000,0x181f071f,0x182f172f,0x061f181f,0x061f020f,0x182f181f,0x171f182f,0x0000061f,0x061f0000,0xddafdd9f,0xddafdd9f,0xddafddaf,0xddafdd9f,0xddafdd9f,0xdd9fdd9f,0x0000061f, +0x9aafaabf,0x9aafaabf,0xaabfaabf,0xaabfaabf,0x99afaabf,0xaabf9aaf,0x99af9abf,0x99afaabf,0xad7f0000,0x00008a5f,0xeedf0000,0x7c2f9c6f,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0x753f322f,0x532f853f,0x532f853f,0x532f964f,0x532f964f,0x532f853f,0x532f954f,0x322f854f,0x753f322f,0x853f853f,0x964f853f,0x111f753f,0x753f111f,0x953f853f,0x954f954f,0x322f854f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xbbbfcccf,0xffffcccf,0xbbbfcccf,0xdddfcccf,0xbbbfcccf,0xdddfdddf,0xdddfcccf,0xdddfcccf,0x157f245f,0x258f245f,0x346f157f,0x157f157f,0x258f157f,0x258f245f,0x245f157f,0x245f157f,0xefffefff,0xefffefff,0xffffefff,0xffffffff,0xefffefff,0xefffefff,0xefffefff,0xefffefff,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af9fff9,0x7af97af9,0x7af98bf9,0x7af97af9, +0x532f753f,0x964f964f,0x964f753f,0x532f532f,0x753f532f,0x532f753f,0x753f753f,0xb85f753f,0x061f0000,0x061f181f,0x061f000f,0x181f171f,0x181f171f,0x182f182f,0x051f182f,0x0000000f,0x041f0000,0x181f061f,0x172f172f,0x061f172f,0x171f041f,0x182f181f,0x071f182f,0x0000061f,0x061f0000,0xdd9fdd9f,0xdd9fddaf,0xdd9fdd9f,0xdd9fdd9f,0xddafdd9f,0xdd9fdd9f,0x0000061f, +0xaabf99af,0xabdf9aaf,0xaabf9aaf,0xaabfaabf,0xaabf9aaf,0x99afaabf,0x9aaf9aaf,0x99af9abf,0xad7f0000,0x00008a5f,0x8a5f0000,0x0000684f,0xeedf0000,0x00009c6f,0xad7f0000,0x00008a5f,0x753f322f,0x422f953f,0x422f954f,0x321f964f,0x422f954f,0x422f954f,0x321f853f,0x322f753f,0x753f322f,0x954f953f,0x954f954f,0x111f753f,0x753f111f,0x954f954f,0x853f853f,0x322f753f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xffffffff,0xeeefeeef,0xdddfdddf,0xeeefdddf,0xffffeeef,0xdddfeeef,0xffffffff,0xeeefeeef,0x0000157f,0x0000046f,0x157f0000,0x00000000,0x00000000,0x0000157f,0x035f0000,0x157f0000,0xefffffff,0xefffefff,0xefffffff,0xffffefff,0xefffefff,0xffffefff,0xefffefff,0xefffefff,0x7af97af9,0x7af97af9,0x7af97af9,0x8bf97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9, +0x532fb85f,0x753f753f,0x753f888f,0xb85f753f,0x753fb85f,0xb85fb85f,0x964f753f,0x964f753f,0x020f0000,0x192f071f,0x182f181f,0x181f182f,0x000f061f,0x181f171f,0x181f181f,0x0000061f,0x000f000f,0x071f171f,0x171f181f,0x061f172f,0x171f041f,0x171f182f,0x051f182f,0x000f000f,0x061f0000,0xdd9fdd9f,0xdd9fddaf,0xddafdd9f,0xdd9fdd9f,0xdd9fdd9f,0xdd9fdd9f,0x0000061f, +0xaabf99af,0x9abf99af,0xaabf99af,0x9aaf9aaf,0x9aaf9aaf,0xabcfaabf,0xaabfaabf,0x9abfaabf,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0x8a5f0000,0x0000684f,0xad7f0000,0x9e3f8a5f,0x854f322f,0x954f532f,0x964f532f,0x853f532f,0x853f532f,0x964f532f,0x964f532f,0x322f854f,0x854f322f,0x954f964f,0x964f964f,0x111f753f,0x753f111f,0x964f953f,0x964f964f,0x322f854f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdddfdddf,0xffffffff,0xeeefeeef,0xffffffff,0xdddfcccf,0xffffeeef,0xeeefeeef,0xffffffff,0x0000157f,0x0000157f,0x157f0000,0x00000000,0x00000000,0x0000157f,0x258f0000,0x147f0000,0xffffffff,0xefffefff,0xefffefff,0xefffefff,0xffffffff,0xefffefff,0xefffffff,0xefffefff,0x7af97af9,0x7af98bf9,0x7af97af9,0x7af98bf9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9, +0x753fb85f,0xb85fb85f,0x964f964f,0x753f753f,0x532f964f,0x964f964f,0x753f753f,0x964f964f,0x000f0000,0x181f051f,0x192f061f,0x181f182f,0x061f182f,0x182f181f,0x181f061f,0x0000020f,0x041f0000,0x171f182f,0x171f181f,0x061f182f,0x051f000f,0x071f182f,0x061f182f,0x0000031f,0x061f0000,0xdd9fdd9f,0xdd9fddaf,0xddafdd9f,0xdd9fddaf,0xdd9fdd9f,0xdd9fdd9f,0x0000061f, +0x9aaf9abf,0x9aafaabf,0x9aaf9abf,0xabbfaabf,0x99afaabf,0x9aaf9aaf,0xaabfaabf,0xaabf9aaf,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0xad7f0000,0x7c2f8a5f,0x853f322f,0x954f421f,0x954f421f,0x953f421f,0x953f421f,0x954f421f,0x954f421f,0x322f853f,0x853f322f,0x954f954f,0x954f954f,0x111f753f,0x753f111f,0x954f954f,0x954f954f,0x322f853f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xeeefeeef,0xdddfcccf,0xeeefffff,0xdddfcccf,0xdddfdddf,0xcccfdddf,0xdddfdddf,0xcccfcccf,0x0000258f,0x0000157f,0x157f0000,0x00000000,0x00000000,0x0000157f,0x157f0000,0x157f0000,0xefffffff,0xefffefff,0xefffefff,0xefffefff,0xffffffff,0xefffffff,0xffffffff,0xefffefff,0x8bf97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9, +0x753f964f,0x964f753f,0x964f753f,0x532f753f,0x964f753f,0x753f964f,0x753f753f,0x753f532f,0x061f0000,0x061f182f,0x061f000f,0x061f171f,0x181f181f,0x061f181f,0x061f000f,0x0000000f,0x041f0000,0x071f182f,0x071f181f,0x061f181f,0x061f020f,0x171f182f,0x071f181f,0x0000061f,0x061f0000,0xddafdd9f,0xdd9fddaf,0xddafdd9f,0xdd9fddaf,0xddafdd9f,0xdd9fdd9f,0x0000061f, +0xaabfaabf,0xaabfaabf,0x9aafaabf,0xaabfaabf,0xabcfaabf,0xaabf99af,0x9abf9aaf,0x9abf9aaf,0xeedf9e3f,0x00009c6f,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0x854f322f,0x532f964f,0x532f964f,0x532f853f,0x532f964f,0x532f954f,0x532f964f,0x322f854f,0x854f322f,0x964f964f,0x953f964f,0x111f753f,0x753f111f,0x954f954f,0x964f964f,0x322f854f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdddfdddf,0xeeefdddf,0xbbbfbbbf,0xeeefdddf,0xeeefcccf,0xffffffff,0xeeefdddf,0xffffffff,0x0000157f,0x0000157f,0x258f0000,0x00000000,0x00000000,0x0000147f,0x147f0000,0x157f0000,0xefffefff,0xffffefff,0xffffffff,0xefffffff,0xefffefff,0xefffefff,0xefffffff,0xefffefff,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af9fff9,0x7af97af9,0x7af97af9,0x7af97af9, +0x964f964f,0x753f532f,0x532f753f,0x753f532f,0x753f753f,0x753f753f,0xb85fb85f,0x964f753f,0x061f0000,0x181f182f,0x182f061f,0x000f061f,0x181f061f,0x182f181f,0x181f061f,0x0000061f,0x041f0000,0x171f182f,0x182f172f,0x000f051f,0x071f041f,0x071f182f,0x071f182f,0x0000061f,0x061f0000,0xdd9fdd9f,0xdd9fdd9f,0xdd9fdd9f,0xdd9fdd9f,0xddafdd9f,0xdd9fdd9f,0x0000061f, +0x899f99af,0x9aafaabf,0xaabf9aaf,0x9aafaabf,0xaabf9abf,0xaabfaabf,0xaabf9abf,0xaabf99af,0x8a5f7c2f,0x0000684f,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0xeedf0000,0x00009c6f,0x753f322f,0x321f853f,0x432f853f,0x422f954f,0x321f853f,0x421f853f,0x321f964f,0x322f753f,0x753f322f,0x853f853f,0x964f853f,0x111f753f,0x753f111f,0x953f853f,0x853f964f,0x322f753f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xffffffff,0xeeefeeef,0xffffffff,0xeeefeeef,0xeeefffff,0xeeefdddf,0xdddfeeef,0xdddfcccf,0x157f023f,0x157f134f,0x234f157f,0x157f046f,0x157f269f,0x157f245f,0x245f147f,0x134f268f,0xffffffff,0xefffffff,0xefffefff,0xefffefff,0xefffefff,0xffffefff,0xefffffff,0xefffefff,0x7af97af9,0x7af97af9,0x7af97af9,0xfff97af9,0x7af97af9,0x7af97af9,0xfff97af9,0x7af97af9, +0x964f964f,0xb85f753f,0x753fb85f,0x964fb85f,0xb85f532f,0x753fb85f,0x964f964f,0x753f888f,0x000f0000,0x181f051f,0x181f182f,0x182f181f,0x061f181f,0x061f171f,0x181f182f,0x0000061f,0x041f000f,0x071f182f,0x182f181f,0x031f061f,0x171f041f,0x071f182f,0x051f182f,0x000f000f,0x061f0000,0xdd9fdd9f,0xdd9fddaf,0xdd9fdd9f,0xdd9fdd9f,0xddafdd9f,0xdd9fddaf,0x0000061f, +0xaabfaabf,0xaabf889f,0xaabf99af,0x9abf9aaf,0xaabfaabf,0x9aafaabf,0x9aaf9abf,0x9abf9aaf,0xad7f0000,0x00008a5f,0xeedf7c2f,0x00009c6f,0xad7f9e3f,0x00008a5f,0x8a5f0000,0x0000684f,0x854f322f,0x954f532f,0x964f532f,0x853f532f,0x853f532f,0x954f532f,0x954f532f,0x322f854f,0x854f322f,0x954f954f,0x964f964f,0x111f753f,0x753f111f,0x954f954f,0x954f954f,0x322f854f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xcccfcccf,0xeeefeeef,0xdddfdddf,0xeeefeeef,0xcccfcccf,0xeeefdddf,0xbbbfbbbf,0xeeefdddf,0x0000046f,0x0000258f,0x268f0000,0x00000000,0x00000000,0x0000157f,0x157f0000,0x157f0000,0xefffffff,0xefffefff,0xefffefff,0xefffefff,0xefffefff,0xffffefff,0xefffefff,0xefffefff,0x7af97af9,0x7af97af9,0x7af97af9,0x7af98bf9,0x7af97af9,0x7af97af9,0x7af9fff9,0x7af97af9, +0x753f964f,0x964f753f,0xb85f964f,0x964f753f,0x964f666f,0x753f964f,0x964f532f,0x532f753f,0x061f0000,0x181f182f,0x061f182f,0x182f181f,0x000f061f,0x000f061f,0x181f061f,0x0000000f,0x041f0000,0x071f182f,0x182f172f,0x061f071f,0x171f041f,0x171f182f,0x061f182f,0x0000031f,0x061f0000,0xdd9fdd9f,0xddafddaf,0xdd9fdd9f,0xddafddaf,0xddafddaf,0xdd9fdd9f,0x0000061f, +0xaabf99af,0x99afaabf,0x9aafaabf,0x9aafaabf,0xaabfaabf,0xabcf9aaf,0x9aaf9aaf,0x99af9aaf,0xad7f0000,0x00008a5f,0x8a5f0000,0x0000684f,0xad7f7c2f,0x00008a5f,0xad7f0000,0x00008a5f,0x853f322f,0x953f421f,0x954f421f,0x953f421f,0x953f421f,0x953f421f,0x954f421f,0x322f853f,0x853f322f,0x953f953f,0x954f954f,0x111f753f,0x753f111f,0x953f953f,0x954f954f,0x322f853f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdddfdddf,0xbbbfbbbf,0xffffffff,0xbbbfcccf,0xeeefdddf,0xeeefeeef,0xffffffff,0xcccfeeef,0x0000157f,0x0000157f,0x157f0000,0x00000000,0x00000000,0x0000157f,0x157f0000,0x157f0000,0xffffefff,0xefffefff,0xefffefff,0xffffefff,0xffffffff,0xefffefff,0xefffefff,0xefffefff,0x8bf97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0xfff97af9,0x7af97af9,0x7af97af9, +0x532f753f,0x753f964f,0x964f964f,0x753fb85f,0x753f753f,0x753f753f,0x753f753f,0xb85fb85f,0x061f0000,0x181f182f,0x000f061f,0x182f181f,0x061f182f,0x061f181f,0x182f182f,0x0000061f,0x000f000f,0x071f061f,0x182f172f,0x061f071f,0x051f000f,0x171f182f,0x071f171f,0x000f061f,0x061f0000,0xdd9fdd9f,0xddafdd9f,0xdd9fdd9f,0xdd9fdd9f,0xddafddaf,0xdd9fddaf,0x0000061f, +0xaabfaabf,0xaabf9aaf,0x9aafaabf,0x99afaabf,0xaabf99af,0x9aaf9aaf,0xaabfaabf,0x9aaf9aaf,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0x854f322f,0x532f964f,0x532f964f,0x532f964f,0x532f853f,0x532f853f,0x532f954f,0x322f854f,0x854f322f,0x964f964f,0x853f964f,0x111f753f,0x753f111f,0x853f853f,0x953f954f,0x322f854f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xeeefeeef,0xffffffff,0xeeefffff,0xdddfeeef,0xdddfbbbf,0xffffeeef,0xdddfdddf,0xffffffff,0x147f245f,0x157f245f,0x245f157f,0x157f157f,0x258f157f,0x147f245f,0x134f157f,0x245f157f,0xefffefff,0xefffefff,0xefffefff,0xefffefff,0xefffffff,0xefffefff,0xffffffff,0xefffefff,0x7af98bf9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af98bf9,0x7af97af9,0x7af97af9, +0x964f753f,0x753f753f,0x753f532f,0x964f964f,0x532f753f,0x532fb85f,0xb85f753f,0x964f964f,0x061f0000,0x181f051f,0x061f182f,0x071f051f,0x051f182f,0x182f181f,0x051f051f,0x0000061f,0x020f0000,0x171f071f,0x182f181f,0x061f071f,0x061f020f,0x171f172f,0x182f182f,0x0000061f,0x061f0000,0xdd9fdd9f,0xdd9fdd9f,0xdd9fdd9f,0xdd9fdd9f,0xdd9fdd9f,0xdd9fdd9f,0x0000061f, +0xaabfabcf,0x899f99af,0x9aaf9aaf,0xaabf9aaf,0xaabfaabf,0xaabfaabf,0x9aafaabf,0x9abfaabf,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0xeedf0000,0x00009c6f,0xad7f7c2f,0x00008a5f,0x753f322f,0x432f953f,0x432f964f,0x321f964f,0x422f964f,0x321f954f,0x321f853f,0x322f753f,0x753f322f,0x964f953f,0x964f964f,0x753f964f,0x954f753f,0x853f954f,0x853f853f,0x322f753f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xffffffff,0xdddfdddf,0xeeefffff,0xeeefeeef,0xeeefffff,0xdddfdddf,0xeeefeeef,0xcccfdddf,0x0000046f,0x0000258f,0x157f0000,0x00000000,0x00000000,0x0000258f,0x147f0000,0x157f0000,0xefffffff,0xefffffff,0xefffefff,0xffffefff,0xffffffff,0xffffffff,0xefffffff,0xefffefff,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9, +0x753f964f,0xb85f532f,0x532f753f,0x532f753f,0x753f753f,0x532f753f,0x753f753f,0x964f964f,0x061f0000,0x020f000f,0x061f061f,0x061f000f,0x000f020f,0x061f061f,0x020f000f,0x0000061f,0x041f0000,0x182f172f,0x182f071f,0x000f051f,0x172f041f,0x171f182f,0x171f182f,0x0000061f,0x061f0000,0x061f061f,0x061f061f,0x061f061f,0x061f061f,0x061f061f,0x061f061f,0x0000061f, +0x9abfaabf,0x9aaf9aaf,0x9abfaabf,0xaabfaabf,0xaabf899f,0x9aaf99af,0x99afaabf,0xaabf9aaf,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0x8a5f0000,0x0000684f,0xad7f0000,0x00008a5f,0x754f322f,0x753f753f,0x854f753f,0x753f854f,0x854f854f,0x854f753f,0x854f854f,0x322f754f,0x754f322f,0x753f753f,0x854f753f,0x753f854f,0x854f854f,0x854f753f,0x854f854f,0x322f754f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xcccfcccf,0xeeefffff,0xdddfcccf,0xffffffff,0xdddfdddf,0xffffeeef,0xcccfcccf,0xffffeeef,0x157f245f,0x157f245f,0x245f157f,0x157f157f,0x157f258f,0x157f124f,0x356f157f,0x245f157f,0xffffffff,0xefffffff,0xefffefff,0xefffefff,0xefffefff,0xffffefff,0xefffefff,0xffffefff,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9,0x7af97af9, +0x753f964f,0x964fb85f,0x753f964f,0x964f888f,0x964f964f,0x753f753f,0x964f964f,0x532f753f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x041f0000,0x182f172f,0x181f171f,0x031f061f,0x181f041f,0x071f172f,0x171f181f,0x0000061f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xaabf9aaf,0x99af9aaf,0xaabfabcf,0xaabf99af,0xaabf9abf,0x9aaf9aaf,0x9abf9aaf,0x99af9aaf,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0xad7f0000,0x00008a5f,0x322f222f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x322f222f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x322f322f,0x322f322f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xa84fb95f,0xa84fa84f,0xb95fa84f,0xa94fb95f,0xb95fa84f,0xb95fb95f,0xb95fb95f,0x863fb95f,0xaaafaaaf,0xaaafaaaf,0xbbbfbbbf,0xbbbfcccf,0xbbbfbbbf,0xcccfcccf,0xcccfcccf,0xbbbfcccf,0x00000000,0x542f873f,0x00000000,0x00000000,0x00000000,0x00000000,0x652fa85f,0x00000000, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x420f741f,0x631f731f,0x420f420f,0x631f631f,0x310f420f,0x420f631f,0x631f531f,0x731f420f,0x632f964f,0x964f964f,0x632f632f,0x964f964f,0x421f632f,0x632f964f,0x964f753f,0x964f632f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00006c0f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x0000661f,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x963fb95f,0x752f863f,0x863f863f,0x863f863f,0x863f863f,0x863f863f,0x863f863f,0x641f963f,0xcccfbbbf,0xbbbfbbbf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xaaafcccf,0xa84f0000,0x431fa84f,0x873f873f,0xa84fa84f,0xa85fa85f,0xa84fa85f,0x642f873f,0x0000a84f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x310f420f,0x521f531f,0x420f520f,0x631f310f,0x310f420f,0x420f520f,0x420f420f,0x731f310f,0x421f632f,0x753f753f,0x632f753f,0x964f421f,0x421f632f,0x632f753f,0x632f632f,0x964f421f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00005b0f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x280f9b0f,0x00000000,0x00000000,0x00000000,0x00000000,0x761f0000,0x00000000,0x00000000,0x110f871f,0x00000000,0x00000000,0x0000761f,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x963fb95f,0x752f752f,0x752f752f,0x863f852f,0x852f852f,0x852f852f,0x963f642f,0x641f963f,0xcccfcccf,0xbbbfbbbf,0xbbbfbbbf,0xcccfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xcccfbbbf,0xaaafbbbf,0x642f0000,0x542f873f,0x642f642f,0x642f642f,0x642f642f,0x542f542f,0x652f642f,0x0000642f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x310f731f,0x631f631f,0x420f520f,0x420f210f,0x210f420f,0x420f631f,0x420f420f,0x531f420f,0x421f964f,0x964f964f,0x632f753f,0x753f421f,0x421f753f,0x632f964f,0x632f632f,0x753f632f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x160f5b0f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x360f890f,0x00000000,0x00000000,0x00000000,0x00000000,0x761f0000,0x0000220f,0x00000000,0x871f0000,0x00000000,0x00000000,0x220f871f,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x752f973f,0x0000642f,0x00000000,0x973f0000,0x0000642f,0x00000000,0x963f0000,0x531f752f,0xbbbfbbbf,0x0000bbbf,0x00000000,0xcccf0000,0x0000bbbf,0x00000000,0xcccf0000,0xaaafbbbf,0x00000000,0x431f542f,0x00000000,0x00000000,0x00000000,0x00000000,0x431f542f,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x420f531f,0x333f631f,0x320f520f,0x531f320f,0x210f420f,0x420f420f,0x420f420f,0x631f310f,0x632f753f,0x555f964f,0x632f753f,0x964f632f,0x421f753f,0x753f753f,0x632f632f,0x964f421f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000c0f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x160f5c0f,0x00000000,0x00000000,0x00000000,0x00000000,0x591f0000,0x00000000,0x00000000,0x5a0f0000,0x00000000,0x00000000,0x00006b0f,0x00000000,0x00000000,0x0000970f,0x761f0000,0x9a0f0000,0x0000330f,0x970f0000,0x330f0000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x752f333f,0x0000752f,0x00000000,0xa84f0000,0x0000852f,0x00000000,0xa84f0000,0x742f863f,0xbbbf444f,0x0000bbbf,0x00000000,0xcccf0000,0x0000bbbf,0x00000000,0xcccf0000,0xaaafcccf,0x00000000,0x542f873f,0x00000000,0x00000000,0x00000000,0x00000000,0x642fa84f,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x420f531f,0x520f520f,0x320f320f,0x420f531f,0x210f420f,0x222f531f,0x420f420f,0x631f310f,0x632f753f,0x753f753f,0x632f632f,0x753f964f,0x421f753f,0x555f964f,0x632f753f,0x964f421f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x180f0a0f,0x00000000,0x00000000,0x00000000,0x00000000,0x5a0f0000,0x00000000,0x00000000,0x481f0000,0x00000000,0x00000000,0x00005c0f,0x00000000,0x6b0f0000,0x0000150f,0x6c0f0000,0x9c0f0000,0x0000160f,0x00000000,0x160f5a0f,0x00000000,0x00000000,0x440f9b0f,0x970f0000,0x9a0f220f,0x761f350f,0x9a0f0000,0x00000000,0x0000761f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x863f666f,0x0000642f,0x00000000,0xa84f0000,0x0000852f,0x00000000,0xa84f0000,0x641f863f,0xcccf888f,0x0000bbbf,0x00000000,0xcccf0000,0x0000bbbf,0x00000000,0xcccf0000,0xaaafcccf,0xa84f0000,0x642f642f,0xa85fa85f,0x873fa85f,0x873f873f,0xa85f642f,0x542f873f,0x0000a84f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x420f420f,0x420f631f,0x320f320f,0x521f210f,0x310f310f,0x210f521f,0x420f420f,0x631f631f,0x632f632f,0x632f964f,0x632f632f,0x964f421f,0x632f632f,0x421f964f,0x632f753f,0x964f964f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x0000090f,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x060f0c0f,0x00000000,0x00000000,0x00000000,0x00000000,0x5c0f0000,0x0000160f,0x591f0000,0x5a0f0000,0x0000030f,0x00000000,0x170f5c0f,0x00000000,0x00000000,0x00005a0f,0x6b0f0000,0x9b0f270f,0x0000481f,0x591f0000,0x160f0000,0x00000000,0x0000551f,0x460f9a0f,0x0000871f,0x890f440f,0x871f350f,0xab0f220f,0x00000000,0x110f871f, +0x00000000,0x00000000,0x00000000,0xfd0f0000,0x0000f80f,0x00000000,0x00000000,0x00000000,0x963fb95f,0x963f963f,0xa84fa84f,0xa84fa84f,0x863f863f,0x973fa84f,0xa84fa84f,0x742f963f,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xaaafcccf,0x642f0000,0x642fa85f,0x542f542f,0x642f542f,0x642f642f,0x542f542f,0x652fa85f,0x0000642f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x520f631f,0x420f631f,0x210f320f,0x420f210f,0x210f310f,0x420f521f,0x420f420f,0x520f631f,0x753f964f,0x753f964f,0x421f632f,0x753f421f,0x421f632f,0x753f964f,0x632f753f,0x753f964f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x040f0c0f,0x00000000,0x00000000,0x00000000,0x00000000, +0x0c0f0000,0x00000000,0x00000000,0x0a0f0000,0x00000000,0x00000000,0x00000d0f,0x00000000,0x00000000,0x00005b0f,0x5c0f0000,0x5a0f050f,0x0000160f,0x5a0f0000,0x00000000,0x00000000,0x00000000,0x160f8a0f,0x00006d0f,0x8a0f160f,0x6d0f370f,0x8a0f0000,0x00000000,0x00000000,0x000f871f,0x350fab0f,0x330f9a0f,0x780f0000,0x9a0f240f,0x780f330f,0x761f0000,0x330f0000, +0x00000000,0x00000000,0x00000000,0xff9f0000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x752f973f,0x642f642f,0x642f642f,0x752f642f,0x642f642f,0x642f642f,0x752f642f,0x531f752f,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xaaafbbbf,0x00000000,0x431f542f,0x00000000,0x00000000,0x00000000,0x00000000,0x431f542f,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x310f631f,0x420f520f,0x210f320f,0x520f210f,0x210f310f,0x420f420f,0x320f320f,0x520f631f,0x421f964f,0x753f753f,0x421f632f,0x964f421f,0x421f632f,0x753f753f,0x632f632f,0x753f964f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x191f0b0f,0x00000000,0x00000000,0x00000000,0x00000000, +0x0c0f0000,0x0000180f,0x0a0f0000,0x491f0000,0x0000060f,0x00000000,0x291f0c0f,0x00000000,0x00000000,0x170f5a0f,0x00006c0f,0x5b0f280f,0x5b0f050f,0x5a0f0000,0x00000000,0x00000000,0x00000000,0x350f9c0f,0x291f8a0f,0x9b0f0000,0x9b0f350f,0x8a0f291f,0x00000000,0x00006b0f,0x440f9a0f,0x470fab0f,0x350fab0f,0x890f0000,0x9a0f130f,0xab0f360f,0x9a0f0000,0x0000220f, +0x00000000,0x00000000,0x00000000,0x763f0000,0x0000432f,0x00000000,0x00000000,0x00000000,0x963fb95f,0x0000852f,0x00000000,0xa84f0000,0x0000852f,0x00000000,0xa84f0000,0x641f963f,0xcccfcccf,0x0000cccf,0x00000000,0xcccf0000,0x0000bbbf,0x00000000,0xcccf0000,0xaaafbbbf,0x00000000,0x652fa85f,0x00000000,0x00000000,0x00000000,0x00000000,0x652fa85f,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x310f531f,0x420f520f,0x310f320f,0x520f210f,0x210f310f,0x310f521f,0x210f320f,0x420f520f,0x421f753f,0x753f753f,0x632f632f,0x964f421f,0x421f632f,0x632f964f,0x421f632f,0x632f753f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x0000081f,0x00000000,0x00000000,0x00000000,0x00000000,0x0b0f0000,0x00000000,0x00000000,0x0c0f0000,0x00000000,0x00000000,0x00000b0f,0x00000000, +0x00000000,0x00000b0f,0x0b0f0000,0x5c0f060f,0x0000040f,0x0a0f0000,0x180f0000,0x00000000,0x00000000,0x160f5c0f,0x280f5c0f,0x790f0000,0x591f170f,0x5c0f160f,0x00000000,0x00005b0f,0x00006b0f,0x470f9b0f,0x250f890f,0x8a0f0000,0x8a0f360f,0x9a0f370f,0x481f0000,0x170f0000,0x350fab0f,0x470f9a0f,0x470f890f,0x9a0f0000,0x9a0f240f,0x780f350f,0x780f0000,0x0000360f, +0x00000000,0x00000000,0x00000000,0x974f0000,0x0000321f,0x00000000,0x00000000,0x00000000,0x863fa84f,0x0000752f,0x00000000,0xa84f0000,0x0000752f,0x00000000,0xa84f0000,0x641f863f,0xcccfcccf,0x0000bbbf,0x00000000,0xcccf0000,0x0000bbbf,0x00000000,0xcccf0000,0xaaafcccf,0xa84f0000,0x542f873f,0xa85fa85f,0x873f873f,0x873f873f,0xa84fa84f,0x542fa85f,0x0000a84f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x310f531f,0x420f631f,0x420f320f,0x521f310f,0x310f420f,0x320f521f,0x210f320f,0x520f631f,0x421f753f,0x632f964f,0x753f632f,0x964f632f,0x632f753f,0x632f964f,0x421f632f,0x753f964f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x030f091f,0x00000000,0x00000000,0x00000000,0x00000000,0x0a0f0000,0x0000060f,0x0c0f0000,0x4b0f0000,0x0000180f,0x00000000,0x170f0c0f,0x00000000, +0x00000000,0x170f5c0f,0x00000a0f,0x5b0f170f,0x0a0f170f,0x5b0f0000,0x00000000,0x00000000,0x00005b0f,0x170f5b0f,0x170f5c0f,0x9c0f0000,0x5a0f140f,0x5c0f050f,0x5a0f0000,0x160f0000,0x170f9b0f,0x370f780f,0x250f8a0f,0x890f0000,0x8a0f350f,0x8a0f250f,0x9a0f0000,0x0000030f,0x470f890f,0x360f890f,0x240f9b0f,0x890f0000,0x780f360f,0x780f360f,0x780f0000,0x0000130f, +0x00000000,0x00000000,0x00000000,0x974f0000,0x0000432f,0x00000000,0x00000000,0x00000000,0x863fb95f,0x0000852f,0x00000000,0xa84f0000,0x0000752f,0x00000000,0xa84f0000,0x641f863f,0xcccfcccf,0x0000bbbf,0x00000000,0xcccf0000,0x0000bbbf,0x00000000,0xcccf0000,0xaaafbbbf,0x642f0000,0x642fa84f,0x542f542f,0x642f542f,0x642f642f,0x642f642f,0x642fa84f,0x0000642f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x420f531f,0x631f631f,0x320f420f,0x420f210f,0x310f420f,0x531f210f,0x631f320f,0x420f333f,0x632f753f,0x964f964f,0x632f753f,0x753f421f,0x632f753f,0x964f421f,0x964f632f,0x632f666f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000b1f,0x00000000,0x00000000,0x00000000,0x00000000,0x0d0f0000,0x00000000,0x00000000,0x0b1f0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000b0f,0x090f0000,0x4b0f180f,0x0000060f,0x0a0f0000,0x180f0000,0x00000000, +0x00000000,0x170f5b0f,0x160f4a0f,0x790f0000,0x5b0f160f,0x5b0f160f,0x00000000,0x00000e0f,0x170f5a0f,0x170f790f,0x280f8b0f,0x8b0f0000,0x9c0f470f,0x5b0f150f,0x5b0f0000,0x0000150f,0x360f8a0f,0x130f890f,0x350f890f,0x890f0000,0x780f240f,0x8a0f250f,0x8a0f0000,0x0000360f,0x240f9a0f,0x240f780f,0x460fab0f,0x890f0000,0x780f240f,0x890f130f,0x9a0f0000,0x0000120f, +0x00000000,0x00000000,0x00000000,0x975f0000,0x0000432f,0x00000000,0x00000000,0x00000000,0x752f973f,0x973f752f,0x963f963f,0x973f963f,0x973f752f,0x973f973f,0x963f963f,0x531f752f,0xbbbfbbbf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfbbbf,0xcccfcccf,0xbbbfbbbf,0x999fbbbf,0x00000000,0x431f642f,0x00000000,0x00000000,0x00000000,0x00000000,0x431f542f,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x420f531f,0x631f420f,0x320f520f,0x420f320f,0x420f222f,0x631f210f,0x631f420f,0x310f420f,0x632f753f,0x964f632f,0x632f753f,0x753f632f,0x753f555f,0x964f421f,0x964f632f,0x421f632f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x070f0a1f,0x00000000,0x00000000,0x00000000,0x00000000,0x0c1f0000,0x0000191f,0x00000000,0x4b0f0000,0x0000070f,0x00000000,0x00000b1f,0x00000000,0x00000000,0x170f491f,0x00000c0f,0x4b0f050f,0x080f170f,0x4b0f0000,0x00000000,0x00000000, +0x0000090f,0x170f5b0f,0x060f481f,0x690f0000,0x491f140f,0x491f170f,0x080f0000,0x2a1f0000,0x160f5b0f,0x240f8a0f,0x370f560f,0x790f0000,0x790f360f,0x790f470f,0x790f0000,0x0000160f,0x250f9a0f,0x250f890f,0x240f780f,0x780f0000,0x780f240f,0x780f130f,0x8a0f0000,0x0000350f,0x350f890f,0x130f780f,0x470f890f,0x671f0000,0x780f240f,0x671f130f,0x890f0000,0x0000350f, +0x00000000,0x00000000,0x00000000,0x974f0000,0x0000321f,0x00000000,0x00000000,0x00000000,0x963fb95f,0xa84f963f,0xa84fa84f,0xa84fa84f,0xa84f863f,0xa84fa84f,0x973fa84f,0x742f963f,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xbbbfcccf,0xaaafbbbf,0x00000000,0x652fa85f,0x00000000,0x00000000,0x00000000,0x00000000,0x431fa84f,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x310f420f,0x631f420f,0x420f520f,0x631f210f,0x420f320f,0x520f420f,0x631f420f,0x631f631f,0x421f632f,0x964f632f,0x632f753f,0x964f421f,0x632f632f,0x753f632f,0x964f632f,0x964f964f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x0e1f0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000d0f,0x0c0f0000,0x4a0f0000,0x0000060f,0x0a1f0000,0x070f0000,0x00000000,0x00000000,0x050f4c0f,0x191f4a0f,0x7c0f0000,0x4a0f060f,0x4a0f030f,0x00000000,0x00000b0f, +0x040f5c0f,0x170f8a0f,0x030f790f,0x680f0000,0x790f140f,0x491f040f,0x491f0000,0x0000040f,0x160f790f,0x360f790f,0x010f790f,0x670f0000,0x670f140f,0x790f140f,0x8a0f0000,0x0000250f,0x360f790f,0x240f780f,0x130f890f,0x671f0000,0x671f130f,0x671f130f,0x671f0000,0x0000360f,0x240f780f,0x130f670f,0x240f671f,0x671f0000,0x671f020f,0x670f130f,0x671f0000,0x0000240f, +0x00000000,0x00000000,0x00000000,0x653f0000,0x0000331f,0x00000000,0x00000000,0x00000000,0x863fa94f,0x852f642f,0x852f852f,0x863f852f,0x852f852f,0x752f852f,0x863f752f,0x742f863f,0xcccfcccf,0xbbbfbbbf,0xcccfcccf,0xcccfcccf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xaaafbbbf,0xa84f0000,0x652f642f,0xa85f873f,0x873fa85f,0xa85fa85f,0xa84f873f,0x542f873f,0x0000a84f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x531f420f,0x521f420f,0x420f421f,0x631f420f,0x420f631f,0x520f310f,0x310f420f,0x531f531f,0x753f632f,0x753f632f,0x632f542f,0x964f632f,0x632f964f,0x753f421f,0x421f632f,0x753f753f, +0x00000000,0x00000000,0x00000000,0x00000b1f,0x00000000,0x00000000,0x00000000,0x00000000,0x0b1f0000,0x00000000,0x00000000,0x3b0f0000,0x00001a1f,0x00000000,0x00000c1f,0x00000000,0x00000000,0x1a1f381f,0x00000a1f,0x391f181f,0x091f060f,0x391f0000,0x00000000,0x00000000,0x00000b0f,0x170f4b0f,0x050f391f,0x7a0f0000,0x491f370f,0x4c0f050f,0x090f0000,0x070f0000, +0x170f491f,0x260f790f,0x250f680f,0x570f0000,0x790f030f,0x680f240f,0x571f0000,0x0000040f,0x140f680f,0x140f680f,0x240f671f,0x670f0000,0x571f020f,0x790f020f,0x670f0000,0x0000360f,0x140f780f,0x130f670f,0x240f671f,0x671f0000,0x440f020f,0x671f020f,0x671f0000,0x0000020f,0x020f671f,0x020f780f,0x020f670f,0x660f0000,0x661f020f,0x561f020f,0x560f0000,0x0000020f, +0x00000000,0x00000000,0x00000000,0x974f0000,0x0000321f,0x00000000,0x00000000,0x00000000,0x963fb95f,0x863f752f,0x963f863f,0xa84f963f,0x963f852f,0x444f863f,0x111f222f,0x742f742f,0xcccfcccf,0xcccfbbbf,0xcccfcccf,0xcccfcccf,0xcccfbbbf,0xbbbfbbbf,0xaaafbbbf,0x999faaaf,0x642f0000,0x542f873f,0x542f542f,0x542f652f,0x642f642f,0x542f642f,0x652fa85f,0x0000642f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x420f631f,0x631f310f,0x420f631f,0x420f310f,0x420f631f,0x520f310f,0x310f420f,0x531f731f,0x632f753f,0x964f421f,0x632f964f,0x632f421f,0x632f964f,0x753f421f,0x421f632f,0x753f964f, +0x00000000,0x00000000,0x00000000,0x0a1f0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000d1f,0x00000000,0x3b0f0000,0x0000070f,0x0e1f0000,0x181f0000,0x00000000,0x00000000,0x030f4a1f,0x050f381f,0x580f0000,0x391f050f,0x381f040f,0x00000000,0x00000000,0x170f4b0f,0x060f690f,0x040f690f,0x680f0000,0x7a0f260f,0x4a0f040f,0x381f0000,0x0000040f, +0x040f680f,0x240f670f,0x130f680f,0x561f0000,0x680f020f,0x670f140f,0x680f0000,0x0000020f,0x030f570f,0x030f460f,0x020f450f,0x560f0000,0x560f020f,0x680f020f,0x571f0000,0x0000020f,0x130f561f,0x010f560f,0x020f671f,0x450f0000,0x560f020f,0x560f000f,0x671f0000,0x0000020f,0x020f670f,0x130f560f,0x010f671f,0x560f0000,0x560f010f,0x560f010f,0x660f0000,0x0000000f, +0x00000000,0x00000000,0x00000000,0x653f0000,0x0000321f,0x00000000,0x00000000,0x00000000,0x752f333f,0x752f642f,0x752f752f,0x963f752f,0x752f642f,0x111f752f,0x963f531f,0x531f531f,0xbbbf444f,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfaaaf,0xbbbfaaaf,0xbbbfbbbf,0x999faaaf,0x00000000,0x432f642f,0x00000000,0x00000000,0x00000000,0x00000000,0x431f431f,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x631f631f,0x731f310f,0x531f531f,0x631f420f,0x420f531f,0x631f420f,0x420f531f,0x310f731f,0x753f753f,0x964f421f,0x753f753f,0x964f632f,0x632f753f,0x964f632f,0x632f753f,0x421f964f, +0x00000000,0x00000b1f,0x00000000,0x0e1f0000,0x0000060f,0x0c1f0000,0x00000000,0x00000000,0x00000000,0x191f3c0f,0x0000091f,0x3a0f0000,0x0b1f060f,0x391f0000,0x00000000,0x00000000,0x0000091f,0x050f690f,0x030f580f,0x6a0f0000,0x571f030f,0x680f050f,0x081f0000,0x00000000,0x060f381f,0x140f690f,0x140f690f,0x690f0000,0x580f130f,0x571f250f,0x580f0000,0x0000030f, +0x020f670f,0x020f571f,0x130f680f,0x680f0000,0x561f010f,0x561f030f,0x571f0000,0x0000030f,0x020f560f,0x000f560f,0x000f450f,0x450f0000,0x450f000f,0x561f000f,0x680f0000,0x0000010f,0x010f560f,0x010f671f,0x010f671f,0x671f0000,0x450f000f,0x671f010f,0x560f0000,0x0000020f,0x020f550f,0x000f670f,0x010f550f,0x550f0000,0x440f000f,0x661f000f,0x450f0000,0x0000010f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x863f666f,0x863f752f,0x963f863f,0xa84f963f,0x963f752f,0x963f963f,0xa84f963f,0x641f963f,0xcccf888f,0xcccfbbbf,0xcccfcccf,0xcccfcccf,0xcccfbbbf,0xcccfcccf,0xcccfbbbf,0xaaafbbbf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0xa50fa50f,0xd71fd71f,0xd71fa50f,0xa50fd71f,0xd71fa50f,0xd71fd71f,0xd71fa50f,0xa50fa50f,0xa55fc77f,0x955fa55f,0x733fc86f,0x422f522f,0x800f422f,0xa55fc77f,0x422f733f,0x844fa55f, +0x643f543f,0x432f321f,0x422f321f,0x321f321f,0x432f432f,0x654f432f,0x321f432f,0x543f321f,0x752ffb5f,0x764f752f,0x764f764f,0x752ffb5f,0x764f764f,0xfb5f764f,0xc84ffb5f,0x764f752f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x963fb95f,0x973f863f,0xa84fa84f,0xa84fa84f,0xa84f863f,0xa84fa84f,0xa84fa84f,0x641f963f,0xcccfdddf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xaaafbbbf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xea4fa50f,0xea4fa50f,0xd71fe91f,0xd71fa50f,0xa50fe91f,0xe91fe91f,0xd71fe91f,0xa50fa50f,0xa55fc77f,0x844f400f,0x422f100f,0x800fc77f,0x500f422f,0x500f955f,0x622f600f,0xa66f633f, +0x543f432f,0x643f654f,0x643f654f,0x533f765f,0x321f321f,0x644f644f,0x321f321f,0x433f543f,0xffff752f,0x431fc84f,0xfb5f764f,0xffffc84f,0x764f431f,0x752ffb5f,0xfffffd9f,0x431fc84f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x963fb95f,0x863f863f,0x863f863f,0x863f863f,0x963f963f,0x863f963f,0x963f752f,0x641f963f,0xcccfdddf,0xcccfcccf,0xcccfcccf,0xcccfcccf,0xbbbfcccf,0xbbbfbbbf,0xbbbfbbbf,0xaaafbbbf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xea4fd71f,0xa50fea4f,0xe91fe91f,0xea4fa50f,0xa50fe91f,0xe91fe91f,0xa50fea4f,0xd71fd71f,0x733f533f,0x211f844f,0x800f422f,0x500fc77f,0x100f200f,0x500f744f,0x533f211f,0x855f300f, +0x432f654f,0x321f644f,0x643f321f,0x543f321f,0x321f543f,0x321f865f,0x422f432f,0x422f543f,0x752f752f,0x764f431f,0x764f752f,0x752f431f,0x764f431f,0x431f764f,0xc84fc84f,0x764f431f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x752f973f,0x642f642f,0x642f642f,0x752f642f,0x642f642f,0x642f642f,0x752f642f,0x531f752f,0xbbbfcccf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xaaafbbbf,0xaaafaaaf,0xaaafaaaf,0x999faaaf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xe91fd71f,0xe91fe91f,0xe91fa50f,0xe91fa50f,0xa50fe91f,0xd71fe91f,0xd71fa50f,0xd71fe91f,0x422f744f,0x533f100f,0x633fa55f,0xa75fa55f,0x422f311f,0x311f211f,0xb66f422f,0x533f800f, +0x321f432f,0x321f765f,0x644f765f,0x543f321f,0x321f432f,0x432f432f,0x432f432f,0x976f432f,0x431f764f,0xfb5f764f,0x752f752f,0x431f764f,0xfb5f764f,0x764f752f,0x431f431f,0x431f764f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x863fb95f,0x863f752f,0x963f863f,0xa84f963f,0x863f852f,0x752f863f,0xa84f863f,0x742f863f,0xcccfcccf,0xcccfbbbf,0xcccfcccf,0xcccfcccf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xaaafbbbf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd71fa50f,0xe91fe91f,0xd71fd71f,0xe91fa50f,0xe91fd71f,0xa50fe91f,0xea4fe91f,0xa50fd71f,0xc77fea8f,0x533f853f,0x855fc77f,0x200f855f,0x955f533f,0xa66f944f,0xa65f422f,0x533f700f, +0x432f533f,0x755f654f,0x321f321f,0x865f432f,0x654f432f,0x765f543f,0x432f865f,0x543f533f,0x764f764f,0xc84ffb5f,0xc84ffd9f,0x764f431f,0xc84ffb5f,0x431f752f,0x764f764f,0x431ffb5f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x863fa84f,0x863f642f,0x863f863f,0xa84f963f,0x863f852f,0x863f863f,0xa84f863f,0x641f863f,0xcccfcccf,0xcccfbbbf,0xcccfcccf,0xcccfcccf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xaaafbbbf,0x00000000,0x00000000,0x00000000,0xf00f0000,0x0000f00f,0x00000000,0x00000000,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa50fa50f,0xa50fa50f,0xa50fe91f,0x320f320f,0xe91fe91f,0xe91fa50f,0xa50fd71f,0xa50fa50f,0x855f400f,0x533f733f,0x600f633f,0x311f844f,0xd88fb66f,0x955f844f,0x533f954f,0x211f100f, +0x321f432f,0x644f321f,0x533f321f,0x654f321f,0x432f321f,0x321f543f,0x754f654f,0x422f876f,0x752f764f,0xfd9f752f,0xfd9fffff,0x764f431f,0xffffc84f,0x431f431f,0xfb5f764f,0x431fc84f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x777f0000,0x0000777f,0x00000000,0x00000000,0x00000000,0x963fb95f,0x863f852f,0x963f963f,0xa84f963f,0x863f752f,0x963f752f,0xa84f963f,0x742f963f,0xbbbfcccf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfaaaf,0xbbbfaaaf,0xbbbfbbbf,0xaaafbbbf,0x00000000,0x00000000,0x00000000,0xfd0ff00f,0xf00ff80f,0x00000000,0x00000000,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xe91fd71f,0xe91fe91f,0x320fa50f,0xb80fea0f,0xa50f320f,0xd71fe91f,0xe91fa50f,0xd71fd71f,0x844f500f,0x533f733f,0x100f522f,0x522f311f,0x600f633f,0x844fb66f,0x844f633f,0x300f500f, +0x654f321f,0x432f321f,0x654f865f,0x321f654f,0x321f432f,0x321f865f,0x654f644f,0x654f432f,0x431f764f,0xc84f431f,0xc84ffd9f,0x764f431f,0x431f752f,0x764f764f,0xc84f752f,0x431fffff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x888f0000,0x0000777f,0x00000000,0x00000000,0x00000000,0x752f973f,0x963f752f,0x963f963f,0x973f963f,0x973f752f,0x963f963f,0x963f963f,0x531f752f,0xaaafbbbf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0xaaaf999f,0xaaafaaaf,0xaaafaaaf,0x888faaaf,0x00000000,0x00000000,0x00000000,0xff9ff00f,0xf00fffff,0x00000000,0x00000000,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd71fa50f,0xe91fd71f,0x320fe91f,0xea0fb80f,0x320fb80f,0xa50fa50f,0xe91fe91f,0xd71fea4f,0x844f733f,0x522f211f,0xc77f955f,0x422f422f,0x200f633f,0x955f311f,0x311f500f,0x911f400f, +0x644f654f,0x432f654f,0x432f432f,0x432f321f,0x654f543f,0x543f644f,0x644f644f,0x754f321f,0x764f764f,0x431f764f,0x752f752f,0x764f431f,0x764f431f,0x752ffb5f,0x752f764f,0x431ffd9f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x763f0000,0x0000653f,0x00000000,0x00000000,0x00000000,0x963fb95f,0x963f963f,0x752f963f,0x963f863f,0x863f963f,0x863f863f,0x963f963f,0x641f963f,0xaaafaaaf,0xaaafaaaf,0x999faaaf,0x999f999f,0x999f999f,0x999f999f,0x999f999f,0x777f999f,0x00000000,0x00000000,0x00000000,0xf00f0000,0x0000a00f,0x00000000,0x00000000,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa50fd71f,0xa50fa50f,0xa50fa50f,0xb80f320f,0xa50fea0f,0xd71fe91f,0xa50fa50f,0xa50fa50f,0x100f733f,0x800f533f,0xa75f800f,0xa55f964f,0x733fb66f,0x422f522f,0x000f211f,0xda7fd88f, +0x987f654f,0x432f754f,0x654f543f,0x321f432f,0x432f432f,0x321f644f,0x321f321f,0x644f643f,0xc84ffb5f,0x764f752f,0x752f431f,0x764f431f,0xfb5f764f,0x752fc84f,0x764f431f,0x431f752f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x763f0000,0x0000432f,0x00000000,0x00000000,0x00000000,0x863fa84f,0x752f752f,0x852f752f,0x863f852f,0x752f752f,0x642f752f,0x863f852f,0x641f863f,0x999faaaf,0x999f999f,0x999f999f,0x999f999f,0x888f999f,0x888f888f,0x999f999f,0x888f999f,0x00000000,0x00000000,0x00000000,0x974f0000,0x0000321f,0x00000000,0x00000000,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xea4fd71f,0xe91fe91f,0xe91fe91f,0x320fa50f,0xa50fa50f,0xa50fe91f,0xd71fe91f,0xd71fd71f,0x422f744f,0x800fc77f,0x311f600f,0x400fa55f,0x844fea8f,0x533fb86f,0xd77f522f,0x500f500f, +0x543f422f,0x643f532f,0x865f765f,0x321f765f,0x765f543f,0x321f432f,0x321f321f,0x654f422f,0xfffffb5f,0x431ffd9f,0x431f764f,0xfb5f764f,0xc84f752f,0xc84fffff,0x764f431f,0x431f752f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x653f0000,0x0000321f,0x00000000,0x00000000,0x00000000,0x863f333f,0x863f852f,0x963f963f,0xa84f863f,0x863f752f,0x863f863f,0xa84f863f,0x641f863f,0x999f444f,0x999f999f,0x999f999f,0x999f999f,0x999f888f,0x999f999f,0x999f999f,0x777f999f,0x00000000,0x00000000,0x00000000,0x974f0000,0x0000432f,0x00000000,0x00000000,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xe91fa50f,0xa50fd71f,0xa50fa50f,0xa50fea4f,0xa50fe91f,0xd71fea4f,0xe91fa50f,0xd71fea4f,0x700f422f,0x844fa65f,0x100f733f,0x600fa55f,0x733f844f,0x100f744f,0x422f633f,0x733f700f, +0x432f432f,0x754f654f,0x321f321f,0x432f754f,0x654f432f,0x543f654f,0x321f644f,0x654f321f,0x752f752f,0x764f431f,0x764f764f,0x764f764f,0x752f431f,0x752fc84f,0x764f431f,0x764f431f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x653f0000,0x0000321f,0x00000000,0x00000000,0x00000000,0x752f666f,0x752f642f,0x752f752f,0x973f752f,0x752f642f,0x752f752f,0x963f752f,0x531f752f,0x999f888f,0x999f888f,0x888f999f,0x999f888f,0x999f888f,0x888f888f,0x999f888f,0x777f888f,0x00000000,0x00000000,0x00000000,0x975f0000,0x0000432f,0x00000000,0x00000000,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa50fa50f,0xe91fd71f,0xa50fe91f,0xa50fe91f,0xd71fe91f,0xe91fd71f,0xd71fa50f,0xa50fe91f,0x300f533f,0x844fa66f,0x100f633f,0x500f844f,0x733f955f,0x300f211f,0x422fb66f,0x311f300f, +0x644f543f,0x765f321f,0x321f644f,0x432f643f,0x321f644f,0x654f976f,0x654f643f,0x432f876f,0x431f764f,0x752f764f,0x764f431f,0xfb5ffb5f,0x431f764f,0x431f752f,0x752f764f,0x764f764f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x653f0000,0x0000321f,0x00000000,0x00000000,0x00000000,0x963fb95f,0x963f852f,0x863f963f,0xa84f963f,0x863f752f,0x863f863f,0x973f863f,0x742f963f,0x999f999f,0x999f888f,0x999f999f,0x999f999f,0x999f888f,0x999f999f,0x999f999f,0x777f999f,0x00000000,0x00000000,0x00000000,0x974f0000,0x0000321f,0x00000000,0x00000000,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd71fd71f,0xe91fd71f,0xa50fe91f,0xa50fe91f,0xe91fea4f,0xe91fa50f,0xa50fe91f,0xd71fe91f,0xa55fc77f,0x311f211f,0x100f211f,0x500f633f,0x100f422f,0x700fc77f,0x733f844f,0x533f853f, +0x754f321f,0x754f321f,0x644f321f,0x432f643f,0x543f432f,0x654f432f,0x543f643f,0x533f432f,0x764f764f,0xc84ffb5f,0x764f431f,0x752f431f,0x764fffff,0x764f431f,0xc84ffb5f,0x431f752f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x763f0000,0x0000653f,0x00000000,0x00000000,0x00000000,0x863fa94f,0xa84f752f,0xa84fa84f,0xa84fa84f,0xa84f963f,0xa84fa84f,0xa84fa84f,0x742f863f,0x999f999f,0x999f888f,0x999f999f,0x999f999f,0x999f999f,0x999f999f,0x999f999f,0x777f999f,0x00000000,0x00000000,0x00000000,0x653f0000,0x0000331f,0x00000000,0x00000000,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xe91fd71f,0xe91fea4f,0xd71fa50f,0xa50fd71f,0xe91fea4f,0xa50fd71f,0xe91fe91f,0xd71fa50f,0x844fc77f,0xc77f633f,0xa55f700f,0x100f533f,0x911f633f,0x500fb66f,0x500f955f,0x311f744f, +0x876f422f,0x321f643f,0x321f321f,0x422f754f,0x765f543f,0x432f865f,0x432f432f,0x432f432f,0xfb5f764f,0xffffc84f,0x431ffd9f,0x431f764f,0x431fc84f,0xfb5f764f,0xffffc84f,0x431fc84f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x763f0000,0x0000653f,0x00000000,0x00000000,0x00000000,0x963fb95f,0x863f863f,0x963f863f,0x863f963f,0x963f963f,0x863f863f,0x963f963f,0x742f963f,0x999f999f,0x999f999f,0x999f999f,0x999f999f,0x999f999f,0x999f999f,0x999f999f,0x777f999f,0x00000000,0x00000000,0x00000000,0x974f0000,0x0000321f,0x00000000,0x00000000,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xe91fa50f,0xd71fe91f,0xe91fa50f,0xa50fd71f,0xe91fd71f,0xa50fe91f,0xe91fd71f,0xa50fe91f,0x955f633f,0xa66f200f,0x633f500f,0x300f500f,0x300f422f,0x600fa75f,0x844f955f,0x311f211f, +0x543f533f,0x321f865f,0x432f433f,0x321f876f,0x765f432f,0x543f543f,0x422f422f,0x765f432f,0x752f764f,0xc84f752f,0x752f752f,0x764f431f,0x431f431f,0x752f764f,0x752f752f,0x431f752f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x974f0000,0x0000653f,0x00000000,0x00000000,0x00000000,0x531f752f,0x531f531f,0x531f531f,0x531f531f,0x531f531f,0x531f531f,0x531f431f,0x531f531f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x00000000,0x00000000,0x00000000,0x653f0000,0x0000321f,0x00000000,0x00000000,0x00000000, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xa50fa50f,0xd71fa50f,0xd71fa50f,0xa50fa50f,0xd71fd71f,0xa50fa50f,0xd71fd71f,0xa50fa50f,0x633f633f,0x311f400f,0x100f511f,0x300f211f,0xa75fa55f,0x954f422f,0x311f311f,0x522f311f, +0x543f865f,0x754f654f,0x765f543f,0x321f432f,0x321f321f,0x433f543f,0x321f321f,0x876f865f,0x431f764f,0x431f431f,0x431f431f,0x764f764f,0x764f764f,0x431f764f,0x431f431f,0x431f431f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x111f111f,0x111f111f,0x111f111f,0x111f111f,0x111f111f,0x111f100f,0x111f111f,0x111f111f,0x333f333f,0x333f333f,0x444f444f,0x333f333f,0x444f444f,0x333f333f,0x444f444f,0x333f333f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x210f100f,0x531f320f,0x320f100f,0x100f431f,0x210f210f,0x321f210f,0x321f320f,0x531f210f,0xeedfbbbf,0xeeefeeef,0xbbbfeeef,0xdddfeeef,0xeeefeddf,0xffffffff,0xeeefffff,0xbbafeeef,0xa50fa50f,0xa50fd71f,0xd71fa50f,0xa50fd71f,0xd71fa50f,0xa50fa50f,0xd71fd71f,0xa50fa50f,0xa50fa50f,0xa50fd71f,0xd71fa50f,0xa50fd71f,0xd71fa50f,0xa50fa50f,0xd71fd71f,0xa50fa50f, +0xa50fa50f,0xa50fd71f,0xfd2fe91f,0xa50fd71f,0xd71fa50f,0xa50fe91f,0xd71fd71f,0xa50fa50f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xcccf0000,0xdddfdddf,0xdddfdddf,0xdddfdddf,0xdddfdddf,0xdddfdddf,0xdddfdddf,0x0000cccf,0xcccf0000,0xdddfdddf,0xdddfdddf,0x720fdddf,0x610f610f,0xdddfdddf,0xdddfdddf,0x0000cccf, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x864f0000,0x0000873f,0x00000000,0x111f111f,0x222f222f,0x111f211f,0x111f111f,0x111f111f,0x111f111f,0x111f100f,0x111f111f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x333f333f,0x444f333f,0x333f333f,0x444f333f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x210f100f,0x000f321f,0x531f100f,0x210f100f,0x100f531f,0x531f210f,0x321f110f,0x431f110f,0xeeeffeef,0xdddfdddf,0xeeefdddf,0xeeefeeef,0xeedfeeef,0xeeefeeef,0xeeefeedf,0xeeeffedf,0xea4fa50f,0xa50fe91f,0xe91fd71f,0xd71fe91f,0xe91fa50f,0xa50fe91f,0xe91fd71f,0xa50fe91f,0xea4fa50f,0xa50fe91f,0xe91fd71f,0xd71fe91f,0xe91fa50f,0xa50fe91f,0xe91fd71f,0xa50fe91f, +0xea4fa50f,0xe91fe91f,0xff3fff2f,0xd71ffd3f,0xfd3fa50f,0xe91fff3f,0xe91fd71f,0xa50fe91f,0xdddf0000,0xdddfdddf,0xdddfdddf,0xdddfdddf,0xdddfdddf,0xdddfdddf,0xdddfdddf,0x0000dddf,0xcccf0000,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0x0000cccf,0x941f0000,0xeeef720f,0x720f720f,0x720f720f,0x720f720f,0x720f720f,0x720f720f,0x0000941f, +0xa52f0000,0xa52fa52f,0xa52fa52f,0xa52fa52f,0xa52fa52f,0xa52fa52f,0xa52fa52f,0x0000a52f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x542f0000,0xaaafaaaf,0xaaafaaaf,0x211f211f,0x111f111f,0x211f211f,0x111f111f,0x211f111f,0x111f111f,0x222f211f,0x111f111f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x210f100f,0x100f210f,0x531f210f,0x210f100f,0x100f531f,0x321f210f,0x321f110f,0x531f110f,0xefefdddf,0xeeefeeef,0xeddfeeef,0xdddfeeef,0xdddfdddf,0xbbbfeeef,0xeeefeeef,0xdddfdddf,0xd71fa50f,0xa50fe91f,0xe91fa50f,0xe91fe91f,0xea4fa50f,0xa50fe91f,0xe91fe91f,0xa50fe91f,0xd71fa50f,0xa50fe91f,0x200f200f,0xe91fe91f,0xea4fa50f,0xa50f200f,0xe91fe91f,0xa50fe91f, +0xd71fa50f,0xeb1fe91f,0x400f400f,0xfd3fff3f,0xff9fe91f,0xeb1f400f,0xe91ffd3f,0xa50fe91f,0xdddf0000,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefe11f,0x0000dddf,0xcccf0000,0xcccfeeef,0xdddfcccf,0xcccfeeef,0xdddfcccf,0xcccfeeef,0xdddfcccf,0x0000cccf,0x941f0000,0x820f720f,0x720f820f,0x820f720f,0x720f720f,0x820f820f,0x720f820f,0x0000941f, +0xa52f0000,0xa52fb52f,0xb52fb52f,0xb52fb52f,0xb52fb52f,0xb52fb52f,0xb52fa52f,0x0000a52f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xaaafaaaf,0x666f666f,0x666f666f,0x111f111f,0x211f111f,0x111f111f,0x211f111f,0x111f111f,0x211f211f,0x111f111f,0x211f222f,0x333f444f,0x444f444f,0x333f444f,0x444f444f,0x444f333f,0x444f444f,0x333f444f,0x444f444f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x100f320f,0x100f210f,0x321f321f,0x210f100f,0x100f531f,0x531f210f,0x531f100f,0x321f100f,0xffffeeef,0xbbbfeeef,0x111f433f,0x333f212f,0xfeefeeef,0xefefeeef,0xeeefeeef,0xeeefdddf,0xd71fa50f,0xd71fe91f,0xe91fa50f,0xea4fd71f,0xea4fa50f,0xa50fe91f,0xe91fea4f,0xa50fd71f,0xd71fa50f,0xa50fe91f,0x410f200f,0xea4f200f,0x200fa50f,0x200f200f,0xe91fa50f,0xa50fd71f, +0xd71fa50f,0xe91ffd3f,0xba3f400f,0xff9f400f,0x400feb1f,0x400f400f,0xfd3feb1f,0xa50fd71f,0xdddf0000,0xdddfeeef,0xdddfdddf,0xdddfdddf,0xdddfdddf,0xdddfeeef,0xeeefdddf,0x0000dddf,0xcccf0000,0xa52fcccf,0xcccfa52f,0xa52fcccf,0xcccfa52f,0xa52fcccf,0xcccfa52f,0x0000cccf,0x941f0000,0x610f610f,0x610f610f,0x720f820f,0x820f820f,0x610f610f,0x610f610f,0x0000941f, +0xa52f0000,0xb52fb52f,0xb52fa52f,0xa52fb52f,0xb52fb52f,0xb52fa52f,0xb52fb52f,0x0000a52f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x00000000,0xaaafaaaf,0x666f666f,0x543f432f,0x00000000,0x111f111f,0x111f111f,0x111f111f,0x100f100f,0x111f111f,0x111f111f,0x111f111f,0x100f111f,0x444f444f,0x444f333f,0x444f444f,0x333f333f,0x444f333f,0x333f333f,0x444f444f,0x333f333f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x100f310f,0x210f320f,0x321f321f,0x210f320f,0x100f320f,0x531f310f,0x531f100f,0x321f100f,0xeeefeeef,0xbbbfbbbf,0x333fdedf,0x212f333f,0xeeef333f,0xdddfdddf,0xeddfdddf,0xdddf433f,0xd71fa50f,0xd71fe91f,0xea4fa50f,0xe91fd71f,0xe91fa50f,0xa50fd71f,0xe91fea4f,0xa50fd71f,0xd71fa50f,0x200fa50f,0x410f410f,0xa50f410f,0x200fa50f,0x410f410f,0xa50f200f,0xa50fd71f, +0xd71fa50f,0x400feb1f,0xba3fba3f,0xeb1fbb3f,0x400feb1f,0xba3fbb3f,0xeb1f400f,0xa50fd71f,0xdddf0000,0xe33feeef,0xeeefe11f,0xeeefeeef,0xe11feeef,0xeeefdddf,0xeeefeeef,0x0000dddf,0x941f0000,0xa52fa52f,0xa52fa52f,0xa52fa52f,0xa52fa52f,0xa52fa52f,0xa52fa52f,0x0000941f,0x941f0000,0x720f720f,0x720f720f,0x610f610f,0x610f610f,0x720f610f,0x720f720f,0x0000941f, +0xa52f0000,0xb52fb52f,0xb52fb52f,0xb52fb52f,0xb52fa52f,0xb52fb52f,0xb52fb52f,0x0000a52f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x864f0000,0xaaaf542f,0x666f666f,0x00000000,0x873f432f,0x00000000,0x100f111f,0x211f111f,0x100f111f,0x111f111f,0x100f111f,0x111f111f,0x111f100f,0x111f111f,0x333f333f,0x444f333f,0x333f333f,0x333f333f,0x333f333f,0x444f333f,0x333f333f,0x333f333f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x210f320f,0x210f320f,0x210f531f,0x310f210f,0x100f320f,0x431f210f,0x321f100f,0x210f100f,0x443f333f,0xffffeeef,0xfeefffff,0xffffeeef,0xeeefffff,0xffffffff,0x333feeef,0x111f111f,0xea4fa50f,0xd71fe91f,0xea4fa50f,0xe91fe91f,0xe91fa50f,0xa50fd71f,0xe91fea4f,0xa50fd71f,0xea4fa50f,0x200fa50f,0x410f410f,0xa50f410f,0x200fa50f,0x410f410f,0xa50f410f,0xa50fd71f, +0xea4fa50f,0x400fa50f,0xbb3fbb3f,0xa50fbb3f,0x400feb1f,0xbb3fbb3f,0xeb1fbb3f,0xa50ffd2f,0xdddf0000,0xe11feeef,0xeeefe11f,0xeeefeeef,0xeeefdddf,0xdddfeeef,0xeeefeeef,0x0000dddf,0x941f0000,0xb52fa52f,0xa52fb52f,0xb52fa52f,0xa52fb52f,0xb52fa52f,0xa52fb52f,0x0000941f,0x941f0000,0x820f720f,0x720f820f,0x820f720f,0x720f820f,0x820f720f,0x720f820f,0x0000941f, +0xa52f0000,0xa52fb52f,0xb52fb52f,0xb52fb52f,0xb52fb52f,0xa52fb52f,0xb52fb52f,0x0000a52f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x542f0000,0x666faaaf,0x00000000,0x00000000,0x864f642f,0x00000000,0x222f222f,0x111f211f,0x111f111f,0x111f111f,0x222f211f,0x111f111f,0x222f222f,0x111f111f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x00000000,0x00000000,0x00000000,0x500f0000,0x0000400f,0x00000000,0x00000000,0x00000000, +0x321f210f,0x320f110f,0x210f431f,0x100f210f,0x100f431f,0x210f321f,0x321f000f,0x320f100f,0xedcf333f,0xeeefddcf,0xbbbfeeef,0xdddfeedf,0xdddfdddf,0xeeefeeef,0xeeefbbbf,0xeeefeeef,0xea4fa50f,0xe91fe91f,0xea4fa50f,0xe91fe91f,0xe91fa50f,0xa50fd71f,0xe91fd71f,0xa50fa50f,0xea4fa50f,0x200fa50f,0x410f410f,0xa50f410f,0x200fa50f,0x410f410f,0x410f410f,0xa50fa50f, +0xea4fa50f,0x400fa50f,0xcc3fbb3f,0xa50fcc3f,0x400feb1f,0xcc3fcc3f,0xbb3fbb3f,0xa50feb1f,0xdddf0000,0xeeefeeef,0xdddfeeef,0xeeefeeef,0xeeefeeef,0xeeefe11f,0xeeefdddf,0x0000dddf,0x941f0000,0xb52fb52f,0xb52fb52f,0xa52fb52f,0xb52fb52f,0xb52fb52f,0xb52fa52f,0x0000941f,0x941f0000,0x820f820f,0x820f820f,0x720f820f,0x820f820f,0x820f820f,0x820f720f,0x0000941f, +0xa52f0000,0xb52fb52f,0xa52fb52f,0xb52fb52f,0xb52fb52f,0xb52fb52f,0xa52fb52f,0x0000a52f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0xaaaf0000,0x543f666f,0x0000873f,0x00000000,0x642f0000,0x0000873f,0x111f111f,0x222f222f,0x111f111f,0x211f211f,0x111f111f,0x211f111f,0x111f111f,0x211f211f,0x333f333f,0x444f444f,0x444f444f,0x444f444f,0x333f333f,0x444f444f,0x444f444f,0x444f444f,0x00000000,0x00000000,0x00000000,0x400f0000,0x0000200f,0x00000000,0x00000000,0x00000000, +0x531f320f,0x320f100f,0x100f531f,0x100f531f,0x100f531f,0x110f321f,0x321f210f,0x320f100f,0xbbbfeeef,0xeedfffff,0xdddfeeef,0xeeefdddf,0xbbbfffff,0xeeefeeef,0xdddfffff,0xdddfdddf,0xe91fa50f,0xe91fe91f,0xe91fa50f,0xe91fe91f,0xe91fa50f,0xa50fe91f,0xe91fd71f,0xa50fa50f,0xe91fa50f,0xa50fe91f,0x410f410f,0xa50fa50f,0xa50fa50f,0x410f410f,0x410f410f,0xa50fa50f, +0xe91fa50f,0xa50fe91f,0xcc3fcc3f,0xe91fa50f,0xa50fe91f,0xcc3fcd4f,0xbb3fcc3f,0xa50fa50f,0xdddf0000,0xeeefe11f,0xdddfeeef,0xe33feeef,0xdddfe11f,0xeeefdddf,0xeeefeeef,0x0000dddf,0x941f0000,0x941f941f,0x941f941f,0x941f941f,0x941f941f,0x941f941f,0x941f941f,0x0000941f,0x941f0000,0x610f610f,0x610f610f,0x610f610f,0x610f610f,0x610f610f,0x610f610f,0x0000941f, +0xa52f0000,0xb52fb52f,0xb52fb52f,0xb52fb52f,0xb52fa52f,0xb52fb52f,0xb52fb52f,0x0000a52f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x666faaaf,0x642f0000,0x873f864f,0x00000000,0x642f0000,0x0000864f,0x111f111f,0x111f111f,0x111f211f,0x111f111f,0x111f111f,0x100f111f,0x111f111f,0x111f111f,0x444f444f,0x333f333f,0x444f444f,0x333f333f,0x444f333f,0x333f333f,0x444f444f,0x333f333f,0x00000000,0x00000000,0x00000000,0x763f0000,0x0000432f,0x00000000,0x00000000,0x00000000, +0x531f210f,0x321f100f,0x100f431f,0x100f210f,0x100f210f,0x100f431f,0x320f320f,0x321f100f,0xdddfdddf,0xffffdddf,0xeeefffff,0xfffffeef,0xeeefeddf,0xeeeffeef,0xefefeeef,0xdddfdddf,0xe91fa50f,0xe91fe91f,0xd71fa50f,0xd71fe91f,0xe91fa50f,0xd71fe91f,0xe91fa50f,0xa50fd71f,0xe91fa50f,0xe91fe91f,0xa50fa50f,0xd71fa50f,0xa50fa50f,0xa50fa50f,0xa50fa50f,0xa50fd71f, +0xe91fa50f,0xff3ffd3f,0xeb1fe91f,0xd71fe91f,0xe91feb1f,0xeb1fe91f,0xeb1fe91f,0xa50ffd2f,0xdddf0000,0xdddfeeef,0xdddfeeef,0xe11feeef,0xdddfe11f,0xe33fdddf,0xeeefe11f,0x0000dddf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa52f0000,0xb52fb52f,0xb52fa52f,0xb52fa52f,0xb52fb52f,0xa52fb52f,0xb52fb52f,0x0000a52f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x666faaaf,0x00000000,0x864f642f,0x0000864f,0x642f0000,0x0000864f,0x111f111f,0x211f111f,0x100f100f,0x111f111f,0x111f111f,0x222f222f,0x111f111f,0x222f222f,0x444f333f,0x444f333f,0x333f333f,0x444f444f,0x444f333f,0x444f444f,0x444f444f,0x444f444f,0x00000000,0x00000000,0x00000000,0x974f0000,0x0000321f,0x00000000,0x00000000,0x00000000, +0x531f210f,0x210f100f,0x431f320f,0x310f100f,0x100f310f,0x100f431f,0x431f320f,0x321f100f,0xeeefeedf,0xeeefeeef,0xdddfdddf,0xdddfbbbf,0xddcfbbbf,0xeeefdddf,0xeedfefef,0xeeeffeef,0xd71fa50f,0xe91fe91f,0xd71fa50f,0xd71fe91f,0xe91fa50f,0xe91fe91f,0xe91fa50f,0xa50fd71f,0xd71fa50f,0x200fa50f,0x200fa50f,0xa50fa50f,0xa50f200f,0x200fa50f,0x200fa50f,0xa50fd71f, +0xfd2fa50f,0x400feb1f,0x400feb1f,0xeb1feb1f,0xeb1f400f,0x400feb1f,0x400feb1f,0xa50fff2f,0xdddf0000,0xdddfeeef,0xeeefe11f,0xeeefeeef,0xdddfeeef,0xe11feeef,0xeeefe11f,0x0000dddf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa52f0000,0xb52fa52f,0xb52fb52f,0xb52fb52f,0xb52fb52f,0xb52fb52f,0xa52fb52f,0x0000a52f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0xaaaf0000,0x0000666f,0x00000000,0x642f0000,0x873f864f,0x00000000,0x864f542f,0x211f211f,0x111f111f,0x211f222f,0x111f111f,0x211f211f,0x111f111f,0x111f111f,0x111f111f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x444f333f,0x00000000,0x00000000,0x00000000,0x974f0000,0x0000432f,0x00000000,0x00000000,0x00000000, +0x321f100f,0x310f100f,0x431f210f,0x210f100f,0x210f100f,0x100f531f,0x531f310f,0x431f100f,0xefefbbbf,0xdddfddcf,0xbbbfdddf,0xeeefeeef,0xeedfeeef,0xffffffff,0xeeefeeef,0xeeefffff,0xd71fa50f,0xe91fe91f,0xd71fa50f,0xa50fe91f,0xe91fa50f,0xe91fe91f,0xe91fa50f,0xa50fd71f,0xd71fa50f,0x200f200f,0x200f200f,0x200f410f,0x410f200f,0x200f200f,0x200f410f,0xa50fa50f, +0xff2fa50f,0x400f400f,0x400f400f,0x400fde4f,0xdf4f400f,0x400f400f,0x400fcc3f,0xa50feb1f,0xdddf0000,0xdddfeeef,0xeeefeeef,0xdddfdddf,0xeeefeeef,0xeeefeeef,0xeeefdddf,0x0000dddf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa52f0000,0xb52fb52f,0xb52fb52f,0xb52fb52f,0xb52fb52f,0xb52fa52f,0xb52fb52f,0x0000a52f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x864f0000,0xaaaf542f,0x0000666f,0x00000000,0x00000000,0x864f642f,0x0000873f,0x653f432f,0x111f111f,0x111f111f,0x111f111f,0x111f111f,0x111f111f,0x111f111f,0x100f100f,0x111f111f,0x333f333f,0x444f444f,0x333f333f,0x444f444f,0x333f333f,0x444f333f,0x333f333f,0x444f333f,0x00000000,0x00000000,0x00000000,0x975f0000,0x0000432f,0x00000000,0x00000000,0x00000000, +0x321f100f,0x210f100f,0x531f321f,0x531f100f,0x210f000f,0x100f531f,0x431f320f,0x531f100f,0xeeefeeef,0xeeefeeef,0xbbbfeeef,0xbbbfbbbf,0xeeefeeef,0xdddfdedf,0xbbbfbbbf,0xdddfdddf,0xa50fa50f,0xe91fe91f,0xea4fa50f,0xa50fe91f,0xe91fd71f,0xe91fd71f,0xea4fa50f,0xa50fe91f,0xa50fa50f,0x410f200f,0x410f410f,0x410f410f,0x410f410f,0x410f410f,0x410f410f,0xa50f410f, +0xa50fa50f,0xcc3f400f,0xcd4fcc3f,0xde4fde4f,0xde4fdf4f,0xcd4fde4f,0xcc3fcc3f,0xeb1fbb3f,0xdddf0000,0xdddfeeef,0xeeefdddf,0xeeefeeef,0xe11fe33f,0xeeefdddf,0xeeefdddf,0x0000dddf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa52f0000,0xb52fb52f,0xb52fb52f,0xb52fa52f,0xb52fa52f,0xb52fb52f,0xb52fa52f,0x0000a52f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x864f0000,0x666faaaf,0x864f543f,0x0000873f,0x00000000,0x642f0000,0x653f642f,0x666f666f,0x111f111f,0x100f100f,0x211f211f,0x100f111f,0x111f111f,0x111f111f,0x222f222f,0x100f111f,0x333f333f,0x333f333f,0x444f444f,0x333f333f,0x444f444f,0x444f444f,0x444f444f,0x333f444f,0x00000000,0x00000000,0x00000000,0x974f0000,0x0000321f,0x00000000,0x00000000,0x00000000, +0x531f100f,0x210f100f,0x531f320f,0x310f000f,0x210f100f,0x100f431f,0x210f310f,0x531f100f,0xffffeeef,0xeeefffff,0xdddfdddf,0xeeefdedf,0xeedfeeef,0xeeefeeef,0xeeefeeef,0x443f333f,0xa50fa50f,0xe91fe91f,0xea4fa50f,0xa50fe91f,0xe91fd71f,0xe91fe91f,0xea4fa50f,0xa50fe91f,0xa50fa50f,0x200fa50f,0xa50f410f,0x410f410f,0x410fa50f,0x410f410f,0x410fa50f,0xa50f410f, +0xa50fa50f,0x400fe91f,0xe91fcc3f,0xde4fcd4f,0xde4fe91f,0xcd4fcd4f,0xbb3fa50f,0xeb1fbb3f,0xdddf0000,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xe11fe11f,0xdddfdddf,0xeeefdddf,0x0000dddf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa52f0000,0xa52fb52f,0xa52fb52f,0xb52fb52f,0xb52fb52f,0xb52fb52f,0xb52fb52f,0x0000a52f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x666faaaf,0x542f432f,0x864f642f,0x873f873f,0x00000000,0x666f432f,0xaaafaaaf,0x111f111f,0x222f211f,0x111f211f,0x111f111f,0x111f100f,0x211f111f,0x111f111f,0x222f211f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x444f333f,0x444f444f,0x444f444f,0x444f444f,0x00000000,0x00000000,0x00000000,0x653f0000,0x0000331f,0x00000000,0x00000000,0x00000000, +0x320f100f,0x320f210f,0x321f210f,0x320f110f,0x210f320f,0x100f210f,0x431f310f,0x100f531f,0xdddf333f,0xefdfdddf,0xeedfeeef,0xbbafeeef,0xeeefdddf,0xeeefeeef,0x334f433f,0x111f111f,0xa50fa50f,0xd71fe91f,0xe91fa50f,0xa50fe91f,0xe91fd71f,0xd71fe91f,0xea4fa50f,0xa50fe91f,0xa50fa50f,0x200fa50f,0xe91fa50f,0xa50f410f,0xe91fa50f,0x410fe91f,0xea4fa50f,0xa50fa50f, +0xa50fa50f,0x400fa50f,0xe91fe91f,0xe91fcd4f,0xe91fa50f,0xcc3ffd3f,0xea4fa50f,0xa50fa50f,0xdddf0000,0xe11feeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefeeef,0x0000dddf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa52f0000,0xb52fb52f,0xb52fb52f,0xa52fb52f,0xb52fb52f,0xb52fa52f,0xb52fb52f,0x0000a52f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x666faaaf,0x00000000,0x642f0000,0x642f642f,0x653f873f,0xaaaf666f,0x864f542f,0x211f211f,0x111f111f,0x111f211f,0x111f111f,0x211f222f,0x111f111f,0x111f111f,0x111f111f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x444f444f,0x333f333f,0x444f444f,0x333f333f,0x00000000,0x00000000,0x00000000,0x974f0000,0x0000321f,0x00000000,0x00000000,0x00000000, +0x210f100f,0x100f431f,0x321f320f,0x100f110f,0x210f431f,0x100f531f,0x321f210f,0x210f100f,0x333f111f,0xeeef333f,0xffffeeef,0xffffffff,0xdddfeeef,0x333f333f,0xdddfbbbf,0x111f121f,0xd71fa50f,0xd71fe91f,0xe91fa50f,0xa50fe91f,0xea4fa50f,0xa50fe91f,0xe91fa50f,0xa50fe91f,0xd71fa50f,0xd71fe91f,0xe91fa50f,0xa50fe91f,0xea4fa50f,0xa50fe91f,0xe91fa50f,0xa50fe91f, +0xd71fa50f,0xd71fe91f,0xe91fa50f,0xa50fe91f,0xea4fa50f,0xa50fe91f,0xe91fa50f,0xa50fe91f,0xdddf0000,0xdddfdddf,0xdddfdddf,0xdddfdddf,0xdddfdddf,0xdddfdddf,0xdddfdddf,0x0000dddf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa52f0000,0xa52fa52f,0xa52fa52f,0xa52fa52f,0xa52fa52f,0xa52fa52f,0xa52fa52f,0x0000a52f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x666faaaf,0x00000000,0x00000000,0x00000000,0x432f432f,0xaaaf666f,0x0000864f,0x111f111f,0x111f211f,0x111f111f,0x211f211f,0x111f111f,0x211f111f,0x111f111f,0x211f211f,0x333f333f,0x444f444f,0x333f333f,0x444f444f,0x333f444f,0x444f444f,0x333f333f,0x444f444f,0x00000000,0x00000000,0x00000000,0x653f0000,0x0000321f,0x00000000,0x00000000,0x00000000, +0x210f210f,0x100f321f,0x210f210f,0x100f210f,0x320f210f,0x000f210f,0x210f210f,0x321f210f,0xeeefeeef,0x333feeef,0xdddfdddf,0xeeefeddf,0xeeefeeef,0xeddfdddf,0xffffdddf,0xfeefffff,0xa50fa50f,0xd71fd71f,0xa50fa50f,0xa50fd71f,0xd71fa50f,0xa50fa50f,0xd71fd71f,0xa50fa50f,0xa50fa50f,0xd71fd71f,0xa50fa50f,0xa50fd71f,0xd71fa50f,0xa50fa50f,0xd71fd71f,0xa50fa50f, +0xa50fa50f,0xd71fd71f,0xa50fa50f,0xa50fd71f,0xd71fa50f,0xa50fa50f,0xd71fd71f,0xa50fa50f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x666faaaf,0x00000000,0x00000000,0x00000000,0x00000000,0xaaaf666f,0x00000000,0x922f922f,0x922f922f,0xa32fa22f,0x922f922f,0xa22fa22f,0x922f822f,0xa22fa22f,0x822f922f,0xd79fd78f,0xd68fd68f,0xd9afd89f,0xd78fd78f,0xd8afd8af,0xd68fc57f,0xd89fd89f,0xc67fd68f,0x888f888f,0x888f888f,0x888f888f,0x999f999f,0x999f777f,0x888f888f,0x888f888f,0x888f888f, +0x999f0000,0x444f0000,0x999f0000,0x0000444f,0x0000999f,0x444f999f,0x999f0000,0x999f0000,0x999f333f,0x444f333f,0x999f333f,0x333f444f,0x333f999f,0x444f999f,0x999f333f,0x999f333f,0x800f800f,0x800f800f,0x800f800f,0x900f800f,0x800f810f,0x800f800f,0x800f800f,0x800f801f,0x700f800f,0x912f800f,0x811f911f,0x700f800f,0xaaafbbaf,0xcccfbcbf,0x9a9fbbbf,0xbbaf999f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x864f0000,0x666faaaf,0x753f543f,0xa84fa84f,0xa85fa85f,0x653f864f,0xaaaf666f,0x0000864f,0xa22fa22f,0xb32fb32f,0xa22fb32f,0x922f922f,0x822f922f,0x922f922f,0x822f822f,0xa22f922f,0xd8afd89f,0xeabfeabf,0xd8afd9af,0xd79fd79f,0xc67fd68f,0xd79fd78f,0xd68fc57f,0xd89fd79f,0xaaaf888f,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfaaaf,0xbbbfbbbf,0xaaaf999f,0x888faaaf, +0x888f999f,0x444f888f,0x999f333f,0x333f0000,0x999f0000,0x444f888f,0x00000000,0x888f0000,0x888f999f,0x444f888f,0x999f333f,0x333f333f,0x999f333f,0x444f888f,0x333f333f,0x888f333f,0x800f800f,0x911f811f,0x911f911f,0x911f911f,0x801f911f,0x911f800f,0xa11fa11f,0xa12fa11f,0x911fa22f,0x922f800f,0x800f922f,0x700f800f,0xdddfcccf,0xffffeeef,0xbbbfdddf,0x9aafbaaf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x444f0000,0x444f444f,0x444f444f,0x0000444f,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x542f0000,0x666faaaf,0x542f432f,0x642f642f,0x642f642f,0x432f432f,0xaaaf666f,0x0000542f,0xb32fb32f,0xa22f922f,0xb32fb32f,0x922fa22f,0xb32fa22f,0xa22fa22f,0xb32fb32f,0xa22fa22f,0xe9afd9af,0xd89fd79f,0xe9afe9bf,0xd79fd89f,0xe9afd8af,0xd8afd8af,0xeabfeabf,0xd8afd8af,0x999f888f,0xaaafaaaf,0xaaaf999f,0xaaafaaaf,0xaaafbbbf,0xaaafaaaf,0xbbbfaaaf,0x888faaaf, +0x999f0000,0x444f0000,0x0000999f,0x0000999f,0x0000999f,0x444f999f,0x999f0000,0x999f444f,0x999f333f,0x333f333f,0x333f999f,0x333f999f,0x333f999f,0x333f999f,0x999f333f,0x999f444f,0x800f800f,0xb33fa22f,0xa33fa33f,0xb33fb33f,0xa22fa33f,0xa22fa22f,0xb33fb33f,0xb33fb33f,0xa33fb33f,0xb45f911f,0xa22fb44f,0x600f700f,0xffffcccf,0xffffffff,0xdcdfffff,0xa99fbbaf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x444f0000,0xcccf444f,0xcccfcccf,0xcccfcccf,0x444fcccf,0x0000444f,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x666faaaf,0x00000000,0x00000000,0x00000000,0x00000000,0xaaaf666f,0x00000000,0x922fa22f,0xb32fa22f,0x922f922f,0xb32fa22f,0x922f922f,0xb32fb32f,0x922fa22f,0xb32fb32f,0xd79fd89f,0xe9afd9af,0xd79fd79f,0xe9afd89f,0xd79fd78f,0xe9afe9af,0xd79fd89f,0xe9afeabf,0xbbbf888f,0xaaafaaaf,0x999faaaf,0xbbbfaaaf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0x888faaaf, +0x0000999f,0x0000999f,0x999f0000,0x0000555f,0x0000888f,0x333f444f,0x444f999f,0x0000999f,0x333f999f,0x333f999f,0x999f333f,0x333f555f,0x333f888f,0x333f444f,0x444f999f,0x333f999f,0x901f800f,0xa33fa32f,0xa33fa33f,0xb33fa33f,0xa33fa33f,0xa22fa22f,0xb33fa23f,0xb33fb33f,0xa32fa33f,0xc55f911f,0x922fb44f,0x700f800f,0xffffcccf,0xffffffff,0xeeefffff,0x99afbbbf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x444f0000,0xcccf444f,0xeeefcccf,0xeeefe11f,0xeeefeeef,0xcccfeeef,0x444fcccf,0x0000444f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x666faaaf,0x00000000,0x00000000,0x00000000,0x00000000,0xaaaf666f,0x00000000,0xa22fa22f,0xa22f922f,0xa22fa32f,0x822f822f,0xa22f922f,0x922f922f,0xa32fa32f,0x822f922f,0xd89fd8af,0xd89fd78f,0xd9afd9af,0xc57fc57f,0xd89fd79f,0xd68fd78f,0xd9afd9af,0xc57fd68f,0xbbbf888f,0xaaafbbbf,0xaaafaaaf,0x999f999f,0x999f999f,0xbbbfbbbf,0xbbbfbbbf,0x777fbbbf, +0x0000444f,0x888f0000,0x0000999f,0x444f999f,0x999f888f,0x00000000,0x999f0000,0x0000444f,0x333f444f,0x888f333f,0x333f999f,0x444f999f,0x999f888f,0x333f333f,0x999f333f,0x333f333f,0x911f800f,0xa22fa23f,0xa22f922f,0xa22fa22f,0xa22fa22f,0x922f922f,0x922f922f,0x922f922f,0x911f922f,0xb55f911f,0x921fb44f,0x700f700f,0xffffdddf,0xffffffff,0xfeefeeef,0xaaafcccf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xcccf444f,0xe11fcccf,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefe11f,0xcccfeeef,0x444fcccf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x864f0000,0x666faaaf,0x864f653f,0x873fa85f,0x873f873f,0x653f642f,0xaaaf666f,0x0000864f,0x822f822f,0xb32f922f,0x822f922f,0x922f922f,0x822f922f,0x922f922f,0x922f822f,0x922f922f,0xc57fd68f,0xe9afd78f,0xc57fd78f,0xd79fd78f,0xc57fd78f,0xd79fd79f,0xd78fc67f,0xd79fd68f,0xaaaf888f,0xaaafaaaf,0x999faaaf,0x777f888f,0x888f777f,0xaaafcccf,0xaaafaaaf,0x888f999f, +0x0000444f,0x444f888f,0x0000444f,0x444f0000,0x333f999f,0x444f999f,0x444f999f,0x0000999f,0x333f444f,0x444f888f,0x333f444f,0x444f333f,0x333f999f,0x444f999f,0x444f999f,0x333f999f,0x911f800f,0xb33fb33f,0x922f912f,0x911f911f,0x811f811f,0x810f801f,0x811f811f,0x811f811f,0x811f810f,0xc55f911f,0x811fa22f,0x600f700f,0xffffdddf,0xffffffff,0xeeefeeef,0xbbbfdddf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xcccf444f,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xeeefe11f,0xeeefeeef,0xeeefe11f,0x444fcccf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x542f0000,0x666faaaf,0x432f432f,0x642f542f,0x642f642f,0x432f542f,0xaaaf666f,0x0000542f,0xb32fb32f,0xa22fa32f,0xa22fa22f,0xa22fa22f,0xb32fb32f,0x922fa22f,0xb32fb32f,0xa22fa22f,0xeabfeabf,0xd9afd9af,0xd89fd89f,0xd89fd89f,0xeabfd9af,0xd79fd8af,0xeabfeabf,0xd89fd8af,0xbbbf999f,0xaaafaaaf,0x999faaaf,0x500f999f,0xbbbf500f,0xaaafcccf,0xbbbfbbbf,0x777fbbbf, +0x999f444f,0x888f888f,0x0000444f,0x0000999f,0x999f444f,0x0000444f,0x444f888f,0x999f0000,0x999f333f,0x888f888f,0x333f444f,0x333f999f,0x999f333f,0x333f444f,0x444f888f,0x999f333f,0x911f800f,0x922fb33f,0x911f911f,0x811f911f,0x810f811f,0x811f811f,0x811f811f,0x811f811f,0x911f811f,0xc66f911f,0x810f922f,0x600f700f,0xfeffdddf,0xeeffffff,0xeeffeeef,0xbbbfdcdf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xcccf444f,0xeeefcccf,0xeeefe11f,0xeeefeeef,0xeeefeeef,0xeeefeeef,0xcccfeeef,0x444fcccf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x666faaaf,0x00000000,0x00000000,0x00000000,0x00000000,0xaaaf666f,0x00000000,0x922f922f,0xb32fb32f,0xa22fa22f,0xb32fb32f,0x922f922f,0xb32fa22f,0xa22fa22f,0xb32fb32f,0xd79fd79f,0xeabfeabf,0xd8afd8af,0xe9afe9af,0xd78fd68f,0xe9afd9af,0xd8afd8af,0xe9afe9af,0xaaaf888f,0xaaafaaaf,0x888f999f,0x500f999f,0xbbbf400f,0xcccfaaaf,0xaaafaaaf,0x888faaaf, +0x333f0000,0x0000999f,0x999f333f,0x999f0000,0x0000999f,0x0000999f,0x0000888f,0x0000999f,0x333f333f,0x333f999f,0x999f333f,0x999f333f,0x333f999f,0x333f999f,0x333f888f,0x333f999f,0x901f800f,0x811f922f,0x811f810f,0x811f811f,0x811f811f,0x811f811f,0x811f811f,0x811f811f,0x811f811f,0xb44f800f,0x811f911f,0x600f700f,0xefefdddf,0xeeffffff,0xeeefeeef,0xbbbfcdcf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xcccf444f,0xcccfeeef,0xeeefcccf,0xeeefeeef,0xeeefe11f,0xcccfeeef,0xbbbfcccf,0x444fbbbf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x666faaaf,0x00000000,0x00000000,0x00000000,0x00000000,0xaaaf666f,0x00000000,0xa22fa22f,0x922f822f,0xa22fb32f,0x922f922f,0x922f922f,0x822f922f,0x922fa22f,0x922f922f,0xd8afd8af,0xd79fd68f,0xd8afe9af,0xd79fd78f,0xd79fd79f,0xc67fd78f,0xd79fd89f,0xd68fd68f,0xbbbf888f,0x999fbbbf,0x888f999f,0x500f999f,0xbbbf200f,0xcccf999f,0xbbbfbbbf,0x999fbbbf, +0x999f0000,0x999f444f,0x0000333f,0x444f999f,0x0000444f,0x999f0000,0x999f444f,0x999f0000,0x999f333f,0x999f444f,0x333f333f,0x444f999f,0x333f444f,0x999f333f,0x999f444f,0x999f333f,0x901f800f,0x811f921f,0x811f811f,0x911f811f,0x811f811f,0x811f811f,0x811f811f,0x811f811f,0x811f811f,0xb33f800f,0x811f911f,0x600f700f,0xffffdddf,0xeeffffef,0xeeefeeef,0xbabfccdf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xcccf310f,0xeeefeeef,0xcccfeeef,0xcccfcccf,0xcccfcccf,0xbbbfcccf,0xbbbfbbbf,0x310fbbbf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x864f0000,0x666faaaf,0x864f653f,0x873f873f,0x873f873f,0x653fa84f,0xaaaf666f,0x0000864f,0x922f922f,0xb32f922f,0x822f822f,0xa22f922f,0xa22f922f,0xb32fb32f,0xa22fa22f,0xb32fb32f,0xd79fd79f,0xd9afd79f,0xc57fc57f,0xd89fd79f,0xd8afd78f,0xeabfeabf,0xd8afd89f,0xeabfeabf,0xaaaf888f,0x999faaaf,0xaaaf888f,0x500f999f,0xbbbf200f,0x999faaaf,0xaaafcccf,0x888fbbbf, +0x444f999f,0x444f888f,0x999f0000,0x999f0000,0x0000444f,0x0000999f,0x0000444f,0x444f999f,0x333f999f,0x444f888f,0x999f333f,0x999f333f,0x333f333f,0x333f999f,0x333f444f,0x444f999f,0x911f800f,0x911f921f,0x811f811f,0x811f811f,0x811f811f,0x811f811f,0x810f811f,0x811f911f,0x811f811f,0xb33f800f,0x811f911f,0x600f700f,0xfeffdddf,0xeeffeeff,0xeeefeeef,0xbbbfdccf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x941f310f,0xeeefcccf,0xeeefeeef,0xcccfcccf,0xbbbfcccf,0xbbbfbbbf,0xa52fbbbf,0x310f941f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x542f0000,0x666faaaf,0x432f432f,0x642f542f,0x642f642f,0x432f642f,0xaaaf666f,0x0000542f,0xb32fb32f,0xa22fa22f,0xb32fb32f,0xa22fa22f,0xb32fb32f,0xa22f922f,0xa22fa22f,0xa22f922f,0xe9afe9af,0xd8afd8af,0xe9afeabf,0xd8afd8af,0xd9afe9af,0xd89fd79f,0xd89fd8af,0xd89fd68f,0xaaaf888f,0x999fbbbf,0x999f888f,0x500f999f,0xbbbf200f,0xaaafaaaf,0xaaafcccf,0x888faaaf, +0x0000888f,0x444f0000,0x444f999f,0x00000000,0x999f0000,0x999f444f,0x999f0000,0x444f333f,0x333f888f,0x333f333f,0x444f999f,0x333f333f,0x999f333f,0x999f444f,0x999f333f,0x444f333f,0x811f800f,0x911f922f,0x811f811f,0x811f811f,0x811f811f,0x811f811f,0x811f811f,0x811f911f,0x811f811f,0xb33f800f,0x811f921f,0x600f700f,0xedefcccf,0xeeefeeef,0xdeefeeef,0xaaafcccf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x941f310f,0xa52fa52f,0xcccfeeef,0xcccfcccf,0xbbbfcccf,0xbbbfbbbf,0xa52fa52f,0x310f941f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x666faaaf,0x00000000,0x00000000,0x00000000,0x00000000,0xaaaf666f,0x00000000,0x922f922f,0xa22fa22f,0x922f922f,0xa22fa32f,0x922f922f,0xa22f922f,0x822f822f,0xa22f922f,0xd78fd68f,0xd89fd89f,0xd79fd79f,0xd8afd9af,0xd78fd68f,0xd8afd79f,0xc57fc57f,0xd8afd79f,0xaaaf777f,0x888f999f,0x999faaaf,0x400f999f,0xbbbf200f,0x999faaaf,0xcccfaaaf,0x777fbbbf, +0x00000000,0x0000999f,0x444f888f,0x999f0000,0x0000444f,0x888f999f,0x444f0000,0x444f0000,0x333f333f,0x333f999f,0x444f888f,0x999f333f,0x333f333f,0x888f999f,0x444f333f,0x333f333f,0x910f800f,0x811f911f,0x811f810f,0x800f811f,0x800f701f,0x811f811f,0x811f801f,0x701f710f,0x810f700f,0xa33f700f,0x811f911f,0x600f700f,0xdddfcccf,0xeeefdddf,0xdccfdddf,0xaaafbbbf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x941f310f,0xb52fb52f,0xa52fa52f,0xa52fcccf,0xa52fa52f,0xa52fbbbf,0xa52fa52f,0x310f941f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x666faaaf,0x00000000,0x00000000,0x00000000,0x00000000,0xaaaf666f,0x00000000,0x922f922f,0x822f822f,0xb32fb32f,0x822f922f,0xa32fa22f,0xa22fa22f,0xb32fb32f,0x822fa22f,0xd79fd79f,0xc57fc57f,0xe9bfe9af,0xc57fd68f,0xd9afd89f,0xd8afd89f,0xeabfeabf,0xc67fd8af,0xaaaf888f,0x888f999f,0xaaaf999f,0x400f999f,0xbbbf200f,0xaaaf999f,0xcccfaaaf,0x888faaaf, +0x888f444f,0x999f888f,0x999f888f,0x999f333f,0x999f333f,0x999f0000,0x444f0000,0x0000333f,0x888f333f,0x999f888f,0x999f888f,0x999f333f,0x999f333f,0x999f333f,0x444f333f,0x333f333f,0x900f700f,0x811f911f,0x811f811f,0x710f701f,0x801f710f,0x711f701f,0x801f801f,0x800f810f,0x810f711f,0xa32f700f,0x811fa22f,0x600f700f,0xdddfcccf,0xdddfdddf,0xcccfdddf,0xaaafbbbf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x310f0000,0x941f310f,0xb52f941f,0xa52fb52f,0xa52fa52f,0x941fa52f,0x941f941f,0x0000310f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x864f0000,0x666faaaf,0x864f543f,0x873fa85f,0xa85fa85f,0x653f873f,0xaaaf666f,0x0000864f,0xa22fa22f,0xb32fb32f,0xa22fb32f,0x922fa22f,0xa22f822f,0xb32fa22f,0xa22fa22f,0xb32fb32f,0xd8afd8af,0xeabfeabf,0xd8afe9af,0xd79fd89f,0xd89fc57f,0xe9afd8af,0xd89fd89f,0xeabfe9af,0xbbbf888f,0xbbbfaaaf,0xaaaf999f,0x400f999f,0xbbbf200f,0xcccfaaaf,0xaaafcccf,0x999fbbbf, +0x0000333f,0x0000999f,0x0000999f,0x444f999f,0x00000000,0x444f999f,0x444f0000,0x0000999f,0x333f333f,0x333f999f,0x333f999f,0x444f999f,0x333f333f,0x444f999f,0x333f333f,0x333f999f,0x800f800f,0x811f811f,0x811f811f,0x801f711f,0x810f811f,0x801f701f,0x711f811f,0x811f810f,0x811f811f,0xa32f700f,0x811f911f,0x600f700f,0xdddfcdcf,0xcccfdddf,0xdddfcdcf,0xbbbfcccf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x310f0000,0x941f310f,0x941f941f,0x941f941f,0x310f941f,0x310f310f,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x542f0000,0x666faaaf,0x432f432f,0x542f652f,0x642f642f,0x432f642f,0xaaaf666f,0x0000542f,0xb32fb32f,0x922fa22f,0xa22fb32f,0xa22fa22f,0xb32fb32f,0x922f922f,0xa22fa22f,0x922f922f,0xe9bfe9bf,0xd79fd89f,0xd89fe9af,0xd9afd8af,0xd9afeabf,0xd79fd78f,0xd8afd89f,0xd68fd79f,0xaaaf888f,0xaaafaaaf,0xbbbfaaaf,0xcccfbbbf,0xcccfcccf,0xbbbfcccf,0xaaafaaaf,0x888faaaf, +0x999f444f,0x999f0000,0x999f444f,0x444f0000,0x0000444f,0x0000888f,0x999f333f,0x999f0000,0x999f333f,0x999f333f,0x999f444f,0x333f333f,0x333f444f,0x333f888f,0x999f333f,0x999f333f,0x800f800f,0x800f700f,0x800f800f,0x811f810f,0x811f701f,0x700f810f,0x700f700f,0x800f700f,0x800f800f,0x911f700f,0x700f811f,0x700f700f,0xdccfddcf,0xbbbfcbcf,0xcccfbbbf,0xbbbfdddf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x310f0000,0x310f310f,0x310f310f,0x0000310f,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x666faaaf,0x00000000,0x00000000,0x00000000,0x00000000,0xaaaf666f,0x00000000,0x922f822f,0xa22fb32f,0x922f922f,0xb32fb32f,0x922fa22f,0xb32fa22f,0x922f922f,0xb32fb32f,0xd78fc67f,0xd89fe9af,0xd79fd68f,0xeabfe9af,0xd79fd89f,0xe9afd8af,0xd78fd68f,0xe9afd9af,0x888f888f,0x888f888f,0x999f777f,0x888f888f,0x888f888f,0x888f888f,0x888f888f,0x888f888f, +0x444f0000,0x333f0000,0x444f999f,0x0000999f,0x999f444f,0x888f0000,0x0000333f,0x0000888f,0x444f333f,0x333f333f,0x444f999f,0x333f999f,0x999f444f,0x888f333f,0x333f333f,0x333f888f,0x800f800f,0x800f800f,0x800f700f,0x800f800f,0x800f800f,0x800f800f,0x800f800f,0x800f800f,0x800f800f,0x800f700f,0x700f800f,0x600f700f,0xbbbfbbbf,0xaaafbbaf,0xbbbfaaaf,0xbbbfbbbf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x149f15bf,0x15cf149f,0x15cf15cf,0x248f248f,0x15bf15af,0x248f14af,0x259f248f,0x14bf248f,0x341f341f,0x341f341f,0x351f341f,0x341f341f,0x351f351f,0x341f341f,0x341f341f,0x341f341f,0x3b2f3a2f,0x3a2f3a2f,0x3c3f3b2f,0x3b2f3a2f,0x3c3f3c3f,0x3a2f3a2f,0x3c2f3c2f,0x3a2f3a2f,0x888f888f,0x888f888f,0x888f888f,0x999f999f,0x999f777f,0x888f888f,0x888f888f,0x888f888f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x800f800f,0x800f800f,0x800f800f,0x811f800f,0x711f801f,0x800f810f,0x800f800f,0x801f711f,0x800f800f,0x800f700f,0x800f800f,0x811f800f,0x711f811f,0x811f801f,0x700f700f,0x801f811f,0x800f800f,0x800f700f,0x800f922f,0x600f800f,0xccdfbbbf,0xcccfcdcf,0xbbbfbbbf,0xbbbfbbbf, +0xcdcfbbbf,0xcccfcccf,0xbbbfbbbf,0xbbbfbbbf,0xcddfbbbf,0xcccfccdf,0xbbbfbbbf,0xbbbfbbbf,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x14bf13cf,0x37af15cf,0x14df25bf,0x159f14af,0x15bf15af,0x03bf03bf,0x149f149f,0x14bf14bf,0x351f341f,0x451f351f,0x351f351f,0x341f341f,0x341f341f,0x341f341f,0x341f231f,0x341f341f,0x3c3f3b2f,0x4d4f4c3f,0x3c3f3c3f,0x3b2f3b2f,0x3a2f3a2f,0x3b2f3b2f,0x3a2f292f,0x3b2f3b2f,0xaaaf888f,0xbbbfbbbf,0xbbbfbbbf,0xbbbfbbbf,0xbbbfaaaf,0xbbbfbbbf,0xaaaf999f,0x888faaaf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x811f800f,0x811f811f,0x811f811f,0x810f811f,0x801f811f,0x811f801f,0x811f801f,0x801f811f,0x811f800f,0x811f811f,0x811f811f,0x811f811f,0x711f711f,0x711f811f,0x811f911f,0x810f811f,0x811f811f,0xb33f700f,0x811fa22f,0x600f801f,0xeeefbbbf,0xeeffefef,0xeeefefef,0xbbbfcdcf, +0xcccfbbbf,0xeeefeeef,0xffffffff,0xffffffff,0xffffffff,0xfeefeeef,0xeeefefff,0xbbbfccdf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x15cf14bf,0x269f15cf,0x14af15cf,0x149f139f,0x14af248f,0x03bf14bf,0x14af02bf,0x14bf14bf,0x351f351f,0x341f341f,0x351f351f,0x341f341f,0x351f351f,0x351f351f,0x351f351f,0x351f351f,0x4c3f3c3f,0x3b2f3b2f,0x4c3f4c3f,0x3b2f3c2f,0x4c3f3c3f,0x3c3f3c3f,0x4c3f4c3f,0x3c3f3c3f,0x999f888f,0xaaafaaaf,0xaaaf999f,0xaaafaaaf,0xaaafbbbf,0xaaafaaaf,0xbbbfaaaf,0x888faaaf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x811f800f,0x922f922f,0x922f922f,0x921f912f,0x811f811f,0x801f811f,0x800f811f,0x811f811f,0x811f800f,0x922f922f,0x921f922f,0x912f922f,0x811f811f,0x800f811f,0x811f810f,0x811f811f,0x711f811f,0xa22f700f,0x811f810f,0x600f811f,0xccdfbbbf,0xeeefeeef,0xeeefeeef,0xbbbfdccf, +0xddcfbbbf,0xeeffeeff,0xeeeffeef,0xfeefeeef,0xfeefffff,0xffffefef,0xfeefefef,0xbbbfcddf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x14bf14bf,0x15cf14bf,0x14cf15cf,0x158f14af,0x248f14bf,0x03bf149f,0x149f03bf,0x14bf14af,0x341f341f,0x351f351f,0x341f341f,0x351f341f,0x341f341f,0x351f351f,0x341f341f,0x351f451f,0x3b2f3b2f,0x4c3f3c3f,0x3b2f3b2f,0x4c3f3b2f,0x3b2f3a2f,0x4c3f4c3f,0x3b2f3b2f,0x4c3f4d4f,0xbbbf888f,0xaaafaaaf,0x999faaaf,0xbbbfaaaf,0xaaafaaaf,0xaaafaaaf,0xaaafaaaf,0x888faaaf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x600f600f,0x600f600f,0x600f600f,0x600f600f,0x600f600f,0x600f600f,0x600f600f,0x600f600f,0x700f600f,0x700f600f,0x600f600f,0x600f600f,0x600f600f,0x600f600f,0x600f600f,0x600f600f,0x600f600f,0x600f600f,0x600f600f,0x600f600f,0xbbbfbbbf,0xcccfddcf,0xbbbfcccf,0xbbbfbbbf, +0xbbbfbbbf,0xcccfcccf,0xbbbfcccf,0xbbbfbbbf,0xbbbfbbbf,0xcccfdcdf,0xbbbfcccf,0xbbbfbbbf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x14bf13cf,0x15cf14bf,0x14cf15cf,0x148f14bf,0x149f14bf,0x248f14af,0x03bf248f,0x14bf149f,0x341f351f,0x341f341f,0x351f351f,0x231f341f,0x341f341f,0x341f341f,0x351f351f,0x341f341f,0x3b2f3c3f,0x3b2f3a2f,0x3c3f3c3f,0x292f3a2f,0x3c2f3b2f,0x3a2f3b2f,0x3c3f3c3f,0x3a2f3a2f,0xbbbf888f,0xaaafbbbf,0xaaafaaaf,0x999f999f,0x999f999f,0xbbbfbbbf,0xbbbfbbbf,0x777fbbbf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x963fa94f,0x963f863f,0x963f963f,0x863f862f,0x963f963f,0x863f863f,0x963f963f,0x541f973f,0x963fa84f,0x973f863f,0x963f863f,0x863f863f,0x963f963f,0x863f863f,0x973f963f,0x863f963f,0x862f863f,0x963f963f,0x963f873f,0x863f963f,0x963f863f,0x963f863f,0x963f863f,0x531f863f, +0x963fa94f,0x963f863f,0x963f963f,0x863f863f,0x963f973f,0x863f863f,0x963f963f,0x531f973f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x14bf14bf,0x14bf14bf,0x15cf15bf,0x14af14bf,0x248f14bf,0x26bf149f,0x03bf149f,0x14bf149f,0x241f341f,0x351f341f,0x231f341f,0x341f341f,0x231f341f,0x341f341f,0x341f341f,0x341f341f,0x3a2f3a2f,0x4c3f3b2f,0x292f3a2f,0x3b2f3a2f,0x292f3a2f,0x3b2f3b2f,0x3b2f3a2f,0x3b2f3a2f,0xaaaf888f,0xaaafaaaf,0x999faaaf,0x777f888f,0x888f777f,0xaaafcccf,0xaaafaaaf,0x888f999f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x863fb95f,0x642f642f,0x642f642f,0x642f641f,0x532f531f,0x642f641f,0x974f531f,0x541f863f,0x863fa95f,0x641f632f,0x641f641f,0x642f641f,0x531f531f,0x641f641f,0x632f531f,0x641f641f,0x531f642f,0x641f641f,0x641f531f,0x641f642f,0x641f641f,0x641f642f,0x974f641f,0x531f863f, +0x863fb94f,0x642f641f,0x642f641f,0x641f641f,0x531f531f,0x641f641f,0x974f531f,0x531f863f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x13bf14bf,0x13cf13cf,0x15cf14bf,0x14af14cf,0x248f159f,0x248f149f,0x258f149f,0x13bf149f,0x451f351f,0x351f351f,0x341f341f,0x341f341f,0x451f351f,0x341f351f,0x451f451f,0x341f351f,0x4c4f4c3f,0x3c3f3c3f,0x3b2f3b2f,0x3c2f3b2f,0x4c4f3c3f,0x3b2f3c3f,0x4d4f4d4f,0x3c2f3c3f,0xbbbf999f,0xaaafaaaf,0x999faaaf,0xf00f999f,0xbbbff00f,0xaaafcccf,0xbbbfbbbf,0x777fbbbf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x863fa84f,0x0000531f,0x00000000,0x00000000,0x00000000,0x00000000,0xa94f0000,0x531f963f,0x862fa84f,0x0000531f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xa94f0000,0x531f963f, +0x863fa94f,0x0000531f,0x00000000,0x00000000,0x00000000,0x00000000,0xa84f0000,0x531f963f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x14af13bf,0x14bf14bf,0x02bf14bf,0x14bf14af,0x149f14af,0x14af14bf,0x258f14af,0x13bf129f,0x341f341f,0x451f351f,0x351f351f,0x351f351f,0x341f341f,0x351f351f,0x351f351f,0x351f351f,0x3b2f3b2f,0x4d4f4c3f,0x3c3f3c3f,0x4c3f4c3f,0x3b2f3a2f,0x4c3f3c3f,0x3c3f3c3f,0x4c3f4c3f,0xaaaf888f,0xaaafaaaf,0x888f999f,0xf00f999f,0xbbbfd00f,0xcccfaaaf,0xaaafaaaf,0x888faaaf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x863fa95f,0x0000531f,0x00000000,0x00000000,0x00000000,0x00000000,0xb95f0000,0x641f963f,0x863fb95f,0x0000531f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xb95f0000,0x642f963f, +0x863fb95f,0x0000531f,0x00000000,0x00000000,0x00000000,0x00000000,0xb95f0000,0x642f863f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x249f13bf,0x15cf13bf,0x13af14cf,0x14cf02bf,0x15af24af,0x14af248f,0x258f149f,0x13bf13bf,0x351f351f,0x341f341f,0x351f351f,0x341f341f,0x341f341f,0x341f341f,0x341f341f,0x341f341f,0x3c3f3c3f,0x3b2f3a2f,0x3c3f4c3f,0x3b2f3a2f,0x3b2f3b2f,0x3a2f3b2f,0x3b2f3b2f,0x3a2f3a2f,0xbbbf888f,0x999fbbbf,0x888f999f,0xf00f999f,0xbbbfa00f,0xcccf999f,0xbbbfbbbf,0x999fbbbf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x963fa84f,0x0000641f,0x00000000,0x00000000,0x00000000,0x00000000,0xa84f0000,0x641f963f,0x963fa84f,0x0000641f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xa84f0000,0x641f963f, +0x973fa84f,0x0000641f,0x00000000,0x00000000,0x00000000,0x00000000,0xa94f0000,0x642f963f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x13bf13bf,0x13cf13af,0x26af14bf,0x14bf24af,0x14af14af,0x248f14af,0x14af248f,0x13bf258f,0x341f341f,0x351f341f,0x341f231f,0x341f341f,0x351f341f,0x451f451f,0x351f341f,0x351f451f,0x3b2f3b2f,0x3c3f3b2f,0x3a2f392f,0x3c3f3b2f,0x3c3f3a2f,0x4d4f4d4f,0x3c3f3b2f,0x4c3f4d4f,0xaaaf888f,0x999faaaf,0xaaaf888f,0xd00f999f,0xbbbfd00f,0x999faaaf,0xaaafcccf,0x888fbbbf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x13bf368f,0x12bf139f,0x259f13af,0x02bf24af,0x14af13bf,0x248f249f,0x14af248f,0x358f368f,0x351f351f,0x351f351f,0x351f451f,0x351f351f,0x351f351f,0x341f341f,0x341f351f,0x341f341f,0x4c3f4c3f,0x3c3f3c3f,0x4c3f4c4f,0x3c3f3c3f,0x3c3f4c3f,0x3c2f3b2f,0x3b2f3c3f,0x3b2f3a2f,0xaaaf888f,0x999fbbbf,0x999f888f,0xd00f999f,0xbbbfb00f,0xaaafaaaf,0xaaafcccf,0x888faaaf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x248f258f,0x129f149f,0x148f129f,0x02bf13af,0x14af13af,0x248f249f,0x249f248f,0x258f358f,0x341f341f,0x341f341f,0x341f341f,0x351f351f,0x341f341f,0x351f341f,0x241f241f,0x351f341f,0x3a2f3a2f,0x3c3f3c3f,0x3b2f3b2f,0x3c3f3c3f,0x3a2f3a2f,0x3c3f3b2f,0x3a2f3a2f,0x3c3f3b2f,0xaaaf777f,0x888f999f,0x999faaaf,0xf00f999f,0xbbbfd00f,0x999faaaf,0xcccfaaaf,0x777fbbbf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x259f358f,0x139f248f,0x12af129f,0x02bf13bf,0x14af12bf,0x149f14af,0x248f248f,0x258f248f,0x341f341f,0x341f231f,0x351f351f,0x231f341f,0x351f341f,0x351f341f,0x451f451f,0x341f351f,0x3b2f3b2f,0x3a2f392f,0x4c3f4c3f,0x292f3a2f,0x3c3f3b2f,0x3c3f3c2f,0x4d4f4d4f,0x3a2f3c3f,0xaaaf888f,0x888f999f,0xaaaf999f,0xf00f999f,0xbbbfb00f,0xaaaf999f,0xcccfaaaf,0x888faaaf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x248f258f,0x248f249f,0x12af12af,0x03bf14af,0x139f12bf,0x149f248f,0x248f248f,0x258f248f,0x351f351f,0x451f351f,0x351f351f,0x341f341f,0x341f231f,0x351f351f,0x341f341f,0x351f351f,0x3c3f3c3f,0x4d4f4c3f,0x3c3f4c3f,0x3b2f3c2f,0x3b2f392f,0x4c3f3c3f,0x3b2f3b2f,0x4c3f4c3f,0xbbbf888f,0xbbbfaaaf,0xaaaf999f,0xd00f999f,0xbbbfb00f,0xcccfaaaf,0xaaafcccf,0x999fbbbf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x247f149f,0x15cf15cf,0x248f248f,0x248f248f,0x14af02bf,0x03bf139f,0x248f248f,0x14bf248f,0x351f351f,0x341f341f,0x341f351f,0x351f351f,0x351f451f,0x341f341f,0x351f341f,0x341f341f,0x4c3f4c3f,0x3b2f3b2f,0x3c2f4c3f,0x3c3f3c3f,0x3c3f4d4f,0x3b2f3b2f,0x3c3f3c2f,0x3a2f3b2f,0xaaaf888f,0xaaafaaaf,0xbbbfaaaf,0xcccfbbbf,0xcccfcccf,0xbbbfcccf,0xaaafaaaf,0x888faaaf, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x149f357f,0x15cf149f,0x14af14df,0x248f14af,0x14af248f,0x248f248f,0x248f248f,0x14bf14bf,0x341f341f,0x341f351f,0x341f341f,0x351f351f,0x341f341f,0x351f351f,0x341f341f,0x351f351f,0x3a2f3a2f,0x3c2f4c3f,0x3b2f3a2f,0x4c3f4c3f,0x3b2f3b2f,0x4c3f3c3f,0x3a2f3a2f,0x4c3f3c3f,0x888f888f,0x888f888f,0x999f777f,0x888f888f,0x888f888f,0x888f888f,0x888f888f,0x888f888f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x888f666f,0x777f777f,0x777f777f,0x777f777f,0x531f421f,0x421f421f,0x531f531f,0x531f421f,0x531f531f,0x421f421f,0x531f531f,0x421f421f,0xba1fba1f,0xaa1fa91f,0xcc1fcb1f,0xba1fba1f,0xcb1fcb1f,0xaa1fa91f,0xcb1fcb1f,0xa91faa1f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x00000000,0x00000000,0x00000000,0x00000000,0x0000eeef,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x777f777f,0x888f888f,0x888f888f,0x888f888f,0x888f777f,0x888f888f,0x777f666f,0x777f777f,0x531f531f,0x632f631f,0x531f531f,0x531f531f,0x421f421f,0x531f531f,0x421f421f,0x531f531f,0xcb1fcb1f,0xdc2fdc2f,0xcb1fdc1f,0xba1fba1f,0xa91faa1f,0xba1fba1f,0xa91f981f,0xbb1fba1f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x666f777f,0x269f15cf,0x14af15cf,0x777f777f,0x777f888f,0x777f777f,0x14af02bf,0x777f777f,0x531f531f,0x531f531f,0x531f631f,0x531f531f,0x531f531f,0x531f531f,0x631f631f,0x531f531f,0xdc2fdc1f,0xcb1fba1f,0xdc2fdc2f,0xba1fcb1f,0xdc2fcb1f,0xcb1fcb1f,0xdc2fdc2f,0xcb1fcb1f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x888f777f,0x777f777f,0x14cf777f,0x158f777f,0x777f14bf,0x777f777f,0x777f777f,0x777f777f,0x531f531f,0x531f531f,0x531f531f,0x531f531f,0x531f421f,0x531f531f,0x531f531f,0x531f632f,0xba1fcb1f,0xdc2fcc1f,0xba1fba1f,0xdc2fcb1f,0xba1fba1f,0xdc2fdc2f,0xba1fcb1f,0xdc2fdc2f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0xeeef0000,0x0000dddf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x888f777f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x888f888f,0x888f888f,0x666f888f,0x531f531f,0x531f421f,0x531f531f,0x421f421f,0x531f531f,0x421f531f,0x531f531f,0x421f421f,0xbb1fcb1f,0xcb1fba1f,0xcc1fcc1f,0x981fa91f,0xcb1fba1f,0xa91fba1f,0xcc1fcc1f,0xa91faa1f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0xeeef0000,0xdddf0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x777f777f,0x777f777f,0x15cf777f,0x777f14bf,0x666f777f,0x26bf149f,0x777f777f,0x777f666f,0x421f421f,0x531f421f,0x421f421f,0x531f421f,0x421f421f,0x531f531f,0x531f421f,0x531f421f,0x991fa91f,0xdc2fba1f,0x981fba1f,0xba1fba1f,0x981fba1f,0xba1fba1f,0xba1fa91f,0xba1faa1f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x0000ffff,0xdddfffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x888f888f,0x13cf777f,0x15cf14bf,0x14af14cf,0x777f777f,0x248f149f,0x888f888f,0x666f888f,0x632f631f,0x531f531f,0x531f531f,0x531f531f,0x632f531f,0x531f531f,0x632f632f,0x531f531f,0xdc2fdc2f,0xcc1fdc1f,0xcb1fcb1f,0xcb1fbb1f,0xdc2fdc1f,0xba1fcb1f,0xdc2fdc2f,0xcb1fcb1f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0xdddfdddf,0xdddfffff,0xffffeeef,0xffffffff,0x00000000,0x00000000,0x00000000,0x00000000,0xdddfdddf,0x0000dddf,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x14af777f,0x777f14bf,0x777f777f,0x777f777f,0x666f777f,0x777f777f,0x777f777f,0x777f777f,0x531f531f,0x632f631f,0x531f531f,0x531f531f,0x531f421f,0x531f531f,0x531f531f,0x531f531f,0xba1fba1f,0xdc2fdc2f,0xcb1fcb1f,0xdc2fdc2f,0xba1faa1f,0xdc2fcc1f,0xcb1fcb1f,0xdc2fdc2f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x0000eeef,0xdddfffff,0x00000000,0xeeefeeef,0xeeef0000,0xffffeeef,0xffffffff,0x0000ffff,0x0000eeef,0xdddfffff,0x00000000,0xdddfeeef,0x0000ffff,0x0000eeef,0x0000ffff,0x0000ffff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x249f777f,0x666f13bf,0x777f888f,0x14cf777f,0x15af777f,0x14af248f,0x888f888f,0x888f888f,0x531f531f,0x531f421f,0x531f531f,0x531f421f,0x531f531f,0x421f531f,0x531f531f,0x421f421f,0xcb1fcb1f,0xba1fa91f,0xcb1fdc2f,0xba1fba1f,0xba1fba1f,0xa91fba1f,0xba1fcb1f,0xa91fa91f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0xeeef0000,0xffffeeef,0xeeefdddf,0xeeefffff,0x0000ffff,0x0000dddf,0xffff0000,0x00000000,0xeeef0000,0x0000eeef,0xeeef0000,0xffff0000,0x0000dddf,0x0000dddf,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x777f777f,0x777f777f,0x777f777f,0x14bf777f,0x14af14af,0x248f14af,0x14af777f,0x777f258f,0x531f531f,0x531f531f,0x421f421f,0x531f531f,0x531f421f,0x632f632f,0x531f531f,0x631f632f,0xba1fba1f,0xdc1fba1f,0xa91f991f,0xcb1fba1f,0xcb1fba1f,0xdc2fdc2f,0xcb1fcb1f,0xdc2fdc2f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0xffff0000,0xffffdddf,0xdddf0000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xffffdddf,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x777f777f,0x777f888f,0x888f13af,0x777f888f,0x14af13bf,0x888f249f,0x14af888f,0x777f368f,0x531f531f,0x531f531f,0x531f632f,0x531f531f,0x531f531f,0x531f531f,0x531f531f,0x531f421f,0xdc2fdc2f,0xcb1fcb1f,0xdc2fdc2f,0xcb1fcb1f,0xdc1fdc2f,0xcb1fba1f,0xcb1fcb1f,0xcb1faa1f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0xdddf0000,0x0000ffff,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x777f666f,0x129f149f,0x777f129f,0x777f777f,0x888f888f,0x777f777f,0x249f777f,0x666f358f,0x421f421f,0x531f531f,0x531f531f,0x531f531f,0x421f421f,0x531f531f,0x421f421f,0x531f531f,0xba1faa1f,0xcb1fcb1f,0xba1fba1f,0xcb1fcc1f,0xba1faa1f,0xcb1fba1f,0x991f991f,0xcb1fba1f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x0000ffff,0xffff0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x777f777f,0x777f777f,0x12af777f,0x777f777f,0x14af12bf,0x777f14af,0x248f777f,0x777f248f,0x531f531f,0x421f421f,0x631f531f,0x421f421f,0x531f531f,0x531f531f,0x632f632f,0x421f531f,0xba1fba1f,0xa91f991f,0xdc2fdc2f,0x981fa91f,0xcc1fcb1f,0xcb1fcb1f,0xdc2fdc2f,0xa91fcb1f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0xdddf0000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x888f777f,0x888f777f,0x12af12af,0x777f14af,0x139f12bf,0x777f248f,0x777f777f,0x888f888f,0x531f531f,0x632f631f,0x531f531f,0x531f531f,0x531f421f,0x531f531f,0x531f531f,0x631f531f,0xcb1fcb1f,0xdc2fdc2f,0xcb1fdc2f,0xba1fcb1f,0xcb1f991f,0xdc2fcb1f,0xcb1fbb1f,0xdc2fdc2f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x0000dddf,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x777f777f,0x777f777f,0x248f248f,0x777f248f,0x777f777f,0x888f888f,0x777f777f,0x777f777f,0x531f631f,0x531f531f,0x531f531f,0x531f531f,0x531f632f,0x531f531f,0x531f531f,0x421f531f,0xdc2fdc2f,0xba1fcb1f,0xcb1fdc2f,0xcc1fcb1f,0xdc1fdc2f,0xba1fba1f,0xcb1fcb1f,0xaa1fba1f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x777f777f,0x777f777f,0x888f666f,0x777f888f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x421f421f,0x531f531f,0x531f421f,0x631f531f,0x531f531f,0x531f531f,0x421f421f,0x531f531f,0xba1fa91f,0xcb1fdc2f,0xba1faa1f,0xdc2fdc2f,0xba1fbb1f,0xdc2fcb1f,0xba1faa1f,0xdc2fdc1f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xedafedaf,0xdd9fdc9f,0xddafedaf,0xdc9fdc9f,0xddafddaf,0xddafdc9f,0xdd9fedaf,0xeeafedaf,0x239f228f,0x228f228f,0x23af239f,0x239f228f,0x23af239f,0x228f228f,0x239f239f,0x228f228f,0x58df57cf,0x57cf47cf,0x79df68df,0x58df57cf,0x79df69df,0x57cf46cf,0x68df68df,0x47cf57cf,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0xddafddaf,0xddafedaf,0xcc9fdc9f,0xcc9fcc9f,0xdd9fdd9f,0xedafdc9f,0xeeafdd9f,0xeeafeeaf,0x239f239f,0x23bf23af,0x23af23af,0x239f239f,0x228f228f,0x239f239f,0x228f127f,0x239f239f,0x69df68df,0x8adf8adf,0x79df79df,0x68df68df,0x47cf57cf,0x68df58df,0x47cf36cf,0x68df58df,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdc9fddaf,0xdd9fddaf,0xcc9fcc9f,0xdc9fcc9f,0xdd9fdc9f,0xedafdc9f,0xddafedaf,0xedafedaf,0x23af23af,0x239f239f,0x23af23af,0x239f239f,0x23af23af,0x23af23af,0x23af23af,0x239f23af,0x79df79df,0x68df68df,0x79df8adf,0x68df68df,0x79df79df,0x79df79df,0x8adf8adf,0x69df79df,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdd9fedaf,0xdd9fdd9f,0xdc9fdc9f,0xedafdd9f,0xdd9fdc9f,0xdd9fdc9f,0xddafedaf,0xdc9fddaf,0x239f239f,0x23af23af,0x239f239f,0x23af239f,0x239f228f,0x23af23af,0x239f239f,0x23af23bf,0x58df68df,0x79df79df,0x58df68df,0x79df68df,0x68df57cf,0x79df79df,0x58df68df,0x79df8adf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdc9fdd9f,0xdc9fdd9f,0xdd9fdd9f,0xedafddaf,0xdd9fdc9f,0xdd9fdd9f,0xddafedaf,0xdc9fddaf,0x239f239f,0x239f228f,0x23af23af,0x227f228f,0x239f239f,0x228f239f,0x23af23af,0x228f228f,0x68df69df,0x68df57cf,0x79df79df,0x36cf46cf,0x68df58df,0x47cf58df,0x79df79df,0x46cf57cf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdd9fdc9f,0xcc9fdd9f,0xdc9fcc9f,0xeebfedaf,0xdc9fddaf,0xdc9fdc9f,0xdd9fdd9f,0xdd9fddaf,0x228f228f,0x23af238f,0x227f228f,0x239f228f,0x227f228f,0x239f239f,0x239f228f,0x239f228f,0x46cf47cf,0x79df57cf,0x36cf57cf,0x58df57cf,0x36cf57cf,0x68df58df,0x58df47cf,0x58df57cf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xddafdc9f,0xdc9fddaf,0xdc9fdd9f,0xedbfdc9f,0xdd9fddaf,0xdd9fedaf,0xddafdc9f,0xddafddaf,0x23bf23af,0x23af23af,0x239f239f,0x239f239f,0x23bf23af,0x239f239f,0x23bf23bf,0x239f23af,0x8adf8adf,0x79df79df,0x68df68df,0x68df68df,0x8adf79df,0x68df69df,0x8adf8adf,0x68df79df,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdc9fddaf,0xcc9fddaf,0xdc9fdd9f,0xdc9fdc9f,0xddafddaf,0xddafedaf,0xddafdd9f,0xddafddaf,0x239f239f,0x23bf23af,0x239f23af,0x23af23af,0x239f228f,0x23af23af,0x239f239f,0x23af23af,0x58df58df,0x8adf8adf,0x69df79df,0x79df79df,0x58df57cf,0x79df79df,0x69df69df,0x79df79df,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdc9fdd9f,0xddafddaf,0xedafdd9f,0xddafddaf,0xdd9fddaf,0xedafdd9f,0xedafedaf,0xdd9fedaf,0x23af23af,0x239f228f,0x239f23af,0x239f228f,0x239f239f,0x228f239f,0x239f239f,0x228f228f,0x79df79df,0x58df47cf,0x69df79df,0x58df57cf,0x68df58df,0x47cf58df,0x68df68df,0x47cf47cf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdc9fdc9f,0xdc9fdc9f,0xedafddaf,0xcc9fdd9f,0xdc9fedaf,0xddafdc9f,0xddafedaf,0xdd9fddaf,0x239f239f,0x23af239f,0x228f227f,0x239f239f,0x239f228f,0x23bf23bf,0x23af239f,0x23af23bf,0x68df58df,0x79df58df,0x46cf36cf,0x68df68df,0x69df57cf,0x8adf8adf,0x79df68df,0x8adf8adf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xdd9fcc9f,0xdd9fdd9f,0xedafdc9f,0xdd9fddaf,0xdd9fdd9f,0xcc8fdd9f,0xeebfedaf,0xdc9fedaf,0x23af23af,0x23af23af,0x23af23bf,0x239f23af,0x23af23af,0x239f239f,0x239f239f,0x239f228f,0x79df79df,0x79df79df,0x79df8adf,0x69df79df,0x79df79df,0x68df68df,0x68df69df,0x68df57cf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xedafdd9f,0xddafddaf,0xdc9fdc9f,0xcc9fedaf,0xdc9fdc9f,0xdc9fdc9f,0xddafddaf,0xdd9fdc9f,0x228f228f,0x239f239f,0x239f239f,0x23af23af,0x228f228f,0x239f239f,0x228f228f,0x239f239f,0x57cf57cf,0x68df68df,0x58df58df,0x79df79df,0x57cf57cf,0x69df58df,0x46cf46cf,0x69df58df,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xddafddaf,0xddafddaf,0xddafddaf,0xdc9fdd9f,0xdc9fcc8f,0xcc9fdc9f,0xdd9fdc9f,0xdd9fedaf,0x239f239f,0x228f227f,0x23af23af,0x227f228f,0x23af239f,0x23af239f,0x23bf23bf,0x228f239f,0x58df58df,0x46cf36cf,0x8adf79df,0x36cf47cf,0x79df68df,0x79df68df,0x8adf8adf,0x47cf69df,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xddafedaf,0xddafdc9f,0xdcafddaf,0xdd9fdc9f,0xdc9fdc9f,0xdc9fdd9f,0xddafddaf,0xedafdd9f,0x239f23af,0x23bf23af,0x23af23af,0x239f239f,0x239f227f,0x23af23af,0x239f239f,0x23af23af,0x69df79df,0x8adf8adf,0x79df79df,0x68df68df,0x68df36cf,0x79df79df,0x68df68df,0x8adf79df,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xedafedaf,0xedafdd9f,0xddafddaf,0xcc9fdc9f,0xdd9fdc9f,0xddafdd9f,0xedafddaf,0xddafddaf,0x23af23af,0x239f239f,0x239f23af,0x23af239f,0x23af23bf,0x239f239f,0x23af239f,0x228f239f,0x89df8adf,0x68df68df,0x68df79df,0x79df69df,0x79df8adf,0x58df58df,0x79df68df,0x57cf58df,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xedafeeaf,0xdd9fddaf,0xedafdc9f,0xdc9fddaf,0xddafdc9f,0xedafdd9f,0xddafdd9f,0xddafddaf,0x228f228f,0x239f23af,0x239f228f,0x23af23af,0x239f239f,0x23af239f,0x228f228f,0x23af23af,0x57cf47cf,0x68df79df,0x58df57cf,0x8adf79df,0x58df68df,0x79df69df,0x57cf57cf,0x79df79df,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xeebfedbf,0xedbfeebf,0xedafedaf,0xeebffebf,0xfebfeebf,0xeebfeebf,0xfebfeebf,0xeebffebf,0x72bf72bf,0x72bf72bf,0x83cf83cf,0x72bf72bf,0x83cf83cf,0x72bf62af,0x83cf83cf,0x72af72bf,0xb3cfb3cf,0xb3cfb3cf,0xc5cfb4cf,0xb3cfb3cf,0xc5cfc5cf,0xb3cfa3bf,0xc4cfc4cf,0xb3bfb3cf,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x25f836f9,0x15f825f8,0x15f815f8,0x25f825f8,0x25f825f8,0x25f825f8,0x36f936f9,0x36f936f9,0x25f836f9,0x15f825f8,0x15f815f8,0x25f825f8,0x25f825f8,0x25f825f8,0x36f936f9,0x36f936f9,0x25f836f9,0x15f825f8,0x15f815f8,0x25f825f8,0x25f825f8,0x25f825f8,0x36f936f9,0x36f936f9, +0xdcafedaf,0xddafddaf,0xdcafddaf,0xcc9fdc9f,0xdc9fdc9f,0xddafdd9f,0xedbfdc9f,0xedafedbf,0x83cf83cf,0x94df94df,0x83cf83cf,0x73cf73cf,0x72af72bf,0x73cf72bf,0x72af62af,0x73cf72bf,0xc5cfc4cf,0xc6dfc6df,0xc5cfc5cf,0xb4cfb4cf,0xb3bfb3cf,0xb4cfb3cf,0xb3bfa3af,0xb4cfb3cf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x25f815f8,0x36f936f9,0x36f936f9,0x36f936f9,0x36f936f9,0x25f836f9,0x25f825f8,0x15f815f8,0x25f815f8,0x36f936f9,0x36f936f9,0x36f936f9,0x36f936f9,0x25f836f9,0x25f825f8,0x15f815f8,0x25f815f8,0x36f936f9,0x36f936f9,0x36f936f9,0x36f936f9,0x25f836f9,0x25f825f8,0x15f815f8, +0xdc9fcc8f,0xcb8fdc8f,0xcc8fcc8f,0xcb8fcc8f,0xcc7fcc8f,0xcb7fcb7f,0xcc9fcc8f,0xcb7fcb8f,0x84cf83cf,0x73cf73cf,0x84cf84df,0x73cf83cf,0x84cf83cf,0x83cf83cf,0x94df94df,0x83cf83cf,0xc5dfc5cf,0xb4cfb4cf,0xc5dfc6df,0xb4cfc4cf,0xc5dfc5cf,0xc5cfc5cf,0xc6dfc6df,0xc5cfc5cf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x15f815f8,0x25f825f8,0x36f925f8,0x25f825f8,0x25f825f8,0x36f915f8,0x15f836f9,0x15f815f8,0x15f815f8,0x25f825f8,0x36f925f8,0x25f825f8,0x25f825f8,0x36f915f8,0x15f836f9,0x15f815f8,0x15f815f8,0x25f825f8,0x36f925f8,0x25f825f8,0x25f825f8,0x36f915f8,0x15f836f9,0x15f815f8, +0xfecfcc8f,0xeebfedbf,0xfecfcc7f,0xfebffebf,0xedbfeebf,0xfebfbb6f,0xedbfedbf,0xfebffebf,0x72bf83cf,0x84cf83cf,0x73bf73cf,0x84cf83cf,0x73cf72bf,0x84cf84cf,0x72bf83cf,0x84cf94df,0xb3cfc4cf,0xc5dfc5cf,0xb4cfb4cf,0xc5dfb4cf,0xb4cfb3cf,0xc5dfc5df,0xb3cfc4cf,0xc5cfc6df,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x36f915f8,0x25f836f9,0x36f925f8,0x36f936f9,0x15f836f9,0x15f815f8,0x15f815f8,0x25f825f8,0x36f915f8,0x25f836f9,0x36f925f8,0x36f936f9,0x15f836f9,0x15f815f8,0x15f815f8,0x25f825f8,0x36f915f8,0x25f836f9,0x36f925f8,0x36f936f9,0x15f836f9,0x15f815f8,0x15f815f8,0x25f825f8, +0xddafcc8f,0xdc9fdd9f,0xddafcc7f,0xedafedaf,0xcb7fdc9f,0xdc9fedaf,0xedbfddaf,0xddafdc9f,0x73cf83cf,0x83cf72bf,0x83cf83cf,0x62af62af,0x83cf72bf,0x72bf72bf,0x83cf83cf,0x62af72bf,0xb4cfc5cf,0xc4cfb3cf,0xc5cfc5cf,0xa3bfa3bf,0xc4cfb3cf,0xb3bfb3cf,0xc5cfc5cf,0xa3bfb3cf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x36f936f9,0x15f836f9,0x15f815f8,0x15f815f8,0x36f915f8,0x25f825f8,0x15f825f8,0x15f825f8,0x36f936f9,0x15f836f9,0x15f815f8,0x15f815f8,0x36f915f8,0x25f825f8,0x15f825f8,0x15f825f8,0x36f936f9,0x15f836f9,0x15f815f8,0x15f815f8,0x36f915f8,0x25f825f8,0x15f825f8,0x15f825f8, +0xdc9fddaf,0xdd9fdc9f,0xedafcc7f,0xeebfddaf,0xcb7fddaf,0xdd9fedaf,0xddafdd9f,0xcb7fddaf,0x62af72af,0x84cf72bf,0x62af72bf,0x72bf72bf,0x62af72bf,0x73cf72bf,0x72bf72af,0x73bf72bf,0xa3bfb3bf,0xc5dfb3cf,0xa3bfb3cf,0xb3cfb3cf,0xa3bfb3cf,0xb4cfb3cf,0xb3cfa3bf,0xb4cfb3cf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x25f836f9,0x15f825f8,0x25f825f8,0x25f825f8,0x15f836f9,0x15f815f8,0x36f915f8,0x15f815f8,0x25f836f9,0x15f825f8,0x25f825f8,0x25f825f8,0x15f836f9,0x15f815f8,0x36f915f8,0x15f815f8,0x25f836f9,0x15f825f8,0x25f825f8,0x25f825f8,0x15f836f9,0x15f815f8,0x36f915f8,0x15f815f8, +0xcc8fddaf,0xcc8fcc8f,0xcc8fcc7f,0xedbfddbf,0xcb7fbb7f,0xedafcc8f,0xdd9fddaf,0xcb7fddaf,0x94df94df,0x83cf83cf,0x83cf83cf,0x83cf73cf,0x94df83cf,0x73cf83cf,0x94df94df,0x83cf83cf,0xc6dfc6df,0xc5cfc5cf,0xb4cfb4cf,0xc4cfb4cf,0xc6dfc5cf,0xb4cfc5cf,0xc6dfc6df,0xc4cfc5cf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x25f825f8,0x15f815f8,0x15f815f8,0x36f915f8,0x15f815f8,0x25f815f8,0x36f925f8,0x36f936f9,0x25f825f8,0x15f815f8,0x15f815f8,0x36f915f8,0x15f815f8,0x25f815f8,0x36f925f8,0x36f936f9,0x25f825f8,0x15f815f8,0x15f815f8,0x36f915f8,0x15f815f8,0x25f815f8,0x36f925f8,0x36f936f9, +0xfecfcb7f,0xedbfeebf,0xeebffecf,0xcc8fcc8f,0xeebfeebf,0xcc8ffebf,0xcc8fcc9f,0xeebfcb7f,0x72bf72bf,0x94df94df,0x83cf83cf,0x84cf84cf,0x72bf72bf,0x84cf83cf,0x83cf83cf,0x84cf84cf,0xb3cfb3cf,0xc6dfc6df,0xc5cfc5cf,0xc5cfc5df,0xb3cfb3cf,0xc5dfc5cf,0xc5cfc5cf,0xc5cfc5df,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x25f815f8,0x36f936f9,0x25f836f9,0x25f825f8,0x25f815f8,0x36f925f8,0x25f836f9,0x15f825f8,0x25f815f8,0x36f936f9,0x25f836f9,0x25f825f8,0x25f815f8,0x36f925f8,0x25f836f9,0x15f825f8,0x25f815f8,0x36f936f9,0x25f836f9,0x25f825f8,0x25f815f8,0x36f925f8,0x25f836f9,0x15f825f8, +0xddafeebf,0xddafedaf,0xcb7fddaf,0xeebfeebf,0xdd9fddaf,0xdc8fedaf,0xeebffebf,0xeebfcb7f,0x83cf83cf,0x72bf72af,0x83cf84cf,0x73bf72bf,0x73cf72bf,0x72af72bf,0x73cf83cf,0x72bf72bf,0xc5cfc5cf,0xb3cfb3bf,0xc5cfc5cf,0xb4cfb3cf,0xb4cfb3cf,0xa3bfb3cf,0xb4cfb4cf,0xb3bfb3cf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x25f825f8,0x25f836f9,0x25f825f8,0x25f825f8,0x15f825f8,0x15f815f8,0x15f815f8,0x15f815f8,0x25f825f8,0x25f836f9,0x25f825f8,0x25f825f8,0x15f825f8,0x15f815f8,0x15f815f8,0x15f815f8,0x25f825f8,0x25f836f9,0x25f825f8,0x25f825f8,0x15f825f8,0x15f815f8,0x15f815f8,0x15f815f8, +0xedafdc9f,0xedafedaf,0xcb7fdd9f,0xddafedbf,0xddafedaf,0xcb6fdc9f,0xddafedbf,0xddafcb7f,0x73cf72bf,0x83cf73bf,0x62af62af,0x83cf73cf,0x83cf72bf,0x94df94df,0x83cf73cf,0x94df94df,0xb4cfb3cf,0xc5cfb4cf,0xa3bfa3bf,0xc4cfb4cf,0xc5cfb3cf,0xc6dfc6df,0xc5cfb4cf,0xc6dfc6df,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x15f815f8,0x15f815f8,0x15f815f8,0x36f936f9,0x36f936f9,0x36f925f8,0x25f836f9,0x25f825f8,0x15f815f8,0x15f815f8,0x15f815f8,0x36f936f9,0x36f936f9,0x36f925f8,0x25f836f9,0x25f825f8,0x15f815f8,0x15f815f8,0x15f815f8,0x36f936f9,0x36f936f9,0x36f925f8,0x25f836f9,0x25f825f8, +0xcb7fdd9f,0xcb7fcb7f,0xcc8fdc9f,0xdd9fdd9f,0xdd9fedbf,0xcc8fddaf,0xcb7fddaf,0xcb7fcb7f,0x84cf84cf,0x83cf83cf,0x84cf94df,0x83cf83cf,0x83cf84cf,0x83cf73cf,0x83cf83cf,0x83cf72bf,0xc5dfc5cf,0xc5cfc5cf,0xc5dfc6df,0xc5cfc5cf,0xc5cfc5df,0xc4cfb4cf,0xb4cfc5cf,0xc4cfb3cf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x25f815f8,0x36f936f9,0x25f836f9,0x36f925f8,0x15f836f9,0x36f915f8,0x15f825f8,0x15f815f8,0x25f815f8,0x36f936f9,0x25f836f9,0x36f925f8,0x15f836f9,0x36f915f8,0x15f825f8,0x15f815f8,0x25f815f8,0x36f936f9,0x25f836f9,0x36f925f8,0x15f836f9,0x36f915f8,0x15f825f8,0x15f815f8, +0xeebfcb7f,0xedafeebf,0xbb6fcc8f,0xcb7fcb7f,0xcb7fdd9f,0xeebfcb7f,0xedafcb7f,0xeebfeebf,0x72bf72bf,0x83cf83cf,0x73bf72bf,0x83cf83cf,0x72bf72bf,0x83cf72bf,0x62af62af,0x83cf73bf,0xb3cfb3cf,0xc4cfc4cf,0xb4cfb3cf,0xc5cfc5cf,0xb3cfb3cf,0xc5cfb3cf,0xa3bfa3bf,0xc5cfb4cf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8, +0xedbfeebf,0xcc8fedaf,0xeebfeebf,0xeebfeebf,0xeecfcb7f,0xddafedbf,0xedbfcc8f,0xedbfeebf,0x72bf73bf,0x62af62af,0x84df84cf,0x62af72bf,0x83cf83cf,0x83cf83cf,0x94df94df,0x72af83cf,0xb3cfb4cf,0xa3bfa3bf,0xc6dfc5cf,0xa3bfb3bf,0xc5cfb4cf,0xc5cfc4cf,0xc6dfc6df,0xa3bfc5cf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x36f936f9,0x36f936f9,0x36f936f9,0x36f936f9,0x25f825f8,0x25f825f8,0x15f815f8,0x15f815f8,0x36f936f9,0x36f936f9,0x36f936f9,0x36f936f9,0x25f825f8,0x25f825f8,0x15f815f8,0x15f815f8,0x36f936f9,0x36f936f9,0x36f936f9,0x36f936f9,0x25f825f8,0x25f825f8,0x15f815f8,0x15f815f8, +0xedbfedbf,0xcb7fdc9f,0xddafdcaf,0xddafdd9f,0xddafcb7f,0xdc9fdc9f,0xedbfcb7f,0xddafddaf,0x83cf83cf,0x94df94df,0x83cf84cf,0x73cf83cf,0x73cf62af,0x84cf83cf,0x73cf73cf,0x94df84cf,0xc5cfc5cf,0xc6dfc6df,0xc5cfc5cf,0xb4cfc4cf,0xb4cfa3bf,0xc5dfc5cf,0xb4cfb4cf,0xc6dfc5df,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x15f815f8,0x15f815f8,0x25f815f8,0x36f925f8,0x36f936f9,0x36f936f9,0x25f836f9,0x15f825f8,0x15f815f8,0x15f815f8,0x25f815f8,0x36f925f8,0x36f936f9,0x36f936f9,0x25f836f9,0x15f825f8,0x15f815f8,0x15f815f8,0x25f815f8,0x36f925f8,0x36f936f9,0x36f936f9,0x25f836f9,0x15f825f8, +0xcc8fcc9f,0xcc8fedaf,0xeebfddaf,0xbb7fddbf,0xcc7fedbf,0xedafddaf,0xbb6fcc8f,0xbb6fddaf,0x84df84df,0x73cf83cf,0x83cf84cf,0x83cf83cf,0x83cf94df,0x72bf72bf,0x83cf83cf,0x72bf73bf,0xc6dfc6df,0xb4cfc4cf,0xc4cfc5df,0xc5cfc5cf,0xc5cfc6df,0xb3cfb3cf,0xc5cfc4cf,0xb3cfb4cf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x25f825f8,0x36f936f9,0x36f936f9,0x15f815f8,0x15f815f8,0x25f825f8,0x25f825f8,0x36f936f9,0x25f825f8,0x36f936f9,0x36f936f9,0x15f815f8,0x15f815f8,0x25f825f8,0x25f825f8,0x36f936f9,0x25f825f8,0x36f936f9,0x36f936f9,0x15f815f8,0x15f815f8,0x25f825f8,0x25f825f8,0x36f936f9, +0xeebfeebf,0xddafcc8f,0xcc8fcc8f,0xedafcb7f,0xdd9fedaf,0xcc8fcb7f,0xeebfedbf,0xeebfcb7f,0x72bf72af,0x83cf84cf,0x73bf72bf,0x94df84cf,0x72bf73cf,0x84cf83cf,0x72bf72bf,0x84cf83cf,0xb3cfb3bf,0xc4cfc5cf,0xb4cfb3cf,0xc6dfc5df,0xb3cfb4cf,0xc5cfc5cf,0xb3cfb3cf,0xc5dfc5cf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x15f815f8,0x15f815f8,0x15f815f8,0x15f836f9,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f836f9,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f836f9,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8, +0xddafeeaf,0xcb7fcc8f,0xddafedaf,0xcb7feebf,0xedafdc9f,0xddafddaf,0xddafcb7f,0xddafddaf,0x268f268f,0x268f268f,0x279f279f,0x268f268f,0x279f279f,0x268f268f,0x279f279f,0x268f268f,0xe73fe72f,0xe72fe72f,0xe84fe83f,0xe72fe72f,0xe83fe83f,0xe72fe61f,0xe83fe83f,0xe72fe72f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x25f836f9,0x15f825f8,0x15f815f8,0x25f825f8,0x25f825f8,0x25f825f8,0x36f936f9,0x36f936f9,0x25f836f9,0x15f825f8,0x15f815f8,0x25f825f8,0x25f825f8,0x25f825f8,0x36f936f9,0x36f936f9, +0xcb7fedaf,0xedafddaf,0xdc9fcb7f,0xcb7fdc9f,0xddafdd9f,0xdc9fdc9f,0xcb7fdc9f,0xeebfcb7f,0x279f279f,0x28af28af,0x279f27af,0x279f279f,0x268f268f,0x279f268f,0x268f157f,0x279f268f,0xe83fe83f,0xe84fe84f,0xe83fe84f,0xe73fe73f,0xe72fe72f,0xe73fe72f,0xe72fe61f,0xe73fe73f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x25f815f8,0x36f936f9,0x36f936f9,0x36f936f9,0x36f936f9,0x25f836f9,0x25f825f8,0x15f815f8,0x25f815f8,0x36f936f9,0x36f936f9,0x36f936f9,0x36f936f9,0x25f836f9,0x25f825f8,0x15f815f8, +0xedafcc8f,0xcb7fdd9f,0xdc9fcb7f,0xdc9fcc9f,0xdc9fcb7f,0xedafcc9f,0xeeafcb7f,0xcb7fedaf,0x27af27af,0x279f279f,0x27af28af,0x279f279f,0x27af279f,0x279f279f,0x28af28af,0x279f279f,0xe84fe84f,0xe73fe73f,0xe84fe84f,0xe73fe83f,0xe84fe83f,0xe83fe83f,0xe84fe84f,0xe83fe83f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x15f815f8,0x25f825f8,0x36f925f8,0x25f825f8,0x25f825f8,0x36f915f8,0x15f836f9,0x15f815f8,0x15f815f8,0x25f825f8,0x36f925f8,0x25f825f8,0x25f825f8,0x36f915f8,0x15f836f9,0x15f815f8, +0xdd9fcc8f,0xedbfcb7f,0xcb7fedbf,0xddafdd9f,0xdc9fdc8f,0xcb7fdd9f,0xedafedbf,0xdc9fdd9f,0x268f279f,0x27af279f,0x278f279f,0x27af279f,0x279f268f,0x27af27af,0x268f279f,0x27af28af,0xe73fe83f,0xe84fe84f,0xe73fe73f,0xe84fe83f,0xe73fe72f,0xe84fe84f,0xe73fe83f,0xe84fe84f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x36f915f8,0x25f836f9,0x36f925f8,0x36f936f9,0x15f836f9,0x15f815f8,0x15f815f8,0x25f825f8,0x36f915f8,0x25f836f9,0x36f925f8,0x36f936f9,0x15f836f9,0x15f815f8,0x15f815f8,0x25f825f8, +0xcb7fdd9f,0xddafedbf,0xdc8fdc9f,0xeebfeebf,0xcc8fcb7f,0xedbfcc8f,0xedafedaf,0xddafdd9f,0x279f279f,0x279f268f,0x279f279f,0x267f268f,0x279f268f,0x268f268f,0x279f279f,0x268f268f,0xe73fe83f,0xe83fe72f,0xe84fe84f,0xe61fe61f,0xe83fe72f,0xe72fe72f,0xe84fe84f,0xe61fe72f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x36f936f9,0x15f836f9,0x15f815f8,0x15f815f8,0x36f915f8,0x25f825f8,0x15f825f8,0x15f825f8,0x36f936f9,0x15f836f9,0x15f815f8,0x15f815f8,0x36f915f8,0x25f825f8,0x15f825f8,0x15f825f8, +0xcb7fdc9f,0xddafdc9f,0xdc8fddaf,0xcb7fcb7f,0xddafedaf,0xcb7fdd9f,0xdd9fdc9f,0xdc9fcc9f,0x267f268f,0x27af268f,0x267f268f,0x268f268f,0x267f268f,0x279f268f,0x268f268f,0x278f268f,0xe61fe72f,0xe84fe72f,0xe61fe72f,0xe73fe72f,0xe61fe72f,0xe73fe73f,0xe72fe61f,0xe73fe72f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x25f836f9,0x15f825f8,0x25f825f8,0x25f825f8,0x15f836f9,0x15f815f8,0x36f915f8,0x15f815f8,0x25f836f9,0x15f825f8,0x25f825f8,0x25f825f8,0x15f836f9,0x15f815f8,0x36f915f8,0x15f815f8, +0xdd9fcb7f,0xedbfdd9f,0xdc8fdc9f,0xedafcb7f,0xdd9fcb7f,0xdc9fedaf,0xcc8fcc8f,0xcb7fedbf,0x28af28af,0x279f27af,0x279f279f,0x279f279f,0x28af27af,0x279f279f,0x28af28af,0x279f279f,0xe84fe84f,0xe84fe84f,0xe83fe83f,0xe83fe73f,0xe84fe84f,0xe73fe83f,0xe84fe84f,0xe83fe83f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x799f799f,0x00000000,0x799f0000,0x0000799f,0x00000000,0x799f799f,0x00000000,0x25f825f8,0x15f815f8,0x15f815f8,0x36f915f8,0x15f815f8,0x25f815f8,0x36f925f8,0x36f936f9,0x25f825f8,0x15f815f8,0x15f815f8,0x36f915f8,0x15f815f8,0x25f815f8,0x36f925f8,0x36f936f9, +0xcb7fedaf,0xdc8fedbf,0xcb7fcb7f,0xdc9fdc9f,0xedafcb7f,0xddafddaf,0xedafddaf,0xedafcb7f,0x268f268f,0x28af28af,0x279f279f,0x27af27af,0x268f268f,0x27af279f,0x279f279f,0x27af28af,0xe73fe73f,0xe84fe84f,0xe83fe83f,0xe84fe84f,0xe72fe72f,0xe84fe84f,0xe83fe83f,0xe84fe84f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x799f0000,0xdddfffff,0x0000567f,0xffff799f,0x567fdddf,0x799f0000,0xdddfffff,0x0000567f,0x25f815f8,0x36f936f9,0x25f836f9,0x25f825f8,0x25f815f8,0x36f925f8,0x25f836f9,0x15f825f8,0x25f815f8,0x36f936f9,0x25f836f9,0x25f825f8,0x25f815f8,0x36f925f8,0x25f836f9,0x15f825f8, +0xdc9fdc9f,0xddafcb7f,0xedafedaf,0xdc9fcc8f,0xcb7fddaf,0xdd9fcb7f,0xcb7feebf,0xdc9fddaf,0x279f279f,0x268f268f,0x279f27af,0x278f268f,0x279f268f,0x268f268f,0x279f279f,0x268f268f,0xe83fe83f,0xe72fe72f,0xe83fe84f,0xe73fe72f,0xe73fe72f,0xe61fe72f,0xe73fe83f,0xe72fe72f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x799f0000,0xbccfdddf,0x0000567f,0xdddf799f,0x567fbccf,0x799f0000,0xbccfdddf,0x0000567f,0x25f825f8,0x25f836f9,0x25f825f8,0x25f825f8,0x15f825f8,0x15f815f8,0x15f815f8,0x15f815f8,0x25f825f8,0x25f836f9,0x25f825f8,0x25f825f8,0x15f825f8,0x15f815f8,0x15f815f8,0x15f815f8, +0xdd9fdc9f,0xdc9fcc8f,0xddafddaf,0xdc9fcb7f,0xdc9fedaf,0xcb7fcc9f,0xcc8fcb7f,0xdc9fedaf,0x279f268f,0x27af278f,0x268f267f,0x279f279f,0x279f268f,0x28af28af,0x279f279f,0x28af28af,0xe73fe72f,0xe84fe73f,0xe61fe61f,0xe83fe73f,0xe83fe72f,0xe84fe84f,0xe83fe73f,0xe84fe84f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x567f567f,0x00000000,0x567f0000,0x0000567f,0x00000000,0x567f567f,0x00000000,0x15f815f8,0x15f815f8,0x15f815f8,0x36f936f9,0x36f936f9,0x36f925f8,0x25f836f9,0x25f825f8,0x15f815f8,0x15f815f8,0x15f815f8,0x36f936f9,0x36f936f9,0x36f925f8,0x25f836f9,0x25f825f8, +0xcb7fdc9f,0xdc9fdc9f,0xedafddaf,0xddafcb7f,0xdc9fddaf,0xeebfcb7f,0xcc8fddaf,0xdd9fedaf,0x28af27af,0x279f279f,0x27af28af,0x279f279f,0x27af28af,0x279f279f,0x279f279f,0x279f268f,0xe84fe84f,0xe83fe83f,0xe84fe84f,0xe83fe83f,0xe84fe84f,0xe83fe73f,0xe83fe83f,0xe83fe72f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x25f815f8,0x36f936f9,0x25f836f9,0x36f925f8,0x15f836f9,0x36f915f8,0x15f825f8,0x15f815f8,0x25f815f8,0x36f936f9,0x25f836f9,0x36f925f8,0x15f836f9,0x36f915f8,0x15f825f8,0x15f815f8, +0xeebfcb7f,0xedafeebf,0xedafdd9f,0xcb7fedaf,0xeebfdc9f,0xeebfcb7f,0xcb7fddaf,0xddafddaf,0x268f268f,0x279f279f,0x278f268f,0x279f279f,0x268f268f,0x279f268f,0x267f267f,0x279f278f,0xe72fe72f,0xe83fe83f,0xe73fe73f,0xe83fe84f,0xe72fe72f,0xe83fe72f,0xe61fe61f,0xe83fe73f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8, +0xcc8fddaf,0xedafcb7f,0xcc8fcc8f,0xdc9fcb7f,0xcb7fdc9f,0xdd9feebf,0xddafdc9f,0xcc8fcb7f,0x268f278f,0x268f267f,0x28af27af,0x267f268f,0x279f279f,0x279f279f,0x28af28af,0x268f279f,0xe73fe73f,0xe61fe61f,0xe84fe84f,0xe61fe72f,0xe84fe83f,0xe83fe83f,0xe84fe84f,0xe61fe83f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x36f936f9,0x36f936f9,0x36f936f9,0x36f936f9,0x25f825f8,0x25f825f8,0x15f815f8,0x15f815f8,0x36f936f9,0x36f936f9,0x36f936f9,0x36f936f9,0x25f825f8,0x25f825f8,0x15f815f8,0x15f815f8, +0xedafedaf,0xcb7feebf,0xddafcb7f,0xcb7fdd9f,0xcc8fdc9f,0xddafdd9f,0xcb7fedaf,0xddafedbf,0x279f279f,0x28af28af,0x279f27af,0x279f279f,0x279f267f,0x27af279f,0x279f279f,0x28af27af,0xe83fe83f,0xe84fe84f,0xe83fe84f,0xe73fe83f,0xe73fe61f,0xe84fe83f,0xe73fe73f,0xe84fe84f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x15f815f8,0x15f815f8,0x25f815f8,0x36f925f8,0x36f936f9,0x36f936f9,0x25f836f9,0x15f825f8,0x15f815f8,0x15f815f8,0x25f815f8,0x36f925f8,0x36f936f9,0x36f936f9,0x25f836f9,0x15f825f8, +0xedafedaf,0xeebfdc9f,0xddafcb7f,0xcb7fdc9f,0xcb7fcc8f,0xddafcc8f,0xedbfcb7f,0xddafdd9f,0x28af28af,0x279f279f,0x279f27af,0x279f279f,0x27af28af,0x268f268f,0x279f279f,0x268f278f,0xe84fe84f,0xe73fe83f,0xe83fe84f,0xe84fe83f,0xe84fe84f,0xe72fe72f,0xe83fe83f,0xe72fe73f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x25f825f8,0x36f936f9,0x36f936f9,0x15f815f8,0x15f815f8,0x25f825f8,0x25f825f8,0x36f936f9,0x25f825f8,0x36f936f9,0x36f936f9,0x15f815f8,0x15f815f8,0x25f825f8,0x25f825f8,0x36f936f9, +0xddafedaf,0xcb7fdd9f,0xedafddaf,0xcb7fdd9f,0xddafddaf,0xcb7fdc9f,0xddafdd9f,0xedafddaf,0x268f268f,0x279f27af,0x278f268f,0x28af27af,0x268f279f,0x27af279f,0x268f268f,0x27af27af,0xe72fe72f,0xe83fe84f,0xe73fe72f,0xe84fe84f,0xe73fe73f,0xe84fe83f,0xe72fe72f,0xe84fe84f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x15f815f8,0x15f815f8,0x15f815f8,0x15f836f9,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8,0x15f836f9,0x15f815f8,0x15f815f8,0x15f815f8,0x15f815f8, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x999f999f,0x899f899f,0xaaaf9aaf,0x999f999f,0xaaafaaaf,0x899f888f,0xaaafaaaf,0x899f899f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0xfa0fc00f,0xf50ffa0f,0xc00ff00f,0xc00fc00f,0xf00ff00f,0xf00ff50f,0xc00ff00f,0xc00fc00f,0xfa0fc00f,0xf50ffa0f,0xc00ff00f,0xc00fc00f,0xf00ff00f,0xf00ff50f,0xc00ff00f,0xc00fc00f,0xfa0fc00f,0xf50ffa0f,0xc00ff00f,0xc00fc00f,0xf00ff00f,0xf00ff50f,0xc00ff00f,0xc00fc00f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xaaaf9aaf,0xbbbfbbbf,0xaaafabbf,0x9aaf9aaf,0x899f899f,0x9aaf999f,0x899f788f,0x9aaf999f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xff0ff50f,0xf50fff0f,0xf00ff00f,0xf00fc00f,0xf50ff00f,0xf50fff0f,0xf00ff00f,0xc00fc00f,0xff0ff50f,0xf50fff0f,0xf00ff00f,0xf00fc00f,0xf50ff00f,0xf50fff0f,0xf00ff00f,0xc00fc00f,0xff0ff50f,0xf50fff0f,0xf00ff00f,0xf00fc00f,0xf50ff00f,0xf50fff0f,0xf00ff00f,0xc00fc00f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xabbfabbf,0x9aaf9aaf,0xabbfbbbf,0x9aafaaaf,0xabbfaaaf,0xaaafaaaf,0xbbbfbbbf,0xaaafaaaf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xfa0ff50f,0xf50fff0f,0xf00fc00f,0xf50ff00f,0xf50ff00f,0xfa0fff0f,0xf00fc00f,0xf00ff00f,0xfa0ff50f,0xf50fff0f,0xf00fc00f,0xf50ff00f,0xf50ff00f,0xfa0fff0f,0xf00fc00f,0xf00ff00f,0xfa0ff50f,0xf50fff0f,0xf00fc00f,0xf50ff00f,0xf50ff00f,0xfa0fff0f,0xf00fc00f,0xf00ff00f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x999f9aaf,0xabbfaaaf,0x999f9aaf,0xabbf9aaf,0x9aaf999f,0xabbfabbf,0x999f9aaf,0xabbfbbbf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf00ff00f,0xf00ff50f,0xf50ff50f,0xff0ffa0f,0xf50ff50f,0xf50ff50f,0xf50ff50f,0xf00ff00f,0xf00ff00f,0xf00ff50f,0xf50ff50f,0xff0ffa0f,0xf50ff50f,0xf50ff50f,0xf50ff50f,0xf00ff00f,0xf00ff00f,0xf00ff50f,0xf50ff50f,0xff0ffa0f,0xf50ff50f,0xf50ff50f,0xf50ff50f,0xf00ff00f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x9aafaaaf,0x9aaf999f,0xaaafaaaf,0x888f888f,0xaaaf999f,0x899f999f,0xaaafaaaf,0x888f899f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xc00ff00f,0xf50ff00f,0xf50fff0f,0xf50ff50f,0xff0ffa0f,0xff0ff50f,0xfa0fff0f,0xf00ff50f,0xc00ff00f,0xf50ff00f,0xf50fff0f,0xf50ff50f,0xff0ffa0f,0xff0ff50f,0xfa0fff0f,0xf00ff50f,0xc00ff00f,0xf50ff00f,0xf50fff0f,0xf50ff50f,0xff0ffa0f,0xff0ff50f,0xfa0fff0f,0xf00ff50f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x888f899f,0xabbf999f,0x888f999f,0x999f999f,0x888f999f,0x9aaf999f,0x999f899f,0x9aaf899f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf00ff00f,0xff0ffa0f,0xf50ff50f,0xf00fc00f,0xf00ff00f,0xfa0fc00f,0xf50ffa0f,0xf00ff50f,0xf00ff00f,0xff0ffa0f,0xf50ff50f,0xf00fc00f,0xf00ff00f,0xfa0fc00f,0xf50ffa0f,0xf00ff50f,0xf00ff00f,0xff0ffa0f,0xf50ff50f,0xf00fc00f,0xf00ff00f,0xfa0fc00f,0xf50ffa0f,0xf00ff50f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xbbbfbbbf,0xaaafabbf,0x9aaf9aaf,0xaaaf9aaf,0xbbbfabbf,0x9aafaaaf,0xbbbfbbbf,0xaaafaaaf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf00fc00f,0xf00ff50f,0xf00ff00f,0xc00fc00f,0xf00ff00f,0xf50ff00f,0xf00ff00f,0xf00ffa0f,0xf00fc00f,0xf00ff50f,0xf00ff00f,0xc00fc00f,0xf00ff00f,0xf50ff00f,0xf00ff00f,0xf00ffa0f,0xf00fc00f,0xf00ff50f,0xf00ff00f,0xc00fc00f,0xf00ff00f,0xf50ff00f,0xf00ff00f,0xf00ffa0f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x999f999f,0xbbbfbbbf,0xaaafaaaf,0xabbfabbf,0x999f899f,0xabbfaaaf,0xaaafaaaf,0xabbfabbf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xc00fc00f,0xf50ff00f,0xf50ffa0f,0xc00fc00f,0xf50ff50f,0xc00ff00f,0xfa0ff00f,0xfa0fff0f,0xc00fc00f,0xf50ff00f,0xf50ffa0f,0xc00fc00f,0xf50ff50f,0xc00ff00f,0xfa0ff00f,0xfa0fff0f,0xc00fc00f,0xf50ff00f,0xf50ffa0f,0xc00fc00f,0xf50ff50f,0xc00ff00f,0xfa0ff00f,0xfa0fff0f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xaaafaaaf,0x999f899f,0xaaafabbf,0x999f999f,0x9aaf999f,0x899f999f,0x9aaf9aaf,0x899f899f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xc00fc00f,0xfa0ff50f,0xfa0fff0f,0xf00ff00f,0xff0ffa0f,0xc00ff50f,0xf50ff00f,0xf50ff50f,0xc00fc00f,0xfa0ff50f,0xfa0fff0f,0xf00ff00f,0xff0ffa0f,0xc00ff50f,0xf50ff00f,0xf50ff50f,0xc00fc00f,0xfa0ff50f,0xfa0fff0f,0xf00ff00f,0xff0ffa0f,0xc00ff50f,0xf50ff00f,0xf50ff50f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x9aaf999f,0xabbf9aaf,0x888f888f,0xaaaf9aaf,0xaaaf999f,0xbbbfbbbf,0xaaaf9aaf,0xbbbfbbbf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf00ff00f,0xf50ff00f,0xf50ff50f,0xf00ff00f,0xff0ff50f,0xc00ff50f,0xf00fc00f,0xf00ff50f,0xf00ff00f,0xf50ff00f,0xf50ff50f,0xf00ff00f,0xff0ff50f,0xc00ff50f,0xf00fc00f,0xf00ff50f,0xf00ff00f,0xf50ff00f,0xf50ff50f,0xf00ff00f,0xff0ff50f,0xc00ff50f,0xf00fc00f,0xf00ff50f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xabbfabbf,0xaaafaaaf,0xabbfbbbf,0xaaafaaaf,0xabbfabbf,0xaaaf9aaf,0x9aafaaaf,0x9aaf899f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf50ff00f,0xf00ff50f,0xf00ff00f,0xf00fc00f,0xf50ff50f,0xf00ff50f,0xfa0ff00f,0xf00ff50f,0xf50ff00f,0xf00ff50f,0xf00ff00f,0xf00fc00f,0xf50ff50f,0xf00ff50f,0xfa0ff00f,0xf00ff50f,0xf50ff00f,0xf00ff50f,0xf00ff00f,0xf00fc00f,0xf50ff50f,0xf00ff50f,0xfa0ff00f,0xf00ff50f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x999f899f,0xaaafaaaf,0x999f999f,0xaaafaaaf,0x999f899f,0xaaaf999f,0x888f888f,0xaaaf9aaf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xfa0ff00f,0xf50fff0f,0xfa0ff50f,0xf00ff50f,0xf00ff00f,0xf50ff00f,0xff0ffa0f,0xf00ffa0f,0xfa0ff00f,0xf50fff0f,0xfa0ff50f,0xf00ff50f,0xf00ff00f,0xf50ff00f,0xff0ffa0f,0xf00ffa0f,0xfa0ff00f,0xf50fff0f,0xfa0ff50f,0xf00ff50f,0xf00ff00f,0xf50ff00f,0xff0ffa0f,0xf00ffa0f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x999f999f,0x888f888f,0xbbbfabbf,0x888f899f,0xaaaf9aaf,0xaaafaaaf,0xbbbfbbbf,0x899faaaf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xff0ff00f,0xf50fff0f,0xff0fff0f,0xf00ffa0f,0xf00fc00f,0xf50ff00f,0xff0fff0f,0xf00ff50f,0xff0ff00f,0xf50fff0f,0xff0fff0f,0xf00ffa0f,0xf00fc00f,0xf50ff00f,0xff0fff0f,0xf00ff50f,0xff0ff00f,0xf50fff0f,0xff0fff0f,0xf00ffa0f,0xf00fc00f,0xf50ff00f,0xff0fff0f,0xf00ff50f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xaaafaaaf,0xbbbfbbbf,0xaaafabbf,0x9aafaaaf,0x9aaf888f,0xabbfaaaf,0x9aaf9aaf,0xbbbfabbf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf50ff00f,0xf50ffa0f,0xf50ff50f,0xf00ff50f,0xf50ff50f,0xf50ff00f,0xf50ffa0f,0xf00ff00f,0xf50ff00f,0xf50ffa0f,0xf50ff50f,0xf00ff50f,0xf50ff50f,0xf50ff00f,0xf50ffa0f,0xf00ff00f,0xf50ff00f,0xf50ffa0f,0xf50ff50f,0xf00ff50f,0xf50ff50f,0xf50ff00f,0xf50ffa0f,0xf00ff00f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xbbbfbbbf,0x9aaf9aaf,0xaaafabbf,0xaaafaaaf,0xabbfbbbf,0x999f999f,0xaaafaaaf,0x899f999f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf00fc00f,0xf00ff50f,0xf00fc00f,0xf50ff00f,0xfa0ffa0f,0xf00ff50f,0xf00ff50f,0xc00ff00f,0xf00fc00f,0xf00ff50f,0xf00fc00f,0xf50ff00f,0xfa0ffa0f,0xf00ff50f,0xf00ff50f,0xc00ff00f,0xf00fc00f,0xf00ff50f,0xf00fc00f,0xf50ff00f,0xfa0ffa0f,0xf00ff50f,0xf00ff50f,0xc00ff00f, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0x999f899f,0xaaafabbf,0x999f899f,0xbbbfabbf,0x999f9aaf,0xabbfaaaf,0x999f899f,0xabbfabbf,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf00fc00f,0xf00ff50f,0xf00ff00f,0xc00fc00f,0xf50ffa0f,0xf00ff00f,0xf00ff00f,0xc00fc00f,0xf00fc00f,0xf00ff50f,0xf00ff00f,0xc00fc00f,0xf50ffa0f,0xf00ff00f,0xf00ff00f,0xc00fc00f,0xf00fc00f,0xf00ff50f,0xf00ff00f,0xc00fc00f,0xf50ffa0f,0xf00ff00f,0xf00ff00f,0xc00fc00f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f, +0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f999f,0x777f777f,0x777f777f,0x777f999f,0x777f777f,0x777f333f,0x777f777f,0x777f333f,0x777f999f,0x777f333f,0x777f333f,0x777f999f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f, +0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0x637f637f,0xfa0fc00f,0xf50ffa0f,0xc00ff00f,0xc00fc00f,0xf00ff00f,0xf00ff50f,0xc00ff00f,0xc00fc00f,0xfa0fc00f,0xf50ffa0f,0xc00ff00f,0xc00fc00f,0xf00ff00f,0xf00ff50f,0xc00ff00f,0xc00fc00f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f, +0x777f777f,0x333f777f,0x333f333f,0x777f999f,0x777f777f,0x777f333f,0x777f333f,0x777f777f,0x777f777f,0x333f999f,0x333f333f,0x777f999f,0x777f777f,0x777f333f,0x777f333f,0x777f777f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xff0ff50f,0xf50fff0f,0xf00ff00f,0xf00fc00f,0xf50ff00f,0xf50fff0f,0xf00ff00f,0xc00fc00f,0xff0ff50f,0xf50fff0f,0xf00ff00f,0xf00fc00f,0xf50ff00f,0xf50fff0f,0xf00ff00f,0xc00fc00f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x333f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f777f,0x777f333f,0x333f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f999f,0x777f333f,0x333f333f,0x777f777f,0x777f777f,0x777f777f, +0x333f777f,0x999f777f,0x999f999f,0x777f333f,0x333f333f,0x777f999f,0x333f999f,0x777f777f,0x333f777f,0x999f777f,0x999f999f,0x777f333f,0x333f333f,0x777f999f,0x333f999f,0x777f777f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xfa0ff50f,0xf50fff0f,0xf00fc00f,0xf50ff00f,0xf50ff00f,0xfa0fff0f,0xf00fc00f,0xf00ff00f,0xfa0ff50f,0xf50fff0f,0xf00fc00f,0xf50ff00f,0xf50ff00f,0xfa0fff0f,0xf00fc00f,0xf00ff00f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f, +0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x777f999f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f999f,0x999f999f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f999f,0x999f999f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f333f,0x777f777f,0x333f999f,0x999f999f,0x777f777f,0x333f777f,0x777f777f, +0x999f777f,0x333f333f,0x777f777f,0x333f999f,0x999f999f,0x777f777f,0x333f777f,0x777f777f,0x999f777f,0x333f333f,0x777f777f,0x333f999f,0x999f999f,0x777f777f,0x333f777f,0x777f777f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf00ff00f,0xf00ff50f,0xf50ff50f,0xff0ffa0f,0xf50ff50f,0xf50ff50f,0xf50ff50f,0xf00ff00f,0xf00ff00f,0xf00ff50f,0xf50ff50f,0xff0ffa0f,0xf50ff50f,0xf50ff50f,0xf50ff50f,0xf00ff00f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f, +0x777f777f,0x777f777f,0x777f777f,0x999f333f,0x333f777f,0x777f777f,0x333f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f333f,0x333f777f,0x777f777f,0x333f777f,0x777f333f,0x777f777f,0x777f777f,0x777f333f,0x999f333f,0x333f777f,0x777f777f,0x333f777f,0x777f333f,0x777f777f,0x999f999f,0x777f333f,0x999f333f,0x333f777f,0x777f333f,0x333f777f,0x777f333f, +0x333f777f,0x999f999f,0x777f333f,0x999f333f,0x333f777f,0x777f333f,0x333f777f,0x777f333f,0x333f333f,0x999f999f,0x777f333f,0x999f333f,0x333f777f,0x777f333f,0x333f777f,0x777f333f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xc00ff00f,0xf50ff00f,0xf50fff0f,0xf50ff50f,0xff0ffa0f,0xff0ff50f,0xfa0fff0f,0xf00ff50f,0xc00ff00f,0xf50ff00f,0xf50fff0f,0xf50ff50f,0xff0ffa0f,0xff0ff50f,0xfa0fff0f,0xf00ff50f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x333f777f,0x777f777f,0x777f333f,0x777f777f, +0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x333f777f,0x777f777f,0x999f333f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f333f,0x333f777f,0x777f777f,0x999f333f,0x777f999f,0x777f777f,0x777f777f,0x777f333f,0x777f333f,0x333f777f,0x777f777f,0x999f333f,0x777f999f,0x777f777f,0x777f777f,0x777f333f,0x777f333f,0x333f777f,0x777f999f,0x999f333f,0x333f999f, +0x999f777f,0x777f777f,0x777f333f,0x777f333f,0x333f777f,0x777f999f,0x999f333f,0x333f999f,0x999f999f,0x777f777f,0x777f333f,0x777f333f,0x333f777f,0x777f999f,0x999f333f,0x333f999f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf00ff00f,0xff0ffa0f,0xf50ff50f,0xf00fc00f,0xf00ff00f,0xfa0fc00f,0xf50ffa0f,0xf00ff50f,0xf00ff00f,0xff0ffa0f,0xf50ff50f,0xf00fc00f,0xf00ff00f,0xfa0fc00f,0xf50ffa0f,0xf00ff50f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f777f,0x333f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x777f333f,0x999f777f,0x333f333f,0x777f999f,0x777f777f, +0x777f777f,0x777f777f,0x333f333f,0x777f333f,0x999f777f,0x333f333f,0x777f999f,0x777f777f,0x777f777f,0x777f777f,0x333f333f,0x777f333f,0x999f777f,0x333f333f,0x777f999f,0x777f777f,0x777f777f,0x777f777f,0x333f333f,0x777f333f,0x999f777f,0x333f333f,0x777f999f,0x777f777f,0x777f777f,0x777f777f,0x333f333f,0x777f333f,0x999f777f,0x333f333f,0x777f999f,0x999f777f, +0x777f777f,0x777f777f,0x333f333f,0x777f333f,0x999f777f,0x333f333f,0x777f999f,0x999f777f,0x777f777f,0x777f777f,0x333f333f,0x777f333f,0x999f777f,0x333f333f,0x777f999f,0x999f777f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf00fc00f,0xf00ff50f,0xf00ff00f,0xc00fc00f,0xf00ff00f,0xf50ff00f,0xf00ff00f,0xf00ffa0f,0xf00fc00f,0xf00ff50f,0xf00ff00f,0xc00fc00f,0xf00ff00f,0xf50ff00f,0xf00ff00f,0xf00ffa0f, +0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f999f,0x333f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f999f,0x333f777f,0x999f999f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f777f,0x333f999f,0x333f777f,0x999f999f,0x777f777f,0x777f777f, +0x777f777f,0x333f777f,0x999f999f,0x333f999f,0x333f777f,0x999f999f,0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x999f999f,0x333f999f,0x333f777f,0x999f999f,0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x999f999f,0x333f999f,0x333f777f,0x333f999f,0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x999f999f,0x333f999f,0x333f777f,0x333f999f,0x777f777f,0x777f777f, +0x777f777f,0x333f777f,0x999f999f,0x333f999f,0x333f777f,0x333f999f,0x777f777f,0x777f777f,0x333f333f,0x333f777f,0x999f999f,0x333f999f,0x333f777f,0x333f999f,0x777f777f,0x777f777f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xc00fc00f,0xf50ff00f,0xf50ffa0f,0xc00fc00f,0xf50ff50f,0xc00ff00f,0xfa0ff00f,0xfa0fff0f,0xc00fc00f,0xf50ff00f,0xf50ffa0f,0xc00fc00f,0xf50ff50f,0xc00ff00f,0xfa0ff00f,0xfa0fff0f, +0x777f777f,0x777f777f,0x777f777f,0x999f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f777f,0x999f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f777f,0x999f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f777f,0x999f333f,0x777f777f,0x777f777f,0x777f777f, +0x777f777f,0x999f777f,0x777f777f,0x999f777f,0x999f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f333f,0x777f777f,0x999f777f,0x999f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f333f,0x777f777f,0x999f777f,0x999f333f,0x999f777f,0x777f777f,0x777f777f,0x777f777f,0x999f333f,0x333f777f,0x999f777f,0x999f333f,0x333f777f,0x777f777f,0x777f777f, +0x777f777f,0x999f333f,0x333f777f,0x999f777f,0x999f333f,0x333f777f,0x777f777f,0x777f777f,0x999f999f,0x999f333f,0x333f777f,0x999f777f,0x999f333f,0x333f777f,0x777f777f,0x333f777f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xc00fc00f,0xfa0ff50f,0xfa0fff0f,0xf00ff00f,0xff0ffa0f,0xc00ff50f,0xf50ff00f,0xf50ff50f,0xc00fc00f,0xfa0ff50f,0xfa0fff0f,0xf00ff00f,0xff0ffa0f,0xc00ff50f,0xf50ff00f,0xf50ff50f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f999f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f999f,0x777f777f,0x777f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f333f,0x777f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x999f333f,0x777f777f,0x777f333f,0x999f777f,0x777f333f,0x777f777f, +0x777f777f,0x777f333f,0x999f333f,0x777f777f,0x777f333f,0x999f777f,0x777f333f,0x777f333f,0x777f777f,0x777f333f,0x999f333f,0x777f777f,0x777f333f,0x999f777f,0x777f333f,0x999f333f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf00ff00f,0xf50ff00f,0xf50ff50f,0xf00ff00f,0xff0ff50f,0xc00ff50f,0xf00fc00f,0xf00ff50f,0xf00ff00f,0xf50ff00f,0xf50ff50f,0xf00ff00f,0xff0ff50f,0xc00ff50f,0xf00fc00f,0xf00ff50f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f999f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x777f777f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f999f,0x333f999f,0x777f777f,0x333f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f999f,0x333f999f,0x777f777f,0x333f333f,0x777f777f,0x777f999f,0x777f777f, +0x777f333f,0x777f999f,0x333f999f,0x777f777f,0x333f333f,0x777f777f,0x333f999f,0x777f999f,0x777f333f,0x777f999f,0x333f999f,0x777f777f,0x333f333f,0x777f777f,0x333f999f,0x777f999f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf50ff00f,0xf00ff50f,0xf00ff00f,0xf00fc00f,0xf50ff50f,0xf00ff50f,0xfa0ff00f,0xf00ff50f,0xf50ff00f,0xf00ff50f,0xf00ff00f,0xf00fc00f,0xf50ff50f,0xf00ff50f,0xfa0ff00f,0xf00ff50f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x777f999f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f333f,0x777f999f,0x777f777f,0x777f777f,0x777f777f, +0x777f777f,0x777f777f,0x333f777f,0x333f333f,0x777f999f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x333f333f,0x777f999f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x333f333f,0x999f999f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x333f333f,0x999f999f,0x333f333f,0x777f777f,0x777f777f, +0x333f999f,0x777f777f,0x333f777f,0x333f333f,0x999f999f,0x333f333f,0x333f777f,0x777f777f,0x333f999f,0x777f777f,0x333f777f,0x333f333f,0x999f999f,0x333f333f,0x333f777f,0x777f777f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xfa0ff00f,0xf50fff0f,0xfa0ff50f,0xf00ff50f,0xf00ff00f,0xf50ff00f,0xff0ffa0f,0xf00ffa0f,0xfa0ff00f,0xf50fff0f,0xfa0ff50f,0xf00ff50f,0xf00ff00f,0xf50ff00f,0xff0ffa0f,0xf00ffa0f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f999f,0x777f777f,0x777f777f,0x777f777f,0x777f777f, +0x777f777f,0x777f777f,0x999f777f,0x999f999f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f333f,0x999f999f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f333f,0x999f999f,0x777f333f,0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x777f777f,0x999f333f,0x999f999f,0x777f333f,0x999f999f,0x777f777f,0x777f777f, +0x333f777f,0x777f777f,0x999f333f,0x999f999f,0x777f333f,0x999f999f,0x999f777f,0x777f777f,0x333f777f,0x777f777f,0x999f333f,0x999f999f,0x777f333f,0x999f999f,0x999f777f,0x333f333f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xff0ff00f,0xf50fff0f,0xff0fff0f,0xf00ffa0f,0xf00fc00f,0xf50ff00f,0xff0fff0f,0xf00ff50f,0xff0ff00f,0xf50fff0f,0xff0fff0f,0xf00ffa0f,0xf00fc00f,0xf50ff00f,0xff0fff0f,0xf00ff50f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f999f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f999f,0x777f777f,0x333f999f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x333f777f,0x777f999f,0x777f777f,0x333f999f,0x333f333f,0x777f777f,0x777f777f,0x999f777f,0x333f333f,0x777f999f,0x777f777f,0x333f999f,0x333f333f,0x777f777f,0x777f777f, +0x999f777f,0x333f333f,0x777f999f,0x777f777f,0x333f999f,0x333f333f,0x777f777f,0x777f777f,0x999f777f,0x333f333f,0x777f999f,0x777f777f,0x333f999f,0x333f333f,0x777f777f,0x999f999f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf50ff00f,0xf50ffa0f,0xf50ff50f,0xf00ff50f,0xf50ff50f,0xf50ff00f,0xf50ffa0f,0xf00ff00f,0xf50ff00f,0xf50ffa0f,0xf50ff50f,0xf00ff50f,0xf50ff50f,0xf50ff00f,0xf50ffa0f,0xf00ff00f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x999f777f,0x777f777f,0x777f777f,0x999f777f,0x999f999f,0x777f777f,0x777f777f,0x777f777f,0x999f999f,0x777f333f,0x777f777f,0x999f333f,0x999f999f,0x777f333f,0x777f777f, +0x777f777f,0x999f333f,0x333f333f,0x777f777f,0x999f333f,0x999f999f,0x333f333f,0x777f777f,0x777f777f,0x999f333f,0x333f333f,0x777f777f,0x999f333f,0x999f999f,0x333f333f,0x777f777f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf00fc00f,0xf00ff50f,0xf00fc00f,0xf50ff00f,0xfa0ffa0f,0xf00ff50f,0xf00ff50f,0xc00ff00f,0xf00fc00f,0xf00ff50f,0xf00fc00f,0xf50ff00f,0xfa0ffa0f,0xf00ff50f,0xf00ff50f,0xc00ff00f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f, +0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f777f,0x777f999f,0x777f777f,0x777f999f,0x777f777f,0x777f999f,0x777f777f, +0x777f777f,0x777f999f,0x999f999f,0x777f777f,0x777f333f,0x777f777f,0x999f999f,0x777f333f,0x777f777f,0x777f333f,0x999f999f,0x777f777f,0x777f333f,0x777f777f,0x999f999f,0x777f333f,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff, +0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ff637f,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xd7ffd7ff,0xf00fc00f,0xf00ff50f,0xf00ff00f,0xc00fc00f,0xf50ffa0f,0xf00ff00f,0xf00ff00f,0xc00fc00f,0xf00fc00f,0xf00ff50f,0xf00ff00f,0xc00fc00f,0xf50ffa0f,0xf00ff00f,0xf00ff00f,0xc00fc00f, +0 }; diff --git a/minecraftcpp-master/handheld/project/data/images/terrain_5551.h b/minecraftcpp-master/handheld/project/data/images/terrain_5551.h new file mode 100644 index 0000000..95e42b0 --- /dev/null +++ b/minecraftcpp-master/handheld/project/data/images/terrain_5551.h @@ -0,0 +1,1052 @@ +/********************************************************** + * PVRTexture Tool v 3.20 + * PVRTC Library v 1.106. 0. 0 Beta + **********************************************************/ + +#ifndef A32BIT + #define A32BIT static const unsigned long +#endif + +A32BIT terrain_5551[] = { + +/* Header */ +0x00000034, /* dwHeaderSize */ +0x00000100, /* dwHeight */ +0x00000100, /* dwWidth */ +0x00000000, /* dwMipMapCount */ +0x00008011, /* dwpfFlags */ +0x00020000, /* dwDataSize */ +0x00000010, /* dwBitCount */ +0x0000f800, /* dwRBitMask */ +0x000007c0, /* dwGBitMask */ +0x0000003e, /* dwBBitMask */ +0x00000001, /* dwAlphaBitMask */ +0x21525650, /* dwPVR */ +0x00000001, /* dwNumSurfs */ + +/* Data */ +0x94a594a5,0x842194a5,0x8c638421,0x8c637bdf,0x94a59ce7,0x84218c63,0x84218c63,0x8c63739d,0x739d7bdf,0x739d739d,0x7bdf739d,0x8c638c63,0x8c636b5b,0x739d7bdf,0x739d739d,0x7bdf739d,0x9353bc17,0x7a8f9353,0xbc177a8f,0x93539353,0x7a8f7a8f,0x7a8f59cb,0xbc177a8f,0xbc177a8f,0x75937593,0x650f7593,0x6d51650f,0x6d515ccd,0x75937dd5,0x650f6d51,0x650d6d4f,0x6d515489, +0x9c13bcd9,0x9c139c13,0xbcd99c13,0xb497bcd9,0xbcd99c13,0xbcd9bcd9,0xbcd9bcd9,0x9c13bcd9,0xc631ce73,0xc631c631,0xce73c631,0xce73ce73,0xce73c631,0xc631ce73,0xc631c631,0xad6bc631,0x84218421,0x84218421,0x84218421,0x94a594a5,0x94a57bdf,0x84218421,0x84218421,0x84218421,0x924d9a4d,0xce739a4d,0x9a4f9a4d,0xa28f920d,0xaa8f9a4d,0xd6b58a0d,0xaa8f9a4d,0x9a4d9a4d, +0xc9c5da07,0xa185b1c5,0xc9c5da07,0xa185b1c5,0xc9c5da07,0xa185b1c5,0xc9c5da07,0xa185b1c5,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0x0000ffff,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0xffff0000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x8c6394a5,0x94a5a529,0x84219ce7,0x84218c63,0xad6b7bdf,0x94a5a529,0x8c638421,0x8c638421,0x7bdf7bdf,0x8c638c63,0x8c638c63,0x8c638c63,0x8c63739d,0x8c638c63,0x7bdf6b5b,0x739d7bdf,0x93537a8f,0x7a8f59cb,0x93537a8f,0x59cb8421,0xbc177a8f,0x7a8f9353,0x93537a8f,0x59cb59cb,0x6d517593,0x85958dd7,0x59cb8595,0x650f6d4f,0x96195ccd,0x759395d9,0x6d51650d,0x6d51650f, +0xbcd9bcd9,0x72cfb497,0xb497b497,0x9c139c13,0x9c139c13,0xb4979c13,0xb4979c13,0x9c13bcd9,0xad6bce73,0xb5adb5ad,0xb5adb5ad,0xb5adb5ad,0xb5ada529,0xb5adb5ad,0xad6b9ce7,0x8421ad6b,0xad6b8421,0xb5adb5ad,0xb5adb5ad,0xb5adb5ad,0xb5ada529,0xb5adb5ad,0xad6b9ce7,0x8421ad6b,0x79cb79cb,0xe739820b,0x79cbb2d1,0x61896989,0x71cb79cb,0xd6b5820b,0x79cb9a4d,0x79cb79cb, +0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0xffff0000,0x00000000,0x00000000,0x00000000,0xffffffff,0x0000ffff,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x4e490000,0x00000000,0x00000000, +0xbdefa529,0x8421b5ad,0x8c638c63,0x94a594a5,0x9ce794a5,0xad6bad6b,0x739d8421,0xb5ad8421,0x6b5b7bdf,0x739d739d,0x739d6b5b,0x739d739d,0x739d8c63,0x7bdf7bdf,0x8c637bdf,0x7bdf7bdf,0x7a8fbc17,0x59cb7a8f,0x7a8fbc17,0x7a8f7a8f,0x7a8fbc17,0x7a8f7a8f,0x59cb59cb,0x7a8fbc17,0x59cb8dd7,0x650f9e5b,0x59cb6d4f,0x59cb7591,0x7dd57593,0x96199619,0x548b59cb,0x59cb650d, +0xbcd9bcd9,0x9c139c13,0x9c139c13,0xb497b497,0xbcd9bcd9,0xb497bcd9,0xbcd972cf,0x9c13bcd9,0x9ce7ce73,0xa529a529,0xa5299ce7,0xa529a529,0xa529b5ad,0xad6bad6b,0xb5adad6b,0x8421ad6b,0x9ce78421,0xa529a529,0xa5299ce7,0xa529a529,0xa529b5ad,0xad6bad6b,0xb5adad6b,0x8421ad6b,0x8a0d79cb,0xd6b56989,0x79cb9a4d,0x718979cb,0x79cb79cb,0xd6b579cb,0x920d820b,0x8a0d79cb, +0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0x8c63da07,0x91455295,0x8c63da07,0x00015295,0x52950001,0x91458c63,0x5295da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x00000000,0xffffffff,0xffffffff,0x00000000,0x0000ffff,0xffff0000,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x00000000,0x4e494e49,0x00000000,0x00000000,0x03014e49,0x00000301,0x00000000, +0x8421739d,0x94a58c63,0x9ce794a5,0x7bdf7bdf,0x84217bdf,0x94a58c63,0x8c638c63,0x7bdf8c63,0x8c637bdf,0x7bdf7bdf,0x6b5b7bdf,0x8c637bdf,0x7bdf7bdf,0x739d739d,0x739d739d,0x7bdf739d,0x6b5b9353,0x7a8fbc17,0x59cb9353,0xbc177a8f,0x93539353,0x93537a8f,0xbc177a8f,0x7a8f9353,0x6b5b59cb,0x59cb59cb,0x59cb7591,0x59cb59cb,0x59cb5ccd,0x59cb6d51,0x59cb7a8f,0x7a8f59cb, +0x6a8d6a8d,0x72cf6a8d,0x72cf72cf,0x72cf72cf,0x72cf72cf,0x6a8d6a8d,0x6a8d6a8d,0x72cf72cf,0xb5adce73,0xad6bad6b,0x9ce7ad6b,0xb5adad6b,0xad6bad6b,0xa529a529,0xa529a529,0x8421a529,0xb5ad8421,0xad6bad6b,0x9ce7ad6b,0xb5adad6b,0xad6bad6b,0xa529a529,0xa529a529,0x8421a529,0xbdefbdef,0xd6b5b5ad,0xb5adb5ad,0xb5adb5ad,0xbdefb5ad,0xdef7b5ad,0xb5adb5ad,0xbdefb5ad, +0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0x9145a985,0x52959145,0x9145a985,0x91455295,0x00015295,0x91459145,0x91455295,0x91459145,0x9145a985,0x91459145,0x9145a985,0x91459145,0x9145a985,0x91459145,0x9145a985,0x91459145,0x00000000,0xffff0000,0x00000000,0xffffffff,0x0000ffff,0x00000000,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x00000000,0x03014e49,0x4e490000,0x03014e49,0x03010000,0x0000930b,0x00000000, +0x8421a529,0x8421ad6b,0xad6bad6b,0xad6b8c63,0x739dbdef,0xa5298421,0x7bdfad6b,0x8c638c63,0x8c637bdf,0x739d8c63,0x739d739d,0x739d739d,0x739d739d,0x8c638c63,0x8c638c63,0x6b5b8c63,0x7a8f9353,0xbc179353,0x935359cb,0x7a8f7a8f,0x59cb9353,0x6b5b7a8f,0x93537a8f,0x7a8f59cb,0x7a8f9353,0xbc179353,0x935359cb,0x7a8f7a8f,0x59cb59cb,0x6b5b59cb,0x93537a8f,0x7a8f59cb, +0x9c13bcd9,0x9c139c13,0xbcd99c13,0x9c13bcd9,0x9c13bcd9,0x72cf9c13,0xb497b497,0xbcd9b497,0xb5adce73,0xa529b5ad,0xa529a529,0xa529a529,0xa529a529,0xb5adb5ad,0xb5adb5ad,0x7bdfb5ad,0xb5ad8421,0xa529b5ad,0xa529a529,0xa529a529,0xa529a529,0xb5adb5ad,0xb5adb5ad,0x7bdfb5ad,0x9a4d8a0d,0x9a4d9a4d,0x924d9a4d,0xd6b59a4d,0xaa8faa8f,0x9a4da24f,0x9a4d9a4d,0xd6b59a4d, +0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xda07da07,0xa985da07,0xda075295,0xa9855295,0xda075295,0x00010001,0xda075295,0xa985da07,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0x00000000,0xffff0000,0x0000ffff,0xffff0000,0xffff0000,0xffff0000,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x4e490000,0x0301930b,0x00000301,0x03010301,0x930b5981,0x0301930b,0x00000000, +0x9ce79ce7,0xa5297bdf,0x94a58421,0x9ce794a5,0x94a58421,0x84218c63,0x8c637bdf,0x94a58c63,0x739d739d,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x6b5b7bdf,0x7bdf7bdf,0x739d739d,0x7bdf6b5b,0x59cb7a8f,0x93539353,0x93537a8f,0x59cb59cb,0x7a8f59cb,0x59cb7a8f,0x7a8f7a8f,0xbc177a8f,0x59cb7a8f,0x93539353,0x93537a8f,0x59cb59cb,0x7a8f59cb,0x59cb7a8f,0x7a8f7a8f,0xbc177a8f, +0x9c139c13,0xb49772cf,0xb497b497,0x9c13bcd9,0xb497b497,0xb497b497,0x9c139c13,0x9c139c13,0xa529c631,0xad6bad6b,0xa529ad6b,0xa529a529,0x9ce7ad6b,0xad6bad6b,0xa529a529,0x84219ce7,0xa5298421,0xad6bad6b,0xa529ad6b,0xa529a529,0x9ce7ad6b,0xad6bad6b,0xa529a529,0x84219ce7,0x79cb9a4d,0x79cb9a4d,0x79cb6189,0xd6b579cb,0x79cb9a4d,0x79cb7189,0x79cb6989,0xd6b579cb, +0xdef7def7,0xce73def7,0xdef7def7,0xdef7def7,0xdef7ce73,0xce73def7,0xdef7ce73,0xce73def7,0x8c63da07,0x91458c63,0x0001da07,0x91450001,0x8c635295,0x52955295,0x8c630001,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x00000000,0x0000ffff,0xffff0000,0xffff0000,0x00000000,0x0000ffff,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x3df90000,0x00003df9,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x03010000,0x03015981,0x00000301,0x930b0301,0x5981930b,0x930b5981,0x00000000, +0x9ce77bdf,0x94a5a529,0x842194a5,0x7bdf8c63,0x84218421,0xad6bb5ad,0xa52994a5,0x8c6394a5,0x8c638c63,0x84217bdf,0x739d7bdf,0x8c638c63,0x7bdf7bdf,0x7bdf7bdf,0x8c638c63,0x6b5b8c63,0x59cbbc17,0x7a8f7a8f,0x7a8f8421,0xbc177a8f,0x7a8fbc17,0xbc17bc17,0x93537a8f,0x93537a8f,0x59cbbc17,0x7a8f7a8f,0x7a8f8421,0xbc177a8f,0x7a8fbc17,0xbc17bc17,0x93537a8f,0x93537a8f, +0xbcd9bcd9,0xb497bcd9,0xbcd9bcd9,0x9c13bcd9,0x9c139c13,0xbcd972cf,0xbcd9bcd9,0xbcd9bcd9,0xb5adce73,0xad6bad6b,0xa529ad6b,0xb5adb5ad,0xad6bad6b,0xad6bad6b,0xb5adb5ad,0x7bdfb5ad,0xb5ad94a5,0xad6bad6b,0xa529ad6b,0xb5adb5ad,0xad6bad6b,0xad6bad6b,0xb5adb5ad,0x7bdfb5ad,0x59499a4d,0x69898a0b,0x618979cb,0xdef779cb,0x6989aa8f,0x71cb820b,0x79cb79cb,0xd6b579cb, +0xdef7ce73,0x00010001,0xce730001,0xce730001,0x0001def7,0x0001ce73,0x00010001,0xce73def7,0x8c63da07,0x52955295,0x8c63da07,0x52950001,0x52950001,0x52950001,0x00015295,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x00000000,0x0000ffff,0x0000ffff,0xffffffff,0xffff0000,0xffff0000,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x33e73df9,0x3cef3d33,0x00003d33,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x00000000,0x59810000,0x5981930b,0x930b930b,0x03015981,0x4e490000,0x00000301, +0x84218c63,0x8c639ce7,0x7bdf94a5,0x8421a529,0xad6b94a5,0x84218421,0xa5298c63,0xad6b7bdf,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x739d739d,0x6b5b739d,0x739d739d,0x739d739d,0x7bdf7bdf,0x7a8fbc17,0xbc17bc17,0x93539353,0x7a8f7a8f,0x59cb9353,0x93539353,0x7a8f7a8f,0x93539353,0x7a8fbc17,0xbc17bc17,0x93539353,0x7a8f7a8f,0x59cb9353,0x93539353,0x7a8f7a8f,0x93539353, +0x72cf72cf,0x6a8d6a8d,0x6a8d6a8d,0x72cf6a8d,0x72cf72cf,0x6a8d6a8d,0x6a8d6a8d,0x72cf72cf,0x8421ad6b,0x84218421,0x84218421,0x84218421,0x7bdf8421,0x84218421,0x84218421,0x84218421,0xad6b8421,0xa529ad6b,0xa529a529,0xa529a529,0x9ce7a529,0xa529a529,0xa529a529,0x8421ad6b,0xb5adb5ad,0xb5adb5ad,0xbdefb5ad,0xd6b5b5ad,0xb5adb5ad,0xb5adb5ad,0xb5adb5ad,0xd6b5b5ad, +0xce73ce73,0x0001ce73,0xce73ce73,0x00010001,0x0001ce73,0xce73ce73,0xce730001,0xce73ce73,0x9145a985,0x91459145,0x00015295,0x00010001,0x00010001,0x91455295,0x0001a985,0x91459145,0x9145a985,0x91459145,0x9145a985,0x91459145,0x9145a985,0x91459145,0x9145a985,0x91459145,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x0000ffff,0x00000000,0x0000ffff,0xffff0000, +0x00000000,0x00000000,0x3d330000,0x3d333d33,0x33e73df9,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x4e490000,0x00000301,0x930b5981,0x4e494e49,0x00000000,0x03014e49,0x00000301, +0x9ce78421,0xad6bb5ad,0x8421ad6b,0x9ce7ad6b,0xad6bb5ad,0x94a58421,0x94a58421,0x7bdf7bdf,0x8c637bdf,0x6b5b8c63,0x739d8c63,0x7bdf7bdf,0x8c637bdf,0x8c638c63,0x8c638c63,0x8c638c63,0x7a8f9353,0x93537a8f,0x93537a8f,0x59cb7a8f,0x93537a8f,0x7a8f9353,0x7a8f7a8f,0x7a8f59cb,0x7a8f9353,0x93537a8f,0x93537a8f,0x59cb7a8f,0x93537a8f,0x7a8f9353,0x7a8f7a8f,0x7a8f59cb, +0xbcd9bcd9,0xbcd9bcd9,0x72cfbcd9,0xbcd99c13,0xb497bcd9,0xb497b497,0xbcd9bcd9,0x9c13bcd9,0xce73ce73,0xc631ce73,0xc631ce73,0xce73ce73,0xce73ce73,0xce73ce73,0xce73ce73,0xb5adce73,0xb5ad8421,0x9ce7b5ad,0xa529b5ad,0xad6bad6b,0xb5adad6b,0xb5adb5ad,0xb5adb5ad,0x94a5b5ad,0x9a4da24f,0xd6b59a4d,0x9a4d9a4d,0xb2d1a28f,0x9a4da24f,0xd6b59a4d,0x9a4d9a4d,0x79cbb2d1, +0xce73ce73,0x0001ce73,0xce73ce73,0xce730001,0x00010001,0xce73ce73,0xce730001,0xce73ce73,0xda07da07,0xa985da07,0xda07da07,0x00010001,0x52950001,0x5295da07,0x00015295,0xa985da07,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0x00000000,0x0000ffff,0x0000ffff,0xffff0000,0xffffffff,0xffffffff,0xffffffff,0xffffffff, +0x00000000,0x00000000,0x00000000,0x3cef3df9,0x33e733e7,0x00003d33,0x00000000,0x00000000,0x00000000,0x00000000,0xce810000,0x0000f7c1,0xb5c1f7c1,0x0000f7c1,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x03010000,0x930b0000,0x930b930b,0x03010301,0x59810301,0x03010000,0x00000000, +0x842194a5,0x8c63b5ad,0x9ce78c63,0x8421ad6b,0x94a58421,0xad6b94a5,0xb5ad8c63,0x84218c63,0x739d7bdf,0x739d739d,0x739d739d,0x7bdf739d,0x7bdf6b5b,0x739d7bdf,0x739d739d,0x7bdf8c63,0x93539353,0x7a8f59cb,0x59cb7a8f,0x7a8f59cb,0x7a8f7a8f,0x7a8f7a8f,0xbc17bc17,0x93537a8f,0x93539353,0x7a8f59cb,0x59cb7a8f,0x7a8f59cb,0x7a8f7a8f,0x7a8f7a8f,0xbc17bc17,0x93537a8f, +0x9c139c13,0x9c139c13,0xbcd99c13,0xb497b497,0x9c139c13,0x72cf9c13,0x9c13bcd9,0x9c139c13,0xa529ce73,0xa529a529,0xa529a529,0xad6ba529,0xad6b9ce7,0xa529ad6b,0xa529a529,0x8421b5ad,0xa5298421,0xa529a529,0xa529a529,0xad6ba529,0xad6b9ce7,0xa529ad6b,0xa529a529,0x8421b5ad,0x79cb79cb,0xce7379cb,0x79cb924d,0x79cb79cb,0x8a0d820b,0xce7379cb,0x8a0b9a4d,0x79cb79cb, +0xad6bce73,0x0001ad6b,0xad6bce73,0xce730001,0x0001ce73,0xce73ce73,0xad6b0001,0xce73ad6b,0x8c63da07,0x52955295,0x00010001,0x00010001,0x00010001,0x91458c63,0x52950001,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x00000000,0x0000ffff,0xffff0000,0xffffffff,0xffff0000,0x00000000,0x0000ffff,0xffff0000, +0x00000000,0x00000000,0x00000000,0x14013d33,0x00001301,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xce81ce81,0x8c81f7c1,0x00000000,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x00000000,0x930b0301,0x930b5981,0x0301930b,0x930b930b,0x930b930b,0x00004e49, +0x9ce79ce7,0xa52994a5,0xb5ad8421,0x94a58c63,0x7bdfc631,0x8421a529,0x8c638c63,0x8c638421,0x7bdf7bdf,0x739d8c63,0x8c63739d,0x739d8c63,0x739d6b5b,0x8c638c63,0x7bdf8c63,0x7bdf7bdf,0x93539353,0xbc177a8f,0x7a8fbc17,0x9353bc17,0xbc1759cb,0x7a8fbc17,0x93539353,0x7a8f8421,0x93539353,0xbc177a8f,0x7a8fbc17,0x9353bc17,0xbc1759cb,0x7a8fbc17,0x93539353,0x7a8f8421, +0xb497bcd9,0xb497b497,0xbcd9bcd9,0x9c139c13,0x9c139c13,0xb497b497,0xb497b497,0x9c13b497,0xad6bce73,0xa529b5ad,0xb5ada529,0xa529b5ad,0xa5299ce7,0xb5adb5ad,0xad6bb5ad,0x8421ad6b,0xad6b8421,0xa529b5ad,0xb5ada529,0xa529b5ad,0xa5299ce7,0xb5adb5ad,0xad6bb5ad,0x8421ad6b,0x79cb8a0d,0xdef78a0b,0x79cb9a4d,0x79cb5949,0x820b6989,0xd6b579cb,0x79cb9a4d,0x79cb820b, +0xad6bad6b,0xad6bce73,0xce73ad6b,0xad6bad6b,0xce73ad6b,0xad6bad6b,0xad6bce73,0xad6bad6b,0x8c63da07,0x91458c63,0x0001da07,0x00010001,0x8c630001,0x91455295,0x8c630001,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x00000000,0x0000ffff,0xffff0000,0xffff0000,0x00000000,0x0000ffff,0x0000ffff,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x5a0d0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf7c10000,0xb5c1f7c1,0x8c818c81,0x0000ce81,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x4e490000,0x59810301,0x4e490000,0x59810301,0x4e495981,0x00000301,0x03010301, +0xad6b8421,0xa5298421,0x842194a5,0x8c6394a5,0x94a594a5,0x7bdf8c63,0x7bdf7bdf,0x8c637bdf,0x7bdf6b5b,0x7bdf7bdf,0x7bdf739d,0x7bdf7bdf,0x8c638c63,0x7bdf7bdf,0x8c637bdf,0x6b5b8c63,0x7a8f9353,0x93537a8f,0xbc179353,0x93537a8f,0x93536b5b,0x7a8f9353,0x935359cb,0x59cb7a8f,0x7a8f9353,0x93537a8f,0xbc179353,0x93537a8f,0x93536b5b,0x7a8f9353,0x935359cb,0x59cb7a8f, +0x6a8d72cf,0x72cf72cf,0x6a8d6a8d,0x72cf6a8d,0x72cf72cf,0x72cf72cf,0x6a8d6a8d,0x72cf6a8d,0xad6bc631,0xad6bad6b,0xad6ba529,0xad6bad6b,0xb5adb5ad,0xad6bad6b,0xb5adad6b,0x7bdfb5ad,0xad6b7bdf,0xad6bad6b,0xad6ba529,0xad6bad6b,0xb5adb5ad,0xad6bad6b,0xb5adad6b,0x7bdfb5ad,0xb5adb5ad,0xd6b5ad6b,0xb5adb5ad,0xb5adb5ad,0xb5adb5ad,0xdef7b5ad,0xbdefb5ad,0xb5adb5ad, +0xa185b1c5,0x79038945,0xa185b1c5,0x79038945,0xa185b1c5,0x79038945,0xa185b1c5,0x79038945,0x9145a985,0x91459145,0x91450001,0x91450001,0x52950001,0x00019145,0x91455295,0x91459145,0x9145a985,0x91459145,0x9145a985,0x91459145,0x9145a985,0x91459145,0x9145a985,0x91459145,0x00000000,0xffff0000,0xffffffff,0xffff0000,0xffff0000,0xffffffff,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x14015a0d,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x14010000,0x00001401,0x00000000,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x03014e49,0x03010301,0x03010000,0x930b0301,0x00005981,0x00000000,0x03010000, +0x94a5bdef,0x8c638421,0x94a59ce7,0x7bdf8421,0x94a56319,0x7bdf8c63,0xa5299ce7,0x84217bdf,0x739d7bdf,0x739d739d,0x739d739d,0x739d739d,0x8c638c63,0x739d739d,0x739d739d,0x7bdf739d,0x59cb7a8f,0x7a8f9353,0x93539353,0x7a8fbc17,0x7a8f7a8f,0x7a8f7a8f,0x7a8f7a8f,0xbc17bc17,0x59cb7a8f,0x7a8f9353,0x93539353,0x7a8fbc17,0x7a8f7a8f,0x7a8f7a8f,0x7a8f7a8f,0xbc17bc17, +0xbcd9bcd9,0xbcd9bcd9,0x9c13bcd9,0x9c13bcd9,0x9c139c13,0x9c139c13,0x72cfb497,0xbcd9bcd9,0xa529ce73,0xa529a529,0xa529a529,0xa529a529,0xb5adb5ad,0xa529a529,0xa529a529,0x8421a529,0xa5298421,0xa529a529,0xa529a529,0xa529a529,0xb5adb5ad,0xa529a529,0xa529a529,0x8421a529,0xa24f9a4f,0x9a4daa8f,0x9a4d9a4d,0xce73924d,0xb2d1924d,0x9a4d9a4d,0x9a4d9a4d,0xe7399a4f, +0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xda07da07,0x5295da07,0xda07da07,0xa9855295,0x00015295,0x52950001,0xda075295,0xa985da07,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0xda07da07,0xa985da07,0x00000000,0xffff0000,0x0000ffff,0xffffffff,0x0000ffff,0x00000000,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x13010000,0x00001401,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x14010000,0x14011301,0x00001301,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x03010301,0x03010000,0x59810000,0x4e49930b,0x00004e49,0x00000000,0x00000000, +0xad6bb5ad,0x739d739d,0x84217bdf,0xc6318421,0xc631a529,0x9ce7ad6b,0x8c63a529,0xad6bad6b,0x8c637bdf,0x8c63739d,0x7bdf6b5b,0x739d7bdf,0x739d739d,0x739d6b5b,0x7bdf7bdf,0x8c638c63,0x93537a8f,0x7a8f7a8f,0x7a8f72d1,0x93539353,0x59cb7a8f,0x59cbbc17,0xbc177a8f,0x93539353,0x93537a8f,0x7a8f7a8f,0x7a8f59cb,0x93539353,0x59cb7a8f,0x59cbbc17,0xbc177a8f,0x93539353, +0x9c13b497,0xbcd972cf,0xbcd9bcd9,0x9c13bcd9,0xb497bcd9,0x9c13b497,0x9c139c13,0xb4979c13,0xb5adce73,0xb5ada529,0xad6b9ce7,0xa529ad6b,0xa529a529,0xa5299ce7,0xad6bad6b,0x94a5b5ad,0xb5ad8421,0xb5ada529,0xad6b9ce7,0xa529ad6b,0xa529a529,0xa5299ce7,0xad6bad6b,0x94a5b5ad,0x79cb9a4d,0x79cb79cb,0x79cb79cb,0xce736189,0x79cb9a4d,0x79cb79cb,0x79cb79cb,0xd6b581cb, +0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0x8c63da07,0x91455295,0x8c63da07,0x91458c63,0x5295da07,0x91458c63,0x5295da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x00000000,0x0000ffff,0xffff0000,0x0000ffff,0x00000000,0xffffffff,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x5a0d1401,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x13010000,0x14011401,0x13011301,0x00000000,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x00000000,0x00000000,0x930b0000,0x5981930b,0x00000301,0x00000000,0x00000000, +0xa529a529,0x7bdf8c63,0xad6bb5ad,0x94a594a5,0x94a57bdf,0x842194a5,0x9ce7ad6b,0xa5298c63,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x739d739d,0x7bdf7bdf,0x8c638c63,0x739d7bdf,0x7bdf739d,0x7a8f9353,0xbc1759cb,0x59cb7a8f,0x59cb7a8f,0x7a8f7a8f,0x59cb7a8f,0x7a8f7a8f,0x93539353,0x7a8f9353,0xbc1759cb,0x59cb7a8f,0x59cb7a8f,0x7a8f7a8f,0x59cb7a8f,0x7a8f7a8f,0x93539353, +0xbcd9bcd9,0x9c139c13,0xbcd99c13,0x9c13bcd9,0xbcd9bcd9,0xb4979c13,0xbcd9bcd9,0xbcd9bcd9,0xad6bce73,0xa529ad6b,0xa529a529,0xa529a529,0xad6bad6b,0xb5adb5ad,0xa529ad6b,0x8421a529,0xad6b8421,0xa529ad6b,0xa529a529,0xa529a529,0xad6bad6b,0xb5adb5ad,0xa529ad6b,0x8421a529,0x51479a4d,0x79cb820b,0x79cb79cb,0xd6b579cb,0x79cb9a4d,0x79cb79cb,0x79cb820b,0xd6b581cb, +0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0xc1c5da07,0x9145a985,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0x8c63da07,0x91458c63,0xffff0000,0x00000000,0x00000000,0xffffffff,0xffffffff,0x00000000,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x5a0d0000,0x00001301,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x14011301,0x00001301,0x00000000,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x00000000,0x00000000,0x930b0000,0x5981930b,0x00000000,0x00000000,0x00000000, +0x94a58421,0x739d8c63,0x9ce7a529,0xbdef94a5,0xbdef8c63,0x84217bdf,0x94a58421,0x9ce78c63,0x739d739d,0x739d739d,0x8c636b5b,0x7bdf8c63,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x7bdf7bdf,0x7a8f9353,0x9353bc17,0x7a8f9353,0x93538421,0x93539353,0x7a8f7a8f,0x93539353,0x59cb7a8f,0x7a8f9353,0x9353bc17,0x7a8f9353,0x93538421,0x93539353,0x7a8f7a8f,0x93539353,0x59cb7a8f, +0x72cf72cf,0x7b0f72cf,0x6a8d6a8d,0x6a8d7b0f,0x72cf72cf,0x6a8d72cf,0x6a8d49c9,0x72cf6a8d,0x8421a529,0x84218421,0x94a57bdf,0x842194a5,0x84218421,0x84218421,0x84218421,0x84218421,0x84218421,0x84218421,0x94a57bdf,0x842194a5,0x84218421,0x84218421,0x84218421,0x84218421,0xb5adb5ad,0xb5adad6b,0xb5adb5ad,0xd6b5b5ad,0xb5adbdef,0xb5adb5ad,0xb5adbdef,0xce73b5ad, +0xb185c1c5,0x9145a185,0xb185c1c5,0x9145a185,0xb185c1c5,0x9145a185,0xb185c1c5,0x9145a185,0x9145a985,0x91459145,0x9145a985,0x91459145,0x9145a985,0x91459145,0x9145a985,0x91459145,0x9145a985,0x91459145,0x9145a985,0x91459145,0x9145a985,0x91459145,0x9145a985,0x91459145,0x0000ffff,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0xffff0000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00001301,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x14010000,0x00001301,0x00000000,0x00000000,0x00000000,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x017f017f,0x00000000,0x00000000,0x00000000,0x59810000,0x5981930b,0x00000000,0x00000000,0x00000000, +0xb5adb5ad,0xa529b5ad,0x7bdf94a5,0x5ad76319,0xb5ad5ad7,0xb5adb5ad,0x5ad78421,0x8c63b5ad,0x318d5295,0x318d318d,0x5295318d,0x94a594a5,0x94a50001,0x318d5295,0x318d318d,0x5295318d,0xdea99c97,0xdea7dea7,0xdea7d6a5,0xdea7d665,0xdea9e6e9,0xd6a7dea7,0xd665d665,0xdea7ce23,0xbdef5a93,0x9c216ad9,0x94239c21,0x6ad99c23,0x6ad97bdf,0x9c639c63,0xa4e58c1f,0x9c21735b, +0x6a8d41c9,0x9bd36a8d,0x6acd3987,0x41899391,0x6a8d628d,0x7b0f628d,0x7b0f6acd,0x9bd36a8d,0x6a8d6a8d,0x6a8d3947,0x628d6a8d,0x39473947,0x6a8d3947,0x39476a8d,0x6a8d6acf,0x6acd6a8d,0xa529ad6b,0xbdefad6b,0xd6b5c631,0xd6b5d6b5,0xd6b5d6b5,0xdef7d6b5,0xdef7def7,0xe739def7,0xc407c449,0xd509cc87,0xe64fddcb,0xee4fee8f,0xee0fee4d,0xee91ee91,0xeed3eed3,0xff17f6d5, +0x041d041d,0x04e3045f,0x05ed0569,0x05ed062f,0x05ed05ed,0x062f062f,0x1e710e71,0x46b51e71,0x31492907,0x31493149,0x31893149,0x31893189,0x31893149,0x31893189,0x31893189,0x29073189,0x41cb41cd,0x41cb41cb,0x41cd41cb,0x41cd41cd,0x41cd41cb,0x41cd41cd,0x41cd41cd,0x314941cd,0x41cb41cd,0x41cb41cb,0x41cd41cb,0x41cd41cd,0x41cd41cb,0x41cd41cd,0x41cd41cd,0x314941cd, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xb5adb5ad,0x7bdf6b5b,0x5ad7294b,0xb5adb5ad,0x7bdf5ad7,0x7bdf8c63,0x39cf94a5,0x9ce76b5b,0x52955295,0x94a594a5,0x94a594a5,0x94a594a5,0x94a5318d,0x94a594a5,0x52950001,0x318d5295,0xdea7dea9,0xe6ede6ab,0xd665bda3,0xd665d665,0xe6ebc5e1,0xdea7fff7,0xdea7d665,0xef2bd6a7,0x9c218bdd,0xbd6b9c21,0xa4e98be1,0x6ad99ca7,0xb56bb56b,0x94636b17,0xa4e55253,0x9c63835d, +0x628b3987,0x39476acf,0x9bd33987,0x628d4189,0x39879bd3,0x9bd36a8d,0x7b0f49c9,0x939149c9,0xb4976a8d,0xb497b455,0xb497b497,0xb497b497,0xb455ac55,0xb497b497,0xbc99bc97,0x624bb497,0xef7bd6b5,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xd6b5ef7b,0xff59e651,0xff57ff57,0xff97ff97,0xff97ff95,0xff97ff97,0xff95ff97,0xff95ff95,0xee4fff93, +0x66f705ed,0x6f3766f7,0x87398739,0x87398739,0x7f377f37,0x87398739,0x7f377f37,0x05ed7737,0x830b3189,0x9309930b,0x930b930b,0x7ac97ac9,0x7ac97ac9,0x930b7ac9,0x930b7ac9,0x3149830b,0xabcb41cd,0xa347a389,0xa389a389,0x8b478b47,0x8b478b47,0xa3898b47,0xa3898b47,0x2907abcb,0xabcb41cd,0xa347a389,0xa389a389,0x8b478b47,0x8b478b47,0xa3898b47,0xa3898b47,0x2907abcb, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x7bdf5ad7,0x294b7bdf,0xb5ad5ad7,0x8421b5ad,0x2109318d,0x7bdf8c63,0x5ad739cf,0x84215ad7,0x00015295,0x318d318d,0x318d0001,0x318d318d,0x318d94a5,0x52955295,0x94a55295,0x52955295,0xef2de6ab,0xd667ff71,0xd6a7dea7,0xdea7dea7,0xe6e9dea7,0xeeede6eb,0xce65c623,0xff71d665,0x731b8b9b,0xb5296ad9,0x8c21b529,0x83dfbdad,0x52516ad9,0xc5ef6b5b,0x839bc5ef,0x6ad96ad9, +0x5a4b3947,0x4189624b,0x9bd36a8d,0x628d3987,0x39479bd3,0x7b0f628d,0x7b0f49c9,0x9bd349c9,0xb4973947,0x9c139c13,0x93d19c13,0x9c139c13,0x9c13a455,0x9c139c13,0xa4159c13,0x6a8db497,0xef7bd6b5,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xd6b5e739,0xffd9ee91,0xffd5ffd7,0xffd5ffd5,0xffd5ffd5,0xffd7ffd7,0xffd3ffd5,0xff91ff93,0xee4bff8f, +0x8f39062f,0x8f398f39,0x8f399779,0x8f398f39,0x87398739,0x87398f39,0x6ef77f37,0x05ed5ef5,0x934b3189,0x8b478b47,0x8b478b47,0xa389a389,0xabcbabcb,0xa389abcb,0xabcba347,0x3149934b,0xabcb41cd,0x8b478b47,0x8b478b47,0xa389a389,0xabcbabcb,0xa389abcb,0xabcba347,0x2907abcb,0xabcb41cd,0x8b478b47,0x8b478b47,0x82c7a389,0xabcb8b09,0xa389abcb,0xabcba347,0x2907abcb, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x0000fb41,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb410000, +0x4a53739d,0x5ad7318d,0x6319bdef,0x7bdf94a5,0x5ad739cf,0x39cf39cf,0xad6b5ad7,0x5ad7b5ad,0x94a55295,0x52955295,0x00015295,0x94a55295,0x52955295,0x318d318d,0x318d318d,0x5295318d,0xd667ce23,0xdea9dea7,0xdee9d665,0xce65d665,0xd665d665,0xe6e9dea7,0xdea7dea7,0xbde1dea7,0x7bdf8c21,0xb52bbdef,0x9c219c61,0x6ad983df,0x8c638c63,0x735b9ca3,0x735b735b,0xa4a5b529, +0x41c96acd,0x4189624b,0x7b0f7b0f,0x6a8d3987,0x39479bd3,0x9bd36a8d,0x9bd33987,0x7b0f4189,0xb4976a8d,0xb497a455,0xbcd9bcd9,0xbcd9bcd9,0xbc97bcd9,0xbc97bcd9,0x9c13bcd9,0x3947b497,0xef7bd6b5,0xef7bef7b,0xef7bef7b,0xf7bdf7bd,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xd6b5ef7b,0xffd5ee91,0xffd5ffd5,0xffd5ffd5,0xffd5ffd5,0xffd7ffd7,0xffd3ffd3,0xffd1ff91,0xee4dffd1, +0x9779062f,0x8f399779,0x97798f39,0x97799f79,0x87399779,0x87398739,0x7f377f37,0x05ed7f37,0x8b093149,0xa347a349,0xa347a347,0xa347a347,0xa347a347,0xa349a349,0xa349a349,0x31499309,0xa34941cd,0xa347a349,0xa347a347,0xa347a347,0xa347a347,0xa349a349,0xa349a349,0x2907a347,0xa34941cd,0xa347a349,0xa347a347,0xce738ac7,0x8ac7a529,0xa349a349,0xa349a349,0x2907a347, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x0000fb41,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb410000, +0xb5adb5ad,0x5ad75ad7,0x8421b5ad,0x39cf8421,0xa5295ad7,0x9ce79ce7,0x7bdf5295,0x5ad7ad6b,0x94a55295,0x318d94a5,0x318d318d,0x318d318d,0x318d318d,0x94a594a5,0x94a594a5,0x000194a5,0xd665e6e9,0xd665eeed,0xeeedeeed,0xeeede6eb,0xce25e6eb,0xe6ebd665,0xc5e1d667,0xce23dee9,0xa4e56ad9,0x52515251,0x5a959ca5,0x6ad9739d,0x735994a7,0xad2962d5,0x8c219c63,0x9461a529, +0x41896a8d,0x628d6a8d,0x7b0f7b0f,0x628d6a8d,0x41896acf,0x9bd36a8d,0x9bd33987,0x7b0f3947,0xb45749c9,0xbcd99c13,0xbc97b497,0xb497b497,0xb497b497,0xbc97b497,0x9c13bcd9,0x6a8db497,0xf7bdd6b5,0xef7bef7b,0xf7bdef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xd6b5ef7b,0xffd5ee91,0xffd5ffd5,0xffd3ffd3,0xffd5ffd3,0xffd7ffd5,0xff91ffd3,0xff91ff91,0xee8fff91, +0x9779062f,0x97798f39,0x97798739,0x97799779,0x97799779,0x7f378739,0x77377f37,0x062f7737,0x7ac93189,0x8b478b47,0xabcb8b47,0x8b47abcb,0x8b47abcb,0xa3478b47,0xa389a389,0x3189930b,0x7ac941cd,0x7ac97ac9,0x934b7ac9,0x7ac9934b,0x7ac9934b,0x93097ac9,0x930b930b,0x2907930b,0x7ac941cd,0x7ac97ac9,0x934b7ac9,0xc6317ac9,0x51c58421,0x93097ac9,0x930b930b,0x2907930b, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x0000fb41,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb410000, +0x8421739d,0x5ad77bdf,0x8c637bdf,0x318d7bdf,0xc631ad6b,0x8c637bdf,0x5ad76319,0x39cf294b,0x318d318d,0x52955295,0x318d5295,0x318d318d,0x00015295,0x52955295,0x318d318d,0x52950001,0xdee9ce23,0xfffdce65,0xef2bd665,0xdea9dea9,0xf76dd6a7,0xc5e1dea7,0xd665ce65,0xc5e1dea7,0xbdad9ca5,0xa4e77b5d,0xad2b7be1,0x4a118b9d,0x73174a53,0xbdad8bdf,0x5a95c5f1,0x4a116b59, +0x5a4b6a8d,0x628d6a8d,0x6a8d9bd3,0x6a8d628d,0x39876a8d,0x8b516a8d,0x7b0f3987,0x628d4189,0xb4973947,0xbcd99c13,0x9c13b497,0xa455a455,0x9c139c13,0xb4979c13,0x9c13bc97,0x6a8db497,0xf7bdd6b5,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xd6b5ef7b,0xffd7ee91,0xff91ffd5,0xffd3ff91,0xffd3ffd3,0xffd5ffd5,0xffd3ffd3,0xffd3ffd3,0xee8fffd3, +0x9f79062f,0x6ef79779,0x87396ef7,0x87398739,0x87398739,0x87398739,0x7f378739,0x062f7f37,0x7ac93149,0xa389a347,0xa389a389,0x8b47abcb,0xa389a389,0xa389a389,0x8b478b47,0x31497ac9,0x314941cb,0x31893149,0x31893189,0x31493189,0x31893189,0x31893189,0x31493149,0x18c53149,0x314941cb,0x31893149,0x31893189,0xa5292907,0x2907739d,0x31893189,0x31493149,0x18c53149, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x0000fb41,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf8010000, +0x7bdf7bdf,0x5ad77bdf,0x39cf6b5b,0x631939cf,0x8c636319,0x7bdfa529,0x7bdf739d,0x52957bdf,0x94a594a5,0x63195295,0x318d5295,0x94a594a5,0x52955295,0x52955295,0x94a594a5,0x000194a5,0xdeabbd9f,0xdea7cde5,0xe6e9bde1,0xd665dea7,0xd6a7d667,0xffb3eeed,0xe6ebdea7,0xde69dea9,0xaca5a4e7,0x94637bdf,0xa4a79c63,0xb52983e1,0x735b9ca3,0x4a118bdf,0x8c234a11,0x6ad98c23, +0x7b0f6a8d,0x6a8d49c9,0x624b9393,0x39476a8d,0x39479391,0x5a0b7b0f,0x7b0f3145,0x6acf3987,0xb4973947,0xbc999c13,0x9c13b497,0xbc99bc99,0xbcd9bcd9,0xb4979c13,0x9c13bc97,0x3947b497,0xef7bd6b5,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xd6b5ef7b,0xffd7e691,0xffd3ffd5,0xff91ffd3,0xffd3ffd3,0xffd3ffd3,0xffd3ffd3,0xffd1ffd3,0xee4dff91, +0x9779062f,0x87398739,0x77378739,0x87398739,0x87398739,0x87398739,0x7f378739,0x062d6f37,0x934b3189,0xa389abcb,0xabcbabcb,0x8b47abcb,0x8b478b47,0xabcba347,0xabcbabcb,0x3189934b,0x72cd41cd,0x728b72cd,0x72cd72cd,0x6a8b72cd,0x6a8b6a8b,0x72cd728b,0x72cd72cd,0x290772cd,0x72cd41cd,0x728b72cd,0x72cd72cd,0x94a56249,0x4187739d,0x72cd728b,0x72cd72cd,0x290772cd, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x0000fb41,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf801fb41, +0x7bdf7bdf,0x5295318d,0xb5adad6b,0x52955ad7,0x4a535ad7,0x8c63318d,0x39cf7bdf,0xc6316319,0x52955295,0x318d5295,0x318d318d,0x318d318d,0x0001318d,0x318d318d,0x318d318d,0x52955295,0xd6a7dea7,0xdea7e6eb,0xd665dea7,0xffafe6eb,0xd627dea9,0xd665d6a7,0xe6abdee9,0xe6ebd665,0x6ad96ad9,0xbdadbdad,0x8c63ad29,0x4a519c63,0xa4616ad9,0x6ad98c21,0x6b5b83df,0x735d7be1, +0x9bd36a8d,0x6a8d3987,0x39879bd3,0x41899bd3,0x39479bd3,0x49c97b0f,0x7b0f628d,0x6acf3987,0xb4973947,0xcd1b9c13,0x9c13b497,0xb497bcd9,0xbc99b497,0xac55a413,0x9c13bcd9,0x72cfb497,0xf7bdd6b5,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xd6b5e739,0xffd9ee8f,0xffd3ffd7,0xff91ff91,0xff91ff91,0xff91ff91,0xffd1ff91,0xff91ffd1,0xee4dff8f, +0x9f79062f,0x87398f39,0x6ef76ef7,0x6ef76ef7,0x6f376ef7,0x7f377737,0x77378739,0x05ed5ef5,0x93093149,0xa349a349,0xa349a349,0xa347a349,0xa347a347,0xa349a349,0xa349a349,0x31499309,0x930941cb,0x8b098b09,0x8b098b09,0x93098b09,0x93099309,0x8b098b09,0x8b098b09,0x290782c9,0x930941cb,0x8b098b09,0x8b098b09,0x62057247,0x72876205,0x8b098b09,0x8b098b09,0x290782c9, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb41f801,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf801fb41, +0x21097bdf,0xbdef5ad7,0x7bdfb5ad,0xb5ad6b5b,0x7bdfad6b,0x4a535ad7,0x210939cf,0xb5adc631,0x94a55295,0x000194a5,0x318d94a5,0x52955295,0x94a55295,0x94a594a5,0x94a594a5,0x94a594a5,0xdeabe6e9,0xe6ebef2d,0xd665e6ab,0xdeabeeed,0xfff5f72f,0xdea7c5e1,0xde69d667,0xdea7d665,0x52956b5b,0x52515251,0x94219461,0x83dfad27,0x62d79ce7,0x94236ad9,0x6ad9b569,0x5b199c63, +0x9bd36a8d,0x72cf3987,0x41899391,0x41896a8d,0x41896a8d,0x39479391,0x6a8d6a8d,0x7b0f3987,0xb4976a8d,0xbcd9ac97,0x9c13b497,0xb497bc99,0xbcd9b497,0xb4979c13,0x9c13bcd9,0x6a8dbc97,0xf7bdd6b5,0xef7bf7bd,0xef7bf7bd,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xe739ef7b,0xce73e739,0xffd9ee91,0xffd3ffd9,0xff91ffdb,0xff91ff91,0xff91ff91,0xff91ff91,0xff4fff91,0xee4bf74d, +0x9779062f,0x8739a77b,0x6ef7a77b,0x6ef76ef7,0x6ef76ef7,0x6ef76ef7,0x56f56ef7,0x05ed3eb3,0x934b3189,0xabcbabcb,0xa347abcb,0xabcb8b47,0xa389abcb,0xa389a389,0xabcbabcb,0x3149934b,0xabcb41cd,0xabcbabcb,0xa347abcb,0xabcb8b47,0xa389abcb,0xa389a389,0xabcbabcb,0x2907934b,0xabcb41cd,0xabcbabcb,0xa347abcb,0xabcb8b47,0xa389abcb,0xa389a389,0xabcbabcb,0x2907934b, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb41f801,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf801fb41, +0x5ad78c63,0xb5adb5ad,0x39cf8c63,0x6b5bb5ad,0x94a5bdef,0x5ad794a5,0xc6315ad7,0x7bdf7bdf,0x318d5295,0x318d318d,0x318d318d,0x5295318d,0x52950001,0x318d5295,0x318d318d,0x529594a5,0xb55dc5e1,0xdea7e6eb,0xdea9dea7,0xd665e6eb,0xdea7dea7,0xef6ddea7,0xe6abdea7,0xef2bc5e1,0x6ad99423,0xa529a529,0x6ad983dd,0xc5f1c5f1,0x83df4a11,0x7317bdef,0x9c63839d,0x4a116b5b, +0x9bd36a8d,0x628d41c9,0x93916acd,0x6a8d4189,0x39476a8d,0x41899391,0x93916a8d,0x7b0f4189,0xb4976a8d,0xbcd99c13,0x9bd3b457,0xbcd9bcd9,0xbcd9bcd9,0xb4979c13,0x9c13bcd9,0x6a8db497,0xf7bdd6b5,0xef7bf7bd,0xf7bdf7bd,0xf7bdef7b,0xf7bdf7bd,0xf7bdf7bd,0xef7bf7bd,0xd6b5ef7b,0xffdbee93,0xffd3ffdb,0xffd9ffd9,0xffd7ffd7,0xffd7ffd7,0xffd5ffd7,0xffd5ffd5,0xee4fff93, +0x9779062f,0x8739a77b,0x97799779,0x97799779,0x97799779,0x9f799f79,0x8f399779,0x062d8739,0x7ac93149,0x8b478b47,0xabcb8b47,0xa389a389,0x8b478b47,0xa3478b47,0x8b47abcb,0x31497ac9,0x8b4741cb,0x8b478b47,0xabcb8b47,0xa389a389,0x8b478b47,0xa3478b47,0x8b47abcb,0x29077ac9,0x8b4741cb,0x8b478b47,0xabcb8b47,0xa389a389,0x8b478b47,0xa3478b47,0x8b47abcb,0x29077ac9, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb41f801,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf801fb41, +0xa5295ad7,0x7bdf7bdf,0x318d7bdf,0x94a5b5ad,0x7bdf7bdf,0x39cf8421,0x5ad75ad7,0x84219ce7,0x52955295,0x318d94a5,0x94a5318d,0x318d94a5,0x318d0001,0x94a594a5,0x529594a5,0x52955295,0xe6abdee9,0xe6ebad1b,0xef2dc623,0xde69d6a7,0xf76df72f,0xd665e72b,0xd6a7dea7,0xdea7d6a5,0xb56b6ad9,0x4a11b56b,0x5a51ac63,0x735b6317,0x735b9463,0x94216ad9,0x7b9b83df,0x62d7bdef, +0x7b0f41c9,0x6a8d4189,0x9391628d,0x624b3947,0x5a4b3987,0x41899bd5,0x9bd36a8d,0x93914189,0xb455628d,0xb4979c13,0x9c13b497,0x9c139c13,0x9c139c13,0xbc979c13,0x9c13bcd9,0x6a8db497,0xf7bdd6b5,0xf7bdf7bd,0xf7bdf7bd,0xf7bdf7bd,0xf7bdf7bd,0xf7bdf7bd,0xef7bf7bd,0xce73ef7b,0xffddee93,0xffddffdd,0xffdbffdb,0xffd9ffdb,0xffd9ffd9,0xffd7ffd7,0xff95ffd7,0xee0dff53, +0xa77b062f,0xaf7baf7b,0xa77ba77b,0xa77ba77b,0xa77ba77b,0xa77b9f79,0x87399f79,0x05eb66f7,0x930b3189,0xa389a389,0xabcbabcb,0x8b478b47,0x8b478b47,0xa389a389,0xa389a389,0x3149930b,0xa38941cd,0xa389a389,0xabcbabcb,0x8b478b47,0x8b478b47,0xa389a389,0xa389a389,0x2907930b,0xa38941cd,0xa389a389,0xabcbabcb,0x8b478b47,0x8b478b47,0xa389a389,0xa389a389,0x2907930b, +0x00000000,0x00000000,0x00000000,0xf94bf94b,0xe085f94b,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xccdfccdf,0x9355ccdf,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb41f801,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf801fb41, +0x5ad75ad7,0x7bdfa529,0x39cf6b5b,0x84217bdf,0x7bdf94a5,0x529539cf,0x5ad7ad6b,0x39cf5ad7,0x52950001,0x52955295,0x5295318d,0x52955295,0x94a594a5,0x52955295,0x94a55295,0x000194a5,0xe6ebce25,0xcde5e6e9,0xd667dea9,0xdea7dea7,0xdea7dea9,0xfff1dea7,0xd665d665,0xbd9fd665,0xb56b6ad9,0x6ad5b529,0x8c637317,0x5295739d,0x5253a4e7,0x5253ad2b,0x6ad96ad5,0x94617bdf, +0x7b0f3987,0x628d3987,0x9bd36acf,0x9bd34189,0x5a4b3947,0x39879bd3,0x93936a8d,0x9bd33947,0xb4573947,0xbcd99c13,0xb497b457,0xb457b497,0xb497b497,0xbc97b497,0xa455bcd9,0x628bb497,0xf7bddef7,0xf7bdf7bd,0xf7bdf7bd,0xf7bdf7bd,0xf7bdf7bd,0xef7bf7bd,0xe739e739,0xce73def7,0xffdfee95,0xffddffdf,0xffddffdd,0xffdbffdd,0xffdbffdb,0xff97ffd9,0xff11ff53,0xe5cbfed1, +0xaf7b062f,0xaf7baf7b,0xaf7baf7b,0xa77baf7b,0x9f79a77b,0x87399f79,0x3eb35ef5,0x05a926b3,0x8b093149,0xa347a347,0xa349a349,0xa347a349,0xa347a347,0xa347a347,0xa349a349,0x31498b09,0xa34941cb,0xa347a347,0xa349a349,0xa347a349,0xa347a347,0xa347a347,0xa349a349,0x29078b09,0xa34941cb,0xa347a347,0xa349a349,0xa347a349,0xa347a347,0xa347a347,0xa349a349,0x29078b09, +0x00000000,0x00000000,0xf94b0000,0xe085ffff,0xc0c9e085,0x00009887,0x00000000,0x00000000,0x00000000,0x00000000,0xccdf0000,0x9355ccdf,0x93559355,0x00007291,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf801f801,0x0000fb41,0x00000000,0x00000000,0x00000000,0x00000000,0xfb410000,0xf801f801, +0xb5adb5ad,0x39cf39cf,0x39cf39cf,0x7bdf6319,0x318d4211,0x9ce7b5ad,0x7bdf7bdf,0x5ad75ad7,0x318d5295,0x318d318d,0x318d318d,0x318d318d,0x94a594a5,0x318d318d,0x318d318d,0x5295318d,0xdea9ef2d,0xef2dd665,0xd665dee9,0xbd9fe6e9,0xdea7c5e3,0xd665dea7,0xe6ebe6ab,0xd667d665,0xa4a5b569,0x5a559463,0xb56bb56b,0x83dface9,0x9ce7ad29,0xa52983df,0x5293a4e5,0x8c1f83dd, +0x9bd33947,0x628d3947,0x9bd36a8d,0x6a8d3947,0x628b3987,0x39479393,0x624b6a8d,0x9bd34189,0xb4973947,0xbcd99c13,0xb497bcd9,0xbcd9bc99,0xbcd9bcd9,0xbcd9bcd9,0x9c13bc99,0x3947b497,0xf7bddef7,0xf7bdf7bd,0xf7bdf7bd,0xf7bdf7bd,0xef7bf7bd,0xe739ef7b,0xdef7def7,0xce73def7,0xffddee95,0xffddffdd,0xffddffdd,0xffdbffdb,0xffd9ffdb,0xff53ff95,0xf68ff6cf,0xedcbf68d, +0xaf7b062f,0xa77ba77b,0xaf7ba77b,0xa77baf7b,0x8f399779,0x56f57f37,0x06711e71,0x05a9066f,0x934b3189,0xabcbabcb,0x8b47abcb,0x8b47abcb,0x8b478b47,0x8b478b47,0xa347a389,0x3189934b,0xabcb41cd,0xabcbabcb,0x8b47abcb,0x8b47abcb,0x8b478b47,0x8b478b47,0xa347a389,0x2907934b,0xabcb41cd,0xabcbabcb,0x8b47abcb,0x8b47abcb,0x8b478b47,0x8b478b47,0xa347a389,0x2907934b, +0x00000000,0x00000000,0xe085f94b,0xe085e085,0xce73e085,0x98879887,0x00000000,0x00000000,0x00000000,0x00000000,0x93550000,0x93559355,0x72919355,0x00007291,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb41f801,0x0000f801,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf801fb41, +0x7bdfbdef,0xb5ad739d,0xb5adad6b,0x39cf5ad7,0xce736319,0x7bdfa529,0x7bdf94a5,0x318d8c63,0x94a55295,0x94a5318d,0x52950001,0x318d5295,0x318d318d,0x318d0001,0x52955295,0x94a594a5,0xe6ebfff5,0xb55dce23,0xd665d665,0xf76fd665,0xf76fe6ab,0xdee9e6eb,0xd6a7e6e9,0xd667e6eb,0x9ca3b569,0xb569bdad,0x83dfa4e7,0xad2b94a5,0x83dd8c21,0x94219ca5,0xb4e75a95,0x5a53b5ad, +0x6acd4189,0x6a8d5a4b,0x7b0f6a8d,0x6acf49c9,0x624b6acd,0x3987628d,0x93916a8d,0x39479bd3,0xb4973947,0x9c139bd1,0x9c13a455,0x9c139c13,0xa4139bd3,0xa4559c13,0xa455a455,0x3947b457,0xf7bddef7,0xef7bf7bd,0xf7bdf7bd,0xf7bdf7bd,0xef7bef7b,0xe739e739,0xdef7def7,0xce73def7,0xffd9ee93,0xffd9ffd9,0xffd9ffd9,0xffd9ffd9,0xff97ffd7,0xff0fff11,0xfecffecf,0xedcbfe8d, +0xa77b062f,0x97799779,0xa77ba77b,0x9f79a77b,0x7f378f39,0x2eb346b5,0x0e711e71,0x05a90e71,0x7ac93189,0xabcba347,0xabcbabcb,0x8b47abcb,0xa389abcb,0x8b47a389,0x8b478b47,0x31897ac9,0x8b4741cd,0xabcba347,0xabcbabcb,0x8b47abcb,0xa389abcb,0x8b47a389,0x8b478b47,0x29077ac9,0x8b4741cd,0xabcba347,0xabcbabcb,0x8b47abcb,0xa389abcb,0x8b47a389,0x8b478b47,0x29077ac9, +0x00000000,0x00000000,0xe085ce73,0xce73c0c9,0x9887c0c9,0x94a59887,0x00000000,0x00000000,0x00000000,0x00000000,0x93550000,0x72917291,0x72917291,0x00007291,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb41f801,0x00000000,0x0000f801,0x0000fb41,0x00000000,0xfb410000,0x0000fb41,0xf801f801, +0x8c63739d,0xa5294211,0x7bdf8421,0x5ad77bdf,0x5ad75ad7,0x94a57bdf,0x94a58c63,0x39cf39cf,0x52955295,0x318d5295,0x318d318d,0x318d318d,0x52955295,0x94a594a5,0x318d5295,0x5295318d,0xde69e6ab,0xce65d667,0xd667dea9,0xe6e9dea7,0xdee9b55d,0xd6a7bd9f,0xcde5e6eb,0xe6abce65,0x7b9b9ca3,0x8bdf6b19,0x9ce76ad9,0x525383dd,0xb56bbdef,0xa4e58c1f,0x6ad583dd,0x839d7b59, +0x628d3947,0x41899393,0x7b0f6a8d,0x398749c9,0x6a8d9391,0x39479bd3,0x7b0f628b,0x628d3987,0xb49749c9,0xb497b497,0xb497b497,0xac55ac55,0xb497b497,0xb497ac15,0xb497b497,0x6a8db497,0xf7bdd6b5,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xdef7e739,0xd6b5d6b5,0xc631d6b5,0xffd5ee91,0xff95ffd5,0xffd5ff95,0xff95ff95,0xff95ff95,0xfe8dff11,0xf64bf68d,0xe58bf64b, +0x9779062f,0x7f378f39,0x87398739,0x7f378739,0x6f377f37,0x0e7136b3,0x062f062f,0x0567062d,0x830b3189,0x7ac97ac9,0x934b7ac9,0x7ac9934b,0x934b934b,0x930b7ac9,0x934b934b,0x3189830b,0x934b41cd,0x7ac97ac9,0x934b7ac9,0x7ac9934b,0x934b934b,0x930b7ac9,0x934b934b,0x2907830b,0x934b41cd,0x7ac97ac9,0x934b7ac9,0x7ac9934b,0x934b934b,0x930b7ac9,0x934b934b,0x2907830b, +0x00000000,0x00000000,0xc0c90000,0x98879887,0x98879887,0x00009887,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x6ad50000,0x00004a0f,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb41f801,0xfb41f801,0xfb41f801,0x0000f801,0xf8010000,0xf801fb41,0xfb41f801,0xf801f801, +0x739d7bdf,0x4a53739d,0x294b294b,0x5ad739cf,0x8421ad6b,0x5ad75295,0x4a534211,0x631939cf,0x318d318d,0x318d318d,0x94a50001,0x529594a5,0x52955295,0x318d5295,0x318d318d,0x52955295,0xe6e9d667,0xc5e1d6a7,0xdee9fff5,0xef2dc623,0xf72fdea7,0xd665d665,0xdea7d667,0xc623d6a7,0x94615251,0xa4a54a11,0x6ad99c63,0x94615253,0x52535253,0xa4a14a11,0x6ad9b529,0x9ce7b461, +0x6a8d5a4b,0x39877b0f,0x6a8d624b,0x41896a8d,0x6a8d6a8d,0x3145628d,0x6a8d628d,0x7b0f628b,0x6acf6a8d,0x6a8d3947,0x6a8d6a8d,0x6a8d3947,0x6a8d6a8d,0x6a8d6a8d,0x39473947,0x6a8d3947,0xef7bef7b,0xe739e739,0xdef7def7,0xd6b5def7,0xdef7d6b5,0xd6b5d6b5,0xd6b5d6b5,0xce73d6b5,0xff93ff93,0xff11ff51,0xfecffecf,0xf64df68d,0xfe8ff64d,0xfe4dfe4d,0xfe0dfe4d,0xfdcdfe0d, +0x6ef77f37,0x4ef55ef5,0x1e712eb3,0x062d062f,0x0671062f,0x062f062f,0x062f062f,0x05ed05ed,0x31492907,0x39493149,0x31493149,0x31493949,0x31493149,0x31493149,0x31493149,0x31493149,0x29072907,0x29072907,0x29072907,0x29072907,0x29072907,0x29072907,0x29072107,0x20c52907,0x29072907,0x29072907,0x29072907,0x29072907,0x29072907,0x29072907,0x29072107,0x20c52907, +0x00000000,0x00000000,0x00000000,0x7a110000,0x0000514b,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x6ad50000,0x00004a0f,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf801f801,0xf801f801,0xf801f801,0xf801f801,0xf801f801,0xf801f801,0xf801f801,0xf801f801, +0x739d7bdf,0x739d739d,0x7bdf739d,0x8c638c63,0x8c636b5b,0x739d7bdf,0x739d739d,0x7bdf739d,0x739d7bdf,0x739d739d,0x7bdf739d,0x8c638c63,0x8c636b5b,0x739d7bdf,0x739d739d,0x7bdf739d,0x739d7bdf,0x739d739d,0x7bdf739d,0x8c638c63,0x8c636b5b,0x739d7bdf,0x739d739d,0x7bdf739d,0xbcd9bcd9,0xb497bcd9,0xbcd9bcd9,0x9c13bcd9,0x9c139c13,0xbcd972cf,0xbcd9bcd9,0x9c13bcd9, +0xb5adb5ad,0xa529b5ad,0x7bdf94a5,0x1a072249,0xb5ad5ad7,0xb5adb5ad,0x5ad78421,0x8c63b5ad,0x10871087,0x08451087,0x10870845,0x08450845,0x08431087,0x10870845,0x10851089,0x10870843,0x311341d9,0x09a30003,0x315500a1,0x18893155,0x00051889,0x000309a3,0x18891889,0x18890003,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x41cb41cd,0x41cb41cb,0x41cd41cb,0x41cd41cd,0x41cd41cb,0x41cd41cd,0x41cd41cd,0x290741cd,0x41cb41cd,0x41cb41cb,0x41cd41cb,0x41cd41cd,0x41cd41cb,0x41cd41cd,0x41cd41cd,0x314941cd,0x18831883,0x18830841,0x18831883,0x08410841,0x18830841,0x08411883,0x18831883,0x18831883, +0x318d39cf,0x318d318d,0x294b318d,0x294b294b,0x39cf2109,0x318d39cf,0x2109294b,0x318d318d,0x318d39cf,0x318d318d,0x294b318d,0x294b294b,0x39cf2109,0x318d39cf,0x2109294b,0x318d318d,0x318d39cf,0x318d318d,0x294b318d,0x294b294b,0x39cf2109,0x318d39cf,0x2109294b,0x318d318d,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x7bdf7bdf,0x8c638c63,0x8c638c63,0x8c638c63,0x8c63739d,0x8c638c63,0x7bdf6b5b,0x739d7bdf,0x7bdf7bdf,0x8c638c63,0x8c638c63,0x8c638c63,0x8c63739d,0x8c638c63,0x7bdf6b5b,0x739d7bdf,0x7bdf7bdf,0x8c638c63,0x8c638c63,0x8c638c63,0x8c63739d,0x8c638c63,0x7bdf6b5b,0x739d7bdf,0x2905bcd9,0x20c520c5,0x20c520c5,0x5b837445,0x29052905,0x20c520c5,0x20c520c5,0x9c132905, +0xb5adb5ad,0x7bdf6b5b,0x1a07294b,0x3c4f3c4f,0x7bdf1a07,0x7bdf8c63,0x114594a5,0x9ce76b5b,0x10850845,0x08430843,0x10850843,0x10870847,0x31550843,0x10871087,0x08431087,0x10873995,0x311341d9,0x09e320cd,0x315500a1,0x18893155,0x31551889,0x31133155,0x00053113,0x31553155,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabcb41cd,0xa347a389,0xa389a389,0x8b478b47,0x8b478b47,0xa3898b47,0xa3898b47,0x8b478b47,0x8b478b47,0xa347a389,0xa389a389,0x8b478b47,0x8b478b47,0xa3898b47,0xa3898b47,0x2907abcb,0xb4971883,0x2905b455,0xab91ab91,0xab91ab91,0xab91ab51,0xab91ab91,0xbc992905,0x1883b497, +0x6b5b39cf,0x63195ad7,0x52954211,0x739d739d,0x63194a53,0x63196319,0x42115295,0x318d5295,0x6b5b39cf,0x63195ad7,0x52954211,0x739d739d,0x63194a53,0x63196319,0x42115295,0x318d5295,0x6b5b39cf,0x63195ad7,0x52954211,0x739d739d,0x63194a53,0x63196319,0x42115295,0x318d5295,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x6b5b7bdf,0x739d739d,0x739dff53,0x739d739d,0x739d8c63,0x7bdf7bdf,0xff53ffed,0x7bdf7bdf,0x6b5b7bdf,0x739d739d,0x739dbce1,0x739d739d,0x739d8c63,0x7bdf7bdf,0xbce1dd65,0x7bdf7bdf,0x6b5b7bdf,0x739d739d,0x739d318d,0x739d739d,0x739d8c63,0x7bdf7bdf,0x318d39cf,0x7bdf7bdf,0xb885bcd9,0x29059085,0x2a5f32e3,0x5b837445,0x31453145,0x74453145,0x39475b83,0x9c134187, +0x7bdf1a07,0x11057bdf,0x3c4f1a07,0x2b0bb5ad,0x08c3318d,0x7bdf8c63,0x1a071145,0x84211a07,0x08431087,0x39953955,0x08453995,0x08430845,0x18cb3995,0x08451087,0x39950843,0x108718cb,0x31130003,0x09a309e3,0x20cd20cd,0x18891889,0x18890003,0x20cd20cd,0x31553113,0x09e309e3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabcb41cd,0x8b478b47,0x8b478b47,0xa389a389,0xabcbabcb,0xa389abcb,0xabcba347,0x51c5a389,0xabcb51c5,0x8b478b47,0x8b478b47,0xa389a389,0xabcbabcb,0xa389abcb,0xabcba347,0x2907abcb,0xb4970841,0xa34f20c5,0x9b0fa34f,0xa34fa34f,0xa34fa391,0xa34fa34f,0x2105a34f,0x1883b497, +0x5295294b,0x52957bdf,0x8c636319,0x7bdf8c63,0x52956319,0x7bdf8421,0x7bdf5ad7,0x318d5295,0x5295294b,0x52957bdf,0x8c636319,0x7bdf8c63,0x52956319,0x7bdf8421,0x7bdf5ad7,0x318d5295,0x5295294b,0x52957bdf,0x5ad76319,0x7bdf5ad7,0x52956319,0x7bdf8421,0x7bdf5ad7,0x318d5295,0x0000fb41,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb410000, +0x8c637bdf,0x7bdf7bdf,0x6b5b7bdf,0xffed7bdf,0x7bdffd4b,0x739d739d,0x739d739d,0x7bdf739d,0x8c637bdf,0x7bdf7bdf,0x6b5b7bdf,0xdd657bdf,0x7bdfac5d,0x739d739d,0x739d739d,0x7bdf739d,0x8c637bdf,0x7bdf7bdf,0x6b5b7bdf,0x39cf7bdf,0x7bdf318d,0x739d739d,0x739d739d,0x7bdf739d,0xb5ad6a8d,0x145b8c63,0x2a5f32e3,0x5b837445,0x9085b885,0x74453145,0x145b5b83,0x72cf0b55, +0x19c722c9,0x1a071105,0x2289bdef,0x7bdf94a5,0x1a0739cf,0x39cf1145,0xad6b1a07,0x1a07b5ad,0x08430845,0x20cb18cb,0x10850845,0x41d91085,0x18cb18cb,0x10870845,0x08450843,0x10871087,0x31130003,0x00a109e3,0x00031889,0x311341d9,0x31553155,0x20cd1889,0x18890005,0x00a109e3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa34941cd,0xa347a349,0xa347a347,0xa347a347,0xa347a347,0xa349a349,0xa349a349,0xce738ac7,0x8ac7a529,0xa347a349,0xa347a347,0xa347a347,0xa347a347,0xa349a349,0xa349a349,0x2907a347,0x29051883,0x5189a351,0x51c94947,0x51c951c9,0x49474947,0x518951c9,0xa34f51c9,0x08412905, +0x5295294b,0x6b5b5ad7,0x21096b5b,0x318d318d,0x294b2109,0x42112109,0x8c636b5b,0x294b6b5b,0x5295294b,0x6b5b5ad7,0x63199ce7,0x84218c63,0x6b5b5ad7,0x5ad75ad7,0x8c636b5b,0x294b6b5b,0x5295294b,0xce735ad7,0x5295ce73,0x6b5b5295,0x6b5b6b5b,0xce736b5b,0x8c63ce73,0x294b6b5b,0x0000fb41,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb410000, +0x8c637bdf,0x739d8c63,0x739d739d,0x739d739d,0x739d739d,0x8c638c63,0x8c638c63,0x6b5b8c63,0x8c637bdf,0x739d8c63,0x739d739d,0x739d739d,0x739d739d,0x8c638c63,0x8c638c63,0x6b5b8c63,0x8c637bdf,0x739d8c63,0x739d739d,0x739d739d,0x739d739d,0x8c638c63,0x8c638c63,0x6b5b8c63,0xb885bcd9,0x145b9085,0x2a5f32e3,0x39cf4a53,0x9085b885,0x74453947,0xb5ad5b83,0xbcd98c63, +0xb5adb5ad,0x1a075ad7,0x8421b5ad,0x39cf8421,0x3bcf1a07,0x33cd9ce7,0x7bdf1a07,0x5ad7ad6b,0x08430845,0x108718cb,0x10851085,0x10870845,0x08450843,0x08451087,0x084718cb,0x10871087,0x18890003,0x00a109e3,0x00031889,0x20cd41d9,0x09e328d1,0x20cd09a3,0x18890005,0x00a109a3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x7ac941cd,0x7ac97ac9,0x934b7ac9,0x7ac9934b,0x7ac9934b,0x93097ac9,0x930b930b,0xc6317ac9,0x51c58421,0x7ac97ac9,0x934b7ac9,0x7ac9934b,0x7ac9934b,0x93097ac9,0x930b930b,0x2907930b,0xab911043,0x51c9a34f,0xa2cd9acd,0xab915189,0x4947ab91,0xb3939acd,0xa34f51c9,0x1883ab91, +0x739d39cf,0x4a537bdf,0x0001318d,0x00010001,0x00010001,0x318d0001,0x84215295,0x2109739d,0x739d39cf,0x6b5b7bdf,0x7bdf8c63,0x5ad77bdf,0x8c636b5b,0x94a594a5,0x8421739d,0x2109739d,0x739d39cf,0xb5ad8c63,0xb5adb5ad,0x529539cf,0x84218421,0xb5adce73,0x7bdfb5ad,0x2109739d,0x0000fb41,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb410000, +0x739d739d,0x7bdf7bdf,0xffff7bdf,0x739dffed,0x6b5b7bdf,0xffedffff,0x739d739d,0x7bdf6b5b,0x739d739d,0x7bdf7bdf,0xe62b7bdf,0x739ddd65,0x6b5b7bdf,0xdd65e62b,0x739d739d,0x7bdf6b5b,0x739d739d,0x7bdf7bdf,0x42117bdf,0x739d39cf,0x6b5b7bdf,0x39cf4211,0x739d739d,0x7bdf6b5b,0xb8859c13,0x145b9085,0x2a5f32e3,0x39cf4a53,0xb8854187,0x74459085,0x145b5b83,0x9c130b55, +0x8421739d,0x1a077bdf,0x8c632acb,0x11457bdf,0xc6313c0f,0x2b4b7bdf,0x5ad76319,0x11451105,0x10871087,0x08451085,0x08430843,0x08430843,0x08451087,0x10870843,0x10871087,0x08450845,0x18890003,0x00a109e3,0x41d91889,0x20cd41d9,0x09e320cd,0x20cd00a1,0x31550005,0x00a109a3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x314941cb,0x31893149,0x31893189,0x31493189,0x31893189,0x31893189,0x31493149,0xa5292907,0x2907739d,0x31893149,0x31893189,0x31493189,0x31893189,0x31893189,0x31493149,0x18c53149,0xab910841,0x51c9a34f,0xa34fab91,0x928b4105,0x4987a34f,0x9acd8a8b,0xa34f5189,0x1883ab91, +0x5ad7294b,0x294b7bdf,0x00010001,0x00010001,0x00010001,0x00010001,0x6b5ba529,0x210939cf,0x5ad7294b,0x6b5b7bdf,0x7bdf7bdf,0x5ad77bdf,0x94a594a5,0x84217bdf,0x6b5b7bdf,0x210939cf,0x5ad7294b,0x739d7bdf,0xb5adb5ad,0x6b5b8c63,0xce735295,0x7bdfb5ad,0x6b5b7bdf,0x210939cf,0x0000fb41,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf8010000, +0x8c638c63,0xffff7bdf,0xff53ffed,0xfd4bff53,0x7bdf7bdf,0xfd4bff53,0x8c638c63,0x6b5b8c63,0x8c638c63,0xe62b7bdf,0xbce1dd65,0xac5dbce1,0x7bdf7bdf,0xac5dbce1,0x8c638c63,0x6b5b8c63,0x8c638c63,0x42117bdf,0x318d39cf,0x318d318d,0x7bdf7bdf,0x318d318d,0x8c638c63,0x6b5b8c63,0xb885bcd9,0x145b9085,0x2a5f32e3,0x5b837445,0xb8853947,0x74459085,0x145b5b83,0xbcd90b55, +0x7bdf7bdf,0x1a072b0b,0x11452289,0x224939cf,0x334d2249,0x2b0ba529,0x7bdf739d,0x52952b0b,0x10851087,0x10871087,0x39953995,0x39953995,0x08430845,0x08453995,0x08430843,0x08450843,0x18893155,0x00a109a3,0x10871889,0x108741d9,0x09a31087,0x315500a1,0x20cd3113,0x00a109a3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x72cd41cd,0x728b72cd,0x72cd72cd,0x6a8b72cd,0x6a8b6a8b,0x72cd728b,0x72cd72cd,0x94a56249,0x4187739d,0x728b72cd,0x72cd72cd,0x6a8b72cd,0x6a8b6a8b,0x72cd728b,0x72cd72cd,0x290772cd,0xab910841,0x5189a34f,0x49875189,0x51895189,0x51c94947,0x49474987,0xa34f5189,0x0841ab91, +0x6319318d,0x294b7bdf,0x08430001,0x10850843,0x10851085,0x00011085,0x8421a529,0x21096319,0x6319318d,0x6b5b7bdf,0x5ad7739d,0x7bdf6b5b,0x8421739d,0x7bdf8c63,0x84218421,0x21096319,0x6319318d,0x6b5b7bdf,0x6b5b5ad7,0x52955295,0x6b5b5295,0x6b5b7bdf,0x84215295,0x21096319,0x0000fb41,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf801fb41, +0x7bdf7bdf,0x739d7bdf,0x739d739d,0x739d739d,0x6b5b739d,0x739d739d,0x739d739d,0x7bdf7bdf,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x739d739d,0x6b5b739d,0x739d739d,0x739d739d,0x7bdf7bdf,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x739d739d,0x6b5b739d,0x739d739d,0x739d739d,0x7bdf7bdf,0x72cf72cf,0x6a8d6a8d,0x6a8d6a8d,0x72cf6a8d,0x72cf72cf,0x6a8d6a8d,0x6a8d6a8d,0x72cf72cf, +0x7bdf7bdf,0x1a071105,0xb5ad3c0f,0x19c71a07,0x19c72249,0x8c63318d,0x39cf7bdf,0xc6312249,0x10871087,0x08450843,0x188b1087,0x108918cb,0x08431087,0x084318cb,0x39953113,0x108918cb,0x18890003,0x00a120cd,0x10871889,0x31553155,0x09a31087,0x20cd00a1,0x000320cd,0x188909a3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x930941cb,0x8b098b09,0x8b098b09,0x93098b09,0x93099309,0x8b098b09,0x8b098b09,0x62057247,0x72876205,0x8b098b09,0x8b098b09,0x93098b09,0x93099309,0x8b098b09,0x8b098b09,0x290782c9,0xab910841,0x59c9a34f,0xa34fab91,0xab9151c9,0x5189ab91,0xab51a34f,0xa34f51c9,0x1883ab91, +0x5ad7294b,0x21095ad7,0xb5ad739d,0xad6bad6b,0xa529ad6b,0x6b5ba529,0x5ad7ad6b,0x39cf5295,0x5ad7294b,0x63195ad7,0x8c638c63,0x63196b5b,0x5ad76b5b,0x7bdf5ad7,0x5ad78421,0x39cf5295,0x5ad7294b,0x6b5b6b5b,0x4a53739d,0x84214a53,0x5ad78421,0x4a536b5b,0x5ad76b5b,0x39cf5295,0xfb41f801,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf801fb41, +0xffed7bdf,0x6b5bff53,0x739d8c63,0x7bdf7bdf,0xffedffff,0x8c638c63,0x8c638c63,0x8c638c63,0xdd657bdf,0x6b5bbce1,0x739d8c63,0x7bdf7bdf,0xdd65e62b,0x8c638c63,0x8c638c63,0x8c638c63,0x39cf7bdf,0x6b5b318d,0x739d8c63,0x7bdf7bdf,0x39cf4211,0x8c638c63,0x8c638c63,0x8c638c63,0x9c13bcd9,0x9c139c13,0xbcd99c13,0xb497b497,0x9c139c13,0x72cf9c13,0x9c13bcd9,0x9c139c13, +0x08c37bdf,0xbdef1a07,0x2b0b3c4f,0xb5ad2289,0x2b0bad6b,0x19c72249,0x21091185,0xb5adc631,0x08430845,0x18cb3995,0x10870845,0x18cb20cd,0x08451087,0x08431087,0x18cb188b,0x10870845,0x18890003,0x00a120cd,0x10871889,0x09a309e3,0x09a31087,0x000500a1,0x000309a3,0x188909a3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabcb41cd,0xabcbabcb,0xa347abcb,0xabcb8b47,0xa389abcb,0xa389a389,0xabcbabcb,0xabcb8b47,0xa389abcb,0xabcbabcb,0xa347abcb,0xabcb8b47,0xa389abcb,0xa389a389,0xabcbabcb,0x2907934b,0xab911883,0x51c99acd,0xa34fab91,0xab915189,0x51c9ab91,0xab91a34f,0xa34f51c9,0x1883b393, +0x4211294b,0x84217bdf,0x52955ad7,0x5ad74a53,0x52955ad7,0x4a535295,0x5ad7739d,0x39cf7bdf,0x4211294b,0x8c637bdf,0x7bdf9ce7,0x94a5739d,0x842194a5,0x6b5b7bdf,0x5ad76b5b,0x39cf7bdf,0x4211294b,0x84217bdf,0x52955ad7,0x21098c63,0x63192109,0x6b5b5295,0x5ad7739d,0x39cf7bdf,0xfb41f801,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf801fb41, +0x739d7bdf,0x739d739d,0x739d739d,0xffed739d,0xfd4bfd4b,0x739dfd4b,0x739d739d,0x7bdf8c63,0x739d7bdf,0x739d739d,0x739d739d,0xdd65739d,0xac5dac5d,0x739dac5d,0x739d739d,0x7bdf8c63,0x739d7bdf,0x739d739d,0x739d739d,0x39cf739d,0x318d318d,0x739d318d,0x739d739d,0x7bdf8c63,0x20c59c13,0x20c520c5,0x20c520c5,0x290520c5,0x29052905,0x20c520c5,0x2a5f32e3,0x9c132905, +0x5ad78c63,0xb5adb5ad,0x11452b4b,0x6b5bb5ad,0x338dbdef,0x1a0794a5,0xc6315ad7,0x7bdf7bdf,0x10870845,0x10871087,0x10851087,0x20cb1087,0x08450847,0x00050845,0x084518cb,0x10871087,0x00010003,0x20cd20cd,0x31131889,0x00a109e3,0x09a31087,0x31133155,0x000309a3,0x188909a3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b4741cb,0x8b478b47,0xabcb8b47,0xa389a389,0x8b478b47,0xa3478b47,0x8b47abcb,0xa389a389,0x8b478b47,0x8b478b47,0xabcb8b47,0xa389a389,0x8b478b47,0xa3478b47,0x8b47abcb,0x29077ac9,0xb3931883,0x49478a4b,0x49875189,0x51c951c9,0x51c94947,0x51894987,0xa34f51c9,0x1883ab91, +0x8c634a53,0xc631c631,0xce73c631,0xce73ce73,0xce73c631,0xc631ce73,0xc631c631,0x39cf8c63,0x8c634a53,0xc631c631,0xce73c631,0xce73ce73,0xce73c631,0xc631ce73,0xc631c631,0x39cf8c63,0x8c634a53,0xc631c631,0xce73c631,0x00012109,0x21090001,0xc631ce73,0xc631c631,0x39cf8c63,0xfb41f801,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf801fb41, +0x7bdf7bdf,0x739d8c63,0x8c63ff53,0x739d8c63,0x739d6b5b,0x8c638c63,0x7bdf8c63,0x7bdf7bdf,0x7bdf7bdf,0x739d8c63,0x8c63bce1,0x739d8c63,0x739d6b5b,0x8c638c63,0x7bdf8c63,0x7bdf7bdf,0x7bdf7bdf,0x739d8c63,0x8c63318d,0x739d8c63,0x739d6b5b,0x8c638c63,0x7bdf8c63,0x7bdf7bdf,0x20c5bcd9,0x31453145,0x9085b885,0x39473947,0xacc33145,0x29058bc3,0x2a5f32e3,0x9c133145, +0x3c0f5ad7,0x7bdf7bdf,0x318d7bdf,0x94a5b5ad,0x2b0b7bdf,0x39cf8421,0x5ad72249,0x84219ce7,0x10871085,0x08451087,0x10870845,0x08470847,0x08431087,0x10890845,0x08451087,0x10871087,0x18893113,0x18891889,0x20cd0003,0x00a109a3,0x09a320cd,0x09a309e3,0x000309a3,0x18893155,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa38941cd,0xa389a389,0xabcbabcb,0x8b478b47,0x8b478b47,0xa389a389,0xa389a389,0x8b478b47,0x8b478b47,0xa389a389,0xabcbabcb,0x8b478b47,0x8b478b47,0xa389a389,0xa389a389,0x2907930b,0xab911883,0x4947a34f,0xa34f9acd,0xa34f4987,0x41058a8b,0xb393a34f,0xa34f51c9,0x1883ab91, +0x7bdf4a53,0xb5adb5ad,0x7bdfb5ad,0x42114211,0x421139cf,0xb5ad7bdf,0xad6b9ce7,0x318d7bdf,0x7bdf4a53,0xb5adb5ad,0xb5adb5ad,0xb5adb5ad,0xb5ada529,0xb5adb5ad,0xad6b9ce7,0x318d7bdf,0x7bdf4a53,0xb5adb5ad,0xb5adad6b,0x10852109,0x21091085,0xb5adce73,0xad6b9ce7,0x318d7bdf,0xfb41f801,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf801fb41, +0x7bdf6b5b,0x7bdf7bdf,0x7bdf739d,0x7bdf7bdf,0x8c638c63,0xffed7bdf,0x8c63fd4b,0x6b5b8c63,0x7bdf6b5b,0x7bdf7bdf,0x7bdf739d,0x7bdf7bdf,0x8c638c63,0xdd657bdf,0x8c63ac5d,0x6b5b8c63,0x7bdf6b5b,0x7bdf7bdf,0x7bdf739d,0x7bdf7bdf,0x8c638c63,0x39cf7bdf,0x8c63318d,0x6b5b8c63,0x818372cf,0x61417181,0x9085b885,0x41873145,0xb5ad5b83,0x90858c63,0x2a5f32e3,0x72cf145b, +0x1a071a07,0x7bdf33cd,0x39cf6b5b,0x84217bdf,0x7bdf94a5,0x19c71145,0x1a073c0f,0x39cf1a07,0x08431089,0x10870843,0x08450845,0x08451087,0x39950843,0x10870845,0x41970843,0x108718cb,0x188928d1,0x315520cd,0x20cd0003,0x00a109a3,0x315520cd,0x00a109e3,0x000309a3,0x18893155,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa34941cb,0xa347a347,0xa349a349,0xa347a349,0xa347a347,0xa347a347,0xa349a349,0xa347a349,0xa347a347,0xa347a347,0xa349a349,0xa347a349,0xa347a347,0xa347a347,0xa349a349,0x29078b09,0xab910841,0x51c9a34f,0xb3919acd,0xab915189,0x5189ab91,0xb3939acd,0xa35151c9,0x1883ab91, +0x7bdf4a53,0x7bdfad6b,0x39cf39cf,0x00010001,0x00010001,0x39cf39cf,0xa529739d,0x318d739d,0x7bdf4a53,0xad6bad6b,0x9ce7ad6b,0xb5adad6b,0xad6bad6b,0xa529a529,0xa529a529,0x318d739d,0x7bdf4a53,0xb5adad6b,0xb5adb5ad,0x1085b5ad,0xce731085,0xb5adad6b,0xa529b5ad,0x318d739d,0xf801f801,0x0000fb41,0x00000000,0x00000000,0x00000000,0x00000000,0xfb410000,0xf801f801, +0x739d7bdf,0x739d739d,0x739d739d,0x739d739d,0xffffffed,0xff53ffed,0xfd4bff53,0x7bdf739d,0x739d7bdf,0x739d739d,0x739d739d,0x739d739d,0xe62bdd65,0xbce1dd65,0xac5dbce1,0x7bdf739d,0x739d7bdf,0x739d739d,0x739d739d,0x739d739d,0x421139cf,0x318d39cf,0x318d318d,0x7bdf739d,0x8183bcd9,0x61417181,0x9085b885,0x314532e3,0xb5ad5b83,0x90858c63,0x2a5f32e3,0xbcd9145b, +0xb5adb5ad,0x11451145,0x11451145,0x7bdf2249,0x11451987,0x9ce7b5ad,0x7bdf2b0b,0x1a071a07,0x39951087,0x20cb3955,0x08430845,0x08451047,0x39550843,0x108718cb,0x10851087,0x08450845,0x188920cd,0x00011889,0x00010003,0x20cd09a3,0x311320cd,0x00a109e3,0x31130003,0x28d120cd,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabcb41cd,0xabcbabcb,0x8b47abcb,0x8b47abcb,0x8b478b47,0x8b478b47,0xa347a389,0x8b47abcb,0x8b478b47,0xabcbabcb,0x8b47abcb,0x8b47abcb,0x8b478b47,0x8b478b47,0xa347a389,0x2907934b,0x29050841,0x51c9a34f,0x494751c9,0x51c95189,0x51c951c9,0x51c951c9,0xa34f5189,0x08412905, +0x7bdf4a53,0x39cf7bdf,0x00010001,0x00010001,0x00010001,0x00010001,0xb5ad4211,0x294b7bdf,0x7bdf4a53,0xa529b5ad,0xa529a529,0xa529a529,0xa529a529,0xb5adb5ad,0xb5adb5ad,0x294b7bdf,0x7bdf4a53,0xb5adb5ad,0xad6bb5ad,0xce73b5ad,0xa529ce73,0xb5adb5ad,0xb5adad6b,0x294b7bdf,0xfb41f801,0x0000f801,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf801fb41, +0x8c637bdf,0xffed739d,0x7bdffd4b,0x739d7bdf,0xfd4b739d,0x739dfd4b,0x7bdf7bdf,0x8c638c63,0x8c637bdf,0xdd65739d,0x7bdfac5d,0x739d7bdf,0xac5d739d,0x739dac5d,0x7bdf7bdf,0x8c638c63,0x8c637bdf,0x39cf739d,0x7bdf318d,0x739d7bdf,0x318d739d,0x739d318d,0x7bdf7bdf,0x8c638c63,0x8183b497,0x61417181,0x9085b885,0x5b8332e3,0xacc33145,0x90858bc3,0x2a5f32e3,0xb497145b, +0x7bdfbdef,0xb5ad2289,0xb5ad3c0f,0x39cf1a07,0xce732249,0x7bdfa529,0x7bdf94a5,0x318d8c63,0x10870849,0x18cb18cb,0x00031087,0x108718cb,0x20cd0843,0x18cb18cb,0x10871087,0x10870847,0x00031889,0x31551889,0x31133155,0x20cd20cd,0x31551087,0x00a109e3,0x00033155,0x20cd3155,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b4741cd,0xabcba347,0xabcbabcb,0x8b47abcb,0xa389abcb,0x8b47a389,0x8b478b47,0x8b47abcb,0xa389abcb,0xabcba347,0xabcbabcb,0x8b47abcb,0xa389abcb,0x8b47a389,0x8b478b47,0x29077ac9,0xb4970841,0xa34f20c5,0xa34fa351,0xa34fa34f,0xa34f9b4f,0xa351a34f,0x2105a391,0x0841b457, +0x739d4a53,0x000139cf,0x18c71085,0x18c718c7,0x108518c7,0x108518c7,0xb5ad0001,0x318d739d,0x739d4a53,0xad6bad6b,0xa529ad6b,0xa529a529,0x9ce7ad6b,0xad6bad6b,0xa529a529,0x318d739d,0x739d4a53,0xb5adb5ad,0xb5adb5ad,0xad6bb5ad,0xad6bad6b,0xa529a529,0xad6bb5ad,0x318d739d,0xfb41f801,0x00000000,0x0000f801,0x0000fb41,0x00000000,0xfb410000,0x0000fb41,0xf801f801, +0x7bdf7bdf,0x739d7bdf,0x739d739d,0x739d739d,0x7bdf7bdf,0x8c638c63,0x739d7bdf,0x7bdf739d,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x739d739d,0x7bdf7bdf,0x8c638c63,0x739d7bdf,0x7bdf739d,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x739d739d,0x7bdf7bdf,0x8c638c63,0x739d7bdf,0x7bdf739d,0x8183bcd9,0x61417181,0x9085b885,0x5b8332e3,0xacc34187,0x90858bc3,0x2a5f32e3,0xbcd9145b, +0x8c63739d,0xa5291185,0x7bdf8421,0x1a077bdf,0x1a071a07,0x94a57bdf,0x94a58c63,0x114539cf,0x10851087,0x18cb1087,0x10871087,0x08450845,0x18890843,0x18cb18cb,0x108718cb,0x08450845,0x31130003,0x20cd3155,0x09a309e3,0x311320cd,0x20cd1087,0x28d109e3,0x000320cd,0x18893155,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x934b41cd,0x7ac97ac9,0x934b7ac9,0x7ac9934b,0x934b934b,0x930b7ac9,0x934b934b,0x7ac9934b,0x934b934b,0x7ac97ac9,0x934b7ac9,0x7ac9934b,0x934b934b,0x930b7ac9,0x934b934b,0x2907830b,0xb4971043,0x2905b497,0xb393ab91,0xab51ab51,0xab91ab91,0xab91ab51,0xb4972905,0x1883b497, +0x7bdf4a53,0x108539cf,0x2109294b,0x294b294b,0x294b294b,0x294b294b,0xb5ad1085,0x294b7bdf,0x7bdf4a53,0x7bdf7bdf,0x739d7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x294b7bdf,0x7bdf4a53,0x7bdf7bdf,0x739d7bdf,0x7bdf739d,0x739d7bdf,0x739d739d,0x7bdf7bdf,0x294b7bdf,0xfb41f801,0xfb41f801,0xfb41f801,0x0000f801,0xf8010000,0xf801fb41,0xfb41f801,0xf801f801, +0x739d739d,0x739d739d,0x8c636b5b,0x7bdf8c63,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x7bdf7bdf,0x739d739d,0x739d739d,0x8c636b5b,0x7bdf8c63,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x7bdf7bdf,0x739d739d,0x739d739d,0x8c636b5b,0x7bdf8c63,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x7bdf7bdf,0x72cf72cf,0x7b0f72cf,0x6a8d6a8d,0x6a8d7b0f,0x72cf72cf,0x6a8d72cf,0x6a8d49c9,0x72cf6a8d, +0x739d7bdf,0x19c7739d,0x08c30903,0x1a071145,0x84213c4f,0x22495295,0x19c71987,0x63191145,0x08451087,0x08471087,0x10871087,0x10871087,0x10871087,0x10871085,0x10871087,0x10870845,0x41d941d9,0x20cd0003,0x00a109a3,0x31131889,0x20cd1087,0x20cd09a3,0x31551889,0x18890001,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x29072907,0x29072907,0x29072907,0x29072907,0x29072907,0x29072907,0x29072107,0x29072907,0x29072907,0x29072907,0x29072907,0x29072907,0x29072907,0x29072907,0x29072107,0x20c52907,0x18831883,0x18830841,0x51051883,0x51054905,0x51055105,0x18835105,0x08410841,0x18830841, +0x631939cf,0x294b318d,0x294b294b,0x294b294b,0x2109294b,0x294b294b,0xa529294b,0x318d6319,0x318d39cf,0x318d318d,0x318d318d,0x318d318d,0x294b318d,0x318d318d,0x318d318d,0x318d318d,0x318d39cf,0x294b318d,0x294b294b,0x318d318d,0x318d318d,0x294b294b,0x318d294b,0x318d318d,0xf801f801,0xf801f801,0xf801f801,0xf801f801,0xf801f801,0xf801f801,0xf801f801,0xf801f801, +0xce51d693,0xce51b58b,0xce51ce51,0xce51ce51,0xce51ded5,0xe7135281,0xce51ded5,0xce51ce51,0xffffffff,0x0000ffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xc7bfffff,0x739d7bdf,0x739d739d,0x7bdf739d,0x8c638c63,0x8c636b5b,0x739d7bdf,0x739d739d,0x7bdf739d,0x739d7bdf,0x739d739d,0x7bdf739d,0x8c638c63,0x8c636b5b,0x739d7bdf,0x739d739d,0x7bdf739d, +0x000094a5,0x9ce7ad6b,0x00005ad7,0x00000000,0x00007bdf,0x00000000,0x52950000,0xad6b0000,0x294b94a5,0x9ce7ad6b,0x294b5ad7,0x294b294b,0x294b7bdf,0x294b294b,0x5295294b,0xad6b294b,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x41cb41cd,0x41cb41cb,0x41cd41cb,0x41cd41cd,0x41cd41cb,0x41cd41cd,0x41cd41cd,0x290741cd,0x41cd41cd,0x41cb41cb,0x41cd41cb,0x41cd41cd,0x41cd41cb,0x41cd41cd,0x41cd41cd,0x314941cd,0x9c131883,0x9c139c13,0x29059c13,0x5947b393,0xb3935947,0xbcd92905,0xbcd9bcd9,0x1883bcd9, +0x9c131883,0x9c139c13,0x29059c13,0x5947b393,0xb3935947,0xbcd92905,0xbcd9bcd9,0x1883bcd9,0x318d39cf,0x318d318d,0x294b318d,0x294b294b,0x39cf2109,0x318d39cf,0x2109294b,0x318d318d,0x318d39cf,0x318d318d,0x294b318d,0x294b294b,0x39cf2109,0x318d39cf,0x2109294b,0x318d318d,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x39c1c60f,0xce51e713,0xce51c60f,0x39c139c1,0xd693ce51,0xce51ce51,0xce51ce51,0xce512101,0x0000ffff,0x00000000,0x00000000,0xc7bf0000,0x00000000,0x00000000,0x00000000,0xb6b70000,0x7bdf7bdf,0x8c638c63,0x8c638c63,0x8c638c63,0x8c63739d,0x8c638c63,0x7bdf6b5b,0x739d7bdf,0x7bdf7bdf,0x8c638c63,0x8c638c63,0x8c638c63,0x8c63739d,0x8c638c63,0x7bdf6b5b,0x739d7bdf, +0x00008421,0x9ce7bdef,0x52950000,0x00000000,0x4a535295,0xb5ad0000,0x5295b5ad,0x52950000,0x294b8421,0x9ce7bdef,0x5295294b,0x294b294b,0x4a535295,0xb5ad294b,0x5295b5ad,0x5295294b,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabcb41cd,0xa347a389,0xa389a389,0x8b478b47,0x8b478b47,0xa3898b47,0xa3898b47,0x8b478b47,0x8b478b47,0xa347a389,0xa389a389,0x8b478b47,0x8b478b47,0xa3898b47,0xa3898b47,0x2907abcb,0xbcd91883,0x72cfb497,0xb497b497,0x59472105,0x21055947,0xb4979c13,0xb4979c13,0x1883bcd9, +0xbcd91883,0x72cfb497,0xb497b497,0x59472105,0x21055947,0xb4979c13,0xb4979c13,0x1883bcd9,0x6b5b39cf,0x63195ad7,0x52954211,0x739d739d,0x63194a53,0x63196319,0x42115295,0x318d5295,0x6b5b39cf,0x63195ad7,0x52954211,0x739d739d,0x63194a53,0x63196319,0x42115295,0x318d5295,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce51ce51,0xd693ce51,0xded5ce51,0x63015281,0xce51ded1,0xe717bdcd,0xce5139c1,0xce51ffd9,0x0000ffff,0xffff0000,0x00000000,0x0000c7bf,0x00000000,0x00000000,0x00000000,0x00000000,0x6b5b7bdf,0x739d739d,0x739d767f,0x739d739d,0x739d8c63,0x7bdf7bdf,0x767fc73f,0x7bdf7bdf,0x6b5b7bdf,0x739d739d,0x739d9001,0x739d739d,0x739d8c63,0x7bdf7bdf,0x9001f801,0x7bdf7bdf, +0x00000000,0x00008c63,0xad6b5295,0x0000a529,0xad6b9ce7,0xb5ad5ad7,0x000094a5,0xad6bb5ad,0x294b294b,0x294b8c63,0xad6b5295,0x294ba529,0xad6b9ce7,0xb5ad5ad7,0x294b94a5,0xad6bb5ad,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabcb41cd,0x8b478b47,0x8b478b47,0xa389a389,0xabcbabcb,0xa389abcb,0xabcba347,0xa389a389,0xabcbabcb,0x8b478b47,0x8b478b47,0xa389a389,0xabcbabcb,0xa389abcb,0xabcba347,0x2907abcb,0xbcd91883,0x9c139c13,0x9c137acd,0x2905b497,0xbcd92905,0xb497bcd9,0xbcd972cf,0x1883bcd9, +0xbcd91883,0x9c139c13,0x9c137acd,0x2905b497,0xbcd92905,0xb497bcd9,0xbcd972cf,0x1883bcd9,0x5295294b,0x52957bdf,0x8c636319,0x7bdf8c63,0x52956319,0x7bdf8421,0x7bdf5ad7,0x318d5295,0x5295294b,0x52957bdf,0x8c636319,0x7bdf8c63,0x52956319,0x7bdf8421,0x7bdf5ad7,0x318d5295,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xc60fce51,0x39c1ded5,0xd69339c1,0x39c1e713,0xc60fe713,0x2941c60f,0xce4d6301,0xded5ce51,0x0000ffff,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xb6b7c7bf,0x8c637bdf,0x7bdf7bdf,0x6b5b7bdf,0xc73f7bdf,0x7bdf5f7d,0x739d739d,0x739d739d,0x7bdf739d,0x8c637bdf,0x7bdf7bdf,0x6b5b7bdf,0xf8017bdf,0x7bdf8801,0x739d739d,0x739d739d,0x7bdf739d, +0x00000000,0x00000000,0xad6b0000,0x00008c63,0x9ce7ad6b,0xad6b4a53,0x00008c63,0x9ce7ad6b,0x294b294b,0x294b294b,0xad6b294b,0x294b8c63,0x9ce7ad6b,0xad6b4a53,0x294b8c63,0x9ce7ad6b,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa34941cd,0xa347a349,0xa347a347,0xa347a347,0xa347a347,0xa349a349,0xa349a349,0xa347a347,0xa347a347,0xa347a349,0xa347a347,0xa347a347,0xa347a347,0xa349a349,0xa349a349,0x2907a347,0x6a8d1883,0x49c96a8d,0x72cf49c9,0x188372cf,0x72cf1883,0x6a8d4189,0x6a8d6a8d,0x188372cf, +0x6a8d1883,0x49c96a8d,0x72cf49c9,0x188372cf,0x72cf1883,0x28c34189,0x28c328c3,0x188372cf,0x5295294b,0x6b5b5ad7,0x21096b5b,0x318d318d,0x294b2109,0x42112109,0x8c636b5b,0x294b6b5b,0x5295294b,0x6b5b5ad7,0x63199ce7,0x84218c63,0x6b5b5ad7,0x5ad75ad7,0x8c636b5b,0x294b6b5b,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce51ce51,0x6301ce51,0xce516301,0xc60fa507,0xbdcdce51,0xce51ce51,0xce51e713,0xce51ffdf,0xffffffff,0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0xc7bf0000,0xb6b70000,0x8c637bdf,0x739d8c63,0x739d739d,0x739d739d,0x739d739d,0x8c638c63,0x8c638c63,0x6b5b8c63,0x8c637bdf,0x739d8c63,0x739d739d,0x739d739d,0x739d739d,0x8c638c63,0x8c638c63,0x6b5b8c63, +0xa5290000,0x0000a529,0xa5290000,0x00005295,0x8c639ce7,0x00000000,0x00008c63,0x8c6394a5,0xa529294b,0x294ba529,0xa529294b,0x294b5295,0x8c639ce7,0x294b294b,0x294b8c63,0x8c6394a5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x7ac941cd,0x7ac97ac9,0x934b7ac9,0x7ac9934b,0x7ac9934b,0x93097ac9,0x930b930b,0x7ac9934b,0x7ac9934b,0x7ac97ac9,0x934b7ac9,0x7ac9934b,0x7ac9934b,0x93097ac9,0x930b930b,0x2907930b,0x9c131883,0x7acd9c13,0xbcd99c13,0x2105bcd9,0x9c132905,0x72cf7acd,0xb497b497,0x1883b497, +0x9c131883,0x7acd9c13,0xbcd99c13,0x2105bcd9,0x9c132905,0x28c37acd,0x28c372cf,0x188372cf,0x739d39cf,0x4a537bdf,0x0001318d,0x00010001,0x00010001,0x318d0001,0x84215295,0x2109739d,0x739d39cf,0x6b5b7bdf,0x7bdf8c63,0x5ad77bdf,0x8c636b5b,0x94a594a5,0x8421739d,0x2109739d,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xbdcdce51,0xce51ce51,0xbdcde713,0xd693ce51,0xce512101,0xce51d693,0xded56301,0xce51d693,0x0000ffff,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x0000c7bf,0x00000000,0x739d739d,0x7bdf7bdf,0xffff7bdf,0x739dc73f,0x6b5b7bdf,0xc73fffff,0x739d739d,0x7bdf6b5b,0x739d739d,0x7bdf7bdf,0xf8017bdf,0x739da801,0x6b5b7bdf,0xa801f801,0x739d739d,0x7bdf6b5b, +0xb5ad0000,0x00008421,0x8c634a53,0x00005ad7,0x9ce75295,0x52950000,0x5ad70000,0x84210000,0xb5ad294b,0x294b8421,0x8c634a53,0x294b5ad7,0x9ce75295,0x5295294b,0x5ad7294b,0x8421294b,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x314941cb,0x31893149,0x31893189,0x31493189,0x31893189,0x31893189,0x31493149,0x31493189,0x31893189,0x31893149,0x31893189,0x31493189,0x31893189,0x31893189,0x31493149,0x18c53149,0x9c131883,0x28c372cf,0x28c3b497,0x2105bcd9,0xb4972905,0xb4979b4f,0x9c139c13,0x18839c13, +0x9c131883,0x28c372cf,0xb497b497,0x2105bcd9,0xb4972905,0x28c39b4f,0x28c328c3,0x1883628d,0x5ad7294b,0x294b7bdf,0x00010001,0x00010001,0x00010001,0x00010001,0x6b5ba529,0x210939cf,0x5ad7294b,0x6b5b7bdf,0x7bdf7bdf,0x5ad77bdf,0x94a594a5,0x84217bdf,0x6b5b7bdf,0x210939cf,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x39c1ded5,0xef59ce51,0xce516301,0xce51ce51,0xd693e713,0xb58bce51,0xe713ffd9,0xce51ce51,0x00000000,0x00000000,0x00000000,0xc7bf0000,0x00000000,0x00000000,0x00000000,0xb6b70000,0x8c638c63,0xffff7bdf,0x767fc73f,0x5f7d767f,0x7bdf7bdf,0x5f7d767f,0x8c638c63,0x6b5b8c63,0x8c638c63,0xb8017bdf,0x9001a801,0x88019001,0x7bdf7bdf,0x88019001,0x8c638c63,0x6b5b8c63, +0x94a55295,0x52950000,0x00005ad7,0xa529a529,0x00000000,0x00006319,0x52950000,0x5ad75ad7,0x94a55295,0x5295294b,0x294b5ad7,0xa529a529,0x294b294b,0x294b6319,0x5295294b,0x5ad75ad7,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x72cd41cd,0x728b72cd,0x72cd72cd,0x6a8b72cd,0x6a8b6a8b,0x72cd728b,0x72cd72cd,0x6a8b72cd,0x6a8b6a8b,0x728b72cd,0x72cd72cd,0x6a8b72cd,0x6a8b6a8b,0x72cd728b,0x72cd72cd,0x290772cd,0xbcd91883,0x28c3bcd9,0x28c372cf,0x210572cf,0x9c132105,0xbcd949c9,0xbcd9bcd9,0x1883bcd9, +0xbcd91883,0x28c3bcd9,0xbcd9bcd9,0x2105bcd9,0x9c132105,0xdef749c9,0xb5addef7,0x188372cf,0x6319318d,0x294b7bdf,0x08430001,0x10850843,0x10851085,0x00011085,0x8421a529,0x21096319,0x6319318d,0x6b5b7bdf,0x5ad7739d,0x7bdf6b5b,0x8421739d,0x7bdf8c63,0x84218421,0x21096319,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x6b41bdcd,0xd693e713,0xded5e713,0xce51c60f,0xce51ce51,0xb58bd693,0xce519cc5,0xce51ded5,0x0000ffff,0x0000c7bf,0x00000000,0x0000c7bf,0x00000000,0x00000000,0x00000000,0xb6b70000,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x739d739d,0x6b5b739d,0x739d739d,0x739d739d,0x7bdf7bdf,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x739d739d,0x6b5b739d,0x739d739d,0x739d739d,0x7bdf7bdf, +0xb5ada529,0xa5290000,0x5ad7b5ad,0x94a5ad6b,0xad6b0000,0x5295bdef,0x52950000,0x63190000,0xb5ada529,0xa529294b,0x5ad7b5ad,0x94a5ad6b,0xad6b294b,0x5295bdef,0x5295294b,0x6319294b,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x930941cb,0x8b098b09,0x8b098b09,0x93098b09,0x93099309,0x8b098b09,0x8b098b09,0x93098b09,0x93099309,0x8b098b09,0x8b098b09,0x93098b09,0x93099309,0x8b098b09,0x8b098b09,0x290782c9,0x72cf1883,0x6a8d6a8d,0x6a8ddef7,0x18836a8d,0x72cf1883,0x41896a8d,0x6a8d6a8d,0x188372cf, +0x72cf1883,0x28c36a8d,0x6a8d6a8d,0x18836a8d,0x72cf1883,0xffff6a8d,0xb5addef7,0x188341c9,0x5ad7294b,0x21095ad7,0xb5ad739d,0xad6bad6b,0xa529ad6b,0x6b5ba529,0x5ad7ad6b,0x39cf5295,0x5ad7294b,0x63195ad7,0x8c638c63,0x63196b5b,0x5ad76b5b,0x7bdf5ad7,0x5ad78421,0x39cf5295,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe713ce51,0xd693ded1,0xce51d693,0x39c1c60f,0x39c1e713,0x39c139c1,0xce51b58b,0xce5139c1,0xc7bfffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xb6b70000,0xc73f7bdf,0x6b5b767f,0x739d8c63,0x7bdf7bdf,0xc73fffff,0x8c638c63,0x8c638c63,0x8c638c63,0xf8017bdf,0x6b5b9001,0x739d8c63,0x7bdf7bdf,0xa801f801,0x8c638c63,0x8c638c63,0x8c638c63, +0x8c63bdef,0x9ce70000,0x529594a5,0x94a594a5,0x94a50000,0x000094a5,0xbdef0000,0x52959ce7,0x8c63bdef,0x9ce7294b,0x529594a5,0x94a594a5,0x94a5294b,0x294b94a5,0xbdef294b,0x52959ce7,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabcb41cd,0xabcbabcb,0xa347abcb,0xabcb8b47,0xa389abcb,0xa389a389,0xabcbabcb,0xabcb8b47,0xa389abcb,0xabcbabcb,0xa347abcb,0xabcb8b47,0xa389abcb,0xa389a389,0xabcbabcb,0x2907934b,0xbcd91883,0xdef7bcd9,0xdef772cf,0x2905628d,0xb4972905,0xb497b497,0xbcd9bcd9,0x1883bcd9, +0xbcd91883,0x28c3bcd9,0x72cfb5ad,0x29059c13,0xb4972905,0x72cfb497,0xb5addef7,0x188372cf,0x4211294b,0x84217bdf,0x8c635ad7,0x94a58c63,0x94a594a5,0x4a538c63,0x5ad7739d,0x39cf7bdf,0x4211294b,0x8c63739d,0x739da529,0x94a56b5b,0x842194a5,0x6319739d,0x4a535ad7,0x39cf7bdf,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce51ce51,0x39c1ce51,0xce51ce51,0xd693ded5,0x6301ce51,0x63015281,0x39c1e713,0x6b436b43,0x0000ffff,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x739d7bdf,0x739d739d,0x739d739d,0xc73f739d,0x5f7d5f7d,0x739d5f7d,0x739d739d,0x7bdf8c63,0x739d7bdf,0x739d739d,0x739d739d,0xa801739d,0x88018801,0x739d8801,0x739d739d,0x7bdf8c63, +0x4a538c63,0x5ad70000,0x00008c63,0x00009ce7,0x00005295,0x000094a5,0xad6b5295,0x000094a5,0x4a538c63,0x5ad7294b,0x294b8c63,0x294b9ce7,0x294b5295,0x294b94a5,0xad6b5295,0x294b94a5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b4741cb,0x8b478b47,0xabcb8b47,0xa389a389,0x8b478b47,0xa3478b47,0x8b47abcb,0xa389a389,0x8b478b47,0x8b478b47,0xabcb8b47,0xa389a389,0x8b478b47,0xa3478b47,0x8b47abcb,0x29077ac9,0x9c131883,0xb5ad9c13,0xb5ad628d,0x290572cf,0x9c132105,0x72cf9c13,0x9c13bcd9,0x18839c13, +0x9c131883,0xdef7b5ad,0x72cfb5ad,0x2905b497,0x9c132105,0x72cf9c13,0xb5adffff,0x1883628d,0x8c634a53,0xdef7c631,0xe739def7,0xf7bdf7bd,0xf7bdf7bd,0xdef7e739,0xc631def7,0x39cf8c63,0x5295294b,0x94a594a5,0x5ad77bdf,0x739d94a5,0x842194a5,0x6b5b8421,0x94a56b5b,0x318d5295,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd693ce51,0xe713ce51,0xc60fce51,0xd69318c1,0xded5ef59,0xe713ef55,0xffdbce51,0xce4d5281,0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0x00000000,0xffff0000,0x00000000,0x7bdf7bdf,0x739d8c63,0x8c63767f,0x739d8c63,0x739d6b5b,0x8c638c63,0x7bdf8c63,0x7bdf7bdf,0x7bdf7bdf,0x739d8c63,0x8c639001,0x739d8c63,0x739d6b5b,0x8c638c63,0x7bdf8c63,0x7bdf7bdf, +0x00005ad7,0x00000000,0x4a530000,0x00005ad7,0xad6bad6b,0x00000000,0x9ce75ad7,0x00000000,0x294b5ad7,0x294b294b,0x4a53294b,0x294b5ad7,0xad6bad6b,0x294b294b,0x9ce75ad7,0x294b294b,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa38941cd,0xa389a389,0xabcbabcb,0x8b478b47,0x8b478b47,0xa389a389,0xa389a389,0x8b478b47,0x8b478b47,0xa389a389,0xabcbabcb,0x8b478b47,0x8b478b47,0xa389a389,0xa389a389,0x2907930b,0xb4971883,0xb497b497,0xbcd9bcd9,0x18839c13,0x9c132105,0xb497b497,0xb4979b4f,0x1883b497, +0xb4971883,0x72cf72cf,0x72cfb5ad,0x18839c13,0x9c132105,0xb497b497,0xb5addef7,0x188372cf,0x7bdf4a53,0xdef7ce73,0xe739ef7b,0x42114211,0x421139cf,0xef7be739,0xc631d6b5,0x318d7bdf,0x5295294b,0x7bdf739d,0x52957bdf,0x842194a5,0x7bdf7bdf,0x5ad77bdf,0x6b5b6b5b,0x294b6b5b,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd69118c1,0xce51ce51,0xce51ce51,0xd693d68f,0xce51ce51,0x1081ce51,0xce51ce51,0xce51e713,0x0000ffff,0x00000000,0x00000000,0x0000c7bf,0x00000000,0x00000000,0x0000ffff,0xb6b70000,0x7bdf6b5b,0x7bdf7bdf,0x7bdf739d,0x7bdf7bdf,0x8c638c63,0xc73f7bdf,0x8c635f7d,0x6b5b8c63,0x7bdf6b5b,0x7bdf7bdf,0x7bdf739d,0x7bdf7bdf,0x8c638c63,0xf8017bdf,0x8c638801,0x6b5b8c63, +0x0000ad6b,0xb5adad6b,0x00000000,0x00000000,0x9ce7ad6b,0xad6b0000,0x00008421,0xad6b5295,0x294bad6b,0xb5adad6b,0x294b294b,0x294b294b,0x9ce7ad6b,0xad6b294b,0x294b8421,0xad6b5295,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa34941cb,0xa347a347,0xa349a349,0xa347a349,0xa347a347,0xa347a347,0xa349a349,0xa347a349,0xa347a347,0xa347a347,0xa349a349,0xa347a349,0xa347a347,0xa347a347,0xa349a349,0x29078b09,0x6a8d1883,0x72cf72cf,0x6a8d6a8d,0x10436a8d,0x72cf1883,0x72cf72cf,0x6a8d4189,0x18836a8d, +0x6a8d1883,0x72cf72cf,0x41874187,0x10436a8d,0x72cf1883,0x72cf72cf,0xb5ad2905,0x18834187,0xad6b4a53,0xdef7d6b5,0x39cf39cf,0xc801f801,0xc801f801,0x39cf39cf,0xd6b5def7,0x318da529,0x739d39cf,0x7bdf8c63,0x5ad7739d,0x7bdf7bdf,0x7bdf8421,0x63195ad7,0x6b5b8c63,0x2109739d,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xf7976301,0x39c1ce51,0xd69318c1,0xc60fce51,0x294139c1,0xce51d693,0xad49d693,0xe7136301,0xc7bf0000,0x00000000,0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0xb6b70000,0x739d7bdf,0x739d739d,0x739d739d,0x739d739d,0xffffc73f,0x767fc73f,0x5f7d767f,0x7bdf739d,0x739d7bdf,0x739d739d,0x739d739d,0x739d739d,0xf801a801,0x9001a801,0x88019001,0x7bdf739d, +0x00008c63,0x9ce7b5ad,0xad6b0000,0x0000b5ad,0x8c630000,0x94a50000,0x000094a5,0xa5294a53,0x294b8c63,0x9ce7b5ad,0xad6b294b,0x294bb5ad,0x8c63294b,0x94a5294b,0x294b94a5,0xa5294a53,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabcb41cd,0xabcbabcb,0x8b47abcb,0x8b47abcb,0x8b478b47,0x8b478b47,0xa347a389,0x8b47abcb,0x8b478b47,0xabcbabcb,0x8b47abcb,0x8b47abcb,0x8b478b47,0x8b478b47,0xa347a389,0x2907934b,0xbcd91883,0xa38fbcd9,0x9c13bcd9,0x1883bcd9,0x9c132105,0x9c139c13,0x72cf9b4f,0x1883bcd9, +0xbcd91883,0xa38fbcd9,0x9c13bcd9,0x1883bcd9,0x9c132105,0x9c139c13,0xffff9b4f,0x188372cf,0xc6318c63,0x39cfe739,0xc801c801,0xc801fd01,0xf801fd01,0xc801c801,0xef7b4211,0x294bad6b,0x5ad7294b,0x5ad75ad7,0x5ad75ad7,0x7bdf6b5b,0x5ad76319,0x8c6394a5,0x7bdf7bdf,0x210939cf,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe713e713,0x6b41d693,0xe7136301,0x39c1c60f,0x63016301,0xd6935281,0xce51ce51,0xce51ce51,0x0000c7bf,0x00000000,0x00000000,0x00000000,0x00000000,0x0000c7bf,0x00000000,0xb6b70000,0x8c637bdf,0xc73f739d,0x7bdf5f7d,0x739d7bdf,0x5f7d739d,0x739d5f7d,0x7bdf7bdf,0x8c638c63,0x8c637bdf,0xf801739d,0x7bdf8801,0x739d7bdf,0x8801739d,0x739d8801,0x7bdf7bdf,0x8c638c63, +0x000094a5,0x94a55ad7,0xa5290000,0x00008c63,0x52950000,0x94a50000,0xad6b4a53,0x0000ad6b,0x294b94a5,0x94a55ad7,0xa529294b,0x294b8c63,0x5295294b,0x94a5294b,0xad6b4a53,0x294bad6b,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b4741cd,0xabcba347,0xabcbabcb,0x8b47abcb,0xa389abcb,0x8b47a389,0x8b478b47,0x8b47abcb,0xa389abcb,0xabcba347,0xabcbabcb,0x8b47abcb,0xa389abcb,0x8b47a389,0x8b478b47,0x29077ac9,0x9c131883,0xa38f72cf,0xbcd9bcd9,0x2105bcd9,0xb4972905,0x9c13b497,0x9c139c13,0x18839c13, +0x9c131883,0xa38f72cf,0xbcd9bcd9,0x2105bcd9,0xb4972905,0x9c13b497,0x628d9c13,0x1883628d,0xdef78c63,0xf80139cf,0xfd01fd01,0xf801fd01,0xfd01ffc1,0xf801f801,0xef7bf801,0x318da529,0x6319318d,0x94a5739d,0x94a58c63,0x5ad76b5b,0x9ce76b5b,0x7bdf8c63,0x7bdf8421,0x21096319,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xc60fce51,0xef59bdcd,0xb58be713,0xce51ded5,0x63016301,0xce51e713,0xe7136301,0xc60fce51,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xc7bf0000,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x739d739d,0x7bdf7bdf,0x8c638c63,0x739d7bdf,0x7bdf739d,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x739d739d,0x7bdf7bdf,0x8c638c63,0x739d7bdf,0x7bdf739d, +0x00006319,0x5ad70000,0x84215ad7,0x00000000,0x63190000,0x94a55295,0xb5ad0000,0x5ad794a5,0x294b6319,0x5ad7294b,0x84215ad7,0x294b294b,0x6319294b,0x94a55295,0xb5ad294b,0x5ad794a5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x934b41cd,0x7ac97ac9,0x934b7ac9,0x7ac9934b,0x934b934b,0x930b7ac9,0x934b934b,0x7ac9934b,0x934b934b,0x7ac97ac9,0x934b7ac9,0x7ac9934b,0x934b934b,0x930b7ac9,0x934b934b,0x2907830b,0xbcd91883,0x7acd9c13,0xbcd99c13,0x2105bcd9,0xbcd92905,0xb4979c13,0xbcd9bcd9,0x1883bcd9, +0xbcd91883,0x7acd9c13,0xbcd99c13,0x2105bcd9,0xbcd92905,0xb4979c13,0xbcd9bcd9,0x1883bcd9,0xe7398c63,0xfd0139cf,0xffc1ffc1,0xfd01ffc1,0xffc1fd01,0xfd01ffc1,0xef7bfd01,0x294bad6b,0x6b5b39cf,0x63195ad7,0x52954211,0x739d739d,0x63194a53,0x63196319,0x42115295,0x318d5295,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xbdcde717,0xce51b58b,0xce51b58b,0xce51d693,0xef55ffdb,0xd693ded5,0xce51e713,0xce51ce51,0xb6b7c7bf,0xb6b7b6b7,0xb6b7b6b7,0x00000000,0xb6b7b6b7,0xb6b70000,0xb6b7b6b7,0xc7bfb6b7,0x739d739d,0x739d739d,0x8c636b5b,0x7bdf8c63,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x7bdf7bdf,0x739d739d,0x739d739d,0x8c636b5b,0x7bdf8c63,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x7bdf7bdf, +0x0000a529,0x00000000,0x9ce70000,0x52950000,0xad6bad6b,0x00005295,0x8c630000,0xad6b5295,0x294ba529,0x294b294b,0x9ce7294b,0x5295294b,0xad6bad6b,0x294b5295,0x8c63294b,0xad6b5295,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x29072907,0x29072907,0x29072907,0x29072907,0x29072907,0x29072907,0x29072107,0x29072907,0x29072907,0x29072907,0x29072907,0x29072907,0x29072907,0x29072907,0x29072107,0x20c52907,0x72cf1883,0x7b0f72cf,0x6a8d6a8d,0x18837b0f,0x72cf1883,0x6a8d72cf,0x6a8d49c9,0x18836a8d, +0x72cf1883,0x7b0f72cf,0x6a8d6a8d,0x18837b0f,0x72cf1883,0x6a8d72cf,0x6a8d49c9,0x18836a8d,0xdef78421,0xf801318d,0xf801fd01,0xffc1fd01,0xfd01f801,0xfd01ffc1,0xef7bf801,0x318d9ce7,0x318d39cf,0x318d318d,0x294b318d,0x294b294b,0x39cf2109,0x318d39cf,0x2109294b,0x318d318d,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd6b5ce73,0xce73c631,0xef7bdef7,0xd6b5ce73,0xef7be739,0xce73bdef,0xe739e739,0xc631ce73,0x1a9f21d5,0x1a9f2215,0x2a570a1b,0x01d922e1,0x1a9f129f,0x1a9f2215,0x3adb22e1,0x22151a9f,0xffffffff,0xefffffff,0xffffffff,0xffffefff,0xffffffff,0xefffefff,0xe7bde7bd,0xffffffff,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f, +0xffffffff,0xefffffff,0xffffffff,0xffffefff,0xffffffff,0xefffefff,0xe7bde7bd,0xffffffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x0a050000,0x14071407,0x14071449,0x0b071449,0x13c90a05,0x140913c9,0x14071409,0x00000b07,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa52d8465,0x9d2da52d,0x9d2d9d2b,0x9d2b9d2b,0xa52da56d,0x9d2b9d2b,0x9d2b9d2b,0x9d2b94eb,0xe7770000,0x00009619,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0x314b2909,0x314b314b,0x314b314b,0x314b314b,0x314b314b,0x314b314b,0x314b314b,0x2109314b,0x314b2909,0x314b314b,0x314b314b,0x314b314b,0x314b314b,0x314b314b,0x314b314b,0x2109314b, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0xe739def7,0xffffffff,0xef7bef7b,0xd6b5def7,0xc631ce73,0xd6b5d6b5,0xc631b5ad,0xdef7d6b5,0x00001a9f,0x00001a9f,0x1a9f0000,0x00000000,0x00000000,0x00001a9f,0x1a9f0000,0x125d0000,0xffffffff,0xefffffff,0xefffefff,0xe7bdefff,0xffffe7bd,0xefffefff,0xffffe7bd,0xe7bdffff,0x757f757f,0x757f757f,0x757f757f,0x8dff757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f, +0xffffffff,0xefffffff,0x59cbefff,0xe7bdefff,0xffffe7bd,0xefffefff,0xffffe7bd,0xe7bdffff,0x0b070000,0x00010b07,0x0b070143,0x00010143,0x0b070b07,0x00010b07,0x0b070143,0x00000b07,0x0a050000,0x140713c7,0x14490b87,0x00010a85,0x13870a05,0x144913c9,0x14071409,0x00000b07,0x0b070000,0x0b070b07,0x0b070b07,0x0b070b07,0x0b070b07,0x0b070b07,0x0b070b07,0x00000b07, +0x9d2ba52d,0xa56fa52d,0x9d2b94a9,0x9d2b9d2b,0xa56f94e9,0xa52dadf3,0x9d2b9d2b,0xa56d9d2b,0x85570000,0x00006c11,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0xe7770000,0x00009619,0x7a91314b,0x828f8291,0x82918291,0x728f728f,0x728f728f,0x8291728f,0x8291728f,0x314b7a91,0x7a91314b,0x828f8291,0x82918291,0x728f728f,0x728f728f,0x8291728f,0x8291728f,0x314b7a91, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xf7bdef7b,0xdef7d6b5,0xf7bdf7bd,0xd6b5e739,0xf7bdef7b,0xe739e739,0xffffffff,0xe739ef7b,0x1a9f1993,0x1a9f2215,0x3adb129f,0x1a9f1a9f,0x1a9f125d,0x1a9f1191,0x21d51a9f,0x221501d9,0xffffefff,0xe7bdefff,0xefffe7bd,0xe7bdefff,0xefffffff,0xe7bdefff,0xffffffff,0xefffefff,0x757f757f,0xffff757f,0x757f757f,0x757f8dff,0x757f757f,0x757f757f,0x757f757f,0x757f757f, +0x59cbefff,0xe7bdefff,0x59cbe7bd,0x59cbefff,0xefffffff,0xe7bdefff,0xffff59cb,0x59cbefff,0x0b070000,0x0a851409,0x13c71407,0x0a8513c7,0x14071449,0x0b471449,0x14071409,0x00000b07,0x00010001,0x13c70b47,0x14490b87,0x09c50b07,0x13870a05,0x140913c9,0x0ac51409,0x00010001,0x0b070000,0xdee7dee7,0xdee7dee7,0xdee7dee7,0xdee7dee7,0xdee7dee7,0xdee7dee9,0x00000b07, +0xad6fa52d,0x9d2badb1,0x9d2b9d2b,0x9d2d9d2d,0xa56da52d,0xa56fa56f,0x9d2b94e9,0xadb19d2b,0xaedd0000,0x974d8557,0xaedd0000,0x00008557,0xaedd0000,0x760b8557,0x85570000,0x00006c11,0x8ad1314b,0x828f5189,0x828f5189,0x92d159cb,0x9b1359cb,0x92d159cb,0x9b135989,0x314b8ad1,0x8ad1314b,0x828f828f,0x828f828f,0x728f92d1,0x9b13728f,0x92d19b13,0x9b1392cf,0x314b8ad1, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd6b5def7,0xf7bdef7b,0xd6b5d6b5,0xf7bddef7,0xdef7ce73,0xf7bdf7bd,0xd6b5def7,0xf7bdffff,0x00001a9f,0x00001a9f,0x22e10000,0x00000000,0x00000000,0x000022e1,0x1a9f0000,0x22e10000,0xe7bdffff,0xe7bde7bd,0xffffffff,0xffffe7bd,0xefffffff,0xe7bdefff,0xffffffff,0xe7bdefff,0x757f757f,0x757fffff,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f8dff, +0x6b5b59cb,0x59cb59cb,0x59cbffff,0x59cb59cb,0x59cbffff,0x59cbefff,0x59cb7a8f,0x7a8f59cb,0x00010000,0x14890a85,0x14091407,0x00010b47,0x14070b47,0x00010b47,0x14070b47,0x00000b07,0x01430000,0x13c70b07,0x14090b87,0x0b071387,0x0a850001,0x144913c9,0x0b871449,0x00000b07,0x0b070000,0xd6a7dee7,0xd6a7d6a7,0xd6a7d6a7,0xd6a7d6a7,0xd6a7d6a7,0xdee7d6e9,0x00000b07, +0x9d2b9ceb,0xa52d9d2b,0xa52d9d2b,0x9d2b9d2b,0x9d2b9d2b,0xa56d9d2b,0x9d2b9d2d,0x94e99d2d,0xaedd0000,0x760b8557,0xaedd0000,0x974d8557,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0x828f314b,0x92cf4147,0x92cf4147,0x92cf4147,0x92cf4147,0x92d14147,0x92d14147,0x314b828f,0x828f314b,0x92cf92d1,0x92cf92cf,0x1885728f,0x728f1885,0x92d192d1,0x92d192d1,0x314b828f, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdef7e739,0xdef7ce73,0xef7bef7b,0xb5adbdef,0xe739d6b5,0xc631d6b5,0xef7bef7b,0xbdefce73,0x00001a9f,0x00001a9f,0x1a9f0000,0x00000000,0x00000000,0x00001a9f,0x1a9f0000,0x0a1b0000,0xffffffff,0xefffefff,0xffffefff,0xffffe7bd,0xefffefff,0xffffe7bd,0xefffffff,0xe7bdefff,0xffff757f,0x757f757f,0x757f757f,0x757f757f,0xffff757f,0x757f757f,0x8dff757f,0x757f757f, +0x7a8f9353,0xbc179353,0x935359cb,0x7a8f7a8f,0x59cb59cb,0x6b5b59cb,0x93537a8f,0x7a8f59cb,0x01430000,0x14071409,0x14490b47,0x0b471449,0x14071449,0x0b471449,0x14071449,0x00000b07,0x0a050000,0x14070b87,0x140913c9,0x0b071407,0x0b070143,0x14491407,0x13871449,0x00000b07,0x0b070000,0xd6e9dee7,0xdee9dee7,0xdee9dee9,0xdee9dee7,0xdee9dee7,0xdee7d6a7,0x00000b07, +0x9d2ba56d,0x9d2ba56f,0xa56fa56f,0xa56fa52f,0x9ceba56f,0xa56f9d2b,0x94e99d2d,0x94eba52d,0xaedd0000,0x00008557,0xe7770000,0x760b9619,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0x728f314b,0x5189828f,0x59cb828f,0x51899b13,0x51899b13,0x5989828f,0x59cb92d1,0x314b8291,0x728f314b,0x828f828f,0x9b13828f,0x1885728f,0x728f1885,0x92cf828f,0x92d192d1,0x314b8291, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xbdefc631,0xf7bdce73,0xb5adce73,0xd6b5ce73,0xb5adce73,0xd6b5d6b5,0xd6b5c631,0xd6b5ce73,0x1a9f2215,0x22e12215,0x32591a9f,0x1a9f1a9f,0x22e11a9f,0x22e12215,0x22151a9f,0x22151a9f,0xefffefff,0xefffefff,0xffffe7bd,0xffffffff,0xefffe7bd,0xe7bde7bd,0xefffefff,0xe7bdefff,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757fffff,0x757f757f,0x757f8dff,0x757f757f, +0x59cb7a8f,0x93539353,0x93537a8f,0x59cb59cb,0x7a8f59cb,0x59cb7a8f,0x7a8f7a8f,0xbc177a8f,0x0b070000,0x0b471407,0x0b470001,0x140713c7,0x140713c7,0x14091449,0x0a851449,0x00000001,0x0a050000,0x14070b47,0x13c913c9,0x0b0713c9,0x13870a05,0x14491407,0x0b871409,0x00000b07,0x0b070000,0xd6a7dee7,0xdee7dee9,0xdee7dee7,0xdee7dee7,0xdee9dee7,0xdee7d6a7,0x00000b07, +0xa52d9ceb,0xadf59d2b,0xa56d9d2b,0xa52da52d,0xad6f9d2b,0x94e9a52d,0x9d2b9d2b,0x94e99d2d,0xaedd0000,0x00008557,0x85570000,0x00006c11,0xe7770000,0x00009619,0xaedd0000,0x00008557,0x728f314b,0x414992cf,0x414992d1,0x39479b13,0x414992d1,0x414992d1,0x3947828f,0x314b728f,0x728f314b,0x92d192cf,0x92d192d1,0x1885728f,0x728f1885,0x92d192d1,0x828f828f,0x314b728f, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xffffffff,0xef7bef7b,0xdef7def7,0xe739def7,0xffffef7b,0xdef7e739,0xffffffff,0xe739ef7b,0x00001a9f,0x0000021b,0x1a9f0000,0x00000000,0x00000000,0x00001a9f,0x01970000,0x1a9f0000,0xe7bdffff,0xe7bde7bd,0xefffffff,0xffffe7bd,0xe7bde7bd,0xffffe7bd,0xefffefff,0xe7bde7bd,0x757f757f,0x757f757f,0x757f757f,0x8dff757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f, +0x59cbbc17,0x7a8f7a8f,0x7a8f8421,0xbc177a8f,0x7a8fbc17,0xbc17bc17,0x93537a8f,0x93537a8f,0x01430000,0x14890b87,0x14491407,0x14071409,0x00010b47,0x140713c7,0x14071407,0x00000b07,0x00010001,0x0bc71387,0x13c71407,0x0b0713c9,0x13870a05,0x13c71409,0x0a851409,0x00010001,0x0b070000,0xd6a7dee7,0xdee7dee9,0xd6e9d6a7,0xd6a7d6a7,0xdee7dee7,0xdee7d6a7,0x00000b07, +0xa52d94e9,0x9d2d9ceb,0xa56d94e9,0x9d2b9d2b,0x9d2b9d2b,0xadb1a56f,0xa56fa52d,0x9d2da52d,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0x85570000,0x00006c11,0xaedd0000,0x974d8557,0x8ad1314b,0x92d159cb,0x9b1359cb,0x828f59cb,0x828f5189,0x9b135989,0x9b1359cb,0x314b8ad1,0x8ad1314b,0x92d19b13,0x9b139b13,0x1885728f,0x728f1885,0x9b1392cf,0x9b139b13,0x314b8ad1, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd6b5d6b5,0xffffffff,0xe739ef7b,0xf7bdf7bd,0xd6b5ce73,0xf7bdef7b,0xe739e739,0xf7bdf7bd,0x00001a9f,0x00001a9f,0x1a9f0000,0x00000000,0x00000000,0x00001a9f,0x22e10000,0x125d0000,0xffffffff,0xefffefff,0xefffefff,0xe7bdefff,0xffffffff,0xe7bde7bd,0xefffffff,0xe7bdefff,0x757f757f,0x757f8dff,0x757f757f,0x757f8dff,0x757f757f,0x757f757f,0x757f757f,0x757f757f, +0x7a8fbc17,0xbc17bc17,0x93539353,0x7a8f7a8f,0x59cb9353,0x93539353,0x7a8f7a8f,0x93539353,0x00010000,0x14070a85,0x14890b47,0x14071449,0x0b471449,0x14091407,0x14070b47,0x00000143,0x0a050000,0x13871449,0x13871407,0x0b071449,0x0a850001,0x0bc71409,0x0b051409,0x000009c5,0x0b070000,0xd6a7dee7,0xdee7dee9,0xdee9d6a7,0xd6a7dee9,0xdee7dee7,0xdee7d6a7,0x00000b07, +0x9d2b9d2d,0x9d2ba56f,0x9d2b9d2d,0xadafa56d,0x9ceba52d,0x9d2b9d2b,0xa52da52d,0xa56f9d2b,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0xaedd0000,0x760b8557,0x828f314b,0x92d14147,0x92d14147,0x92cf4147,0x92cf4147,0x92d14147,0x92d14147,0x314b828f,0x828f314b,0x92d192d1,0x92d192d1,0x1885728f,0x728f1885,0x92d192d1,0x92d192d1,0x314b828f, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe739ef7b,0xd6b5c631,0xe739f7bd,0xd6b5ce73,0xd6b5d6b5,0xc631d6b5,0xdef7def7,0xc631c631,0x000022e1,0x00001a9f,0x1a9f0000,0x00000000,0x00000000,0x00001a9f,0x1a9f0000,0x1a9f0000,0xefffffff,0xefffefff,0xe7bde7bd,0xe7bde7bd,0xffffffff,0xe7bdffff,0xffffffff,0xe7bdefff,0x8dff757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f, +0x7a8f9353,0x93537a8f,0x93537a8f,0x59cb7a8f,0x93537a8f,0x7a8f9353,0x7a8f7a8f,0x7a8f59cb,0x0b070000,0x0b471449,0x0b470001,0x0b4713c7,0x14071407,0x0b471407,0x0b470001,0x00000001,0x0a050000,0x0b871449,0x0b871407,0x0b071407,0x0b070143,0x13871449,0x0b871407,0x00000b07,0x0b070000,0xd6e9dee7,0xdee7dee9,0xdee9d6a7,0xd6a7dee9,0xdee9dee7,0xdee7d6a7,0x00000b07, +0xa52da52d,0xa56fa56f,0x9d2ba52d,0xa52da56f,0xadf3ad6f,0xa52d94e9,0x9d2d9d2b,0x9d2d9d2b,0xe777974d,0x00009619,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0x8ad1314b,0x59cb9b13,0x59899b13,0x59cb828f,0x59cb9b13,0x59cb92d1,0x59cb9b13,0x314b8ad1,0x8ad1314b,0x9b139b13,0x92cf9b13,0x1885728f,0x728f1885,0x92d192d1,0x9b139b13,0x314b8ad1, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdef7d6b5,0xef7bd6b5,0xbdefbdef,0xe739def7,0xe739ce73,0xffffffff,0xe739def7,0xffffffff,0x00001a9f,0x00001a9f,0x22e10000,0x00000000,0x00000000,0x0000125d,0x125d0000,0x1a9f0000,0xefffefff,0xffffefff,0xffffffff,0xefffffff,0xefffefff,0xe7bdefff,0xe7bdffff,0xe7bde7bd,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757fffff,0x757f757f,0x757f757f,0x757f757f, +0x93539353,0x7a8f59cb,0x59cb7a8f,0x7a8f59cb,0x7a8f7a8f,0x7a8f7a8f,0xbc17bc17,0x93537a8f,0x0b070000,0x14071449,0x14090b47,0x00010b47,0x14070b47,0x14091407,0x14070b47,0x00000b07,0x0a050000,0x13871449,0x144913c9,0x00010a85,0x0b870a05,0x0b871449,0x0b871449,0x00000b07,0x0b070000,0xd6a7dee7,0xdee7dee7,0xd6a7d6a7,0xd6a7d6a7,0xdee9dee7,0xdee7d6a7,0x00000b07, +0x8ca794e9,0x9d2ba52d,0xa52d9d2b,0x9d2ba56f,0xa52d9d2d,0xad6fa52d,0xa52d9d2d,0xa56d94e9,0x8557760b,0x00006c11,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0xe7770000,0x00009619,0x728f314b,0x3947828f,0x4989828f,0x414992d1,0x3947828f,0x4147828f,0x39479b13,0x314b728f,0x728f314b,0x828f828f,0x9b13828f,0x1885728f,0x728f1885,0x92cf828f,0x828f9b13,0x314b728f, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xf7bdf7bd,0xef7bef7b,0xf7bdffff,0xe739ef7b,0xef7bf7bd,0xe739d6b5,0xdef7e739,0xdef7ce73,0x1a9f094f,0x1a9f1191,0x21d31a9f,0x1a9f0a1b,0x1a9f2b65,0x1a9f2215,0x2215125d,0x11912b23,0xffffffff,0xe7bdffff,0xefffefff,0xefffefff,0xefffefff,0xffffe7bd,0xefffffff,0xe7bdefff,0x757f757f,0x757f757f,0x757f757f,0xffff757f,0x757f757f,0x757f757f,0xffff757f,0x757f757f, +0x93539353,0xbc177a8f,0x7a8fbc17,0x9353bc17,0xbc1759cb,0x7a8fbc17,0x93539353,0x7a8f8421,0x00010000,0x14070a85,0x14071409,0x14491407,0x0b471407,0x0b4713c7,0x14071449,0x00000b07,0x0a050001,0x0b871409,0x14491407,0x09c50b05,0x13c70a05,0x0b871449,0x0a851449,0x00010001,0x0b070000,0xd6a7dee7,0xdee7dee9,0xdee7dee7,0xdee7dee7,0xdee9dee7,0xdee7d6e9,0x00000b07, +0xa52da52d,0xa52f8c67,0xa56f94e9,0x9d2d9d2b,0xad6fad6f,0x9d2ba56d,0x9d2b9d2d,0x9d2d9d2b,0xaedd0000,0x00008557,0xe777760b,0x00009619,0xaedd974d,0x00008557,0x85570000,0x00006c11,0x8291314b,0x92d159cb,0x9b1359cb,0x828f5189,0x828f5189,0x92d159cb,0x92d159cb,0x314b8291,0x8291314b,0x92d192d1,0x9b139b13,0x1885728f,0x728f1885,0x92d192d1,0x92d192d1,0x314b8291, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce73ce73,0xe739e739,0xd6b5d6b5,0xe739ef7b,0xce73ce73,0xe739d6b5,0xbdefbdef,0xe739d6b5,0x00000a1b,0x000022e1,0x2b230000,0x00000000,0x00000000,0x00001a9f,0x1a9f0000,0x1a9f0000,0xe7bdffff,0xefffe7bd,0xefffefff,0xe7bde7bd,0xe7bde7bd,0xffffe7bd,0xefffefff,0xe7bde7bd,0x757f757f,0x757f757f,0x757f757f,0x757f8dff,0x757f757f,0x757f757f,0x757fffff,0x757f757f, +0x7a8f9353,0x93537a8f,0xbc179353,0x93537a8f,0x93536b5b,0x7a8f9353,0x935359cb,0x59cb7a8f,0x0b070000,0x14071449,0x0b471449,0x14091407,0x00010b47,0x00010b47,0x14070b47,0x00000001,0x0a050000,0x0b871409,0x144913c9,0x0b070b87,0x13c70a05,0x13871449,0x0b071449,0x000009c5,0x0b070000,0xd6a7dee7,0xdee9dee9,0xdee7dee7,0xdee9dee9,0xdee9dee9,0xdee7d6a7,0x00000b07, +0xa52f9ceb,0x94eba56d,0x9d2ba52d,0x9d2ba52d,0xa52da52d,0xadb19d2b,0x9d2b9d2b,0x94a99d2b,0xaedd0000,0x00008557,0x85570000,0x00006c11,0xaedd760b,0x00008557,0xaedd0000,0x00008557,0x828f314b,0x92cf4147,0x92d14147,0x92cf4147,0x92cf4147,0x92cf4147,0x92d14147,0x314b828f,0x828f314b,0x92cf92cf,0x92d192d1,0x1885728f,0x728f1885,0x92cf92cf,0x92d192d1,0x314b828f, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd6b5d6b5,0xbdefbdef,0xf7bdf7bd,0xb5adc631,0xef7bdef7,0xe739e739,0xffffffff,0xc631e739,0x00001a9f,0x00001a9f,0x1a9f0000,0x00000000,0x00000000,0x00001a9f,0x1a9f0000,0x1a9f0000,0xffffefff,0xe7bdefff,0xe7bde7bd,0xffffefff,0xffffffff,0xe7bdefff,0xe7bde7bd,0xe7bde7bd,0x8dff757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0xffff757f,0x757f757f,0x757f757f, +0x59cb7a8f,0x7a8f9353,0x93539353,0x7a8fbc17,0x7a8f7a8f,0x7a8f7a8f,0x7a8f7a8f,0xbc17bc17,0x0b070000,0x14071449,0x00010b47,0x14091407,0x0b471449,0x0b471407,0x14091449,0x00000b07,0x00010001,0x0b870b47,0x144913c9,0x0b070b87,0x0ac50001,0x13871449,0x0b8713c7,0x00010b07,0x0b070000,0xd6a7dee7,0xd6e9d6a7,0xd6a7d6a7,0xd6a7d6a7,0xd6e9d6e9,0xdee7d6e9,0x00000b07, +0xa52dad6f,0xad6f9d2b,0x9d2ba52d,0x94e9a56d,0xa52d94e9,0x9d2b9d2b,0xa52fa52d,0x9d2b9d2b,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0x8ad1314b,0x59cb9b13,0x51899b13,0x51899b13,0x5189828f,0x5189828f,0x598992d1,0x314b8ad1,0x8ad1314b,0x9b139b13,0x828f9b13,0x1885728f,0x728f1885,0x828f828f,0x92cf92d1,0x314b8ad1, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe739e739,0xffffffff,0xef7bf7bd,0xd6b5e739,0xdef7bdef,0xf7bde739,0xdef7def7,0xfffff7bd,0x125d2215,0x1a9f2215,0x22151a9f,0x1a9f1a9f,0x22e11a9f,0x125d2215,0x19911a9f,0x22151a9f,0xefffefff,0xe7bdefff,0xefffefff,0xe7bdefff,0xefffffff,0xe7bdefff,0xffffffff,0xefffefff,0x757f8dff,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f8dff,0x757f757f,0x757f757f, +0x93537a8f,0x7a8f7a8f,0x7a8f59cb,0x93539353,0x59cb7a8f,0x59cbbc17,0xbc177a8f,0x93539353,0x0b070000,0x14070a85,0x0b471449,0x0b870a85,0x0a851449,0x14091407,0x0a850a85,0x00000b07,0x01430000,0x13c70b87,0x14091407,0x0b070bc7,0x0b470143,0x138713c9,0x14491449,0x00000b07,0x0b070000,0xdee7dee7,0xdee7dee7,0xdee7dee7,0xdee7dee7,0xdee7dee7,0xdee7dee7,0x00000b07, +0xa56fadb3,0x8ca79ceb,0x9d2b9d2b,0xad6f9d2b,0xad6fa52d,0xa52da56f,0x9d2ba56d,0x9d2da56f,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0xe7770000,0x00009619,0xaedd760b,0x00008557,0x728f314b,0x498992cf,0x49899b13,0x39479b13,0x41499b13,0x394792d1,0x3947828f,0x314b728f,0x728f314b,0x9b1392cf,0x9b139b13,0x728f9b13,0x92d1728f,0x828f92d1,0x828f828f,0x314b728f, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xf7bdf7bd,0xdef7def7,0xe739f7bd,0xef7be739,0xef7bffff,0xd6b5d6b5,0xe739e739,0xce73d6b5,0x00000a1b,0x000022e1,0x1a9f0000,0x00000000,0x00000000,0x000022e1,0x125d0000,0x1a9f0000,0xefffffff,0xe7bdffff,0xe7bde7bd,0xffffe7bd,0xffffffff,0xffffffff,0xefffffff,0xe7bdefff,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f, +0x7a8f9353,0xbc1759cb,0x59cb7a8f,0x59cb7a8f,0x7a8f7a8f,0x59cb7a8f,0x7a8f7a8f,0x93539353,0x0b070000,0x01430001,0x0b070b07,0x0b070001,0x00010143,0x0b070b07,0x01430001,0x00000b07,0x0a050000,0x144913c9,0x14090b87,0x00010ac5,0x13c90a05,0x13871449,0x13871409,0x00000b07,0x0b070000,0x0b070b07,0x0b070b07,0x0b070b07,0x0b070b07,0x0b070b07,0x0b070b07,0x00000b07, +0x9d2da52d,0x9d2b9d2b,0x9d2da52d,0xa56da52d,0xa52d8ca7,0x9d2b94a9,0x9ceba56f,0xa52d9d2b,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0x85570000,0x00006c11,0xaedd0000,0x00008557,0x7a91314b,0x728f728f,0x8ad1728f,0x728f8ad1,0x8ad18ad1,0x8291728f,0x8ad18ad1,0x314b7a91,0x7a91314b,0x728f728f,0x8ad1728f,0x728f8ad1,0x8ad18ad1,0x8291728f,0x8ad18ad1,0x314b7a91, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce73c631,0xe739f7bd,0xd6b5ce73,0xfffff7bd,0xd6b5def7,0xf7bde739,0xce73ce73,0xf7bdef7b,0x1a9f2215,0x1a9f2215,0x2a571a9f,0x1a9f1a9f,0x1a9f22e1,0x1a9f1151,0x32991a9f,0x2a571a9f,0xffffffff,0xefffffff,0xe7bdefff,0xe7bde7bd,0xe7bde7bd,0xffffefff,0xefffe7bd,0xffffe7bd,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f,0x757f757f, +0x7a8f9353,0x9353bc17,0x7a8f9353,0x93538421,0x93539353,0x7a8f7a8f,0x93539353,0x59cb7a8f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x0a050000,0x140913c9,0x14071387,0x09c50b47,0x14070a05,0x0b8713c9,0x13c71407,0x00000b07,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa56d9d2b,0x94e99d2b,0xa52dadf3,0xa56f94e9,0xad6f9d2d,0x9d2b9d2b,0x9d2d9d2b,0x94e99d2b,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0xaedd0000,0x00008557,0x314b2909,0x314b314b,0x314b314b,0x314b314b,0x314b314b,0x314b314b,0x314b314b,0x314b314b,0x314b2909,0x314b314b,0x314b314b,0x314b314b,0x314b314b,0x314b314b,0x314b314b,0x314b314b, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xac51b495,0xac51ac51,0xb495ac51,0xac93b495,0xb495ac51,0xb495b495,0xb495b495,0x8b4db495,0xa529a529,0xad6ba529,0xbdefb5ad,0xbdefc631,0xbdefbdef,0xc631c631,0xc631c631,0xbdefc631,0x00000000,0x5a498b8f,0x00000000,0x00000000,0x00000000,0x00000000,0x6a8bac55,0x00000000, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x49437205,0x69c571c5,0x41034103,0x69c569c5,0x30c14103,0x410369c5,0x69c55985,0x71c54903,0x61c99b51,0x9b519b51,0x61c961c9,0x9b519b51,0x414561c9,0x61c99b51,0x9b517a8d,0x9b5161c9, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00006601,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00006b05,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x934fb495,0x7acb8b4d,0x8b4d8b4d,0x8b4d8b4d,0x8b4d8b4d,0x8b4d8b4d,0x8b4d8b4d,0x6a07934f,0xc631bdef,0xbdefbdef,0xc631c631,0xc631c631,0xc631c631,0xc631c631,0xc631c631,0xa529c631,0xa4130000,0x4987a413,0x8b8f8b8f,0xa413a413,0xac55ac55,0xa413ac55,0x624b8b8f,0x0000a413, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c34943,0x51455985,0x41035143,0x618530c1,0x30c14103,0x41035143,0x41034103,0x71c530c3,0x414561c9,0x7a8d7a8d,0x61c97a8d,0x9b514145,0x414561c9,0x61c97a8d,0x61c961c9,0x9b514145, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00005d83,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x24039581,0x00000000,0x00000000,0x00000000,0x00000000,0x73050000,0x00000000,0x00000000,0x10c18b85,0x00000000,0x00000000,0x00007b45,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x934fb495,0x7a897a89,0x7a897a89,0x8b4d828b,0x82cb82cb,0x828b82cb,0x934f6249,0x6a07934f,0xc631c631,0xbdefbdef,0xbdefbdef,0xc631bdef,0xbdefbdef,0xbdefbdef,0xc631b5ad,0xa529bdef,0x624b0000,0x5a498b8f,0x624b624b,0x624b624b,0x624b624b,0x5a095a09,0x6a8b624b,0x0000624b, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c371c5,0x69c569c5,0x41035143,0x49432881,0x28814943,0x41036185,0x41034103,0x59854103,0x41459b51,0x9b519b51,0x61c97a8d,0x7a8d4145,0x41457a8d,0x61c99b51,0x61c961c9,0x7a8d61c9, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1b415d83,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x3b4384c3,0x00000000,0x00000000,0x00000000,0x00000000,0x7b450000,0x00002101,0x00000000,0x83850000,0x00000000,0x00000000,0x29418385,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x728b9b8f,0x00006209,0x00000000,0x938f0000,0x00006249,0x00000000,0x934d0000,0x51c77acb,0xbdefbdef,0x0000b5ad,0x00000000,0xc6310000,0x0000b5ad,0x00000000,0xc6310000,0xa529bdef,0x00000000,0x49875a09,0x00000000,0x00000000,0x00000000,0x00000000,0x41875a09,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x41035985,0x318d69c5,0x39035143,0x59853903,0x28814943,0x49434943,0x41034103,0x69c530c3,0x61c97a8d,0x52959b51,0x61c97a8d,0x9b5161c9,0x41457a8d,0x7a8d7a8d,0x61c961c9,0x9b514145, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000641,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x13415e41,0x00000000,0x00000000,0x00000000,0x00000000,0x5cc50000,0x00000000,0x00000000,0x5d430000,0x00000000,0x00000000,0x00006583,0x00000000,0x00000000,0x000093c3,0x7b450000,0x95010000,0x00003981,0x93c30000,0x39810000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x7a89318d,0x00007a89,0x00000000,0xa4110000,0x000082cb,0x00000000,0xa4510000,0x72098b4d,0xbdef4a53,0x0000bdef,0x00000000,0xce730000,0x0000bdef,0x00000000,0xce730000,0xad6bc631,0x00000000,0x5a498b8f,0x00000000,0x00000000,0x00000000,0x00000000,0x624ba413,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x41035985,0x51435143,0x39033903,0x49035985,0x28814903,0x294b5985,0x41034943,0x69c530c1,0x61c97a8d,0x7a8d7a8d,0x61c961c9,0x7a8d9b51,0x41457a8d,0x52959b51,0x61c97a8d,0x9b514145, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x1c430501,0x00000000,0x00000000,0x00000000,0x00000000,0x55430000,0x00000000,0x00000000,0x4c450000,0x00000000,0x00000000,0x00005e01,0x00000000,0x65830000,0x00001281,0x66010000,0x9e010000,0x00001b01,0x00000000,0x1b415d43,0x00000000,0x00000000,0x42019d81,0x93c30000,0x95012941,0x7b4532c1,0x95010000,0x00000000,0x00007305, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x8b4d6b5b,0x00006249,0x00000000,0xa4110000,0x0000828b,0x00000000,0xa4110000,0x6a078b4d,0xc6318421,0x0000b5ad,0x00000000,0xce730000,0x0000bdef,0x00000000,0xce730000,0xa529c631,0xa4130000,0x624b624b,0xac55ac55,0x8b8fac55,0x8b8f8b8f,0xac55624b,0x5a498b8f,0x0000a413, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x41034903,0x41036185,0x39033903,0x51452881,0x38c330c3,0x28815145,0x41034943,0x69c56185,0x61c961c9,0x61c99b51,0x61c961c9,0x9b514145,0x61c961c9,0x41459b51,0x61c97a8d,0x9b519b51, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000483,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x0b010641,0x00000000,0x00000000,0x00000000,0x00000000,0x5e410000,0x00001301,0x54c50000,0x55430000,0x000009c1,0x00000000,0x1bc35e01,0x00000000,0x00000000,0x00005d43,0x65830000,0x95c123c3,0x00004c05,0x54850000,0x1b010000,0x00000000,0x00005a85,0x43439501,0x00008385,0x8cc34a01,0x838532c1,0xa5c12941,0x00000000,0x18c18b85, +0x00000000,0x00000000,0x00000000,0xfec10000,0x0000fc41,0x00000000,0x00000000,0x00000000,0x934fb495,0x934f934f,0xa453a451,0xa411a453,0x8b4d8b4d,0x938fa411,0xa453a453,0x7209934f,0xc631c631,0xc631c631,0xce73ce73,0xce73ce73,0xc631c631,0xc631ce73,0xce73ce73,0xa529c631,0x624b0000,0x624bac55,0x5a095a09,0x624b5a09,0x624b624b,0x5a095a09,0x6a8bac55,0x0000624b, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x514369c5,0x49436185,0x28813903,0x41032881,0x208130c3,0x49035145,0x41034943,0x51436185,0x7a8d9b51,0x7a8d9b51,0x414561c9,0x7a8d4145,0x414561c9,0x7a8d9b51,0x61c97a8d,0x7a8d9b51, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x02410641,0x00000000,0x00000000,0x00000000,0x00000000, +0x06010000,0x00000000,0x00000000,0x05410000,0x00000000,0x00000000,0x00000681,0x00000000,0x00000000,0x00005dc3,0x5e410000,0x55030a81,0x00001301,0x55430000,0x00000000,0x00000000,0x00000000,0x1b018d01,0x00006e81,0x8d411b41,0x6e813b83,0x8d010000,0x00000000,0x00000000,0x00018bc5,0x32c1a5c1,0x31819541,0x7c430000,0x9d412a41,0x7c433181,0x7b450000,0x39c10000, +0x00000000,0x00000000,0x00000000,0xffe50000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x7acb9bcf,0x62096209,0x62096209,0x7acb6209,0x62496249,0x62096249,0x728b6209,0x51c77acb,0xbdefbdef,0xb5adb5ad,0xb5adb5ad,0xbdefb5ad,0xb5adb5ad,0xb5adb5ad,0xbdefb5ad,0xa529bdef,0x00000000,0x41875a09,0x00000000,0x00000000,0x00000000,0x00000000,0x41875a09,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c169c5,0x49435143,0x28813903,0x51432881,0x208130c3,0x49034103,0x39033903,0x51436185,0x41459b51,0x7a8d7a8d,0x414561c9,0x9b514145,0x414561c9,0x7a8d7a8d,0x61c961c9,0x7a8d9b51, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1c8505c3,0x00000000,0x00000000,0x00000000,0x00000000, +0x06010000,0x00001c43,0x05010000,0x4cc50000,0x00000b01,0x00000000,0x24850601,0x00000000,0x00000000,0x1b815543,0x00006601,0x5dc32403,0x5d830ac1,0x55030000,0x00000000,0x00000000,0x00000000,0x32c19e01,0x2c858d01,0x95810000,0x95c132c1,0x8d412c85,0x00000000,0x00006583,0x42019541,0x4383a5c1,0x32c1a5c1,0x8cc30000,0x95411981,0xa5c13b01,0x95410000,0x00002141, +0x00000000,0x00000000,0x00000000,0x7b0f0000,0x000049c9,0x00000000,0x00000000,0x00000000,0x934fb495,0x000082cb,0x00000000,0xa4530000,0x000082cb,0x00000000,0xa4530000,0x6a07934f,0xc631c631,0x0000c631,0x00000000,0xce730000,0x0000bdef,0x00000000,0xc6310000,0xa529bdef,0x00000000,0x6a8bac55,0x00000000,0x00000000,0x00000000,0x00000000,0x6a8bac55,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c15985,0x49435143,0x38c33903,0x51432881,0x208130c3,0x38c35145,0x28813903,0x41035143,0x41457a8d,0x7a8d7a8d,0x61c961c9,0x9b514145,0x414561c9,0x61c99b51,0x414561c9,0x61c97a8d, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000405,0x00000000,0x00000000,0x00000000,0x00000000,0x05830000,0x00000000,0x00000000,0x06010000,0x00000000,0x00000000,0x000005c3,0x00000000, +0x00000000,0x000005c1,0x05c10000,0x56010b01,0x00000a41,0x05010000,0x1c030000,0x00000000,0x00000000,0x13015e01,0x24035e01,0x74830000,0x54c51b83,0x5e011341,0x00000000,0x00005d83,0x00006583,0x43c395c1,0x2ac184c3,0x8d410000,0x8d013b43,0x95413b83,0x4c450000,0x1b810000,0x32c1a5c1,0x43839d41,0x43838c83,0x95410000,0x9d412a41,0x7c4332c1,0x7c430000,0x00003b01, +0x00000000,0x00000000,0x00000000,0x93910000,0x00003947,0x00000000,0x00000000,0x00000000,0x8b4dac51,0x00007a89,0x00000000,0xa4510000,0x00007a89,0x00000000,0xa4110000,0x6a078b4d,0xc631c631,0x0000bdef,0x00000000,0xce730000,0x0000bdef,0x00000000,0xce730000,0xa529c631,0xa4130000,0x5a498b8f,0xac55ac55,0x8b8f8b8f,0x8b8f8b8f,0xa413a413,0x5a49ac55,0x0000a413, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c35985,0x41036185,0x49433903,0x514538c3,0x38c34103,0x39035145,0x28813903,0x51436185,0x41457a8d,0x61c99b51,0x7a8d61c9,0x9b5161c9,0x61c97a8d,0x61c99b51,0x414561c9,0x7a8d9b51, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x01c104c5,0x00000000,0x00000000,0x00000000,0x00000000,0x05030000,0x00000b41,0x06030000,0x4d830000,0x00001443,0x00000000,0x13c30601,0x00000000, +0x00000000,0x13c35601,0x00000541,0x55831bc3,0x05411bc3,0x55830000,0x00000000,0x00000000,0x00005d83,0x1bc35d83,0x1bc35e41,0x96010000,0x55031a01,0x5e010a81,0x55030000,0x13410000,0x1b819581,0x3b837403,0x2a818d01,0x84830000,0x8d0132c1,0x8d412ac1,0x95410000,0x000009c1,0x4bc38483,0x3b038483,0x2a419d81,0x8c830000,0x7c433b01,0x7c433b03,0x74030000,0x00001981, +0x00000000,0x00000000,0x00000000,0x93910000,0x00004189,0x00000000,0x00000000,0x00000000,0x8b4db495,0x0000828b,0x00000000,0xa4110000,0x00007a89,0x00000000,0xa4510000,0x6a078b4d,0xc631c631,0x0000bdef,0x00000000,0xce730000,0x0000bdef,0x00000000,0xce730000,0xa529bdef,0x624b0000,0x624ba413,0x5a095a09,0x624b5a09,0x624b624b,0x624b624b,0x624ba413,0x0000624b, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x41035985,0x61856185,0x39034943,0x49032881,0x38c34903,0x59852881,0x61853903,0x410339cf,0x61c97a8d,0x9b519b51,0x61c97a8d,0x7a8d4145,0x61c97a8d,0x9b514145,0x9b5161c9,0x61c96b5b, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000585,0x00000000,0x00000000,0x00000000,0x00000000,0x06830000,0x00000000,0x00000000,0x05c50000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x000005c3,0x04c30000,0x4dc31403,0x00000b41,0x05430000,0x14430000,0x00000000, +0x00000000,0x13c35583,0x13414d43,0x74830000,0x55c31341,0x55831341,0x00000000,0x00000701,0x1b815543,0x1b817cc3,0x24438dc1,0x8d810000,0x960143c3,0x5d8312c1,0x5d830000,0x000012c1,0x3b038d01,0x118184c3,0x32c18483,0x84830000,0x74432241,0x8d012ac1,0x8d010000,0x00003b03,0x2a419501,0x2a417403,0x4343a5c1,0x84830000,0x7c432a41,0x8cc319c1,0x95410000,0x00001141, +0x00000000,0x00000000,0x00000000,0x9bd50000,0x00004189,0x00000000,0x00000000,0x00000000,0x728b9bcf,0x938f7acb,0x934d934d,0x938f934d,0x938f7acb,0x938f938f,0x934d934d,0x51c7728b,0xbdefbdef,0xce73c631,0xc631c631,0xc631c631,0xc631bdef,0xc631c631,0xbdefbdef,0x9ce7b5ad,0x00000000,0x4987624b,0x00000000,0x00000000,0x00000000,0x00000000,0x41875a09,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x41035985,0x61854103,0x39035143,0x49433903,0x4943294b,0x61852881,0x61854103,0x30c34103,0x61c97a8d,0x9b5161c9,0x61c97a8d,0x7a8d61c9,0x7a8d5295,0x9b514145,0x9b5161c9,0x414561c9, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x03810545,0x00000000,0x00000000,0x00000000,0x00000000,0x06050000,0x00001485,0x00000000,0x45830000,0x00000bc3,0x00000000,0x00000585,0x00000000,0x00000000,0x13c344c5,0x00000641,0x4d830281,0x04031383,0x4dc30000,0x00000000,0x00000000, +0x00000481,0x138155c3,0x0b014405,0x6c830000,0x4cc51a01,0x44851383,0x04410000,0x2d050000,0x13015d83,0x22418541,0x3b835b43,0x74830000,0x74833343,0x7c8343c3,0x7cc30000,0x00001341,0x2ac19541,0x2a8184c3,0x2a417443,0x74430000,0x74432241,0x744319c1,0x8d410000,0x000032c1,0x32c18c83,0x11817c43,0x43838483,0x6b850000,0x7c432201,0x6bc51981,0x8cc30000,0x000032c1, +0x00000000,0x00000000,0x00000000,0x93930000,0x00003947,0x00000000,0x00000000,0x00000000,0x934fb495,0xa453934f,0xa411a453,0xa411a453,0xa4118b4d,0xa411a411,0x938fa451,0x7209934f,0xc631c631,0xce73c631,0xce73ce73,0xce73ce73,0xce73c631,0xc631ce73,0xbdefc631,0xa529b5ad,0x00000000,0x6a8bac55,0x00000000,0x00000000,0x00000000,0x00000000,0x4987a413,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c34943,0x69c54103,0x41035143,0x61852881,0x41033903,0x51434103,0x69c54103,0x69c569c5,0x414561c9,0x9b5161c9,0x61c97a8d,0x9b514145,0x61c961c9,0x7a8d61c9,0x9b5161c9,0x9b519b51, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x07050000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x000006c3,0x06430000,0x45430000,0x00000b41,0x05450000,0x0b810000,0x00000000,0x00000000,0x02814e01,0x1c854503,0x7e010000,0x45030b41,0x454301c1,0x00000000,0x00000583, +0x0a415601,0x13c38541,0x018174c3,0x64030000,0x74831201,0x4cc50a41,0x44850000,0x00000201,0x13417483,0x33017483,0x00817cc3,0x63c30000,0x63c31a01,0x74831a01,0x8d410000,0x00002a81,0x3b017c83,0x2a417443,0x19c18483,0x63c50000,0x6bc51181,0x638519c1,0x63c50000,0x00003301,0x2a417403,0x19c16b83,0x2a416bc5,0x6b850000,0x6bc50901,0x6b8319c1,0x6bc50000,0x00002a41, +0x00000000,0x00000000,0x00000000,0x628d0000,0x00003987,0x00000000,0x00000000,0x00000000,0x8b4dac93,0x82cb6249,0x82cb82cb,0x8b4d82cb,0x828b82cb,0x7a89828b,0x8b4d7a89,0x72098b4d,0xc631c631,0xbdefbdef,0xc631c631,0xc631c631,0xbdefbdef,0xb5adb5ad,0xb5adb5ad,0xa529b5ad,0xa4130000,0x6a8b624b,0xac558b8f,0x8b8fac55,0xac55ac55,0xa4138b8f,0x5a498b8f,0x0000a413, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x59854943,0x51454903,0x41034105,0x61854103,0x41036185,0x514330c1,0x30c34103,0x59855985,0x7a8d61c9,0x7a8d61c9,0x61c95a0b,0x9b5161c9,0x61c99b51,0x7a8d4145,0x414561c9,0x7a8d7a8d, +0x00000000,0x00000000,0x00000000,0x000005c5,0x00000000,0x00000000,0x00000000,0x00000000,0x05850000,0x00000000,0x00000000,0x3dc30000,0x00001d47,0x00000000,0x00000645,0x00000000,0x00000000,0x1d053c45,0x00000505,0x3cc51445,0x04850301,0x3cc50000,0x00000000,0x00000000,0x000005c3,0x13c34d83,0x02c13c85,0x7d410000,0x448533c3,0x4e0102c1,0x04830000,0x0b810000, +0x13c34cc5,0x2b0374c3,0x22816c43,0x5b830000,0x74830981,0x6c432241,0x5bc50000,0x00000a01,0x1a016c03,0x1a016c03,0x224163c5,0x63830000,0x5b850141,0x74830141,0x63830000,0x00003301,0x1a017403,0x11c16383,0x2a416bc5,0x6bc50000,0x42430901,0x6bc50941,0x63c50000,0x00000901,0x09416bc5,0x09017c43,0x09016383,0x63430000,0x63450901,0x5b450901,0x5b030000,0x00000901, +0x00000000,0x00000000,0x00000000,0x9bd30000,0x00003947,0x00000000,0x00000000,0x00000000,0x934fb495,0x8b4d7a89,0x934f8b4d,0xa411934f,0x934f82cb,0x42118b4d,0x18c7294b,0x72097209,0xc631c631,0xc631bdef,0xc631c631,0xce73c631,0xc631bdef,0xb5adbdef,0xa529bdef,0x9ce7a529,0x624b0000,0x5a498b8f,0x5a095a09,0x5a096a8b,0x624b624b,0x5a09624b,0x6a8bac55,0x0000624b, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x49436185,0x69c530c3,0x410369c5,0x410330c3,0x410369c5,0x514330c3,0x30c34103,0x598571c5,0x61c97a8d,0x9b514145,0x61c99b51,0x61c94145,0x61c99b51,0x7a8d4145,0x414561c9,0x7a8d9b51, +0x00000000,0x00000000,0x00000000,0x05450000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000685,0x00000000,0x3d830000,0x00000381,0x07050000,0x14450000,0x00000000,0x00000000,0x01c14505,0x02c13c45,0x5c030000,0x3cc50281,0x34050241,0x00000000,0x00000000,0x13c34d83,0x0b416483,0x02016cc3,0x64430000,0x75012b03,0x45430201,0x3c450000,0x00000241, +0x0a416403,0x224163c3,0x11c16c43,0x53450000,0x64030101,0x63c31a41,0x64030000,0x00000141,0x09815b83,0x09814b03,0x01414ac3,0x53030000,0x53030101,0x6c030101,0x5b850000,0x00000101,0x11815b45,0x00c15b43,0x09416385,0x4a830000,0x5b430941,0x5b030001,0x6bc50000,0x00000901,0x09416b83,0x19c15b03,0x00c16385,0x5b030000,0x5b030081,0x5b030081,0x63430000,0x00000041, +0x00000000,0x00000000,0x00000000,0x628d0000,0x00003145,0x00000000,0x00000000,0x00000000,0x7acb318d,0x7acb6249,0x728b728b,0x934d7acb,0x7acb6249,0x18c77acb,0x934d51c7,0x51c751c7,0xbdef4a53,0xbdefb5ad,0xb5adb5ad,0xb5adb5ad,0xb5ada529,0xb5adad6b,0xb5adbdef,0x9ce7a529,0x00000000,0x49c9624b,0x00000000,0x00000000,0x00000000,0x00000000,0x41874187,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x61856185,0x71c538c3,0x59855985,0x69c54903,0x41035985,0x69c54903,0x49435985,0x38c371c5,0x7a8d7a8d,0x9b514145,0x7a8d7a8d,0x9b5161c9,0x61c97a8d,0x9b5161c9,0x61c97a8d,0x41459b51, +0x00000000,0x000005c5,0x00000000,0x07050000,0x00000341,0x06050000,0x00000000,0x00000000,0x00000000,0x14c53e41,0x00000485,0x3d030000,0x05c50341,0x3cc50000,0x00000000,0x00000000,0x000004c5,0x02816483,0x01c15c03,0x6d010000,0x53c50981,0x64430281,0x04450000,0x00000000,0x0b413c05,0x12016483,0x1a416483,0x64830000,0x5c0311c1,0x5bc522c1,0x5c030000,0x000001c1, +0x094163c3,0x09415bc5,0x11c16403,0x64030000,0x534500c1,0x53450981,0x53850000,0x00000981,0x01015303,0x00015303,0x00014ac3,0x42830000,0x42830041,0x53450041,0x6c030000,0x000000c1,0x00815b43,0x00816385,0x00c16385,0x63850000,0x42830001,0x63850081,0x53030000,0x00000941,0x090152c3,0x00416b83,0x00c152c3,0x52c30000,0x42430041,0x63450041,0x4a830000,0x00000081, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x8b4d6b5b,0x8b4d7a89,0x934f8b4d,0xa451934f,0x934f7a89,0x934f934f,0xa453934f,0x6a07934f,0xc6318421,0xc631bdef,0xc631c631,0xce73c631,0xc631bdef,0xc631c631,0xc631bdef,0xad6bbdef,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0xa2c3a2c3,0xd3c5d3c5,0xd3c5a2c3,0xa2c3d3c5,0xd3c5a2c3,0xd3c5d3c5,0xd3c5a2c3,0xa2c3a2c3,0xa2d7c39d,0x9a95a2d7,0x71cfc41b,0x4909514b,0x80434909,0xa2d7c39d,0x490971cf,0x8211aad7, +0x624f5a4f,0x49cb3947,0x41493947,0x31053907,0x498b418b,0x6291498b,0x39074189,0x520d3105,0x7acbfdd7,0x73537acb,0x73537353,0x7acbfdd7,0x73537353,0xfdd77353,0xc451fdd7,0x73537acb,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x934fb495,0x938f8b4d,0xa451a451,0xa411a411,0xa4118b4d,0xa451a411,0xa451a411,0x6a07934f,0xc631d6b5,0xc631c631,0xce73ce73,0xce73ce73,0xce73c631,0xce73ce73,0xc631c631,0xa529b5ad,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe513a2c3,0xe513a2c3,0xd3c5e487,0xd3c5a2c3,0xa2c3e487,0xe487e487,0xd3c5e487,0xa2c3a2c3,0xa2d7c39d,0x8a534001,0x49091843,0x8043c39d,0x58014909,0x58019295,0x69496843,0xab19618d, +0x520d4189,0x624f6ad3,0x624f6a93,0x51cd7b15,0x39073947,0x62516251,0x31053105,0x49cd5a4f,0xffff7acb,0x49c5c451,0xfdd77353,0xffffc451,0x735349c5,0x7acbfdd7,0xfffffea7,0x49c5c451,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x934fb495,0x8b4d8b4d,0x8b4d8b4d,0x8b4d8b4d,0x934f934f,0x8b4d934f,0x934f7acb,0x6a07934f,0xc631d6b5,0xc631c631,0xc631c631,0xc631c631,0xbdefc631,0xbdefbdef,0xb5adb5ad,0xa529b5ad,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe513d3c5,0xa2c3e513,0xe487e487,0xe513a2c3,0xa2c3e487,0xe487e487,0xa2c3e513,0xd3c5d3c5,0x71cf598d,0x28858a53,0x80434909,0x5801c39d,0x10432043,0x58017a11,0x598d2885,0x8a953843, +0x498b6291,0x31056251,0x624f3907,0x5a4f3907,0x31055a4f,0x31058357,0x41494189,0x4149520d,0x7acb7acb,0x735349c5,0x73537acb,0x7acb49c5,0x735349c5,0x49c57353,0xc451c451,0x735349c5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x728b9b8f,0x62496209,0x62496249,0x7acb6249,0x62496249,0x62096209,0x728b6209,0x51c77acb,0xbdefc631,0xbdefbdef,0xbdefbdef,0xbdefb5ad,0xad6bb5ad,0xad6bad6b,0xad6bad6b,0x9ce7ad6b,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe487d3c5,0xe487e487,0xe487a2c3,0xe487a2c3,0xa2c3e487,0xd3c5e487,0xd3c5a2c3,0xd3c5e487,0x41097211,0x598d1043,0x69cfaad7,0xab97a2d7,0x490930c7,0x38c72885,0xbb5b4909,0x598d8843, +0x39074189,0x31057b15,0x62517b15,0x5a4f3105,0x3947418b,0x498b498b,0x41894189,0x93db49cb,0x49c57353,0xfdd77353,0x7acb7acb,0x49c57353,0xfdd77353,0x73537acb,0x49c549c5,0x49c57353,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x8b4db495,0x8b4d7a89,0x934f8b4d,0xa411934f,0x8b4d82cb,0x7acb8b4d,0xa4518b4d,0x72098b4d,0xc631ce73,0xc631bdef,0xc631c631,0xc631c631,0xb5adb5ad,0xb5adb5ad,0xbdefb5ad,0xa529b5ad,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3c5a2c3,0xe487e487,0xd3c5d3c5,0xe487a2c3,0xe487d3c5,0xa2c3e487,0xe513e487,0xa2c3d3c5,0xc39de521,0x598d8a8f,0x8a95c39d,0x20438a95,0x9295598d,0xab199253,0xab554109,0x598d7843, +0x418b51cd,0x72d56ad3,0x31053907,0x8357498b,0x6291418b,0x7b155a4f,0x41898357,0x5a4f51cd,0x73537353,0xc451fdd7,0xc451fea7,0x735349c5,0xc451fdd7,0x49c57acb,0x73537353,0x49c5fdd7,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x8b4dac51,0x8b4d6249,0x8b4d8b4d,0xa411934f,0x8b4d828b,0x8b4d8b4d,0xa4118b4d,0x6a078b4d,0xc631ce73,0xc631b5ad,0xc631c631,0xc631c631,0xb5adb5ad,0xb5adb5ad,0xbdefb5ad,0xa529b5ad,0x00000000,0x00000000,0x00000000,0xf8010000,0x0000f801,0x00000000,0x00000000,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa2c3a2c3,0xa2c3a2c3,0xa2c3e487,0x39413941,0xe487e487,0xe487a2c3,0xa2c3d3c5,0xa2c3a2c3,0x8a954801,0x598d71cf,0x600169cf,0x30c78a53,0xdc21bb5b,0x92958253,0x598d9291,0x28851043, +0x3907418b,0x62513907,0x51cd3105,0x6a913107,0x418b3947,0x31075a4f,0x72d36a91,0x41498b99,0x7acb7353,0xfea77acb,0xfea7ffff,0x735349c5,0xffffc451,0x49c549c5,0xfdd77353,0x49c5c451,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x7bdf0000,0x0000739d,0x00000000,0x00000000,0x00000000,0x934fb495,0x8b4d82cb,0x934f934f,0xa411934f,0x8b4d7a89,0x934f7acb,0xa453934f,0x7209934f,0xbdefc631,0xb5adb5ad,0xb5adb5ad,0xbdefb5ad,0xb5adad6b,0xb5adad6b,0xbdefb5ad,0xa529b5ad,0x00000000,0x00000000,0x00000000,0xfec1f801,0xf801fc41,0x00000000,0x00000000,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe487d3c5,0xe487e487,0x3941a2c3,0xb401e541,0xa2c33941,0xd3c5e487,0xe487a2c3,0xd3c5d3c5,0x8a535801,0x598d71cf,0x1843594b,0x514b30c7,0x604361cf,0x8a53b319,0x8a53618d,0x30435801, +0x6a913105,0x41893907,0x6a918357,0x39076a93,0x3947418b,0x31058357,0x6a916251,0x6a91418b,0x49c57353,0xc45149c5,0xc451fea7,0x735349c5,0x49c57acb,0x73537353,0xc4517acb,0x49c5ffff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x84210000,0x0000739d,0x00000000,0x00000000,0x00000000,0x7acb9bcf,0x934d728b,0x934d934d,0x938f934d,0x938f7acb,0x934d934d,0x934d934d,0x51c77acb,0xad6bb5ad,0xad6ba529,0xa529a529,0xa529a529,0xad6b9ce7,0xa529a529,0xa529a529,0x8c63a529,0x00000000,0x00000000,0x00000000,0xffe5f801,0xf801ffff,0x00000000,0x00000000,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3c5a2c3,0xe487d3c5,0x3941e487,0xe541b401,0x3941b401,0xa2c3a2c3,0xe487e487,0xd3c5e513,0x8a5371cf,0x514b2885,0xc39d9a95,0x41094909,0x2843618d,0x929530c7,0x30c75801,0x90854001, +0x62516293,0x41896a91,0x4189498b,0x49cb3105,0x6ad3520d,0x5a4f6251,0x62516251,0x72d33907,0x73537353,0x49c57353,0x7acb7acb,0x735349c5,0x735349c5,0x7acbfdd7,0x7acb7353,0x49c5fea7,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x7b0f0000,0x00006a8d,0x00000000,0x00000000,0x00000000,0x934fb495,0x934f934f,0x7acb934f,0x934f8b4d,0x8b4d934f,0x8b4d8b4d,0x934f934f,0x6a07934f,0xa529ad6b,0xa529a529,0x9ce7a529,0x9ce79ce7,0x9ce79ce7,0x9ce79ce7,0x94a59ce7,0x7bdf94a5,0x00000000,0x00000000,0x00000000,0xf8010000,0x0000a801,0x00000000,0x00000000,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa2c3d3c5,0xa2c3a2c3,0xa2c3a2c3,0xb4013941,0xa2c3e541,0xd3c5e487,0xa2c3a2c3,0xa2c3a2c3,0x104371cf,0x8843598d,0xab978043,0xa2d79b13,0x71cfb35b,0x4109514b,0x08432885,0xdd1fdc21, +0x9c1d6ad3,0x49cb72d3,0x62915a0f,0x3105498b,0x41894189,0x31056251,0x31053105,0x6251624f,0xc451fdd7,0x73537acb,0x7acb49c5,0x735349c5,0xfdd77353,0x7acbc451,0x735349c5,0x49c57acb,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x7b0f0000,0x000049c9,0x00000000,0x00000000,0x00000000,0x8b4dac51,0x7a897a89,0x82cb7a89,0x8b4d828b,0x7a897a89,0x62497a89,0x8b4d82cb,0x6a078b4d,0x9ce7a529,0x94a594a5,0x94a594a5,0x9ce794a5,0x8c6394a5,0x8c638c63,0x94a594a5,0x842194a5,0x00000000,0x00000000,0x00000000,0x93910000,0x00003947,0x00000000,0x00000000,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe513d3c5,0xe487e487,0xe487e487,0x3941a2c3,0xa2c3a2c3,0xa2c3e487,0xd3c5e487,0xd3c5d3c5,0x49097a11,0x8043c39d,0x30c76001,0x4001a2d7,0x8211e561,0x598dbc19,0xd3df514b,0x58015801, +0x520d4149,0x624f51cb,0x83577b15,0x39077b15,0x7b15520d,0x3947418b,0x31053105,0x6a914149,0xfffffdd7,0x49c5fea7,0x49c57353,0xfdd77353,0xc4517acb,0xc451ffff,0x735349c5,0x49c57acb,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x628d0000,0x00003947,0x00000000,0x00000000,0x00000000,0x8b4d318d,0x8b4d828b,0x934f934f,0xa4118b4d,0x8b4d7a89,0x8b4d8b4d,0xa4518b4d,0x6a078b4d,0x9ce74a53,0x9ce794a5,0x9ce79ce7,0x9ce79ce7,0x94a58c63,0x94a594a5,0x9ce794a5,0x7bdf94a5,0x00000000,0x00000000,0x00000000,0x93910000,0x00004189,0x00000000,0x00000000,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe487a2c3,0xa2c3d3c5,0xa2c3a2c3,0xa2c3e513,0xa2c3e487,0xd3c5e513,0xe487a2c3,0xd3c5e513,0x78434909,0x8a53ab55,0x104371cf,0x6843a2d7,0x71cf8a53,0x18437a11,0x4909618d,0x79cf7043, +0x41894189,0x72d36a93,0x31053105,0x418972d3,0x6a93498b,0x5a4f6a93,0x31056251,0x6a933105,0x7acb7acb,0x735349c5,0x73537353,0x73537353,0x7acb49c5,0x7acbc451,0x735349c5,0x735349c5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x6acf0000,0x00003947,0x00000000,0x00000000,0x00000000,0x728b6b5b,0x7acb6249,0x728b728b,0x938f728b,0x7acb6249,0x7acb7acb,0x934d728b,0x51c7728b,0x94a58421,0x94a58c63,0x8c6394a5,0x94a58c63,0x94a58c63,0x8c638c63,0x94a58c63,0x7bdf8c63,0x00000000,0x00000000,0x00000000,0x9bd50000,0x00004189,0x00000000,0x00000000,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa2c3a2c3,0xe487d3c5,0xa2c3e487,0xa2c3e487,0xd3c5e487,0xe487d3c5,0xd3c5a2c3,0xa2c3e487,0x3843598d,0x8253ab19,0x1843618d,0x58018a53,0x71cf9ad7,0x30432885,0x4909bb5b,0x30c73843, +0x6251520d,0x7b153947,0x31056251,0x49cb624f,0x39476251,0x6a9393db,0x6a93624f,0x498b8b99,0x49c57353,0x7acb7353,0x735349c5,0xfdd7fdd7,0x49c57353,0x49c57acb,0x7acb7353,0x73537353,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x6acf0000,0x00003947,0x00000000,0x00000000,0x00000000,0x934fb495,0x934f82cb,0x8b4d934f,0xa411934f,0x8b4d7a89,0x8b4d8b4d,0x938f8b4d,0x7209934f,0x94a594a5,0x94a58c63,0x94a594a5,0x9ce794a5,0x94a58c63,0x94a594a5,0x94a594a5,0x7bdf94a5,0x00000000,0x00000000,0x00000000,0x93930000,0x00003947,0x00000000,0x00000000,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3c5d3c5,0xe487d3c5,0xa2c3e487,0xa2c3e487,0xe487e513,0xe487a2c3,0xa2c3e487,0xd3c5e487,0xa2d7c39d,0x30c72885,0x18432885,0x580161cf,0x18434109,0x7043c39d,0x71cf8a53,0x598d8a8f, +0x72d33105,0x72d33105,0x62513107,0x4189624f,0x5a0f4189,0x6ad3498b,0x5a4f624f,0x51cd49cb,0x73537353,0xc451fdd7,0x735349c5,0x7acb49c5,0x7353ffff,0x735349c5,0xc451fdd7,0x49c57acb,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x7b0f0000,0x00006a8d,0x00000000,0x00000000,0x00000000,0x8b4dac93,0xa4537acb,0xa453a453,0xa411a453,0xa451934f,0xa411a451,0xa411a411,0x72098b4d,0x94a594a5,0x9ce78c63,0x9ce79ce7,0x9ce79ce7,0x9ce794a5,0x9ce79ce7,0x9ce79ce7,0x739d94a5,0x00000000,0x00000000,0x00000000,0x628d0000,0x00003987,0x00000000,0x00000000,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe487d3c5,0xe487e513,0xd3c5a2c3,0xa2c3d3c5,0xe487e513,0xa2c3d3c5,0xe487e487,0xd3c5a2c3,0x8253cbdf,0xcb9d618d,0xaad77843,0x1843598d,0x988561cf,0x5801b35b,0x58019ad7,0x30c77a11, +0x8b994149,0x3107624f,0x31053105,0x414972d3,0x7b155a0f,0x418b8357,0x4189498b,0x41894189,0xfdd77353,0xffffc451,0x49c5fea7,0x49c57353,0x49c5c451,0xfdd77353,0xffffc451,0x49c5c451,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x7b0f0000,0x00006a8d,0x00000000,0x00000000,0x00000000,0x934fb495,0x8b4d8b4d,0x934f8b4d,0x8b4d934f,0x934f934f,0x8b4d8b4d,0x934f934f,0x7209934f,0x94a594a5,0x94a594a5,0x94a594a5,0x94a594a5,0x94a594a5,0x94a594a5,0x94a594a5,0x739d94a5,0x00000000,0x00000000,0x00000000,0x9bd30000,0x00003947,0x00000000,0x00000000,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe487a2c3,0xd3c5e487,0xe487a2c3,0xa2c3d3c5,0xe487d3c5,0xa2c3e487,0xe487d3c5,0xa2c3e487,0x9295698d,0xab192043,0x69cf5801,0x38435801,0x38434909,0x6843ab97,0x8a5392d7,0x30c72885, +0x5a4f51cd,0x31058357,0x418b49cd,0x31078b99,0x7b154189,0x5a0f5a4f,0x41494149,0x7b1549cb,0x7acb7353,0xc4517acb,0x7acb7acb,0x735349c5,0x49c549c5,0x7acb7353,0x7acb7acb,0x49c57acb,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x93910000,0x0000628d,0x00000000,0x00000000,0x00000000,0x51c77acb,0x59c751c7,0x51c751c7,0x51c759c7,0x51c751c7,0x51c751c7,0x51c74987,0x51c751c7,0x7bdf8421,0x739d739d,0x739d739d,0x739d739d,0x739d739d,0x739d739d,0x739d739d,0x739d739d,0x00000000,0x00000000,0x00000000,0x628d0000,0x00003145,0x00000000,0x00000000,0x00000000, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa2c3a2c3,0xd3c5a2c3,0xd3c5a2c3,0xa2c3a2c3,0xd3c5d3c5,0xa2c3a2c3,0xd3c5d3c5,0xa2c3a2c3,0x698d69cf,0x38c74801,0x184358c5,0x38432885,0xab97a2d7,0x92914909,0x38c738c7,0x514b38c7, +0x5a0f8357,0x72d36a91,0x7b175a0f,0x3907498b,0x31053907,0x49cd5a0f,0x31053105,0x8b998357,0x49c57353,0x49c549c5,0x49c549c5,0x73537353,0x73537353,0x49c57353,0x49c549c5,0x49c549c5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x18851085,0x10851085,0x18c71885,0x10851085,0x18c718c7,0x10851043,0x18c718c7,0x10851085,0x39cf39cf,0x39cf39cf,0x42114211,0x39cf39cf,0x42114211,0x39cf39cf,0x42114211,0x39cf39cf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x28c31841,0x51c73103,0x31031041,0x10414987,0x28c328c3,0x390528c3,0x39053103,0x51c728c3,0xef77b5ad,0xef79ef79,0xbdedef79,0xdef5ef79,0xe779e6f5,0xffffffff,0xef39ffff,0xb5abef79,0xa2c3a2c3,0xa2c3d3c5,0xd3c5a2c3,0xa2c3d3c5,0xd3c5a2c3,0xa2c3a2c3,0xd3c5d3c5,0xa2c3a2c3,0xa2c3a2c3,0xa2c3d3c5,0xd3c5a2c3,0xa2c3d3c5,0xd3c5a2c3,0xa2c3a2c3,0xd3c5d3c5,0xa2c3a2c3, +0xa2c3a2c3,0xa2c3d3c5,0xf689e4c5,0xa2c3d3c5,0xd3c5a2c3,0xa2c3e4c5,0xd3c5d3c5,0xa2c3a2c3,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xc6310000,0xdef7def7,0xdef7def7,0xdef7def7,0xdef7def7,0xdef7def7,0xdef7def7,0x0000c631,0xc6310000,0xdef7def7,0xdef7def7,0x7901def7,0x60816081,0xdef7def7,0xdef7def7,0x0000c631, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x83110000,0x00008b8f,0x00000000,0x18c71885,0x21092109,0x18c720c7,0x18851885,0x10851085,0x18851085,0x10851043,0x18851885,0x42114211,0x4a534a53,0x42114211,0x42114211,0x39cf39cf,0x421139cf,0x39cf318d,0x421139cf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x28c31041,0x08013105,0x51871041,0x28c31041,0x10415187,0x518728c3,0x39051881,0x49871881,0xe779f779,0xdeb5def5,0xe779deb5,0xef39e779,0xef77e779,0xef79e779,0xef79ef77,0xef79f777,0xe513a2c3,0xa2c3e487,0xe487d3c5,0xd3c5e487,0xe487a2c3,0xa2c3e487,0xe487d3c5,0xa2c3e487,0xe513a2c3,0xa2c3e487,0xe487d3c5,0xd3c5e487,0xe487a2c3,0xa2c3e487,0xe487d3c5,0xa2c3e487, +0xe513a2c3,0xe4c5e487,0xffcff7cb,0xd3c5f6cd,0xf6cda2c3,0xe4c5ffcf,0xe487d3c5,0xa2c3e487,0xd6b50000,0xdef7def7,0xdef7def7,0xdef7def7,0xdef7def7,0xdef7def7,0xdef7def7,0x0000d6b5,0xc6310000,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0x0000c631,0x92470000,0xef7b7901,0x79017901,0x79017901,0x79017901,0x79017901,0x79017901,0x00009247, +0xa2890000,0xa289a289,0xa289a289,0xa289a289,0xa289a289,0xa289a289,0xa289a289,0x0000a289,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x520b0000,0xa529a529,0xa529a529,0x20c720c7,0x18851885,0x20c720c7,0x188518c7,0x20c718c7,0x18c718c7,0x210920c7,0x18c718c7,0x4a534211,0x42114211,0x4a534a53,0x42114211,0x4a534211,0x42114211,0x4a534a53,0x42114211,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x28c31001,0x104128c1,0x518728c3,0x28c31041,0x10415187,0x390528c3,0x39051881,0x51871881,0xefb9d6f7,0xef79e739,0xe6f5ef79,0xdeb5ef79,0xdeb7def5,0xb5ade779,0xe779ef79,0xdef5deb5,0xd3c5a2c3,0xa2c3e487,0xe487a2c3,0xe487e487,0xe513a2c3,0xa2c3e487,0xe487e487,0xa2c3e487,0xd3c5a2c3,0xa2c3e487,0x28012801,0xe487e487,0xe513a2c3,0xa2c32801,0xe487e487,0xa2c3e487, +0xd3c5a2c3,0xed85e487,0x48014801,0xf6cdffcf,0xffe5e4c5,0xed854801,0xe487f6cd,0xa2c3e487,0xdef70000,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7be8c7,0x0000def7,0xc6310000,0xc631ef7b,0xdef7c631,0xc631ef7b,0xdef7c631,0xc631ef7b,0xdef7c631,0x0000c631,0x92470000,0x81017901,0x79018101,0x81017901,0x79017901,0x81018101,0x79018101,0x00009247, +0xa2890000,0xa289bac9,0xbac9bac9,0xbac9bac9,0xbac9bac9,0xbac9bac9,0xbac9a289,0x0000a289,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xa529a529,0x6b5b6b5b,0x6b5b6b5b,0x18851885,0x20c718c7,0x18851885,0x20c71885,0x18851085,0x20c720c7,0x18851885,0x20c72109,0x39cf4211,0x4a534211,0x39cf4211,0x4a534211,0x421139cf,0x4a534a53,0x39cf4211,0x4a534a53,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x10413103,0x104128c3,0x39053905,0x28c31041,0x10415187,0x518728c3,0x51c71041,0x39051041,0xffffef79,0xb5ede779,0x10c541cf,0x398f20c9,0xf779ef39,0xefb9ef39,0xef79ef79,0xef79def5,0xd3c5a2c3,0xd3c5e487,0xe487a2c3,0xe513d3c5,0xe513a2c3,0xa2c3e487,0xe487e513,0xa2c3d3c5,0xd3c5a2c3,0xa2c3e487,0x40812801,0xe5132801,0x2801a2c3,0x28012801,0xe487a2c3,0xa2c3d3c5, +0xd3c5a2c3,0xe4c5f6cd,0xb50d4801,0xffe54801,0x4801ed85,0x48014801,0xf6cded85,0xa2c3d3c5,0xdef70000,0xdef7ef7b,0xd6b5def7,0xdef7def7,0xdef7def7,0xdef7ef7b,0xef7bdef7,0x0000def7,0xc6310000,0xa289c631,0xc631a289,0xa289c631,0xc631a289,0xa289c631,0xc631a289,0x0000c631,0x92470000,0x60816081,0x60816081,0x79018101,0x81018101,0x60816081,0x60816081,0x00009247, +0xa2890000,0xbac9bac9,0xbac9a289,0xa289bac9,0xbac9bac9,0xbac9a289,0xbac9bac9,0x0000a289,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0xa529a529,0x6b5b6b5b,0x5a4d4189,0x00000000,0x188518c7,0x18851085,0x18c718c7,0x10431043,0x18c71085,0x10851085,0x18c718c7,0x10431085,0x42114211,0x421139cf,0x42114211,0x318d39cf,0x421139cf,0x39cf39cf,0x42114211,0x39cf39cf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x104130c3,0x28c33103,0x39053905,0x28c33103,0x10413103,0x518730c3,0x51871041,0x39051041,0xef79ef39,0xb5adb5ad,0x39cddf35,0x20c939cf,0xe77939cf,0xd6f5def5,0xe6b5def5,0xdeb541cf,0xd3c5a2c3,0xd3c5e487,0xe513a2c3,0xe487d3c5,0xe487a2c3,0xa2c3d3c5,0xe487e513,0xa2c3d3c5,0xd3c5a2c3,0x2801a2c3,0x40814081,0xa2c34081,0x2801a2c3,0x40814081,0xa2c32801,0xa2c3d3c5, +0xd3c5a2c3,0x4801ed85,0xb54db54d,0xed85bd8d,0x4801ed85,0xb54dbd8d,0xed854801,0xa2c3d3c5,0xdef70000,0xe98def7b,0xef7be8c7,0xef7bef7b,0xe8c7ef7b,0xef7bd6b5,0xef7bef7b,0x0000def7,0x92470000,0xa289a289,0xa289aac9,0xa289a289,0xa289aac9,0xa289a289,0xa289aac9,0x00009247,0x92470000,0x79017901,0x71017901,0x60816081,0x60816081,0x71016081,0x79017901,0x00009247, +0xa2890000,0xbac9bac9,0xbac9bac9,0xbac9bac9,0xbac9a289,0xbac9bac9,0xbac9bac9,0x0000a289,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x83110000,0xa529520b,0x6b5b6b5b,0x00000000,0x8b8f49c9,0x00000000,0x10431085,0x20c71085,0x10431085,0x18851085,0x10431085,0x18851885,0x10851043,0x18851085,0x318d39cf,0x4a5339cf,0x318d39cf,0x39cf39cf,0x318d39cf,0x421139cf,0x39cf39cf,0x39cf39cf,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x28c33103,0x28c33103,0x28c35187,0x30c328c3,0x10413103,0x498528c3,0x39051041,0x28c31041,0x420f39cf,0xffffef79,0xf779ffff,0xffffef79,0xef79ffff,0xffffffff,0x39cfef79,0x18c518c7,0xe513a2c3,0xd3c5e487,0xe513a2c3,0xe487e487,0xe487a2c3,0xa2c3d3c5,0xe487e513,0xa2c3d3c5,0xe513a2c3,0x2801a2c3,0x40814081,0xa2c34081,0x2801a2c3,0x40814081,0xa2c34081,0xa2c3d3c5, +0xe513a2c3,0x4801a2c3,0xbdcdbd8d,0xa2c3bdcf,0x4801ed85,0xbdcdbdcf,0xed85bd8d,0xa2c3f689,0xdef70000,0xe8c7ef7b,0xef7be8c7,0xef7bef7b,0xef7bd6b5,0xdef7ef7b,0xef7bef7b,0x0000def7,0x92470000,0xbac9aac9,0xaac9bac9,0xbac9aac9,0xaac9bac9,0xbac9aac9,0xaac9bac9,0x00009247,0x92470000,0x81017901,0x79018101,0x81017901,0x79018101,0x81017901,0x79018101,0x00009247, +0xa2890000,0xa289bac9,0xbac9bac9,0xbac9bac9,0xbac9bac9,0xa289bac9,0xbac9bac9,0x0000a289,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x520b0000,0x6b5ba529,0x00000000,0x00000000,0x8311624b,0x00000000,0x21092109,0x18c720c7,0x18851885,0x18c71885,0x210920c7,0x188518c7,0x21092109,0x18c718c7,0x4a534a53,0x42114211,0x42114211,0x42114211,0x4a534211,0x42114211,0x4a534a53,0x42114211,0x00000000,0x00000000,0x00000000,0x50010000,0x00004801,0x00000000,0x00000000,0x00000000, +0x390528c3,0x31031881,0x28c14987,0x104128c3,0x10414985,0x20813905,0x39050801,0x31031041,0xe6f339cf,0xe739deb3,0xbdedef79,0xdeb5ef37,0xdef5d6f5,0xef39ef79,0xef39b5ad,0xef79ef39,0xe513a2c3,0xe487e487,0xe513a2c3,0xe487e487,0xe487a2c3,0xa2c3d3c5,0xe487d3c5,0xa2c3a2c3,0xe513a2c3,0x2801a2c3,0x40814081,0xa2c34081,0x2801a2c3,0x40814081,0x40814081,0xa2c3a2c3, +0xe513a2c3,0x4801a2c3,0xc60fbdcf,0xa2c3c64f,0x4801ed85,0xc60fc64f,0xbd8dbdcf,0xa2c3ed85,0xdef70000,0xef7bef7b,0xd6b5ef7b,0xef7bef7b,0xef7bef7b,0xef7be8c7,0xef7bdef7,0x0000def7,0x92470000,0xbac9bac9,0xbac9bac9,0xa289bac9,0xbac9bac9,0xbac9bac9,0xbac9a289,0x00009247,0x92470000,0x81018101,0x81018101,0x71018101,0x81018101,0x81018101,0x81017101,0x00009247, +0xa2890000,0xbac9bac9,0xa289bac9,0xbac9bac9,0xbac9bac9,0xbac9bac9,0xa289bac9,0x0000a289,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0xa5290000,0x5a4d6b5b,0x00008b8f,0x00000000,0x624b0000,0x00008b8f,0x18851885,0x21092109,0x18c718c7,0x20c720c7,0x10851085,0x20c718c7,0x18c718c7,0x20c720c7,0x39cf39cf,0x4a534a53,0x42114211,0x4a534a53,0x39cf39cf,0x4a534211,0x42114211,0x4a534a53,0x00000000,0x00000000,0x00000000,0x48010000,0x00002801,0x00000000,0x00000000,0x00000000, +0x51873103,0x31031041,0x104151c7,0x10415187,0x10015187,0x18813905,0x390528c3,0x31031041,0xbdade779,0xef77ffff,0xdef5ef39,0xe779def5,0xbdedffff,0xef79e779,0xdef5ffff,0xd6b7def5,0xe487a2c3,0xe487e487,0xe487a2c3,0xe487e487,0xe487a2c3,0xa2c3e487,0xe487d3c5,0xa2c3a2c3,0xe487a2c3,0xa2c3e487,0x40814081,0xa2c3a2c3,0xa2c3a2c3,0x40814081,0x40814081,0xa2c3a2c3, +0xe487a2c3,0xa2c3e487,0xc64fc60f,0xe4c5a2c3,0xa2c3e4c5,0xc64fce91,0xbdcdc60f,0xa2c3a2c3,0xdef70000,0xef7be8c7,0xdef7ef7b,0xe98def7b,0xd6b5e8c7,0xef7bdef7,0xef7bef7b,0x0000def7,0x92470000,0x92479247,0x92479247,0x92479247,0x92479247,0x92479247,0x92479247,0x00009247,0x92470000,0x60816081,0x60816081,0x60816081,0x60816081,0x60816081,0x60816081,0x00009247, +0xa2890000,0xbac9bac9,0xbac9bac9,0xbac9bac9,0xbac9a289,0xbac9bac9,0xbac9bac9,0x0000a289,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x6b5ba529,0x624b0000,0x8b8f8351,0x00000000,0x624b0000,0x00008311,0x18c718c7,0x10851085,0x18c720c7,0x18851085,0x18851085,0x10431085,0x18851885,0x10851085,0x42114211,0x39cf39cf,0x42114a53,0x39cf39cf,0x421139cf,0x39cf39cf,0x42114211,0x39cf39cf,0x00000000,0x00000000,0x00000000,0x7b0f0000,0x000049c9,0x00000000,0x00000000,0x00000000, +0x518728c3,0x31051041,0x10414985,0x104128c3,0x104128c3,0x10414985,0x31033103,0x39051041,0xdef5deb5,0xffffdeb5,0xef79ffff,0xfffff779,0xef79eef7,0xef39f779,0xefb9e779,0xdef5d6f5,0xe487a2c3,0xe487e487,0xd3c5a2c3,0xd3c5e487,0xe487a2c3,0xd3c5e487,0xe487a2c3,0xa2c3d3c5,0xe487a2c3,0xe487e487,0xa2c3a2c3,0xd3c5a2c3,0xa2c3a2c3,0xa2c3a2c3,0xa2c3a2c3,0xa2c3d3c5, +0xe487a2c3,0xffcff6cd,0xed85e4c5,0xd3c5e4c5,0xe4c5ed85,0xed85e4c5,0xed85e4c5,0xa2c3f689,0xdef70000,0xdef7ef7b,0xdef7ef7b,0xe8c7ef7b,0xdef7e8c7,0xe98ddef7,0xef7be8c7,0x0000def7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2890000,0xbac9bac9,0xbac9a289,0xbac9a289,0xbac9bac9,0xa289bac9,0xbac9bac9,0x0000a289,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x6b5ba529,0x00000000,0x8311624b,0x00008311,0x624b0000,0x00008311,0x18851085,0x20c71885,0x10431043,0x18c71885,0x18c71085,0x21092109,0x18c71885,0x21092109,0x421139cf,0x421139cf,0x39cf318d,0x42114211,0x421139cf,0x4a534a53,0x42114211,0x4a534a53,0x00000000,0x00000000,0x00000000,0x93910000,0x00003947,0x00000000,0x00000000,0x00000000, +0x51c728c3,0x28c31841,0x49853103,0x30c31041,0x100130c3,0x10414987,0x49873103,0x39051041,0xe739ef77,0xe779ef79,0xdef5def5,0xdef5b5ed,0xdef3b5ed,0xef79d6f5,0xef77efbb,0xef39f77b,0xd3c5a2c3,0xe487e487,0xd3c5a2c3,0xd3c5e487,0xe487a2c3,0xe487e487,0xe487a2c3,0xa2c3d3c5,0xd3c5a2c3,0x2801a2c3,0x2801a2c3,0xa2c3a2c3,0xa2c32801,0x2801a2c3,0x2801a2c3,0xa2c3d3c5, +0xf689a2c3,0x4801ed85,0x4801ed85,0xed85ed85,0xed854801,0x4801ed85,0x4801ed85,0xa2c3f7cb,0xdef70000,0xdef7ef7b,0xef7be8c7,0xef7bef7b,0xdef7ef7b,0xe8c7ef7b,0xef7be8c7,0x0000def7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2890000,0xbac9a289,0xbac9bac9,0xbac9bac9,0xbac9bac9,0xbac9bac9,0xa289bac9,0x0000a289,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0xa5290000,0x00006b5b,0x00000000,0x624b0000,0x8b8f8311,0x00000000,0x83515a09,0x20c720c7,0x18c718c7,0x20c72109,0x18c718c7,0x20c720c7,0x18c71885,0x188518c7,0x18851085,0x4a534a53,0x42114211,0x4a534a53,0x42114211,0x42114a53,0x42114211,0x42114211,0x421139cf,0x00000000,0x00000000,0x00000000,0x93910000,0x00004189,0x00000000,0x00000000,0x00000000, +0x39051041,0x30c31041,0x498728c3,0x28c11001,0x28c31041,0x104151c7,0x51c730c3,0x49871041,0xefb9b5ed,0xdef5deb3,0xb5addef5,0xef79ef79,0xef77ef79,0xffffffff,0xe739ef79,0xef7bffff,0xd3c5a2c3,0xe487e487,0xd3c5a2c3,0xa2c3e487,0xe487a2c3,0xe487e487,0xe487a2c3,0xa2c3d3c5,0xd3c5a2c3,0x28012801,0x28012801,0x28014081,0x40812801,0x28012801,0x28014081,0xa2c3a2c3, +0xf7cba2c3,0x48014801,0x48014801,0x4801d711,0xdf934801,0x48014801,0x4801ce4f,0xa2c3ed85,0xdef70000,0xdef7ef7b,0xef7bef7b,0xdef7d6b5,0xef7bef7b,0xef7bef7b,0xef7bdef7,0x0000def7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2890000,0xbac9bac9,0xbac9bac9,0xbac9bac9,0xbac9bac9,0xbac9a289,0xbac9bac9,0x0000a289,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83110000,0xa529520b,0x00006b5b,0x00000000,0x00000000,0x8311624b,0x00008b8f,0x6a8f4189,0x10851085,0x18c718c7,0x18851885,0x18c718c7,0x10851085,0x18c71085,0x10431043,0x18c71885,0x39cf39cf,0x42114211,0x39cf39cf,0x42114211,0x39cf39cf,0x421139cf,0x318d318d,0x421139cf,0x00000000,0x00000000,0x00000000,0x9bd50000,0x00004189,0x00000000,0x00000000,0x00000000, +0x39051041,0x28c31041,0x51873105,0x51871041,0x28c30801,0x104151c7,0x49873103,0x51c71041,0xef79ef79,0xe779e739,0xbdadef79,0xb5edb5ed,0xef79ef79,0xdef5d735,0xb5adb5ed,0xdef7def5,0xa2c3a2c3,0xe487e487,0xe513a2c3,0xa2c3e487,0xe487d3c5,0xe487d3c5,0xe513a2c3,0xa2c3e487,0xa2c3a2c3,0x40812801,0x40814081,0x40814081,0x40814081,0x40814081,0x40814081,0xa2c34081, +0xa2c3a2c3,0xc60f4801,0xced1c64f,0xdf51d711,0xdf51df93,0xced1d711,0xc60fc64f,0xed85bd8d,0xdef70000,0xdef7ef7b,0xef7bdef7,0xef7bef7b,0xe8c7e98d,0xef7bdef7,0xef7bdef7,0x0000def7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2890000,0xbac9bac9,0xbac9bac9,0xbac9a289,0xbac9a289,0xbac9bac9,0xbac9a289,0x0000a289,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83110000,0x6b5ba529,0x83515a4d,0x00008b8f,0x00000000,0x624b0000,0x6a8f624b,0x6b5b6b5b,0x18851885,0x10431043,0x20c720c7,0x10431085,0x18c71885,0x18c718c7,0x21092109,0x104318c7,0x39cf39cf,0x39cf318d,0x4a534a53,0x318d39cf,0x42114211,0x42114211,0x4a534a53,0x39cf4211,0x00000000,0x00000000,0x00000000,0x93930000,0x00003947,0x00000000,0x00000000,0x00000000, +0x51871001,0x28c31001,0x51873103,0x30c30801,0x28c31041,0x10414987,0x28c130c3,0x51871041,0xffffe77b,0xef7bffff,0xdef5d6f5,0xef79d735,0xe777ef79,0xef39ef7b,0xef79ef39,0x420f39cf,0xa2c3a2c3,0xe487e487,0xe513a2c3,0xa2c3e487,0xe487d3c5,0xe487e487,0xe513a2c3,0xa2c3e487,0xa2c3a2c3,0x2801a2c3,0xa2c34081,0x40814081,0x4081a2c3,0x40814081,0x4081a2c3,0xa2c34081, +0xa2c3a2c3,0x4801e4c5,0xe4c5c64f,0xd711ced1,0xd711e4c5,0xce91ced1,0xbdcfa2c3,0xed85bd8d,0xdef70000,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xe8c7e8c7,0xdef7def7,0xef7bdef7,0x0000def7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2890000,0xa289bac9,0xa289bac9,0xbac9bac9,0xbac9bac9,0xbac9bac9,0xbac9bac9,0x0000a289,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b5ba529,0x5a094189,0x8311624b,0x8b8f8b8f,0x00000000,0x6b5b4189,0xa529a529,0x18c718c7,0x210920c7,0x18c720c7,0x188518c7,0x18851043,0x20c718c7,0x18851885,0x210920c7,0x42114211,0x4a534a53,0x42114a53,0x42114211,0x4211318d,0x4a534211,0x42114211,0x4a534a53,0x00000000,0x00000000,0x00000000,0x628d0000,0x00003987,0x00000000,0x00000000,0x00000000, +0x31031041,0x310328c3,0x390528c3,0x31031881,0x28c33103,0x104128c3,0x498530c3,0x100151c7,0xdef539cf,0xefb7d6f5,0xef77ef79,0xb5abe77b,0xef79def5,0xef39ef39,0x39d141cf,0x18c518c7,0xa2c3a2c3,0xd3c5e487,0xe487a2c3,0xa2c3e487,0xe487d3c5,0xd3c5e487,0xe513a2c3,0xa2c3e487,0xa2c3a2c3,0x2801a2c3,0xe487a2c3,0xa2c34081,0xe487a2c3,0x4081e487,0xe513a2c3,0xa2c3a2c3, +0xa2c3a2c3,0x4801a2c3,0xe487e4c5,0xe4c5ce91,0xe487a2c3,0xc64ff6cd,0xe513a2c3,0xa2c3a2c3,0xdef70000,0xe8c7ef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7bef7b,0x0000def7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2890000,0xbac9bac9,0xbac9bac9,0xa289bac9,0xbac9bac9,0xbac9a289,0xbac9bac9,0x0000a289,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b5ba529,0x00000000,0x624b0000,0x624b624b,0x6a8f8b8f,0xa5296b5b,0x8311520b,0x20c720c7,0x18851885,0x18c720c7,0x18c718c7,0x20c72109,0x10851085,0x18c718c7,0x10851885,0x4a534a53,0x42114211,0x42114a53,0x42114211,0x42114a53,0x39cf39cf,0x42114211,0x39cf39cf,0x00000000,0x00000000,0x00000000,0x9bd30000,0x00003947,0x00000000,0x00000000,0x00000000, +0x28c31001,0x10414987,0x39053103,0x10411881,0x28c34985,0x10015187,0x390528c3,0x28c31041,0x39cf18c7,0xef7931cf,0xffffef79,0xffffffff,0xdef5ef39,0x39cf39cf,0xdef7bdad,0x18871907,0xd3c5a2c3,0xd3c5e487,0xe487a2c3,0xa2c3e487,0xe513a2c3,0xa2c3e487,0xe487a2c3,0xa2c3e487,0xd3c5a2c3,0xd3c5e487,0xe487a2c3,0xa2c3e487,0xe513a2c3,0xa2c3e487,0xe487a2c3,0xa2c3e487, +0xd3c5a2c3,0xd3c5e487,0xe487a2c3,0xa2c3e487,0xe513a2c3,0xa2c3e487,0xe487a2c3,0xa2c3e487,0xd6b50000,0xdef7def7,0xdef7def7,0xdef7def7,0xdef7def7,0xdef7def7,0xdef7def7,0x0000d6b5,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2890000,0xa289a289,0xa289a289,0xa289a289,0xa289a289,0xa289a289,0xa289a289,0x0000a289,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b5ba529,0x00000000,0x00000000,0x00000000,0x418949c9,0xa5296b5b,0x00008311,0x10851085,0x18c720c7,0x18851085,0x20c720c7,0x18851885,0x20c718c7,0x10851085,0x20c720c7,0x39cf39cf,0x42114a53,0x39cf39cf,0x4a534a53,0x39cf4211,0x4a534211,0x39cf39cf,0x4a534211,0x00000000,0x00000000,0x00000000,0x628d0000,0x00003145,0x00000000,0x00000000,0x00000000, +0x28c328c3,0x10413905,0x28c328c1,0x104128c3,0x310328c3,0x080128c3,0x28c328c3,0x390528c3,0xef79ef39,0x39cfef79,0xdef5def5,0xef79e6f7,0xef7bef79,0xe6f5d6b5,0xffffdeb5,0xf779ffff,0xa2c3a2c3,0xd3c5d3c5,0xa2c3a2c3,0xa2c3d3c5,0xd3c5a2c3,0xa2c3a2c3,0xd3c5d3c5,0xa2c3a2c3,0xa2c3a2c3,0xd3c5d3c5,0xa2c3a2c3,0xa2c3d3c5,0xd3c5a2c3,0xa2c3a2c3,0xd3c5d3c5,0xa2c3a2c3, +0xa2c3a2c3,0xd3c5d3c5,0xa2c3a2c3,0xa2c3d3c5,0xd3c5a2c3,0xa2c3a2c3,0xd3c5d3c5,0xa2c3a2c3,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b5ba529,0x00000000,0x00000000,0x00000000,0x00000000,0xa5296b5b,0x00000000,0x99499149,0x91499149,0xa98ba14b,0x99499149,0xa94ba94b,0x91498909,0xa14ba14b,0x89099149,0xd3a5d3a3,0xd363d361,0xdca9dc27,0xd3a3d3a3,0xdc69dc69,0xd361cadf,0xdc27dc27,0xcb1fd361,0x84218421,0x84218421,0x84218421,0x94a594a5,0x94a57bdf,0x84218421,0x84218421,0x84218421, +0x9ce70000,0x4a530000,0x9ce70000,0x00004a53,0x00009ce7,0x4a539ce7,0x9ce70000,0x9ce70000,0x9ce7318d,0x4a53318d,0x9ce7318d,0x318d4a53,0x318d9ce7,0x4a539ce7,0x9ce7318d,0x9ce7318d,0x80438043,0x88438043,0x80438003,0x90438843,0x80438883,0x80438003,0x88438043,0x80438845,0x78418043,0x90c98041,0x888590c7,0x70018043,0xad6bb5ab,0xce31be2f,0x9d27b5ad,0xb5ab9ce7, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x83110000,0x6b5ba529,0x72cd5a4d,0xa413a413,0xac55ac55,0x6a8f8351,0xa5296b5b,0x00008311,0xa94ba14b,0xb98bb98b,0xa94bb18b,0x9949994b,0x89099149,0x99499949,0x89098109,0xa14b9949,0xdc69dc27,0xe56fe52d,0xdc69dceb,0xd3e5d3e5,0xcb1fd363,0xd3e5d3a3,0xd321ca9d,0xdc27d3a5,0xad6b8421,0xb5adb5ad,0xb5adb5ad,0xb5adb5ad,0xb5ada529,0xb5adb5ad,0xad6b9ce7,0x8421ad6b, +0x8c639ce7,0x4a538c63,0x9ce7318d,0x318d0000,0x9ce70000,0x4a538c63,0x00000000,0x8c630000,0x8c639ce7,0x4a538c63,0x9ce7318d,0x318d318d,0x9ce7318d,0x4a538c63,0x318d318d,0x8c63318d,0x80438043,0x90858885,0x90859085,0x98879085,0x88459885,0x98878843,0xa0c7a0c7,0xa0c9a087,0x98c5a109,0x99098803,0x88439949,0x70018003,0xd6b5c633,0xf7bde77b,0xbdadd6b5,0x9d29b56b, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x4a530000,0x4a534a53,0x4a534a53,0x00004a53,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x520b0000,0x6b5ba529,0x520b41c9,0x624b624b,0x624b624b,0x418949c9,0xa5296b5b,0x0000520b,0xb18bb18b,0xa14b9949,0xb18bb18b,0x9949a14b,0xb18ba94b,0xa94ba94b,0xb98bb18b,0xa94ba94b,0xe4ebdceb,0xdc27d3e5,0xe4ebe4ed,0xd3e5dc27,0xe4ebdc69,0xdc69dc69,0xe52de52d,0xdc69dc69,0x9ce78421,0xa529a529,0xa5299ce7,0xa529a529,0xa529b5ad,0xad6bad6b,0xb5adad6b,0x8421ad6b, +0x9ce70000,0x42110000,0x00009ce7,0x00009ce7,0x00009ce7,0x42119ce7,0x9ce70000,0x9ce74a53,0x9ce7318d,0x318d318d,0x318d9ce7,0x318d9ce7,0x318d9ce7,0x318d9ce7,0x9ce7318d,0x9ce74a53,0x88438043,0xb18da94b,0xa98da98d,0xb18db1cd,0xa14ba98d,0xa94ba14b,0xb1cfb1cf,0xb1cfb1cf,0xa98db1cf,0xba5590c5,0xa109b211,0x68017803,0xf7bdc671,0xffffffff,0xd675f7bf,0xa4e7b5ab, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x4a530000,0xc6314a53,0xc631c631,0xc631c631,0x4a53c631,0x00004a53,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b5ba529,0x00000000,0x00000000,0x00000000,0x00000000,0xa5296b5b,0x00000000,0x9949a14b,0xb18ba94b,0x99499949,0xb18ba14b,0x994b9149,0xb18bb18b,0x9949a14b,0xb18bb98b,0xd3a5dc27,0xe4ebdca9,0xd3a5d3e5,0xe4ebdc27,0xd3e5d3a3,0xe4ebe4eb,0xd3a5dc27,0xe4ebe56f,0xb5ad8421,0xad6bad6b,0x9ce7ad6b,0xb5adad6b,0xad6bad6b,0xa529a529,0xa529a529,0x8421a529, +0x00009ce7,0x00009ce7,0x9ce70000,0x00005295,0x00008c63,0x318d4a53,0x4a539ce7,0x00009ce7,0x318d9ce7,0x318d9ce7,0x9ce7318d,0x318d5295,0x318d8c63,0x318d4a53,0x4a539ce7,0x318d9ce7,0x90458043,0xa98da98b,0xa98da98d,0xb18da98d,0xa98da98d,0xa14ba94b,0xb18da94d,0xb18db18d,0xa98ba98d,0xc2959087,0x990bb211,0x70018043,0xffffce73,0xffffffff,0xe739f7bd,0x9ce9bdef, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x4a530000,0xc6314a53,0xef7bc631,0xef7be8c7,0xef7bef7b,0xc631ef7b,0x4a53c631,0x00004a53,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b5ba529,0x00000000,0x00000000,0x00000000,0x00000000,0xa5296b5b,0x00000000,0xa14ba94b,0xa14b9149,0xa94ba98b,0x81098909,0xa14b9949,0x91499949,0xa98ba98b,0x89099149,0xdc27dc69,0xdc27d3a3,0xdca9dca9,0xca9dcadf,0xdc27d3a5,0xd321d3a3,0xdca9dca9,0xcadfd361,0xb5ad8421,0xa529b5ad,0xa529a529,0x94a594a5,0x94a594a5,0xb5adb5ad,0xb5adb5ad,0x7bdfb5ad, +0x00004a53,0x8c630000,0x00009ce7,0x4a539ce7,0x9ce78c63,0x00000000,0x9ce70000,0x00004211,0x318d4a53,0x8c63318d,0x318d9ce7,0x4a539ce7,0x9ce78c63,0x318d318d,0x9ce7318d,0x318d318d,0x98878041,0xa94ba94d,0xa14b9909,0xa14ba94b,0xa14ba94b,0x9909990b,0x99099909,0x990b9909,0x90c7994b,0xba959085,0x9107b211,0x70017843,0xffffd6b5,0xffbfffff,0xf77bef3b,0xa529ce33, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xc6314a53,0xe8c7c631,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7be8c7,0xc631ef7b,0x4a53c631,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83110000,0x6b5ba529,0x83516acf,0x8b8fac55,0x8b8f8b8f,0x6acf624b,0xa5296b5b,0x00008311,0x89098909,0xb18b9149,0x81099149,0x99499149,0x81099149,0x99499949,0x99498909,0x99499149,0xcadfd321,0xe4ebd3a3,0xca9dd3a3,0xd3a5d3a3,0xca9dd3a3,0xd3e5d3a5,0xd3a3cb1f,0xd3e5d363,0xa5298421,0xad6bad6b,0x94a5ad6b,0x7bdf8421,0x84217bdf,0xad6bc631,0xa529a529,0x84219ce7, +0x00004a53,0x4a538c63,0x00004a53,0x4a530000,0x318d9ce7,0x4a539ce7,0x4a539ce7,0x00009ce7,0x318d4a53,0x4a538c63,0x318d4a53,0x4a53318d,0x318d9ce7,0x4a539ce7,0x4a539ce7,0x318d9ce7,0x98c78043,0xb18fb1cf,0x990998c9,0x908798c7,0x888788c7,0x80838845,0x808580c5,0x88858887,0x88858883,0xc2d59085,0x8085a10b,0x68017843,0xf7bdd6b7,0xf7bdffbd,0xef7bef7b,0xb5add6b5, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xc6314a53,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xef7be8c7,0xef7bef7b,0xef7be8c7,0x4a53c631,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x520b0000,0x6b5ba529,0x49c94189,0x624b5a09,0x624b624b,0x41895a09,0xa5296b5b,0x0000520b,0xb98bb98b,0xa94ba98b,0xa14ba14b,0xa14ba14b,0xb98bb18b,0x994ba94b,0xb98bb98b,0xa14ba94b,0xe56fe52d,0xdca9dceb,0xdc27dc27,0xdc27dc27,0xe56fdceb,0xd3e5dc69,0xe56fe56f,0xdc27dc69,0xb5ad94a5,0xad6bad6b,0x94a5ad6b,0x500194a5,0xb5ad5001,0xad6bce73,0xb5adb5ad,0x7bdfb5ad, +0x9ce74211,0x8c638c63,0x00004a53,0x00009ce7,0x9ce74211,0x00004a53,0x4a538c63,0x9ce70000,0x9ce7318d,0x8c638c63,0x318d4a53,0x318d9ce7,0x9ce7318d,0x318d4a53,0x4a538c63,0x9ce7318d,0x90858043,0x994bb1cd,0x90c590c7,0x88859087,0x88838885,0x80858885,0x88c58885,0x88858885,0x90858885,0xcb199085,0x80839909,0x68017001,0xf77dd6b5,0xef7df7bd,0xe77def7b,0xb5afd675, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xc6314a53,0xef7bc631,0xef7be8c7,0xef7bef7b,0xef7bef7b,0xef7bef7b,0xc631ef7b,0x4a53c631,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b5ba529,0x00000000,0x00000000,0x00000000,0x00000000,0xa5296b5b,0x00000000,0x99499949,0xb98bb98b,0xa94ba94b,0xb18bb18b,0x99499149,0xb18ba94b,0xa94ba94b,0xb18bb18b,0xd3a5d3a5,0xe56fe52d,0xdc69dc69,0xe4ebe4eb,0xd3a3d363,0xe4ebdca9,0xdc69dc69,0xe4ebe4eb,0xad6b8421,0xa529ad6b,0x842194a5,0x500194a5,0xb5ad4001,0xc631a529,0xa529a529,0x8421ad6b, +0x318d0000,0x00009ce7,0x9ce7318d,0x9ce70000,0x00009ce7,0x00009ce7,0x00008c63,0x00009ce7,0x318d318d,0x318d9ce7,0x9ce7318d,0x9ce7318d,0x318d9ce7,0x318d9ce7,0x318d8c63,0x318d9ce7,0x90458043,0x88859909,0x88858083,0x80858085,0x88858887,0x88858885,0x88858887,0x88858885,0x88878885,0xba538843,0x808590c7,0x68017001,0xefbbd6f7,0xef7df7bd,0xef7bef7b,0xb5adceb3, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce734a53,0xc631ef7b,0xef7bc631,0xef7bef7b,0xef7be8c7,0xc631ef7b,0xbdefc631,0x4a53bdef,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b5ba529,0x00000000,0x00000000,0x00000000,0x00000000,0xa5296b5b,0x00000000,0xa94ba94b,0x99498909,0xa94bb18b,0x99499149,0x99499949,0x89099949,0x994ba14b,0x91499149,0xdc69dc69,0xd3a5d321,0xdc69e4eb,0xd3a5d3a3,0xd3e5d3a5,0xcb1fd3a3,0xd3e5dc27,0xd321d361,0xb5ad8421,0x9ce7b5ad,0x842194a5,0x500194a5,0xb5ad2801,0xce739ce7,0xb5adb5ad,0x94a5b5ad, +0x9ce70000,0x9ce74a53,0x0000318d,0x4a539ce7,0x00004a53,0x9ce70000,0x9ce74a53,0x9ce70000,0x9ce7318d,0x9ce74a53,0x318d318d,0x4a539ce7,0x318d4a53,0x9ce7318d,0x9ce74a53,0x9ce7318d,0x90458043,0x88879907,0x88858887,0x90858885,0x88858885,0x88858885,0x88858885,0x888588c5,0x88858885,0xb1cf8843,0x808590c7,0x68017003,0xf7bdd6b5,0xef7df7bb,0xef7bef7b,0xb56dce75, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce7338c3,0xef7bef7b,0xc631ef7b,0xc631c631,0xc631c631,0xbdefc631,0xbdefbdef,0x38c3bdef,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83110000,0x6b5ba529,0x83516acf,0x8b8f8b8f,0x8b8f8b8f,0x6a8fa413,0xa5296b5b,0x00008311,0x994b9949,0xb18b9949,0x89098109,0xa14b994b,0xa94b9149,0xb98bb98b,0xa94ba14b,0xb98bb98b,0xd3e5d3a5,0xdcebd3e5,0xcadfcadf,0xdc67d3e5,0xdc69d3a3,0xe56fe56f,0xdc69dc27,0xe52de56f,0xa5298421,0x94a5a529,0xa5298421,0x580194a5,0xb5ad2801,0x9ce7a529,0xa529ce73,0x8421b5ad, +0x42119ce7,0x4a538c63,0x9ce70000,0x9ce70000,0x00004211,0x00009ce7,0x00004a53,0x4a539ce7,0x318d9ce7,0x4a538c63,0x9ce7318d,0x9ce7318d,0x318d318d,0x318d9ce7,0x318d4a53,0x4a539ce7,0x90858003,0x90c79907,0x88858885,0x80878885,0x88858885,0x88858885,0x88838885,0x888590c5,0x80858885,0xb1cf8843,0x888598c7,0x68017001,0xf77dd6b5,0xef7def7d,0xef7bef7b,0xb5add673, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x924738c3,0xef7bce73,0xef7bef7b,0xce73ce73,0xbdefce73,0xbdefbdef,0xa289bdef,0x38c39247,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x520b0000,0x6b5ba529,0x49c94189,0x624b5a09,0x624b624b,0x41c9624b,0xa5296b5b,0x0000520b,0xb18bb18b,0xa94ba94b,0xb18bb98b,0xa94ba94b,0xb18bb18b,0xa14b9949,0xa14ba94b,0xa14b9149,0xe4ebe4eb,0xdc69dc69,0xe4ebe56f,0xdc69dc69,0xdcebe4eb,0xdc27d3e5,0xdc27dc69,0xdc27d361,0xad6b8421,0x94a5b5ad,0x9ce78421,0x580194a5,0xb5ad2801,0xa529a529,0xad6bce73,0x8421ad6b, +0x00008c63,0x42110000,0x4a539ce7,0x00000000,0x9ce70000,0x9ce74a53,0x9ce70000,0x4a53318d,0x318d8c63,0x318d318d,0x4a539ce7,0x318d318d,0x9ce7318d,0x9ce74a53,0x9ce7318d,0x4a53318d,0x88858043,0x90c79909,0x80858085,0x88858085,0x88878085,0x88878885,0x88858885,0x88859085,0x88858885,0xb1cf8043,0x88879107,0x68017801,0xe6f9c631,0xef7bef7b,0xdf39ef7b,0xad6bc631, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x924738c3,0xa289a289,0xce73ef7b,0xce73ce73,0xbdefce73,0xbdefbdef,0xa289a289,0x38c39247,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b5ba529,0x00000000,0x00000000,0x00000000,0x00000000,0xa5296b5b,0x00000000,0x91499149,0xa14ba14b,0x99499949,0xa94ba98b,0x91499149,0xa94b9949,0x89098909,0xa94b9949,0xd3a3d361,0xdc67dc67,0xd3a5d3a5,0xdc69dca9,0xd3a3d363,0xdc69d3a5,0xcadfcadf,0xdc69d3e5,0xad6b7bdf,0x842194a5,0x9ce7a529,0x480194a5,0xb5ad2801,0x9ce7a529,0xce73a529,0x7bdfb5ad, +0x00000000,0x00009ce7,0x4a538c63,0x9ce70000,0x00004a53,0x8c639ce7,0x4a530000,0x42110000,0x318d318d,0x318d9ce7,0x4a538c63,0x9ce7318d,0x318d318d,0x8c639ce7,0x4a53318d,0x318d318d,0x90838041,0x888598c7,0x80858083,0x80438085,0x80437845,0x88858085,0x80858045,0x78457883,0x80837843,0xa98d7001,0x888590c7,0x68017041,0xdef7c631,0xef79deb7,0xd671def7,0xad6bb5ad, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x924738c3,0xbac9bac9,0xa289aac9,0xa289c631,0xa289a289,0xaac9bdef,0xa289a289,0x38c39247,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b5ba529,0x00000000,0x00000000,0x00000000,0x00000000,0xa5296b5b,0x00000000,0x99499949,0x89098109,0xb18bb18b,0x81099149,0xa98ba14b,0xa94ba14b,0xb98bb98b,0x8909a94b,0xd3a5d3a5,0xcadfcadf,0xe4ede4eb,0xca9dd321,0xdca9dc27,0xdc69dc27,0xe56fe56f,0xcb1fdc69,0xa5298421,0x842194a5,0xa5299ce7,0x480194a5,0xb5ad2801,0xad299ce7,0xc631a529,0x8421a529, +0x8c634211,0x9ce78c63,0x9ce78c63,0x9ce7318d,0x9ce7318d,0x9ce70000,0x4a530000,0x0000318d,0x8c63318d,0x9ce78c63,0x9ce78c63,0x9ce7318d,0x9ce7318d,0x9ce7318d,0x4a53318d,0x318d318d,0x90437843,0x888590c7,0x80858885,0x78837845,0x80457883,0x78857845,0x80458045,0x80438083,0x80837885,0xa98b7001,0x8085a14b,0x68017003,0xdeb7c631,0xdef7def7,0xce73d6b5,0xad6bb5ad, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x38c30000,0x924738c3,0xbac99247,0xaac9bac9,0xaac9aac9,0x9247aac9,0x92479247,0x000038c3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83110000,0x6b5ba529,0x83515a4d,0x8b8fac55,0xac55ac55,0x6a8f8b8f,0xa5296b5b,0x00008311,0xa94ba94b,0xb98bb18b,0xa94bb18b,0x9949a14b,0xa14b8109,0xb18ba94b,0xa14ba14b,0xb98bb18b,0xdc69dc69,0xe56fe52d,0xdc69e4eb,0xd3e5dc27,0xdc27cadf,0xe4ebdc69,0xdc27dc27,0xe52de4eb,0xb5ad8421,0xb5ada529,0xa5299ce7,0x400194a5,0xb5ad2001,0xce73ad29,0xad6bce73,0x94a5b5ad, +0x0000318d,0x00009ce7,0x00009ce7,0x4a539ce7,0x00000000,0x4a539ce7,0x42110000,0x00009ce7,0x318d318d,0x318d9ce7,0x318d9ce7,0x4a539ce7,0x318d318d,0x4a539ce7,0x318d318d,0x318d9ce7,0x88418003,0x88858885,0x88858885,0x80457885,0x80838085,0x80457845,0x78858085,0x80858083,0x80858085,0xa98b7801,0x808598c7,0x68017001,0xdef7ceb3,0xce73deb5,0xdeb7c6b3,0xb5adce33, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x38c30000,0x924738c3,0x92479247,0x92479247,0x38c39247,0x38c338c3,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x520b0000,0x6b5ba529,0x49c94189,0x5a096a8b,0x624b624b,0x4189624b,0xa5296b5b,0x0000520b,0xb18bb18b,0x994ba14b,0xa14bb18b,0xa94ba94b,0xb18bb98b,0x99499949,0xa94ba14b,0x91499949,0xe4ede4ed,0xd3e5dc27,0xdc27e4eb,0xdca9dc69,0xdcebe56f,0xd3a5d3a3,0xdc69dc27,0xd363d3a5,0xad6b8421,0xa529ad6b,0xb5ada529,0xc631b5ad,0xc631c631,0xb5adce73,0xa529ad6b,0x8421a529, +0x9ce74211,0x9ce70000,0x9ce74a53,0x42110000,0x00004a53,0x00008c63,0x9ce7318d,0x9ce70000,0x9ce7318d,0x9ce7318d,0x9ce74a53,0x318d318d,0x318d4a53,0x318d8c63,0x9ce7318d,0x9ce7318d,0x80438043,0x80437803,0x80418043,0x80858083,0x80857845,0x78038083,0x78417801,0x80437843,0x80038003,0x98857801,0x78038885,0x70017003,0xd673d6b3,0xb5adc5f1,0xce73b5af,0xb5edd6b5, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x38c30000,0x38c338c3,0x38c338c3,0x000038c3,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b5ba529,0x00000000,0x00000000,0x00000000,0x00000000,0xa5296b5b,0x00000000,0x91498909,0xa14bb18b,0x99499149,0xb18bb18b,0x9949a14b,0xb18ba94b,0x91499149,0xb18bb18b,0xd3a3cb1f,0xdc27e4eb,0xd3a5d363,0xe52de4eb,0xd3a5dc27,0xe4ebdc69,0xd3a3d363,0xe4ebdceb,0x84218421,0x84218421,0x94a57bdf,0x84218c63,0x84218421,0x84218421,0x84218421,0x84218421, +0x4a530000,0x318d0000,0x4a539ce7,0x00009ce7,0x9ce74a53,0x8c630000,0x0000318d,0x00008c63,0x4a53318d,0x318d318d,0x4a539ce7,0x318d9ce7,0x9ce74a53,0x8c63318d,0x318d318d,0x318d8c63,0x80418043,0x80438043,0x80437841,0x80438043,0x80438043,0x80038041,0x80438001,0x80438043,0x80438003,0x80037841,0x78018043,0x68017003,0xb5adb5af,0xa569b5ab,0xb5adad6b,0xbdafb5ad, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x1a671aed,0x12b11a67,0x12b11af1,0x22632263,0x1aad1aa9,0x2a631a69,0x22a52a63,0x122d2a61,0x32453205,0x32053205,0x3a873247,0x32453205,0x3a873a87,0x32053205,0x3a473a47,0x32053205,0x358b354b,0x354b354b,0x3e4d3dcb,0x358b354b,0x3e0d3e0d,0x354b350b,0x3e0b3e0b,0x350b354b,0x84218421,0x84218421,0x84218421,0x94a594a5,0x94a57bdf,0x84218421,0x84218421,0x84218421, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x80438043,0x80418003,0x80438003,0x80858043,0x78858045,0x80438083,0x80438043,0x80457885,0x80038043,0x80037843,0x80418043,0x80858043,0x78858085,0x80858045,0x78437843,0x80458085,0x80018043,0x80417801,0x8043994b,0x68018043,0xce75b5ad,0xce73ceb3,0xbdedb5ef,0xb5adb5af, +0xceb3bdad,0xce73ce73,0xbdedb5ef,0xbdadb5ad,0xceb5b5ad,0xce73ce75,0xbdafbdad,0xb5edb5ad,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x1a6d19f1,0x3be91ab1,0x123522ef,0x1aa71a2b,0x1aad1aa9,0x09af09af,0x1a271a67,0x122d122d,0x3a873247,0x42c73ac7,0x3a873a87,0x32453247,0x32053205,0x32453245,0x320529c5,0x32473245,0x3e0d3dcb,0x4e914e4f,0x3e0d3e4d,0x3dcb3dcb,0x350b354b,0x3dcb358b,0x350b2cc9,0x3dcb358b,0xad6b8421,0xb5adb5ad,0xb5adb5ad,0xb5adb5ad,0xb5ada529,0xb5adb5ad,0xad6b9ce7,0x8421ad6b, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x88c58043,0x88858885,0x88858885,0x80838885,0x80458085,0x80858045,0x88c58845,0x80458885,0x88858043,0x888588c5,0x88858885,0x80858885,0x78857885,0x78858085,0x88859087,0x80838885,0x88858885,0xb18d7801,0x8885a10b,0x68018045,0xef7bbdad,0xef7defbb,0xef7befbb,0xb5afceb3, +0xce73b5ef,0xef7bef7b,0xffffffff,0xf7fdffff,0xffbfffbd,0xf77bef7b,0xef7befbd,0xb5adce75,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x12b1122d,0x2b671ab1,0x1a691af1,0x1a6719e7,0x1a692a63,0x09af1a2d,0x1a69092f,0x122d122d,0x3a873a87,0x32473245,0x3a873a87,0x32453a47,0x3a873a87,0x3a873a87,0x3ac73a87,0x3a873a87,0x464d3e4d,0x3dcb3dcb,0x464d464f,0x3dcb3e0b,0x464d3e0d,0x3e0d3e0d,0x4e4f464f,0x3e0d3e0d,0x9ce78421,0xa529a529,0xa5299ce7,0xa529a529,0xa529b5ad,0xad6bad6b,0xb5adad6b,0x8421ad6b, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x88858003,0x99099909,0x99099909,0x990798c9,0x88858885,0x804588c5,0x80438085,0x88858885,0x88858043,0x99099909,0x99079109,0x98c99909,0x88858885,0x80438887,0x80858083,0x88858085,0x78858885,0xa14b7001,0x88858083,0x68018887,0xce75b5ad,0xef7bef7b,0xef3bef7b,0xb5add673, +0xd6b3b5ad,0xef7def7d,0xef7bf77b,0xf77bef7b,0xf77bffff,0xf7bdefbb,0xf77befbb,0xb5adceb5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x122d122d,0x1ab11a6d,0x12311ab1,0x1aa31a2b,0x2a63122f,0x09af1a67,0x1a6709af,0x122d1a69,0x32453247,0x3a873a87,0x32453245,0x3a873247,0x32473205,0x3a873a87,0x32453247,0x3a8742c7,0x358b3dcb,0x464d3e4d,0x3d8b3dcb,0x464d3dcb,0x3dcb354b,0x464d464d,0x358b3dcb,0x464d4e91,0xb5ad8421,0xad6bad6b,0x9ce7ad6b,0xb5adad6b,0xad6bad6b,0xa529a529,0xa529a529,0x8421a529, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x68016801,0x68016801,0x68016801,0x68016801,0x68016801,0x68016801,0x68016801,0x68016801,0x70016801,0x70016801,0x68016801,0x68016801,0x68016801,0x68016801,0x68016801,0x68016801,0x68016801,0x68016801,0x68016801,0x68016801,0xbdefb5ad,0xce73d6b3,0xb5adce73,0xb5adb5ef, +0xb5edb5ad,0xce33ce73,0xb5adce73,0xb5adb5ad,0xbdefb5ef,0xce73d675,0xbdedce73,0xb5afb5ef,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x1a6f19f1,0x1ab1122d,0x12331ab1,0x1a611a2d,0x1a27122f,0x2a631a69,0x09af2a63,0x122d1a67,0x32473a87,0x32473205,0x3a873a87,0x29c53205,0x3a473245,0x32053245,0x3a873a87,0x32053205,0x3dcb3e0d,0x3dcb354b,0x3e4d3e4d,0x2cc9350b,0x3e0b358b,0x354b358b,0x3e4d3e4d,0x350b354b,0xb5ad8421,0xa529b5ad,0xa529a529,0x94a594a5,0x94a594a5,0xb5adb5ad,0xb5adb5ad,0x7bdfb5ad, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x934da493,0x934f8b4d,0x934f934f,0x8b4d8b4b,0x934d934d,0x8b4d834d,0x934d934d,0x5207938f,0x934fac53,0x938f834d,0x934f8b4f,0x8b4d8b0d,0x934f934d,0x830d8b4d,0x938d934f,0x8b4d934f,0x8b4b8b4d,0x934d934f,0x934f8b8f,0x8b4d934d,0x934d8b4d,0x934f8b0d,0x934d8b4d,0x59c78b4d, +0x934fac93,0x934f830d,0x934d934f,0x8b0d8b4d,0x934f938f,0x8b4d830d,0x934d934d,0x59c7938f,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x122f1a6f,0x1a6f122d,0x1ab11aaf,0x1a69122f,0x2a63122f,0x232d1a27,0x09af1a67,0x122d1a67,0x2a053205,0x3a873205,0x29c53205,0x32453205,0x29c53205,0x32453245,0x32453205,0x32453205,0x3509350b,0x464d358b,0x2cc9354b,0x358b354b,0x2cc9354b,0x3dcb358b,0x358b350b,0x3d8b354b,0xa5298421,0xad6bad6b,0x94a5ad6b,0x7bdf8421,0x84217bdf,0xad6bc631,0xa529a529,0x84219ce7, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b0db495,0x6a096209,0x6a096a09,0x6a096a07,0x51c951c5,0x6a096a07,0x939159c7,0x5a078b4f,0x8b4dac95,0x6a0769c9,0x6a076a07,0x6a096a07,0x51c751c7,0x6a076a07,0x69c951c7,0x6a076a07,0x59c76209,0x6a076a07,0x6a0751c7,0x6a076a09,0x6a076a07,0x6a076a09,0x93916207,0x51c78b4f, +0x8b0db4d3,0x6a096a07,0x62096207,0x6a076a07,0x59c751c7,0x6a076a07,0x9bd159c7,0x59c78b4d,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x19af1a6f,0x19f111f3,0x1ab11a2d,0x1a691233,0x2a631aa5,0x22631a27,0x2aa31a67,0x19af1a67,0x42c73ac7,0x3a873a87,0x32473247,0x3a473247,0x42c73a87,0x32473a87,0x42c742c7,0x3a473a87,0x4e514e4f,0x3e4d3e4d,0x3dcb3dcb,0x3e0b3dcb,0x4e513e4d,0x3dcb3e0d,0x4e914e91,0x3e0b3e0d,0xb5ad94a5,0xad6bad6b,0x94a5ad6b,0xf80194a5,0xb5adf801,0xad6bce73,0xb5adb5ad,0x7bdfb5ad, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b0dac51,0x000051c7,0x00000000,0x00000000,0x00000000,0x00000000,0xac930000,0x51c7934f,0x8b4bac53,0x000059c7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xac930000,0x59c7934f, +0x8b4dac93,0x000051c7,0x00000000,0x00000000,0x00000000,0x00000000,0xac510000,0x51c7934d,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x1a2b19af,0x1a6f126d,0x092f1a6f,0x122d1a69,0x1a671a69,0x1a29122f,0x2aa31a29,0x19af1165,0x32453245,0x42c73ac7,0x3a873a87,0x3a873a87,0x32453205,0x3a873a87,0x3a873a87,0x3a873a87,0x358b358b,0x4e914e4f,0x3e0d3e0d,0x464d464d,0x358b354b,0x464d3e4d,0x3e0d3e0d,0x464d464d,0xad6b8421,0xa529ad6b,0x842194a5,0xf80194a5,0xb5add001,0xc631a529,0xa529a529,0x8421ad6b, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b4facd5,0x000059c5,0x00000000,0x00000000,0x00000000,0x00000000,0xb4950000,0x6a07934f,0x8b4db495,0x000051c7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xb4950000,0x6a09934f, +0x8b4fb495,0x000051c7,0x00000000,0x00000000,0x00000000,0x00000000,0xb4950000,0x6a098b4f,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x226719af,0x12b119ef,0x19eb1a71,0x1231092f,0x1aab2269,0x1a692a63,0x2aa31a27,0x19af19af,0x3a873a87,0x32453205,0x3a873a87,0x32453205,0x32453245,0x32053245,0x32473247,0x32053205,0x3e0d3e0d,0x358b350b,0x3e0d464d,0x3d8b354b,0x3dcb358b,0x350b358b,0x3dcb3dcb,0x354b354b,0xb5ad8421,0x9ce7b5ad,0x842194a5,0xf80194a5,0xb5ada801,0xce739ce7,0xb5adb5ad,0x94a5b5ad, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x9b4dac53,0x00006a07,0x00000000,0x00000000,0x00000000,0x00000000,0xac530000,0x6a07934f,0x934fac53,0x00006a07,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xac510000,0x6a07934f, +0x938dac51,0x00006a07,0x00000000,0x00000000,0x00000000,0x00000000,0xac910000,0x6a09934f,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x19af19af,0x19f119eb,0x232b1a2f,0x1a2d2269,0x1a291a2b,0x2a631a2b,0x1a292a63,0x19af2aa3,0x32473245,0x3a873245,0x320529c5,0x3a473247,0x3a873205,0x42c742c7,0x3a873247,0x3ac742c7,0x3dcb358b,0x3e4d3d8b,0x350b34c9,0x3e0d3dcb,0x3e0d354b,0x4e914e91,0x3e0d3dcb,0x4e4f4e91,0xa5298421,0x94a5a529,0xa5298421,0xd00194a5,0xb5add001,0x9ce7a529,0xa529ce73,0x8421b5ad, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x19af3321,0x116d19a7,0x2aa519eb,0x092f2269,0x1a2919ed,0x2a632265,0x1a292a63,0x32e33321,0x3a873a87,0x3a873a87,0x3a8742c7,0x3a873a87,0x3a873a87,0x3a473245,0x32473a87,0x32473205,0x464d464d,0x3e0d3e0d,0x464d4e51,0x3e0d3e0d,0x3e4d464d,0x3e0b3dcb,0x3dcb3e0d,0x3dcb354b,0xad6b8421,0x94a5b5ad,0x9ce78421,0xd00194a5,0xb5adb001,0xa529a529,0xad6bce73,0x8421ad6b, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x22632aa3,0x11271a67,0x1a231165,0x092f19a9,0x1a6911eb,0x2a632227,0x22652263,0x2aa332e3,0x32053205,0x3a473a47,0x32453245,0x3a873a87,0x32053205,0x3a873245,0x2a052a05,0x3a873245,0x354b354b,0x3e0d3e0d,0x3d8b358b,0x3e0d3e4d,0x354b354b,0x3e0d358b,0x35093509,0x3e0d3d8b,0xad6b7bdf,0x842194a5,0x9ce7a529,0xf80194a5,0xb5add801,0x9ce7a529,0xce73a529,0x7bdfb5ad, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x2aa532e3,0x19a52a63,0x11691167,0x092f11ad,0x1a2b116d,0x1a671a69,0x22632a63,0x2aa32223,0x32453245,0x320529c5,0x3a873a87,0x29c53205,0x3a873247,0x3a873a47,0x42c742c7,0x32053a87,0x358b3d8b,0x350b34c9,0x464f464d,0x2cc9354b,0x3e4d3dcb,0x3e0d3e0b,0x4e914e91,0x350b3e0d,0xa5298421,0x842194a5,0xa5299ce7,0xf80194a5,0xb5adb001,0xad299ce7,0xc631a529,0x8421a529, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x22632ae1,0x22632225,0x116b116b,0x09af1a69,0x11a5116d,0x1a252223,0x2a612a63,0x2aa32261,0x3a873a87,0x42c73a87,0x3a873a87,0x32453a47,0x324729c5,0x3a873a87,0x32473247,0x3ac73a87,0x3e0d3e0d,0x4e91464f,0x3e0d464d,0x3dcb3e0b,0x3dcb34c9,0x464d3e0d,0x3dcb3dcb,0x4e4f464d,0xb5ad8421,0xb5ada529,0xa5299ce7,0xd00194a5,0xb5adb001,0xce73ad29,0xad6bce73,0x94a5b5ad, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x221d1a65,0x1ab11ab1,0x22632263,0x22632263,0x1a69096f,0x09af11a5,0x22232a63,0x122d2a61,0x3a873a87,0x32473247,0x3a473a87,0x3a873a87,0x3a8742c7,0x32453245,0x3a873a47,0x32053245,0x464f464f,0x3dcb3dcb,0x3e0b464d,0x3e4d3e0d,0x3e4d4e91,0x358b358b,0x3e0d3e0b,0x354b3d8b,0xad6b8421,0xa529ad6b,0xb5ada529,0xc631b5ad,0xc631c631,0xb5adce73,0xa529ad6b,0x8421a529, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x1a6732df,0x1ab11a67,0x1a691235,0x22631a69,0x1a692263,0x2a632223,0x2a632a63,0x122d122d,0x32053205,0x3a473a87,0x32453205,0x3a873a87,0x32453247,0x3a873a87,0x32053205,0x3a873a87,0x354b350b,0x3e0b464d,0x3d8b354b,0x464f464d,0x358b3dcb,0x464d3e0d,0x354b354b,0x464d3e4d,0x84218421,0x84218421,0x94a57bdf,0x84218c63,0x84218421,0x84218421,0x84218421,0x84218421, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x739d7bdf,0x739d739d,0x7bdf739d,0x8c638c63,0x8c636b5b,0x739d7bdf,0x739d739d,0x7bdf739d,0x51874947,0x49474947,0x59875187,0x51874947,0x59875987,0x49474947,0x51875187,0x49474947,0xb547b505,0xad05acc5,0xce07c587,0xb547b507,0xcdc7cdc7,0xad05a485,0xc587c587,0xa4c5ad05,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x00000000,0x00000000,0x00000000,0x00000000,0x0000ef7b,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x7bdf7bdf,0x8c638c63,0x8c638c63,0x8c638c63,0x8c63739d,0x8c638c63,0x7bdf6b5b,0x739d7bdf,0x59875187,0x61c961c7,0x59875987,0x51875187,0x49474947,0x51875187,0x49474145,0x51875187,0xcdc7c587,0xde4bde49,0xcdc7d607,0xbd47bd47,0xa4c5ad05,0xbd47b547,0xa4c59c45,0xbd87b547,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x6b5b7bdf,0x2b671ab1,0x1a691af1,0x739d739d,0x739d8c63,0x7bdf7bdf,0x1a69092f,0x7bdf7bdf,0x59c75987,0x51875187,0x59c761c7,0x51875187,0x59c75987,0x59875987,0x61c761c7,0x59875987,0xd649d607,0xc587bd47,0xd649de49,0xbd47c587,0xd649cdc7,0xcdc7cdc7,0xde4bde49,0xcdc7cdc7,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x8c637bdf,0x7bdf7bdf,0x12317bdf,0x1aa37bdf,0x7bdf122f,0x739d739d,0x739d739d,0x7bdf739d,0x51875187,0x59c75987,0x51875187,0x59c75187,0x51874947,0x59c759c7,0x51875187,0x59c761c9,0xb547c587,0xd649ce07,0xbd47bd47,0xd649c587,0xbd47b507,0xd649d649,0xb547c587,0xd609de4b,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0xef7b0000,0x0000def7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x8c637bdf,0x739d8c63,0x739d739d,0x739d739d,0x739d739d,0x8c638c63,0x8c638c63,0x6b5b8c63,0x51875987,0x51874947,0x59875987,0x41454947,0x51875187,0x49475187,0x59875987,0x49474947,0xbd87cdc7,0xc587b507,0xce07ce07,0x9c45a485,0xc587b547,0xa4c5b547,0xce07ce07,0xa485ad05,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0xef7b0000,0xdef70000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x739d739d,0x7bdf7bdf,0x1ab17bdf,0x739d122f,0x6b5b7bdf,0x232d1a27,0x739d739d,0x7bdf6b5b,0x49454947,0x59c74947,0x41454947,0x51874947,0x41454947,0x51875187,0x51874947,0x51874947,0x9c85a4c5,0xd649b507,0x9c45b507,0xb547b505,0x9c45b507,0xbd47b547,0xb547a4c5,0xbd47ad05,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x0000ffff,0xdef7ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x8c638c63,0x19f17bdf,0x1ab11a2d,0x1a691233,0x7bdf7bdf,0x22631a27,0x8c638c63,0x6b5b8c63,0x61c961c7,0x59875987,0x51875187,0x51875187,0x61c95987,0x51875987,0x61c961c9,0x51875987,0xde4bde4b,0xce07d607,0xc587c587,0xc587bd87,0xde4bd607,0xbd47cdc7,0xde4bde4b,0xc587cdc7,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0xdef7def7,0xdef7ffff,0xffffef7b,0xffffffff,0x00000000,0x00000000,0x00000000,0x00000000,0xdef7def7,0x0000def7,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x1a2b7bdf,0x739d126d,0x739d739d,0x739d739d,0x6b5b739d,0x739d739d,0x739d739d,0x7bdf7bdf,0x51875187,0x61c961c7,0x59875987,0x59c759c7,0x51874947,0x59c75987,0x59875987,0x59c759c7,0xb547b547,0xde4bde4b,0xcdc7cdc7,0xd609d649,0xb547ad05,0xd649ce07,0xcdc7cdc7,0xd609d649,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x0000ef7b,0xdef7ffff,0x00000000,0xef7bef7b,0xef7b0000,0xffffef7b,0xffffffff,0x0000ffff,0x0000ef7b,0xdef7ffff,0x00000000,0xdef7ef7b,0x0000ffff,0x0000ef7b,0x0000ffff,0x0000ffff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x22677bdf,0x6b5b19ef,0x739d8c63,0x12317bdf,0x1aab7bdf,0x1a692a63,0x8c638c63,0x8c638c63,0x59875987,0x51874947,0x598759c7,0x51874947,0x51875187,0x49475187,0x51875187,0x49474947,0xcdc7cdc7,0xb547a4c5,0xcdc7d609,0xbd47b507,0xbd47b547,0xa4c5b547,0xbd47c587,0xa4c5acc5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0xef7b0000,0xffffef7b,0xef7bdef7,0xef7bffff,0x0000ffff,0x0000def7,0xffff0000,0x00000000,0xef7b0000,0x0000ef7b,0xef7b0000,0xffff0000,0x0000def7,0x0000def7,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x739d7bdf,0x739d739d,0x739d739d,0x1a2d739d,0x1a291a2b,0x2a631a2b,0x1a29739d,0x7bdf2aa3,0x51875187,0x59875187,0x49474145,0x59875187,0x59874947,0x61c961c9,0x59875187,0x61c761c9,0xbd47b547,0xd607bd47,0xa4859c85,0xcdc7bd47,0xcdc7b507,0xde4bde4b,0xcdc7c587,0xde49de4b,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0xffff0000,0xffffdef7,0xdef70000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xffffdef7,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x7bdf7bdf,0x739d8c63,0x8c6319eb,0x739d8c63,0x1a2919ed,0x8c632265,0x1a298c63,0x7bdf3321,0x59c759c7,0x59875987,0x59c761c9,0x59875987,0x598759c7,0x51875187,0x51875987,0x51874947,0xd649d609,0xcdc7cdc7,0xd649de4b,0xcdc7cdc7,0xd607d649,0xc587bd47,0xc587cdc7,0xc587ad05,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0xdef70000,0x0000ffff,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x7bdf6b5b,0x11271a67,0x7bdf1165,0x7bdf7bdf,0x8c638c63,0x7bdf7bdf,0x22657bdf,0x6b5b32e3,0x49474947,0x59875987,0x51875187,0x59875987,0x49474947,0x59875187,0x49454945,0x59875187,0xb507ad05,0xcdc7cdc7,0xbd47b547,0xcdc7ce07,0xb507ad05,0xcdc7b547,0x9c859c85,0xcdc7bd47,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x0000ffff,0xffff0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x739d7bdf,0x739d739d,0x1169739d,0x739d739d,0x1a2b116d,0x739d1a69,0x2263739d,0x7bdf2223,0x51875187,0x49474145,0x61c759c7,0x41454947,0x59875187,0x59875187,0x61c961c9,0x49475987,0xb547bd47,0xa4859c85,0xde49d609,0x9c45a4c5,0xce07c587,0xcdc7c587,0xde4bde4b,0xa4c5cdc7,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0xdef70000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x8c637bdf,0x8c63739d,0x116b116b,0x739d1a69,0x11a5116d,0x739d2223,0x7bdf7bdf,0x8c638c63,0x59875987,0x61c961c7,0x598759c7,0x51875187,0x51874145,0x59c75987,0x51875187,0x61c759c7,0xcdc7cdc7,0xde4bde49,0xcdc7d609,0xbd47c587,0xc5879c85,0xd649cdc7,0xc587bd87,0xde4bd649,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x0000def7,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x7bdf7bdf,0x739d7bdf,0x22632263,0x739d2263,0x7bdf7bdf,0x8c638c63,0x739d7bdf,0x7bdf739d,0x59c761c7,0x51875187,0x518759c7,0x59875987,0x598761c9,0x51875187,0x59875187,0x49475187,0xde49de49,0xbd47c587,0xc587d649,0xce07cdc7,0xd607de4b,0xb547b547,0xcdc7c587,0xad05bd47,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x739d739d,0x739d739d,0x8c636b5b,0x7bdf8c63,0x7bdf7bdf,0x739d7bdf,0x739d739d,0x7bdf7bdf,0x49474947,0x518759c7,0x51874947,0x61c759c7,0x51875187,0x59c75987,0x49474947,0x59c75987,0xb507a4c5,0xc587d609,0xbd47ad05,0xde49d649,0xb547bd87,0xd609cdc7,0xb507ad05,0xd649d607,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe6e9e6eb,0xdea7d667,0xdea9e6e9,0xd665d667,0xdea9dea9,0xdea9d667,0xd6a7e6e9,0xef2be6e9,0x21a52163,0x21632163,0x29a921a7,0x21a52163,0x29a929a7,0x21632161,0x21a721a7,0x21612163,0x5c3553f3,0x53f34bb3,0x74b76475,0x5c3553f3,0x74b56cb5,0x53f34373,0x6c756c75,0x4bb353f3,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0xdea9dea9,0xdea9e6a9,0xce27d667,0xce25ce25,0xdea7dea7,0xe6e9d667,0xe72bdea7,0xef2be72b,0x29a721a7,0x29ed29eb,0x29a929a9,0x21a521a5,0x21612163,0x21a521a5,0x2161195f,0x21a521a5,0x6cb56c75,0x8d778d37,0x74b57cf7,0x64356435,0x4bb353f3,0x64355c35,0x4bb33b31,0x64355c35,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd667dea9,0xdea7dea9,0xce27ce65,0xd665ce25,0xd6a7d665,0xe6e9d665,0xdee9e6eb,0xe6ebe6e9,0x29e929a9,0x21a521a5,0x29e929eb,0x21a521a7,0x29e929a9,0x29a929a9,0x29eb29eb,0x29a729a9,0x7cf77cf7,0x64756435,0x7cf78537,0x64356c75,0x7cf774b5,0x74b574b5,0x8d378537,0x6cb574b5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdea7e6e9,0xdea7dea7,0xde67d667,0xe6a9dea7,0xdea7d665,0xdea7d665,0xdea9e6e9,0xd665dea9,0x21a521a7,0x29e929a9,0x21a521a5,0x29e921a7,0x21a52163,0x29e929e9,0x21a521a7,0x29e929ed,0x5c356c75,0x7cf774b7,0x5c356435,0x7cf76475,0x643553f3,0x7cf77cf7,0x5c356c75,0x7cf78d77,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd665dea7,0xd665dea7,0xdea7d6a7,0xe6e9dea9,0xdea7d665,0xd6a7dea7,0xdea9e6e9,0xd667dea9,0x21a529a7,0x21a72163,0x29a929a9,0x215f2161,0x21a721a5,0x216321a5,0x29a929a9,0x21612163,0x64356cb5,0x6c7553f3,0x74b774b7,0x3b714373,0x6c755c35,0x4bb35c35,0x74b774b7,0x437353f3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdea7d665,0xce25dea7,0xd667ce25,0xef2de6eb,0xd667dea9,0xd667de67,0xdea7dea7,0xdea7dea9,0x21612161,0x29e921a3,0x215f2163,0x21a52163,0x215f2163,0x21a521a5,0x21a52161,0x21a52163,0x43734bb3,0x7cf753f3,0x3b7153f3,0x5c3553f3,0x3b7153f3,0x64355c35,0x5c3543b3,0x5c3553f3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdea9d667,0xd667dea9,0xd665dea7,0xe6edd667,0xdea7dea9,0xdea7e6e9,0xdea9d667,0xdea9dea9,0x29ed29eb,0x29a929a9,0x21a721a7,0x21a721a5,0x29ed29a9,0x21a529a7,0x29ed29ed,0x21a729a9,0x8d378d37,0x74b77cf7,0x64756475,0x6c756435,0x8d377cf7,0x64356cb5,0x8d778d77,0x6c7574b5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd667dea9,0xce65dea9,0xd667dea7,0xd665d665,0xdea9dea9,0xdea9e6e9,0xdea9dea7,0xdea9dea9,0x21a521a5,0x29ed29eb,0x29a729a9,0x29e929e9,0x21a52163,0x29e929a9,0x29a729a7,0x29e929eb,0x5c355c35,0x8d778d37,0x6cb574b5,0x7cf77cf7,0x5c3553f3,0x7cf774b7,0x6cb56cb5,0x7cf77cf7,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd665dea7,0xdea9dea9,0xe6a9dea7,0xdea9dea9,0xdea7dea9,0xe6e9dea7,0xe6ebe6eb,0xd6a7e6e9,0x29a929a9,0x21a52161,0x29a729e9,0x21a52163,0x21a521a5,0x216121a5,0x21a521a7,0x21632163,0x74b574b5,0x5c354bb3,0x6cb57cf7,0x5c3553f3,0x64355c35,0x43b35c35,0x64356475,0x4bb34bb3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd665d665,0xd667d665,0xe6e9dea9,0xce25dea7,0xd667e6e9,0xdea9d665,0xdea9e6eb,0xdea7dea9,0x21a521a5,0x29a921a5,0x2161215f,0x29a721a5,0x29a72163,0x29ed29ed,0x29a921a5,0x29eb29ed,0x64355c35,0x7cf75c35,0x43733b73,0x6c756435,0x6cb553f3,0x8d778d77,0x74b56475,0x8d378d77,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdea7ce25,0xdea7d6a7,0xe6ebd667,0xdea7dea9,0xdee7dea7,0xce23dea7,0xef2de6e9,0xd665e6eb,0x29eb29e9,0x29a929a9,0x29e929ed,0x29a729a9,0x29a929eb,0x21a721a5,0x21a729a7,0x21a72163,0x7cf77cf7,0x74b574b5,0x7cf78d37,0x6cb574b5,0x7cf77cf7,0x6c756435,0x64756cb5,0x6c7553f3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe6e9dea7,0xdea9dea9,0xde67d667,0xce25e6a9,0xd667d667,0xd667d665,0xdea9dea9,0xdea7d667,0x21632163,0x29a729a7,0x21a521a5,0x29a929a9,0x21632163,0x29a721a5,0x21612161,0x29a721a5,0x53f353f3,0x6c756c75,0x5c355c35,0x74b574b7,0x53f353f3,0x6cb55c35,0x43734373,0x6cb55c35,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdea9dea9,0xdea9dea9,0xdee9dea9,0xd665dea7,0xd665ce23,0xce25d665,0xdea7d665,0xdea7e6e9,0x21a521a5,0x2161215f,0x29eb29e9,0x215f2163,0x29a921a7,0x29a921a7,0x29ed29ed,0x216129a7,0x5c355c35,0x43733b73,0x85377cf7,0x3b714bb3,0x74b76475,0x74b56c75,0x8d778d77,0x43b36cb5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdea9e6eb,0xdeebd667,0xd669dea9,0xd6a7d667,0xd667d667,0xd667dea7,0xdea9dea9,0xe6e9dea7,0x29a729a9,0x29ed29eb,0x29a929e9,0x21a521a7,0x21a5215f,0x29e929a9,0x21a521a5,0x29eb29e9,0x6cb574b5,0x8d778537,0x74b57cf7,0x64356c75,0x64753b73,0x7cf774b5,0x64756435,0x8d377cf7,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe6e9e6e9,0xe6e9dea7,0xdee9dea9,0xce65d667,0xdea7d667,0xdea9d6a7,0xe6ebdea9,0xdea9dea9,0x29eb29eb,0x21a521a7,0x21a729e9,0x29a929a7,0x29a929ed,0x21a521a5,0x29a921a7,0x216321a5,0x84f78537,0x64356c75,0x6c757cf7,0x74b76cb5,0x7cf78d77,0x5c355c35,0x74b56c75,0x53f35c35,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe6e9ef2b,0xdea7dea9,0xe6a9de67,0xd667dea9,0xdea9d667,0xe6ebd6a7,0xdee9dea7,0xdea9dea9,0x21632161,0x21a729e9,0x21a52163,0x29eb29e9,0x21a521a5,0x29e929a7,0x21632163,0x29e929a9,0x53f34bb3,0x6c757cf7,0x5c3553f3,0x85377cf7,0x5c356435,0x7cf76cb5,0x53f353f3,0x7cf77cf7,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xef2deeed,0xe6edef2d,0xe6ebe6ab,0xef2df76f,0xf76fef2d,0xef2def2d,0xf76fef2d,0xef2df76f,0x796f716d,0x716d716d,0x89f381b1,0x796f716d,0x81f381b3,0x716d696b,0x81b381b3,0x716b716d,0xb9f1b9f1,0xb9f1b1b1,0xc2b3ba73,0xb9f1b9f1,0xc2b3c2b3,0xb1f1a9ad,0xc273c273,0xb1afb1f1,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f, +0xd669e6eb,0xdea9dea9,0xd669dea9,0xce25d667,0xd667d667,0xdea9dea7,0xe6edd667,0xe6ebe6ed,0x81b381b1,0x92759275,0x81f389f3,0x79b179b1,0x716b716d,0x79b1796f,0x716b6969,0x79b1796f,0xc2b3c273,0xcb75cb35,0xc2b3c2f3,0xba33ba33,0xb1afb9f1,0xba33b9f1,0xb1afa1ab,0xba33b9f1,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x1abf1abf, +0xd667c621,0xc5e1d663,0xc621ce21,0xc5e1ce23,0xc61fc621,0xc5ddc5df,0xce65ce21,0xc5dfc5e3,0x8a3389f3,0x79b179b1,0x8a338a35,0x79b181b3,0x8a3381f3,0x81f381f3,0x92759235,0x81b381f3,0xc2f5c2f3,0xba33ba33,0xc2f5cb35,0xba33c273,0xc2f5c2b3,0xc2b3c2b3,0xcb75cb35,0xc2b3c2b3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x1abf1abf,0x22ff22ff,0x3b7f22ff,0x22ff22ff,0x22ff22ff,0x3b7f1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f22ff,0x22ff22ff,0x22ff22ff,0x3b7f1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f22ff,0x22ff22ff,0x22ff22ff,0x3b7f1abf,0x1abf3b7f,0x1abf1abf, +0xf771ce23,0xef2de6ed,0xf771ce1f,0xf76ff76f,0xe6edef2f,0xf76fbd9b,0xe6ede6ed,0xf76ff76f,0x796f81b1,0x8a3389f3,0x79af79b1,0x8a3381b1,0x79b1716d,0x8a338a33,0x796f81b1,0x8a339275,0xb9f1c273,0xc2f5c2b3,0xba33ba33,0xc2f5ba73,0xba33b9f1,0xc2f5c2f5,0xb9f1c273,0xc2f3cb75,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x3b7f1abf,0x22ff3b7f,0x3b7f22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f1abf,0x22ff3b7f,0x3b7f22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f1abf,0x22ff3b7f,0x3b7f22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff, +0xdea9ce21,0xd667dea7,0xdee9ce1f,0xe6e9e6eb,0xc5ddde67,0xd667e6eb,0xe6eddea9,0xdea9d667,0x79b181b3,0x81b1716d,0x89f389f3,0x6969696b,0x81b3796f,0x716d796f,0x89f389f3,0x696b716d,0xba33c2b3,0xc273b9f1,0xc2b3c2b3,0xa1ada9ad,0xc273b9f1,0xb1afb9f1,0xc2b3c2b3,0xa9adb1f1,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x22ff22ff,0x1abf22ff,0x1abf22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x22ff22ff,0x1abf22ff,0x1abf22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x22ff22ff,0x1abf22ff,0x1abf22ff, +0xd667d6a9,0xdea7d667,0xe6ebce1f,0xef2ddea9,0xc5dddea9,0xdea7e6eb,0xdea9dea7,0xc5dfdeab,0x6969716b,0x8a33796f,0x6969716d,0x796f716d,0x6969716d,0x79b1796f,0x796f716b,0x79af716d,0xa9adb1af,0xc2f5b9f1,0xa1adb9f1,0xb9f1b9f1,0xa1adb9f1,0xba33b9f1,0xb9f1a9af,0xba33b9f1,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff3b7f,0x1abf22ff,0x22ff22ff,0x22ff22ff,0x1abf3b7f,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff3b7f,0x1abf22ff,0x22ff22ff,0x22ff22ff,0x1abf3b7f,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff3b7f,0x1abf22ff,0x22ff22ff,0x22ff22ff,0x1abf3b7f,0x1abf1abf,0x3b7f1abf,0x1abf1abf, +0xce63dea9,0xce23ce63,0xce23ce1f,0xe6eddeed,0xc5ddbd9d,0xe6ebc621,0xd6a7deeb,0xc5dfdeab,0x92759275,0x89f389f3,0x81b181b1,0x81b379b1,0x927589f3,0x79b181b3,0x92759275,0x81b381f3,0xcb75cb75,0xc2b3c2f3,0xba73ba73,0xc273ba33,0xcb75c2f3,0xba33c2b3,0xcb75cb75,0xc273c2b3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f, +0xf771c5dd,0xeeedef2d,0xef2ff771,0xc621ce23,0xef2def2d,0xc621f76f,0xce21ce25,0xef2fc5df,0x796f796f,0x92759275,0x81b381f3,0x8a338a33,0x796f716d,0x8a3389f3,0x81b381b3,0x8a338a33,0xb9f1b9f1,0xcb75cb75,0xc2b3c2b3,0xc2f3c2f5,0xb9f1b9f1,0xc2f5c2b3,0xc2b3c2b3,0xc2f3c2f5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x22ff1abf,0x3b7f22ff,0x22ff3b7f,0x1abf22ff,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x22ff1abf,0x3b7f22ff,0x22ff3b7f,0x1abf22ff,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x22ff1abf,0x3b7f22ff,0x22ff3b7f,0x1abf22ff, +0xdea9ef2f,0xdea9e6eb,0xc5dfdea9,0xef2fef2d,0xdea7deab,0xd663e6eb,0xef2df76f,0xef2fc5df,0x81f381f3,0x796f716b,0x81b38a33,0x79af716d,0x79b1796f,0x716b796f,0x79b181b1,0x716d716d,0xc2b3c2b3,0xb9f1b1af,0xc2b3c2f3,0xba33b9f1,0xba33b9f1,0xa9afb9f1,0xba33ba73,0xb1afb1b1,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff22ff,0x22ff3b7f,0x22ff22ff,0x22ff22ff,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff3b7f,0x22ff22ff,0x22ff22ff,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff3b7f,0x22ff22ff,0x22ff22ff,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xe6ebd667,0xe6ebe6eb,0xc5dddea7,0xdeabeeed,0xdeabe6eb,0xc5dbd667,0xdeebe6ed,0xdeebc5df,0x79b1796f,0x89f379af,0x696b6969,0x81b379b1,0x81b3716d,0x92759275,0x81f379b1,0x92759275,0xba33b9f1,0xc2f3ba33,0xa9ada1ad,0xc273ba33,0xc2b3b9f1,0xcb75cb75,0xc2b3ba33,0xcb35cb75,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f22ff,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f22ff,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f22ff,0x22ff3b7f,0x22ff22ff, +0xc5dfdea7,0xc5dfc5df,0xce21d667,0xdea7dea7,0xdea7e6ed,0xce21dea9,0xc5dddeeb,0xc59dc5dd,0x8a338a33,0x81f381f3,0x8a339275,0x81b381f3,0x89f38a33,0x81b379b1,0x81b181b3,0x81b1716d,0xc2f5c2f3,0xc2b3c2b3,0xc2f5cb75,0xc2b3c2b3,0xc2f3c2f5,0xc273ba33,0xba73c2b3,0xc273b1f1,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x3b7f22ff,0x1abf3b7f,0x3b7f1abf,0x1abf22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x3b7f22ff,0x1abf3b7f,0x3b7f1abf,0x1abf22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x3b7f22ff,0x1abf3b7f,0x3b7f1abf,0x1abf22ff,0x1abf1abf, +0xef2fc5dd,0xe6ebef2f,0xbd9bce21,0xc5ddc5dd,0xc5dddea7,0xef2fc5dd,0xe6e9c5dd,0xef2fef2f,0x716d716d,0x81b381b3,0x79af796f,0x81f389f3,0x716d716d,0x81b3796f,0x69696969,0x81b379af,0xb9f1b1f1,0xc273c273,0xba33b9f1,0xc2b3c2b3,0xb9f1b9f1,0xc2b3b9f1,0xa9ada9ad,0xc2b3ba33,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xe6efef2d,0xce23e6eb,0xef2fef2d,0xef2def2d,0xef31c5dd,0xdeabeeed,0xe6edce23,0xe6ede72f,0x796f79af,0x696b6969,0x8a358a33,0x6969716d,0x89f381b1,0x81f381b3,0x92759275,0x716b81b3,0xb9f1ba33,0xa9ada1ad,0xcb35c2f3,0xa1adb1af,0xc2b3ba73,0xc2b3c273,0xcb75cb75,0xa9afc2b3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff22ff,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff22ff,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff22ff,0x22ff22ff,0x1abf1abf,0x1abf1abf, +0xe6efe6ed,0xc5dfd667,0xdea9d669,0xdeabdea7,0xd6a9c5dd,0xd667d667,0xe6edc5dd,0xdea9deeb,0x81b381f3,0x92759235,0x81f38a33,0x79b181b3,0x79b16969,0x8a3381f3,0x79b179b1,0x92758a33,0xc2b3c2b3,0xcb75cb35,0xc2b3c2f3,0xba33c273,0xba33a1ad,0xc2f5c2b3,0xba33ba33,0xcb75c2f5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x1abf1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff, +0xc621ce25,0xce23e6eb,0xe72ddea9,0xbd9ddeed,0xce1fe6ed,0xe6ebdeeb,0xbd9bc621,0xbd9bdea9,0x8a358a35,0x79b181b1,0x81b38a33,0x89f381b3,0x89f39275,0x796f796f,0x81f381b3,0x716d79af,0xc335cb35,0xba33c273,0xc273c2f5,0xc2b3c2b3,0xc2f3cb75,0xb9f1b9f1,0xc2b3c273,0xb9f1ba33,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x3b7f3b7f, +0xef2de72f,0xdea9ce23,0xc621c621,0xe6ebc5df,0xdea7e6e9,0xce21c5dd,0xef2deeed,0xef2fc5dd,0x716d716b,0x81b38a33,0x79af716d,0x92358a33,0x796f79b1,0x8a3381b3,0x716d716d,0x8a3389f3,0xb9f1b1af,0xc273c2f3,0xba33b9f1,0xcb35c2f5,0xb9f1ba33,0xc2f3c2b3,0xb9f1b9f1,0xc2f5c2f3,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xdea9ef2b,0xc5ddce23,0xdea9e6eb,0xc5ddef2d,0xe6e9d667,0xdea9dea9,0xdea9c5dd,0xdea9dea9,0x23632363,0x23612361,0x2be723a5,0x23632363,0x2be72be7,0x23612321,0x2ba52ba5,0x23212361,0xebcdeb8b,0xeb8beb89,0xec11ec0d,0xebcbebcb,0xec0fec0f,0xeb89e347,0xec0dec0d,0xeb89eb89,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f, +0xc5dde6eb,0xe6a9dea9,0xd667c5dd,0xc5ddd667,0xdea9dea7,0xd667d667,0xc5ddd667,0xe72dc5dd,0x2be723a5,0x2c2b2c2b,0x2be72be9,0x23a523a5,0x23212361,0x23a52363,0x23211adf,0x23a52363,0xec0fec0d,0xec53ec53,0xec0fec11,0xebcdebcd,0xeb89eb8b,0xebcdebcb,0xeb89e345,0xebcdebcd,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x22ff1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x1abf1abf, +0xe6a9ce23,0xc5dddea7,0xd667c5dd,0xd665ce25,0xd665c5dd,0xe6e9ce25,0xef2bc5dd,0xc5dde6e9,0x2be92be9,0x23a523a5,0x2be92c29,0x23a52ba5,0x2be92be7,0x2be72be7,0x2c2b2c29,0x2be72be7,0xec51ec11,0xebcdebcd,0xec51ec51,0xebcdec0d,0xec51ec0f,0xec0fec0f,0xec53ec51,0xec0fec0f,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1abf1abf,0x22ff22ff,0x3b7f22ff,0x22ff22ff,0x22ff22ff,0x3b7f1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f22ff,0x22ff22ff,0x22ff22ff,0x3b7f1abf,0x1abf3b7f,0x1abf1abf, +0xdea7ce23,0xeeedc5dd,0xc5ddeeed,0xdea9dea7,0xd665d663,0xc5ddd6a7,0xe6e9eeed,0xd665dea7,0x236323a5,0x2be92be7,0x23a323a5,0x2be923a5,0x23a52363,0x2be92be9,0x236323a5,0x2be92c2b,0xebcdec0d,0xec51ec11,0xebcdebcd,0xec51ec0d,0xebcdebcb,0xec51ec51,0xebcdec0d,0xec51ec53,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x3b7f1abf,0x22ff3b7f,0x3b7f22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f1abf,0x22ff3b7f,0x3b7f22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff, +0xc5dddea7,0xdea9eeed,0xd663d667,0xef2def2d,0xce23c5dd,0xeeedce23,0xe6e9e6e9,0xdea9dea7,0x23a52be7,0x23a52363,0x2be72be7,0x231f2321,0x2ba52363,0x23212363,0x2be72be7,0x23212361,0xebcdec0f,0xec0debcb,0xec11ec11,0xe345e347,0xec0debcb,0xeb89ebcb,0xec11ec11,0xe347eb89,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x22ff22ff,0x1abf22ff,0x1abf22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x22ff22ff,0x1abf22ff,0x1abf22ff, +0xc5ddd667,0xdea9d667,0xd663dea9,0xc5ddc5dd,0xdea9e6e9,0xc5dddea7,0xdea7d667,0xd667ce25,0x231f2321,0x2be92363,0x231f2363,0x23632363,0x231f2363,0x23a52363,0x23632321,0x23a32361,0xe347eb89,0xec51ebcb,0xe345ebcb,0xebcdeb8b,0xe345ebcb,0xebcdebcd,0xebcbeb47,0xebcdeb8b,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x22ff3b7f,0x1abf22ff,0x22ff22ff,0x22ff22ff,0x1abf3b7f,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff3b7f,0x1abf22ff,0x22ff22ff,0x22ff22ff,0x1abf3b7f,0x1abf1abf,0x3b7f1abf,0x1abf1abf, +0xdea7c5dd,0xeeeddea7,0xd663d667,0xe6ebc5dd,0xdea7c5dd,0xd665e6e9,0xce23ce23,0xc5ddeeed,0x2c2b2c2b,0x2be72be9,0x23a523a5,0x2ba523a5,0x2c2b2be9,0x23a52be7,0x2c2b2c2b,0x2ba52be7,0xec53ec53,0xec11ec11,0xec0dec0d,0xec0debcd,0xec53ec11,0xebcdec0f,0xec53ec53,0xec0dec0f,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x7ca77ca7,0x00000000,0x7ca70000,0x00007ca7,0x00000000,0x7ca77ca7,0x00000000,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f, +0xc5dde6e9,0xd663eeed,0xc5ddc5dd,0xd665d665,0xe6e9c5dd,0xdea9dea9,0xe6ebdea9,0xe6ebc5dd,0x23632363,0x2c2b2c2b,0x2be72be7,0x2be92be9,0x23632361,0x2be92be7,0x2be72be7,0x2be92c29,0xebcdebcd,0xec53ec53,0xec0fec0f,0xec51ec51,0xebcbeb8b,0xec51ec11,0xec0fec0f,0xec51ec51,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x7ca70000,0xd6f7ffff,0x0000535d,0xffff7ca7,0x535dd6f7,0x7ca70000,0xd6f7ffff,0x0000535d,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x22ff1abf,0x3b7f22ff,0x22ff3b7f,0x1abf22ff,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x22ff1abf,0x3b7f22ff,0x22ff3b7f,0x1abf22ff, +0xd665d665,0xdea9c5dd,0xe6e9e6e9,0xd667ce23,0xc5dddea9,0xdea7c5dd,0xc5ddef2d,0xd665dea9,0x2be72be7,0x23632321,0x2be72be9,0x23a32363,0x23a52363,0x23212363,0x23a523a5,0x23212361,0xec0fec0f,0xebcbeb89,0xec0fec51,0xebcdebcb,0xebcdebcb,0xeb47ebcb,0xebcdec0d,0xeb89eb89,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x7ca70000,0xbe73d6f7,0x0000535d,0xd6f77ca7,0x535dbe73,0x7ca70000,0xbe73d6f7,0x0000535d,0x22ff22ff,0x22ff3b7f,0x22ff22ff,0x22ff22ff,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff3b7f,0x22ff22ff,0x22ff22ff,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xdea7d667,0xd665ce23,0xdea9dea9,0xd665c5df,0xd665e6e9,0xc5ddce25,0xce23c5dd,0xd667e6e9,0x23a52363,0x2be923a3,0x2321231f,0x2ba723a5,0x2be72363,0x2c2b2c2b,0x2be723a5,0x2c2b2c2b,0xebcdebcb,0xec11ebcd,0xe347e345,0xec0febcd,0xec0febcb,0xec53ec53,0xec0febcd,0xec53ec53,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x535d535d,0x00000000,0x535d0000,0x0000535d,0x00000000,0x535d535d,0x00000000,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f22ff,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f22ff,0x22ff3b7f,0x22ff22ff, +0xc5ddd665,0xd667d665,0xe6e9dea9,0xdea9c5dd,0xd667dea9,0xef2dc5dd,0xce23dea9,0xdea7e6e9,0x2c292be9,0x2be72be7,0x2be92c2b,0x2be72be7,0x2be92c29,0x2ba523a5,0x23a52be7,0x23a52361,0xec51ec51,0xec0fec0f,0xec51ec53,0xec0fec0f,0xec11ec51,0xec0debcd,0xec0dec0f,0xec0deb89,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x3b7f22ff,0x1abf3b7f,0x3b7f1abf,0x1abf22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x3b7f22ff,0x1abf3b7f,0x3b7f1abf,0x1abf22ff,0x1abf1abf, +0xef2dc5dd,0xe6e9ef2d,0xe6e9dea7,0xc5dde6e9,0xef2dd667,0xef2dc5dd,0xc5dddea9,0xdea9dea9,0x23632361,0x2ba72ba7,0x23a32363,0x2be72be7,0x23632361,0x2be72363,0x231f231f,0x2be723a3,0xebcbeb89,0xec0fec0f,0xebcdebcd,0xec0fec11,0xebcbeb8b,0xec0febcb,0xe347e347,0xec0febcd,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xce23dea9,0xe6ebc5dd,0xce23ce23,0xd665c5dd,0xc5ddd665,0xdea7ef2d,0xdee9d665,0xce23c5dd,0x236323a3,0x2321231f,0x2c292be9,0x231f2321,0x2be723a5,0x2be72ba5,0x2c2b2c2b,0x23212be7,0xebcdebcd,0xe347e345,0xec51ec51,0xe345eb89,0xec11ec0d,0xec0fec0d,0xec53ec53,0xeb47ec0f,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff22ff,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff22ff,0x22ff22ff,0x1abf1abf,0x1abf1abf, +0xe6a9e6e9,0xc5ddef2d,0xdea9c5dd,0xc5dddea7,0xce23d665,0xdea9dea7,0xc5dde6e9,0xdea9eeed,0x2be72be7,0x2c2b2c29,0x2be72be9,0x23a52ba5,0x23a5231f,0x2be92be7,0x23a523a5,0x2c2b2be9,0xec0fec0f,0xec53ec51,0xec0fec51,0xebcdec0d,0xebcde345,0xec51ec0f,0xebcdebcd,0xec53ec51,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1abf1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff, +0xe6e9e6e9,0xef2dd667,0xdea9c5dd,0xc5ddd667,0xc5ddce23,0xdea9ce23,0xeeedc5dd,0xdea9dea7,0x2c292c29,0x23a523a5,0x2ba52be9,0x2be72be7,0x2be92c2b,0x23632363,0x2be72ba5,0x236123a3,0xec51ec51,0xebcdec0d,0xec0dec51,0xec11ec0f,0xec11ec53,0xebcbebcb,0xec0fec0d,0xeb8bebcd,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x3b7f3b7f, +0xdea9e6eb,0xc5dddea7,0xe6ebdea9,0xc5dddea7,0xdea9dea9,0xc5ddde67,0xdea9dea7,0xe6ebdea9,0x23632321,0x2ba52be9,0x23a32361,0x2c292be9,0x236323a5,0x2be92be7,0x23632361,0x2be92be9,0xebcbeb89,0xec0dec51,0xebcdeb8b,0xec51ec51,0xebcdebcd,0xec51ec0f,0xebcbeb8b,0xec51ec11,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x94e794e7,0x8ca58ca5,0xad6b9d29,0x94e794e7,0xa56ba56b,0x8ca58463,0xa529a529,0x8ca58ca5,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0xfd01c801,0xfa81fd01,0xc801f801,0xc801c801,0xf801f801,0xf801fa81,0xc801f801,0xc801c801,0xfd01c801,0xfa81fd01,0xc801f801,0xc801c801,0xf801f801,0xf801fa81,0xc801f801,0xc801c801,0xfd01c801,0xfa81fd01,0xc801f801,0xc801c801,0xf801f801,0xf801fa81,0xc801f801,0xc801c801, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa56b9d29,0xbdefb5ef,0xa56badad,0x9d299d29,0x8ca58ca5,0x9d2994e7,0x8ca57c63,0x9d2994e7,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xffc1fa81,0xfa81ffc1,0xf801f801,0xf801c801,0xfa81f801,0xfa81ffc1,0xf801f801,0xc801c801,0xffc1fa81,0xfa81ffc1,0xf801f801,0xf801c801,0xfa81f801,0xfa81ffc1,0xf801f801,0xc801c801,0xffc1fa81,0xfa81ffc1,0xf801f801,0xf801c801,0xfa81f801,0xfa81ffc1,0xf801f801,0xc801c801, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xadadadad,0x9d299d29,0xadadb5ad,0x9d29a529,0xadada56b,0xa56ba56b,0xb5efb5ad,0xa56ba56b,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfd01fa81,0xfa81ffc1,0xf801c801,0xfa81f801,0xfa81f801,0xfd01ffc1,0xf801c801,0xf801f801,0xfd01fa81,0xfa81ffc1,0xf801c801,0xfa81f801,0xfa81f801,0xfd01ffc1,0xf801c801,0xf801f801,0xfd01fa81,0xfa81ffc1,0xf801c801,0xfa81f801,0xfa81f801,0xfd01ffc1,0xf801c801,0xf801f801, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x94e79d29,0xadada56b,0x94e79d29,0xadad9d29,0x9d2994e7,0xadadadad,0x94e79d29,0xadadbdef,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf801f801,0xf801fa81,0xfa81fa81,0xffc1fd01,0xfa81fa81,0xfa81fa81,0xfa81fa81,0xf801f801,0xf801f801,0xf801fa81,0xfa81fa81,0xffc1fd01,0xfa81fa81,0xfa81fa81,0xfa81fa81,0xf801f801,0xf801f801,0xf801fa81,0xfa81fa81,0xffc1fd01,0xfa81fa81,0xfa81fa81,0xfa81fa81,0xf801f801, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x9d29a56b,0x9d2994e7,0xa56bad6b,0x84638463,0xa52994e7,0x8ca594e7,0xad6bad6b,0x84638ca5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc801f801,0xfa81f801,0xfa81ffc1,0xfa81fa81,0xffc1fd01,0xffc1fa81,0xfd01ffc1,0xf801fa81,0xc801f801,0xfa81f801,0xfa81ffc1,0xfa81fa81,0xffc1fd01,0xffc1fa81,0xfd01ffc1,0xf801fa81,0xc801f801,0xfa81f801,0xfa81ffc1,0xfa81fa81,0xffc1fd01,0xffc1fa81,0xfd01ffc1,0xf801fa81, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x84638ca5,0xadad94e7,0x846394e7,0x94e794e7,0x846394e7,0x9d2994e7,0x94e784a5,0x95298ca5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf801f801,0xffc1fd01,0xfa81fa81,0xf801c801,0xf801f801,0xfd01c801,0xfa81fd01,0xf801fa81,0xf801f801,0xffc1fd01,0xfa81fa81,0xf801c801,0xf801f801,0xfd01c801,0xfa81fd01,0xf801fa81,0xf801f801,0xffc1fd01,0xfa81fa81,0xf801c801,0xf801f801,0xfd01c801,0xfa81fd01,0xf801fa81, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xb5efb5ef,0xa56badad,0x9d299d29,0xa5299d29,0xb5efadad,0x9d29a56b,0xbdefbdef,0xa529a56b,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf801c801,0xf801fa81,0xf801f801,0xc801c801,0xf801f801,0xfa81f801,0xf801f801,0xf801fd01,0xf801c801,0xf801fa81,0xf801f801,0xc801c801,0xf801f801,0xfa81f801,0xf801f801,0xf801fd01,0xf801c801,0xf801fa81,0xf801f801,0xc801c801,0xf801f801,0xfa81f801,0xf801f801,0xf801fd01, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x94e794e7,0xbdefb5ef,0xa56ba56b,0xadadadad,0x94e78ca5,0xadada56b,0xa56ba56b,0xadadadad,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc801c801,0xfa81f801,0xfa81fd01,0xc801c801,0xfa81fa81,0xc801f801,0xfd01f801,0xfd01ffc1,0xc801c801,0xfa81f801,0xfa81fd01,0xc801c801,0xfa81fa81,0xc801f801,0xfd01f801,0xfd01ffc1,0xc801c801,0xfa81f801,0xfa81fd01,0xc801c801,0xfa81fa81,0xc801f801,0xfd01f801,0xfd01ffc1, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa56ba56b,0x94e78ca5,0xa56badad,0x94e794e7,0x9d2994e7,0x84a594e7,0x9d299d29,0x8ca58ca5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc801c801,0xfd01fa81,0xfd01ffc1,0xf801f801,0xffc1fd01,0xc801fa81,0xfa81f801,0xfa81fa81,0xc801c801,0xfd01fa81,0xfd01ffc1,0xf801f801,0xffc1fd01,0xc801fa81,0xfa81f801,0xfa81fa81,0xc801c801,0xfd01fa81,0xfd01ffc1,0xf801f801,0xffc1fd01,0xc801fa81,0xfa81f801,0xfa81fa81, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x9d2994e7,0xadad9529,0x84638463,0xa56b9d29,0xa56b94e7,0xbdefbdef,0xa56b9d29,0xb5efbdef,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf801f801,0xfa81f801,0xfa81fa81,0xf801f801,0xffc1fa81,0xc801fa81,0xf801c801,0xf801fa81,0xf801f801,0xfa81f801,0xfa81fa81,0xf801f801,0xffc1fa81,0xc801fa81,0xf801c801,0xf801fa81,0xf801f801,0xfa81f801,0xfa81fa81,0xf801f801,0xffc1fa81,0xc801fa81,0xf801c801,0xf801fa81, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xadadadad,0xa56ba56b,0xadadb5ef,0xa56ba56b,0xadadadad,0xa5299d29,0x9d29a56b,0x9d298ca5,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfa81f801,0xf801fa81,0xf801f801,0xf801c801,0xfa81fa81,0xf801fa81,0xfd01f801,0xf801fa81,0xfa81f801,0xf801fa81,0xf801f801,0xf801c801,0xfa81fa81,0xf801fa81,0xfd01f801,0xf801fa81,0xfa81f801,0xf801fa81,0xf801f801,0xf801c801,0xfa81fa81,0xf801fa81,0xfd01f801,0xf801fa81, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x94e78ca5,0xa56ba56b,0x94e794e7,0xa56bad6b,0x94e78ca5,0xa56b94e7,0x84638463,0xa56b9529,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfd01f801,0xfa81ffc1,0xfd01fa81,0xf801fa81,0xf801f801,0xfa81f801,0xffc1fd01,0xf801fd01,0xfd01f801,0xfa81ffc1,0xfd01fa81,0xf801fa81,0xf801f801,0xfa81f801,0xffc1fd01,0xf801fd01,0xfd01f801,0xfa81ffc1,0xfd01fa81,0xf801fa81,0xf801f801,0xfa81f801,0xffc1fd01,0xf801fd01, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x94e794e7,0x84638463,0xb5adadad,0x84638ca5,0xad6b9d29,0xa56ba529,0xbdefbdef,0x84a5a56b,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xffc1f801,0xfa81ffc1,0xffc1ffc1,0xf801fd01,0xf801c801,0xfa81f801,0xffc1ffc1,0xf801fa81,0xffc1f801,0xfa81ffc1,0xffc1ffc1,0xf801fd01,0xf801c801,0xfa81f801,0xffc1ffc1,0xf801fa81,0xffc1f801,0xfa81ffc1,0xffc1ffc1,0xf801fd01,0xf801c801,0xfa81f801,0xffc1ffc1,0xf801fa81, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa56ba56b,0xbdefb5ad,0xa56badad,0x9d29a529,0x9d298463,0xadada56b,0x9d299d29,0xb5efadad,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfa81f801,0xfa81fd01,0xfa81fa81,0xf801fa81,0xfa81fa81,0xfa81f801,0xfa81fd01,0xf801f801,0xfa81f801,0xfa81fd01,0xfa81fa81,0xf801fa81,0xfa81fa81,0xfa81f801,0xfa81fd01,0xf801f801,0xfa81f801,0xfa81fd01,0xfa81fa81,0xf801fa81,0xfa81fa81,0xfa81f801,0xfa81fd01,0xf801f801, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xb5adb5ad,0x9d299d29,0xa529adad,0xa56ba56b,0xadadbdef,0x94e794e7,0xa56ba529,0x8ca594e7,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf801c801,0xf801fa81,0xf801c801,0xfa81f801,0xfd01fd01,0xf801fa81,0xf801fa81,0xc801f801,0xf801c801,0xf801fa81,0xf801c801,0xfa81f801,0xfd01fd01,0xf801fa81,0xf801fa81,0xc801f801,0xf801c801,0xf801fa81,0xf801c801,0xfa81f801,0xfd01fd01,0xf801fa81,0xf801fa81,0xc801f801, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x94e78ca5,0xa529adad,0x94e78ca5,0xb5adadad,0x94e79d29,0xadada56b,0x94e78ca5,0xadadadad,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf801c801,0xf801fa81,0xf801f801,0xc801c801,0xfa81fd01,0xf801f801,0xf801f801,0xc801c801,0xf801c801,0xf801fa81,0xf801f801,0xc801c801,0xfa81fd01,0xf801f801,0xf801f801,0xc801c801,0xf801c801,0xf801fa81,0xf801f801,0xc801c801,0xfa81fd01,0xf801f801,0xf801f801,0xc801c801, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf39cf,0x7bdf9ce7,0x7bdf39cf,0x7bdf39cf,0x7bdf9ce7,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df, +0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0x69df69df,0xfd01c801,0xfa81fd01,0xc801f801,0xc801c801,0xf801f801,0xf801fa81,0xc801f801,0xc801c801,0xfd01c801,0xfa81fd01,0xc801f801,0xc801c801,0xf801f801,0xf801fa81,0xc801f801,0xc801c801, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x39cf7bdf,0x39cf39cf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf39cf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x39cf9ce7,0x39cf39cf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf39cf,0x7bdf39cf,0x7bdf7bdf,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xffc1fa81,0xfa81ffc1,0xf801f801,0xf801c801,0xfa81f801,0xfa81ffc1,0xf801f801,0xc801c801,0xffc1fa81,0xfa81ffc1,0xf801f801,0xf801c801,0xfa81f801,0xfa81ffc1,0xf801f801,0xc801c801, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x39cf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce77bdf,0x7bdf39cf,0x39cf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce79ce7,0x7bdf39cf,0x39cf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x39cf7bdf,0x9ce77bdf,0x9ce79ce7,0x7bdf39cf,0x39cf39cf,0x7bdf9ce7,0x39cf9ce7,0x7bdf7bdf,0x39cf7bdf,0x9ce77bdf,0x9ce79ce7,0x7bdf39cf,0x39cf39cf,0x7bdf9ce7,0x39cf9ce7,0x7bdf7bdf,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfd01fa81,0xfa81ffc1,0xf801c801,0xfa81f801,0xfa81f801,0xfd01ffc1,0xf801c801,0xf801f801,0xfd01fa81,0xfa81ffc1,0xf801c801,0xfa81f801,0xfa81f801,0xfd01ffc1,0xf801c801,0xf801f801, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf9ce7,0x9ce79ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf9ce7,0x9ce79ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf39cf,0x7bdf7bdf,0x39cf9ce7,0x9ce79ce7,0x7bdf7bdf,0x39cf7bdf,0x7bdf7bdf, +0x9ce77bdf,0x39cf39cf,0x7bdf7bdf,0x39cf9ce7,0x9ce79ce7,0x7bdf7bdf,0x39cf7bdf,0x7bdf7bdf,0x9ce77bdf,0x39cf39cf,0x7bdf7bdf,0x39cf9ce7,0x9ce79ce7,0x7bdf7bdf,0x39cf7bdf,0x7bdf7bdf,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf801f801,0xf801fa81,0xfa81fa81,0xffc1fd01,0xfa81fa81,0xfa81fa81,0xfa81fa81,0xf801f801,0xf801f801,0xf801fa81,0xfa81fa81,0xffc1fd01,0xfa81fa81,0xfa81fa81,0xfa81fa81,0xf801f801, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce739cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce739cf,0x39cf7bdf,0x7bdf7bdf,0x39cf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce739cf,0x39cf7bdf,0x7bdf7bdf,0x39cf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x9ce739cf,0x39cf7bdf,0x7bdf7bdf,0x39cf7bdf,0x7bdf39cf,0x7bdf7bdf,0x9ce79ce7,0x7bdf39cf,0x9ce739cf,0x39cf7bdf,0x7bdf39cf,0x39cf7bdf,0x7bdf39cf, +0x39cf7bdf,0x9ce79ce7,0x7bdf39cf,0x9ce739cf,0x39cf7bdf,0x7bdf39cf,0x39cf7bdf,0x7bdf39cf,0x39cf39cf,0x9ce79ce7,0x7bdf39cf,0x9ce739cf,0x39cf7bdf,0x7bdf39cf,0x39cf7bdf,0x7bdf39cf,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc801f801,0xfa81f801,0xfa81ffc1,0xfa81fa81,0xffc1fd01,0xffc1fa81,0xfd01ffc1,0xf801fa81,0xc801f801,0xfa81f801,0xfa81ffc1,0xfa81fa81,0xffc1fd01,0xffc1fa81,0xfd01ffc1,0xf801fa81, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x39cf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x39cf7bdf,0x7bdf7bdf,0x9ce739cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf39cf,0x39cf7bdf,0x7bdf7bdf,0x9ce739cf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf39cf,0x39cf7bdf,0x7bdf7bdf,0x9ce739cf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf39cf,0x39cf7bdf,0x7bdf9ce7,0x9ce739cf,0x39cf9ce7, +0x9ce77bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf39cf,0x39cf7bdf,0x7bdf9ce7,0x9ce739cf,0x39cf9ce7,0x9ce79ce7,0x7bdf7bdf,0x7bdf39cf,0x7bdf39cf,0x39cf7bdf,0x7bdf9ce7,0x9ce739cf,0x39cf9ce7,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf801f801,0xffc1fd01,0xfa81fa81,0xf801c801,0xf801f801,0xfd01c801,0xfa81fd01,0xf801fa81,0xf801f801,0xffc1fd01,0xfa81fa81,0xf801c801,0xf801f801,0xfd01c801,0xfa81fd01,0xf801fa81, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x39cf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x7bdf39cf,0x9ce77bdf,0x39cf39cf,0x7bdf9ce7,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf7bdf,0x39cf39cf,0x7bdf39cf,0x9ce77bdf,0x39cf39cf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf39cf,0x7bdf39cf,0x9ce77bdf,0x39cf39cf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf39cf,0x7bdf39cf,0x9ce77bdf,0x39cf39cf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf39cf,0x7bdf39cf,0x9ce77bdf,0x39cf39cf,0x7bdf9ce7,0x9ce77bdf, +0x7bdf7bdf,0x7bdf7bdf,0x39cf39cf,0x7bdf39cf,0x9ce77bdf,0x39cf39cf,0x7bdf9ce7,0x9ce77bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf39cf,0x7bdf39cf,0x9ce77bdf,0x39cf39cf,0x7bdf9ce7,0x9ce77bdf,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf801c801,0xf801fa81,0xf801f801,0xc801c801,0xf801f801,0xfa81f801,0xf801f801,0xf801fd01,0xf801c801,0xf801fa81,0xf801f801,0xc801c801,0xf801f801,0xfa81f801,0xf801f801,0xf801fd01, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf9ce7,0x39cf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf9ce7,0x39cf7bdf,0x9ce79ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce77bdf,0x39cf9ce7,0x39cf7bdf,0x9ce79ce7,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x39cf7bdf,0x9ce79ce7,0x39cf9ce7,0x39cf7bdf,0x9ce79ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x9ce79ce7,0x39cf9ce7,0x39cf7bdf,0x9ce79ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x9ce79ce7,0x39cf9ce7,0x39cf7bdf,0x39cf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x9ce79ce7,0x39cf9ce7,0x39cf7bdf,0x39cf9ce7,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x39cf7bdf,0x9ce79ce7,0x39cf9ce7,0x39cf7bdf,0x39cf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x39cf39cf,0x39cf7bdf,0x9ce79ce7,0x39cf9ce7,0x39cf7bdf,0x39cf9ce7,0x7bdf7bdf,0x7bdf7bdf,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc801c801,0xfa81f801,0xfa81fd01,0xc801c801,0xfa81fa81,0xc801f801,0xfd01f801,0xfd01ffc1,0xc801c801,0xfa81f801,0xfa81fd01,0xc801c801,0xfa81fa81,0xc801f801,0xfd01f801,0xfd01ffc1, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce77bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce77bdf,0x9ce739cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce77bdf,0x9ce739cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce77bdf,0x9ce739cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x9ce77bdf,0x7bdf7bdf,0x9ce77bdf,0x9ce739cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce739cf,0x7bdf7bdf,0x9ce77bdf,0x9ce739cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce739cf,0x7bdf7bdf,0x9ce77bdf,0x9ce739cf,0x9ce77bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce739cf,0x39cf7bdf,0x9ce77bdf,0x9ce739cf,0x39cf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x9ce739cf,0x39cf7bdf,0x9ce77bdf,0x9ce739cf,0x39cf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce79ce7,0x9ce739cf,0x39cf7bdf,0x9ce77bdf,0x9ce739cf,0x39cf7bdf,0x7bdf7bdf,0x39cf7bdf,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc801c801,0xfd01fa81,0xfd01ffc1,0xf801f801,0xffc1fd01,0xc801fa81,0xfa81f801,0xfa81fa81,0xc801c801,0xfd01fa81,0xfd01ffc1,0xf801f801,0xffc1fd01,0xc801fa81,0xfa81f801,0xfa81fa81, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf39cf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x9ce739cf,0x7bdf7bdf,0x7bdf39cf,0x9ce77bdf,0x7bdf39cf,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf39cf,0x9ce739cf,0x7bdf7bdf,0x7bdf39cf,0x9ce77bdf,0x7bdf39cf,0x7bdf39cf,0x7bdf7bdf,0x7bdf39cf,0x9ce739cf,0x7bdf7bdf,0x7bdf39cf,0x9ce77bdf,0x7bdf39cf,0x9ce739cf,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf801f801,0xfa81f801,0xfa81fa81,0xf801f801,0xffc1fa81,0xc801fa81,0xf801c801,0xf801fa81,0xf801f801,0xfa81f801,0xfa81fa81,0xf801f801,0xffc1fa81,0xc801fa81,0xf801c801,0xf801fa81, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf9ce7,0x39cf9ce7,0x7bdf7bdf,0x39cf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf9ce7,0x39cf9ce7,0x7bdf7bdf,0x39cf39cf,0x7bdf7bdf,0x7bdf9ce7,0x7bdf7bdf, +0x7bdf39cf,0x7bdf9ce7,0x39cf9ce7,0x7bdf7bdf,0x39cf39cf,0x7bdf7bdf,0x39cf9ce7,0x7bdf9ce7,0x7bdf39cf,0x7bdf9ce7,0x39cf9ce7,0x7bdf7bdf,0x39cf39cf,0x7bdf7bdf,0x39cf9ce7,0x7bdf9ce7,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfa81f801,0xf801fa81,0xf801f801,0xf801c801,0xfa81fa81,0xf801fa81,0xfd01f801,0xf801fa81,0xfa81f801,0xf801fa81,0xf801f801,0xf801c801,0xfa81fa81,0xf801fa81,0xfd01f801,0xf801fa81, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf39cf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x39cf39cf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x39cf39cf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x39cf39cf,0x9ce79ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x39cf39cf,0x9ce79ce7,0x39cf39cf,0x7bdf7bdf,0x7bdf7bdf, +0x39cf9ce7,0x7bdf7bdf,0x39cf7bdf,0x39cf39cf,0x9ce79ce7,0x39cf39cf,0x39cf7bdf,0x7bdf7bdf,0x39cf9ce7,0x7bdf7bdf,0x39cf7bdf,0x39cf39cf,0x9ce79ce7,0x39cf39cf,0x39cf7bdf,0x7bdf7bdf,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfd01f801,0xfa81ffc1,0xfd01fa81,0xf801fa81,0xf801f801,0xfa81f801,0xffc1fd01,0xf801fd01,0xfd01f801,0xfa81ffc1,0xfd01fa81,0xf801fa81,0xf801f801,0xfa81f801,0xffc1fd01,0xf801fd01, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce77bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce79ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf7bdf,0x9ce77bdf,0x9ce79ce7,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce739cf,0x9ce79ce7,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce739cf,0x9ce79ce7,0x7bdf39cf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x7bdf7bdf,0x9ce739cf,0x9ce79ce7,0x7bdf39cf,0x9ce79ce7,0x7bdf7bdf,0x7bdf7bdf, +0x39cf7bdf,0x7bdf7bdf,0x9ce739cf,0x9ce79ce7,0x7bdf39cf,0x9ce79ce7,0x9ce77bdf,0x7bdf7bdf,0x39cf7bdf,0x7bdf7bdf,0x9ce739cf,0x9ce79ce7,0x7bdf39cf,0x9ce79ce7,0x9ce77bdf,0x39cf39cf,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xffc1f801,0xfa81ffc1,0xffc1ffc1,0xf801fd01,0xf801c801,0xfa81f801,0xffc1ffc1,0xf801fa81,0xffc1f801,0xfa81ffc1,0xffc1ffc1,0xf801fd01,0xf801c801,0xfa81f801,0xffc1ffc1,0xf801fa81, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf9ce7,0x7bdf7bdf,0x39cf9ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x39cf7bdf,0x7bdf9ce7,0x7bdf7bdf,0x39cf9ce7,0x39cf39cf,0x7bdf7bdf,0x7bdf7bdf,0x9ce77bdf,0x39cf39cf,0x7bdf9ce7,0x7bdf7bdf,0x39cf9ce7,0x39cf39cf,0x7bdf7bdf,0x7bdf7bdf, +0x9ce77bdf,0x39cf39cf,0x7bdf9ce7,0x7bdf7bdf,0x39cf9ce7,0x39cf39cf,0x7bdf7bdf,0x7bdf7bdf,0x9ce77bdf,0x39cf39cf,0x7bdf9ce7,0x7bdf7bdf,0x39cf9ce7,0x39cf39cf,0x7bdf7bdf,0x9ce79ce7,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfa81f801,0xfa81fd01,0xfa81fa81,0xf801fa81,0xfa81fa81,0xfa81f801,0xfa81fd01,0xf801f801,0xfa81f801,0xfa81fd01,0xfa81fa81,0xf801fa81,0xfa81fa81,0xfa81f801,0xfa81fd01,0xf801f801, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce77bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce77bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce77bdf,0x9ce79ce7,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x9ce79ce7,0x7bdf39cf,0x7bdf7bdf,0x9ce739cf,0x9ce79ce7,0x7bdf39cf,0x7bdf7bdf, +0x7bdf7bdf,0x9ce739cf,0x39cf39cf,0x7bdf7bdf,0x9ce739cf,0x9ce79ce7,0x39cf39cf,0x7bdf7bdf,0x7bdf7bdf,0x9ce739cf,0x39cf39cf,0x7bdf7bdf,0x9ce739cf,0x9ce79ce7,0x39cf39cf,0x7bdf7bdf,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf801c801,0xf801fa81,0xf801c801,0xfa81f801,0xfd01fd01,0xf801fa81,0xf801fa81,0xc801f801,0xf801c801,0xf801fa81,0xf801c801,0xfa81f801,0xfd01fd01,0xf801fa81,0xf801fa81,0xc801f801, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf7bdf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf9ce7,0x7bdf7bdf,0x7bdf9ce7,0x7bdf7bdf, +0x7bdf7bdf,0x7bdf9ce7,0x9ce79ce7,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x9ce79ce7,0x7bdf39cf,0x7bdf7bdf,0x7bdf39cf,0x9ce79ce7,0x7bdf7bdf,0x7bdf39cf,0x7bdf7bdf,0x9ce79ce7,0x7bdf39cf,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69df,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf801c801,0xf801fa81,0xf801f801,0xc801c801,0xfa81fd01,0xf801f801,0xf801f801,0xc801c801,0xf801c801,0xf801fa81,0xf801f801,0xc801c801,0xfa81fd01,0xf801f801,0xf801f801,0xc801c801, +0 }; diff --git a/minecraftcpp-master/handheld/project/data/images/terrain_565.h b/minecraftcpp-master/handheld/project/data/images/terrain_565.h new file mode 100644 index 0000000..609d7f4 --- /dev/null +++ b/minecraftcpp-master/handheld/project/data/images/terrain_565.h @@ -0,0 +1,1052 @@ +/********************************************************** + * PVRTexture Tool v 3.23 + * PVRTC Library v 1.142. 0. 0 Beta + **********************************************************/ + +#ifndef A32BIT + #define A32BIT static const unsigned long +#endif + +A32BIT terrain_565[] = { + +/* Header */ +0x00000034, /* dwHeaderSize */ +0x00000100, /* dwHeight */ +0x00000100, /* dwWidth */ +0x00000000, /* dwMipMapCount */ +0x00010013, /* dwpfFlags */ +0x00020000, /* dwDataSize */ +0x00000010, /* dwBitCount */ +0x0000f800, /* dwRBitMask */ +0x000007e0, /* dwGBitMask */ +0x0000001f, /* dwBBitMask */ +0x00000000, /* dwAlphaBitMask */ +0x21525650, /* dwPVR */ +0x00000001, /* dwNumSurfs */ + +/* Data */ +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x7bef9cd3,0x7bef7bef, +0x7bef7bef,0x7bef9cd3,0x9cd39cd3,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x9cd39cd3,0x7bef39e7,0x7bef7bef,0x7bef39e7,0x9cd39cd3,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x9cd39cd3,0x7bef39e7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xfaa0fd00,0xf800f800,0xf800f800,0xc800c800,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xfaa0fd00,0xf800f800,0xf800f800,0xc800c800, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd39cd3,0x7bef39e7,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x7bef39e7,0x7bef7bef, +0x7bef7bef,0x9cd339e7,0x39e739e7,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x39e739e7,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x39e739e7,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x39e739e7,0x7bef7bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800c800,0xf800faa0,0xf800c800,0xfaa0f800,0xfd00fd00,0xf800faa0,0xf800faa0,0xc800f800,0xf800c800,0xf800faa0,0xf800c800,0xfaa0f800,0xfd00fd00,0xf800faa0,0xf800faa0,0xc800f800, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x39e79cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef9cd3,0x7bef7bef,0x39e79cd3,0x39e739e7,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x39e79cd3,0x39e739e7,0x7bef7bef,0x7bef7bef, +0x9cd37bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x39e79cd3,0x39e739e7,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x39e79cd3,0x39e739e7,0x7bef7bef,0x9cd39cd3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfaa0f800,0xfaa0fd00,0xfaa0faa0,0xf800faa0,0xfaa0faa0,0xfaa0f800,0xfaa0fd00,0xf800f800,0xfaa0f800,0xfaa0fd00,0xfaa0faa0,0xf800faa0,0xfaa0faa0,0xfaa0f800,0xfaa0fd00,0xf800f800, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x9cd37bef,0x9cd39cd3,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x7bef39e7,0x9cd39cd3,0x7bef7bef,0x7bef7bef, +0x39e77bef,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x7bef39e7,0x9cd39cd3,0x9cd37bef,0x7bef7bef,0x39e77bef,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x7bef39e7,0x9cd39cd3,0x9cd37bef,0x39e739e7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xffe0f800,0xfaa0ffe0,0xffe0ffe0,0xf800fd00,0xf800c800,0xfaa0f800,0xffe0ffe0,0xf800faa0,0xffe0f800,0xfaa0ffe0,0xffe0ffe0,0xf800fd00,0xf800c800,0xfaa0f800,0xffe0ffe0,0xf800faa0, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x39e77bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x39e739e7,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x39e739e7,0x9cd39cd3,0x39e739e7,0x7bef7bef,0x7bef7bef, +0x39e79cd3,0x7bef7bef,0x39e77bef,0x39e739e7,0x9cd39cd3,0x39e739e7,0x39e77bef,0x7bef7bef,0x39e79cd3,0x7bef7bef,0x39e77bef,0x39e739e7,0x9cd39cd3,0x39e739e7,0x39e77bef,0x7bef7bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfd00f800,0xfaa0ffe0,0xfd00faa0,0xf800faa0,0xf800f800,0xfaa0f800,0xffe0fd00,0xf800fd00,0xfd00f800,0xfaa0ffe0,0xfd00faa0,0xf800faa0,0xf800f800,0xfaa0f800,0xffe0fd00,0xf800fd00, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x39e79cd3,0x7bef7bef,0x39e739e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x39e79cd3,0x7bef7bef,0x39e739e7,0x7bef7bef,0x7bef9cd3,0x7bef7bef, +0x7bef39e7,0x7bef9cd3,0x39e79cd3,0x7bef7bef,0x39e739e7,0x7bef7bef,0x39e79cd3,0x7bef9cd3,0x7bef39e7,0x7bef9cd3,0x39e79cd3,0x7bef7bef,0x39e739e7,0x7bef7bef,0x39e79cd3,0x7bef9cd3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfaa0f800,0xf800faa0,0xf800f800,0xf800c800,0xfaa0faa0,0xf800faa0,0xfd00f800,0xf800faa0,0xfaa0f800,0xf800faa0,0xf800f800,0xf800c800,0xfaa0faa0,0xf800faa0,0xfd00f800,0xf800faa0, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x9cd339e7,0x7bef7bef,0x7bef39e7,0x9cd37bef,0x7bef39e7,0x7bef7bef, +0x7bef7bef,0x7bef39e7,0x9cd339e7,0x7bef7bef,0x7bef39e7,0x9cd37bef,0x7bef39e7,0x7bef39e7,0x7bef7bef,0x7bef39e7,0x9cd339e7,0x7bef7bef,0x7bef39e7,0x9cd37bef,0x7bef39e7,0x9cd339e7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0xfaa0f800,0xfaa0faa0,0xf800f800,0xffe0faa0,0xc800faa0,0xf800c800,0xf800faa0,0xf800f800,0xfaa0f800,0xfaa0faa0,0xf800f800,0xffe0faa0,0xc800faa0,0xf800c800,0xf800faa0, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x9cd339e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x9cd339e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x9cd339e7,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x9cd37bef,0x7bef7bef,0x9cd37bef,0x9cd339e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x7bef7bef,0x9cd37bef,0x9cd339e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x7bef7bef,0x9cd37bef,0x9cd339e7,0x9cd37bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x39e77bef,0x9cd37bef,0x9cd339e7,0x39e77bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x9cd339e7,0x39e77bef,0x9cd37bef,0x9cd339e7,0x39e77bef,0x7bef7bef,0x7bef7bef,0x9cd39cd3,0x9cd339e7,0x39e77bef,0x9cd37bef,0x9cd339e7,0x39e77bef,0x7bef7bef,0x39e77bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc800c800,0xfd00faa0,0xfd00ffe0,0xf800f800,0xffe0fd00,0xc800faa0,0xfaa0f800,0xfaa0faa0,0xc800c800,0xfd00faa0,0xfd00ffe0,0xf800f800,0xffe0fd00,0xc800faa0,0xfaa0f800,0xfaa0faa0, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e79cd3,0x39e77bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e79cd3,0x39e77bef,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x39e79cd3,0x39e77bef,0x9cd39cd3,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x39e77bef,0x9cd39cd3,0x39e79cd3,0x39e77bef,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x9cd39cd3,0x39e79cd3,0x39e77bef,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x9cd39cd3,0x39e79cd3,0x39e77bef,0x39e79cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x9cd39cd3,0x39e79cd3,0x39e77bef,0x39e79cd3,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x39e77bef,0x9cd39cd3,0x39e79cd3,0x39e77bef,0x39e79cd3,0x7bef7bef,0x7bef7bef,0x39e739e7,0x39e77bef,0x9cd39cd3,0x39e79cd3,0x39e77bef,0x39e79cd3,0x7bef7bef,0x7bef7bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc800c800,0xfaa0f800,0xfaa0fd00,0xc800c800,0xfaa0faa0,0xc800f800,0xfd00f800,0xfd00ffe0,0xc800c800,0xfaa0f800,0xfaa0fd00,0xc800c800,0xfaa0faa0,0xc800f800,0xfd00f800,0xfd00ffe0, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x39e739e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef39e7,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef39e7,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef39e7,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef39e7,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef39e7,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x9cd37bef, +0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef39e7,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x9cd37bef,0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef39e7,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x9cd37bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xf800f800,0xfaa0f800,0xf800f800,0xf800fd00,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xf800f800,0xfaa0f800,0xf800f800,0xf800fd00, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x39e77bef,0x7bef7bef,0x7bef39e7,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x39e77bef,0x7bef7bef,0x9cd339e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x39e77bef,0x7bef7bef,0x9cd339e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x39e77bef,0x7bef7bef,0x9cd339e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x39e77bef,0x7bef9cd3,0x9cd339e7,0x39e79cd3, +0x9cd37bef,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x39e77bef,0x7bef9cd3,0x9cd339e7,0x39e79cd3,0x9cd39cd3,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x39e77bef,0x7bef9cd3,0x9cd339e7,0x39e79cd3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0xffe0fd00,0xfaa0faa0,0xf800c800,0xf800f800,0xfd00c800,0xfaa0fd00,0xf800faa0,0xf800f800,0xffe0fd00,0xfaa0faa0,0xf800c800,0xf800f800,0xfd00c800,0xfaa0fd00,0xf800faa0, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x39e77bef,0x7bef7bef,0x39e77bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x39e77bef,0x7bef7bef,0x39e77bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x9cd339e7,0x39e77bef,0x7bef7bef,0x39e77bef,0x7bef39e7,0x7bef7bef,0x9cd39cd3,0x7bef39e7,0x9cd339e7,0x39e77bef,0x7bef39e7,0x39e77bef,0x7bef39e7, +0x39e77bef,0x9cd39cd3,0x7bef39e7,0x9cd339e7,0x39e77bef,0x7bef39e7,0x39e77bef,0x7bef39e7,0x39e739e7,0x9cd39cd3,0x7bef39e7,0x9cd339e7,0x39e77bef,0x7bef39e7,0x39e77bef,0x7bef39e7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc800f800,0xfaa0f800,0xfaa0ffe0,0xfaa0faa0,0xffe0fd00,0xffe0faa0,0xfd00ffe0,0xf800faa0,0xc800f800,0xfaa0f800,0xfaa0ffe0,0xfaa0faa0,0xffe0fd00,0xffe0faa0,0xfd00ffe0,0xf800faa0, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e79cd3,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e79cd3,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef7bef,0x39e79cd3,0x9cd39cd3,0x7bef7bef,0x39e77bef,0x7bef7bef, +0x9cd37bef,0x39e739e7,0x7bef7bef,0x39e79cd3,0x9cd39cd3,0x7bef7bef,0x39e77bef,0x7bef7bef,0x9cd37bef,0x39e739e7,0x7bef7bef,0x39e79cd3,0x9cd39cd3,0x7bef7bef,0x39e77bef,0x7bef7bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0xf800faa0,0xfaa0faa0,0xffe0fd00,0xfaa0faa0,0xfaa0faa0,0xfaa0faa0,0xf800f800,0xf800f800,0xf800faa0,0xfaa0faa0,0xffe0fd00,0xfaa0faa0,0xfaa0faa0,0xfaa0faa0,0xf800f800, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x39e739e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x7bef39e7,0x39e739e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd39cd3,0x7bef39e7,0x39e739e7,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x39e77bef,0x9cd37bef,0x9cd39cd3,0x7bef39e7,0x39e739e7,0x7bef9cd3,0x39e79cd3,0x7bef7bef,0x39e77bef,0x9cd37bef,0x9cd39cd3,0x7bef39e7,0x39e739e7,0x7bef9cd3,0x39e79cd3,0x7bef7bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfd00faa0,0xfaa0ffe0,0xf800c800,0xfaa0f800,0xfaa0f800,0xfd00ffe0,0xf800c800,0xf800f800,0xfd00faa0,0xfaa0ffe0,0xf800c800,0xfaa0f800,0xfaa0f800,0xfd00ffe0,0xf800c800,0xf800f800, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x39e77bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x39e79cd3,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x7bef7bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xffe0faa0,0xfaa0ffe0,0xf800f800,0xf800c800,0xfaa0f800,0xfaa0ffe0,0xf800f800,0xc800c800,0xffe0faa0,0xfaa0ffe0,0xf800f800,0xf800c800,0xfaa0f800,0xfaa0ffe0,0xf800f800,0xc800c800, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef39e7,0x7bef9cd3,0x7bef39e7,0x7bef39e7,0x7bef9cd3,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0xfd00c800,0xfaa0fd00,0xc800f800,0xc800c800,0xf800f800,0xf800faa0,0xc800f800,0xc800c800,0xfd00c800,0xfaa0fd00,0xc800f800,0xc800c800,0xf800f800,0xf800faa0,0xc800f800,0xc800c800, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x94d38c92,0xa534ad96,0x94f38cb2,0xb5b6adb6,0x94f39d14,0xad96a555,0x94d38cb2,0xadb6ad96,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xfaa0fd00,0xf800f800,0xf800f800,0xc800c800,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xfaa0fd00,0xf800f800,0xf800f800,0xc800c800,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xfaa0fd00,0xf800f800,0xf800f800,0xc800c800, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xb5b6b5b6,0x9d149d34,0xa534adb6,0xa575a555,0xad96bdf7,0x94f394f3,0xa575a534,0x8cb294f3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800c800,0xf800faa0,0xf800c800,0xfaa0f800,0xfd00fd00,0xf800faa0,0xf800faa0,0xc800f800,0xf800c800,0xf800faa0,0xf800c800,0xfaa0f800,0xfd00fd00,0xf800faa0,0xf800faa0,0xc800f800,0xf800c800,0xf800faa0,0xf800c800,0xfaa0f800,0xfd00fd00,0xf800faa0,0xf800faa0,0xc800f800, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa555a575,0xbdf7b5b6,0xa575ad96,0x9d14a534,0x9d148451,0xadb6a575,0x9d149d14,0xb5d7adb6,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfaa0f800,0xfaa0fd00,0xfaa0faa0,0xf800faa0,0xfaa0faa0,0xfaa0f800,0xfaa0fd00,0xf800f800,0xfaa0f800,0xfaa0fd00,0xfaa0faa0,0xf800faa0,0xfaa0faa0,0xfaa0f800,0xfaa0fd00,0xf800f800,0xfaa0f800,0xfaa0fd00,0xfaa0faa0,0xf800faa0,0xfaa0faa0,0xfaa0f800,0xfaa0fd00,0xf800f800, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x94f394f3,0x84718451,0xb5b6ad96,0x84518cb2,0xad759d34,0xa575a534,0xbdf7bdf7,0x8492a555,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xffe0f800,0xfaa0ffe0,0xffe0ffe0,0xf800fd00,0xf800c800,0xfaa0f800,0xffe0ffe0,0xf800faa0,0xffe0f800,0xfaa0ffe0,0xffe0ffe0,0xf800fd00,0xf800c800,0xfaa0f800,0xffe0ffe0,0xf800faa0,0xffe0f800,0xfaa0ffe0,0xffe0ffe0,0xf800fd00,0xf800c800,0xfaa0f800,0xffe0ffe0,0xf800faa0, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x94d38cb2,0xa555a555,0x94f394f3,0xa575ad75,0x94d38cb2,0xa55594f3,0x84718471,0xa5559514,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfd00f800,0xfaa0ffe0,0xfd00faa0,0xf800faa0,0xf800f800,0xfaa0f800,0xffe0fd00,0xf800fd00,0xfd00f800,0xfaa0ffe0,0xfd00faa0,0xf800faa0,0xf800f800,0xfaa0f800,0xffe0fd00,0xf800fd00,0xfd00f800,0xfaa0ffe0,0xfd00faa0,0xf800faa0,0xf800f800,0xfaa0f800,0xffe0fd00,0xf800fd00, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xadb6ad96,0xa575a575,0xadb6b5f7,0xa555a575,0xad96adb6,0xa5349d14,0x9d34a555,0x9d348cb2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfaa0f800,0xf800faa0,0xf800f800,0xf800c800,0xfaa0faa0,0xf800faa0,0xfd00f800,0xf800faa0,0xfaa0f800,0xf800faa0,0xf800f800,0xf800c800,0xfaa0faa0,0xf800faa0,0xfd00f800,0xf800faa0,0xfaa0f800,0xf800faa0,0xf800f800,0xf800c800,0xfaa0faa0,0xf800faa0,0xfd00f800,0xf800faa0, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x9d1494f3,0xad969514,0x84718451,0xa5559d14,0xa55594d3,0xbdf7bdf7,0xa5759d14,0xb5d7bdf7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0xfaa0f800,0xfaa0faa0,0xf800f800,0xffe0faa0,0xc800faa0,0xf800c800,0xf800faa0,0xf800f800,0xfaa0f800,0xfaa0faa0,0xf800f800,0xffe0faa0,0xc800faa0,0xf800c800,0xf800faa0,0xf800f800,0xfaa0f800,0xfaa0faa0,0xf800f800,0xffe0faa0,0xc800faa0,0xf800c800,0xf800faa0, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa575a575,0x94f38c92,0xa555ad96,0x94f394d3,0x9d1494f3,0x849294f3,0x9d149d34,0x8cb28cb2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc800c800,0xfd00faa0,0xfd00ffe0,0xf800f800,0xffe0fd00,0xc800faa0,0xfaa0f800,0xfaa0faa0,0xc800c800,0xfd00faa0,0xfd00ffe0,0xf800f800,0xffe0fd00,0xc800faa0,0xfaa0f800,0xfaa0faa0,0xc800c800,0xfd00faa0,0xfd00ffe0,0xf800f800,0xffe0fd00,0xc800faa0,0xfaa0f800,0xfaa0faa0, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x94f394f3,0xbdf7b5d7,0xa555a575,0xad96adb6,0x94f38cb2,0xadb6a575,0xa555a555,0xad96adb6,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc800c800,0xfaa0f800,0xfaa0fd00,0xc800c800,0xfaa0faa0,0xc800f800,0xfd00f800,0xfd00ffe0,0xc800c800,0xfaa0f800,0xfaa0fd00,0xc800c800,0xfaa0faa0,0xc800f800,0xfd00f800,0xfd00ffe0,0xc800c800,0xfaa0f800,0xfaa0fd00,0xc800c800,0xfaa0faa0,0xc800f800,0xfd00f800,0xfd00ffe0, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xb5f7b5d7,0xa575ad96,0x9d349d34,0xa5349d14,0xb5f7ad96,0x9d14a555,0xbdf7bdf7,0xa534a575,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xf800f800,0xfaa0f800,0xf800f800,0xf800fd00,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xf800f800,0xfaa0f800,0xf800f800,0xf800fd00,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xf800f800,0xfaa0f800,0xf800f800,0xf800fd00, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x84718c92,0xadb694d3,0x845194d3,0x94f394d3,0x845194d3,0x9d1494f3,0x94f38492,0x95148cb2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0xffe0fd00,0xfaa0faa0,0xf800c800,0xf800f800,0xfd00c800,0xfaa0fd00,0xf800faa0,0xf800f800,0xffe0fd00,0xfaa0faa0,0xf800c800,0xf800f800,0xfd00c800,0xfaa0fd00,0xf800faa0,0xf800f800,0xffe0fd00,0xfaa0faa0,0xf800c800,0xf800f800,0xfd00c800,0xfaa0fd00,0xf800faa0, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x9d14a555,0x9d3494d3,0xa575ad75,0x84518471,0xa53494f3,0x8cb294f3,0xad75ad75,0x84718cb2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc800f800,0xfaa0f800,0xfaa0ffe0,0xfaa0faa0,0xffe0fd00,0xffe0faa0,0xfd00ffe0,0xf800faa0,0xc800f800,0xfaa0f800,0xfaa0ffe0,0xfaa0faa0,0xffe0fd00,0xffe0faa0,0xfd00ffe0,0xf800faa0,0xc800f800,0xfaa0f800,0xfaa0ffe0,0xfaa0faa0,0xffe0fd00,0xffe0faa0,0xfd00ffe0,0xf800faa0, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x94f39d34,0xadb6a575,0x94f39d14,0xadb69d34,0x9d1494d3,0xadb6adb6,0x94f39d34,0xad96bdf7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0xf800faa0,0xfaa0faa0,0xffe0fd00,0xfaa0faa0,0xfaa0faa0,0xfaa0faa0,0xf800f800,0xf800f800,0xf800faa0,0xfaa0faa0,0xffe0fd00,0xfaa0faa0,0xfaa0faa0,0xfaa0faa0,0xf800f800,0xf800f800,0xf800faa0,0xfaa0faa0,0xffe0fd00,0xfaa0faa0,0xfaa0faa0,0xfaa0faa0,0xf800f800, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xadb6ad96,0x9d149d14,0xadb6b5b6,0x9d14a534,0xadb6a575,0xa575a575,0xb5d7b5b6,0xa555a575,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfd00faa0,0xfaa0ffe0,0xf800c800,0xfaa0f800,0xfaa0f800,0xfd00ffe0,0xf800c800,0xf800f800,0xfd00faa0,0xfaa0ffe0,0xf800c800,0xfaa0f800,0xfaa0f800,0xfd00ffe0,0xf800c800,0xf800f800,0xfd00faa0,0xfaa0ffe0,0xf800c800,0xfaa0f800,0xfaa0f800,0xfd00ffe0,0xf800c800,0xf800f800, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa5559d34,0xbdf7b5d7,0xa575ad96,0x9d149d14,0x8c928cb2,0x9d1494f3,0x8c927c51,0x9d1494f3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xffe0faa0,0xfaa0ffe0,0xf800f800,0xf800c800,0xfaa0f800,0xfaa0ffe0,0xf800f800,0xc800c800,0xffe0faa0,0xfaa0ffe0,0xf800f800,0xf800c800,0xfaa0f800,0xfaa0ffe0,0xf800f800,0xc800c800,0xffe0faa0,0xfaa0ffe0,0xf800f800,0xf800c800,0xfaa0f800,0xfaa0ffe0,0xf800f800,0xc800c800, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x94f394d3,0x8cb28cb2,0xad759d34,0x94f394d3,0xa575a555,0x8cb28471,0xa534a534,0x8c928cb2,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0xfd00c800,0xfaa0fd00,0xc800f800,0xc800c800,0xf800f800,0xf800faa0,0xc800f800,0xc800c800,0xfd00c800,0xfaa0fd00,0xc800f800,0xc800c800,0xf800f800,0xf800faa0,0xc800f800,0xc800c800,0xfd00c800,0xfaa0fd00,0xc800f800,0xc800c800,0xf800f800,0xf800faa0,0xc800f800,0xc800c800, +0xdeb4e6d5,0xc5cedeb3,0xe6d5de94,0xc5cede93,0xde94deb4,0xc5cede73,0xdeb4de93,0xe6f5deb4,0x23512330,0x2bb22bf4,0x23912350,0x2c142bf4,0x23712392,0x2bf42bd3,0x23512350,0x2bf42bf4,0xebc5eb84,0xec06ec48,0xebc6eba5,0xec48ec48,0xebc6ebe6,0xec48ec07,0xebc5eba5,0xec48ec28,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xe6d4e6d4,0xef16d673,0xdeb4c5ce,0xc5ced673,0xc5cece31,0xdeb4ce31,0xeef6c5ce,0xdeb4de93,0x2c142c14,0x239223b2,0x2bb22bf4,0x2bd32bd3,0x2bf42c35,0x23712371,0x2bd32bb2,0x23502391,0xec48ec48,0xebe6ec06,0xec06ec48,0xec28ec07,0xec28ec69,0xebc5ebc5,0xec27ec06,0xeba5ebc6,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x3b7f3b7f, +0xe6b4e6d4,0xc5ceef16,0xde94c5ce,0xc5cede93,0xce31d672,0xde94de93,0xc5cee6d4,0xde94eef6,0x2bd32bd3,0x2c352c14,0x2bd32bf4,0x23922bb2,0x2392230f,0x2bf42bd3,0x23922392,0x2c352bf4,0xec07ec27,0xec69ec48,0xec27ec48,0xebe6ec06,0xebe6e342,0xec48ec27,0xebe6ebe6,0xec69ec48,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1abf1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff, +0xce31deb4,0xe6d5c5ce,0xce31ce31,0xd672c5ce,0xc5ced652,0xdeb3ef16,0xded4d672,0xce31c5ce,0x23712391,0x2330230f,0x2c142bf4,0x230f2330,0x2bd323b2,0x2bd32bb2,0x2c352c35,0x23302bd3,0xebc6ebc6,0xe363e342,0xec48ec48,0xe342eba4,0xec28ec06,0xec27ec06,0xec69ec69,0xeb63ec07,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff22ff,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff22ff,0x22ff22ff,0x1abf1abf,0x1abf1abf, +0xef16c5ce,0xe6d4ef16,0xe6d4de93,0xc5cee6d4,0xef16d673,0xef16c5ce,0xc5cede94,0xdeb4deb4,0x23512350,0x2bb32bb3,0x23912371,0x2bd32bd3,0x23512350,0x2bd32371,0x230f230f,0x2bd32391,0xebc5eba4,0xec07ec07,0xebc6ebc6,0xec27ec28,0xebc5eba5,0xec07ebc5,0xe363e363,0xec07ebc6,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xc5ced652,0xd673d672,0xe6d4deb4,0xde94c5ce,0xd673deb4,0xef16c5ce,0xce31deb4,0xdeb3e6d4,0x2c142bf4,0x2bd32bd3,0x2bf42c35,0x2bd32bd3,0x2bf42c14,0x2bb22392,0x23b22bd3,0x23b22350,0xec48ec48,0xec27ec27,0xec48ec69,0xec07ec27,0xec28ec48,0xec06ebe6,0xec06ec07,0xec06eba4,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x3b7f22ff,0x1abf3b7f,0x3b7f1abf,0x1abf22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x3b7f22ff,0x1abf3b7f,0x3b7f1abf,0x1abf22ff,0x1abf1abf, +0xdeb3d673,0xd652ce31,0xdeb4de94,0xd652c5cf,0xd672e6d4,0xc5cece32,0xce31c5ee,0xd673e6d4,0x23922371,0x2bf42391,0x2330230f,0x2bb32392,0x2bd32351,0x2c352c35,0x2bd32392,0x2c352c35,0xebe6ebc5,0xec28ebc6,0xe363e342,0xec07ebe6,0xec07ebc5,0xec69ec69,0xec27ebe6,0xec69ec69,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x536e536e,0x00000000,0x536e0000,0x0000536e,0x00000000,0x536e536e,0x00000000,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f22ff,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f22ff,0x22ff3b7f,0x22ff22ff, +0xd652d672,0xde94c5ce,0xe6d4e6d4,0xd673ce31,0xc5cede94,0xde93c5ce,0xc5ceef36,0xd672de94,0x2bd32bd3,0x23712330,0x2bd32bf4,0x23912351,0x23922371,0x23302371,0x239223b2,0x23302350,0xec27ec27,0xebc5eba4,0xec07ec48,0xebc6ebc5,0xebe6ebc5,0xeb63ebc5,0xebe6ec06,0xeba4eba4,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x7cb30000,0xbe59d6fb,0x0000536e,0xd6fb7cb3,0x536ebe59,0x7cb30000,0xbe59d6fb,0x0000536e,0x22ff22ff,0x22ff3b7f,0x22ff22ff,0x22ff22ff,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff3b7f,0x22ff22ff,0x22ff22ff,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xc5cee6f4,0xd651eef6,0xc5cec5ce,0xd652d652,0xe6d4c5ce,0xdeb4deb4,0xe6f5deb4,0xe6f5c5ce,0x23712371,0x2c352c35,0x2bd32bd3,0x2bf42bf4,0x23712350,0x2bf42bd3,0x2bd32bd3,0x2bf42c14,0xebc6ebc6,0xec69ec69,0xec07ec27,0xec48ec48,0xebc5eba5,0xec48ec28,0xec07ec07,0xec48ec48,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x7cb30000,0xd6fbffff,0x0000536e,0xffff7cb3,0x536ed6fb,0x7cb30000,0xd6fbffff,0x0000536e,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x22ff1abf,0x3b7f22ff,0x22ff3b7f,0x1abf22ff,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x22ff1abf,0x3b7f22ff,0x22ff3b7f,0x1abf22ff, +0xdeb3c5ce,0xeef6de93,0xd651d673,0xe6d5c5ce,0xde93c5ce,0xd652e6d4,0xce31ce31,0xc5ceeef6,0x2c352c35,0x2bd32bf4,0x23b223b2,0x2bb22392,0x2c352bf4,0x23922bd3,0x2c352c35,0x2bb22bd3,0xec69ec69,0xec28ec28,0xec06ec06,0xec06ebe6,0xec69ec28,0xebe6ec07,0xec69ec69,0xec06ec27,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x7cb37cb3,0x00000000,0x7cb30000,0x00007cb3,0x00000000,0x7cb37cb3,0x00000000,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f, +0xc5ced673,0xde94d673,0xd651de94,0xc5cec5ce,0xde94e6f4,0xc5cede93,0xde93d653,0xd653ce32,0x230f2330,0x2bf42371,0x230f2351,0x23712351,0x230f2351,0x23922371,0x23712330,0x23912350,0xe363eba4,0xec48ebc5,0xe342ebc5,0xebc6eba5,0xe342ebc5,0xebe6ebc6,0xebc5eb63,0xebc6eba5,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x22ff3b7f,0x1abf22ff,0x22ff22ff,0x22ff22ff,0x1abf3b7f,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff3b7f,0x1abf22ff,0x22ff22ff,0x22ff22ff,0x1abf3b7f,0x1abf1abf,0x3b7f1abf,0x1abf1abf, +0xc5cede93,0xde94eef6,0xd651d673,0xef16ef16,0xce31c5ce,0xeef6ce31,0xe6d4e6d4,0xde94de93,0x23922bd3,0x23b22351,0x2bd32bd3,0x230f2330,0x2bb22371,0x23302371,0x2bd32bd3,0x23302350,0xebe6ec07,0xec06ebc5,0xec28ec28,0xe342e363,0xec06ebc5,0xeba4ebc5,0xec28ec28,0xe363eba4,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x22ff22ff,0x1abf22ff,0x1abf22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x22ff22ff,0x1abf22ff,0x1abf22ff, +0xdeb3ce31,0xeef6c5ce,0xc5ceeef6,0xdeb4de93,0xd672d651,0xc5ced693,0xe6f4eef6,0xd652de93,0x237123b2,0x2bf42bd3,0x23912392,0x2bf423b2,0x23922351,0x2bf42bf4,0x237123b2,0x2bf42c35,0xebc6ec06,0xec48ec28,0xebc6ebe6,0xec48ec06,0xebe6ebc5,0xec48ec48,0xebc6ec06,0xec48ec69,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x3b7f1abf,0x22ff3b7f,0x3b7f22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f1abf,0x22ff3b7f,0x3b7f22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff, +0xe6b4ce31,0xc5cede93,0xd653c5ce,0xd652ce32,0xd652c5ce,0xe6f4ce32,0xef35c5ce,0xc5cee6d4,0x2bf42bf4,0x23922392,0x2bf42c14,0x23922bb2,0x2bf42bd3,0x2bd32bd3,0x2c352c14,0x2bd32bd3,0xec48ec28,0xebe6ebe6,0xec48ec48,0xebe6ec06,0xec48ec27,0xec27ec27,0xec69ec48,0xec07ec27,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1abf1abf,0x22ff22ff,0x3b7f22ff,0x22ff22ff,0x22ff22ff,0x3b7f1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f22ff,0x22ff22ff,0x22ff22ff,0x3b7f1abf,0x1abf3b7f,0x1abf1abf, +0xc5cee6f5,0xe6b4de94,0xd653c5ce,0xc5ced673,0xdeb4deb3,0xd673d653,0xc5ced673,0xe716c5ce,0x2bd323b2,0x2c352c35,0x2bd32bf4,0x23922392,0x23302350,0x23922371,0x23301aef,0x23922371,0xec07ec06,0xec69ec69,0xec27ec28,0xebe6ebe6,0xeb84eba5,0xebe6ebc5,0xeba4e342,0xebe6ebc6,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x22ff1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x1abf1abf, +0xde94ef15,0xc5cece31,0xde94e6d5,0xc5ceef16,0xe6d4d673,0xdeb4deb4,0xdeb4c5ce,0xdeb4deb4,0x23712351,0x23502350,0x2bd323b2,0x23712351,0x2bd32bd3,0x23502330,0x2bb22bb2,0x23302350,0xebc6eba5,0xeba5eba4,0xec28ec06,0xebc5ebc5,0xec27ec07,0xeba4e363,0xec06ec06,0xeb84eba4,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f, +0xef16e717,0xdeb4ce31,0xc610c610,0xe6d5c5cf,0xde93e6d4,0xce30c5ce,0xef36eef6,0xef37c5ee,0x71767155,0x81998a19,0x79977176,0x923a8a19,0x79777998,0x8a1981b9,0x71767176,0x8a1989f9,0xb9d8b1b7,0xc279c2f9,0xba19b9d8,0xcb3ac2fa,0xb9f8ba39,0xc2f9c299,0xb9d8b9d8,0xc2fac2d9,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xc610ce32,0xce31e6d5,0xe716de94,0xbdaeded6,0xce0fe6f6,0xe6d5ded5,0xbd8dc610,0xbdaddeb4,0x8a3a8a3a,0x79988198,0x81998a19,0x89d981b9,0x89f9927a,0x79777977,0x81d98199,0x71767997,0xc31acb1a,0xba19c259,0xc279c2fa,0xc2b9c299,0xc2d9cb5a,0xb9f8b9f8,0xc2b9c279,0xb9d8ba19,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x3b7f3b7f, +0xe6f7e6f6,0xc5efd673,0xde94d674,0xdeb5de93,0xd694c5ce,0xd673d673,0xe6f6c5ce,0xde94ded5,0x81b981d9,0x927a923a,0x81d98a19,0x79988199,0x79986954,0x8a1981d9,0x79987998,0x925a8a19,0xc299c2b9,0xcb5acb3a,0xc2b9c2f9,0xba19c279,0xba39a196,0xc2fac2b9,0xba39ba39,0xcb5ac2fa,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x1abf1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff, +0xe6f7ef16,0xce31e6d5,0xef37ef16,0xef16ef16,0xef38c5ce,0xde95eef6,0xe6f6ce31,0xe6d6e717,0x79777997,0x69556954,0x8a3a8a19,0x69547176,0x89d98198,0x81d98199,0x927a927a,0x715581b9,0xb9f8ba19,0xa9b6a196,0xcb1ac2f9,0xa196b1b7,0xc2b9ba59,0xc2b9c279,0xcb5acb5a,0xa9b7c299,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff22ff,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff22ff,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff22ff,0x22ff22ff,0x1abf1abf,0x1abf1abf, +0xef37c5ce,0xe6d5ef37,0xbdadce10,0xc5eec5ee,0xc5cede93,0xef17c5ce,0xe6d4c5ee,0xef37ef37,0x71767176,0x81998199,0x79977977,0x81d989d9,0x71767176,0x81b97977,0x69546954,0x81b97997,0xb9d8b1d8,0xc279c279,0xba19b9f8,0xc2b9c2b9,0xb9d8b9d8,0xc299b9f8,0xa9b6a9b6,0xc299ba19,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xc5efde93,0xc5efc5ef,0xce30d673,0xde93de93,0xde93e6f6,0xce10deb4,0xc5eeded5,0xc5aec5ee,0x8a198a19,0x81d981d9,0x8a19927a,0x81b981d9,0x89f98a19,0x81997998,0x819881b9,0x81987176,0xc2fac2f9,0xc2b9c2b9,0xc2facb5a,0xc299c2b9,0xc2d9c2fa,0xc279ba19,0xba59c299,0xc259b1d8,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x3b7f22ff,0x1abf3b7f,0x3b7f1abf,0x1abf22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x3b7f22ff,0x1abf3b7f,0x3b7f1abf,0x1abf22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x3b7f22ff,0x1abf3b7f,0x3b7f1abf,0x1abf22ff,0x1abf1abf, +0xe6d5d673,0xe6d5e6d5,0xc5eede93,0xdeb5eef6,0xdeb5e6d5,0xc5cdd673,0xded5e6f6,0xded5c5cf,0x79987977,0x89f97997,0x69556954,0x81997998,0x81b97176,0x927a927a,0x81d97998,0x925a927a,0xba19b9f8,0xc2d9ba19,0xa9b6a196,0xc279ba19,0xc299b9d8,0xcb5acb5a,0xc2b9ba39,0xcb3acb5a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f22ff,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f22ff,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f22ff,0x22ff3b7f,0x22ff22ff, +0xde94ef37,0xde94e6d5,0xc5efdeb4,0xef17ef16,0xde93de95,0xd651e6d5,0xef16f757,0xef37c5ef,0x81d981d9,0x79777175,0x81b98a19,0x79977176,0x79987977,0x71557977,0x79988198,0x71767176,0xc2b9c2b9,0xb9f8b1b7,0xc299c2f9,0xba19b9d8,0xba19b9f8,0xa9b7b9f8,0xba19ba59,0xb1b7b1b8,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff22ff,0x22ff3b7f,0x22ff22ff,0x22ff22ff,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff3b7f,0x22ff22ff,0x22ff22ff,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff3b7f,0x22ff22ff,0x22ff22ff,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xf758c5ce,0xeef6ef16,0xef37f758,0xc610ce31,0xef16ef16,0xc610f757,0xce10ce32,0xef37c5cf,0x79777977,0x927a925a,0x81b981d9,0x8a198a19,0x79777176,0x8a1989d9,0x81b981b9,0x8a198a19,0xb9f8b9f8,0xcb5acb5a,0xc299c2b9,0xc2f9c2fa,0xb9f8b9d8,0xc2fac2b9,0xc299c299,0xc2f9c2fa,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x22ff1abf,0x3b7f22ff,0x22ff3b7f,0x1abf22ff,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x22ff1abf,0x3b7f22ff,0x22ff3b7f,0x1abf22ff,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x22ff1abf,0x3b7f22ff,0x22ff3b7f,0x1abf22ff, +0xce51de94,0xce31ce51,0xce31ce2f,0xe6f6ded6,0xc5eebdae,0xe6d5c610,0xd693ded5,0xc5cfdeb5,0x927a925a,0x89d989f9,0x81988198,0x81997998,0x927a89f9,0x799881b9,0x927a927a,0x819981d9,0xcb5acb5a,0xc2b9c2d9,0xba59ba59,0xc279ba39,0xcb5ac2d9,0xba19c299,0xcb5acb5a,0xc279c2b9,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f, +0xd673d694,0xdeb3d673,0xe6d5ce2f,0xef16deb4,0xc5eedeb4,0xde93e6d5,0xdeb4de93,0xc5cfdeb5,0x69547175,0x8a197977,0x69547176,0x79777176,0x69547176,0x79987977,0x79777155,0x79977176,0xa9b6b1b7,0xc2fab9d8,0xa196b9d8,0xb9f8b9d8,0xa196b9d8,0xba19b9f8,0xb9f8a9b7,0xba19b9d8,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff3b7f,0x1abf22ff,0x22ff22ff,0x22ff22ff,0x1abf3b7f,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff3b7f,0x1abf22ff,0x22ff22ff,0x22ff22ff,0x1abf3b7f,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff3b7f,0x1abf22ff,0x22ff22ff,0x22ff22ff,0x1abf3b7f,0x1abf1abf,0x3b7f1abf,0x1abf1abf, +0xde94ce30,0xd673de93,0xded4ce2f,0xe6d4e6f5,0xc5cede73,0xd673e6d5,0xe6f6deb4,0xdeb4d673,0x799881b9,0x81987176,0x89d989d9,0x69546955,0x81997977,0x71767977,0x89d989d9,0x69557176,0xba39c299,0xc259b9d8,0xc2b9c2b9,0xa196a9b6,0xc279b9f8,0xb1b7b9f8,0xc2b9c2b9,0xa9b6b1d8,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x22ff22ff,0x1abf22ff,0x1abf22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x22ff22ff,0x1abf22ff,0x1abf22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x22ff22ff,0x1abf22ff,0x1abf22ff, +0xf778ce11,0xef36e6f6,0xf758ce2f,0xf757f757,0xe6f6ef17,0xf757bdad,0xe6f6e6f6,0xf757f757,0x79778198,0x8a1989d9,0x79977998,0x8a198198,0x79987176,0x8a198a19,0x79778198,0x8a19927a,0xb9f8c259,0xc2fac2b9,0xba19ba19,0xc2faba59,0xba19b9d8,0xc2fac2fa,0xb9f8c259,0xc2f9cb5a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x3b7f1abf,0x22ff3b7f,0x3b7f22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f1abf,0x22ff3b7f,0x3b7f22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f1abf,0x22ff3b7f,0x3b7f22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff, +0xd673c610,0xc5f0d651,0xc610ce10,0xc5f0ce31,0xc60fc610,0xc5cec5cf,0xce52ce30,0xc5cfc5f1,0x8a1989f9,0x79987998,0x8a198a3a,0x79988199,0x8a1981d9,0x81d981d9,0x925a923a,0x81b981d9,0xc2fac2d9,0xba39ba19,0xc2facb1a,0xba19c279,0xc2fac2b9,0xc2b9c2b9,0xcb5acb3a,0xc299c2b9,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x1abf1abf,0x22ff22ff,0x3b7f22ff,0x22ff22ff,0x22ff22ff,0x3b7f1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f22ff,0x22ff22ff,0x22ff22ff,0x3b7f1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f22ff,0x22ff22ff,0x22ff22ff,0x3b7f1abf,0x1abf3b7f,0x1abf1abf, +0xd674e6d5,0xde94de94,0xd674de94,0xce32d653,0xd673d673,0xde94de93,0xe6f6d673,0xe6f5e6f6,0x81b98198,0x927a925a,0x81d989f9,0x79987998,0x71557176,0x79987977,0x71756954,0x79987977,0xc299c259,0xcb5acb3a,0xc2b9c2d9,0xba19ba19,0xb1b7b9d8,0xba19b9f8,0xb1b7a195,0xba39b9f8,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x1abf1abf, +0xef16eef6,0xe6f6ef16,0xe6d5e6b5,0xef16f757,0xf757ef16,0xef16ef16,0xf757ef16,0xef16f757,0x79777176,0x71767176,0x89d98198,0x79777176,0x81d981b9,0x71766955,0x81998199,0x71557176,0xb9f8b9d8,0xb9d8b1b8,0xc2b9ba59,0xb9f8b9d8,0xc2b9c299,0xb1d8a9b6,0xc279c279,0xb1b7b1d8,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f, +0xe6d4ef15,0xdeb3deb4,0xe6b4de73,0xd673de94,0xdeb4d673,0xe6f5d693,0xded4de93,0xdeb4deb4,0x21712170,0x21b329d4,0x21922171,0x29d529d4,0x21922192,0x29d429b3,0x21712171,0x29d429b4,0x53f94b99,0x6c7a7cdb,0x5c1a53d9,0x851b7cdb,0x5c1a643a,0x7cdb6c9a,0x53f953d9,0x7cdb7cdb,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe6d4e6d4,0xe6d4de93,0xded4de94,0xce52d673,0xde93d653,0xdeb4d693,0xe6f5deb4,0xdeb4deb4,0x29d529d5,0x21922193,0x21b329d4,0x29b429b3,0x29b429d6,0x21922192,0x29b421b3,0x21712192,0x84fb851b,0x643a6c7a,0x6c7a7cdb,0x74bb6c9a,0x7cdb8d5b,0x5c1a5c1a,0x749a6c7a,0x53d95c1a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdeb4e6d5,0xded5d673,0xd674de94,0xd693d653,0xd673d673,0xd673deb3,0xdeb4de94,0xe6d4deb3,0x29b329b4,0x29d629d5,0x29b429d4,0x219221b3,0x2192214f,0x29d429b4,0x21922192,0x29d529d4,0x6c9a749a,0x8d5b851b,0x749a7cdb,0x643a6c7a,0x645a3b59,0x7cdb749a,0x645a643a,0x8d3b7cdb,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdeb4deb4,0xdeb4de94,0xded4de94,0xd672deb3,0xd672ce31,0xce32d652,0xde93d652,0xde93e6d4,0x21922192,0x2150214f,0x29d529d4,0x214f2171,0x29b42193,0x29b421b3,0x29d629d6,0x217029b3,0x5c1a5c1a,0x43793b59,0x851b7cdb,0x3b584bb9,0x74bb645a,0x749a6c7a,0x8d5b8d5b,0x43996c9a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe6d4de93,0xdeb4deb4,0xde73d673,0xce32e6b4,0xd673d673,0xd673d652,0xde94deb4,0xdeb3d673,0x21712171,0x29b329b3,0x21922192,0x29b429b4,0x21712171,0x29b32192,0x21502150,0x29b32192,0x53f953d9,0x6c7a6c7a,0x5c1a5c1a,0x749a74bb,0x53f953d9,0x6c9a5c1a,0x43794379,0x6c9a5c1a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdeb3ce32,0xde93d693,0xe6d5d673,0xde93deb4,0xded3de93,0xce31deb3,0xef16e6d4,0xd652e6f5,0x29d529d4,0x29b429b4,0x29d429d6,0x29b329b4,0x29b429d5,0x21b32192,0x219329b3,0x21932171,0x7cfb7cdb,0x749a749a,0x7cdb8d3b,0x6c9a749a,0x7cdb7cfb,0x6c7a643a,0x645a6c9a,0x6c7a53d9,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd672d652,0xd673d652,0xe6d4deb4,0xce32de93,0xd673e6d4,0xdeb4d672,0xdeb4e6f5,0xde93deb4,0x21922192,0x29b42192,0x2150214f,0x29b32192,0x29b32171,0x29d629d6,0x29b42192,0x29d529d6,0x643a5c1a,0x7cdb5c1a,0x43793b59,0x6c7a643a,0x6c9a53f9,0x8d5b8d5b,0x749a645a,0x8d3b8d5b,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd672de93,0xde94deb4,0xe6b4de93,0xde94deb4,0xde93de94,0xe6d4deb3,0xe6f5e6f5,0xd693e6d4,0x29b429b4,0x21922170,0x29b329d4,0x21922171,0x21922192,0x21702192,0x21922193,0x21712171,0x749a749a,0x5c1a4bb9,0x6c9a7cdb,0x5c1a53f9,0x643a5c1a,0x43995c1a,0x643a645a,0x4bb94bb9,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd673deb4,0xce52deb4,0xd673de93,0xd652d652,0xdeb4deb4,0xde94e6f4,0xdeb4de93,0xde94deb4,0x21922192,0x29d629d5,0x29b329b4,0x29d429d4,0x21922171,0x29d429b4,0x29b329b3,0x29d429d5,0x5c1a5c1a,0x8d5b8d3b,0x6c9a749a,0x7cdb7cdb,0x5c1a53d9,0x7cdb74bb,0x6c9a6c9a,0x7cdb7cfb,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdeb4d673,0xd673deb4,0xd652deb3,0xe6f6d673,0xde93de94,0xde93e6d4,0xdeb4d673,0xde94de94,0x29d629d5,0x29b429b4,0x21932193,0x21b32192,0x29d629b4,0x219229b3,0x29d629d6,0x21b329b4,0x8d3b8d3b,0x74bb7cdb,0x645a645a,0x6c7a643a,0x8d3b7cdb,0x643a6c9a,0x8d5b8d5b,0x6c7a749a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xde93d652,0xce32de93,0xd673ce32,0xef36e6d5,0xd653deb4,0xd673de73,0xde93de93,0xde93de94,0x21502170,0x29d42191,0x214f2171,0x21922171,0x214f2171,0x21922192,0x21922170,0x21922171,0x43794bb9,0x7cdb53f9,0x3b5853f9,0x5c1a53d9,0x3b5853f9,0x643a5c1a,0x5c1a4399,0x5c1a53d9,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd672de93,0xd652deb3,0xde93d693,0xe6d4deb4,0xdeb3d652,0xd693de93,0xdeb4e6f4,0xd673deb4,0x219229b3,0x21932171,0x29b429b4,0x214f2150,0x21b32192,0x21712192,0x29b429b4,0x21502171,0x643a6c9a,0x6c7a53f9,0x74bb74bb,0x3b584379,0x6c7a5c1a,0x4bb95c1a,0x74bb74bb,0x437953d9,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xde93e6d4,0xde93deb3,0xde73d673,0xe6b4de93,0xde93d672,0xdeb3d652,0xdeb4e6f4,0xd652deb4,0x21922193,0x29d429b4,0x21922192,0x29d42193,0x21922171,0x29d429d4,0x21922193,0x29d429d6,0x5c1a6c7a,0x7cdb74bb,0x5c1a643a,0x7cdb645a,0x643a53f9,0x7cdb7cdb,0x5c1a6c7a,0x7cdb8d5b,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd673deb4,0xde93deb4,0xce33ce52,0xd652ce32,0xd693d672,0xe6f4d672,0xded4e6f5,0xe6f5e6d4,0x29d429b4,0x21922192,0x29d429d5,0x219221b3,0x29d429b4,0x29b429b4,0x29d529d5,0x29b329b4,0x7cdb7cdb,0x645a643a,0x7cdb851b,0x643a6c7a,0x7cdb749a,0x749a749a,0x8d3b851b,0x6c9a749a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xde94deb4,0xde94e6b4,0xce33d673,0xce32ce32,0xde93deb3,0xe6d4d673,0xe715deb3,0xef15e715,0x29b32193,0x29d629d5,0x29b429b4,0x21922192,0x21702171,0x21922192,0x2170194f,0x21922192,0x6c9a6c7a,0x8d5b8d3b,0x749a7cdb,0x643a643a,0x4b9953d9,0x643a5c1a,0x4bb93b38,0x643a5c1a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe6d4e6d5,0xde93d673,0xde94e6d4,0xd652d673,0xdeb4deb4,0xdeb4d673,0xd693e6d4,0xef15e6f4,0x21922171,0x21712171,0x29b42193,0x21922171,0x29b429b3,0x21712150,0x21b321b3,0x21702171,0x5c1a53d9,0x53d94bb9,0x74bb645a,0x5c1a53f9,0x749a6c9a,0x53d94379,0x6c7a6c7a,0x4b9953d9,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x73ae73ae,0x73ae73ae,0x8c716b4d,0x7bef8c71,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x7bef7bef,0x49634963,0x51a359c3,0x51834963,0x61c359c3,0x51835183,0x59c359a3,0x49634963,0x59c359a3,0xb523a4c2,0xc5a3d624,0xbd63ad02,0xde64d644,0xb543bd83,0xd624cdc3,0xb523ad02,0xd644d623,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x7bef7bef,0x73ae7bef,0x22712271,0x73ae2271,0x7bef7bef,0x8c718c71,0x73ae7bef,0x7bef73ae,0x59c361c3,0x51835183,0x51a359c3,0x59a359a3,0x59a361c4,0x51835183,0x59a351a3,0x49635183,0xde64de64,0xbd63c5a3,0xc5a3d644,0xce03cdc3,0xd623de65,0xb543b543,0xcde3c5a3,0xad02bd63,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x8c717bef,0x8c7173ae,0x11751175,0x73ae1a54,0x11b21156,0x73ae2231,0x7bef7bef,0x8c718c71,0x59a359a3,0x61c461c3,0x59a359c3,0x518351a3,0x51834142,0x59c359a3,0x51835183,0x61c359c3,0xcdc3cde3,0xde65de64,0xcde3d624,0xbd63c5a3,0xc5839c82,0xd644cde3,0xc583bd83,0xde65d644,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x0000dedb,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x73ae7bef,0x73ae73ae,0x117473ae,0x73ae73ae,0x1a151176,0x73ae1a54,0x227173ae,0x7bef2211,0x51835183,0x49634142,0x61c359c3,0x41424963,0x59a35183,0x59a351a3,0x61c461c4,0x496359a3,0xb543bd63,0xa4a29c82,0xde64d624,0x9c62a4e2,0xce03c5a3,0xcde3c5a3,0xde65de65,0xa4c2cdc3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0xdedb0000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x7bef6b4d,0x11331a53,0x7bef1152,0x7bef7bef,0x8c718c71,0x7bef7bef,0x22527bef,0x6b4d32f1,0x49634963,0x59a359a3,0x51835183,0x59a359a3,0x49634963,0x59a35183,0x49424942,0x59a35183,0xb523ad02,0xcdc3cdc3,0xbd63b543,0xcde3ce03,0xb523ad02,0xcdc3b543,0x9c829c82,0xcdc3bd63,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x0000ffff,0xffff0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x7bef7bef,0x73ae8c71,0x8c7119d5,0x73ae8c71,0x1a3419f6,0x8c712252,0x1a348c71,0x7bef3310,0x59c359c3,0x59a359a3,0x59c361c4,0x59a359a3,0x59a359c3,0x51a35183,0x518359a3,0x51834963,0xd644d624,0xcde3cde3,0xd644de65,0xcdc3cde3,0xd623d644,0xc5a3bd63,0xc5a3cdc3,0xc5a3ad02,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0xdedb0000,0x0000ffff,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x73ae7bef,0x73ae73ae,0x73ae73ae,0x1a3673ae,0x1a341a35,0x2a711a15,0x1a1473ae,0x7bef2ab1,0x51835183,0x59a35183,0x49634142,0x59a35183,0x59a34963,0x61c461c4,0x59a35183,0x61c361c4,0xbd63b543,0xd623bd63,0xa4a29c82,0xcdc3bd63,0xcdc3b523,0xde65de65,0xcde3c583,0xde64de65,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0xffff0000,0xffffdedb,0xdedb0000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xffffdedb,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x22537bef,0x6b4d19f7,0x73ae8c71,0x12387bef,0x1a957bef,0x1a542a71,0x8c718c71,0x8c718c71,0x59a359a3,0x51834963,0x59a359c3,0x51834963,0x51835183,0x49635183,0x51835183,0x49634963,0xcde3cde3,0xb543a4e2,0xcdc3d624,0xbd63b523,0xbd63b543,0xa4c2b543,0xbd63c5a3,0xa4e2ace2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0xef5d0000,0xffffef5d,0xef5ddedb,0xef5dffff,0x0000ffff,0x0000dedb,0xffff0000,0x00000000,0xef5d0000,0x0000ef5d,0xef5d0000,0xffff0000,0x0000dedb,0x0000dedb,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x1a157bef,0x73ae1256,0x73ae73ae,0x73ae73ae,0x6b4d73ae,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x51835183,0x61c461c3,0x59a359a3,0x59c359c3,0x51834963,0x59c359a3,0x59a359a3,0x59c359c3,0xb543b543,0xde65de65,0xcdc3cde3,0xd624d644,0xb543ad02,0xd644ce03,0xcdc3cdc3,0xd624d644,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x0000ef5d,0xdedbffff,0x00000000,0xef5def5d,0xef5d0000,0xffffef5d,0xffffffff,0x0000ffff,0x0000ef5d,0xdedbffff,0x00000000,0xdedbef5d,0x0000ffff,0x0000ef5d,0x0000ffff,0x0000ffff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x8c718c71,0x19f87bef,0x1ab81a36,0x1a541219,0x7bef7bef,0x22711a33,0x8c718c71,0x6b4d8c71,0x61c461c3,0x59a359a3,0x51835183,0x51a35183,0x61c459a3,0x518359a3,0x61c461c4,0x51a359a3,0xde65de65,0xce03d623,0xc5a3c5a3,0xc5a3bd83,0xde65d623,0xbd63cdc3,0xde65de65,0xc5a3cde3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0xdedbdedb,0xdedbffff,0xffffef5d,0xffffffff,0x00000000,0x00000000,0x00000000,0x00000000,0xdedbdedb,0x0000dedb,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x73ae73ae,0x7bef7bef,0x1ab87bef,0x73ae1237,0x6b4d7bef,0x23161a33,0x73ae73ae,0x7bef6b4d,0x49424963,0x59c34963,0x41424963,0x51834963,0x41424963,0x51835183,0x51834963,0x51834963,0x9c82a4e2,0xd644b523,0x9c62b523,0xb543b522,0x9c62b523,0xbd63b543,0xb543a4c2,0xbd63ad02,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x0000ffff,0xdedbffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x8c717bef,0x73ae8c71,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x8c718c71,0x6b4d8c71,0x518359a3,0x51834963,0x59a359a3,0x41424963,0x51a35183,0x49635183,0x59a359a3,0x49634963,0xbd83cdc3,0xc5a3b523,0xce03ce03,0x9c62a4a2,0xc5a3b543,0xa4e2b543,0xce03ce03,0xa4a2ad02,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0xef5d0000,0xdedb0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x8c717bef,0x7bef7bef,0x12387bef,0x1a917bef,0x7bef1237,0x73ae73ae,0x73ae73ae,0x7bef73ae,0x51835183,0x59c359a3,0x51835183,0x59c35183,0x51834963,0x59c359c3,0x51835183,0x59c361c4,0xb543c5a3,0xd644ce03,0xbd63bd63,0xd644c5a3,0xbd63b523,0xd644d644,0xb543c5a3,0xd624de65,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0xef5d0000,0x0000dedb,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x6b4d7bef,0x2b731ab8,0x1a541ad8,0x73ae73ae,0x73ae8c71,0x7bef7bef,0x1a540937,0x7bef7bef,0x59c359a3,0x51835183,0x59c361c3,0x518351a3,0x59c359a3,0x59a359a3,0x61c361c3,0x59a359a3,0xd644d623,0xc583bd63,0xd644de64,0xbd63c5a3,0xd644cde3,0xcde3cde3,0xde65de64,0xcdc3cde3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x7bef7bef,0x8c718c71,0x8c718c71,0x8c718c71,0x8c7173ae,0x8c718c71,0x7bef6b4d,0x73ae7bef,0x59a35183,0x61c461c3,0x59a359a3,0x51835183,0x49634963,0x51835183,0x49634142,0x51835183,0xcdc3c5a3,0xde65de64,0xcde3d623,0xbd63bd63,0xa4c2ad02,0xbd63b543,0xa4e29c62,0xbd83b543,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x73ae7bef,0x73ae73ae,0x7bef73ae,0x8c718c71,0x8c716b4d,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x51834963,0x49634963,0x59a35183,0x51834963,0x59a359a3,0x49634963,0x51a351a3,0x49634963,0xb543b522,0xad02ace2,0xce03c5a3,0xb543b523,0xcde3cdc3,0xad02a4a2,0xc5a3c5a3,0xa4c2ad02,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x00000000,0x00000000,0x00000000,0x00000000,0x0000ef5d,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x1a5332ef,0x1ab81a53,0x1a54121a,0x22711a54,0x1a542271,0x2a712211,0x2a712a71,0x12361236,0x32223202,0x3a633a83,0x32423222,0x3aa33aa3,0x32423243,0x3a833a83,0x32223222,0x3aa33a83,0x35653525,0x3e054666,0x3da53565,0x46674666,0x35853dc5,0x46663e06,0x35653565,0x46663e66,0x84108410,0x84108410,0x94927bcf,0x84108c51,0x84108410,0x84108430,0x84108410,0x84308430, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x220e1a72,0x1ab81ab8,0x22712271,0x22712271,0x1a540957,0x099711b2,0x22112a71,0x12362a50,0x3aa33aa3,0x32433263,0x3a633aa3,0x3a833a83,0x3a8342c3,0x32423242,0x3a833a63,0x32223242,0x46674667,0x3dc53de5,0x3e054666,0x3e463e06,0x3e664e88,0x35853585,0x3e263e05,0x35653da5,0xad558430,0xa514ad55,0xb596a514,0xc638b596,0xc638c638,0xb596ce79,0xa514ad55,0x8430a514, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x22512ad0,0x22712232,0x11751175,0x09971a54,0x11b21156,0x1a322231,0x2a502a71,0x2ab12250,0x3a833a83,0x42c33aa3,0x3a833a83,0x32423a63,0x324329e2,0x3aa33a83,0x32433243,0x3ac33aa3,0x3e063e26,0x4e884667,0x3e264666,0x3dc53e05,0x3dc534e4,0x46663e26,0x3dc53dc5,0x4e674666,0xb5968430,0xb596a514,0xa5149cf3,0xd00094b2,0xb596b000,0xce79ad14,0xad55ce79,0x9492b596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x2a9232f1,0x19922a71,0x11741173,0x09371196,0x1a151176,0x1a531a54,0x22712a71,0x2ab12211,0x32423242,0x320229e2,0x3aa33a83,0x29e23222,0x3a833263,0x3a833a63,0x42c342c3,0x32023a83,0x35853da5,0x350534e4,0x46674666,0x2cc43545,0x3e463de5,0x3e263e05,0x4e884e88,0x35053e06,0xa5148430,0x84109492,0xa5149cf3,0xf8009492,0xb596b000,0xad149cf3,0xc638a514,0x8430a514, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x22512ab1,0x11331a53,0x1a111152,0x093719b4,0x1a5411d5,0x2a712233,0x22522251,0x2ab132f1,0x32223222,0x3a633a63,0x32423242,0x3a833a83,0x32223222,0x3a833242,0x2a022a02,0x3a833242,0x35653545,0x3e063e06,0x3da53585,0x3e263e46,0x35653565,0x3e063585,0x35043504,0x3e063da5,0xad557bcf,0x84109492,0x9cf3a514,0xf8009492,0xb596d800,0x9cf3a514,0xce79a514,0x7bcfb596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x19b73310,0x117619b3,0x2ab219d5,0x09372274,0x1a3419f6,0x2a712252,0x1a342a71,0x32f13310,0x3aa33a83,0x3a833a83,0x3aa342c3,0x3a833a83,0x3a833aa3,0x3a633242,0x32633a83,0x32633222,0x46664666,0x3e263e26,0x46664e68,0x3e063e26,0x3e664666,0x3e053dc5,0x3de53e06,0x3de53545,0xad558430,0x9492b596,0x9cf38410,0xd0009492,0xb596b000,0xa514a514,0xad55ce79,0x8430ad55, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x19b719b7,0x19f819f5,0x23151a37,0x1a362274,0x1a341a35,0x2a711a15,0x1a142a71,0x19b72ab1,0x32433242,0x3a833242,0x320229e2,0x3a633243,0x3a833222,0x42c342c3,0x3a833243,0x3ac342c3,0x3dc53585,0x3e663da5,0x350534e4,0x3e063dc5,0x3e063565,0x4e884e88,0x3e263dc5,0x4e674e88,0xa5148430,0x9492a514,0xa5148410,0xd0009492,0xb596d000,0x9cf3a514,0xa514ce79,0x8430b596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x225319b7,0x129819f7,0x19f51a58,0x12380937,0x1a952274,0x1a542a71,0x2ab11a33,0x19b719b7,0x3a833a83,0x32423222,0x3a833a83,0x32423222,0x32423242,0x32023242,0x32433263,0x32223222,0x3e263e26,0x35853525,0x3e064666,0x3da53565,0x3dc53585,0x35053585,0x3dc53de5,0x35453545,0xb5968430,0x9cf3b596,0x84109492,0xf8009492,0xb596a800,0xce799cf3,0xb596b596,0x9492b596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x9b66ac49,0x00006a03,0x00000000,0x00000000,0x00000000,0x00000000,0xac690000,0x6a239367,0x9367ac69,0x00006a23,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xac680000,0x6a039367, +0x9386ac68,0x00006a03,0x00000000,0x00000000,0x00000000,0x00000000,0xac880000,0x6a049367,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x1a1519b7,0x1a771256,0x09371a57,0x12161a54,0x1a731a74,0x1a341237,0x2ab11a34,0x19b71152,0x32423242,0x42c33ac3,0x3a833a83,0x3a833aa3,0x32423222,0x3aa33a83,0x3a833a83,0x3a833aa3,0x35853585,0x4e884e67,0x3e063e26,0x46664666,0x35853565,0x46663e46,0x3e063e06,0x46664666,0xad558430,0xa514ad55,0x84109492,0xf8009492,0xb596d000,0xc638a514,0xa514a514,0x8430ad55, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b67acca,0x000059e2,0x00000000,0x00000000,0x00000000,0x00000000,0xb4aa0000,0x6a239367,0x8b46b4aa,0x000051e3,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xb4aa0000,0x6a049367, +0x8b67b4aa,0x000051e3,0x00000000,0x00000000,0x00000000,0x00000000,0xb4aa0000,0x6a048b67,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x19b71a57,0x19f811f9,0x1ab81a36,0x1a541219,0x2a711a92,0x22711a33,0x2ab11a53,0x19b71a53,0x42c33ac3,0x3a833a83,0x32633263,0x3a633243,0x42c33a83,0x32433a83,0x42c342c3,0x3a633a83,0x4e684e67,0x3e463e46,0x3de53de5,0x3e053dc5,0x4e683e66,0x3dc53e06,0x4e884e88,0x3e053e26,0xb5969492,0xad55ad55,0x9492ad55,0xf8009492,0xb596f800,0xad55ce79,0xb596b596,0x7bcfb596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b06ac68,0x000051e3,0x00000000,0x00000000,0x00000000,0x00000000,0xac890000,0x51e39367,0x8b45ac69,0x000059e3,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xac890000,0x59e39367, +0x8b46ac89,0x000051e3,0x00000000,0x00000000,0x00000000,0x00000000,0xac480000,0x51e39366,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x12371a57,0x1a571236,0x1ab81a97,0x1a541237,0x2a711237,0x23161a33,0x09971a53,0x12161a53,0x2a023222,0x3aa33222,0x29e23222,0x32423222,0x29e23222,0x32423242,0x32423202,0x32423222,0x35043525,0x46663585,0x2cc43565,0x35853565,0x2cc43565,0x3dc53585,0x35853505,0x3da53565,0xa5148410,0xad55ad55,0x9492ad55,0x7bcf8410,0x84107bcf,0xad55c638,0xa514a514,0x84309cf3, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b26b4aa,0x6a246204,0x6a046a04,0x6a046a03,0x51e451c2,0x6a246a03,0x93a859e3,0x5a038b67,0x8b46acaa,0x6a0369e4,0x6a036a03,0x6a246a03,0x51e351e3,0x6a236a23,0x69e451c3,0x6a036a03,0x59e36224,0x6a036a03,0x6a2351c3,0x6a236a24,0x6a036a03,0x6a236a04,0x93a86203,0x51c38b67, +0x8b26b4c9,0x6a046a03,0x62046223,0x6a036a03,0x59e351e3,0x6a036a03,0x9bc859c3,0x59c38b66,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x1a5719f8,0x1a981236,0x12191ab8,0x1a701a16,0x1a331237,0x2a711a74,0x09972a71,0x12161a53,0x32433a83,0x32633222,0x3a833a83,0x29e23202,0x3a633242,0x32223242,0x3a833a83,0x32023222,0x3dc53e06,0x3de53565,0x3e463e46,0x2cc43505,0x3e053585,0x35453585,0x3e463e46,0x35053545,0xb5968430,0xa514b596,0xa514a514,0x94929492,0x94929492,0xb596b596,0xb596b596,0x7bcfb596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x9366a489,0x93678b46,0x93679367,0x8b468b45,0x93469366,0x8b468346,0x93669366,0x52039387,0x9367ac69,0x93878346,0x93678b47,0x8b468b26,0x93679366,0x83268b46,0x93869347,0x8b469367,0x8b458b46,0x93669367,0x93678b87,0x8b469346,0x93468b46,0x93678b26,0x93668b66,0x59c38b66, +0x9347aca9,0x93678326,0x93669367,0x8b268b46,0x936793a7,0x8b468326,0x93669366,0x59e39387,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x12361236,0x1ab81a76,0x12381a98,0x1a911a35,0x2a711237,0x09971a73,0x1a530997,0x12161a54,0x32423263,0x3aa33a83,0x32423242,0x3aa33263,0x32433222,0x3aa33aa3,0x32423263,0x3a8342c3,0x35853de5,0x46663e46,0x3da53dc5,0x46663de5,0x3dc53565,0x46664666,0x35853de5,0x46664e88,0xb5968430,0xad55ad55,0x9cf3ad55,0xb596ad55,0xad55ad55,0xa514a514,0xa514a514,0x8430a514, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x68006800,0x68206820,0x68006800,0x68006800,0x68006800,0x68006800,0x68006800,0x68006800,0x70006800,0x70006800,0x68006800,0x68006800,0x68006800,0x68006800,0x68006800,0x68006800,0x68006800,0x68206800,0x68006800,0x68006800,0xbdd7b5b6,0xce59d6b9,0xb5b6ce59,0xb5b6b5d7, +0xb5d6b596,0xce39ce59,0xb5b6ce59,0xb5b6b5b6,0xbdd7b5d7,0xce59d67a,0xbdd6ce79,0xb5b7b5d7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x12981236,0x2b731ab8,0x1a541ad8,0x1a7319f3,0x1a742a71,0x09971a16,0x1a540937,0x12361236,0x3aa33a83,0x32433242,0x3aa33aa3,0x32423a63,0x3aa33a83,0x3a833a83,0x3ac33aa3,0x3a833a83,0x46663e66,0x3dc53dc5,0x46664667,0x3dc53e05,0x46663e26,0x3e263e26,0x4e674667,0x3e063e26,0x9cf38430,0xa514a514,0xa5149cf3,0xa514a514,0xa514b596,0xad55ad55,0xb596ad55,0x8430ad55, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x88828021,0x99049904,0x99249904,0x990398e4,0x88a288a2,0x806288c2,0x80618082,0x88a288a2,0x88828041,0x99049904,0x99039104,0x98e49904,0x888288a2,0x806188a3,0x80828081,0x88a280a2,0x78828882,0xa1457000,0x88a28081,0x68008883,0xce7ab5b6,0xef5def5d,0xef3def7d,0xb5b6d679, +0xd699b5b6,0xef7eef7e,0xef7df77d,0xf75def7d,0xf77dffdf,0xf7beef9d,0xf77def9d,0xb5b6ce9a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x1a7619f8,0x3bd41ab8,0x121a22d7,0x1a931a15,0x1a961a94,0x09970997,0x1a331a73,0x12361236,0x3a833263,0x42c33ac3,0x3a833a83,0x32423243,0x32023222,0x32423242,0x322229e2,0x32433242,0x3e063de5,0x4e884e67,0x3e263e66,0x3dc53dc5,0x35253565,0x3dc53585,0x35252cc4,0x3dc53585,0xad558430,0xb596b596,0xb596b596,0xb596b596,0xb596a514,0xb596b596,0xad559cf3,0x8410ad55, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x88c28041,0x88a28882,0x88a288a2,0x808188a2,0x80628082,0x80828042,0x88c28862,0x806288a2,0x88a28041,0x88a288c2,0x88a28882,0x808288a2,0x78a27882,0x78828082,0x88a290a3,0x808188a2,0x88a288a2,0xb1a67820,0x88a2a125,0x68008062,0xef7dbdb6,0xef7eef9d,0xef7def9d,0xb5b7ce99, +0xce79b5d7,0xef7def5d,0xffdfffdf,0xf7deffdf,0xffbfffbe,0xf77def7d,0xef5def9e,0xb5b6ce7a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x1a531ad6,0x12981a53,0x12981af8,0x22712271,0x1ab61ab4,0x2a711a54,0x22922a71,0x12362a50,0x32423222,0x32223222,0x3a833263,0x32423222,0x3a833a83,0x32223202,0x3a633a63,0x32023222,0x35853565,0x35653545,0x3e463de5,0x35853565,0x3e263e06,0x35453505,0x3e053e05,0x35253545,0x84108430,0x84108410,0x84308410,0x94929492,0x94927bcf,0x84108430,0x84108410,0x84308410, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x80418061,0x80408021,0x80418021,0x80828041,0x78828062,0x80618081,0x80418061,0x80627882,0x80218041,0x80217841,0x80408041,0x80828041,0x78828082,0x80828062,0x78417841,0x806280a2,0x80208061,0x80407820,0x80619965,0x68008041,0xce7ab5b6,0xce59ce99,0xbdd6b5d7,0xb596b5b7, +0xce99bd96,0xce59ce79,0xbdd6b5d7,0xbd96b596,0xce9ab5b6,0xce79ce7a,0xbdb7bdb6,0xb5d6b5b6,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0x91448924,0xa165b185,0x99449144,0xb185b185,0x9944a165,0xb185a965,0x91449144,0xb185b185,0xd391cb0f,0xdc33e4d5,0xd3b2d371,0xe516e4d5,0xd3b2dc13,0xe4d5dc54,0xd391d371,0xe4d5dcd5,0x84108410,0x84108410,0x94927bcf,0x84108c51,0x84108410,0x84108430,0x84108410,0x84308430, +0x4a690000,0x31860000,0x4a699cd3,0x00009cd3,0x9cd34a69,0x8c510000,0x00003186,0x00008c51,0x4a693186,0x31863186,0x4a699cd3,0x31869cd3,0x9cd34a69,0x8c513186,0x31863186,0x31868c51,0x80408061,0x80418041,0x80417840,0x80418041,0x80418041,0x80218040,0x80418020,0x80418041,0x80418021,0x80217840,0x78208041,0x68007021,0xb5b6b5b7,0xa574b5b5,0xb5b6ad75,0xbdb7b5b6, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x52050000,0x6b4da534,0x49e441a4,0x5a246a85,0x62656265,0x41a46265,0xa5346b4d,0x00005205,0xb185b185,0x9965a165,0xa165b185,0xa965a965,0xb185b9a5,0x99449944,0xa965a165,0x91449944,0xe4f6e4f6,0xd3f2dc33,0xdc33e4d5,0xdc94dc54,0xdcd5e557,0xd3b2d3b1,0xdc74dc33,0xd371d3b2,0xad558430,0xa514ad55,0xb596a514,0xc638b596,0xc638c638,0xb596ce79,0xa514ad55,0x8430a514, +0x9cd34208,0x9cd30000,0x9cd34a69,0x42080000,0x00004a69,0x00008c51,0x9cd33186,0x9cd30000,0x9cd33186,0x9cd33186,0x9cd34a69,0x31863186,0x31864a69,0x31868c51,0x9cd33186,0x9cd33186,0x80418041,0x80417821,0x80608041,0x80828081,0x80827862,0x782180a1,0x78407820,0x80417841,0x80218021,0x98a27820,0x78218882,0x70007021,0xd679d699,0xb5b6c5f8,0xce59b5b7,0xb5d6d69a, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x38e10000,0x38e138e1,0x38e138e1,0x000038e1,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83280000,0x6b4da534,0x83685a66,0x8b87ac4a,0xac4aac4a,0x6aa78b87,0xa5346b4d,0x00008328,0xa965a965,0xb9a5b185,0xa965b185,0x9944a165,0xa1658124,0xb185a965,0xa165a165,0xb985b185,0xdc54dc74,0xe557e516,0xdc74e4d5,0xd3d2dc33,0xdc13cacf,0xe4d5dc74,0xdc13dc13,0xe536e4d5,0xb5968430,0xb596a514,0xa5149cf3,0x400094b2,0xb5962000,0xce79ad14,0xad55ce79,0x9492b596, +0x00003186,0x00009cd3,0x00009cd3,0x4a699cd3,0x00000000,0x4a699cd3,0x42080000,0x00009cd3,0x31863186,0x31869cd3,0x31869cd3,0x4a699cd3,0x31863186,0x4a699cd3,0x31863186,0x31869cd3,0x88408021,0x888288a2,0x88a288a2,0x80627882,0x80818082,0x80627862,0x78828082,0x80828081,0x80828082,0xa9857820,0x808298e3,0x68007020,0xdefbce99,0xce79deba,0xdebbc699,0xb5b6ce39, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x38e10000,0x924338e1,0x92439243,0x92439243,0x38e19243,0x38e138e1,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0x99449944,0x89248124,0xb185b185,0x81249144,0xa985a165,0xa965a165,0xb9a5b9a5,0x8924a965,0xd3b2d3b2,0xcaefcacf,0xe4f6e4d5,0xcaaed330,0xdc94dc13,0xdc74dc33,0xe557e557,0xcb0fdc54,0xa5148430,0x84109492,0xa5149cf3,0x48009492,0xb5962800,0xad149cf3,0xc638a514,0x8430a514, +0x8c514208,0x9cd38c51,0x9cd38c51,0x9cd33186,0x9cd33186,0x9cd30000,0x4a690000,0x00003186,0x8c513186,0x9cd38c51,0x9cd38c51,0x9cd33186,0x9cd33186,0x9cd33186,0x4a693186,0x31863186,0x90617841,0x88a290e3,0x808288a2,0x78817862,0x80627881,0x78a27862,0x80628062,0x80618081,0x80817882,0xa9857020,0x8082a145,0x68007021,0xdebbc638,0xdefbdedb,0xce79d6ba,0xad55b596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x38e10000,0x924338e1,0xbae49243,0xaac4bae4,0xaac4aac4,0x9243aac4,0x92439243,0x000038e1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0x91449144,0xa165a165,0x99449944,0xa965a985,0x91449144,0xa9659944,0x89248924,0xa9659944,0xd391d350,0xdc53dc53,0xd3b2d3b2,0xdc74dc94,0xd391d371,0xdc54d3b2,0xcaefcaef,0xdc54d3d2,0xad557bcf,0x84109492,0x9cf3a514,0x48009492,0xb5962800,0x9cf3a514,0xce79a514,0x7bcfb596, +0x00000000,0x00009cd3,0x4a698c51,0x9cd30000,0x00004a69,0x8c519cd3,0x4a690000,0x42080000,0x31863186,0x31869cd3,0x4a698c51,0x9cd33186,0x31863186,0x8c519cd3,0x4a693186,0x31863186,0x90818040,0x88a298c3,0x80828081,0x80618082,0x80617862,0x88828082,0x80828062,0x78627881,0x80817861,0xa9a67020,0x88a290e3,0x68007040,0xdedbc618,0xef5cdebb,0xd678defb,0xad55b596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x924338e1,0xbae4bae4,0xa284aac4,0xa284c618,0xa284a284,0xaac4bdf7,0xa284a284,0x38e19243,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x52050000,0x6b4da534,0x49e441a4,0x62655a24,0x62656265,0x41c46265,0xa5346b4d,0x00005205,0xb185b185,0xa965a965,0xb185b9a5,0xa965a965,0xb185b185,0xa1659944,0xa165a965,0xa1659144,0xe4f5e4d5,0xdc74dc74,0xe4d5e557,0xdc54dc74,0xdcd5e4f5,0xdc33d3d2,0xdc13dc54,0xdc33d350,0xad558430,0x9492b596,0x9cf38410,0x58009492,0xb5962800,0xa514a514,0xad55ce79,0x8430ad55, +0x00008c51,0x42080000,0x4a699cd3,0x00000000,0x9cd30000,0x9cd34a69,0x9cd30000,0x4a693186,0x31868c51,0x31863186,0x4a699cd3,0x31863186,0x9cd33186,0x9cd34a69,0x9cd33186,0x4a693186,0x88828041,0x90e39904,0x80a28082,0x88828082,0x88a38082,0x88a388a2,0x88a288a2,0x88a290a2,0x888288a2,0xb1e78061,0x88a39103,0x68007820,0xe6fcc618,0xef5def5d,0xdf1cef5d,0xad75c618, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x924338e1,0xa284a284,0xce79ef5d,0xce79ce79,0xbdf7ce79,0xbdf7bdf7,0xa284a284,0x38e19243,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83280000,0x6b4da534,0x83686ac7,0x8b878b87,0x8b878b87,0x6aa7a409,0xa5346b4d,0x00008328,0x99659944,0xb1859944,0x89248124,0xa1659965,0xa9659144,0xb9a5b9a5,0xa965a165,0xb985b9a5,0xd3f2d3b2,0xdcd5d3d2,0xcaefcacf,0xdc53d3f2,0xdc54d391,0xe557e557,0xdc74dc13,0xe536e557,0xa5148430,0x9492a514,0xa5148410,0x58009492,0xb5962800,0x9cf3a514,0xa514ce79,0x8430b596, +0x42089cd3,0x4a698c51,0x9cd30000,0x9cd30000,0x00004208,0x00009cd3,0x00004a69,0x4a699cd3,0x31869cd3,0x4a698c51,0x9cd33186,0x9cd33186,0x31863186,0x31869cd3,0x31864a69,0x4a699cd3,0x90828021,0x90c39903,0x88a288a2,0x80a388a2,0x88a288a2,0x88a288a2,0x88a18882,0x88a290c2,0x80a288a2,0xb1e78861,0x88a298c3,0x68007020,0xf77ed69a,0xef5eef7e,0xef5def5d,0xb596d679, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x924338e1,0xef5dce79,0xef5def5d,0xce79ce79,0xbdf7ce79,0xbdf7bdf7,0xa284bdf7,0x38e19243,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0xa965a965,0x99448924,0xa965b185,0x99449144,0x99449944,0x89249944,0x9965a165,0x91449144,0xdc74dc74,0xd3b2d310,0xdc54e4d5,0xd3b2d391,0xd3d2d3b2,0xcb0fd3b1,0xd3f2dc13,0xd330d350,0xb5968430,0x9cf3b596,0x84109492,0x50009492,0xb5962800,0xce799cf3,0xb596b596,0x9492b596, +0x9cd30000,0x9cd34a69,0x00003186,0x4a699cd3,0x00004a69,0x9cd30000,0x9cd34a69,0x9cd30000,0x9cd33186,0x9cd34a69,0x31863186,0x4a699cd3,0x31864a69,0x9cd33186,0x9cd34a69,0x9cd33186,0x90628041,0x88a39903,0x888288a3,0x90a288a2,0x88a288a2,0x88a288a2,0x88a288a2,0x888288c2,0x88a288a2,0xb1c78861,0x808290e3,0x68007021,0xf7bed6ba,0xef7ef79d,0xef5def5d,0xb576ce7a, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce7938e1,0xef5def5d,0xc618ef5d,0xc618c618,0xc618c618,0xbdf7c618,0xbdf7bdf7,0x38e1bdf7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0x99449944,0xb9a5b985,0xa965a965,0xb185b185,0x99449144,0xb185a965,0xa965a965,0xb185b185,0xd3b2d3b2,0xe557e536,0xdc54dc74,0xe4d5e4d5,0xd3b1d371,0xe4d5dc94,0xdc54dc54,0xe4d5e4f5,0xad558430,0xa514ad55,0x84109492,0x50009492,0xb5964020,0xc638a514,0xa514a514,0x8430ad55, +0x31860000,0x00009cd3,0x9cd33186,0x9cd30000,0x00009cd3,0x00009cd3,0x00008c51,0x00009cd3,0x31863186,0x31869cd3,0x9cd33186,0x9cd33186,0x31869cd3,0x31869cd3,0x31868c51,0x31869cd3,0x90628041,0x88a29904,0x88a280a1,0x80a28082,0x88a28883,0x88a288a2,0x88a288a3,0x88a288a2,0x888388a2,0xba498861,0x80a290e3,0x68007000,0xef9dd6db,0xef7ef79e,0xef7def5d,0xb5b6ce99, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce794a49,0xc618ef5d,0xef5dc618,0xef5def5d,0xef5de8e3,0xc618ef5d,0xbdf7c618,0x4a49bdf7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x52050000,0x6b4da534,0x49e441a4,0x62655a24,0x62656265,0x41a45a24,0xa5346b4d,0x00005205,0xb9a5b985,0xa965a985,0xa165a165,0xa165a165,0xb9a5b185,0x9965a965,0xb9a5b9a5,0xa165a965,0xe557e536,0xdc94dcd5,0xdc13dc13,0xdc33dc13,0xe557dcd5,0xd3f2dc54,0xe557e557,0xdc33dc74,0xb5969492,0xad55ad55,0x9492ad55,0x50209492,0xb5965000,0xad55ce79,0xb596b596,0x7bcfb596, +0x9cd34208,0x8c518c51,0x00004a69,0x00009cd3,0x9cd34208,0x00004a69,0x4a698c51,0x9cd30000,0x9cd33186,0x8c518c51,0x31864a69,0x31869cd3,0x9cd33186,0x31864a69,0x4a698c51,0x9cd33186,0x90828061,0x9965b1c6,0x90c290c3,0x88a290a3,0x88818882,0x808288a2,0x88c28882,0x888288a2,0x90a288a2,0xcb0c9082,0x80819924,0x68007000,0xf77ed6ba,0xef7ef79e,0xe75eef5d,0xb5b7d67a, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xc6184a49,0xef5dc618,0xef5de8e3,0xef5def5d,0xef5def5d,0xef5def5d,0xc618ef5d,0x4a49c618,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83280000,0x6b4da534,0x83686ac7,0x8b87ac4a,0x8b878b87,0x6ac76265,0xa5346b4d,0x00008328,0x89248924,0xb1859144,0x81249144,0x99449144,0x81249144,0x99449944,0x99448924,0x99449144,0xcaefd310,0xe4d5d391,0xcaaed391,0xd3b2d391,0xcaaed391,0xd3d2d3b2,0xd3b1cb0f,0xd3d2d371,0xa5148410,0xad55ad55,0x9492ad55,0x7bcf8410,0x84107bcf,0xad55c638,0xa514a514,0x84309cf3, +0x00004a69,0x4a698c51,0x00004a69,0x4a690000,0x31869cd3,0x4a699cd3,0x4a699cd3,0x00009cd3,0x31864a69,0x4a698c51,0x31864a69,0x4a693186,0x31869cd3,0x4a699cd3,0x4a699cd3,0x31869cd3,0x98e38041,0xb1a7b1e7,0x990498e4,0x90a398e3,0x88a388c3,0x80818862,0x808280c2,0x88a288a3,0x888288a1,0xc2ca9082,0x80a2a125,0x68007841,0xf7bed6bb,0xf79effbe,0xef5def5d,0xb596d69a, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xc6184a49,0xef5def5d,0xef5def5d,0xef5def5d,0xef5de8e3,0xef5def5d,0xef5de8e3,0x4a49c618,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0xa165a965,0xa1659144,0xa965a985,0x81248924,0xa1659944,0x91449944,0xa985a985,0x89249144,0xdc13dc54,0xdc33d391,0xdc94dc94,0xcaaecaef,0xdc33d3b2,0xd330d3b1,0xdc94dc94,0xcaefd350,0xb5968430,0xa514b596,0xa514a514,0x94929492,0x94929492,0xb596b596,0xb596b596,0x7bcfb596, +0x00004a69,0x8c510000,0x00009cd3,0x4a699cd3,0x9cd38c51,0x00000000,0x9cd30000,0x00004208,0x31864a69,0x8c513186,0x31869cd3,0x4a699cd3,0x9cd38c51,0x31863186,0x9cd33186,0x31863186,0x98838040,0xa965a966,0xa1459904,0xa145a965,0xa145a965,0x99049925,0x99049904,0x99259924,0x90e39945,0xbaaa9082,0x9103b208,0x70007841,0xffffd6ba,0xffbfffff,0xf75def3d,0xa514ce39, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xc6184a49,0xe8e3c618,0xef5def5d,0xef5def5d,0xef5def5d,0xef5de8e3,0xc618ef5d,0x4a49c618,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0x9944a165,0xb185a965,0x99449944,0xb185a165,0x99659144,0xb185b185,0x9944a165,0xb185b9a5,0xd3b2dc33,0xe4d5dc94,0xd3b2d3d2,0xe4d5dc13,0xd3f2d391,0xe4d5e4d5,0xd3b2dc33,0xe4d5e557,0xb5968430,0xad55ad55,0x9cf3ad55,0xb596ad55,0xad55ad55,0xa514a514,0xa514a514,0x8430a514, +0x00009cd3,0x00009cd3,0x9cd30000,0x000052aa,0x00008c51,0x31864a69,0x4a699cd3,0x00009cd3,0x31869cd3,0x31869cd3,0x9cd33186,0x318652aa,0x31868c51,0x31864a69,0x4a699cd3,0x31869cd3,0x90628041,0xa9a6a985,0xa9a6a9a6,0xb1a6a9a6,0xa986a986,0xa145a965,0xb186a966,0xb186b1a6,0xa985a986,0xc2aa90a3,0x9925b208,0x70008041,0xffdfce59,0xffdfffff,0xe73cf79e,0x9cf4bdd7, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x4a490000,0xc6184a49,0xef5dc618,0xef5de8e3,0xef5def5d,0xc618ef5d,0x4a49c618,0x00004a49,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x52050000,0x6b4da534,0x520541c4,0x62656265,0x62656265,0x41a449e4,0xa5346b4d,0x00005205,0xb185b185,0xa1659944,0xb185b185,0x9944a165,0xb185a965,0xa965a965,0xb985b185,0xa965a965,0xe4d5dcd5,0xdc13d3d2,0xe4d5e4f6,0xd3d2dc33,0xe4d5dc74,0xdc74dc74,0xe536e516,0xdc54dc74,0x9cf38430,0xa514a514,0xa5149cf3,0xa514a514,0xa514b596,0xad55ad55,0xb596ad55,0x8430ad55, +0x9cd30000,0x42080000,0x00009cd3,0x00009cd3,0x00009cd3,0x42089cd3,0x9cd30000,0x9cd34a69,0x9cd33186,0x31863186,0x31869cd3,0x31869cd3,0x31869cd3,0x31869cd3,0x9cd33186,0x9cd34a69,0x88618041,0xb1a6a945,0xa986a986,0xb186b1c6,0xa145a986,0xa965a145,0xb1c7b1c7,0xb1e7b1c7,0xa9a6b1e7,0xba6a90c2,0xa124b208,0x68007821,0xf79ec658,0xffffffff,0xd67af79f,0xa4f3b595, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x4a490000,0xc6184a49,0xc618c618,0xc618c618,0x4a49c618,0x00004a49,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83280000,0x6b4da534,0x72e65a66,0xa409a409,0xac4aac4a,0x6aa78368,0xa5346b4d,0x00008328,0xa965a165,0xb9a5b985,0xa965b185,0x99449965,0x89249144,0x99449944,0x89248124,0xa1659944,0xdc54dc33,0xe557e536,0xdc74dcd5,0xd3d2d3f2,0xcb0fd371,0xd3d2d3b1,0xd310ca8e,0xdc13d3b2,0xad558430,0xb596b596,0xb596b596,0xb596b596,0xb596a514,0xb596b596,0xad559cf3,0x8410ad55, +0x8c519cd3,0x4a698c51,0x9cd33186,0x31860000,0x9cd30000,0x4a698c51,0x00000000,0x8c510000,0x8c519cd3,0x4a698c51,0x9cd33186,0x31863186,0x9cd33186,0x4a698c51,0x31863186,0x8c513186,0x80418041,0x90a28882,0x90a290a2,0x98a390a2,0x88629882,0x98a38841,0xa0e3a0c3,0xa0e4a0a3,0x98c2a104,0x99248821,0x88619944,0x70208021,0xd69ac639,0xf7bee75d,0xbd96d6ba,0x9d34b555, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x4a490000,0x4a494a49,0x4a494a49,0x00004a49,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0x99449144,0x91449144,0xa985a165,0x99449144,0xa965a965,0x91448924,0xa165a165,0x89249144,0xd3b2d391,0xd371d350,0xdc94dc13,0xd3b1d391,0xdc74dc54,0xd350caef,0xdc33dc33,0xcb0fd350,0x84108430,0x84108410,0x84308410,0x94929492,0x94927bcf,0x84108430,0x84108410,0x84308410, +0x9cd30000,0x4a690000,0x9cd30000,0x00004a69,0x00009cd3,0x4a699cd3,0x9cd30000,0x9cd30000,0x9cd33186,0x4a693186,0x9cd33186,0x31864a69,0x31869cd3,0x4a699cd3,0x9cd33186,0x9cd33186,0x80418041,0x88618061,0x80418021,0x90618861,0x80418881,0x80418021,0x88618041,0x80618862,0x78408041,0x90e48040,0x88a290e3,0x70008041,0xad75b595,0xce38be17,0x9d13b596,0xb5959cf3, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x41a449e4,0xa5346b4d,0x00008328,0x10821082,0x18c320e3,0x18a21082,0x20e320e3,0x18a218a2,0x20e318c3,0x10821082,0x20e320e3,0x39e739c7,0x42084a49,0x39e739e7,0x4a494a49,0x39e74208,0x4a494228,0x39e739e7,0x4a494228,0x00000000,0x00000000,0x00000000,0x62860000,0x00003142,0x00000000,0x00000000,0x00000000, +0x28e128c1,0x10403922,0x28e128c0,0x104028e1,0x310128e1,0x082028e1,0x28e128e1,0x392228c1,0xef5cef3c,0x39e7ef5c,0xdefadefa,0xef5ce6fb,0xef7def5c,0xe6fad69a,0xffffdeba,0xf77cffff,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0xa2c1d3e2,0xd3e2a2c1,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0xa2c1d3e2,0xd3e2a2c1,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1, +0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0xa2c1d3e2,0xd3e2a2c1,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x62650000,0x62656265,0x6aa78b87,0xa5346b4d,0x83285205,0x20e320e3,0x18a218a2,0x18c320e3,0x18c318c3,0x20e32104,0x10821082,0x18c318c3,0x108218a2,0x4a494a49,0x42084208,0x42084a49,0x42284228,0x42284a69,0x39e739e7,0x42284208,0x39e739e7,0x00000000,0x00000000,0x00000000,0x9bc90000,0x00003963,0x00000000,0x00000000,0x00000000, +0x28e11020,0x104049a3,0x39223101,0x10401880,0x28e14982,0x102051a3,0x392228c1,0x28e11040,0x39e718c3,0xef5c31e7,0xffffef5c,0xffffffff,0xdefaef3c,0x39e739c7,0xdefbbd96,0x18a31903,0xd3e2a2c1,0xd3e2e483,0xe483a2c1,0xa2c1e483,0xe529a2c1,0xa2c1e483,0xe483a2c1,0xa2c1e483,0xd3e2a2c1,0xd3e2e483,0xe483a2c1,0xa2c1e483,0xe529a2c1,0xa2c1e483,0xe483a2c1,0xa2c1e483, +0xd3e2a2c1,0xd3e2e483,0xe483a2c1,0xa2c1e483,0xe529a2c1,0xa2c1e483,0xe483a2c1,0xa2c1e483,0xd6ba0000,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0x0000d6ba,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2840000,0xa284a284,0xa284a284,0xa284a284,0xa284a284,0xa284a284,0xa284a284,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x5a2441a4,0x83286265,0x8b878b87,0x00000000,0x6b4d41a4,0xa534a534,0x18c318c3,0x210420e3,0x18c320e3,0x18a218c3,0x18a21061,0x20e318c3,0x18a218a2,0x210420e3,0x42284228,0x4a694a49,0x42284a49,0x42084208,0x420831a6,0x4a494228,0x42084208,0x4a494a49,0x00000000,0x00000000,0x00000000,0x62860000,0x00003983,0x00000000,0x00000000,0x00000000, +0x31011040,0x310128c1,0x392228e1,0x31011880,0x28c13101,0x104028e1,0x498230e1,0x102051c3,0xdeda39e7,0xef9bd6fa,0xef5bef5c,0xb595e77d,0xef7cdeda,0xef3cef3c,0x39c841c7,0x18c218e3,0xa2c1a2c1,0xd3e2e483,0xe483a2c1,0xa2c1e483,0xe483d3e2,0xd3e2e483,0xe529a2c1,0xa2c1e483,0xa2c1a2c1,0x2800a2c1,0xe483a2c1,0xa2c14080,0xe483a2c1,0x4080e483,0xe529a2c1,0xa2c1a2c1, +0xa2c1a2c1,0x4800a2c1,0xe483e4c2,0xe4c2cea8,0xe483a2c1,0xc667f6e6,0xe529a2c1,0xa2c1a2c1,0xdefb0000,0xe8e3ef5d,0xef5def5d,0xef5def5d,0xef5def5d,0xef5def5d,0xef5def5d,0x0000defb,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2840000,0xbae4bae4,0xbae4bae4,0xa284bae4,0xbae4bae4,0xbae4a284,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83280000,0x6b4da534,0x83685a66,0x00008b87,0x00000000,0x62650000,0x6aa76265,0x6b4d6b4d,0x18a218a2,0x10611061,0x20e320e3,0x10611082,0x18c318a2,0x18c318c3,0x21042104,0x106118c3,0x39e739e7,0x39c731a6,0x4a494a49,0x31a639c7,0x42284208,0x42284208,0x4a694a69,0x39c74228,0x00000000,0x00000000,0x00000000,0x93a90000,0x00003963,0x00000000,0x00000000,0x00000000, +0x51a31020,0x28e11020,0x51a33101,0x30e10820,0x28c11040,0x104049a3,0x28c030e1,0x51a31040,0xffffe75d,0xef5dffff,0xdedad6da,0xef5cd71a,0xe75bef5c,0xef3cef5d,0xef5cef3c,0x420739e7,0xa2c1a2c1,0xe483e483,0xe529a2c1,0xa2c1e483,0xe483d3e2,0xe483e483,0xe529a2c1,0xa2c1e483,0xa2c1a2c1,0x2800a2c1,0xa2c14080,0x40804080,0x4080a2c1,0x40804080,0x4080a2c1,0xa2c14080, +0xa2c1a2c1,0x4800e4c2,0xe4c2c647,0xd728cee8,0xd728e4c2,0xcea8cee8,0xbde7a2c1,0xeda2bd86,0xdefb0000,0xef5def5d,0xef5def5d,0xef5def5d,0xe8e3e8e3,0xdefbdefb,0xef5ddefb,0x0000defb,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2840000,0xa284bae4,0xa284bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83280000,0xa5345205,0x00006b4d,0x00000000,0x00000000,0x83286265,0x00008b87,0x6aa741a4,0x10821082,0x18c318c3,0x18a218a2,0x18c318c3,0x10821082,0x18c31082,0x10611061,0x18c318a2,0x39e739c7,0x42284228,0x39e739e7,0x42284228,0x39e739e7,0x422839e7,0x31a631a6,0x422839e7,0x00000000,0x00000000,0x00000000,0x9bea0000,0x00004184,0x00000000,0x00000000,0x00000000, +0x39221040,0x28e11040,0x51a33102,0x51a31040,0x28c10820,0x104051c3,0x49a33101,0x51c31040,0xef5cef5c,0xe77ce73c,0xbdb6ef5c,0xb5d6b5d6,0xef5cef5c,0xdefad71a,0xb596b5d6,0xdefbdeda,0xa2c1a2c1,0xe483e483,0xe529a2c1,0xa2c1e483,0xe483d3e2,0xe483d3e2,0xe529a2c1,0xa2c1e483,0xa2c1a2c1,0x40802800,0x40804080,0x40804080,0x40804080,0x40804080,0x40804080,0xa2c14080, +0xa2c1a2c1,0xc6074800,0xcec8c667,0xdf68d728,0xdf68df89,0xcec8d728,0xc607c667,0xeda2bda6,0xdefb0000,0xdefbef5d,0xef5ddefb,0xef5def5d,0xe8e3e9a6,0xef5ddefb,0xef5ddefb,0x0000defb,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2840000,0xbae4bae4,0xbae4bae4,0xbae4a284,0xbae4a284,0xbae4bae4,0xbae4a284,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0xa5340000,0x00006b4d,0x00000000,0x62650000,0x8b878328,0x00000000,0x83685a24,0x20e320e3,0x18c318c3,0x20e32104,0x18c318c3,0x20e320e3,0x18c318a2,0x18a218c3,0x18a21082,0x4a494a49,0x42284228,0x4a494a69,0x42284228,0x42284a49,0x42084208,0x42084228,0x420839c7,0x00000000,0x00000000,0x00000000,0x93a80000,0x000041a4,0x00000000,0x00000000,0x00000000, +0x39221060,0x30e11040,0x49a328e1,0x28c01020,0x28c11040,0x104051c3,0x51c330e1,0x49a31040,0xef9cb5d6,0xdedadeb9,0xb5b6deda,0xef7cef7c,0xef5bef7c,0xffffffff,0xe71cef5c,0xef5dffff,0xd3e2a2c1,0xe483e483,0xd3e2a2c1,0xa2c1e483,0xe483a2c1,0xe483e483,0xe483a2c1,0xa2c1d3e2,0xd3e2a2c1,0x28002800,0x28002800,0x28004080,0x40802800,0x28002800,0x28004080,0xa2c1a2c1, +0xf7c5a2c1,0x48004800,0x48004800,0x4800d728,0xdf894800,0x48004800,0x4800ce67,0xa2c1eda2,0xdefb0000,0xdefbef5d,0xef5def5d,0xdefbd6ba,0xef5def5d,0xef5def5d,0xef5ddefb,0x0000defb,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2840000,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4a284,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x6b4da534,0x00000000,0x83286265,0x00008328,0x62650000,0x00008328,0x18a21082,0x20e318a2,0x10611061,0x18c318a2,0x18c31082,0x21042104,0x18c318a2,0x21042104,0x420839e7,0x422839e7,0x39c731a6,0x42284208,0x422839e7,0x4a694a69,0x42284208,0x4a494a69,0x00000000,0x00000000,0x00000000,0x93880000,0x00003963,0x00000000,0x00000000,0x00000000, +0x51c328e1,0x28e11860,0x49823101,0x30e11040,0x102030e1,0x104049a3,0x49a33101,0x39221040,0xe73cef7b,0xe75cef5c,0xdedadeda,0xdedab5d6,0xded9b5d6,0xef5cd6da,0xef7bef9d,0xef3cf75d,0xd3e2a2c1,0xe483e483,0xd3e2a2c1,0xd3e2e483,0xe483a2c1,0xe483e483,0xe483a2c1,0xa2c1d3e2,0xd3e2a2c1,0x2800a2c1,0x2800a2c1,0xa2c1a2c1,0xa2c12800,0x2800a2c1,0x2800a2c1,0xa2c1d3e2, +0xf684a2c1,0x4800eda2,0x4800eda2,0xeda2eda2,0xeda24800,0x4800eda2,0x4800eda2,0xa2c1f7c5,0xdefb0000,0xdefbef5d,0xef5de8e3,0xef5def5d,0xdefbef5d,0xe8e3ef5d,0xef5de8e3,0x0000defb,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2840000,0xbae4a284,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xa284bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x6b4da534,0x62650000,0x8b878368,0x00000000,0x62650000,0x00008328,0x18c318c3,0x10821082,0x18c320e3,0x18a21082,0x18a21082,0x10611082,0x18a218a2,0x10821082,0x42284228,0x39e739c7,0x42284a49,0x39e739e7,0x420839e7,0x39c739e7,0x42084208,0x39c739c7,0x00000000,0x00000000,0x00000000,0x7b070000,0x000049e4,0x00000000,0x00000000,0x00000000, +0x51a328e1,0x31021040,0x10404982,0x104028e1,0x104028e1,0x10404982,0x31013101,0x39221040,0xdefade9a,0xffffde9a,0xef7cffff,0xfffff75c,0xef7ceefb,0xef1cf77c,0xef9ce75c,0xdefad6da,0xe483a2c1,0xe483e483,0xd3e2a2c1,0xd3e2e483,0xe483a2c1,0xd3e2e483,0xe483a2c1,0xa2c1d3e2,0xe483a2c1,0xe483e483,0xa2c1a2c1,0xd3e2a2c1,0xa2c1a2c1,0xa2c1a2c1,0xa2c1a2c1,0xa2c1d3e2, +0xe483a2c1,0xffe7f6e6,0xeda2e4c2,0xd3e2e4c2,0xe4c2eda2,0xeda2e4c2,0xeda2e4c2,0xa2c1f684,0xdefb0000,0xdefbef5d,0xdefbef5d,0xe8e3ef5d,0xdefbe8e3,0xe9a6defb,0xef5de8e3,0x0000defb,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2840000,0xbae4bae4,0xbae4a284,0xbae4a284,0xbae4bae4,0xa284bae4,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0xa5340000,0x5a666b4d,0x00008b87,0x00000000,0x62650000,0x00008b87,0x18a218a2,0x21042104,0x18c318c3,0x20e320e3,0x10821082,0x20e318c3,0x18c318c3,0x20e320e3,0x39e739e7,0x4a694a49,0x42284228,0x4a494a49,0x39e739e7,0x4a494228,0x42284228,0x4a494a49,0x00000000,0x00000000,0x00000000,0x48000000,0x00002800,0x00000000,0x00000000,0x00000000, +0x51a33101,0x31011040,0x104051c3,0x104051a3,0x102051a3,0x18803922,0x392228e1,0x31011040,0xbd96e75c,0xef5bffff,0xdefaef3c,0xe75cdeda,0xbdd6ffff,0xef7ce75c,0xdedaffff,0xd6bbdefa,0xe483a2c1,0xe483e483,0xe483a2c1,0xe483e483,0xe483a2c1,0xa2c1e483,0xe483d3e2,0xa2c1a2c1,0xe483a2c1,0xa2c1e483,0x40804080,0xa2c1a2c1,0xa2c1a2c1,0x40804080,0x40804080,0xa2c1a2c1, +0xe483a2c1,0xa2c1e483,0xc667c607,0xe4c2a2c1,0xa2c1e4c2,0xc667cea8,0xbdc6c607,0xa2c1a2c1,0xdefb0000,0xef5de8e3,0xdefbef5d,0xe9a6ef5d,0xd6bae8e3,0xef5ddefb,0xef5def5d,0x0000defb,0x92430000,0x92439243,0x92439243,0x92439243,0x92439243,0x92439243,0x92439243,0x00009243,0x92430000,0x60a060a0,0x60a060a0,0x60a060a0,0x60a060a0,0x60a060a0,0x60a060a0,0x00009243, +0xa2840000,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4a284,0xbae4bae4,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x52050000,0x6b4da534,0x00000000,0x00000000,0x83286265,0x00000000,0x21042104,0x18c320e3,0x18a218a2,0x18c318a2,0x210420e3,0x18a218c3,0x21042104,0x18c318c3,0x4a694a49,0x42284228,0x42084208,0x42084208,0x4a694228,0x42084228,0x4a694a69,0x42084228,0x00000000,0x00000000,0x00000000,0x50000000,0x00004800,0x00000000,0x00000000,0x00000000, +0x392228e1,0x31011880,0x28c049a3,0x104028e1,0x10404982,0x20a03922,0x39220820,0x31011040,0xe6d939e7,0xe73cdeb9,0xbdd6ef5c,0xdebaef3b,0xdedad6fa,0xef3cef5c,0xef3cb596,0xef5cef3c,0xe529a2c1,0xe483e483,0xe529a2c1,0xe483e483,0xe483a2c1,0xa2c1d3e2,0xe483d3e2,0xa2c1a2c1,0xe529a2c1,0x2800a2c1,0x40804080,0xa2c14080,0x2800a2c1,0x40804080,0x40804080,0xa2c1a2c1, +0xe529a2c1,0x4800a2c1,0xc607bdc7,0xa2c1c647,0x4800eda2,0xc607c647,0xbd86bdc7,0xa2c1eda2,0xdefb0000,0xef5def5d,0xd6baef5d,0xef5def5d,0xef5def5d,0xef5de8e3,0xef5ddefb,0x0000defb,0x92430000,0xbae4bae4,0xbae4bae4,0xa284bae4,0xbae4bae4,0xbae4bae4,0xbae4a284,0x00009243,0x92430000,0x81208120,0x81208120,0x71008120,0x81208120,0x81208120,0x81207100,0x00009243, +0xa2840000,0xbae4bae4,0xa284bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xa284bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x83280000,0xa5345205,0x6b4d6b4d,0x00000000,0x8b8749e4,0x00000000,0x10611082,0x20e31082,0x10611082,0x18a21082,0x10611082,0x18a218a2,0x10821061,0x18a21082,0x31a639c7,0x4a4939e7,0x31a639e7,0x39e739e7,0x31a639e7,0x420839e7,0x39e739c7,0x39e739e7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x28c13101,0x28e13101,0x28e151a3,0x30e128e1,0x10403101,0x498228e1,0x39221040,0x28e11040,0x420739c7,0xffffef7c,0xf75cffff,0xffffef5c,0xef5cffff,0xffffffff,0x39c7ef5c,0x18e218c3,0xe529a2c1,0xd3e2e483,0xe529a2c1,0xe483e483,0xe483a2c1,0xa2c1d3e2,0xe483e529,0xa2c1d3e2,0xe529a2c1,0x2800a2c1,0x40804080,0xa2c14080,0x2800a2c1,0x40804080,0xa2c14080,0xa2c1d3e2, +0xe529a2c1,0x4800a2c1,0xbdc6bd86,0xa2c1bde7,0x4800eda2,0xbdc6bde7,0xeda2bd86,0xa2c1f684,0xdefb0000,0xe8e3ef5d,0xef5de8e3,0xef5def5d,0xef5dd6ba,0xdefbef5d,0xef5def5d,0x0000defb,0x92430000,0xbae4aac4,0xaac4bae4,0xbae4aac4,0xaac4bae4,0xbae4aac4,0xaac4bae4,0x00009243,0x92430000,0x81207900,0x79008120,0x81207900,0x79008120,0x81207900,0x79008120,0x00009243, +0xa2840000,0xa284bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xa284bae4,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0xa534a534,0x6b4d6b4d,0x5a6641a4,0x00000000,0x18a218c3,0x18a21082,0x18c318c3,0x10611061,0x18c31082,0x10821082,0x18c318c3,0x10611082,0x42084228,0x420839e7,0x42284228,0x31a639c7,0x420839e7,0x39c739e7,0x42284228,0x39c739c7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x104030e1,0x28e13101,0x39223922,0x28e13101,0x10403101,0x51a330e1,0x51a31040,0x39221040,0xef5cef3c,0xb5b6b5b6,0x39c6df1a,0x20c439c7,0xe75c39e7,0xd6fadeda,0xe6badeda,0xdeba41e7,0xd3e2a2c1,0xd3e2e483,0xe529a2c1,0xe483d3e2,0xe483a2c1,0xa2c1d3e2,0xe483e529,0xa2c1d3e2,0xd3e2a2c1,0x2800a2c1,0x40804080,0xa2c14080,0x2800a2c1,0x40804080,0xa2c12800,0xa2c1d3e2, +0xd3e2a2c1,0x4800eda2,0xb566b546,0xeda2bd86,0x4800eda2,0xb566bd86,0xeda24800,0xa2c1d3e2,0xdefb0000,0xe9a6ef5d,0xef5de8e3,0xef5def5d,0xe8e3ef5d,0xef5dd6ba,0xef5def5d,0x0000defb,0x92430000,0xa284a284,0xa284aac4,0xa284a284,0xa284aac4,0xa284a284,0xa284aac4,0x00009243,0x92430000,0x79007900,0x71007900,0x60a060a0,0x60a060a0,0x710060a0,0x79007900,0x00009243, +0xa2840000,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4a284,0xbae4bae4,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xa534a534,0x6b4d6b4d,0x6b4d6b4d,0x18a218a2,0x20e318c3,0x18a218a2,0x20e318a2,0x18a21082,0x20e320e3,0x18a218a2,0x20e32104,0x39e74208,0x4a494228,0x39e74208,0x4a494208,0x420839e7,0x4a494a49,0x39e74208,0x4a494a69,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x10603101,0x104028c1,0x39223922,0x28e11040,0x104051a3,0x51a328e1,0x51c31040,0x39221040,0xffffef5c,0xb5d6e77c,0x10c241e7,0x39a720c4,0xf75cef3c,0xef9cef3c,0xef7cef7c,0xef5cdeda,0xd3e2a2c1,0xd3e2e483,0xe483a2c1,0xe529d3e2,0xe529a2c1,0xa2c1e483,0xe483e529,0xa2c1d3e2,0xd3e2a2c1,0xa2c1e483,0x40802800,0xe5292800,0x2800a2c1,0x28002800,0xe483a2c1,0xa2c1d3e2, +0xd3e2a2c1,0xe4c2f6e6,0xb5064800,0xfff24800,0x4800eda2,0x48004800,0xf6e6eda2,0xa2c1d3e2,0xdefb0000,0xdefbef5d,0xd6badefb,0xdefbdefb,0xdefbdefb,0xdefbef5d,0xef5ddefb,0x0000defb,0xc6180000,0xa284c618,0xc618a284,0xa284c618,0xc618a284,0xa284c618,0xc618a284,0x0000c618,0x92430000,0x60a060a0,0x60a060a0,0x79008120,0x81208120,0x60a060a0,0x60a060a0,0x00009243, +0xa2840000,0xbae4bae4,0xbae4a284,0xa284bae4,0xbae4bae4,0xbae4a284,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x52050000,0xa534a534,0xa534a534,0x20e320e3,0x18a218a2,0x20e320e3,0x18a218c3,0x20e318c3,0x18c318c3,0x210420e3,0x18c318c3,0x4a494228,0x42084208,0x4a494a49,0x42084208,0x4a494228,0x42284228,0x4a494a49,0x42284228,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x28c11020,0x104028c0,0x51a328e1,0x28e11040,0x104051a3,0x392228e1,0x39221880,0x51a31880,0xef9cd6db,0xef7ce73c,0xe6daef5c,0xdebaef7c,0xdebbdeda,0xb5b6e77c,0xe75cef5c,0xdedadeba,0xd3e2a2c1,0xa2c1e483,0xe483a2c1,0xe483e483,0xe529a2c1,0xa2c1e483,0xe483e483,0xa2c1e483,0xd3e2a2c1,0xa2c1e483,0x28002800,0xe483e483,0xe529a2c1,0xa2c12800,0xe483e483,0xa2c1e483, +0xd3e2a2c1,0xeda2e483,0x48004800,0xf6e6ffe7,0xfff2e4c2,0xeda24800,0xe483f6e6,0xa2c1e483,0xdefb0000,0xef5def5d,0xef5def5d,0xef5def5d,0xef5def5d,0xef5def5d,0xef5de8e3,0x0000defb,0xc6180000,0xc618ef5d,0xdefbc618,0xc618ef5d,0xdefbc618,0xc618ef5d,0xdefbc618,0x0000c618,0x92430000,0x81207900,0x79008120,0x81207900,0x79007900,0x81208120,0x79008120,0x00009243, +0xa2840000,0xa284bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4a284,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x83280000,0x00008b87,0x00000000,0x18c318a2,0x21042104,0x18c320e3,0x18a218a2,0x10821082,0x18a21082,0x10821061,0x18a218a2,0x42284208,0x4a694a49,0x42284228,0x42084208,0x39c739e7,0x420839e7,0x39c731a6,0x420839e7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x28c11040,0x08203102,0x51a31040,0x28e11040,0x104051a3,0x51a328e1,0x39221880,0x49a31880,0xe75cf77c,0xdebadeda,0xe77cde9a,0xef1ce75c,0xef7be77c,0xef7ce75c,0xef5cef7b,0xef5cf75b,0xe529a2c1,0xa2c1e483,0xe483d3e2,0xd3e2e483,0xe483a2c1,0xa2c1e483,0xe483d3e2,0xa2c1e483,0xe529a2c1,0xa2c1e483,0xe483d3e2,0xd3e2e483,0xe483a2c1,0xa2c1e483,0xe483d3e2,0xa2c1e483, +0xe529a2c1,0xe4c2e483,0xffe7f7c5,0xd3e2f6e6,0xf6e6a2c1,0xe4c2ffe7,0xe483d3e2,0xa2c1e483,0xd6ba0000,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0x0000d6ba,0xc6180000,0xef5def5d,0xef5def5d,0xef5def5d,0xef5def5d,0xef5def5d,0xef5def5d,0x0000c618,0x92430000,0xef5d7900,0x79007900,0x79007900,0x79007900,0x79007900,0x79007900,0x00009243, +0xa2840000,0xa284a284,0xa284a284,0xa284a284,0xa284a284,0xa284a284,0xa284a284,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x18a21082,0x10821082,0x18c318a2,0x10821082,0x18c318c3,0x10821061,0x18c318c3,0x10821082,0x39e739e7,0x39e739c7,0x42284208,0x39e739e7,0x42284228,0x39c739c7,0x42084208,0x39c739c7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x28e11860,0x51c33101,0x31011040,0x104049a3,0x28e128e1,0x392228e1,0x39223101,0x51c328e1,0xef7bb5b6,0xef7cef5c,0xbdd6ef7c,0xdefaef5c,0xe75ce6da,0xffffffff,0xef3cffff,0xb5b5ef7c,0xa2c1a2c1,0xa2c1d3e2,0xd3e2a2c1,0xa2c1d3e2,0xd3e2a2c1,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0xa2c1a2c1,0xa2c1d3e2,0xd3e2a2c1,0xa2c1d3e2,0xd3e2a2c1,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1, +0xa2c1a2c1,0xa2c1d3e2,0xf684e4c2,0xa2c1d3e2,0xd3e2a2c1,0xa2c1e4c2,0xd3e2d3e2,0xa2c1a2c1,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xc6180000,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0x0000c618,0xc6180000,0xdefbdefb,0xdefbdefb,0x7900defb,0x60a060a0,0xdefbdefb,0xdefbdefb,0x0000c618, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x00000000,0x00000000,0x00000000,0x93a80000,0x00006286,0x00000000,0x00000000,0x00000000,0x51e37ac5,0x59e351e3,0x51c351c3,0x51c359e3,0x51e351e3,0x51c351e3,0x51c349a3,0x51e351c3,0x7bcf8430,0x73ae73ae,0x73ae738e,0x73ae73ae,0x73ae73ae,0x738e73ae,0x738e738e,0x738e738e,0x00000000,0x00000000,0x00000000,0x62860000,0x00003142,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa2c1a2c1,0xd3e2a2c1,0xd3e2a2c1,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0x69a669c7,0x38e34820,0x184158e2,0x38412882,0xab8ba2cb,0x92884924,0x38e338c3,0x514538e3, +0x5a27836b,0x72c96a88,0x7b2b5a27,0x392349a5,0x31023923,0x49c65a27,0x31023102,0x8b8c834b,0x49c27369,0x49c249c2,0x49c249c2,0x73697369,0x73697369,0x49c27369,0x49c249c2,0x49c249c2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x7b070000,0x00006aa6,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x8b468b46,0x93678b46,0x8b469367,0x93679367,0x8b468b46,0x93679367,0x72249367,0x94b294b2,0x94b294b2,0x94b29492,0x94929492,0x949294b2,0x94929492,0x94929492,0x73ae9492,0x00000000,0x00000000,0x00000000,0x9bc90000,0x00003963,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe483a2c1,0xd3e2e483,0xe483a2c1,0xa2c1d3e2,0xe483d3e2,0xa2c1e483,0xe483d3e2,0xa2c1e483,0x92aa69a6,0xab2c2041,0x69c75820,0x38415820,0x38414924,0x6841ab8b,0x8a4992cb,0x30c328a2, +0x5a4751e6,0x3102836b,0x41a549e6,0x31238b8c,0x7b0a4184,0x5a275a47,0x41644164,0x7b2a49c5,0x7ac57369,0xc4687ac5,0x7ac57ac5,0x736949c2,0x49c249c2,0x7ac57369,0x7ac57ac5,0x49c27ac5,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x7b070000,0x00006aa6,0x00000000,0x00000000,0x00000000,0x8b46aca9,0xa4497ac5,0xa449a449,0xa408a449,0xa4489367,0xa408a448,0xa408a408,0x72248b46,0x949294b2,0x9cf38c71,0x9cd39cf3,0x9cd39cd3,0x9cd394b2,0x9cd39cd3,0x9cd39cd3,0x73ae9492,0x00000000,0x00000000,0x00000000,0x62860000,0x00003983,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe483d3e2,0xe483e529,0xd3e2a2c1,0xa2c1d3e2,0xe483e529,0xa2c1d3e2,0xe483e483,0xd3e2a2c1,0x8269cbcf,0xcbae6186,0xaaeb7861,0x184159a6,0x988261c7,0x5820b34d,0x58209aeb,0x30c37a08, +0x8b8c4164,0x31236247,0x31023102,0x416472c9,0x7b2a5a27,0x41a5834b,0x418449a5,0x41844184,0xfdeb7369,0xffffc468,0x49c2feb3,0x49c27369,0x49c2c468,0xfdeb7369,0xffffc468,0x49c2c468,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x6ac70000,0x00003963,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x936782c5,0x8b469367,0xa4089367,0x8b467a84,0x8b468b46,0x93878b46,0x72249367,0x949294b2,0x94b28c71,0x949294b2,0x9cd394b2,0x94b28c71,0x94929492,0x94b294b2,0x7bef94b2,0x00000000,0x00000000,0x00000000,0x93a90000,0x00003963,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3e2d3e2,0xe483d3e2,0xa2c1e483,0xa2c1e483,0xe483e529,0xe483a2c1,0xa2c1e483,0xd3e2e483,0xa2cbc38e,0x30c32882,0x18412882,0x582061c7,0x18414124,0x7041c38e,0x71e78a69,0x59a68a87, +0x72c93102,0x72c93102,0x62683103,0x41846247,0x5a274184,0x6ac949a5,0x5a476267,0x51e649c5,0x73697369,0xc468fdeb,0x736949c2,0x7ac549c2,0x7369ffff,0x736949c2,0xc468fdeb,0x49c27ac5,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x6ac70000,0x00003963,0x00000000,0x00000000,0x00000000,0x72a56b6d,0x7ac56244,0x72a572a5,0x938772a5,0x7ac56244,0x7ac57ac5,0x936672a5,0x51e372a5,0x94928410,0x94928c51,0x8c719492,0x94b28c71,0x94928c51,0x8c718c71,0x94b28c71,0x7bcf8c71,0x00000000,0x00000000,0x00000000,0x9bea0000,0x00004184,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa2c1a2c1,0xe483d3e2,0xa2c1e483,0xa2c1e483,0xd3e2e483,0xe483d3e2,0xd3e2a2c1,0xa2c1e483,0x384159a6,0x8269ab2c,0x18416186,0x58208a69,0x71e79aeb,0x30412882,0x4924bb6d,0x30c33841, +0x62685206,0x7b2a3943,0x31026268,0x49c56247,0x39436268,0x6aa993cd,0x6aa96247,0x49a58bac,0x49c27369,0x7ac57369,0x736949c2,0xfdebfdeb,0x49c27369,0x49c27ac5,0x7ac57369,0x73697369,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x62860000,0x00003963,0x00000000,0x00000000,0x00000000,0x8b4631a6,0x8b4682a5,0x93679367,0xa4088b46,0x8b467a84,0x8b468b46,0xa4488b46,0x6a038b46,0x9cd34a69,0x9cd394b2,0x9cd39cf3,0x9cf39cd3,0x94b28c71,0x94b294b2,0x9cf394b2,0x7bef94b2,0x00000000,0x00000000,0x00000000,0x93a80000,0x000041a4,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe483a2c1,0xa2c1d3e2,0xa2c1a2c1,0xa2c1e529,0xa2c1e483,0xd3e2e529,0xe483a2c1,0xd3e2e529,0x78614924,0x8a69ab4a,0x104171e7,0x6841a2cb,0x71e78a69,0x18417a08,0x492461a6,0x79e77041, +0x41844184,0x72e96aa9,0x31023102,0x418472e9,0x6aa949a5,0x5a476aa9,0x31026268,0x6aa93102,0x7ac57ac5,0x736949c2,0x73697369,0x73697369,0x7ac549c2,0x7ac5c468,0x736949c2,0x736949c2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x7b070000,0x000049e4,0x00000000,0x00000000,0x00000000,0x8b46ac68,0x7a847a84,0x82c57a84,0x8b4682a5,0x7a847a84,0x62447a84,0x8b4682c5,0x6a038b46,0x9cf3a514,0x94b294b2,0x94b294b2,0x9cd394b2,0x8c719492,0x8c518c71,0x94b29492,0x841094b2,0x00000000,0x00000000,0x00000000,0x93880000,0x00003963,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe529d3e2,0xe483e483,0xe483e483,0x3960a2c1,0xa2c1a2c1,0xa2c1e483,0xd3e2e483,0xd3e2d3e2,0x49247a08,0x8061c38e,0x30e36020,0x4020a2cb,0x8228e550,0x59a6bc0c,0xd3ef5145,0x58205820, +0x52064164,0x624751c5,0x834b7b0a,0x39237b2a,0x7b0a5206,0x394341a5,0x31023102,0x6a884164,0xfffffdeb,0x49c2feb3,0x49c27369,0xfdeb7369,0xc4687ac5,0xc468ffff,0x736949c2,0x49c27ac5,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x7b070000,0x00006aa6,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x93679367,0x7ac59367,0x93678b46,0x8b469367,0x8b468b46,0x93679367,0x6a039367,0xa534ad75,0xa534a534,0x9cd3a514,0x9cf39cd3,0x9cd39cd3,0x9cd39cd3,0x94b29cd3,0x7bef94b2,0x00000000,0x00000000,0x00000000,0xf8000000,0x0000a800,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa2c1d3e2,0xa2c1a2c1,0xa2c1a2c1,0xb4203960,0xa2c1e540,0xd3e2e483,0xa2c1a2c1,0xa2c1a2c1,0x104171c7,0x886159a6,0xab8b8061,0xa2cb9b09,0x71c7b34d,0x41245145,0x084128a2,0xdd0fdc10, +0x9c0e6ac9,0x49c572e9,0x62885a27,0x310249a5,0x41844184,0x31026268,0x31023102,0x62686247,0xc468fdeb,0x73697ac5,0x7ac549c2,0x736949c2,0xfdeb7369,0x7ac5c468,0x736949c2,0x49c27ac5,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x84100000,0x0000738e,0x00000000,0x00000000,0x00000000,0x7ac59be7,0x936672a5,0x93669366,0x93879366,0x93877ac5,0x93669366,0x93669366,0x51e37ac5,0xad55b596,0xad55a514,0xa534a534,0xa534a534,0xad559cf3,0xa534a534,0xa534a534,0x8c51a514,0x00000000,0x00000000,0x00000000,0xfff2f800,0xf800ffff,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3e2a2c1,0xe483d3e2,0x3960e483,0xe540b420,0x3960b420,0xa2c1a2c1,0xe483e483,0xd3e2e529,0x8a6971e7,0x51652882,0xc38e9aaa,0x41044924,0x284161a6,0x92aa30c3,0x30c35820,0x90824020, +0x626862a9,0x41846a88,0x418449a5,0x49c53102,0x6ac95206,0x5a476268,0x62686268,0x72e93923,0x73697369,0x49c27369,0x7ac57ac5,0x736949c2,0x736949c2,0x7ac5fdeb,0x7ac57369,0x49c2feb3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x7bef0000,0x0000738e,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x8b4682c5,0x93679367,0xa4089367,0x8b467a84,0x93677ac5,0xa4499367,0x72249367,0xbdd7c638,0xb5b6b596,0xb5b6b596,0xbdf7b5b6,0xb596ad75,0xb596ad75,0xbdd7b596,0xa514b596,0x00000000,0x00000000,0x00000000,0xfec0f800,0xf800fc60,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe483d3e2,0xe483e483,0x3960a2c1,0xb420e540,0xa2c13960,0xd3e2e483,0xe483a2c1,0xd3e2d3e2,0x8a695820,0x59a671e7,0x18415965,0x514530c3,0x604161c7,0x8a69b32c,0x8a6961a6,0x30415820, +0x6a883102,0x41843923,0x6a88836b,0x39236aa9,0x394341a5,0x3102836b,0x6a886268,0x6a8841a5,0x49c27369,0xc46849c2,0xc468feb3,0x736949c2,0x49c27ac5,0x73697369,0xc4687ac5,0x49c2ffff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x8b46ac68,0x8b466244,0x8b468b46,0xa4089367,0x8b4682a5,0x8b468b46,0xa4088b46,0x6a038b46,0xc618ce59,0xc618b5b6,0xc618c618,0xc618c618,0xb5b6b596,0xb596b596,0xbdd7b596,0xa514b596,0x00000000,0x00000000,0x00000000,0xf8000000,0x0000f800,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa2c1a2c1,0xa2c1a2c1,0xa2c1e483,0x39603960,0xe483e483,0xe483a2c1,0xa2c1d3e2,0xa2c1a2c1,0x8aaa4820,0x59a671c7,0x602069c7,0x30c38a69,0xdc10bb6d,0x92aa8249,0x59a692a8,0x28821041, +0x392341a5,0x62683923,0x51e63102,0x6a883123,0x41a53943,0x31035a47,0x72c96a88,0x41648bac,0x7ac57369,0xfeb37ac5,0xfeb3ffff,0x736949c2,0xffffc468,0x49c249c2,0xfdeb7369,0x49c2c468,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x8b46b4aa,0x8b467a84,0x93678b46,0xa4089367,0x8b4682c5,0x7ac58b46,0xa4488b46,0x72248b46,0xc638ce79,0xc638bdf7,0xc638c618,0xc618c618,0xb5b6b5b6,0xb596b5b6,0xbdf7b5b6,0xa514b5b6,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3e2a2c1,0xe483e483,0xd3e2d3e2,0xe483a2c1,0xe483d3e2,0xa2c1e483,0xe529e483,0xa2c1d3e2,0xc38ee530,0x59a68a87,0x8aaac38e,0x20418aaa,0x928a59a6,0xab0c9269,0xab6a4104,0x59a67861, +0x41a551e6,0x72ea6ac9,0x31023923,0x836b49a5,0x628841a5,0x7b0a5a67,0x4184834b,0x5a6751e6,0x73697369,0xc468fdeb,0xc468feb3,0x736949c2,0xc468fdeb,0x49c27ac5,0x73697369,0x49c2fdeb,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x72a59ba7,0x62446224,0x62446244,0x7ac56244,0x62446244,0x62246224,0x72a56224,0x51e37ac5,0xbdf7c638,0xbdd7bdd7,0xbdd7bdd7,0xbdd7b5b6,0xad75b596,0xad55ad55,0xad75ad55,0x9cf3ad75,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe483d3e2,0xe483e483,0xe483a2c1,0xe483a2c1,0xa2c1e483,0xd3e2e483,0xd3e2a2c1,0xd3e2e483,0x41247228,0x59a61041,0x69e7aaeb,0xab8ba2eb,0x492430c3,0x38e32882,0xbb6d4924,0x59a68861, +0x39234184,0x31027b0a,0x62687b0a,0x5a473102,0x394341a5,0x49a549a5,0x41844184,0x93cd49c5,0x49c27369,0xfdeb7369,0x7ac57ac5,0x49c27369,0xfdeb7369,0x73697ac5,0x49c249c2,0x49c27369,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x8b468b46,0x8b468b46,0x8b468b46,0x93679367,0x8b469367,0x93677ac5,0x6a039367,0xc638d69a,0xc638c638,0xc638c638,0xc638c638,0xbdf7c638,0xbdd7bdf7,0xb5b6b596,0xa514b5b6,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe529d3e2,0xa2c1e529,0xe483e483,0xe529a2c1,0xa2c1e483,0xe483e483,0xa2c1e529,0xd3e2d3e2,0x71e75986,0x28828a69,0x80614924,0x5820c38e,0x10412061,0x58207a08,0x59a62882,0x8a8a3841, +0x49a56288,0x31026268,0x62473923,0x5a473923,0x31025a47,0x3102834b,0x41644184,0x41645206,0x7ac57ac5,0x736949c2,0x73697ac5,0x7ac549c2,0x736949c2,0x49c27369,0xc468c468,0x736949c2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x93878b46,0xa448a448,0xa408a408,0xa4088b46,0xa448a408,0xa448a408,0x6a039367,0xc638d69a,0xc638c638,0xce79ce79,0xce59ce79,0xce59c638,0xce59ce59,0xc618c618,0xa534b5b6,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe529a2c1,0xe529a2c1,0xd3e2e483,0xd3e2a2c1,0xa2c1e483,0xe483e483,0xd3e2e483,0xa2c1a2c1,0xa2cbc38e,0x8a694020,0x49241841,0x8061c38e,0x58204924,0x582092aa,0x69646841,0xab0c6186, +0x52064184,0x62476ac9,0x62476aa9,0x51e67b0a,0x39233943,0x62686268,0x31023102,0x49c65a47,0xffff7ac5,0x49c2c468,0xfdeb7369,0xffffc468,0x736949c2,0x7ac5fdeb,0xfffffeb3,0x49c2c468,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x8b466b6d,0x8b467a84,0x93678b46,0xa4489367,0x93677a84,0x93679367,0xa4499367,0x6a039367,0xc6188410,0xc618bdd7,0xc618c618,0xce59c618,0xc618bdd7,0xc618c618,0xc638bdf7,0xad55bdf7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0xa2c1a2c1,0xd3e2d3e2,0xd3e2a2c1,0xa2c1d3e2,0xd3e2a2c1,0xd3e2d3e2,0xd3e2a2c1,0xa2c1a2c1,0xa2cbc38e,0x9a8aa2cb,0x71e7c42d,0x49245145,0x80614924,0xa2cbc38e,0x492471e7,0x8228aaeb, +0x62475a47,0x49c53943,0x41643943,0x31023923,0x49a541a5,0x628849a5,0x39234184,0x52063102,0x7ac5fdeb,0x73697ac5,0x73697369,0x7ac5fdeb,0x73697369,0xfdeb7369,0xc468fdeb,0x73697ac5,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x00000000,0x00000000,0x00000000,0x62860000,0x00003142,0x00000000,0x00000000,0x00000000,0x7ac531a6,0x7ae56244,0x72a572a5,0x93667ae5,0x7ac56244,0x18c37ac5,0x936651c3,0x51e351c3,0xbdd74a69,0xbdd7b596,0xb596b596,0xb596b596,0xb596a534,0xb596ad75,0xb596bdd7,0x9cf3a514,0x00000000,0x49c46265,0x00000000,0x00000000,0x00000000,0x00000000,0x41834183,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x61a261a2,0x71e238c1,0x59825982,0x69c24921,0x41215982,0x69e24921,0x49415982,0x38e171e2,0x7aa67aa6,0x9b484142,0x7aa67aa6,0x9b4861e4,0x61e47aa6,0x9b4861e4,0x61e47aa6,0x41429b48, +0x00000000,0x000005e2,0x00000000,0x07020000,0x00000340,0x06220000,0x00000000,0x00000000,0x00000000,0x14c23e60,0x000004a2,0x3d210000,0x05c20340,0x3cc20000,0x00000000,0x00000000,0x000004c2,0x02a06481,0x01c05c01,0x6d000000,0x53e209a0,0x64610280,0x04420000,0x00000000,0x0b603c02,0x12006481,0x1a606481,0x64810000,0x5c0111e0,0x5be222c0,0x5c010000,0x000001c0, +0x096063e1,0x09605bc2,0x11e06401,0x64010000,0x534200c0,0x53620980,0x53820000,0x00000980,0x01005321,0x00205321,0x00004ac1,0x42a10000,0x42810060,0x53420060,0x6c210000,0x000000e0,0x00805b61,0x008063a2,0x00c06382,0x63820000,0x42810000,0x63a20080,0x53010000,0x00000940,0x090052e1,0x00606ba1,0x00c052e1,0x52e10000,0x42410040,0x63620060,0x4aa10000,0x000000a0, +0x00000000,0x00000000,0x00000000,0x9bc90000,0x00003963,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x8b467a84,0x93678b46,0xa4089367,0x936782c5,0x42088b46,0x18c32965,0x72247224,0xc638c618,0xc618bdd7,0xc638c618,0xce59c618,0xc618bdd7,0xb5b6bdd7,0xa534bdd7,0x9cf3a534,0x62650000,0x5a448b87,0x5a245a24,0x5a246a85,0x62656265,0x5a246265,0x6a85ac4a,0x00006265, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x494161a2,0x69e230c1,0x412169c2,0x412130c1,0x412169c2,0x516130c1,0x30c14121,0x598271e2,0x61e47aa6,0x9b484142,0x61e49b48,0x61e44142,0x61e49b48,0x7aa64142,0x414261e4,0x7aa69b48, +0x00000000,0x00000000,0x00000000,0x05620000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x000006a2,0x00000000,0x3d810000,0x00000380,0x07220000,0x14620000,0x00000000,0x00000000,0x01e04502,0x02e03c42,0x5c210000,0x3ce20280,0x34020240,0x00000000,0x00000000,0x13c14da1,0x0b406481,0x02006cc1,0x64610000,0x75202b21,0x45610220,0x3c420000,0x00000240, +0x0a606401,0x226063e1,0x11e06c61,0x53620000,0x64010100,0x63e11a40,0x64210000,0x00000140,0x09805ba1,0x09804b01,0x01404ae1,0x53210000,0x53210100,0x6c010100,0x5b820000,0x00000100,0x11a05b42,0x00e05b41,0x09406382,0x4aa10000,0x5b410940,0x5b210000,0x6bc20000,0x00000920,0x09406ba1,0x19e05b21,0x00e06382,0x5b010000,0x5b2100a0,0x5b210080,0x63610000,0x00000060, +0x00000000,0x00000000,0x00000000,0x62860000,0x00003983,0x00000000,0x00000000,0x00000000,0x8b46aca9,0x82c56244,0x82c582c5,0x8b4682c5,0x82a582c5,0x7a8482a5,0x8b467a84,0x72248b46,0xc638c618,0xbdf7bdd7,0xc618c618,0xc618c618,0xbdd7bdf7,0xb596b5b6,0xb5b6b596,0xa514b5b6,0xa4090000,0x6a856265,0xac4a8b87,0x8b87ac4a,0xac4aac4a,0xa4098b87,0x5a448b87,0x0000a409, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x59824941,0x51624921,0x41214122,0x61a24101,0x410161a2,0x516130c0,0x30c14121,0x59825982,0x7aa661e4,0x7aa661e4,0x61e45a05,0x9b4861e4,0x61e49b48,0x7aa64142,0x414261e4,0x7aa67aa6, +0x00000000,0x00000000,0x00000000,0x000005c2,0x00000000,0x00000000,0x00000000,0x00000000,0x05a20000,0x00000000,0x00000000,0x3dc10000,0x00001d63,0x00000000,0x00000642,0x00000000,0x00000000,0x1d023c62,0x00000502,0x3ce21462,0x04a20320,0x3ce20000,0x00000000,0x00000000,0x000005c1,0x13e14d81,0x02c03c82,0x7d600000,0x44a233e1,0x4e0002c0,0x04a10000,0x0b800000, +0x13c14cc2,0x2b2174c1,0x22a06c61,0x5ba10000,0x74a10980,0x6c412240,0x5bc20000,0x00000a20,0x1a206c01,0x1a006c21,0x226063c2,0x63a10000,0x5ba20140,0x74810140,0x63a10000,0x00003320,0x1a207421,0x11c06381,0x2a406be2,0x6bc20000,0x42610920,0x6bc20940,0x63c20000,0x00000920,0x09606be2,0x09007c61,0x09206381,0x63610000,0x63420900,0x5b420920,0x5b210000,0x00000920, +0x00000000,0x00000000,0x00000000,0x93a90000,0x00003963,0x00000000,0x00000000,0x00000000,0x9367b4aa,0xa4499367,0xa408a449,0xa408a449,0xa4088b46,0xa408a408,0x9387a448,0x72249367,0xc638c618,0xce79c638,0xce79ce79,0xce79ce79,0xce59c618,0xc638ce59,0xbdd7c618,0xa514b5b6,0x00000000,0x6a85ac4a,0x00000000,0x00000000,0x00000000,0x00000000,0x49a3a409,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c14941,0x69c24121,0x41015161,0x61a228a0,0x41013901,0x51614101,0x69c24121,0x69e269c2,0x414261e4,0x9b4861e4,0x61e47aa6,0x9b484142,0x61e461e4,0x7aa661e4,0x9b4861e4,0x9b489b48, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x07220000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x000006c1,0x06410000,0x45610000,0x00000b60,0x05620000,0x0b800000,0x00000000,0x00000000,0x02804e00,0x1c824521,0x7e000000,0x45010b60,0x456101c0,0x00000000,0x00000581, +0x0a605600,0x13c18560,0x018074e1,0x64010000,0x74a11200,0x4ce20a60,0x44a20000,0x00000220,0x13407481,0x33007481,0x00807cc1,0x63e10000,0x63e11a20,0x74811a00,0x8d600000,0x00002aa0,0x3b207c81,0x2a607441,0x19c084a1,0x63c20000,0x6bc211a0,0x63a219e0,0x63c20000,0x00003300,0x2a407401,0x19c06ba1,0x2a406bc2,0x6ba20000,0x6bc20900,0x6ba119c0,0x6bc20000,0x00002a60, +0x00000000,0x00000000,0x00000000,0x9bea0000,0x00004184,0x00000000,0x00000000,0x00000000,0x72a59be7,0x93877ac5,0x93669366,0x93879366,0x93877ac5,0x93879387,0x93669366,0x51e372a5,0xbdf7bdd7,0xce59c618,0xc638c638,0xc638c638,0xc638bdf7,0xc638c638,0xbdf7bdf7,0x9cf3b596,0x00000000,0x49a36265,0x00000000,0x00000000,0x00000000,0x00000000,0x41835a24,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x41215982,0x61a24121,0x39015161,0x49413901,0x49412965,0x61a228a0,0x61a24101,0x30c14121,0x61e47aa6,0x9b4861e4,0x61e47aa6,0x7aa661e4,0x7aa652aa,0x9b484142,0x9b4861e4,0x414261e4, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x03800562,0x00000000,0x00000000,0x00000000,0x00000000,0x06020000,0x000014a2,0x00000000,0x45a10000,0x00000be1,0x00000000,0x000005a2,0x00000000,0x00000000,0x13c144e2,0x00000660,0x4da10280,0x042113a1,0x4dc10000,0x00000000,0x00000000, +0x000004a0,0x138055e1,0x0b004402,0x6c810000,0x4cc21a20,0x44a213a1,0x04600000,0x2d220000,0x13205d81,0x22608540,0x3ba15b41,0x74810000,0x74813361,0x7ca143e1,0x7ce10000,0x00001340,0x2ac09560,0x2aa084c1,0x2a407441,0x74410000,0x74612240,0x744119e0,0x8d400000,0x000032c0,0x32c08ca1,0x11807c41,0x438184a1,0x6ba20000,0x7c412200,0x6bc219a0,0x8cc10000,0x000032e0, +0x00000000,0x00000000,0x00000000,0x93a80000,0x000041a4,0x00000000,0x00000000,0x00000000,0x8b46b4aa,0x000082a5,0x00000000,0xa4080000,0x00007a84,0x00000000,0xa4480000,0x6a038b46,0xc638c618,0x0000bdf7,0x00000000,0xce790000,0x0000bdf7,0x00000000,0xce590000,0xa514bdf7,0x62650000,0x6265a409,0x5a245a24,0x62655a24,0x62656265,0x62656265,0x6265a409,0x00006265, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x41215982,0x61a261a2,0x39014941,0x492128a0,0x38e14921,0x598228a0,0x61a23901,0x412139e7,0x61e47aa6,0x9b489b48,0x61e47aa6,0x7aa64142,0x61e47aa6,0x9b484142,0x9b4861e4,0x61e46b6d, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x000005a2,0x00000000,0x00000000,0x00000000,0x00000000,0x06810000,0x00000000,0x00000000,0x05e20000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x000005c1,0x04c10000,0x4de11421,0x00000b40,0x05610000,0x14410000,0x00000000, +0x00000000,0x13c155a1,0x13404d41,0x74810000,0x55e11340,0x55a11340,0x00000000,0x00000700,0x1b805561,0x1b807cc1,0x24418dc0,0x8d800000,0x960043e1,0x5da112c0,0x5d810000,0x000012c0,0x3b218d20,0x11a084e1,0x32e084a1,0x84a10000,0x74612240,0x8d002ac0,0x8d200000,0x00003b21,0x2a409500,0x2a407401,0x4361a5c0,0x84810000,0x7c412a40,0x8cc119c0,0x95400000,0x00001160, +0x00000000,0x00000000,0x00000000,0x93880000,0x00003963,0x00000000,0x00000000,0x00000000,0x8b46ac68,0x00007a84,0x00000000,0xa4480000,0x00007a84,0x00000000,0xa4080000,0x6a038b46,0xc618c618,0x0000bdf7,0x00000000,0xce790000,0x0000bdf7,0x00000000,0xce590000,0xa534c618,0xa4090000,0x5a448b87,0xac4aac4a,0x8b878b87,0x8b878b87,0xa409a409,0x5a44ac4a,0x0000a409, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c15982,0x410161a2,0x49413901,0x516238e1,0x38e14121,0x39015162,0x28a03901,0x516161a2,0x41427aa6,0x61e49b48,0x7aa661e4,0x9b4861e4,0x61e47aa6,0x61e49b48,0x414261e4,0x7aa69b48, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x01c004e2,0x00000000,0x00000000,0x00000000,0x00000000,0x05210000,0x00000b60,0x06210000,0x4d810000,0x00001441,0x00000000,0x13e10620,0x00000000, +0x00000000,0x13c15600,0x00000560,0x55811bc1,0x05601bc1,0x55810000,0x00000000,0x00000000,0x00005da1,0x1bc15da1,0x1be15e60,0x96000000,0x55211a20,0x5e000a80,0x55210000,0x13400000,0x1b809580,0x3b817421,0x2a808d20,0x84a10000,0x8d2032e0,0x8d402ac0,0x95600000,0x000009c0,0x4bc184a1,0x3b2184a1,0x2a409da0,0x8ca10000,0x7c413b00,0x7c413b21,0x74010000,0x000019a0, +0x00000000,0x00000000,0x00000000,0x7b070000,0x000049e4,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x000082c5,0x00000000,0xa4490000,0x000082c5,0x00000000,0xa4490000,0x6a039367,0xc638c618,0x0000c618,0x00000000,0xce590000,0x0000bdd7,0x00000000,0xc6380000,0xa514bdf7,0x00000000,0x6a85ac4a,0x00000000,0x00000000,0x00000000,0x00000000,0x6a85ac4a,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c05982,0x49415161,0x38e13901,0x516128a0,0x20a030e1,0x38e15162,0x28a03901,0x41215161,0x41427aa6,0x7aa67aa6,0x61e461e4,0x9b484142,0x414261e4,0x61e49b48,0x414261e4,0x61e47aa6, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000422,0x00000000,0x00000000,0x00000000,0x00000000,0x05810000,0x00000000,0x00000000,0x06200000,0x00000000,0x00000000,0x000005e1,0x00000000, +0x00000000,0x000005c0,0x05c00000,0x56000b20,0x00000a60,0x05000000,0x1c210000,0x00000000,0x00000000,0x13005e00,0x24015e00,0x74810000,0x54e21ba1,0x5e201340,0x00000000,0x00005d81,0x000065a1,0x43e195c0,0x2ac084e1,0x8d400000,0x8d203b61,0x95603b81,0x4c420000,0x1b800000,0x32e0a5e0,0x43819d60,0x43818ca1,0x95400000,0x9d602a60,0x7c4132e0,0x7c410000,0x00003b00, +0x00000000,0x00000000,0x00000000,0xfff20000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x7ac59be7,0x62246224,0x62246224,0x7ac56224,0x62446244,0x62246244,0x72a56224,0x51e37ac5,0xbdf7bdd7,0xb5b6b5b6,0xb596b596,0xbdd7b596,0xb5b6b5b6,0xb5b6b5b6,0xbdd7b5b6,0xa514bdd7,0x00000000,0x41835a24,0x00000000,0x00000000,0x00000000,0x00000000,0x41835a24,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c069c2,0x49415161,0x28a03901,0x514128a0,0x208030c1,0x49214121,0x39013901,0x516161a2,0x41429b48,0x7aa67aa6,0x414261e4,0x9b484142,0x414261e4,0x7aa67aa6,0x61e461e4,0x7aa69b48, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1c8205e1,0x00000000,0x00000000,0x00000000,0x00000000, +0x06000000,0x00001c41,0x05200000,0x4cc20000,0x00000b20,0x00000000,0x24a20600,0x00000000,0x00000000,0x1b805541,0x00006620,0x5de12401,0x5d810ac0,0x55010000,0x00000000,0x00000000,0x00000000,0x32c09e00,0x2c828d00,0x95a00000,0x95c032e0,0x8d402c82,0x00000000,0x000065a1,0x42009540,0x43a1a5c0,0x32e0a5c0,0x8cc10000,0x954019a0,0xa5c03b20,0x95400000,0x00002140, +0x00000000,0x00000000,0x00000000,0xfec00000,0x0000fc60,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x93679367,0xa449a448,0xa408a449,0x8b468b46,0x9387a408,0xa449a449,0x72249367,0xc638c618,0xc618c638,0xce59ce59,0xce59ce79,0xc618c618,0xc638ce59,0xce59ce79,0xa534c618,0x62650000,0x6265ac4a,0x5a245a24,0x62655a24,0x62656265,0x5a245a24,0x6a85ac4a,0x00006265, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x516169c2,0x494161a2,0x28a03901,0x412128a0,0x20a030e1,0x49215162,0x41014941,0x516161a2,0x7aa69b48,0x7aa69b48,0x414261e4,0x7aa64142,0x414261e4,0x7aa69b48,0x61e47aa6,0x7aa69b48, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x02400660,0x00000000,0x00000000,0x00000000,0x00000000, +0x06200000,0x00000000,0x00000000,0x05400000,0x00000000,0x00000000,0x00000680,0x00000000,0x00000000,0x00005dc1,0x5e400000,0x55210a80,0x00001300,0x55610000,0x00000000,0x00000000,0x00000000,0x1b008d20,0x00006e80,0x8d401b40,0x6e803b81,0x8d200000,0x00000000,0x00000000,0x00208be2,0x32e0a5e0,0x31809540,0x7c410000,0x9d602a60,0x7c613180,0x7b420000,0x39c00000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x8b466b6d,0x00006244,0x00000000,0xa4080000,0x000082a5,0x00000000,0xa4080000,0x6a038b46,0xc6188410,0x0000b5b6,0x00000000,0xce590000,0x0000bdf7,0x00000000,0xce590000,0xa534c618,0xa4090000,0x62656265,0xac4aac4a,0x8b87ac4a,0x8b878b87,0xac4a6265,0x5a448b87,0x0000a409, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x41214921,0x410161a2,0x39013901,0x516228a0,0x38e130e1,0x28a05162,0x41014941,0x69c261a2,0x61e461e4,0x61e49b48,0x61e461e4,0x9b484142,0x61e461e4,0x41429b48,0x61e47aa6,0x9b489b48, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000481,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x0b200640,0x00000000,0x00000000,0x00000000,0x00000000,0x5e400000,0x00001320,0x54e20000,0x55410000,0x000009c0,0x00000000,0x1be15e20,0x00000000,0x00000000,0x00005d41,0x65810000,0x95c023e1,0x00004c02,0x54a20000,0x1b000000,0x00000000,0x00005a82,0x43419520,0x00008382,0x8cc14a20,0x838232c0,0xa5c02940,0x00000000,0x18e08ba2, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x7a8431a6,0x00007a84,0x00000000,0xa4080000,0x000082c5,0x00000000,0xa4480000,0x72248b46,0xbdf74a69,0x0000bdd7,0x00000000,0xce590000,0x0000bdf7,0x00000000,0xce590000,0xad55c618,0x00000000,0x5a448b87,0x00000000,0x00000000,0x00000000,0x00000000,0x6265a409,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x41215982,0x51615161,0x39013901,0x49215982,0x28a04921,0x29655982,0x41014941,0x69c230c0,0x61e47aa6,0x7aa67aa6,0x61e461e4,0x7aa69b48,0x41427aa6,0x52aa9b48,0x61e47aa6,0x9b484142, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x1c610520,0x00000000,0x00000000,0x00000000,0x00000000,0x55610000,0x00000000,0x00000000,0x4c420000,0x00000000,0x00000000,0x00005e00,0x00000000,0x65a10000,0x00001280,0x66000000,0x9e200000,0x00001b20,0x00000000,0x1b605d41,0x00000000,0x00000000,0x42209d80,0x93e10000,0x95202940,0x7b4232c0,0x95000000,0x00000000,0x00007302, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x72a59ba7,0x00006224,0x00000000,0x93870000,0x00006244,0x00000000,0x93660000,0x51e37ac5,0xbdf7bdd7,0x0000b5b6,0x00000000,0xc6380000,0x0000b5b6,0x00000000,0xc6180000,0xa514bdf7,0x00000000,0x49a35a24,0x00000000,0x00000000,0x00000000,0x00000000,0x41835a24,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x41215982,0x318669c2,0x39015161,0x59823901,0x28a04941,0x49414941,0x41214101,0x69c230c1,0x61e47aa6,0x52aa9b48,0x61e47aa6,0x9b4861e4,0x41427aa6,0x7aa67aa6,0x61e461e4,0x9b484142, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000640,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x13405e40,0x00000000,0x00000000,0x00000000,0x00000000,0x5ce20000,0x00000000,0x00000000,0x5d610000,0x00000000,0x00000000,0x000065a1,0x00000000,0x00000000,0x000093c1,0x7b420000,0x95200000,0x000039a0,0x93e10000,0x39a00000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x7a847a84,0x7a847a84,0x8b4682a5,0x82c582c5,0x82a582c5,0x93676244,0x6a039367,0xc638c618,0xbdd7bdd7,0xbdd7bdd7,0xc618bdf7,0xbdf7bdf7,0xbdf7bdf7,0xc618b5b6,0xa534bdf7,0x62650000,0x5a448b87,0x62656265,0x62656265,0x62656265,0x5a245a24,0x6a856265,0x00006265, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c171e2,0x69c269c2,0x41015161,0x494128a0,0x28a04941,0x410161a2,0x41214121,0x59824121,0x41429b48,0x9b489b48,0x61e47aa6,0x7aa64142,0x41427aa6,0x61e49b48,0x61e461e4,0x7aa661e4, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1b605d81,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x3b6184c1,0x00000000,0x00000000,0x00000000,0x00000000,0x7b620000,0x00002120,0x00000000,0x83a20000,0x00000000,0x00000000,0x294083a2,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x7ac58b46,0x8b468b46,0x8b468b46,0x8b468b46,0x8b468b46,0x8b468b46,0x6a039367,0xc618bdf7,0xbdd7bdf7,0xc618c618,0xc618c618,0xc618c618,0xc618c618,0xc618c618,0xa534c618,0xa4090000,0x49a3a409,0x8b878b87,0xa409a409,0xac4aac4a,0xa409ac4a,0x62658b87,0x0000a409, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c14941,0x51625982,0x41215161,0x61a230c0,0x30c04101,0x41215161,0x41214121,0x71e230c1,0x414261e4,0x7aa67aa6,0x61e47aa6,0x9b484142,0x414261e4,0x61e47aa6,0x61e461e4,0x9b484142, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00005da1,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x240195a0,0x00000000,0x00000000,0x00000000,0x00000000,0x73220000,0x00000000,0x00000000,0x10c08ba2,0x00000000,0x00000000,0x00007b42,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xac68b4aa,0xac68ac68,0xb4aaac68,0xaca9b4aa,0xb4aaac68,0xb4aab4aa,0xb4aab4aa,0x8b46b4aa,0xa514a534,0xad75a534,0xbdf7b5b6,0xbdf7c618,0xbdf7bdf7,0xc618c618,0xc638c638,0xbdd7c638,0x00000000,0x5a448b87,0x00000000,0x00000000,0x00000000,0x00000000,0x6a85ac4a,0x00000000, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x49417202,0x69e271e2,0x41214121,0x69c269c2,0x30c04121,0x412169c2,0x69e25982,0x71e24921,0x61e49b48,0x9b489b48,0x61e461e4,0x9b489b48,0x414261e4,0x61e49b48,0x9b487aa6,0x9b4861e4, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00006620,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00006b02,0x00000000,0x00000000,0x00000000,0x00000000, +0xce79c618,0xe71cf79e,0xd6bace59,0xffdff79e,0xd69adedb,0xf79ee73c,0xce79ce59,0xf79eef7d,0x1aaf220a,0x1aaf220a,0x2a4b1aaf,0x1aaf1aaf,0x1aaf22d0,0x1aaf1168,0x328c1aaf,0x2a4b1aaf,0xffffffff,0xefffffff,0xe79eefff,0xe79ee79e,0xe79ee79e,0xffffefff,0xefffe79e,0xffffe79e,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0x7aa79369,0x9369bc2b,0x7aa79369,0x93698430,0x93699369,0x7aa77aa7,0x93699369,0x59e57aa7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x0a020000,0x142413e4,0x140313a3,0x09c20b63,0x14030a02,0x0b8313e4,0x13e31403,0x00000b03,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa5569d15,0x94d49d15,0xa536add9,0xa55794f4,0xad779d36,0x9d159d15,0x9d369d15,0x94f49d15,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x31652904,0x31653165,0x31653165,0x31653165,0x31653165,0x31653165,0x31653145,0x31653165,0x31652904,0x31653165,0x31653165,0x31653165,0x31653165,0x31653165,0x31653145,0x31653165, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xf7bef7be,0xdedbdefb,0xe71cf79e,0xef5de73c,0xef7dffff,0xd69ad69a,0xe73ce71c,0xce59d6ba,0x00000a0d,0x000022f0,0x1aaf0000,0x00000000,0x00000000,0x000022d0,0x124e0000,0x1aaf0000,0xefffffff,0xe79effff,0xe79ee79e,0xffffe79e,0xffffffff,0xffffffff,0xefffffff,0xe79eefff,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0x7aa79369,0xbc2b59e5,0x59e57aa7,0x59e57aa7,0x7aa77aa7,0x59e57aa7,0x7aa77aa7,0x93699369,0x0b030000,0x01410000,0x0b030b03,0x0b030000,0x00000141,0x0b030b03,0x01410000,0x00000b03,0x0a020000,0x146413e4,0x14240ba3,0x00000ac2,0x13e40a02,0x13a31464,0x13a31424,0x00000b03,0x0b030000,0x0b030b03,0x0b030b03,0x0b030b03,0x0b030b03,0x0b030b03,0x0b030b03,0x00000b03, +0x9d16a536,0x9d159d15,0x9d16a536,0xa556a536,0xa5368cb3,0x9d1594b4,0x9cf5a557,0xa5369d15,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x854b0000,0x00006c28,0xaece0000,0x0000854b,0x7aa83165,0x72877287,0x8ae87287,0x72878ae8,0x8ae88ae8,0x82a87287,0x8ae88ae8,0x31657aa8,0x7aa83165,0x72877287,0x8ae87287,0x72878ae8,0x8ae88ae8,0x82a87287,0x8ae88ae8,0x31657aa8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe73ce73c,0xffffffdf,0xef5df79e,0xd6bae71c,0xdedbbdd7,0xf79ee73c,0xdedbdedb,0xfffff79e,0x126e220a,0x1aaf220a,0x220a1aaf,0x1aaf1aaf,0x22d01aaf,0x126e220a,0x19a81aaf,0x220a1aaf,0xefffefff,0xe79eefff,0xefffefff,0xe79eefff,0xefffffff,0xe79eefff,0xffffffff,0xefffefff,0x755f8dff,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f8dff,0x755f755f,0x755f755f, +0x93697aa7,0x7aa77aa7,0x7aa759e5,0x93699369,0x59e57aa7,0x59e5bc2b,0xbc2b7aa7,0x93699369,0x0b030000,0x14030aa2,0x0b431444,0x0ba30aa2,0x0aa21444,0x14241403,0x0aa20aa2,0x00000b03,0x01410000,0x13e30b83,0x14241403,0x0b030bc3,0x0b630141,0x13a313e4,0x14641464,0x00000b03,0x0b030000,0xdef3def3,0xdef3def3,0xded3def3,0xded3def3,0xdef3def3,0xdef3def3,0x00000b03, +0xa557adb9,0x8c939cf5,0x9d159d15,0xad779d15,0xad77a536,0xa536a557,0x9d15a556,0x9d16a557,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xe77b0000,0x0000960c,0xaece7605,0x0000854b,0x72873165,0x498492c7,0x49849b29,0x39439b29,0x41649b29,0x394392e8,0x394382a7,0x31657287,0x72873165,0x9b2992c7,0x9b299b29,0x72879b29,0x92e87287,0x82a792e8,0x82a782a7,0x31657287, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd69ad6ba,0xbdf7bdd7,0xf7bef79e,0xb5b6c638,0xef5ddefb,0xe73ce71c,0xffffffff,0xc618e73c,0x00001aaf,0x00001aaf,0x1aaf0000,0x00000000,0x00000000,0x00001aaf,0x1aaf0000,0x1aaf0000,0xffffefff,0xe79eefff,0xe79ee79e,0xffffefff,0xffffffff,0xe79eefff,0xe79ee79e,0xe79ee79e,0x8dff755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0xffff755f,0x755f755f,0x755f755f, +0x59e57aa7,0x7aa79369,0x93699369,0x7aa7bc2b,0x7aa77aa7,0x7aa77aa7,0x7aa77aa7,0xbc2bbc2b,0x0b030000,0x14031444,0x00000b43,0x14241403,0x0b431444,0x0b431403,0x14241464,0x00000b03,0x00000000,0x0b830b43,0x146413e4,0x0b030b83,0x0ae20000,0x13a31464,0x0ba313e3,0x00000b03,0x0b030000,0xd6b3def3,0xd6d4d6b3,0xd6b3d6b3,0xd6b3d6b3,0xd6d4d6d4,0xdef3d6d4,0x00000b03, +0xa536ad77,0xad779d15,0x9d15a536,0x94d4a556,0xa53694f4,0x9d159d15,0xa537a536,0x9d159d15,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x8ae83165,0x59e59b29,0x51849b29,0x51849b29,0x518482a7,0x518482a7,0x59a492e8,0x31658ae8,0x8ae83165,0x9b299b29,0x82a79b29,0x18a27287,0x728718a2,0x82a782a7,0x92c792e8,0x31658ae8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce79ce59,0xe71ce71c,0xd6bad69a,0xe73cef5d,0xce79ce59,0xe73cd69a,0xbdd7bdd7,0xe73cd6ba,0x00000a2d,0x000022d0,0x2b310000,0x00000000,0x00000000,0x00001aaf,0x1aaf0000,0x1aaf0000,0xe79effff,0xefffe79e,0xefffefff,0xe79ee79e,0xe79ee79e,0xffffe79e,0xefffefff,0xe79ee79e,0x755f755f,0x755f755f,0x755f755f,0x755f8dff,0x755f755f,0x755f755f,0x755fffff,0x755f755f, +0x7aa79369,0x93697aa7,0xbc2b9369,0x93697aa7,0x93696b6d,0x7aa79369,0x936959e5,0x59e57aa7,0x0b030000,0x14031444,0x0b431444,0x14241403,0x00000b43,0x00000b43,0x14030b43,0x00000000,0x0a020000,0x0ba31424,0x146413e4,0x0b030ba3,0x13e30a02,0x13a31464,0x0b031464,0x000009c2,0x0b030000,0xd6b3def3,0xdef4def4,0xdef3def3,0xdef4def4,0xdef4def4,0xdef3d6b3,0x00000b03, +0xa5379cf5,0x94d5a556,0x9d15a536,0x9d15a536,0xa536a536,0xadb89d35,0x9d159d15,0x94b49d15,0xaece0000,0x0000854b,0x854b0000,0x00006c28,0xaece7605,0x0000854b,0xaece0000,0x0000854b,0x82873165,0x92c74143,0x92c84143,0x92c74143,0x92c74143,0x92c74143,0x92c84143,0x31658287,0x82873165,0x92c792c7,0x92c892c8,0x18a27287,0x728718a2,0x92c792c7,0x92c892c8,0x31658287, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xf79ef79e,0xef5def5d,0xf79effff,0xe73cef5d,0xef7df79e,0xe71cd6ba,0xdefbe73c,0xdefbce59,0x1aaf0947,0x1aaf1188,0x21e91aaf,0x1a8f0a2d,0x1a8f2b52,0x1aaf220a,0x220a124e,0x11882b11,0xffffffff,0xe79effff,0xefffefff,0xefffefff,0xefffefff,0xffffe79e,0xefffffff,0xe79eefff,0x755f755f,0x755f755f,0x755f755f,0xffff755f,0x755f755f,0x755f755f,0xffff755f,0x755f755f, +0x93699369,0xbc2b7aa7,0x7aa7bc2b,0x9369bc2b,0xbc2b59e5,0x7aa7bc2b,0x93699369,0x7aa78430,0x00000000,0x14030aa2,0x14031424,0x14441403,0x0b431403,0x0b4313e3,0x14031444,0x00000b03,0x0a020000,0x0ba31424,0x14641403,0x09c20b02,0x13e30a02,0x0ba31464,0x0aa21464,0x00000000,0x0b030000,0xd6b3def3,0xdef3def4,0xdef3def3,0xdef3def3,0xdef4def3,0xdef3d6d4,0x00000b03, +0xa536a536,0xa5378c73,0xa55794f4,0x9d169d35,0xad77ad77,0x9d15a556,0x9d159d36,0x9d369d15,0xaece0000,0x0000854b,0xe77b7605,0x0000960c,0xaece9766,0x0000854b,0x854b0000,0x00006c28,0x82a83165,0x92e859c5,0x9b2959e5,0x82a75184,0x82a75184,0x92e859c5,0x92e859c5,0x316582a8,0x82a83165,0x92e892e8,0x9b299b29,0x18a27287,0x728718a2,0x92e892e8,0x92e892e8,0x316582a8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdedbd69a,0xef7dd6ba,0xbdf7bdd7,0xe71cdedb,0xe73cce79,0xffffffff,0xe73cdedb,0xffdfffff,0x00001aaf,0x00001aaf,0x22f00000,0x00000000,0x00000000,0x0000126e,0x126e0000,0x1aaf0000,0xefffefff,0xffffefff,0xffffffff,0xefffffff,0xefffefff,0xe79eefff,0xe79effff,0xe79ee79e,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755fffff,0x755f755f,0x755f755f,0x755f755f, +0x93699369,0x7aa759e5,0x59e57aa7,0x7aa759e5,0x7aa77aa7,0x7aa77aa7,0xbc2bbc2b,0x93697aa7,0x0b030000,0x14031444,0x14240b43,0x00000b43,0x14030b43,0x14241403,0x14030b43,0x00000b03,0x0a020000,0x13a31464,0x146413e4,0x00000aa2,0x0b830a02,0x0ba31464,0x0ba31464,0x00000b03,0x0b030000,0xd6b3ded3,0xdef3def3,0xd6b3d6b3,0xd6b3d6b3,0xdef4def3,0xdef3d6b3,0x00000b03, +0x8c9394d4,0x9d35a536,0xa5369d35,0x9d15a557,0xa5369d36,0xad77a536,0xa5369d36,0xa57694d4,0x854b7605,0x00006c28,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xe77b0000,0x0000960c,0x72873165,0x394382a7,0x498482a7,0x416492e8,0x394382a7,0x414382a7,0x39439b29,0x31657287,0x72873165,0x82a782a7,0x9b2982a7,0x18a27287,0x728718a2,0x92c782a7,0x82a79b29,0x31657287, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe73cef5d,0xd69ac618,0xe73cf79e,0xd6bace79,0xd6bad69a,0xc618d69a,0xdedbdefb,0xc638c638,0x000022f0,0x00001aaf,0x1aaf0000,0x00000000,0x00000000,0x00001aaf,0x1aaf0000,0x1aaf0000,0xefffffff,0xefffefff,0xe79ee79e,0xe79ee79e,0xffffffff,0xe79effff,0xffffffff,0xe79eefff,0x8dff755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0x7aa79369,0x93697aa7,0x93697aa7,0x59e57aa7,0x93697aa7,0x7aa79369,0x7aa77aa7,0x7aa759e5,0x0b030000,0x0b431444,0x0b430000,0x0b4313e3,0x14031403,0x0b431403,0x0b430000,0x00000000,0x0a020000,0x0ba31464,0x0ba31403,0x0b031403,0x0b230141,0x13a31444,0x0ba31403,0x00000b03,0x0b030000,0xd6d4def3,0xdef3def4,0xdef4d6b3,0xd6b3def4,0xdef4def3,0xdef3d6b3,0x00000b03, +0xa536a536,0xa557a557,0x9d15a536,0xa536a557,0xadd9ad77,0xa53694d4,0x9d169d15,0x9d369d15,0xe77b9766,0x0000960c,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x8ae83165,0x59e59b29,0x59a49b29,0x59e582a7,0x59c59b29,0x59c592e8,0x59e59b29,0x31658ae8,0x8ae83165,0x9b299b29,0x92c79b29,0x18a27287,0x728718a2,0x92e892e8,0x9b299b29,0x31658ae8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd69ad69a,0xffffffff,0xe73cef5d,0xf79ef79e,0xd69ace59,0xf79eef5d,0xe73ce73c,0xf79ef79e,0x00001aaf,0x00001aaf,0x1aaf0000,0x00000000,0x00000000,0x00001aaf,0x22d00000,0x124e0000,0xffffffff,0xefffefff,0xefffefff,0xe79eefff,0xffffffff,0xe79ee79e,0xefffffff,0xe79eefff,0x755f755f,0x755f8dff,0x755f755f,0x755f8dff,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0x7aa7bc2b,0xbc2bbc2b,0x93699369,0x7aa77aa7,0x59e59369,0x93699369,0x7aa77aa7,0x93699369,0x00000000,0x14030aa2,0x14840b43,0x14031444,0x0b431444,0x14241403,0x14030b43,0x00000141,0x0a020000,0x13a31464,0x13a31403,0x0b031464,0x0a820000,0x0bc31424,0x0b221424,0x000009c2,0x0b030000,0xd6b3def3,0xdef3def4,0xdef4d6b3,0xd6b3def4,0xdef3def3,0xdef3d6b3,0x00000b03, +0x9d159d36,0x9d35a557,0x9d159d36,0xadb7a556,0x9cf5a536,0x9d159d15,0xa536a536,0xa5579d15,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x7605854b,0x82873165,0x92c84143,0x92c84143,0x92c74143,0x92c74143,0x92c84143,0x92c84143,0x31658287,0x82873165,0x92c892c8,0x92c892c8,0x18a27287,0x728718a2,0x92c892c8,0x92c892c8,0x31658287, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xffffffff,0xef5def7d,0xdefbdefb,0xe71cdedb,0xffffef7d,0xdedbe73c,0xffffffff,0xe71cef5d,0x00001aaf,0x0000020d,0x1a8f0000,0x00000000,0x00000000,0x00001aaf,0x01ab0000,0x1aaf0000,0xe79effff,0xe79ee79e,0xefffffff,0xffffe79e,0xe79ee79e,0xffffe79e,0xefffefff,0xe79ee79e,0x755f755f,0x755f755f,0x755f755f,0x8dff755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0x59e5bc2b,0x7aa77aa7,0x7aa78430,0xbc2b7aa7,0x7aa7bc2b,0xbc2bbc2b,0x93697aa7,0x93697aa7,0x01410000,0x14840ba3,0x14441403,0x14031424,0x00000b43,0x140313e3,0x14031403,0x00000b03,0x00000000,0x0bc313a3,0x13e31403,0x0b0313e4,0x13a30a02,0x13e31424,0x0aa21424,0x00000000,0x0b030000,0xd6b3def3,0xdef3def4,0xd6d4d6b3,0xd6b3d6b3,0xdef3def3,0xdef3d6b3,0x00000b03, +0xa53694d4,0x9d369cf5,0xa55694d4,0x9d159d15,0x9d159d15,0xadb8a557,0xa557a536,0x9d16a536,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x854b0000,0x00006c28,0xaece0000,0x9766854b,0x8ae83165,0x92e859e5,0x9b2959e5,0x82a759e5,0x82a75184,0x9b2959a4,0x9b2959e5,0x31658ae8,0x8ae83165,0x92e89b29,0x9b299b29,0x18a27287,0x728718a2,0x9b2992c7,0x9b299b29,0x31658ae8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xbdd7c618,0xf79ece79,0xb5b6ce79,0xd69ace59,0xb5b6ce79,0xd6bad69a,0xd69ac618,0xd6bace59,0x1aaf220a,0x22d0220a,0x326c1aaf,0x1aaf1aaf,0x22f01aaf,0x22f0220a,0x220a1aaf,0x220a1aaf,0xefffefff,0xefffefff,0xffffe79e,0xffffffff,0xefffe79e,0xe79ee79e,0xefffefff,0xe79eefff,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755fffff,0x755f755f,0x755f8dff,0x755f755f, +0x59e57aa7,0x93699369,0x93697aa7,0x59e559e5,0x7aa759e5,0x59e57aa7,0x7aa77aa7,0xbc2b7aa7,0x0b030000,0x0b431403,0x0b430000,0x140313e3,0x140313e3,0x14241444,0x0aa21444,0x00000000,0x0a020000,0x14030b43,0x13e413e4,0x0b0313e4,0x13a30a02,0x14441403,0x0ba31424,0x00000b03,0x0b030000,0xd6b3def3,0xdef3def4,0xdef3def3,0xdef3def3,0xdef4def3,0xdef3d6b3,0x00000b03, +0xa5369cf5,0xadda9d15,0xa5769d15,0xa536a536,0xad779d15,0x94d4a536,0x9d159d15,0x94d49d36,0xaece0000,0x0000854b,0x854b0000,0x00006c28,0xe77b0000,0x0000960c,0xaece0000,0x0000854b,0x72873165,0x416492c7,0x416492e8,0x39439b29,0x416492e8,0x416492e8,0x394382a7,0x31657287,0x72873165,0x92e892c7,0x92e892e8,0x18a27287,0x728718a2,0x92e892e8,0x82a782a7,0x31657287, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdedbe73c,0xdefbce79,0xef5def5d,0xb5b6bdf7,0xe71cd69a,0xc638d69a,0xef5def5d,0xbdf7ce59,0x00001aaf,0x00001aaf,0x1aaf0000,0x00000000,0x00000000,0x00001aaf,0x1aaf0000,0x0a0d0000,0xffffffff,0xefffefff,0xffffefff,0xffffe79e,0xefffefff,0xffffe79e,0xefffffff,0xe79eefff,0xffff755f,0x755f755f,0x755f755f,0x755f755f,0xffff755f,0x755f755f,0x8dff755f,0x755f755f, +0x7aa79369,0xbc2b9369,0x936959e5,0x7aa77aa7,0x59e559e5,0x6b6d59e5,0x93697aa7,0x7aa759e5,0x01410000,0x14031424,0x14440b43,0x0b431444,0x14031444,0x0b431444,0x14031444,0x00000b03,0x0a020000,0x14030ba3,0x142413e4,0x0b031403,0x0b230141,0x14641403,0x13a31464,0x00000b03,0x0b030000,0xd6d4def3,0xdef4def3,0xdef4def4,0xdef4def3,0xdef4def3,0xdef3d6b3,0x00000b03, +0x9d15a556,0x9d15a557,0xa557a557,0xa557a537,0x9cf5a557,0xa5579d15,0x94d49d16,0x94f5a536,0xaece0000,0x0000854b,0xe77b0000,0x7605960c,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x72873165,0x518482a7,0x59e582a7,0x51849b29,0x51849b29,0x59a482a7,0x59c592e8,0x316582a8,0x72873165,0x82a782a7,0x9b2982a7,0x18a27287,0x728718a2,0x92c782a7,0x92e892e8,0x316582a8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd69adefb,0xf79eef5d,0xd6bad6ba,0xf79edefb,0xdedbce79,0xf79ef79e,0xd69adefb,0xf79effff,0x00001aaf,0x00001aaf,0x22f00000,0x00000000,0x00000000,0x000022f0,0x1aaf0000,0x22d00000,0xe79effff,0xe79ee79e,0xffffffff,0xffffe79e,0xefffffff,0xe79eefff,0xffffffff,0xe79eefff,0x755f755f,0x755fffff,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f8dff, +0x6b6d59e5,0x59e559e5,0x59e5ffff,0x59e559e5,0x59e5ffff,0x59e5efff,0x59e57aa7,0x7aa759e5,0x00000000,0x14a40aa2,0x14241403,0x00000b43,0x14030b43,0x00000b43,0x14030b43,0x00000b03,0x01410000,0x13e30b23,0x14240ba3,0x0b0313a3,0x0aa20000,0x146413e4,0x0ba31464,0x00000b03,0x0b030000,0xd6b3def3,0xd6b3d6b3,0xd6b3d6b3,0xd6b3d6b3,0xd6b3d6b3,0xdef3d6d4,0x00000b03, +0x9d159cf5,0xa5369d15,0xa5369d15,0x9d159d15,0x9d159d15,0xa5569d35,0x9d359d36,0x94d49d36,0xaece0000,0x7605854b,0xaece0000,0x9766854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x82873165,0x92c74143,0x92c74143,0x92c74143,0x92c74143,0x92c84143,0x92c84143,0x31658287,0x82873165,0x92c792c8,0x92c792c7,0x18a27287,0x728718a2,0x92c892c8,0x92c892c8,0x31658287, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xf79eef7d,0xdedbd6ba,0xf79ef7be,0xd6bae71c,0xf79eef5d,0xe73ce73c,0xffffffdf,0xe73cef5d,0x1aaf19a9,0x1aaf220a,0x3acd128f,0x1aaf1a8f,0x1aaf124e,0x1a8f11a8,0x21ea1aaf,0x220a01cc,0xffffefff,0xe79eefff,0xefffe79e,0xe79eefff,0xefffffff,0xe79eefff,0xffffffff,0xefffefff,0x755f755f,0xffff755f,0x755f755f,0x755f8dff,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0x59e5efff,0xe79eefff,0x59e5e79e,0x59e5efff,0xefffffff,0xe79eefff,0xffff59e5,0x59e5efff,0x0b030000,0x0aa21424,0x13e31403,0x0aa213e3,0x14031464,0x0b431444,0x14031424,0x00000b03,0x00000000,0x13e30b43,0x14640ba3,0x09c20b03,0x13a30a02,0x142413e4,0x0ac21424,0x00000000,0x0b030000,0xded3def3,0xdef3def3,0xdef3def3,0xdef3ded3,0xdef3def3,0xdef3def4,0x00000b03, +0xad77a536,0x9d15ad98,0x9d159d15,0x9d369d36,0xa556a536,0xa557a557,0x9d1594f4,0xad989d15,0xaece0000,0x9766854b,0xaece0000,0x0000854b,0xaece0000,0x7605854b,0x854b0000,0x00006c28,0x8ae83165,0x82a75184,0x82a75184,0x92e859c5,0x9b2959e5,0x92e859e5,0x9b2959a4,0x31658ae8,0x8ae83165,0x82a782a7,0x82a782a7,0x728792e8,0x9b297287,0x92e89b29,0x9b2992c7,0x31658ae8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe73cdefb,0xffffffdf,0xef5def7d,0xd6badedb,0xc618ce59,0xd6bad69a,0xc618b596,0xdedbd69a,0x00001aaf,0x00001aaf,0x1aaf0000,0x00000000,0x00000000,0x00001aaf,0x1aaf0000,0x126e0000,0xffffffff,0xefffffff,0xefffefff,0xe79eefff,0xffffe79e,0xefffefff,0xffffe79e,0xe79effff,0x755f755f,0x755f755f,0x755f755f,0x8dff755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0xffffffff,0xefffffff,0x59e5efff,0xe79eefff,0xffffe79e,0xefffefff,0xffffe79e,0xe79effff,0x0b030000,0x00000b03,0x0b030141,0x00000141,0x0b030b03,0x00000b03,0x0b030141,0x00000b03,0x0a020000,0x140313e3,0x14640b83,0x00000aa2,0x13a30a02,0x146413e4,0x14031424,0x00000b03,0x0b030000,0x0b030b03,0x0b030b03,0x0b030b03,0x0b030b03,0x0b030b03,0x0b030b03,0x00000b03, +0x9d35a536,0xa557a536,0x9d1594b4,0x9d159d15,0xa55794d4,0xa536add9,0x9d359d15,0xa5769d15,0x854b0000,0x00006c28,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xe77b0000,0x0000960c,0x7aa83165,0x828782a8,0x82a882a8,0x72877287,0x72877287,0x82a87287,0x82a87287,0x31657aa8,0x7aa83165,0x828782a8,0x82a882a8,0x72877287,0x72877287,0x82a87287,0x82a87287,0x31657aa8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd69ace59,0xce59c638,0xef5ddefb,0xd69ace79,0xef5de73c,0xce59bdf7,0xe71ce71c,0xc618ce59,0x1aaf21ea,0x1aaf220a,0x2a6b0a2d,0x01cc22f0,0x1aaf128f,0x1aaf220a,0x3aed22d0,0x220a1aaf,0xffffffff,0xefffffff,0xffffffff,0xffffefff,0xffffffff,0xefffefff,0xe79ee79e,0xffffffff,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0xffffffff,0xefffffff,0xffffffff,0xffffefff,0xffffffff,0xefffefff,0xe79ee79e,0xffffffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x0a020000,0x14031403,0x14031464,0x0b031464,0x13e40a02,0x142413e4,0x14031424,0x00000b03,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa5368452,0x9d36a536,0x9d369d15,0x9d359d15,0xa536a556,0x9d159d15,0x9d159d15,0x9d3594f5,0xe77b0000,0x0000960c,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x31652924,0x31653165,0x31653165,0x31653165,0x31653165,0x31653165,0x31653165,0x21043165,0x31652924,0x31653165,0x31653165,0x31653165,0x31653165,0x31653165,0x31653165,0x21043165, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0xbde6e70b,0xce68b5a5,0xce68b5a5,0xce68d6a9,0xef4affed,0xd689deea,0xce68e729,0xce68ce68,0xb6bbc7bf,0xb6bbb6bb,0xb6bbb6bb,0x00000000,0xb6bbb6bb,0xb6bb0000,0xb6bbb6bb,0xc7bfb6bb,0x73ae73ae,0x73ae73ae,0x8c716b4d,0x7bef8c71,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x7bef7bef,0x73ae73ae,0x73ae73ae,0x8c716b4d,0x7bef8c71,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x7bef7bef, +0x0000a514,0x00000000,0x9cd30000,0x528a0000,0xad75ad55,0x0000528a,0x8c710000,0xad7552aa,0x2965a514,0x29652965,0x9cd32965,0x528a2965,0xad75ad55,0x2965528a,0x8c712965,0xad7552aa,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232103,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232103,0x20e22923,0x72e718a1,0x7b0772e7,0x6aa66aa6,0x18a17b07,0x72e718a1,0x6aa672e7,0x6aa649e4,0x18a16aa6, +0x72e718a1,0x7b0772e7,0x6aa66aa6,0x18a17b07,0x72e718a1,0x6aa672e7,0x6aa649e4,0x18a16aa6,0xdedb8410,0xf8003186,0xf800fd00,0xffe0fd00,0xfd00f800,0xfd00ffe0,0xef5df800,0x31869cd3,0x31a639c7,0x318631a6,0x29653186,0x29652965,0x39c72124,0x31a639c7,0x21242965,0x318631a6,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xc627ce68,0xef6cbdc6,0xb5a5e729,0xce68deea,0x63006300,0xce48e729,0xe7296300,0xc627ce68,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xc7bf0000,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x8c718c71,0x73ae7bef,0x7bef73ae,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x8c718c71,0x73ae7bef,0x7bef73ae, +0x0000632c,0x5acb0000,0x84305aeb,0x00000000,0x632c0000,0x94b2528a,0xb5960000,0x5acb9492,0x2965632c,0x5acb2965,0x84305aeb,0x29652965,0x632c2965,0x94b2528a,0xb5962965,0x5acb9492,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x936541e6,0x7ae47ae4,0x93657ae4,0x7ae49365,0x93659365,0x93257ae4,0x93659365,0x7ae49365,0x93659365,0x7ae47ae4,0x93657ae4,0x7ae49365,0x93659365,0x93257ae4,0x93659365,0x29238305,0xbccc18a1,0x7ac69c29,0xbccc9c29,0x2102bccc,0xbccc2922,0xb48b9c29,0xbcccbccc,0x18a1bccc, +0xbccc18a1,0x7ac69c29,0xbccc9c29,0x2102bccc,0xbccc2922,0xb48b9c29,0xbcccbccc,0x18a1bccc,0xe71c8c51,0xfd0039e7,0xffe0ffe0,0xfd00ffe0,0xffe0fd00,0xfd00ffe0,0xef7dfd00,0x2965ad55,0x6b6d39c7,0x630c5acb,0x52aa4228,0x738e738e,0x630c4a69,0x630c632c,0x422852aa,0x318652aa,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe729e729,0x6b40d689,0xe7296300,0x39e0c627,0x63006300,0xd6895280,0xce68ce68,0xce68ce68,0x0000c7bf,0x00000000,0x00000000,0x00000000,0x00000000,0x0000c7bf,0x00000000,0xb6bb0000,0x8c717bef,0xc73f73ae,0x7bef5f7e,0x73ae7bef,0x5f7e73ae,0x73ae5f7e,0x7bef7bef,0x8c718c71,0x8c717bef,0xf80073ae,0x7bef8800,0x73ae7bef,0x880073ae,0x73ae8800,0x7bef7bef,0x8c718c71, +0x00009492,0x94925acb,0xa5340000,0x00008c51,0x528a0000,0x94b20000,0xad754a69,0x0000ad55,0x29659492,0x94925acb,0xa5342965,0x29658c51,0x528a2965,0x94b22965,0xad754a69,0x2965ad55,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b4341e6,0xabc5a363,0xabc5abc5,0x8b43abc5,0xa384abc5,0x8b43a384,0x8b438b43,0x8b43abc5,0xa384abc5,0xabc5a363,0xabc5abc5,0x8b43abc5,0xa384abc5,0x8b43a384,0x8b438b43,0x29237ae4,0x9c2918a1,0xa38772e7,0xbcccbccc,0x2102bccc,0xb48b2922,0x9c29b48b,0x9c299c29,0x18a19c29, +0x9c2918a1,0xa38772e7,0xbcccbccc,0x2102bccc,0xb48b2922,0x9c29b48b,0x62869c29,0x18a16286,0xdefb8c51,0xf80039e7,0xfd00fd00,0xf800fd00,0xfd00ffe0,0xf800f800,0xef7df800,0x3186a514,0x630c3186,0x9492738e,0x94928c71,0x5acb6b4d,0x9cf36b6d,0x7bcf8c51,0x7bcf8410,0x2104630c,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xf78b6300,0x39c0ce48,0xd68918e0,0xc627ce68,0x294039c0,0xce68d6a9,0xad64d6a9,0xe7296300,0xc7bf0000,0x00000000,0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0xb6bb0000,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x73ae73ae,0xffffc73f,0x767fc73f,0x5f7e767f,0x7bef73ae,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x73ae73ae,0xf800a820,0x9000a820,0x88009000,0x7bef73ae, +0x00008c51,0x9cd3b596,0xad750000,0x0000b596,0x8c510000,0x94b20000,0x00009492,0xa5344a69,0x29658c51,0x9cd3b596,0xad752965,0x2965b596,0x8c512965,0x94b22965,0x29659492,0xa5344a69,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0xabc5abc5,0x8b43abc5,0x8b43abc5,0x8b438b43,0x8b438b43,0xa363a384,0x8b43abc5,0x8b438b43,0xabc5abc5,0x8b43abc5,0x8b43abc5,0x8b438b43,0x8b438b43,0xa363a384,0x29239365,0xbccc18a1,0xa387bccc,0x9c29bccc,0x18a1bccc,0x9c292102,0x9c299c29,0x72e79b47,0x18a1bccc, +0xbccc18a1,0xa387bccc,0x9c29bccc,0x18a1bccc,0x9c292102,0x9c299c29,0xffff9b47,0x18a172e7,0xc6188c51,0x39e7e71c,0xc800c800,0xc800fd00,0xf800fd00,0xc800c800,0xef7d4208,0x2965ad55,0x5acb2945,0x5acb5acb,0x5acb5acb,0x7bcf6b6d,0x5acb630c,0x8c519492,0x7bcf7bcf,0x212439c7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd6a818e0,0xce68ce68,0xce68ce68,0xd6a9d6a7,0xce68ce68,0x1080ce68,0xce68ce68,0xce68e729,0x0000ffff,0x00000000,0x00000000,0x0000c7bf,0x00000000,0x00000000,0x0000ffff,0xb6bb0000,0x7bef6b4d,0x7bef7bef,0x7bef73ae,0x7bef7bef,0x8c718c71,0xc73f7bef,0x8c715f7e,0x6b4d8c71,0x7bef6b4d,0x7bef7bef,0x7bef73ae,0x7bef7bef,0x8c718c71,0xf8007bef,0x8c718800,0x6b4d8c71, +0x0000ad75,0xb5b6ad75,0x00000000,0x00000000,0x9cd3ad75,0xad550000,0x00008430,0xad55528a,0x2965ad75,0xb5b6ad75,0x29652965,0x29652965,0x9cd3ad75,0xad552965,0x29658430,0xad55528a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa34441e5,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0x29238b04,0x6aa618a1,0x72e772e7,0x6aa66aa6,0x10616aa6,0x72e718a1,0x72e772e7,0x6aa641a4,0x18a16aa6, +0x6aa618a1,0x72e772e7,0x41a341a3,0x10616aa6,0x72e718a1,0x72e772e7,0xb5b62902,0x18a141a3,0xad554a49,0xdefbd6ba,0x39c739e7,0xc800f800,0xc800f800,0x39e739e7,0xd6badefb,0x3186a534,0x738e39c7,0x7bcf8c51,0x5acb738e,0x7bcf7bcf,0x7bcf8410,0x632c5acb,0x6b4d8c71,0x2124738e,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd6a9ce68,0xe729ce68,0xc627ce68,0xd68918c0,0xdeeaef6c,0xe729ef4a,0xffedce68,0xce4652a0,0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0x00000000,0xffff0000,0x00000000,0x7bef7bef,0x73ae8c71,0x8c71767f,0x73ae8c71,0x73ae6b4d,0x8c718c71,0x7bef8c71,0x7bef7bef,0x7bef7bef,0x73ae8c71,0x8c719000,0x73ae8c71,0x73ae6b4d,0x8c718c71,0x7bef8c71,0x7bef7bef, +0x00005aeb,0x00000000,0x4a490000,0x00005acb,0xad55ad55,0x00000000,0x9cd35acb,0x00000000,0x29655aeb,0x29652965,0x4a492965,0x29655acb,0xad55ad55,0x29652965,0x9cd35acb,0x29652965,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa38441e6,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xa384a384,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xa384a384,0x29239325,0xb48b18a1,0xb48bb48b,0xbcccbccc,0x18a19c29,0x9c292102,0xb48bb48b,0xb48b9b47,0x18a1b48b, +0xb48b18a1,0x72c772c7,0x72e7b5b6,0x18a19c29,0x9c292102,0xb48bb48b,0xb5b6dedb,0x18a172c7,0x7bcf4a49,0xdedbce59,0xe71cef7d,0x42084208,0x420839e7,0xef7de71c,0xc638d69a,0x31867bcf,0x528a2965,0x7bcf73ae,0x52aa7bcf,0x84109492,0x7bcf7bcf,0x5acb7bef,0x6b4d6b4d,0x29456b4d,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce68ce68,0x39c0ce68,0xce68ce68,0xd689deea,0x6300ce68,0x63005280,0x39c0e729,0x6b416b41,0x0000ffff,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x73ae7bef,0x73ae73ae,0x73ae73ae,0xc73f73ae,0x5f7e5f7e,0x73ae5f7e,0x73ae73ae,0x7bef8c71,0x73ae7bef,0x73ae73ae,0x73ae73ae,0xa82073ae,0x88008800,0x73ae8800,0x73ae73ae,0x7bef8c71, +0x4a698c71,0x5acb0000,0x00008c71,0x00009cd3,0x000052aa,0x000094b2,0xad7552aa,0x00009492,0x4a698c71,0x5acb2965,0x29658c71,0x29659cd3,0x296552aa,0x296594b2,0xad7552aa,0x29659492,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b4341c5,0x8b438b43,0xabc58b43,0xa384a384,0x8b438b43,0xa3638b43,0x8b43abc5,0xa384a384,0x8b438b43,0x8b438b43,0xabc58b43,0xa384a384,0x8b438b43,0xa3638b43,0x8b43abc5,0x29237ae4,0x9c2918a1,0xb5b69c29,0xb5b66286,0x290272c7,0x9c292102,0x72e79c29,0x9c29bccc,0x18a19c29, +0x9c2918a1,0xdedbb5b6,0x72e7b5b6,0x2902b48b,0x9c292102,0x72e79c29,0xb5b6ffff,0x18a16286,0x8c714a49,0xdedbc638,0xe73cdedb,0xf79ef79e,0xf79ef79e,0xdedbe73c,0xc638dedb,0x39e78c71,0x528a2945,0x94929492,0x5acb7bef,0x738e9492,0x841094b2,0x6b4d8410,0x94b26b4d,0x3186528a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe729ce68,0xd689dec8,0xce68d689,0x39c0c607,0x39c0e729,0x39c039c0,0xce68b5a5,0xce6839c0,0xc7bfffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xb6bb0000,0xc73f7bef,0x6b4d767f,0x73ae8c71,0x7bef7bef,0xc73fffff,0x8c718c71,0x8c718c71,0x8c718c71,0xf8007bef,0x6b4d9000,0x73ae8c71,0x7bef7bef,0xa820f800,0x8c718c71,0x8c718c71,0x8c718c71, +0x8c71bdd7,0x9cd30000,0x52aa94b2,0x949294b2,0x94b20000,0x00009492,0xbdd70000,0x52aa9cf3,0x8c71bdd7,0x9cd32965,0x52aa94b2,0x949294b2,0x94b22965,0x29659492,0xbdd72965,0x52aa9cf3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0xabc5abc5,0xa363abc5,0xabc58b43,0xa384abc5,0xa384a384,0xabc5abc5,0xabc58b43,0xa384abc5,0xabc5abc5,0xa363abc5,0xabc58b43,0xa384abc5,0xa384a384,0xabc5abc5,0x29239365,0xbccc18a1,0xdedbbccc,0xdedb72e7,0x29226286,0xb48b2922,0xb48bb48b,0xbcccbccc,0x18a1bccc, +0xbccc18a1,0x28e1bccc,0x72e7b5b6,0x29229c29,0xb48b2922,0x72c7b48b,0xb5b6dedb,0x18a172e7,0x42282965,0x84107bcf,0x8c715aeb,0x94b28c71,0x94929492,0x4a698c71,0x5aeb73ae,0x39c77bcf,0x42282965,0x8c51738e,0x738ea514,0x94b26b6d,0x84309492,0x632c738e,0x4a495aeb,0x39c77bcf,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x6b40bde6,0xd689e729,0xdecae729,0xce48c607,0xce68ce68,0xb585d6a9,0xce689ce2,0xce68deca,0x0000ffff,0x0000c7bf,0x00000000,0x0000c7bf,0x00000000,0x00000000,0x00000000,0xb6bb0000,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x6b4d73ae,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x6b4d73ae,0x73ae73ae,0x73ae73ae,0x7bef7bef, +0xb5b6a514,0xa5340000,0x5acbb5b6,0x9492ad75,0xad550000,0x528abdd7,0x528a0000,0x630c0000,0xb5b6a514,0xa5342965,0x5acbb5b6,0x9492ad75,0xad552965,0x528abdd7,0x528a2965,0x630c2965,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x930441e5,0x8b048b04,0x8b048b04,0x93048b04,0x93049304,0x8b048b04,0x8b048b04,0x93048b04,0x93049304,0x8b048b04,0x8b048b04,0x93048b04,0x93049304,0x8b048b04,0x8b048b04,0x292382c4,0x72e718a1,0x6aa66aa6,0x6aa6dedb,0x18a16aa6,0x72e718a1,0x41a46aa6,0x6aa66aa6,0x18a172e7, +0x72e718a1,0x28e16aa6,0x6aa66aa6,0x18a16aa6,0x72e718a1,0xffff6aa6,0xb5b6dedb,0x18a141c4,0x5aeb2965,0x21245acb,0xb5b6738e,0xad55ad55,0xa534ad55,0x6b4da534,0x5acbad55,0x39c7528a,0x5aeb2965,0x632c5acb,0x8c718c71,0x632c6b4d,0x5acb6b4d,0x7bef5acb,0x5acb8430,0x39c7528a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x39c0deea,0xef4cce68,0xce686300,0xce68ce68,0xd689e729,0xb5a5ce68,0xe729ffcc,0xce68ce68,0x00000000,0x00000000,0x00000000,0xc7bf0000,0x00000000,0x00000000,0x00000000,0xb6bb0000,0x8c718c71,0xffff7bef,0x767fc73f,0x5f7e767f,0x7bef7bef,0x5f7e767f,0x8c718c71,0x6b4d8c71,0x8c718c71,0xb8207bef,0x9000a820,0x88009000,0x7bef7bef,0x88009000,0x8c718c71,0x6b4d8c71, +0x94b2528a,0x528a0000,0x00005acb,0xa534a514,0x00000000,0x0000632c,0x528a0000,0x5aeb5acb,0x94b2528a,0x528a2965,0x29655acb,0xa534a514,0x29652965,0x2965632c,0x528a2965,0x5aeb5acb,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x72c641e6,0x72a572c6,0x72c672c6,0x6a8572c6,0x6a856a85,0x72c672a5,0x72c672c6,0x6a8572c6,0x6a856a85,0x72a572c6,0x72c672c6,0x6a8572c6,0x6a856a85,0x72c672a5,0x72c672c6,0x292372c6,0xbccc18a1,0x28e1bccc,0x28e172e7,0x210272e7,0x9c292102,0xbccc49e4,0xbcccbccc,0x18a1bccc, +0xbccc18a1,0x28e1bccc,0xbcccbccc,0x2102bccc,0x9c292102,0xdedb49e4,0xb5b6dedb,0x18a172e7,0x630c3186,0x29457bef,0x08610000,0x10820861,0x10821082,0x000010a2,0x8430a534,0x2104630c,0x630c3186,0x6b6d7bef,0x5acb73ae,0x7bcf6b4d,0x8430738e,0x7bef8c71,0x84308410,0x2104630c,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xbdc6ce68,0xce68ce68,0xbde6e729,0xd689ce68,0xce682120,0xce68d6a9,0xdeca6300,0xce68d6a9,0x0000ffff,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x0000c7bf,0x00000000,0x73ae73ae,0x7bef7bef,0xffff7bef,0x73aec73f,0x6b4d7bef,0xc73fffff,0x73ae73ae,0x7bef6b4d,0x73ae73ae,0x7bef7bef,0xf8007bef,0x73aea820,0x6b4d7bef,0xa820f800,0x73ae73ae,0x7bef6b4d, +0xb5960000,0x00008430,0x8c714a69,0x00005aeb,0x9cd3528a,0x52aa0000,0x5acb0000,0x84300000,0xb5962965,0x29658430,0x8c714a69,0x29655aeb,0x9cd3528a,0x52aa2965,0x5acb2965,0x84302965,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x316441c5,0x31843164,0x31843184,0x31643184,0x31843184,0x31843184,0x31643164,0x31643184,0x31843184,0x31843164,0x31843184,0x31643184,0x31843184,0x31843184,0x31643164,0x18e23164,0x9c2918a1,0x28e172e7,0x28e1b48b,0x2102bccc,0xb48b2902,0xb48b9b47,0x9c299c29,0x18a19c29, +0x9c2918a1,0x28e172e7,0xb48bb48b,0x2102bccc,0xb48b2902,0x28e19b47,0x28e128e1,0x18a16286,0x5acb2945,0x29457bef,0x00000000,0x00000000,0x00000000,0x00000000,0x6b4da514,0x212439c7,0x5acb2945,0x6b6d7bef,0x7bef7bef,0x5acb7bcf,0x94929492,0x84107bef,0x6b4d7bcf,0x212439c7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce68ce68,0x6300ce68,0xce686300,0xc607a523,0xbde6ce68,0xce68ce68,0xce68e729,0xce68ffef,0xffffffff,0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0xc7bf0000,0xb6bb0000,0x8c717bef,0x73ae8c71,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x8c718c71,0x6b4d8c71,0x8c717bef,0x73ae8c71,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x8c718c71,0x6b4d8c71, +0xa5140000,0x0000a514,0xa5340000,0x0000528a,0x8c719cd3,0x00000000,0x00008c71,0x8c519492,0xa5142965,0x2965a514,0xa5342965,0x2965528a,0x8c719cd3,0x29652965,0x29658c71,0x8c519492,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x7ae441e6,0x7ae47ae4,0x93657ae4,0x7ae49365,0x7ae49365,0x93047ae4,0x93259325,0x7ae49365,0x7ae49365,0x7ae47ae4,0x93657ae4,0x7ae49365,0x7ae49365,0x93047ae4,0x93259325,0x29239325,0x9c2918a1,0x7ac69c29,0xbccc9c29,0x2102bccc,0x9c292922,0x72e77ac6,0xb48bb48b,0x18a1b48b, +0x9c2918a1,0x7ac69c29,0xbccc9c29,0x2102bccc,0x9c292922,0x28e17ac6,0x28e172c7,0x18a172c7,0x738e39c7,0x4a697bcf,0x000031a6,0x00000000,0x00000000,0x31a60000,0x8430528a,0x2124738e,0x738e39c7,0x6b4d7bcf,0x7bcf8c71,0x5acb7bcf,0x8c516b4d,0x94b294b2,0x8430738e,0x2124738e,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xc607ce68,0x39c0deea,0xd68939c0,0x39e0e729,0xc627e729,0x2960c607,0xce466300,0xdecace68,0x0000ffff,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xb6bbc7bf,0x8c717bef,0x7bef7bef,0x6b4d7bef,0xc73f7bef,0x7bef5f7e,0x73ae73ae,0x73ae73ae,0x7bef73ae,0x8c717bef,0x7bef7bef,0x6b4d7bef,0xf8007bef,0x7bef8800,0x73ae73ae,0x73ae73ae,0x7bef73ae, +0x00000000,0x00000000,0xad750000,0x00008c51,0x9cd3ad55,0xad754a69,0x00008c51,0x9cd3ad75,0x29652965,0x29652965,0xad752965,0x29658c51,0x9cd3ad55,0xad754a69,0x29658c51,0x9cd3ad75,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa34441e6,0xa363a344,0xa363a363,0xa363a363,0xa363a363,0xa344a344,0xa344a344,0xa363a363,0xa363a363,0xa363a344,0xa363a363,0xa363a363,0xa363a363,0xa344a344,0xa344a344,0x2923a363,0x6aa618a1,0x49e46aa6,0x72e749e4,0x18a172e7,0x72e718a1,0x6aa641a4,0x6aa66aa6,0x18a172e7, +0x6aa618a1,0x49e46aa6,0x72e749e4,0x18a172e7,0x72e718a1,0x28e141a4,0x28e128e1,0x18a172e7,0x528a2965,0x6b6d5aeb,0x21246b6d,0x31863186,0x29452104,0x42082104,0x8c516b4d,0x29456b4d,0x528a2965,0x6b6d5aeb,0x632c9cd3,0x84308c51,0x6b6d5aeb,0x5acb5acb,0x8c516b4d,0x29456b4d,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce68ce68,0xd689ce68,0xdeeace68,0x63005280,0xce68dec8,0xe70bbde6,0xce4839c0,0xce68ffec,0x0000ffff,0xffff0000,0x00000000,0x0000c7bf,0x00000000,0x00000000,0x00000000,0x00000000,0x6b4d7bef,0x73ae73ae,0x73ae767f,0x73ae73ae,0x73ae8c71,0x7bef7bef,0x767fc73f,0x7bef7bef,0x6b4d7bef,0x73ae73ae,0x73ae9000,0x73ae73ae,0x73ae8c71,0x7bef7bef,0x9000f800,0x7bef7bef, +0x00000000,0x00008c71,0xad75528a,0x0000a514,0xad559cf3,0xb5965aeb,0x000094b2,0xad55b596,0x29652965,0x29658c71,0xad75528a,0x2965a514,0xad559cf3,0xb5965aeb,0x296594b2,0xad55b596,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0xa384abc5,0xabc5a363,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0xa384abc5,0xabc5a363,0x2923abc5,0xbccc18a1,0x9c299c29,0x9c297ac6,0x2902b48b,0xbccc2922,0xb48bbccc,0xbccc72e7,0x18a1bccc, +0xbccc18a1,0x9c299c29,0x9c297ac6,0x2902b48b,0xbccc2922,0xb48bbccc,0xbccc72e7,0x18a1bccc,0x528a2945,0x52aa7bcf,0x8c71630c,0x7bcf8c71,0x528a632c,0x7bef8430,0x7bcf5aeb,0x3186528a,0x528a2945,0x52aa7bcf,0x8c71630c,0x7bcf8c71,0x528a632c,0x7bef8430,0x7bcf5aeb,0x3186528a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x39c0c627,0xce68e729,0xce68c607,0x39c039c0,0xd689ce68,0xce68ce68,0xce68ce68,0xce682100,0x0000ffff,0x00000000,0x00000000,0xc7bf0000,0x00000000,0x00000000,0x00000000,0xb6bb0000,0x7bef7bef,0x8c718c71,0x8c718c71,0x8c718c71,0x8c7173ae,0x8c718c71,0x7bef6b4d,0x73ae7bef,0x7bef7bef,0x8c718c71,0x8c718c71,0x8c718c71,0x8c7173ae,0x8c718c71,0x7bef6b4d,0x73ae7bef, +0x00008430,0x9cd3bdd7,0x52aa0000,0x00000000,0x4a6952aa,0xb5960000,0x528ab5b6,0x52aa0000,0x29658430,0x9cd3bdd7,0x52aa2965,0x29652965,0x4a6952aa,0xb5962965,0x528ab5b6,0x52aa2965,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0xa363a384,0xa384a384,0x8b438b43,0x8b438b43,0xa3848b43,0xa3848b43,0x8b438b43,0x8b438b43,0xa363a384,0xa384a384,0x8b438b43,0x8b438b43,0xa3848b43,0xa3848b43,0x2923abc5,0xbccc18a1,0x72e7b48b,0xb48bb48b,0x59632102,0x21025963,0xb48b9c29,0xb48b9c29,0x18a1bccc, +0xbccc18a1,0x72e7b48b,0xb48bb48b,0x59632102,0x21025963,0xb48b9c29,0xb48b9c29,0x18a1bccc,0x6b6d39c7,0x630c5acb,0x52aa4228,0x738e738e,0x630c4a69,0x630c632c,0x422852aa,0x318652aa,0x6b6d39c7,0x630c5acb,0x52aa4228,0x738e738e,0x630c4a69,0x630c632c,0x422852aa,0x318652aa,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce68d689,0xce68b5a5,0xce68ce68,0xce68ce68,0xce68deea,0xe7295280,0xce68deea,0xce68ce68,0xffffffff,0x0000ffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xc7bfffff,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x8c718c71,0x8c716b4d,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x8c718c71,0x8c716b4d,0x73ae7bef,0x73ae73ae,0x7bef73ae, +0x000094b2,0x9cf3ad75,0x00005acb,0x00000000,0x00007bef,0x00000000,0x52aa0000,0xad550000,0x296594b2,0x9cf3ad75,0x29655acb,0x29652965,0x29657bef,0x29652965,0x52aa2965,0xad552965,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x41c541e6,0x41c541c5,0x41e641c5,0x41e641e6,0x41e641c5,0x41e641e6,0x41e641e6,0x292341e6,0x41e641e6,0x41c541c5,0x41e641c5,0x41e641e6,0x41e641c5,0x41e641e6,0x41e641e6,0x316441e6,0x9c2918a1,0x9c299c29,0x29229c29,0x5963b3a9,0xb3a95963,0xbccc2922,0xbcccbccc,0x18a1bccc, +0x9c2918a1,0x9c299c29,0x29229c29,0x5963b3a9,0xb3a95963,0xbccc2922,0xbcccbccc,0x18a1bccc,0x31a639c7,0x318631a6,0x29653186,0x29652965,0x39c72124,0x31a639c7,0x21242965,0x318631a6,0x31a639c7,0x318631a6,0x29653186,0x29652965,0x39c72124,0x31a639c7,0x21242965,0x318631a6,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x73ae73ae,0x73ae73ae,0x8c716b4d,0x7bef8c71,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x7bef7bef,0x73ae73ae,0x73ae73ae,0x8c716b4d,0x7bef8c71,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x7bef7bef,0x73ae73ae,0x73ae73ae,0x8c716b4d,0x7bef8c71,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x7bef7bef,0x72e772e7,0x7b0772e7,0x6aa66aa6,0x6aa67b07,0x72e772e7,0x6aa672e7,0x6aa649e4,0x72e76aa6, +0x73ae7bcf,0x19e3738e,0x08e10901,0x1a231142,0x84103c47,0x224452aa,0x19c319a3,0x630c1162,0x08621083,0x08631083,0x10831083,0x10831083,0x10831083,0x10831082,0x10831083,0x10830862,0x41cc41cc,0x20c60021,0x00b009b1,0x31091884,0x20c61083,0x20c609b1,0x314a1884,0x18840000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232103,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232103,0x20e22923,0x18a118a1,0x18a10840,0x512218a1,0x51224902,0x51225122,0x18a15122,0x08400840,0x18a10840, +0x630c39e7,0x29453186,0x29452945,0x29452945,0x21242945,0x29452945,0xa5342945,0x3186630c,0x318639e7,0x31863186,0x31863186,0x31863186,0x29653186,0x31863186,0x31863186,0x31863186,0x318639e7,0x29453186,0x29452945,0x31863186,0x31863186,0x29452945,0x31862945,0x31863186,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800, +0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x8c718c71,0x73ae7bef,0x7bef73ae,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x8c718c71,0x73ae7bef,0x7bef73ae,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x8c718c71,0x73ae7bef,0x7bef73ae,0x81a1bccc,0x61407180,0x9082b8a2,0x5b8132d1,0xacc14183,0x90828be1,0x2a6f32d1,0xbccc146d, +0x8c5173ae,0xa51411a2,0x7bcf8410,0x1a237bef,0x1a231a23,0x94927bef,0x94b28c51,0x114239e7,0x10821083,0x18c51083,0x10831083,0x08620862,0x18a40841,0x18c518c5,0x108318c5,0x08620862,0x31090021,0x20c6314a,0x09b109d1,0x310920c6,0x20c61083,0x28c809d1,0x002120c6,0x1884314a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x936541e6,0x7ae47ae4,0x93657ae4,0x7ae49365,0x93659365,0x93257ae4,0x93659365,0x7ae49365,0x93659365,0x7ae47ae4,0x93657ae4,0x7ae49365,0x93659365,0x93257ae4,0x93659365,0x29238305,0xb48b1061,0x2902b48b,0xb3a9ab88,0xab68ab68,0xab88ab88,0xab88ab68,0xb48b2902,0x18a1b48b, +0x7bef4a69,0x108239e7,0x21242945,0x29452945,0x29452945,0x29452945,0xb5b61082,0x29657bef,0x7bef4a69,0x7bcf7bcf,0x73ae7bcf,0x7bef7bef,0x7bcf7bcf,0x7bcf7bcf,0x7bef7bef,0x29657bef,0x7bef4a69,0x7bcf7bcf,0x738e7bcf,0x7bcf738e,0x738e7bcf,0x738e738e,0x7bcf7bcf,0x29657bef,0xfb60f800,0xfb60f800,0xfb60f800,0x0000f800,0xf8000000,0xf800fb60,0xfb60f800,0xf800f800, +0x8c717bef,0xfff673ae,0x7beffd65,0x73ae7bef,0xfd6573ae,0x73aefd65,0x7bef7bef,0x8c718c71,0x8c717bef,0xdd7273ae,0x7befac6e,0x73ae7bef,0xac6e73ae,0x73aeac6e,0x7bef7bef,0x8c718c71,0x8c717bef,0x39e773ae,0x7bef31a6,0x73ae7bef,0x31a673ae,0x73ae31a6,0x7bef7bef,0x8c718c71,0x81a1b48b,0x61407180,0x9082b8a2,0x5b8132d1,0xacc13142,0x90828be1,0x2a6f32d1,0xb48b146d, +0x7bcfbdd7,0xb5b622a4,0xb5b63c07,0x39c71a23,0xce592264,0x7befa534,0x7bef9492,0x31a68c51,0x10830864,0x18c518c5,0x00211083,0x108318c5,0x20e60841,0x18c518c5,0x10831083,0x10830863,0x00211884,0x314a1884,0x3109314a,0x20c620c6,0x314a1083,0x00b009d1,0x0021314a,0x20c6314a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b4341e6,0xabc5a363,0xabc5abc5,0x8b43abc5,0xa384abc5,0x8b43a384,0x8b438b43,0x8b43abc5,0xa384abc5,0xabc5a363,0xabc5abc5,0x8b43abc5,0xa384abc5,0x8b43a384,0x8b438b43,0x29237ae4,0xb48b0840,0xa34720e2,0xa347a368,0xa347a347,0xa3479b47,0xa368a347,0x2102a388,0x0840b46b, +0x73ae4a49,0x000039e7,0x18c31082,0x18c318c3,0x10a218c3,0x108218c3,0xb5960000,0x3186738e,0x73ae4a49,0xad55ad55,0xa514ad55,0xa514a514,0x9cf3ad55,0xad55ad55,0xa514a514,0x3186738e,0x73ae4a49,0xb596b596,0xb596b596,0xad55b596,0xad55ad55,0xa514a514,0xad55b596,0x3186738e,0xfb60f800,0x00000000,0x0000f800,0x0000fb60,0x00000000,0xfb600000,0x0000fb60,0xf800f800, +0x73ae7bef,0x73ae73ae,0x73ae73ae,0x73ae73ae,0xfffffff6,0xff69fff6,0xfd65ff69,0x7bef73ae,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x73ae73ae,0xe615dd72,0xbcd0dd72,0xac6ebcd0,0x7bef73ae,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x422839e7,0x31a639e7,0x31a631a6,0x7bef73ae,0x81a1bccc,0x61407180,0x9082b8a2,0x314232d1,0xb5b65b81,0x90828c51,0x2a6f32d1,0xbccc146d, +0xb596b596,0x11421142,0x11421142,0x7bef2264,0x114219a3,0x9cf3b596,0x7bef2b05,0x1a231a23,0x398a1083,0x20c5396a,0x08610862,0x08621063,0x396a0841,0x108318c5,0x10821083,0x08620862,0x188420c6,0x00001884,0x00000021,0x20c609b1,0x310920c6,0x00b009d1,0x31090021,0x28c820c6,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0xabc5abc5,0x8b43abc5,0x8b43abc5,0x8b438b43,0x8b438b43,0xa363a384,0x8b43abc5,0x8b438b43,0xabc5abc5,0x8b43abc5,0x8b43abc5,0x8b438b43,0x8b438b43,0xa363a384,0x29239365,0x29020840,0x51c4a347,0x494351c4,0x51c451a4,0x51c451c4,0x51c451c4,0xa34751a4,0x08402902, +0x7bef4a49,0x39e77bef,0x00000000,0x00000000,0x00000000,0x00000000,0xb5964208,0x29657bef,0x7bef4a49,0xa514b596,0xa514a514,0xa514a514,0xa514a514,0xb596b596,0xb596b596,0x29657bef,0x7bef4a49,0xb596b596,0xad55b596,0xce59b596,0xa514ce59,0xb596b596,0xb596ad55,0x29657bef,0xfb60f800,0x0000f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x7bef6b4d,0x7bef7bef,0x7bef73ae,0x7bef7bef,0x8c718c71,0xfff67bef,0x8c71fd65,0x6b4d8c71,0x7bef6b4d,0x7bef7bef,0x7bef73ae,0x7bef7bef,0x8c718c71,0xdd727bef,0x8c71ac6e,0x6b4d8c71,0x7bef6b4d,0x7bef7bef,0x7bef73ae,0x7bef7bef,0x8c718c71,0x39e77bef,0x8c7131a6,0x6b4d8c71,0x81a172e7,0x61407180,0x9082b8a2,0x41833142,0xb5b65b81,0x90828c51,0x2a6f32d1,0x72e7146d, +0x1a231a23,0x7bef33e6,0x39c76b6d,0x84107bef,0x7bef9492,0x19e31142,0x1a233c27,0x39c71a23,0x08411084,0x10830841,0x08620862,0x08621083,0x398a0841,0x10830862,0x41ab0841,0x108318c5,0x188428c8,0x314a20c6,0x20c60021,0x00b009b1,0x314a20c6,0x00b009d1,0x002109b1,0x1884314a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa34441e5,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0x29238b04,0xab880840,0x51c4a347,0xb3889ac6,0xab8851a4,0x51a4ab88,0xb3a99ac6,0xa36851c4,0x1881ab88, +0x7bef4a49,0x7bcfad55,0x39c739e7,0x00000000,0x00000000,0x39e739e7,0xa51473ae,0x318673ae,0x7bef4a49,0xad55ad55,0x9cf3ad55,0xb596ad55,0xad55ad55,0xa514a514,0xa514a514,0x318673ae,0x7bef4a49,0xb596ad55,0xb596b596,0x1082b596,0xce591082,0xb596ad55,0xa514b596,0x318673ae,0xf800f800,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000,0xf800f800, +0x7bef7bef,0x73ae8c71,0x8c71ff69,0x73ae8c71,0x73ae6b4d,0x8c718c71,0x7bef8c71,0x7bef7bef,0x7bef7bef,0x73ae8c71,0x8c71bcd0,0x73ae8c71,0x73ae6b4d,0x8c718c71,0x7bef8c71,0x7bef7bef,0x7bef7bef,0x73ae8c71,0x8c7131a6,0x73ae8c71,0x73ae6b4d,0x8c718c71,0x7bef8c71,0x7bef7bef,0x20e2bccc,0x31423142,0x9082b8a2,0x39633963,0xacc13142,0x29028be1,0x2a6f32d1,0x9c293142, +0x3c075aeb,0x7bef7bcf,0x31867bef,0x94b2b596,0x2b057bef,0x39c78430,0x5aeb2244,0x84309cd3,0x10831082,0x08621083,0x10830862,0x08630863,0x08411083,0x10840862,0x08421083,0x10831083,0x18843109,0x18841884,0x20c60021,0x00b009b1,0x09b120c6,0x09b109d1,0x002109b1,0x1884314a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa38441e6,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xa384a384,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xa384a384,0x29239325,0xab881881,0x4943a347,0xa3479ac6,0xa3474983,0x41228a85,0xb3a9a347,0xa34751c4,0x18a1ab88, +0x7bcf4a49,0xb596b596,0x7befb596,0x42084208,0x420839e7,0xb5967bef,0xad559cf3,0x31867bcf,0x7bcf4a49,0xb596b596,0xb596b596,0xb596b596,0xb596a514,0xb596b596,0xad559cf3,0x31867bcf,0x7bcf4a49,0xb596b596,0xb596ad55,0x10822104,0x21041082,0xb596ce59,0xad559cf3,0x31867bcf,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x73ae7bef,0x73ae73ae,0x73ae73ae,0xfff673ae,0xfd65fd65,0x73aefd65,0x73ae73ae,0x7bef8c71,0x73ae7bef,0x73ae73ae,0x73ae73ae,0xdd7273ae,0xac6eac6e,0x73aeac6e,0x73ae73ae,0x7bef8c71,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x39e773ae,0x31a631a6,0x73ae31a6,0x73ae73ae,0x7bef8c71,0x20e29c29,0x20e220e2,0x20e220e2,0x290220e2,0x29022902,0x20e220e2,0x2a6f32d1,0x9c292902, +0x5aeb8c51,0xb5b6b596,0x11622b45,0x6b4db596,0x3386bdd7,0x1a239492,0xc6185aeb,0x7bef7bef,0x10830862,0x10831083,0x10821083,0x20e51083,0x08620863,0x00220862,0x086218c5,0x10831083,0x00000021,0x20c620c6,0x31091884,0x00b009d1,0x09b11083,0x3109314a,0x002109b1,0x188409b1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b4341c5,0x8b438b43,0xabc58b43,0xa384a384,0x8b438b43,0xa3638b43,0x8b43abc5,0xa384a384,0x8b438b43,0x8b438b43,0xabc58b43,0xa384a384,0x8b438b43,0xa3638b43,0x8b43abc5,0x29237ae4,0xb3a918a1,0x49638a65,0x498351a4,0x51c451c4,0x51c44963,0x51a44983,0xa34751c4,0x18a1ab88, +0x8c714a49,0xc638c638,0xce59c638,0xce79ce79,0xce79c618,0xc638ce59,0xc638c638,0x39e78c71,0x8c714a49,0xc638c638,0xce59c638,0xce79ce79,0xce79c618,0xc638ce59,0xc638c638,0x39e78c71,0x8c714a49,0xc638c638,0xce59c638,0x00002104,0x21040000,0xc638ce59,0xc638c638,0x39e78c71,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0xfff67bef,0x6b4dff69,0x73ae8c71,0x7bef7bef,0xfff6ffff,0x8c718c71,0x8c718c71,0x8c718c71,0xdd727bef,0x6b4dbcd0,0x73ae8c71,0x7bef7bef,0xdd72e615,0x8c718c71,0x8c718c71,0x8c718c71,0x39e77bef,0x6b4d31a6,0x73ae8c71,0x7bef7bef,0x39e74228,0x8c718c71,0x8c718c71,0x8c718c71,0x9c29bccc,0x9c299c29,0xbccc9c29,0xb48bb48b,0x9c299c29,0x72e79c29,0x9c29bccc,0x9c299c29, +0x08e17bef,0xbdd71a23,0x2b053c47,0xb59622a4,0x2b05ad55,0x19c32244,0x21041182,0xb596c638,0x08410862,0x18c5398a,0x10830862,0x18c520e6,0x08621083,0x08411083,0x18c518a5,0x10830862,0x18840021,0x00b020c6,0x10831884,0x09b109d1,0x09b11083,0x002200b0,0x002109b1,0x188409b1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0xabc5abc5,0xa363abc5,0xabc58b43,0xa384abc5,0xa384a384,0xabc5abc5,0xabc58b43,0xa384abc5,0xabc5abc5,0xa363abc5,0xabc58b43,0xa384abc5,0xa384a384,0xabc5abc5,0x29239365,0xab8818a1,0x51c49ac6,0xa347ab88,0xab8851a4,0x51c4ab88,0xab88a347,0xa34751c4,0x18a1b3a9, +0x42282965,0x84107bcf,0x528a5aeb,0x5acb4a69,0x52aa5acb,0x4a69528a,0x5aeb73ae,0x39c77bcf,0x42282965,0x8c717bcf,0x7bcf9cf3,0x94b273ae,0x84309492,0x6b6d7bcf,0x5aeb6b4d,0x39c77bcf,0x42282965,0x84107bcf,0x528a5aeb,0x21048c71,0x632c2104,0x6b6d528a,0x5aeb73ae,0x39c77bcf,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x6b4d73ae,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x6b4d73ae,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x6b4d73ae,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x72e772e7,0x6aa66aa6,0x6aa66aa6,0x72e76aa6,0x72e772e7,0x6aa66aa6,0x6aa66aa6,0x72e772e7, +0x7bef7bef,0x1a031122,0xb5963c27,0x19e31a23,0x19c32244,0x8c5131a6,0x39c77bef,0xc6182264,0x10831083,0x08620841,0x18a51083,0x108418c5,0x08411083,0x084118c5,0x398a3129,0x108418c5,0x18840021,0x00b020c6,0x10831884,0x314a314a,0x09b11083,0x20c600b0,0x002120c6,0x188409b1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x930441e5,0x8b048b04,0x8b048b04,0x93048b04,0x93049304,0x8b048b04,0x8b048b04,0x62027263,0x72836202,0x8b048b04,0x8b048b04,0x93048b04,0x93049304,0x8b048b04,0x8b048b04,0x292382c4,0xab880840,0x59c4a347,0xa347ab88,0xab8851c4,0x51a4ab88,0xab68a367,0xa34751c4,0x18a1ab88, +0x5aeb2965,0x21245acb,0xb5b6738e,0xad55ad55,0xa534ad55,0x6b4da534,0x5acbad55,0x39c7528a,0x5aeb2965,0x632c5acb,0x8c718c71,0x632c6b4d,0x5acb6b4d,0x7bef5acb,0x5acb8430,0x39c7528a,0x5aeb2965,0x6b6d6b6d,0x4a69738e,0x84304a69,0x5acb8430,0x4a696b6d,0x5acb6b4d,0x39c7528a,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x8c718c71,0xffff7bef,0xff69fff6,0xfd65ff69,0x7bef7bef,0xfd65ff69,0x8c718c71,0x6b4d8c71,0x8c718c71,0xe6157bef,0xbcd0dd72,0xac6ebcd0,0x7bef7bef,0xac6ebcd0,0x8c718c71,0x6b4d8c71,0x8c718c71,0x42287bef,0x31a639e7,0x31a631a6,0x7bef7bef,0x31a631a6,0x8c718c71,0x6b4d8c71,0xb8a2bccc,0x146d9082,0x2a6f32d1,0x5b817462,0xb8a23963,0x74629082,0x146d5b81,0xbccc0b4a, +0x7bef7bef,0x1a232b05,0x11422284,0x224439c7,0x33662264,0x2b05a514,0x7bef738e,0x52aa2b05,0x10821083,0x10831083,0x398a398a,0x398a398a,0x08410862,0x0862398a,0x08410841,0x08620841,0x1884314a,0x00b009b1,0x10831884,0x108341cc,0x09b11083,0x314a00b0,0x20c63109,0x00b009b1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x72c641e6,0x72a572c6,0x72c672c6,0x6a8572c6,0x6a856a85,0x72c672a5,0x72c672c6,0x94926244,0x41a373ae,0x72a572c6,0x72c672c6,0x6a8572c6,0x6a856a85,0x72c672a5,0x72c672c6,0x292372c6,0xab880840,0x51a4a347,0x498351a4,0x51a451a4,0x51c44963,0x49434983,0xa34751a4,0x0840ab88, +0x630c3186,0x29457bef,0x08610000,0x10820861,0x10821082,0x000010a2,0x8430a534,0x2104630c,0x630c3186,0x6b6d7bef,0x5acb73ae,0x7bcf6b4d,0x8430738e,0x7bef8c71,0x84308410,0x2104630c,0x630c3186,0x6b6d7bef,0x6b6d5aeb,0x528a528a,0x6b6d528a,0x6b6d7bcf,0x8430528a,0x2104630c,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x73ae73ae,0x7bef7bef,0xffff7bef,0x73aefff6,0x6b4d7bef,0xfff6ffff,0x73ae73ae,0x7bef6b4d,0x73ae73ae,0x7bef7bef,0xe6157bef,0x73aedd72,0x6b4d7bef,0xdd72e615,0x73ae73ae,0x7bef6b4d,0x73ae73ae,0x7bef7bef,0x42287bef,0x73ae39e7,0x6b4d7bef,0x39e74228,0x73ae73ae,0x7bef6b4d,0xb8a29c29,0x146d9082,0x2a6f32d1,0x39e74a49,0xb8a24183,0x74629082,0x146d5b81,0x9c290b4a, +0x8430738e,0x1a237bef,0x8c512ae5,0x11427bef,0xc6383c27,0x2b457bcf,0x5acb630c,0x11621122,0x10831083,0x08421082,0x08410841,0x08410841,0x08621083,0x10830841,0x10831083,0x08620862,0x18840021,0x00b009d1,0x41cc1884,0x20c641cc,0x09d120c6,0x20c600b0,0x314a0022,0x00b009b1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x316441c5,0x31843164,0x31843184,0x31643184,0x31843184,0x31843184,0x31643164,0xa5342923,0x292373ae,0x31843164,0x31843184,0x31643184,0x31843184,0x31843184,0x31643164,0x18e23164,0xab880840,0x51c4a347,0xa347ab88,0x92a54122,0x4983a347,0x9ac68a85,0xa34751a4,0x18a1ab88, +0x5acb2945,0x29457bef,0x00000000,0x00000000,0x00000000,0x00000000,0x6b4da514,0x212439c7,0x5acb2945,0x6b6d7bef,0x7bef7bef,0x5acb7bcf,0x94929492,0x84107bef,0x6b4d7bcf,0x212439c7,0x5acb2945,0x73ae7bef,0xb596b596,0x6b6d8c71,0xce59528a,0x7bcfb596,0x6b4d7bcf,0x212439c7,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf8000000, +0x8c717bef,0x73ae8c71,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x8c718c71,0x6b4d8c71,0x8c717bef,0x73ae8c71,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x8c718c71,0x6b4d8c71,0x8c717bef,0x73ae8c71,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x8c718c71,0x6b4d8c71,0xb8a2bccc,0x146d9082,0x2a6f32d1,0x39e74a49,0x9082b8a2,0x74623963,0xb5b65b81,0xbccc8c51, +0xb596b596,0x1a235aeb,0x8430b596,0x39e78430,0x3be71a23,0x33c69cf3,0x7bef1a03,0x5aebad55,0x08410862,0x108318c5,0x10821082,0x10830862,0x08620861,0x08421083,0x086318c5,0x10831083,0x18840021,0x00b009d1,0x00211884,0x20c641cc,0x09d128c8,0x20c609b1,0x18840022,0x00b009b1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x7ae441e6,0x7ae47ae4,0x93657ae4,0x7ae49365,0x7ae49365,0x93047ae4,0x93259325,0xc6187ac4,0x51e28430,0x7ae47ae4,0x93657ae4,0x7ae49365,0x7ae49365,0x93047ae4,0x93259325,0x29239325,0xab881061,0x51c4a347,0xa2e69ac6,0xab8851a4,0x4943ab88,0xb3a99ac6,0xa34751c4,0x18a1ab88, +0x738e39c7,0x4a697bcf,0x000031a6,0x00000000,0x00000000,0x31a60000,0x8430528a,0x2124738e,0x738e39c7,0x6b4d7bcf,0x7bcf8c71,0x5acb7bcf,0x8c516b4d,0x94b294b2,0x8430738e,0x2124738e,0x738e39c7,0xb5968c71,0xb596b596,0x528a39c7,0x84308430,0xb596ce59,0x7bcfb596,0x2124738e,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000, +0x8c717bef,0x7bef7bef,0x6b4d7bef,0xfff67bef,0x7beffd65,0x73ae73ae,0x73ae73ae,0x7bef73ae,0x8c717bef,0x7bef7bef,0x6b4d7bef,0xdd727bef,0x7befac6e,0x73ae73ae,0x73ae73ae,0x7bef73ae,0x8c717bef,0x7bef7bef,0x6b4d7bef,0x39e77bef,0x7bef31a6,0x73ae73ae,0x73ae73ae,0x7bef73ae,0xb5b66aa6,0x146d8c51,0x2a6f32d1,0x5b817462,0x9082b8a2,0x74623142,0x146d5b81,0x72e70b4a, +0x19c322c4,0x1a231122,0x2284bdd7,0x7bef94b2,0x1a2339c7,0x39e71142,0xad551a23,0x1a23b5b6,0x08410862,0x20c518c5,0x10820862,0x41cc1082,0x18c518c5,0x10830862,0x08620841,0x10831083,0x31090021,0x00b009d1,0x00211884,0x310941cc,0x314a314a,0x20c61884,0x18840022,0x00b009d1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa34441e6,0xa363a344,0xa363a363,0xa363a363,0xa363a363,0xa344a344,0xa344a344,0xce798ac3,0x8ac3a534,0xa363a344,0xa363a363,0xa363a363,0xa363a363,0xa344a344,0xa344a344,0x2923a363,0x290218a1,0x51a4a368,0x51c44963,0x51c451c4,0x49434963,0x51a451c4,0xa34751c4,0x08402902, +0x528a2965,0x6b6d5aeb,0x21246b6d,0x31863186,0x29452104,0x42082104,0x8c516b4d,0x29456b4d,0x528a2965,0x6b6d5aeb,0x632c9cd3,0x84308c51,0x6b6d5aeb,0x5acb5acb,0x8c516b4d,0x29456b4d,0x528a2965,0xce595aeb,0x528ace59,0x6b6d528a,0x6b6d6b6d,0xce596b6d,0x8c51ce59,0x29456b4d,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000, +0x6b4d7bef,0x73ae73ae,0x73aeff69,0x73ae73ae,0x73ae8c71,0x7bef7bef,0xff69fff6,0x7bef7bef,0x6b4d7bef,0x73ae73ae,0x73aebcd0,0x73ae73ae,0x73ae8c71,0x7bef7bef,0xbcd0dd72,0x7bef7bef,0x6b4d7bef,0x73ae73ae,0x73ae31a6,0x73ae73ae,0x73ae8c71,0x7bef7bef,0x31a639e7,0x7bef7bef,0xb8a2bccc,0x29029082,0x2a6f32d1,0x5b817462,0x31423142,0x74623142,0x39635b81,0x9c294183, +0x7bef1a23,0x11227bef,0x3c471a23,0x2b25b596,0x08e13186,0x7bef8c51,0x1a231142,0x84301a23,0x08411083,0x398a396a,0x0862398a,0x08410862,0x18c5398a,0x08621083,0x398a0841,0x108318c5,0x31090021,0x09b109d1,0x20c620c6,0x18841884,0x18840021,0x20c620c6,0x314a3109,0x09d109d1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0xa384abc5,0xabc5a363,0x51e2a384,0xabc551e2,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0xa384abc5,0xabc5a363,0x2923abc5,0xb48b0840,0xa34720e2,0x9b27a347,0xa347a347,0xa347a388,0xa347a347,0x2102a347,0x18a1b48b, +0x528a2945,0x52aa7bcf,0x8c71630c,0x7bcf8c71,0x528a632c,0x7bef8430,0x7bcf5aeb,0x3186528a,0x528a2945,0x52aa7bcf,0x8c71630c,0x7bcf8c71,0x528a632c,0x7bef8430,0x7bcf5aeb,0x3186528a,0x528a2945,0x52aa7bcf,0x5aeb630c,0x7bcf5aeb,0x528a632c,0x7bef8430,0x7bcf5aeb,0x3186528a,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000, +0x7bef7bef,0x8c718c71,0x8c718c71,0x8c718c71,0x8c7173ae,0x8c718c71,0x7bef6b4d,0x73ae7bef,0x7bef7bef,0x8c718c71,0x8c718c71,0x8c718c71,0x8c7173ae,0x8c718c71,0x7bef6b4d,0x73ae7bef,0x7bef7bef,0x8c718c71,0x8c718c71,0x8c718c71,0x8c7173ae,0x8c718c71,0x7bef6b4d,0x73ae7bef,0x2902bccc,0x20e220e2,0x20e220e2,0x5b817462,0x29022902,0x20e220e2,0x20e220e2,0x9c292902, +0xb596b596,0x7bef6b4d,0x1a232965,0x3c473c47,0x7bef1a23,0x7bef8c51,0x11629492,0x9cf36b6d,0x10820862,0x08410841,0x10820841,0x10830863,0x314a0841,0x10831083,0x08411083,0x1083398a,0x310941cc,0x09d120c6,0x314a00b0,0x1884314a,0x314a1884,0x3109314a,0x00223109,0x314a314a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0xa363a384,0xa384a384,0x8b438b43,0x8b438b43,0xa3848b43,0xa3848b43,0x8b438b43,0x8b438b43,0xa363a384,0xa384a384,0x8b438b43,0x8b438b43,0xa3848b43,0xa3848b43,0x2923abc5,0xb48b18a1,0x2902b46a,0xab88ab88,0xab88ab88,0xab88ab68,0xab88ab88,0xbcac2922,0x1881b48b, +0x6b6d39c7,0x630c5acb,0x52aa4228,0x738e738e,0x630c4a69,0x630c632c,0x422852aa,0x318652aa,0x6b6d39c7,0x630c5acb,0x52aa4228,0x738e738e,0x630c4a69,0x630c632c,0x422852aa,0x318652aa,0x6b6d39c7,0x630c5acb,0x52aa4228,0x738e738e,0x630c4a69,0x630c632c,0x422852aa,0x318652aa,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x73ae7bef,0x73ae73ae,0x7bef73ae,0x8c718c71,0x8c716b4d,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x8c718c71,0x8c716b4d,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x8c718c71,0x8c716b4d,0x73ae7bef,0x73ae73ae,0x7bef73ae,0xbcccbccc,0xb48bbccc,0xbcccbccc,0x9c29bccc,0x9c299c29,0xbccc72e7,0xbcccbccc,0x9c29bccc, +0xb596b596,0xa534b596,0x7bef94b2,0x1a232244,0xb5965aeb,0xb596b596,0x5aeb8410,0x8c71b5b6,0x10831083,0x08621083,0x10830862,0x08620862,0x08411083,0x10830862,0x10821084,0x10830841,0x310941cc,0x09b10021,0x314a00b0,0x1884314a,0x00221884,0x002109b1,0x18841884,0x18840021,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x41c541e6,0x41c541c5,0x41e641c5,0x41e641e6,0x41e641c5,0x41e641e6,0x41e641e6,0x292341e6,0x41c541e6,0x41c541c5,0x41e641c5,0x41e641e6,0x41e641c5,0x41e641e6,0x41e641e6,0x316441e6,0x18a118a1,0x18a10840,0x188118a1,0x08400840,0x18a10840,0x084018a1,0x18a118a1,0x18a118a1, +0x31a639c7,0x318631a6,0x29653186,0x29652965,0x39c72124,0x31a639c7,0x21242965,0x318631a6,0x31a639c7,0x318631a6,0x29653186,0x29652965,0x39c72124,0x31a639c7,0x21242965,0x318631a6,0x31a639c7,0x318631a6,0x29653186,0x29652965,0x39c72124,0x31a639c7,0x21242965,0x318631a6,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x73ae7bcf,0x4a69738e,0x29452945,0x5aeb39c7,0x8410ad75,0x5aeb52aa,0x4a494228,0x630c39e7,0x31863186,0x31863186,0x94b20020,0x52aa94b2,0x52aa52aa,0x318652aa,0x31863186,0x52aa52aa,0xe6f4d673,0xc5d0d693,0xded4fffa,0xef16c611,0xf737deb3,0xd672d652,0xdeb3d673,0xc611d693,0x94505248,0xa4b24a08,0x6aec9c71,0x94505269,0x52495249,0xa4904a28,0x6aecb514,0x9cd3b470, +0x6a865a45,0x39837b07,0x6aa66265,0x41846a86,0x6aa66aa6,0x31426286,0x6aa66286,0x7b076285,0x6ac76aa6,0x6aa63963,0x6a866aa6,0x6aa63963,0x6aa66aa6,0x6aa66aa6,0x39633963,0x6aa63963,0xef5def5d,0xe73ce73c,0xdefbdefb,0xd69adedb,0xdedbd6ba,0xd6bad6ba,0xd6bad6ba,0xce79d69a,0xff89ffa9,0xff28ff68,0xfec7fee7,0xf646f686,0xfe87f646,0xfe66fe66,0xfe26fe46,0xfde6fe06, +0x6efb7f1b,0x4eda5efa,0x1e782e99,0x06160637,0x06580617,0x06370637,0x06170637,0x05d605f6,0x31642923,0x39643164,0x31643164,0x31643964,0x31643164,0x31643164,0x31643164,0x31643164,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232103,0x20e22923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232103,0x20e22923, +0x00000000,0x00000000,0x00000000,0x7a080000,0x00005165,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x6aca0000,0x00004a07,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800, +0x8c5173ae,0xa5144208,0x7bcf8410,0x5aeb7bef,0x5aeb5aeb,0x94927bef,0x94b28c51,0x39c739e7,0x52aa52aa,0x318652aa,0x31863186,0x31863186,0x52aa52aa,0x94b294b2,0x318652aa,0x52aa3186,0xde74e6b5,0xce52d673,0xd653de94,0xe6d4deb3,0xded4b56e,0xd693bdaf,0xcdf2e6d5,0xe6b5ce52,0x7b8d9c91,0x8bef6b0c,0x9cd36aec,0x524983ce,0xb555bdd7,0xa4d28c0f,0x6aca83ce,0x83ae7b6c, +0x62863963,0x418493a9,0x7b076aa6,0x398349e4,0x6a869388,0x39639bc9,0x7b076285,0x62863983,0xb48b49e4,0xb48bb48b,0xb48bb48b,0xac4aac4a,0xb48bb48b,0xb48bac2a,0xb48bb48b,0x6aa6b48b,0xf79ed6ba,0xef7def7d,0xef7def7d,0xef7def7d,0xef5def5d,0xdedbe71c,0xd6bad6ba,0xc638d69a,0xffeaeea8,0xffaaffca,0xffcaffaa,0xffaaffaa,0xff8aff8a,0xfea6ff08,0xf665f686,0xe5a5f645, +0x975c0637,0x7f1b8f3c,0x873c873c,0x7f1b873c,0x6f1b7f1b,0x0e583699,0x06170637,0x05730616,0x83053184,0x7ae47ae4,0x93657ae4,0x7ae49365,0x93659365,0x93257ae4,0x93659365,0x31848305,0x936541e6,0x7ae47ae4,0x93657ae4,0x7ae49365,0x93659365,0x93257ae4,0x93659365,0x29238305,0x936541e6,0x7ae47ae4,0x93657ae4,0x7ae49365,0x93659365,0x93257ae4,0x93659365,0x29238305, +0x00000000,0x00000000,0xc0e40000,0x98a398a3,0x98a398a3,0x000098a3,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x6aca0000,0x00004a07,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb60f800,0xfb60f800,0xfb60f800,0x0000f800,0xf8000000,0xf800fb60,0xfb60f800,0xf800f800, +0x7bcfbdd7,0xb5b6738e,0xb5b6ad55,0x39c75aeb,0xce59630c,0x7befa534,0x7bef9492,0x31a68c51,0x94b252aa,0x94b23186,0x52aa0020,0x318652aa,0x31863186,0x31860020,0x52aa52aa,0x94b294b2,0xe6d5fffa,0xb56ece31,0xd672d652,0xf757d672,0xf757e6b5,0xded4e6d5,0xd693e6f4,0xd653e6d5,0x9c91b554,0xb554bdb6,0x83efa4f3,0xad3594b2,0x83ce8c30,0x94309cb2,0xb4f35aaa,0x5a69b596, +0x6ac641a4,0x6aa65a45,0x7b076a86,0x6ac749e4,0x62656ac6,0x39836286,0x93a86aa6,0x39639be9,0xb48b3963,0x9c299be8,0x9c29a44a,0x9c299c29,0xa4299be9,0xa44a9c29,0xa44aa46a,0x3963b46b,0xf79ededb,0xef7df79e,0xf79ef79e,0xf79ef79e,0xef5def7d,0xe71ce71c,0xdedbdefb,0xce59dedb,0xffeceea9,0xffccffec,0xffecffec,0xffecffec,0xffabffcb,0xff07ff28,0xfec7fee7,0xedc5fea6, +0xa77d0637,0x975c975c,0xa75da75d,0x9f5ca75d,0x7f1b8f3c,0x2e9946ba,0x0e581e78,0x05940e58,0x7ae43184,0xabc5a363,0xabc5abc5,0x8b43abc5,0xa384abc5,0x8b43a384,0x8b438b43,0x31847ae4,0x8b4341e6,0xabc5a363,0xabc5abc5,0x8b43abc5,0xa384abc5,0x8b43a384,0x8b438b43,0x29237ae4,0x8b4341e6,0xabc5a363,0xabc5abc5,0x8b43abc5,0xa384abc5,0x8b43a384,0x8b438b43,0x29237ae4, +0x00000000,0x00000000,0xe082ce79,0xce79c0e4,0x98a3c0e4,0x94b298a3,0x00000000,0x00000000,0x00000000,0x00000000,0x936a0000,0x72a872a8,0x72a872a8,0x000072a8,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb60f800,0x00000000,0x0000f800,0x0000fb60,0x00000000,0xfb600000,0x0000fb60,0xf800f800, +0xb596b596,0x39c739c7,0x39c739c7,0x7bef630c,0x31a64228,0x9cf3b596,0x7bef7bef,0x5aeb5aeb,0x318652aa,0x31863186,0x31863186,0x31863186,0x94b294b2,0x31863186,0x31863186,0x52aa3186,0xdeb4ef16,0xef36d672,0xd652ded4,0xbdafe6d4,0xdeb3c5f1,0xd652de93,0xe6d5e6b5,0xd673d652,0xa4b2b554,0x5a6a9471,0xb555b555,0x83efacf4,0x9cf3ad34,0xa51483ef,0x5289a4d2,0x8c0f83ce, +0x9bc93963,0x62863963,0x9bc96aa6,0x6aa63943,0x62853983,0x396393a9,0x62656aa6,0x9bc94184,0xb48b3963,0xbccc9c29,0xb48bbccc,0xbcccbcac,0xbcccbccc,0xbcccbccc,0x9c29bcac,0x3963b48b,0xf79ededb,0xf79ef79e,0xf79ef79e,0xf79ef79e,0xef7df79e,0xe73cef5d,0xdedbdefb,0xce59dedb,0xffeeeeaa,0xffeeffee,0xffeeffee,0xffedffed,0xffccffcd,0xff49ff8a,0xf6a7f6e7,0xedc5f6a6, +0xaf7d0637,0xa75da75d,0xaf7da77d,0xa75daf7d,0x8f3c975c,0x56da7f1b,0x06581e78,0x05940657,0x93653184,0xabc5abc5,0x8b43abc5,0x8b43abc5,0x8b438b43,0x8b438b43,0xa363a384,0x31849365,0xabc541e6,0xabc5abc5,0x8b43abc5,0x8b43abc5,0x8b438b43,0x8b438b43,0xa363a384,0x29239365,0xabc541e6,0xabc5abc5,0x8b43abc5,0x8b43abc5,0x8b438b43,0x8b438b43,0xa363a384,0x29239365, +0x00000000,0x00000000,0xe082f945,0xe082e082,0xce79e082,0x98a398a3,0x00000000,0x00000000,0x00000000,0x00000000,0x936a0000,0x936a936a,0x72a8936a,0x000072a8,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb60f800,0x0000f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x5aeb5aeb,0x7befa514,0x39c76b6d,0x84107bef,0x7bef9492,0x528a39c7,0x5aebad75,0x39c75aeb,0x52aa0020,0x52aa52aa,0x52aa3186,0x52aa52aa,0x94b294b2,0x52aa52aa,0x94b252aa,0x002094b2,0xe6d5ce32,0xcdf2e6f4,0xd673deb4,0xde93deb3,0xdeb3deb4,0xffd8de93,0xd672d672,0xbd8fd652,0xb5556aec,0x6aeab534,0x8c71730b,0x52aa73ae,0x5249a4d3,0x5249ad35,0x6aec6aea,0x94507bcf, +0x7b073983,0x62863983,0x9bc96ac7,0x9bc941a4,0x5a453943,0x39839be9,0x93a96aa6,0x9bc93963,0xb46b3963,0xbccc9c29,0xb48bb46b,0xb46bb48b,0xb48bb48b,0xbcabb48b,0xa44abccc,0x6285b48b,0xf79ededb,0xf79ef79e,0xf79ef79e,0xf79ef79e,0xf79ef79e,0xef7df79e,0xe71ce73c,0xce59defb,0xffefee8a,0xffeeffef,0xffeeffee,0xffedffee,0xffcdffed,0xffabffec,0xff28ff69,0xe5e5fee8, +0xaf7d0637,0xaf7daf7d,0xaf7daf7d,0xa77daf7d,0x9f5ca75d,0x873c9f5c,0x3eb95efa,0x05942699,0x8b043164,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0x31648b04,0xa34441e5,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0x29238b04,0xa34441e5,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0x29238b04, +0x00000000,0x00000000,0xf9450000,0xe082ffff,0xc0e4e082,0x000098a3,0x00000000,0x00000000,0x00000000,0x00000000,0xcccf0000,0x936acccf,0x936a936a,0x000072a8,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000,0xf800f800, +0xa5345aeb,0x7bef7bcf,0x31867bef,0x94b2b596,0x7bef7bef,0x39c78430,0x5aeb5aeb,0x84309cd3,0x52aa52aa,0x318694b2,0x94b23186,0x318694b2,0x31860020,0x94b294b2,0x52aa94b2,0x52aa52aa,0xe6b5ded4,0xe6d5ad0d,0xef16c611,0xde74d693,0xf756f737,0xd672e715,0xd693deb3,0xdeb3d692,0xb5556acc,0x4a28b555,0x5a68ac71,0x736d630b,0x736d9451,0x94306aec,0x7bad83ef,0x62cbbdf7, +0x7b0741c4,0x6aa64184,0x93a86286,0x62653963,0x5a453983,0x41849bea,0x9bc96aa6,0x93a841a4,0xb46a6286,0xb48b9c29,0x9c29b48b,0x9c299c29,0x9c299c29,0xbcab9c29,0x9c29bccc,0x6a86b48b,0xf79ed6ba,0xf79ef79e,0xf79ef79e,0xf79ef79e,0xf79ef79e,0xf79ef79e,0xef7df79e,0xce79ef5d,0xffeeee89,0xffeeffee,0xffedffed,0xffecffed,0xffecffec,0xffebffeb,0xffaaffeb,0xee06ff69, +0xa77d0637,0xaf7daf7d,0xa75da77d,0xa77da77d,0xa75da75d,0xa75d9f5c,0x873c9f5c,0x05d566fb,0x93253184,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xa384a384,0x31649325,0xa38441e6,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xa384a384,0x29239325,0xa38441e6,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xa384a384,0x29239325, +0x00000000,0x00000000,0x00000000,0xf945f945,0xe082f945,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xcccfcccf,0x936acccf,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x5aeb8c51,0xb5b6b596,0x39c78c51,0x6b4db596,0x9492bdd7,0x5aeb9492,0xc6185aeb,0x7bef7bef,0x318652aa,0x31863186,0x31863186,0x52aa3186,0x52aa0020,0x318652aa,0x31863186,0x52aa94b2,0xb54ec5d0,0xde93e6d5,0xde94de93,0xd672e6d5,0xdeb3deb3,0xef56deb3,0xe6b5deb3,0xef15c5f0,0x6aec9431,0xa514a534,0x6aec83ee,0xc5f8c5f8,0x83cf4a28,0x730bbdf7,0x9c5183ae,0x4a286b4d, +0x9be96aa6,0x628641c4,0x93a86ac6,0x6aa641a4,0x39636aa6,0x41a493a8,0x93a86aa6,0x7b0741a4,0xb48b6aa6,0xbccc9c09,0x9be9b46b,0xbcccbccc,0xbcccbccc,0xb48b9c29,0x9c09bccc,0x6aa6b48b,0xf79ed6ba,0xef7df79e,0xf79ef79e,0xf79eef7d,0xf79ef79e,0xf79ef79e,0xef7df79e,0xd69aef7d,0xffcdee89,0xffc9ffed,0xffccffcc,0xffebffcb,0xffebffeb,0xffeaffeb,0xffcaffea,0xee67ffa9, +0x975c0637,0x873ca77d,0x975c975c,0x975c975c,0x975c975c,0x9f5c9f5c,0x8f3c975c,0x0616873c,0x7ae43164,0x8b438b43,0xabc58b43,0xa384a384,0x8b438b43,0xa3638b43,0x8b43abc5,0x31647ae4,0x8b4341c5,0x8b438b43,0xabc58b43,0xa384a384,0x8b438b43,0xa3638b43,0x8b43abc5,0x29237ae4,0x8b4341c5,0x8b438b43,0xabc58b43,0xa384a384,0x8b438b43,0xa3638b43,0x8b43abc5,0x29237ae4, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x21247bef,0xbdd75aeb,0x7befb596,0xb5966b6d,0x7befad55,0x4a495aeb,0x210439e7,0xb596c638,0x94b252aa,0x002094b2,0x318694b2,0x52aa52aa,0x94b252aa,0x94b294b2,0x94b294b2,0x94b294b2,0xde95e6d4,0xe6d5ef16,0xd672e6b5,0xde95eef6,0xfffaf737,0xdeb3c5d0,0xde74d673,0xdeb3d672,0x528a6b4d,0x52485248,0x94109470,0x83efad13,0x62eb9cd3,0x94116aec,0x6aecb554,0x5b0c9c71, +0x9bc96aa6,0x72c73983,0x41a493a8,0x41846aa6,0x41a46aa6,0x39639388,0x6aa66aa6,0x7b073983,0xb48b6aa6,0xbcccac8b,0x9c29b48b,0xb48bbcac,0xbcccb48b,0xb48b9c09,0x9c09bccc,0x6aa6bcab,0xf79ed6ba,0xef7df79e,0xef5df79e,0xef5def5d,0xef5def5d,0xef5def5d,0xe73cef5d,0xce79e71c,0xffcceea8,0xffc9ffec,0xff88ffed,0xff88ff88,0xff88ff88,0xff88ff88,0xff67ff88,0xee45f746, +0x975c0637,0x873ca75d,0x6efba75d,0x6efb6efb,0x6efb6efb,0x6efb6efb,0x56da6efb,0x05d63eb9,0x93653184,0xabc5abc5,0xa363abc5,0xabc58b43,0xa384abc5,0xa384a384,0xabc5abc5,0x31649365,0xabc541e6,0xabc5abc5,0xa363abc5,0xabc58b43,0xa384abc5,0xa384a384,0xabc5abc5,0x29239365,0xabc541e6,0xabc5abc5,0xa363abc5,0xabc58b43,0xa384abc5,0xa384a384,0xabc5abc5,0x29239365, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x7bef7bef,0x52aa3186,0xb596ad55,0x528a5aeb,0x4a695aeb,0x8c5131a6,0x39c77bef,0xc618630c,0x52aa52aa,0x318652aa,0x31863186,0x31863186,0x00203186,0x31863186,0x31863186,0x52aa52aa,0xd693deb3,0xde93e6d5,0xd652deb3,0xffb7e6f5,0xd633deb4,0xd672d693,0xe6b5ded4,0xe6d5d672,0x6aec6aec,0xbdb6bdb6,0x8c71ad34,0x4a489c71,0xa4706aec,0x6aec8c30,0x6b4d83ef,0x736e7bf0, +0x9bc96aa6,0x6aa63983,0x39839bc9,0x41a49bc9,0x39639bc9,0x49e47b07,0x7b076286,0x6ac73983,0xb48b3963,0xcd2d9c29,0x9c29b48b,0xb48bbccc,0xbcacb48b,0xac4aa429,0x9c29bccc,0x72e7b48b,0xf79ed6ba,0xef7def7d,0xef5def5d,0xef5def5d,0xef5def5d,0xef7def5d,0xef5def7d,0xd69ae73c,0xffeceea7,0xffc9ffcb,0xff88ff88,0xff88ff88,0xff88ff88,0xffc8ffa8,0xffa8ffc8,0xee66ff87, +0x9f5c0637,0x873c8f3c,0x6efb6efb,0x6efb6efb,0x6f1b6efb,0x7f1b771b,0x771b873c,0x05f65efa,0x93043164,0xa344a344,0xa344a344,0xa363a344,0xa363a363,0xa344a344,0xa344a344,0x31649304,0x930441e5,0x8b048b04,0x8b048b04,0x93048b04,0x93049304,0x8b048b04,0x8b048b04,0x292382c4,0x930441e5,0x8b048b04,0x8b048b04,0x62027263,0x72836202,0x8b048b04,0x8b048b04,0x292382c4, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x7bef7bef,0x5aeb7bef,0x39c76b4d,0x630c39c7,0x8c71630c,0x7befa514,0x7bef738e,0x52aa7bef,0x94b294b2,0x630c52aa,0x318652aa,0x94b294b2,0x52aa52aa,0x52aa52aa,0x94b294b2,0x002094b2,0xde95bdaf,0xdeb3cdf2,0xe6d4bdd0,0xd672de93,0xd693d673,0xffb9eef6,0xe6d5deb3,0xde74deb4,0xacb2a4f3,0x94517bcf,0xa4b39c51,0xb51483f0,0x736d9c91,0x4a288bef,0x8c314a28,0x6aec8c31, +0x7b076a86,0x6aa649e4,0x626593a9,0x39636a86,0x39639388,0x5a257b07,0x7b073142,0x6ac73983,0xb48b3963,0xbcac9c29,0x9c09b48b,0xbcacbcac,0xbcccbccc,0xb48b9c29,0x9c29bcab,0x3963b48b,0xef7dd6ba,0xef7def7d,0xef5def7d,0xef7def7d,0xef7def7d,0xef7def7d,0xef7def7d,0xd69aef5d,0xffebe688,0xffc9ffca,0xffa8ffc9,0xffc9ffc9,0xffc9ffc9,0xffe9ffc9,0xffc8ffe9,0xee66ff88, +0x975c0637,0x873c873c,0x771b873c,0x873c873c,0x873c873c,0x873c873c,0x7f1b873c,0x06166f1b,0x93653184,0xa384abc5,0xabc5abc5,0x8b43abc5,0x8b438b43,0xabc5a363,0xabc5abc5,0x31849365,0x72c641e6,0x72a572c6,0x72c672c6,0x6a8572c6,0x6a856a85,0x72c672a5,0x72c672c6,0x292372c6,0x72c641e6,0x72a572c6,0x72c672c6,0x94926244,0x41a373ae,0x72c672a5,0x72c672c6,0x292372c6, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x8430738e,0x5aeb7bef,0x8c517bcf,0x31a67bef,0xc638ad55,0x8c517bcf,0x5acb630c,0x39c72965,0x31863186,0x52aa52aa,0x318652aa,0x31863186,0x002052aa,0x52aa52aa,0x31863186,0x52aa0020,0xded4ce31,0xfffece52,0xef15d672,0xde94deb4,0xf756d693,0xc5f0deb3,0xd652ce52,0xc5f0deb3,0xbd969c92,0xa4d37b6e,0xad357bd0,0x4a288bae,0x730b4a49,0xbd968bcf,0x5aaac5f8,0x4a286b4c, +0x5a456aa6,0x62866aa6,0x6a869bc9,0x6aa66286,0x39836aa6,0x8b686aa6,0x7b073983,0x62864184,0xb48b3963,0xbccc9c09,0x9c29b48b,0xa44aa44a,0x9c299c29,0xb48b9c29,0x9c09bcab,0x6aa6b48b,0xf79ed6ba,0xef5def7d,0xef7def5d,0xef7def7d,0xef7def7d,0xef7def7d,0xef7def7d,0xd6baef7d,0xffebee88,0xff88ffea,0xffc9ff88,0xffc9ffc9,0xffcaffca,0xffc9ffc9,0xffc9ffc9,0xee87ffc9, +0x9f5c0637,0x6efb975c,0x873c6efb,0x873c873c,0x873c873c,0x873c873c,0x7f1b873c,0x06177f1b,0x7ae43164,0xa384a363,0xa384a384,0x8b43abc5,0xa384a384,0xa384a384,0x8b438b43,0x31647ae4,0x316441c5,0x31843164,0x31843184,0x31643184,0x31843184,0x31843184,0x31643164,0x18e23164,0x316441c5,0x31843164,0x31843184,0xa5342923,0x292373ae,0x31843184,0x31643164,0x18e23164, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf8000000, +0xb596b596,0x5aeb5aeb,0x8430b596,0x39e78430,0xa5345aeb,0x9cf39cf3,0x7bef528a,0x5aebad55,0x94b252aa,0x318694b2,0x31863186,0x31863186,0x31863186,0x94b294b2,0x94b294b2,0x002094b2,0xd672e6f4,0xd672eef6,0xeef6eef6,0xeef6e6d5,0xce32e6d5,0xe6d5d672,0xc5f0d653,0xce11ded4,0xa4d26aec,0x52485248,0x5aaa9c92,0x6aec738e,0x736c94b3,0xad1462ca,0x8c309c71,0x9470a514, +0x41a46aa6,0x62866aa6,0x7b077b07,0x62866aa6,0x41a46ac7,0x9bc96aa6,0x9bc93983,0x7b073963,0xb46b49e4,0xbccc9c09,0xbcabb48b,0xb48bb48b,0xb48bb48b,0xbcabb48b,0x9c29bccc,0x6aa6b48b,0xf79ed6ba,0xef7def7d,0xf79eef7d,0xef7def7d,0xef7def7d,0xef7def7d,0xef5def5d,0xd6baef5d,0xffeaee88,0xffeaffea,0xffe9ffc9,0xffeaffe9,0xffcbffca,0xffa8ffc9,0xffa8ffa8,0xee87ffa8, +0x975c0637,0x975c8f3c,0x975c873c,0x975c975c,0x975c975c,0x7f1b873c,0x771b7f1b,0x0617771b,0x7ae43184,0x8b438b43,0xabc58b43,0x8b43abc5,0x8b43abc5,0xa3638b43,0xa384a384,0x31849325,0x7ae441e6,0x7ae47ae4,0x93657ae4,0x7ae49365,0x7ae49365,0x93047ae4,0x93259325,0x29239325,0x7ae441e6,0x7ae47ae4,0x93657ae4,0xc6187ac4,0x51e28430,0x93047ae4,0x93259325,0x29239325, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000, +0x4a49738e,0x5aeb3186,0x632cbdd7,0x7bef94b2,0x5acb39c7,0x39e739c7,0xad555aeb,0x5acbb5b6,0x94b252aa,0x52aa52aa,0x002052aa,0x94b252aa,0x52aa52aa,0x31863186,0x31863186,0x52aa3186,0xd673ce31,0xdeb4de93,0xded4d652,0xce52d652,0xd672d672,0xe6f4de93,0xde93deb3,0xbdd0deb3,0x7bef8c10,0xb535bdf7,0x9c309c70,0x6aec83cf,0x8c718c51,0x734d9c91,0x734d734d,0xa4b2b534, +0x41c46ac6,0x41846265,0x7b077b07,0x6a863983,0x39639bc9,0x9bc96a86,0x9be93983,0x7b0741a4,0xb48b6aa6,0xb48ba44a,0xbcccbccc,0xbcccbccc,0xbcabbccc,0xbcabbccc,0x9c29bccc,0x3963b48b,0xef7dd6ba,0xef7def7d,0xef7def7d,0xf79ef79e,0xef7def7d,0xef7def7d,0xef7def7d,0xd69aef7d,0xffcaee88,0xffeaffea,0xffeaffea,0xffeaffea,0xffcbffcb,0xffc9ffc9,0xffc8ffa8,0xee66ffc8, +0x975c0637,0x8f3c975c,0x975c8f3c,0x975c9f5c,0x873c975c,0x873c873c,0x7f1b7f1b,0x05f67f1b,0x8b043164,0xa363a344,0xa363a363,0xa363a363,0xa363a363,0xa344a344,0xa344a344,0x31649304,0xa34441e6,0xa363a344,0xa363a363,0xa363a363,0xa363a363,0xa344a344,0xa344a344,0x2923a363,0xa34441e6,0xa363a344,0xa363a363,0xce798ac3,0x8ac3a534,0xa344a344,0xa344a344,0x2923a363, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000, +0x7bef5acb,0x29657bef,0xb5965acb,0x8410b596,0x21243186,0x7bef8c51,0x5aeb39c7,0x84305aeb,0x002052aa,0x31863186,0x31860020,0x31863186,0x318694b2,0x52aa52aa,0x94b252aa,0x52aa52aa,0xef16e6b5,0xd673ff78,0xd693de93,0xdeb3deb3,0xe6f4deb3,0xeef6e6d5,0xce52c611,0xff78d672,0x732d8b8d,0xb5346aec,0x8c10b534,0x83efbd96,0x52486aec,0xc5f76b4d,0x83adc5f7,0x6aec6aec, +0x5a453963,0x41a46265,0x9bc96a86,0x62863983,0x39639bc9,0x7b076286,0x7b0749e4,0x9bc949e4,0xb48b3963,0x9c099c09,0x93e89c29,0x9c099c29,0x9c29a46a,0x9c299c29,0xa42a9c29,0x6aa6b48b,0xef7dd6ba,0xef7def7d,0xef7def7d,0xef7def7d,0xef7def7d,0xef7def7d,0xef5def5d,0xd69ae73c,0xffccee88,0xffcaffcb,0xffeaffea,0xffcaffea,0xffcbffcb,0xffc9ffca,0xff88ffa9,0xee65ff87, +0x8f3c0617,0x8f3c8f3c,0x8f3c975c,0x8f3c8f3c,0x873c873c,0x873c8f3c,0x6efb7f1b,0x05f65efa,0x93653184,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0xa384abc5,0xabc5a363,0x31649365,0xabc541e6,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0xa384abc5,0xabc5a363,0x2923abc5,0xabc541e6,0x8b438b43,0x8b438b43,0x82e3a384,0xabc58b04,0xa384abc5,0xabc5a363,0x2923abc5, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000, +0xb596b596,0x7bef6b4d,0x5aeb2965,0xb596b596,0x7bef5aeb,0x7bef8c51,0x39c79492,0x9cf36b6d,0x52aa52aa,0x94b294b2,0x94b294b2,0x94b294b2,0x94b23186,0x94b294b2,0x52aa0020,0x318652aa,0xde93deb4,0xe6d6e6b5,0xd672bdb1,0xd672d652,0xe6d5c5d0,0xdeb3fffb,0xde93d672,0xef15d693,0x9c108bce,0xbd559c30,0xa4d48bf0,0x6aec9cb3,0xb555b555,0x94716b0b,0xa4d25249,0x9c51836e, +0x62853983,0x39436ac7,0x9bc93983,0x628641a4,0x39839bc9,0x9bc96a86,0x7b0749e4,0x93a849e4,0xb48b6aa6,0xb48bb46a,0xb48bb48b,0xb48bb48b,0xb46aac4a,0xb48bb48b,0xbcacbcab,0x6265b48b,0xef5dd69a,0xef5def5d,0xef7def7d,0xef7def7d,0xef7def7d,0xef7def7d,0xef5def7d,0xd69aef5d,0xff4ce648,0xff6bff4b,0xffabffab,0xffabffaa,0xff8bffab,0xffaaffab,0xff8affaa,0xee67ff89, +0x66fb05f6,0x6f1b66fb,0x873c873c,0x873c873c,0x7f1b7f1b,0x873c873c,0x7f1b7f1b,0x05f6771b,0x83053184,0x93049325,0x93259325,0x7ae47ae4,0x7ae47ae4,0x93257ae4,0x93257ae4,0x31648305,0xabc541e6,0xa363a384,0xa384a384,0x8b438b43,0x8b438b43,0xa3848b43,0xa3848b43,0x2923abc5,0xabc541e6,0xa363a384,0xa384a384,0x8b438b43,0x8b438b43,0xa3848b43,0xa3848b43,0x2923abc5, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xb596b596,0xa534b596,0x7bef94b2,0x5aeb630c,0xb5965aeb,0xb596b596,0x5aeb8410,0x8c71b5b6,0x318652aa,0x31863186,0x52aa3186,0x94b294b2,0x94b20020,0x318652aa,0x31863186,0x52aa3186,0xdeb49cab,0xdeb3deb3,0xdeb3d692,0xde93d672,0xdeb4e6f4,0xd693de93,0xd672d652,0xde93ce31,0xbdf75a89,0x9c306aec,0x94119c30,0x6aec9c31,0x6aec7bef,0x9c719c71,0xa4d28c0f,0x9c30734d, +0x6aa641c4,0x9bc96aa6,0x6ac63983,0x41a493a8,0x6a866286,0x7b076286,0x7b076ac6,0x9be96aa6,0x6aa66aa6,0x6aa63963,0x62866aa6,0x39633963,0x6aa63963,0x39636aa6,0x6aa66ac7,0x6ac66aa6,0xa534ad55,0xbdd7ad75,0xd69ac638,0xd69ad6ba,0xd69ad69a,0xdedbd6ba,0xdefbdedb,0xe71cdefb,0xc423c444,0xd524cc83,0xe647ddc5,0xee67ee87,0xee27ee46,0xeea8ee88,0xeee9eec9,0xff0bf6ea, +0x042e042e,0x04f1044f,0x05f60574,0x05f60617,0x05f605f6,0x06370637,0x1e780e58,0x46ba1e78,0x31642923,0x31643164,0x31843164,0x31843184,0x31843164,0x31843184,0x31843184,0x29233184,0x41c541e6,0x41c541c5,0x41e641c5,0x41e641e6,0x41e641c5,0x41e641e6,0x41e641e6,0x316441e6,0x41c541e6,0x41c541c5,0x41e641c5,0x41e641e6,0x41e641c5,0x41e641e6,0x41e641e6,0x316441e6, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x94b28430,0x738e8c51,0x9cd3a534,0xbdd794b2,0xbdf78c71,0x84107bef,0x94928430,0x9cf38c51,0x73ae73ae,0x73ae73ae,0x8c716b4d,0x7bef8c71,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x7bef7bef,0x7aa79369,0x9369bc2b,0x7aa79369,0x93698430,0x93699369,0x7aa77aa7,0x93699369,0x59e57aa7,0x7aa79369,0x9369bc2b,0x7aa79369,0x93698430,0x93699369,0x7aa77aa7,0x93699369,0x59e57aa7, +0x72e772e7,0x7b0772e7,0x6aa66aa6,0x6aa67b07,0x72e772e7,0x6aa672e7,0x6aa649e4,0x72e76aa6,0x8410a514,0x84108410,0x94927bcf,0x84309492,0x84308430,0x84108430,0x84108410,0x84308430,0x84108410,0x84108410,0x94927bcf,0x84309492,0x84308430,0x84108430,0x84108410,0x84308430,0xb596b5b6,0xb5b6ad55,0xb5b6b5b6,0xd6bab5b6,0xb5b6bdd7,0xb5b6b596,0xb5b6bdd7,0xce79b5b6, +0xb1a2c1e2,0x9162a182,0xb1a2c1e2,0x9162a182,0xb1a2c1e2,0x9162a182,0xb1a2c1e2,0x9162a182,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x0000ffff,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0xffff0000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00001300,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x14200000,0x00001300,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x00000000,0x59a00000,0x59a09325,0x00000000,0x00000000,0x00000000, +0xa514a514,0x7bcf8c51,0xad55b596,0x949294b2,0x94b27bef,0x843094b2,0x9cf3ad55,0xa5148c51,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x8c718c71,0x73ae7bef,0x7bef73ae,0x7aa79369,0xbc2b59e5,0x59e57aa7,0x59e57aa7,0x7aa77aa7,0x59e57aa7,0x7aa77aa7,0x93699369,0x7aa79369,0xbc2b59e5,0x59e57aa7,0x59e57aa7,0x7aa77aa7,0x59e57aa7,0x7aa77aa7,0x93699369, +0xbcccbccc,0x9c299c29,0xbccc9c29,0x9c29bccc,0xbcccbccc,0xb48b9c29,0xbcccbccc,0xbcccbccc,0xad55ce59,0xa514ad55,0xa514a514,0xa514a514,0xad55ad55,0xb596b596,0xa514ad55,0x8430a514,0xad558430,0xa514ad55,0xa514a514,0xa514a514,0xad55ad55,0xb596b596,0xa514ad55,0x8430a514,0x51439a66,0x79e58205,0x79e579e5,0xd6ba79e5,0x79e59a66,0x79e579e5,0x79e58205,0xd69a81e5, +0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0xffff0000,0x00000000,0x00000000,0xffffffff,0xffffffff,0x00000000,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x5a260000,0x00001300,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x14201300,0x00001300,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x00000000,0x93250000,0x59a09325,0x00000000,0x00000000,0x00000000, +0xad55b5b6,0x73ae73ae,0x84107bef,0xc6188410,0xc638a514,0x9cd3ad55,0x8c51a514,0xad75ad55,0x8c717bef,0x8c7173ae,0x7bef6b4d,0x73ae7bef,0x73ae73ae,0x73ae6b4d,0x7bef7bef,0x8c718c71,0x93697aa7,0x7aa77aa7,0x7aa772c8,0x93699369,0x59e57aa7,0x59e5bc2b,0xbc2b7aa7,0x93699369,0x93697aa7,0x7aa77aa7,0x7aa759e5,0x93699369,0x59e57aa7,0x59e5bc2b,0xbc2b7aa7,0x93699369, +0x9c29b48b,0xbccc72e7,0xbcccbccc,0x9c29bccc,0xb48bbccc,0x9c29b48b,0x9c299c29,0xb48b9c29,0xb596ce59,0xb596a514,0xad559cf3,0xa514ad55,0xa514a514,0xa5149cf3,0xad55ad55,0x9492b596,0xb5968430,0xb596a514,0xad559cf3,0xa514ad55,0xa514a514,0xa5149cf3,0xad55ad55,0x9492b596,0x79e59a66,0x79e579c5,0x79e579e5,0xce796184,0x79c59a66,0x79e579e5,0x79e579e5,0xd69a81e5, +0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0x8c71da23,0x916252aa,0x8c71da23,0x91628c71,0x52aada23,0x91628c71,0x52aada23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x00000000,0x0000ffff,0xffff0000,0x0000ffff,0x00000000,0xffffffff,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x5a261420,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x13000000,0x14201420,0x13001300,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x00000000,0x93250000,0x59a09325,0x00000320,0x00000000,0x00000000, +0x94b2bdd7,0x8c518410,0x94929cd3,0x7bcf8430,0x9492632c,0x7bef8c51,0xa5349cf3,0x84307bcf,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x73ae73ae,0x73ae73ae,0x7bef73ae,0x59e57aa7,0x7aa79369,0x93699369,0x7aa7bc2b,0x7aa77aa7,0x7aa77aa7,0x7aa77aa7,0xbc2bbc2b,0x59e57aa7,0x7aa79369,0x93699369,0x7aa7bc2b,0x7aa77aa7,0x7aa77aa7,0x7aa77aa7,0xbc2bbc2b, +0xbcccbccc,0xbcccbccc,0x9c29bccc,0x9c29bccc,0x9c299c29,0x9c299c29,0x72e7b48b,0xbcccbccc,0xa514ce59,0xa514a514,0xa514a514,0xa514a514,0xb596b596,0xa514a514,0xa514a514,0x8430a514,0xa5148430,0xa514a514,0xa514a514,0xa514a514,0xb596b596,0xa514a514,0xa514a514,0x8430a514,0xa2679a67,0x9a66aaa7,0x9a669a66,0xce799246,0xb2c89246,0x9a669a66,0x9a669a46,0xe71c9a67, +0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xda23da23,0x52aada23,0xda23da23,0xa9a252aa,0x000052aa,0x52aa0000,0xda2352aa,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0x00000000,0xffff0000,0x0000ffff,0xffffffff,0x0000ffff,0x00000000,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x13000000,0x00001420,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x14200000,0x14201300,0x00001300,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x03200320,0x03200000,0x59a00000,0x4e649325,0x00004e64,0x00000000,0x00000000, +0xad758430,0xa5148430,0x843094b2,0x8c519492,0x949294b2,0x7bcf8c71,0x7bef7bef,0x8c517bef,0x7bef6b4d,0x7bef7bef,0x7bef73ae,0x7bef7bef,0x8c718c71,0x7bef7bef,0x8c717bef,0x6b4d8c71,0x7aa79369,0x93697aa7,0xbc2b9369,0x93697aa7,0x93696b6d,0x7aa79369,0x936959e5,0x59e57aa7,0x7aa79369,0x93697aa7,0xbc2b9369,0x93697aa7,0x93696b6d,0x7aa79369,0x936959e5,0x59e57aa7, +0x6aa672e7,0x72e772e7,0x6aa66aa6,0x72e76aa6,0x72e772e7,0x72e772e7,0x6aa66aa6,0x72e76aa6,0xad55c618,0xad55ad55,0xad55a514,0xad55ad55,0xb596b596,0xad55ad55,0xb596ad55,0x7bcfb596,0xad557bcf,0xad55ad55,0xad55a514,0xad55ad55,0xb596b596,0xad55ad55,0xb596ad55,0x7bcfb596,0xb5b6b5b6,0xd6baad75,0xb5b6b5b6,0xb5b6b5b6,0xb5b6b5b6,0xdedbb596,0xbdd7b596,0xb5b6b596, +0xa182b1c2,0x79218942,0xa182b1c2,0x79218942,0xa182b1c2,0x79218942,0xa182b1c2,0x79218942,0x9162a9a2,0x91629162,0x91620000,0x91620000,0x52aa0000,0x00009162,0x916252aa,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x00000000,0xffff0000,0xffffffff,0xffff0000,0xffff0000,0xffffffff,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x14205a26,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x14200000,0x00001420,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x03204e64,0x03200320,0x03200000,0x93250320,0x000059a0,0x00000000,0x03200000, +0x9cf39cd3,0xa53494b2,0xb5b68410,0x94928c71,0x7bcfc618,0x8410a534,0x8c518c71,0x8c718430,0x7bef7bef,0x73ae8c71,0x8c7173ae,0x73ae8c71,0x73ae6b4d,0x8c718c71,0x7bef8c71,0x7bef7bef,0x93699369,0xbc2b7aa7,0x7aa7bc2b,0x9369bc2b,0xbc2b59e5,0x7aa7bc2b,0x93699369,0x7aa78430,0x93699369,0xbc2b7aa7,0x7aa7bc2b,0x9369bc2b,0xbc2b59e5,0x7aa7bc2b,0x93699369,0x7aa78430, +0xb48bbccc,0xb48bb48b,0xbcccbccc,0x9c299c29,0x9c299c29,0xb48bb48b,0xb48bb48b,0x9c29b48b,0xad55ce59,0xa514b596,0xb596a514,0xa514b596,0xa5149cf3,0xb596b596,0xad55b596,0x8430ad55,0xad558430,0xa514b596,0xb596a514,0xa514b596,0xa5149cf3,0xb596b596,0xad55b596,0x8430ad55,0x79e58a26,0xdefb8a05,0x79e59a66,0x79e55964,0x820569a4,0xd69a79e5,0x79e59a66,0x79e58205, +0xad75ad75,0xad75ce79,0xce79ad75,0xad75ad75,0xce79ad75,0xad75ad75,0xad75ce79,0xad75ad75,0x8c71da23,0x91628c71,0x0000da23,0x00000000,0x8c710000,0x916252aa,0x8c710000,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x00000000,0x0000ffff,0xffff0000,0xffff0000,0x00000000,0x0000ffff,0x0000ffff,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x5a260000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf7c00000,0xb5e0f7c0,0x8c808c80,0x0000ce80,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x4e640000,0x59a00320,0x4e640000,0x59a00320,0x4e6459a0,0x00000320,0x03200320, +0x841094b2,0x8c71b5b6,0x9cd38c71,0x8410ad55,0x94928430,0xad559492,0xb5968c71,0x84108c71,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x7bef73ae,0x7bef6b4d,0x73ae7bef,0x73ae73ae,0x7bef8c71,0x93699369,0x7aa759e5,0x59e57aa7,0x7aa759e5,0x7aa77aa7,0x7aa77aa7,0xbc2bbc2b,0x93697aa7,0x93699369,0x7aa759e5,0x59e57aa7,0x7aa759e5,0x7aa77aa7,0x7aa77aa7,0xbc2bbc2b,0x93697aa7, +0x9c299c29,0x9c299c29,0xbccc9c29,0xb48bb48b,0x9c299c29,0x72e79c29,0x9c29bccc,0x9c299c29,0xa514ce59,0xa514a514,0xa514a514,0xad55a514,0xad559cf3,0xa514ad55,0xa514a514,0x8430b596,0xa5148430,0xa514a514,0xa514a514,0xad55a514,0xad559cf3,0xa514ad55,0xa514a514,0x8430b596,0x79e579e5,0xce7979e5,0x79e59246,0x79e579e5,0x8a268205,0xce7979c5,0x8a059a66,0x79e579e5, +0xad75ce79,0x0000ad75,0xad75ce79,0xce790000,0x0000ce79,0xce79ce79,0xad750000,0xce79ad75,0x8c71da23,0x52aa52aa,0x00000000,0x00000000,0x00000000,0x91628c71,0x52aa0000,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x00000000,0x0000ffff,0xffff0000,0xffffffff,0xffff0000,0x00000000,0x0000ffff,0xffff0000, +0x00000000,0x00000000,0x00000000,0x14203d19,0x00001300,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xce80ce80,0x8c80f7c0,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x93250320,0x932559a0,0x03209325,0x93259325,0x93259325,0x00004e64, +0x9cd38410,0xad55b5b6,0x8410ad75,0x9cf3ad75,0xad55b596,0x94928410,0x94928430,0x7bef7bef,0x8c717bef,0x6b4d8c71,0x73ae8c71,0x7bef7bef,0x8c717bef,0x8c718c71,0x8c718c71,0x8c718c71,0x7aa79369,0x93697aa7,0x93697aa7,0x59e57aa7,0x93697aa7,0x7aa79369,0x7aa77aa7,0x7aa759e5,0x7aa79369,0x93697aa7,0x93697aa7,0x59e57aa7,0x93697aa7,0x7aa79369,0x7aa77aa7,0x7aa759e5, +0xbcccbccc,0xbcccbccc,0x72e7bccc,0xbccc9c29,0xb48bbccc,0xb48bb48b,0xbcccbccc,0x9c29bccc,0xce79ce59,0xc618ce79,0xc638ce79,0xce59ce59,0xce79ce59,0xce79ce79,0xce79ce79,0xb596ce79,0xb5968430,0x9cf3b596,0xa514b596,0xad55ad55,0xb596ad55,0xb596b596,0xb596b596,0x9492b596,0x9a66a267,0xd69a9a66,0x9a669a46,0xb2c8a287,0x9a66a267,0xd69a9a66,0x9a669a66,0x79e5b2c8, +0xce79ce79,0x0000ce79,0xce79ce79,0xce790000,0x00000000,0xce79ce79,0xce790000,0xce79ce79,0xda23da23,0xa9a2da23,0xda23da23,0x00000000,0x52aa0000,0x52aada23,0x000052aa,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0x00000000,0x0000ffff,0x0000ffff,0xffff0000,0xffffffff,0xffffffff,0xffffffff,0xffffffff, +0x00000000,0x00000000,0x00000000,0x3cd73ddc,0x33f333f3,0x00003d19,0x00000000,0x00000000,0x00000000,0x00000000,0xce800000,0x0000f7c0,0xb5e0f7c0,0x0000f7c0,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x03200000,0x93250000,0x93259325,0x03200320,0x59a00320,0x03200000,0x00000000, +0x84308c71,0x8c519cf3,0x7bef9492,0x8430a534,0xad7594b2,0x84108430,0xa5148c71,0xad557bef,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x6b4d73ae,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x7aa7bc2b,0xbc2bbc2b,0x93699369,0x7aa77aa7,0x59e59369,0x93699369,0x7aa77aa7,0x93699369,0x7aa7bc2b,0xbc2bbc2b,0x93699369,0x7aa77aa7,0x59e59369,0x93699369,0x7aa77aa7,0x93699369, +0x72e772e7,0x6aa66aa6,0x6aa66aa6,0x72e76aa6,0x72e772e7,0x6aa66aa6,0x6aa66aa6,0x72e772e7,0x8430ad55,0x84108430,0x84108410,0x84108410,0x7bcf8410,0x84108410,0x84108410,0x84308430,0xad558430,0xa514ad55,0xa514a514,0xa514a514,0x9cf3a514,0xa514a514,0xa514a514,0x8430ad55,0xb5b6b5b6,0xb596b5b6,0xbdd7b596,0xd6bab5b6,0xb5b6b5b6,0xb5b6b596,0xb5b6b5b6,0xd6bab5b6, +0xce79ce79,0x0000ce79,0xce79ce79,0x00000000,0x0000ce79,0xce79ce79,0xce790000,0xce79ce79,0x9162a9a2,0x91629162,0x000052aa,0x00000000,0x00000000,0x916252aa,0x0000a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x0000ffff,0x00000000,0x0000ffff,0xffff0000, +0x00000000,0x00000000,0x3d190000,0x3d193d19,0x33f33ddc,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x4e640000,0x00000320,0x932559a0,0x4e644e64,0x00000000,0x03204e64,0x00000320, +0x9cf37bef,0x9492a534,0x84109492,0x7bef8c51,0x84308430,0xad75b5b6,0xa5349492,0x8c7194b2,0x8c718c71,0x84107bef,0x73ae7bef,0x8c718c71,0x7bef7bef,0x7bef7bef,0x8c718c71,0x6b4d8c71,0x59e5bc2b,0x7aa77aa7,0x7aa78430,0xbc2b7aa7,0x7aa7bc2b,0xbc2bbc2b,0x93697aa7,0x93697aa7,0x59e5bc2b,0x7aa77aa7,0x7aa78430,0xbc2b7aa7,0x7aa7bc2b,0xbc2bbc2b,0x93697aa7,0x93697aa7, +0xbcccbccc,0xb48bbccc,0xbcccbccc,0x9c29bccc,0x9c299c29,0xbccc72e7,0xbcccbccc,0xbcccbccc,0xb596ce79,0xad55ad55,0xa514ad55,0xb596b596,0xad55ad55,0xad55ad55,0xb596b596,0x7bcfb596,0xb5969492,0xad55ad55,0xa514ad55,0xb596b596,0xad55ad55,0xad55ad55,0xb596b596,0x7bcfb596,0x59649a66,0x69a48a05,0x618479e5,0xdefb79e5,0x69a4aaa7,0x71c58205,0x79e579e5,0xd69a79e5, +0xdedbce79,0x00000000,0xce790000,0xce790000,0x0000dedb,0x0000ce79,0x00000000,0xce79dedb,0x8c71da23,0x52aa52aa,0x8c71da23,0x52aa0000,0x52aa0000,0x52aa0000,0x000052aa,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x00000000,0x0000ffff,0x0000ffff,0xffffffff,0xffff0000,0xffff0000,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x33f33ddc,0x3cd73d19,0x00003d19,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x59a00000,0x59a09325,0x93259325,0x032059a0,0x4e640000,0x00000320, +0x9cd39cd3,0xa5347bcf,0x94b28410,0x9cd394b2,0x94b28430,0x84108c51,0x8c517bcf,0x94b28c71,0x73ae73ae,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x6b4d7bef,0x7bef7bef,0x73ae73ae,0x7bef6b4d,0x59e57aa7,0x93699369,0x93697aa7,0x59e559e5,0x7aa759e5,0x59e57aa7,0x7aa77aa7,0xbc2b7aa7,0x59e57aa7,0x93699369,0x93697aa7,0x59e559e5,0x7aa759e5,0x59e57aa7,0x7aa77aa7,0xbc2b7aa7, +0x9c299c29,0xb48b72e7,0xb48bb48b,0x9c29bccc,0xb48bb48b,0xb48bb48b,0x9c299c29,0x9c299c29,0xa514c638,0xad55ad55,0xa514ad55,0xa514a514,0x9cf3ad55,0xad55ad55,0xa514a514,0x84309cf3,0xa5148410,0xad55ad55,0xa514ad55,0xa514a514,0x9cf3ad55,0xad55ad55,0xa514a514,0x84309cf3,0x79e59a66,0x79e59a66,0x79e56184,0xd69a79c5,0x79e59a66,0x79e571a4,0x79e569a4,0xd6ba79e5, +0xdedbdedb,0xce79dedb,0xdedbdedb,0xdedbdedb,0xdedbce79,0xce79dedb,0xdedbce79,0xce79dedb,0x8c71da23,0x91628c71,0x0000da23,0x91620000,0x8c7152aa,0x52aa52aa,0x8c710000,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x00000000,0x0000ffff,0xffff0000,0xffff0000,0x00000000,0x0000ffff,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x3ddc0000,0x00003ddc,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x03200000,0x032059a0,0x00000320,0x93250320,0x59a09325,0x932559a0,0x00000000, +0x8410a514,0x8410ad75,0xad75ad75,0xad758c51,0x73aebdd7,0xa5348410,0x7befad55,0x8c718c51,0x8c717bef,0x73ae8c71,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x8c718c71,0x6b4d8c71,0x7aa79369,0xbc2b9369,0x936959e5,0x7aa77aa7,0x59e59369,0x6b6d7aa7,0x93697aa7,0x7aa759e5,0x7aa79369,0xbc2b9369,0x936959e5,0x7aa77aa7,0x59e559e5,0x6b6d59e5,0x93697aa7,0x7aa759e5, +0x9c29bccc,0x9c299c29,0xbccc9c29,0x9c29bccc,0x9c29bccc,0x72e79c29,0xb48bb48b,0xbcccb48b,0xb596ce59,0xa514b596,0xa514a514,0xa514a514,0xa514a514,0xb596b596,0xb596b596,0x7bcfb596,0xb5968430,0xa514b596,0xa514a514,0xa514a514,0xa514a514,0xb596b596,0xb596b596,0x7bcfb596,0x9a668a26,0x9a669a66,0x92469a66,0xd69a9a66,0xaa87aa87,0x9a66a267,0x9a669a66,0xd69a9a66, +0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xda23da23,0xa9a2da23,0xda2352aa,0xa9a252aa,0xda2352aa,0x00000000,0xda2352aa,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0x00000000,0xffff0000,0x0000ffff,0xffff0000,0xffff0000,0xffff0000,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x4e640000,0x03209325,0x00000320,0x03200320,0x932559a0,0x03209325,0x00000000, +0x843073ae,0x94b28c51,0x9cd39492,0x7bcf7bef,0x84107bef,0x94b28c71,0x8c518c71,0x7bef8c71,0x8c717bef,0x7bef7bef,0x6b4d7bef,0x8c717bef,0x7bef7bef,0x73ae73ae,0x73ae73ae,0x7bef73ae,0x6b6d9369,0x7aa7bc2b,0x59e59369,0xbc2b7aa7,0x93699369,0x93697aa7,0xbc2b7aa7,0x7aa79369,0x6b6d59e5,0x59e559e5,0x59e57588,0x59e559e5,0x59e55ce6,0x59e56d68,0x59e57aa7,0x7aa759e5, +0x6aa66aa6,0x72e76aa6,0x72e772e7,0x72e772e7,0x72e772e7,0x6aa66aa6,0x6aa66aa6,0x72e772e7,0xb596ce59,0xad55ad55,0x9cf3ad55,0xb596ad55,0xad55ad55,0xa514a514,0xa514a514,0x8430a514,0xb5968430,0xad55ad55,0x9cf3ad55,0xb596ad55,0xad55ad55,0xa514a514,0xa514a514,0x8430a514,0xbdd7bdd7,0xd6bab596,0xb5b6b5b6,0xb596b5b6,0xbdd7b5b6,0xdefbb5b6,0xb5b6b5b6,0xbdf7b596, +0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0x9162a9a2,0x52aa9162,0x9162a9a2,0x916252aa,0x000052aa,0x91629162,0x916252aa,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x00000000,0xffff0000,0x00000000,0xffffffff,0x0000ffff,0x00000000,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x03204e64,0x4e640000,0x03204e64,0x03200000,0x00009325,0x00000000, +0xbdd7a514,0x8430b596,0x8c518c51,0x94929492,0x9cf394b2,0xad75ad55,0x73ae8430,0xb5b68410,0x6b4d7bef,0x73ae73ae,0x73ae6b4d,0x73ae73ae,0x73ae8c71,0x7bef7bef,0x8c717bef,0x7bef7bef,0x7aa7bc2b,0x59e57aa7,0x7aa7bc2b,0x7aa77aa7,0x7aa7bc2b,0x7aa77aa7,0x59e559e5,0x7aa7bc2b,0x59e58deb,0x65279e4d,0x59e56d47,0x59e57588,0x7dea75a9,0x962c960c,0x54a559e5,0x59e56506, +0xbcccbccc,0x9c299c29,0x9c299c29,0xb48bb48b,0xbcccbccc,0xb48bbccc,0xbccc72e7,0x9c29bccc,0x9cf3ce59,0xa514a514,0xa5149cf3,0xa514a514,0xa514b596,0xad55ad55,0xb596ad55,0x8430ad55,0x9cf38430,0xa514a514,0xa5149cf3,0xa514a514,0xa514b596,0xad55ad55,0xb596ad55,0x8430ad55,0x8a2679e5,0xd69a69a4,0x79e59a66,0x71a479e5,0x79e579e5,0xd69a79e5,0x92268205,0x8a2679e5, +0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0x8c71da23,0x916252aa,0x8c71da23,0x000052aa,0x52aa0000,0x91628c71,0x52aada23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x00000000,0xffffffff,0xffffffff,0x00000000,0x0000ffff,0xffff0000,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x4e644e64,0x00000000,0x00000000,0x03204e64,0x00000320,0x00000000, +0x8c7194b2,0x94b2a514,0x84109cd3,0x84108c51,0xad557bef,0x9492a534,0x8c718410,0x8c518430,0x7bef7bef,0x8c718c71,0x8c718c71,0x8c718c71,0x8c7173ae,0x8c718c71,0x7bef6b4d,0x73ae7bef,0x93697aa7,0x7aa759e5,0x93697aa7,0x59e58430,0xbc2b7aa7,0x7aa79369,0x93697aa7,0x59e559e5,0x6d6875a9,0x858a8dcb,0x59e5858a,0x65076d47,0x960c5ce6,0x758995ec,0x6d686506,0x6d486527, +0xbcccbccc,0x72e7b48b,0xb48bb48b,0x9c299c29,0x9c299c29,0xb48b9c29,0xb48b9c29,0x9c29bccc,0xad55ce59,0xb596b596,0xb596b596,0xb596b596,0xb596a514,0xb596b596,0xad559cf3,0x8410ad55,0xad558430,0xb596b596,0xb596b596,0xb596b596,0xb596a514,0xb596b596,0xad559cf3,0x8410ad55,0x79e579e5,0xe71c8205,0x79e5b2c8,0x618469a4,0x71c579e5,0xd69a8205,0x79e59a66,0x79e579e5, +0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0xffff0000,0x00000000,0x00000000,0x00000000,0xffffffff,0x0000ffff,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x4e640000,0x00000000,0x00000000, +0x94b294b2,0x84309492,0x8c718430,0x8c717bef,0x94b29cf3,0x84308c51,0x84108c51,0x8c71738e,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x8c718c71,0x8c716b4d,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x9369bc2b,0x7aa79369,0xbc2b7aa7,0x93699369,0x7aa77aa7,0x7aa759e5,0xbc2b7aa7,0xbc2b7aa7,0x75a975a9,0x65277589,0x6d686527,0x6d685ce6,0x75a97dea,0x65276d48,0x65066d47,0x6d685484, +0x9c29bccc,0x9c299c29,0xbccc9c29,0xb48bbccc,0xbccc9c29,0xbcccbccc,0xbcccbccc,0x9c29bccc,0xc638ce59,0xc638c638,0xce59c638,0xce79ce79,0xce79c618,0xc638ce59,0xc638c638,0xad55c638,0x84108430,0x84108410,0x84308410,0x94929492,0x94927bcf,0x84108430,0x84108410,0x84308410,0x92469a66,0xce799a66,0x9a679a66,0xa2879226,0xaaa79a66,0xd69a8a26,0xaa879a66,0x9a669a66, +0xc9e2da23,0xa1a2b1c2,0xc9e2da23,0xa1a2b1c2,0xc9e2da23,0xa1a2b1c2,0xc9e2da23,0xa1a2b1c2,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0x0000ffff,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0xffff0000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0 }; diff --git a/minecraftcpp-master/handheld/project/data/images/terrain_565_2.h b/minecraftcpp-master/handheld/project/data/images/terrain_565_2.h new file mode 100644 index 0000000..fc474ad --- /dev/null +++ b/minecraftcpp-master/handheld/project/data/images/terrain_565_2.h @@ -0,0 +1,1052 @@ +/********************************************************** + * PVRTexture Tool v 3.20 + * PVRTC Library v 1.106. 0. 0 Beta + **********************************************************/ + +#ifndef A32BIT + #define A32BIT static const unsigned long +#endif + +A32BIT terrain_565_2[] = { + +/* Header */ +0x00000034, /* dwHeaderSize */ +0x00000100, /* dwHeight */ +0x00000100, /* dwWidth */ +0x00000000, /* dwMipMapCount */ +0x00010013, /* dwpfFlags */ +0x00020000, /* dwDataSize */ +0x00000010, /* dwBitCount */ +0x0000f800, /* dwRBitMask */ +0x000007e0, /* dwGBitMask */ +0x0000001f, /* dwBBitMask */ +0x00000000, /* dwAlphaBitMask */ +0x21525650, /* dwPVR */ +0x00000001, /* dwNumSurfs */ + +/* Data */ +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x7bef9cd3,0x7bef7bef, +0x7bef7bef,0x7bef9cd3,0x9cd39cd3,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x9cd39cd3,0x7bef39e7,0x7bef7bef,0x7bef39e7,0x9cd39cd3,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x9cd39cd3,0x7bef39e7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xfaa0fd00,0xf800f800,0xf800f800,0xc800c800,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xfaa0fd00,0xf800f800,0xf800f800,0xc800c800, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd39cd3,0x7bef39e7,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x7bef39e7,0x7bef7bef, +0x7bef7bef,0x9cd339e7,0x39e739e7,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x39e739e7,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x39e739e7,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x39e739e7,0x7bef7bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800c800,0xf800faa0,0xf800c800,0xfaa0f800,0xfd00fd00,0xf800faa0,0xf800faa0,0xc800f800,0xf800c800,0xf800faa0,0xf800c800,0xfaa0f800,0xfd00fd00,0xf800faa0,0xf800faa0,0xc800f800, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x39e79cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef9cd3,0x7bef7bef,0x39e79cd3,0x39e739e7,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x39e79cd3,0x39e739e7,0x7bef7bef,0x7bef7bef, +0x9cd37bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x39e79cd3,0x39e739e7,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x39e79cd3,0x39e739e7,0x7bef7bef,0x9cd39cd3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfaa0f800,0xfaa0fd00,0xfaa0faa0,0xf800faa0,0xfaa0faa0,0xfaa0f800,0xfaa0fd00,0xf800f800,0xfaa0f800,0xfaa0fd00,0xfaa0faa0,0xf800faa0,0xfaa0faa0,0xfaa0f800,0xfaa0fd00,0xf800f800, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x9cd37bef,0x9cd39cd3,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x7bef39e7,0x9cd39cd3,0x7bef7bef,0x7bef7bef, +0x39e77bef,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x7bef39e7,0x9cd39cd3,0x9cd37bef,0x7bef7bef,0x39e77bef,0x7bef7bef,0x9cd339e7,0x9cd39cd3,0x7bef39e7,0x9cd39cd3,0x9cd37bef,0x39e739e7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xffe0f800,0xfaa0ffe0,0xffe0ffe0,0xf800fd00,0xf800c800,0xfaa0f800,0xffe0ffe0,0xf800faa0,0xffe0f800,0xfaa0ffe0,0xffe0ffe0,0xf800fd00,0xf800c800,0xfaa0f800,0xffe0ffe0,0xf800faa0, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x39e77bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x39e739e7,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x39e739e7,0x9cd39cd3,0x39e739e7,0x7bef7bef,0x7bef7bef, +0x39e79cd3,0x7bef7bef,0x39e77bef,0x39e739e7,0x9cd39cd3,0x39e739e7,0x39e77bef,0x7bef7bef,0x39e79cd3,0x7bef7bef,0x39e77bef,0x39e739e7,0x9cd39cd3,0x39e739e7,0x39e77bef,0x7bef7bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfd00f800,0xfaa0ffe0,0xfd00faa0,0xf800faa0,0xf800f800,0xfaa0f800,0xffe0fd00,0xf800fd00,0xfd00f800,0xfaa0ffe0,0xfd00faa0,0xf800faa0,0xf800f800,0xfaa0f800,0xffe0fd00,0xf800fd00, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x39e79cd3,0x7bef7bef,0x39e739e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x39e79cd3,0x7bef7bef,0x39e739e7,0x7bef7bef,0x7bef9cd3,0x7bef7bef, +0x7bef39e7,0x7bef9cd3,0x39e79cd3,0x7bef7bef,0x39e739e7,0x7bef7bef,0x39e79cd3,0x7bef9cd3,0x7bef39e7,0x7bef9cd3,0x39e79cd3,0x7bef7bef,0x39e739e7,0x7bef7bef,0x39e79cd3,0x7bef9cd3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfaa0f800,0xf800faa0,0xf800f800,0xf800c800,0xfaa0faa0,0xf800faa0,0xfd00f800,0xf800faa0,0xfaa0f800,0xf800faa0,0xf800f800,0xf800c800,0xfaa0faa0,0xf800faa0,0xfd00f800,0xf800faa0, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x9cd339e7,0x7bef7bef,0x7bef39e7,0x9cd37bef,0x7bef39e7,0x7bef7bef, +0x7bef7bef,0x7bef39e7,0x9cd339e7,0x7bef7bef,0x7bef39e7,0x9cd37bef,0x7bef39e7,0x7bef39e7,0x7bef7bef,0x7bef39e7,0x9cd339e7,0x7bef7bef,0x7bef39e7,0x9cd37bef,0x7bef39e7,0x9cd339e7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0xfaa0f800,0xfaa0faa0,0xf800f800,0xffe0faa0,0xc800faa0,0xf800c800,0xf800faa0,0xf800f800,0xfaa0f800,0xfaa0faa0,0xf800f800,0xffe0faa0,0xc800faa0,0xf800c800,0xf800faa0, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x9cd339e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x9cd339e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x9cd339e7,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x9cd37bef,0x7bef7bef,0x9cd37bef,0x9cd339e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x7bef7bef,0x9cd37bef,0x9cd339e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x7bef7bef,0x9cd37bef,0x9cd339e7,0x9cd37bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x39e77bef,0x9cd37bef,0x9cd339e7,0x39e77bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x9cd339e7,0x39e77bef,0x9cd37bef,0x9cd339e7,0x39e77bef,0x7bef7bef,0x7bef7bef,0x9cd39cd3,0x9cd339e7,0x39e77bef,0x9cd37bef,0x9cd339e7,0x39e77bef,0x7bef7bef,0x39e77bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc800c800,0xfd00faa0,0xfd00ffe0,0xf800f800,0xffe0fd00,0xc800faa0,0xfaa0f800,0xfaa0faa0,0xc800c800,0xfd00faa0,0xfd00ffe0,0xf800f800,0xffe0fd00,0xc800faa0,0xfaa0f800,0xfaa0faa0, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e79cd3,0x39e77bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e79cd3,0x39e77bef,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x39e79cd3,0x39e77bef,0x9cd39cd3,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x39e77bef,0x9cd39cd3,0x39e79cd3,0x39e77bef,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x9cd39cd3,0x39e79cd3,0x39e77bef,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x9cd39cd3,0x39e79cd3,0x39e77bef,0x39e79cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x9cd39cd3,0x39e79cd3,0x39e77bef,0x39e79cd3,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x39e77bef,0x9cd39cd3,0x39e79cd3,0x39e77bef,0x39e79cd3,0x7bef7bef,0x7bef7bef,0x39e739e7,0x39e77bef,0x9cd39cd3,0x39e79cd3,0x39e77bef,0x39e79cd3,0x7bef7bef,0x7bef7bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc800c800,0xfaa0f800,0xfaa0fd00,0xc800c800,0xfaa0faa0,0xc800f800,0xfd00f800,0xfd00ffe0,0xc800c800,0xfaa0f800,0xfaa0fd00,0xc800c800,0xfaa0faa0,0xc800f800,0xfd00f800,0xfd00ffe0, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x39e739e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef39e7,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef39e7,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef39e7,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef39e7,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef39e7,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x9cd37bef, +0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef39e7,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x9cd37bef,0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef39e7,0x9cd37bef,0x39e739e7,0x7bef9cd3,0x9cd37bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xf800f800,0xfaa0f800,0xf800f800,0xf800fd00,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xf800f800,0xfaa0f800,0xf800f800,0xf800fd00, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x39e77bef,0x7bef7bef,0x7bef39e7,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x39e77bef,0x7bef7bef,0x9cd339e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x39e77bef,0x7bef7bef,0x9cd339e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x39e77bef,0x7bef7bef,0x9cd339e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x39e77bef,0x7bef9cd3,0x9cd339e7,0x39e79cd3, +0x9cd37bef,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x39e77bef,0x7bef9cd3,0x9cd339e7,0x39e79cd3,0x9cd39cd3,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x39e77bef,0x7bef9cd3,0x9cd339e7,0x39e79cd3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0xffe0fd00,0xfaa0faa0,0xf800c800,0xf800f800,0xfd00c800,0xfaa0fd00,0xf800faa0,0xf800f800,0xffe0fd00,0xfaa0faa0,0xf800c800,0xf800f800,0xfd00c800,0xfaa0fd00,0xf800faa0, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x39e77bef,0x7bef7bef,0x39e77bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd339e7,0x39e77bef,0x7bef7bef,0x39e77bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x9cd339e7,0x39e77bef,0x7bef7bef,0x39e77bef,0x7bef39e7,0x7bef7bef,0x9cd39cd3,0x7bef39e7,0x9cd339e7,0x39e77bef,0x7bef39e7,0x39e77bef,0x7bef39e7, +0x39e77bef,0x9cd39cd3,0x7bef39e7,0x9cd339e7,0x39e77bef,0x7bef39e7,0x39e77bef,0x7bef39e7,0x39e739e7,0x9cd39cd3,0x7bef39e7,0x9cd339e7,0x39e77bef,0x7bef39e7,0x39e77bef,0x7bef39e7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc800f800,0xfaa0f800,0xfaa0ffe0,0xfaa0faa0,0xffe0fd00,0xffe0faa0,0xfd00ffe0,0xf800faa0,0xc800f800,0xfaa0f800,0xfaa0ffe0,0xfaa0faa0,0xffe0fd00,0xffe0faa0,0xfd00ffe0,0xf800faa0, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e79cd3,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e79cd3,0x9cd39cd3,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef7bef,0x39e79cd3,0x9cd39cd3,0x7bef7bef,0x39e77bef,0x7bef7bef, +0x9cd37bef,0x39e739e7,0x7bef7bef,0x39e79cd3,0x9cd39cd3,0x7bef7bef,0x39e77bef,0x7bef7bef,0x9cd37bef,0x39e739e7,0x7bef7bef,0x39e79cd3,0x9cd39cd3,0x7bef7bef,0x39e77bef,0x7bef7bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0xf800faa0,0xfaa0faa0,0xffe0fd00,0xfaa0faa0,0xfaa0faa0,0xfaa0faa0,0xf800f800,0xf800f800,0xf800faa0,0xfaa0faa0,0xffe0fd00,0xfaa0faa0,0xfaa0faa0,0xfaa0faa0,0xf800f800, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x39e739e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd37bef,0x7bef39e7,0x39e739e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x9cd39cd3,0x7bef39e7,0x39e739e7,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x39e77bef,0x9cd37bef,0x9cd39cd3,0x7bef39e7,0x39e739e7,0x7bef9cd3,0x39e79cd3,0x7bef7bef,0x39e77bef,0x9cd37bef,0x9cd39cd3,0x7bef39e7,0x39e739e7,0x7bef9cd3,0x39e79cd3,0x7bef7bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfd00faa0,0xfaa0ffe0,0xf800c800,0xfaa0f800,0xfaa0f800,0xfd00ffe0,0xf800c800,0xf800f800,0xfd00faa0,0xfaa0ffe0,0xf800c800,0xfaa0f800,0xfaa0f800,0xfd00ffe0,0xf800c800,0xf800f800, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e77bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x39e739e7,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x39e77bef,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x7bef7bef,0x7bef7bef,0x39e79cd3,0x39e739e7,0x7bef9cd3,0x7bef7bef,0x7bef39e7,0x7bef39e7,0x7bef7bef,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xffe0faa0,0xfaa0ffe0,0xf800f800,0xf800c800,0xfaa0f800,0xfaa0ffe0,0xf800f800,0xc800c800,0xffe0faa0,0xfaa0ffe0,0xf800f800,0xf800c800,0xfaa0f800,0xfaa0ffe0,0xf800f800,0xc800c800, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef7bef, +0x7bef7bef,0x7bef7bef,0x7bef7bef,0x7bef39e7,0x7bef9cd3,0x7bef7bef,0x7bef7bef,0x7bef9cd3,0x7bef7bef,0x7bef39e7,0x7bef7bef,0x7bef39e7,0x7bef9cd3,0x7bef39e7,0x7bef39e7,0x7bef9cd3,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0xfd00c800,0xfaa0fd00,0xc800f800,0xc800c800,0xf800f800,0xf800faa0,0xc800f800,0xc800c800,0xfd00c800,0xfaa0fd00,0xc800f800,0xc800c800,0xf800f800,0xf800faa0,0xc800f800,0xc800c800, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x94d38c92,0xa534ad96,0x94f38cb2,0xb5b6adb6,0x94f39d14,0xad96a555,0x94d38cb2,0xadb6ad96,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xfaa0fd00,0xf800f800,0xf800f800,0xc800c800,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xfaa0fd00,0xf800f800,0xf800f800,0xc800c800,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xfaa0fd00,0xf800f800,0xf800f800,0xc800c800, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xb5b6b5b6,0x9d149d34,0xa534adb6,0xa575a555,0xad96bdf7,0x94f394f3,0xa575a534,0x8cb294f3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800c800,0xf800faa0,0xf800c800,0xfaa0f800,0xfd00fd00,0xf800faa0,0xf800faa0,0xc800f800,0xf800c800,0xf800faa0,0xf800c800,0xfaa0f800,0xfd00fd00,0xf800faa0,0xf800faa0,0xc800f800,0xf800c800,0xf800faa0,0xf800c800,0xfaa0f800,0xfd00fd00,0xf800faa0,0xf800faa0,0xc800f800, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa555a575,0xbdf7b5b6,0xa575ad96,0x9d14a534,0x9d148451,0xadb6a575,0x9d149d14,0xb5d7adb6,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfaa0f800,0xfaa0fd00,0xfaa0faa0,0xf800faa0,0xfaa0faa0,0xfaa0f800,0xfaa0fd00,0xf800f800,0xfaa0f800,0xfaa0fd00,0xfaa0faa0,0xf800faa0,0xfaa0faa0,0xfaa0f800,0xfaa0fd00,0xf800f800,0xfaa0f800,0xfaa0fd00,0xfaa0faa0,0xf800faa0,0xfaa0faa0,0xfaa0f800,0xfaa0fd00,0xf800f800, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x94f394f3,0x84718451,0xb5b6ad96,0x84518cb2,0xad759d34,0xa575a534,0xbdf7bdf7,0x8492a555,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xffe0f800,0xfaa0ffe0,0xffe0ffe0,0xf800fd00,0xf800c800,0xfaa0f800,0xffe0ffe0,0xf800faa0,0xffe0f800,0xfaa0ffe0,0xffe0ffe0,0xf800fd00,0xf800c800,0xfaa0f800,0xffe0ffe0,0xf800faa0,0xffe0f800,0xfaa0ffe0,0xffe0ffe0,0xf800fd00,0xf800c800,0xfaa0f800,0xffe0ffe0,0xf800faa0, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x94d38cb2,0xa555a555,0x94f394f3,0xa575ad75,0x94d38cb2,0xa55594f3,0x84718471,0xa5559514,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfd00f800,0xfaa0ffe0,0xfd00faa0,0xf800faa0,0xf800f800,0xfaa0f800,0xffe0fd00,0xf800fd00,0xfd00f800,0xfaa0ffe0,0xfd00faa0,0xf800faa0,0xf800f800,0xfaa0f800,0xffe0fd00,0xf800fd00,0xfd00f800,0xfaa0ffe0,0xfd00faa0,0xf800faa0,0xf800f800,0xfaa0f800,0xffe0fd00,0xf800fd00, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xadb6ad96,0xa575a575,0xadb6b5f7,0xa555a575,0xad96adb6,0xa5349d14,0x9d34a555,0x9d348cb2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfaa0f800,0xf800faa0,0xf800f800,0xf800c800,0xfaa0faa0,0xf800faa0,0xfd00f800,0xf800faa0,0xfaa0f800,0xf800faa0,0xf800f800,0xf800c800,0xfaa0faa0,0xf800faa0,0xfd00f800,0xf800faa0,0xfaa0f800,0xf800faa0,0xf800f800,0xf800c800,0xfaa0faa0,0xf800faa0,0xfd00f800,0xf800faa0, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x9d1494f3,0xad969514,0x84718451,0xa5559d14,0xa55594d3,0xbdf7bdf7,0xa5759d14,0xb5d7bdf7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0xfaa0f800,0xfaa0faa0,0xf800f800,0xffe0faa0,0xc800faa0,0xf800c800,0xf800faa0,0xf800f800,0xfaa0f800,0xfaa0faa0,0xf800f800,0xffe0faa0,0xc800faa0,0xf800c800,0xf800faa0,0xf800f800,0xfaa0f800,0xfaa0faa0,0xf800f800,0xffe0faa0,0xc800faa0,0xf800c800,0xf800faa0, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa575a575,0x94f38c92,0xa555ad96,0x94f394d3,0x9d1494f3,0x849294f3,0x9d149d34,0x8cb28cb2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc800c800,0xfd00faa0,0xfd00ffe0,0xf800f800,0xffe0fd00,0xc800faa0,0xfaa0f800,0xfaa0faa0,0xc800c800,0xfd00faa0,0xfd00ffe0,0xf800f800,0xffe0fd00,0xc800faa0,0xfaa0f800,0xfaa0faa0,0xc800c800,0xfd00faa0,0xfd00ffe0,0xf800f800,0xffe0fd00,0xc800faa0,0xfaa0f800,0xfaa0faa0, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x94f394f3,0xbdf7b5d7,0xa555a575,0xad96adb6,0x94f38cb2,0xadb6a575,0xa555a555,0xad96adb6,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc800c800,0xfaa0f800,0xfaa0fd00,0xc800c800,0xfaa0faa0,0xc800f800,0xfd00f800,0xfd00ffe0,0xc800c800,0xfaa0f800,0xfaa0fd00,0xc800c800,0xfaa0faa0,0xc800f800,0xfd00f800,0xfd00ffe0,0xc800c800,0xfaa0f800,0xfaa0fd00,0xc800c800,0xfaa0faa0,0xc800f800,0xfd00f800,0xfd00ffe0, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xb5f7b5d7,0xa575ad96,0x9d349d34,0xa5349d14,0xb5f7ad96,0x9d14a555,0xbdf7bdf7,0xa534a575,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xf800f800,0xfaa0f800,0xf800f800,0xf800fd00,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xf800f800,0xfaa0f800,0xf800f800,0xf800fd00,0xf800c800,0xf800faa0,0xf800f800,0xc800c800,0xf800f800,0xfaa0f800,0xf800f800,0xf800fd00, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x84718c92,0xadb694d3,0x845194d3,0x94f394d3,0x845194d3,0x9d1494f3,0x94f38492,0x95148cb2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0xffe0fd00,0xfaa0faa0,0xf800c800,0xf800f800,0xfd00c800,0xfaa0fd00,0xf800faa0,0xf800f800,0xffe0fd00,0xfaa0faa0,0xf800c800,0xf800f800,0xfd00c800,0xfaa0fd00,0xf800faa0,0xf800f800,0xffe0fd00,0xfaa0faa0,0xf800c800,0xf800f800,0xfd00c800,0xfaa0fd00,0xf800faa0, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x9d14a555,0x9d3494d3,0xa575ad75,0x84518471,0xa53494f3,0x8cb294f3,0xad75ad75,0x84718cb2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xc800f800,0xfaa0f800,0xfaa0ffe0,0xfaa0faa0,0xffe0fd00,0xffe0faa0,0xfd00ffe0,0xf800faa0,0xc800f800,0xfaa0f800,0xfaa0ffe0,0xfaa0faa0,0xffe0fd00,0xffe0faa0,0xfd00ffe0,0xf800faa0,0xc800f800,0xfaa0f800,0xfaa0ffe0,0xfaa0faa0,0xffe0fd00,0xffe0faa0,0xfd00ffe0,0xf800faa0, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x94f39d34,0xadb6a575,0x94f39d14,0xadb69d34,0x9d1494d3,0xadb6adb6,0x94f39d34,0xad96bdf7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0xf800faa0,0xfaa0faa0,0xffe0fd00,0xfaa0faa0,0xfaa0faa0,0xfaa0faa0,0xf800f800,0xf800f800,0xf800faa0,0xfaa0faa0,0xffe0fd00,0xfaa0faa0,0xfaa0faa0,0xfaa0faa0,0xf800f800,0xf800f800,0xf800faa0,0xfaa0faa0,0xffe0fd00,0xfaa0faa0,0xfaa0faa0,0xfaa0faa0,0xf800f800, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xadb6ad96,0x9d149d14,0xadb6b5b6,0x9d14a534,0xadb6a575,0xa575a575,0xb5d7b5b6,0xa555a575,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfd00faa0,0xfaa0ffe0,0xf800c800,0xfaa0f800,0xfaa0f800,0xfd00ffe0,0xf800c800,0xf800f800,0xfd00faa0,0xfaa0ffe0,0xf800c800,0xfaa0f800,0xfaa0f800,0xfd00ffe0,0xf800c800,0xf800f800,0xfd00faa0,0xfaa0ffe0,0xf800c800,0xfaa0f800,0xfaa0f800,0xfd00ffe0,0xf800c800,0xf800f800, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa5559d34,0xbdf7b5d7,0xa575ad96,0x9d149d14,0x8c928cb2,0x9d1494f3,0x8c927c51,0x9d1494f3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xffe0faa0,0xfaa0ffe0,0xf800f800,0xf800c800,0xfaa0f800,0xfaa0ffe0,0xf800f800,0xc800c800,0xffe0faa0,0xfaa0ffe0,0xf800f800,0xf800c800,0xfaa0f800,0xfaa0ffe0,0xf800f800,0xc800c800,0xffe0faa0,0xfaa0ffe0,0xf800f800,0xf800c800,0xfaa0f800,0xfaa0ffe0,0xf800f800,0xc800c800, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x94f394d3,0x8cb28cb2,0xad759d34,0x94f394d3,0xa575a555,0x8cb28471,0xa534a534,0x8c928cb2,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0xfd00c800,0xfaa0fd00,0xc800f800,0xc800c800,0xf800f800,0xf800faa0,0xc800f800,0xc800c800,0xfd00c800,0xfaa0fd00,0xc800f800,0xc800c800,0xf800f800,0xf800faa0,0xc800f800,0xc800c800,0xfd00c800,0xfaa0fd00,0xc800f800,0xc800c800,0xf800f800,0xf800faa0,0xc800f800,0xc800c800, +0xdeb4e6d5,0xc5cedeb3,0xe6d5de94,0xc5cede93,0xde94deb4,0xc5cede73,0xdeb4de93,0xe6f5deb4,0x23512330,0x2bb22bf4,0x23912350,0x2c142bf4,0x23712392,0x2bf42bd3,0x23512350,0x2bf42bf4,0xebc5eb84,0xec06ec48,0xebc6eba5,0xec48ec48,0xebc6ebe6,0xec48ec07,0xebc5eba5,0xec48ec28,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xe6d4e6d4,0xef16d673,0xdeb4c5ce,0xc5ced673,0xc5cece31,0xdeb4ce31,0xeef6c5ce,0xdeb4de93,0x2c142c14,0x239223b2,0x2bb22bf4,0x2bd32bd3,0x2bf42c35,0x23712371,0x2bd32bb2,0x23502391,0xec48ec48,0xebe6ec06,0xec06ec48,0xec28ec07,0xec28ec69,0xebc5ebc5,0xec27ec06,0xeba5ebc6,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x3b7f3b7f, +0xe6b4e6d4,0xc5ceef16,0xde94c5ce,0xc5cede93,0xce31d672,0xde94de93,0xc5cee6d4,0xde94eef6,0x2bd32bd3,0x2c352c14,0x2bd32bf4,0x23922bb2,0x2392230f,0x2bf42bd3,0x23922392,0x2c352bf4,0xec07ec27,0xec69ec48,0xec27ec48,0xebe6ec06,0xebe6e342,0xec48ec27,0xebe6ebe6,0xec69ec48,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1abf1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff, +0xce31deb4,0xe6d5c5ce,0xce31ce31,0xd672c5ce,0xc5ced652,0xdeb3ef16,0xded4d672,0xce31c5ce,0x23712391,0x2330230f,0x2c142bf4,0x230f2330,0x2bd323b2,0x2bd32bb2,0x2c352c35,0x23302bd3,0xebc6ebc6,0xe363e342,0xec48ec48,0xe342eba4,0xec28ec06,0xec27ec06,0xec69ec69,0xeb63ec07,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff22ff,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff22ff,0x22ff22ff,0x1abf1abf,0x1abf1abf, +0xef16c5ce,0xe6d4ef16,0xe6d4de93,0xc5cee6d4,0xef16d673,0xef16c5ce,0xc5cede94,0xdeb4deb4,0x23512350,0x2bb32bb3,0x23912371,0x2bd32bd3,0x23512350,0x2bd32371,0x230f230f,0x2bd32391,0xebc5eba4,0xec07ec07,0xebc6ebc6,0xec27ec28,0xebc5eba5,0xec07ebc5,0xe363e363,0xec07ebc6,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xc5ced652,0xd673d672,0xe6d4deb4,0xde94c5ce,0xd673deb4,0xef16c5ce,0xce31deb4,0xdeb3e6d4,0x2c142bf4,0x2bd32bd3,0x2bf42c35,0x2bd32bd3,0x2bf42c14,0x2bb22392,0x23b22bd3,0x23b22350,0xec48ec48,0xec27ec27,0xec48ec69,0xec07ec27,0xec28ec48,0xec06ebe6,0xec06ec07,0xec06eba4,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x3b7f22ff,0x1abf3b7f,0x3b7f1abf,0x1abf22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x3b7f22ff,0x1abf3b7f,0x3b7f1abf,0x1abf22ff,0x1abf1abf, +0xdeb3d673,0xd652ce31,0xdeb4de94,0xd652c5cf,0xd672e6d4,0xc5cece32,0xce31c5ee,0xd673e6d4,0x23922371,0x2bf42391,0x2330230f,0x2bb32392,0x2bd32351,0x2c352c35,0x2bd32392,0x2c352c35,0xebe6ebc5,0xec28ebc6,0xe363e342,0xec07ebe6,0xec07ebc5,0xec69ec69,0xec27ebe6,0xec69ec69,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x536e536e,0x00000000,0x536e0000,0x0000536e,0x00000000,0x536e536e,0x00000000,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f22ff,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f22ff,0x22ff3b7f,0x22ff22ff, +0xd652d672,0xde94c5ce,0xe6d4e6d4,0xd673ce31,0xc5cede94,0xde93c5ce,0xc5ceef36,0xd672de94,0x2bd32bd3,0x23712330,0x2bd32bf4,0x23912351,0x23922371,0x23302371,0x239223b2,0x23302350,0xec27ec27,0xebc5eba4,0xec07ec48,0xebc6ebc5,0xebe6ebc5,0xeb63ebc5,0xebe6ec06,0xeba4eba4,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x7cb30000,0xbe59d6fb,0x0000536e,0xd6fb7cb3,0x536ebe59,0x7cb30000,0xbe59d6fb,0x0000536e,0x22ff22ff,0x22ff3b7f,0x22ff22ff,0x22ff22ff,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff3b7f,0x22ff22ff,0x22ff22ff,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xc5cee6f4,0xd651eef6,0xc5cec5ce,0xd652d652,0xe6d4c5ce,0xdeb4deb4,0xe6f5deb4,0xe6f5c5ce,0x23712371,0x2c352c35,0x2bd32bd3,0x2bf42bf4,0x23712350,0x2bf42bd3,0x2bd32bd3,0x2bf42c14,0xebc6ebc6,0xec69ec69,0xec07ec27,0xec48ec48,0xebc5eba5,0xec48ec28,0xec07ec07,0xec48ec48,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x7cb30000,0xd6fbffff,0x0000536e,0xffff7cb3,0x536ed6fb,0x7cb30000,0xd6fbffff,0x0000536e,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x22ff1abf,0x3b7f22ff,0x22ff3b7f,0x1abf22ff,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x22ff1abf,0x3b7f22ff,0x22ff3b7f,0x1abf22ff, +0xdeb3c5ce,0xeef6de93,0xd651d673,0xe6d5c5ce,0xde93c5ce,0xd652e6d4,0xce31ce31,0xc5ceeef6,0x2c352c35,0x2bd32bf4,0x23b223b2,0x2bb22392,0x2c352bf4,0x23922bd3,0x2c352c35,0x2bb22bd3,0xec69ec69,0xec28ec28,0xec06ec06,0xec06ebe6,0xec69ec28,0xebe6ec07,0xec69ec69,0xec06ec27,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x7cb37cb3,0x00000000,0x7cb30000,0x00007cb3,0x00000000,0x7cb37cb3,0x00000000,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f, +0xc5ced673,0xde94d673,0xd651de94,0xc5cec5ce,0xde94e6f4,0xc5cede93,0xde93d653,0xd653ce32,0x230f2330,0x2bf42371,0x230f2351,0x23712351,0x230f2351,0x23922371,0x23712330,0x23912350,0xe363eba4,0xec48ebc5,0xe342ebc5,0xebc6eba5,0xe342ebc5,0xebe6ebc6,0xebc5eb63,0xebc6eba5,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x22ff3b7f,0x1abf22ff,0x22ff22ff,0x22ff22ff,0x1abf3b7f,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff3b7f,0x1abf22ff,0x22ff22ff,0x22ff22ff,0x1abf3b7f,0x1abf1abf,0x3b7f1abf,0x1abf1abf, +0xc5cede93,0xde94eef6,0xd651d673,0xef16ef16,0xce31c5ce,0xeef6ce31,0xe6d4e6d4,0xde94de93,0x23922bd3,0x23b22351,0x2bd32bd3,0x230f2330,0x2bb22371,0x23302371,0x2bd32bd3,0x23302350,0xebe6ec07,0xec06ebc5,0xec28ec28,0xe342e363,0xec06ebc5,0xeba4ebc5,0xec28ec28,0xe363eba4,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x22ff22ff,0x1abf22ff,0x1abf22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x22ff22ff,0x1abf22ff,0x1abf22ff, +0xdeb3ce31,0xeef6c5ce,0xc5ceeef6,0xdeb4de93,0xd672d651,0xc5ced693,0xe6f4eef6,0xd652de93,0x237123b2,0x2bf42bd3,0x23912392,0x2bf423b2,0x23922351,0x2bf42bf4,0x237123b2,0x2bf42c35,0xebc6ec06,0xec48ec28,0xebc6ebe6,0xec48ec06,0xebe6ebc5,0xec48ec48,0xebc6ec06,0xec48ec69,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x3b7f1abf,0x22ff3b7f,0x3b7f22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f1abf,0x22ff3b7f,0x3b7f22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff, +0xe6b4ce31,0xc5cede93,0xd653c5ce,0xd652ce32,0xd652c5ce,0xe6f4ce32,0xef35c5ce,0xc5cee6d4,0x2bf42bf4,0x23922392,0x2bf42c14,0x23922bb2,0x2bf42bd3,0x2bd32bd3,0x2c352c14,0x2bd32bd3,0xec48ec28,0xebe6ebe6,0xec48ec48,0xebe6ec06,0xec48ec27,0xec27ec27,0xec69ec48,0xec07ec27,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1abf1abf,0x22ff22ff,0x3b7f22ff,0x22ff22ff,0x22ff22ff,0x3b7f1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f22ff,0x22ff22ff,0x22ff22ff,0x3b7f1abf,0x1abf3b7f,0x1abf1abf, +0xc5cee6f5,0xe6b4de94,0xd653c5ce,0xc5ced673,0xdeb4deb3,0xd673d653,0xc5ced673,0xe716c5ce,0x2bd323b2,0x2c352c35,0x2bd32bf4,0x23922392,0x23302350,0x23922371,0x23301aef,0x23922371,0xec07ec06,0xec69ec69,0xec27ec28,0xebe6ebe6,0xeb84eba5,0xebe6ebc5,0xeba4e342,0xebe6ebc6,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x22ff1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x1abf1abf, +0xde94ef15,0xc5cece31,0xde94e6d5,0xc5ceef16,0xe6d4d673,0xdeb4deb4,0xdeb4c5ce,0xdeb4deb4,0x23712351,0x23502350,0x2bd323b2,0x23712351,0x2bd32bd3,0x23502330,0x2bb22bb2,0x23302350,0xebc6eba5,0xeba5eba4,0xec28ec06,0xebc5ebc5,0xec27ec07,0xeba4e363,0xec06ec06,0xeb84eba4,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f, +0xef16e717,0xdeb4ce31,0xc610c610,0xe6d5c5cf,0xde93e6d4,0xce30c5ce,0xef36eef6,0xef37c5ee,0x71767155,0x81998a19,0x79977176,0x923a8a19,0x79777998,0x8a1981b9,0x71767176,0x8a1989f9,0xb9d8b1b7,0xc279c2f9,0xba19b9d8,0xcb3ac2fa,0xb9f8ba39,0xc2f9c299,0xb9d8b9d8,0xc2fac2d9,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xc610ce32,0xce31e6d5,0xe716de94,0xbdaeded6,0xce0fe6f6,0xe6d5ded5,0xbd8dc610,0xbdaddeb4,0x8a3a8a3a,0x79988198,0x81998a19,0x89d981b9,0x89f9927a,0x79777977,0x81d98199,0x71767997,0xc31acb1a,0xba19c259,0xc279c2fa,0xc2b9c299,0xc2d9cb5a,0xb9f8b9f8,0xc2b9c279,0xb9d8ba19,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x3b7f3b7f, +0xe6f7e6f6,0xc5efd673,0xde94d674,0xdeb5de93,0xd694c5ce,0xd673d673,0xe6f6c5ce,0xde94ded5,0x81b981d9,0x927a923a,0x81d98a19,0x79988199,0x79986954,0x8a1981d9,0x79987998,0x925a8a19,0xc299c2b9,0xcb5acb3a,0xc2b9c2f9,0xba19c279,0xba39a196,0xc2fac2b9,0xba39ba39,0xcb5ac2fa,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x1abf1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff, +0xe6f7ef16,0xce31e6d5,0xef37ef16,0xef16ef16,0xef38c5ce,0xde95eef6,0xe6f6ce31,0xe6d6e717,0x79777997,0x69556954,0x8a3a8a19,0x69547176,0x89d98198,0x81d98199,0x927a927a,0x715581b9,0xb9f8ba19,0xa9b6a196,0xcb1ac2f9,0xa196b1b7,0xc2b9ba59,0xc2b9c279,0xcb5acb5a,0xa9b7c299,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff22ff,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff22ff,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff22ff,0x22ff22ff,0x1abf1abf,0x1abf1abf, +0xef37c5ce,0xe6d5ef37,0xbdadce10,0xc5eec5ee,0xc5cede93,0xef17c5ce,0xe6d4c5ee,0xef37ef37,0x71767176,0x81998199,0x79977977,0x81d989d9,0x71767176,0x81b97977,0x69546954,0x81b97997,0xb9d8b1d8,0xc279c279,0xba19b9f8,0xc2b9c2b9,0xb9d8b9d8,0xc299b9f8,0xa9b6a9b6,0xc299ba19,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xc5efde93,0xc5efc5ef,0xce30d673,0xde93de93,0xde93e6f6,0xce10deb4,0xc5eeded5,0xc5aec5ee,0x8a198a19,0x81d981d9,0x8a19927a,0x81b981d9,0x89f98a19,0x81997998,0x819881b9,0x81987176,0xc2fac2f9,0xc2b9c2b9,0xc2facb5a,0xc299c2b9,0xc2d9c2fa,0xc279ba19,0xba59c299,0xc259b1d8,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x3b7f22ff,0x1abf3b7f,0x3b7f1abf,0x1abf22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x3b7f22ff,0x1abf3b7f,0x3b7f1abf,0x1abf22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x3b7f22ff,0x1abf3b7f,0x3b7f1abf,0x1abf22ff,0x1abf1abf, +0xe6d5d673,0xe6d5e6d5,0xc5eede93,0xdeb5eef6,0xdeb5e6d5,0xc5cdd673,0xded5e6f6,0xded5c5cf,0x79987977,0x89f97997,0x69556954,0x81997998,0x81b97176,0x927a927a,0x81d97998,0x925a927a,0xba19b9f8,0xc2d9ba19,0xa9b6a196,0xc279ba19,0xc299b9d8,0xcb5acb5a,0xc2b9ba39,0xcb3acb5a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f22ff,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f22ff,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f22ff,0x22ff3b7f,0x22ff22ff, +0xde94ef37,0xde94e6d5,0xc5efdeb4,0xef17ef16,0xde93de95,0xd651e6d5,0xef16f757,0xef37c5ef,0x81d981d9,0x79777175,0x81b98a19,0x79977176,0x79987977,0x71557977,0x79988198,0x71767176,0xc2b9c2b9,0xb9f8b1b7,0xc299c2f9,0xba19b9d8,0xba19b9f8,0xa9b7b9f8,0xba19ba59,0xb1b7b1b8,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff22ff,0x22ff3b7f,0x22ff22ff,0x22ff22ff,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff3b7f,0x22ff22ff,0x22ff22ff,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x22ff3b7f,0x22ff22ff,0x22ff22ff,0x1abf22ff,0x1abf1abf,0x1abf1abf,0x1abf1abf, +0xf758c5ce,0xeef6ef16,0xef37f758,0xc610ce31,0xef16ef16,0xc610f757,0xce10ce32,0xef37c5cf,0x79777977,0x927a925a,0x81b981d9,0x8a198a19,0x79777176,0x8a1989d9,0x81b981b9,0x8a198a19,0xb9f8b9f8,0xcb5acb5a,0xc299c2b9,0xc2f9c2fa,0xb9f8b9d8,0xc2fac2b9,0xc299c299,0xc2f9c2fa,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x22ff1abf,0x3b7f22ff,0x22ff3b7f,0x1abf22ff,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x22ff1abf,0x3b7f22ff,0x22ff3b7f,0x1abf22ff,0x22ff1abf,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x22ff1abf,0x3b7f22ff,0x22ff3b7f,0x1abf22ff, +0xce51de94,0xce31ce51,0xce31ce2f,0xe6f6ded6,0xc5eebdae,0xe6d5c610,0xd693ded5,0xc5cfdeb5,0x927a925a,0x89d989f9,0x81988198,0x81997998,0x927a89f9,0x799881b9,0x927a927a,0x819981d9,0xcb5acb5a,0xc2b9c2d9,0xba59ba59,0xc279ba39,0xcb5ac2d9,0xba19c299,0xcb5acb5a,0xc279c2b9,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f,0x22ff22ff,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff1abf,0x3b7f22ff,0x3b7f3b7f, +0xd673d694,0xdeb3d673,0xe6d5ce2f,0xef16deb4,0xc5eedeb4,0xde93e6d5,0xdeb4de93,0xc5cfdeb5,0x69547175,0x8a197977,0x69547176,0x79777176,0x69547176,0x79987977,0x79777155,0x79977176,0xa9b6b1b7,0xc2fab9d8,0xa196b9d8,0xb9f8b9d8,0xa196b9d8,0xba19b9f8,0xb9f8a9b7,0xba19b9d8,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff3b7f,0x1abf22ff,0x22ff22ff,0x22ff22ff,0x1abf3b7f,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff3b7f,0x1abf22ff,0x22ff22ff,0x22ff22ff,0x1abf3b7f,0x1abf1abf,0x3b7f1abf,0x1abf1abf,0x22ff3b7f,0x1abf22ff,0x22ff22ff,0x22ff22ff,0x1abf3b7f,0x1abf1abf,0x3b7f1abf,0x1abf1abf, +0xde94ce30,0xd673de93,0xded4ce2f,0xe6d4e6f5,0xc5cede73,0xd673e6d5,0xe6f6deb4,0xdeb4d673,0x799881b9,0x81987176,0x89d989d9,0x69546955,0x81997977,0x71767977,0x89d989d9,0x69557176,0xba39c299,0xc259b9d8,0xc2b9c2b9,0xa196a9b6,0xc279b9f8,0xb1b7b9f8,0xc2b9c2b9,0xa9b6b1d8,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x22ff22ff,0x1abf22ff,0x1abf22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x22ff22ff,0x1abf22ff,0x1abf22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x3b7f1abf,0x22ff22ff,0x1abf22ff,0x1abf22ff, +0xf778ce11,0xef36e6f6,0xf758ce2f,0xf757f757,0xe6f6ef17,0xf757bdad,0xe6f6e6f6,0xf757f757,0x79778198,0x8a1989d9,0x79977998,0x8a198198,0x79987176,0x8a198a19,0x79778198,0x8a19927a,0xb9f8c259,0xc2fac2b9,0xba19ba19,0xc2faba59,0xba19b9d8,0xc2fac2fa,0xb9f8c259,0xc2f9cb5a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x3b7f1abf,0x22ff3b7f,0x3b7f22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f1abf,0x22ff3b7f,0x3b7f22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f1abf,0x22ff3b7f,0x3b7f22ff,0x3b7f3b7f,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff, +0xd673c610,0xc5f0d651,0xc610ce10,0xc5f0ce31,0xc60fc610,0xc5cec5cf,0xce52ce30,0xc5cfc5f1,0x8a1989f9,0x79987998,0x8a198a3a,0x79988199,0x8a1981d9,0x81d981d9,0x925a923a,0x81b981d9,0xc2fac2d9,0xba39ba19,0xc2facb1a,0xba19c279,0xc2fac2b9,0xc2b9c2b9,0xcb5acb3a,0xc299c2b9,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x1abf1abf,0x22ff22ff,0x3b7f22ff,0x22ff22ff,0x22ff22ff,0x3b7f1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f22ff,0x22ff22ff,0x22ff22ff,0x3b7f1abf,0x1abf3b7f,0x1abf1abf,0x1abf1abf,0x22ff22ff,0x3b7f22ff,0x22ff22ff,0x22ff22ff,0x3b7f1abf,0x1abf3b7f,0x1abf1abf, +0xd674e6d5,0xde94de94,0xd674de94,0xce32d653,0xd673d673,0xde94de93,0xe6f6d673,0xe6f5e6f6,0x81b98198,0x927a925a,0x81d989f9,0x79987998,0x71557176,0x79987977,0x71756954,0x79987977,0xc299c259,0xcb5acb3a,0xc2b9c2d9,0xba19ba19,0xb1b7b9d8,0xba19b9f8,0xb1b7a195,0xba39b9f8,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x22ff1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x1abf1abf,0x22ff1abf,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x22ff22ff,0x1abf1abf, +0xef16eef6,0xe6f6ef16,0xe6d5e6b5,0xef16f757,0xf757ef16,0xef16ef16,0xf757ef16,0xef16f757,0x79777176,0x71767176,0x89d98198,0x79777176,0x81d981b9,0x71766955,0x81998199,0x71557176,0xb9f8b9d8,0xb9d8b1b8,0xc2b9ba59,0xb9f8b9d8,0xc2b9c299,0xb1d8a9b6,0xc279c279,0xb1b7b1d8,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f,0x22ff3b7f,0x1abf22ff,0x1abf1abf,0x22ff22ff,0x22ff22ff,0x22ff22ff,0x3b7f3b7f,0x3b7f3b7f, +0xe6d4ef15,0xdeb3deb4,0xe6b4de73,0xd673de94,0xdeb4d673,0xe6f5d693,0xded4de93,0xdeb4deb4,0x21712170,0x21b329d4,0x21922171,0x29d529d4,0x21922192,0x29d429b3,0x21712171,0x29d429b4,0x53f94b99,0x6c7a7cdb,0x5c1a53d9,0x851b7cdb,0x5c1a643a,0x7cdb6c9a,0x53f953d9,0x7cdb7cdb,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe6d4e6d4,0xe6d4de93,0xded4de94,0xce52d673,0xde93d653,0xdeb4d693,0xe6f5deb4,0xdeb4deb4,0x29d529d5,0x21922193,0x21b329d4,0x29b429b3,0x29b429d6,0x21922192,0x29b421b3,0x21712192,0x84fb851b,0x643a6c7a,0x6c7a7cdb,0x74bb6c9a,0x7cdb8d5b,0x5c1a5c1a,0x749a6c7a,0x53d95c1a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdeb4e6d5,0xded5d673,0xd674de94,0xd693d653,0xd673d673,0xd673deb3,0xdeb4de94,0xe6d4deb3,0x29b329b4,0x29d629d5,0x29b429d4,0x219221b3,0x2192214f,0x29d429b4,0x21922192,0x29d529d4,0x6c9a749a,0x8d5b851b,0x749a7cdb,0x643a6c7a,0x645a3b59,0x7cdb749a,0x645a643a,0x8d3b7cdb,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdeb4deb4,0xdeb4de94,0xded4de94,0xd672deb3,0xd672ce31,0xce32d652,0xde93d652,0xde93e6d4,0x21922192,0x2150214f,0x29d529d4,0x214f2171,0x29b42193,0x29b421b3,0x29d629d6,0x217029b3,0x5c1a5c1a,0x43793b59,0x851b7cdb,0x3b584bb9,0x74bb645a,0x749a6c7a,0x8d5b8d5b,0x43996c9a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe6d4de93,0xdeb4deb4,0xde73d673,0xce32e6b4,0xd673d673,0xd673d652,0xde94deb4,0xdeb3d673,0x21712171,0x29b329b3,0x21922192,0x29b429b4,0x21712171,0x29b32192,0x21502150,0x29b32192,0x53f953d9,0x6c7a6c7a,0x5c1a5c1a,0x749a74bb,0x53f953d9,0x6c9a5c1a,0x43794379,0x6c9a5c1a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdeb3ce32,0xde93d693,0xe6d5d673,0xde93deb4,0xded3de93,0xce31deb3,0xef16e6d4,0xd652e6f5,0x29d529d4,0x29b429b4,0x29d429d6,0x29b329b4,0x29b429d5,0x21b32192,0x219329b3,0x21932171,0x7cfb7cdb,0x749a749a,0x7cdb8d3b,0x6c9a749a,0x7cdb7cfb,0x6c7a643a,0x645a6c9a,0x6c7a53d9,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd672d652,0xd673d652,0xe6d4deb4,0xce32de93,0xd673e6d4,0xdeb4d672,0xdeb4e6f5,0xde93deb4,0x21922192,0x29b42192,0x2150214f,0x29b32192,0x29b32171,0x29d629d6,0x29b42192,0x29d529d6,0x643a5c1a,0x7cdb5c1a,0x43793b59,0x6c7a643a,0x6c9a53f9,0x8d5b8d5b,0x749a645a,0x8d3b8d5b,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd672de93,0xde94deb4,0xe6b4de93,0xde94deb4,0xde93de94,0xe6d4deb3,0xe6f5e6f5,0xd693e6d4,0x29b429b4,0x21922170,0x29b329d4,0x21922171,0x21922192,0x21702192,0x21922193,0x21712171,0x749a749a,0x5c1a4bb9,0x6c9a7cdb,0x5c1a53f9,0x643a5c1a,0x43995c1a,0x643a645a,0x4bb94bb9,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd673deb4,0xce52deb4,0xd673de93,0xd652d652,0xdeb4deb4,0xde94e6f4,0xdeb4de93,0xde94deb4,0x21922192,0x29d629d5,0x29b329b4,0x29d429d4,0x21922171,0x29d429b4,0x29b329b3,0x29d429d5,0x5c1a5c1a,0x8d5b8d3b,0x6c9a749a,0x7cdb7cdb,0x5c1a53d9,0x7cdb74bb,0x6c9a6c9a,0x7cdb7cfb,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdeb4d673,0xd673deb4,0xd652deb3,0xe6f6d673,0xde93de94,0xde93e6d4,0xdeb4d673,0xde94de94,0x29d629d5,0x29b429b4,0x21932193,0x21b32192,0x29d629b4,0x219229b3,0x29d629d6,0x21b329b4,0x8d3b8d3b,0x74bb7cdb,0x645a645a,0x6c7a643a,0x8d3b7cdb,0x643a6c9a,0x8d5b8d5b,0x6c7a749a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xde93d652,0xce32de93,0xd673ce32,0xef36e6d5,0xd653deb4,0xd673de73,0xde93de93,0xde93de94,0x21502170,0x29d42191,0x214f2171,0x21922171,0x214f2171,0x21922192,0x21922170,0x21922171,0x43794bb9,0x7cdb53f9,0x3b5853f9,0x5c1a53d9,0x3b5853f9,0x643a5c1a,0x5c1a4399,0x5c1a53d9,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd672de93,0xd652deb3,0xde93d693,0xe6d4deb4,0xdeb3d652,0xd693de93,0xdeb4e6f4,0xd673deb4,0x219229b3,0x21932171,0x29b429b4,0x214f2150,0x21b32192,0x21712192,0x29b429b4,0x21502171,0x643a6c9a,0x6c7a53f9,0x74bb74bb,0x3b584379,0x6c7a5c1a,0x4bb95c1a,0x74bb74bb,0x437953d9,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xde93e6d4,0xde93deb3,0xde73d673,0xe6b4de93,0xde93d672,0xdeb3d652,0xdeb4e6f4,0xd652deb4,0x21922193,0x29d429b4,0x21922192,0x29d42193,0x21922171,0x29d429d4,0x21922193,0x29d429d6,0x5c1a6c7a,0x7cdb74bb,0x5c1a643a,0x7cdb645a,0x643a53f9,0x7cdb7cdb,0x5c1a6c7a,0x7cdb8d5b,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd673deb4,0xde93deb4,0xce33ce52,0xd652ce32,0xd693d672,0xe6f4d672,0xded4e6f5,0xe6f5e6d4,0x29d429b4,0x21922192,0x29d429d5,0x219221b3,0x29d429b4,0x29b429b4,0x29d529d5,0x29b329b4,0x7cdb7cdb,0x645a643a,0x7cdb851b,0x643a6c7a,0x7cdb749a,0x749a749a,0x8d3b851b,0x6c9a749a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xde94deb4,0xde94e6b4,0xce33d673,0xce32ce32,0xde93deb3,0xe6d4d673,0xe715deb3,0xef15e715,0x29b32193,0x29d629d5,0x29b429b4,0x21922192,0x21702171,0x21922192,0x2170194f,0x21922192,0x6c9a6c7a,0x8d5b8d3b,0x749a7cdb,0x643a643a,0x4b9953d9,0x643a5c1a,0x4bb93b38,0x643a5c1a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe6d4e6d5,0xde93d673,0xde94e6d4,0xd652d673,0xdeb4deb4,0xdeb4d673,0xd693e6d4,0xef15e6f4,0x21922171,0x21712171,0x29b42193,0x21922171,0x29b429b3,0x21712150,0x21b321b3,0x21702171,0x5c1a53d9,0x53d94bb9,0x74bb645a,0x5c1a53f9,0x749a6c9a,0x53d94379,0x6c7a6c7a,0x4b9953d9,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x73ae73ae,0x73ae73ae,0x8c716b4d,0x7bef8c71,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x7bef7bef,0x49634963,0x51a359c3,0x51834963,0x61c359c3,0x51835183,0x59c359a3,0x49634963,0x59c359a3,0xb523a4c2,0xc5a3d624,0xbd63ad02,0xde64d644,0xb543bd83,0xd624cdc3,0xb523ad02,0xd644d623,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x7bef7bef,0x73ae7bef,0x22712271,0x73ae2271,0x7bef7bef,0x8c718c71,0x73ae7bef,0x7bef73ae,0x59c361c3,0x51835183,0x51a359c3,0x59a359a3,0x59a361c4,0x51835183,0x59a351a3,0x49635183,0xde64de64,0xbd63c5a3,0xc5a3d644,0xce03cdc3,0xd623de65,0xb543b543,0xcde3c5a3,0xad02bd63,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x8c717bef,0x8c7173ae,0x11751175,0x73ae1a54,0x11b21156,0x73ae2231,0x7bef7bef,0x8c718c71,0x59a359a3,0x61c461c3,0x59a359c3,0x518351a3,0x51834142,0x59c359a3,0x51835183,0x61c359c3,0xcdc3cde3,0xde65de64,0xcde3d624,0xbd63c5a3,0xc5839c82,0xd644cde3,0xc583bd83,0xde65d644,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x0000dedb,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x73ae7bef,0x73ae73ae,0x117473ae,0x73ae73ae,0x1a151176,0x73ae1a54,0x227173ae,0x7bef2211,0x51835183,0x49634142,0x61c359c3,0x41424963,0x59a35183,0x59a351a3,0x61c461c4,0x496359a3,0xb543bd63,0xa4a29c82,0xde64d624,0x9c62a4e2,0xce03c5a3,0xcde3c5a3,0xde65de65,0xa4c2cdc3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0xdedb0000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x7bef6b4d,0x11331a53,0x7bef1152,0x7bef7bef,0x8c718c71,0x7bef7bef,0x22527bef,0x6b4d32f1,0x49634963,0x59a359a3,0x51835183,0x59a359a3,0x49634963,0x59a35183,0x49424942,0x59a35183,0xb523ad02,0xcdc3cdc3,0xbd63b543,0xcde3ce03,0xb523ad02,0xcdc3b543,0x9c829c82,0xcdc3bd63,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x0000ffff,0xffff0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x7bef7bef,0x73ae8c71,0x8c7119d5,0x73ae8c71,0x1a3419f6,0x8c712252,0x1a348c71,0x7bef3310,0x59c359c3,0x59a359a3,0x59c361c4,0x59a359a3,0x59a359c3,0x51a35183,0x518359a3,0x51834963,0xd644d624,0xcde3cde3,0xd644de65,0xcdc3cde3,0xd623d644,0xc5a3bd63,0xc5a3cdc3,0xc5a3ad02,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0xdedb0000,0x0000ffff,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x73ae7bef,0x73ae73ae,0x73ae73ae,0x1a3673ae,0x1a341a35,0x2a711a15,0x1a1473ae,0x7bef2ab1,0x51835183,0x59a35183,0x49634142,0x59a35183,0x59a34963,0x61c461c4,0x59a35183,0x61c361c4,0xbd63b543,0xd623bd63,0xa4a29c82,0xcdc3bd63,0xcdc3b523,0xde65de65,0xcde3c583,0xde64de65,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0xffff0000,0xffffdedb,0xdedb0000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xffffdedb,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x22537bef,0x6b4d19f7,0x73ae8c71,0x12387bef,0x1a957bef,0x1a542a71,0x8c718c71,0x8c718c71,0x59a359a3,0x51834963,0x59a359c3,0x51834963,0x51835183,0x49635183,0x51835183,0x49634963,0xcde3cde3,0xb543a4e2,0xcdc3d624,0xbd63b523,0xbd63b543,0xa4c2b543,0xbd63c5a3,0xa4e2ace2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0xef5d0000,0xffffef5d,0xef5ddedb,0xef5dffff,0x0000ffff,0x0000dedb,0xffff0000,0x00000000,0xef5d0000,0x0000ef5d,0xef5d0000,0xffff0000,0x0000dedb,0x0000dedb,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x1a157bef,0x73ae1256,0x73ae73ae,0x73ae73ae,0x6b4d73ae,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x51835183,0x61c461c3,0x59a359a3,0x59c359c3,0x51834963,0x59c359a3,0x59a359a3,0x59c359c3,0xb543b543,0xde65de65,0xcdc3cde3,0xd624d644,0xb543ad02,0xd644ce03,0xcdc3cdc3,0xd624d644,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x0000ef5d,0xdedbffff,0x00000000,0xef5def5d,0xef5d0000,0xffffef5d,0xffffffff,0x0000ffff,0x0000ef5d,0xdedbffff,0x00000000,0xdedbef5d,0x0000ffff,0x0000ef5d,0x0000ffff,0x0000ffff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x8c718c71,0x19f87bef,0x1ab81a36,0x1a541219,0x7bef7bef,0x22711a33,0x8c718c71,0x6b4d8c71,0x61c461c3,0x59a359a3,0x51835183,0x51a35183,0x61c459a3,0x518359a3,0x61c461c4,0x51a359a3,0xde65de65,0xce03d623,0xc5a3c5a3,0xc5a3bd83,0xde65d623,0xbd63cdc3,0xde65de65,0xc5a3cde3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0xdedbdedb,0xdedbffff,0xffffef5d,0xffffffff,0x00000000,0x00000000,0x00000000,0x00000000,0xdedbdedb,0x0000dedb,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x73ae73ae,0x7bef7bef,0x1ab87bef,0x73ae1237,0x6b4d7bef,0x23161a33,0x73ae73ae,0x7bef6b4d,0x49424963,0x59c34963,0x41424963,0x51834963,0x41424963,0x51835183,0x51834963,0x51834963,0x9c82a4e2,0xd644b523,0x9c62b523,0xb543b522,0x9c62b523,0xbd63b543,0xb543a4c2,0xbd63ad02,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x0000ffff,0xdedbffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x8c717bef,0x73ae8c71,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x8c718c71,0x6b4d8c71,0x518359a3,0x51834963,0x59a359a3,0x41424963,0x51a35183,0x49635183,0x59a359a3,0x49634963,0xbd83cdc3,0xc5a3b523,0xce03ce03,0x9c62a4a2,0xc5a3b543,0xa4e2b543,0xce03ce03,0xa4a2ad02,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0xef5d0000,0xdedb0000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x8c717bef,0x7bef7bef,0x12387bef,0x1a917bef,0x7bef1237,0x73ae73ae,0x73ae73ae,0x7bef73ae,0x51835183,0x59c359a3,0x51835183,0x59c35183,0x51834963,0x59c359c3,0x51835183,0x59c361c4,0xb543c5a3,0xd644ce03,0xbd63bd63,0xd644c5a3,0xbd63b523,0xd644d644,0xb543c5a3,0xd624de65,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0xef5d0000,0x0000dedb,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x6b4d7bef,0x2b731ab8,0x1a541ad8,0x73ae73ae,0x73ae8c71,0x7bef7bef,0x1a540937,0x7bef7bef,0x59c359a3,0x51835183,0x59c361c3,0x518351a3,0x59c359a3,0x59a359a3,0x61c361c3,0x59a359a3,0xd644d623,0xc583bd63,0xd644de64,0xbd63c5a3,0xd644cde3,0xcde3cde3,0xde65de64,0xcdc3cde3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x7bef7bef,0x8c718c71,0x8c718c71,0x8c718c71,0x8c7173ae,0x8c718c71,0x7bef6b4d,0x73ae7bef,0x59a35183,0x61c461c3,0x59a359a3,0x51835183,0x49634963,0x51835183,0x49634142,0x51835183,0xcdc3c5a3,0xde65de64,0xcde3d623,0xbd63bd63,0xa4c2ad02,0xbd63b543,0xa4e29c62,0xbd83b543,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x73ae7bef,0x73ae73ae,0x7bef73ae,0x8c718c71,0x8c716b4d,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x51834963,0x49634963,0x59a35183,0x51834963,0x59a359a3,0x49634963,0x51a351a3,0x49634963,0xb543b522,0xad02ace2,0xce03c5a3,0xb543b523,0xcde3cdc3,0xad02a4a2,0xc5a3c5a3,0xa4c2ad02,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x00000000,0x00000000,0x00000000,0x00000000,0x0000ef5d,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x1a5332ef,0x1ab81a53,0x1a54121a,0x22711a54,0x1a542271,0x2a712211,0x2a712a71,0x12361236,0x32223202,0x3a633a83,0x32423222,0x3aa33aa3,0x32423243,0x3a833a83,0x32223222,0x3aa33a83,0x35653525,0x3e054666,0x3da53565,0x46674666,0x35853dc5,0x46663e06,0x35653565,0x46663e66,0x84108410,0x84108410,0x94927bcf,0x84108c51,0x84108410,0x84108430,0x84108410,0x84308430, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x220e1a72,0x1ab81ab8,0x22712271,0x22712271,0x1a540957,0x099711b2,0x22112a71,0x12362a50,0x3aa33aa3,0x32433263,0x3a633aa3,0x3a833a83,0x3a8342c3,0x32423242,0x3a833a63,0x32223242,0x46674667,0x3dc53de5,0x3e054666,0x3e463e06,0x3e664e88,0x35853585,0x3e263e05,0x35653da5,0xad558430,0xa514ad55,0xb596a514,0xc638b596,0xc638c638,0xb596ce79,0xa514ad55,0x8430a514, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x22512ad0,0x22712232,0x11751175,0x09971a54,0x11b21156,0x1a322231,0x2a502a71,0x2ab12250,0x3a833a83,0x42c33aa3,0x3a833a83,0x32423a63,0x324329e2,0x3aa33a83,0x32433243,0x3ac33aa3,0x3e063e26,0x4e884667,0x3e264666,0x3dc53e05,0x3dc534e4,0x46663e26,0x3dc53dc5,0x4e674666,0xb5968430,0xb596a514,0xa5149cf3,0xd00094b2,0xb596b000,0xce79ad14,0xad55ce79,0x9492b596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x2a9232f1,0x19922a71,0x11741173,0x09371196,0x1a151176,0x1a531a54,0x22712a71,0x2ab12211,0x32423242,0x320229e2,0x3aa33a83,0x29e23222,0x3a833263,0x3a833a63,0x42c342c3,0x32023a83,0x35853da5,0x350534e4,0x46674666,0x2cc43545,0x3e463de5,0x3e263e05,0x4e884e88,0x35053e06,0xa5148430,0x84109492,0xa5149cf3,0xf8009492,0xb596b000,0xad149cf3,0xc638a514,0x8430a514, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x22512ab1,0x11331a53,0x1a111152,0x093719b4,0x1a5411d5,0x2a712233,0x22522251,0x2ab132f1,0x32223222,0x3a633a63,0x32423242,0x3a833a83,0x32223222,0x3a833242,0x2a022a02,0x3a833242,0x35653545,0x3e063e06,0x3da53585,0x3e263e46,0x35653565,0x3e063585,0x35043504,0x3e063da5,0xad557bcf,0x84109492,0x9cf3a514,0xf8009492,0xb596d800,0x9cf3a514,0xce79a514,0x7bcfb596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x19b73310,0x117619b3,0x2ab219d5,0x09372274,0x1a3419f6,0x2a712252,0x1a342a71,0x32f13310,0x3aa33a83,0x3a833a83,0x3aa342c3,0x3a833a83,0x3a833aa3,0x3a633242,0x32633a83,0x32633222,0x46664666,0x3e263e26,0x46664e68,0x3e063e26,0x3e664666,0x3e053dc5,0x3de53e06,0x3de53545,0xad558430,0x9492b596,0x9cf38410,0xd0009492,0xb596b000,0xa514a514,0xad55ce79,0x8430ad55, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x19b719b7,0x19f819f5,0x23151a37,0x1a362274,0x1a341a35,0x2a711a15,0x1a142a71,0x19b72ab1,0x32433242,0x3a833242,0x320229e2,0x3a633243,0x3a833222,0x42c342c3,0x3a833243,0x3ac342c3,0x3dc53585,0x3e663da5,0x350534e4,0x3e063dc5,0x3e063565,0x4e884e88,0x3e263dc5,0x4e674e88,0xa5148430,0x9492a514,0xa5148410,0xd0009492,0xb596d000,0x9cf3a514,0xa514ce79,0x8430b596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x225319b7,0x129819f7,0x19f51a58,0x12380937,0x1a952274,0x1a542a71,0x2ab11a33,0x19b719b7,0x3a833a83,0x32423222,0x3a833a83,0x32423222,0x32423242,0x32023242,0x32433263,0x32223222,0x3e263e26,0x35853525,0x3e064666,0x3da53565,0x3dc53585,0x35053585,0x3dc53de5,0x35453545,0xb5968430,0x9cf3b596,0x84109492,0xf8009492,0xb596a800,0xce799cf3,0xb596b596,0x9492b596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x9b66ac49,0x00006a03,0x00000000,0x00000000,0x00000000,0x00000000,0xac690000,0x6a239367,0x9367ac69,0x00006a23,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xac680000,0x6a039367, +0x9386ac68,0x00006a03,0x00000000,0x00000000,0x00000000,0x00000000,0xac880000,0x6a049367,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x1a1519b7,0x1a771256,0x09371a57,0x12161a54,0x1a731a74,0x1a341237,0x2ab11a34,0x19b71152,0x32423242,0x42c33ac3,0x3a833a83,0x3a833aa3,0x32423222,0x3aa33a83,0x3a833a83,0x3a833aa3,0x35853585,0x4e884e67,0x3e063e26,0x46664666,0x35853565,0x46663e46,0x3e063e06,0x46664666,0xad558430,0xa514ad55,0x84109492,0xf8009492,0xb596d000,0xc638a514,0xa514a514,0x8430ad55, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b67acca,0x000059e2,0x00000000,0x00000000,0x00000000,0x00000000,0xb4aa0000,0x6a239367,0x8b46b4aa,0x000051e3,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xb4aa0000,0x6a049367, +0x8b67b4aa,0x000051e3,0x00000000,0x00000000,0x00000000,0x00000000,0xb4aa0000,0x6a048b67,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x19b71a57,0x19f811f9,0x1ab81a36,0x1a541219,0x2a711a92,0x22711a33,0x2ab11a53,0x19b71a53,0x42c33ac3,0x3a833a83,0x32633263,0x3a633243,0x42c33a83,0x32433a83,0x42c342c3,0x3a633a83,0x4e684e67,0x3e463e46,0x3de53de5,0x3e053dc5,0x4e683e66,0x3dc53e06,0x4e884e88,0x3e053e26,0xb5969492,0xad55ad55,0x9492ad55,0xf8009492,0xb596f800,0xad55ce79,0xb596b596,0x7bcfb596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b06ac68,0x000051e3,0x00000000,0x00000000,0x00000000,0x00000000,0xac890000,0x51e39367,0x8b45ac69,0x000059e3,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xac890000,0x59e39367, +0x8b46ac89,0x000051e3,0x00000000,0x00000000,0x00000000,0x00000000,0xac480000,0x51e39366,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x12371a57,0x1a571236,0x1ab81a97,0x1a541237,0x2a711237,0x23161a33,0x09971a53,0x12161a53,0x2a023222,0x3aa33222,0x29e23222,0x32423222,0x29e23222,0x32423242,0x32423202,0x32423222,0x35043525,0x46663585,0x2cc43565,0x35853565,0x2cc43565,0x3dc53585,0x35853505,0x3da53565,0xa5148410,0xad55ad55,0x9492ad55,0x7bcf8410,0x84107bcf,0xad55c638,0xa514a514,0x84309cf3, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b26b4aa,0x6a246204,0x6a046a04,0x6a046a03,0x51e451c2,0x6a246a03,0x93a859e3,0x5a038b67,0x8b46acaa,0x6a0369e4,0x6a036a03,0x6a246a03,0x51e351e3,0x6a236a23,0x69e451c3,0x6a036a03,0x59e36224,0x6a036a03,0x6a2351c3,0x6a236a24,0x6a036a03,0x6a236a04,0x93a86203,0x51c38b67, +0x8b26b4c9,0x6a046a03,0x62046223,0x6a036a03,0x59e351e3,0x6a036a03,0x9bc859c3,0x59c38b66,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x1a5719f8,0x1a981236,0x12191ab8,0x1a701a16,0x1a331237,0x2a711a74,0x09972a71,0x12161a53,0x32433a83,0x32633222,0x3a833a83,0x29e23202,0x3a633242,0x32223242,0x3a833a83,0x32023222,0x3dc53e06,0x3de53565,0x3e463e46,0x2cc43505,0x3e053585,0x35453585,0x3e463e46,0x35053545,0xb5968430,0xa514b596,0xa514a514,0x94929492,0x94929492,0xb596b596,0xb596b596,0x7bcfb596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x9366a489,0x93678b46,0x93679367,0x8b468b45,0x93469366,0x8b468346,0x93669366,0x52039387,0x9367ac69,0x93878346,0x93678b47,0x8b468b26,0x93679366,0x83268b46,0x93869347,0x8b469367,0x8b458b46,0x93669367,0x93678b87,0x8b469346,0x93468b46,0x93678b26,0x93668b66,0x59c38b66, +0x9347aca9,0x93678326,0x93669367,0x8b268b46,0x936793a7,0x8b468326,0x93669366,0x59e39387,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x12361236,0x1ab81a76,0x12381a98,0x1a911a35,0x2a711237,0x09971a73,0x1a530997,0x12161a54,0x32423263,0x3aa33a83,0x32423242,0x3aa33263,0x32433222,0x3aa33aa3,0x32423263,0x3a8342c3,0x35853de5,0x46663e46,0x3da53dc5,0x46663de5,0x3dc53565,0x46664666,0x35853de5,0x46664e88,0xb5968430,0xad55ad55,0x9cf3ad55,0xb596ad55,0xad55ad55,0xa514a514,0xa514a514,0x8430a514, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x68006800,0x68206820,0x68006800,0x68006800,0x68006800,0x68006800,0x68006800,0x68006800,0x70006800,0x70006800,0x68006800,0x68006800,0x68006800,0x68006800,0x68006800,0x68006800,0x68006800,0x68206800,0x68006800,0x68006800,0xbdd7b5b6,0xce59d6b9,0xb5b6ce59,0xb5b6b5d7, +0xb5d6b596,0xce39ce59,0xb5b6ce59,0xb5b6b5b6,0xbdd7b5d7,0xce59d67a,0xbdd6ce79,0xb5b7b5d7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x12981236,0x2b731ab8,0x1a541ad8,0x1a7319f3,0x1a742a71,0x09971a16,0x1a540937,0x12361236,0x3aa33a83,0x32433242,0x3aa33aa3,0x32423a63,0x3aa33a83,0x3a833a83,0x3ac33aa3,0x3a833a83,0x46663e66,0x3dc53dc5,0x46664667,0x3dc53e05,0x46663e26,0x3e263e26,0x4e674667,0x3e063e26,0x9cf38430,0xa514a514,0xa5149cf3,0xa514a514,0xa514b596,0xad55ad55,0xb596ad55,0x8430ad55, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x88828021,0x99049904,0x99249904,0x990398e4,0x88a288a2,0x806288c2,0x80618082,0x88a288a2,0x88828041,0x99049904,0x99039104,0x98e49904,0x888288a2,0x806188a3,0x80828081,0x88a280a2,0x78828882,0xa1457000,0x88a28081,0x68008883,0xce7ab5b6,0xef5def5d,0xef3def7d,0xb5b6d679, +0xd699b5b6,0xef7eef7e,0xef7df77d,0xf75def7d,0xf77dffdf,0xf7beef9d,0xf77def9d,0xb5b6ce9a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x1a7619f8,0x3bd41ab8,0x121a22d7,0x1a931a15,0x1a961a94,0x09970997,0x1a331a73,0x12361236,0x3a833263,0x42c33ac3,0x3a833a83,0x32423243,0x32023222,0x32423242,0x322229e2,0x32433242,0x3e063de5,0x4e884e67,0x3e263e66,0x3dc53dc5,0x35253565,0x3dc53585,0x35252cc4,0x3dc53585,0xad558430,0xb596b596,0xb596b596,0xb596b596,0xb596a514,0xb596b596,0xad559cf3,0x8410ad55, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x88c28041,0x88a28882,0x88a288a2,0x808188a2,0x80628082,0x80828042,0x88c28862,0x806288a2,0x88a28041,0x88a288c2,0x88a28882,0x808288a2,0x78a27882,0x78828082,0x88a290a3,0x808188a2,0x88a288a2,0xb1a67820,0x88a2a125,0x68008062,0xef7dbdb6,0xef7eef9d,0xef7def9d,0xb5b7ce99, +0xce79b5d7,0xef7def5d,0xffdfffdf,0xf7deffdf,0xffbfffbe,0xf77def7d,0xef5def9e,0xb5b6ce7a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x1a531ad6,0x12981a53,0x12981af8,0x22712271,0x1ab61ab4,0x2a711a54,0x22922a71,0x12362a50,0x32423222,0x32223222,0x3a833263,0x32423222,0x3a833a83,0x32223202,0x3a633a63,0x32023222,0x35853565,0x35653545,0x3e463de5,0x35853565,0x3e263e06,0x35453505,0x3e053e05,0x35253545,0x84108430,0x84108410,0x84308410,0x94929492,0x94927bcf,0x84108430,0x84108410,0x84308410, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x80418061,0x80408021,0x80418021,0x80828041,0x78828062,0x80618081,0x80418061,0x80627882,0x80218041,0x80217841,0x80408041,0x80828041,0x78828082,0x80828062,0x78417841,0x806280a2,0x80208061,0x80407820,0x80619965,0x68008041,0xce7ab5b6,0xce59ce99,0xbdd6b5d7,0xb596b5b7, +0xce99bd96,0xce59ce79,0xbdd6b5d7,0xbd96b596,0xce9ab5b6,0xce79ce7a,0xbdb7bdb6,0xb5d6b5b6,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0x91448924,0xa165b185,0x99449144,0xb185b185,0x9944a165,0xb185a965,0x91449144,0xb185b185,0xd391cb0f,0xdc33e4d5,0xd3b2d371,0xe516e4d5,0xd3b2dc13,0xe4d5dc54,0xd391d371,0xe4d5dcd5,0x84108410,0x84108410,0x94927bcf,0x84108c51,0x84108410,0x84108430,0x84108410,0x84308430, +0x4a690000,0x31860000,0x4a699cd3,0x00009cd3,0x9cd34a69,0x8c510000,0x00003186,0x00008c51,0x4a693186,0x31863186,0x4a699cd3,0x31869cd3,0x9cd34a69,0x8c513186,0x31863186,0x31868c51,0x80408061,0x80418041,0x80417840,0x80418041,0x80418041,0x80218040,0x80418020,0x80418041,0x80418021,0x80217840,0x78208041,0x68007021,0xb5b6b5b7,0xa574b5b5,0xb5b6ad75,0xbdb7b5b6, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x52050000,0x6b4da534,0x49e441a4,0x5a246a85,0x62656265,0x41a46265,0xa5346b4d,0x00005205,0xb185b185,0x9965a165,0xa165b185,0xa965a965,0xb185b9a5,0x99449944,0xa965a165,0x91449944,0xe4f6e4f6,0xd3f2dc33,0xdc33e4d5,0xdc94dc54,0xdcd5e557,0xd3b2d3b1,0xdc74dc33,0xd371d3b2,0xad558430,0xa514ad55,0xb596a514,0xc638b596,0xc638c638,0xb596ce79,0xa514ad55,0x8430a514, +0x9cd34208,0x9cd30000,0x9cd34a69,0x42080000,0x00004a69,0x00008c51,0x9cd33186,0x9cd30000,0x9cd33186,0x9cd33186,0x9cd34a69,0x31863186,0x31864a69,0x31868c51,0x9cd33186,0x9cd33186,0x80418041,0x80417821,0x80608041,0x80828081,0x80827862,0x782180a1,0x78407820,0x80417841,0x80218021,0x98a27820,0x78218882,0x70007021,0xd679d699,0xb5b6c5f8,0xce59b5b7,0xb5d6d69a, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x38e10000,0x38e138e1,0x38e138e1,0x000038e1,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83280000,0x6b4da534,0x83685a66,0x8b87ac4a,0xac4aac4a,0x6aa78b87,0xa5346b4d,0x00008328,0xa965a965,0xb9a5b185,0xa965b185,0x9944a165,0xa1658124,0xb185a965,0xa165a165,0xb985b185,0xdc54dc74,0xe557e516,0xdc74e4d5,0xd3d2dc33,0xdc13cacf,0xe4d5dc74,0xdc13dc13,0xe536e4d5,0xb5968430,0xb596a514,0xa5149cf3,0x400094b2,0xb5962000,0xce79ad14,0xad55ce79,0x9492b596, +0x00003186,0x00009cd3,0x00009cd3,0x4a699cd3,0x00000000,0x4a699cd3,0x42080000,0x00009cd3,0x31863186,0x31869cd3,0x31869cd3,0x4a699cd3,0x31863186,0x4a699cd3,0x31863186,0x31869cd3,0x88408021,0x888288a2,0x88a288a2,0x80627882,0x80818082,0x80627862,0x78828082,0x80828081,0x80828082,0xa9857820,0x808298e3,0x68007020,0xdefbce99,0xce79deba,0xdebbc699,0xb5b6ce39, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x38e10000,0x924338e1,0x92439243,0x92439243,0x38e19243,0x38e138e1,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0x99449944,0x89248124,0xb185b185,0x81249144,0xa985a165,0xa965a165,0xb9a5b9a5,0x8924a965,0xd3b2d3b2,0xcaefcacf,0xe4f6e4d5,0xcaaed330,0xdc94dc13,0xdc74dc33,0xe557e557,0xcb0fdc54,0xa5148430,0x84109492,0xa5149cf3,0x48009492,0xb5962800,0xad149cf3,0xc638a514,0x8430a514, +0x8c514208,0x9cd38c51,0x9cd38c51,0x9cd33186,0x9cd33186,0x9cd30000,0x4a690000,0x00003186,0x8c513186,0x9cd38c51,0x9cd38c51,0x9cd33186,0x9cd33186,0x9cd33186,0x4a693186,0x31863186,0x90617841,0x88a290e3,0x808288a2,0x78817862,0x80627881,0x78a27862,0x80628062,0x80618081,0x80817882,0xa9857020,0x8082a145,0x68007021,0xdebbc638,0xdefbdedb,0xce79d6ba,0xad55b596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x38e10000,0x924338e1,0xbae49243,0xaac4bae4,0xaac4aac4,0x9243aac4,0x92439243,0x000038e1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0x91449144,0xa165a165,0x99449944,0xa965a985,0x91449144,0xa9659944,0x89248924,0xa9659944,0xd391d350,0xdc53dc53,0xd3b2d3b2,0xdc74dc94,0xd391d371,0xdc54d3b2,0xcaefcaef,0xdc54d3d2,0xad557bcf,0x84109492,0x9cf3a514,0x48009492,0xb5962800,0x9cf3a514,0xce79a514,0x7bcfb596, +0x00000000,0x00009cd3,0x4a698c51,0x9cd30000,0x00004a69,0x8c519cd3,0x4a690000,0x42080000,0x31863186,0x31869cd3,0x4a698c51,0x9cd33186,0x31863186,0x8c519cd3,0x4a693186,0x31863186,0x90818040,0x88a298c3,0x80828081,0x80618082,0x80617862,0x88828082,0x80828062,0x78627881,0x80817861,0xa9a67020,0x88a290e3,0x68007040,0xdedbc618,0xef5cdebb,0xd678defb,0xad55b596, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x924338e1,0xbae4bae4,0xa284aac4,0xa284c618,0xa284a284,0xaac4bdf7,0xa284a284,0x38e19243,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x52050000,0x6b4da534,0x49e441a4,0x62655a24,0x62656265,0x41c46265,0xa5346b4d,0x00005205,0xb185b185,0xa965a965,0xb185b9a5,0xa965a965,0xb185b185,0xa1659944,0xa165a965,0xa1659144,0xe4f5e4d5,0xdc74dc74,0xe4d5e557,0xdc54dc74,0xdcd5e4f5,0xdc33d3d2,0xdc13dc54,0xdc33d350,0xad558430,0x9492b596,0x9cf38410,0x58009492,0xb5962800,0xa514a514,0xad55ce79,0x8430ad55, +0x00008c51,0x42080000,0x4a699cd3,0x00000000,0x9cd30000,0x9cd34a69,0x9cd30000,0x4a693186,0x31868c51,0x31863186,0x4a699cd3,0x31863186,0x9cd33186,0x9cd34a69,0x9cd33186,0x4a693186,0x88828041,0x90e39904,0x80a28082,0x88828082,0x88a38082,0x88a388a2,0x88a288a2,0x88a290a2,0x888288a2,0xb1e78061,0x88a39103,0x68007820,0xe6fcc618,0xef5def5d,0xdf1cef5d,0xad75c618, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x924338e1,0xa284a284,0xce79ef5d,0xce79ce79,0xbdf7ce79,0xbdf7bdf7,0xa284a284,0x38e19243,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83280000,0x6b4da534,0x83686ac7,0x8b878b87,0x8b878b87,0x6aa7a409,0xa5346b4d,0x00008328,0x99659944,0xb1859944,0x89248124,0xa1659965,0xa9659144,0xb9a5b9a5,0xa965a165,0xb985b9a5,0xd3f2d3b2,0xdcd5d3d2,0xcaefcacf,0xdc53d3f2,0xdc54d391,0xe557e557,0xdc74dc13,0xe536e557,0xa5148430,0x9492a514,0xa5148410,0x58009492,0xb5962800,0x9cf3a514,0xa514ce79,0x8430b596, +0x42089cd3,0x4a698c51,0x9cd30000,0x9cd30000,0x00004208,0x00009cd3,0x00004a69,0x4a699cd3,0x31869cd3,0x4a698c51,0x9cd33186,0x9cd33186,0x31863186,0x31869cd3,0x31864a69,0x4a699cd3,0x90828021,0x90c39903,0x88a288a2,0x80a388a2,0x88a288a2,0x88a288a2,0x88a18882,0x88a290c2,0x80a288a2,0xb1e78861,0x88a298c3,0x68007020,0xf77ed69a,0xef5eef7e,0xef5def5d,0xb596d679, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x924338e1,0xef5dce79,0xef5def5d,0xce79ce79,0xbdf7ce79,0xbdf7bdf7,0xa284bdf7,0x38e19243,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0xa965a965,0x99448924,0xa965b185,0x99449144,0x99449944,0x89249944,0x9965a165,0x91449144,0xdc74dc74,0xd3b2d310,0xdc54e4d5,0xd3b2d391,0xd3d2d3b2,0xcb0fd3b1,0xd3f2dc13,0xd330d350,0xb5968430,0x9cf3b596,0x84109492,0x50009492,0xb5962800,0xce799cf3,0xb596b596,0x9492b596, +0x9cd30000,0x9cd34a69,0x00003186,0x4a699cd3,0x00004a69,0x9cd30000,0x9cd34a69,0x9cd30000,0x9cd33186,0x9cd34a69,0x31863186,0x4a699cd3,0x31864a69,0x9cd33186,0x9cd34a69,0x9cd33186,0x90628041,0x88a39903,0x888288a3,0x90a288a2,0x88a288a2,0x88a288a2,0x88a288a2,0x888288c2,0x88a288a2,0xb1c78861,0x808290e3,0x68007021,0xf7bed6ba,0xef7ef79d,0xef5def5d,0xb576ce7a, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce7938e1,0xef5def5d,0xc618ef5d,0xc618c618,0xc618c618,0xbdf7c618,0xbdf7bdf7,0x38e1bdf7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0x99449944,0xb9a5b985,0xa965a965,0xb185b185,0x99449144,0xb185a965,0xa965a965,0xb185b185,0xd3b2d3b2,0xe557e536,0xdc54dc74,0xe4d5e4d5,0xd3b1d371,0xe4d5dc94,0xdc54dc54,0xe4d5e4f5,0xad558430,0xa514ad55,0x84109492,0x50009492,0xb5964020,0xc638a514,0xa514a514,0x8430ad55, +0x31860000,0x00009cd3,0x9cd33186,0x9cd30000,0x00009cd3,0x00009cd3,0x00008c51,0x00009cd3,0x31863186,0x31869cd3,0x9cd33186,0x9cd33186,0x31869cd3,0x31869cd3,0x31868c51,0x31869cd3,0x90628041,0x88a29904,0x88a280a1,0x80a28082,0x88a28883,0x88a288a2,0x88a288a3,0x88a288a2,0x888388a2,0xba498861,0x80a290e3,0x68007000,0xef9dd6db,0xef7ef79e,0xef7def5d,0xb5b6ce99, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce794a49,0xc618ef5d,0xef5dc618,0xef5def5d,0xef5de8e3,0xc618ef5d,0xbdf7c618,0x4a49bdf7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x52050000,0x6b4da534,0x49e441a4,0x62655a24,0x62656265,0x41a45a24,0xa5346b4d,0x00005205,0xb9a5b985,0xa965a985,0xa165a165,0xa165a165,0xb9a5b185,0x9965a965,0xb9a5b9a5,0xa165a965,0xe557e536,0xdc94dcd5,0xdc13dc13,0xdc33dc13,0xe557dcd5,0xd3f2dc54,0xe557e557,0xdc33dc74,0xb5969492,0xad55ad55,0x9492ad55,0x50209492,0xb5965000,0xad55ce79,0xb596b596,0x7bcfb596, +0x9cd34208,0x8c518c51,0x00004a69,0x00009cd3,0x9cd34208,0x00004a69,0x4a698c51,0x9cd30000,0x9cd33186,0x8c518c51,0x31864a69,0x31869cd3,0x9cd33186,0x31864a69,0x4a698c51,0x9cd33186,0x90828061,0x9965b1c6,0x90c290c3,0x88a290a3,0x88818882,0x808288a2,0x88c28882,0x888288a2,0x90a288a2,0xcb0c9082,0x80819924,0x68007000,0xf77ed6ba,0xef7ef79e,0xe75eef5d,0xb5b7d67a, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xc6184a49,0xef5dc618,0xef5de8e3,0xef5def5d,0xef5def5d,0xef5def5d,0xc618ef5d,0x4a49c618,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83280000,0x6b4da534,0x83686ac7,0x8b87ac4a,0x8b878b87,0x6ac76265,0xa5346b4d,0x00008328,0x89248924,0xb1859144,0x81249144,0x99449144,0x81249144,0x99449944,0x99448924,0x99449144,0xcaefd310,0xe4d5d391,0xcaaed391,0xd3b2d391,0xcaaed391,0xd3d2d3b2,0xd3b1cb0f,0xd3d2d371,0xa5148410,0xad55ad55,0x9492ad55,0x7bcf8410,0x84107bcf,0xad55c638,0xa514a514,0x84309cf3, +0x00004a69,0x4a698c51,0x00004a69,0x4a690000,0x31869cd3,0x4a699cd3,0x4a699cd3,0x00009cd3,0x31864a69,0x4a698c51,0x31864a69,0x4a693186,0x31869cd3,0x4a699cd3,0x4a699cd3,0x31869cd3,0x98e38041,0xb1a7b1e7,0x990498e4,0x90a398e3,0x88a388c3,0x80818862,0x808280c2,0x88a288a3,0x888288a1,0xc2ca9082,0x80a2a125,0x68007841,0xf7bed6bb,0xf79effbe,0xef5def5d,0xb596d69a, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xc6184a49,0xef5def5d,0xef5def5d,0xef5def5d,0xef5de8e3,0xef5def5d,0xef5de8e3,0x4a49c618,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0xa165a965,0xa1659144,0xa965a985,0x81248924,0xa1659944,0x91449944,0xa985a985,0x89249144,0xdc13dc54,0xdc33d391,0xdc94dc94,0xcaaecaef,0xdc33d3b2,0xd330d3b1,0xdc94dc94,0xcaefd350,0xb5968430,0xa514b596,0xa514a514,0x94929492,0x94929492,0xb596b596,0xb596b596,0x7bcfb596, +0x00004a69,0x8c510000,0x00009cd3,0x4a699cd3,0x9cd38c51,0x00000000,0x9cd30000,0x00004208,0x31864a69,0x8c513186,0x31869cd3,0x4a699cd3,0x9cd38c51,0x31863186,0x9cd33186,0x31863186,0x98838040,0xa965a966,0xa1459904,0xa145a965,0xa145a965,0x99049925,0x99049904,0x99259924,0x90e39945,0xbaaa9082,0x9103b208,0x70007841,0xffffd6ba,0xffbfffff,0xf75def3d,0xa514ce39, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xc6184a49,0xe8e3c618,0xef5def5d,0xef5def5d,0xef5def5d,0xef5de8e3,0xc618ef5d,0x4a49c618,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0x9944a165,0xb185a965,0x99449944,0xb185a165,0x99659144,0xb185b185,0x9944a165,0xb185b9a5,0xd3b2dc33,0xe4d5dc94,0xd3b2d3d2,0xe4d5dc13,0xd3f2d391,0xe4d5e4d5,0xd3b2dc33,0xe4d5e557,0xb5968430,0xad55ad55,0x9cf3ad55,0xb596ad55,0xad55ad55,0xa514a514,0xa514a514,0x8430a514, +0x00009cd3,0x00009cd3,0x9cd30000,0x000052aa,0x00008c51,0x31864a69,0x4a699cd3,0x00009cd3,0x31869cd3,0x31869cd3,0x9cd33186,0x318652aa,0x31868c51,0x31864a69,0x4a699cd3,0x31869cd3,0x90628041,0xa9a6a985,0xa9a6a9a6,0xb1a6a9a6,0xa986a986,0xa145a965,0xb186a966,0xb186b1a6,0xa985a986,0xc2aa90a3,0x9925b208,0x70008041,0xffdfce59,0xffdfffff,0xe73cf79e,0x9cf4bdd7, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x4a490000,0xc6184a49,0xef5dc618,0xef5de8e3,0xef5def5d,0xc618ef5d,0x4a49c618,0x00004a49,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x52050000,0x6b4da534,0x520541c4,0x62656265,0x62656265,0x41a449e4,0xa5346b4d,0x00005205,0xb185b185,0xa1659944,0xb185b185,0x9944a165,0xb185a965,0xa965a965,0xb985b185,0xa965a965,0xe4d5dcd5,0xdc13d3d2,0xe4d5e4f6,0xd3d2dc33,0xe4d5dc74,0xdc74dc74,0xe536e516,0xdc54dc74,0x9cf38430,0xa514a514,0xa5149cf3,0xa514a514,0xa514b596,0xad55ad55,0xb596ad55,0x8430ad55, +0x9cd30000,0x42080000,0x00009cd3,0x00009cd3,0x00009cd3,0x42089cd3,0x9cd30000,0x9cd34a69,0x9cd33186,0x31863186,0x31869cd3,0x31869cd3,0x31869cd3,0x31869cd3,0x9cd33186,0x9cd34a69,0x88618041,0xb1a6a945,0xa986a986,0xb186b1c6,0xa145a986,0xa965a145,0xb1c7b1c7,0xb1e7b1c7,0xa9a6b1e7,0xba6a90c2,0xa124b208,0x68007821,0xf79ec658,0xffffffff,0xd67af79f,0xa4f3b595, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x4a490000,0xc6184a49,0xc618c618,0xc618c618,0x4a49c618,0x00004a49,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83280000,0x6b4da534,0x72e65a66,0xa409a409,0xac4aac4a,0x6aa78368,0xa5346b4d,0x00008328,0xa965a165,0xb9a5b985,0xa965b185,0x99449965,0x89249144,0x99449944,0x89248124,0xa1659944,0xdc54dc33,0xe557e536,0xdc74dcd5,0xd3d2d3f2,0xcb0fd371,0xd3d2d3b1,0xd310ca8e,0xdc13d3b2,0xad558430,0xb596b596,0xb596b596,0xb596b596,0xb596a514,0xb596b596,0xad559cf3,0x8410ad55, +0x8c519cd3,0x4a698c51,0x9cd33186,0x31860000,0x9cd30000,0x4a698c51,0x00000000,0x8c510000,0x8c519cd3,0x4a698c51,0x9cd33186,0x31863186,0x9cd33186,0x4a698c51,0x31863186,0x8c513186,0x80418041,0x90a28882,0x90a290a2,0x98a390a2,0x88629882,0x98a38841,0xa0e3a0c3,0xa0e4a0a3,0x98c2a104,0x99248821,0x88619944,0x70208021,0xd69ac639,0xf7bee75d,0xbd96d6ba,0x9d34b555, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x4a490000,0x4a494a49,0x4a494a49,0x00004a49,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x00000000,0xa5346b4d,0x00000000,0x99449144,0x91449144,0xa985a165,0x99449144,0xa965a965,0x91448924,0xa165a165,0x89249144,0xd3b2d391,0xd371d350,0xdc94dc13,0xd3b1d391,0xdc74dc54,0xd350caef,0xdc33dc33,0xcb0fd350,0x84108430,0x84108410,0x84308410,0x94929492,0x94927bcf,0x84108430,0x84108410,0x84308410, +0x9cd30000,0x4a690000,0x9cd30000,0x00004a69,0x00009cd3,0x4a699cd3,0x9cd30000,0x9cd30000,0x9cd33186,0x4a693186,0x9cd33186,0x31864a69,0x31869cd3,0x4a699cd3,0x9cd33186,0x9cd33186,0x80418041,0x88618061,0x80418021,0x90618861,0x80418881,0x80418021,0x88618041,0x80618862,0x78408041,0x90e48040,0x88a290e3,0x70008041,0xad75b595,0xce38be17,0x9d13b596,0xb5959cf3, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x00000000,0x6b4da534,0x00000000,0x00000000,0x00000000,0x41a449e4,0xa5346b4d,0x00008328,0x10821082,0x18c320e3,0x18a21082,0x20e320e3,0x18a218a2,0x20e318c3,0x10821082,0x20e320e3,0x39e739c7,0x42084a49,0x39e739e7,0x4a494a49,0x39e74208,0x4a494228,0x39e739e7,0x4a494228,0x00000000,0x00000000,0x00000000,0x62860000,0x00003142,0x00000000,0x00000000,0x00000000, +0x28e128c1,0x10403922,0x28e128c0,0x104028e1,0x310128e1,0x082028e1,0x28e128e1,0x392228c1,0xef5cef3c,0x39e7ef5c,0xdefadefa,0xef5ce6fb,0xef7def5c,0xe6fad69a,0xffffdeba,0xf77cffff,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0xa2c1d3e2,0xd3e2a2c1,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0xa2c1d3e2,0xd3e2a2c1,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1, +0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0xa2c1d3e2,0xd3e2a2c1,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x00000000,0x62650000,0x62656265,0x6aa78b87,0xa5346b4d,0x83285205,0x20e320e3,0x18a218a2,0x18c320e3,0x18c318c3,0x20e32104,0x10821082,0x18c318c3,0x108218a2,0x4a494a49,0x42084208,0x42084a49,0x42284228,0x42284a69,0x39e739e7,0x42284208,0x39e739e7,0x00000000,0x00000000,0x00000000,0x9bc90000,0x00003963,0x00000000,0x00000000,0x00000000, +0x28e11020,0x104049a3,0x39223101,0x10401880,0x28e14982,0x102051a3,0x392228c1,0x28e11040,0x39e718c3,0xef5c31e7,0xffffef5c,0xffffffff,0xdefaef3c,0x39e739c7,0xdefbbd96,0x18a31903,0xd3e2a2c1,0xd3e2e483,0xe483a2c1,0xa2c1e483,0xe529a2c1,0xa2c1e483,0xe483a2c1,0xa2c1e483,0xd3e2a2c1,0xd3e2e483,0xe483a2c1,0xa2c1e483,0xe529a2c1,0xa2c1e483,0xe483a2c1,0xa2c1e483, +0xd3e2a2c1,0xd3e2e483,0xe483a2c1,0xa2c1e483,0xe529a2c1,0xa2c1e483,0xe483a2c1,0xa2c1e483,0xd6ba0000,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0x0000d6ba,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2840000,0xa284a284,0xa284a284,0xa284a284,0xa284a284,0xa284a284,0xa284a284,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x6b4da534,0x5a2441a4,0x83286265,0x8b878b87,0x00000000,0x6b4d41a4,0xa534a534,0x18c318c3,0x210420e3,0x18c320e3,0x18a218c3,0x18a21061,0x20e318c3,0x18a218a2,0x210420e3,0x42284228,0x4a694a49,0x42284a49,0x42084208,0x420831a6,0x4a494228,0x42084208,0x4a494a49,0x00000000,0x00000000,0x00000000,0x62860000,0x00003983,0x00000000,0x00000000,0x00000000, +0x31011040,0x310128c1,0x392228e1,0x31011880,0x28c13101,0x104028e1,0x498230e1,0x102051c3,0xdeda39e7,0xef9bd6fa,0xef5bef5c,0xb595e77d,0xef7cdeda,0xef3cef3c,0x39c841c7,0x18c218e3,0xa2c1a2c1,0xd3e2e483,0xe483a2c1,0xa2c1e483,0xe483d3e2,0xd3e2e483,0xe529a2c1,0xa2c1e483,0xa2c1a2c1,0x2800a2c1,0xe483a2c1,0xa2c14080,0xe483a2c1,0x4080e483,0xe529a2c1,0xa2c1a2c1, +0xa2c1a2c1,0x4800a2c1,0xe483e4c2,0xe4c2cea8,0xe483a2c1,0xc667f6e6,0xe529a2c1,0xa2c1a2c1,0xdefb0000,0xe8e3ef5d,0xef5def5d,0xef5def5d,0xef5def5d,0xef5def5d,0xef5def5d,0x0000defb,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2840000,0xbae4bae4,0xbae4bae4,0xa284bae4,0xbae4bae4,0xbae4a284,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83280000,0x6b4da534,0x83685a66,0x00008b87,0x00000000,0x62650000,0x6aa76265,0x6b4d6b4d,0x18a218a2,0x10611061,0x20e320e3,0x10611082,0x18c318a2,0x18c318c3,0x21042104,0x106118c3,0x39e739e7,0x39c731a6,0x4a494a49,0x31a639c7,0x42284208,0x42284208,0x4a694a69,0x39c74228,0x00000000,0x00000000,0x00000000,0x93a90000,0x00003963,0x00000000,0x00000000,0x00000000, +0x51a31020,0x28e11020,0x51a33101,0x30e10820,0x28c11040,0x104049a3,0x28c030e1,0x51a31040,0xffffe75d,0xef5dffff,0xdedad6da,0xef5cd71a,0xe75bef5c,0xef3cef5d,0xef5cef3c,0x420739e7,0xa2c1a2c1,0xe483e483,0xe529a2c1,0xa2c1e483,0xe483d3e2,0xe483e483,0xe529a2c1,0xa2c1e483,0xa2c1a2c1,0x2800a2c1,0xa2c14080,0x40804080,0x4080a2c1,0x40804080,0x4080a2c1,0xa2c14080, +0xa2c1a2c1,0x4800e4c2,0xe4c2c647,0xd728cee8,0xd728e4c2,0xcea8cee8,0xbde7a2c1,0xeda2bd86,0xdefb0000,0xef5def5d,0xef5def5d,0xef5def5d,0xe8e3e8e3,0xdefbdefb,0xef5ddefb,0x0000defb,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2840000,0xa284bae4,0xa284bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x83280000,0xa5345205,0x00006b4d,0x00000000,0x00000000,0x83286265,0x00008b87,0x6aa741a4,0x10821082,0x18c318c3,0x18a218a2,0x18c318c3,0x10821082,0x18c31082,0x10611061,0x18c318a2,0x39e739c7,0x42284228,0x39e739e7,0x42284228,0x39e739e7,0x422839e7,0x31a631a6,0x422839e7,0x00000000,0x00000000,0x00000000,0x9bea0000,0x00004184,0x00000000,0x00000000,0x00000000, +0x39221040,0x28e11040,0x51a33102,0x51a31040,0x28c10820,0x104051c3,0x49a33101,0x51c31040,0xef5cef5c,0xe77ce73c,0xbdb6ef5c,0xb5d6b5d6,0xef5cef5c,0xdefad71a,0xb596b5d6,0xdefbdeda,0xa2c1a2c1,0xe483e483,0xe529a2c1,0xa2c1e483,0xe483d3e2,0xe483d3e2,0xe529a2c1,0xa2c1e483,0xa2c1a2c1,0x40802800,0x40804080,0x40804080,0x40804080,0x40804080,0x40804080,0xa2c14080, +0xa2c1a2c1,0xc6074800,0xcec8c667,0xdf68d728,0xdf68df89,0xcec8d728,0xc607c667,0xeda2bda6,0xdefb0000,0xdefbef5d,0xef5ddefb,0xef5def5d,0xe8e3e9a6,0xef5ddefb,0xef5ddefb,0x0000defb,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2840000,0xbae4bae4,0xbae4bae4,0xbae4a284,0xbae4a284,0xbae4bae4,0xbae4a284,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0xa5340000,0x00006b4d,0x00000000,0x62650000,0x8b878328,0x00000000,0x83685a24,0x20e320e3,0x18c318c3,0x20e32104,0x18c318c3,0x20e320e3,0x18c318a2,0x18a218c3,0x18a21082,0x4a494a49,0x42284228,0x4a494a69,0x42284228,0x42284a49,0x42084208,0x42084228,0x420839c7,0x00000000,0x00000000,0x00000000,0x93a80000,0x000041a4,0x00000000,0x00000000,0x00000000, +0x39221060,0x30e11040,0x49a328e1,0x28c01020,0x28c11040,0x104051c3,0x51c330e1,0x49a31040,0xef9cb5d6,0xdedadeb9,0xb5b6deda,0xef7cef7c,0xef5bef7c,0xffffffff,0xe71cef5c,0xef5dffff,0xd3e2a2c1,0xe483e483,0xd3e2a2c1,0xa2c1e483,0xe483a2c1,0xe483e483,0xe483a2c1,0xa2c1d3e2,0xd3e2a2c1,0x28002800,0x28002800,0x28004080,0x40802800,0x28002800,0x28004080,0xa2c1a2c1, +0xf7c5a2c1,0x48004800,0x48004800,0x4800d728,0xdf894800,0x48004800,0x4800ce67,0xa2c1eda2,0xdefb0000,0xdefbef5d,0xef5def5d,0xdefbd6ba,0xef5def5d,0xef5def5d,0xef5ddefb,0x0000defb,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2840000,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4a284,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x6b4da534,0x00000000,0x83286265,0x00008328,0x62650000,0x00008328,0x18a21082,0x20e318a2,0x10611061,0x18c318a2,0x18c31082,0x21042104,0x18c318a2,0x21042104,0x420839e7,0x422839e7,0x39c731a6,0x42284208,0x422839e7,0x4a694a69,0x42284208,0x4a494a69,0x00000000,0x00000000,0x00000000,0x93880000,0x00003963,0x00000000,0x00000000,0x00000000, +0x51c328e1,0x28e11860,0x49823101,0x30e11040,0x102030e1,0x104049a3,0x49a33101,0x39221040,0xe73cef7b,0xe75cef5c,0xdedadeda,0xdedab5d6,0xded9b5d6,0xef5cd6da,0xef7bef9d,0xef3cf75d,0xd3e2a2c1,0xe483e483,0xd3e2a2c1,0xd3e2e483,0xe483a2c1,0xe483e483,0xe483a2c1,0xa2c1d3e2,0xd3e2a2c1,0x2800a2c1,0x2800a2c1,0xa2c1a2c1,0xa2c12800,0x2800a2c1,0x2800a2c1,0xa2c1d3e2, +0xf684a2c1,0x4800eda2,0x4800eda2,0xeda2eda2,0xeda24800,0x4800eda2,0x4800eda2,0xa2c1f7c5,0xdefb0000,0xdefbef5d,0xef5de8e3,0xef5def5d,0xdefbef5d,0xe8e3ef5d,0xef5de8e3,0x0000defb,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2840000,0xbae4a284,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xa284bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x6b4da534,0x62650000,0x8b878368,0x00000000,0x62650000,0x00008328,0x18c318c3,0x10821082,0x18c320e3,0x18a21082,0x18a21082,0x10611082,0x18a218a2,0x10821082,0x42284228,0x39e739c7,0x42284a49,0x39e739e7,0x420839e7,0x39c739e7,0x42084208,0x39c739c7,0x00000000,0x00000000,0x00000000,0x7b070000,0x000049e4,0x00000000,0x00000000,0x00000000, +0x51a328e1,0x31021040,0x10404982,0x104028e1,0x104028e1,0x10404982,0x31013101,0x39221040,0xdefade9a,0xffffde9a,0xef7cffff,0xfffff75c,0xef7ceefb,0xef1cf77c,0xef9ce75c,0xdefad6da,0xe483a2c1,0xe483e483,0xd3e2a2c1,0xd3e2e483,0xe483a2c1,0xd3e2e483,0xe483a2c1,0xa2c1d3e2,0xe483a2c1,0xe483e483,0xa2c1a2c1,0xd3e2a2c1,0xa2c1a2c1,0xa2c1a2c1,0xa2c1a2c1,0xa2c1d3e2, +0xe483a2c1,0xffe7f6e6,0xeda2e4c2,0xd3e2e4c2,0xe4c2eda2,0xeda2e4c2,0xeda2e4c2,0xa2c1f684,0xdefb0000,0xdefbef5d,0xdefbef5d,0xe8e3ef5d,0xdefbe8e3,0xe9a6defb,0xef5de8e3,0x0000defb,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa2840000,0xbae4bae4,0xbae4a284,0xbae4a284,0xbae4bae4,0xa284bae4,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0xa5340000,0x5a666b4d,0x00008b87,0x00000000,0x62650000,0x00008b87,0x18a218a2,0x21042104,0x18c318c3,0x20e320e3,0x10821082,0x20e318c3,0x18c318c3,0x20e320e3,0x39e739e7,0x4a694a49,0x42284228,0x4a494a49,0x39e739e7,0x4a494228,0x42284228,0x4a494a49,0x00000000,0x00000000,0x00000000,0x48000000,0x00002800,0x00000000,0x00000000,0x00000000, +0x51a33101,0x31011040,0x104051c3,0x104051a3,0x102051a3,0x18803922,0x392228e1,0x31011040,0xbd96e75c,0xef5bffff,0xdefaef3c,0xe75cdeda,0xbdd6ffff,0xef7ce75c,0xdedaffff,0xd6bbdefa,0xe483a2c1,0xe483e483,0xe483a2c1,0xe483e483,0xe483a2c1,0xa2c1e483,0xe483d3e2,0xa2c1a2c1,0xe483a2c1,0xa2c1e483,0x40804080,0xa2c1a2c1,0xa2c1a2c1,0x40804080,0x40804080,0xa2c1a2c1, +0xe483a2c1,0xa2c1e483,0xc667c607,0xe4c2a2c1,0xa2c1e4c2,0xc667cea8,0xbdc6c607,0xa2c1a2c1,0xdefb0000,0xef5de8e3,0xdefbef5d,0xe9a6ef5d,0xd6bae8e3,0xef5ddefb,0xef5def5d,0x0000defb,0x92430000,0x92439243,0x92439243,0x92439243,0x92439243,0x92439243,0x92439243,0x00009243,0x92430000,0x60a060a0,0x60a060a0,0x60a060a0,0x60a060a0,0x60a060a0,0x60a060a0,0x00009243, +0xa2840000,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4a284,0xbae4bae4,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x52050000,0x6b4da534,0x00000000,0x00000000,0x83286265,0x00000000,0x21042104,0x18c320e3,0x18a218a2,0x18c318a2,0x210420e3,0x18a218c3,0x21042104,0x18c318c3,0x4a694a49,0x42284228,0x42084208,0x42084208,0x4a694228,0x42084228,0x4a694a69,0x42084228,0x00000000,0x00000000,0x00000000,0x50000000,0x00004800,0x00000000,0x00000000,0x00000000, +0x392228e1,0x31011880,0x28c049a3,0x104028e1,0x10404982,0x20a03922,0x39220820,0x31011040,0xe6d939e7,0xe73cdeb9,0xbdd6ef5c,0xdebaef3b,0xdedad6fa,0xef3cef5c,0xef3cb596,0xef5cef3c,0xe529a2c1,0xe483e483,0xe529a2c1,0xe483e483,0xe483a2c1,0xa2c1d3e2,0xe483d3e2,0xa2c1a2c1,0xe529a2c1,0x2800a2c1,0x40804080,0xa2c14080,0x2800a2c1,0x40804080,0x40804080,0xa2c1a2c1, +0xe529a2c1,0x4800a2c1,0xc607bdc7,0xa2c1c647,0x4800eda2,0xc607c647,0xbd86bdc7,0xa2c1eda2,0xdefb0000,0xef5def5d,0xd6baef5d,0xef5def5d,0xef5def5d,0xef5de8e3,0xef5ddefb,0x0000defb,0x92430000,0xbae4bae4,0xbae4bae4,0xa284bae4,0xbae4bae4,0xbae4bae4,0xbae4a284,0x00009243,0x92430000,0x81208120,0x81208120,0x71008120,0x81208120,0x81208120,0x81207100,0x00009243, +0xa2840000,0xbae4bae4,0xa284bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xa284bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x83280000,0xa5345205,0x6b4d6b4d,0x00000000,0x8b8749e4,0x00000000,0x10611082,0x20e31082,0x10611082,0x18a21082,0x10611082,0x18a218a2,0x10821061,0x18a21082,0x31a639c7,0x4a4939e7,0x31a639e7,0x39e739e7,0x31a639e7,0x420839e7,0x39e739c7,0x39e739e7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x28c13101,0x28e13101,0x28e151a3,0x30e128e1,0x10403101,0x498228e1,0x39221040,0x28e11040,0x420739c7,0xffffef7c,0xf75cffff,0xffffef5c,0xef5cffff,0xffffffff,0x39c7ef5c,0x18e218c3,0xe529a2c1,0xd3e2e483,0xe529a2c1,0xe483e483,0xe483a2c1,0xa2c1d3e2,0xe483e529,0xa2c1d3e2,0xe529a2c1,0x2800a2c1,0x40804080,0xa2c14080,0x2800a2c1,0x40804080,0xa2c14080,0xa2c1d3e2, +0xe529a2c1,0x4800a2c1,0xbdc6bd86,0xa2c1bde7,0x4800eda2,0xbdc6bde7,0xeda2bd86,0xa2c1f684,0xdefb0000,0xe8e3ef5d,0xef5de8e3,0xef5def5d,0xef5dd6ba,0xdefbef5d,0xef5def5d,0x0000defb,0x92430000,0xbae4aac4,0xaac4bae4,0xbae4aac4,0xaac4bae4,0xbae4aac4,0xaac4bae4,0x00009243,0x92430000,0x81207900,0x79008120,0x81207900,0x79008120,0x81207900,0x79008120,0x00009243, +0xa2840000,0xa284bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xa284bae4,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0xa534a534,0x6b4d6b4d,0x5a6641a4,0x00000000,0x18a218c3,0x18a21082,0x18c318c3,0x10611061,0x18c31082,0x10821082,0x18c318c3,0x10611082,0x42084228,0x420839e7,0x42284228,0x31a639c7,0x420839e7,0x39c739e7,0x42284228,0x39c739c7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x104030e1,0x28e13101,0x39223922,0x28e13101,0x10403101,0x51a330e1,0x51a31040,0x39221040,0xef5cef3c,0xb5b6b5b6,0x39c6df1a,0x20c439c7,0xe75c39e7,0xd6fadeda,0xe6badeda,0xdeba41e7,0xd3e2a2c1,0xd3e2e483,0xe529a2c1,0xe483d3e2,0xe483a2c1,0xa2c1d3e2,0xe483e529,0xa2c1d3e2,0xd3e2a2c1,0x2800a2c1,0x40804080,0xa2c14080,0x2800a2c1,0x40804080,0xa2c12800,0xa2c1d3e2, +0xd3e2a2c1,0x4800eda2,0xb566b546,0xeda2bd86,0x4800eda2,0xb566bd86,0xeda24800,0xa2c1d3e2,0xdefb0000,0xe9a6ef5d,0xef5de8e3,0xef5def5d,0xe8e3ef5d,0xef5dd6ba,0xef5def5d,0x0000defb,0x92430000,0xa284a284,0xa284aac4,0xa284a284,0xa284aac4,0xa284a284,0xa284aac4,0x00009243,0x92430000,0x79007900,0x71007900,0x60a060a0,0x60a060a0,0x710060a0,0x79007900,0x00009243, +0xa2840000,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4a284,0xbae4bae4,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xa534a534,0x6b4d6b4d,0x6b4d6b4d,0x18a218a2,0x20e318c3,0x18a218a2,0x20e318a2,0x18a21082,0x20e320e3,0x18a218a2,0x20e32104,0x39e74208,0x4a494228,0x39e74208,0x4a494208,0x420839e7,0x4a494a49,0x39e74208,0x4a494a69,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x10603101,0x104028c1,0x39223922,0x28e11040,0x104051a3,0x51a328e1,0x51c31040,0x39221040,0xffffef5c,0xb5d6e77c,0x10c241e7,0x39a720c4,0xf75cef3c,0xef9cef3c,0xef7cef7c,0xef5cdeda,0xd3e2a2c1,0xd3e2e483,0xe483a2c1,0xe529d3e2,0xe529a2c1,0xa2c1e483,0xe483e529,0xa2c1d3e2,0xd3e2a2c1,0xa2c1e483,0x40802800,0xe5292800,0x2800a2c1,0x28002800,0xe483a2c1,0xa2c1d3e2, +0xd3e2a2c1,0xe4c2f6e6,0xb5064800,0xfff24800,0x4800eda2,0x48004800,0xf6e6eda2,0xa2c1d3e2,0xdefb0000,0xdefbef5d,0xd6badefb,0xdefbdefb,0xdefbdefb,0xdefbef5d,0xef5ddefb,0x0000defb,0xc6180000,0xa284c618,0xc618a284,0xa284c618,0xc618a284,0xa284c618,0xc618a284,0x0000c618,0x92430000,0x60a060a0,0x60a060a0,0x79008120,0x81208120,0x60a060a0,0x60a060a0,0x00009243, +0xa2840000,0xbae4bae4,0xbae4a284,0xa284bae4,0xbae4bae4,0xbae4a284,0xbae4bae4,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x52050000,0xa534a534,0xa534a534,0x20e320e3,0x18a218a2,0x20e320e3,0x18a218c3,0x20e318c3,0x18c318c3,0x210420e3,0x18c318c3,0x4a494228,0x42084208,0x4a494a49,0x42084208,0x4a494228,0x42284228,0x4a494a49,0x42284228,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x28c11020,0x104028c0,0x51a328e1,0x28e11040,0x104051a3,0x392228e1,0x39221880,0x51a31880,0xef9cd6db,0xef7ce73c,0xe6daef5c,0xdebaef7c,0xdebbdeda,0xb5b6e77c,0xe75cef5c,0xdedadeba,0xd3e2a2c1,0xa2c1e483,0xe483a2c1,0xe483e483,0xe529a2c1,0xa2c1e483,0xe483e483,0xa2c1e483,0xd3e2a2c1,0xa2c1e483,0x28002800,0xe483e483,0xe529a2c1,0xa2c12800,0xe483e483,0xa2c1e483, +0xd3e2a2c1,0xeda2e483,0x48004800,0xf6e6ffe7,0xfff2e4c2,0xeda24800,0xe483f6e6,0xa2c1e483,0xdefb0000,0xef5def5d,0xef5def5d,0xef5def5d,0xef5def5d,0xef5def5d,0xef5de8e3,0x0000defb,0xc6180000,0xc618ef5d,0xdefbc618,0xc618ef5d,0xdefbc618,0xc618ef5d,0xdefbc618,0x0000c618,0x92430000,0x81207900,0x79008120,0x81207900,0x79007900,0x81208120,0x79008120,0x00009243, +0xa2840000,0xa284bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4bae4,0xbae4a284,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x83280000,0x00008b87,0x00000000,0x18c318a2,0x21042104,0x18c320e3,0x18a218a2,0x10821082,0x18a21082,0x10821061,0x18a218a2,0x42284208,0x4a694a49,0x42284228,0x42084208,0x39c739e7,0x420839e7,0x39c731a6,0x420839e7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x28c11040,0x08203102,0x51a31040,0x28e11040,0x104051a3,0x51a328e1,0x39221880,0x49a31880,0xe75cf77c,0xdebadeda,0xe77cde9a,0xef1ce75c,0xef7be77c,0xef7ce75c,0xef5cef7b,0xef5cf75b,0xe529a2c1,0xa2c1e483,0xe483d3e2,0xd3e2e483,0xe483a2c1,0xa2c1e483,0xe483d3e2,0xa2c1e483,0xe529a2c1,0xa2c1e483,0xe483d3e2,0xd3e2e483,0xe483a2c1,0xa2c1e483,0xe483d3e2,0xa2c1e483, +0xe529a2c1,0xe4c2e483,0xffe7f7c5,0xd3e2f6e6,0xf6e6a2c1,0xe4c2ffe7,0xe483d3e2,0xa2c1e483,0xd6ba0000,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0x0000d6ba,0xc6180000,0xef5def5d,0xef5def5d,0xef5def5d,0xef5def5d,0xef5def5d,0xef5def5d,0x0000c618,0x92430000,0xef5d7900,0x79007900,0x79007900,0x79007900,0x79007900,0x79007900,0x00009243, +0xa2840000,0xa284a284,0xa284a284,0xa284a284,0xa284a284,0xa284a284,0xa284a284,0x0000a284,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x18a21082,0x10821082,0x18c318a2,0x10821082,0x18c318c3,0x10821061,0x18c318c3,0x10821082,0x39e739e7,0x39e739c7,0x42284208,0x39e739e7,0x42284228,0x39c739c7,0x42084208,0x39c739c7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x28e11860,0x51c33101,0x31011040,0x104049a3,0x28e128e1,0x392228e1,0x39223101,0x51c328e1,0xef7bb5b6,0xef7cef5c,0xbdd6ef7c,0xdefaef5c,0xe75ce6da,0xffffffff,0xef3cffff,0xb5b5ef7c,0xa2c1a2c1,0xa2c1d3e2,0xd3e2a2c1,0xa2c1d3e2,0xd3e2a2c1,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0xa2c1a2c1,0xa2c1d3e2,0xd3e2a2c1,0xa2c1d3e2,0xd3e2a2c1,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1, +0xa2c1a2c1,0xa2c1d3e2,0xf684e4c2,0xa2c1d3e2,0xd3e2a2c1,0xa2c1e4c2,0xd3e2d3e2,0xa2c1a2c1,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xc6180000,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0xdefbdefb,0x0000c618,0xc6180000,0xdefbdefb,0xdefbdefb,0x7900defb,0x60a060a0,0xdefbdefb,0xdefbdefb,0x0000c618, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x00000000,0x00000000,0x00000000,0x93a80000,0x00006286,0x00000000,0x00000000,0x00000000,0x51e37ac5,0x59e351e3,0x51c351c3,0x51c359e3,0x51e351e3,0x51c351e3,0x51c349a3,0x51e351c3,0x7bcf8430,0x73ae73ae,0x73ae738e,0x73ae73ae,0x73ae73ae,0x738e73ae,0x738e738e,0x738e738e,0x00000000,0x00000000,0x00000000,0x62860000,0x00003142,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa2c1a2c1,0xd3e2a2c1,0xd3e2a2c1,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0xd3e2d3e2,0xa2c1a2c1,0x69a669c7,0x38e34820,0x184158e2,0x38412882,0xab8ba2cb,0x92884924,0x38e338c3,0x514538e3, +0x5a27836b,0x72c96a88,0x7b2b5a27,0x392349a5,0x31023923,0x49c65a27,0x31023102,0x8b8c834b,0x49c27369,0x49c249c2,0x49c249c2,0x73697369,0x73697369,0x49c27369,0x49c249c2,0x49c249c2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x7b070000,0x00006aa6,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x8b468b46,0x93678b46,0x8b469367,0x93679367,0x8b468b46,0x93679367,0x72249367,0x94b294b2,0x94b294b2,0x94b29492,0x94929492,0x949294b2,0x94929492,0x94929492,0x73ae9492,0x00000000,0x00000000,0x00000000,0x9bc90000,0x00003963,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe483a2c1,0xd3e2e483,0xe483a2c1,0xa2c1d3e2,0xe483d3e2,0xa2c1e483,0xe483d3e2,0xa2c1e483,0x92aa69a6,0xab2c2041,0x69c75820,0x38415820,0x38414924,0x6841ab8b,0x8a4992cb,0x30c328a2, +0x5a4751e6,0x3102836b,0x41a549e6,0x31238b8c,0x7b0a4184,0x5a275a47,0x41644164,0x7b2a49c5,0x7ac57369,0xc4687ac5,0x7ac57ac5,0x736949c2,0x49c249c2,0x7ac57369,0x7ac57ac5,0x49c27ac5,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x7b070000,0x00006aa6,0x00000000,0x00000000,0x00000000,0x8b46aca9,0xa4497ac5,0xa449a449,0xa408a449,0xa4489367,0xa408a448,0xa408a408,0x72248b46,0x949294b2,0x9cf38c71,0x9cd39cf3,0x9cd39cd3,0x9cd394b2,0x9cd39cd3,0x9cd39cd3,0x73ae9492,0x00000000,0x00000000,0x00000000,0x62860000,0x00003983,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe483d3e2,0xe483e529,0xd3e2a2c1,0xa2c1d3e2,0xe483e529,0xa2c1d3e2,0xe483e483,0xd3e2a2c1,0x8269cbcf,0xcbae6186,0xaaeb7861,0x184159a6,0x988261c7,0x5820b34d,0x58209aeb,0x30c37a08, +0x8b8c4164,0x31236247,0x31023102,0x416472c9,0x7b2a5a27,0x41a5834b,0x418449a5,0x41844184,0xfdeb7369,0xffffc468,0x49c2feb3,0x49c27369,0x49c2c468,0xfdeb7369,0xffffc468,0x49c2c468,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x6ac70000,0x00003963,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x936782c5,0x8b469367,0xa4089367,0x8b467a84,0x8b468b46,0x93878b46,0x72249367,0x949294b2,0x94b28c71,0x949294b2,0x9cd394b2,0x94b28c71,0x94929492,0x94b294b2,0x7bef94b2,0x00000000,0x00000000,0x00000000,0x93a90000,0x00003963,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3e2d3e2,0xe483d3e2,0xa2c1e483,0xa2c1e483,0xe483e529,0xe483a2c1,0xa2c1e483,0xd3e2e483,0xa2cbc38e,0x30c32882,0x18412882,0x582061c7,0x18414124,0x7041c38e,0x71e78a69,0x59a68a87, +0x72c93102,0x72c93102,0x62683103,0x41846247,0x5a274184,0x6ac949a5,0x5a476267,0x51e649c5,0x73697369,0xc468fdeb,0x736949c2,0x7ac549c2,0x7369ffff,0x736949c2,0xc468fdeb,0x49c27ac5,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x6ac70000,0x00003963,0x00000000,0x00000000,0x00000000,0x72a56b6d,0x7ac56244,0x72a572a5,0x938772a5,0x7ac56244,0x7ac57ac5,0x936672a5,0x51e372a5,0x94928410,0x94928c51,0x8c719492,0x94b28c71,0x94928c51,0x8c718c71,0x94b28c71,0x7bcf8c71,0x00000000,0x00000000,0x00000000,0x9bea0000,0x00004184,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa2c1a2c1,0xe483d3e2,0xa2c1e483,0xa2c1e483,0xd3e2e483,0xe483d3e2,0xd3e2a2c1,0xa2c1e483,0x384159a6,0x8269ab2c,0x18416186,0x58208a69,0x71e79aeb,0x30412882,0x4924bb6d,0x30c33841, +0x62685206,0x7b2a3943,0x31026268,0x49c56247,0x39436268,0x6aa993cd,0x6aa96247,0x49a58bac,0x49c27369,0x7ac57369,0x736949c2,0xfdebfdeb,0x49c27369,0x49c27ac5,0x7ac57369,0x73697369,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x62860000,0x00003963,0x00000000,0x00000000,0x00000000,0x8b4631a6,0x8b4682a5,0x93679367,0xa4088b46,0x8b467a84,0x8b468b46,0xa4488b46,0x6a038b46,0x9cd34a69,0x9cd394b2,0x9cd39cf3,0x9cf39cd3,0x94b28c71,0x94b294b2,0x9cf394b2,0x7bef94b2,0x00000000,0x00000000,0x00000000,0x93a80000,0x000041a4,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe483a2c1,0xa2c1d3e2,0xa2c1a2c1,0xa2c1e529,0xa2c1e483,0xd3e2e529,0xe483a2c1,0xd3e2e529,0x78614924,0x8a69ab4a,0x104171e7,0x6841a2cb,0x71e78a69,0x18417a08,0x492461a6,0x79e77041, +0x41844184,0x72e96aa9,0x31023102,0x418472e9,0x6aa949a5,0x5a476aa9,0x31026268,0x6aa93102,0x7ac57ac5,0x736949c2,0x73697369,0x73697369,0x7ac549c2,0x7ac5c468,0x736949c2,0x736949c2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x7b070000,0x000049e4,0x00000000,0x00000000,0x00000000,0x8b46ac68,0x7a847a84,0x82c57a84,0x8b4682a5,0x7a847a84,0x62447a84,0x8b4682c5,0x6a038b46,0x9cf3a514,0x94b294b2,0x94b294b2,0x9cd394b2,0x8c719492,0x8c518c71,0x94b29492,0x841094b2,0x00000000,0x00000000,0x00000000,0x93880000,0x00003963,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe529d3e2,0xe483e483,0xe483e483,0x3960a2c1,0xa2c1a2c1,0xa2c1e483,0xd3e2e483,0xd3e2d3e2,0x49247a08,0x8061c38e,0x30e36020,0x4020a2cb,0x8228e550,0x59a6bc0c,0xd3ef5145,0x58205820, +0x52064164,0x624751c5,0x834b7b0a,0x39237b2a,0x7b0a5206,0x394341a5,0x31023102,0x6a884164,0xfffffdeb,0x49c2feb3,0x49c27369,0xfdeb7369,0xc4687ac5,0xc468ffff,0x736949c2,0x49c27ac5,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x7b070000,0x00006aa6,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x93679367,0x7ac59367,0x93678b46,0x8b469367,0x8b468b46,0x93679367,0x6a039367,0xa534ad75,0xa534a534,0x9cd3a514,0x9cf39cd3,0x9cd39cd3,0x9cd39cd3,0x94b29cd3,0x7bef94b2,0x00000000,0x00000000,0x00000000,0xf8000000,0x0000a800,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa2c1d3e2,0xa2c1a2c1,0xa2c1a2c1,0xb4203960,0xa2c1e540,0xd3e2e483,0xa2c1a2c1,0xa2c1a2c1,0x104171c7,0x886159a6,0xab8b8061,0xa2cb9b09,0x71c7b34d,0x41245145,0x084128a2,0xdd0fdc10, +0x9c0e6ac9,0x49c572e9,0x62885a27,0x310249a5,0x41844184,0x31026268,0x31023102,0x62686247,0xc468fdeb,0x73697ac5,0x7ac549c2,0x736949c2,0xfdeb7369,0x7ac5c468,0x736949c2,0x49c27ac5,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x84100000,0x0000738e,0x00000000,0x00000000,0x00000000,0x7ac59be7,0x936672a5,0x93669366,0x93879366,0x93877ac5,0x93669366,0x93669366,0x51e37ac5,0xad55b596,0xad55a514,0xa534a534,0xa534a534,0xad559cf3,0xa534a534,0xa534a534,0x8c51a514,0x00000000,0x00000000,0x00000000,0xfff2f800,0xf800ffff,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3e2a2c1,0xe483d3e2,0x3960e483,0xe540b420,0x3960b420,0xa2c1a2c1,0xe483e483,0xd3e2e529,0x8a6971e7,0x51652882,0xc38e9aaa,0x41044924,0x284161a6,0x92aa30c3,0x30c35820,0x90824020, +0x626862a9,0x41846a88,0x418449a5,0x49c53102,0x6ac95206,0x5a476268,0x62686268,0x72e93923,0x73697369,0x49c27369,0x7ac57ac5,0x736949c2,0x736949c2,0x7ac5fdeb,0x7ac57369,0x49c2feb3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x7bef0000,0x0000738e,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x8b4682c5,0x93679367,0xa4089367,0x8b467a84,0x93677ac5,0xa4499367,0x72249367,0xbdd7c638,0xb5b6b596,0xb5b6b596,0xbdf7b5b6,0xb596ad75,0xb596ad75,0xbdd7b596,0xa514b596,0x00000000,0x00000000,0x00000000,0xfec0f800,0xf800fc60,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe483d3e2,0xe483e483,0x3960a2c1,0xb420e540,0xa2c13960,0xd3e2e483,0xe483a2c1,0xd3e2d3e2,0x8a695820,0x59a671e7,0x18415965,0x514530c3,0x604161c7,0x8a69b32c,0x8a6961a6,0x30415820, +0x6a883102,0x41843923,0x6a88836b,0x39236aa9,0x394341a5,0x3102836b,0x6a886268,0x6a8841a5,0x49c27369,0xc46849c2,0xc468feb3,0x736949c2,0x49c27ac5,0x73697369,0xc4687ac5,0x49c2ffff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x8b46ac68,0x8b466244,0x8b468b46,0xa4089367,0x8b4682a5,0x8b468b46,0xa4088b46,0x6a038b46,0xc618ce59,0xc618b5b6,0xc618c618,0xc618c618,0xb5b6b596,0xb596b596,0xbdd7b596,0xa514b596,0x00000000,0x00000000,0x00000000,0xf8000000,0x0000f800,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa2c1a2c1,0xa2c1a2c1,0xa2c1e483,0x39603960,0xe483e483,0xe483a2c1,0xa2c1d3e2,0xa2c1a2c1,0x8aaa4820,0x59a671c7,0x602069c7,0x30c38a69,0xdc10bb6d,0x92aa8249,0x59a692a8,0x28821041, +0x392341a5,0x62683923,0x51e63102,0x6a883123,0x41a53943,0x31035a47,0x72c96a88,0x41648bac,0x7ac57369,0xfeb37ac5,0xfeb3ffff,0x736949c2,0xffffc468,0x49c249c2,0xfdeb7369,0x49c2c468,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x8b46b4aa,0x8b467a84,0x93678b46,0xa4089367,0x8b4682c5,0x7ac58b46,0xa4488b46,0x72248b46,0xc638ce79,0xc638bdf7,0xc638c618,0xc618c618,0xb5b6b5b6,0xb596b5b6,0xbdf7b5b6,0xa514b5b6,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3e2a2c1,0xe483e483,0xd3e2d3e2,0xe483a2c1,0xe483d3e2,0xa2c1e483,0xe529e483,0xa2c1d3e2,0xc38ee530,0x59a68a87,0x8aaac38e,0x20418aaa,0x928a59a6,0xab0c9269,0xab6a4104,0x59a67861, +0x41a551e6,0x72ea6ac9,0x31023923,0x836b49a5,0x628841a5,0x7b0a5a67,0x4184834b,0x5a6751e6,0x73697369,0xc468fdeb,0xc468feb3,0x736949c2,0xc468fdeb,0x49c27ac5,0x73697369,0x49c2fdeb,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x72a59ba7,0x62446224,0x62446244,0x7ac56244,0x62446244,0x62246224,0x72a56224,0x51e37ac5,0xbdf7c638,0xbdd7bdd7,0xbdd7bdd7,0xbdd7b5b6,0xad75b596,0xad55ad55,0xad75ad55,0x9cf3ad75,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe483d3e2,0xe483e483,0xe483a2c1,0xe483a2c1,0xa2c1e483,0xd3e2e483,0xd3e2a2c1,0xd3e2e483,0x41247228,0x59a61041,0x69e7aaeb,0xab8ba2eb,0x492430c3,0x38e32882,0xbb6d4924,0x59a68861, +0x39234184,0x31027b0a,0x62687b0a,0x5a473102,0x394341a5,0x49a549a5,0x41844184,0x93cd49c5,0x49c27369,0xfdeb7369,0x7ac57ac5,0x49c27369,0xfdeb7369,0x73697ac5,0x49c249c2,0x49c27369,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x8b468b46,0x8b468b46,0x8b468b46,0x93679367,0x8b469367,0x93677ac5,0x6a039367,0xc638d69a,0xc638c638,0xc638c638,0xc638c638,0xbdf7c638,0xbdd7bdf7,0xb5b6b596,0xa514b5b6,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe529d3e2,0xa2c1e529,0xe483e483,0xe529a2c1,0xa2c1e483,0xe483e483,0xa2c1e529,0xd3e2d3e2,0x71e75986,0x28828a69,0x80614924,0x5820c38e,0x10412061,0x58207a08,0x59a62882,0x8a8a3841, +0x49a56288,0x31026268,0x62473923,0x5a473923,0x31025a47,0x3102834b,0x41644184,0x41645206,0x7ac57ac5,0x736949c2,0x73697ac5,0x7ac549c2,0x736949c2,0x49c27369,0xc468c468,0x736949c2,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x93878b46,0xa448a448,0xa408a408,0xa4088b46,0xa448a408,0xa448a408,0x6a039367,0xc638d69a,0xc638c638,0xce79ce79,0xce59ce79,0xce59c638,0xce59ce59,0xc618c618,0xa534b5b6,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xe529a2c1,0xe529a2c1,0xd3e2e483,0xd3e2a2c1,0xa2c1e483,0xe483e483,0xd3e2e483,0xa2c1a2c1,0xa2cbc38e,0x8a694020,0x49241841,0x8061c38e,0x58204924,0x582092aa,0x69646841,0xab0c6186, +0x52064184,0x62476ac9,0x62476aa9,0x51e67b0a,0x39233943,0x62686268,0x31023102,0x49c65a47,0xffff7ac5,0x49c2c468,0xfdeb7369,0xffffc468,0x736949c2,0x7ac5fdeb,0xfffffeb3,0x49c2c468,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x8b466b6d,0x8b467a84,0x93678b46,0xa4489367,0x93677a84,0x93679367,0xa4499367,0x6a039367,0xc6188410,0xc618bdd7,0xc618c618,0xce59c618,0xc618bdd7,0xc618c618,0xc638bdf7,0xad55bdf7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0xa2c1a2c1,0xd3e2d3e2,0xd3e2a2c1,0xa2c1d3e2,0xd3e2a2c1,0xd3e2d3e2,0xd3e2a2c1,0xa2c1a2c1,0xa2cbc38e,0x9a8aa2cb,0x71e7c42d,0x49245145,0x80614924,0xa2cbc38e,0x492471e7,0x8228aaeb, +0x62475a47,0x49c53943,0x41643943,0x31023923,0x49a541a5,0x628849a5,0x39234184,0x52063102,0x7ac5fdeb,0x73697ac5,0x73697369,0x7ac5fdeb,0x73697369,0xfdeb7369,0xc468fdeb,0x73697ac5,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x00000000,0x00000000,0x00000000,0x62860000,0x00003142,0x00000000,0x00000000,0x00000000,0x7ac531a6,0x7ae56244,0x72a572a5,0x93667ae5,0x7ac56244,0x18c37ac5,0x936651c3,0x51e351c3,0xbdd74a69,0xbdd7b596,0xb596b596,0xb596b596,0xb596a534,0xb596ad75,0xb596bdd7,0x9cf3a514,0x00000000,0x49c46265,0x00000000,0x00000000,0x00000000,0x00000000,0x41834183,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x61a261a2,0x71e238c1,0x59825982,0x69c24921,0x41215982,0x69e24921,0x49415982,0x38e171e2,0x7aa67aa6,0x9b484142,0x7aa67aa6,0x9b4861e4,0x61e47aa6,0x9b4861e4,0x61e47aa6,0x41429b48, +0x00000000,0x000005e2,0x00000000,0x07020000,0x00000340,0x06220000,0x00000000,0x00000000,0x00000000,0x14c23e60,0x000004a2,0x3d210000,0x05c20340,0x3cc20000,0x00000000,0x00000000,0x000004c2,0x02a06481,0x01c05c01,0x6d000000,0x53e209a0,0x64610280,0x04420000,0x00000000,0x0b603c02,0x12006481,0x1a606481,0x64810000,0x5c0111e0,0x5be222c0,0x5c010000,0x000001c0, +0x096063e1,0x09605bc2,0x11e06401,0x64010000,0x534200c0,0x53620980,0x53820000,0x00000980,0x01005321,0x00205321,0x00004ac1,0x42a10000,0x42810060,0x53420060,0x6c210000,0x000000e0,0x00805b61,0x008063a2,0x00c06382,0x63820000,0x42810000,0x63a20080,0x53010000,0x00000940,0x090052e1,0x00606ba1,0x00c052e1,0x52e10000,0x42410040,0x63620060,0x4aa10000,0x000000a0, +0x00000000,0x00000000,0x00000000,0x9bc90000,0x00003963,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x8b467a84,0x93678b46,0xa4089367,0x936782c5,0x42088b46,0x18c32965,0x72247224,0xc638c618,0xc618bdd7,0xc638c618,0xce59c618,0xc618bdd7,0xb5b6bdd7,0xa534bdd7,0x9cf3a534,0x62650000,0x5a448b87,0x5a245a24,0x5a246a85,0x62656265,0x5a246265,0x6a85ac4a,0x00006265, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x494161a2,0x69e230c1,0x412169c2,0x412130c1,0x412169c2,0x516130c1,0x30c14121,0x598271e2,0x61e47aa6,0x9b484142,0x61e49b48,0x61e44142,0x61e49b48,0x7aa64142,0x414261e4,0x7aa69b48, +0x00000000,0x00000000,0x00000000,0x05620000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x000006a2,0x00000000,0x3d810000,0x00000380,0x07220000,0x14620000,0x00000000,0x00000000,0x01e04502,0x02e03c42,0x5c210000,0x3ce20280,0x34020240,0x00000000,0x00000000,0x13c14da1,0x0b406481,0x02006cc1,0x64610000,0x75202b21,0x45610220,0x3c420000,0x00000240, +0x0a606401,0x226063e1,0x11e06c61,0x53620000,0x64010100,0x63e11a40,0x64210000,0x00000140,0x09805ba1,0x09804b01,0x01404ae1,0x53210000,0x53210100,0x6c010100,0x5b820000,0x00000100,0x11a05b42,0x00e05b41,0x09406382,0x4aa10000,0x5b410940,0x5b210000,0x6bc20000,0x00000920,0x09406ba1,0x19e05b21,0x00e06382,0x5b010000,0x5b2100a0,0x5b210080,0x63610000,0x00000060, +0x00000000,0x00000000,0x00000000,0x62860000,0x00003983,0x00000000,0x00000000,0x00000000,0x8b46aca9,0x82c56244,0x82c582c5,0x8b4682c5,0x82a582c5,0x7a8482a5,0x8b467a84,0x72248b46,0xc638c618,0xbdf7bdd7,0xc618c618,0xc618c618,0xbdd7bdf7,0xb596b5b6,0xb5b6b596,0xa514b5b6,0xa4090000,0x6a856265,0xac4a8b87,0x8b87ac4a,0xac4aac4a,0xa4098b87,0x5a448b87,0x0000a409, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x59824941,0x51624921,0x41214122,0x61a24101,0x410161a2,0x516130c0,0x30c14121,0x59825982,0x7aa661e4,0x7aa661e4,0x61e45a05,0x9b4861e4,0x61e49b48,0x7aa64142,0x414261e4,0x7aa67aa6, +0x00000000,0x00000000,0x00000000,0x000005c2,0x00000000,0x00000000,0x00000000,0x00000000,0x05a20000,0x00000000,0x00000000,0x3dc10000,0x00001d63,0x00000000,0x00000642,0x00000000,0x00000000,0x1d023c62,0x00000502,0x3ce21462,0x04a20320,0x3ce20000,0x00000000,0x00000000,0x000005c1,0x13e14d81,0x02c03c82,0x7d600000,0x44a233e1,0x4e0002c0,0x04a10000,0x0b800000, +0x13c14cc2,0x2b2174c1,0x22a06c61,0x5ba10000,0x74a10980,0x6c412240,0x5bc20000,0x00000a20,0x1a206c01,0x1a006c21,0x226063c2,0x63a10000,0x5ba20140,0x74810140,0x63a10000,0x00003320,0x1a207421,0x11c06381,0x2a406be2,0x6bc20000,0x42610920,0x6bc20940,0x63c20000,0x00000920,0x09606be2,0x09007c61,0x09206381,0x63610000,0x63420900,0x5b420920,0x5b210000,0x00000920, +0x00000000,0x00000000,0x00000000,0x93a90000,0x00003963,0x00000000,0x00000000,0x00000000,0x9367b4aa,0xa4499367,0xa408a449,0xa408a449,0xa4088b46,0xa408a408,0x9387a448,0x72249367,0xc638c618,0xce79c638,0xce79ce79,0xce79ce79,0xce59c618,0xc638ce59,0xbdd7c618,0xa514b5b6,0x00000000,0x6a85ac4a,0x00000000,0x00000000,0x00000000,0x00000000,0x49a3a409,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c14941,0x69c24121,0x41015161,0x61a228a0,0x41013901,0x51614101,0x69c24121,0x69e269c2,0x414261e4,0x9b4861e4,0x61e47aa6,0x9b484142,0x61e461e4,0x7aa661e4,0x9b4861e4,0x9b489b48, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x07220000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x000006c1,0x06410000,0x45610000,0x00000b60,0x05620000,0x0b800000,0x00000000,0x00000000,0x02804e00,0x1c824521,0x7e000000,0x45010b60,0x456101c0,0x00000000,0x00000581, +0x0a605600,0x13c18560,0x018074e1,0x64010000,0x74a11200,0x4ce20a60,0x44a20000,0x00000220,0x13407481,0x33007481,0x00807cc1,0x63e10000,0x63e11a20,0x74811a00,0x8d600000,0x00002aa0,0x3b207c81,0x2a607441,0x19c084a1,0x63c20000,0x6bc211a0,0x63a219e0,0x63c20000,0x00003300,0x2a407401,0x19c06ba1,0x2a406bc2,0x6ba20000,0x6bc20900,0x6ba119c0,0x6bc20000,0x00002a60, +0x00000000,0x00000000,0x00000000,0x9bea0000,0x00004184,0x00000000,0x00000000,0x00000000,0x72a59be7,0x93877ac5,0x93669366,0x93879366,0x93877ac5,0x93879387,0x93669366,0x51e372a5,0xbdf7bdd7,0xce59c618,0xc638c638,0xc638c638,0xc638bdf7,0xc638c638,0xbdf7bdf7,0x9cf3b596,0x00000000,0x49a36265,0x00000000,0x00000000,0x00000000,0x00000000,0x41835a24,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x41215982,0x61a24121,0x39015161,0x49413901,0x49412965,0x61a228a0,0x61a24101,0x30c14121,0x61e47aa6,0x9b4861e4,0x61e47aa6,0x7aa661e4,0x7aa652aa,0x9b484142,0x9b4861e4,0x414261e4, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x03800562,0x00000000,0x00000000,0x00000000,0x00000000,0x06020000,0x000014a2,0x00000000,0x45a10000,0x00000be1,0x00000000,0x000005a2,0x00000000,0x00000000,0x13c144e2,0x00000660,0x4da10280,0x042113a1,0x4dc10000,0x00000000,0x00000000, +0x000004a0,0x138055e1,0x0b004402,0x6c810000,0x4cc21a20,0x44a213a1,0x04600000,0x2d220000,0x13205d81,0x22608540,0x3ba15b41,0x74810000,0x74813361,0x7ca143e1,0x7ce10000,0x00001340,0x2ac09560,0x2aa084c1,0x2a407441,0x74410000,0x74612240,0x744119e0,0x8d400000,0x000032c0,0x32c08ca1,0x11807c41,0x438184a1,0x6ba20000,0x7c412200,0x6bc219a0,0x8cc10000,0x000032e0, +0x00000000,0x00000000,0x00000000,0x93a80000,0x000041a4,0x00000000,0x00000000,0x00000000,0x8b46b4aa,0x000082a5,0x00000000,0xa4080000,0x00007a84,0x00000000,0xa4480000,0x6a038b46,0xc638c618,0x0000bdf7,0x00000000,0xce790000,0x0000bdf7,0x00000000,0xce590000,0xa514bdf7,0x62650000,0x6265a409,0x5a245a24,0x62655a24,0x62656265,0x62656265,0x6265a409,0x00006265, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x41215982,0x61a261a2,0x39014941,0x492128a0,0x38e14921,0x598228a0,0x61a23901,0x412139e7,0x61e47aa6,0x9b489b48,0x61e47aa6,0x7aa64142,0x61e47aa6,0x9b484142,0x9b4861e4,0x61e46b6d, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x000005a2,0x00000000,0x00000000,0x00000000,0x00000000,0x06810000,0x00000000,0x00000000,0x05e20000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x000005c1,0x04c10000,0x4de11421,0x00000b40,0x05610000,0x14410000,0x00000000, +0x00000000,0x13c155a1,0x13404d41,0x74810000,0x55e11340,0x55a11340,0x00000000,0x00000700,0x1b805561,0x1b807cc1,0x24418dc0,0x8d800000,0x960043e1,0x5da112c0,0x5d810000,0x000012c0,0x3b218d20,0x11a084e1,0x32e084a1,0x84a10000,0x74612240,0x8d002ac0,0x8d200000,0x00003b21,0x2a409500,0x2a407401,0x4361a5c0,0x84810000,0x7c412a40,0x8cc119c0,0x95400000,0x00001160, +0x00000000,0x00000000,0x00000000,0x93880000,0x00003963,0x00000000,0x00000000,0x00000000,0x8b46ac68,0x00007a84,0x00000000,0xa4480000,0x00007a84,0x00000000,0xa4080000,0x6a038b46,0xc618c618,0x0000bdf7,0x00000000,0xce790000,0x0000bdf7,0x00000000,0xce590000,0xa534c618,0xa4090000,0x5a448b87,0xac4aac4a,0x8b878b87,0x8b878b87,0xa409a409,0x5a44ac4a,0x0000a409, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c15982,0x410161a2,0x49413901,0x516238e1,0x38e14121,0x39015162,0x28a03901,0x516161a2,0x41427aa6,0x61e49b48,0x7aa661e4,0x9b4861e4,0x61e47aa6,0x61e49b48,0x414261e4,0x7aa69b48, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x01c004e2,0x00000000,0x00000000,0x00000000,0x00000000,0x05210000,0x00000b60,0x06210000,0x4d810000,0x00001441,0x00000000,0x13e10620,0x00000000, +0x00000000,0x13c15600,0x00000560,0x55811bc1,0x05601bc1,0x55810000,0x00000000,0x00000000,0x00005da1,0x1bc15da1,0x1be15e60,0x96000000,0x55211a20,0x5e000a80,0x55210000,0x13400000,0x1b809580,0x3b817421,0x2a808d20,0x84a10000,0x8d2032e0,0x8d402ac0,0x95600000,0x000009c0,0x4bc184a1,0x3b2184a1,0x2a409da0,0x8ca10000,0x7c413b00,0x7c413b21,0x74010000,0x000019a0, +0x00000000,0x00000000,0x00000000,0x7b070000,0x000049e4,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x000082c5,0x00000000,0xa4490000,0x000082c5,0x00000000,0xa4490000,0x6a039367,0xc638c618,0x0000c618,0x00000000,0xce590000,0x0000bdd7,0x00000000,0xc6380000,0xa514bdf7,0x00000000,0x6a85ac4a,0x00000000,0x00000000,0x00000000,0x00000000,0x6a85ac4a,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c05982,0x49415161,0x38e13901,0x516128a0,0x20a030e1,0x38e15162,0x28a03901,0x41215161,0x41427aa6,0x7aa67aa6,0x61e461e4,0x9b484142,0x414261e4,0x61e49b48,0x414261e4,0x61e47aa6, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000422,0x00000000,0x00000000,0x00000000,0x00000000,0x05810000,0x00000000,0x00000000,0x06200000,0x00000000,0x00000000,0x000005e1,0x00000000, +0x00000000,0x000005c0,0x05c00000,0x56000b20,0x00000a60,0x05000000,0x1c210000,0x00000000,0x00000000,0x13005e00,0x24015e00,0x74810000,0x54e21ba1,0x5e201340,0x00000000,0x00005d81,0x000065a1,0x43e195c0,0x2ac084e1,0x8d400000,0x8d203b61,0x95603b81,0x4c420000,0x1b800000,0x32e0a5e0,0x43819d60,0x43818ca1,0x95400000,0x9d602a60,0x7c4132e0,0x7c410000,0x00003b00, +0x00000000,0x00000000,0x00000000,0xfff20000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x7ac59be7,0x62246224,0x62246224,0x7ac56224,0x62446244,0x62246244,0x72a56224,0x51e37ac5,0xbdf7bdd7,0xb5b6b5b6,0xb596b596,0xbdd7b596,0xb5b6b5b6,0xb5b6b5b6,0xbdd7b5b6,0xa514bdd7,0x00000000,0x41835a24,0x00000000,0x00000000,0x00000000,0x00000000,0x41835a24,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c069c2,0x49415161,0x28a03901,0x514128a0,0x208030c1,0x49214121,0x39013901,0x516161a2,0x41429b48,0x7aa67aa6,0x414261e4,0x9b484142,0x414261e4,0x7aa67aa6,0x61e461e4,0x7aa69b48, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1c8205e1,0x00000000,0x00000000,0x00000000,0x00000000, +0x06000000,0x00001c41,0x05200000,0x4cc20000,0x00000b20,0x00000000,0x24a20600,0x00000000,0x00000000,0x1b805541,0x00006620,0x5de12401,0x5d810ac0,0x55010000,0x00000000,0x00000000,0x00000000,0x32c09e00,0x2c828d00,0x95a00000,0x95c032e0,0x8d402c82,0x00000000,0x000065a1,0x42009540,0x43a1a5c0,0x32e0a5c0,0x8cc10000,0x954019a0,0xa5c03b20,0x95400000,0x00002140, +0x00000000,0x00000000,0x00000000,0xfec00000,0x0000fc60,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x93679367,0xa449a448,0xa408a449,0x8b468b46,0x9387a408,0xa449a449,0x72249367,0xc638c618,0xc618c638,0xce59ce59,0xce59ce79,0xc618c618,0xc638ce59,0xce59ce79,0xa534c618,0x62650000,0x6265ac4a,0x5a245a24,0x62655a24,0x62656265,0x5a245a24,0x6a85ac4a,0x00006265, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x516169c2,0x494161a2,0x28a03901,0x412128a0,0x20a030e1,0x49215162,0x41014941,0x516161a2,0x7aa69b48,0x7aa69b48,0x414261e4,0x7aa64142,0x414261e4,0x7aa69b48,0x61e47aa6,0x7aa69b48, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x02400660,0x00000000,0x00000000,0x00000000,0x00000000, +0x06200000,0x00000000,0x00000000,0x05400000,0x00000000,0x00000000,0x00000680,0x00000000,0x00000000,0x00005dc1,0x5e400000,0x55210a80,0x00001300,0x55610000,0x00000000,0x00000000,0x00000000,0x1b008d20,0x00006e80,0x8d401b40,0x6e803b81,0x8d200000,0x00000000,0x00000000,0x00208be2,0x32e0a5e0,0x31809540,0x7c410000,0x9d602a60,0x7c613180,0x7b420000,0x39c00000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x8b466b6d,0x00006244,0x00000000,0xa4080000,0x000082a5,0x00000000,0xa4080000,0x6a038b46,0xc6188410,0x0000b5b6,0x00000000,0xce590000,0x0000bdf7,0x00000000,0xce590000,0xa534c618,0xa4090000,0x62656265,0xac4aac4a,0x8b87ac4a,0x8b878b87,0xac4a6265,0x5a448b87,0x0000a409, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x41214921,0x410161a2,0x39013901,0x516228a0,0x38e130e1,0x28a05162,0x41014941,0x69c261a2,0x61e461e4,0x61e49b48,0x61e461e4,0x9b484142,0x61e461e4,0x41429b48,0x61e47aa6,0x9b489b48, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000481,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x0b200640,0x00000000,0x00000000,0x00000000,0x00000000,0x5e400000,0x00001320,0x54e20000,0x55410000,0x000009c0,0x00000000,0x1be15e20,0x00000000,0x00000000,0x00005d41,0x65810000,0x95c023e1,0x00004c02,0x54a20000,0x1b000000,0x00000000,0x00005a82,0x43419520,0x00008382,0x8cc14a20,0x838232c0,0xa5c02940,0x00000000,0x18e08ba2, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x7a8431a6,0x00007a84,0x00000000,0xa4080000,0x000082c5,0x00000000,0xa4480000,0x72248b46,0xbdf74a69,0x0000bdd7,0x00000000,0xce590000,0x0000bdf7,0x00000000,0xce590000,0xad55c618,0x00000000,0x5a448b87,0x00000000,0x00000000,0x00000000,0x00000000,0x6265a409,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x41215982,0x51615161,0x39013901,0x49215982,0x28a04921,0x29655982,0x41014941,0x69c230c0,0x61e47aa6,0x7aa67aa6,0x61e461e4,0x7aa69b48,0x41427aa6,0x52aa9b48,0x61e47aa6,0x9b484142, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x1c610520,0x00000000,0x00000000,0x00000000,0x00000000,0x55610000,0x00000000,0x00000000,0x4c420000,0x00000000,0x00000000,0x00005e00,0x00000000,0x65a10000,0x00001280,0x66000000,0x9e200000,0x00001b20,0x00000000,0x1b605d41,0x00000000,0x00000000,0x42209d80,0x93e10000,0x95202940,0x7b4232c0,0x95000000,0x00000000,0x00007302, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x72a59ba7,0x00006224,0x00000000,0x93870000,0x00006244,0x00000000,0x93660000,0x51e37ac5,0xbdf7bdd7,0x0000b5b6,0x00000000,0xc6380000,0x0000b5b6,0x00000000,0xc6180000,0xa514bdf7,0x00000000,0x49a35a24,0x00000000,0x00000000,0x00000000,0x00000000,0x41835a24,0x00000000, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x41215982,0x318669c2,0x39015161,0x59823901,0x28a04941,0x49414941,0x41214101,0x69c230c1,0x61e47aa6,0x52aa9b48,0x61e47aa6,0x9b4861e4,0x41427aa6,0x7aa67aa6,0x61e461e4,0x9b484142, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000640,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x13405e40,0x00000000,0x00000000,0x00000000,0x00000000,0x5ce20000,0x00000000,0x00000000,0x5d610000,0x00000000,0x00000000,0x000065a1,0x00000000,0x00000000,0x000093c1,0x7b420000,0x95200000,0x000039a0,0x93e10000,0x39a00000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x7a847a84,0x7a847a84,0x8b4682a5,0x82c582c5,0x82a582c5,0x93676244,0x6a039367,0xc638c618,0xbdd7bdd7,0xbdd7bdd7,0xc618bdf7,0xbdf7bdf7,0xbdf7bdf7,0xc618b5b6,0xa534bdf7,0x62650000,0x5a448b87,0x62656265,0x62656265,0x62656265,0x5a245a24,0x6a856265,0x00006265, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c171e2,0x69c269c2,0x41015161,0x494128a0,0x28a04941,0x410161a2,0x41214121,0x59824121,0x41429b48,0x9b489b48,0x61e47aa6,0x7aa64142,0x41427aa6,0x61e49b48,0x61e461e4,0x7aa661e4, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x1b605d81,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x3b6184c1,0x00000000,0x00000000,0x00000000,0x00000000,0x7b620000,0x00002120,0x00000000,0x83a20000,0x00000000,0x00000000,0x294083a2,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x9367b4aa,0x7ac58b46,0x8b468b46,0x8b468b46,0x8b468b46,0x8b468b46,0x8b468b46,0x6a039367,0xc618bdf7,0xbdd7bdf7,0xc618c618,0xc618c618,0xc618c618,0xc618c618,0xc618c618,0xa534c618,0xa4090000,0x49a3a409,0x8b878b87,0xa409a409,0xac4aac4a,0xa409ac4a,0x62658b87,0x0000a409, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x30c14941,0x51625982,0x41215161,0x61a230c0,0x30c04101,0x41215161,0x41214121,0x71e230c1,0x414261e4,0x7aa67aa6,0x61e47aa6,0x9b484142,0x414261e4,0x61e47aa6,0x61e461e4,0x9b484142, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00005da1,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x240195a0,0x00000000,0x00000000,0x00000000,0x00000000,0x73220000,0x00000000,0x00000000,0x10c08ba2,0x00000000,0x00000000,0x00007b42,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xac68b4aa,0xac68ac68,0xb4aaac68,0xaca9b4aa,0xb4aaac68,0xb4aab4aa,0xb4aab4aa,0x8b46b4aa,0xa514a534,0xad75a534,0xbdf7b5b6,0xbdf7c618,0xbdf7bdf7,0xc618c618,0xc638c638,0xbdd7c638,0x00000000,0x5a448b87,0x00000000,0x00000000,0x00000000,0x00000000,0x6a85ac4a,0x00000000, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x49417202,0x69e271e2,0x41214121,0x69c269c2,0x30c04121,0x412169c2,0x69e25982,0x71e24921,0x61e49b48,0x9b489b48,0x61e461e4,0x9b489b48,0x414261e4,0x61e49b48,0x9b487aa6,0x9b4861e4, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00006620,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00006b02,0x00000000,0x00000000,0x00000000,0x00000000, +0xce79c618,0xe71cf79e,0xd6bace59,0xffdff79e,0xd69adedb,0xf79ee73c,0xce79ce59,0xf79eef7d,0x1aaf220a,0x1aaf220a,0x2a4b1aaf,0x1aaf1aaf,0x1aaf22d0,0x1aaf1168,0x328c1aaf,0x2a4b1aaf,0xffffffff,0xefffffff,0xe79eefff,0xe79ee79e,0xe79ee79e,0xffffefff,0xefffe79e,0xffffe79e,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0x7aa79369,0x9369bc2b,0x7aa79369,0x93698430,0x93699369,0x7aa77aa7,0x93699369,0x59e57aa7,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x0a020000,0x142413e4,0x140313a3,0x09c20b63,0x14030a02,0x0b8313e4,0x13e31403,0x00000b03,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa5569d15,0x94d49d15,0xa536add9,0xa55794f4,0xad779d36,0x9d159d15,0x9d369d15,0x94f49d15,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x31652904,0x31653165,0x31653165,0x31653165,0x31653165,0x31653165,0x31653145,0x31653165,0x31652904,0x31653165,0x31653165,0x31653165,0x31653165,0x31653165,0x31653145,0x31653165, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xf7bef7be,0xdedbdefb,0xe71cf79e,0xef5de73c,0xef7dffff,0xd69ad69a,0xe73ce71c,0xce59d6ba,0x00000a0d,0x000022f0,0x1aaf0000,0x00000000,0x00000000,0x000022d0,0x124e0000,0x1aaf0000,0xefffffff,0xe79effff,0xe79ee79e,0xffffe79e,0xffffffff,0xffffffff,0xefffffff,0xe79eefff,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0x7aa79369,0xbc2b59e5,0x59e57aa7,0x59e57aa7,0x7aa77aa7,0x59e57aa7,0x7aa77aa7,0x93699369,0x0b030000,0x01410000,0x0b030b03,0x0b030000,0x00000141,0x0b030b03,0x01410000,0x00000b03,0x0a020000,0x146413e4,0x14240ba3,0x00000ac2,0x13e40a02,0x13a31464,0x13a31424,0x00000b03,0x0b030000,0x0b030b03,0x0b030b03,0x0b030b03,0x0b030b03,0x0b030b03,0x0b030b03,0x00000b03, +0x9d16a536,0x9d159d15,0x9d16a536,0xa556a536,0xa5368cb3,0x9d1594b4,0x9cf5a557,0xa5369d15,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x854b0000,0x00006c28,0xaece0000,0x0000854b,0x7aa83165,0x72877287,0x8ae87287,0x72878ae8,0x8ae88ae8,0x82a87287,0x8ae88ae8,0x31657aa8,0x7aa83165,0x72877287,0x8ae87287,0x72878ae8,0x8ae88ae8,0x82a87287,0x8ae88ae8,0x31657aa8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe73ce73c,0xffffffdf,0xef5df79e,0xd6bae71c,0xdedbbdd7,0xf79ee73c,0xdedbdedb,0xfffff79e,0x126e220a,0x1aaf220a,0x220a1aaf,0x1aaf1aaf,0x22d01aaf,0x126e220a,0x19a81aaf,0x220a1aaf,0xefffefff,0xe79eefff,0xefffefff,0xe79eefff,0xefffffff,0xe79eefff,0xffffffff,0xefffefff,0x755f8dff,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f8dff,0x755f755f,0x755f755f, +0x93697aa7,0x7aa77aa7,0x7aa759e5,0x93699369,0x59e57aa7,0x59e5bc2b,0xbc2b7aa7,0x93699369,0x0b030000,0x14030aa2,0x0b431444,0x0ba30aa2,0x0aa21444,0x14241403,0x0aa20aa2,0x00000b03,0x01410000,0x13e30b83,0x14241403,0x0b030bc3,0x0b630141,0x13a313e4,0x14641464,0x00000b03,0x0b030000,0xdef3def3,0xdef3def3,0xded3def3,0xded3def3,0xdef3def3,0xdef3def3,0x00000b03, +0xa557adb9,0x8c939cf5,0x9d159d15,0xad779d15,0xad77a536,0xa536a557,0x9d15a556,0x9d16a557,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xe77b0000,0x0000960c,0xaece7605,0x0000854b,0x72873165,0x498492c7,0x49849b29,0x39439b29,0x41649b29,0x394392e8,0x394382a7,0x31657287,0x72873165,0x9b2992c7,0x9b299b29,0x72879b29,0x92e87287,0x82a792e8,0x82a782a7,0x31657287, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd69ad6ba,0xbdf7bdd7,0xf7bef79e,0xb5b6c638,0xef5ddefb,0xe73ce71c,0xffffffff,0xc618e73c,0x00001aaf,0x00001aaf,0x1aaf0000,0x00000000,0x00000000,0x00001aaf,0x1aaf0000,0x1aaf0000,0xffffefff,0xe79eefff,0xe79ee79e,0xffffefff,0xffffffff,0xe79eefff,0xe79ee79e,0xe79ee79e,0x8dff755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0xffff755f,0x755f755f,0x755f755f, +0x59e57aa7,0x7aa79369,0x93699369,0x7aa7bc2b,0x7aa77aa7,0x7aa77aa7,0x7aa77aa7,0xbc2bbc2b,0x0b030000,0x14031444,0x00000b43,0x14241403,0x0b431444,0x0b431403,0x14241464,0x00000b03,0x00000000,0x0b830b43,0x146413e4,0x0b030b83,0x0ae20000,0x13a31464,0x0ba313e3,0x00000b03,0x0b030000,0xd6b3def3,0xd6d4d6b3,0xd6b3d6b3,0xd6b3d6b3,0xd6d4d6d4,0xdef3d6d4,0x00000b03, +0xa536ad77,0xad779d15,0x9d15a536,0x94d4a556,0xa53694f4,0x9d159d15,0xa537a536,0x9d159d15,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x8ae83165,0x59e59b29,0x51849b29,0x51849b29,0x518482a7,0x518482a7,0x59a492e8,0x31658ae8,0x8ae83165,0x9b299b29,0x82a79b29,0x18a27287,0x728718a2,0x82a782a7,0x92c792e8,0x31658ae8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce79ce59,0xe71ce71c,0xd6bad69a,0xe73cef5d,0xce79ce59,0xe73cd69a,0xbdd7bdd7,0xe73cd6ba,0x00000a2d,0x000022d0,0x2b310000,0x00000000,0x00000000,0x00001aaf,0x1aaf0000,0x1aaf0000,0xe79effff,0xefffe79e,0xefffefff,0xe79ee79e,0xe79ee79e,0xffffe79e,0xefffefff,0xe79ee79e,0x755f755f,0x755f755f,0x755f755f,0x755f8dff,0x755f755f,0x755f755f,0x755fffff,0x755f755f, +0x7aa79369,0x93697aa7,0xbc2b9369,0x93697aa7,0x93696b6d,0x7aa79369,0x936959e5,0x59e57aa7,0x0b030000,0x14031444,0x0b431444,0x14241403,0x00000b43,0x00000b43,0x14030b43,0x00000000,0x0a020000,0x0ba31424,0x146413e4,0x0b030ba3,0x13e30a02,0x13a31464,0x0b031464,0x000009c2,0x0b030000,0xd6b3def3,0xdef4def4,0xdef3def3,0xdef4def4,0xdef4def4,0xdef3d6b3,0x00000b03, +0xa5379cf5,0x94d5a556,0x9d15a536,0x9d15a536,0xa536a536,0xadb89d35,0x9d159d15,0x94b49d15,0xaece0000,0x0000854b,0x854b0000,0x00006c28,0xaece7605,0x0000854b,0xaece0000,0x0000854b,0x82873165,0x92c74143,0x92c84143,0x92c74143,0x92c74143,0x92c74143,0x92c84143,0x31658287,0x82873165,0x92c792c7,0x92c892c8,0x18a27287,0x728718a2,0x92c792c7,0x92c892c8,0x31658287, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xf79ef79e,0xef5def5d,0xf79effff,0xe73cef5d,0xef7df79e,0xe71cd6ba,0xdefbe73c,0xdefbce59,0x1aaf0947,0x1aaf1188,0x21e91aaf,0x1a8f0a2d,0x1a8f2b52,0x1aaf220a,0x220a124e,0x11882b11,0xffffffff,0xe79effff,0xefffefff,0xefffefff,0xefffefff,0xffffe79e,0xefffffff,0xe79eefff,0x755f755f,0x755f755f,0x755f755f,0xffff755f,0x755f755f,0x755f755f,0xffff755f,0x755f755f, +0x93699369,0xbc2b7aa7,0x7aa7bc2b,0x9369bc2b,0xbc2b59e5,0x7aa7bc2b,0x93699369,0x7aa78430,0x00000000,0x14030aa2,0x14031424,0x14441403,0x0b431403,0x0b4313e3,0x14031444,0x00000b03,0x0a020000,0x0ba31424,0x14641403,0x09c20b02,0x13e30a02,0x0ba31464,0x0aa21464,0x00000000,0x0b030000,0xd6b3def3,0xdef3def4,0xdef3def3,0xdef3def3,0xdef4def3,0xdef3d6d4,0x00000b03, +0xa536a536,0xa5378c73,0xa55794f4,0x9d169d35,0xad77ad77,0x9d15a556,0x9d159d36,0x9d369d15,0xaece0000,0x0000854b,0xe77b7605,0x0000960c,0xaece9766,0x0000854b,0x854b0000,0x00006c28,0x82a83165,0x92e859c5,0x9b2959e5,0x82a75184,0x82a75184,0x92e859c5,0x92e859c5,0x316582a8,0x82a83165,0x92e892e8,0x9b299b29,0x18a27287,0x728718a2,0x92e892e8,0x92e892e8,0x316582a8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdedbd69a,0xef7dd6ba,0xbdf7bdd7,0xe71cdedb,0xe73cce79,0xffffffff,0xe73cdedb,0xffdfffff,0x00001aaf,0x00001aaf,0x22f00000,0x00000000,0x00000000,0x0000126e,0x126e0000,0x1aaf0000,0xefffefff,0xffffefff,0xffffffff,0xefffffff,0xefffefff,0xe79eefff,0xe79effff,0xe79ee79e,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755fffff,0x755f755f,0x755f755f,0x755f755f, +0x93699369,0x7aa759e5,0x59e57aa7,0x7aa759e5,0x7aa77aa7,0x7aa77aa7,0xbc2bbc2b,0x93697aa7,0x0b030000,0x14031444,0x14240b43,0x00000b43,0x14030b43,0x14241403,0x14030b43,0x00000b03,0x0a020000,0x13a31464,0x146413e4,0x00000aa2,0x0b830a02,0x0ba31464,0x0ba31464,0x00000b03,0x0b030000,0xd6b3ded3,0xdef3def3,0xd6b3d6b3,0xd6b3d6b3,0xdef4def3,0xdef3d6b3,0x00000b03, +0x8c9394d4,0x9d35a536,0xa5369d35,0x9d15a557,0xa5369d36,0xad77a536,0xa5369d36,0xa57694d4,0x854b7605,0x00006c28,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xe77b0000,0x0000960c,0x72873165,0x394382a7,0x498482a7,0x416492e8,0x394382a7,0x414382a7,0x39439b29,0x31657287,0x72873165,0x82a782a7,0x9b2982a7,0x18a27287,0x728718a2,0x92c782a7,0x82a79b29,0x31657287, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe73cef5d,0xd69ac618,0xe73cf79e,0xd6bace79,0xd6bad69a,0xc618d69a,0xdedbdefb,0xc638c638,0x000022f0,0x00001aaf,0x1aaf0000,0x00000000,0x00000000,0x00001aaf,0x1aaf0000,0x1aaf0000,0xefffffff,0xefffefff,0xe79ee79e,0xe79ee79e,0xffffffff,0xe79effff,0xffffffff,0xe79eefff,0x8dff755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0x7aa79369,0x93697aa7,0x93697aa7,0x59e57aa7,0x93697aa7,0x7aa79369,0x7aa77aa7,0x7aa759e5,0x0b030000,0x0b431444,0x0b430000,0x0b4313e3,0x14031403,0x0b431403,0x0b430000,0x00000000,0x0a020000,0x0ba31464,0x0ba31403,0x0b031403,0x0b230141,0x13a31444,0x0ba31403,0x00000b03,0x0b030000,0xd6d4def3,0xdef3def4,0xdef4d6b3,0xd6b3def4,0xdef4def3,0xdef3d6b3,0x00000b03, +0xa536a536,0xa557a557,0x9d15a536,0xa536a557,0xadd9ad77,0xa53694d4,0x9d169d15,0x9d369d15,0xe77b9766,0x0000960c,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x8ae83165,0x59e59b29,0x59a49b29,0x59e582a7,0x59c59b29,0x59c592e8,0x59e59b29,0x31658ae8,0x8ae83165,0x9b299b29,0x92c79b29,0x18a27287,0x728718a2,0x92e892e8,0x9b299b29,0x31658ae8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd69ad69a,0xffffffff,0xe73cef5d,0xf79ef79e,0xd69ace59,0xf79eef5d,0xe73ce73c,0xf79ef79e,0x00001aaf,0x00001aaf,0x1aaf0000,0x00000000,0x00000000,0x00001aaf,0x22d00000,0x124e0000,0xffffffff,0xefffefff,0xefffefff,0xe79eefff,0xffffffff,0xe79ee79e,0xefffffff,0xe79eefff,0x755f755f,0x755f8dff,0x755f755f,0x755f8dff,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0x7aa7bc2b,0xbc2bbc2b,0x93699369,0x7aa77aa7,0x59e59369,0x93699369,0x7aa77aa7,0x93699369,0x00000000,0x14030aa2,0x14840b43,0x14031444,0x0b431444,0x14241403,0x14030b43,0x00000141,0x0a020000,0x13a31464,0x13a31403,0x0b031464,0x0a820000,0x0bc31424,0x0b221424,0x000009c2,0x0b030000,0xd6b3def3,0xdef3def4,0xdef4d6b3,0xd6b3def4,0xdef3def3,0xdef3d6b3,0x00000b03, +0x9d159d36,0x9d35a557,0x9d159d36,0xadb7a556,0x9cf5a536,0x9d159d15,0xa536a536,0xa5579d15,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x7605854b,0x82873165,0x92c84143,0x92c84143,0x92c74143,0x92c74143,0x92c84143,0x92c84143,0x31658287,0x82873165,0x92c892c8,0x92c892c8,0x18a27287,0x728718a2,0x92c892c8,0x92c892c8,0x31658287, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xffffffff,0xef5def7d,0xdefbdefb,0xe71cdedb,0xffffef7d,0xdedbe73c,0xffffffff,0xe71cef5d,0x00001aaf,0x0000020d,0x1a8f0000,0x00000000,0x00000000,0x00001aaf,0x01ab0000,0x1aaf0000,0xe79effff,0xe79ee79e,0xefffffff,0xffffe79e,0xe79ee79e,0xffffe79e,0xefffefff,0xe79ee79e,0x755f755f,0x755f755f,0x755f755f,0x8dff755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0x59e5bc2b,0x7aa77aa7,0x7aa78430,0xbc2b7aa7,0x7aa7bc2b,0xbc2bbc2b,0x93697aa7,0x93697aa7,0x01410000,0x14840ba3,0x14441403,0x14031424,0x00000b43,0x140313e3,0x14031403,0x00000b03,0x00000000,0x0bc313a3,0x13e31403,0x0b0313e4,0x13a30a02,0x13e31424,0x0aa21424,0x00000000,0x0b030000,0xd6b3def3,0xdef3def4,0xd6d4d6b3,0xd6b3d6b3,0xdef3def3,0xdef3d6b3,0x00000b03, +0xa53694d4,0x9d369cf5,0xa55694d4,0x9d159d15,0x9d159d15,0xadb8a557,0xa557a536,0x9d16a536,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x854b0000,0x00006c28,0xaece0000,0x9766854b,0x8ae83165,0x92e859e5,0x9b2959e5,0x82a759e5,0x82a75184,0x9b2959a4,0x9b2959e5,0x31658ae8,0x8ae83165,0x92e89b29,0x9b299b29,0x18a27287,0x728718a2,0x9b2992c7,0x9b299b29,0x31658ae8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xbdd7c618,0xf79ece79,0xb5b6ce79,0xd69ace59,0xb5b6ce79,0xd6bad69a,0xd69ac618,0xd6bace59,0x1aaf220a,0x22d0220a,0x326c1aaf,0x1aaf1aaf,0x22f01aaf,0x22f0220a,0x220a1aaf,0x220a1aaf,0xefffefff,0xefffefff,0xffffe79e,0xffffffff,0xefffe79e,0xe79ee79e,0xefffefff,0xe79eefff,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755fffff,0x755f755f,0x755f8dff,0x755f755f, +0x59e57aa7,0x93699369,0x93697aa7,0x59e559e5,0x7aa759e5,0x59e57aa7,0x7aa77aa7,0xbc2b7aa7,0x0b030000,0x0b431403,0x0b430000,0x140313e3,0x140313e3,0x14241444,0x0aa21444,0x00000000,0x0a020000,0x14030b43,0x13e413e4,0x0b0313e4,0x13a30a02,0x14441403,0x0ba31424,0x00000b03,0x0b030000,0xd6b3def3,0xdef3def4,0xdef3def3,0xdef3def3,0xdef4def3,0xdef3d6b3,0x00000b03, +0xa5369cf5,0xadda9d15,0xa5769d15,0xa536a536,0xad779d15,0x94d4a536,0x9d159d15,0x94d49d36,0xaece0000,0x0000854b,0x854b0000,0x00006c28,0xe77b0000,0x0000960c,0xaece0000,0x0000854b,0x72873165,0x416492c7,0x416492e8,0x39439b29,0x416492e8,0x416492e8,0x394382a7,0x31657287,0x72873165,0x92e892c7,0x92e892e8,0x18a27287,0x728718a2,0x92e892e8,0x82a782a7,0x31657287, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xdedbe73c,0xdefbce79,0xef5def5d,0xb5b6bdf7,0xe71cd69a,0xc638d69a,0xef5def5d,0xbdf7ce59,0x00001aaf,0x00001aaf,0x1aaf0000,0x00000000,0x00000000,0x00001aaf,0x1aaf0000,0x0a0d0000,0xffffffff,0xefffefff,0xffffefff,0xffffe79e,0xefffefff,0xffffe79e,0xefffffff,0xe79eefff,0xffff755f,0x755f755f,0x755f755f,0x755f755f,0xffff755f,0x755f755f,0x8dff755f,0x755f755f, +0x7aa79369,0xbc2b9369,0x936959e5,0x7aa77aa7,0x59e559e5,0x6b6d59e5,0x93697aa7,0x7aa759e5,0x01410000,0x14031424,0x14440b43,0x0b431444,0x14031444,0x0b431444,0x14031444,0x00000b03,0x0a020000,0x14030ba3,0x142413e4,0x0b031403,0x0b230141,0x14641403,0x13a31464,0x00000b03,0x0b030000,0xd6d4def3,0xdef4def3,0xdef4def4,0xdef4def3,0xdef4def3,0xdef3d6b3,0x00000b03, +0x9d15a556,0x9d15a557,0xa557a557,0xa557a537,0x9cf5a557,0xa5579d15,0x94d49d16,0x94f5a536,0xaece0000,0x0000854b,0xe77b0000,0x7605960c,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x72873165,0x518482a7,0x59e582a7,0x51849b29,0x51849b29,0x59a482a7,0x59c592e8,0x316582a8,0x72873165,0x82a782a7,0x9b2982a7,0x18a27287,0x728718a2,0x92c782a7,0x92e892e8,0x316582a8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd69adefb,0xf79eef5d,0xd6bad6ba,0xf79edefb,0xdedbce79,0xf79ef79e,0xd69adefb,0xf79effff,0x00001aaf,0x00001aaf,0x22f00000,0x00000000,0x00000000,0x000022f0,0x1aaf0000,0x22d00000,0xe79effff,0xe79ee79e,0xffffffff,0xffffe79e,0xefffffff,0xe79eefff,0xffffffff,0xe79eefff,0x755f755f,0x755fffff,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f8dff, +0x6b6d59e5,0x59e559e5,0x59e5ffff,0x59e559e5,0x59e5ffff,0x59e5efff,0x59e57aa7,0x7aa759e5,0x00000000,0x14a40aa2,0x14241403,0x00000b43,0x14030b43,0x00000b43,0x14030b43,0x00000b03,0x01410000,0x13e30b23,0x14240ba3,0x0b0313a3,0x0aa20000,0x146413e4,0x0ba31464,0x00000b03,0x0b030000,0xd6b3def3,0xd6b3d6b3,0xd6b3d6b3,0xd6b3d6b3,0xd6b3d6b3,0xdef3d6d4,0x00000b03, +0x9d159cf5,0xa5369d15,0xa5369d15,0x9d159d15,0x9d159d15,0xa5569d35,0x9d359d36,0x94d49d36,0xaece0000,0x7605854b,0xaece0000,0x9766854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x82873165,0x92c74143,0x92c74143,0x92c74143,0x92c74143,0x92c84143,0x92c84143,0x31658287,0x82873165,0x92c792c8,0x92c792c7,0x18a27287,0x728718a2,0x92c892c8,0x92c892c8,0x31658287, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xf79eef7d,0xdedbd6ba,0xf79ef7be,0xd6bae71c,0xf79eef5d,0xe73ce73c,0xffffffdf,0xe73cef5d,0x1aaf19a9,0x1aaf220a,0x3acd128f,0x1aaf1a8f,0x1aaf124e,0x1a8f11a8,0x21ea1aaf,0x220a01cc,0xffffefff,0xe79eefff,0xefffe79e,0xe79eefff,0xefffffff,0xe79eefff,0xffffffff,0xefffefff,0x755f755f,0xffff755f,0x755f755f,0x755f8dff,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0x59e5efff,0xe79eefff,0x59e5e79e,0x59e5efff,0xefffffff,0xe79eefff,0xffff59e5,0x59e5efff,0x0b030000,0x0aa21424,0x13e31403,0x0aa213e3,0x14031464,0x0b431444,0x14031424,0x00000b03,0x00000000,0x13e30b43,0x14640ba3,0x09c20b03,0x13a30a02,0x142413e4,0x0ac21424,0x00000000,0x0b030000,0xded3def3,0xdef3def3,0xdef3def3,0xdef3ded3,0xdef3def3,0xdef3def4,0x00000b03, +0xad77a536,0x9d15ad98,0x9d159d15,0x9d369d36,0xa556a536,0xa557a557,0x9d1594f4,0xad989d15,0xaece0000,0x9766854b,0xaece0000,0x0000854b,0xaece0000,0x7605854b,0x854b0000,0x00006c28,0x8ae83165,0x82a75184,0x82a75184,0x92e859c5,0x9b2959e5,0x92e859e5,0x9b2959a4,0x31658ae8,0x8ae83165,0x82a782a7,0x82a782a7,0x728792e8,0x9b297287,0x92e89b29,0x9b2992c7,0x31658ae8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe73cdefb,0xffffffdf,0xef5def7d,0xd6badedb,0xc618ce59,0xd6bad69a,0xc618b596,0xdedbd69a,0x00001aaf,0x00001aaf,0x1aaf0000,0x00000000,0x00000000,0x00001aaf,0x1aaf0000,0x126e0000,0xffffffff,0xefffffff,0xefffefff,0xe79eefff,0xffffe79e,0xefffefff,0xffffe79e,0xe79effff,0x755f755f,0x755f755f,0x755f755f,0x8dff755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0xffffffff,0xefffffff,0x59e5efff,0xe79eefff,0xffffe79e,0xefffefff,0xffffe79e,0xe79effff,0x0b030000,0x00000b03,0x0b030141,0x00000141,0x0b030b03,0x00000b03,0x0b030141,0x00000b03,0x0a020000,0x140313e3,0x14640b83,0x00000aa2,0x13a30a02,0x146413e4,0x14031424,0x00000b03,0x0b030000,0x0b030b03,0x0b030b03,0x0b030b03,0x0b030b03,0x0b030b03,0x0b030b03,0x00000b03, +0x9d35a536,0xa557a536,0x9d1594b4,0x9d159d15,0xa55794d4,0xa536add9,0x9d359d15,0xa5769d15,0x854b0000,0x00006c28,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xe77b0000,0x0000960c,0x7aa83165,0x828782a8,0x82a882a8,0x72877287,0x72877287,0x82a87287,0x82a87287,0x31657aa8,0x7aa83165,0x828782a8,0x82a882a8,0x72877287,0x72877287,0x82a87287,0x82a87287,0x31657aa8, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd69ace59,0xce59c638,0xef5ddefb,0xd69ace79,0xef5de73c,0xce59bdf7,0xe71ce71c,0xc618ce59,0x1aaf21ea,0x1aaf220a,0x2a6b0a2d,0x01cc22f0,0x1aaf128f,0x1aaf220a,0x3aed22d0,0x220a1aaf,0xffffffff,0xefffffff,0xffffffff,0xffffefff,0xffffffff,0xefffefff,0xe79ee79e,0xffffffff,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f,0x755f755f, +0xffffffff,0xefffffff,0xffffffff,0xffffefff,0xffffffff,0xefffefff,0xe79ee79e,0xffffffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x0a020000,0x14031403,0x14031464,0x0b031464,0x13e40a02,0x142413e4,0x14031424,0x00000b03,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xa5368452,0x9d36a536,0x9d369d15,0x9d359d15,0xa536a556,0x9d159d15,0x9d159d15,0x9d3594f5,0xe77b0000,0x0000960c,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0xaece0000,0x0000854b,0x31652924,0x31653165,0x31653165,0x31653165,0x31653165,0x31653165,0x31653165,0x21043165,0x31652924,0x31653165,0x31653165,0x31653165,0x31653165,0x31653165,0x31653165,0x21043165, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0xbde6e70b,0xce68b5a5,0xce68b5a5,0xce68d6a9,0xef4affed,0xd689deea,0xce68e729,0xce68ce68,0xb6bbc7bf,0xb6bbb6bb,0xb6bbb6bb,0x00000000,0xb6bbb6bb,0xb6bb0000,0xb6bbb6bb,0xc7bfb6bb,0x73ae73ae,0x73ae73ae,0x8c716b4d,0x7bef8c71,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x7bef7bef,0x73ae73ae,0x73ae73ae,0x8c716b4d,0x7bef8c71,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x7bef7bef, +0x0000a514,0x00000000,0x9cd30000,0x528a0000,0xad75ad55,0x0000528a,0x8c710000,0xad7552aa,0x2965a514,0x29652965,0x9cd32965,0x528a2965,0xad75ad55,0x2965528a,0x8c712965,0xad7552aa,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232103,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232103,0x20e22923,0x72e718a1,0x7b0772e7,0x6aa66aa6,0x18a17b07,0x72e718a1,0x6aa672e7,0x6aa649e4,0x18a16aa6, +0x72e718a1,0x7b0772e7,0x6aa66aa6,0x18a17b07,0x72e718a1,0x6aa672e7,0x6aa649e4,0x18a16aa6,0xdedb8410,0xf8003186,0xf800fd00,0xffe0fd00,0xfd00f800,0xfd00ffe0,0xef5df800,0x31869cd3,0x31a639c7,0x318631a6,0x29653186,0x29652965,0x39c72124,0x31a639c7,0x21242965,0x318631a6,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xc627ce68,0xef6cbdc6,0xb5a5e729,0xce68deea,0x63006300,0xce48e729,0xe7296300,0xc627ce68,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xc7bf0000,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x8c718c71,0x73ae7bef,0x7bef73ae,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x8c718c71,0x73ae7bef,0x7bef73ae, +0x0000632c,0x5acb0000,0x84305aeb,0x00000000,0x632c0000,0x94b2528a,0xb5960000,0x5acb9492,0x2965632c,0x5acb2965,0x84305aeb,0x29652965,0x632c2965,0x94b2528a,0xb5962965,0x5acb9492,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x936541e6,0x7ae47ae4,0x93657ae4,0x7ae49365,0x93659365,0x93257ae4,0x93659365,0x7ae49365,0x93659365,0x7ae47ae4,0x93657ae4,0x7ae49365,0x93659365,0x93257ae4,0x93659365,0x29238305,0xbccc18a1,0x7ac69c29,0xbccc9c29,0x2102bccc,0xbccc2922,0xb48b9c29,0xbcccbccc,0x18a1bccc, +0xbccc18a1,0x7ac69c29,0xbccc9c29,0x2102bccc,0xbccc2922,0xb48b9c29,0xbcccbccc,0x18a1bccc,0xe71c8c51,0xfd0039e7,0xffe0ffe0,0xfd00ffe0,0xffe0fd00,0xfd00ffe0,0xef7dfd00,0x2965ad55,0x6b6d39c7,0x630c5acb,0x52aa4228,0x738e738e,0x630c4a69,0x630c632c,0x422852aa,0x318652aa,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe729e729,0x6b40d689,0xe7296300,0x39e0c627,0x63006300,0xd6895280,0xce68ce68,0xce68ce68,0x0000c7bf,0x00000000,0x00000000,0x00000000,0x00000000,0x0000c7bf,0x00000000,0xb6bb0000,0x8c717bef,0xc73f73ae,0x7bef5f7e,0x73ae7bef,0x5f7e73ae,0x73ae5f7e,0x7bef7bef,0x8c718c71,0x8c717bef,0xf80073ae,0x7bef8800,0x73ae7bef,0x880073ae,0x73ae8800,0x7bef7bef,0x8c718c71, +0x00009492,0x94925acb,0xa5340000,0x00008c51,0x528a0000,0x94b20000,0xad754a69,0x0000ad55,0x29659492,0x94925acb,0xa5342965,0x29658c51,0x528a2965,0x94b22965,0xad754a69,0x2965ad55,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b4341e6,0xabc5a363,0xabc5abc5,0x8b43abc5,0xa384abc5,0x8b43a384,0x8b438b43,0x8b43abc5,0xa384abc5,0xabc5a363,0xabc5abc5,0x8b43abc5,0xa384abc5,0x8b43a384,0x8b438b43,0x29237ae4,0x9c2918a1,0xa38772e7,0xbcccbccc,0x2102bccc,0xb48b2922,0x9c29b48b,0x9c299c29,0x18a19c29, +0x9c2918a1,0xa38772e7,0xbcccbccc,0x2102bccc,0xb48b2922,0x9c29b48b,0x62869c29,0x18a16286,0xdefb8c51,0xf80039e7,0xfd00fd00,0xf800fd00,0xfd00ffe0,0xf800f800,0xef7df800,0x3186a514,0x630c3186,0x9492738e,0x94928c71,0x5acb6b4d,0x9cf36b6d,0x7bcf8c51,0x7bcf8410,0x2104630c,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xf78b6300,0x39c0ce48,0xd68918e0,0xc627ce68,0x294039c0,0xce68d6a9,0xad64d6a9,0xe7296300,0xc7bf0000,0x00000000,0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0xb6bb0000,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x73ae73ae,0xffffc73f,0x767fc73f,0x5f7e767f,0x7bef73ae,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x73ae73ae,0xf800a820,0x9000a820,0x88009000,0x7bef73ae, +0x00008c51,0x9cd3b596,0xad750000,0x0000b596,0x8c510000,0x94b20000,0x00009492,0xa5344a69,0x29658c51,0x9cd3b596,0xad752965,0x2965b596,0x8c512965,0x94b22965,0x29659492,0xa5344a69,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0xabc5abc5,0x8b43abc5,0x8b43abc5,0x8b438b43,0x8b438b43,0xa363a384,0x8b43abc5,0x8b438b43,0xabc5abc5,0x8b43abc5,0x8b43abc5,0x8b438b43,0x8b438b43,0xa363a384,0x29239365,0xbccc18a1,0xa387bccc,0x9c29bccc,0x18a1bccc,0x9c292102,0x9c299c29,0x72e79b47,0x18a1bccc, +0xbccc18a1,0xa387bccc,0x9c29bccc,0x18a1bccc,0x9c292102,0x9c299c29,0xffff9b47,0x18a172e7,0xc6188c51,0x39e7e71c,0xc800c800,0xc800fd00,0xf800fd00,0xc800c800,0xef7d4208,0x2965ad55,0x5acb2945,0x5acb5acb,0x5acb5acb,0x7bcf6b6d,0x5acb630c,0x8c519492,0x7bcf7bcf,0x212439c7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd6a818e0,0xce68ce68,0xce68ce68,0xd6a9d6a7,0xce68ce68,0x1080ce68,0xce68ce68,0xce68e729,0x0000ffff,0x00000000,0x00000000,0x0000c7bf,0x00000000,0x00000000,0x0000ffff,0xb6bb0000,0x7bef6b4d,0x7bef7bef,0x7bef73ae,0x7bef7bef,0x8c718c71,0xc73f7bef,0x8c715f7e,0x6b4d8c71,0x7bef6b4d,0x7bef7bef,0x7bef73ae,0x7bef7bef,0x8c718c71,0xf8007bef,0x8c718800,0x6b4d8c71, +0x0000ad75,0xb5b6ad75,0x00000000,0x00000000,0x9cd3ad75,0xad550000,0x00008430,0xad55528a,0x2965ad75,0xb5b6ad75,0x29652965,0x29652965,0x9cd3ad75,0xad552965,0x29658430,0xad55528a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa34441e5,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0x29238b04,0x6aa618a1,0x72e772e7,0x6aa66aa6,0x10616aa6,0x72e718a1,0x72e772e7,0x6aa641a4,0x18a16aa6, +0x6aa618a1,0x72e772e7,0x41a341a3,0x10616aa6,0x72e718a1,0x72e772e7,0xb5b62902,0x18a141a3,0xad554a49,0xdefbd6ba,0x39c739e7,0xc800f800,0xc800f800,0x39e739e7,0xd6badefb,0x3186a534,0x738e39c7,0x7bcf8c51,0x5acb738e,0x7bcf7bcf,0x7bcf8410,0x632c5acb,0x6b4d8c71,0x2124738e,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd6a9ce68,0xe729ce68,0xc627ce68,0xd68918c0,0xdeeaef6c,0xe729ef4a,0xffedce68,0xce4652a0,0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0x00000000,0xffff0000,0x00000000,0x7bef7bef,0x73ae8c71,0x8c71767f,0x73ae8c71,0x73ae6b4d,0x8c718c71,0x7bef8c71,0x7bef7bef,0x7bef7bef,0x73ae8c71,0x8c719000,0x73ae8c71,0x73ae6b4d,0x8c718c71,0x7bef8c71,0x7bef7bef, +0x00005aeb,0x00000000,0x4a490000,0x00005acb,0xad55ad55,0x00000000,0x9cd35acb,0x00000000,0x29655aeb,0x29652965,0x4a492965,0x29655acb,0xad55ad55,0x29652965,0x9cd35acb,0x29652965,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa38441e6,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xa384a384,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xa384a384,0x29239325,0xb48b18a1,0xb48bb48b,0xbcccbccc,0x18a19c29,0x9c292102,0xb48bb48b,0xb48b9b47,0x18a1b48b, +0xb48b18a1,0x72c772c7,0x72e7b5b6,0x18a19c29,0x9c292102,0xb48bb48b,0xb5b6dedb,0x18a172c7,0x7bcf4a49,0xdedbce59,0xe71cef7d,0x42084208,0x420839e7,0xef7de71c,0xc638d69a,0x31867bcf,0x528a2965,0x7bcf73ae,0x52aa7bcf,0x84109492,0x7bcf7bcf,0x5acb7bef,0x6b4d6b4d,0x29456b4d,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce68ce68,0x39c0ce68,0xce68ce68,0xd689deea,0x6300ce68,0x63005280,0x39c0e729,0x6b416b41,0x0000ffff,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0x73ae7bef,0x73ae73ae,0x73ae73ae,0xc73f73ae,0x5f7e5f7e,0x73ae5f7e,0x73ae73ae,0x7bef8c71,0x73ae7bef,0x73ae73ae,0x73ae73ae,0xa82073ae,0x88008800,0x73ae8800,0x73ae73ae,0x7bef8c71, +0x4a698c71,0x5acb0000,0x00008c71,0x00009cd3,0x000052aa,0x000094b2,0xad7552aa,0x00009492,0x4a698c71,0x5acb2965,0x29658c71,0x29659cd3,0x296552aa,0x296594b2,0xad7552aa,0x29659492,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b4341c5,0x8b438b43,0xabc58b43,0xa384a384,0x8b438b43,0xa3638b43,0x8b43abc5,0xa384a384,0x8b438b43,0x8b438b43,0xabc58b43,0xa384a384,0x8b438b43,0xa3638b43,0x8b43abc5,0x29237ae4,0x9c2918a1,0xb5b69c29,0xb5b66286,0x290272c7,0x9c292102,0x72e79c29,0x9c29bccc,0x18a19c29, +0x9c2918a1,0xdedbb5b6,0x72e7b5b6,0x2902b48b,0x9c292102,0x72e79c29,0xb5b6ffff,0x18a16286,0x8c714a49,0xdedbc638,0xe73cdedb,0xf79ef79e,0xf79ef79e,0xdedbe73c,0xc638dedb,0x39e78c71,0x528a2945,0x94929492,0x5acb7bef,0x738e9492,0x841094b2,0x6b4d8410,0x94b26b4d,0x3186528a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xe729ce68,0xd689dec8,0xce68d689,0x39c0c607,0x39c0e729,0x39c039c0,0xce68b5a5,0xce6839c0,0xc7bfffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xb6bb0000,0xc73f7bef,0x6b4d767f,0x73ae8c71,0x7bef7bef,0xc73fffff,0x8c718c71,0x8c718c71,0x8c718c71,0xf8007bef,0x6b4d9000,0x73ae8c71,0x7bef7bef,0xa820f800,0x8c718c71,0x8c718c71,0x8c718c71, +0x8c71bdd7,0x9cd30000,0x52aa94b2,0x949294b2,0x94b20000,0x00009492,0xbdd70000,0x52aa9cf3,0x8c71bdd7,0x9cd32965,0x52aa94b2,0x949294b2,0x94b22965,0x29659492,0xbdd72965,0x52aa9cf3,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0xabc5abc5,0xa363abc5,0xabc58b43,0xa384abc5,0xa384a384,0xabc5abc5,0xabc58b43,0xa384abc5,0xabc5abc5,0xa363abc5,0xabc58b43,0xa384abc5,0xa384a384,0xabc5abc5,0x29239365,0xbccc18a1,0xdedbbccc,0xdedb72e7,0x29226286,0xb48b2922,0xb48bb48b,0xbcccbccc,0x18a1bccc, +0xbccc18a1,0x28e1bccc,0x72e7b5b6,0x29229c29,0xb48b2922,0x72c7b48b,0xb5b6dedb,0x18a172e7,0x42282965,0x84107bcf,0x8c715aeb,0x94b28c71,0x94929492,0x4a698c71,0x5aeb73ae,0x39c77bcf,0x42282965,0x8c51738e,0x738ea514,0x94b26b6d,0x84309492,0x632c738e,0x4a495aeb,0x39c77bcf,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x6b40bde6,0xd689e729,0xdecae729,0xce48c607,0xce68ce68,0xb585d6a9,0xce689ce2,0xce68deca,0x0000ffff,0x0000c7bf,0x00000000,0x0000c7bf,0x00000000,0x00000000,0x00000000,0xb6bb0000,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x6b4d73ae,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x6b4d73ae,0x73ae73ae,0x73ae73ae,0x7bef7bef, +0xb5b6a514,0xa5340000,0x5acbb5b6,0x9492ad75,0xad550000,0x528abdd7,0x528a0000,0x630c0000,0xb5b6a514,0xa5342965,0x5acbb5b6,0x9492ad75,0xad552965,0x528abdd7,0x528a2965,0x630c2965,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x930441e5,0x8b048b04,0x8b048b04,0x93048b04,0x93049304,0x8b048b04,0x8b048b04,0x93048b04,0x93049304,0x8b048b04,0x8b048b04,0x93048b04,0x93049304,0x8b048b04,0x8b048b04,0x292382c4,0x72e718a1,0x6aa66aa6,0x6aa6dedb,0x18a16aa6,0x72e718a1,0x41a46aa6,0x6aa66aa6,0x18a172e7, +0x72e718a1,0x28e16aa6,0x6aa66aa6,0x18a16aa6,0x72e718a1,0xffff6aa6,0xb5b6dedb,0x18a141c4,0x5aeb2965,0x21245acb,0xb5b6738e,0xad55ad55,0xa534ad55,0x6b4da534,0x5acbad55,0x39c7528a,0x5aeb2965,0x632c5acb,0x8c718c71,0x632c6b4d,0x5acb6b4d,0x7bef5acb,0x5acb8430,0x39c7528a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x39c0deea,0xef4cce68,0xce686300,0xce68ce68,0xd689e729,0xb5a5ce68,0xe729ffcc,0xce68ce68,0x00000000,0x00000000,0x00000000,0xc7bf0000,0x00000000,0x00000000,0x00000000,0xb6bb0000,0x8c718c71,0xffff7bef,0x767fc73f,0x5f7e767f,0x7bef7bef,0x5f7e767f,0x8c718c71,0x6b4d8c71,0x8c718c71,0xb8207bef,0x9000a820,0x88009000,0x7bef7bef,0x88009000,0x8c718c71,0x6b4d8c71, +0x94b2528a,0x528a0000,0x00005acb,0xa534a514,0x00000000,0x0000632c,0x528a0000,0x5aeb5acb,0x94b2528a,0x528a2965,0x29655acb,0xa534a514,0x29652965,0x2965632c,0x528a2965,0x5aeb5acb,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x72c641e6,0x72a572c6,0x72c672c6,0x6a8572c6,0x6a856a85,0x72c672a5,0x72c672c6,0x6a8572c6,0x6a856a85,0x72a572c6,0x72c672c6,0x6a8572c6,0x6a856a85,0x72c672a5,0x72c672c6,0x292372c6,0xbccc18a1,0x28e1bccc,0x28e172e7,0x210272e7,0x9c292102,0xbccc49e4,0xbcccbccc,0x18a1bccc, +0xbccc18a1,0x28e1bccc,0xbcccbccc,0x2102bccc,0x9c292102,0xdedb49e4,0xb5b6dedb,0x18a172e7,0x630c3186,0x29457bef,0x08610000,0x10820861,0x10821082,0x000010a2,0x8430a534,0x2104630c,0x630c3186,0x6b6d7bef,0x5acb73ae,0x7bcf6b4d,0x8430738e,0x7bef8c71,0x84308410,0x2104630c,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xbdc6ce68,0xce68ce68,0xbde6e729,0xd689ce68,0xce682120,0xce68d6a9,0xdeca6300,0xce68d6a9,0x0000ffff,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x0000c7bf,0x00000000,0x73ae73ae,0x7bef7bef,0xffff7bef,0x73aec73f,0x6b4d7bef,0xc73fffff,0x73ae73ae,0x7bef6b4d,0x73ae73ae,0x7bef7bef,0xf8007bef,0x73aea820,0x6b4d7bef,0xa820f800,0x73ae73ae,0x7bef6b4d, +0xb5960000,0x00008430,0x8c714a69,0x00005aeb,0x9cd3528a,0x52aa0000,0x5acb0000,0x84300000,0xb5962965,0x29658430,0x8c714a69,0x29655aeb,0x9cd3528a,0x52aa2965,0x5acb2965,0x84302965,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x316441c5,0x31843164,0x31843184,0x31643184,0x31843184,0x31843184,0x31643164,0x31643184,0x31843184,0x31843164,0x31843184,0x31643184,0x31843184,0x31843184,0x31643164,0x18e23164,0x9c2918a1,0x28e172e7,0x28e1b48b,0x2102bccc,0xb48b2902,0xb48b9b47,0x9c299c29,0x18a19c29, +0x9c2918a1,0x28e172e7,0xb48bb48b,0x2102bccc,0xb48b2902,0x28e19b47,0x28e128e1,0x18a16286,0x5acb2945,0x29457bef,0x00000000,0x00000000,0x00000000,0x00000000,0x6b4da514,0x212439c7,0x5acb2945,0x6b6d7bef,0x7bef7bef,0x5acb7bcf,0x94929492,0x84107bef,0x6b4d7bcf,0x212439c7,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce68ce68,0x6300ce68,0xce686300,0xc607a523,0xbde6ce68,0xce68ce68,0xce68e729,0xce68ffef,0xffffffff,0x00000000,0x00000000,0x00000000,0xffff0000,0x00000000,0xc7bf0000,0xb6bb0000,0x8c717bef,0x73ae8c71,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x8c718c71,0x6b4d8c71,0x8c717bef,0x73ae8c71,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x8c718c71,0x6b4d8c71, +0xa5140000,0x0000a514,0xa5340000,0x0000528a,0x8c719cd3,0x00000000,0x00008c71,0x8c519492,0xa5142965,0x2965a514,0xa5342965,0x2965528a,0x8c719cd3,0x29652965,0x29658c71,0x8c519492,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x7ae441e6,0x7ae47ae4,0x93657ae4,0x7ae49365,0x7ae49365,0x93047ae4,0x93259325,0x7ae49365,0x7ae49365,0x7ae47ae4,0x93657ae4,0x7ae49365,0x7ae49365,0x93047ae4,0x93259325,0x29239325,0x9c2918a1,0x7ac69c29,0xbccc9c29,0x2102bccc,0x9c292922,0x72e77ac6,0xb48bb48b,0x18a1b48b, +0x9c2918a1,0x7ac69c29,0xbccc9c29,0x2102bccc,0x9c292922,0x28e17ac6,0x28e172c7,0x18a172c7,0x738e39c7,0x4a697bcf,0x000031a6,0x00000000,0x00000000,0x31a60000,0x8430528a,0x2124738e,0x738e39c7,0x6b4d7bcf,0x7bcf8c71,0x5acb7bcf,0x8c516b4d,0x94b294b2,0x8430738e,0x2124738e,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xc607ce68,0x39c0deea,0xd68939c0,0x39e0e729,0xc627e729,0x2960c607,0xce466300,0xdecace68,0x0000ffff,0x0000ffff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xb6bbc7bf,0x8c717bef,0x7bef7bef,0x6b4d7bef,0xc73f7bef,0x7bef5f7e,0x73ae73ae,0x73ae73ae,0x7bef73ae,0x8c717bef,0x7bef7bef,0x6b4d7bef,0xf8007bef,0x7bef8800,0x73ae73ae,0x73ae73ae,0x7bef73ae, +0x00000000,0x00000000,0xad750000,0x00008c51,0x9cd3ad55,0xad754a69,0x00008c51,0x9cd3ad75,0x29652965,0x29652965,0xad752965,0x29658c51,0x9cd3ad55,0xad754a69,0x29658c51,0x9cd3ad75,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa34441e6,0xa363a344,0xa363a363,0xa363a363,0xa363a363,0xa344a344,0xa344a344,0xa363a363,0xa363a363,0xa363a344,0xa363a363,0xa363a363,0xa363a363,0xa344a344,0xa344a344,0x2923a363,0x6aa618a1,0x49e46aa6,0x72e749e4,0x18a172e7,0x72e718a1,0x6aa641a4,0x6aa66aa6,0x18a172e7, +0x6aa618a1,0x49e46aa6,0x72e749e4,0x18a172e7,0x72e718a1,0x28e141a4,0x28e128e1,0x18a172e7,0x528a2965,0x6b6d5aeb,0x21246b6d,0x31863186,0x29452104,0x42082104,0x8c516b4d,0x29456b4d,0x528a2965,0x6b6d5aeb,0x632c9cd3,0x84308c51,0x6b6d5aeb,0x5acb5acb,0x8c516b4d,0x29456b4d,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce68ce68,0xd689ce68,0xdeeace68,0x63005280,0xce68dec8,0xe70bbde6,0xce4839c0,0xce68ffec,0x0000ffff,0xffff0000,0x00000000,0x0000c7bf,0x00000000,0x00000000,0x00000000,0x00000000,0x6b4d7bef,0x73ae73ae,0x73ae767f,0x73ae73ae,0x73ae8c71,0x7bef7bef,0x767fc73f,0x7bef7bef,0x6b4d7bef,0x73ae73ae,0x73ae9000,0x73ae73ae,0x73ae8c71,0x7bef7bef,0x9000f800,0x7bef7bef, +0x00000000,0x00008c71,0xad75528a,0x0000a514,0xad559cf3,0xb5965aeb,0x000094b2,0xad55b596,0x29652965,0x29658c71,0xad75528a,0x2965a514,0xad559cf3,0xb5965aeb,0x296594b2,0xad55b596,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0xa384abc5,0xabc5a363,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0xa384abc5,0xabc5a363,0x2923abc5,0xbccc18a1,0x9c299c29,0x9c297ac6,0x2902b48b,0xbccc2922,0xb48bbccc,0xbccc72e7,0x18a1bccc, +0xbccc18a1,0x9c299c29,0x9c297ac6,0x2902b48b,0xbccc2922,0xb48bbccc,0xbccc72e7,0x18a1bccc,0x528a2945,0x52aa7bcf,0x8c71630c,0x7bcf8c71,0x528a632c,0x7bef8430,0x7bcf5aeb,0x3186528a,0x528a2945,0x52aa7bcf,0x8c71630c,0x7bcf8c71,0x528a632c,0x7bef8430,0x7bcf5aeb,0x3186528a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0x39c0c627,0xce68e729,0xce68c607,0x39c039c0,0xd689ce68,0xce68ce68,0xce68ce68,0xce682100,0x0000ffff,0x00000000,0x00000000,0xc7bf0000,0x00000000,0x00000000,0x00000000,0xb6bb0000,0x7bef7bef,0x8c718c71,0x8c718c71,0x8c718c71,0x8c7173ae,0x8c718c71,0x7bef6b4d,0x73ae7bef,0x7bef7bef,0x8c718c71,0x8c718c71,0x8c718c71,0x8c7173ae,0x8c718c71,0x7bef6b4d,0x73ae7bef, +0x00008430,0x9cd3bdd7,0x52aa0000,0x00000000,0x4a6952aa,0xb5960000,0x528ab5b6,0x52aa0000,0x29658430,0x9cd3bdd7,0x52aa2965,0x29652965,0x4a6952aa,0xb5962965,0x528ab5b6,0x52aa2965,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0xa363a384,0xa384a384,0x8b438b43,0x8b438b43,0xa3848b43,0xa3848b43,0x8b438b43,0x8b438b43,0xa363a384,0xa384a384,0x8b438b43,0x8b438b43,0xa3848b43,0xa3848b43,0x2923abc5,0xbccc18a1,0x72e7b48b,0xb48bb48b,0x59632102,0x21025963,0xb48b9c29,0xb48b9c29,0x18a1bccc, +0xbccc18a1,0x72e7b48b,0xb48bb48b,0x59632102,0x21025963,0xb48b9c29,0xb48b9c29,0x18a1bccc,0x6b6d39c7,0x630c5acb,0x52aa4228,0x738e738e,0x630c4a69,0x630c632c,0x422852aa,0x318652aa,0x6b6d39c7,0x630c5acb,0x52aa4228,0x738e738e,0x630c4a69,0x630c632c,0x422852aa,0x318652aa,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xce68d689,0xce68b5a5,0xce68ce68,0xce68ce68,0xce68deea,0xe7295280,0xce68deea,0xce68ce68,0xffffffff,0x0000ffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xc7bfffff,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x8c718c71,0x8c716b4d,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x8c718c71,0x8c716b4d,0x73ae7bef,0x73ae73ae,0x7bef73ae, +0x000094b2,0x9cf3ad75,0x00005acb,0x00000000,0x00007bef,0x00000000,0x52aa0000,0xad550000,0x296594b2,0x9cf3ad75,0x29655acb,0x29652965,0x29657bef,0x29652965,0x52aa2965,0xad552965,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x41c541e6,0x41c541c5,0x41e641c5,0x41e641e6,0x41e641c5,0x41e641e6,0x41e641e6,0x292341e6,0x41e641e6,0x41c541c5,0x41e641c5,0x41e641e6,0x41e641c5,0x41e641e6,0x41e641e6,0x316441e6,0x9c2918a1,0x9c299c29,0x29229c29,0x5963b3a9,0xb3a95963,0xbccc2922,0xbcccbccc,0x18a1bccc, +0x9c2918a1,0x9c299c29,0x29229c29,0x5963b3a9,0xb3a95963,0xbccc2922,0xbcccbccc,0x18a1bccc,0x31a639c7,0x318631a6,0x29653186,0x29652965,0x39c72124,0x31a639c7,0x21242965,0x318631a6,0x31a639c7,0x318631a6,0x29653186,0x29652965,0x39c72124,0x31a639c7,0x21242965,0x318631a6,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x73ae73ae,0x73ae73ae,0x8c716b4d,0x7bef8c71,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x7bef7bef,0x73ae73ae,0x73ae73ae,0x8c716b4d,0x7bef8c71,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x7bef7bef,0x73ae73ae,0x73ae73ae,0x8c716b4d,0x7bef8c71,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x7bef7bef,0x72e772e7,0x7b0772e7,0x6aa66aa6,0x6aa67b07,0x72e772e7,0x6aa672e7,0x6aa649e4,0x72e76aa6, +0x73ae7bcf,0x19e3738e,0x08e10901,0x1a231142,0x84103c47,0x224452aa,0x19c319a3,0x630c1162,0x08621083,0x08631083,0x10831083,0x10831083,0x10831083,0x10831082,0x10831083,0x10830862,0x41cc41cc,0x20c60021,0x00b009b1,0x31091884,0x20c61083,0x20c609b1,0x314a1884,0x18840000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232103,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232103,0x20e22923,0x18a118a1,0x18a10840,0x512218a1,0x51224902,0x51225122,0x18a15122,0x08400840,0x18a10840, +0x630c39e7,0x29453186,0x29452945,0x29452945,0x21242945,0x29452945,0xa5342945,0x3186630c,0x318639e7,0x31863186,0x31863186,0x31863186,0x29653186,0x31863186,0x31863186,0x31863186,0x318639e7,0x29453186,0x29452945,0x31863186,0x31863186,0x29452945,0x31862945,0x31863186,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800, +0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x8c718c71,0x73ae7bef,0x7bef73ae,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x8c718c71,0x73ae7bef,0x7bef73ae,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x8c718c71,0x73ae7bef,0x7bef73ae,0x81a1bccc,0x61407180,0x9082b8a2,0x5b8132d1,0xacc14183,0x90828be1,0x2a6f32d1,0xbccc146d, +0x8c5173ae,0xa51411a2,0x7bcf8410,0x1a237bef,0x1a231a23,0x94927bef,0x94b28c51,0x114239e7,0x10821083,0x18c51083,0x10831083,0x08620862,0x18a40841,0x18c518c5,0x108318c5,0x08620862,0x31090021,0x20c6314a,0x09b109d1,0x310920c6,0x20c61083,0x28c809d1,0x002120c6,0x1884314a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x936541e6,0x7ae47ae4,0x93657ae4,0x7ae49365,0x93659365,0x93257ae4,0x93659365,0x7ae49365,0x93659365,0x7ae47ae4,0x93657ae4,0x7ae49365,0x93659365,0x93257ae4,0x93659365,0x29238305,0xb48b1061,0x2902b48b,0xb3a9ab88,0xab68ab68,0xab88ab88,0xab88ab68,0xb48b2902,0x18a1b48b, +0x7bef4a69,0x108239e7,0x21242945,0x29452945,0x29452945,0x29452945,0xb5b61082,0x29657bef,0x7bef4a69,0x7bcf7bcf,0x73ae7bcf,0x7bef7bef,0x7bcf7bcf,0x7bcf7bcf,0x7bef7bef,0x29657bef,0x7bef4a69,0x7bcf7bcf,0x738e7bcf,0x7bcf738e,0x738e7bcf,0x738e738e,0x7bcf7bcf,0x29657bef,0xfb60f800,0xfb60f800,0xfb60f800,0x0000f800,0xf8000000,0xf800fb60,0xfb60f800,0xf800f800, +0x8c717bef,0xfff673ae,0x7beffd65,0x73ae7bef,0xfd6573ae,0x73aefd65,0x7bef7bef,0x8c718c71,0x8c717bef,0xdd7273ae,0x7befac6e,0x73ae7bef,0xac6e73ae,0x73aeac6e,0x7bef7bef,0x8c718c71,0x8c717bef,0x39e773ae,0x7bef31a6,0x73ae7bef,0x31a673ae,0x73ae31a6,0x7bef7bef,0x8c718c71,0x81a1b48b,0x61407180,0x9082b8a2,0x5b8132d1,0xacc13142,0x90828be1,0x2a6f32d1,0xb48b146d, +0x7bcfbdd7,0xb5b622a4,0xb5b63c07,0x39c71a23,0xce592264,0x7befa534,0x7bef9492,0x31a68c51,0x10830864,0x18c518c5,0x00211083,0x108318c5,0x20e60841,0x18c518c5,0x10831083,0x10830863,0x00211884,0x314a1884,0x3109314a,0x20c620c6,0x314a1083,0x00b009d1,0x0021314a,0x20c6314a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b4341e6,0xabc5a363,0xabc5abc5,0x8b43abc5,0xa384abc5,0x8b43a384,0x8b438b43,0x8b43abc5,0xa384abc5,0xabc5a363,0xabc5abc5,0x8b43abc5,0xa384abc5,0x8b43a384,0x8b438b43,0x29237ae4,0xb48b0840,0xa34720e2,0xa347a368,0xa347a347,0xa3479b47,0xa368a347,0x2102a388,0x0840b46b, +0x73ae4a49,0x000039e7,0x18c31082,0x18c318c3,0x10a218c3,0x108218c3,0xb5960000,0x3186738e,0x73ae4a49,0xad55ad55,0xa514ad55,0xa514a514,0x9cf3ad55,0xad55ad55,0xa514a514,0x3186738e,0x73ae4a49,0xb596b596,0xb596b596,0xad55b596,0xad55ad55,0xa514a514,0xad55b596,0x3186738e,0xfb60f800,0x00000000,0x0000f800,0x0000fb60,0x00000000,0xfb600000,0x0000fb60,0xf800f800, +0x73ae7bef,0x73ae73ae,0x73ae73ae,0x73ae73ae,0xfffffff6,0xff69fff6,0xfd65ff69,0x7bef73ae,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x73ae73ae,0xe615dd72,0xbcd0dd72,0xac6ebcd0,0x7bef73ae,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x422839e7,0x31a639e7,0x31a631a6,0x7bef73ae,0x81a1bccc,0x61407180,0x9082b8a2,0x314232d1,0xb5b65b81,0x90828c51,0x2a6f32d1,0xbccc146d, +0xb596b596,0x11421142,0x11421142,0x7bef2264,0x114219a3,0x9cf3b596,0x7bef2b05,0x1a231a23,0x398a1083,0x20c5396a,0x08610862,0x08621063,0x396a0841,0x108318c5,0x10821083,0x08620862,0x188420c6,0x00001884,0x00000021,0x20c609b1,0x310920c6,0x00b009d1,0x31090021,0x28c820c6,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0xabc5abc5,0x8b43abc5,0x8b43abc5,0x8b438b43,0x8b438b43,0xa363a384,0x8b43abc5,0x8b438b43,0xabc5abc5,0x8b43abc5,0x8b43abc5,0x8b438b43,0x8b438b43,0xa363a384,0x29239365,0x29020840,0x51c4a347,0x494351c4,0x51c451a4,0x51c451c4,0x51c451c4,0xa34751a4,0x08402902, +0x7bef4a49,0x39e77bef,0x00000000,0x00000000,0x00000000,0x00000000,0xb5964208,0x29657bef,0x7bef4a49,0xa514b596,0xa514a514,0xa514a514,0xa514a514,0xb596b596,0xb596b596,0x29657bef,0x7bef4a49,0xb596b596,0xad55b596,0xce59b596,0xa514ce59,0xb596b596,0xb596ad55,0x29657bef,0xfb60f800,0x0000f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x7bef6b4d,0x7bef7bef,0x7bef73ae,0x7bef7bef,0x8c718c71,0xfff67bef,0x8c71fd65,0x6b4d8c71,0x7bef6b4d,0x7bef7bef,0x7bef73ae,0x7bef7bef,0x8c718c71,0xdd727bef,0x8c71ac6e,0x6b4d8c71,0x7bef6b4d,0x7bef7bef,0x7bef73ae,0x7bef7bef,0x8c718c71,0x39e77bef,0x8c7131a6,0x6b4d8c71,0x81a172e7,0x61407180,0x9082b8a2,0x41833142,0xb5b65b81,0x90828c51,0x2a6f32d1,0x72e7146d, +0x1a231a23,0x7bef33e6,0x39c76b6d,0x84107bef,0x7bef9492,0x19e31142,0x1a233c27,0x39c71a23,0x08411084,0x10830841,0x08620862,0x08621083,0x398a0841,0x10830862,0x41ab0841,0x108318c5,0x188428c8,0x314a20c6,0x20c60021,0x00b009b1,0x314a20c6,0x00b009d1,0x002109b1,0x1884314a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa34441e5,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0x29238b04,0xab880840,0x51c4a347,0xb3889ac6,0xab8851a4,0x51a4ab88,0xb3a99ac6,0xa36851c4,0x1881ab88, +0x7bef4a49,0x7bcfad55,0x39c739e7,0x00000000,0x00000000,0x39e739e7,0xa51473ae,0x318673ae,0x7bef4a49,0xad55ad55,0x9cf3ad55,0xb596ad55,0xad55ad55,0xa514a514,0xa514a514,0x318673ae,0x7bef4a49,0xb596ad55,0xb596b596,0x1082b596,0xce591082,0xb596ad55,0xa514b596,0x318673ae,0xf800f800,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000,0xf800f800, +0x7bef7bef,0x73ae8c71,0x8c71ff69,0x73ae8c71,0x73ae6b4d,0x8c718c71,0x7bef8c71,0x7bef7bef,0x7bef7bef,0x73ae8c71,0x8c71bcd0,0x73ae8c71,0x73ae6b4d,0x8c718c71,0x7bef8c71,0x7bef7bef,0x7bef7bef,0x73ae8c71,0x8c7131a6,0x73ae8c71,0x73ae6b4d,0x8c718c71,0x7bef8c71,0x7bef7bef,0x20e2bccc,0x31423142,0x9082b8a2,0x39633963,0xacc13142,0x29028be1,0x2a6f32d1,0x9c293142, +0x3c075aeb,0x7bef7bcf,0x31867bef,0x94b2b596,0x2b057bef,0x39c78430,0x5aeb2244,0x84309cd3,0x10831082,0x08621083,0x10830862,0x08630863,0x08411083,0x10840862,0x08421083,0x10831083,0x18843109,0x18841884,0x20c60021,0x00b009b1,0x09b120c6,0x09b109d1,0x002109b1,0x1884314a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa38441e6,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xa384a384,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xa384a384,0x29239325,0xab881881,0x4943a347,0xa3479ac6,0xa3474983,0x41228a85,0xb3a9a347,0xa34751c4,0x18a1ab88, +0x7bcf4a49,0xb596b596,0x7befb596,0x42084208,0x420839e7,0xb5967bef,0xad559cf3,0x31867bcf,0x7bcf4a49,0xb596b596,0xb596b596,0xb596b596,0xb596a514,0xb596b596,0xad559cf3,0x31867bcf,0x7bcf4a49,0xb596b596,0xb596ad55,0x10822104,0x21041082,0xb596ce59,0xad559cf3,0x31867bcf,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x73ae7bef,0x73ae73ae,0x73ae73ae,0xfff673ae,0xfd65fd65,0x73aefd65,0x73ae73ae,0x7bef8c71,0x73ae7bef,0x73ae73ae,0x73ae73ae,0xdd7273ae,0xac6eac6e,0x73aeac6e,0x73ae73ae,0x7bef8c71,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x39e773ae,0x31a631a6,0x73ae31a6,0x73ae73ae,0x7bef8c71,0x20e29c29,0x20e220e2,0x20e220e2,0x290220e2,0x29022902,0x20e220e2,0x2a6f32d1,0x9c292902, +0x5aeb8c51,0xb5b6b596,0x11622b45,0x6b4db596,0x3386bdd7,0x1a239492,0xc6185aeb,0x7bef7bef,0x10830862,0x10831083,0x10821083,0x20e51083,0x08620863,0x00220862,0x086218c5,0x10831083,0x00000021,0x20c620c6,0x31091884,0x00b009d1,0x09b11083,0x3109314a,0x002109b1,0x188409b1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x8b4341c5,0x8b438b43,0xabc58b43,0xa384a384,0x8b438b43,0xa3638b43,0x8b43abc5,0xa384a384,0x8b438b43,0x8b438b43,0xabc58b43,0xa384a384,0x8b438b43,0xa3638b43,0x8b43abc5,0x29237ae4,0xb3a918a1,0x49638a65,0x498351a4,0x51c451c4,0x51c44963,0x51a44983,0xa34751c4,0x18a1ab88, +0x8c714a49,0xc638c638,0xce59c638,0xce79ce79,0xce79c618,0xc638ce59,0xc638c638,0x39e78c71,0x8c714a49,0xc638c638,0xce59c638,0xce79ce79,0xce79c618,0xc638ce59,0xc638c638,0x39e78c71,0x8c714a49,0xc638c638,0xce59c638,0x00002104,0x21040000,0xc638ce59,0xc638c638,0x39e78c71,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0xfff67bef,0x6b4dff69,0x73ae8c71,0x7bef7bef,0xfff6ffff,0x8c718c71,0x8c718c71,0x8c718c71,0xdd727bef,0x6b4dbcd0,0x73ae8c71,0x7bef7bef,0xdd72e615,0x8c718c71,0x8c718c71,0x8c718c71,0x39e77bef,0x6b4d31a6,0x73ae8c71,0x7bef7bef,0x39e74228,0x8c718c71,0x8c718c71,0x8c718c71,0x9c29bccc,0x9c299c29,0xbccc9c29,0xb48bb48b,0x9c299c29,0x72e79c29,0x9c29bccc,0x9c299c29, +0x08e17bef,0xbdd71a23,0x2b053c47,0xb59622a4,0x2b05ad55,0x19c32244,0x21041182,0xb596c638,0x08410862,0x18c5398a,0x10830862,0x18c520e6,0x08621083,0x08411083,0x18c518a5,0x10830862,0x18840021,0x00b020c6,0x10831884,0x09b109d1,0x09b11083,0x002200b0,0x002109b1,0x188409b1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0xabc5abc5,0xa363abc5,0xabc58b43,0xa384abc5,0xa384a384,0xabc5abc5,0xabc58b43,0xa384abc5,0xabc5abc5,0xa363abc5,0xabc58b43,0xa384abc5,0xa384a384,0xabc5abc5,0x29239365,0xab8818a1,0x51c49ac6,0xa347ab88,0xab8851a4,0x51c4ab88,0xab88a347,0xa34751c4,0x18a1b3a9, +0x42282965,0x84107bcf,0x528a5aeb,0x5acb4a69,0x52aa5acb,0x4a69528a,0x5aeb73ae,0x39c77bcf,0x42282965,0x8c717bcf,0x7bcf9cf3,0x94b273ae,0x84309492,0x6b6d7bcf,0x5aeb6b4d,0x39c77bcf,0x42282965,0x84107bcf,0x528a5aeb,0x21048c71,0x632c2104,0x6b6d528a,0x5aeb73ae,0x39c77bcf,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x6b4d73ae,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x6b4d73ae,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x6b4d73ae,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x72e772e7,0x6aa66aa6,0x6aa66aa6,0x72e76aa6,0x72e772e7,0x6aa66aa6,0x6aa66aa6,0x72e772e7, +0x7bef7bef,0x1a031122,0xb5963c27,0x19e31a23,0x19c32244,0x8c5131a6,0x39c77bef,0xc6182264,0x10831083,0x08620841,0x18a51083,0x108418c5,0x08411083,0x084118c5,0x398a3129,0x108418c5,0x18840021,0x00b020c6,0x10831884,0x314a314a,0x09b11083,0x20c600b0,0x002120c6,0x188409b1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x930441e5,0x8b048b04,0x8b048b04,0x93048b04,0x93049304,0x8b048b04,0x8b048b04,0x62027263,0x72836202,0x8b048b04,0x8b048b04,0x93048b04,0x93049304,0x8b048b04,0x8b048b04,0x292382c4,0xab880840,0x59c4a347,0xa347ab88,0xab8851c4,0x51a4ab88,0xab68a367,0xa34751c4,0x18a1ab88, +0x5aeb2965,0x21245acb,0xb5b6738e,0xad55ad55,0xa534ad55,0x6b4da534,0x5acbad55,0x39c7528a,0x5aeb2965,0x632c5acb,0x8c718c71,0x632c6b4d,0x5acb6b4d,0x7bef5acb,0x5acb8430,0x39c7528a,0x5aeb2965,0x6b6d6b6d,0x4a69738e,0x84304a69,0x5acb8430,0x4a696b6d,0x5acb6b4d,0x39c7528a,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x8c718c71,0xffff7bef,0xff69fff6,0xfd65ff69,0x7bef7bef,0xfd65ff69,0x8c718c71,0x6b4d8c71,0x8c718c71,0xe6157bef,0xbcd0dd72,0xac6ebcd0,0x7bef7bef,0xac6ebcd0,0x8c718c71,0x6b4d8c71,0x8c718c71,0x42287bef,0x31a639e7,0x31a631a6,0x7bef7bef,0x31a631a6,0x8c718c71,0x6b4d8c71,0xb8a2bccc,0x146d9082,0x2a6f32d1,0x5b817462,0xb8a23963,0x74629082,0x146d5b81,0xbccc0b4a, +0x7bef7bef,0x1a232b05,0x11422284,0x224439c7,0x33662264,0x2b05a514,0x7bef738e,0x52aa2b05,0x10821083,0x10831083,0x398a398a,0x398a398a,0x08410862,0x0862398a,0x08410841,0x08620841,0x1884314a,0x00b009b1,0x10831884,0x108341cc,0x09b11083,0x314a00b0,0x20c63109,0x00b009b1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x72c641e6,0x72a572c6,0x72c672c6,0x6a8572c6,0x6a856a85,0x72c672a5,0x72c672c6,0x94926244,0x41a373ae,0x72a572c6,0x72c672c6,0x6a8572c6,0x6a856a85,0x72c672a5,0x72c672c6,0x292372c6,0xab880840,0x51a4a347,0x498351a4,0x51a451a4,0x51c44963,0x49434983,0xa34751a4,0x0840ab88, +0x630c3186,0x29457bef,0x08610000,0x10820861,0x10821082,0x000010a2,0x8430a534,0x2104630c,0x630c3186,0x6b6d7bef,0x5acb73ae,0x7bcf6b4d,0x8430738e,0x7bef8c71,0x84308410,0x2104630c,0x630c3186,0x6b6d7bef,0x6b6d5aeb,0x528a528a,0x6b6d528a,0x6b6d7bcf,0x8430528a,0x2104630c,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x73ae73ae,0x7bef7bef,0xffff7bef,0x73aefff6,0x6b4d7bef,0xfff6ffff,0x73ae73ae,0x7bef6b4d,0x73ae73ae,0x7bef7bef,0xe6157bef,0x73aedd72,0x6b4d7bef,0xdd72e615,0x73ae73ae,0x7bef6b4d,0x73ae73ae,0x7bef7bef,0x42287bef,0x73ae39e7,0x6b4d7bef,0x39e74228,0x73ae73ae,0x7bef6b4d,0xb8a29c29,0x146d9082,0x2a6f32d1,0x39e74a49,0xb8a24183,0x74629082,0x146d5b81,0x9c290b4a, +0x8430738e,0x1a237bef,0x8c512ae5,0x11427bef,0xc6383c27,0x2b457bcf,0x5acb630c,0x11621122,0x10831083,0x08421082,0x08410841,0x08410841,0x08621083,0x10830841,0x10831083,0x08620862,0x18840021,0x00b009d1,0x41cc1884,0x20c641cc,0x09d120c6,0x20c600b0,0x314a0022,0x00b009b1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x316441c5,0x31843164,0x31843184,0x31643184,0x31843184,0x31843184,0x31643164,0xa5342923,0x292373ae,0x31843164,0x31843184,0x31643184,0x31843184,0x31843184,0x31643164,0x18e23164,0xab880840,0x51c4a347,0xa347ab88,0x92a54122,0x4983a347,0x9ac68a85,0xa34751a4,0x18a1ab88, +0x5acb2945,0x29457bef,0x00000000,0x00000000,0x00000000,0x00000000,0x6b4da514,0x212439c7,0x5acb2945,0x6b6d7bef,0x7bef7bef,0x5acb7bcf,0x94929492,0x84107bef,0x6b4d7bcf,0x212439c7,0x5acb2945,0x73ae7bef,0xb596b596,0x6b6d8c71,0xce59528a,0x7bcfb596,0x6b4d7bcf,0x212439c7,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf8000000, +0x8c717bef,0x73ae8c71,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x8c718c71,0x6b4d8c71,0x8c717bef,0x73ae8c71,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x8c718c71,0x6b4d8c71,0x8c717bef,0x73ae8c71,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x8c718c71,0x6b4d8c71,0xb8a2bccc,0x146d9082,0x2a6f32d1,0x39e74a49,0x9082b8a2,0x74623963,0xb5b65b81,0xbccc8c51, +0xb596b596,0x1a235aeb,0x8430b596,0x39e78430,0x3be71a23,0x33c69cf3,0x7bef1a03,0x5aebad55,0x08410862,0x108318c5,0x10821082,0x10830862,0x08620861,0x08421083,0x086318c5,0x10831083,0x18840021,0x00b009d1,0x00211884,0x20c641cc,0x09d128c8,0x20c609b1,0x18840022,0x00b009b1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x7ae441e6,0x7ae47ae4,0x93657ae4,0x7ae49365,0x7ae49365,0x93047ae4,0x93259325,0xc6187ac4,0x51e28430,0x7ae47ae4,0x93657ae4,0x7ae49365,0x7ae49365,0x93047ae4,0x93259325,0x29239325,0xab881061,0x51c4a347,0xa2e69ac6,0xab8851a4,0x4943ab88,0xb3a99ac6,0xa34751c4,0x18a1ab88, +0x738e39c7,0x4a697bcf,0x000031a6,0x00000000,0x00000000,0x31a60000,0x8430528a,0x2124738e,0x738e39c7,0x6b4d7bcf,0x7bcf8c71,0x5acb7bcf,0x8c516b4d,0x94b294b2,0x8430738e,0x2124738e,0x738e39c7,0xb5968c71,0xb596b596,0x528a39c7,0x84308430,0xb596ce59,0x7bcfb596,0x2124738e,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000, +0x8c717bef,0x7bef7bef,0x6b4d7bef,0xfff67bef,0x7beffd65,0x73ae73ae,0x73ae73ae,0x7bef73ae,0x8c717bef,0x7bef7bef,0x6b4d7bef,0xdd727bef,0x7befac6e,0x73ae73ae,0x73ae73ae,0x7bef73ae,0x8c717bef,0x7bef7bef,0x6b4d7bef,0x39e77bef,0x7bef31a6,0x73ae73ae,0x73ae73ae,0x7bef73ae,0xb5b66aa6,0x146d8c51,0x2a6f32d1,0x5b817462,0x9082b8a2,0x74623142,0x146d5b81,0x72e70b4a, +0x19c322c4,0x1a231122,0x2284bdd7,0x7bef94b2,0x1a2339c7,0x39e71142,0xad551a23,0x1a23b5b6,0x08410862,0x20c518c5,0x10820862,0x41cc1082,0x18c518c5,0x10830862,0x08620841,0x10831083,0x31090021,0x00b009d1,0x00211884,0x310941cc,0x314a314a,0x20c61884,0x18840022,0x00b009d1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xa34441e6,0xa363a344,0xa363a363,0xa363a363,0xa363a363,0xa344a344,0xa344a344,0xce798ac3,0x8ac3a534,0xa363a344,0xa363a363,0xa363a363,0xa363a363,0xa344a344,0xa344a344,0x2923a363,0x290218a1,0x51a4a368,0x51c44963,0x51c451c4,0x49434963,0x51a451c4,0xa34751c4,0x08402902, +0x528a2965,0x6b6d5aeb,0x21246b6d,0x31863186,0x29452104,0x42082104,0x8c516b4d,0x29456b4d,0x528a2965,0x6b6d5aeb,0x632c9cd3,0x84308c51,0x6b6d5aeb,0x5acb5acb,0x8c516b4d,0x29456b4d,0x528a2965,0xce595aeb,0x528ace59,0x6b6d528a,0x6b6d6b6d,0xce596b6d,0x8c51ce59,0x29456b4d,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000, +0x6b4d7bef,0x73ae73ae,0x73aeff69,0x73ae73ae,0x73ae8c71,0x7bef7bef,0xff69fff6,0x7bef7bef,0x6b4d7bef,0x73ae73ae,0x73aebcd0,0x73ae73ae,0x73ae8c71,0x7bef7bef,0xbcd0dd72,0x7bef7bef,0x6b4d7bef,0x73ae73ae,0x73ae31a6,0x73ae73ae,0x73ae8c71,0x7bef7bef,0x31a639e7,0x7bef7bef,0xb8a2bccc,0x29029082,0x2a6f32d1,0x5b817462,0x31423142,0x74623142,0x39635b81,0x9c294183, +0x7bef1a23,0x11227bef,0x3c471a23,0x2b25b596,0x08e13186,0x7bef8c51,0x1a231142,0x84301a23,0x08411083,0x398a396a,0x0862398a,0x08410862,0x18c5398a,0x08621083,0x398a0841,0x108318c5,0x31090021,0x09b109d1,0x20c620c6,0x18841884,0x18840021,0x20c620c6,0x314a3109,0x09d109d1,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0xa384abc5,0xabc5a363,0x51e2a384,0xabc551e2,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0xa384abc5,0xabc5a363,0x2923abc5,0xb48b0840,0xa34720e2,0x9b27a347,0xa347a347,0xa347a388,0xa347a347,0x2102a347,0x18a1b48b, +0x528a2945,0x52aa7bcf,0x8c71630c,0x7bcf8c71,0x528a632c,0x7bef8430,0x7bcf5aeb,0x3186528a,0x528a2945,0x52aa7bcf,0x8c71630c,0x7bcf8c71,0x528a632c,0x7bef8430,0x7bcf5aeb,0x3186528a,0x528a2945,0x52aa7bcf,0x5aeb630c,0x7bcf5aeb,0x528a632c,0x7bef8430,0x7bcf5aeb,0x3186528a,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000, +0x7bef7bef,0x8c718c71,0x8c718c71,0x8c718c71,0x8c7173ae,0x8c718c71,0x7bef6b4d,0x73ae7bef,0x7bef7bef,0x8c718c71,0x8c718c71,0x8c718c71,0x8c7173ae,0x8c718c71,0x7bef6b4d,0x73ae7bef,0x7bef7bef,0x8c718c71,0x8c718c71,0x8c718c71,0x8c7173ae,0x8c718c71,0x7bef6b4d,0x73ae7bef,0x2902bccc,0x20e220e2,0x20e220e2,0x5b817462,0x29022902,0x20e220e2,0x20e220e2,0x9c292902, +0xb596b596,0x7bef6b4d,0x1a232965,0x3c473c47,0x7bef1a23,0x7bef8c51,0x11629492,0x9cf36b6d,0x10820862,0x08410841,0x10820841,0x10830863,0x314a0841,0x10831083,0x08411083,0x1083398a,0x310941cc,0x09d120c6,0x314a00b0,0x1884314a,0x314a1884,0x3109314a,0x00223109,0x314a314a,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff, +0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xabc541e6,0xa363a384,0xa384a384,0x8b438b43,0x8b438b43,0xa3848b43,0xa3848b43,0x8b438b43,0x8b438b43,0xa363a384,0xa384a384,0x8b438b43,0x8b438b43,0xa3848b43,0xa3848b43,0x2923abc5,0xb48b18a1,0x2902b46a,0xab88ab88,0xab88ab88,0xab88ab68,0xab88ab88,0xbcac2922,0x1881b48b, +0x6b6d39c7,0x630c5acb,0x52aa4228,0x738e738e,0x630c4a69,0x630c632c,0x422852aa,0x318652aa,0x6b6d39c7,0x630c5acb,0x52aa4228,0x738e738e,0x630c4a69,0x630c632c,0x422852aa,0x318652aa,0x6b6d39c7,0x630c5acb,0x52aa4228,0x738e738e,0x630c4a69,0x630c632c,0x422852aa,0x318652aa,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x73ae7bef,0x73ae73ae,0x7bef73ae,0x8c718c71,0x8c716b4d,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x8c718c71,0x8c716b4d,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x8c718c71,0x8c716b4d,0x73ae7bef,0x73ae73ae,0x7bef73ae,0xbcccbccc,0xb48bbccc,0xbcccbccc,0x9c29bccc,0x9c299c29,0xbccc72e7,0xbcccbccc,0x9c29bccc, +0xb596b596,0xa534b596,0x7bef94b2,0x1a232244,0xb5965aeb,0xb596b596,0x5aeb8410,0x8c71b5b6,0x10831083,0x08621083,0x10830862,0x08620862,0x08411083,0x10830862,0x10821084,0x10830841,0x310941cc,0x09b10021,0x314a00b0,0x1884314a,0x00221884,0x002109b1,0x18841884,0x18840021,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef, +0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x41c541e6,0x41c541c5,0x41e641c5,0x41e641e6,0x41e641c5,0x41e641e6,0x41e641e6,0x292341e6,0x41c541e6,0x41c541c5,0x41e641c5,0x41e641e6,0x41e641c5,0x41e641e6,0x41e641e6,0x316441e6,0x18a118a1,0x18a10840,0x188118a1,0x08400840,0x18a10840,0x084018a1,0x18a118a1,0x18a118a1, +0x31a639c7,0x318631a6,0x29653186,0x29652965,0x39c72124,0x31a639c7,0x21242965,0x318631a6,0x31a639c7,0x318631a6,0x29653186,0x29652965,0x39c72124,0x31a639c7,0x21242965,0x318631a6,0x31a639c7,0x318631a6,0x29653186,0x29652965,0x39c72124,0x31a639c7,0x21242965,0x318631a6,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x73ae7bcf,0x4a69738e,0x29452945,0x5aeb39c7,0x8410ad75,0x5aeb52aa,0x4a494228,0x630c39e7,0x31863186,0x31863186,0x94b20020,0x52aa94b2,0x52aa52aa,0x318652aa,0x31863186,0x52aa52aa,0xe6f4d673,0xc5d0d693,0xded4fffa,0xef16c611,0xf737deb3,0xd672d652,0xdeb3d673,0xc611d693,0x94505248,0xa4b24a08,0x6aec9c71,0x94505269,0x52495249,0xa4904a28,0x6aecb514,0x9cd3b470, +0x6a865a45,0x39837b07,0x6aa66265,0x41846a86,0x6aa66aa6,0x31426286,0x6aa66286,0x7b076285,0x6ac76aa6,0x6aa63963,0x6a866aa6,0x6aa63963,0x6aa66aa6,0x6aa66aa6,0x39633963,0x6aa63963,0xef5def5d,0xe73ce73c,0xdefbdefb,0xd69adedb,0xdedbd6ba,0xd6bad6ba,0xd6bad6ba,0xce79d69a,0xff89ffa9,0xff28ff68,0xfec7fee7,0xf646f686,0xfe87f646,0xfe66fe66,0xfe26fe46,0xfde6fe06, +0x6efb7f1b,0x4eda5efa,0x1e782e99,0x06160637,0x06580617,0x06370637,0x06170637,0x05d605f6,0x31642923,0x39643164,0x31643164,0x31643964,0x31643164,0x31643164,0x31643164,0x31643164,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232103,0x20e22923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232923,0x29232103,0x20e22923, +0x00000000,0x00000000,0x00000000,0x7a080000,0x00005165,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x6aca0000,0x00004a07,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800,0xf800f800, +0x8c5173ae,0xa5144208,0x7bcf8410,0x5aeb7bef,0x5aeb5aeb,0x94927bef,0x94b28c51,0x39c739e7,0x52aa52aa,0x318652aa,0x31863186,0x31863186,0x52aa52aa,0x94b294b2,0x318652aa,0x52aa3186,0xde74e6b5,0xce52d673,0xd653de94,0xe6d4deb3,0xded4b56e,0xd693bdaf,0xcdf2e6d5,0xe6b5ce52,0x7b8d9c91,0x8bef6b0c,0x9cd36aec,0x524983ce,0xb555bdd7,0xa4d28c0f,0x6aca83ce,0x83ae7b6c, +0x62863963,0x418493a9,0x7b076aa6,0x398349e4,0x6a869388,0x39639bc9,0x7b076285,0x62863983,0xb48b49e4,0xb48bb48b,0xb48bb48b,0xac4aac4a,0xb48bb48b,0xb48bac2a,0xb48bb48b,0x6aa6b48b,0xf79ed6ba,0xef7def7d,0xef7def7d,0xef7def7d,0xef5def5d,0xdedbe71c,0xd6bad6ba,0xc638d69a,0xffeaeea8,0xffaaffca,0xffcaffaa,0xffaaffaa,0xff8aff8a,0xfea6ff08,0xf665f686,0xe5a5f645, +0x975c0637,0x7f1b8f3c,0x873c873c,0x7f1b873c,0x6f1b7f1b,0x0e583699,0x06170637,0x05730616,0x83053184,0x7ae47ae4,0x93657ae4,0x7ae49365,0x93659365,0x93257ae4,0x93659365,0x31848305,0x936541e6,0x7ae47ae4,0x93657ae4,0x7ae49365,0x93659365,0x93257ae4,0x93659365,0x29238305,0x936541e6,0x7ae47ae4,0x93657ae4,0x7ae49365,0x93659365,0x93257ae4,0x93659365,0x29238305, +0x00000000,0x00000000,0xc0e40000,0x98a398a3,0x98a398a3,0x000098a3,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x6aca0000,0x00004a07,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb60f800,0xfb60f800,0xfb60f800,0x0000f800,0xf8000000,0xf800fb60,0xfb60f800,0xf800f800, +0x7bcfbdd7,0xb5b6738e,0xb5b6ad55,0x39c75aeb,0xce59630c,0x7befa534,0x7bef9492,0x31a68c51,0x94b252aa,0x94b23186,0x52aa0020,0x318652aa,0x31863186,0x31860020,0x52aa52aa,0x94b294b2,0xe6d5fffa,0xb56ece31,0xd672d652,0xf757d672,0xf757e6b5,0xded4e6d5,0xd693e6f4,0xd653e6d5,0x9c91b554,0xb554bdb6,0x83efa4f3,0xad3594b2,0x83ce8c30,0x94309cb2,0xb4f35aaa,0x5a69b596, +0x6ac641a4,0x6aa65a45,0x7b076a86,0x6ac749e4,0x62656ac6,0x39836286,0x93a86aa6,0x39639be9,0xb48b3963,0x9c299be8,0x9c29a44a,0x9c299c29,0xa4299be9,0xa44a9c29,0xa44aa46a,0x3963b46b,0xf79ededb,0xef7df79e,0xf79ef79e,0xf79ef79e,0xef5def7d,0xe71ce71c,0xdedbdefb,0xce59dedb,0xffeceea9,0xffccffec,0xffecffec,0xffecffec,0xffabffcb,0xff07ff28,0xfec7fee7,0xedc5fea6, +0xa77d0637,0x975c975c,0xa75da75d,0x9f5ca75d,0x7f1b8f3c,0x2e9946ba,0x0e581e78,0x05940e58,0x7ae43184,0xabc5a363,0xabc5abc5,0x8b43abc5,0xa384abc5,0x8b43a384,0x8b438b43,0x31847ae4,0x8b4341e6,0xabc5a363,0xabc5abc5,0x8b43abc5,0xa384abc5,0x8b43a384,0x8b438b43,0x29237ae4,0x8b4341e6,0xabc5a363,0xabc5abc5,0x8b43abc5,0xa384abc5,0x8b43a384,0x8b438b43,0x29237ae4, +0x00000000,0x00000000,0xe082ce79,0xce79c0e4,0x98a3c0e4,0x94b298a3,0x00000000,0x00000000,0x00000000,0x00000000,0x936a0000,0x72a872a8,0x72a872a8,0x000072a8,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb60f800,0x00000000,0x0000f800,0x0000fb60,0x00000000,0xfb600000,0x0000fb60,0xf800f800, +0xb596b596,0x39c739c7,0x39c739c7,0x7bef630c,0x31a64228,0x9cf3b596,0x7bef7bef,0x5aeb5aeb,0x318652aa,0x31863186,0x31863186,0x31863186,0x94b294b2,0x31863186,0x31863186,0x52aa3186,0xdeb4ef16,0xef36d672,0xd652ded4,0xbdafe6d4,0xdeb3c5f1,0xd652de93,0xe6d5e6b5,0xd673d652,0xa4b2b554,0x5a6a9471,0xb555b555,0x83efacf4,0x9cf3ad34,0xa51483ef,0x5289a4d2,0x8c0f83ce, +0x9bc93963,0x62863963,0x9bc96aa6,0x6aa63943,0x62853983,0x396393a9,0x62656aa6,0x9bc94184,0xb48b3963,0xbccc9c29,0xb48bbccc,0xbcccbcac,0xbcccbccc,0xbcccbccc,0x9c29bcac,0x3963b48b,0xf79ededb,0xf79ef79e,0xf79ef79e,0xf79ef79e,0xef7df79e,0xe73cef5d,0xdedbdefb,0xce59dedb,0xffeeeeaa,0xffeeffee,0xffeeffee,0xffedffed,0xffccffcd,0xff49ff8a,0xf6a7f6e7,0xedc5f6a6, +0xaf7d0637,0xa75da75d,0xaf7da77d,0xa75daf7d,0x8f3c975c,0x56da7f1b,0x06581e78,0x05940657,0x93653184,0xabc5abc5,0x8b43abc5,0x8b43abc5,0x8b438b43,0x8b438b43,0xa363a384,0x31849365,0xabc541e6,0xabc5abc5,0x8b43abc5,0x8b43abc5,0x8b438b43,0x8b438b43,0xa363a384,0x29239365,0xabc541e6,0xabc5abc5,0x8b43abc5,0x8b43abc5,0x8b438b43,0x8b438b43,0xa363a384,0x29239365, +0x00000000,0x00000000,0xe082f945,0xe082e082,0xce79e082,0x98a398a3,0x00000000,0x00000000,0x00000000,0x00000000,0x936a0000,0x936a936a,0x72a8936a,0x000072a8,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb60f800,0x0000f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x5aeb5aeb,0x7befa514,0x39c76b6d,0x84107bef,0x7bef9492,0x528a39c7,0x5aebad75,0x39c75aeb,0x52aa0020,0x52aa52aa,0x52aa3186,0x52aa52aa,0x94b294b2,0x52aa52aa,0x94b252aa,0x002094b2,0xe6d5ce32,0xcdf2e6f4,0xd673deb4,0xde93deb3,0xdeb3deb4,0xffd8de93,0xd672d672,0xbd8fd652,0xb5556aec,0x6aeab534,0x8c71730b,0x52aa73ae,0x5249a4d3,0x5249ad35,0x6aec6aea,0x94507bcf, +0x7b073983,0x62863983,0x9bc96ac7,0x9bc941a4,0x5a453943,0x39839be9,0x93a96aa6,0x9bc93963,0xb46b3963,0xbccc9c29,0xb48bb46b,0xb46bb48b,0xb48bb48b,0xbcabb48b,0xa44abccc,0x6285b48b,0xf79ededb,0xf79ef79e,0xf79ef79e,0xf79ef79e,0xf79ef79e,0xef7df79e,0xe71ce73c,0xce59defb,0xffefee8a,0xffeeffef,0xffeeffee,0xffedffee,0xffcdffed,0xffabffec,0xff28ff69,0xe5e5fee8, +0xaf7d0637,0xaf7daf7d,0xaf7daf7d,0xa77daf7d,0x9f5ca75d,0x873c9f5c,0x3eb95efa,0x05942699,0x8b043164,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0x31648b04,0xa34441e5,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0x29238b04,0xa34441e5,0xa363a363,0xa344a344,0xa363a344,0xa363a363,0xa363a363,0xa344a344,0x29238b04, +0x00000000,0x00000000,0xf9450000,0xe082ffff,0xc0e4e082,0x000098a3,0x00000000,0x00000000,0x00000000,0x00000000,0xcccf0000,0x936acccf,0x936a936a,0x000072a8,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xf800f800,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000,0xf800f800, +0xa5345aeb,0x7bef7bcf,0x31867bef,0x94b2b596,0x7bef7bef,0x39c78430,0x5aeb5aeb,0x84309cd3,0x52aa52aa,0x318694b2,0x94b23186,0x318694b2,0x31860020,0x94b294b2,0x52aa94b2,0x52aa52aa,0xe6b5ded4,0xe6d5ad0d,0xef16c611,0xde74d693,0xf756f737,0xd672e715,0xd693deb3,0xdeb3d692,0xb5556acc,0x4a28b555,0x5a68ac71,0x736d630b,0x736d9451,0x94306aec,0x7bad83ef,0x62cbbdf7, +0x7b0741c4,0x6aa64184,0x93a86286,0x62653963,0x5a453983,0x41849bea,0x9bc96aa6,0x93a841a4,0xb46a6286,0xb48b9c29,0x9c29b48b,0x9c299c29,0x9c299c29,0xbcab9c29,0x9c29bccc,0x6a86b48b,0xf79ed6ba,0xf79ef79e,0xf79ef79e,0xf79ef79e,0xf79ef79e,0xf79ef79e,0xef7df79e,0xce79ef5d,0xffeeee89,0xffeeffee,0xffedffed,0xffecffed,0xffecffec,0xffebffeb,0xffaaffeb,0xee06ff69, +0xa77d0637,0xaf7daf7d,0xa75da77d,0xa77da77d,0xa75da75d,0xa75d9f5c,0x873c9f5c,0x05d566fb,0x93253184,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xa384a384,0x31649325,0xa38441e6,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xa384a384,0x29239325,0xa38441e6,0xa384a384,0xabc5abc5,0x8b438b43,0x8b438b43,0xa384a384,0xa384a384,0x29239325, +0x00000000,0x00000000,0x00000000,0xf945f945,0xe082f945,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xcccfcccf,0x936acccf,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x5aeb8c51,0xb5b6b596,0x39c78c51,0x6b4db596,0x9492bdd7,0x5aeb9492,0xc6185aeb,0x7bef7bef,0x318652aa,0x31863186,0x31863186,0x52aa3186,0x52aa0020,0x318652aa,0x31863186,0x52aa94b2,0xb54ec5d0,0xde93e6d5,0xde94de93,0xd672e6d5,0xdeb3deb3,0xef56deb3,0xe6b5deb3,0xef15c5f0,0x6aec9431,0xa514a534,0x6aec83ee,0xc5f8c5f8,0x83cf4a28,0x730bbdf7,0x9c5183ae,0x4a286b4d, +0x9be96aa6,0x628641c4,0x93a86ac6,0x6aa641a4,0x39636aa6,0x41a493a8,0x93a86aa6,0x7b0741a4,0xb48b6aa6,0xbccc9c09,0x9be9b46b,0xbcccbccc,0xbcccbccc,0xb48b9c29,0x9c09bccc,0x6aa6b48b,0xf79ed6ba,0xef7df79e,0xf79ef79e,0xf79eef7d,0xf79ef79e,0xf79ef79e,0xef7df79e,0xd69aef7d,0xffcdee89,0xffc9ffed,0xffccffcc,0xffebffcb,0xffebffeb,0xffeaffeb,0xffcaffea,0xee67ffa9, +0x975c0637,0x873ca77d,0x975c975c,0x975c975c,0x975c975c,0x9f5c9f5c,0x8f3c975c,0x0616873c,0x7ae43164,0x8b438b43,0xabc58b43,0xa384a384,0x8b438b43,0xa3638b43,0x8b43abc5,0x31647ae4,0x8b4341c5,0x8b438b43,0xabc58b43,0xa384a384,0x8b438b43,0xa3638b43,0x8b43abc5,0x29237ae4,0x8b4341c5,0x8b438b43,0xabc58b43,0xa384a384,0x8b438b43,0xa3638b43,0x8b43abc5,0x29237ae4, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x21247bef,0xbdd75aeb,0x7befb596,0xb5966b6d,0x7befad55,0x4a495aeb,0x210439e7,0xb596c638,0x94b252aa,0x002094b2,0x318694b2,0x52aa52aa,0x94b252aa,0x94b294b2,0x94b294b2,0x94b294b2,0xde95e6d4,0xe6d5ef16,0xd672e6b5,0xde95eef6,0xfffaf737,0xdeb3c5d0,0xde74d673,0xdeb3d672,0x528a6b4d,0x52485248,0x94109470,0x83efad13,0x62eb9cd3,0x94116aec,0x6aecb554,0x5b0c9c71, +0x9bc96aa6,0x72c73983,0x41a493a8,0x41846aa6,0x41a46aa6,0x39639388,0x6aa66aa6,0x7b073983,0xb48b6aa6,0xbcccac8b,0x9c29b48b,0xb48bbcac,0xbcccb48b,0xb48b9c09,0x9c09bccc,0x6aa6bcab,0xf79ed6ba,0xef7df79e,0xef5df79e,0xef5def5d,0xef5def5d,0xef5def5d,0xe73cef5d,0xce79e71c,0xffcceea8,0xffc9ffec,0xff88ffed,0xff88ff88,0xff88ff88,0xff88ff88,0xff67ff88,0xee45f746, +0x975c0637,0x873ca75d,0x6efba75d,0x6efb6efb,0x6efb6efb,0x6efb6efb,0x56da6efb,0x05d63eb9,0x93653184,0xabc5abc5,0xa363abc5,0xabc58b43,0xa384abc5,0xa384a384,0xabc5abc5,0x31649365,0xabc541e6,0xabc5abc5,0xa363abc5,0xabc58b43,0xa384abc5,0xa384a384,0xabc5abc5,0x29239365,0xabc541e6,0xabc5abc5,0xa363abc5,0xabc58b43,0xa384abc5,0xa384a384,0xabc5abc5,0x29239365, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x7bef7bef,0x52aa3186,0xb596ad55,0x528a5aeb,0x4a695aeb,0x8c5131a6,0x39c77bef,0xc618630c,0x52aa52aa,0x318652aa,0x31863186,0x31863186,0x00203186,0x31863186,0x31863186,0x52aa52aa,0xd693deb3,0xde93e6d5,0xd652deb3,0xffb7e6f5,0xd633deb4,0xd672d693,0xe6b5ded4,0xe6d5d672,0x6aec6aec,0xbdb6bdb6,0x8c71ad34,0x4a489c71,0xa4706aec,0x6aec8c30,0x6b4d83ef,0x736e7bf0, +0x9bc96aa6,0x6aa63983,0x39839bc9,0x41a49bc9,0x39639bc9,0x49e47b07,0x7b076286,0x6ac73983,0xb48b3963,0xcd2d9c29,0x9c29b48b,0xb48bbccc,0xbcacb48b,0xac4aa429,0x9c29bccc,0x72e7b48b,0xf79ed6ba,0xef7def7d,0xef5def5d,0xef5def5d,0xef5def5d,0xef7def5d,0xef5def7d,0xd69ae73c,0xffeceea7,0xffc9ffcb,0xff88ff88,0xff88ff88,0xff88ff88,0xffc8ffa8,0xffa8ffc8,0xee66ff87, +0x9f5c0637,0x873c8f3c,0x6efb6efb,0x6efb6efb,0x6f1b6efb,0x7f1b771b,0x771b873c,0x05f65efa,0x93043164,0xa344a344,0xa344a344,0xa363a344,0xa363a363,0xa344a344,0xa344a344,0x31649304,0x930441e5,0x8b048b04,0x8b048b04,0x93048b04,0x93049304,0x8b048b04,0x8b048b04,0x292382c4,0x930441e5,0x8b048b04,0x8b048b04,0x62027263,0x72836202,0x8b048b04,0x8b048b04,0x292382c4, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xfb60f800,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x7bef7bef,0x5aeb7bef,0x39c76b4d,0x630c39c7,0x8c71630c,0x7befa514,0x7bef738e,0x52aa7bef,0x94b294b2,0x630c52aa,0x318652aa,0x94b294b2,0x52aa52aa,0x52aa52aa,0x94b294b2,0x002094b2,0xde95bdaf,0xdeb3cdf2,0xe6d4bdd0,0xd672de93,0xd693d673,0xffb9eef6,0xe6d5deb3,0xde74deb4,0xacb2a4f3,0x94517bcf,0xa4b39c51,0xb51483f0,0x736d9c91,0x4a288bef,0x8c314a28,0x6aec8c31, +0x7b076a86,0x6aa649e4,0x626593a9,0x39636a86,0x39639388,0x5a257b07,0x7b073142,0x6ac73983,0xb48b3963,0xbcac9c29,0x9c09b48b,0xbcacbcac,0xbcccbccc,0xb48b9c29,0x9c29bcab,0x3963b48b,0xef7dd6ba,0xef7def7d,0xef5def7d,0xef7def7d,0xef7def7d,0xef7def7d,0xef7def7d,0xd69aef5d,0xffebe688,0xffc9ffca,0xffa8ffc9,0xffc9ffc9,0xffc9ffc9,0xffe9ffc9,0xffc8ffe9,0xee66ff88, +0x975c0637,0x873c873c,0x771b873c,0x873c873c,0x873c873c,0x873c873c,0x7f1b873c,0x06166f1b,0x93653184,0xa384abc5,0xabc5abc5,0x8b43abc5,0x8b438b43,0xabc5a363,0xabc5abc5,0x31849365,0x72c641e6,0x72a572c6,0x72c672c6,0x6a8572c6,0x6a856a85,0x72c672a5,0x72c672c6,0x292372c6,0x72c641e6,0x72a572c6,0x72c672c6,0x94926244,0x41a373ae,0x72c672a5,0x72c672c6,0x292372c6, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf800fb60, +0x8430738e,0x5aeb7bef,0x8c517bcf,0x31a67bef,0xc638ad55,0x8c517bcf,0x5acb630c,0x39c72965,0x31863186,0x52aa52aa,0x318652aa,0x31863186,0x002052aa,0x52aa52aa,0x31863186,0x52aa0020,0xded4ce31,0xfffece52,0xef15d672,0xde94deb4,0xf756d693,0xc5f0deb3,0xd652ce52,0xc5f0deb3,0xbd969c92,0xa4d37b6e,0xad357bd0,0x4a288bae,0x730b4a49,0xbd968bcf,0x5aaac5f8,0x4a286b4c, +0x5a456aa6,0x62866aa6,0x6a869bc9,0x6aa66286,0x39836aa6,0x8b686aa6,0x7b073983,0x62864184,0xb48b3963,0xbccc9c09,0x9c29b48b,0xa44aa44a,0x9c299c29,0xb48b9c29,0x9c09bcab,0x6aa6b48b,0xf79ed6ba,0xef5def7d,0xef7def5d,0xef7def7d,0xef7def7d,0xef7def7d,0xef7def7d,0xd6baef7d,0xffebee88,0xff88ffea,0xffc9ff88,0xffc9ffc9,0xffcaffca,0xffc9ffc9,0xffc9ffc9,0xee87ffc9, +0x9f5c0637,0x6efb975c,0x873c6efb,0x873c873c,0x873c873c,0x873c873c,0x7f1b873c,0x06177f1b,0x7ae43164,0xa384a363,0xa384a384,0x8b43abc5,0xa384a384,0xa384a384,0x8b438b43,0x31647ae4,0x316441c5,0x31843164,0x31843184,0x31643184,0x31843184,0x31843184,0x31643164,0x18e23164,0x316441c5,0x31843164,0x31843184,0xa5342923,0x292373ae,0x31843184,0x31643164,0x18e23164, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf8000000, +0xb596b596,0x5aeb5aeb,0x8430b596,0x39e78430,0xa5345aeb,0x9cf39cf3,0x7bef528a,0x5aebad55,0x94b252aa,0x318694b2,0x31863186,0x31863186,0x31863186,0x94b294b2,0x94b294b2,0x002094b2,0xd672e6f4,0xd672eef6,0xeef6eef6,0xeef6e6d5,0xce32e6d5,0xe6d5d672,0xc5f0d653,0xce11ded4,0xa4d26aec,0x52485248,0x5aaa9c92,0x6aec738e,0x736c94b3,0xad1462ca,0x8c309c71,0x9470a514, +0x41a46aa6,0x62866aa6,0x7b077b07,0x62866aa6,0x41a46ac7,0x9bc96aa6,0x9bc93983,0x7b073963,0xb46b49e4,0xbccc9c09,0xbcabb48b,0xb48bb48b,0xb48bb48b,0xbcabb48b,0x9c29bccc,0x6aa6b48b,0xf79ed6ba,0xef7def7d,0xf79eef7d,0xef7def7d,0xef7def7d,0xef7def7d,0xef5def5d,0xd6baef5d,0xffeaee88,0xffeaffea,0xffe9ffc9,0xffeaffe9,0xffcbffca,0xffa8ffc9,0xffa8ffa8,0xee87ffa8, +0x975c0637,0x975c8f3c,0x975c873c,0x975c975c,0x975c975c,0x7f1b873c,0x771b7f1b,0x0617771b,0x7ae43184,0x8b438b43,0xabc58b43,0x8b43abc5,0x8b43abc5,0xa3638b43,0xa384a384,0x31849325,0x7ae441e6,0x7ae47ae4,0x93657ae4,0x7ae49365,0x7ae49365,0x93047ae4,0x93259325,0x29239325,0x7ae441e6,0x7ae47ae4,0x93657ae4,0xc6187ac4,0x51e28430,0x93047ae4,0x93259325,0x29239325, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000, +0x4a49738e,0x5aeb3186,0x632cbdd7,0x7bef94b2,0x5acb39c7,0x39e739c7,0xad555aeb,0x5acbb5b6,0x94b252aa,0x52aa52aa,0x002052aa,0x94b252aa,0x52aa52aa,0x31863186,0x31863186,0x52aa3186,0xd673ce31,0xdeb4de93,0xded4d652,0xce52d652,0xd672d672,0xe6f4de93,0xde93deb3,0xbdd0deb3,0x7bef8c10,0xb535bdf7,0x9c309c70,0x6aec83cf,0x8c718c51,0x734d9c91,0x734d734d,0xa4b2b534, +0x41c46ac6,0x41846265,0x7b077b07,0x6a863983,0x39639bc9,0x9bc96a86,0x9be93983,0x7b0741a4,0xb48b6aa6,0xb48ba44a,0xbcccbccc,0xbcccbccc,0xbcabbccc,0xbcabbccc,0x9c29bccc,0x3963b48b,0xef7dd6ba,0xef7def7d,0xef7def7d,0xf79ef79e,0xef7def7d,0xef7def7d,0xef7def7d,0xd69aef7d,0xffcaee88,0xffeaffea,0xffeaffea,0xffeaffea,0xffcbffcb,0xffc9ffc9,0xffc8ffa8,0xee66ffc8, +0x975c0637,0x8f3c975c,0x975c8f3c,0x975c9f5c,0x873c975c,0x873c873c,0x7f1b7f1b,0x05f67f1b,0x8b043164,0xa363a344,0xa363a363,0xa363a363,0xa363a363,0xa344a344,0xa344a344,0x31649304,0xa34441e6,0xa363a344,0xa363a363,0xa363a363,0xa363a363,0xa344a344,0xa344a344,0x2923a363,0xa34441e6,0xa363a344,0xa363a363,0xce798ac3,0x8ac3a534,0xa344a344,0xa344a344,0x2923a363, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000, +0x7bef5acb,0x29657bef,0xb5965acb,0x8410b596,0x21243186,0x7bef8c51,0x5aeb39c7,0x84305aeb,0x002052aa,0x31863186,0x31860020,0x31863186,0x318694b2,0x52aa52aa,0x94b252aa,0x52aa52aa,0xef16e6b5,0xd673ff78,0xd693de93,0xdeb3deb3,0xe6f4deb3,0xeef6e6d5,0xce52c611,0xff78d672,0x732d8b8d,0xb5346aec,0x8c10b534,0x83efbd96,0x52486aec,0xc5f76b4d,0x83adc5f7,0x6aec6aec, +0x5a453963,0x41a46265,0x9bc96a86,0x62863983,0x39639bc9,0x7b076286,0x7b0749e4,0x9bc949e4,0xb48b3963,0x9c099c09,0x93e89c29,0x9c099c29,0x9c29a46a,0x9c299c29,0xa42a9c29,0x6aa6b48b,0xef7dd6ba,0xef7def7d,0xef7def7d,0xef7def7d,0xef7def7d,0xef7def7d,0xef5def5d,0xd69ae73c,0xffccee88,0xffcaffcb,0xffeaffea,0xffcaffea,0xffcbffcb,0xffc9ffca,0xff88ffa9,0xee65ff87, +0x8f3c0617,0x8f3c8f3c,0x8f3c975c,0x8f3c8f3c,0x873c873c,0x873c8f3c,0x6efb7f1b,0x05f65efa,0x93653184,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0xa384abc5,0xabc5a363,0x31649365,0xabc541e6,0x8b438b43,0x8b438b43,0xa384a384,0xabc5abc5,0xa384abc5,0xabc5a363,0x2923abc5,0xabc541e6,0x8b438b43,0x8b438b43,0x82e3a384,0xabc58b04,0xa384abc5,0xabc5a363,0x2923abc5, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x0000fb60,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xfb600000, +0xb596b596,0x7bef6b4d,0x5aeb2965,0xb596b596,0x7bef5aeb,0x7bef8c51,0x39c79492,0x9cf36b6d,0x52aa52aa,0x94b294b2,0x94b294b2,0x94b294b2,0x94b23186,0x94b294b2,0x52aa0020,0x318652aa,0xde93deb4,0xe6d6e6b5,0xd672bdb1,0xd672d652,0xe6d5c5d0,0xdeb3fffb,0xde93d672,0xef15d693,0x9c108bce,0xbd559c30,0xa4d48bf0,0x6aec9cb3,0xb555b555,0x94716b0b,0xa4d25249,0x9c51836e, +0x62853983,0x39436ac7,0x9bc93983,0x628641a4,0x39839bc9,0x9bc96a86,0x7b0749e4,0x93a849e4,0xb48b6aa6,0xb48bb46a,0xb48bb48b,0xb48bb48b,0xb46aac4a,0xb48bb48b,0xbcacbcab,0x6265b48b,0xef5dd69a,0xef5def5d,0xef7def7d,0xef7def7d,0xef7def7d,0xef7def7d,0xef5def7d,0xd69aef5d,0xff4ce648,0xff6bff4b,0xffabffab,0xffabffaa,0xff8bffab,0xffaaffab,0xff8affaa,0xee67ff89, +0x66fb05f6,0x6f1b66fb,0x873c873c,0x873c873c,0x7f1b7f1b,0x873c873c,0x7f1b7f1b,0x05f6771b,0x83053184,0x93049325,0x93259325,0x7ae47ae4,0x7ae47ae4,0x93257ae4,0x93257ae4,0x31648305,0xabc541e6,0xa363a384,0xa384a384,0x8b438b43,0x8b438b43,0xa3848b43,0xa3848b43,0x2923abc5,0xabc541e6,0xa363a384,0xa384a384,0x8b438b43,0x8b438b43,0xa3848b43,0xa3848b43,0x2923abc5, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xd3ff69ef,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0xd3ffd3ff,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0xb596b596,0xa534b596,0x7bef94b2,0x5aeb630c,0xb5965aeb,0xb596b596,0x5aeb8410,0x8c71b5b6,0x318652aa,0x31863186,0x52aa3186,0x94b294b2,0x94b20020,0x318652aa,0x31863186,0x52aa3186,0xdeb49cab,0xdeb3deb3,0xdeb3d692,0xde93d672,0xdeb4e6f4,0xd693de93,0xd672d652,0xde93ce31,0xbdf75a89,0x9c306aec,0x94119c30,0x6aec9c31,0x6aec7bef,0x9c719c71,0xa4d28c0f,0x9c30734d, +0x6aa641c4,0x9bc96aa6,0x6ac63983,0x41a493a8,0x6a866286,0x7b076286,0x7b076ac6,0x9be96aa6,0x6aa66aa6,0x6aa63963,0x62866aa6,0x39633963,0x6aa63963,0x39636aa6,0x6aa66ac7,0x6ac66aa6,0xa534ad55,0xbdd7ad75,0xd69ac638,0xd69ad6ba,0xd69ad69a,0xdedbd6ba,0xdefbdedb,0xe71cdefb,0xc423c444,0xd524cc83,0xe647ddc5,0xee67ee87,0xee27ee46,0xeea8ee88,0xeee9eec9,0xff0bf6ea, +0x042e042e,0x04f1044f,0x05f60574,0x05f60617,0x05f605f6,0x06370637,0x1e780e58,0x46ba1e78,0x31642923,0x31643164,0x31843164,0x31843184,0x31843164,0x31843184,0x31843184,0x29233184,0x41c541e6,0x41c541c5,0x41e641c5,0x41e641e6,0x41e641c5,0x41e641e6,0x41e641e6,0x316441e6,0x41c541e6,0x41c541c5,0x41e641c5,0x41e641e6,0x41e641c5,0x41e641e6,0x41e641e6,0x316441e6, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x69ef69ef,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0x94b28430,0x738e8c51,0x9cd3a534,0xbdd794b2,0xbdf78c71,0x84107bef,0x94928430,0x9cf38c51,0x73ae73ae,0x73ae73ae,0x8c716b4d,0x7bef8c71,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x7bef7bef,0x7aa79369,0x9369bc2b,0x7aa79369,0x93698430,0x93699369,0x7aa77aa7,0x93699369,0x59e57aa7,0x7aa79369,0x9369bc2b,0x7aa79369,0x93698430,0x93699369,0x7aa77aa7,0x93699369,0x59e57aa7, +0x72e772e7,0x7b0772e7,0x6aa66aa6,0x6aa67b07,0x72e772e7,0x6aa672e7,0x6aa649e4,0x72e76aa6,0x8410a514,0x84108410,0x94927bcf,0x84309492,0x84308430,0x84108430,0x84108410,0x84308430,0x84108410,0x84108410,0x94927bcf,0x84309492,0x84308430,0x84108430,0x84108410,0x84308430,0xb596b5b6,0xb5b6ad55,0xb5b6b5b6,0xd6bab5b6,0xb5b6bdd7,0xb5b6b596,0xb5b6bdd7,0xce79b5b6, +0xb1a2c1e2,0x9162a182,0xb1a2c1e2,0x9162a182,0xb1a2c1e2,0x9162a182,0xb1a2c1e2,0x9162a182,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x0000ffff,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0x00000000,0xffff0000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00001300,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x14200000,0x00001300,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x00000000,0x59a00000,0x59a09325,0x00000000,0x00000000,0x00000000, +0xa514a514,0x7bcf8c51,0xad55b596,0x949294b2,0x94b27bef,0x843094b2,0x9cf3ad55,0xa5148c51,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x8c718c71,0x73ae7bef,0x7bef73ae,0x7aa79369,0xbc2b59e5,0x59e57aa7,0x59e57aa7,0x7aa77aa7,0x59e57aa7,0x7aa77aa7,0x93699369,0x7aa79369,0xbc2b59e5,0x59e57aa7,0x59e57aa7,0x7aa77aa7,0x59e57aa7,0x7aa77aa7,0x93699369, +0xbcccbccc,0x9c299c29,0xbccc9c29,0x9c29bccc,0xbcccbccc,0xb48b9c29,0xbcccbccc,0xbcccbccc,0xad55ce59,0xa514ad55,0xa514a514,0xa514a514,0xad55ad55,0xb596b596,0xa514ad55,0x8430a514,0xad558430,0xa514ad55,0xa514a514,0xa514a514,0xad55ad55,0xb596b596,0xa514ad55,0x8430a514,0x51439a66,0x79e58205,0x79e579e5,0xd6ba79e5,0x79e59a66,0x79e579e5,0x79e58205,0xd69a81e5, +0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0xffff0000,0x00000000,0x00000000,0xffffffff,0xffffffff,0x00000000,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x5a260000,0x00001300,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x14201300,0x00001300,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x00000000,0x93250000,0x59a09325,0x00000000,0x00000000,0x00000000, +0xad55b5b6,0x73ae73ae,0x84107bef,0xc6188410,0xc638a514,0x9cd3ad55,0x8c51a514,0xad75ad55,0x8c717bef,0x8c7173ae,0x7bef6b4d,0x73ae7bef,0x73ae73ae,0x73ae6b4d,0x7bef7bef,0x8c718c71,0x93697aa7,0x7aa77aa7,0x7aa772c8,0x93699369,0x59e57aa7,0x59e5bc2b,0xbc2b7aa7,0x93699369,0x93697aa7,0x7aa77aa7,0x7aa759e5,0x93699369,0x59e57aa7,0x59e5bc2b,0xbc2b7aa7,0x93699369, +0x9c29b48b,0xbccc72e7,0xbcccbccc,0x9c29bccc,0xb48bbccc,0x9c29b48b,0x9c299c29,0xb48b9c29,0xb596ce59,0xb596a514,0xad559cf3,0xa514ad55,0xa514a514,0xa5149cf3,0xad55ad55,0x9492b596,0xb5968430,0xb596a514,0xad559cf3,0xa514ad55,0xa514a514,0xa5149cf3,0xad55ad55,0x9492b596,0x79e59a66,0x79e579c5,0x79e579e5,0xce796184,0x79c59a66,0x79e579e5,0x79e579e5,0xd69a81e5, +0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0x8c71da23,0x916252aa,0x8c71da23,0x91628c71,0x52aada23,0x91628c71,0x52aada23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x00000000,0x0000ffff,0xffff0000,0x0000ffff,0x00000000,0xffffffff,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x5a261420,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x13000000,0x14201420,0x13001300,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x00000000,0x93250000,0x59a09325,0x00000320,0x00000000,0x00000000, +0x94b2bdd7,0x8c518410,0x94929cd3,0x7bcf8430,0x9492632c,0x7bef8c51,0xa5349cf3,0x84307bcf,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x73ae73ae,0x73ae73ae,0x7bef73ae,0x59e57aa7,0x7aa79369,0x93699369,0x7aa7bc2b,0x7aa77aa7,0x7aa77aa7,0x7aa77aa7,0xbc2bbc2b,0x59e57aa7,0x7aa79369,0x93699369,0x7aa7bc2b,0x7aa77aa7,0x7aa77aa7,0x7aa77aa7,0xbc2bbc2b, +0xbcccbccc,0xbcccbccc,0x9c29bccc,0x9c29bccc,0x9c299c29,0x9c299c29,0x72e7b48b,0xbcccbccc,0xa514ce59,0xa514a514,0xa514a514,0xa514a514,0xb596b596,0xa514a514,0xa514a514,0x8430a514,0xa5148430,0xa514a514,0xa514a514,0xa514a514,0xb596b596,0xa514a514,0xa514a514,0x8430a514,0xa2679a67,0x9a66aaa7,0x9a669a66,0xce799246,0xb2c89246,0x9a669a66,0x9a669a46,0xe71c9a67, +0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xda23da23,0x52aada23,0xda23da23,0xa9a252aa,0x000052aa,0x52aa0000,0xda2352aa,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0x00000000,0xffff0000,0x0000ffff,0xffffffff,0x0000ffff,0x00000000,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x13000000,0x00001420,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x14200000,0x14201300,0x00001300,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x03200320,0x03200000,0x59a00000,0x4e649325,0x00004e64,0x00000000,0x00000000, +0xad758430,0xa5148430,0x843094b2,0x8c519492,0x949294b2,0x7bcf8c71,0x7bef7bef,0x8c517bef,0x7bef6b4d,0x7bef7bef,0x7bef73ae,0x7bef7bef,0x8c718c71,0x7bef7bef,0x8c717bef,0x6b4d8c71,0x7aa79369,0x93697aa7,0xbc2b9369,0x93697aa7,0x93696b6d,0x7aa79369,0x936959e5,0x59e57aa7,0x7aa79369,0x93697aa7,0xbc2b9369,0x93697aa7,0x93696b6d,0x7aa79369,0x936959e5,0x59e57aa7, +0x6aa672e7,0x72e772e7,0x6aa66aa6,0x72e76aa6,0x72e772e7,0x72e772e7,0x6aa66aa6,0x72e76aa6,0xad55c618,0xad55ad55,0xad55a514,0xad55ad55,0xb596b596,0xad55ad55,0xb596ad55,0x7bcfb596,0xad557bcf,0xad55ad55,0xad55a514,0xad55ad55,0xb596b596,0xad55ad55,0xb596ad55,0x7bcfb596,0xb5b6b5b6,0xd6baad75,0xb5b6b5b6,0xb5b6b5b6,0xb5b6b5b6,0xdedbb596,0xbdd7b596,0xb5b6b596, +0xa182b1c2,0x79218942,0xa182b1c2,0x79218942,0xa182b1c2,0x79218942,0xa182b1c2,0x79218942,0x9162a9a2,0x91629162,0x91620000,0x91620000,0x52aa0000,0x00009162,0x916252aa,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x00000000,0xffff0000,0xffffffff,0xffff0000,0xffff0000,0xffffffff,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x14205a26,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x14200000,0x00001420,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x03204e64,0x03200320,0x03200000,0x93250320,0x000059a0,0x00000000,0x03200000, +0x9cf39cd3,0xa53494b2,0xb5b68410,0x94928c71,0x7bcfc618,0x8410a534,0x8c518c71,0x8c718430,0x7bef7bef,0x73ae8c71,0x8c7173ae,0x73ae8c71,0x73ae6b4d,0x8c718c71,0x7bef8c71,0x7bef7bef,0x93699369,0xbc2b7aa7,0x7aa7bc2b,0x9369bc2b,0xbc2b59e5,0x7aa7bc2b,0x93699369,0x7aa78430,0x93699369,0xbc2b7aa7,0x7aa7bc2b,0x9369bc2b,0xbc2b59e5,0x7aa7bc2b,0x93699369,0x7aa78430, +0xb48bbccc,0xb48bb48b,0xbcccbccc,0x9c299c29,0x9c299c29,0xb48bb48b,0xb48bb48b,0x9c29b48b,0xad55ce59,0xa514b596,0xb596a514,0xa514b596,0xa5149cf3,0xb596b596,0xad55b596,0x8430ad55,0xad558430,0xa514b596,0xb596a514,0xa514b596,0xa5149cf3,0xb596b596,0xad55b596,0x8430ad55,0x79e58a26,0xdefb8a05,0x79e59a66,0x79e55964,0x820569a4,0xd69a79e5,0x79e59a66,0x79e58205, +0xad75ad75,0xad75ce79,0xce79ad75,0xad75ad75,0xce79ad75,0xad75ad75,0xad75ce79,0xad75ad75,0x8c71da23,0x91628c71,0x0000da23,0x00000000,0x8c710000,0x916252aa,0x8c710000,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x00000000,0x0000ffff,0xffff0000,0xffff0000,0x00000000,0x0000ffff,0x0000ffff,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x5a260000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xf7c00000,0xb5e0f7c0,0x8c808c80,0x0000ce80,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x4e640000,0x59a00320,0x4e640000,0x59a00320,0x4e6459a0,0x00000320,0x03200320, +0x841094b2,0x8c71b5b6,0x9cd38c71,0x8410ad55,0x94928430,0xad559492,0xb5968c71,0x84108c71,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x7bef73ae,0x7bef6b4d,0x73ae7bef,0x73ae73ae,0x7bef8c71,0x93699369,0x7aa759e5,0x59e57aa7,0x7aa759e5,0x7aa77aa7,0x7aa77aa7,0xbc2bbc2b,0x93697aa7,0x93699369,0x7aa759e5,0x59e57aa7,0x7aa759e5,0x7aa77aa7,0x7aa77aa7,0xbc2bbc2b,0x93697aa7, +0x9c299c29,0x9c299c29,0xbccc9c29,0xb48bb48b,0x9c299c29,0x72e79c29,0x9c29bccc,0x9c299c29,0xa514ce59,0xa514a514,0xa514a514,0xad55a514,0xad559cf3,0xa514ad55,0xa514a514,0x8430b596,0xa5148430,0xa514a514,0xa514a514,0xad55a514,0xad559cf3,0xa514ad55,0xa514a514,0x8430b596,0x79e579e5,0xce7979e5,0x79e59246,0x79e579e5,0x8a268205,0xce7979c5,0x8a059a66,0x79e579e5, +0xad75ce79,0x0000ad75,0xad75ce79,0xce790000,0x0000ce79,0xce79ce79,0xad750000,0xce79ad75,0x8c71da23,0x52aa52aa,0x00000000,0x00000000,0x00000000,0x91628c71,0x52aa0000,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x00000000,0x0000ffff,0xffff0000,0xffffffff,0xffff0000,0x00000000,0x0000ffff,0xffff0000, +0x00000000,0x00000000,0x00000000,0x14203d19,0x00001300,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xce80ce80,0x8c80f7c0,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x93250320,0x932559a0,0x03209325,0x93259325,0x93259325,0x00004e64, +0x9cd38410,0xad55b5b6,0x8410ad75,0x9cf3ad75,0xad55b596,0x94928410,0x94928430,0x7bef7bef,0x8c717bef,0x6b4d8c71,0x73ae8c71,0x7bef7bef,0x8c717bef,0x8c718c71,0x8c718c71,0x8c718c71,0x7aa79369,0x93697aa7,0x93697aa7,0x59e57aa7,0x93697aa7,0x7aa79369,0x7aa77aa7,0x7aa759e5,0x7aa79369,0x93697aa7,0x93697aa7,0x59e57aa7,0x93697aa7,0x7aa79369,0x7aa77aa7,0x7aa759e5, +0xbcccbccc,0xbcccbccc,0x72e7bccc,0xbccc9c29,0xb48bbccc,0xb48bb48b,0xbcccbccc,0x9c29bccc,0xce79ce59,0xc618ce79,0xc638ce79,0xce59ce59,0xce79ce59,0xce79ce79,0xce79ce79,0xb596ce79,0xb5968430,0x9cf3b596,0xa514b596,0xad55ad55,0xb596ad55,0xb596b596,0xb596b596,0x9492b596,0x9a66a267,0xd69a9a66,0x9a669a46,0xb2c8a287,0x9a66a267,0xd69a9a66,0x9a669a66,0x79e5b2c8, +0xce79ce79,0x0000ce79,0xce79ce79,0xce790000,0x00000000,0xce79ce79,0xce790000,0xce79ce79,0xda23da23,0xa9a2da23,0xda23da23,0x00000000,0x52aa0000,0x52aada23,0x000052aa,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0x00000000,0x0000ffff,0x0000ffff,0xffff0000,0xffffffff,0xffffffff,0xffffffff,0xffffffff, +0x00000000,0x00000000,0x00000000,0x3cd73ddc,0x33f333f3,0x00003d19,0x00000000,0x00000000,0x00000000,0x00000000,0xce800000,0x0000f7c0,0xb5e0f7c0,0x0000f7c0,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x03200000,0x93250000,0x93259325,0x03200320,0x59a00320,0x03200000,0x00000000, +0x84308c71,0x8c519cf3,0x7bef9492,0x8430a534,0xad7594b2,0x84108430,0xa5148c71,0xad557bef,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x73ae73ae,0x6b4d73ae,0x73ae73ae,0x73ae73ae,0x7bef7bef,0x7aa7bc2b,0xbc2bbc2b,0x93699369,0x7aa77aa7,0x59e59369,0x93699369,0x7aa77aa7,0x93699369,0x7aa7bc2b,0xbc2bbc2b,0x93699369,0x7aa77aa7,0x59e59369,0x93699369,0x7aa77aa7,0x93699369, +0x72e772e7,0x6aa66aa6,0x6aa66aa6,0x72e76aa6,0x72e772e7,0x6aa66aa6,0x6aa66aa6,0x72e772e7,0x8430ad55,0x84108430,0x84108410,0x84108410,0x7bcf8410,0x84108410,0x84108410,0x84308430,0xad558430,0xa514ad55,0xa514a514,0xa514a514,0x9cf3a514,0xa514a514,0xa514a514,0x8430ad55,0xb5b6b5b6,0xb596b5b6,0xbdd7b596,0xd6bab5b6,0xb5b6b5b6,0xb5b6b596,0xb5b6b5b6,0xd6bab5b6, +0xce79ce79,0x0000ce79,0xce79ce79,0x00000000,0x0000ce79,0xce79ce79,0xce790000,0xce79ce79,0x9162a9a2,0x91629162,0x000052aa,0x00000000,0x00000000,0x916252aa,0x0000a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0x0000ffff,0x00000000,0x0000ffff,0xffff0000, +0x00000000,0x00000000,0x3d190000,0x3d193d19,0x33f33ddc,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x4e640000,0x00000320,0x932559a0,0x4e644e64,0x00000000,0x03204e64,0x00000320, +0x9cf37bef,0x9492a534,0x84109492,0x7bef8c51,0x84308430,0xad75b5b6,0xa5349492,0x8c7194b2,0x8c718c71,0x84107bef,0x73ae7bef,0x8c718c71,0x7bef7bef,0x7bef7bef,0x8c718c71,0x6b4d8c71,0x59e5bc2b,0x7aa77aa7,0x7aa78430,0xbc2b7aa7,0x7aa7bc2b,0xbc2bbc2b,0x93697aa7,0x93697aa7,0x59e5bc2b,0x7aa77aa7,0x7aa78430,0xbc2b7aa7,0x7aa7bc2b,0xbc2bbc2b,0x93697aa7,0x93697aa7, +0xbcccbccc,0xb48bbccc,0xbcccbccc,0x9c29bccc,0x9c299c29,0xbccc72e7,0xbcccbccc,0xbcccbccc,0xb596ce79,0xad55ad55,0xa514ad55,0xb596b596,0xad55ad55,0xad55ad55,0xb596b596,0x7bcfb596,0xb5969492,0xad55ad55,0xa514ad55,0xb596b596,0xad55ad55,0xad55ad55,0xb596b596,0x7bcfb596,0x59649a66,0x69a48a05,0x618479e5,0xdefb79e5,0x69a4aaa7,0x71c58205,0x79e579e5,0xd69a79e5, +0xdedbce79,0x00000000,0xce790000,0xce790000,0x0000dedb,0x0000ce79,0x00000000,0xce79dedb,0x8c71da23,0x52aa52aa,0x8c71da23,0x52aa0000,0x52aa0000,0x52aa0000,0x000052aa,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x00000000,0x0000ffff,0x0000ffff,0xffffffff,0xffff0000,0xffff0000,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x33f33ddc,0x3cd73d19,0x00003d19,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x59a00000,0x59a09325,0x93259325,0x032059a0,0x4e640000,0x00000320, +0x9cd39cd3,0xa5347bcf,0x94b28410,0x9cd394b2,0x94b28430,0x84108c51,0x8c517bcf,0x94b28c71,0x73ae73ae,0x7bef7bef,0x73ae7bef,0x73ae73ae,0x6b4d7bef,0x7bef7bef,0x73ae73ae,0x7bef6b4d,0x59e57aa7,0x93699369,0x93697aa7,0x59e559e5,0x7aa759e5,0x59e57aa7,0x7aa77aa7,0xbc2b7aa7,0x59e57aa7,0x93699369,0x93697aa7,0x59e559e5,0x7aa759e5,0x59e57aa7,0x7aa77aa7,0xbc2b7aa7, +0x9c299c29,0xb48b72e7,0xb48bb48b,0x9c29bccc,0xb48bb48b,0xb48bb48b,0x9c299c29,0x9c299c29,0xa514c638,0xad55ad55,0xa514ad55,0xa514a514,0x9cf3ad55,0xad55ad55,0xa514a514,0x84309cf3,0xa5148410,0xad55ad55,0xa514ad55,0xa514a514,0x9cf3ad55,0xad55ad55,0xa514a514,0x84309cf3,0x79e59a66,0x79e59a66,0x79e56184,0xd69a79c5,0x79e59a66,0x79e571a4,0x79e569a4,0xd6ba79e5, +0xdedbdedb,0xce79dedb,0xdedbdedb,0xdedbdedb,0xdedbce79,0xce79dedb,0xdedbce79,0xce79dedb,0x8c71da23,0x91628c71,0x0000da23,0x91620000,0x8c7152aa,0x52aa52aa,0x8c710000,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x00000000,0x0000ffff,0xffff0000,0xffff0000,0x00000000,0x0000ffff,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x3ddc0000,0x00003ddc,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x03200000,0x032059a0,0x00000320,0x93250320,0x59a09325,0x932559a0,0x00000000, +0x8410a514,0x8410ad75,0xad75ad75,0xad758c51,0x73aebdd7,0xa5348410,0x7befad55,0x8c718c51,0x8c717bef,0x73ae8c71,0x73ae73ae,0x73ae73ae,0x73ae73ae,0x8c718c71,0x8c718c71,0x6b4d8c71,0x7aa79369,0xbc2b9369,0x936959e5,0x7aa77aa7,0x59e59369,0x6b6d7aa7,0x93697aa7,0x7aa759e5,0x7aa79369,0xbc2b9369,0x936959e5,0x7aa77aa7,0x59e559e5,0x6b6d59e5,0x93697aa7,0x7aa759e5, +0x9c29bccc,0x9c299c29,0xbccc9c29,0x9c29bccc,0x9c29bccc,0x72e79c29,0xb48bb48b,0xbcccb48b,0xb596ce59,0xa514b596,0xa514a514,0xa514a514,0xa514a514,0xb596b596,0xb596b596,0x7bcfb596,0xb5968430,0xa514b596,0xa514a514,0xa514a514,0xa514a514,0xb596b596,0xb596b596,0x7bcfb596,0x9a668a26,0x9a669a66,0x92469a66,0xd69a9a66,0xaa87aa87,0x9a66a267,0x9a669a66,0xd69a9a66, +0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xda23da23,0xa9a2da23,0xda2352aa,0xa9a252aa,0xda2352aa,0x00000000,0xda2352aa,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0x00000000,0xffff0000,0x0000ffff,0xffff0000,0xffff0000,0xffff0000,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x4e640000,0x03209325,0x00000320,0x03200320,0x932559a0,0x03209325,0x00000000, +0x843073ae,0x94b28c51,0x9cd39492,0x7bcf7bef,0x84107bef,0x94b28c71,0x8c518c71,0x7bef8c71,0x8c717bef,0x7bef7bef,0x6b4d7bef,0x8c717bef,0x7bef7bef,0x73ae73ae,0x73ae73ae,0x7bef73ae,0x6b6d9369,0x7aa7bc2b,0x59e59369,0xbc2b7aa7,0x93699369,0x93697aa7,0xbc2b7aa7,0x7aa79369,0x6b6d59e5,0x59e559e5,0x59e57588,0x59e559e5,0x59e55ce6,0x59e56d68,0x59e57aa7,0x7aa759e5, +0x6aa66aa6,0x72e76aa6,0x72e772e7,0x72e772e7,0x72e772e7,0x6aa66aa6,0x6aa66aa6,0x72e772e7,0xb596ce59,0xad55ad55,0x9cf3ad55,0xb596ad55,0xad55ad55,0xa514a514,0xa514a514,0x8430a514,0xb5968430,0xad55ad55,0x9cf3ad55,0xb596ad55,0xad55ad55,0xa514a514,0xa514a514,0x8430a514,0xbdd7bdd7,0xd6bab596,0xb5b6b5b6,0xb596b5b6,0xbdd7b5b6,0xdefbb5b6,0xb5b6b5b6,0xbdf7b596, +0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0x9162a9a2,0x52aa9162,0x9162a9a2,0x916252aa,0x000052aa,0x91629162,0x916252aa,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x9162a9a2,0x91629162,0x00000000,0xffff0000,0x00000000,0xffffffff,0x0000ffff,0x00000000,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x03204e64,0x4e640000,0x03204e64,0x03200000,0x00009325,0x00000000, +0xbdd7a514,0x8430b596,0x8c518c51,0x94929492,0x9cf394b2,0xad75ad55,0x73ae8430,0xb5b68410,0x6b4d7bef,0x73ae73ae,0x73ae6b4d,0x73ae73ae,0x73ae8c71,0x7bef7bef,0x8c717bef,0x7bef7bef,0x7aa7bc2b,0x59e57aa7,0x7aa7bc2b,0x7aa77aa7,0x7aa7bc2b,0x7aa77aa7,0x59e559e5,0x7aa7bc2b,0x59e58deb,0x65279e4d,0x59e56d47,0x59e57588,0x7dea75a9,0x962c960c,0x54a559e5,0x59e56506, +0xbcccbccc,0x9c299c29,0x9c299c29,0xb48bb48b,0xbcccbccc,0xb48bbccc,0xbccc72e7,0x9c29bccc,0x9cf3ce59,0xa514a514,0xa5149cf3,0xa514a514,0xa514b596,0xad55ad55,0xb596ad55,0x8430ad55,0x9cf38430,0xa514a514,0xa5149cf3,0xa514a514,0xa514b596,0xad55ad55,0xb596ad55,0x8430ad55,0x8a2679e5,0xd69a69a4,0x79e59a66,0x71a479e5,0x79e579e5,0xd69a79e5,0x92268205,0x8a2679e5, +0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0x8c71da23,0x916252aa,0x8c71da23,0x000052aa,0x52aa0000,0x91628c71,0x52aada23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x00000000,0xffffffff,0xffffffff,0x00000000,0x0000ffff,0xffff0000,0xffffffff,0x00000000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x4e644e64,0x00000000,0x00000000,0x03204e64,0x00000320,0x00000000, +0x8c7194b2,0x94b2a514,0x84109cd3,0x84108c51,0xad557bef,0x9492a534,0x8c718410,0x8c518430,0x7bef7bef,0x8c718c71,0x8c718c71,0x8c718c71,0x8c7173ae,0x8c718c71,0x7bef6b4d,0x73ae7bef,0x93697aa7,0x7aa759e5,0x93697aa7,0x59e58430,0xbc2b7aa7,0x7aa79369,0x93697aa7,0x59e559e5,0x6d6875a9,0x858a8dcb,0x59e5858a,0x65076d47,0x960c5ce6,0x758995ec,0x6d686506,0x6d486527, +0xbcccbccc,0x72e7b48b,0xb48bb48b,0x9c299c29,0x9c299c29,0xb48b9c29,0xb48b9c29,0x9c29bccc,0xad55ce59,0xb596b596,0xb596b596,0xb596b596,0xb596a514,0xb596b596,0xad559cf3,0x8410ad55,0xad558430,0xb596b596,0xb596b596,0xb596b596,0xb596a514,0xb596b596,0xad559cf3,0x8410ad55,0x79e579e5,0xe71c8205,0x79e5b2c8,0x618469a4,0x71c579e5,0xd69a8205,0x79e59a66,0x79e579e5, +0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0xc1e2da23,0x9162a9a2,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0x8c71da23,0x91628c71,0xffff0000,0x00000000,0x00000000,0x00000000,0xffffffff,0x0000ffff,0x00000000,0x0000ffff, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x4e640000,0x00000000,0x00000000, +0x94b294b2,0x84309492,0x8c718430,0x8c717bef,0x94b29cf3,0x84308c51,0x84108c51,0x8c71738e,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x8c718c71,0x8c716b4d,0x73ae7bef,0x73ae73ae,0x7bef73ae,0x9369bc2b,0x7aa79369,0xbc2b7aa7,0x93699369,0x7aa77aa7,0x7aa759e5,0xbc2b7aa7,0xbc2b7aa7,0x75a975a9,0x65277589,0x6d686527,0x6d685ce6,0x75a97dea,0x65276d48,0x65066d47,0x6d685484, +0x9c29bccc,0x9c299c29,0xbccc9c29,0xb48bbccc,0xbccc9c29,0xbcccbccc,0xbcccbccc,0x9c29bccc,0xc638ce59,0xc638c638,0xce59c638,0xce79ce79,0xce79c618,0xc638ce59,0xc638c638,0xad55c638,0x84108430,0x84108410,0x84308410,0x94929492,0x94927bcf,0x84108430,0x84108410,0x84308410,0x92469a66,0xce799a66,0x9a679a66,0xa2879226,0xaaa79a66,0xd69a8a26,0xaa879a66,0x9a669a66, +0xc9e2da23,0xa1a2b1c2,0xc9e2da23,0xa1a2b1c2,0xc9e2da23,0xa1a2b1c2,0xc9e2da23,0xa1a2b1c2,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0xda23da23,0xa9a2da23,0x0000ffff,0x00000000,0x00000000,0x00000000,0x0000ffff,0x00000000,0x00000000,0xffff0000, +0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x015f015f,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, +0 }; diff --git a/minecraftcpp-master/handheld/project/data/lang/en_US.lang b/minecraftcpp-master/handheld/project/data/lang/en_US.lang new file mode 100644 index 0000000..31a820f --- /dev/null +++ b/minecraftcpp-master/handheld/project/data/lang/en_US.lang @@ -0,0 +1,967 @@ + +language.name=English +language.region=US +language.code=en_US + +gui.done=Done +gui.cancel=Cancel +gui.toMenu=Back to title screen +gui.up=Up +gui.down=Down +gui.yes=Yes +gui.no=No + +menu.singleplayer=Singleplayer +menu.multiplayer=Multiplayer +menu.mods=Texture Packs +menu.options=Options... +menu.quit=Quit Game +menu.returnToMenu=Save and Quit to Title +menu.disconnect=Disconnect +menu.returnToGame=Back to Game +menu.switchingLevel=Switching level +menu.generatingLevel=Generating level +menu.loadingLevel=Loading level +menu.generatingTerrain=Building terrain +menu.simulating=Simulating the world for a bit +menu.respawning=Respawning + +selectWorld.title=Select World +selectWorld.empty=empty +selectWorld.world=World +selectWorld.select=Play Selected World +selectWorld.create=Create New World +selectWorld.createDemo=Play New Demo World +selectWorld.delete=Delete +selectWorld.rename=Rename +selectWorld.deleteQuestion=Are you sure you want to delete this world? +selectWorld.deleteWarning=will be lost forever! (A long time!) +selectWorld.deleteButton=Delete +selectWorld.renameButton=Rename +selectWorld.renameTitle=Rename World +selectWorld.conversion=Must be converted! +selectWorld.newWorld=New World +selectWorld.enterName=World Name +selectWorld.resultFolder=Will be saved in: +selectWorld.enterSeed=Seed for the World Generator +selectWorld.seedInfo=Leave blank for a random seed + +gameMode.survival=Survival Mode +gameMode.creative=Creative Mode +gameMode.hardcore=Hardcore Mode! +gameMode.changed=Your game mode has been changed + +selectWorld.gameMode=Game Mode: +selectWorld.gameMode.survival=Survival +selectWorld.gameMode.survival.line1=Search for resources, crafting, gain +selectWorld.gameMode.survival.line2=levels, health and hunger +selectWorld.gameMode.creative=Creative +selectWorld.gameMode.creative.line1=Unlimited resources, free flying and +selectWorld.gameMode.creative.line2=destroy blocks instantly +selectWorld.gameMode.hardcore=Hardcore +selectWorld.gameMode.hardcore.line1=Same as survival mode, locked at hardest +selectWorld.gameMode.hardcore.line2=difficulty, and one life only +selectWorld.moreWorldOptions=More World Options... +selectWorld.mapFeatures=Generate Structures: +selectWorld.mapFeatures.info=Villages, dungeons etc +selectWorld.mapType=World Type: +selectWorld.mapType.normal=Normal +selectWorld.hardcoreMode=Hardcore: +selectWorld.hardcoreMode.info=World is deleted upon death + +generator.default=Default +generator.flat=Superflat + +selectServer.title=Select Server +selectServer.empty=empty +selectServer.select=Join Server +selectServer.direct=Direct Connect +selectServer.edit=Edit +selectServer.delete=Delete +selectServer.add=Add server +selectServer.defaultName=Minecraft Server +selectServer.deleteQuestion=Are you sure you want to remove this server? +selectServer.deleteWarning=will be lost forever! (A long time!) +selectServer.deleteButton=Delete +selectServer.refresh=Refresh +addServer.title=Edit Server Info +addServer.enterName=Server Name +addServer.enterIp=Server Address +addServer.add=Done + +multiplayer.title=Play Multiplayer +multiplayer.connect=Connect +multiplayer.info1=Minecraft Multiplayer is currently not finished, but there +multiplayer.info2=is some buggy early testing going on. +multiplayer.ipinfo=Enter the IP of a server to connect to it: + +multiplayer.downloadingTerrain=Downloading terrain + +multiplayer.stopSleeping=Leave Bed + +demo.day.1=This demo will last five game days, do your best! +demo.day.2=Day Two +demo.day.3=Day Three +demo.day.4=Day Four +demo.day.5=This is your last day! +demo.day.warning=Your time is almost up! +demo.day.6=You have passed your fifth day, use F2 to save a screenshot of your creation +demo.reminder=The demo time has expired, buy the game to continue or start a new world! +demo.help.movement=Use %1$s, %2$s, %3$s, %4$s and the mouse to move around +demo.help.jump=Jump by pressing %1$s +demo.help.inventory=Use %1$s to open your inventory + +connect.connecting=Connecting to the server... +connect.authorizing=Logging in... +connect.failed=Failed to connect to the server + +disconnect.genericReason=%s +disconnect.disconnected=Disconnected by Server +disconnect.lost=Connection Lost +disconnect.kicked=Was kicked from the game +disconnect.timeout=Timed out +disconnect.closed=Connection closed +disconnect.loginFailed=Failed to login +disconnect.loginFailedInfo=Failed to login: %s +disconnect.quitting=Quitting +disconnect.endOfStream=End of stream +disconnect.overflow=Buffer overflow + +options.off=OFF +options.on=ON +options.title=Options +options.controls=Controls... +options.video=Video Settings... +options.language=Language... +options.languageWarning=Language translations may not be 100% accurate +options.videoTitle=Video Settings +options.music=Music +options.sound=Sound +options.invertMouse=Invert Mouse +options.fov=FOV +options.fov.min=Normal +options.fov.max=Quake Pro +options.gamma=Brightness +options.gamma.min=Moody +options.gamma.max=Bright +options.sensitivity=Sensitivity +options.sensitivity.min=*yawn* +options.sensitivity.max=HYPERSPEED!!! +options.renderDistance=Render Distance +options.renderDistance.tiny=Tiny +options.renderDistance.short=Short +options.renderDistance.normal=Normal +options.renderDistance.far=Far +options.viewBobbing=View Bobbing +options.ao=Smooth Lighting +options.anaglyph=3D Anaglyph +options.framerateLimit=Performance +options.difficulty=Difficulty +options.difficulty.peaceful=Peaceful +options.difficulty.easy=Easy +options.difficulty.normal=Normal +options.difficulty.hard=Hard +options.difficulty.hardcore=Hardcore +options.graphics=Graphics +options.graphics.fancy=Fancy +options.graphics.fast=Fast +options.guiScale=GUI Scale +options.guiScale.auto=Auto +options.guiScale.small=Small +options.guiScale.normal=Normal +options.guiScale.large=Large +options.advancedOpengl=Advanced OpenGL +options.renderClouds=Clouds +options.farWarning1=A 64 bit Java installation is recommended +options.farWarning2=for 'Far' render distance (you have 32 bit) +options.particles=Particles +options.particles.all=All +options.particles.decreased=Decreased +options.particles.minimal=Minimal + +performance.max=Max FPS +performance.balanced=Balanced +performance.powersaver=Power saver + +controls.title=Controls + +key.forward=Forward +key.left=Left +key.back=Back +key.right=Right +key.jump=Jump +key.inventory=Inventory +key.drop=Drop +key.chat=Chat +key.fog=Toggle Fog +key.sneak=Sneak +key.playerlist=List Players +key.attack=Attack +key.use=Use Item +key.pickItem=Pick Block +key.mouseButton=Button %1$s + +texturePack.openFolder=Open texture pack folder +texturePack.title=Select Texture Pack +texturePack.folderInfo=(Place texture pack files here) + +tile.stone.name=Stone +tile.grass.name=Grass Block +tile.dirt.name=Dirt +tile.stonebrick.name=Cobblestone +tile.wood.name=Wooden Planks +tile.sapling.name=Sapling +tile.deadbush.name=Dead Bush +tile.bedrock.name=Bedrock +tile.water.name=Water +tile.lava.name=Lava +tile.sand.name=Sand +tile.sandStone.name=Sandstone +tile.gravel.name=Gravel +tile.oreGold.name=Gold Ore +tile.oreIron.name=Iron Ore +tile.oreCoal.name=Coal Ore +tile.log.name=Wood +tile.leaves.name=Leaves +tile.tallgrass.name=Grass +tile.tallgrass.shrub.name=Shrub +tile.tallgrass.grass.name=Grass +tile.tallgrass.fern.name=Fern +tile.sponge.name=Sponge +tile.glass.name=Glass +tile.thinGlass.name=Glass Pane +tile.cloth.name=Wool +tile.flower.name=Flower +tile.rose.name=Rose +tile.mushroom.name=Mushroom +tile.blockGold.name=Block of Gold +tile.blockIron.name=Block of Iron +tile.stoneSlab.stone.name=Stone Slab +tile.stoneSlab.sand.name=Sandstone Slab +tile.stoneSlab.wood.name=Wooden Slab +tile.stoneSlab.cobble.name=Cobblestone Slab +tile.stoneSlab.brick.name=Bricks Slab +tile.stoneSlab.smoothStoneBrick.name=Stone Bricks Slab +tile.brick.name=Bricks +tile.tnt.name=TNT +tile.bookshelf.name=Bookshelf +tile.stoneMoss.name=Moss Stone +tile.obsidian.name=Obsidian +tile.torch.name=Torch +tile.fire.name=Fire +tile.mobSpawner.name=Monster Spawner +tile.stairsWood.name=Wooden Stairs +tile.chest.name=Chest +tile.redstoneDust.name=Redstone Dust +tile.oreDiamond.name=Diamond Ore +tile.blockDiamond.name=Block of Diamond +tile.workbench.name=Crafting Table +tile.crops.name=Crops +tile.farmland.name=Farmland +tile.furnace.name=Furnace +tile.sign.name=Sign +tile.doorWood.name=Wooden Door +tile.ladder.name=Ladder +tile.rail.name=Rail +tile.goldenRail.name=Powered Rail +tile.detectorRail.name=Detector Rail +tile.stairsStone.name=Stone Stairs +tile.lever.name=Lever +tile.pressurePlate.name=Pressure Plate +tile.doorIron.name=Iron Door +tile.oreRedstone.name=Redstone Ore +tile.notGate.name=Redstone Torch +tile.button.name=Button +tile.snow.name=Snow +tile.ice.name=Ice +tile.cactus.name=Cactus +tile.clay.name=Clay +tile.reeds.name=Sugar cane +tile.jukebox.name=Jukebox +tile.fence.name=Fence +tile.fenceGate.name=Fence Gate +tile.pumpkin.name=Pumpkin +tile.litpumpkin.name=Jack 'o' Lantern +tile.hellrock.name=Netherrack +tile.hellsand.name=Soul Sand +tile.lightgem.name=Glowstone +tile.portal.name=Portal +tile.cloth.black.name=Black Wool +tile.cloth.red.name=Red Wool +tile.cloth.green.name=Green Wool +tile.cloth.brown.name=Brown Wool +tile.cloth.blue.name=Blue Wool +tile.cloth.purple.name=Purple Wool +tile.cloth.cyan.name=Cyan Wool +tile.cloth.silver.name=Light Gray Wool +tile.cloth.gray.name=Gray Wool +tile.cloth.pink.name=Pink Wool +tile.cloth.lime.name=Lime Wool +tile.cloth.yellow.name=Yellow Wool +tile.cloth.lightBlue.name=Blue Light Wool +tile.cloth.magenta.name=Magenta Wool +tile.cloth.orange.name=Orange Wool +tile.cloth.white.name=Wool +tile.oreLapis.name=Lapis Lazuli Ore +tile.blockLapis.name=Lapis Lazuli Block +tile.dispenser.name=Dispenser +tile.musicBlock.name=Note Block +tile.cake.name=Cake +tile.bed.name=Bed +tile.bed.occupied=This bed is occupied +tile.bed.noSleep=You can only sleep at night +tile.bed.notSafe=You may not rest now, there are monsters nearby +tile.bed.notValid=Your home bed was missing or obstructed +tile.lockedchest.name=Locked chest +tile.trapdoor.name=Trapdoor +tile.web.name=Cobweb +tile.stonebricksmooth.name=Stone Bricks +tile.pistonBase.name=Piston +tile.pistonStickyBase.name=Sticky Piston +tile.fenceIron.name=Iron Bars +tile.melon.name=Melon +tile.stairsBrick.name=Brick Stairs +tile.stairsStoneBrickSmooth.name=Stone Brick Stairs +tile.vine.name=Vines +tile.netherBrick.name=Nether Brick +tile.netherFence.name=Nether Brick Fence +tile.stairsNetherBrick.name=Nether Brick Stairs +tile.netherStalk.name=Nether Wart +tile.cauldron.name=Cauldron +tile.enchantmentTable.name=Enchantment Table +tile.whiteStone.name=End Stone +tile.mycel.name=Mycelium +tile.waterlily.name=Lily Pad +tile.dragonEgg.name=Dragon Egg +tile.redstoneLight.name=Redstone Lamp +tile.glowingobsidian.name=Glowing Obsidian +tile.netherreactor.name=Nether Reactor Core +tile.quartzBlock.name=Block of Quartz +tile.stairsQuartz.name=Quartz Stairs +tile.stairsSandStone.name=Sand Stone Stairs +tile.stonecutter.name=Stonecutter + +item.shovelIron.name=Iron Shovel +item.pickaxeIron.name=Iron Pickaxe +item.hatchetIron.name=Iron Axe +item.flintAndSteel.name=Flint and Steel +item.apple.name=Apple +item.cookie.name=Cookie +item.bow.name=Bow +item.arrow.name=Arrow +item.coal.name=Coal +item.charcoal.name=Charcoal +item.emerald.name=Diamond +item.ingotIron.name=Iron Ingot +item.ingotGold.name=Gold Ingot +item.swordIron.name=Iron Sword +item.swordWood.name=Wooden Sword +item.shovelWood.name=Wooden Shovel +item.pickaxeWood.name=Wooden Pickaxe +item.hatchetWood.name=Wooden Axe +item.swordStone.name=Stone Sword +item.shovelStone.name=Stone Shovel +item.pickaxeStone.name=Stone Pickaxe +item.hatchetStone.name=Stone Axe +item.swordDiamond.name=Diamond Sword +item.shovelDiamond.name=Diamond Shovel +item.pickaxeDiamond.name=Diamond Pickaxe +item.hatchetDiamond.name=Diamond Axe +item.stick.name=Stick +item.bowl.name=Bowl +item.mushroomStew.name=Mushroom Stew +item.swordGold.name=Golden Sword +item.shovelGold.name=Golden Shovel +item.pickaxeGold.name=Golden Pickaxe +item.hatchetGold.name=Golden Axe +item.string.name=String +item.feather.name=Feather +item.sulphur.name=Gunpowder +item.hoeWood.name=Wooden Hoe +item.hoeStone.name=Stone Hoe +item.hoeIron.name=Iron Hoe +item.hoeDiamond.name=Diamond Hoe +item.hoeGold.name=Golden Hoe +item.seeds.name=Seeds +item.seeds_pumpkin.name=Pumpkin Seeds +item.seeds_melon.name=Melon Seeds +item.melon.name=Melon +item.wheat.name=Wheat +item.bread.name=Bread +item.helmetCloth.name=Leather Cap +item.chestplateCloth.name=Leather Tunic +item.leggingsCloth.name=Leather Pants +item.bootsCloth.name=Leather Boots +item.helmetChain.name=Chain Helmet +item.chestplateChain.name=Chain Chestplate +item.leggingsChain.name=Chain Leggings +item.bootsChain.name=Chain Boots +item.helmetIron.name=Iron Helmet +item.chestplateIron.name=Iron Chestplate +item.leggingsIron.name=Iron Leggings +item.bootsIron.name=Iron Boots +item.helmetDiamond.name=Diamond Helmet +item.chestplateDiamond.name=Diamond Chestplate +item.leggingsDiamond.name=Diamond Leggings +item.bootsDiamond.name=Diamond Boots +item.helmetGold.name=Golden Helmet +item.chestplateGold.name=Golden Chestplate +item.leggingsGold.name=Golden Leggings +item.bootsGold.name=Golden Boots +item.flint.name=Flint +item.porkchopRaw.name=Raw Porkchop +item.porkchopCooked.name=Cooked Porkchop +item.chickenRaw.name=Raw Chicken +item.chickenCooked.name=Cooked Chicken +item.beefRaw.name=Raw Beef +item.beefCooked.name=Steak +item.painting.name=Painting +item.appleGold.name=Golden Apple +item.sign.name=Sign +item.doorWood.name=Wooden Door +item.bucket.name=Bucket +item.bucketWater.name=Water Bucket +item.bucketLava.name=Lava Bucket +item.minecart.name=Minecart +item.saddle.name=Saddle +item.doorIron.name=Iron Door +item.redstone.name=Redstone +item.snowball.name=Snowball +item.boat.name=Boat +item.leather.name=Leather +item.milk.name=Milk +item.brick.name=Brick +item.clay.name=Clay +item.reeds.name=Sugar Canes +item.paper.name=Paper +item.book.name=Book +item.slimeball.name=Slimeball +item.minecartChest.name=Minecart with Chest +item.minecartFurnace.name=Minecart with Furnace +item.egg.name=Egg +item.compass.name=Compass +item.fishingRod.name=Fishing Rod +item.clock.name=Clock +item.yellowDust.name=Glowstone Dust +item.fishRaw.name=Raw Fish +item.fishCooked.name=Cooked Fish +item.record.name=Music Disc +item.bone.name=Bone +item.dyePowder.black.name=Ink Sac +item.dyePowder.red.name=Rose Red +item.dyePowder.green.name=Cactus Green +item.dyePowder.brown.name=Cocoa Beans +item.dyePowder.blue.name=Lapis Lazuli +item.dyePowder.purple.name=Purple Dye +item.dyePowder.cyan.name=Cyan Dye +item.dyePowder.silver.name=Light Gray Dye +item.dyePowder.gray.name=Gray Dye +item.dyePowder.pink.name=Pink Dye +item.dyePowder.lime.name=Lime Dye +item.dyePowder.yellow.name=Dandelion Yellow +item.dyePowder.lightBlue.name=Light Blue Dye +item.dyePowder.magenta.name=Magenta Dye +item.dyePowder.orange.name=Orange Dye +item.dyePowder.white.name=Bone Meal +item.sugar.name=Sugar +item.cake.name=Cake +item.bed.name=Bed +item.diode.name=Redstone Repeater +item.map.name=Map +item.leaves.name=Leaves +item.shears.name=Shears +item.rottenFlesh.name=Rotten Flesh +item.enderPearl.name=Ender Pearl +item.blazeRod.name=Blaze Rod +item.ghastTear.name=Ghast Tear +item.netherStalkSeeds.name=Nether Wart +item.potion.name=Potion +item.emptyPotion.name=Water Bottle +item.goldNugget.name=Gold Nugget +item.glassBottle.name=Glass Bottle +item.spiderEye.name=Spider Eye +item.fermentedSpiderEye.name=Fermented Spider Eye +item.blazePowder.name=Blaze Powder +item.magmaCream.name=Magma Cream +item.cauldron.name=Cauldron +item.brewingStand.name=Brewing Stand +item.eyeOfEnder.name=Eye of Ender +item.speckledMelon.name=Glistering Melon +item.monsterPlacer.name=Spawn +item.expBottle.name=Bottle o' Enchanting +item.fireball.name=Fire Charge +item.netherbrickItem.name=Nether Brick +item.netherquartz.name=Nether Quartz + +container.inventory=Inventory +container.crafting=Crafting +container.dispenser=Dispenser +container.furnace=Furnace +container.enchant=Enchant +container.creative=Item Selection +container.brewing=Brewing Stand +container.chest=Chest +container.minecart=Minecart + +entity.Item.name=Item +entity.XPOrb.name=Experience Orb + +entity.Arrow.name=Arrow +entity.Snowball.name=Snowball +entity.Painting.name=Painting + +entity.Mob.name=Mob +entity.Monster.name=Monster + +entity.Creeper.name=Creeper +entity.Skeleton.name=Skeleton +entity.Spider.name=Spider +entity.Giant.name=Giant +entity.Zombie.name=Zombie +entity.Slime.name=Slime +entity.Ghast.name=Ghast +entity.PigZombie.name=Zombie Pigman +entity.Enderman.name=Enderman +entity.Silverfish.name=Silverfish +entity.CaveSpider.name=Cave Spider +entity.Blaze.name=Blaze +entity.LavaSlime.name=Magma Cube +entity.MushroomCow.name=Mooshroom +entity.Villager.name=Villager +entity.VillagerGolem.name=Iron Golem +entity.SnowMan.name=Snow Golem +entity.EnderDragon.name=Ender Dragon + +entity.Pig.name=Pig +entity.Sheep.name=Sheep +entity.Cow.name=Cow +entity.Chicken.name=Chicken +entity.Squid.name=Squid +entity.Wolf.name=Wolf +entity.Ozelot.name=Ocelot +entity.Cat.name=Cat + +entity.PrimedTnt.name=Block of TNT +entity.FallingSand.name=Falling Block + +entity.Minecart.name=Minecart +entity.Boat.name=Boat + +entity.Arrow.name=arrow +entity.generic.name=unknown + +death.inFire=%1$s went up in flames +death.onFire=%1$s burned to death +death.lava=%1$s tried to swim in lava +death.inWall=%1$s suffocated in a wall +death.drown=%1$s drowned +death.starve=%1$s starved to death +death.cactus=%1$s was pricked to death +death.fall=%1$s hit the ground too hard +death.outOfWorld=%1$s fell out of the world +death.generic=%1$s died +death.explosion=%1$s blew up +death.magic=%1$s was killed by magic +death.mob=%1$s was slain by %2$s +death.player=%1$s was slain by %2$s +death.arrow=%1$s was shot by %2$s +death.fireball=%1$s was fireballed by %2$s +death.thrown=%1$s was pummeled by %2$s +death.indirectMagic=%1$s was killed by %2$s + +deathScreen.respawn=Respawn +deathScreen.deleteWorld=Delete world +deathScreen.titleScreen=Title screen +deathScreen.score=Score +deathScreen.title.hardcore=Game over! +deathScreen.hardcoreInfo=You cannot respawn in hardcore mode! +deathScreen.title=You died! + +potion.empty=No Effects +potion.moveSpeed=Speed +potion.moveSlowdown=Slowness +potion.digSpeed=Haste +potion.digSlowDown=Mining Fatigue +potion.damageBoost=Strength +potion.weakness=Weakness +potion.heal=Instant Health +potion.harm=Instant Damage +potion.jump=Jump Boost +potion.confusion=Nausea +potion.regeneration=Regeneration +potion.resistance=Resistance +potion.fireResistance=Fire Resistance +potion.waterBreathing=Water Breathing +potion.invisibility=Invisibility +potion.blindness=Blindness +potion.nightVision=Night Vision +potion.hunger=Hunger +potion.poison=Poison + +potion.moveSpeed.postfix=Potion of Swiftness +potion.moveSlowdown.postfix=Potion of Slowness +potion.digSpeed.postfix=Potion of Haste +potion.digSlowDown.postfix=Potion of Dullness +potion.damageBoost.postfix=Potion of Strength +potion.weakness.postfix=Potion of Weakness +potion.heal.postfix=Potion of Healing +potion.harm.postfix=Potion of Harming +potion.jump.postfix=Potion of Leaping +potion.confusion.postfix=Potion of Nausea +potion.regeneration.postfix=Potion of Regeneration +potion.resistance.postfix=Potion of Resistance +potion.fireResistance.postfix=Potion of Fire Resistance +potion.waterBreathing.postfix=Potion of Water Breathing +potion.invisibility.postfix=Potion of Invisibility +potion.blindness.postfix=Potion of Blindness +potion.nightVision.postfix=Potion of Night Vision +potion.hunger.postfix=Potion of Hunger +potion.poison.postfix=Potion of Poison + +potion.potency.0= +potion.potency.1=II +potion.potency.2=III +potion.potency.3=IV + +potion.prefix.grenade=Splash +potion.prefix.mundane=Mundane +potion.prefix.uninteresting=Uninteresting +potion.prefix.bland=Bland +potion.prefix.clear=Clear +potion.prefix.milky=Milky +potion.prefix.diffuse=Diffuse +potion.prefix.artless=Artless +potion.prefix.thin=Thin +potion.prefix.awkward=Awkward +potion.prefix.flat=Flat +potion.prefix.bulky=Bulky +potion.prefix.bungling=Bungling +potion.prefix.buttered=Buttered +potion.prefix.smooth=Smooth +potion.prefix.suave=Suave +potion.prefix.debonair=Debonair +potion.prefix.thick=Thick +potion.prefix.elegant=Elegant +potion.prefix.fancy=Fancy +potion.prefix.charming=Charming +potion.prefix.dashing=Dashing +potion.prefix.refined=Refined +potion.prefix.cordial=Cordial +potion.prefix.sparkling=Sparkling +potion.prefix.potent=Potent +potion.prefix.foul=Foul +potion.prefix.odorless=Odorless +potion.prefix.rank=Rank +potion.prefix.harsh=Harsh +potion.prefix.acrid=Acrid +potion.prefix.gross=Gross +potion.prefix.stinky=Stinky + +enchantment.damage.all=Sharpness +enchantment.damage.undead=Smite +enchantment.damage.arthropods=Bane of Arthropods +enchantment.knockback=Knockback +enchantment.fire=Fire Aspect +enchantment.protect.all=Protection +enchantment.protect.fire=Fire Protection +enchantment.protect.fall=Feather Falling +enchantment.protect.explosion=Blast Protection +enchantment.protect.projectile=Projectile Protection +enchantment.oxygen=Respiration +enchantment.waterWorker=Aqua Affinity +enchantment.digging=Efficiency +enchantment.untouching=Silk Touch +enchantment.durability=Unbreaking +enchantment.lootBonus=Looting +enchantment.lootBonusDigger=Fortune +enchantment.arrowDamage=Power +enchantment.arrowFire=Flame +enchantment.arrowKnockback=Punch +enchantment.arrowInfinite=Infinity + +enchantment.level.1=I +enchantment.level.2=II +enchantment.level.3=III +enchantment.level.4=IV +enchantment.level.5=V +enchantment.level.6=VI +enchantment.level.7=VII +enchantment.level.8=VIII +enchantment.level.9=IX +enchantment.level.10=X + +gui.achievements=Achievements +gui.stats=Statistics + +stat.generalButton=General +stat.blocksButton=Blocks +stat.itemsButton=Items + +stat.used=Times Used +stat.mined=Times Mined +stat.depleted=Times Depleted +stat.crafted=Times Crafted + +stat.startGame=Times played +stat.createWorld=Worlds played +stat.loadWorld=Saves loaded +stat.joinMultiplayer=Multiplayer joins +stat.leaveGame=Games quit + +stat.playOneMinute=Minutes Played + +stat.walkOneCm=Distance Walked +stat.fallOneCm=Distance Fallen +stat.swimOneCm=Distance Swum +stat.flyOneCm=Distance Flown +stat.climbOneCm=Distance Climbed +stat.diveOneCm=Distance Dove +stat.minecartOneCm=Distance by Minecart +stat.boatOneCm=Distance by Boat +stat.pigOneCm=Distance by Pig +stat.jump=Jumps +stat.drop=Items Dropped + +stat.damageDealt=Damage Dealt +stat.damageTaken=Damage Taken +stat.deaths=Number of Deaths +stat.mobKills=Mob Kills +stat.playerKills=Player Kills +stat.fishCaught=Fish Caught + +stat.mineBlock=%1$s Mined +stat.craftItem=%1$s Crafted +stat.useItem=%1$s Used +stat.breakItem=%1$s Depleted + +achievement.get=Achievement get! + +achievement.taken=Taken! + +achievement.requires=Requires '%1$s' +achievement.openInventory=Taking Inventory +achievement.openInventory.desc=Press '%1$s' to open your inventory. +achievement.mineWood=Getting Wood +achievement.mineWood.desc=Attack a tree until a block of wood pops out +achievement.buildWorkBench=Benchmarking +achievement.buildWorkBench.desc=Craft a workbench with four blocks of planks +achievement.buildPickaxe=Time to Mine! +achievement.buildPickaxe.desc=Use planks and sticks to make a pickaxe +achievement.buildFurnace=Hot Topic +achievement.buildFurnace.desc=Construct a furnace out of eight stone blocks +achievement.acquireIron=Acquire Hardware +achievement.acquireIron.desc=Smelt an iron ingot +achievement.buildHoe=Time to Farm! +achievement.buildHoe.desc=Use planks and sticks to make a hoe +achievement.makeBread=Bake Bread +achievement.makeBread.desc=Turn wheat into bread +achievement.bakeCake=The Lie +achievement.bakeCake.desc=Wheat, sugar, milk and eggs! +achievement.buildBetterPickaxe=Getting an Upgrade +achievement.buildBetterPickaxe.desc=Construct a better pickaxe +achievement.cookFish=Delicious Fish +achievement.cookFish.desc=Catch and cook fish! +achievement.onARail=On A Rail +achievement.onARail.desc=Travel by minecart at least 1 km from where you started +achievement.buildSword=Time to Strike! +achievement.buildSword.desc=Use planks and sticks to make a sword +achievement.killEnemy=Monster Hunter +achievement.killEnemy.desc=Attack and destroy a monster +achievement.killCow=Cow Tipper +achievement.killCow.desc=Harvest some leather +achievement.flyPig=When Pigs Fly +achievement.flyPig.desc=Fly a pig off a cliff +achievement.snipeSkeleton=Sniper Duel +achievement.snipeSkeleton.desc=Kill a skeleton with an arrow from more than 50 meters +achievement.diamonds=DIAMONDS! +achievement.diamonds.desc=Acquire diamonds with your iron tools +achievement.portal=We Need to Go Deeper +achievement.portal.desc=Build a portal to the Nether +achievement.ghast=Return to Sender +achievement.ghast.desc=Destroy a Ghast with a fireball +achievement.blazeRod=Into Fire +achievement.blazeRod.desc=Relieve a Blaze of its rod +achievement.potion=Local Brewery +achievement.potion.desc=Brew a potion +achievement.theEnd=The End? +achievement.theEnd.desc=Locate the End +achievement.theEnd2=The End. +achievement.theEnd2.desc=Defeat the Ender Dragon +achievement.enchantments=Enchanter +achievement.enchantments.desc=Use a book, obsidian and diamonds to construct an enchantment table +achievement.overkill=Overkill +achievement.overkill.desc=Deal eight hearts of damage in a single hit +achievement.bookcase=Librarian +achievement.bookcase.desc=Build some bookshelves to improve your enchantment table + +desc.sword=Deals more damage than by hand. +desc.shovel=Used to dig dirt, grass, sand, gravel and snow faster than by hand. +desc.pickaxe=Required to mine stone-related blocks and ore. +desc.hatchet=Used to chop wood-related blocks faster than by hand. +desc.hoe=Used to till dirt and grass blocks to prepare for crops. +desc.doorwood=Wooden doors are activated by using, hitting them or with Redstone. +desc.dooriron=Iron doors can only be opened by Redstone, buttons or switches. +desc.helmet=Gives the user 1.5 Armor when worn. +desc.chestplate=Gives the user 4 Armor when worn. +desc.leggings=Gives the user 3 Armor when worn. +desc.boots=Gives the user 1.5 Armor when worn. +desc.ingot=A shiny ingot which can be used to craft tools made from this material. +desc.block=Used as an expensive building block or compact storage of the ore. +desc.pressureplate=Used to send an electrical charge when stepped on by a player, an animal, or a monster. Wooden Pressure Plates can also be activated by dropping something on them. +desc.stairs=Used for compact staircases. +desc.stairsstonebricksmooth=Used for compact staircases. +desc.stairsnetherbrick=Used for compact staircases. +desc.stairssandstone=Used for compact staircases. +desc.stairsquartzblock=Used for compact staircases. +desc.slab=Used for making long staircases. +desc.halfslab=Used for compact staircases. +desc.torch=Used to create light. Torches also melt snow and ice. +desc.wood=Used as a building material and can be crafted into many things. Can be crafted from any wood. +desc.sandstone=Used as a building material. +desc.sandstone.addon=Is not influenced by gravity like normal Sand. +desc.structblock=Used as a building material. +desc.stick=Used to craft torches, arrows, signs, ladders, fences and as handles for tools and weapons. +desc.bed=Used to sleep until dawn. Changes your spawn point to the bed's position. +desc.craftingtable=Allows you to craft a more varied selection of items than the normal crafting. +desc.furnace=Allows you to smelt ore, create charcoal and glass, and cook fish and porkchops. +desc.chest=Stores blocks and items inside. +desc.fence=Used as a barrier that cannot be jumped over. +desc.ladder=Used to climb vertically. +desc.trapdoor=Work like normal doors, but are a one by one block and lay flat on the ground. +desc.sign=Shows text entered by you or other players. +desc.glowstone=Used to create brighter light than torches. Melts snow/ice and can be used underwater. +desc.tnt=Used to cause explosions. Activated after placing by hitting, or with an electrical charge. +desc.bowl=Used to hold mushroom stew. You keep the bowl when the stew has been eaten. +desc.bucket=Used to hold and transport water, lava and milk. +desc.flintandsteel=Used to detonate TNT. +desc.fishingrod=Used to catch fish. +desc.clock=Displays positions of the Sun and Moon. +desc.compass=Points to your start point. +desc.map=Will create an image of an area explored while held. This can be used for path-finding. +desc.bow=Allows for ranged attacks by using arrows. +desc.arrow=Used as ammunition for bows. +desc.mushroomstew=Restores 5 hearts. +desc.cookie=Restores 0.5 Hearts. Can be stacked up to 8 times. +desc.cake=Restores 1.5 Hearts. Can be used 6 times. +desc.sugar=Used in the cake recipe. +desc.bread=Restores 2.5 Hearts. +desc.goldenapple=Restores 10 Hearts. +desc.lever=Used to send an electrical charge by being turned on or off. Stays in the on or off state until pressed again. +desc.redstonetorch=Constantly sends an electrical charge, or can be used as a receiver/transmitter when connected to the side of a block. +Can also be used for low-level lighting. +desc.redstonerepeater=Used in Redstone circuits as repeater, a delayer, and/or a diode +desc.button=Used to send an electrical charge by being pressed. Stays activated for approximately a second before shutting off again. +desc.dispenser=Used to hold and shoot out items in a random order when given a Redstone charge. +desc.noteblock=Plays a note when triggered. Hit it to change the pitch of the note. Placing this on top of different blocks will change the type of instrument. +desc.rail=Used to guide minecarts. +desc.poweredrail=When powered, accelerates minecarts that pass over it. When unpowered, causes minecarts to stop on it. +desc.detectorrail=Functions like a Pressure Plate (sends a Redstone signal when powered) but can only be activated by a minecart. +desc.minecart=Used to transport you, an animal, or a monster along rails. +desc.minecartwithchest=Used to transport goods along rails. +desc.minecartwithfurnace=Will move along rails and can push other minecarts when coal is put in it. +desc.boat=Used to travel in water more quickly than swimming. +desc.wool=Collected from sheep, and can be colored with dyes. +desc.woolstring=Used as a building material and can be colored with dyes. Can be easily obtained from Sheep. +desc.dyepowder.black=Used as a dye to create black wool. +desc.dyepowder.green=Used as a dye to create green wool. +desc.dyepowder.brown=Used as a dye to create brown wool. +desc.dyepowder.silver=Used as a dye to create silver wool. +desc.dyepowder.yellow=Used as a dye to create yellow wool. +desc.dyepowder.red=Used as a dye to create red wool. +desc.dyepowder.white=Used to instantly grow crops and flowers. Can be used in dye recipes. +desc.dyepowder.pink=Used as a dye to create pink wool. +desc.dyepowder.orange=Used as a dye to create orange wool. +desc.dyepowder.lime=Used as a dye to create lime wool. +desc.dyepowder.gray=Used as a dye to create gray wool. +desc.dyepowder.lightgray=Used as a dye to create light gray wool. +(Note: light gray dye can also be made by combining gray dye with bone meal, letting you make four light gray dyes from every ink sac instead of three.) +desc.dyepowder.lightblue=Used as a dye to create light blue wool. +desc.dyepowder.cyan=Used as a dye to create cyan wool. +desc.dyepowder.purple=Used as a dye to create purple wool. +desc.dyepowder.magenta=Used as a dye to create magenta wool. +desc.dyepowder.blue=Used as dye to create Blue Wool. +desc.jukebox=Plays Music Discs. +desc.diamonds=Use these to create very strong tools, weapons or armor +desc.emerald=Use these to create very strong tools, weapons or armor +desc.jackolantern=Used to create brighter light than torches. Melts snow/ice and can be used underwater. +desc.paper=Used to create books and maps. +desc.book=Used to create a bookshelf. +desc.bookshelf=Used as decoration. +desc.picture=Used as decoration. +desc.ore_gold=Can be mined with an iron pickaxe or better, then smelted in a furnace to produce gold ingots. +desc.ore_iron=Can be mined with a stone pickaxe or better, then smelted in a furnace to produce iron ingots. +desc.ore_coal=Can be mined with a pickaxe to collect coal. +desc.ore_lapis=Can be mined with a stone pickaxe or better to collect lapis lazuli. +desc.ore_diamond=Can be mined with an iron pickaxe or better to collect diamonds. +desc.ore_redstone=Can be mined with an iron pickaxe or better to collect redstone dust. +desc.stone=Can be mined with a pickaxe to collect cobblestone. +desc.dirt=Collected using a shovel. Can be used for construction. +desc.sapling=Can be planted and it will eventually grow into a tree. +desc.bedrock=This cannot be broken. +desc.lava=Sets fire to anything that touches it. Can be collected in a bucket. +desc.sand=Collected using a shovel. Can be smelted into glass using the furnace. Is affected by gravity if there is no other tile underneath it. +desc.gravel=Collected using a shovel. Sometimes produces flint when dug up. Is affected by gravity if there is no other tile underneath it. +desc.log=Chopped using an axe, and can be crafted into planks or used as a fuel. +desc.glass=Created in a furnace by smelting sand. Will break if you try to mine it. +desc.thinglass=Will break if you try to mine it. +desc.stone_brick=Mined from stone using a pickaxe. Can be used to construct a furnace or stone tools. +desc.brick=Baked from clay in a furnace. +desc.clay=Can be baked into bricks in a furnace. +desc.snow=A compact way to store snowballs. +desc.top_snow=Can be dug with a shovel to create snowballs. +desc.tall_grass=Sometimes produces seeds when broken. +desc.flower=Can be crafted into a dye. +desc.mushroom=Can be crafted with a bowl to make stew. +desc.obsidian=Can only be mined with a diamond pickaxe. Is produced by the meeting of water and still lava, and is used to build a portal. +desc.mob_spawner=Spawns monsters into the world. +desc.redstone_dust=Is placed on the ground to carry an electrical charge. +desc.crops=When fully grown, crops can be harvested to collect wheat. +desc.farmland=Ground that has been prepared ready to plant seeds. +desc.cactus=Can be crafted to create a dye. +desc.reeds=Can be crafted to create sugar. +desc.pumpkin=Can be worn as a helmet or crafted with a torch to create a Jack-O-Lantern. +desc.hell_rock=Burns forever if set alight. +desc.hell_sand=Slows the movement of anything walking over it. +desc.portal=Standing in the portal allows you to pass between the overworld and the nether. +desc.apple=Restores health, and can be crafted into a golden apple. +desc.melon=Can be broken into melon slices. +desc.coal=Used as a fuel in a furnace, or crafted to make a torch. +desc.string=Collected by killing a spider, and can be crafted into a bow. +desc.feather=Collected by killing a chicken, and can be crafted into an arrow. +desc.sulphur=Collected by killing a creeper, and can be crafted into TNT. +desc.shears=Used to obtain wool from sheep and to harvest placeable Leaf blocks. +desc.seeds=Can be planted in farmland to grow crops. +desc.wheat=Harvested from crops, and can be used to craft food items. +desc.flint=Collected by digging gravel, and can be used to craft a flint and steel. +desc.porkchopraw=Collected by killing a pig, and can be cooked in a furnace. Restores health. +desc.porkchopcooked=Created by cooking a porkchop in a furnace. Restores health. +desc.beefraw=Collected by killing a cow, and can be cooked in a furnace. Restores health. +desc.beefcooked=Created by cooking a beef in a furnace. Restores health. +desc.chickenraw=Collected by killing a chicken, and can be cooked in a furnace. Restores health. +desc.chickencooked=Created by cooking a chicken in a furnace. Restores health. +desc.saddle=When used on a pig it allows you to ride the pig. +desc.snowball=Collected by digging snow, and can be thrown. +desc.leather=Collected by killing a cow, and can be crafted into armor. +desc.slimeball=Collected by killing a slime. +desc.egg=Dropped randomly by chickens, and can be crafted into food items. +desc.yellow_dust=Collected by mining Glowstone, and can be crafted to make Glowstone blocks again. +desc.fish_raw=Can be eaten to restore health, or cooked in a furnace. +desc.fish_cooked=Created by cooking a raw fish in a furnace. Can be eaten to restore health. +desc.bone=Collected by killing a skeleton. Can be crafted into bone meal. +desc.record=Collected by getting a skeleton to kill a creeper. Can be played in a jukebox. +desc.water=Extinguishes fire and helps crops grow. Can be collected in a bucket. +desc.leaves=When broken sometimes drops a sapling which can then be replanted to grow into a tree. +desc.moss_stone=Can be used for construction and decoration. +desc.stonebricksmooth=Used as building material. +desc.netherreactor=Core of the Nether Reactor +desc.glowingobsidian=Obsidion activated by external source. +desc.lightgem=Used for illumination. +desc.painting=Used as decoration. +desc.hellrock=Is a stone material from the Nether. +desc.netherbrick=Construction block made from Nether bricks. +desc.netherbrickitem=Used to form blocks of Nether bricks. +desc.netherquartz=Quartz from the Nether, used to create Blocks of Quartz. +desc.quartzblock=Decorative block, used to create other kinds of Quartz blocks. +desc.stonecutter=For crafting stoneblocks. +desc.seedsmelon=Allows for more melons. +desc.tile.melon=Can be cut up and eaten. diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/damage/fallbig1.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/damage/fallbig1.m4a new file mode 100644 index 0000000..7deb7d1 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/damage/fallbig1.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/damage/fallbig2.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/damage/fallbig2.m4a new file mode 100644 index 0000000..ec02cd7 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/damage/fallbig2.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/damage/fallsmall.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/damage/fallsmall.m4a new file mode 100644 index 0000000..a210f49 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/damage/fallsmall.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/chicken1.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/chicken1.m4a new file mode 100644 index 0000000..b81ee44 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/chicken1.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/chicken2.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/chicken2.m4a new file mode 100644 index 0000000..b098825 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/chicken2.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/chicken3.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/chicken3.m4a new file mode 100644 index 0000000..4d4181a Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/chicken3.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/chickenhurt1.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/chickenhurt1.m4a new file mode 100644 index 0000000..c0ab742 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/chickenhurt1.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/chickenhurt2.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/chickenhurt2.m4a new file mode 100644 index 0000000..1b5d468 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/chickenhurt2.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/chickenplop.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/chickenplop.m4a new file mode 100644 index 0000000..4459597 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/chickenplop.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/cow1.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/cow1.m4a new file mode 100644 index 0000000..6f0e2cb Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/cow1.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/cow2.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/cow2.m4a new file mode 100644 index 0000000..f2a9fea Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/cow2.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/cow3.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/cow3.m4a new file mode 100644 index 0000000..fba2ac0 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/cow3.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/cow4.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/cow4.m4a new file mode 100644 index 0000000..3956a60 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/cow4.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/cowhurt1.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/cowhurt1.m4a new file mode 100644 index 0000000..5446a94 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/cowhurt1.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/cowhurt2.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/cowhurt2.m4a new file mode 100644 index 0000000..1cdcc6b Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/cowhurt2.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/cowhurt3.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/cowhurt3.m4a new file mode 100644 index 0000000..9c33b08 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/cowhurt3.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/creeper1.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/creeper1.m4a new file mode 100644 index 0000000..f3750a5 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/creeper1.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/creeper2.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/creeper2.m4a new file mode 100644 index 0000000..2cb020f Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/creeper2.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/creeper3.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/creeper3.m4a new file mode 100644 index 0000000..ef3624f Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/creeper3.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/creeper4.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/creeper4.m4a new file mode 100644 index 0000000..fe28a48 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/creeper4.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/creeperdeath.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/creeperdeath.m4a new file mode 100644 index 0000000..b50b774 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/creeperdeath.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/pig1.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/pig1.m4a new file mode 100644 index 0000000..8a9ca5d Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/pig1.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/pig2.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/pig2.m4a new file mode 100644 index 0000000..7718831 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/pig2.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/pig3.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/pig3.m4a new file mode 100644 index 0000000..5327349 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/pig3.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/pigdeath.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/pigdeath.m4a new file mode 100644 index 0000000..807b909 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/pigdeath.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/sheep1.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/sheep1.m4a new file mode 100644 index 0000000..8c21e4e Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/sheep1.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/sheep2.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/sheep2.m4a new file mode 100644 index 0000000..0dc9b9a Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/sheep2.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/sheep3.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/sheep3.m4a new file mode 100644 index 0000000..7654ff5 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/sheep3.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/skeleton1.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/skeleton1.m4a new file mode 100644 index 0000000..ed5f81b Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/skeleton1.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/skeleton2.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/skeleton2.m4a new file mode 100644 index 0000000..2b2c2ef Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/skeleton2.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/skeleton3.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/skeleton3.m4a new file mode 100644 index 0000000..8fa8a29 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/skeleton3.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/skeletonhurt1.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/skeletonhurt1.m4a new file mode 100644 index 0000000..4f38e25 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/skeletonhurt1.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/skeletonhurt2.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/skeletonhurt2.m4a new file mode 100644 index 0000000..0d8ec22 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/skeletonhurt2.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/skeletonhurt3.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/skeletonhurt3.m4a new file mode 100644 index 0000000..95e1e59 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/skeletonhurt3.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/skeletonhurt4.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/skeletonhurt4.m4a new file mode 100644 index 0000000..28d124f Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/skeletonhurt4.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/spider1.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/spider1.m4a new file mode 100644 index 0000000..dcbcc42 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/spider1.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/spider2.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/spider2.m4a new file mode 100644 index 0000000..06f9575 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/spider2.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/spider3.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/spider3.m4a new file mode 100644 index 0000000..2dcb724 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/spider3.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/spider4.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/spider4.m4a new file mode 100644 index 0000000..ce4ce53 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/spider4.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/spiderdeath.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/spiderdeath.m4a new file mode 100644 index 0000000..bde5b4d Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/spiderdeath.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/zombie1.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zombie1.m4a new file mode 100644 index 0000000..de6e8bb Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zombie1.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/zombie2.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zombie2.m4a new file mode 100644 index 0000000..a50b1c1 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zombie2.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/zombie3.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zombie3.m4a new file mode 100644 index 0000000..0eb3d75 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zombie3.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/zombiedeath.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zombiedeath.m4a new file mode 100644 index 0000000..3c41e1b Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zombiedeath.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/zombiehurt1.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zombiehurt1.m4a new file mode 100644 index 0000000..9256b34 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zombiehurt1.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/zombiehurt2.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zombiehurt2.m4a new file mode 100644 index 0000000..6e6d1ac Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zombiehurt2.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpig1.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpig1.m4a new file mode 100644 index 0000000..051c3d6 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpig1.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpig2.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpig2.m4a new file mode 100644 index 0000000..79df964 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpig2.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpig3.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpig3.m4a new file mode 100644 index 0000000..2ba80f6 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpig3.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpig4.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpig4.m4a new file mode 100644 index 0000000..8b46124 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpig4.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpigangry1.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpigangry1.m4a new file mode 100644 index 0000000..4747a8e Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpigangry1.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpigangry2.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpigangry2.m4a new file mode 100644 index 0000000..f6c4ccb Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpigangry2.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpigangry3.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpigangry3.m4a new file mode 100644 index 0000000..991425d Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpigangry3.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpigangry4.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpigangry4.m4a new file mode 100644 index 0000000..78bf37e Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpigangry4.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpigdeath.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpigdeath.m4a new file mode 100644 index 0000000..8226965 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpigdeath.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpighurt1.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpighurt1.m4a new file mode 100644 index 0000000..d75fb6c Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpighurt1.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpighurt2.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpighurt2.m4a new file mode 100644 index 0000000..b0ca26d Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/mob/zpighurt2.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/random/bow.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/random/bow.m4a new file mode 100644 index 0000000..f0e1387 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/random/bow.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/random/bowhit1.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/random/bowhit1.m4a new file mode 100644 index 0000000..53a8233 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/random/bowhit1.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/random/bowhit2.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/random/bowhit2.m4a new file mode 100644 index 0000000..b6f453a Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/random/bowhit2.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/random/bowhit3.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/random/bowhit3.m4a new file mode 100644 index 0000000..9904b7b Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/random/bowhit3.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/random/bowhit4.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/random/bowhit4.m4a new file mode 100644 index 0000000..6690a6f Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/random/bowhit4.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/random/click.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/random/click.m4a new file mode 100644 index 0000000..b1bb549 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/random/click.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/random/door_close.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/random/door_close.m4a new file mode 100644 index 0000000..0f6b9ab Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/random/door_close.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/random/door_open.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/random/door_open.m4a new file mode 100644 index 0000000..a30297b Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/random/door_open.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/random/eat1.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/random/eat1.m4a new file mode 100644 index 0000000..570c77f Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/random/eat1.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/random/eat2.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/random/eat2.m4a new file mode 100644 index 0000000..0f80252 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/random/eat2.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/random/eat3.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/random/eat3.m4a new file mode 100644 index 0000000..f1fa988 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/random/eat3.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/random/explode.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/random/explode.m4a new file mode 100644 index 0000000..6066a6c Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/random/explode.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/random/fuse.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/random/fuse.m4a new file mode 100644 index 0000000..448935e Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/random/fuse.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/random/glass1.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/random/glass1.m4a new file mode 100644 index 0000000..00df16a Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/random/glass1.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/random/glass2.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/random/glass2.m4a new file mode 100644 index 0000000..aed1a00 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/random/glass2.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/random/glass3.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/random/glass3.m4a new file mode 100644 index 0000000..da6db26 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/random/glass3.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/random/hurt.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/random/hurt.m4a new file mode 100644 index 0000000..1e34fac Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/random/hurt.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/random/pop.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/random/pop.m4a new file mode 100644 index 0000000..6dcc598 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/random/pop.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/random/splash.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/random/splash.m4a new file mode 100644 index 0000000..00af208 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/random/splash.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/random/water.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/random/water.m4a new file mode 100644 index 0000000..9a4ed3b Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/random/water.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/cloth1.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/cloth1.m4a new file mode 100644 index 0000000..c43079a Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/cloth1.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/cloth2.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/cloth2.m4a new file mode 100644 index 0000000..2815459 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/cloth2.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/cloth3.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/cloth3.m4a new file mode 100644 index 0000000..b83ec05 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/cloth3.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/cloth4.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/cloth4.m4a new file mode 100644 index 0000000..8f4009a Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/cloth4.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/grass1.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/grass1.m4a new file mode 100644 index 0000000..7973ed5 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/grass1.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/grass2.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/grass2.m4a new file mode 100644 index 0000000..dfbb292 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/grass2.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/grass3.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/grass3.m4a new file mode 100644 index 0000000..bf6ae03 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/grass3.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/grass4.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/grass4.m4a new file mode 100644 index 0000000..dfc9bf7 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/grass4.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/gravel2.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/gravel2.m4a new file mode 100644 index 0000000..2252c60 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/gravel2.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/gravel3.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/gravel3.m4a new file mode 100644 index 0000000..4643055 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/gravel3.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/gravel4.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/gravel4.m4a new file mode 100644 index 0000000..1fb0010 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/gravel4.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/ladder1.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/ladder1.m4a new file mode 100644 index 0000000..8289f9b Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/ladder1.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/ladder2.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/ladder2.m4a new file mode 100644 index 0000000..f55ed27 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/ladder2.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/ladder3.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/ladder3.m4a new file mode 100644 index 0000000..4aab8bf Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/ladder3.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/ladder4.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/ladder4.m4a new file mode 100644 index 0000000..c27ca96 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/ladder4.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/sand1.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/sand1.m4a new file mode 100644 index 0000000..5588276 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/sand1.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/sand2.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/sand2.m4a new file mode 100644 index 0000000..1f6501a Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/sand2.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/sand3.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/sand3.m4a new file mode 100644 index 0000000..520b7cb Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/sand3.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/sand4.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/sand4.m4a new file mode 100644 index 0000000..c8b3f31 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/sand4.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/snow1.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/snow1.m4a new file mode 100644 index 0000000..03d961d Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/snow1.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/snow2.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/snow2.m4a new file mode 100644 index 0000000..d658bf3 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/snow2.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/snow3.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/snow3.m4a new file mode 100644 index 0000000..eb2b0bc Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/snow3.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/snow4.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/snow4.m4a new file mode 100644 index 0000000..2fc45ce Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/snow4.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/stone1.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/stone1.m4a new file mode 100644 index 0000000..797cdc0 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/stone1.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/stone2.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/stone2.m4a new file mode 100644 index 0000000..ca27b87 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/stone2.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/stone3.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/stone3.m4a new file mode 100644 index 0000000..30d4589 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/stone3.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/stone4.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/stone4.m4a new file mode 100644 index 0000000..5bd9c71 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/stone4.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/wood1.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/wood1.m4a new file mode 100644 index 0000000..93fa4a0 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/wood1.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/wood2.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/wood2.m4a new file mode 100644 index 0000000..a2539ae Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/wood2.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/wood3.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/wood3.m4a new file mode 100644 index 0000000..475d4b0 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/wood3.m4a differ diff --git a/minecraftcpp-master/handheld/project/data/sound/aac/step/wood4.m4a b/minecraftcpp-master/handheld/project/data/sound/aac/step/wood4.m4a new file mode 100644 index 0000000..3d02fc6 Binary files /dev/null and b/minecraftcpp-master/handheld/project/data/sound/aac/step/wood4.m4a differ diff --git a/minecraftcpp-master/handheld/project/dedicated_server/CMakeLists.txt b/minecraftcpp-master/handheld/project/dedicated_server/CMakeLists.txt new file mode 100644 index 0000000..fd4c363 --- /dev/null +++ b/minecraftcpp-master/handheld/project/dedicated_server/CMakeLists.txt @@ -0,0 +1,156 @@ +cmake_minimum_required(VERSION 2.8.7) +find_package (Threads) +include_directories("${PROJECT_SOURCE_DIR}/../lib_projects/raknet/jni/RaknetSources") +add_subdirectory("${PROJECT_SOURCE_DIR}/../lib_projects/raknet/jni" "${CMAKE_CURRENT_BINARY_DIR}/raknet") +add_definitions(-DSTANDALONE_SERVER) +set(CMAKE_C_FLAGS -m32) +set(CMAKE_CXX_FLAGS -m32) +set(CompileFiles ../../src/main.cpp +../../src/main_dedicated.cpp +../../src/platform/input/Controller.cpp +../../src/platform/input/Keyboard.cpp +../../src/platform/input/Mouse.cpp +../../src/platform/input/Multitouch.cpp +../../src/platform/time.cpp +../../src/platform/CThread.cpp +../../src/NinecraftApp.cpp +../../src/Performance.cpp +../../src/SharedConstants.cpp +../../src/client/IConfigListener.cpp +../../src/client/Minecraft.cpp +../../src/client/Options.cpp +../../src/client/OptionsFile.cpp +../../src/client/OptionStrings.cpp +../../src/client/gamemode/GameMode.cpp +../../src/client/gamemode/CreativeMode.cpp +../../src/client/gamemode/SurvivalMode.cpp +../../src/client/player/LocalPlayer.cpp +../../src/client/player/RemotePlayer.cpp +../../src/client/player/input/KeyboardInput.cpp +../../src/locale/I18n.cpp +../../src/nbt/Tag.cpp +../../src/network/command/CommandServer.cpp +../../src/network/ClientSideNetworkHandler.cpp +../../src/network/NetEventCallback.cpp +../../src/network/Packet.cpp +../../src/network/RakNetInstance.cpp +../../src/network/ServerSideNetworkHandler.cpp +../../src/server/ArgumentsSettings.cpp +../../src/server/ServerLevel.cpp +../../src/server/ServerPlayer.cpp +../../src/util/DataIO.cpp +../../src/util/Mth.cpp +../../src/util/StringUtils.cpp +../../src/util/PerfTimer.cpp +../../src/world/Direction.cpp +../../src/world/entity/AgableMob.cpp +../../src/world/entity/Entity.cpp +../../src/world/entity/EntityFactory.cpp +../../src/world/entity/FlyingMob.cpp +../../src/world/entity/HangingEntity.cpp +../../src/world/entity/Mob.cpp +../../src/world/entity/MobCategory.cpp +../../src/world/entity/Motive.cpp +../../src/world/entity/Painting.cpp +../../src/world/entity/PathfinderMob.cpp +../../src/world/entity/SynchedEntityData.cpp +../../src/world/entity/ai/control/MoveControl.cpp +../../src/world/entity/animal/Animal.cpp +../../src/world/entity/animal/Chicken.cpp +../../src/world/entity/animal/Cow.cpp +../../src/world/entity/animal/Pig.cpp +../../src/world/entity/animal/Sheep.cpp +../../src/world/entity/animal/WaterAnimal.cpp +../../src/world/entity/item/FallingTile.cpp +../../src/world/entity/item/ItemEntity.cpp +../../src/world/entity/item/PrimedTnt.cpp +../../src/world/entity/item/TripodCamera.cpp +../../src/world/entity/monster/Creeper.cpp +../../src/world/entity/monster/Monster.cpp +../../src/world/entity/monster/PigZombie.cpp +../../src/world/entity/monster/Skeleton.cpp +../../src/world/entity/monster/Spider.cpp +../../src/world/entity/monster/Zombie.cpp +../../src/world/entity/projectile/Arrow.cpp +../../src/world/entity/projectile/Throwable.cpp +../../src/world/entity/player/Inventory.cpp +../../src/world/entity/player/Player.cpp +../../src/world/food/SimpleFoodData.cpp +../../src/world/inventory/BaseContainerMenu.cpp +../../src/world/inventory/ContainerMenu.cpp +../../src/world/inventory/FillingContainer.cpp +../../src/world/inventory/FurnaceMenu.cpp +../../src/world/item/ArmorItem.cpp +../../src/world/item/BedItem.cpp +../../src/world/item/DyePowderItem.cpp +../../src/world/item/Item.cpp +../../src/world/item/ItemInstance.cpp +../../src/world/item/HangingEntityItem.cpp +../../src/world/item/HatchetItem.cpp +../../src/world/item/HoeItem.cpp +../../src/world/item/PickaxeItem.cpp +../../src/world/item/ShovelItem.cpp +../../src/world/item/crafting/ArmorRecipes.cpp +../../src/world/item/crafting/Recipe.cpp +../../src/world/item/crafting/Recipes.cpp +../../src/world/item/crafting/FurnaceRecipes.cpp +../../src/world/item/crafting/OreRecipes.cpp +../../src/world/item/crafting/StructureRecipes.cpp +../../src/world/item/crafting/ToolRecipes.cpp +../../src/world/item/crafting/WeaponRecipes.cpp +../../src/world/level/Explosion.cpp +../../src/world/level/Level.cpp +../../src/world/level/LightLayer.cpp +../../src/world/level/LightUpdate.cpp +../../src/world/level/MobSpawner.cpp +../../src/world/level/Region.cpp +../../src/world/level/TickNextTickData.cpp +../../src/world/level/biome/Biome.cpp +../../src/world/level/biome/BiomeSource.cpp +../../src/world/level/chunk/LevelChunk.cpp +../../src/world/level/dimension/Dimension.cpp +../../src/world/level/levelgen/CanyonFeature.cpp +../../src/world/level/levelgen/DungeonFeature.cpp +../../src/world/level/levelgen/LargeCaveFeature.cpp +../../src/world/level/levelgen/LargeFeature.cpp +../../src/world/level/levelgen/RandomLevelSource.cpp +../../src/world/level/levelgen/feature/Feature.cpp +../../src/world/level/levelgen/synth/ImprovedNoise.cpp +../../src/world/level/levelgen/synth/PerlinNoise.cpp +../../src/world/level/levelgen/synth/Synth.cpp +../../src/world/level/material/Material.cpp +../../src/world/level/pathfinder/Path.cpp +../../src/world/level/storage/ExternalFileLevelStorage.cpp +../../src/world/level/storage/ExternalFileLevelStorageSource.cpp +../../src/world/level/storage/FolderMethods.cpp +../../src/world/level/storage/LevelData.cpp +../../src/world/level/storage/LevelStorageSource.cpp +../../src/world/level/storage/RegionFile.cpp +../../src/world/level/tile/BedTile.cpp +../../src/world/level/tile/ChestTile.cpp +../../src/world/level/tile/CropTile.cpp +../../src/world/level/tile/DoorTile.cpp +../../src/world/level/tile/EntityTile.cpp +../../src/world/level/tile/FurnaceTile.cpp +../../src/world/level/tile/GrassTile.cpp +../../src/world/level/tile/HeavyTile.cpp +../../src/world/level/tile/LightGemTile.cpp +../../src/world/level/tile/MelonTile.cpp +../../src/world/level/tile/Mushroom.cpp +../../src/world/level/tile/NetherReactor.cpp +../../src/world/level/tile/NetherReactorPattern.cpp +../../src/world/level/tile/StairTile.cpp +../../src/world/level/tile/StemTile.cpp +../../src/world/level/tile/StoneSlabTile.cpp +../../src/world/level/tile/TallGrass.cpp +../../src/world/level/tile/Tile.cpp +../../src/world/level/tile/TrapDoorTile.cpp +../../src/world/level/tile/entity/ChestTileEntity.cpp +../../src/world/level/tile/entity/NetherReactorTileEntity.cpp +../../src/world/level/tile/entity/SignTileEntity.cpp +../../src/world/level/tile/entity/TileEntity.cpp +../../src/world/level/tile/entity/FurnaceTileEntity.cpp +../../src/world/phys/HitResult.cpp) +message(${CMAKE_LIBRARY_ARCHITECTURE}) +add_executable(mcpe_server ${CompileFiles}) +target_link_libraries(mcpe_server raknet ${CMAKE_THREAD_LIBS_INIT}) \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/iosproj/Default b/minecraftcpp-master/handheld/project/iosproj/Default new file mode 100644 index 0000000..023f0b4 Binary files /dev/null and b/minecraftcpp-master/handheld/project/iosproj/Default differ diff --git a/minecraftcpp-master/handheld/project/iosproj/Default-568h@2x.png b/minecraftcpp-master/handheld/project/iosproj/Default-568h@2x.png new file mode 100644 index 0000000..e306141 Binary files /dev/null and b/minecraftcpp-master/handheld/project/iosproj/Default-568h@2x.png differ diff --git a/minecraftcpp-master/handheld/project/iosproj/Default-Landscape~ipad.png b/minecraftcpp-master/handheld/project/iosproj/Default-Landscape~ipad.png new file mode 100644 index 0000000..dfc1a24 Binary files /dev/null and b/minecraftcpp-master/handheld/project/iosproj/Default-Landscape~ipad.png differ diff --git a/minecraftcpp-master/handheld/project/iosproj/Default.png b/minecraftcpp-master/handheld/project/iosproj/Default.png new file mode 100644 index 0000000..5dfe75a Binary files /dev/null and b/minecraftcpp-master/handheld/project/iosproj/Default.png differ diff --git a/minecraftcpp-master/handheld/project/iosproj/Default@2x.png b/minecraftcpp-master/handheld/project/iosproj/Default@2x.png new file mode 100644 index 0000000..82db4bf Binary files /dev/null and b/minecraftcpp-master/handheld/project/iosproj/Default@2x.png differ diff --git a/minecraftcpp-master/handheld/project/iosproj/Icon-72.png b/minecraftcpp-master/handheld/project/iosproj/Icon-72.png new file mode 100644 index 0000000..c957ccc Binary files /dev/null and b/minecraftcpp-master/handheld/project/iosproj/Icon-72.png differ diff --git a/minecraftcpp-master/handheld/project/iosproj/Icon-72_lite.png b/minecraftcpp-master/handheld/project/iosproj/Icon-72_lite.png new file mode 100644 index 0000000..de45504 Binary files /dev/null and b/minecraftcpp-master/handheld/project/iosproj/Icon-72_lite.png differ diff --git a/minecraftcpp-master/handheld/project/iosproj/Icon.png b/minecraftcpp-master/handheld/project/iosproj/Icon.png new file mode 100644 index 0000000..48aac5f Binary files /dev/null and b/minecraftcpp-master/handheld/project/iosproj/Icon.png differ diff --git a/minecraftcpp-master/handheld/project/iosproj/Icon@2x.png b/minecraftcpp-master/handheld/project/iosproj/Icon@2x.png new file mode 100644 index 0000000..cad1484 Binary files /dev/null and b/minecraftcpp-master/handheld/project/iosproj/Icon@2x.png differ diff --git a/minecraftcpp-master/handheld/project/iosproj/Icon@2x_lite.png b/minecraftcpp-master/handheld/project/iosproj/Icon@2x_lite.png new file mode 100644 index 0000000..a80c3d7 Binary files /dev/null and b/minecraftcpp-master/handheld/project/iosproj/Icon@2x_lite.png differ diff --git a/minecraftcpp-master/handheld/project/iosproj/Icon_lite.png b/minecraftcpp-master/handheld/project/iosproj/Icon_lite.png new file mode 100644 index 0000000..19ad7c4 Binary files /dev/null and b/minecraftcpp-master/handheld/project/iosproj/Icon_lite.png differ diff --git a/minecraftcpp-master/handheld/project/iosproj/InAppSettings.bundle/Advanced.plist b/minecraftcpp-master/handheld/project/iosproj/InAppSettings.bundle/Advanced.plist new file mode 100644 index 0000000..411f389 --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/InAppSettings.bundle/Advanced.plist @@ -0,0 +1,73 @@ + + + + + Title + ADVANCED_TITLE + StringsTable + Root + PreferenceSpecifiers + + + Type + PSGroupSpecifier + Title + SLIDER_TITLE + + + Type + PSSliderSpecifier + Key + sensitivity + DefaultValue + 2 + MinimumValue + 1 + MaximumValue + 5 + MinimumValueImage + slow.png + MaximumValueImage + fast.png + + + Type + PSGroupSpecifier + Title + TEXT_FIELD_TITLE2 + + + Type + PSTextFieldSpecifier + IsSecure + + Title + TEXT_FIELD_PWD + KeyboardType + EmailAddress + Key + password + + + Title + TOGGLE_SWITCH_TITLE2 + Type + PSGroupSpecifier + + + Type + PSToggleSwitchSpecifier + TrueValue + 1 + FalseValue + 2 + Title + TOGGLE_SWITCH2 + Key + switchOther + DefaultValue + + + + + diff --git a/minecraftcpp-master/handheld/project/iosproj/InAppSettings.bundle/Complete.plist b/minecraftcpp-master/handheld/project/iosproj/InAppSettings.bundle/Complete.plist new file mode 100644 index 0000000..e36a94c --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/InAppSettings.bundle/Complete.plist @@ -0,0 +1,513 @@ + + + + + StringsTable + Root + PreferenceSpecifiers + + + Type + PSGroupSpecifier + Title + Text Fields + + + Type + PSTextFieldSpecifier + Title + Plain + Key + text_plain + DefaultValue + Plain Text + + + Type + PSTextFieldSpecifier + Title + Secure + Key + text_secure + DefaultValue + Secret + IsSecure + + KeyboardType + Alphabet + AutocorrectionType + no + + + Type + PSTextFieldSpecifier + Title + NumbersAndPunctuation + Key + text_NumbersAndPunctuation + DefaultValue + 47.11 + IsSecure + + KeyboardType + NumbersAndPunctuation + AutocorrectionType + Default + + + Type + PSTextFieldSpecifier + Title + NumberPad + Key + text_NumberPad + DefaultValue + 4711 + IsSecure + + KeyboardType + NumberPad + AutocorrectionType + Default + + + Type + PSTextFieldSpecifier + Title + DecimalPad + Key + text_DecimalPad + DefaultValue + 26.08 + IsSecure + + KeyboardType + DecimalPad + AutocorrectionType + Default + + + Type + PSTextFieldSpecifier + Title + URL + Key + text_URL + DefaultValue + http://www.inappsettingskit.com + IsSecure + + KeyboardType + URL + AutocorrectionType + Default + + + Type + PSTextFieldSpecifier + Title + EmailAddress + Key + text_EmailAddress + DefaultValue + info@email.com + IsSecure + + KeyboardType + EmailAddress + AutocorrectionType + Default + + + Type + PSTextFieldSpecifier + Title + Capital Sentences + Key + text_Sentences + DefaultValue + Cap sentences. Second sentence. + IsSecure + + KeyboardType + Alphabet + AutocapitalizationType + Sentences + AutocorrectionType + Default + + + Type + PSTextFieldSpecifier + Title + Capital Words + Key + text_words + DefaultValue + Words Are Capitalized + KeyboardType + Alphabet + AutocapitalizationType + Words + AutocorrectionType + No + IsSecure + + + + Type + PSTextFieldSpecifier + Title + All Capital + Key + text_AllCharacters + DefaultValue + FORGOTTEN THE CAPSLOCK? + IsSecure + + KeyboardType + Alphabet + AutocapitalizationType + AllCharacters + AutocorrectionType + No + + + Type + PSTextFieldSpecifier + Title + No auto-correction + Key + text_auto-correction_no + DefaultValue + Ser1ous mitsakes + IsSecure + + AutocorrectionType + No + + + Type + PSTextFieldSpecifier + Key + text_noTitle + DefaultValue + Textfield without title + IsSecure + + + + Type + PSTextFieldSpecifier + Title + Very long titles lead to smaller font + Key + text_longtitle + DefaultValue + foo bar + IsSecure + + + + Type + PSGroupSpecifier + Title + Title Values + + + Title + Title + Key + title_long + DefaultValue + Value with a very, very long text + Type + PSTitleValueSpecifier + + + Title + Title with Lookup Table + Key + title_lookup + DefaultValue + 2 + Type + PSTitleValueSpecifier + Values + + 1 + 2 + 3 + + Titles + + One + Two + Three + + + + Title + Title with a very, very loong label + Key + title_longtitle + DefaultValue + Value is long, too + Type + PSTitleValueSpecifier + + + Title + + Key + title_withoutlabel + DefaultValue + Title without label + Type + PSTitleValueSpecifier + + + Title + Unexisting lookup entry + Key + title_non_existing_lookup_entry + DefaultValue + 3 + Type + PSTitleValueSpecifier + Values + + 1 + 2 + + Titles + + One + Two + + + + Type + PSGroupSpecifier + Title + Toggles + + + Type + PSToggleSwitchSpecifier + Title + Boolean Toggle + Key + toggle_boolean + DefaultValue + + + + Type + PSToggleSwitchSpecifier + Title + String Toogle + Key + toogle_string + DefaultValue + foo + TrueValue + foo + FalseValue + bar + + + Type + PSToggleSwitchSpecifier + Title + Number Toggle + Key + toogle_number + DefaultValue + 1 + TrueValue + 1 + FalseValue + 0 + + + Type + PSToggleSwitchSpecifier + Title + String Toogle (false) + Key + toogle_string_false + DefaultValue + bar + TrueValue + foo + FalseValue + bar + + + Type + PSGroupSpecifier + Title + Sliders + + + Type + PSSliderSpecifier + Key + slider_preference1 + DefaultValue + 0.5 + MinimumValue + 0 + MaximumValue + 1 + + + Type + PSSliderSpecifier + Key + slider_preference2 + DefaultValue + 0.5 + MinimumValue + 0 + MaximumValue + 1 + MinimumValueImage + slow.png + MaximumValueImage + fast.png + + + Type + PSSliderSpecifier + Key + slider_preference3 + DefaultValue + 0.5 + MinimumValue + 0 + MaximumValue + 1 + MinimumValueImage + slow.png + + + Type + PSSliderSpecifier + Key + slider_preference4 + DefaultValue + 0.5 + MinimumValue + 0 + MaximumValue + 1 + MaximumValueImage + fast.png + + + Type + PSGroupSpecifier + Title + Multi Value + + + Type + PSMultiValueSpecifier + Title + Multi Value + Key + multivalue + DefaultValue + 2 + Values + + 1 + 2 + 3 + + Titles + + One + Two + Three + + FooterText + MULTIVALUE_FOOTER + + + Type + PSMultiValueSpecifier + Title + Multi Value with a long title + Key + multivalue_long + DefaultValue + 2 + Values + + 1 + 2 + 3 + + Titles + + One + Two + Three + + + + Type + PSMultiValueSpecifier + Title + EMPTY + Key + multivalue_notitle + DefaultValue + 1 + Values + + 1 + 2 + 3 + + Titles + + One + Two + Three + + + + Type + PSGroupSpecifier + Title + Child Pane + + + Type + PSChildPaneSpecifier + Title + Advanced + File + Advanced + + + Type + PSGroupSpecifier + Title + Group with a multiline text that is word wrapped. + + + Title + Entry + Key + title_non_existing_lookup_entry2 + Type + PSTitleValueSpecifier + + + + diff --git a/minecraftcpp-master/handheld/project/iosproj/InAppSettings.bundle/Root.inApp.plist b/minecraftcpp-master/handheld/project/iosproj/InAppSettings.bundle/Root.inApp.plist new file mode 100644 index 0000000..08a7c8e --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/InAppSettings.bundle/Root.inApp.plist @@ -0,0 +1,133 @@ + + + + + PreferenceSpecifiers + + + Title + CATEGORY_MULTIPLAYER + Type + PSGroupSpecifier + + + Key + mp_username + Title + mmoptions_mp_username_title + StringIfEmpty + Stevie + Type + PSTextFieldSpecifier + AutocorrectionType + No + KeyboardType + Ascii + + + DefaultValue + YES + Key + mp_server_visible_default + Title + mmoptions_mp_server_visible_default_title + Type + PSToggleSwitchSpecifier + + + Title + CATEGORY_GRAPHICS + Type + PSGroupSpecifier + + + DefaultValue + NO + Key + gfx_fancygraphics + Title + mmoptions_gfx_fancygraphics_title + Type + PSToggleSwitchSpecifier + + + DefaultValue + NO + Key + gfx_lowquality + Title + mmoptions_gfx_lowquality_title + Type + PSToggleSwitchSpecifier + + + Title + CATEGORY_CONTROLS + Type + PSGroupSpecifier + + Key ctrl_sensitivity Title mmoptions_ctrl_sensitivity_title Type PSSliderSpecifier + DefaultValue + 0.5 + MinimumValue + 0 + MaximumValue + 1 + TextOffsetPixels + 110 + DefaultValue + NO + Key + ctrl_invertmouse + Title + mmoptions_ctrl_invertmouse_title + Type + PSToggleSwitchSpecifier + + + DefaultValue + NO + Key + ctrl_islefthanded + Title + mmoptions_ctrl_islefthanded_title + Type + PSToggleSwitchSpecifier + + + DefaultValue + NO + Key + ctrl_usetouchjoypad + Title + mmoptions_ctrl_usetouchjoypad_title + Type + PSToggleSwitchSpecifier + + + Title + CATEGORY_GAME + Type + PSGroupSpecifier + + + DefaultValue + NO + Key + game_difficulty + Title + mmoptions_game_difficultypeaceful_full + Type + PSToggleSwitchSpecifier + TrueValue + 0 + FalseValue + 2 + + + StringsTable + Root + Title + Minecraft - Pocket Edition + + diff --git a/minecraftcpp-master/handheld/project/iosproj/InAppSettings.bundle/Root.plist b/minecraftcpp-master/handheld/project/iosproj/InAppSettings.bundle/Root.plist new file mode 100644 index 0000000..aad5fdc --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/InAppSettings.bundle/Root.plist @@ -0,0 +1,175 @@ + + + + + Title + WhereTo + StringsTable + Root + PreferenceSpecifiers + + + Title + Multiplayer + Type + PSGroupSpecifier + + + Type + PSToggleSwitchSpecifier + Title + TOGGLE_SWITCH + Key + toggleSwitch + DefaultValue + + + + Type + PSTitleValueSpecifier + Title + Root.plist is used in Settings.app on iOS 3.x + Key + version + DefaultValue + 1.0 + + + Type + PSGroupSpecifier + Title + MUL_VALUE_TITLE + + + Values + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + + Titles + + MUL_VAL_1 + MUL_VAL_2 + MUL_VAL_3 + MUL_VAL_4 + MUL_VAL_5 + MUL_VAL_6 + MUL_VAL_7 + MUL_VAL_8 + MUL_VAL_9 + MUL_VAL_10 + MUL_VAL_11 + + Type + PSMultiValueSpecifier + Title + MUL_VAL + Key + mulValue + DefaultValue + 0 + + + Type + PSGroupSpecifier + Title + MUL_VAL_NO_TITLE + + + Values + + 1 + 0 + 2 + + Titles + + MUL_VAL_NO_TITLE_1 + MUL_VAL_NO_TITLE_2 + MUL_VAL_NO_TITLE_3 + + Type + PSMultiValueSpecifier + Title + MUL_VAL_NO_TITLE_NIL + Key + mulValueOther + DefaultValue + 0 + + + Type + PSGroupSpecifier + Title + TEXT_FIELD_TITLE + + + Type + PSTextFieldSpecifier + Title + TEXT_FIELD_SIG + Key + signature + + + Title + + Type + PSGroupSpecifier + FooterText + This is a Footer Text (supported by Settings.app in iOS 4 or higher) + + + Type + PSChildPaneSpecifier + Title + Complete List + File + Complete + + + Type + PSChildPaneSpecifier + Title + ADVANCED_TITLE + File + Advanced + + + Title + APPLICATION_INFO_TITLE + Type + PSGroupSpecifier + + + Type + PSTitleValueSpecifier + Title + VERSION + Key + version + DefaultValue + 1.0 + + + Type + PSTitleValueSpecifier + Title + Copyright + DefaultValue + Luc Vandal, Ortwin Gentz + Key + copyright + + + + diff --git a/minecraftcpp-master/handheld/project/iosproj/InAppSettings.bundle/Root~ipad.plist b/minecraftcpp-master/handheld/project/iosproj/InAppSettings.bundle/Root~ipad.plist new file mode 100644 index 0000000..5933bda --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/InAppSettings.bundle/Root~ipad.plist @@ -0,0 +1,167 @@ + + + + + Title + WhereTo + StringsTable + Root + PreferenceSpecifiers + + + Title + TOGGLE_SWITCH_TITLE + FooterText + Root~ipad.plist is used on iPad in Settings.app running iOS 4.2 or higher + Type + PSGroupSpecifier + + + Type + PSToggleSwitchSpecifier + Title + TOGGLE_SWITCH + Key + toggleSwitch + DefaultValue + + + + Type + PSGroupSpecifier + Title + MUL_VALUE_TITLE + + + Values + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + + Titles + + MUL_VAL_1 + MUL_VAL_2 + MUL_VAL_3 + MUL_VAL_4 + MUL_VAL_5 + MUL_VAL_6 + MUL_VAL_7 + MUL_VAL_8 + MUL_VAL_9 + MUL_VAL_10 + MUL_VAL_11 + + Type + PSMultiValueSpecifier + Title + MUL_VAL + Key + mulValue + DefaultValue + 0 + + + Type + PSGroupSpecifier + Title + MUL_VAL_NO_TITLE + + + Values + + 1 + 0 + 2 + + Titles + + MUL_VAL_NO_TITLE_1 + MUL_VAL_NO_TITLE_2 + MUL_VAL_NO_TITLE_3 + + Type + PSMultiValueSpecifier + Title + MUL_VAL_NO_TITLE_NIL + Key + mulValueOther + DefaultValue + 0 + + + Type + PSGroupSpecifier + Title + TEXT_FIELD_TITLE + + + Type + PSTextFieldSpecifier + Title + TEXT_FIELD_SIG + Key + signature + + + Title + + Type + PSGroupSpecifier + FooterText + This is a Footer Text (supported by Settings.app in iOS 4 or higher) + + + Type + PSChildPaneSpecifier + Title + Complete List + File + Complete + + + Type + PSChildPaneSpecifier + Title + ADVANCED_TITLE + File + Advanced + + + Title + APPLICATION_INFO_TITLE + Type + PSGroupSpecifier + + + Type + PSTitleValueSpecifier + Title + VERSION + Key + version + DefaultValue + 1.0 + + + Type + PSTitleValueSpecifier + Title + Copyright + DefaultValue + Luc Vandal, Ortwin Gentz + Key + copyright + + + + diff --git a/minecraftcpp-master/handheld/project/iosproj/InAppSettings.bundle/Root~iphone.plist b/minecraftcpp-master/handheld/project/iosproj/InAppSettings.bundle/Root~iphone.plist new file mode 100644 index 0000000..cac664b --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/InAppSettings.bundle/Root~iphone.plist @@ -0,0 +1,167 @@ + + + + + Title + WhereTo + StringsTable + Root + PreferenceSpecifiers + + + Title + TOGGLE_SWITCH_TITLE + FooterText + Root~iphone.plist is used in Settings.app on iPhone running iOS 4 or higher + Type + PSGroupSpecifier + + + Type + PSToggleSwitchSpecifier + Title + TOGGLE_SWITCH + Key + toggleSwitch + DefaultValue + + + + Type + PSGroupSpecifier + Title + MUL_VALUE_TITLE + + + Values + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + + Titles + + MUL_VAL_1 + MUL_VAL_2 + MUL_VAL_3 + MUL_VAL_4 + MUL_VAL_5 + MUL_VAL_6 + MUL_VAL_7 + MUL_VAL_8 + MUL_VAL_9 + MUL_VAL_10 + MUL_VAL_11 + + Type + PSMultiValueSpecifier + Title + MUL_VAL + Key + mulValue + DefaultValue + 0 + + + Type + PSGroupSpecifier + Title + MUL_VAL_NO_TITLE + + + Values + + 1 + 0 + 2 + + Titles + + MUL_VAL_NO_TITLE_1 + MUL_VAL_NO_TITLE_2 + MUL_VAL_NO_TITLE_3 + + Type + PSMultiValueSpecifier + Title + MUL_VAL_NO_TITLE_NIL + Key + mulValueOther + DefaultValue + 0 + + + Type + PSGroupSpecifier + Title + TEXT_FIELD_TITLE + + + Type + PSTextFieldSpecifier + Title + TEXT_FIELD_SIG + Key + signature + + + Title + + Type + PSGroupSpecifier + FooterText + This is a Footer Text (supported by Settings.app in iOS 4 or higher) + + + Type + PSChildPaneSpecifier + Title + Complete List + File + Complete + + + Type + PSChildPaneSpecifier + Title + ADVANCED_TITLE + File + Advanced + + + Title + APPLICATION_INFO_TITLE + Type + PSGroupSpecifier + + + Type + PSTitleValueSpecifier + Title + VERSION + Key + version + DefaultValue + 1.0 + + + Type + PSTitleValueSpecifier + Title + Copyright + DefaultValue + Luc Vandal, Ortwin Gentz + Key + copyright + + + + diff --git a/minecraftcpp-master/handheld/project/iosproj/InAppSettings.bundle/en.lproj/Root.strings b/minecraftcpp-master/handheld/project/iosproj/InAppSettings.bundle/en.lproj/Root.strings new file mode 100644 index 0000000..6323e0e Binary files /dev/null and b/minecraftcpp-master/handheld/project/iosproj/InAppSettings.bundle/en.lproj/Root.strings differ diff --git a/minecraftcpp-master/handheld/project/iosproj/InAppSettings.bundle/fast.png b/minecraftcpp-master/handheld/project/iosproj/InAppSettings.bundle/fast.png new file mode 100644 index 0000000..9a0269e Binary files /dev/null and b/minecraftcpp-master/handheld/project/iosproj/InAppSettings.bundle/fast.png differ diff --git a/minecraftcpp-master/handheld/project/iosproj/InAppSettings.bundle/slow.png b/minecraftcpp-master/handheld/project/iosproj/InAppSettings.bundle/slow.png new file mode 100644 index 0000000..7b7d17f Binary files /dev/null and b/minecraftcpp-master/handheld/project/iosproj/InAppSettings.bundle/slow.png differ diff --git a/minecraftcpp-master/handheld/project/iosproj/InAppSettings.bundle/userDefault.plist b/minecraftcpp-master/handheld/project/iosproj/InAppSettings.bundle/userDefault.plist new file mode 100644 index 0000000..7bbd6f7 --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/InAppSettings.bundle/userDefault.plist @@ -0,0 +1,109 @@ + + + + + PreferenceSpecifiers + + + Title + CATEGORY_MULTIPLAYER + Type + PSGroupSpecifier + + + Key + mp_username + Title + mmoptions_mp_username_title + Type + PSTextFieldSpecifier + + + DefaultValue + YES + Key + mp_server_visible_default + Title + mmoptions_mp_server_visible_default_title + Type + PSToggleSwitchSpecifier + + + Title + CATEGORY_GRAPHICS + Type + PSGroupSpecifier + + + DefaultValue + NO + Key + gfx_fancygraphics + Title + mmoptions_gfx_fancygraphics_title + Type + PSToggleSwitchSpecifier + + + DefaultValue + NO + Key + gfx_lowquality + Title + mmoptions_gfx_lowquality_title + Type + PSToggleSwitchSpecifier + + + Title + CATEGORY_CONTROLS + Type + PSGroupSpecifier + + + DefaultValue + NO + Key + ctrl_invertmouse + Title + mmoptions_ctrl_invertmouse_title + Type + PSToggleSwitchSpecifier + + + DefaultValue + NO + Key + ctrl_islefthanded + Title + mmoptions_ctrl_islefthanded_title + Type + PSToggleSwitchSpecifier + + + Title + CATEGORY_GAME + Type + PSGroupSpecifier + + + DefaultValue + NO + Key + game_difficultypeaceful + Title + mmoptions_game_difficultypeaceful_title + Type + PSToggleSwitchSpecifier + TrueValue + 0 + FalseValue + 2 + + + StringsTable + Root + Title + Minecraft - Pocket Edition + + diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/project.pbxproj b/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/project.pbxproj new file mode 100644 index 0000000..b4f42b6 --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/project.pbxproj @@ -0,0 +1,6056 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 04004533169EE72E003EB6FA /* clouds.png in Resources */ = {isa = PBXBuildFile; fileRef = 04004532169EE72E003EB6FA /* clouds.png */; }; + 0400453716A41236003EB6FA /* HeavyTile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0400453516A41236003EB6FA /* HeavyTile.cpp */; }; + 0400453A16A4125C003EB6FA /* FallingTileRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0400453816A4125B003EB6FA /* FallingTileRenderer.cpp */; }; + 0413970716A82E1E008A9F1A /* ArmorItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0413970516A82E1E008A9F1A /* ArmorItem.cpp */; }; + 0413970D16A82E6B008A9F1A /* CraftingFilters.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0413970916A82E6B008A9F1A /* CraftingFilters.cpp */; }; + 0413970E16A82E6B008A9F1A /* StonecutterScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0413970B16A82E6B008A9F1A /* StonecutterScreen.cpp */; }; + 0413971116A82E7B008A9F1A /* ArmorScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0413970F16A82E7B008A9F1A /* ArmorScreen.cpp */; }; + 0413971516A82EB9008A9F1A /* ArmorRecipes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0413971216A82EB9008A9F1A /* ArmorRecipes.cpp */; }; + 0413971716A82EF5008A9F1A /* StairTile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0413971616A82EF5008A9F1A /* StairTile.cpp */; }; + 0419D99B167F201B0080CB96 /* SheepFurModel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0419D998167F201B0080CB96 /* SheepFurModel.cpp */; }; + 0419D99C167F201B0080CB96 /* SheepModel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0419D999167F201B0080CB96 /* SheepModel.cpp */; }; + 0419D99F167F206A0080CB96 /* CommandServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0419D99D167F206A0080CB96 /* CommandServer.cpp */; }; + 0419D9A2167F20CC0080CB96 /* SheepRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0419D9A1167F20CC0080CB96 /* SheepRenderer.cpp */; }; + 0419D9AB167F211B0080CB96 /* ChooseLevelScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0419D9A4167F211B0080CB96 /* ChooseLevelScreen.cpp */; }; + 0419D9AC167F211B0080CB96 /* SimpleChooseLevelScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0419D9A7167F211B0080CB96 /* SimpleChooseLevelScreen.cpp */; }; + 0419D9AD167F211B0080CB96 /* TextEditScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0419D9A9167F211B0080CB96 /* TextEditScreen.cpp */; }; + 0419D9B2167F21BC0080CB96 /* PaneCraftingScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0419D9AE167F21BC0080CB96 /* PaneCraftingScreen.cpp */; }; + 0419D9B3167F21BC0080CB96 /* WorkbenchScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0419D9B0167F21BC0080CB96 /* WorkbenchScreen.cpp */; }; + 0419D9B7167F22150080CB96 /* AgableMob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0419D9B5167F22150080CB96 /* AgableMob.cpp */; }; + 0419D9BA167F2A720080CB96 /* ShowKeyboardView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0419D9B9167F2A720080CB96 /* ShowKeyboardView.mm */; }; + 0425EBA016A94D14000C7483 /* chain_1.png in Resources */ = {isa = PBXBuildFile; fileRef = 0425EB9616A94D14000C7483 /* chain_1.png */; }; + 0425EBA116A94D14000C7483 /* chain_2.png in Resources */ = {isa = PBXBuildFile; fileRef = 0425EB9716A94D14000C7483 /* chain_2.png */; }; + 0425EBA216A94D14000C7483 /* cloth_1.png in Resources */ = {isa = PBXBuildFile; fileRef = 0425EB9816A94D14000C7483 /* cloth_1.png */; }; + 0425EBA316A94D14000C7483 /* cloth_2.png in Resources */ = {isa = PBXBuildFile; fileRef = 0425EB9916A94D14000C7483 /* cloth_2.png */; }; + 0425EBA416A94D14000C7483 /* diamond_1.png in Resources */ = {isa = PBXBuildFile; fileRef = 0425EB9A16A94D14000C7483 /* diamond_1.png */; }; + 0425EBA516A94D14000C7483 /* diamond_2.png in Resources */ = {isa = PBXBuildFile; fileRef = 0425EB9B16A94D14000C7483 /* diamond_2.png */; }; + 0425EBA616A94D14000C7483 /* gold_1.png in Resources */ = {isa = PBXBuildFile; fileRef = 0425EB9C16A94D14000C7483 /* gold_1.png */; }; + 0425EBA716A94D14000C7483 /* gold_2.png in Resources */ = {isa = PBXBuildFile; fileRef = 0425EB9D16A94D14000C7483 /* gold_2.png */; }; + 0425EBA816A94D14000C7483 /* iron_1.png in Resources */ = {isa = PBXBuildFile; fileRef = 0425EB9E16A94D14000C7483 /* iron_1.png */; }; + 0425EBA916A94D14000C7483 /* iron_2.png in Resources */ = {isa = PBXBuildFile; fileRef = 0425EB9F16A94D14000C7483 /* iron_2.png */; }; + 042A91AD16B17517007ABBC6 /* GButton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 042A91A116B17517007ABBC6 /* GButton.cpp */; }; + 042A91AE16B17517007ABBC6 /* GuiElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 042A91A316B17517007ABBC6 /* GuiElement.cpp */; }; + 042A91AF16B17517007ABBC6 /* NinePatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 042A91A516B17517007ABBC6 /* NinePatch.cpp */; }; + 042A91B016B17517007ABBC6 /* OptionsGroup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 042A91A716B17517007ABBC6 /* OptionsGroup.cpp */; }; + 042A91B116B17517007ABBC6 /* OptionsPane.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 042A91A916B17517007ABBC6 /* OptionsPane.cpp */; }; + 042A91B216B17517007ABBC6 /* TextBox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 042A91AB16B17517007ABBC6 /* TextBox.cpp */; }; + 044129071682FF9600B70EE6 /* MouseHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 044129061682FF9600B70EE6 /* MouseHandler.cpp */; }; + 9D293CE716071C08000305C8 /* CreateNewWorld_iphone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9D293CE616071C08000305C8 /* CreateNewWorld_iphone.xib */; }; + 9D293CE816071C08000305C8 /* CreateNewWorld_iphone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9D293CE616071C08000305C8 /* CreateNewWorld_iphone.xib */; }; + 9D293CEB160720D6000305C8 /* worldname_iphone5_3.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D293CEA160720D6000305C8 /* worldname_iphone5_3.png */; }; + 9D293CEC160720D6000305C8 /* worldname_iphone5_3.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D293CEA160720D6000305C8 /* worldname_iphone5_3.png */; }; + D506D3E2161288BD0099FA65 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9D959AFF16036BEE00E23A6F /* Default-568h@2x.png */; }; + D51DC73614581D4E00E3D761 /* itemframe.png in Resources */ = {isa = PBXBuildFile; fileRef = D51DC73514581D4E00E3D761 /* itemframe.png */; }; + D51DC74314592B8B00E3D761 /* PVRTexture.m in Sources */ = {isa = PBXBuildFile; fileRef = D51DC74214592B8A00E3D761 /* PVRTexture.m */; }; + D5251DAB1538192700FC82C8 /* _FindFirst.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CB61538192700FC82C8 /* _FindFirst.cpp */; }; + D5251DAC1538192700FC82C8 /* _FindFirst.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CB61538192700FC82C8 /* _FindFirst.cpp */; }; + D5251DAD1538192700FC82C8 /* BitStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CBA1538192700FC82C8 /* BitStream.cpp */; }; + D5251DAE1538192700FC82C8 /* BitStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CBA1538192700FC82C8 /* BitStream.cpp */; }; + D5251DAF1538192700FC82C8 /* CCRakNetSlidingWindow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CBC1538192700FC82C8 /* CCRakNetSlidingWindow.cpp */; }; + D5251DB01538192700FC82C8 /* CCRakNetSlidingWindow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CBC1538192700FC82C8 /* CCRakNetSlidingWindow.cpp */; }; + D5251DB11538192700FC82C8 /* CCRakNetUDT.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CBE1538192700FC82C8 /* CCRakNetUDT.cpp */; }; + D5251DB21538192700FC82C8 /* CCRakNetUDT.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CBE1538192700FC82C8 /* CCRakNetUDT.cpp */; }; + D5251DB31538192700FC82C8 /* CheckSum.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CC01538192700FC82C8 /* CheckSum.cpp */; }; + D5251DB41538192700FC82C8 /* CheckSum.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CC01538192700FC82C8 /* CheckSum.cpp */; }; + D5251DB51538192700FC82C8 /* CloudClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CC21538192700FC82C8 /* CloudClient.cpp */; }; + D5251DB61538192700FC82C8 /* CloudClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CC21538192700FC82C8 /* CloudClient.cpp */; }; + D5251DB71538192700FC82C8 /* CloudCommon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CC41538192700FC82C8 /* CloudCommon.cpp */; }; + D5251DB81538192700FC82C8 /* CloudCommon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CC41538192700FC82C8 /* CloudCommon.cpp */; }; + D5251DB91538192700FC82C8 /* CloudServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CC61538192700FC82C8 /* CloudServer.cpp */; }; + D5251DBA1538192700FC82C8 /* CloudServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CC61538192700FC82C8 /* CloudServer.cpp */; }; + D5251DBB1538192700FC82C8 /* CMakeLists.txt in Resources */ = {isa = PBXBuildFile; fileRef = D5251CC81538192700FC82C8 /* CMakeLists.txt */; }; + D5251DBC1538192700FC82C8 /* CMakeLists.txt in Resources */ = {isa = PBXBuildFile; fileRef = D5251CC81538192700FC82C8 /* CMakeLists.txt */; }; + D5251DBD1538192700FC82C8 /* CommandParserInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CC91538192700FC82C8 /* CommandParserInterface.cpp */; }; + D5251DBE1538192700FC82C8 /* CommandParserInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CC91538192700FC82C8 /* CommandParserInterface.cpp */; }; + D5251DBF1538192700FC82C8 /* ConnectionGraph2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CCB1538192700FC82C8 /* ConnectionGraph2.cpp */; }; + D5251DC01538192700FC82C8 /* ConnectionGraph2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CCB1538192700FC82C8 /* ConnectionGraph2.cpp */; }; + D5251DC11538192700FC82C8 /* ConsoleServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CCD1538192700FC82C8 /* ConsoleServer.cpp */; }; + D5251DC21538192700FC82C8 /* ConsoleServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CCD1538192700FC82C8 /* ConsoleServer.cpp */; }; + D5251DC31538192700FC82C8 /* DataCompressor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CCF1538192700FC82C8 /* DataCompressor.cpp */; }; + D5251DC41538192700FC82C8 /* DataCompressor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CCF1538192700FC82C8 /* DataCompressor.cpp */; }; + D5251DC51538192700FC82C8 /* DirectoryDeltaTransfer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CD11538192700FC82C8 /* DirectoryDeltaTransfer.cpp */; }; + D5251DC61538192700FC82C8 /* DirectoryDeltaTransfer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CD11538192700FC82C8 /* DirectoryDeltaTransfer.cpp */; }; + D5251DC71538192700FC82C8 /* DS_BytePool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CD51538192700FC82C8 /* DS_BytePool.cpp */; }; + D5251DC81538192700FC82C8 /* DS_BytePool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CD51538192700FC82C8 /* DS_BytePool.cpp */; }; + D5251DC91538192700FC82C8 /* DS_ByteQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CD71538192700FC82C8 /* DS_ByteQueue.cpp */; }; + D5251DCA1538192700FC82C8 /* DS_ByteQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CD71538192700FC82C8 /* DS_ByteQueue.cpp */; }; + D5251DCB1538192700FC82C8 /* DS_HuffmanEncodingTree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CDB1538192700FC82C8 /* DS_HuffmanEncodingTree.cpp */; }; + D5251DCC1538192700FC82C8 /* DS_HuffmanEncodingTree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CDB1538192700FC82C8 /* DS_HuffmanEncodingTree.cpp */; }; + D5251DCD1538192700FC82C8 /* DS_Table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CE91538192700FC82C8 /* DS_Table.cpp */; }; + D5251DCE1538192700FC82C8 /* DS_Table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CE91538192700FC82C8 /* DS_Table.cpp */; }; + D5251DCF1538192700FC82C8 /* DynDNS.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CEE1538192700FC82C8 /* DynDNS.cpp */; }; + D5251DD01538192700FC82C8 /* DynDNS.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CEE1538192700FC82C8 /* DynDNS.cpp */; }; + D5251DD11538192700FC82C8 /* EmailSender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CF01538192700FC82C8 /* EmailSender.cpp */; }; + D5251DD21538192700FC82C8 /* EmailSender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CF01538192700FC82C8 /* EmailSender.cpp */; }; + D5251DD31538192700FC82C8 /* EncodeClassName.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CF21538192700FC82C8 /* EncodeClassName.cpp */; }; + D5251DD41538192700FC82C8 /* EncodeClassName.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CF21538192700FC82C8 /* EncodeClassName.cpp */; }; + D5251DD51538192700FC82C8 /* EpochTimeToString.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CF31538192700FC82C8 /* EpochTimeToString.cpp */; }; + D5251DD61538192700FC82C8 /* EpochTimeToString.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CF31538192700FC82C8 /* EpochTimeToString.cpp */; }; + D5251DD71538192700FC82C8 /* FileList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CF61538192700FC82C8 /* FileList.cpp */; }; + D5251DD81538192700FC82C8 /* FileList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CF61538192700FC82C8 /* FileList.cpp */; }; + D5251DD91538192700FC82C8 /* FileListTransfer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CF91538192700FC82C8 /* FileListTransfer.cpp */; }; + D5251DDA1538192700FC82C8 /* FileListTransfer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CF91538192700FC82C8 /* FileListTransfer.cpp */; }; + D5251DDB1538192700FC82C8 /* FileOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CFC1538192700FC82C8 /* FileOperations.cpp */; }; + D5251DDC1538192700FC82C8 /* FileOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CFC1538192700FC82C8 /* FileOperations.cpp */; }; + D5251DDD1538192700FC82C8 /* FormatString.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CFE1538192700FC82C8 /* FormatString.cpp */; }; + D5251DDE1538192700FC82C8 /* FormatString.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251CFE1538192700FC82C8 /* FormatString.cpp */; }; + D5251DDF1538192700FC82C8 /* FullyConnectedMesh2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D001538192700FC82C8 /* FullyConnectedMesh2.cpp */; }; + D5251DE01538192700FC82C8 /* FullyConnectedMesh2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D001538192700FC82C8 /* FullyConnectedMesh2.cpp */; }; + D5251DE11538192700FC82C8 /* Getche.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D021538192700FC82C8 /* Getche.cpp */; }; + D5251DE21538192700FC82C8 /* Getche.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D021538192700FC82C8 /* Getche.cpp */; }; + D5251DE31538192700FC82C8 /* Gets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D041538192700FC82C8 /* Gets.cpp */; }; + D5251DE41538192700FC82C8 /* Gets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D041538192700FC82C8 /* Gets.cpp */; }; + D5251DE51538192700FC82C8 /* GetTime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D061538192700FC82C8 /* GetTime.cpp */; }; + D5251DE61538192700FC82C8 /* GetTime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D061538192700FC82C8 /* GetTime.cpp */; }; + D5251DE71538192700FC82C8 /* gettimeofday.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D081538192700FC82C8 /* gettimeofday.cpp */; }; + D5251DE81538192700FC82C8 /* gettimeofday.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D081538192700FC82C8 /* gettimeofday.cpp */; }; + D5251DE91538192700FC82C8 /* GridSectorizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D0A1538192700FC82C8 /* GridSectorizer.cpp */; }; + D5251DEA1538192700FC82C8 /* GridSectorizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D0A1538192700FC82C8 /* GridSectorizer.cpp */; }; + D5251DEB1538192700FC82C8 /* HTTPConnection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D0C1538192700FC82C8 /* HTTPConnection.cpp */; }; + D5251DEC1538192700FC82C8 /* HTTPConnection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D0C1538192700FC82C8 /* HTTPConnection.cpp */; }; + D5251DED1538192700FC82C8 /* IncrementalReadInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D0E1538192700FC82C8 /* IncrementalReadInterface.cpp */; }; + D5251DEE1538192700FC82C8 /* IncrementalReadInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D0E1538192700FC82C8 /* IncrementalReadInterface.cpp */; }; + D5251DEF1538192700FC82C8 /* Itoa.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D111538192700FC82C8 /* Itoa.cpp */; }; + D5251DF01538192700FC82C8 /* Itoa.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D111538192700FC82C8 /* Itoa.cpp */; }; + D5251DF11538192700FC82C8 /* LinuxStrings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D141538192700FC82C8 /* LinuxStrings.cpp */; }; + D5251DF21538192700FC82C8 /* LinuxStrings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D141538192700FC82C8 /* LinuxStrings.cpp */; }; + D5251DF31538192700FC82C8 /* LocklessTypes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D161538192700FC82C8 /* LocklessTypes.cpp */; }; + D5251DF41538192700FC82C8 /* LocklessTypes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D161538192700FC82C8 /* LocklessTypes.cpp */; }; + D5251DF51538192700FC82C8 /* LogCommandParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D181538192700FC82C8 /* LogCommandParser.cpp */; }; + D5251DF61538192700FC82C8 /* LogCommandParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D181538192700FC82C8 /* LogCommandParser.cpp */; }; + D5251DF71538192700FC82C8 /* MessageFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D1A1538192700FC82C8 /* MessageFilter.cpp */; }; + D5251DF81538192700FC82C8 /* MessageFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D1A1538192700FC82C8 /* MessageFilter.cpp */; }; + D5251DF91538192700FC82C8 /* NatPunchthroughClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D211538192700FC82C8 /* NatPunchthroughClient.cpp */; }; + D5251DFA1538192700FC82C8 /* NatPunchthroughClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D211538192700FC82C8 /* NatPunchthroughClient.cpp */; }; + D5251DFB1538192700FC82C8 /* NatPunchthroughServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D231538192700FC82C8 /* NatPunchthroughServer.cpp */; }; + D5251DFC1538192700FC82C8 /* NatPunchthroughServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D231538192700FC82C8 /* NatPunchthroughServer.cpp */; }; + D5251DFD1538192700FC82C8 /* NatTypeDetectionClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D251538192700FC82C8 /* NatTypeDetectionClient.cpp */; }; + D5251DFE1538192700FC82C8 /* NatTypeDetectionClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D251538192700FC82C8 /* NatTypeDetectionClient.cpp */; }; + D5251DFF1538192700FC82C8 /* NatTypeDetectionCommon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D271538192700FC82C8 /* NatTypeDetectionCommon.cpp */; }; + D5251E001538192700FC82C8 /* NatTypeDetectionCommon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D271538192700FC82C8 /* NatTypeDetectionCommon.cpp */; }; + D5251E011538192700FC82C8 /* NatTypeDetectionServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D291538192700FC82C8 /* NatTypeDetectionServer.cpp */; }; + D5251E021538192700FC82C8 /* NatTypeDetectionServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D291538192700FC82C8 /* NatTypeDetectionServer.cpp */; }; + D5251E031538192700FC82C8 /* NetworkIDManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D2B1538192700FC82C8 /* NetworkIDManager.cpp */; }; + D5251E041538192700FC82C8 /* NetworkIDManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D2B1538192700FC82C8 /* NetworkIDManager.cpp */; }; + D5251E051538192700FC82C8 /* NetworkIDObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D2D1538192700FC82C8 /* NetworkIDObject.cpp */; }; + D5251E061538192700FC82C8 /* NetworkIDObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D2D1538192700FC82C8 /* NetworkIDObject.cpp */; }; + D5251E071538192700FC82C8 /* PacketConsoleLogger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D2F1538192700FC82C8 /* PacketConsoleLogger.cpp */; }; + D5251E081538192700FC82C8 /* PacketConsoleLogger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D2F1538192700FC82C8 /* PacketConsoleLogger.cpp */; }; + D5251E091538192700FC82C8 /* PacketFileLogger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D311538192700FC82C8 /* PacketFileLogger.cpp */; }; + D5251E0A1538192700FC82C8 /* PacketFileLogger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D311538192700FC82C8 /* PacketFileLogger.cpp */; }; + D5251E0B1538192700FC82C8 /* PacketizedTCP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D331538192700FC82C8 /* PacketizedTCP.cpp */; }; + D5251E0C1538192700FC82C8 /* PacketizedTCP.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D331538192700FC82C8 /* PacketizedTCP.cpp */; }; + D5251E0D1538192700FC82C8 /* PacketLogger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D351538192700FC82C8 /* PacketLogger.cpp */; }; + D5251E0E1538192700FC82C8 /* PacketLogger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D351538192700FC82C8 /* PacketLogger.cpp */; }; + D5251E0F1538192700FC82C8 /* PacketOutputWindowLogger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D371538192700FC82C8 /* PacketOutputWindowLogger.cpp */; }; + D5251E101538192700FC82C8 /* PacketOutputWindowLogger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D371538192700FC82C8 /* PacketOutputWindowLogger.cpp */; }; + D5251E111538192700FC82C8 /* PluginInterface2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D3B1538192700FC82C8 /* PluginInterface2.cpp */; }; + D5251E121538192700FC82C8 /* PluginInterface2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D3B1538192700FC82C8 /* PluginInterface2.cpp */; }; + D5251E131538192700FC82C8 /* Rackspace.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D3E1538192700FC82C8 /* Rackspace.cpp */; }; + D5251E141538192700FC82C8 /* Rackspace.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D3E1538192700FC82C8 /* Rackspace.cpp */; }; + D5251E151538192700FC82C8 /* RakMemoryOverride.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D421538192700FC82C8 /* RakMemoryOverride.cpp */; }; + D5251E161538192700FC82C8 /* RakMemoryOverride.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D421538192700FC82C8 /* RakMemoryOverride.cpp */; }; + D5251E1D1538192700FC82C8 /* RakNetCommandParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D471538192700FC82C8 /* RakNetCommandParser.cpp */; }; + D5251E1E1538192700FC82C8 /* RakNetCommandParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D471538192700FC82C8 /* RakNetCommandParser.cpp */; }; + D5251E1F1538192700FC82C8 /* RakNetSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D4C1538192700FC82C8 /* RakNetSocket.cpp */; }; + D5251E201538192700FC82C8 /* RakNetSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D4C1538192700FC82C8 /* RakNetSocket.cpp */; }; + D5251E211538192700FC82C8 /* RakNetStatistics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D4E1538192700FC82C8 /* RakNetStatistics.cpp */; }; + D5251E221538192700FC82C8 /* RakNetStatistics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D4E1538192700FC82C8 /* RakNetStatistics.cpp */; }; + D5251E231538192700FC82C8 /* RakNetTransport2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D511538192700FC82C8 /* RakNetTransport2.cpp */; }; + D5251E241538192700FC82C8 /* RakNetTransport2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D511538192700FC82C8 /* RakNetTransport2.cpp */; }; + D5251E251538192700FC82C8 /* RakNetTypes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D531538192700FC82C8 /* RakNetTypes.cpp */; }; + D5251E261538192700FC82C8 /* RakNetTypes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D531538192700FC82C8 /* RakNetTypes.cpp */; }; + D5251E271538192700FC82C8 /* RakPeer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D561538192700FC82C8 /* RakPeer.cpp */; }; + D5251E281538192700FC82C8 /* RakPeer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D561538192700FC82C8 /* RakPeer.cpp */; }; + D5251E291538192700FC82C8 /* RakSleep.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D591538192700FC82C8 /* RakSleep.cpp */; }; + D5251E2A1538192700FC82C8 /* RakSleep.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D591538192700FC82C8 /* RakSleep.cpp */; }; + D5251E2B1538192700FC82C8 /* RakString.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D5B1538192700FC82C8 /* RakString.cpp */; }; + D5251E2C1538192700FC82C8 /* RakString.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D5B1538192700FC82C8 /* RakString.cpp */; }; + D5251E2D1538192700FC82C8 /* RakThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D5D1538192700FC82C8 /* RakThread.cpp */; }; + D5251E2E1538192700FC82C8 /* RakThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D5D1538192700FC82C8 /* RakThread.cpp */; }; + D5251E2F1538192700FC82C8 /* RakWString.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D5F1538192700FC82C8 /* RakWString.cpp */; }; + D5251E301538192700FC82C8 /* RakWString.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D5F1538192700FC82C8 /* RakWString.cpp */; }; + D5251E311538192700FC82C8 /* Rand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D611538192700FC82C8 /* Rand.cpp */; }; + D5251E321538192700FC82C8 /* Rand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D611538192700FC82C8 /* Rand.cpp */; }; + D5251E331538192700FC82C8 /* rdlmalloc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D641538192700FC82C8 /* rdlmalloc.cpp */; }; + D5251E341538192700FC82C8 /* rdlmalloc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D641538192700FC82C8 /* rdlmalloc.cpp */; }; + D5251E351538192700FC82C8 /* ReadyEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D661538192700FC82C8 /* ReadyEvent.cpp */; }; + D5251E361538192700FC82C8 /* ReadyEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D661538192700FC82C8 /* ReadyEvent.cpp */; }; + D5251E371538192700FC82C8 /* ReliabilityLayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D691538192700FC82C8 /* ReliabilityLayer.cpp */; }; + D5251E381538192700FC82C8 /* ReliabilityLayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D691538192700FC82C8 /* ReliabilityLayer.cpp */; }; + D5251E391538192700FC82C8 /* ReplicaManager3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D6C1538192700FC82C8 /* ReplicaManager3.cpp */; }; + D5251E3A1538192700FC82C8 /* ReplicaManager3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D6C1538192700FC82C8 /* ReplicaManager3.cpp */; }; + D5251E3B1538192700FC82C8 /* Router2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D6E1538192700FC82C8 /* Router2.cpp */; }; + D5251E3C1538192700FC82C8 /* Router2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D6E1538192700FC82C8 /* Router2.cpp */; }; + D5251E3D1538192700FC82C8 /* RPC4Plugin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D701538192700FC82C8 /* RPC4Plugin.cpp */; }; + D5251E3E1538192700FC82C8 /* RPC4Plugin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D701538192700FC82C8 /* RPC4Plugin.cpp */; }; + D5251E3F1538192700FC82C8 /* SecureHandshake.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D721538192700FC82C8 /* SecureHandshake.cpp */; }; + D5251E401538192700FC82C8 /* SecureHandshake.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D721538192700FC82C8 /* SecureHandshake.cpp */; }; + D5251E411538192700FC82C8 /* SendToThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D741538192700FC82C8 /* SendToThread.cpp */; }; + D5251E421538192700FC82C8 /* SendToThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D741538192700FC82C8 /* SendToThread.cpp */; }; + D5251E431538192700FC82C8 /* SHA1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D761538192700FC82C8 /* SHA1.cpp */; }; + D5251E441538192700FC82C8 /* SHA1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D761538192700FC82C8 /* SHA1.cpp */; }; + D5251E451538192700FC82C8 /* SignaledEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D781538192700FC82C8 /* SignaledEvent.cpp */; }; + D5251E461538192700FC82C8 /* SignaledEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D781538192700FC82C8 /* SignaledEvent.cpp */; }; + D5251E471538192700FC82C8 /* SimpleMutex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D7A1538192700FC82C8 /* SimpleMutex.cpp */; }; + D5251E481538192700FC82C8 /* SimpleMutex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D7A1538192700FC82C8 /* SimpleMutex.cpp */; }; + D5251E491538192700FC82C8 /* SocketLayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D801538192700FC82C8 /* SocketLayer.cpp */; }; + D5251E4A1538192700FC82C8 /* SocketLayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D801538192700FC82C8 /* SocketLayer.cpp */; }; + D5251E4B1538192700FC82C8 /* StringCompressor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D821538192700FC82C8 /* StringCompressor.cpp */; }; + D5251E4C1538192700FC82C8 /* StringCompressor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D821538192700FC82C8 /* StringCompressor.cpp */; }; + D5251E4D1538192700FC82C8 /* StringTable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D841538192700FC82C8 /* StringTable.cpp */; }; + D5251E4E1538192700FC82C8 /* StringTable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D841538192700FC82C8 /* StringTable.cpp */; }; + D5251E4F1538192700FC82C8 /* SuperFastHash.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D861538192700FC82C8 /* SuperFastHash.cpp */; }; + D5251E501538192700FC82C8 /* SuperFastHash.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D861538192700FC82C8 /* SuperFastHash.cpp */; }; + D5251E511538192700FC82C8 /* TableSerializer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D881538192700FC82C8 /* TableSerializer.cpp */; }; + D5251E521538192700FC82C8 /* TableSerializer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D881538192700FC82C8 /* TableSerializer.cpp */; }; + D5251E531538192700FC82C8 /* TCPInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D8A1538192700FC82C8 /* TCPInterface.cpp */; }; + D5251E541538192700FC82C8 /* TCPInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D8A1538192700FC82C8 /* TCPInterface.cpp */; }; + D5251E551538192700FC82C8 /* TeamBalancer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D8C1538192700FC82C8 /* TeamBalancer.cpp */; }; + D5251E561538192700FC82C8 /* TeamBalancer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D8C1538192700FC82C8 /* TeamBalancer.cpp */; }; + D5251E571538192700FC82C8 /* TelnetTransport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D8E1538192700FC82C8 /* TelnetTransport.cpp */; }; + D5251E581538192700FC82C8 /* TelnetTransport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D8E1538192700FC82C8 /* TelnetTransport.cpp */; }; + D5251E591538192700FC82C8 /* ThreadsafePacketLogger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D911538192700FC82C8 /* ThreadsafePacketLogger.cpp */; }; + D5251E5A1538192700FC82C8 /* ThreadsafePacketLogger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D911538192700FC82C8 /* ThreadsafePacketLogger.cpp */; }; + D5251E5B1538192700FC82C8 /* TwoWayAuthentication.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D941538192700FC82C8 /* TwoWayAuthentication.cpp */; }; + D5251E5C1538192700FC82C8 /* TwoWayAuthentication.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D941538192700FC82C8 /* TwoWayAuthentication.cpp */; }; + D5251E5D1538192700FC82C8 /* UDPForwarder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D961538192700FC82C8 /* UDPForwarder.cpp */; }; + D5251E5E1538192700FC82C8 /* UDPForwarder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D961538192700FC82C8 /* UDPForwarder.cpp */; }; + D5251E5F1538192700FC82C8 /* UDPProxyClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D981538192700FC82C8 /* UDPProxyClient.cpp */; }; + D5251E601538192700FC82C8 /* UDPProxyClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D981538192700FC82C8 /* UDPProxyClient.cpp */; }; + D5251E611538192700FC82C8 /* UDPProxyCoordinator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D9B1538192700FC82C8 /* UDPProxyCoordinator.cpp */; }; + D5251E621538192700FC82C8 /* UDPProxyCoordinator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D9B1538192700FC82C8 /* UDPProxyCoordinator.cpp */; }; + D5251E631538192700FC82C8 /* UDPProxyServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D9D1538192700FC82C8 /* UDPProxyServer.cpp */; }; + D5251E641538192700FC82C8 /* UDPProxyServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D9D1538192700FC82C8 /* UDPProxyServer.cpp */; }; + D5251E651538192700FC82C8 /* VariableDeltaSerializer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D9F1538192700FC82C8 /* VariableDeltaSerializer.cpp */; }; + D5251E661538192700FC82C8 /* VariableDeltaSerializer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251D9F1538192700FC82C8 /* VariableDeltaSerializer.cpp */; }; + D5251E671538192700FC82C8 /* VariableListDeltaTracker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251DA11538192700FC82C8 /* VariableListDeltaTracker.cpp */; }; + D5251E681538192700FC82C8 /* VariableListDeltaTracker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251DA11538192700FC82C8 /* VariableListDeltaTracker.cpp */; }; + D5251E691538192700FC82C8 /* VariadicSQLParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251DA31538192700FC82C8 /* VariadicSQLParser.cpp */; }; + D5251E6A1538192700FC82C8 /* VariadicSQLParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251DA31538192700FC82C8 /* VariadicSQLParser.cpp */; }; + D5251E6B1538192700FC82C8 /* VitaIncludes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251DA51538192700FC82C8 /* VitaIncludes.cpp */; }; + D5251E6C1538192700FC82C8 /* VitaIncludes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251DA51538192700FC82C8 /* VitaIncludes.cpp */; }; + D5251E6D1538192700FC82C8 /* WSAStartupSingleton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251DA81538192700FC82C8 /* WSAStartupSingleton.cpp */; }; + D5251E6E1538192700FC82C8 /* WSAStartupSingleton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5251DA81538192700FC82C8 /* WSAStartupSingleton.cpp */; }; + D5251E7015381D0500FC82C8 /* spritesheet.png in Resources */ = {isa = PBXBuildFile; fileRef = D5251E6F15381D0500FC82C8 /* spritesheet.png */; }; + D5251E7115381D0500FC82C8 /* spritesheet.png in Resources */ = {isa = PBXBuildFile; fileRef = D5251E6F15381D0500FC82C8 /* spritesheet.png */; }; + D5251E74153823DC00FC82C8 /* en_US.lang in Resources */ = {isa = PBXBuildFile; fileRef = D5251E73153823DC00FC82C8 /* en_US.lang */; }; + D5251E75153823DC00FC82C8 /* en_US.lang in Resources */ = {isa = PBXBuildFile; fileRef = D5251E73153823DC00FC82C8 /* en_US.lang */; }; + D5251E911539A9AF00FC82C8 /* SoundEngine.mm in Sources */ = {isa = PBXBuildFile; fileRef = D5251E901539A9AF00FC82C8 /* SoundEngine.mm */; }; + D5251E921539A9AF00FC82C8 /* SoundEngine.mm in Sources */ = {isa = PBXBuildFile; fileRef = D5251E901539A9AF00FC82C8 /* SoundEngine.mm */; }; + D54493EF15D13BF0005FA9B0 /* BedTile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D54493EA15D13BF0005FA9B0 /* BedTile.cpp */; }; + D54493F015D13BF0005FA9B0 /* BedTile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D54493EA15D13BF0005FA9B0 /* BedTile.cpp */; }; + D54493F115D13BF0005FA9B0 /* CropTile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D54493EC15D13BF0005FA9B0 /* CropTile.cpp */; }; + D54493F215D13BF0005FA9B0 /* CropTile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D54493EC15D13BF0005FA9B0 /* CropTile.cpp */; }; + D54493F315D13BF0005FA9B0 /* GrassTile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D54493EE15D13BF0005FA9B0 /* GrassTile.cpp */; }; + D54493F415D13BF0005FA9B0 /* GrassTile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D54493EE15D13BF0005FA9B0 /* GrassTile.cpp */; }; + D54493F915D13C35005FA9B0 /* HoeItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D54493F615D13C35005FA9B0 /* HoeItem.cpp */; }; + D54493FA15D13C35005FA9B0 /* HoeItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D54493F615D13C35005FA9B0 /* HoeItem.cpp */; }; + D54493FD15D13C59005FA9B0 /* BedItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D54493FB15D13C59005FA9B0 /* BedItem.cpp */; }; + D54493FE15D13C59005FA9B0 /* BedItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D54493FB15D13C59005FA9B0 /* BedItem.cpp */; }; + D544940815D13DB7005FA9B0 /* ServerLevel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D544940415D13DB7005FA9B0 /* ServerLevel.cpp */; }; + D544940915D13DB7005FA9B0 /* ServerLevel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D544940415D13DB7005FA9B0 /* ServerLevel.cpp */; }; + D544940A15D13DB7005FA9B0 /* ServerPlayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D544940615D13DB7005FA9B0 /* ServerPlayer.cpp */; }; + D544940B15D13DB7005FA9B0 /* ServerPlayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D544940615D13DB7005FA9B0 /* ServerPlayer.cpp */; }; + D544941015D13E27005FA9B0 /* SimpleFoodData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D544940E15D13E27005FA9B0 /* SimpleFoodData.cpp */; }; + D544941115D13E27005FA9B0 /* SimpleFoodData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D544940E15D13E27005FA9B0 /* SimpleFoodData.cpp */; }; + D544941315D13E5A005FA9B0 /* FolderMethods.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D544941215D13E5A005FA9B0 /* FolderMethods.cpp */; }; + D544941415D13E5A005FA9B0 /* FolderMethods.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D544941215D13E5A005FA9B0 /* FolderMethods.cpp */; }; + D544941615D13EE3005FA9B0 /* LevelStorageSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D544941515D13EE3005FA9B0 /* LevelStorageSource.cpp */; }; + D544941715D13EE3005FA9B0 /* LevelStorageSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D544941515D13EE3005FA9B0 /* LevelStorageSource.cpp */; }; + D544941A15D13F06005FA9B0 /* TallGrass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D544941815D13F06005FA9B0 /* TallGrass.cpp */; }; + D544941B15D13F06005FA9B0 /* TallGrass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D544941815D13F06005FA9B0 /* TallGrass.cpp */; }; + D544941E15D13F45005FA9B0 /* PlayerRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D544941C15D13F45005FA9B0 /* PlayerRenderer.cpp */; }; + D544941F15D13F45005FA9B0 /* PlayerRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D544941C15D13F45005FA9B0 /* PlayerRenderer.cpp */; }; + D544942215D13F5E005FA9B0 /* RemotePlayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D544942015D13F5E005FA9B0 /* RemotePlayer.cpp */; }; + D544942315D13F5E005FA9B0 /* RemotePlayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D544942015D13F5E005FA9B0 /* RemotePlayer.cpp */; }; + D54954F814E38FFC00685A35 /* cancel_0_1.png in Resources */ = {isa = PBXBuildFile; fileRef = D54954EC14E38FFC00685A35 /* cancel_0_1.png */; }; + D54954F914E38FFC00685A35 /* cancel_0_1.png in Resources */ = {isa = PBXBuildFile; fileRef = D54954EC14E38FFC00685A35 /* cancel_0_1.png */; }; + D54954FA14E38FFC00685A35 /* cancel_0_3.png in Resources */ = {isa = PBXBuildFile; fileRef = D54954ED14E38FFC00685A35 /* cancel_0_3.png */; }; + D54954FB14E38FFC00685A35 /* cancel_0_3.png in Resources */ = {isa = PBXBuildFile; fileRef = D54954ED14E38FFC00685A35 /* cancel_0_3.png */; }; + D54954FC14E38FFC00685A35 /* cancel_1_1.png in Resources */ = {isa = PBXBuildFile; fileRef = D54954EE14E38FFC00685A35 /* cancel_1_1.png */; }; + D54954FD14E38FFC00685A35 /* cancel_1_1.png in Resources */ = {isa = PBXBuildFile; fileRef = D54954EE14E38FFC00685A35 /* cancel_1_1.png */; }; + D54954FE14E38FFC00685A35 /* cancel_1_3.png in Resources */ = {isa = PBXBuildFile; fileRef = D54954EF14E38FFC00685A35 /* cancel_1_3.png */; }; + D54954FF14E38FFC00685A35 /* cancel_1_3.png in Resources */ = {isa = PBXBuildFile; fileRef = D54954EF14E38FFC00685A35 /* cancel_1_3.png */; }; + D549550014E38FFC00685A35 /* create_0_1.png in Resources */ = {isa = PBXBuildFile; fileRef = D54954F014E38FFC00685A35 /* create_0_1.png */; }; + D549550114E38FFC00685A35 /* create_0_1.png in Resources */ = {isa = PBXBuildFile; fileRef = D54954F014E38FFC00685A35 /* create_0_1.png */; }; + D549550214E38FFC00685A35 /* create_0_3.png in Resources */ = {isa = PBXBuildFile; fileRef = D54954F114E38FFC00685A35 /* create_0_3.png */; }; + D549550314E38FFC00685A35 /* create_0_3.png in Resources */ = {isa = PBXBuildFile; fileRef = D54954F114E38FFC00685A35 /* create_0_3.png */; }; + D549550414E38FFC00685A35 /* create_1_1.png in Resources */ = {isa = PBXBuildFile; fileRef = D54954F214E38FFC00685A35 /* create_1_1.png */; }; + D549550514E38FFC00685A35 /* create_1_1.png in Resources */ = {isa = PBXBuildFile; fileRef = D54954F214E38FFC00685A35 /* create_1_1.png */; }; + D549550614E38FFC00685A35 /* create_1_3.png in Resources */ = {isa = PBXBuildFile; fileRef = D54954F314E38FFC00685A35 /* create_1_3.png */; }; + D549550714E38FFC00685A35 /* create_1_3.png in Resources */ = {isa = PBXBuildFile; fileRef = D54954F314E38FFC00685A35 /* create_1_3.png */; }; + D549550814E38FFC00685A35 /* creative_0_3.png in Resources */ = {isa = PBXBuildFile; fileRef = D54954F414E38FFC00685A35 /* creative_0_3.png */; }; + D549550914E38FFC00685A35 /* creative_0_3.png in Resources */ = {isa = PBXBuildFile; fileRef = D54954F414E38FFC00685A35 /* creative_0_3.png */; }; + D549550A14E38FFC00685A35 /* survival_0_3.png in Resources */ = {isa = PBXBuildFile; fileRef = D54954F514E38FFC00685A35 /* survival_0_3.png */; }; + D549550B14E38FFC00685A35 /* survival_0_3.png in Resources */ = {isa = PBXBuildFile; fileRef = D54954F514E38FFC00685A35 /* survival_0_3.png */; }; + D549550C14E38FFC00685A35 /* worldname.png in Resources */ = {isa = PBXBuildFile; fileRef = D54954F614E38FFC00685A35 /* worldname.png */; }; + D549550D14E38FFC00685A35 /* worldname.png in Resources */ = {isa = PBXBuildFile; fileRef = D54954F614E38FFC00685A35 /* worldname.png */; }; + D549550E14E38FFC00685A35 /* worldname_3.png in Resources */ = {isa = PBXBuildFile; fileRef = D54954F714E38FFC00685A35 /* worldname_3.png */; }; + D549550F14E38FFC00685A35 /* worldname_3.png in Resources */ = {isa = PBXBuildFile; fileRef = D54954F714E38FFC00685A35 /* worldname_3.png */; }; + D549551514E3D86D00685A35 /* worldname_ipad_3.png in Resources */ = {isa = PBXBuildFile; fileRef = D549551114E3D86B00685A35 /* worldname_ipad_3.png */; }; + D549551614E3D86D00685A35 /* worldname_ipad_3.png in Resources */ = {isa = PBXBuildFile; fileRef = D549551114E3D86B00685A35 /* worldname_ipad_3.png */; }; + D549551714E3D86D00685A35 /* worldname_ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = D549551214E3D86B00685A35 /* worldname_ipad.png */; }; + D549551814E3D86D00685A35 /* worldname_ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = D549551214E3D86B00685A35 /* worldname_ipad.png */; }; + D549551914E3D86D00685A35 /* worldname_iphone_3.png in Resources */ = {isa = PBXBuildFile; fileRef = D549551314E3D86C00685A35 /* worldname_iphone_3.png */; }; + D549551A14E3D86D00685A35 /* worldname_iphone_3.png in Resources */ = {isa = PBXBuildFile; fileRef = D549551314E3D86C00685A35 /* worldname_iphone_3.png */; }; + D549551B14E3D86D00685A35 /* worldname_iphone.png in Resources */ = {isa = PBXBuildFile; fileRef = D549551414E3D86D00685A35 /* worldname_iphone.png */; }; + D549551C14E3D86D00685A35 /* worldname_iphone.png in Resources */ = {isa = PBXBuildFile; fileRef = D549551414E3D86D00685A35 /* worldname_iphone.png */; }; + D549551F14E3DC4400685A35 /* creative_1_3.png in Resources */ = {isa = PBXBuildFile; fileRef = D549551D14E3DC4300685A35 /* creative_1_3.png */; }; + D549552014E3DC4400685A35 /* creative_1_3.png in Resources */ = {isa = PBXBuildFile; fileRef = D549551D14E3DC4300685A35 /* creative_1_3.png */; }; + D549552114E3DC4400685A35 /* survival_1_3.png in Resources */ = {isa = PBXBuildFile; fileRef = D549551E14E3DC4300685A35 /* survival_1_3.png */; }; + D549552214E3DC4400685A35 /* survival_1_3.png in Resources */ = {isa = PBXBuildFile; fileRef = D549551E14E3DC4300685A35 /* survival_1_3.png */; }; + D549552D14E3EA0B00685A35 /* cancel_0_4.png in Resources */ = {isa = PBXBuildFile; fileRef = D549552414E3EA0B00685A35 /* cancel_0_4.png */; }; + D549552E14E3EA0B00685A35 /* cancel_0_4.png in Resources */ = {isa = PBXBuildFile; fileRef = D549552414E3EA0B00685A35 /* cancel_0_4.png */; }; + D549552F14E3EA0B00685A35 /* cancel_1_4.png in Resources */ = {isa = PBXBuildFile; fileRef = D549552514E3EA0B00685A35 /* cancel_1_4.png */; }; + D549553014E3EA0B00685A35 /* cancel_1_4.png in Resources */ = {isa = PBXBuildFile; fileRef = D549552514E3EA0B00685A35 /* cancel_1_4.png */; }; + D549553114E3EA0B00685A35 /* create_0_4.png in Resources */ = {isa = PBXBuildFile; fileRef = D549552614E3EA0B00685A35 /* create_0_4.png */; }; + D549553214E3EA0B00685A35 /* create_0_4.png in Resources */ = {isa = PBXBuildFile; fileRef = D549552614E3EA0B00685A35 /* create_0_4.png */; }; + D549553314E3EA0B00685A35 /* create_1_4.png in Resources */ = {isa = PBXBuildFile; fileRef = D549552714E3EA0B00685A35 /* create_1_4.png */; }; + D549553414E3EA0B00685A35 /* create_1_4.png in Resources */ = {isa = PBXBuildFile; fileRef = D549552714E3EA0B00685A35 /* create_1_4.png */; }; + D549553514E3EA0B00685A35 /* creative_1_4.png in Resources */ = {isa = PBXBuildFile; fileRef = D549552814E3EA0B00685A35 /* creative_1_4.png */; }; + D549553614E3EA0B00685A35 /* creative_1_4.png in Resources */ = {isa = PBXBuildFile; fileRef = D549552814E3EA0B00685A35 /* creative_1_4.png */; }; + D549553914E3EA0B00685A35 /* survival_1_4.png in Resources */ = {isa = PBXBuildFile; fileRef = D549552A14E3EA0B00685A35 /* survival_1_4.png */; }; + D549553A14E3EA0B00685A35 /* survival_1_4.png in Resources */ = {isa = PBXBuildFile; fileRef = D549552A14E3EA0B00685A35 /* survival_1_4.png */; }; + D549553D14E3EA0B00685A35 /* worldname_ipad_4.png in Resources */ = {isa = PBXBuildFile; fileRef = D549552C14E3EA0B00685A35 /* worldname_ipad_4.png */; }; + D549553E14E3EA0B00685A35 /* worldname_ipad_4.png in Resources */ = {isa = PBXBuildFile; fileRef = D549552C14E3EA0B00685A35 /* worldname_ipad_4.png */; }; + D549554114E3EAC100685A35 /* creative_0_4.png in Resources */ = {isa = PBXBuildFile; fileRef = D549553F14E3EAC100685A35 /* creative_0_4.png */; }; + D549554214E3EAC100685A35 /* creative_0_4.png in Resources */ = {isa = PBXBuildFile; fileRef = D549553F14E3EAC100685A35 /* creative_0_4.png */; }; + D549554314E3EAC100685A35 /* survival_0_4.png in Resources */ = {isa = PBXBuildFile; fileRef = D549554014E3EAC100685A35 /* survival_0_4.png */; }; + D549554414E3EAC100685A35 /* survival_0_4.png in Resources */ = {isa = PBXBuildFile; fileRef = D549554014E3EAC100685A35 /* survival_0_4.png */; }; + D55B201814595370002D9366 /* terrain.pvr in Resources */ = {isa = PBXBuildFile; fileRef = D55B201714595370002D9366 /* terrain.pvr */; }; + D55B252B14598227002D9366 /* terrain.pvrtc in Resources */ = {isa = PBXBuildFile; fileRef = D55B252A14598227002D9366 /* terrain.pvrtc */; }; + D572D3C9144C6A1400E67862 /* default8.png in Resources */ = {isa = PBXBuildFile; fileRef = D572D3AD144C6A1400E67862 /* default8.png */; }; + D572D3CA144C6A1400E67862 /* background.png in Resources */ = {isa = PBXBuildFile; fileRef = D572D3AF144C6A1400E67862 /* background.png */; }; + D572D3CD144C6A1400E67862 /* default_world.png in Resources */ = {isa = PBXBuildFile; fileRef = D572D3B3144C6A1400E67862 /* default_world.png */; }; + D572D3D0144C6A1400E67862 /* gui.png in Resources */ = {isa = PBXBuildFile; fileRef = D572D3B6144C6A1400E67862 /* gui.png */; }; + D572D3D1144C6A1400E67862 /* gui_blocks.png in Resources */ = {isa = PBXBuildFile; fileRef = D572D3B7144C6A1400E67862 /* gui_blocks.png */; }; + D572D3D2144C6A1400E67862 /* icons.png in Resources */ = {isa = PBXBuildFile; fileRef = D572D3B8144C6A1400E67862 /* icons.png */; }; + D572D3D3144C6A1400E67862 /* items.png in Resources */ = {isa = PBXBuildFile; fileRef = D572D3B9144C6A1400E67862 /* items.png */; }; + D572D3D9144C6A1400E67862 /* title.png in Resources */ = {isa = PBXBuildFile; fileRef = D572D3C1144C6A1400E67862 /* title.png */; }; + D572D3DA144C6A1400E67862 /* touchgui.png in Resources */ = {isa = PBXBuildFile; fileRef = D572D3C2144C6A1400E67862 /* touchgui.png */; }; + D572D3DB144C6A1400E67862 /* camera.png in Resources */ = {isa = PBXBuildFile; fileRef = D572D3C4144C6A1400E67862 /* camera.png */; }; + D572D3DC144C6A1400E67862 /* char.png in Resources */ = {isa = PBXBuildFile; fileRef = D572D3C6144C6A1400E67862 /* char.png */; }; + D572D3DD144C6A1400E67862 /* particles.png in Resources */ = {isa = PBXBuildFile; fileRef = D572D3C7144C6A1400E67862 /* particles.png */; }; + D572D3DE144C6A1400E67862 /* terrain.png in Resources */ = {isa = PBXBuildFile; fileRef = D572D3C8144C6A1400E67862 /* terrain.png */; }; + D572D3E0144CB23200E67862 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D572D3DF144CB23200E67862 /* AudioToolbox.framework */; }; + D584926D14FD234400741128 /* SharedConstants.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D584926C14FD234400741128 /* SharedConstants.cpp */; }; + D584926E14FD234400741128 /* SharedConstants.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D584926C14FD234400741128 /* SharedConstants.cpp */; }; + D584927314FD236700741128 /* MoveControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D584927114FD236700741128 /* MoveControl.cpp */; }; + D584927414FD236700741128 /* MoveControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D584927114FD236700741128 /* MoveControl.cpp */; }; + D584928614FD240D00741128 /* IConfigListener.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D584928414FD240C00741128 /* IConfigListener.cpp */; }; + D584928714FD240D00741128 /* IConfigListener.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D584928414FD240C00741128 /* IConfigListener.cpp */; }; + D584928914FD2FAF00741128 /* Path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D584928814FD2FAF00741128 /* Path.cpp */; }; + D584928A14FD2FAF00741128 /* Path.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D584928814FD2FAF00741128 /* Path.cpp */; }; + D58BB46E146A0B910002C9F5 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = D5CF9C56144C225000E4244F /* main.mm */; }; + D58BB46F146A0B910002C9F5 /* minecraftpeAppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = D5CF9C5A144C225000E4244F /* minecraftpeAppDelegate.mm */; }; + D58BB470146A0B910002C9F5 /* EAGLView.m in Sources */ = {isa = PBXBuildFile; fileRef = D5CF9C64144C225000E4244F /* EAGLView.m */; }; + D58BB471146A0B910002C9F5 /* minecraftpeViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = D5CFA01C144C453900E4244F /* minecraftpeViewController.mm */; }; + D58BB53E146A0B910002C9F5 /* CreateNewWorldViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = D5A55E4814500EDE00A7571B /* CreateNewWorldViewController.mm */; }; + D58BB53F146A0B910002C9F5 /* BaseDialogController.mm in Sources */ = {isa = PBXBuildFile; fileRef = D5A55E4C145036AE00A7571B /* BaseDialogController.mm */; }; + D58BB540146A0B910002C9F5 /* IASKAppSettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F3B7A414548E7900D25470 /* IASKAppSettingsViewController.m */; }; + D58BB541146A0B910002C9F5 /* IASKAppSettingsWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F3B7A614548E7900D25470 /* IASKAppSettingsWebViewController.m */; }; + D58BB542146A0B910002C9F5 /* IASKSpecifierValuesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F3B7A814548E7900D25470 /* IASKSpecifierValuesViewController.m */; }; + D58BB543146A0B910002C9F5 /* IASKSettingsReader.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F3B7AB14548E7900D25470 /* IASKSettingsReader.m */; }; + D58BB544146A0B910002C9F5 /* IASKSettingsStore.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F3B7AD14548E7900D25470 /* IASKSettingsStore.m */; }; + D58BB545146A0B910002C9F5 /* IASKSettingsStoreFile.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F3B7AF14548E7900D25470 /* IASKSettingsStoreFile.m */; }; + D58BB546146A0B910002C9F5 /* IASKSettingsStoreUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F3B7B114548E7900D25470 /* IASKSettingsStoreUserDefaults.m */; }; + D58BB547146A0B910002C9F5 /* IASKSpecifier.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F3B7B314548E7900D25470 /* IASKSpecifier.m */; }; + D58BB548146A0B910002C9F5 /* IASKPSSliderSpecifierViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F3B7B614548E7900D25470 /* IASKPSSliderSpecifierViewCell.m */; }; + D58BB549146A0B910002C9F5 /* IASKPSTextFieldSpecifierViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F3B7B814548E7900D25470 /* IASKPSTextFieldSpecifierViewCell.m */; }; + D58BB54A146A0B910002C9F5 /* IASKPSTitleValueSpecifierViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F3B7BA14548E7900D25470 /* IASKPSTitleValueSpecifierViewCell.m */; }; + D58BB54B146A0B910002C9F5 /* IASKPSToggleSwitchSpecifierViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F3B7BC14548E7900D25470 /* IASKPSToggleSwitchSpecifierViewCell.m */; }; + D58BB54C146A0B910002C9F5 /* IASKSlider.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F3B7BE14548E7900D25470 /* IASKSlider.m */; }; + D58BB54D146A0B910002C9F5 /* IASKSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F3B7C014548E7900D25470 /* IASKSwitch.m */; }; + D58BB54E146A0B910002C9F5 /* IASKTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F3B7C214548E7900D25470 /* IASKTextField.m */; }; + D58BB550146A0B910002C9F5 /* PVRTexture.m in Sources */ = {isa = PBXBuildFile; fileRef = D51DC74214592B8A00E3D761 /* PVRTexture.m */; }; + D58BB553146A0B920002C9F5 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5F07738145EB1F300EC30FB /* AVFoundation.framework */; }; + D58BB554146A0B920002C9F5 /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5F07736145DE04200EC30FB /* OpenAL.framework */; }; + D58BB555146A0B920002C9F5 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D572D3DF144CB23200E67862 /* AudioToolbox.framework */; }; + D58BB556146A0B920002C9F5 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5CF9C46144C225000E4244F /* UIKit.framework */; }; + D58BB557146A0B920002C9F5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5CF9C48144C225000E4244F /* Foundation.framework */; }; + D58BB558146A0B920002C9F5 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5CF9C4A144C225000E4244F /* CoreGraphics.framework */; }; + D58BB559146A0B920002C9F5 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5CF9C4C144C225000E4244F /* QuartzCore.framework */; }; + D58BB55A146A0B920002C9F5 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5CF9C4E144C225000E4244F /* OpenGLES.framework */; }; + D58BB55C146A0B920002C9F5 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = D5CF9C53144C225000E4244F /* InfoPlist.strings */; }; + D58BB55D146A0B920002C9F5 /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = D5CF9C5C144C225000E4244F /* MainWindow.xib */; }; + D58BB55E146A0B920002C9F5 /* minecraftpeViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = D5CF9C69144C225000E4244F /* minecraftpeViewController.xib */; }; + D58BB57A146A0B920002C9F5 /* default8.png in Resources */ = {isa = PBXBuildFile; fileRef = D572D3AD144C6A1400E67862 /* default8.png */; }; + D58BB57B146A0B920002C9F5 /* background.png in Resources */ = {isa = PBXBuildFile; fileRef = D572D3AF144C6A1400E67862 /* background.png */; }; + D58BB57E146A0B920002C9F5 /* default_world.png in Resources */ = {isa = PBXBuildFile; fileRef = D572D3B3144C6A1400E67862 /* default_world.png */; }; + D58BB581146A0B920002C9F5 /* gui.png in Resources */ = {isa = PBXBuildFile; fileRef = D572D3B6144C6A1400E67862 /* gui.png */; }; + D58BB582146A0B920002C9F5 /* gui_blocks.png in Resources */ = {isa = PBXBuildFile; fileRef = D572D3B7144C6A1400E67862 /* gui_blocks.png */; }; + D58BB583146A0B920002C9F5 /* icons.png in Resources */ = {isa = PBXBuildFile; fileRef = D572D3B8144C6A1400E67862 /* icons.png */; }; + D58BB584146A0B920002C9F5 /* items.png in Resources */ = {isa = PBXBuildFile; fileRef = D572D3B9144C6A1400E67862 /* items.png */; }; + D58BB58A146A0B920002C9F5 /* title.png in Resources */ = {isa = PBXBuildFile; fileRef = D572D3C1144C6A1400E67862 /* title.png */; }; + D58BB58B146A0B920002C9F5 /* touchgui.png in Resources */ = {isa = PBXBuildFile; fileRef = D572D3C2144C6A1400E67862 /* touchgui.png */; }; + D58BB58C146A0B920002C9F5 /* camera.png in Resources */ = {isa = PBXBuildFile; fileRef = D572D3C4144C6A1400E67862 /* camera.png */; }; + D58BB58D146A0B920002C9F5 /* char.png in Resources */ = {isa = PBXBuildFile; fileRef = D572D3C6144C6A1400E67862 /* char.png */; }; + D58BB58E146A0B920002C9F5 /* particles.png in Resources */ = {isa = PBXBuildFile; fileRef = D572D3C7144C6A1400E67862 /* particles.png */; }; + D58BB58F146A0B920002C9F5 /* terrain.png in Resources */ = {isa = PBXBuildFile; fileRef = D572D3C8144C6A1400E67862 /* terrain.png */; }; + D58BB590146A0B920002C9F5 /* bg32.png in Resources */ = {isa = PBXBuildFile; fileRef = D5A55E4E1450761600A7571B /* bg32.png */; }; + D58BB591146A0B920002C9F5 /* CreateNewWorld_ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = D5BFCF1A14513FF400A443B0 /* CreateNewWorld_ipad.xib */; }; + D58BB592146A0B920002C9F5 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D5E1BA9A1451C8A0007DCC4F /* Default@2x.png */; }; + D58BB593146A0B920002C9F5 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = D5E1BA981451C881007DCC4F /* Default.png */; }; + D58BB594146A0B920002C9F5 /* IASKAppSettingsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D5F3B7C414548E7900D25470 /* IASKAppSettingsView.xib */; }; + D58BB595146A0B920002C9F5 /* IASKAppSettingsWebView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D5F3B7C514548E7900D25470 /* IASKAppSettingsWebView.xib */; }; + D58BB596146A0B920002C9F5 /* IASKPSSliderSpecifierViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = D5F3B7C614548E7900D25470 /* IASKPSSliderSpecifierViewCell.xib */; }; + D58BB597146A0B920002C9F5 /* IASKPSTextFieldSpecifierViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = D5F3B7C714548E7900D25470 /* IASKPSTextFieldSpecifierViewCell.xib */; }; + D58BB598146A0B920002C9F5 /* IASKPSToggleSwitchSpecifierViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = D5F3B7C814548E7900D25470 /* IASKPSToggleSwitchSpecifierViewCell.xib */; }; + D58BB599146A0B920002C9F5 /* IASKSpecifierValuesView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D5F3B7C914548E7900D25470 /* IASKSpecifierValuesView.xib */; }; + D58BB59A146A0B920002C9F5 /* InAppSettings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = D5F3B7E41454930400D25470 /* InAppSettings.bundle */; }; + D58BB59B146A0B920002C9F5 /* itemframe.png in Resources */ = {isa = PBXBuildFile; fileRef = D51DC73514581D4E00E3D761 /* itemframe.png */; }; + D58BB59C146A0B920002C9F5 /* terrain.pvr in Resources */ = {isa = PBXBuildFile; fileRef = D55B201714595370002D9366 /* terrain.pvr */; }; + D58BB59D146A0B920002C9F5 /* terrain.pvrtc in Resources */ = {isa = PBXBuildFile; fileRef = D55B252A14598227002D9366 /* terrain.pvrtc */; }; + D58BB59E146A0B920002C9F5 /* terrain.pvr4 in Resources */ = {isa = PBXBuildFile; fileRef = D5F0772214599DC700EC30FB /* terrain.pvr4 */; }; + D58BB5A3146A0B920002C9F5 /* Default-Landscape~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = D5F07744145EF79B00EC30FB /* Default-Landscape~ipad.png */; }; + D58BB5A8146A0B920002C9F5 /* bg64.png in Resources */ = {isa = PBXBuildFile; fileRef = D5912008145FE9E600AE2E58 /* bg64.png */; }; + D58BB5A9146A0B920002C9F5 /* bg128.png in Resources */ = {isa = PBXBuildFile; fileRef = D591200A145FEB8C00AE2E58 /* bg128.png */; }; + D58BB5AA146A0B920002C9F5 /* minecraft.ttf in Resources */ = {isa = PBXBuildFile; fileRef = D591200E1460041300AE2E58 /* minecraft.ttf */; }; + D58BB5AB146A0B920002C9F5 /* CreateNewWorld_iphone5.xib in Resources */ = {isa = PBXBuildFile; fileRef = D593755014611CF200543145 /* CreateNewWorld_iphone5.xib */; }; + D5912009145FE9E600AE2E58 /* bg64.png in Resources */ = {isa = PBXBuildFile; fileRef = D5912008145FE9E600AE2E58 /* bg64.png */; }; + D591200B145FEB8C00AE2E58 /* bg128.png in Resources */ = {isa = PBXBuildFile; fileRef = D591200A145FEB8C00AE2E58 /* bg128.png */; }; + D591200F1460041300AE2E58 /* minecraft.ttf in Resources */ = {isa = PBXBuildFile; fileRef = D591200E1460041300AE2E58 /* minecraft.ttf */; }; + D593325516077BBB00E26FC5 /* RenameMPWorld_iphone5.xib in Resources */ = {isa = PBXBuildFile; fileRef = D593325416077BBB00E26FC5 /* RenameMPWorld_iphone5.xib */; }; + D593325616077BBB00E26FC5 /* RenameMPWorld_iphone5.xib in Resources */ = {isa = PBXBuildFile; fileRef = D593325416077BBB00E26FC5 /* RenameMPWorld_iphone5.xib */; }; + D593755114611CF300543145 /* CreateNewWorld_iphone5.xib in Resources */ = {isa = PBXBuildFile; fileRef = D593755014611CF200543145 /* CreateNewWorld_iphone5.xib */; }; + D5951EC7159347EE0043A12A /* FurnaceRecipes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5951EC4159347EE0043A12A /* FurnaceRecipes.cpp */; }; + D5951EC8159347EE0043A12A /* FurnaceRecipes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5951EC4159347EE0043A12A /* FurnaceRecipes.cpp */; }; + D5951EC9159347EE0043A12A /* OreRecipes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5951EC6159347EE0043A12A /* OreRecipes.cpp */; }; + D5951ECA159347EE0043A12A /* OreRecipes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5951EC6159347EE0043A12A /* OreRecipes.cpp */; }; + D5951EDB159348C50043A12A /* InventoryPane.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5951ED6159348C50043A12A /* InventoryPane.cpp */; }; + D5951EDC159348C50043A12A /* InventoryPane.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5951ED6159348C50043A12A /* InventoryPane.cpp */; }; + D5951EDD159348C50043A12A /* ItemPane.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5951ED8159348C50043A12A /* ItemPane.cpp */; }; + D5951EDE159348C50043A12A /* ItemPane.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5951ED8159348C50043A12A /* ItemPane.cpp */; }; + D5951EE3159349000043A12A /* FurnaceTile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5951EE1159349000043A12A /* FurnaceTile.cpp */; }; + D5951EE4159349000043A12A /* FurnaceTile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5951EE1159349000043A12A /* FurnaceTile.cpp */; }; + D5951EE8159349100043A12A /* FurnaceTileEntity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5951EE5159349100043A12A /* FurnaceTileEntity.cpp */; }; + D5951EE9159349100043A12A /* FurnaceTileEntity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5951EE5159349100043A12A /* FurnaceTileEntity.cpp */; }; + D5951EEA159349100043A12A /* TileEntity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5951EE7159349100043A12A /* TileEntity.cpp */; }; + D5951EEB159349100043A12A /* TileEntity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5951EE7159349100043A12A /* TileEntity.cpp */; }; + D5951EEE159349680043A12A /* FurnaceScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5951EEC159349680043A12A /* FurnaceScreen.cpp */; }; + D5951EEF159349680043A12A /* FurnaceScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5951EEC159349680043A12A /* FurnaceScreen.cpp */; }; + D5951EF115934A2D0043A12A /* Feature.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5951EF015934A2D0043A12A /* Feature.cpp */; }; + D5951EF215934A2D0043A12A /* Feature.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5951EF015934A2D0043A12A /* Feature.cpp */; }; + D5951EF715934AC50043A12A /* BaseContainerMenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5951EF315934AC50043A12A /* BaseContainerMenu.cpp */; }; + D5951EF815934AC50043A12A /* BaseContainerMenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5951EF315934AC50043A12A /* BaseContainerMenu.cpp */; }; + D5951EF915934AC50043A12A /* FurnaceMenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5951EF515934AC50043A12A /* FurnaceMenu.cpp */; }; + D5951EFA15934AC50043A12A /* FurnaceMenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5951EF515934AC50043A12A /* FurnaceMenu.cpp */; }; + D598BD6D163ED06400A36438 /* explode.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D598BD6C163ED06400A36438 /* explode.m4a */; }; + D598BD6E163ED06400A36438 /* explode.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D598BD6C163ED06400A36438 /* explode.m4a */; }; + D598BD7A163ED09800A36438 /* zpig1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D598BD6F163ED09800A36438 /* zpig1.m4a */; }; + D598BD7B163ED09800A36438 /* zpig1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D598BD6F163ED09800A36438 /* zpig1.m4a */; }; + D598BD7C163ED09800A36438 /* zpig2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D598BD70163ED09800A36438 /* zpig2.m4a */; }; + D598BD7D163ED09800A36438 /* zpig2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D598BD70163ED09800A36438 /* zpig2.m4a */; }; + D598BD7E163ED09800A36438 /* zpig3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D598BD71163ED09800A36438 /* zpig3.m4a */; }; + D598BD7F163ED09800A36438 /* zpig3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D598BD71163ED09800A36438 /* zpig3.m4a */; }; + D598BD80163ED09800A36438 /* zpig4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D598BD72163ED09800A36438 /* zpig4.m4a */; }; + D598BD81163ED09800A36438 /* zpig4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D598BD72163ED09800A36438 /* zpig4.m4a */; }; + D598BD82163ED09800A36438 /* zpigangry1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D598BD73163ED09800A36438 /* zpigangry1.m4a */; }; + D598BD83163ED09800A36438 /* zpigangry1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D598BD73163ED09800A36438 /* zpigangry1.m4a */; }; + D598BD84163ED09800A36438 /* zpigangry2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D598BD74163ED09800A36438 /* zpigangry2.m4a */; }; + D598BD85163ED09800A36438 /* zpigangry2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D598BD74163ED09800A36438 /* zpigangry2.m4a */; }; + D598BD86163ED09800A36438 /* zpigangry3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D598BD75163ED09800A36438 /* zpigangry3.m4a */; }; + D598BD87163ED09800A36438 /* zpigangry3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D598BD75163ED09800A36438 /* zpigangry3.m4a */; }; + D598BD88163ED09800A36438 /* zpigangry4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D598BD76163ED09800A36438 /* zpigangry4.m4a */; }; + D598BD89163ED09800A36438 /* zpigangry4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D598BD76163ED09800A36438 /* zpigangry4.m4a */; }; + D598BD8A163ED09800A36438 /* zpigdeath.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D598BD77163ED09800A36438 /* zpigdeath.m4a */; }; + D598BD8B163ED09800A36438 /* zpigdeath.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D598BD77163ED09800A36438 /* zpigdeath.m4a */; }; + D598BD8C163ED09800A36438 /* zpighurt1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D598BD78163ED09800A36438 /* zpighurt1.m4a */; }; + D598BD8D163ED09800A36438 /* zpighurt1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D598BD78163ED09800A36438 /* zpighurt1.m4a */; }; + D598BD8E163ED09800A36438 /* zpighurt2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D598BD79163ED09800A36438 /* zpighurt2.m4a */; }; + D598BD8F163ED09800A36438 /* zpighurt2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D598BD79163ED09800A36438 /* zpighurt2.m4a */; }; + D598BD91163ED0DB00A36438 /* sign.png in Resources */ = {isa = PBXBuildFile; fileRef = D598BD90163ED0DB00A36438 /* sign.png */; }; + D598BD92163ED0DB00A36438 /* sign.png in Resources */ = {isa = PBXBuildFile; fileRef = D598BD90163ED0DB00A36438 /* sign.png */; }; + D598BD94163ED14000A36438 /* pigzombie.png in Resources */ = {isa = PBXBuildFile; fileRef = D598BD93163ED14000A36438 /* pigzombie.png */; }; + D598BD95163ED14000A36438 /* pigzombie.png in Resources */ = {isa = PBXBuildFile; fileRef = D598BD93163ED14000A36438 /* pigzombie.png */; }; + D598BD98163ED26500A36438 /* kz.png in Resources */ = {isa = PBXBuildFile; fileRef = D598BD97163ED26500A36438 /* kz.png */; }; + D598BD99163ED26500A36438 /* kz.png in Resources */ = {isa = PBXBuildFile; fileRef = D598BD97163ED26500A36438 /* kz.png */; }; + D598BD9D164157D500A36438 /* minecon140.png in Resources */ = {isa = PBXBuildFile; fileRef = D598BD9C164157D500A36438 /* minecon140.png */; }; + D598BD9E164157D500A36438 /* minecon140.png in Resources */ = {isa = PBXBuildFile; fileRef = D598BD9C164157D500A36438 /* minecon140.png */; }; + D5A55E4914500EDE00A7571B /* CreateNewWorldViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = D5A55E4814500EDE00A7571B /* CreateNewWorldViewController.mm */; }; + D5A55E4D145036AE00A7571B /* BaseDialogController.mm in Sources */ = {isa = PBXBuildFile; fileRef = D5A55E4C145036AE00A7571B /* BaseDialogController.mm */; }; + D5A55E4F1450761600A7571B /* bg32.png in Resources */ = {isa = PBXBuildFile; fileRef = D5A55E4E1450761600A7571B /* bg32.png */; }; + D5A6F8D115B45E2600819B71 /* ChestScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5A6F8CF15B45E2600819B71 /* ChestScreen.cpp */; }; + D5A6F8D215B45E2600819B71 /* ChestScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5A6F8CF15B45E2600819B71 /* ChestScreen.cpp */; }; + D5A6F8D615B45EE500819B71 /* ContainerMenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5A6F8D415B45EE500819B71 /* ContainerMenu.cpp */; }; + D5A6F8D715B45EE500819B71 /* ContainerMenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5A6F8D415B45EE500819B71 /* ContainerMenu.cpp */; }; + D5ACF15615C01F7D00E21C22 /* ArrowRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5ACF15415C01F7D00E21C22 /* ArrowRenderer.cpp */; }; + D5ACF15715C01F7D00E21C22 /* ArrowRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5ACF15415C01F7D00E21C22 /* ArrowRenderer.cpp */; }; + D5ACF17815C0220D00E21C22 /* Creeper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5ACF16D15C0220D00E21C22 /* Creeper.cpp */; }; + D5ACF17915C0220D00E21C22 /* Creeper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5ACF16D15C0220D00E21C22 /* Creeper.cpp */; }; + D5ACF17A15C0220D00E21C22 /* Monster.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5ACF16F15C0220D00E21C22 /* Monster.cpp */; }; + D5ACF17B15C0220D00E21C22 /* Monster.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5ACF16F15C0220D00E21C22 /* Monster.cpp */; }; + D5ACF17C15C0220D00E21C22 /* Skeleton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5ACF17215C0220D00E21C22 /* Skeleton.cpp */; }; + D5ACF17D15C0220D00E21C22 /* Skeleton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5ACF17215C0220D00E21C22 /* Skeleton.cpp */; }; + D5ACF17E15C0220D00E21C22 /* Spider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5ACF17415C0220D00E21C22 /* Spider.cpp */; }; + D5ACF17F15C0220D00E21C22 /* Spider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5ACF17415C0220D00E21C22 /* Spider.cpp */; }; + D5ACF18015C0220D00E21C22 /* Zombie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5ACF17615C0220D00E21C22 /* Zombie.cpp */; }; + D5ACF18115C0220D00E21C22 /* Zombie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5ACF17615C0220D00E21C22 /* Zombie.cpp */; }; + D5ACF18415C022B500E21C22 /* EntityFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5ACF18215C022B500E21C22 /* EntityFactory.cpp */; }; + D5ACF18515C022B500E21C22 /* EntityFactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5ACF18215C022B500E21C22 /* EntityFactory.cpp */; }; + D5ACF1E115C03DBF00E21C22 /* fallbig1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF18815C03DBF00E21C22 /* fallbig1.m4a */; }; + D5ACF1E215C03DBF00E21C22 /* fallbig1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF18815C03DBF00E21C22 /* fallbig1.m4a */; }; + D5ACF1E315C03DBF00E21C22 /* fallbig2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF18915C03DBF00E21C22 /* fallbig2.m4a */; }; + D5ACF1E415C03DBF00E21C22 /* fallbig2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF18915C03DBF00E21C22 /* fallbig2.m4a */; }; + D5ACF1E515C03DBF00E21C22 /* fallsmall.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF18A15C03DBF00E21C22 /* fallsmall.m4a */; }; + D5ACF1E615C03DBF00E21C22 /* fallsmall.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF18A15C03DBF00E21C22 /* fallsmall.m4a */; }; + D5ACF1E715C03DBF00E21C22 /* chicken1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF18C15C03DBF00E21C22 /* chicken1.m4a */; }; + D5ACF1E815C03DBF00E21C22 /* chicken1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF18C15C03DBF00E21C22 /* chicken1.m4a */; }; + D5ACF1E915C03DBF00E21C22 /* chicken2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF18D15C03DBF00E21C22 /* chicken2.m4a */; }; + D5ACF1EA15C03DBF00E21C22 /* chicken2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF18D15C03DBF00E21C22 /* chicken2.m4a */; }; + D5ACF1EB15C03DBF00E21C22 /* chicken3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF18E15C03DBF00E21C22 /* chicken3.m4a */; }; + D5ACF1EC15C03DBF00E21C22 /* chicken3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF18E15C03DBF00E21C22 /* chicken3.m4a */; }; + D5ACF1ED15C03DBF00E21C22 /* chickenhurt1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF18F15C03DBF00E21C22 /* chickenhurt1.m4a */; }; + D5ACF1EE15C03DBF00E21C22 /* chickenhurt1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF18F15C03DBF00E21C22 /* chickenhurt1.m4a */; }; + D5ACF1EF15C03DBF00E21C22 /* chickenhurt2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19015C03DBF00E21C22 /* chickenhurt2.m4a */; }; + D5ACF1F015C03DBF00E21C22 /* chickenhurt2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19015C03DBF00E21C22 /* chickenhurt2.m4a */; }; + D5ACF1F115C03DBF00E21C22 /* chickenplop.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19115C03DBF00E21C22 /* chickenplop.m4a */; }; + D5ACF1F215C03DBF00E21C22 /* chickenplop.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19115C03DBF00E21C22 /* chickenplop.m4a */; }; + D5ACF1F315C03DBF00E21C22 /* cow1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19215C03DBF00E21C22 /* cow1.m4a */; }; + D5ACF1F415C03DBF00E21C22 /* cow1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19215C03DBF00E21C22 /* cow1.m4a */; }; + D5ACF1F515C03DBF00E21C22 /* cow2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19315C03DBF00E21C22 /* cow2.m4a */; }; + D5ACF1F615C03DBF00E21C22 /* cow2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19315C03DBF00E21C22 /* cow2.m4a */; }; + D5ACF1F715C03DBF00E21C22 /* cow3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19415C03DBF00E21C22 /* cow3.m4a */; }; + D5ACF1F815C03DBF00E21C22 /* cow3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19415C03DBF00E21C22 /* cow3.m4a */; }; + D5ACF1F915C03DBF00E21C22 /* cow4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19515C03DBF00E21C22 /* cow4.m4a */; }; + D5ACF1FA15C03DBF00E21C22 /* cow4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19515C03DBF00E21C22 /* cow4.m4a */; }; + D5ACF1FB15C03DBF00E21C22 /* cowhurt1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19615C03DBF00E21C22 /* cowhurt1.m4a */; }; + D5ACF1FC15C03DBF00E21C22 /* cowhurt1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19615C03DBF00E21C22 /* cowhurt1.m4a */; }; + D5ACF1FD15C03DBF00E21C22 /* cowhurt2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19715C03DBF00E21C22 /* cowhurt2.m4a */; }; + D5ACF1FE15C03DBF00E21C22 /* cowhurt2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19715C03DBF00E21C22 /* cowhurt2.m4a */; }; + D5ACF1FF15C03DBF00E21C22 /* cowhurt3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19815C03DBF00E21C22 /* cowhurt3.m4a */; }; + D5ACF20015C03DBF00E21C22 /* cowhurt3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19815C03DBF00E21C22 /* cowhurt3.m4a */; }; + D5ACF20115C03DBF00E21C22 /* pig1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19915C03DBF00E21C22 /* pig1.m4a */; }; + D5ACF20215C03DBF00E21C22 /* pig1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19915C03DBF00E21C22 /* pig1.m4a */; }; + D5ACF20315C03DBF00E21C22 /* pig2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19A15C03DBF00E21C22 /* pig2.m4a */; }; + D5ACF20415C03DBF00E21C22 /* pig2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19A15C03DBF00E21C22 /* pig2.m4a */; }; + D5ACF20515C03DBF00E21C22 /* pig3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19B15C03DBF00E21C22 /* pig3.m4a */; }; + D5ACF20615C03DBF00E21C22 /* pig3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19B15C03DBF00E21C22 /* pig3.m4a */; }; + D5ACF20715C03DBF00E21C22 /* pigdeath.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19C15C03DBF00E21C22 /* pigdeath.m4a */; }; + D5ACF20815C03DBF00E21C22 /* pigdeath.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19C15C03DBF00E21C22 /* pigdeath.m4a */; }; + D5ACF20915C03DBF00E21C22 /* sheep1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19D15C03DBF00E21C22 /* sheep1.m4a */; }; + D5ACF20A15C03DBF00E21C22 /* sheep1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19D15C03DBF00E21C22 /* sheep1.m4a */; }; + D5ACF20B15C03DBF00E21C22 /* sheep2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19E15C03DBF00E21C22 /* sheep2.m4a */; }; + D5ACF20C15C03DBF00E21C22 /* sheep2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19E15C03DBF00E21C22 /* sheep2.m4a */; }; + D5ACF20D15C03DBF00E21C22 /* sheep3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19F15C03DBF00E21C22 /* sheep3.m4a */; }; + D5ACF20E15C03DBF00E21C22 /* sheep3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF19F15C03DBF00E21C22 /* sheep3.m4a */; }; + D5ACF20F15C03DBF00E21C22 /* skeleton1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1A015C03DBF00E21C22 /* skeleton1.m4a */; }; + D5ACF21015C03DBF00E21C22 /* skeleton1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1A015C03DBF00E21C22 /* skeleton1.m4a */; }; + D5ACF21115C03DBF00E21C22 /* skeleton2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1A115C03DBF00E21C22 /* skeleton2.m4a */; }; + D5ACF21215C03DBF00E21C22 /* skeleton2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1A115C03DBF00E21C22 /* skeleton2.m4a */; }; + D5ACF21315C03DBF00E21C22 /* skeleton3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1A215C03DBF00E21C22 /* skeleton3.m4a */; }; + D5ACF21415C03DBF00E21C22 /* skeleton3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1A215C03DBF00E21C22 /* skeleton3.m4a */; }; + D5ACF21515C03DBF00E21C22 /* skeletonhurt1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1A315C03DBF00E21C22 /* skeletonhurt1.m4a */; }; + D5ACF21615C03DBF00E21C22 /* skeletonhurt1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1A315C03DBF00E21C22 /* skeletonhurt1.m4a */; }; + D5ACF21715C03DBF00E21C22 /* skeletonhurt2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1A415C03DBF00E21C22 /* skeletonhurt2.m4a */; }; + D5ACF21815C03DBF00E21C22 /* skeletonhurt2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1A415C03DBF00E21C22 /* skeletonhurt2.m4a */; }; + D5ACF21915C03DBF00E21C22 /* skeletonhurt3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1A515C03DBF00E21C22 /* skeletonhurt3.m4a */; }; + D5ACF21A15C03DBF00E21C22 /* skeletonhurt3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1A515C03DBF00E21C22 /* skeletonhurt3.m4a */; }; + D5ACF21B15C03DBF00E21C22 /* skeletonhurt4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1A615C03DBF00E21C22 /* skeletonhurt4.m4a */; }; + D5ACF21C15C03DBF00E21C22 /* skeletonhurt4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1A615C03DBF00E21C22 /* skeletonhurt4.m4a */; }; + D5ACF21D15C03DBF00E21C22 /* spider1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1A715C03DBF00E21C22 /* spider1.m4a */; }; + D5ACF21E15C03DBF00E21C22 /* spider1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1A715C03DBF00E21C22 /* spider1.m4a */; }; + D5ACF21F15C03DBF00E21C22 /* spider2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1A815C03DBF00E21C22 /* spider2.m4a */; }; + D5ACF22015C03DBF00E21C22 /* spider2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1A815C03DBF00E21C22 /* spider2.m4a */; }; + D5ACF22115C03DBF00E21C22 /* spider3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1A915C03DBF00E21C22 /* spider3.m4a */; }; + D5ACF22215C03DBF00E21C22 /* spider3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1A915C03DBF00E21C22 /* spider3.m4a */; }; + D5ACF22315C03DBF00E21C22 /* spider4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1AA15C03DBF00E21C22 /* spider4.m4a */; }; + D5ACF22415C03DBF00E21C22 /* spider4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1AA15C03DBF00E21C22 /* spider4.m4a */; }; + D5ACF22515C03DBF00E21C22 /* zombie1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1AB15C03DBF00E21C22 /* zombie1.m4a */; }; + D5ACF22615C03DBF00E21C22 /* zombie1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1AB15C03DBF00E21C22 /* zombie1.m4a */; }; + D5ACF22715C03DBF00E21C22 /* zombie2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1AC15C03DBF00E21C22 /* zombie2.m4a */; }; + D5ACF22815C03DBF00E21C22 /* zombie2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1AC15C03DBF00E21C22 /* zombie2.m4a */; }; + D5ACF22915C03DBF00E21C22 /* zombie3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1AD15C03DBF00E21C22 /* zombie3.m4a */; }; + D5ACF22A15C03DBF00E21C22 /* zombie3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1AD15C03DBF00E21C22 /* zombie3.m4a */; }; + D5ACF22B15C03DBF00E21C22 /* zombiedeath.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1AE15C03DBF00E21C22 /* zombiedeath.m4a */; }; + D5ACF22C15C03DBF00E21C22 /* zombiedeath.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1AE15C03DBF00E21C22 /* zombiedeath.m4a */; }; + D5ACF22D15C03DBF00E21C22 /* zombiehurt1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1AF15C03DBF00E21C22 /* zombiehurt1.m4a */; }; + D5ACF22E15C03DBF00E21C22 /* zombiehurt1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1AF15C03DBF00E21C22 /* zombiehurt1.m4a */; }; + D5ACF22F15C03DBF00E21C22 /* zombiehurt2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1B015C03DBF00E21C22 /* zombiehurt2.m4a */; }; + D5ACF23015C03DBF00E21C22 /* zombiehurt2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1B015C03DBF00E21C22 /* zombiehurt2.m4a */; }; + D5ACF23115C03DBF00E21C22 /* bow.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1B215C03DBF00E21C22 /* bow.m4a */; }; + D5ACF23215C03DBF00E21C22 /* bow.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1B215C03DBF00E21C22 /* bow.m4a */; }; + D5ACF23315C03DBF00E21C22 /* bowhit1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1B315C03DBF00E21C22 /* bowhit1.m4a */; }; + D5ACF23415C03DBF00E21C22 /* bowhit1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1B315C03DBF00E21C22 /* bowhit1.m4a */; }; + D5ACF23515C03DBF00E21C22 /* bowhit2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1B415C03DBF00E21C22 /* bowhit2.m4a */; }; + D5ACF23615C03DBF00E21C22 /* bowhit2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1B415C03DBF00E21C22 /* bowhit2.m4a */; }; + D5ACF23715C03DBF00E21C22 /* bowhit3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1B515C03DBF00E21C22 /* bowhit3.m4a */; }; + D5ACF23815C03DBF00E21C22 /* bowhit3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1B515C03DBF00E21C22 /* bowhit3.m4a */; }; + D5ACF23915C03DBF00E21C22 /* bowhit4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1B615C03DBF00E21C22 /* bowhit4.m4a */; }; + D5ACF23A15C03DBF00E21C22 /* bowhit4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1B615C03DBF00E21C22 /* bowhit4.m4a */; }; + D5ACF23B15C03DBF00E21C22 /* click.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1B715C03DBF00E21C22 /* click.m4a */; }; + D5ACF23C15C03DBF00E21C22 /* click.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1B715C03DBF00E21C22 /* click.m4a */; }; + D5ACF23D15C03DBF00E21C22 /* door_close.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1B815C03DBF00E21C22 /* door_close.m4a */; }; + D5ACF23E15C03DBF00E21C22 /* door_close.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1B815C03DBF00E21C22 /* door_close.m4a */; }; + D5ACF23F15C03DBF00E21C22 /* door_open.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1B915C03DBF00E21C22 /* door_open.m4a */; }; + D5ACF24015C03DBF00E21C22 /* door_open.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1B915C03DBF00E21C22 /* door_open.m4a */; }; + D5ACF24115C03DBF00E21C22 /* glass1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1BA15C03DBF00E21C22 /* glass1.m4a */; }; + D5ACF24215C03DBF00E21C22 /* glass1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1BA15C03DBF00E21C22 /* glass1.m4a */; }; + D5ACF24315C03DBF00E21C22 /* glass2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1BB15C03DBF00E21C22 /* glass2.m4a */; }; + D5ACF24415C03DBF00E21C22 /* glass2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1BB15C03DBF00E21C22 /* glass2.m4a */; }; + D5ACF24515C03DBF00E21C22 /* glass3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1BC15C03DBF00E21C22 /* glass3.m4a */; }; + D5ACF24615C03DBF00E21C22 /* glass3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1BC15C03DBF00E21C22 /* glass3.m4a */; }; + D5ACF24715C03DBF00E21C22 /* hurt.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1BD15C03DBF00E21C22 /* hurt.m4a */; }; + D5ACF24815C03DBF00E21C22 /* hurt.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1BD15C03DBF00E21C22 /* hurt.m4a */; }; + D5ACF24915C03DBF00E21C22 /* pop.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1BE15C03DBF00E21C22 /* pop.m4a */; }; + D5ACF24A15C03DBF00E21C22 /* pop.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1BE15C03DBF00E21C22 /* pop.m4a */; }; + D5ACF24B15C03DBF00E21C22 /* splash.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1BF15C03DBF00E21C22 /* splash.m4a */; }; + D5ACF24C15C03DBF00E21C22 /* splash.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1BF15C03DBF00E21C22 /* splash.m4a */; }; + D5ACF24D15C03DBF00E21C22 /* water.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1C015C03DBF00E21C22 /* water.m4a */; }; + D5ACF24E15C03DBF00E21C22 /* water.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1C015C03DBF00E21C22 /* water.m4a */; }; + D5ACF24F15C03DBF00E21C22 /* cloth1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1C215C03DBF00E21C22 /* cloth1.m4a */; }; + D5ACF25015C03DBF00E21C22 /* cloth1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1C215C03DBF00E21C22 /* cloth1.m4a */; }; + D5ACF25115C03DBF00E21C22 /* cloth2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1C315C03DBF00E21C22 /* cloth2.m4a */; }; + D5ACF25215C03DBF00E21C22 /* cloth2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1C315C03DBF00E21C22 /* cloth2.m4a */; }; + D5ACF25315C03DBF00E21C22 /* cloth3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1C415C03DBF00E21C22 /* cloth3.m4a */; }; + D5ACF25415C03DBF00E21C22 /* cloth3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1C415C03DBF00E21C22 /* cloth3.m4a */; }; + D5ACF25515C03DBF00E21C22 /* cloth4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1C515C03DBF00E21C22 /* cloth4.m4a */; }; + D5ACF25615C03DBF00E21C22 /* cloth4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1C515C03DBF00E21C22 /* cloth4.m4a */; }; + D5ACF25715C03DBF00E21C22 /* grass1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1C615C03DBF00E21C22 /* grass1.m4a */; }; + D5ACF25815C03DBF00E21C22 /* grass1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1C615C03DBF00E21C22 /* grass1.m4a */; }; + D5ACF25915C03DBF00E21C22 /* grass2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1C715C03DBF00E21C22 /* grass2.m4a */; }; + D5ACF25A15C03DBF00E21C22 /* grass2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1C715C03DBF00E21C22 /* grass2.m4a */; }; + D5ACF25B15C03DBF00E21C22 /* grass3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1C815C03DBF00E21C22 /* grass3.m4a */; }; + D5ACF25C15C03DBF00E21C22 /* grass3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1C815C03DBF00E21C22 /* grass3.m4a */; }; + D5ACF25D15C03DBF00E21C22 /* grass4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1C915C03DBF00E21C22 /* grass4.m4a */; }; + D5ACF25E15C03DBF00E21C22 /* grass4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1C915C03DBF00E21C22 /* grass4.m4a */; }; + D5ACF25F15C03DBF00E21C22 /* gravel2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1CA15C03DBF00E21C22 /* gravel2.m4a */; }; + D5ACF26015C03DBF00E21C22 /* gravel2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1CA15C03DBF00E21C22 /* gravel2.m4a */; }; + D5ACF26115C03DBF00E21C22 /* gravel3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1CB15C03DBF00E21C22 /* gravel3.m4a */; }; + D5ACF26215C03DBF00E21C22 /* gravel3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1CB15C03DBF00E21C22 /* gravel3.m4a */; }; + D5ACF26315C03DBF00E21C22 /* gravel4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1CC15C03DBF00E21C22 /* gravel4.m4a */; }; + D5ACF26415C03DBF00E21C22 /* gravel4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1CC15C03DBF00E21C22 /* gravel4.m4a */; }; + D5ACF26515C03DBF00E21C22 /* ladder1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1CD15C03DBF00E21C22 /* ladder1.m4a */; }; + D5ACF26615C03DBF00E21C22 /* ladder1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1CD15C03DBF00E21C22 /* ladder1.m4a */; }; + D5ACF26715C03DBF00E21C22 /* ladder2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1CE15C03DBF00E21C22 /* ladder2.m4a */; }; + D5ACF26815C03DBF00E21C22 /* ladder2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1CE15C03DBF00E21C22 /* ladder2.m4a */; }; + D5ACF26915C03DBF00E21C22 /* ladder3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1CF15C03DBF00E21C22 /* ladder3.m4a */; }; + D5ACF26A15C03DBF00E21C22 /* ladder3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1CF15C03DBF00E21C22 /* ladder3.m4a */; }; + D5ACF26B15C03DBF00E21C22 /* ladder4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1D015C03DBF00E21C22 /* ladder4.m4a */; }; + D5ACF26C15C03DBF00E21C22 /* ladder4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1D015C03DBF00E21C22 /* ladder4.m4a */; }; + D5ACF26D15C03DBF00E21C22 /* sand1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1D115C03DBF00E21C22 /* sand1.m4a */; }; + D5ACF26E15C03DBF00E21C22 /* sand1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1D115C03DBF00E21C22 /* sand1.m4a */; }; + D5ACF26F15C03DBF00E21C22 /* sand2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1D215C03DBF00E21C22 /* sand2.m4a */; }; + D5ACF27015C03DBF00E21C22 /* sand2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1D215C03DBF00E21C22 /* sand2.m4a */; }; + D5ACF27115C03DBF00E21C22 /* sand3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1D315C03DBF00E21C22 /* sand3.m4a */; }; + D5ACF27215C03DBF00E21C22 /* sand3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1D315C03DBF00E21C22 /* sand3.m4a */; }; + D5ACF27315C03DBF00E21C22 /* sand4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1D415C03DBF00E21C22 /* sand4.m4a */; }; + D5ACF27415C03DBF00E21C22 /* sand4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1D415C03DBF00E21C22 /* sand4.m4a */; }; + D5ACF27515C03DBF00E21C22 /* snow1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1D515C03DBF00E21C22 /* snow1.m4a */; }; + D5ACF27615C03DBF00E21C22 /* snow1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1D515C03DBF00E21C22 /* snow1.m4a */; }; + D5ACF27715C03DBF00E21C22 /* snow2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1D615C03DBF00E21C22 /* snow2.m4a */; }; + D5ACF27815C03DBF00E21C22 /* snow2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1D615C03DBF00E21C22 /* snow2.m4a */; }; + D5ACF27915C03DBF00E21C22 /* snow3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1D715C03DBF00E21C22 /* snow3.m4a */; }; + D5ACF27A15C03DBF00E21C22 /* snow3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1D715C03DBF00E21C22 /* snow3.m4a */; }; + D5ACF27B15C03DBF00E21C22 /* snow4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1D815C03DBF00E21C22 /* snow4.m4a */; }; + D5ACF27C15C03DBF00E21C22 /* snow4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1D815C03DBF00E21C22 /* snow4.m4a */; }; + D5ACF27D15C03DBF00E21C22 /* stone1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1D915C03DBF00E21C22 /* stone1.m4a */; }; + D5ACF27E15C03DBF00E21C22 /* stone1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1D915C03DBF00E21C22 /* stone1.m4a */; }; + D5ACF27F15C03DBF00E21C22 /* stone2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1DA15C03DBF00E21C22 /* stone2.m4a */; }; + D5ACF28015C03DBF00E21C22 /* stone2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1DA15C03DBF00E21C22 /* stone2.m4a */; }; + D5ACF28115C03DBF00E21C22 /* stone3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1DB15C03DBF00E21C22 /* stone3.m4a */; }; + D5ACF28215C03DBF00E21C22 /* stone3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1DB15C03DBF00E21C22 /* stone3.m4a */; }; + D5ACF28315C03DBF00E21C22 /* stone4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1DC15C03DBF00E21C22 /* stone4.m4a */; }; + D5ACF28415C03DBF00E21C22 /* stone4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1DC15C03DBF00E21C22 /* stone4.m4a */; }; + D5ACF28515C03DBF00E21C22 /* wood1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1DD15C03DBF00E21C22 /* wood1.m4a */; }; + D5ACF28615C03DBF00E21C22 /* wood1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1DD15C03DBF00E21C22 /* wood1.m4a */; }; + D5ACF28715C03DBF00E21C22 /* wood2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1DE15C03DBF00E21C22 /* wood2.m4a */; }; + D5ACF28815C03DBF00E21C22 /* wood2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1DE15C03DBF00E21C22 /* wood2.m4a */; }; + D5ACF28915C03DBF00E21C22 /* wood3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1DF15C03DBF00E21C22 /* wood3.m4a */; }; + D5ACF28A15C03DBF00E21C22 /* wood3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1DF15C03DBF00E21C22 /* wood3.m4a */; }; + D5ACF28B15C03DBF00E21C22 /* wood4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1E015C03DBF00E21C22 /* wood4.m4a */; }; + D5ACF28C15C03DBF00E21C22 /* wood4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF1E015C03DBF00E21C22 /* wood4.m4a */; }; + D5ACF28E15C03E8800E21C22 /* arrows.png in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF28D15C03E8800E21C22 /* arrows.png */; }; + D5ACF28F15C03E8800E21C22 /* arrows.png in Resources */ = {isa = PBXBuildFile; fileRef = D5ACF28D15C03E8800E21C22 /* arrows.png */; }; + D5B17ED515E226F50056E751 /* Throwable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B17ED215E226F50056E751 /* Throwable.cpp */; }; + D5B17ED615E226F50056E751 /* Throwable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B17ED215E226F50056E751 /* Throwable.cpp */; }; + D5B17ED915E2273F0056E751 /* SurvivalMode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B17ED815E2273F0056E751 /* SurvivalMode.cpp */; }; + D5B17EDA15E2273F0056E751 /* SurvivalMode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B17ED815E2273F0056E751 /* SurvivalMode.cpp */; }; + D5B17EDD15E227670056E751 /* TrapDoorTile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B17EDB15E227670056E751 /* TrapDoorTile.cpp */; }; + D5B17EDE15E227670056E751 /* TrapDoorTile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B17EDB15E227670056E751 /* TrapDoorTile.cpp */; }; + D5B17EE115E260910056E751 /* MoveFolder.mm in Sources */ = {isa = PBXBuildFile; fileRef = D5B17EE015E260910056E751 /* MoveFolder.mm */; }; + D5B17EE215E260910056E751 /* MoveFolder.mm in Sources */ = {isa = PBXBuildFile; fileRef = D5B17EE015E260910056E751 /* MoveFolder.mm */; }; + D5B26C2315E3CE51003785EA /* creeper1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5B26C1D15E3CE51003785EA /* creeper1.m4a */; }; + D5B26C2415E3CE51003785EA /* creeper1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5B26C1D15E3CE51003785EA /* creeper1.m4a */; }; + D5B26C2515E3CE51003785EA /* creeper2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5B26C1E15E3CE51003785EA /* creeper2.m4a */; }; + D5B26C2615E3CE51003785EA /* creeper2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5B26C1E15E3CE51003785EA /* creeper2.m4a */; }; + D5B26C2715E3CE51003785EA /* creeper3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5B26C1F15E3CE51003785EA /* creeper3.m4a */; }; + D5B26C2815E3CE51003785EA /* creeper3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5B26C1F15E3CE51003785EA /* creeper3.m4a */; }; + D5B26C2915E3CE51003785EA /* creeper4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5B26C2015E3CE51003785EA /* creeper4.m4a */; }; + D5B26C2A15E3CE51003785EA /* creeper4.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5B26C2015E3CE51003785EA /* creeper4.m4a */; }; + D5B26C2B15E3CE51003785EA /* creeperdeath.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5B26C2115E3CE51003785EA /* creeperdeath.m4a */; }; + D5B26C2C15E3CE51003785EA /* creeperdeath.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5B26C2115E3CE51003785EA /* creeperdeath.m4a */; }; + D5B26C2D15E3CE51003785EA /* spiderdeath.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5B26C2215E3CE51003785EA /* spiderdeath.m4a */; }; + D5B26C2E15E3CE51003785EA /* spiderdeath.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5B26C2215E3CE51003785EA /* spiderdeath.m4a */; }; + D5B26C3315E3CED3003785EA /* eat1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5B26C2F15E3CED3003785EA /* eat1.m4a */; }; + D5B26C3415E3CED3003785EA /* eat1.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5B26C2F15E3CED3003785EA /* eat1.m4a */; }; + D5B26C3515E3CED3003785EA /* eat2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5B26C3015E3CED3003785EA /* eat2.m4a */; }; + D5B26C3615E3CED3003785EA /* eat2.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5B26C3015E3CED3003785EA /* eat2.m4a */; }; + D5B26C3715E3CED3003785EA /* eat3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5B26C3115E3CED3003785EA /* eat3.m4a */; }; + D5B26C3815E3CED3003785EA /* eat3.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5B26C3115E3CED3003785EA /* eat3.m4a */; }; + D5B26C3915E3CED3003785EA /* fuse.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5B26C3215E3CED3003785EA /* fuse.m4a */; }; + D5B26C3A15E3CED3003785EA /* fuse.m4a in Resources */ = {isa = PBXBuildFile; fileRef = D5B26C3215E3CED3003785EA /* fuse.m4a */; }; + D5B50A4F14CFF492005F7284 /* chicken.png in Resources */ = {isa = PBXBuildFile; fileRef = D5B50A4614CFF492005F7284 /* chicken.png */; }; + D5B50A5014CFF492005F7284 /* chicken.png in Resources */ = {isa = PBXBuildFile; fileRef = D5B50A4614CFF492005F7284 /* chicken.png */; }; + D5B50A5114CFF492005F7284 /* cow.png in Resources */ = {isa = PBXBuildFile; fileRef = D5B50A4714CFF492005F7284 /* cow.png */; }; + D5B50A5214CFF492005F7284 /* cow.png in Resources */ = {isa = PBXBuildFile; fileRef = D5B50A4714CFF492005F7284 /* cow.png */; }; + D5B50A5314CFF492005F7284 /* creeper.png in Resources */ = {isa = PBXBuildFile; fileRef = D5B50A4814CFF492005F7284 /* creeper.png */; }; + D5B50A5414CFF492005F7284 /* creeper.png in Resources */ = {isa = PBXBuildFile; fileRef = D5B50A4814CFF492005F7284 /* creeper.png */; }; + D5B50A5514CFF492005F7284 /* pig.png in Resources */ = {isa = PBXBuildFile; fileRef = D5B50A4914CFF492005F7284 /* pig.png */; }; + D5B50A5614CFF492005F7284 /* pig.png in Resources */ = {isa = PBXBuildFile; fileRef = D5B50A4914CFF492005F7284 /* pig.png */; }; + D5B50A5714CFF492005F7284 /* sheep_fur.png in Resources */ = {isa = PBXBuildFile; fileRef = D5B50A4A14CFF492005F7284 /* sheep_fur.png */; }; + D5B50A5814CFF492005F7284 /* sheep_fur.png in Resources */ = {isa = PBXBuildFile; fileRef = D5B50A4A14CFF492005F7284 /* sheep_fur.png */; }; + D5B50A5914CFF492005F7284 /* sheep.png in Resources */ = {isa = PBXBuildFile; fileRef = D5B50A4B14CFF492005F7284 /* sheep.png */; }; + D5B50A5A14CFF492005F7284 /* sheep.png in Resources */ = {isa = PBXBuildFile; fileRef = D5B50A4B14CFF492005F7284 /* sheep.png */; }; + D5B50A5B14CFF492005F7284 /* skeleton.png in Resources */ = {isa = PBXBuildFile; fileRef = D5B50A4C14CFF492005F7284 /* skeleton.png */; }; + D5B50A5C14CFF492005F7284 /* skeleton.png in Resources */ = {isa = PBXBuildFile; fileRef = D5B50A4C14CFF492005F7284 /* skeleton.png */; }; + D5B50A5D14CFF492005F7284 /* spider.png in Resources */ = {isa = PBXBuildFile; fileRef = D5B50A4D14CFF492005F7284 /* spider.png */; }; + D5B50A5E14CFF492005F7284 /* spider.png in Resources */ = {isa = PBXBuildFile; fileRef = D5B50A4D14CFF492005F7284 /* spider.png */; }; + D5B50A5F14CFF492005F7284 /* zombie.png in Resources */ = {isa = PBXBuildFile; fileRef = D5B50A4E14CFF492005F7284 /* zombie.png */; }; + D5B50A6014CFF492005F7284 /* zombie.png in Resources */ = {isa = PBXBuildFile; fileRef = D5B50A4E14CFF492005F7284 /* zombie.png */; }; + D5B50F6F14CFF670005F7284 /* AppPlatform_iOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C1C14CFF66F005F7284 /* AppPlatform_iOS.mm */; }; + D5B50F7014CFF670005F7284 /* AppPlatform_iOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C1C14CFF66F005F7284 /* AppPlatform_iOS.mm */; }; + D5B50F7314CFF670005F7284 /* CreativeMode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C2114CFF66F005F7284 /* CreativeMode.cpp */; }; + D5B50F7414CFF670005F7284 /* CreativeMode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C2114CFF66F005F7284 /* CreativeMode.cpp */; }; + D5B50F7514CFF670005F7284 /* GameMode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C2314CFF66F005F7284 /* GameMode.cpp */; }; + D5B50F7614CFF670005F7284 /* GameMode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C2314CFF66F005F7284 /* GameMode.cpp */; }; + D5B50F7714CFF670005F7284 /* Button.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C2814CFF66F005F7284 /* Button.cpp */; }; + D5B50F7814CFF670005F7284 /* Button.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C2814CFF66F005F7284 /* Button.cpp */; }; + D5B50F7914CFF670005F7284 /* ImageButton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C2A14CFF66F005F7284 /* ImageButton.cpp */; }; + D5B50F7A14CFF670005F7284 /* ImageButton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C2A14CFF66F005F7284 /* ImageButton.cpp */; }; + D5B50F7B14CFF670005F7284 /* LargeImageButton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C2C14CFF66F005F7284 /* LargeImageButton.cpp */; }; + D5B50F7C14CFF670005F7284 /* LargeImageButton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C2C14CFF66F005F7284 /* LargeImageButton.cpp */; }; + D5B50F7D14CFF670005F7284 /* RolledSelectionListH.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C2E14CFF66F005F7284 /* RolledSelectionListH.cpp */; }; + D5B50F7E14CFF670005F7284 /* RolledSelectionListH.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C2E14CFF66F005F7284 /* RolledSelectionListH.cpp */; }; + D5B50F7F14CFF670005F7284 /* RolledSelectionListV.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C3014CFF66F005F7284 /* RolledSelectionListV.cpp */; }; + D5B50F8014CFF670005F7284 /* RolledSelectionListV.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C3014CFF66F005F7284 /* RolledSelectionListV.cpp */; }; + D5B50F8114CFF670005F7284 /* ScrolledSelectionList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C3214CFF66F005F7284 /* ScrolledSelectionList.cpp */; }; + D5B50F8214CFF670005F7284 /* ScrolledSelectionList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C3214CFF66F005F7284 /* ScrolledSelectionList.cpp */; }; + D5B50F8314CFF670005F7284 /* SmallButton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C3414CFF66F005F7284 /* SmallButton.cpp */; }; + D5B50F8414CFF670005F7284 /* SmallButton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C3414CFF66F005F7284 /* SmallButton.cpp */; }; + D5B50F8514CFF670005F7284 /* Font.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C3614CFF66F005F7284 /* Font.cpp */; }; + D5B50F8614CFF670005F7284 /* Font.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C3614CFF66F005F7284 /* Font.cpp */; }; + D5B50F8714CFF670005F7284 /* Gui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C3814CFF66F005F7284 /* Gui.cpp */; }; + D5B50F8814CFF670005F7284 /* Gui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C3814CFF66F005F7284 /* Gui.cpp */; }; + D5B50F8914CFF670005F7284 /* GuiComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C3A14CFF66F005F7284 /* GuiComponent.cpp */; }; + D5B50F8A14CFF670005F7284 /* GuiComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C3A14CFF66F005F7284 /* GuiComponent.cpp */; }; + D5B50F8B14CFF670005F7284 /* Screen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C3C14CFF66F005F7284 /* Screen.cpp */; }; + D5B50F8C14CFF670005F7284 /* Screen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C3C14CFF66F005F7284 /* Screen.cpp */; }; + D5B50F8D14CFF670005F7284 /* ChatScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C4014CFF66F005F7284 /* ChatScreen.cpp */; }; + D5B50F8E14CFF670005F7284 /* ChatScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C4014CFF66F005F7284 /* ChatScreen.cpp */; }; + D5B50F8F14CFF670005F7284 /* ConfirmScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C4214CFF66F005F7284 /* ConfirmScreen.cpp */; }; + D5B50F9014CFF670005F7284 /* ConfirmScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C4214CFF66F005F7284 /* ConfirmScreen.cpp */; }; + D5B50F9114CFF670005F7284 /* IngameBlockSelectionScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C4614CFF66F005F7284 /* IngameBlockSelectionScreen.cpp */; }; + D5B50F9214CFF670005F7284 /* IngameBlockSelectionScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C4614CFF66F005F7284 /* IngameBlockSelectionScreen.cpp */; }; + D5B50F9314CFF670005F7284 /* JoinGameScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C4914CFF66F005F7284 /* JoinGameScreen.cpp */; }; + D5B50F9414CFF670005F7284 /* JoinGameScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C4914CFF66F005F7284 /* JoinGameScreen.cpp */; }; + D5B50F9514CFF670005F7284 /* OptionsScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C4B14CFF66F005F7284 /* OptionsScreen.cpp */; }; + D5B50F9614CFF670005F7284 /* OptionsScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C4B14CFF66F005F7284 /* OptionsScreen.cpp */; }; + D5B50F9714CFF670005F7284 /* PauseScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C4D14CFF66F005F7284 /* PauseScreen.cpp */; }; + D5B50F9814CFF670005F7284 /* PauseScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C4D14CFF66F005F7284 /* PauseScreen.cpp */; }; + D5B50F9914CFF670005F7284 /* ProgressScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C5014CFF66F005F7284 /* ProgressScreen.cpp */; }; + D5B50F9A14CFF670005F7284 /* ProgressScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C5014CFF66F005F7284 /* ProgressScreen.cpp */; }; + D5B50F9B14CFF670005F7284 /* RenameMPLevelScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C5214CFF66F005F7284 /* RenameMPLevelScreen.cpp */; }; + D5B50F9C14CFF670005F7284 /* RenameMPLevelScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C5214CFF66F005F7284 /* RenameMPLevelScreen.cpp */; }; + D5B50F9D14CFF670005F7284 /* ScreenChooser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C5414CFF66F005F7284 /* ScreenChooser.cpp */; }; + D5B50F9E14CFF670005F7284 /* ScreenChooser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C5414CFF66F005F7284 /* ScreenChooser.cpp */; }; + D5B50F9F14CFF670005F7284 /* SelectWorldScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C5614CFF66F005F7284 /* SelectWorldScreen.cpp */; }; + D5B50FA014CFF670005F7284 /* SelectWorldScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C5614CFF66F005F7284 /* SelectWorldScreen.cpp */; }; + D5B50FA114CFF670005F7284 /* StartMenuScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C5814CFF66F005F7284 /* StartMenuScreen.cpp */; }; + D5B50FA214CFF670005F7284 /* StartMenuScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C5814CFF66F005F7284 /* StartMenuScreen.cpp */; }; + D5B50FA314CFF670005F7284 /* TouchIngameBlockSelectionScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C5B14CFF66F005F7284 /* TouchIngameBlockSelectionScreen.cpp */; }; + D5B50FA414CFF670005F7284 /* TouchIngameBlockSelectionScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C5B14CFF66F005F7284 /* TouchIngameBlockSelectionScreen.cpp */; }; + D5B50FA514CFF670005F7284 /* TouchJoinGameScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C5D14CFF66F005F7284 /* TouchJoinGameScreen.cpp */; }; + D5B50FA614CFF670005F7284 /* TouchJoinGameScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C5D14CFF66F005F7284 /* TouchJoinGameScreen.cpp */; }; + D5B50FA714CFF670005F7284 /* TouchSelectWorldScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C5F14CFF66F005F7284 /* TouchSelectWorldScreen.cpp */; }; + D5B50FA814CFF670005F7284 /* TouchSelectWorldScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C5F14CFF66F005F7284 /* TouchSelectWorldScreen.cpp */; }; + D5B50FA914CFF670005F7284 /* TouchStartMenuScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C6114CFF66F005F7284 /* TouchStartMenuScreen.cpp */; }; + D5B50FAA14CFF670005F7284 /* TouchStartMenuScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C6114CFF66F005F7284 /* TouchStartMenuScreen.cpp */; }; + D5B50FAB14CFF670005F7284 /* UploadPhotoScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C6314CFF66F005F7284 /* UploadPhotoScreen.cpp */; }; + D5B50FAC14CFF670005F7284 /* UploadPhotoScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C6314CFF66F005F7284 /* UploadPhotoScreen.cpp */; }; + D5B50FAD14CFF670005F7284 /* Minecraft.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C6814CFF66F005F7284 /* Minecraft.cpp */; }; + D5B50FAE14CFF670005F7284 /* Minecraft.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C6814CFF66F005F7284 /* Minecraft.cpp */; }; + D5B50FAF14CFF670005F7284 /* ChickenModel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C6B14CFF66F005F7284 /* ChickenModel.cpp */; }; + D5B50FB014CFF670005F7284 /* ChickenModel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C6B14CFF66F005F7284 /* ChickenModel.cpp */; }; + D5B50FB114CFF670005F7284 /* CowModel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C6D14CFF66F005F7284 /* CowModel.cpp */; }; + D5B50FB214CFF670005F7284 /* CowModel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C6D14CFF66F005F7284 /* CowModel.cpp */; }; + D5B50FB314CFF670005F7284 /* Cube.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C7114CFF66F005F7284 /* Cube.cpp */; }; + D5B50FB414CFF670005F7284 /* Cube.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C7114CFF66F005F7284 /* Cube.cpp */; }; + D5B50FB514CFF670005F7284 /* ModelPart.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C7314CFF66F005F7284 /* ModelPart.cpp */; }; + D5B50FB614CFF670005F7284 /* ModelPart.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C7314CFF66F005F7284 /* ModelPart.cpp */; }; + D5B50FB714CFF670005F7284 /* Polygon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C7514CFF66F005F7284 /* Polygon.cpp */; }; + D5B50FB814CFF670005F7284 /* Polygon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C7514CFF66F005F7284 /* Polygon.cpp */; }; + D5B50FB914CFF670005F7284 /* HumanoidModel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C7814CFF66F005F7284 /* HumanoidModel.cpp */; }; + D5B50FBA14CFF670005F7284 /* HumanoidModel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C7814CFF66F005F7284 /* HumanoidModel.cpp */; }; + D5B50FBB14CFF670005F7284 /* PigModel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C7C14CFF66F005F7284 /* PigModel.cpp */; }; + D5B50FBC14CFF670005F7284 /* PigModel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C7C14CFF66F005F7284 /* PigModel.cpp */; }; + D5B50FBD14CFF670005F7284 /* QuadrupedModel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C7E14CFF66F005F7284 /* QuadrupedModel.cpp */; }; + D5B50FBE14CFF670005F7284 /* QuadrupedModel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C7E14CFF66F005F7284 /* QuadrupedModel.cpp */; }; + D5B50FBF14CFF670005F7284 /* Options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C8814CFF66F005F7284 /* Options.cpp */; }; + D5B50FC014CFF670005F7284 /* Options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C8814CFF66F005F7284 /* Options.cpp */; }; + D5B50FC114CFF670005F7284 /* OptionStrings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C8A14CFF66F005F7284 /* OptionStrings.cpp */; }; + D5B50FC214CFF670005F7284 /* OptionStrings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C8A14CFF66F005F7284 /* OptionStrings.cpp */; }; + D5B50FC314CFF670005F7284 /* Particle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C9214CFF66F005F7284 /* Particle.cpp */; }; + D5B50FC414CFF670005F7284 /* Particle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C9214CFF66F005F7284 /* Particle.cpp */; }; + D5B50FC514CFF670005F7284 /* ParticleEngine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C9414CFF66F005F7284 /* ParticleEngine.cpp */; }; + D5B50FC614CFF670005F7284 /* ParticleEngine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50C9414CFF66F005F7284 /* ParticleEngine.cpp */; }; + D5B50FC714CFF670005F7284 /* KeyboardInput.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CA414CFF66F005F7284 /* KeyboardInput.cpp */; }; + D5B50FC814CFF670005F7284 /* KeyboardInput.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CA414CFF66F005F7284 /* KeyboardInput.cpp */; }; + D5B50FC914CFF670005F7284 /* TouchscreenInput.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CAC14CFF66F005F7284 /* TouchscreenInput.cpp */; }; + D5B50FCA14CFF670005F7284 /* TouchscreenInput.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CAC14CFF66F005F7284 /* TouchscreenInput.cpp */; }; + D5B50FCB14CFF670005F7284 /* LocalPlayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CB014CFF66F005F7284 /* LocalPlayer.cpp */; }; + D5B50FCC14CFF670005F7284 /* LocalPlayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CB014CFF66F005F7284 /* LocalPlayer.cpp */; }; + D5B50FCD14CFF670005F7284 /* Chunk.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CB314CFF66F005F7284 /* Chunk.cpp */; }; + D5B50FCE14CFF670005F7284 /* Chunk.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CB314CFF66F005F7284 /* Chunk.cpp */; }; + D5B50FCF14CFF670005F7284 /* Frustum.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CBA14CFF66F005F7284 /* Frustum.cpp */; }; + D5B50FD014CFF670005F7284 /* Frustum.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CBA14CFF66F005F7284 /* Frustum.cpp */; }; + D5B50FD114CFF670005F7284 /* ChickenRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CC614CFF66F005F7284 /* ChickenRenderer.cpp */; }; + D5B50FD214CFF670005F7284 /* ChickenRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CC614CFF66F005F7284 /* ChickenRenderer.cpp */; }; + D5B50FD314CFF670005F7284 /* EntityRenderDispatcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CC914CFF66F005F7284 /* EntityRenderDispatcher.cpp */; }; + D5B50FD414CFF670005F7284 /* EntityRenderDispatcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CC914CFF66F005F7284 /* EntityRenderDispatcher.cpp */; }; + D5B50FD514CFF670005F7284 /* EntityRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CCB14CFF66F005F7284 /* EntityRenderer.cpp */; }; + D5B50FD614CFF670005F7284 /* EntityRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CCB14CFF66F005F7284 /* EntityRenderer.cpp */; }; + D5B50FD714CFF670005F7284 /* HumanoidMobRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CCD14CFF66F005F7284 /* HumanoidMobRenderer.cpp */; }; + D5B50FD814CFF670005F7284 /* HumanoidMobRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CCD14CFF66F005F7284 /* HumanoidMobRenderer.cpp */; }; + D5B50FD914CFF670005F7284 /* ItemRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CCF14CFF66F005F7284 /* ItemRenderer.cpp */; }; + D5B50FDA14CFF670005F7284 /* ItemRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CCF14CFF66F005F7284 /* ItemRenderer.cpp */; }; + D5B50FDB14CFF670005F7284 /* ItemSpriteRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CD114CFF66F005F7284 /* ItemSpriteRenderer.cpp */; }; + D5B50FDC14CFF670005F7284 /* ItemSpriteRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CD114CFF66F005F7284 /* ItemSpriteRenderer.cpp */; }; + D5B50FDD14CFF670005F7284 /* MobRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CD314CFF66F005F7284 /* MobRenderer.cpp */; }; + D5B50FDE14CFF670005F7284 /* MobRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CD314CFF66F005F7284 /* MobRenderer.cpp */; }; + D5B50FDF14CFF670005F7284 /* TntRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CD814CFF66F005F7284 /* TntRenderer.cpp */; }; + D5B50FE014CFF670005F7284 /* TntRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CD814CFF66F005F7284 /* TntRenderer.cpp */; }; + D5B50FE114CFF670005F7284 /* TripodCameraRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CDA14CFF66F005F7284 /* TripodCameraRenderer.cpp */; }; + D5B50FE214CFF670005F7284 /* TripodCameraRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CDA14CFF66F005F7284 /* TripodCameraRenderer.cpp */; }; + D5B50FE314CFF670005F7284 /* GameRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CDC14CFF66F005F7284 /* GameRenderer.cpp */; }; + D5B50FE414CFF670005F7284 /* GameRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CDC14CFF66F005F7284 /* GameRenderer.cpp */; }; + D5B50FE514CFF670005F7284 /* gles.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CDE14CFF66F005F7284 /* gles.cpp */; }; + D5B50FE614CFF670005F7284 /* gles.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CDE14CFF66F005F7284 /* gles.cpp */; }; + D5B50FE714CFF670005F7284 /* ItemInHandRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CE014CFF66F005F7284 /* ItemInHandRenderer.cpp */; }; + D5B50FE814CFF670005F7284 /* ItemInHandRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CE014CFF66F005F7284 /* ItemInHandRenderer.cpp */; }; + D5B50FE914CFF670005F7284 /* LevelRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CE214CFF66F005F7284 /* LevelRenderer.cpp */; }; + D5B50FEA14CFF670005F7284 /* LevelRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CE214CFF66F005F7284 /* LevelRenderer.cpp */; }; + D5B50FEB14CFF670005F7284 /* DynamicTexture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CE514CFF66F005F7284 /* DynamicTexture.cpp */; }; + D5B50FEC14CFF670005F7284 /* DynamicTexture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CE514CFF66F005F7284 /* DynamicTexture.cpp */; }; + D5B50FED14CFF670005F7284 /* RenderChunk.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CE714CFF66F005F7284 /* RenderChunk.cpp */; }; + D5B50FEE14CFF670005F7284 /* RenderChunk.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CE714CFF66F005F7284 /* RenderChunk.cpp */; }; + D5B50FEF14CFF670005F7284 /* RenderList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CEA14CFF66F005F7284 /* RenderList.cpp */; }; + D5B50FF014CFF670005F7284 /* RenderList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CEA14CFF66F005F7284 /* RenderList.cpp */; }; + D5B50FF114CFF670005F7284 /* Tesselator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CEC14CFF66F005F7284 /* Tesselator.cpp */; }; + D5B50FF214CFF670005F7284 /* Tesselator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CEC14CFF66F005F7284 /* Tesselator.cpp */; }; + D5B50FF314CFF670005F7284 /* Textures.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CEF14CFF66F005F7284 /* Textures.cpp */; }; + D5B50FF414CFF670005F7284 /* Textures.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CEF14CFF66F005F7284 /* Textures.cpp */; }; + D5B50FF514CFF670005F7284 /* TileRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CF114CFF66F005F7284 /* TileRenderer.cpp */; }; + D5B50FF614CFF670005F7284 /* TileRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50CF114CFF66F005F7284 /* TileRenderer.cpp */; }; + D5B5102D14CFF670005F7284 /* Sound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D1114CFF66F005F7284 /* Sound.cpp */; }; + D5B5102E14CFF670005F7284 /* Sound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D1114CFF66F005F7284 /* Sound.cpp */; }; + D5B5102F14CFF670005F7284 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D1B14CFF66F005F7284 /* main.cpp */; }; + D5B5103014CFF670005F7284 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D1B14CFF66F005F7284 /* main.cpp */; }; + D5B5103514CFF670005F7284 /* Tag.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D2E14CFF66F005F7284 /* Tag.cpp */; }; + D5B5103614CFF670005F7284 /* Tag.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D2E14CFF66F005F7284 /* Tag.cpp */; }; + D5B5103714CFF670005F7284 /* ClientSideNetworkHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D3114CFF66F005F7284 /* ClientSideNetworkHandler.cpp */; }; + D5B5103814CFF670005F7284 /* ClientSideNetworkHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D3114CFF66F005F7284 /* ClientSideNetworkHandler.cpp */; }; + D5B5103914CFF670005F7284 /* NetEventCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D3314CFF66F005F7284 /* NetEventCallback.cpp */; }; + D5B5103A14CFF670005F7284 /* NetEventCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D3314CFF66F005F7284 /* NetEventCallback.cpp */; }; + D5B5103B14CFF670005F7284 /* Packet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D4A14CFF66F005F7284 /* Packet.cpp */; }; + D5B5103C14CFF670005F7284 /* Packet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D4A14CFF66F005F7284 /* Packet.cpp */; }; + D5B5103D14CFF670005F7284 /* RakNetInstance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D4C14CFF66F005F7284 /* RakNetInstance.cpp */; }; + D5B5103E14CFF670005F7284 /* RakNetInstance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D4C14CFF66F005F7284 /* RakNetInstance.cpp */; }; + D5B5103F14CFF670005F7284 /* ServerSideNetworkHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D4E14CFF66F005F7284 /* ServerSideNetworkHandler.cpp */; }; + D5B5104014CFF670005F7284 /* ServerSideNetworkHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D4E14CFF66F005F7284 /* ServerSideNetworkHandler.cpp */; }; + D5B5104114CFF670005F7284 /* NinecraftApp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D5014CFF66F005F7284 /* NinecraftApp.cpp */; }; + D5B5104214CFF670005F7284 /* NinecraftApp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D5014CFF66F005F7284 /* NinecraftApp.cpp */; }; + D5B5104314CFF670005F7284 /* Performance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D5214CFF66F005F7284 /* Performance.cpp */; }; + D5B5104414CFF670005F7284 /* Performance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D5214CFF66F005F7284 /* Performance.cpp */; }; + D5B5104714CFF670005F7284 /* SoundSystemAL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D5A14CFF66F005F7284 /* SoundSystemAL.cpp */; }; + D5B5104814CFF670005F7284 /* SoundSystemAL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D5A14CFF66F005F7284 /* SoundSystemAL.cpp */; }; + D5B5104B14CFF670005F7284 /* CThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D5E14CFF66F005F7284 /* CThread.cpp */; }; + D5B5104C14CFF670005F7284 /* CThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D5E14CFF66F005F7284 /* CThread.cpp */; }; + D5B5104D14CFF670005F7284 /* Controller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D6214CFF66F005F7284 /* Controller.cpp */; }; + D5B5104E14CFF670005F7284 /* Controller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D6214CFF66F005F7284 /* Controller.cpp */; }; + D5B5104F14CFF670005F7284 /* Keyboard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D6414CFF66F005F7284 /* Keyboard.cpp */; }; + D5B5105014CFF670005F7284 /* Keyboard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D6414CFF66F005F7284 /* Keyboard.cpp */; }; + D5B5105114CFF670005F7284 /* Mouse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D6614CFF66F005F7284 /* Mouse.cpp */; }; + D5B5105214CFF670005F7284 /* Mouse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D6614CFF66F005F7284 /* Mouse.cpp */; }; + D5B5105314CFF670005F7284 /* Multitouch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D6814CFF66F005F7284 /* Multitouch.cpp */; }; + D5B5105414CFF670005F7284 /* Multitouch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D6814CFF66F005F7284 /* Multitouch.cpp */; }; + D5B5105514CFF670005F7284 /* time.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D6B14CFF66F005F7284 /* time.cpp */; }; + D5B5105614CFF670005F7284 /* time.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50D6B14CFF66F005F7284 /* time.cpp */; }; + D5B5110D14CFF670005F7284 /* DataIO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E5D14CFF66F005F7284 /* DataIO.cpp */; }; + D5B5110E14CFF670005F7284 /* DataIO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E5D14CFF66F005F7284 /* DataIO.cpp */; }; + D5B5110F14CFF670005F7284 /* Mth.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E6014CFF66F005F7284 /* Mth.cpp */; }; + D5B5111014CFF670005F7284 /* Mth.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E6014CFF66F005F7284 /* Mth.cpp */; }; + D5B5111114CFF670005F7284 /* PerfRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E6214CFF66F005F7284 /* PerfRenderer.cpp */; }; + D5B5111214CFF670005F7284 /* PerfRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E6214CFF66F005F7284 /* PerfRenderer.cpp */; }; + D5B5111314CFF670005F7284 /* PerfTimer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E6414CFF66F005F7284 /* PerfTimer.cpp */; }; + D5B5111414CFF670005F7284 /* PerfTimer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E6414CFF66F005F7284 /* PerfTimer.cpp */; }; + D5B5111514CFF670005F7284 /* StringUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E6914CFF66F005F7284 /* StringUtils.cpp */; }; + D5B5111614CFF670005F7284 /* StringUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E6914CFF66F005F7284 /* StringUtils.cpp */; }; + D5B5111714CFF670005F7284 /* Direction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E6E14CFF66F005F7284 /* Direction.cpp */; }; + D5B5111814CFF670005F7284 /* Direction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E6E14CFF66F005F7284 /* Direction.cpp */; }; + D5B5111914CFF670005F7284 /* Animal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E7214CFF66F005F7284 /* Animal.cpp */; }; + D5B5111A14CFF670005F7284 /* Animal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E7214CFF66F005F7284 /* Animal.cpp */; }; + D5B5111B14CFF670005F7284 /* Chicken.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E7514CFF66F005F7284 /* Chicken.cpp */; }; + D5B5111C14CFF670005F7284 /* Chicken.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E7514CFF66F005F7284 /* Chicken.cpp */; }; + D5B5111D14CFF670005F7284 /* Cow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E7714CFF66F005F7284 /* Cow.cpp */; }; + D5B5111E14CFF670005F7284 /* Cow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E7714CFF66F005F7284 /* Cow.cpp */; }; + D5B5111F14CFF670005F7284 /* Pig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E7914CFF66F005F7284 /* Pig.cpp */; }; + D5B5112014CFF670005F7284 /* Pig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E7914CFF66F005F7284 /* Pig.cpp */; }; + D5B5112114CFF670005F7284 /* Sheep.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E7B14CFF66F005F7284 /* Sheep.cpp */; }; + D5B5112214CFF670005F7284 /* Sheep.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E7B14CFF66F005F7284 /* Sheep.cpp */; }; + D5B5112314CFF670005F7284 /* WaterAnimal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E7D14CFF66F005F7284 /* WaterAnimal.cpp */; }; + D5B5112414CFF670005F7284 /* WaterAnimal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E7D14CFF66F005F7284 /* WaterAnimal.cpp */; }; + D5B5112514CFF670005F7284 /* Entity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E8014CFF66F005F7284 /* Entity.cpp */; }; + D5B5112614CFF670005F7284 /* Entity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E8014CFF66F005F7284 /* Entity.cpp */; }; + D5B5112714CFF670005F7284 /* FlyingMob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E8614CFF66F005F7284 /* FlyingMob.cpp */; }; + D5B5112814CFF670005F7284 /* FlyingMob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E8614CFF66F005F7284 /* FlyingMob.cpp */; }; + D5B5112914CFF670005F7284 /* FallingTile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E8914CFF66F005F7284 /* FallingTile.cpp */; }; + D5B5112A14CFF670005F7284 /* FallingTile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E8914CFF66F005F7284 /* FallingTile.cpp */; }; + D5B5112B14CFF670005F7284 /* ItemEntity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E8B14CFF66F005F7284 /* ItemEntity.cpp */; }; + D5B5112C14CFF670005F7284 /* ItemEntity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E8B14CFF66F005F7284 /* ItemEntity.cpp */; }; + D5B5112D14CFF670005F7284 /* PrimedTnt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E8D14CFF66F005F7284 /* PrimedTnt.cpp */; }; + D5B5112E14CFF670005F7284 /* PrimedTnt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E8D14CFF66F005F7284 /* PrimedTnt.cpp */; }; + D5B5112F14CFF670005F7284 /* TripodCamera.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E8F14CFF66F005F7284 /* TripodCamera.cpp */; }; + D5B5113014CFF670005F7284 /* TripodCamera.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E8F14CFF66F005F7284 /* TripodCamera.cpp */; }; + D5B5113114CFF670005F7284 /* Mob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E9114CFF66F005F7284 /* Mob.cpp */; }; + D5B5113214CFF670005F7284 /* Mob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E9114CFF66F005F7284 /* Mob.cpp */; }; + D5B5113314CFF670005F7284 /* MobCategory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E9314CFF66F005F7284 /* MobCategory.cpp */; }; + D5B5113414CFF670005F7284 /* MobCategory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E9314CFF66F005F7284 /* MobCategory.cpp */; }; + D5B5113714CFF670005F7284 /* PathFinderMob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E9E14CFF66F005F7284 /* PathFinderMob.cpp */; }; + D5B5113814CFF670005F7284 /* PathFinderMob.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50E9E14CFF66F005F7284 /* PathFinderMob.cpp */; }; + D5B5113914CFF670005F7284 /* Inventory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EA214CFF66F005F7284 /* Inventory.cpp */; }; + D5B5113A14CFF670005F7284 /* Inventory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EA214CFF66F005F7284 /* Inventory.cpp */; }; + D5B5113B14CFF670005F7284 /* Player.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EA614CFF66F005F7284 /* Player.cpp */; }; + D5B5113C14CFF670005F7284 /* Player.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EA614CFF66F005F7284 /* Player.cpp */; }; + D5B5113D14CFF670005F7284 /* Arrow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EA914CFF66F005F7284 /* Arrow.cpp */; }; + D5B5113E14CFF670005F7284 /* Arrow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EA914CFF66F005F7284 /* Arrow.cpp */; }; + D5B5113F14CFF670005F7284 /* Recipes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EB414CFF66F005F7284 /* Recipes.cpp */; }; + D5B5114014CFF670005F7284 /* Recipes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EB414CFF66F005F7284 /* Recipes.cpp */; }; + D5B5114114CFF670005F7284 /* ToolRecipes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EB814CFF66F005F7284 /* ToolRecipes.cpp */; }; + D5B5114214CFF670005F7284 /* ToolRecipes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EB814CFF66F005F7284 /* ToolRecipes.cpp */; }; + D5B5114314CFF670005F7284 /* WeaponRecipes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EBA14CFF66F005F7284 /* WeaponRecipes.cpp */; }; + D5B5114414CFF670005F7284 /* WeaponRecipes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EBA14CFF66F005F7284 /* WeaponRecipes.cpp */; }; + D5B5114514CFF670005F7284 /* HatchetItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EBF14CFF66F005F7284 /* HatchetItem.cpp */; }; + D5B5114614CFF670005F7284 /* HatchetItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EBF14CFF66F005F7284 /* HatchetItem.cpp */; }; + D5B5114714CFF670005F7284 /* Item.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EC114CFF66F005F7284 /* Item.cpp */; }; + D5B5114814CFF670005F7284 /* Item.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EC114CFF66F005F7284 /* Item.cpp */; }; + D5B5114914CFF670005F7284 /* ItemInstance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EC414CFF66F005F7284 /* ItemInstance.cpp */; }; + D5B5114A14CFF670005F7284 /* ItemInstance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EC414CFF66F005F7284 /* ItemInstance.cpp */; }; + D5B5114B14CFF670005F7284 /* PickaxeItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EC614CFF66F005F7284 /* PickaxeItem.cpp */; }; + D5B5114C14CFF670005F7284 /* PickaxeItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EC614CFF66F005F7284 /* PickaxeItem.cpp */; }; + D5B5114D14CFF670005F7284 /* ShovelItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EC914CFF66F005F7284 /* ShovelItem.cpp */; }; + D5B5114E14CFF670005F7284 /* ShovelItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EC914CFF66F005F7284 /* ShovelItem.cpp */; }; + D5B5114F14CFF670005F7284 /* Biome.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50ED214CFF66F005F7284 /* Biome.cpp */; }; + D5B5115014CFF670005F7284 /* Biome.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50ED214CFF66F005F7284 /* Biome.cpp */; }; + D5B5115114CFF670005F7284 /* BiomeSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50ED514CFF66F005F7284 /* BiomeSource.cpp */; }; + D5B5115214CFF670005F7284 /* BiomeSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50ED514CFF66F005F7284 /* BiomeSource.cpp */; }; + D5B5115314CFF670005F7284 /* LevelChunk.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EE114CFF66F005F7284 /* LevelChunk.cpp */; }; + D5B5115414CFF670005F7284 /* LevelChunk.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EE114CFF66F005F7284 /* LevelChunk.cpp */; }; + D5B5115514CFF670005F7284 /* Dimension.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EE814CFF66F005F7284 /* Dimension.cpp */; }; + D5B5115614CFF670005F7284 /* Dimension.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EE814CFF66F005F7284 /* Dimension.cpp */; }; + D5B5115714CFF670005F7284 /* Explosion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EEC14CFF66F005F7284 /* Explosion.cpp */; }; + D5B5115814CFF670005F7284 /* Explosion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EEC14CFF66F005F7284 /* Explosion.cpp */; }; + D5B5115914CFF670005F7284 /* Level.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EEE14CFF66F005F7284 /* Level.cpp */; }; + D5B5115A14CFF670005F7284 /* Level.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EEE14CFF66F005F7284 /* Level.cpp */; }; + D5B5115B14CFF670005F7284 /* CanyonFeature.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EF214CFF66F005F7284 /* CanyonFeature.cpp */; }; + D5B5115C14CFF670005F7284 /* CanyonFeature.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EF214CFF66F005F7284 /* CanyonFeature.cpp */; }; + D5B5115D14CFF670005F7284 /* DungeonFeature.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EF414CFF66F005F7284 /* DungeonFeature.cpp */; }; + D5B5115E14CFF670005F7284 /* DungeonFeature.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50EF414CFF66F005F7284 /* DungeonFeature.cpp */; }; + D5B5115F14CFF670005F7284 /* LargeCaveFeature.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F0414CFF66F005F7284 /* LargeCaveFeature.cpp */; }; + D5B5116014CFF670005F7284 /* LargeCaveFeature.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F0414CFF66F005F7284 /* LargeCaveFeature.cpp */; }; + D5B5116114CFF670005F7284 /* LargeFeature.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F0614CFF66F005F7284 /* LargeFeature.cpp */; }; + D5B5116214CFF670005F7284 /* LargeFeature.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F0614CFF66F005F7284 /* LargeFeature.cpp */; }; + D5B5116314CFF670005F7284 /* RandomLevelSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F0814CFF66F005F7284 /* RandomLevelSource.cpp */; }; + D5B5116414CFF670005F7284 /* RandomLevelSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F0814CFF66F005F7284 /* RandomLevelSource.cpp */; }; + D5B5116514CFF670005F7284 /* ImprovedNoise.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F0B14CFF66F005F7284 /* ImprovedNoise.cpp */; }; + D5B5116614CFF670005F7284 /* ImprovedNoise.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F0B14CFF66F005F7284 /* ImprovedNoise.cpp */; }; + D5B5116714CFF670005F7284 /* PerlinNoise.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F0D14CFF66F005F7284 /* PerlinNoise.cpp */; }; + D5B5116814CFF670005F7284 /* PerlinNoise.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F0D14CFF66F005F7284 /* PerlinNoise.cpp */; }; + D5B5116914CFF670005F7284 /* Synth.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F0F14CFF66F005F7284 /* Synth.cpp */; }; + D5B5116A14CFF670005F7284 /* Synth.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F0F14CFF66F005F7284 /* Synth.cpp */; }; + D5B5116B14CFF670005F7284 /* LightLayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F1514CFF66F005F7284 /* LightLayer.cpp */; }; + D5B5116C14CFF670005F7284 /* LightLayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F1514CFF66F005F7284 /* LightLayer.cpp */; }; + D5B5116D14CFF670005F7284 /* LightUpdate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F1714CFF66F005F7284 /* LightUpdate.cpp */; }; + D5B5116E14CFF670005F7284 /* LightUpdate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F1714CFF66F005F7284 /* LightUpdate.cpp */; }; + D5B5116F14CFF670005F7284 /* Material.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F1D14CFF66F005F7284 /* Material.cpp */; }; + D5B5117014CFF670005F7284 /* Material.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F1D14CFF66F005F7284 /* Material.cpp */; }; + D5B5117114CFF670005F7284 /* MobSpawner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F1F14CFF66F005F7284 /* MobSpawner.cpp */; }; + D5B5117214CFF670005F7284 /* MobSpawner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F1F14CFF66F005F7284 /* MobSpawner.cpp */; }; + D5B5117314CFF670005F7284 /* Region.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F2614CFF66F005F7284 /* Region.cpp */; }; + D5B5117414CFF670005F7284 /* Region.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F2614CFF66F005F7284 /* Region.cpp */; }; + D5B5117514CFF670005F7284 /* ExternalFileLevelStorage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F2914CFF66F005F7284 /* ExternalFileLevelStorage.cpp */; }; + D5B5117614CFF670005F7284 /* ExternalFileLevelStorage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F2914CFF66F005F7284 /* ExternalFileLevelStorage.cpp */; }; + D5B5117714CFF670005F7284 /* ExternalFileLevelStorageSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F2B14CFF66F005F7284 /* ExternalFileLevelStorageSource.cpp */; }; + D5B5117814CFF670005F7284 /* ExternalFileLevelStorageSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F2B14CFF66F005F7284 /* ExternalFileLevelStorageSource.cpp */; }; + D5B5117914CFF670005F7284 /* RegionFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F3414CFF66F005F7284 /* RegionFile.cpp */; }; + D5B5117A14CFF670005F7284 /* RegionFile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F3414CFF66F005F7284 /* RegionFile.cpp */; }; + D5B5117B14CFF670005F7284 /* TickNextTickData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F3614CFF66F005F7284 /* TickNextTickData.cpp */; }; + D5B5117C14CFF670005F7284 /* TickNextTickData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F3614CFF66F005F7284 /* TickNextTickData.cpp */; }; + D5B5117D14CFF670005F7284 /* DoorTile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F3F14CFF66F005F7284 /* DoorTile.cpp */; }; + D5B5117E14CFF670005F7284 /* DoorTile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F3F14CFF66F005F7284 /* DoorTile.cpp */; }; + D5B5118114CFF670005F7284 /* StoneSlabTile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F5D14CFF66F005F7284 /* StoneSlabTile.cpp */; }; + D5B5118214CFF670005F7284 /* StoneSlabTile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F5D14CFF66F005F7284 /* StoneSlabTile.cpp */; }; + D5B5118314CFF670005F7284 /* Tile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F6014CFF66F005F7284 /* Tile.cpp */; }; + D5B5118414CFF670005F7284 /* Tile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F6014CFF66F005F7284 /* Tile.cpp */; }; + D5B5118514CFF670005F7284 /* HitResult.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F6B14CFF66F005F7284 /* HitResult.cpp */; }; + D5B5118614CFF670005F7284 /* HitResult.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B50F6B14CFF66F005F7284 /* HitResult.cpp */; }; + D5B5118B14D03342005F7284 /* SynchedEntityData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B5118A14D03342005F7284 /* SynchedEntityData.cpp */; }; + D5B5118C14D03342005F7284 /* SynchedEntityData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B5118A14D03342005F7284 /* SynchedEntityData.cpp */; }; + D5B5118E14DEA27F005F7284 /* DeathScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B5118D14DEA27E005F7284 /* DeathScreen.cpp */; }; + D5B5118F14DEA27F005F7284 /* DeathScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B5118D14DEA27E005F7284 /* DeathScreen.cpp */; }; + D5B5119114DEA2B7005F7284 /* LevelData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B5119014DEA2B7005F7284 /* LevelData.cpp */; }; + D5B5119214DEA2B7005F7284 /* LevelData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B5119014DEA2B7005F7284 /* LevelData.cpp */; }; + D5B5119414DEA2EF005F7284 /* DyePowderItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B5119314DEA2EF005F7284 /* DyePowderItem.cpp */; }; + D5B5119514DEA2EF005F7284 /* DyePowderItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B5119314DEA2EF005F7284 /* DyePowderItem.cpp */; }; + D5B86281153810BD00F3238A /* I18n.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B86280153810BD00F3238A /* I18n.cpp */; }; + D5B86282153810BD00F3238A /* I18n.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B86280153810BD00F3238A /* I18n.cpp */; }; + D5B862851538175500F3238A /* ScrollingPane.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B862841538175500F3238A /* ScrollingPane.cpp */; }; + D5B862861538175500F3238A /* ScrollingPane.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B862841538175500F3238A /* ScrollingPane.cpp */; }; + D5B862921538187400F3238A /* Recipe.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B8628E1538187400F3238A /* Recipe.cpp */; }; + D5B862931538187400F3238A /* Recipe.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B8628E1538187400F3238A /* Recipe.cpp */; }; + D5B862941538187400F3238A /* StructureRecipes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B862901538187400F3238A /* StructureRecipes.cpp */; }; + D5B862951538187400F3238A /* StructureRecipes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5B862901538187400F3238A /* StructureRecipes.cpp */; }; + D5BFCF1B14513FF400A443B0 /* CreateNewWorld_ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = D5BFCF1A14513FF400A443B0 /* CreateNewWorld_ipad.xib */; }; + D5CF9C47144C225000E4244F /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5CF9C46144C225000E4244F /* UIKit.framework */; }; + D5CF9C49144C225000E4244F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5CF9C48144C225000E4244F /* Foundation.framework */; }; + D5CF9C4B144C225000E4244F /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5CF9C4A144C225000E4244F /* CoreGraphics.framework */; }; + D5CF9C4D144C225000E4244F /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5CF9C4C144C225000E4244F /* QuartzCore.framework */; }; + D5CF9C4F144C225000E4244F /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5CF9C4E144C225000E4244F /* OpenGLES.framework */; }; + D5CF9C55144C225000E4244F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = D5CF9C53144C225000E4244F /* InfoPlist.strings */; }; + D5CF9C57144C225000E4244F /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = D5CF9C56144C225000E4244F /* main.mm */; }; + D5CF9C5B144C225000E4244F /* minecraftpeAppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = D5CF9C5A144C225000E4244F /* minecraftpeAppDelegate.mm */; }; + D5CF9C5E144C225000E4244F /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = D5CF9C5C144C225000E4244F /* MainWindow.xib */; }; + D5CF9C65144C225000E4244F /* EAGLView.m in Sources */ = {isa = PBXBuildFile; fileRef = D5CF9C64144C225000E4244F /* EAGLView.m */; }; + D5CF9C6B144C225000E4244F /* minecraftpeViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = D5CF9C69144C225000E4244F /* minecraftpeViewController.xib */; }; + D5CFA01D144C453900E4244F /* minecraftpeViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = D5CFA01C144C453900E4244F /* minecraftpeViewController.mm */; }; + D5D381F215A1A1CF00B6C50E /* FillingContainer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D381F015A1A1CF00B6C50E /* FillingContainer.cpp */; }; + D5D381F315A1A1CF00B6C50E /* FillingContainer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D381F015A1A1CF00B6C50E /* FillingContainer.cpp */; }; + D5D381F715A1A21800B6C50E /* EntityTile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D381F515A1A21800B6C50E /* EntityTile.cpp */; }; + D5D381F815A1A21800B6C50E /* EntityTile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D381F515A1A21800B6C50E /* EntityTile.cpp */; }; + D5D3820515A1A26000B6C50E /* ChestRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D381FF15A1A26000B6C50E /* ChestRenderer.cpp */; }; + D5D3820615A1A26000B6C50E /* ChestRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D381FF15A1A26000B6C50E /* ChestRenderer.cpp */; }; + D5D3820715A1A26000B6C50E /* TileEntityRenderDispatcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D3820115A1A26000B6C50E /* TileEntityRenderDispatcher.cpp */; }; + D5D3820815A1A26000B6C50E /* TileEntityRenderDispatcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D3820115A1A26000B6C50E /* TileEntityRenderDispatcher.cpp */; }; + D5D3820915A1A26000B6C50E /* TileEntityRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D3820315A1A26000B6C50E /* TileEntityRenderer.cpp */; }; + D5D3820A15A1A26000B6C50E /* TileEntityRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D3820315A1A26000B6C50E /* TileEntityRenderer.cpp */; }; + D5D3820D15A1A2A000B6C50E /* EntityTileRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D3820B15A1A2A000B6C50E /* EntityTileRenderer.cpp */; }; + D5D3820E15A1A2A000B6C50E /* EntityTileRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D3820B15A1A2A000B6C50E /* EntityTileRenderer.cpp */; }; + D5D3821115A1A2C200B6C50E /* ChestTile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D3820F15A1A2C200B6C50E /* ChestTile.cpp */; }; + D5D3821215A1A2C200B6C50E /* ChestTile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D3820F15A1A2C200B6C50E /* ChestTile.cpp */; }; + D5D3821415A1A5D100B6C50E /* ChestTileEntity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D3821315A1A5D100B6C50E /* ChestTileEntity.cpp */; }; + D5D3821515A1A5D100B6C50E /* ChestTileEntity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D3821315A1A5D100B6C50E /* ChestTileEntity.cpp */; }; + D5D43CC4146AF4B4002ED842 /* RenameMPWorld_ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = D5D43CC0146AF4B4002ED842 /* RenameMPWorld_ipad.xib */; }; + D5D43CC5146AF4B4002ED842 /* RenameMPWorld_ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = D5D43CC0146AF4B4002ED842 /* RenameMPWorld_ipad.xib */; }; + D5D43CC6146AF4B4002ED842 /* RenameMPWorld_iphone.xib in Resources */ = {isa = PBXBuildFile; fileRef = D5D43CC1146AF4B4002ED842 /* RenameMPWorld_iphone.xib */; }; + D5D43CC7146AF4B4002ED842 /* RenameMPWorld_iphone.xib in Resources */ = {isa = PBXBuildFile; fileRef = D5D43CC1146AF4B4002ED842 /* RenameMPWorld_iphone.xib */; }; + D5D43CC8146AF4B4002ED842 /* RenameMPWorldViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = D5D43CC3146AF4B4002ED842 /* RenameMPWorldViewController.mm */; }; + D5D43CC9146AF4B4002ED842 /* RenameMPWorldViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = D5D43CC3146AF4B4002ED842 /* RenameMPWorldViewController.mm */; }; + D5D43CCE146AFD9E002ED842 /* save_0_3.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D43CCA146AFD9D002ED842 /* save_0_3.png */; }; + D5D43CCF146AFD9E002ED842 /* save_0_3.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D43CCA146AFD9D002ED842 /* save_0_3.png */; }; + D5D43CD0146AFD9E002ED842 /* save_0.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D43CCB146AFD9D002ED842 /* save_0.png */; }; + D5D43CD1146AFD9E002ED842 /* save_0.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D43CCB146AFD9D002ED842 /* save_0.png */; }; + D5D43CD2146AFD9E002ED842 /* save_1_3.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D43CCC146AFD9E002ED842 /* save_1_3.png */; }; + D5D43CD3146AFD9E002ED842 /* save_1_3.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D43CCC146AFD9E002ED842 /* save_1_3.png */; }; + D5D43CD4146AFD9E002ED842 /* save_1.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D43CCD146AFD9E002ED842 /* save_1.png */; }; + D5D43CD5146AFD9E002ED842 /* save_1.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D43CCD146AFD9E002ED842 /* save_1.png */; }; + D5D8C48A16392FF000FD35F0 /* LightGemTile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C48316392FF000FD35F0 /* LightGemTile.cpp */; }; + D5D8C48B16392FF000FD35F0 /* LightGemTile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C48316392FF000FD35F0 /* LightGemTile.cpp */; }; + D5D8C48C16392FF000FD35F0 /* Mushroom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C48516392FF000FD35F0 /* Mushroom.cpp */; }; + D5D8C48D16392FF000FD35F0 /* Mushroom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C48516392FF000FD35F0 /* Mushroom.cpp */; }; + D5D8C48E16392FF000FD35F0 /* StemTile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C48816392FF000FD35F0 /* StemTile.cpp */; }; + D5D8C48F16392FF000FD35F0 /* StemTile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C48816392FF000FD35F0 /* StemTile.cpp */; }; + D5D8C4951639301700FD35F0 /* NetherReactorTileEntity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C4911639301700FD35F0 /* NetherReactorTileEntity.cpp */; }; + D5D8C4961639301700FD35F0 /* NetherReactorTileEntity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C4911639301700FD35F0 /* NetherReactorTileEntity.cpp */; }; + D5D8C4971639301700FD35F0 /* SignTileEntity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C4931639301700FD35F0 /* SignTileEntity.cpp */; }; + D5D8C4981639301700FD35F0 /* SignTileEntity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C4931639301700FD35F0 /* SignTileEntity.cpp */; }; + D5D8C49B1639305100FD35F0 /* PigZombie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C4991639305100FD35F0 /* PigZombie.cpp */; }; + D5D8C49C1639305100FD35F0 /* PigZombie.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C4991639305100FD35F0 /* PigZombie.cpp */; }; + D5D8C49F163930D600FD35F0 /* MelonTile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C49D163930D600FD35F0 /* MelonTile.cpp */; }; + D5D8C4A0163930D600FD35F0 /* MelonTile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C49D163930D600FD35F0 /* MelonTile.cpp */; }; + D5D8C4A3163930E600FD35F0 /* NetherReactor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C4A1163930E600FD35F0 /* NetherReactor.cpp */; }; + D5D8C4A4163930E600FD35F0 /* NetherReactor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C4A1163930E600FD35F0 /* NetherReactor.cpp */; }; + D5D8C4A7163931F000FD35F0 /* InBedScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C4A5163931F000FD35F0 /* InBedScreen.cpp */; }; + D5D8C4A8163931F000FD35F0 /* InBedScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C4A5163931F000FD35F0 /* InBedScreen.cpp */; }; + D5D8C4AB163932B900FD35F0 /* SignRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C4A9163932B900FD35F0 /* SignRenderer.cpp */; }; + D5D8C4AC163932B900FD35F0 /* SignRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C4A9163932B900FD35F0 /* SignRenderer.cpp */; }; + D5D8C4AF163932CF00FD35F0 /* PaintingRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C4AD163932CF00FD35F0 /* PaintingRenderer.cpp */; }; + D5D8C4B0163932CF00FD35F0 /* PaintingRenderer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C4AD163932CF00FD35F0 /* PaintingRenderer.cpp */; }; + D5D8C4B51639335000FD35F0 /* HangingEntity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C4B11639335000FD35F0 /* HangingEntity.cpp */; }; + D5D8C4B61639335000FD35F0 /* HangingEntity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C4B11639335000FD35F0 /* HangingEntity.cpp */; }; + D5D8C4B71639335000FD35F0 /* Painting.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C4B31639335000FD35F0 /* Painting.cpp */; }; + D5D8C4B81639335000FD35F0 /* Painting.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C4B31639335000FD35F0 /* Painting.cpp */; }; + D5D8C4C31639341100FD35F0 /* Motive.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C4C11639341100FD35F0 /* Motive.cpp */; }; + D5D8C4C41639341100FD35F0 /* Motive.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C4C11639341100FD35F0 /* Motive.cpp */; }; + D5D8C4C7163934BB00FD35F0 /* HangingEntityItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C4C5163934BB00FD35F0 /* HangingEntityItem.cpp */; }; + D5D8C4C8163934BB00FD35F0 /* HangingEntityItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C4C5163934BB00FD35F0 /* HangingEntityItem.cpp */; }; + D5D8C4CB1639362F00FD35F0 /* NetherReactorPattern.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C4C91639362F00FD35F0 /* NetherReactorPattern.cpp */; }; + D5D8C4CC1639362F00FD35F0 /* NetherReactorPattern.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D5D8C4C91639362F00FD35F0 /* NetherReactorPattern.cpp */; }; + D5D961B814E6AF0C001D1B9D /* Icon_lite.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D961AC14E6AF0C001D1B9D /* Icon_lite.png */; }; + D5D961B914E6AF0C001D1B9D /* Icon_lite.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D961AC14E6AF0C001D1B9D /* Icon_lite.png */; }; + D5D961BA14E6AF0C001D1B9D /* Icon-72_lite.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D961AD14E6AF0C001D1B9D /* Icon-72_lite.png */; }; + D5D961BB14E6AF0C001D1B9D /* Icon-72_lite.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D961AD14E6AF0C001D1B9D /* Icon-72_lite.png */; }; + D5D961BC14E6AF0C001D1B9D /* Icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D961AE14E6AF0C001D1B9D /* Icon-72.png */; }; + D5D961BD14E6AF0C001D1B9D /* Icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D961AE14E6AF0C001D1B9D /* Icon-72.png */; }; + D5D961BE14E6AF0C001D1B9D /* Icon-Small_lite.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D961AF14E6AF0C001D1B9D /* Icon-Small_lite.png */; }; + D5D961BF14E6AF0C001D1B9D /* Icon-Small_lite.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D961AF14E6AF0C001D1B9D /* Icon-Small_lite.png */; }; + D5D961C014E6AF0C001D1B9D /* Icon-Small-50_lite.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D961B014E6AF0C001D1B9D /* Icon-Small-50_lite.png */; }; + D5D961C114E6AF0C001D1B9D /* Icon-Small-50_lite.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D961B014E6AF0C001D1B9D /* Icon-Small-50_lite.png */; }; + D5D961C214E6AF0C001D1B9D /* Icon-Small-50.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D961B114E6AF0C001D1B9D /* Icon-Small-50.png */; }; + D5D961C314E6AF0C001D1B9D /* Icon-Small-50.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D961B114E6AF0C001D1B9D /* Icon-Small-50.png */; }; + D5D961C414E6AF0C001D1B9D /* Icon-Small.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D961B214E6AF0C001D1B9D /* Icon-Small.png */; }; + D5D961C514E6AF0C001D1B9D /* Icon-Small.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D961B214E6AF0C001D1B9D /* Icon-Small.png */; }; + D5D961C614E6AF0C001D1B9D /* Icon-Small@2x_lite.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D961B314E6AF0C001D1B9D /* Icon-Small@2x_lite.png */; }; + D5D961C714E6AF0C001D1B9D /* Icon-Small@2x_lite.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D961B314E6AF0C001D1B9D /* Icon-Small@2x_lite.png */; }; + D5D961C814E6AF0C001D1B9D /* Icon-Small@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D961B414E6AF0C001D1B9D /* Icon-Small@2x.png */; }; + D5D961C914E6AF0C001D1B9D /* Icon-Small@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D961B414E6AF0C001D1B9D /* Icon-Small@2x.png */; }; + D5D961CA14E6AF0C001D1B9D /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D961B514E6AF0C001D1B9D /* Icon.png */; }; + D5D961CB14E6AF0C001D1B9D /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D961B514E6AF0C001D1B9D /* Icon.png */; }; + D5D961CC14E6AF0C001D1B9D /* Icon@2x_lite.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D961B614E6AF0C001D1B9D /* Icon@2x_lite.png */; }; + D5D961CD14E6AF0C001D1B9D /* Icon@2x_lite.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D961B614E6AF0C001D1B9D /* Icon@2x_lite.png */; }; + D5D961CE14E6AF0C001D1B9D /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D961B714E6AF0C001D1B9D /* Icon@2x.png */; }; + D5D961CF14E6AF0C001D1B9D /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D5D961B714E6AF0C001D1B9D /* Icon@2x.png */; }; + D5E1BA9B1451C8A0007DCC4F /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D5E1BA9A1451C8A0007DCC4F /* Default@2x.png */; }; + D5E1BA9F1451CA2F007DCC4F /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = D5E1BA981451C881007DCC4F /* Default.png */; }; + D5F0772314599DC700EC30FB /* terrain.pvr4 in Resources */ = {isa = PBXBuildFile; fileRef = D5F0772214599DC700EC30FB /* terrain.pvr4 */; }; + D5F07737145DE04300EC30FB /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5F07736145DE04200EC30FB /* OpenAL.framework */; }; + D5F07739145EB1F500EC30FB /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5F07738145EB1F300EC30FB /* AVFoundation.framework */; }; + D5F07745145EF7A000EC30FB /* Default-Landscape~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = D5F07744145EF79B00EC30FB /* Default-Landscape~ipad.png */; }; + D5F3B7CA14548E7900D25470 /* IASKAppSettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F3B7A414548E7900D25470 /* IASKAppSettingsViewController.m */; }; + D5F3B7CB14548E7900D25470 /* IASKAppSettingsWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F3B7A614548E7900D25470 /* IASKAppSettingsWebViewController.m */; }; + D5F3B7CC14548E7900D25470 /* IASKSpecifierValuesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F3B7A814548E7900D25470 /* IASKSpecifierValuesViewController.m */; }; + D5F3B7CD14548E7900D25470 /* IASKSettingsReader.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F3B7AB14548E7900D25470 /* IASKSettingsReader.m */; }; + D5F3B7CE14548E7900D25470 /* IASKSettingsStore.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F3B7AD14548E7900D25470 /* IASKSettingsStore.m */; }; + D5F3B7CF14548E7900D25470 /* IASKSettingsStoreFile.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F3B7AF14548E7900D25470 /* IASKSettingsStoreFile.m */; }; + D5F3B7D014548E7900D25470 /* IASKSettingsStoreUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F3B7B114548E7900D25470 /* IASKSettingsStoreUserDefaults.m */; }; + D5F3B7D114548E7900D25470 /* IASKSpecifier.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F3B7B314548E7900D25470 /* IASKSpecifier.m */; }; + D5F3B7D214548E7900D25470 /* IASKPSSliderSpecifierViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F3B7B614548E7900D25470 /* IASKPSSliderSpecifierViewCell.m */; }; + D5F3B7D314548E7900D25470 /* IASKPSTextFieldSpecifierViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F3B7B814548E7900D25470 /* IASKPSTextFieldSpecifierViewCell.m */; }; + D5F3B7D414548E7900D25470 /* IASKPSTitleValueSpecifierViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F3B7BA14548E7900D25470 /* IASKPSTitleValueSpecifierViewCell.m */; }; + D5F3B7D514548E7900D25470 /* IASKPSToggleSwitchSpecifierViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F3B7BC14548E7900D25470 /* IASKPSToggleSwitchSpecifierViewCell.m */; }; + D5F3B7D614548E7900D25470 /* IASKSlider.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F3B7BE14548E7900D25470 /* IASKSlider.m */; }; + D5F3B7D714548E7900D25470 /* IASKSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F3B7C014548E7900D25470 /* IASKSwitch.m */; }; + D5F3B7D814548E7900D25470 /* IASKTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = D5F3B7C214548E7900D25470 /* IASKTextField.m */; }; + D5F3B7D914548E7900D25470 /* IASKAppSettingsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D5F3B7C414548E7900D25470 /* IASKAppSettingsView.xib */; }; + D5F3B7DA14548E7900D25470 /* IASKAppSettingsWebView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D5F3B7C514548E7900D25470 /* IASKAppSettingsWebView.xib */; }; + D5F3B7DB14548E7900D25470 /* IASKPSSliderSpecifierViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = D5F3B7C614548E7900D25470 /* IASKPSSliderSpecifierViewCell.xib */; }; + D5F3B7DC14548E7900D25470 /* IASKPSTextFieldSpecifierViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = D5F3B7C714548E7900D25470 /* IASKPSTextFieldSpecifierViewCell.xib */; }; + D5F3B7DD14548E7900D25470 /* IASKPSToggleSwitchSpecifierViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = D5F3B7C814548E7900D25470 /* IASKPSToggleSwitchSpecifierViewCell.xib */; }; + D5F3B7DE14548E7900D25470 /* IASKSpecifierValuesView.xib in Resources */ = {isa = PBXBuildFile; fileRef = D5F3B7C914548E7900D25470 /* IASKSpecifierValuesView.xib */; }; + D5F3B7E51454930400D25470 /* InAppSettings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = D5F3B7E41454930400D25470 /* InAppSettings.bundle */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 04004532169EE72E003EB6FA /* clouds.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = clouds.png; path = environment/clouds.png; sourceTree = ""; }; + 0400453516A41236003EB6FA /* HeavyTile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HeavyTile.cpp; sourceTree = ""; }; + 0400453616A41236003EB6FA /* HeavyTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HeavyTile.h; sourceTree = ""; }; + 0400453816A4125B003EB6FA /* FallingTileRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FallingTileRenderer.cpp; sourceTree = ""; }; + 0400453916A4125B003EB6FA /* FallingTileRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FallingTileRenderer.h; sourceTree = ""; }; + 0413970516A82E1E008A9F1A /* ArmorItem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ArmorItem.cpp; sourceTree = ""; }; + 0413970616A82E1E008A9F1A /* ArmorItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ArmorItem.h; sourceTree = ""; }; + 0413970916A82E6B008A9F1A /* CraftingFilters.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CraftingFilters.cpp; path = crafting/CraftingFilters.cpp; sourceTree = ""; }; + 0413970A16A82E6B008A9F1A /* CraftingFilters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CraftingFilters.h; path = crafting/CraftingFilters.h; sourceTree = ""; }; + 0413970B16A82E6B008A9F1A /* StonecutterScreen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = StonecutterScreen.cpp; path = crafting/StonecutterScreen.cpp; sourceTree = ""; }; + 0413970C16A82E6B008A9F1A /* StonecutterScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StonecutterScreen.h; path = crafting/StonecutterScreen.h; sourceTree = ""; }; + 0413970F16A82E7B008A9F1A /* ArmorScreen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ArmorScreen.cpp; sourceTree = ""; }; + 0413971016A82E7B008A9F1A /* ArmorScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ArmorScreen.h; sourceTree = ""; }; + 0413971216A82EB9008A9F1A /* ArmorRecipes.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ArmorRecipes.cpp; sourceTree = ""; }; + 0413971316A82EB9008A9F1A /* ArmorRecipes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ArmorRecipes.h; sourceTree = ""; }; + 0413971416A82EB9008A9F1A /* OreRecipes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OreRecipes.h; sourceTree = ""; }; + 0413971616A82EF5008A9F1A /* StairTile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StairTile.cpp; sourceTree = ""; }; + 0419D997167F201B0080CB96 /* ChestModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChestModel.h; sourceTree = ""; }; + 0419D998167F201B0080CB96 /* SheepFurModel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SheepFurModel.cpp; sourceTree = ""; }; + 0419D999167F201B0080CB96 /* SheepModel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SheepModel.cpp; sourceTree = ""; }; + 0419D99A167F201B0080CB96 /* SignModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SignModel.h; sourceTree = ""; }; + 0419D99D167F206A0080CB96 /* CommandServer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CommandServer.cpp; path = command/CommandServer.cpp; sourceTree = ""; }; + 0419D99E167F206A0080CB96 /* CommandServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CommandServer.h; path = command/CommandServer.h; sourceTree = ""; }; + 0419D9A1167F20CC0080CB96 /* SheepRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SheepRenderer.cpp; sourceTree = ""; }; + 0419D9A3167F211B0080CB96 /* BaseContainerScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BaseContainerScreen.h; sourceTree = ""; }; + 0419D9A4167F211B0080CB96 /* ChooseLevelScreen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ChooseLevelScreen.cpp; sourceTree = ""; }; + 0419D9A5167F211B0080CB96 /* ChooseLevelScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChooseLevelScreen.h; sourceTree = ""; }; + 0419D9A6167F211B0080CB96 /* DeathScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeathScreen.h; sourceTree = ""; }; + 0419D9A7167F211B0080CB96 /* SimpleChooseLevelScreen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SimpleChooseLevelScreen.cpp; sourceTree = ""; }; + 0419D9A8167F211B0080CB96 /* SimpleChooseLevelScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleChooseLevelScreen.h; sourceTree = ""; }; + 0419D9A9167F211B0080CB96 /* TextEditScreen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TextEditScreen.cpp; sourceTree = ""; }; + 0419D9AA167F211B0080CB96 /* TextEditScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextEditScreen.h; sourceTree = ""; }; + 0419D9AE167F21BC0080CB96 /* PaneCraftingScreen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PaneCraftingScreen.cpp; path = crafting/PaneCraftingScreen.cpp; sourceTree = ""; }; + 0419D9AF167F21BC0080CB96 /* PaneCraftingScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PaneCraftingScreen.h; path = crafting/PaneCraftingScreen.h; sourceTree = ""; }; + 0419D9B0167F21BC0080CB96 /* WorkbenchScreen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WorkbenchScreen.cpp; path = crafting/WorkbenchScreen.cpp; sourceTree = ""; }; + 0419D9B1167F21BC0080CB96 /* WorkbenchScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WorkbenchScreen.h; path = crafting/WorkbenchScreen.h; sourceTree = ""; }; + 0419D9B5167F22150080CB96 /* AgableMob.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AgableMob.cpp; sourceTree = ""; }; + 0419D9B6167F22150080CB96 /* AgableMob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AgableMob.h; sourceTree = ""; }; + 0419D9B8167F2A720080CB96 /* ShowKeyboardView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShowKeyboardView.h; sourceTree = ""; }; + 0419D9B9167F2A720080CB96 /* ShowKeyboardView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ShowKeyboardView.mm; sourceTree = ""; }; + 0425EB9616A94D14000C7483 /* chain_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chain_1.png; sourceTree = ""; }; + 0425EB9716A94D14000C7483 /* chain_2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chain_2.png; sourceTree = ""; }; + 0425EB9816A94D14000C7483 /* cloth_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = cloth_1.png; sourceTree = ""; }; + 0425EB9916A94D14000C7483 /* cloth_2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = cloth_2.png; sourceTree = ""; }; + 0425EB9A16A94D14000C7483 /* diamond_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = diamond_1.png; sourceTree = ""; }; + 0425EB9B16A94D14000C7483 /* diamond_2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = diamond_2.png; sourceTree = ""; }; + 0425EB9C16A94D14000C7483 /* gold_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = gold_1.png; sourceTree = ""; }; + 0425EB9D16A94D14000C7483 /* gold_2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = gold_2.png; sourceTree = ""; }; + 0425EB9E16A94D14000C7483 /* iron_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = iron_1.png; sourceTree = ""; }; + 0425EB9F16A94D14000C7483 /* iron_2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = iron_2.png; sourceTree = ""; }; + 042A91A116B17517007ABBC6 /* GButton.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GButton.cpp; sourceTree = ""; }; + 042A91A216B17517007ABBC6 /* GButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GButton.h; sourceTree = ""; }; + 042A91A316B17517007ABBC6 /* GuiElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GuiElement.cpp; sourceTree = ""; }; + 042A91A416B17517007ABBC6 /* GuiElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GuiElement.h; sourceTree = ""; }; + 042A91A516B17517007ABBC6 /* NinePatch.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NinePatch.cpp; sourceTree = ""; }; + 042A91A616B17517007ABBC6 /* NinePatch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NinePatch.h; sourceTree = ""; }; + 042A91A716B17517007ABBC6 /* OptionsGroup.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OptionsGroup.cpp; sourceTree = ""; }; + 042A91A816B17517007ABBC6 /* OptionsGroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OptionsGroup.h; sourceTree = ""; }; + 042A91A916B17517007ABBC6 /* OptionsPane.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OptionsPane.cpp; sourceTree = ""; }; + 042A91AA16B17517007ABBC6 /* OptionsPane.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OptionsPane.h; sourceTree = ""; }; + 042A91AB16B17517007ABBC6 /* TextBox.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TextBox.cpp; sourceTree = ""; }; + 042A91AC16B17517007ABBC6 /* TextBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextBox.h; sourceTree = ""; }; + 044129061682FF9600B70EE6 /* MouseHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MouseHandler.cpp; sourceTree = ""; }; + 9D293CE616071C08000305C8 /* CreateNewWorld_iphone.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = CreateNewWorld_iphone.xib; path = minecraftpe/dialogs/CreateNewWorld_iphone.xib; sourceTree = ""; }; + 9D293CEA160720D6000305C8 /* worldname_iphone5_3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = worldname_iphone5_3.png; sourceTree = ""; }; + 9D959AFF16036BEE00E23A6F /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; + D51A8B01146A200000E5D720 /* minecraftpedemo-info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "minecraftpedemo-info.plist"; sourceTree = ""; }; + D51DC73514581D4E00E3D761 /* itemframe.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = itemframe.png; sourceTree = ""; }; + D51DC74114592B8A00E3D761 /* PVRTexture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PVRTexture.h; sourceTree = ""; }; + D51DC74214592B8A00E3D761 /* PVRTexture.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PVRTexture.m; sourceTree = ""; }; + D5251CB61538192700FC82C8 /* _FindFirst.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = _FindFirst.cpp; sourceTree = ""; }; + D5251CB71538192700FC82C8 /* _FindFirst.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _FindFirst.h; sourceTree = ""; }; + D5251CB81538192700FC82C8 /* AutopatcherPatchContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AutopatcherPatchContext.h; sourceTree = ""; }; + D5251CB91538192700FC82C8 /* AutopatcherRepositoryInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AutopatcherRepositoryInterface.h; sourceTree = ""; }; + D5251CBA1538192700FC82C8 /* BitStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BitStream.cpp; sourceTree = ""; }; + D5251CBB1538192700FC82C8 /* BitStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitStream.h; sourceTree = ""; }; + D5251CBC1538192700FC82C8 /* CCRakNetSlidingWindow.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCRakNetSlidingWindow.cpp; sourceTree = ""; }; + D5251CBD1538192700FC82C8 /* CCRakNetSlidingWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCRakNetSlidingWindow.h; sourceTree = ""; }; + D5251CBE1538192700FC82C8 /* CCRakNetUDT.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCRakNetUDT.cpp; sourceTree = ""; }; + D5251CBF1538192700FC82C8 /* CCRakNetUDT.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCRakNetUDT.h; sourceTree = ""; }; + D5251CC01538192700FC82C8 /* CheckSum.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CheckSum.cpp; sourceTree = ""; }; + D5251CC11538192700FC82C8 /* CheckSum.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CheckSum.h; sourceTree = ""; }; + D5251CC21538192700FC82C8 /* CloudClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CloudClient.cpp; sourceTree = ""; }; + D5251CC31538192700FC82C8 /* CloudClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CloudClient.h; sourceTree = ""; }; + D5251CC41538192700FC82C8 /* CloudCommon.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CloudCommon.cpp; sourceTree = ""; }; + D5251CC51538192700FC82C8 /* CloudCommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CloudCommon.h; sourceTree = ""; }; + D5251CC61538192700FC82C8 /* CloudServer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CloudServer.cpp; sourceTree = ""; }; + D5251CC71538192700FC82C8 /* CloudServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CloudServer.h; sourceTree = ""; }; + D5251CC81538192700FC82C8 /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = ""; }; + D5251CC91538192700FC82C8 /* CommandParserInterface.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CommandParserInterface.cpp; sourceTree = ""; }; + D5251CCA1538192700FC82C8 /* CommandParserInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CommandParserInterface.h; sourceTree = ""; }; + D5251CCB1538192700FC82C8 /* ConnectionGraph2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ConnectionGraph2.cpp; sourceTree = ""; }; + D5251CCC1538192700FC82C8 /* ConnectionGraph2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConnectionGraph2.h; sourceTree = ""; }; + D5251CCD1538192700FC82C8 /* ConsoleServer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ConsoleServer.cpp; sourceTree = ""; }; + D5251CCE1538192700FC82C8 /* ConsoleServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConsoleServer.h; sourceTree = ""; }; + D5251CCF1538192700FC82C8 /* DataCompressor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DataCompressor.cpp; sourceTree = ""; }; + D5251CD01538192700FC82C8 /* DataCompressor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataCompressor.h; sourceTree = ""; }; + D5251CD11538192700FC82C8 /* DirectoryDeltaTransfer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DirectoryDeltaTransfer.cpp; sourceTree = ""; }; + D5251CD21538192700FC82C8 /* DirectoryDeltaTransfer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DirectoryDeltaTransfer.h; sourceTree = ""; }; + D5251CD31538192700FC82C8 /* DS_BinarySearchTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DS_BinarySearchTree.h; sourceTree = ""; }; + D5251CD41538192700FC82C8 /* DS_BPlusTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DS_BPlusTree.h; sourceTree = ""; }; + D5251CD51538192700FC82C8 /* DS_BytePool.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DS_BytePool.cpp; sourceTree = ""; }; + D5251CD61538192700FC82C8 /* DS_BytePool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DS_BytePool.h; sourceTree = ""; }; + D5251CD71538192700FC82C8 /* DS_ByteQueue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DS_ByteQueue.cpp; sourceTree = ""; }; + D5251CD81538192700FC82C8 /* DS_ByteQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DS_ByteQueue.h; sourceTree = ""; }; + D5251CD91538192700FC82C8 /* DS_Hash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DS_Hash.h; sourceTree = ""; }; + D5251CDA1538192700FC82C8 /* DS_Heap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DS_Heap.h; sourceTree = ""; }; + D5251CDB1538192700FC82C8 /* DS_HuffmanEncodingTree.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DS_HuffmanEncodingTree.cpp; sourceTree = ""; }; + D5251CDC1538192700FC82C8 /* DS_HuffmanEncodingTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DS_HuffmanEncodingTree.h; sourceTree = ""; }; + D5251CDD1538192700FC82C8 /* DS_HuffmanEncodingTreeFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DS_HuffmanEncodingTreeFactory.h; sourceTree = ""; }; + D5251CDE1538192700FC82C8 /* DS_HuffmanEncodingTreeNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DS_HuffmanEncodingTreeNode.h; sourceTree = ""; }; + D5251CDF1538192700FC82C8 /* DS_LinkedList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DS_LinkedList.h; sourceTree = ""; }; + D5251CE01538192700FC82C8 /* DS_List.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DS_List.h; sourceTree = ""; }; + D5251CE11538192700FC82C8 /* DS_Map.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DS_Map.h; sourceTree = ""; }; + D5251CE21538192700FC82C8 /* DS_MemoryPool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DS_MemoryPool.h; sourceTree = ""; }; + D5251CE31538192700FC82C8 /* DS_Multilist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DS_Multilist.h; sourceTree = ""; }; + D5251CE41538192700FC82C8 /* DS_OrderedChannelHeap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DS_OrderedChannelHeap.h; sourceTree = ""; }; + D5251CE51538192700FC82C8 /* DS_OrderedList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DS_OrderedList.h; sourceTree = ""; }; + D5251CE61538192700FC82C8 /* DS_Queue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DS_Queue.h; sourceTree = ""; }; + D5251CE71538192700FC82C8 /* DS_QueueLinkedList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DS_QueueLinkedList.h; sourceTree = ""; }; + D5251CE81538192700FC82C8 /* DS_RangeList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DS_RangeList.h; sourceTree = ""; }; + D5251CE91538192700FC82C8 /* DS_Table.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DS_Table.cpp; sourceTree = ""; }; + D5251CEA1538192700FC82C8 /* DS_Table.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DS_Table.h; sourceTree = ""; }; + D5251CEB1538192700FC82C8 /* DS_ThreadsafeAllocatingQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DS_ThreadsafeAllocatingQueue.h; sourceTree = ""; }; + D5251CEC1538192700FC82C8 /* DS_Tree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DS_Tree.h; sourceTree = ""; }; + D5251CED1538192700FC82C8 /* DS_WeightedGraph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DS_WeightedGraph.h; sourceTree = ""; }; + D5251CEE1538192700FC82C8 /* DynDNS.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DynDNS.cpp; sourceTree = ""; }; + D5251CEF1538192700FC82C8 /* DynDNS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DynDNS.h; sourceTree = ""; }; + D5251CF01538192700FC82C8 /* EmailSender.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EmailSender.cpp; sourceTree = ""; }; + D5251CF11538192700FC82C8 /* EmailSender.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EmailSender.h; sourceTree = ""; }; + D5251CF21538192700FC82C8 /* EncodeClassName.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EncodeClassName.cpp; sourceTree = ""; }; + D5251CF31538192700FC82C8 /* EpochTimeToString.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EpochTimeToString.cpp; sourceTree = ""; }; + D5251CF41538192700FC82C8 /* EpochTimeToString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EpochTimeToString.h; sourceTree = ""; }; + D5251CF51538192700FC82C8 /* Export.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Export.h; sourceTree = ""; }; + D5251CF61538192700FC82C8 /* FileList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FileList.cpp; sourceTree = ""; }; + D5251CF71538192700FC82C8 /* FileList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileList.h; sourceTree = ""; }; + D5251CF81538192700FC82C8 /* FileListNodeContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileListNodeContext.h; sourceTree = ""; }; + D5251CF91538192700FC82C8 /* FileListTransfer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FileListTransfer.cpp; sourceTree = ""; }; + D5251CFA1538192700FC82C8 /* FileListTransfer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileListTransfer.h; sourceTree = ""; }; + D5251CFB1538192700FC82C8 /* FileListTransferCBInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileListTransferCBInterface.h; sourceTree = ""; }; + D5251CFC1538192700FC82C8 /* FileOperations.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FileOperations.cpp; sourceTree = ""; }; + D5251CFD1538192700FC82C8 /* FileOperations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileOperations.h; sourceTree = ""; }; + D5251CFE1538192700FC82C8 /* FormatString.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FormatString.cpp; sourceTree = ""; }; + D5251CFF1538192700FC82C8 /* FormatString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FormatString.h; sourceTree = ""; }; + D5251D001538192700FC82C8 /* FullyConnectedMesh2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FullyConnectedMesh2.cpp; sourceTree = ""; }; + D5251D011538192700FC82C8 /* FullyConnectedMesh2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FullyConnectedMesh2.h; sourceTree = ""; }; + D5251D021538192700FC82C8 /* Getche.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Getche.cpp; sourceTree = ""; }; + D5251D031538192700FC82C8 /* Getche.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Getche.h; sourceTree = ""; }; + D5251D041538192700FC82C8 /* Gets.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Gets.cpp; sourceTree = ""; }; + D5251D051538192700FC82C8 /* Gets.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Gets.h; sourceTree = ""; }; + D5251D061538192700FC82C8 /* GetTime.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GetTime.cpp; sourceTree = ""; }; + D5251D071538192700FC82C8 /* GetTime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GetTime.h; sourceTree = ""; }; + D5251D081538192700FC82C8 /* gettimeofday.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gettimeofday.cpp; sourceTree = ""; }; + D5251D091538192700FC82C8 /* gettimeofday.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gettimeofday.h; sourceTree = ""; }; + D5251D0A1538192700FC82C8 /* GridSectorizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GridSectorizer.cpp; sourceTree = ""; }; + D5251D0B1538192700FC82C8 /* GridSectorizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GridSectorizer.h; sourceTree = ""; }; + D5251D0C1538192700FC82C8 /* HTTPConnection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HTTPConnection.cpp; sourceTree = ""; }; + D5251D0D1538192700FC82C8 /* HTTPConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTTPConnection.h; sourceTree = ""; }; + D5251D0E1538192700FC82C8 /* IncrementalReadInterface.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IncrementalReadInterface.cpp; sourceTree = ""; }; + D5251D0F1538192700FC82C8 /* IncrementalReadInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IncrementalReadInterface.h; sourceTree = ""; }; + D5251D101538192700FC82C8 /* InternalPacket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InternalPacket.h; sourceTree = ""; }; + D5251D111538192700FC82C8 /* Itoa.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Itoa.cpp; sourceTree = ""; }; + D5251D121538192700FC82C8 /* Itoa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Itoa.h; sourceTree = ""; }; + D5251D131538192700FC82C8 /* Kbhit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Kbhit.h; sourceTree = ""; }; + D5251D141538192700FC82C8 /* LinuxStrings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LinuxStrings.cpp; sourceTree = ""; }; + D5251D151538192700FC82C8 /* LinuxStrings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LinuxStrings.h; sourceTree = ""; }; + D5251D161538192700FC82C8 /* LocklessTypes.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LocklessTypes.cpp; sourceTree = ""; }; + D5251D171538192700FC82C8 /* LocklessTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LocklessTypes.h; sourceTree = ""; }; + D5251D181538192700FC82C8 /* LogCommandParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LogCommandParser.cpp; sourceTree = ""; }; + D5251D191538192700FC82C8 /* LogCommandParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LogCommandParser.h; sourceTree = ""; }; + D5251D1A1538192700FC82C8 /* MessageFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MessageFilter.cpp; sourceTree = ""; }; + D5251D1B1538192700FC82C8 /* MessageFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MessageFilter.h; sourceTree = ""; }; + D5251D1C1538192700FC82C8 /* MessageIdentifiers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MessageIdentifiers.h; sourceTree = ""; }; + D5251D1D1538192700FC82C8 /* MTUSize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MTUSize.h; sourceTree = ""; }; + D5251D1E1538192700FC82C8 /* NativeFeatureIncludes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NativeFeatureIncludes.h; sourceTree = ""; }; + D5251D1F1538192700FC82C8 /* NativeFeatureIncludesOverrides.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NativeFeatureIncludesOverrides.h; sourceTree = ""; }; + D5251D201538192700FC82C8 /* NativeTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NativeTypes.h; sourceTree = ""; }; + D5251D211538192700FC82C8 /* NatPunchthroughClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NatPunchthroughClient.cpp; sourceTree = ""; }; + D5251D221538192700FC82C8 /* NatPunchthroughClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NatPunchthroughClient.h; sourceTree = ""; }; + D5251D231538192700FC82C8 /* NatPunchthroughServer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NatPunchthroughServer.cpp; sourceTree = ""; }; + D5251D241538192700FC82C8 /* NatPunchthroughServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NatPunchthroughServer.h; sourceTree = ""; }; + D5251D251538192700FC82C8 /* NatTypeDetectionClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NatTypeDetectionClient.cpp; sourceTree = ""; }; + D5251D261538192700FC82C8 /* NatTypeDetectionClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NatTypeDetectionClient.h; sourceTree = ""; }; + D5251D271538192700FC82C8 /* NatTypeDetectionCommon.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NatTypeDetectionCommon.cpp; sourceTree = ""; }; + D5251D281538192700FC82C8 /* NatTypeDetectionCommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NatTypeDetectionCommon.h; sourceTree = ""; }; + D5251D291538192700FC82C8 /* NatTypeDetectionServer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NatTypeDetectionServer.cpp; sourceTree = ""; }; + D5251D2A1538192700FC82C8 /* NatTypeDetectionServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NatTypeDetectionServer.h; sourceTree = ""; }; + D5251D2B1538192700FC82C8 /* NetworkIDManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkIDManager.cpp; sourceTree = ""; }; + D5251D2C1538192700FC82C8 /* NetworkIDManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkIDManager.h; sourceTree = ""; }; + D5251D2D1538192700FC82C8 /* NetworkIDObject.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkIDObject.cpp; sourceTree = ""; }; + D5251D2E1538192700FC82C8 /* NetworkIDObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkIDObject.h; sourceTree = ""; }; + D5251D2F1538192700FC82C8 /* PacketConsoleLogger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PacketConsoleLogger.cpp; sourceTree = ""; }; + D5251D301538192700FC82C8 /* PacketConsoleLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PacketConsoleLogger.h; sourceTree = ""; }; + D5251D311538192700FC82C8 /* PacketFileLogger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PacketFileLogger.cpp; sourceTree = ""; }; + D5251D321538192700FC82C8 /* PacketFileLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PacketFileLogger.h; sourceTree = ""; }; + D5251D331538192700FC82C8 /* PacketizedTCP.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PacketizedTCP.cpp; sourceTree = ""; }; + D5251D341538192700FC82C8 /* PacketizedTCP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PacketizedTCP.h; sourceTree = ""; }; + D5251D351538192700FC82C8 /* PacketLogger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PacketLogger.cpp; sourceTree = ""; }; + D5251D361538192700FC82C8 /* PacketLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PacketLogger.h; sourceTree = ""; }; + D5251D371538192700FC82C8 /* PacketOutputWindowLogger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PacketOutputWindowLogger.cpp; sourceTree = ""; }; + D5251D381538192700FC82C8 /* PacketOutputWindowLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PacketOutputWindowLogger.h; sourceTree = ""; }; + D5251D391538192700FC82C8 /* PacketPool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PacketPool.h; sourceTree = ""; }; + D5251D3A1538192700FC82C8 /* PacketPriority.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PacketPriority.h; sourceTree = ""; }; + D5251D3B1538192700FC82C8 /* PluginInterface2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PluginInterface2.cpp; sourceTree = ""; }; + D5251D3C1538192700FC82C8 /* PluginInterface2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PluginInterface2.h; sourceTree = ""; }; + D5251D3D1538192700FC82C8 /* PS3Includes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PS3Includes.h; sourceTree = ""; }; + D5251D3E1538192700FC82C8 /* Rackspace.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Rackspace.cpp; sourceTree = ""; }; + D5251D3F1538192700FC82C8 /* Rackspace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Rackspace.h; sourceTree = ""; }; + D5251D401538192700FC82C8 /* RakAlloca.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RakAlloca.h; sourceTree = ""; }; + D5251D411538192700FC82C8 /* RakAssert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RakAssert.h; sourceTree = ""; }; + D5251D421538192700FC82C8 /* RakMemoryOverride.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RakMemoryOverride.cpp; sourceTree = ""; }; + D5251D431538192700FC82C8 /* RakMemoryOverride.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RakMemoryOverride.h; sourceTree = ""; }; + D5251D471538192700FC82C8 /* RakNetCommandParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RakNetCommandParser.cpp; sourceTree = ""; }; + D5251D481538192700FC82C8 /* RakNetCommandParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RakNetCommandParser.h; sourceTree = ""; }; + D5251D491538192700FC82C8 /* RakNetDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RakNetDefines.h; sourceTree = ""; }; + D5251D4A1538192700FC82C8 /* RakNetDefinesOverrides.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RakNetDefinesOverrides.h; sourceTree = ""; }; + D5251D4B1538192700FC82C8 /* RakNetSmartPtr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RakNetSmartPtr.h; sourceTree = ""; }; + D5251D4C1538192700FC82C8 /* RakNetSocket.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RakNetSocket.cpp; sourceTree = ""; }; + D5251D4D1538192700FC82C8 /* RakNetSocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RakNetSocket.h; sourceTree = ""; }; + D5251D4E1538192700FC82C8 /* RakNetStatistics.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RakNetStatistics.cpp; sourceTree = ""; }; + D5251D4F1538192700FC82C8 /* RakNetStatistics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RakNetStatistics.h; sourceTree = ""; }; + D5251D501538192700FC82C8 /* RakNetTime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RakNetTime.h; sourceTree = ""; }; + D5251D511538192700FC82C8 /* RakNetTransport2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RakNetTransport2.cpp; sourceTree = ""; }; + D5251D521538192700FC82C8 /* RakNetTransport2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RakNetTransport2.h; sourceTree = ""; }; + D5251D531538192700FC82C8 /* RakNetTypes.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RakNetTypes.cpp; sourceTree = ""; }; + D5251D541538192700FC82C8 /* RakNetTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RakNetTypes.h; sourceTree = ""; }; + D5251D551538192700FC82C8 /* RakNetVersion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RakNetVersion.h; sourceTree = ""; }; + D5251D561538192700FC82C8 /* RakPeer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RakPeer.cpp; sourceTree = ""; }; + D5251D571538192700FC82C8 /* RakPeer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RakPeer.h; sourceTree = ""; }; + D5251D581538192700FC82C8 /* RakPeerInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RakPeerInterface.h; sourceTree = ""; }; + D5251D591538192700FC82C8 /* RakSleep.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RakSleep.cpp; sourceTree = ""; }; + D5251D5A1538192700FC82C8 /* RakSleep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RakSleep.h; sourceTree = ""; }; + D5251D5B1538192700FC82C8 /* RakString.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RakString.cpp; sourceTree = ""; }; + D5251D5C1538192700FC82C8 /* RakString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RakString.h; sourceTree = ""; }; + D5251D5D1538192700FC82C8 /* RakThread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RakThread.cpp; sourceTree = ""; }; + D5251D5E1538192700FC82C8 /* RakThread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RakThread.h; sourceTree = ""; }; + D5251D5F1538192700FC82C8 /* RakWString.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RakWString.cpp; sourceTree = ""; }; + D5251D601538192700FC82C8 /* RakWString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RakWString.h; sourceTree = ""; }; + D5251D611538192700FC82C8 /* Rand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Rand.cpp; sourceTree = ""; }; + D5251D621538192700FC82C8 /* Rand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Rand.h; sourceTree = ""; }; + D5251D631538192700FC82C8 /* rdlmalloc-options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "rdlmalloc-options.h"; sourceTree = ""; }; + D5251D641538192700FC82C8 /* rdlmalloc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rdlmalloc.cpp; sourceTree = ""; }; + D5251D651538192700FC82C8 /* rdlmalloc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rdlmalloc.h; sourceTree = ""; }; + D5251D661538192700FC82C8 /* ReadyEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ReadyEvent.cpp; sourceTree = ""; }; + D5251D671538192700FC82C8 /* ReadyEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReadyEvent.h; sourceTree = ""; }; + D5251D681538192700FC82C8 /* RefCountedObj.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RefCountedObj.h; sourceTree = ""; }; + D5251D691538192700FC82C8 /* ReliabilityLayer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ReliabilityLayer.cpp; sourceTree = ""; }; + D5251D6A1538192700FC82C8 /* ReliabilityLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReliabilityLayer.h; sourceTree = ""; }; + D5251D6B1538192700FC82C8 /* ReplicaEnums.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReplicaEnums.h; sourceTree = ""; }; + D5251D6C1538192700FC82C8 /* ReplicaManager3.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ReplicaManager3.cpp; sourceTree = ""; }; + D5251D6D1538192700FC82C8 /* ReplicaManager3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReplicaManager3.h; sourceTree = ""; }; + D5251D6E1538192700FC82C8 /* Router2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Router2.cpp; sourceTree = ""; }; + D5251D6F1538192700FC82C8 /* Router2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Router2.h; sourceTree = ""; }; + D5251D701538192700FC82C8 /* RPC4Plugin.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RPC4Plugin.cpp; sourceTree = ""; }; + D5251D711538192700FC82C8 /* RPC4Plugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RPC4Plugin.h; sourceTree = ""; }; + D5251D721538192700FC82C8 /* SecureHandshake.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SecureHandshake.cpp; sourceTree = ""; }; + D5251D731538192700FC82C8 /* SecureHandshake.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SecureHandshake.h; sourceTree = ""; }; + D5251D741538192700FC82C8 /* SendToThread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SendToThread.cpp; sourceTree = ""; }; + D5251D751538192700FC82C8 /* SendToThread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SendToThread.h; sourceTree = ""; }; + D5251D761538192700FC82C8 /* SHA1.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SHA1.cpp; sourceTree = ""; }; + D5251D771538192700FC82C8 /* SHA1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SHA1.h; sourceTree = ""; }; + D5251D781538192700FC82C8 /* SignaledEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SignaledEvent.cpp; sourceTree = ""; }; + D5251D791538192700FC82C8 /* SignaledEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SignaledEvent.h; sourceTree = ""; }; + D5251D7A1538192700FC82C8 /* SimpleMutex.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SimpleMutex.cpp; sourceTree = ""; }; + D5251D7B1538192700FC82C8 /* SimpleMutex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleMutex.h; sourceTree = ""; }; + D5251D7C1538192700FC82C8 /* SimpleTCPServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleTCPServer.h; sourceTree = ""; }; + D5251D7D1538192700FC82C8 /* SingleProducerConsumer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SingleProducerConsumer.h; sourceTree = ""; }; + D5251D7E1538192700FC82C8 /* SocketDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SocketDefines.h; sourceTree = ""; }; + D5251D7F1538192700FC82C8 /* SocketIncludes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SocketIncludes.h; sourceTree = ""; }; + D5251D801538192700FC82C8 /* SocketLayer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SocketLayer.cpp; sourceTree = ""; }; + D5251D811538192700FC82C8 /* SocketLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SocketLayer.h; sourceTree = ""; }; + D5251D821538192700FC82C8 /* StringCompressor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StringCompressor.cpp; sourceTree = ""; }; + D5251D831538192700FC82C8 /* StringCompressor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StringCompressor.h; sourceTree = ""; }; + D5251D841538192700FC82C8 /* StringTable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StringTable.cpp; sourceTree = ""; }; + D5251D851538192700FC82C8 /* StringTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StringTable.h; sourceTree = ""; }; + D5251D861538192700FC82C8 /* SuperFastHash.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SuperFastHash.cpp; sourceTree = ""; }; + D5251D871538192700FC82C8 /* SuperFastHash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SuperFastHash.h; sourceTree = ""; }; + D5251D881538192700FC82C8 /* TableSerializer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TableSerializer.cpp; sourceTree = ""; }; + D5251D891538192700FC82C8 /* TableSerializer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TableSerializer.h; sourceTree = ""; }; + D5251D8A1538192700FC82C8 /* TCPInterface.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TCPInterface.cpp; sourceTree = ""; }; + D5251D8B1538192700FC82C8 /* TCPInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TCPInterface.h; sourceTree = ""; }; + D5251D8C1538192700FC82C8 /* TeamBalancer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TeamBalancer.cpp; sourceTree = ""; }; + D5251D8D1538192700FC82C8 /* TeamBalancer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TeamBalancer.h; sourceTree = ""; }; + D5251D8E1538192700FC82C8 /* TelnetTransport.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TelnetTransport.cpp; sourceTree = ""; }; + D5251D8F1538192700FC82C8 /* TelnetTransport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TelnetTransport.h; sourceTree = ""; }; + D5251D901538192700FC82C8 /* ThreadPool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThreadPool.h; sourceTree = ""; }; + D5251D911538192700FC82C8 /* ThreadsafePacketLogger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ThreadsafePacketLogger.cpp; sourceTree = ""; }; + D5251D921538192700FC82C8 /* ThreadsafePacketLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThreadsafePacketLogger.h; sourceTree = ""; }; + D5251D931538192700FC82C8 /* TransportInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TransportInterface.h; sourceTree = ""; }; + D5251D941538192700FC82C8 /* TwoWayAuthentication.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TwoWayAuthentication.cpp; sourceTree = ""; }; + D5251D951538192700FC82C8 /* TwoWayAuthentication.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TwoWayAuthentication.h; sourceTree = ""; }; + D5251D961538192700FC82C8 /* UDPForwarder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UDPForwarder.cpp; sourceTree = ""; }; + D5251D971538192700FC82C8 /* UDPForwarder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UDPForwarder.h; sourceTree = ""; }; + D5251D981538192700FC82C8 /* UDPProxyClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UDPProxyClient.cpp; sourceTree = ""; }; + D5251D991538192700FC82C8 /* UDPProxyClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UDPProxyClient.h; sourceTree = ""; }; + D5251D9A1538192700FC82C8 /* UDPProxyCommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UDPProxyCommon.h; sourceTree = ""; }; + D5251D9B1538192700FC82C8 /* UDPProxyCoordinator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UDPProxyCoordinator.cpp; sourceTree = ""; }; + D5251D9C1538192700FC82C8 /* UDPProxyCoordinator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UDPProxyCoordinator.h; sourceTree = ""; }; + D5251D9D1538192700FC82C8 /* UDPProxyServer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UDPProxyServer.cpp; sourceTree = ""; }; + D5251D9E1538192700FC82C8 /* UDPProxyServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UDPProxyServer.h; sourceTree = ""; }; + D5251D9F1538192700FC82C8 /* VariableDeltaSerializer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VariableDeltaSerializer.cpp; sourceTree = ""; }; + D5251DA01538192700FC82C8 /* VariableDeltaSerializer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VariableDeltaSerializer.h; sourceTree = ""; }; + D5251DA11538192700FC82C8 /* VariableListDeltaTracker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VariableListDeltaTracker.cpp; sourceTree = ""; }; + D5251DA21538192700FC82C8 /* VariableListDeltaTracker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VariableListDeltaTracker.h; sourceTree = ""; }; + D5251DA31538192700FC82C8 /* VariadicSQLParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VariadicSQLParser.cpp; sourceTree = ""; }; + D5251DA41538192700FC82C8 /* VariadicSQLParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VariadicSQLParser.h; sourceTree = ""; }; + D5251DA51538192700FC82C8 /* VitaIncludes.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VitaIncludes.cpp; sourceTree = ""; }; + D5251DA61538192700FC82C8 /* VitaIncludes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VitaIncludes.h; sourceTree = ""; }; + D5251DA71538192700FC82C8 /* WindowsIncludes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WindowsIncludes.h; sourceTree = ""; }; + D5251DA81538192700FC82C8 /* WSAStartupSingleton.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WSAStartupSingleton.cpp; sourceTree = ""; }; + D5251DA91538192700FC82C8 /* WSAStartupSingleton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WSAStartupSingleton.h; sourceTree = ""; }; + D5251DAA1538192700FC82C8 /* XBox360Includes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XBox360Includes.h; sourceTree = ""; }; + D5251E6F15381D0500FC82C8 /* spritesheet.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = spritesheet.png; sourceTree = ""; }; + D5251E73153823DC00FC82C8 /* en_US.lang */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = en_US.lang; sourceTree = ""; }; + D5251E901539A9AF00FC82C8 /* SoundEngine.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SoundEngine.mm; sourceTree = ""; }; + D54493EA15D13BF0005FA9B0 /* BedTile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BedTile.cpp; sourceTree = ""; }; + D54493EB15D13BF0005FA9B0 /* BedTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BedTile.h; sourceTree = ""; }; + D54493EC15D13BF0005FA9B0 /* CropTile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CropTile.cpp; sourceTree = ""; }; + D54493ED15D13BF0005FA9B0 /* CropTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CropTile.h; sourceTree = ""; }; + D54493EE15D13BF0005FA9B0 /* GrassTile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GrassTile.cpp; sourceTree = ""; }; + D54493F615D13C35005FA9B0 /* HoeItem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HoeItem.cpp; sourceTree = ""; }; + D54493F715D13C35005FA9B0 /* HoeItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HoeItem.h; sourceTree = ""; }; + D54493F815D13C35005FA9B0 /* SeedItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SeedItem.h; sourceTree = ""; }; + D54493FB15D13C59005FA9B0 /* BedItem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BedItem.cpp; sourceTree = ""; }; + D54493FC15D13C59005FA9B0 /* BedItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BedItem.h; sourceTree = ""; }; + D54493FF15D13C93005FA9B0 /* BowlFoodItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BowlFoodItem.h; sourceTree = ""; }; + D544940015D13C93005FA9B0 /* ClothTileItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ClothTileItem.h; sourceTree = ""; }; + D544940115D13C93005FA9B0 /* CoalItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CoalItem.h; sourceTree = ""; }; + D544940215D13C93005FA9B0 /* FoodItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FoodItem.h; sourceTree = ""; }; + D544940415D13DB7005FA9B0 /* ServerLevel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ServerLevel.cpp; sourceTree = ""; }; + D544940515D13DB7005FA9B0 /* ServerLevel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ServerLevel.h; sourceTree = ""; }; + D544940615D13DB7005FA9B0 /* ServerPlayer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ServerPlayer.cpp; sourceTree = ""; }; + D544940715D13DB7005FA9B0 /* ServerPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ServerPlayer.h; sourceTree = ""; }; + D544940D15D13E27005FA9B0 /* FoodConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FoodConstants.h; sourceTree = ""; }; + D544940E15D13E27005FA9B0 /* SimpleFoodData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SimpleFoodData.cpp; sourceTree = ""; }; + D544940F15D13E27005FA9B0 /* SimpleFoodData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimpleFoodData.h; sourceTree = ""; }; + D544941215D13E5A005FA9B0 /* FolderMethods.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FolderMethods.cpp; sourceTree = ""; }; + D544941515D13EE3005FA9B0 /* LevelStorageSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LevelStorageSource.cpp; sourceTree = ""; }; + D544941815D13F06005FA9B0 /* TallGrass.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TallGrass.cpp; sourceTree = ""; }; + D544941915D13F06005FA9B0 /* TallGrass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TallGrass.h; sourceTree = ""; }; + D544941C15D13F45005FA9B0 /* PlayerRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PlayerRenderer.cpp; sourceTree = ""; }; + D544941D15D13F45005FA9B0 /* PlayerRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlayerRenderer.h; sourceTree = ""; }; + D544942015D13F5E005FA9B0 /* RemotePlayer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RemotePlayer.cpp; sourceTree = ""; }; + D544942115D13F5E005FA9B0 /* RemotePlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RemotePlayer.h; sourceTree = ""; }; + D54954EC14E38FFC00685A35 /* cancel_0_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = cancel_0_1.png; sourceTree = ""; }; + D54954ED14E38FFC00685A35 /* cancel_0_3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = cancel_0_3.png; sourceTree = ""; }; + D54954EE14E38FFC00685A35 /* cancel_1_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = cancel_1_1.png; sourceTree = ""; }; + D54954EF14E38FFC00685A35 /* cancel_1_3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = cancel_1_3.png; sourceTree = ""; }; + D54954F014E38FFC00685A35 /* create_0_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = create_0_1.png; sourceTree = ""; }; + D54954F114E38FFC00685A35 /* create_0_3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = create_0_3.png; sourceTree = ""; }; + D54954F214E38FFC00685A35 /* create_1_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = create_1_1.png; sourceTree = ""; }; + D54954F314E38FFC00685A35 /* create_1_3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = create_1_3.png; sourceTree = ""; }; + D54954F414E38FFC00685A35 /* creative_0_3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = creative_0_3.png; sourceTree = ""; }; + D54954F514E38FFC00685A35 /* survival_0_3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = survival_0_3.png; sourceTree = ""; }; + D54954F614E38FFC00685A35 /* worldname.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = worldname.png; sourceTree = ""; }; + D54954F714E38FFC00685A35 /* worldname_3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = worldname_3.png; sourceTree = ""; }; + D549551114E3D86B00685A35 /* worldname_ipad_3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = worldname_ipad_3.png; sourceTree = ""; }; + D549551214E3D86B00685A35 /* worldname_ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = worldname_ipad.png; sourceTree = ""; }; + D549551314E3D86C00685A35 /* worldname_iphone_3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = worldname_iphone_3.png; sourceTree = ""; }; + D549551414E3D86D00685A35 /* worldname_iphone.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = worldname_iphone.png; sourceTree = ""; }; + D549551D14E3DC4300685A35 /* creative_1_3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = creative_1_3.png; sourceTree = ""; }; + D549551E14E3DC4300685A35 /* survival_1_3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = survival_1_3.png; sourceTree = ""; }; + D549552414E3EA0B00685A35 /* cancel_0_4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = cancel_0_4.png; sourceTree = ""; }; + D549552514E3EA0B00685A35 /* cancel_1_4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = cancel_1_4.png; sourceTree = ""; }; + D549552614E3EA0B00685A35 /* create_0_4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = create_0_4.png; sourceTree = ""; }; + D549552714E3EA0B00685A35 /* create_1_4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = create_1_4.png; sourceTree = ""; }; + D549552814E3EA0B00685A35 /* creative_1_4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = creative_1_4.png; sourceTree = ""; }; + D549552A14E3EA0B00685A35 /* survival_1_4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = survival_1_4.png; sourceTree = ""; }; + D549552C14E3EA0B00685A35 /* worldname_ipad_4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = worldname_ipad_4.png; sourceTree = ""; }; + D549553F14E3EAC100685A35 /* creative_0_4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = creative_0_4.png; sourceTree = ""; }; + D549554014E3EAC100685A35 /* survival_0_4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = survival_0_4.png; sourceTree = ""; }; + D55B201714595370002D9366 /* terrain.pvr */ = {isa = PBXFileReference; lastKnownFileType = file; path = terrain.pvr; sourceTree = ""; }; + D55B252A14598227002D9366 /* terrain.pvrtc */ = {isa = PBXFileReference; lastKnownFileType = file; path = terrain.pvrtc; sourceTree = ""; }; + D572D3AD144C6A1400E67862 /* default8.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = default8.png; sourceTree = ""; }; + D572D3AF144C6A1400E67862 /* background.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = background.png; sourceTree = ""; }; + D572D3B3144C6A1400E67862 /* default_world.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = default_world.png; sourceTree = ""; }; + D572D3B6144C6A1400E67862 /* gui.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = gui.png; sourceTree = ""; }; + D572D3B7144C6A1400E67862 /* gui_blocks.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = gui_blocks.png; sourceTree = ""; }; + D572D3B8144C6A1400E67862 /* icons.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icons.png; sourceTree = ""; }; + D572D3B9144C6A1400E67862 /* items.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = items.png; sourceTree = ""; }; + D572D3C1144C6A1400E67862 /* title.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = title.png; sourceTree = ""; }; + D572D3C2144C6A1400E67862 /* touchgui.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = touchgui.png; sourceTree = ""; }; + D572D3C4144C6A1400E67862 /* camera.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = camera.png; sourceTree = ""; }; + D572D3C6144C6A1400E67862 /* char.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = char.png; sourceTree = ""; }; + D572D3C7144C6A1400E67862 /* particles.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = particles.png; sourceTree = ""; }; + D572D3C8144C6A1400E67862 /* terrain.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = terrain.png; sourceTree = ""; }; + D572D3DF144CB23200E67862 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; + D584926C14FD234400741128 /* SharedConstants.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SharedConstants.cpp; sourceTree = ""; }; + D584926F14FD236700741128 /* Control.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Control.h; path = ai/control/Control.h; sourceTree = ""; }; + D584927014FD236700741128 /* JumpControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JumpControl.h; path = ai/control/JumpControl.h; sourceTree = ""; }; + D584927114FD236700741128 /* MoveControl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MoveControl.cpp; path = ai/control/MoveControl.cpp; sourceTree = ""; }; + D584927214FD236700741128 /* MoveControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MoveControl.h; path = ai/control/MoveControl.h; sourceTree = ""; }; + D584927714FD23A500741128 /* PathNavigation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PathNavigation.h; path = ai/PathNavigation.h; sourceTree = ""; }; + D584927814FD23A500741128 /* Sensing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Sensing.h; path = ai/Sensing.h; sourceTree = ""; }; + D584927914FD23B200741128 /* RandomPos.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RandomPos.h; path = ai/util/RandomPos.h; sourceTree = ""; }; + D584927A14FD23BF00741128 /* BreakDoorGoal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BreakDoorGoal.h; path = ai/goal/BreakDoorGoal.h; sourceTree = ""; }; + D584927B14FD23BF00741128 /* DoorInteractGoal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DoorInteractGoal.h; path = ai/goal/DoorInteractGoal.h; sourceTree = ""; }; + D584927C14FD23BF00741128 /* Goal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Goal.h; path = ai/goal/Goal.h; sourceTree = ""; }; + D584927D14FD23BF00741128 /* GoalSelector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GoalSelector.h; path = ai/goal/GoalSelector.h; sourceTree = ""; }; + D584927E14FD23BF00741128 /* MeleeAttackGoal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MeleeAttackGoal.h; path = ai/goal/MeleeAttackGoal.h; sourceTree = ""; }; + D584927F14FD23BF00741128 /* RandomStrollGoal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RandomStrollGoal.h; path = ai/goal/RandomStrollGoal.h; sourceTree = ""; }; + D584928114FD23DB00741128 /* HurtByTargetGoal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HurtByTargetGoal.h; path = ai/goal/target/HurtByTargetGoal.h; sourceTree = ""; }; + D584928214FD23DB00741128 /* NearestAttackableTargetGoal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NearestAttackableTargetGoal.h; path = ai/goal/target/NearestAttackableTargetGoal.h; sourceTree = ""; }; + D584928314FD23DB00741128 /* TargetGoal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TargetGoal.h; path = ai/goal/target/TargetGoal.h; sourceTree = ""; }; + D584928414FD240C00741128 /* IConfigListener.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IConfigListener.cpp; sourceTree = ""; }; + D584928514FD240C00741128 /* IConfigListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IConfigListener.h; sourceTree = ""; }; + D584928814FD2FAF00741128 /* Path.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Path.cpp; sourceTree = ""; }; + D58BB5B5146A0B920002C9F5 /* minecraftpe.demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = minecraftpe.demo.app; sourceTree = BUILT_PRODUCTS_DIR; }; + D5912008145FE9E600AE2E58 /* bg64.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bg64.png; sourceTree = ""; }; + D591200A145FEB8C00AE2E58 /* bg128.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bg128.png; sourceTree = ""; }; + D591200E1460041300AE2E58 /* minecraft.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = minecraft.ttf; path = ../../data/fonts/minecraft.ttf; sourceTree = ""; }; + D593325416077BBB00E26FC5 /* RenameMPWorld_iphone5.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = RenameMPWorld_iphone5.xib; path = minecraftpe/dialogs/RenameMPWorld_iphone5.xib; sourceTree = ""; }; + D593755014611CF200543145 /* CreateNewWorld_iphone5.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = CreateNewWorld_iphone5.xib; path = minecraftpe/dialogs/CreateNewWorld_iphone5.xib; sourceTree = ""; }; + D5951EC4159347EE0043A12A /* FurnaceRecipes.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FurnaceRecipes.cpp; sourceTree = ""; }; + D5951EC5159347EE0043A12A /* FurnaceRecipes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FurnaceRecipes.h; sourceTree = ""; }; + D5951EC6159347EE0043A12A /* OreRecipes.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OreRecipes.cpp; sourceTree = ""; }; + D5951ED01593485F0043A12A /* ContainerAckPacket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContainerAckPacket.h; sourceTree = ""; }; + D5951ED11593485F0043A12A /* ContainerClosePacket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContainerClosePacket.h; sourceTree = ""; }; + D5951ED21593485F0043A12A /* ContainerOpenPacket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContainerOpenPacket.h; sourceTree = ""; }; + D5951ED31593485F0043A12A /* ContainerSetContentPacket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContainerSetContentPacket.h; sourceTree = ""; }; + D5951ED41593485F0043A12A /* ContainerSetDataPacket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContainerSetDataPacket.h; sourceTree = ""; }; + D5951ED51593485F0043A12A /* ContainerSetSlotPacket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContainerSetSlotPacket.h; sourceTree = ""; }; + D5951ED6159348C50043A12A /* InventoryPane.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InventoryPane.cpp; sourceTree = ""; }; + D5951ED7159348C50043A12A /* InventoryPane.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InventoryPane.h; sourceTree = ""; }; + D5951ED8159348C50043A12A /* ItemPane.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ItemPane.cpp; sourceTree = ""; }; + D5951ED9159348C50043A12A /* ItemPane.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ItemPane.h; sourceTree = ""; }; + D5951EE1159349000043A12A /* FurnaceTile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FurnaceTile.cpp; sourceTree = ""; }; + D5951EE2159349000043A12A /* FurnaceTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FurnaceTile.h; sourceTree = ""; }; + D5951EE5159349100043A12A /* FurnaceTileEntity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FurnaceTileEntity.cpp; sourceTree = ""; }; + D5951EE6159349100043A12A /* FurnaceTileEntity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FurnaceTileEntity.h; sourceTree = ""; }; + D5951EE7159349100043A12A /* TileEntity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TileEntity.cpp; sourceTree = ""; }; + D5951EEC159349680043A12A /* FurnaceScreen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FurnaceScreen.cpp; sourceTree = ""; }; + D5951EED159349680043A12A /* FurnaceScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FurnaceScreen.h; sourceTree = ""; }; + D5951EF015934A2D0043A12A /* Feature.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Feature.cpp; sourceTree = ""; }; + D5951EF315934AC50043A12A /* BaseContainerMenu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BaseContainerMenu.cpp; sourceTree = ""; }; + D5951EF415934AC50043A12A /* BaseContainerMenu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BaseContainerMenu.h; sourceTree = ""; }; + D5951EF515934AC50043A12A /* FurnaceMenu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FurnaceMenu.cpp; sourceTree = ""; }; + D5951EF615934AC50043A12A /* FurnaceMenu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FurnaceMenu.h; sourceTree = ""; }; + D598BD6C163ED06400A36438 /* explode.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = explode.m4a; sourceTree = ""; }; + D598BD6F163ED09800A36438 /* zpig1.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = zpig1.m4a; sourceTree = ""; }; + D598BD70163ED09800A36438 /* zpig2.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = zpig2.m4a; sourceTree = ""; }; + D598BD71163ED09800A36438 /* zpig3.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = zpig3.m4a; sourceTree = ""; }; + D598BD72163ED09800A36438 /* zpig4.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = zpig4.m4a; sourceTree = ""; }; + D598BD73163ED09800A36438 /* zpigangry1.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = zpigangry1.m4a; sourceTree = ""; }; + D598BD74163ED09800A36438 /* zpigangry2.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = zpigangry2.m4a; sourceTree = ""; }; + D598BD75163ED09800A36438 /* zpigangry3.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = zpigangry3.m4a; sourceTree = ""; }; + D598BD76163ED09800A36438 /* zpigangry4.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = zpigangry4.m4a; sourceTree = ""; }; + D598BD77163ED09800A36438 /* zpigdeath.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = zpigdeath.m4a; sourceTree = ""; }; + D598BD78163ED09800A36438 /* zpighurt1.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = zpighurt1.m4a; sourceTree = ""; }; + D598BD79163ED09800A36438 /* zpighurt2.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = zpighurt2.m4a; sourceTree = ""; }; + D598BD90163ED0DB00A36438 /* sign.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = sign.png; sourceTree = ""; }; + D598BD93163ED14000A36438 /* pigzombie.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pigzombie.png; sourceTree = ""; }; + D598BD97163ED26500A36438 /* kz.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = kz.png; path = art/kz.png; sourceTree = ""; }; + D598BD9C164157D500A36438 /* minecon140.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = minecon140.png; path = badge/minecon140.png; sourceTree = ""; }; + D5A55E4714500EDE00A7571B /* CreateNewWorldViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; name = CreateNewWorldViewController.h; path = minecraftpe/dialogs/CreateNewWorldViewController.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + D5A55E4814500EDE00A7571B /* CreateNewWorldViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; lineEnding = 0; name = CreateNewWorldViewController.mm; path = minecraftpe/dialogs/CreateNewWorldViewController.mm; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + D5A55E4A1450353800A7571B /* IDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; name = IDialog.h; path = minecraftpe/dialogs/IDialog.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + D5A55E4B145036AE00A7571B /* BaseDialogController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; name = BaseDialogController.h; path = minecraftpe/dialogs/BaseDialogController.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + D5A55E4C145036AE00A7571B /* BaseDialogController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; lineEnding = 0; name = BaseDialogController.mm; path = minecraftpe/dialogs/BaseDialogController.mm; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + D5A55E4E1450761600A7571B /* bg32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bg32.png; sourceTree = ""; }; + D5A6F8CF15B45E2600819B71 /* ChestScreen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ChestScreen.cpp; sourceTree = ""; }; + D5A6F8D015B45E2600819B71 /* ChestScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChestScreen.h; sourceTree = ""; }; + D5A6F8D415B45EE500819B71 /* ContainerMenu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ContainerMenu.cpp; sourceTree = ""; }; + D5A6F8D515B45EE500819B71 /* ContainerMenu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContainerMenu.h; sourceTree = ""; }; + D5ACF15415C01F7D00E21C22 /* ArrowRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ArrowRenderer.cpp; sourceTree = ""; }; + D5ACF15515C01F7D00E21C22 /* ArrowRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ArrowRenderer.h; sourceTree = ""; }; + D5ACF16D15C0220D00E21C22 /* Creeper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Creeper.cpp; sourceTree = ""; }; + D5ACF16E15C0220D00E21C22 /* Creeper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Creeper.h; sourceTree = ""; }; + D5ACF16F15C0220D00E21C22 /* Monster.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Monster.cpp; sourceTree = ""; }; + D5ACF17015C0220D00E21C22 /* Monster.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Monster.h; sourceTree = ""; }; + D5ACF17115C0220D00E21C22 /* MonsterInclude.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MonsterInclude.h; sourceTree = ""; }; + D5ACF17215C0220D00E21C22 /* Skeleton.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Skeleton.cpp; sourceTree = ""; }; + D5ACF17315C0220D00E21C22 /* Skeleton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Skeleton.h; sourceTree = ""; }; + D5ACF17415C0220D00E21C22 /* Spider.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Spider.cpp; sourceTree = ""; }; + D5ACF17515C0220D00E21C22 /* Spider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Spider.h; sourceTree = ""; }; + D5ACF17615C0220D00E21C22 /* Zombie.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Zombie.cpp; sourceTree = ""; }; + D5ACF17715C0220D00E21C22 /* Zombie.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Zombie.h; sourceTree = ""; }; + D5ACF18215C022B500E21C22 /* EntityFactory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EntityFactory.cpp; sourceTree = ""; }; + D5ACF18315C022B500E21C22 /* EntityFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EntityFactory.h; sourceTree = ""; }; + D5ACF18815C03DBF00E21C22 /* fallbig1.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = fallbig1.m4a; sourceTree = ""; }; + D5ACF18915C03DBF00E21C22 /* fallbig2.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = fallbig2.m4a; sourceTree = ""; }; + D5ACF18A15C03DBF00E21C22 /* fallsmall.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = fallsmall.m4a; sourceTree = ""; }; + D5ACF18C15C03DBF00E21C22 /* chicken1.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = chicken1.m4a; sourceTree = ""; }; + D5ACF18D15C03DBF00E21C22 /* chicken2.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = chicken2.m4a; sourceTree = ""; }; + D5ACF18E15C03DBF00E21C22 /* chicken3.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = chicken3.m4a; sourceTree = ""; }; + D5ACF18F15C03DBF00E21C22 /* chickenhurt1.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = chickenhurt1.m4a; sourceTree = ""; }; + D5ACF19015C03DBF00E21C22 /* chickenhurt2.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = chickenhurt2.m4a; sourceTree = ""; }; + D5ACF19115C03DBF00E21C22 /* chickenplop.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = chickenplop.m4a; sourceTree = ""; }; + D5ACF19215C03DBF00E21C22 /* cow1.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = cow1.m4a; sourceTree = ""; }; + D5ACF19315C03DBF00E21C22 /* cow2.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = cow2.m4a; sourceTree = ""; }; + D5ACF19415C03DBF00E21C22 /* cow3.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = cow3.m4a; sourceTree = ""; }; + D5ACF19515C03DBF00E21C22 /* cow4.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = cow4.m4a; sourceTree = ""; }; + D5ACF19615C03DBF00E21C22 /* cowhurt1.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = cowhurt1.m4a; sourceTree = ""; }; + D5ACF19715C03DBF00E21C22 /* cowhurt2.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = cowhurt2.m4a; sourceTree = ""; }; + D5ACF19815C03DBF00E21C22 /* cowhurt3.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = cowhurt3.m4a; sourceTree = ""; }; + D5ACF19915C03DBF00E21C22 /* pig1.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = pig1.m4a; sourceTree = ""; }; + D5ACF19A15C03DBF00E21C22 /* pig2.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = pig2.m4a; sourceTree = ""; }; + D5ACF19B15C03DBF00E21C22 /* pig3.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = pig3.m4a; sourceTree = ""; }; + D5ACF19C15C03DBF00E21C22 /* pigdeath.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = pigdeath.m4a; sourceTree = ""; }; + D5ACF19D15C03DBF00E21C22 /* sheep1.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = sheep1.m4a; sourceTree = ""; }; + D5ACF19E15C03DBF00E21C22 /* sheep2.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = sheep2.m4a; sourceTree = ""; }; + D5ACF19F15C03DBF00E21C22 /* sheep3.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = sheep3.m4a; sourceTree = ""; }; + D5ACF1A015C03DBF00E21C22 /* skeleton1.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = skeleton1.m4a; sourceTree = ""; }; + D5ACF1A115C03DBF00E21C22 /* skeleton2.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = skeleton2.m4a; sourceTree = ""; }; + D5ACF1A215C03DBF00E21C22 /* skeleton3.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = skeleton3.m4a; sourceTree = ""; }; + D5ACF1A315C03DBF00E21C22 /* skeletonhurt1.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = skeletonhurt1.m4a; sourceTree = ""; }; + D5ACF1A415C03DBF00E21C22 /* skeletonhurt2.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = skeletonhurt2.m4a; sourceTree = ""; }; + D5ACF1A515C03DBF00E21C22 /* skeletonhurt3.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = skeletonhurt3.m4a; sourceTree = ""; }; + D5ACF1A615C03DBF00E21C22 /* skeletonhurt4.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = skeletonhurt4.m4a; sourceTree = ""; }; + D5ACF1A715C03DBF00E21C22 /* spider1.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = spider1.m4a; sourceTree = ""; }; + D5ACF1A815C03DBF00E21C22 /* spider2.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = spider2.m4a; sourceTree = ""; }; + D5ACF1A915C03DBF00E21C22 /* spider3.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = spider3.m4a; sourceTree = ""; }; + D5ACF1AA15C03DBF00E21C22 /* spider4.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = spider4.m4a; sourceTree = ""; }; + D5ACF1AB15C03DBF00E21C22 /* zombie1.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = zombie1.m4a; sourceTree = ""; }; + D5ACF1AC15C03DBF00E21C22 /* zombie2.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = zombie2.m4a; sourceTree = ""; }; + D5ACF1AD15C03DBF00E21C22 /* zombie3.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = zombie3.m4a; sourceTree = ""; }; + D5ACF1AE15C03DBF00E21C22 /* zombiedeath.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = zombiedeath.m4a; sourceTree = ""; }; + D5ACF1AF15C03DBF00E21C22 /* zombiehurt1.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = zombiehurt1.m4a; sourceTree = ""; }; + D5ACF1B015C03DBF00E21C22 /* zombiehurt2.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = zombiehurt2.m4a; sourceTree = ""; }; + D5ACF1B215C03DBF00E21C22 /* bow.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = bow.m4a; sourceTree = ""; }; + D5ACF1B315C03DBF00E21C22 /* bowhit1.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = bowhit1.m4a; sourceTree = ""; }; + D5ACF1B415C03DBF00E21C22 /* bowhit2.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = bowhit2.m4a; sourceTree = ""; }; + D5ACF1B515C03DBF00E21C22 /* bowhit3.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = bowhit3.m4a; sourceTree = ""; }; + D5ACF1B615C03DBF00E21C22 /* bowhit4.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = bowhit4.m4a; sourceTree = ""; }; + D5ACF1B715C03DBF00E21C22 /* click.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = click.m4a; sourceTree = ""; }; + D5ACF1B815C03DBF00E21C22 /* door_close.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = door_close.m4a; sourceTree = ""; }; + D5ACF1B915C03DBF00E21C22 /* door_open.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = door_open.m4a; sourceTree = ""; }; + D5ACF1BA15C03DBF00E21C22 /* glass1.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = glass1.m4a; sourceTree = ""; }; + D5ACF1BB15C03DBF00E21C22 /* glass2.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = glass2.m4a; sourceTree = ""; }; + D5ACF1BC15C03DBF00E21C22 /* glass3.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = glass3.m4a; sourceTree = ""; }; + D5ACF1BD15C03DBF00E21C22 /* hurt.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = hurt.m4a; sourceTree = ""; }; + D5ACF1BE15C03DBF00E21C22 /* pop.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = pop.m4a; sourceTree = ""; }; + D5ACF1BF15C03DBF00E21C22 /* splash.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = splash.m4a; sourceTree = ""; }; + D5ACF1C015C03DBF00E21C22 /* water.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = water.m4a; sourceTree = ""; }; + D5ACF1C215C03DBF00E21C22 /* cloth1.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = cloth1.m4a; sourceTree = ""; }; + D5ACF1C315C03DBF00E21C22 /* cloth2.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = cloth2.m4a; sourceTree = ""; }; + D5ACF1C415C03DBF00E21C22 /* cloth3.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = cloth3.m4a; sourceTree = ""; }; + D5ACF1C515C03DBF00E21C22 /* cloth4.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = cloth4.m4a; sourceTree = ""; }; + D5ACF1C615C03DBF00E21C22 /* grass1.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = grass1.m4a; sourceTree = ""; }; + D5ACF1C715C03DBF00E21C22 /* grass2.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = grass2.m4a; sourceTree = ""; }; + D5ACF1C815C03DBF00E21C22 /* grass3.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = grass3.m4a; sourceTree = ""; }; + D5ACF1C915C03DBF00E21C22 /* grass4.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = grass4.m4a; sourceTree = ""; }; + D5ACF1CA15C03DBF00E21C22 /* gravel2.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = gravel2.m4a; sourceTree = ""; }; + D5ACF1CB15C03DBF00E21C22 /* gravel3.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = gravel3.m4a; sourceTree = ""; }; + D5ACF1CC15C03DBF00E21C22 /* gravel4.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = gravel4.m4a; sourceTree = ""; }; + D5ACF1CD15C03DBF00E21C22 /* ladder1.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = ladder1.m4a; sourceTree = ""; }; + D5ACF1CE15C03DBF00E21C22 /* ladder2.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = ladder2.m4a; sourceTree = ""; }; + D5ACF1CF15C03DBF00E21C22 /* ladder3.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = ladder3.m4a; sourceTree = ""; }; + D5ACF1D015C03DBF00E21C22 /* ladder4.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = ladder4.m4a; sourceTree = ""; }; + D5ACF1D115C03DBF00E21C22 /* sand1.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = sand1.m4a; sourceTree = ""; }; + D5ACF1D215C03DBF00E21C22 /* sand2.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = sand2.m4a; sourceTree = ""; }; + D5ACF1D315C03DBF00E21C22 /* sand3.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = sand3.m4a; sourceTree = ""; }; + D5ACF1D415C03DBF00E21C22 /* sand4.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = sand4.m4a; sourceTree = ""; }; + D5ACF1D515C03DBF00E21C22 /* snow1.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = snow1.m4a; sourceTree = ""; }; + D5ACF1D615C03DBF00E21C22 /* snow2.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = snow2.m4a; sourceTree = ""; }; + D5ACF1D715C03DBF00E21C22 /* snow3.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = snow3.m4a; sourceTree = ""; }; + D5ACF1D815C03DBF00E21C22 /* snow4.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = snow4.m4a; sourceTree = ""; }; + D5ACF1D915C03DBF00E21C22 /* stone1.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = stone1.m4a; sourceTree = ""; }; + D5ACF1DA15C03DBF00E21C22 /* stone2.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = stone2.m4a; sourceTree = ""; }; + D5ACF1DB15C03DBF00E21C22 /* stone3.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = stone3.m4a; sourceTree = ""; }; + D5ACF1DC15C03DBF00E21C22 /* stone4.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = stone4.m4a; sourceTree = ""; }; + D5ACF1DD15C03DBF00E21C22 /* wood1.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = wood1.m4a; sourceTree = ""; }; + D5ACF1DE15C03DBF00E21C22 /* wood2.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = wood2.m4a; sourceTree = ""; }; + D5ACF1DF15C03DBF00E21C22 /* wood3.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = wood3.m4a; sourceTree = ""; }; + D5ACF1E015C03DBF00E21C22 /* wood4.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = wood4.m4a; sourceTree = ""; }; + D5ACF28D15C03E8800E21C22 /* arrows.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = arrows.png; sourceTree = ""; }; + D5B17ED115E226F50056E751 /* Snowball.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Snowball.h; sourceTree = ""; }; + D5B17ED215E226F50056E751 /* Throwable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Throwable.cpp; sourceTree = ""; }; + D5B17ED315E226F50056E751 /* Throwable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Throwable.h; sourceTree = ""; }; + D5B17ED415E226F50056E751 /* ThrownEgg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThrownEgg.h; sourceTree = ""; }; + D5B17ED815E2273F0056E751 /* SurvivalMode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SurvivalMode.cpp; sourceTree = ""; }; + D5B17EDB15E227670056E751 /* TrapDoorTile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TrapDoorTile.cpp; sourceTree = ""; }; + D5B17EDC15E227670056E751 /* TrapDoorTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrapDoorTile.h; sourceTree = ""; }; + D5B17EDF15E260910056E751 /* MoveFolder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MoveFolder.h; sourceTree = ""; }; + D5B17EE015E260910056E751 /* MoveFolder.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MoveFolder.mm; sourceTree = ""; }; + D5B26C1D15E3CE51003785EA /* creeper1.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = creeper1.m4a; sourceTree = ""; }; + D5B26C1E15E3CE51003785EA /* creeper2.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = creeper2.m4a; sourceTree = ""; }; + D5B26C1F15E3CE51003785EA /* creeper3.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = creeper3.m4a; sourceTree = ""; }; + D5B26C2015E3CE51003785EA /* creeper4.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = creeper4.m4a; sourceTree = ""; }; + D5B26C2115E3CE51003785EA /* creeperdeath.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = creeperdeath.m4a; sourceTree = ""; }; + D5B26C2215E3CE51003785EA /* spiderdeath.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = spiderdeath.m4a; sourceTree = ""; }; + D5B26C2F15E3CED3003785EA /* eat1.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = eat1.m4a; sourceTree = ""; }; + D5B26C3015E3CED3003785EA /* eat2.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = eat2.m4a; sourceTree = ""; }; + D5B26C3115E3CED3003785EA /* eat3.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = eat3.m4a; sourceTree = ""; }; + D5B26C3215E3CED3003785EA /* fuse.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = fuse.m4a; sourceTree = ""; }; + D5B50A4614CFF492005F7284 /* chicken.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = chicken.png; sourceTree = ""; }; + D5B50A4714CFF492005F7284 /* cow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = cow.png; sourceTree = ""; }; + D5B50A4814CFF492005F7284 /* creeper.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = creeper.png; sourceTree = ""; }; + D5B50A4914CFF492005F7284 /* pig.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pig.png; sourceTree = ""; }; + D5B50A4A14CFF492005F7284 /* sheep_fur.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = sheep_fur.png; sourceTree = ""; }; + D5B50A4B14CFF492005F7284 /* sheep.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = sheep.png; sourceTree = ""; }; + D5B50A4C14CFF492005F7284 /* skeleton.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = skeleton.png; sourceTree = ""; }; + D5B50A4D14CFF492005F7284 /* spider.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = spider.png; sourceTree = ""; }; + D5B50A4E14CFF492005F7284 /* zombie.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = zombie.png; sourceTree = ""; }; + D5B50C1714CFF66F005F7284 /* App.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = App.h; sourceTree = ""; }; + D5B50C1814CFF66F005F7284 /* AppConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppConstants.h; sourceTree = ""; }; + D5B50C1914CFF66F005F7284 /* AppPlatform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppPlatform.h; sourceTree = ""; }; + D5B50C1B14CFF66F005F7284 /* AppPlatform_iOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppPlatform_iOS.h; sourceTree = ""; }; + D5B50C1C14CFF66F005F7284 /* AppPlatform_iOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AppPlatform_iOS.mm; sourceTree = ""; }; + D5B50C2114CFF66F005F7284 /* CreativeMode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CreativeMode.cpp; sourceTree = ""; }; + D5B50C2214CFF66F005F7284 /* CreativeMode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CreativeMode.h; sourceTree = ""; }; + D5B50C2314CFF66F005F7284 /* GameMode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GameMode.cpp; sourceTree = ""; }; + D5B50C2414CFF66F005F7284 /* GameMode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GameMode.h; sourceTree = ""; }; + D5B50C2514CFF66F005F7284 /* SurvivalMode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SurvivalMode.h; sourceTree = ""; }; + D5B50C2814CFF66F005F7284 /* Button.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Button.cpp; sourceTree = ""; }; + D5B50C2914CFF66F005F7284 /* Button.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Button.h; sourceTree = ""; }; + D5B50C2A14CFF66F005F7284 /* ImageButton.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ImageButton.cpp; sourceTree = ""; }; + D5B50C2B14CFF66F005F7284 /* ImageButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageButton.h; sourceTree = ""; }; + D5B50C2C14CFF66F005F7284 /* LargeImageButton.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LargeImageButton.cpp; sourceTree = ""; }; + D5B50C2D14CFF66F005F7284 /* LargeImageButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LargeImageButton.h; sourceTree = ""; }; + D5B50C2E14CFF66F005F7284 /* RolledSelectionListH.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RolledSelectionListH.cpp; sourceTree = ""; }; + D5B50C2F14CFF66F005F7284 /* RolledSelectionListH.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RolledSelectionListH.h; sourceTree = ""; }; + D5B50C3014CFF66F005F7284 /* RolledSelectionListV.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RolledSelectionListV.cpp; sourceTree = ""; }; + D5B50C3114CFF66F005F7284 /* RolledSelectionListV.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RolledSelectionListV.h; sourceTree = ""; }; + D5B50C3214CFF66F005F7284 /* ScrolledSelectionList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ScrolledSelectionList.cpp; sourceTree = ""; }; + D5B50C3314CFF66F005F7284 /* ScrolledSelectionList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScrolledSelectionList.h; sourceTree = ""; }; + D5B50C3414CFF66F005F7284 /* SmallButton.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SmallButton.cpp; sourceTree = ""; }; + D5B50C3514CFF66F005F7284 /* SmallButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SmallButton.h; sourceTree = ""; }; + D5B50C3614CFF66F005F7284 /* Font.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Font.cpp; sourceTree = ""; }; + D5B50C3714CFF66F005F7284 /* Font.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Font.h; sourceTree = ""; }; + D5B50C3814CFF66F005F7284 /* Gui.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Gui.cpp; sourceTree = ""; }; + D5B50C3914CFF66F005F7284 /* Gui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Gui.h; sourceTree = ""; }; + D5B50C3A14CFF66F005F7284 /* GuiComponent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GuiComponent.cpp; sourceTree = ""; }; + D5B50C3B14CFF66F005F7284 /* GuiComponent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GuiComponent.h; sourceTree = ""; }; + D5B50C3C14CFF66F005F7284 /* Screen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Screen.cpp; sourceTree = ""; }; + D5B50C3D14CFF66F005F7284 /* Screen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Screen.h; sourceTree = ""; }; + D5B50C3F14CFF66F005F7284 /* BuyGameScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BuyGameScreen.h; sourceTree = ""; }; + D5B50C4014CFF66F005F7284 /* ChatScreen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ChatScreen.cpp; sourceTree = ""; }; + D5B50C4114CFF66F005F7284 /* ChatScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChatScreen.h; sourceTree = ""; }; + D5B50C4214CFF66F005F7284 /* ConfirmScreen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ConfirmScreen.cpp; sourceTree = ""; }; + D5B50C4314CFF66F005F7284 /* ConfirmScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConfirmScreen.h; sourceTree = ""; }; + D5B50C4414CFF66F005F7284 /* DialogDefinitions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DialogDefinitions.h; sourceTree = ""; }; + D5B50C4514CFF66F005F7284 /* DisconnectionScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DisconnectionScreen.h; sourceTree = ""; }; + D5B50C4614CFF66F005F7284 /* IngameBlockSelectionScreen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IngameBlockSelectionScreen.cpp; sourceTree = ""; }; + D5B50C4714CFF66F005F7284 /* IngameBlockSelectionScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IngameBlockSelectionScreen.h; sourceTree = ""; }; + D5B50C4814CFF66F005F7284 /* InvalidLicenseScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InvalidLicenseScreen.h; sourceTree = ""; }; + D5B50C4914CFF66F005F7284 /* JoinGameScreen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JoinGameScreen.cpp; sourceTree = ""; }; + D5B50C4A14CFF66F005F7284 /* JoinGameScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JoinGameScreen.h; sourceTree = ""; }; + D5B50C4B14CFF66F005F7284 /* OptionsScreen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OptionsScreen.cpp; sourceTree = ""; }; + D5B50C4C14CFF66F005F7284 /* OptionsScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OptionsScreen.h; sourceTree = ""; }; + D5B50C4D14CFF66F005F7284 /* PauseScreen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PauseScreen.cpp; sourceTree = ""; }; + D5B50C4E14CFF66F005F7284 /* PauseScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PauseScreen.h; sourceTree = ""; }; + D5B50C4F14CFF66F005F7284 /* PrerenderTilesScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PrerenderTilesScreen.h; sourceTree = ""; }; + D5B50C5014CFF66F005F7284 /* ProgressScreen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ProgressScreen.cpp; sourceTree = ""; }; + D5B50C5114CFF66F005F7284 /* ProgressScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProgressScreen.h; sourceTree = ""; }; + D5B50C5214CFF66F005F7284 /* RenameMPLevelScreen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenameMPLevelScreen.cpp; sourceTree = ""; }; + D5B50C5314CFF66F005F7284 /* RenameMPLevelScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenameMPLevelScreen.h; sourceTree = ""; }; + D5B50C5414CFF66F005F7284 /* ScreenChooser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ScreenChooser.cpp; sourceTree = ""; }; + D5B50C5514CFF66F005F7284 /* ScreenChooser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScreenChooser.h; sourceTree = ""; }; + D5B50C5614CFF66F005F7284 /* SelectWorldScreen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SelectWorldScreen.cpp; sourceTree = ""; }; + D5B50C5714CFF66F005F7284 /* SelectWorldScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SelectWorldScreen.h; sourceTree = ""; }; + D5B50C5814CFF66F005F7284 /* StartMenuScreen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StartMenuScreen.cpp; sourceTree = ""; }; + D5B50C5914CFF66F005F7284 /* StartMenuScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StartMenuScreen.h; sourceTree = ""; }; + D5B50C5B14CFF66F005F7284 /* TouchIngameBlockSelectionScreen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TouchIngameBlockSelectionScreen.cpp; sourceTree = ""; }; + D5B50C5C14CFF66F005F7284 /* TouchIngameBlockSelectionScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TouchIngameBlockSelectionScreen.h; sourceTree = ""; }; + D5B50C5D14CFF66F005F7284 /* TouchJoinGameScreen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TouchJoinGameScreen.cpp; sourceTree = ""; }; + D5B50C5E14CFF66F005F7284 /* TouchJoinGameScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TouchJoinGameScreen.h; sourceTree = ""; }; + D5B50C5F14CFF66F005F7284 /* TouchSelectWorldScreen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TouchSelectWorldScreen.cpp; sourceTree = ""; }; + D5B50C6014CFF66F005F7284 /* TouchSelectWorldScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TouchSelectWorldScreen.h; sourceTree = ""; }; + D5B50C6114CFF66F005F7284 /* TouchStartMenuScreen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TouchStartMenuScreen.cpp; sourceTree = ""; }; + D5B50C6214CFF66F005F7284 /* TouchStartMenuScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TouchStartMenuScreen.h; sourceTree = ""; }; + D5B50C6314CFF66F005F7284 /* UploadPhotoScreen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UploadPhotoScreen.cpp; sourceTree = ""; }; + D5B50C6414CFF66F005F7284 /* UploadPhotoScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UploadPhotoScreen.h; sourceTree = ""; }; + D5B50C6514CFF66F005F7284 /* TweenData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TweenData.h; sourceTree = ""; }; + D5B50C6614CFF66F005F7284 /* KeyMapping.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KeyMapping.h; sourceTree = ""; }; + D5B50C6814CFF66F005F7284 /* Minecraft.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Minecraft.cpp; sourceTree = ""; }; + D5B50C6914CFF66F005F7284 /* Minecraft.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Minecraft.h; sourceTree = ""; }; + D5B50C6B14CFF66F005F7284 /* ChickenModel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ChickenModel.cpp; sourceTree = ""; }; + D5B50C6C14CFF66F005F7284 /* ChickenModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChickenModel.h; sourceTree = ""; }; + D5B50C6D14CFF66F005F7284 /* CowModel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CowModel.cpp; sourceTree = ""; }; + D5B50C6E14CFF66F005F7284 /* CowModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CowModel.h; sourceTree = ""; }; + D5B50C6F14CFF66F005F7284 /* CreeperModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CreeperModel.h; sourceTree = ""; }; + D5B50C7114CFF66F005F7284 /* Cube.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Cube.cpp; sourceTree = ""; }; + D5B50C7214CFF66F005F7284 /* Cube.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Cube.h; sourceTree = ""; }; + D5B50C7314CFF66F005F7284 /* ModelPart.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ModelPart.cpp; sourceTree = ""; }; + D5B50C7414CFF66F005F7284 /* ModelPart.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ModelPart.h; sourceTree = ""; }; + D5B50C7514CFF66F005F7284 /* Polygon.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Polygon.cpp; sourceTree = ""; }; + D5B50C7614CFF66F005F7284 /* Polygon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Polygon.h; sourceTree = ""; }; + D5B50C7714CFF66F005F7284 /* Vertex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Vertex.h; sourceTree = ""; }; + D5B50C7814CFF66F005F7284 /* HumanoidModel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HumanoidModel.cpp; sourceTree = ""; }; + D5B50C7914CFF66F005F7284 /* HumanoidModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HumanoidModel.h; sourceTree = ""; }; + D5B50C7A14CFF66F005F7284 /* Model.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Model.h; sourceTree = ""; }; + D5B50C7B14CFF66F005F7284 /* ModelInclude.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ModelInclude.h; sourceTree = ""; }; + D5B50C7C14CFF66F005F7284 /* PigModel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PigModel.cpp; sourceTree = ""; }; + D5B50C7D14CFF66F005F7284 /* PigModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PigModel.h; sourceTree = ""; }; + D5B50C7E14CFF66F005F7284 /* QuadrupedModel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = QuadrupedModel.cpp; sourceTree = ""; }; + D5B50C7F14CFF66F005F7284 /* QuadrupedModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QuadrupedModel.h; sourceTree = ""; }; + D5B50C8014CFF66F005F7284 /* SheepFurModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SheepFurModel.h; sourceTree = ""; }; + D5B50C8114CFF66F005F7284 /* SheepModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SheepModel.h; sourceTree = ""; }; + D5B50C8214CFF66F005F7284 /* SkeletonModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SkeletonModel.h; sourceTree = ""; }; + D5B50C8314CFF66F005F7284 /* SpiderModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpiderModel.h; sourceTree = ""; }; + D5B50C8414CFF66F005F7284 /* ZombieModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZombieModel.h; sourceTree = ""; }; + D5B50C8514CFF66F005F7284 /* MouseHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MouseHandler.h; sourceTree = ""; }; + D5B50C8714CFF66F005F7284 /* MultiPlayerLevel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MultiPlayerLevel.h; sourceTree = ""; }; + D5B50C8814CFF66F005F7284 /* Options.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Options.cpp; sourceTree = ""; }; + D5B50C8914CFF66F005F7284 /* Options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Options.h; sourceTree = ""; }; + D5B50C8A14CFF66F005F7284 /* OptionStrings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OptionStrings.cpp; sourceTree = ""; }; + D5B50C8B14CFF66F005F7284 /* OptionStrings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OptionStrings.h; sourceTree = ""; }; + D5B50C8D14CFF66F005F7284 /* BreakingItemParticle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BreakingItemParticle.h; sourceTree = ""; }; + D5B50C8E14CFF66F005F7284 /* BubbleParticle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BubbleParticle.h; sourceTree = ""; }; + D5B50C8F14CFF66F005F7284 /* ExplodeParticle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExplodeParticle.h; sourceTree = ""; }; + D5B50C9014CFF66F005F7284 /* FlameParticle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlameParticle.h; sourceTree = ""; }; + D5B50C9114CFF66F005F7284 /* LavaParticle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LavaParticle.h; sourceTree = ""; }; + D5B50C9214CFF66F005F7284 /* Particle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Particle.cpp; sourceTree = ""; }; + D5B50C9314CFF66F005F7284 /* Particle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Particle.h; sourceTree = ""; }; + D5B50C9414CFF66F005F7284 /* ParticleEngine.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ParticleEngine.cpp; sourceTree = ""; }; + D5B50C9514CFF66F005F7284 /* ParticleEngine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ParticleEngine.h; sourceTree = ""; }; + D5B50C9614CFF66F005F7284 /* ParticleInclude.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ParticleInclude.h; sourceTree = ""; }; + D5B50C9714CFF66F005F7284 /* RedDustParticle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RedDustParticle.h; sourceTree = ""; }; + D5B50C9814CFF66F005F7284 /* SmokeParticle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SmokeParticle.h; sourceTree = ""; }; + D5B50C9914CFF66F005F7284 /* SplashParticle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SplashParticle.h; sourceTree = ""; }; + D5B50C9A14CFF66F005F7284 /* TakeAnimationParticle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TakeAnimationParticle.h; sourceTree = ""; }; + D5B50C9B14CFF66F005F7284 /* TerrainParticle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TerrainParticle.h; sourceTree = ""; }; + D5B50C9C14CFF66F005F7284 /* PixelCalc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PixelCalc.h; sourceTree = ""; }; + D5B50C9F14CFF66F005F7284 /* ControllerTurnInput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ControllerTurnInput.h; sourceTree = ""; }; + D5B50CA014CFF66F005F7284 /* IBuildInput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IBuildInput.h; sourceTree = ""; }; + D5B50CA114CFF66F005F7284 /* IInputHolder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IInputHolder.h; sourceTree = ""; }; + D5B50CA214CFF66F005F7284 /* IMoveInput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IMoveInput.h; sourceTree = ""; }; + D5B50CA314CFF66F005F7284 /* ITurnInput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ITurnInput.h; sourceTree = ""; }; + D5B50CA414CFF66F005F7284 /* KeyboardInput.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = KeyboardInput.cpp; sourceTree = ""; }; + D5B50CA514CFF66F005F7284 /* KeyboardInput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KeyboardInput.h; sourceTree = ""; }; + D5B50CA614CFF66F005F7284 /* MouseBuildInput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MouseBuildInput.h; sourceTree = ""; }; + D5B50CA714CFF66F005F7284 /* MouseTurnInput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MouseTurnInput.h; sourceTree = ""; }; + D5B50CA914CFF66F005F7284 /* ITouchScreenModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ITouchScreenModel.h; sourceTree = ""; }; + D5B50CAA14CFF66F005F7284 /* TouchAreaModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TouchAreaModel.h; sourceTree = ""; }; + D5B50CAB14CFF66F005F7284 /* TouchInputHolder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TouchInputHolder.h; sourceTree = ""; }; + D5B50CAC14CFF66F005F7284 /* TouchscreenInput.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TouchscreenInput.cpp; sourceTree = ""; }; + D5B50CAD14CFF66F005F7284 /* TouchscreenInput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TouchscreenInput.h; sourceTree = ""; }; + D5B50CAE14CFF66F005F7284 /* TouchTurnInput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TouchTurnInput.h; sourceTree = ""; }; + D5B50CAF14CFF66F005F7284 /* XperiaPlayInput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XperiaPlayInput.h; sourceTree = ""; }; + D5B50CB014CFF66F005F7284 /* LocalPlayer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LocalPlayer.cpp; sourceTree = ""; }; + D5B50CB114CFF66F005F7284 /* LocalPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LocalPlayer.h; sourceTree = ""; }; + D5B50CB314CFF66F005F7284 /* Chunk.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Chunk.cpp; sourceTree = ""; }; + D5B50CB414CFF66F005F7284 /* Chunk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Chunk.h; sourceTree = ""; }; + D5B50CB514CFF66F005F7284 /* ChunkRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChunkRenderer.h; sourceTree = ""; }; + D5B50CB614CFF66F005F7284 /* Color4.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Color4.h; sourceTree = ""; }; + D5B50CB814CFF66F005F7284 /* AllowAllCuller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AllowAllCuller.h; sourceTree = ""; }; + D5B50CB914CFF66F005F7284 /* Culler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Culler.h; sourceTree = ""; }; + D5B50CBA14CFF66F005F7284 /* Frustum.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Frustum.cpp; sourceTree = ""; }; + D5B50CBB14CFF66F005F7284 /* Frustum.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Frustum.h; sourceTree = ""; }; + D5B50CBC14CFF66F005F7284 /* FrustumCuller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FrustumCuller.h; sourceTree = ""; }; + D5B50CBD14CFF66F005F7284 /* FrustumData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FrustumData.h; sourceTree = ""; }; + D5B50CBF14CFF66F005F7284 /* _FrustumCuller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _FrustumCuller.h; sourceTree = ""; }; + D5B50CC014CFF66F005F7284 /* Frustum.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Frustum.h; sourceTree = ""; }; + D5B50CC114CFF66F005F7284 /* FrustumCuller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FrustumCuller.h; sourceTree = ""; }; + D5B50CC214CFF66F005F7284 /* FrustumData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FrustumData.h; sourceTree = ""; }; + D5B50CC314CFF66F005F7284 /* DirtyChunkSorter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DirtyChunkSorter.h; sourceTree = ""; }; + D5B50CC414CFF66F005F7284 /* DistanceChunkSorter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DistanceChunkSorter.h; sourceTree = ""; }; + D5B50CC614CFF66F005F7284 /* ChickenRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ChickenRenderer.cpp; sourceTree = ""; }; + D5B50CC714CFF66F005F7284 /* ChickenRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChickenRenderer.h; sourceTree = ""; }; + D5B50CC814CFF66F005F7284 /* CreeperRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CreeperRenderer.h; sourceTree = ""; }; + D5B50CC914CFF66F005F7284 /* EntityRenderDispatcher.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EntityRenderDispatcher.cpp; sourceTree = ""; }; + D5B50CCA14CFF66F005F7284 /* EntityRenderDispatcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EntityRenderDispatcher.h; sourceTree = ""; }; + D5B50CCB14CFF66F005F7284 /* EntityRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EntityRenderer.cpp; sourceTree = ""; }; + D5B50CCC14CFF66F005F7284 /* EntityRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EntityRenderer.h; sourceTree = ""; }; + D5B50CCD14CFF66F005F7284 /* HumanoidMobRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HumanoidMobRenderer.cpp; sourceTree = ""; }; + D5B50CCE14CFF66F005F7284 /* HumanoidMobRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HumanoidMobRenderer.h; sourceTree = ""; }; + D5B50CCF14CFF66F005F7284 /* ItemRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ItemRenderer.cpp; sourceTree = ""; }; + D5B50CD014CFF66F005F7284 /* ItemRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ItemRenderer.h; sourceTree = ""; }; + D5B50CD114CFF66F005F7284 /* ItemSpriteRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ItemSpriteRenderer.cpp; sourceTree = ""; }; + D5B50CD214CFF66F005F7284 /* ItemSpriteRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ItemSpriteRenderer.h; sourceTree = ""; }; + D5B50CD314CFF66F005F7284 /* MobRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MobRenderer.cpp; sourceTree = ""; }; + D5B50CD414CFF66F005F7284 /* MobRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MobRenderer.h; sourceTree = ""; }; + D5B50CD514CFF66F005F7284 /* PigRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PigRenderer.h; sourceTree = ""; }; + D5B50CD614CFF66F005F7284 /* SheepRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SheepRenderer.h; sourceTree = ""; }; + D5B50CD714CFF66F005F7284 /* SpiderRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpiderRenderer.h; sourceTree = ""; }; + D5B50CD814CFF66F005F7284 /* TntRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TntRenderer.cpp; sourceTree = ""; }; + D5B50CD914CFF66F005F7284 /* TntRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TntRenderer.h; sourceTree = ""; }; + D5B50CDA14CFF66F005F7284 /* TripodCameraRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TripodCameraRenderer.cpp; sourceTree = ""; }; + D5B50CDB14CFF66F005F7284 /* TripodCameraRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TripodCameraRenderer.h; sourceTree = ""; }; + D5B50CDC14CFF66F005F7284 /* GameRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GameRenderer.cpp; sourceTree = ""; }; + D5B50CDD14CFF66F005F7284 /* GameRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GameRenderer.h; sourceTree = ""; }; + D5B50CDE14CFF66F005F7284 /* gles.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gles.cpp; sourceTree = ""; }; + D5B50CDF14CFF66F005F7284 /* gles.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gles.h; sourceTree = ""; }; + D5B50CE014CFF66F005F7284 /* ItemInHandRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ItemInHandRenderer.cpp; sourceTree = ""; }; + D5B50CE114CFF66F005F7284 /* ItemInHandRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ItemInHandRenderer.h; sourceTree = ""; }; + D5B50CE214CFF66F005F7284 /* LevelRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LevelRenderer.cpp; sourceTree = ""; }; + D5B50CE314CFF66F005F7284 /* LevelRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LevelRenderer.h; sourceTree = ""; }; + D5B50CE514CFF66F005F7284 /* DynamicTexture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DynamicTexture.cpp; sourceTree = ""; }; + D5B50CE614CFF66F005F7284 /* DynamicTexture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DynamicTexture.h; sourceTree = ""; }; + D5B50CE714CFF66F005F7284 /* RenderChunk.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderChunk.cpp; sourceTree = ""; }; + D5B50CE814CFF66F005F7284 /* RenderChunk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderChunk.h; sourceTree = ""; }; + D5B50CE914CFF66F005F7284 /* RenderChunkHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderChunkHandler.h; sourceTree = ""; }; + D5B50CEA14CFF66F005F7284 /* RenderList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderList.cpp; sourceTree = ""; }; + D5B50CEB14CFF66F005F7284 /* RenderList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderList.h; sourceTree = ""; }; + D5B50CEC14CFF66F005F7284 /* Tesselator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Tesselator.cpp; sourceTree = ""; }; + D5B50CED14CFF66F005F7284 /* Tesselator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Tesselator.h; sourceTree = ""; }; + D5B50CEE14CFF66F005F7284 /* TextureData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextureData.h; sourceTree = ""; }; + D5B50CEF14CFF66F005F7284 /* Textures.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Textures.cpp; sourceTree = ""; }; + D5B50CF014CFF66F005F7284 /* Textures.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Textures.h; sourceTree = ""; }; + D5B50CF114CFF66F005F7284 /* TileRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TileRenderer.cpp; sourceTree = ""; }; + D5B50CF214CFF66F005F7284 /* TileRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TileRenderer.h; sourceTree = ""; }; + D5B50CF314CFF66F005F7284 /* VertecDecl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VertecDecl.h; sourceTree = ""; }; + D5B50D1114CFF66F005F7284 /* Sound.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Sound.cpp; sourceTree = ""; }; + D5B50D1214CFF66F005F7284 /* Sound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Sound.h; sourceTree = ""; }; + D5B50D1314CFF66F005F7284 /* SoundEngine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SoundEngine.h; sourceTree = ""; }; + D5B50D1414CFF66F005F7284 /* SoundRepository.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SoundRepository.h; sourceTree = ""; }; + D5B50D1514CFF66F005F7284 /* Timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Timer.h; sourceTree = ""; }; + D5B50D1614CFF66F005F7284 /* User.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = User.h; sourceTree = ""; }; + D5B50D1714CFF66F005F7284 /* EglConfigPrinter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EglConfigPrinter.h; sourceTree = ""; }; + D5B50D1814CFF66F005F7284 /* LicenseCodes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LicenseCodes.h; sourceTree = ""; }; + D5B50D1A14CFF66F005F7284 /* I18n.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = I18n.h; sourceTree = ""; }; + D5B50D1B14CFF66F005F7284 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = ""; }; + D5B50D2214CFF66F005F7284 /* ByteArrayTag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ByteArrayTag.h; sourceTree = ""; }; + D5B50D2314CFF66F005F7284 /* ByteTag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ByteTag.h; sourceTree = ""; }; + D5B50D2414CFF66F005F7284 /* CompoundTag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CompoundTag.h; sourceTree = ""; }; + D5B50D2514CFF66F005F7284 /* DoubleTag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DoubleTag.h; sourceTree = ""; }; + D5B50D2614CFF66F005F7284 /* EndTag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EndTag.h; sourceTree = ""; }; + D5B50D2714CFF66F005F7284 /* FloatTag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FloatTag.h; sourceTree = ""; }; + D5B50D2814CFF66F005F7284 /* IntTag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IntTag.h; sourceTree = ""; }; + D5B50D2914CFF66F005F7284 /* ListTag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ListTag.h; sourceTree = ""; }; + D5B50D2A14CFF66F005F7284 /* LongTag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LongTag.h; sourceTree = ""; }; + D5B50D2B14CFF66F005F7284 /* NbtIo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NbtIo.h; sourceTree = ""; }; + D5B50D2C14CFF66F005F7284 /* ShortTag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShortTag.h; sourceTree = ""; }; + D5B50D2D14CFF66F005F7284 /* StringTag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StringTag.h; sourceTree = ""; }; + D5B50D2E14CFF66F005F7284 /* Tag.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Tag.cpp; sourceTree = ""; }; + D5B50D2F14CFF66F005F7284 /* Tag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Tag.h; sourceTree = ""; }; + D5B50D3114CFF66F005F7284 /* ClientSideNetworkHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ClientSideNetworkHandler.cpp; sourceTree = ""; }; + D5B50D3214CFF66F005F7284 /* ClientSideNetworkHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ClientSideNetworkHandler.h; sourceTree = ""; }; + D5B50D3314CFF66F005F7284 /* NetEventCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetEventCallback.cpp; sourceTree = ""; }; + D5B50D3414CFF66F005F7284 /* NetEventCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetEventCallback.h; sourceTree = ""; }; + D5B50D3614CFF66F005F7284 /* AddItemEntityPacket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AddItemEntityPacket.h; sourceTree = ""; }; + D5B50D3714CFF66F005F7284 /* AddMobPacket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AddMobPacket.h; sourceTree = ""; }; + D5B50D3814CFF66F005F7284 /* AddPlayerPacket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AddPlayerPacket.h; sourceTree = ""; }; + D5B50D3914CFF66F005F7284 /* AnimatePacket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AnimatePacket.h; sourceTree = ""; }; + D5B50D3A14CFF66F005F7284 /* ChunkDataPacket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChunkDataPacket.h; sourceTree = ""; }; + D5B50D3B14CFF66F005F7284 /* InteractPacket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InteractPacket.h; sourceTree = ""; }; + D5B50D3C14CFF66F005F7284 /* LoginPacket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LoginPacket.h; sourceTree = ""; }; + D5B50D3D14CFF66F005F7284 /* LoginStatusPacket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LoginStatusPacket.h; sourceTree = ""; }; + D5B50D3E14CFF66F005F7284 /* MessagePacket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MessagePacket.h; sourceTree = ""; }; + D5B50D3F14CFF66F005F7284 /* MoveEntityPacket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MoveEntityPacket.h; sourceTree = ""; }; + D5B50D4014CFF66F005F7284 /* MovePlayerPacket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MovePlayerPacket.h; sourceTree = ""; }; + D5B50D4114CFF66F005F7284 /* PacketInclude.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PacketInclude.h; sourceTree = ""; }; + D5B50D4214CFF66F005F7284 /* PlaceBlockPacket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlaceBlockPacket.h; sourceTree = ""; }; + D5B50D4314CFF66F005F7284 /* PlayerEquipmentPacket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlayerEquipmentPacket.h; sourceTree = ""; }; + D5B50D4414CFF66F005F7284 /* RemoveBlockPacket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RemoveBlockPacket.h; sourceTree = ""; }; + D5B50D4514CFF66F005F7284 /* RemoveEntityPacket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RemoveEntityPacket.h; sourceTree = ""; }; + D5B50D4614CFF66F005F7284 /* RequestChunkPacket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RequestChunkPacket.h; sourceTree = ""; }; + D5B50D4714CFF66F005F7284 /* StartGamePacket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StartGamePacket.h; sourceTree = ""; }; + D5B50D4814CFF66F005F7284 /* UpdateBlockPacket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UpdateBlockPacket.h; sourceTree = ""; }; + D5B50D4914CFF66F005F7284 /* UseItemPacket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UseItemPacket.h; sourceTree = ""; }; + D5B50D4A14CFF66F005F7284 /* Packet.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Packet.cpp; sourceTree = ""; }; + D5B50D4B14CFF66F005F7284 /* Packet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Packet.h; sourceTree = ""; }; + D5B50D4C14CFF66F005F7284 /* RakNetInstance.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RakNetInstance.cpp; sourceTree = ""; }; + D5B50D4D14CFF66F005F7284 /* RakNetInstance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RakNetInstance.h; sourceTree = ""; }; + D5B50D4E14CFF66F005F7284 /* ServerSideNetworkHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ServerSideNetworkHandler.cpp; sourceTree = ""; }; + D5B50D4F14CFF66F005F7284 /* ServerSideNetworkHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ServerSideNetworkHandler.h; sourceTree = ""; }; + D5B50D5014CFF66F005F7284 /* NinecraftApp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NinecraftApp.cpp; sourceTree = ""; }; + D5B50D5114CFF66F005F7284 /* NinecraftApp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NinecraftApp.h; sourceTree = ""; }; + D5B50D5214CFF66F005F7284 /* Performance.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Performance.cpp; sourceTree = ""; }; + D5B50D5314CFF66F005F7284 /* Performance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Performance.h; sourceTree = ""; }; + D5B50D5914CFF66F005F7284 /* SoundSystem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SoundSystem.h; sourceTree = ""; }; + D5B50D5A14CFF66F005F7284 /* SoundSystemAL.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SoundSystemAL.cpp; sourceTree = ""; }; + D5B50D5B14CFF66F005F7284 /* SoundSystemAL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SoundSystemAL.h; sourceTree = ""; }; + D5B50D5E14CFF66F005F7284 /* CThread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CThread.cpp; sourceTree = ""; }; + D5B50D5F14CFF66F005F7284 /* CThread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CThread.h; sourceTree = ""; }; + D5B50D6014CFF66F005F7284 /* file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = file.h; sourceTree = ""; }; + D5B50D6214CFF66F005F7284 /* Controller.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Controller.cpp; sourceTree = ""; }; + D5B50D6314CFF66F005F7284 /* Controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Controller.h; sourceTree = ""; }; + D5B50D6414CFF66F005F7284 /* Keyboard.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Keyboard.cpp; sourceTree = ""; }; + D5B50D6514CFF66F005F7284 /* Keyboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Keyboard.h; sourceTree = ""; }; + D5B50D6614CFF66F005F7284 /* Mouse.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Mouse.cpp; sourceTree = ""; }; + D5B50D6714CFF66F005F7284 /* Mouse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Mouse.h; sourceTree = ""; }; + D5B50D6814CFF66F005F7284 /* Multitouch.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Multitouch.cpp; sourceTree = ""; }; + D5B50D6914CFF66F005F7284 /* Multitouch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Multitouch.h; sourceTree = ""; }; + D5B50D6A14CFF66F005F7284 /* log.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = log.h; sourceTree = ""; }; + D5B50D6B14CFF66F005F7284 /* time.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = time.cpp; sourceTree = ""; }; + D5B50D6C14CFF66F005F7284 /* time.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = time.h; sourceTree = ""; }; + D5B50E5614CFF66F005F7284 /* SharedConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SharedConstants.h; sourceTree = ""; }; + D5B50E5714CFF66F005F7284 /* terrain_4444.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = terrain_4444.h; sourceTree = ""; }; + D5B50E5814CFF66F005F7284 /* terrain_5551.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = terrain_5551.h; sourceTree = ""; }; + D5B50E5914CFF66F005F7284 /* terrain_565.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = terrain_565.h; sourceTree = ""; }; + D5B50E5A14CFF66F005F7284 /* terrain_565_2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = terrain_565_2.h; sourceTree = ""; }; + D5B50E5C14CFF66F005F7284 /* CollectionUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CollectionUtils.h; sourceTree = ""; }; + D5B50E5D14CFF66F005F7284 /* DataIO.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DataIO.cpp; sourceTree = ""; }; + D5B50E5E14CFF66F005F7284 /* DataIO.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataIO.h; sourceTree = ""; }; + D5B50E5F14CFF66F005F7284 /* IntHashMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IntHashMap.h; sourceTree = ""; }; + D5B50E6014CFF66F005F7284 /* Mth.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Mth.cpp; sourceTree = ""; }; + D5B50E6114CFF66F005F7284 /* Mth.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Mth.h; sourceTree = ""; }; + D5B50E6214CFF66F005F7284 /* PerfRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PerfRenderer.cpp; sourceTree = ""; }; + D5B50E6314CFF66F005F7284 /* PerfRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PerfRenderer.h; sourceTree = ""; }; + D5B50E6414CFF66F005F7284 /* PerfTimer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PerfTimer.cpp; sourceTree = ""; }; + D5B50E6514CFF66F005F7284 /* PerfTimer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PerfTimer.h; sourceTree = ""; }; + D5B50E6614CFF66F005F7284 /* RakDataIO.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RakDataIO.h; sourceTree = ""; }; + D5B50E6714CFF66F005F7284 /* Random.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Random.h; sourceTree = ""; }; + D5B50E6814CFF66F005F7284 /* SmoothFloat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SmoothFloat.h; sourceTree = ""; }; + D5B50E6914CFF66F005F7284 /* StringUtils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StringUtils.cpp; sourceTree = ""; }; + D5B50E6A14CFF66F005F7284 /* StringUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StringUtils.h; sourceTree = ""; }; + D5B50E6B14CFF66F005F7284 /* WeighedRandom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WeighedRandom.h; sourceTree = ""; }; + D5B50E6D14CFF66F005F7284 /* Container.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Container.h; sourceTree = ""; }; + D5B50E6E14CFF66F005F7284 /* Direction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Direction.cpp; sourceTree = ""; }; + D5B50E6F14CFF66F005F7284 /* Direction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Direction.h; sourceTree = ""; }; + D5B50E7214CFF66F005F7284 /* Animal.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Animal.cpp; sourceTree = ""; }; + D5B50E7314CFF66F005F7284 /* Animal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Animal.h; sourceTree = ""; }; + D5B50E7414CFF66F005F7284 /* AnimalInclude.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AnimalInclude.h; sourceTree = ""; }; + D5B50E7514CFF66F005F7284 /* Chicken.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Chicken.cpp; sourceTree = ""; }; + D5B50E7614CFF66F005F7284 /* Chicken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Chicken.h; sourceTree = ""; }; + D5B50E7714CFF66F005F7284 /* Cow.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Cow.cpp; sourceTree = ""; }; + D5B50E7814CFF66F005F7284 /* Cow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Cow.h; sourceTree = ""; }; + D5B50E7914CFF66F005F7284 /* Pig.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Pig.cpp; sourceTree = ""; }; + D5B50E7A14CFF66F005F7284 /* Pig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Pig.h; sourceTree = ""; }; + D5B50E7B14CFF66F005F7284 /* Sheep.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Sheep.cpp; sourceTree = ""; }; + D5B50E7C14CFF66F005F7284 /* Sheep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Sheep.h; sourceTree = ""; }; + D5B50E7D14CFF66F005F7284 /* WaterAnimal.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WaterAnimal.cpp; sourceTree = ""; }; + D5B50E7E14CFF66F005F7284 /* WaterAnimal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WaterAnimal.h; sourceTree = ""; }; + D5B50E7F14CFF66F005F7284 /* Creature.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Creature.h; sourceTree = ""; }; + D5B50E8014CFF66F005F7284 /* Entity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Entity.cpp; sourceTree = ""; }; + D5B50E8114CFF66F005F7284 /* Entity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Entity.h; sourceTree = ""; }; + D5B50E8214CFF66F005F7284 /* EntityEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EntityEvent.h; sourceTree = ""; }; + D5B50E8314CFF66F005F7284 /* EntityPos.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EntityPos.h; sourceTree = ""; }; + D5B50E8414CFF66F005F7284 /* EntityRendererId.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EntityRendererId.h; sourceTree = ""; }; + D5B50E8514CFF66F005F7284 /* EntityTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EntityTypes.h; sourceTree = ""; }; + D5B50E8614CFF66F005F7284 /* FlyingMob.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FlyingMob.cpp; sourceTree = ""; }; + D5B50E8714CFF66F005F7284 /* FlyingMob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlyingMob.h; sourceTree = ""; }; + D5B50E8914CFF66F005F7284 /* FallingTile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FallingTile.cpp; sourceTree = ""; }; + D5B50E8A14CFF66F005F7284 /* FallingTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FallingTile.h; sourceTree = ""; }; + D5B50E8B14CFF66F005F7284 /* ItemEntity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ItemEntity.cpp; sourceTree = ""; }; + D5B50E8C14CFF66F005F7284 /* ItemEntity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ItemEntity.h; sourceTree = ""; }; + D5B50E8D14CFF66F005F7284 /* PrimedTnt.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PrimedTnt.cpp; sourceTree = ""; }; + D5B50E8E14CFF66F005F7284 /* PrimedTnt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PrimedTnt.h; sourceTree = ""; }; + D5B50E8F14CFF66F005F7284 /* TripodCamera.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TripodCamera.cpp; sourceTree = ""; }; + D5B50E9014CFF66F005F7284 /* TripodCamera.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TripodCamera.h; sourceTree = ""; }; + D5B50E9114CFF66F005F7284 /* Mob.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Mob.cpp; sourceTree = ""; }; + D5B50E9214CFF66F005F7284 /* Mob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Mob.h; sourceTree = ""; }; + D5B50E9314CFF66F005F7284 /* MobCategory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MobCategory.cpp; sourceTree = ""; }; + D5B50E9414CFF66F005F7284 /* MobCategory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MobCategory.h; sourceTree = ""; }; + D5B50E9514CFF66F005F7284 /* MobFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MobFactory.h; sourceTree = ""; }; + D5B50E9E14CFF66F005F7284 /* PathFinderMob.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PathFinderMob.cpp; sourceTree = ""; }; + D5B50E9F14CFF66F005F7284 /* PathfinderMob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PathfinderMob.h; sourceTree = ""; }; + D5B50EA114CFF66F005F7284 /* Abilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Abilities.h; sourceTree = ""; }; + D5B50EA214CFF66F005F7284 /* Inventory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Inventory.cpp; sourceTree = ""; }; + D5B50EA314CFF66F005F7284 /* Inventory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Inventory.h; sourceTree = ""; }; + D5B50EA514CFF66F005F7284 /* InventorySlotManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InventorySlotManager.h; sourceTree = ""; }; + D5B50EA614CFF66F005F7284 /* Player.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Player.cpp; sourceTree = ""; }; + D5B50EA714CFF66F005F7284 /* Player.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Player.h; sourceTree = ""; }; + D5B50EA914CFF66F005F7284 /* Arrow.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Arrow.cpp; sourceTree = ""; }; + D5B50EAA14CFF66F005F7284 /* Arrow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Arrow.h; sourceTree = ""; }; + D5B50EAB14CFF66F005F7284 /* SynchedEntityData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SynchedEntityData.h; sourceTree = ""; }; + D5B50EAC14CFF66F005F7284 /* Facing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Facing.h; sourceTree = ""; }; + D5B50EAE14CFF66F005F7284 /* CraftingContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CraftingContainer.h; sourceTree = ""; }; + D5B50EB014CFF66F005F7284 /* BowItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BowItem.h; sourceTree = ""; }; + D5B50EB114CFF66F005F7284 /* CameraItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CameraItem.h; sourceTree = ""; }; + D5B50EB314CFF66F005F7284 /* Recipe.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Recipe.h; sourceTree = ""; }; + D5B50EB414CFF66F005F7284 /* Recipes.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Recipes.cpp; sourceTree = ""; }; + D5B50EB514CFF66F005F7284 /* Recipes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Recipes.h; sourceTree = ""; }; + D5B50EB614CFF66F005F7284 /* ShapedRecipe.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShapedRecipe.h; sourceTree = ""; }; + D5B50EB714CFF66F005F7284 /* ShapelessRecipe.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShapelessRecipe.h; sourceTree = ""; }; + D5B50EB814CFF66F005F7284 /* ToolRecipes.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ToolRecipes.cpp; sourceTree = ""; }; + D5B50EB914CFF66F005F7284 /* ToolRecipes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ToolRecipes.h; sourceTree = ""; }; + D5B50EBA14CFF66F005F7284 /* WeaponRecipes.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WeaponRecipes.cpp; sourceTree = ""; }; + D5B50EBB14CFF66F005F7284 /* WeaponRecipes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WeaponRecipes.h; sourceTree = ""; }; + D5B50EBC14CFF66F005F7284 /* DiggerItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DiggerItem.h; sourceTree = ""; }; + D5B50EBD14CFF66F005F7284 /* DoorItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DoorItem.h; sourceTree = ""; }; + D5B50EBE14CFF66F005F7284 /* EggItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EggItem.h; sourceTree = ""; }; + D5B50EBF14CFF66F005F7284 /* HatchetItem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HatchetItem.cpp; sourceTree = ""; }; + D5B50EC014CFF66F005F7284 /* HatchetItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HatchetItem.h; sourceTree = ""; }; + D5B50EC114CFF66F005F7284 /* Item.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Item.cpp; sourceTree = ""; }; + D5B50EC214CFF66F005F7284 /* Item.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Item.h; sourceTree = ""; }; + D5B50EC314CFF66F005F7284 /* ItemInclude.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ItemInclude.h; sourceTree = ""; }; + D5B50EC414CFF66F005F7284 /* ItemInstance.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ItemInstance.cpp; sourceTree = ""; }; + D5B50EC514CFF66F005F7284 /* ItemInstance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ItemInstance.h; sourceTree = ""; }; + D5B50EC614CFF66F005F7284 /* PickaxeItem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PickaxeItem.cpp; sourceTree = ""; }; + D5B50EC714CFF66F005F7284 /* PickaxeItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PickaxeItem.h; sourceTree = ""; }; + D5B50EC814CFF66F005F7284 /* ShearsItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShearsItem.h; sourceTree = ""; }; + D5B50EC914CFF66F005F7284 /* ShovelItem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ShovelItem.cpp; sourceTree = ""; }; + D5B50ECA14CFF66F005F7284 /* ShovelItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShovelItem.h; sourceTree = ""; }; + D5B50ECB14CFF66F005F7284 /* SnowballItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SnowballItem.h; sourceTree = ""; }; + D5B50ECC14CFF66F005F7284 /* TileItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TileItem.h; sourceTree = ""; }; + D5B50ECD14CFF66F005F7284 /* TilePlanterItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TilePlanterItem.h; sourceTree = ""; }; + D5B50ECE14CFF66F005F7284 /* TreeTileItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TreeTileItem.h; sourceTree = ""; }; + D5B50ECF14CFF66F005F7284 /* WeaponItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WeaponItem.h; sourceTree = ""; }; + D5B50ED214CFF66F005F7284 /* Biome.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Biome.cpp; sourceTree = ""; }; + D5B50ED314CFF66F005F7284 /* Biome.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Biome.h; sourceTree = ""; }; + D5B50ED414CFF66F005F7284 /* BiomeInclude.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BiomeInclude.h; sourceTree = ""; }; + D5B50ED514CFF66F005F7284 /* BiomeSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BiomeSource.cpp; sourceTree = ""; }; + D5B50ED614CFF66F005F7284 /* BiomeSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BiomeSource.h; sourceTree = ""; }; + D5B50ED714CFF66F005F7284 /* FlatBiome.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlatBiome.h; sourceTree = ""; }; + D5B50ED814CFF66F005F7284 /* ForestBiome.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ForestBiome.h; sourceTree = ""; }; + D5B50ED914CFF66F005F7284 /* RainforestBiome.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RainforestBiome.h; sourceTree = ""; }; + D5B50EDA14CFF66F005F7284 /* SwampBiome.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SwampBiome.h; sourceTree = ""; }; + D5B50EDB14CFF66F005F7284 /* TaigaBiome.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TaigaBiome.h; sourceTree = ""; }; + D5B50EDD14CFF66F005F7284 /* ChunkCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChunkCache.h; sourceTree = ""; }; + D5B50EDE14CFF66F005F7284 /* ChunkSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChunkSource.h; sourceTree = ""; }; + D5B50EDF14CFF66F005F7284 /* DataLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataLayer.h; sourceTree = ""; }; + D5B50EE014CFF66F005F7284 /* EmptyLevelChunk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EmptyLevelChunk.h; sourceTree = ""; }; + D5B50EE114CFF66F005F7284 /* LevelChunk.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LevelChunk.cpp; sourceTree = ""; }; + D5B50EE214CFF66F005F7284 /* LevelChunk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LevelChunk.h; sourceTree = ""; }; + D5B50EE414CFF66F005F7284 /* ChunkStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChunkStorage.h; sourceTree = ""; }; + D5B50EE514CFF66F005F7284 /* MemoryChunkStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MemoryChunkStorage.h; sourceTree = ""; }; + D5B50EE614CFF66F005F7284 /* ChunkPos.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChunkPos.h; sourceTree = ""; }; + D5B50EE814CFF66F005F7284 /* Dimension.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Dimension.cpp; sourceTree = ""; }; + D5B50EE914CFF66F005F7284 /* Dimension.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Dimension.h; sourceTree = ""; }; + D5B50EEC14CFF66F005F7284 /* Explosion.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Explosion.cpp; sourceTree = ""; }; + D5B50EED14CFF66F005F7284 /* Explosion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Explosion.h; sourceTree = ""; }; + D5B50EEE14CFF66F005F7284 /* Level.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Level.cpp; sourceTree = ""; }; + D5B50EEF14CFF66F005F7284 /* Level.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Level.h; sourceTree = ""; }; + D5B50EF014CFF66F005F7284 /* LevelConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LevelConstants.h; sourceTree = ""; }; + D5B50EF214CFF66F005F7284 /* CanyonFeature.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CanyonFeature.cpp; sourceTree = ""; }; + D5B50EF314CFF66F005F7284 /* CanyonFeature.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CanyonFeature.h; sourceTree = ""; }; + D5B50EF414CFF66F005F7284 /* DungeonFeature.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DungeonFeature.cpp; sourceTree = ""; }; + D5B50EF514CFF66F005F7284 /* DungeonFeature.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DungeonFeature.h; sourceTree = ""; }; + D5B50EF714CFF66F005F7284 /* BirchFeature.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BirchFeature.h; sourceTree = ""; }; + D5B50EF814CFF66F005F7284 /* CactusFeature.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CactusFeature.h; sourceTree = ""; }; + D5B50EF914CFF66F005F7284 /* ClayFeature.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ClayFeature.h; sourceTree = ""; }; + D5B50EFA14CFF66F005F7284 /* Feature.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Feature.h; sourceTree = ""; }; + D5B50EFB14CFF66F005F7284 /* FeatureInclude.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FeatureInclude.h; sourceTree = ""; }; + D5B50EFC14CFF66F005F7284 /* FlowerFeature.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlowerFeature.h; sourceTree = ""; }; + D5B50EFD14CFF66F005F7284 /* LakeFeature.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LakeFeature.h; sourceTree = ""; }; + D5B50EFE14CFF66F005F7284 /* OreFeature.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OreFeature.h; sourceTree = ""; }; + D5B50EFF14CFF66F005F7284 /* PineFeature.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PineFeature.h; sourceTree = ""; }; + D5B50F0014CFF66F005F7284 /* ReedsFeature.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReedsFeature.h; sourceTree = ""; }; + D5B50F0114CFF66F005F7284 /* SpringFeature.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpringFeature.h; sourceTree = ""; }; + D5B50F0214CFF66F005F7284 /* SpruceFeature.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpruceFeature.h; sourceTree = ""; }; + D5B50F0314CFF66F005F7284 /* TreeFeature.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TreeFeature.h; sourceTree = ""; }; + D5B50F0414CFF66F005F7284 /* LargeCaveFeature.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LargeCaveFeature.cpp; sourceTree = ""; }; + D5B50F0514CFF66F005F7284 /* LargeCaveFeature.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LargeCaveFeature.h; sourceTree = ""; }; + D5B50F0614CFF66F005F7284 /* LargeFeature.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LargeFeature.cpp; sourceTree = ""; }; + D5B50F0714CFF66F005F7284 /* LargeFeature.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LargeFeature.h; sourceTree = ""; }; + D5B50F0814CFF66F005F7284 /* RandomLevelSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RandomLevelSource.cpp; sourceTree = ""; }; + D5B50F0914CFF66F005F7284 /* RandomLevelSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RandomLevelSource.h; sourceTree = ""; }; + D5B50F0B14CFF66F005F7284 /* ImprovedNoise.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ImprovedNoise.cpp; sourceTree = ""; }; + D5B50F0C14CFF66F005F7284 /* ImprovedNoise.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImprovedNoise.h; sourceTree = ""; }; + D5B50F0D14CFF66F005F7284 /* PerlinNoise.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PerlinNoise.cpp; sourceTree = ""; }; + D5B50F0E14CFF66F005F7284 /* PerlinNoise.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PerlinNoise.h; sourceTree = ""; }; + D5B50F0F14CFF66F005F7284 /* Synth.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Synth.cpp; sourceTree = ""; }; + D5B50F1014CFF66F005F7284 /* Synth.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Synth.h; sourceTree = ""; }; + D5B50F1114CFF66F005F7284 /* TownFeature.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TownFeature.h; sourceTree = ""; }; + D5B50F1214CFF66F005F7284 /* LevelListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LevelListener.h; sourceTree = ""; }; + D5B50F1314CFF66F005F7284 /* LevelSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LevelSettings.h; sourceTree = ""; }; + D5B50F1414CFF66F005F7284 /* LevelSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LevelSource.h; sourceTree = ""; }; + D5B50F1514CFF66F005F7284 /* LightLayer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LightLayer.cpp; sourceTree = ""; }; + D5B50F1614CFF66F005F7284 /* LightLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LightLayer.h; sourceTree = ""; }; + D5B50F1714CFF66F005F7284 /* LightUpdate.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LightUpdate.cpp; sourceTree = ""; }; + D5B50F1814CFF66F005F7284 /* LightUpdate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LightUpdate.h; sourceTree = ""; }; + D5B50F1A14CFF66F005F7284 /* DecorationMaterial.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DecorationMaterial.h; sourceTree = ""; }; + D5B50F1B14CFF66F005F7284 /* GasMaterial.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GasMaterial.h; sourceTree = ""; }; + D5B50F1C14CFF66F005F7284 /* LiquidMaterial.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LiquidMaterial.h; sourceTree = ""; }; + D5B50F1D14CFF66F005F7284 /* Material.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Material.cpp; sourceTree = ""; }; + D5B50F1E14CFF66F005F7284 /* Material.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Material.h; sourceTree = ""; }; + D5B50F1F14CFF66F005F7284 /* MobSpawner.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MobSpawner.cpp; sourceTree = ""; }; + D5B50F2014CFF66F005F7284 /* MobSpawner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MobSpawner.h; sourceTree = ""; }; + D5B50F2214CFF66F005F7284 /* BinaryHeap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BinaryHeap.h; sourceTree = ""; }; + D5B50F2314CFF66F005F7284 /* Node.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Node.h; sourceTree = ""; }; + D5B50F2414CFF66F005F7284 /* Path.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Path.h; sourceTree = ""; }; + D5B50F2514CFF66F005F7284 /* PathFinder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PathFinder.h; sourceTree = ""; }; + D5B50F2614CFF66F005F7284 /* Region.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Region.cpp; sourceTree = ""; }; + D5B50F2714CFF66F005F7284 /* Region.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Region.h; sourceTree = ""; }; + D5B50F2914CFF66F005F7284 /* ExternalFileLevelStorage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ExternalFileLevelStorage.cpp; sourceTree = ""; }; + D5B50F2A14CFF66F005F7284 /* ExternalFileLevelStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExternalFileLevelStorage.h; sourceTree = ""; }; + D5B50F2B14CFF66F005F7284 /* ExternalFileLevelStorageSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ExternalFileLevelStorageSource.cpp; sourceTree = ""; }; + D5B50F2C14CFF66F005F7284 /* ExternalFileLevelStorageSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExternalFileLevelStorageSource.h; sourceTree = ""; }; + D5B50F2D14CFF66F005F7284 /* FolderMethods.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FolderMethods.h; sourceTree = ""; }; + D5B50F2E14CFF66F005F7284 /* LevelData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LevelData.h; sourceTree = ""; }; + D5B50F2F14CFF66F005F7284 /* LevelStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LevelStorage.h; sourceTree = ""; }; + D5B50F3014CFF66F005F7284 /* LevelStorageSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LevelStorageSource.h; sourceTree = ""; }; + D5B50F3114CFF66F005F7284 /* MemoryLevelStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MemoryLevelStorage.h; sourceTree = ""; }; + D5B50F3214CFF66F005F7284 /* MemoryLevelStorageSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MemoryLevelStorageSource.h; sourceTree = ""; }; + D5B50F3314CFF66F005F7284 /* PlayerData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlayerData.h; sourceTree = ""; }; + D5B50F3414CFF66F005F7284 /* RegionFile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RegionFile.cpp; sourceTree = ""; }; + D5B50F3514CFF66F005F7284 /* RegionFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegionFile.h; sourceTree = ""; }; + D5B50F3614CFF66F005F7284 /* TickNextTickData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TickNextTickData.cpp; sourceTree = ""; }; + D5B50F3714CFF66F005F7284 /* TickNextTickData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TickNextTickData.h; sourceTree = ""; }; + D5B50F3914CFF66F005F7284 /* BookshelfTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BookshelfTile.h; sourceTree = ""; }; + D5B50F3A14CFF66F005F7284 /* Bush.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Bush.h; sourceTree = ""; }; + D5B50F3B14CFF66F005F7284 /* CactusTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CactusTile.h; sourceTree = ""; }; + D5B50F3C14CFF66F005F7284 /* ClayTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ClayTile.h; sourceTree = ""; }; + D5B50F3D14CFF66F005F7284 /* ClothTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ClothTile.h; sourceTree = ""; }; + D5B50F3E14CFF66F005F7284 /* DirtTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DirtTile.h; sourceTree = ""; }; + D5B50F3F14CFF66F005F7284 /* DoorTile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DoorTile.cpp; sourceTree = ""; }; + D5B50F4014CFF66F005F7284 /* DoorTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DoorTile.h; sourceTree = ""; }; + D5B50F4214CFF66F005F7284 /* TileEntity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TileEntity.h; sourceTree = ""; }; + D5B50F4314CFF66F005F7284 /* FarmTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FarmTile.h; sourceTree = ""; }; + D5B50F4414CFF66F005F7284 /* FenceGateTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FenceGateTile.h; sourceTree = ""; }; + D5B50F4514CFF66F005F7284 /* FenceTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FenceTile.h; sourceTree = ""; }; + D5B50F4614CFF66F005F7284 /* FireTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FireTile.h; sourceTree = ""; }; + D5B50F4714CFF66F005F7284 /* GlassTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GlassTile.h; sourceTree = ""; }; + D5B50F4814CFF66F005F7284 /* GrassTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GrassTile.h; sourceTree = ""; }; + D5B50F4914CFF66F005F7284 /* GravelTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GravelTile.h; sourceTree = ""; }; + D5B50F4A14CFF66F005F7284 /* HalfTransparentTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HalfTransparentTile.h; sourceTree = ""; }; + D5B50F4B14CFF66F005F7284 /* IceTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IceTile.h; sourceTree = ""; }; + D5B50F4C14CFF66F005F7284 /* InvisibleTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InvisibleTile.h; sourceTree = ""; }; + D5B50F4D14CFF66F005F7284 /* LadderTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LadderTile.h; sourceTree = ""; }; + D5B50F4E14CFF66F005F7284 /* LeafTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LeafTile.h; sourceTree = ""; }; + D5B50F4F14CFF66F005F7284 /* LevelEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LevelEvent.h; sourceTree = ""; }; + D5B50F5014CFF66F005F7284 /* LiquidTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LiquidTile.h; sourceTree = ""; }; + D5B50F5114CFF66F005F7284 /* LiquidTileDynamic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LiquidTileDynamic.h; sourceTree = ""; }; + D5B50F5214CFF66F005F7284 /* LiquidTileStatic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LiquidTileStatic.h; sourceTree = ""; }; + D5B50F5314CFF66F005F7284 /* MetalTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MetalTile.h; sourceTree = ""; }; + D5B50F5414CFF66F005F7284 /* ObsidianTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ObsidianTile.h; sourceTree = ""; }; + D5B50F5514CFF66F005F7284 /* OreTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OreTile.h; sourceTree = ""; }; + D5B50F5614CFF66F005F7284 /* RedStoneOreTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RedStoneOreTile.h; sourceTree = ""; }; + D5B50F5714CFF66F005F7284 /* ReedTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReedTile.h; sourceTree = ""; }; + D5B50F5814CFF66F005F7284 /* SandStoneTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SandStoneTile.h; sourceTree = ""; }; + D5B50F5B14CFF66F005F7284 /* SnowTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SnowTile.h; sourceTree = ""; }; + D5B50F5C14CFF66F005F7284 /* StairTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StairTile.h; sourceTree = ""; }; + D5B50F5D14CFF66F005F7284 /* StoneSlabTile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StoneSlabTile.cpp; sourceTree = ""; }; + D5B50F5E14CFF66F005F7284 /* StoneSlabTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StoneSlabTile.h; sourceTree = ""; }; + D5B50F5F14CFF66F005F7284 /* StoneTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StoneTile.h; sourceTree = ""; }; + D5B50F6014CFF66F005F7284 /* Tile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Tile.cpp; sourceTree = ""; }; + D5B50F6114CFF66F005F7284 /* Tile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Tile.h; sourceTree = ""; }; + D5B50F6214CFF66F005F7284 /* TileInclude.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TileInclude.h; sourceTree = ""; }; + D5B50F6314CFF66F005F7284 /* TntTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TntTile.h; sourceTree = ""; }; + D5B50F6414CFF66F005F7284 /* TopSnowTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TopSnowTile.h; sourceTree = ""; }; + D5B50F6514CFF66F005F7284 /* TorchTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TorchTile.h; sourceTree = ""; }; + D5B50F6614CFF66F005F7284 /* TransparentTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TransparentTile.h; sourceTree = ""; }; + D5B50F6714CFF66F005F7284 /* TreeTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TreeTile.h; sourceTree = ""; }; + D5B50F6814CFF66F005F7284 /* TilePos.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TilePos.h; sourceTree = ""; }; + D5B50F6A14CFF66F005F7284 /* AABB.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AABB.h; sourceTree = ""; }; + D5B50F6B14CFF66F005F7284 /* HitResult.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HitResult.cpp; sourceTree = ""; }; + D5B50F6C14CFF66F005F7284 /* HitResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HitResult.h; sourceTree = ""; }; + D5B50F6D14CFF66F005F7284 /* Vec3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Vec3.h; sourceTree = ""; }; + D5B50F6E14CFF66F005F7284 /* Pos.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Pos.h; sourceTree = ""; }; + D5B5118A14D03342005F7284 /* SynchedEntityData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SynchedEntityData.cpp; sourceTree = ""; }; + D5B5118D14DEA27E005F7284 /* DeathScreen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DeathScreen.cpp; sourceTree = ""; }; + D5B5119014DEA2B7005F7284 /* LevelData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LevelData.cpp; sourceTree = ""; }; + D5B5119314DEA2EF005F7284 /* DyePowderItem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DyePowderItem.cpp; sourceTree = ""; }; + D5B5119614DEA304005F7284 /* DyePowderItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DyePowderItem.h; sourceTree = ""; }; + D5B86280153810BD00F3238A /* I18n.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = I18n.cpp; sourceTree = ""; }; + D5B862841538175500F3238A /* ScrollingPane.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ScrollingPane.cpp; sourceTree = ""; }; + D5B8628B1538178F00F3238A /* ScrollingPane.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScrollingPane.h; sourceTree = ""; }; + D5B8628C1538187400F3238A /* ClothDyeRecipes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ClothDyeRecipes.h; sourceTree = ""; }; + D5B8628D1538187400F3238A /* FoodRecipes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FoodRecipes.h; sourceTree = ""; }; + D5B8628E1538187400F3238A /* Recipe.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Recipe.cpp; sourceTree = ""; }; + D5B8628F1538187400F3238A /* RecipeCategory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RecipeCategory.h; sourceTree = ""; }; + D5B862901538187400F3238A /* StructureRecipes.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StructureRecipes.cpp; sourceTree = ""; }; + D5B862911538187400F3238A /* StructureRecipes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StructureRecipes.h; sourceTree = ""; }; + D5BFCF1A14513FF400A443B0 /* CreateNewWorld_ipad.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = CreateNewWorld_ipad.xib; path = minecraftpe/dialogs/CreateNewWorld_ipad.xib; sourceTree = ""; }; + D5CF9C42144C225000E4244F /* minecraftpe.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = minecraftpe.app; sourceTree = BUILT_PRODUCTS_DIR; }; + D5CF9C46144C225000E4244F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + D5CF9C48144C225000E4244F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + D5CF9C4A144C225000E4244F /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + D5CF9C4C144C225000E4244F /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + D5CF9C4E144C225000E4244F /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; + D5CF9C52144C225000E4244F /* minecraftpe-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "minecraftpe-Info.plist"; sourceTree = ""; }; + D5CF9C54144C225000E4244F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + D5CF9C56144C225000E4244F /* main.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; lineEnding = 0; path = main.mm; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + D5CF9C58144C225000E4244F /* minecraftpe-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "minecraftpe-Prefix.pch"; sourceTree = ""; }; + D5CF9C59144C225000E4244F /* minecraftpeAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = minecraftpeAppDelegate.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + D5CF9C5A144C225000E4244F /* minecraftpeAppDelegate.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; lineEnding = 0; path = minecraftpeAppDelegate.mm; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + D5CF9C5D144C225000E4244F /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainWindow.xib; sourceTree = ""; }; + D5CF9C63144C225000E4244F /* EAGLView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EAGLView.h; sourceTree = ""; }; + D5CF9C64144C225000E4244F /* EAGLView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EAGLView.m; sourceTree = ""; }; + D5CF9C66144C225000E4244F /* minecraftpeViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = minecraftpeViewController.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + D5CF9C6A144C225000E4244F /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/minecraftpeViewController.xib; sourceTree = ""; }; + D5CFA01C144C453900E4244F /* minecraftpeViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; lineEnding = 0; path = minecraftpeViewController.mm; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + D5D381F015A1A1CF00B6C50E /* FillingContainer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FillingContainer.cpp; sourceTree = ""; }; + D5D381F115A1A1CF00B6C50E /* FillingContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FillingContainer.h; sourceTree = ""; }; + D5D381F515A1A21800B6C50E /* EntityTile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EntityTile.cpp; sourceTree = ""; }; + D5D381F615A1A21800B6C50E /* EntityTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EntityTile.h; sourceTree = ""; }; + D5D381FA15A1A22E00B6C50E /* ChestTileEntity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChestTileEntity.h; sourceTree = ""; }; + D5D381FB15A1A22E00B6C50E /* TileEntityRendererId.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TileEntityRendererId.h; sourceTree = ""; }; + D5D381FF15A1A26000B6C50E /* ChestRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ChestRenderer.cpp; sourceTree = ""; }; + D5D3820015A1A26000B6C50E /* ChestRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChestRenderer.h; sourceTree = ""; }; + D5D3820115A1A26000B6C50E /* TileEntityRenderDispatcher.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TileEntityRenderDispatcher.cpp; sourceTree = ""; }; + D5D3820215A1A26000B6C50E /* TileEntityRenderDispatcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TileEntityRenderDispatcher.h; sourceTree = ""; }; + D5D3820315A1A26000B6C50E /* TileEntityRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TileEntityRenderer.cpp; sourceTree = ""; }; + D5D3820415A1A26000B6C50E /* TileEntityRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TileEntityRenderer.h; sourceTree = ""; }; + D5D3820B15A1A2A000B6C50E /* EntityTileRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EntityTileRenderer.cpp; sourceTree = ""; }; + D5D3820C15A1A2A000B6C50E /* EntityTileRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EntityTileRenderer.h; sourceTree = ""; }; + D5D3820F15A1A2C200B6C50E /* ChestTile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ChestTile.cpp; sourceTree = ""; }; + D5D3821015A1A2C200B6C50E /* ChestTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChestTile.h; sourceTree = ""; }; + D5D3821315A1A5D100B6C50E /* ChestTileEntity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ChestTileEntity.cpp; sourceTree = ""; }; + D5D43CC0146AF4B4002ED842 /* RenameMPWorld_ipad.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = RenameMPWorld_ipad.xib; path = minecraftpe/dialogs/RenameMPWorld_ipad.xib; sourceTree = ""; }; + D5D43CC1146AF4B4002ED842 /* RenameMPWorld_iphone.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = RenameMPWorld_iphone.xib; path = minecraftpe/dialogs/RenameMPWorld_iphone.xib; sourceTree = ""; }; + D5D43CC2146AF4B4002ED842 /* RenameMPWorldViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RenameMPWorldViewController.h; path = minecraftpe/dialogs/RenameMPWorldViewController.h; sourceTree = ""; }; + D5D43CC3146AF4B4002ED842 /* RenameMPWorldViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = RenameMPWorldViewController.mm; path = minecraftpe/dialogs/RenameMPWorldViewController.mm; sourceTree = ""; }; + D5D43CCA146AFD9D002ED842 /* save_0_3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = save_0_3.png; sourceTree = ""; }; + D5D43CCB146AFD9D002ED842 /* save_0.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = save_0.png; sourceTree = ""; }; + D5D43CCC146AFD9E002ED842 /* save_1_3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = save_1_3.png; sourceTree = ""; }; + D5D43CCD146AFD9E002ED842 /* save_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = save_1.png; sourceTree = ""; }; + D5D8C48316392FF000FD35F0 /* LightGemTile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LightGemTile.cpp; sourceTree = ""; }; + D5D8C48416392FF000FD35F0 /* LightGemTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LightGemTile.h; sourceTree = ""; }; + D5D8C48516392FF000FD35F0 /* Mushroom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Mushroom.cpp; sourceTree = ""; }; + D5D8C48616392FF000FD35F0 /* Mushroom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Mushroom.h; sourceTree = ""; }; + D5D8C48716392FF000FD35F0 /* SignTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SignTile.h; sourceTree = ""; }; + D5D8C48816392FF000FD35F0 /* StemTile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StemTile.cpp; sourceTree = ""; }; + D5D8C48916392FF000FD35F0 /* StemTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StemTile.h; sourceTree = ""; }; + D5D8C4911639301700FD35F0 /* NetherReactorTileEntity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetherReactorTileEntity.cpp; sourceTree = ""; }; + D5D8C4921639301700FD35F0 /* NetherReactorTileEntity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetherReactorTileEntity.h; sourceTree = ""; }; + D5D8C4931639301700FD35F0 /* SignTileEntity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SignTileEntity.cpp; sourceTree = ""; }; + D5D8C4941639301700FD35F0 /* SignTileEntity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SignTileEntity.h; sourceTree = ""; }; + D5D8C4991639305100FD35F0 /* PigZombie.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PigZombie.cpp; sourceTree = ""; }; + D5D8C49A1639305100FD35F0 /* PigZombie.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PigZombie.h; sourceTree = ""; }; + D5D8C49D163930D600FD35F0 /* MelonTile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MelonTile.cpp; sourceTree = ""; }; + D5D8C49E163930D600FD35F0 /* MelonTile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MelonTile.h; sourceTree = ""; }; + D5D8C4A1163930E600FD35F0 /* NetherReactor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetherReactor.cpp; sourceTree = ""; }; + D5D8C4A2163930E600FD35F0 /* NetherReactor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetherReactor.h; sourceTree = ""; }; + D5D8C4A5163931F000FD35F0 /* InBedScreen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InBedScreen.cpp; sourceTree = ""; }; + D5D8C4A6163931F000FD35F0 /* InBedScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InBedScreen.h; sourceTree = ""; }; + D5D8C4A9163932B900FD35F0 /* SignRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SignRenderer.cpp; sourceTree = ""; }; + D5D8C4AA163932B900FD35F0 /* SignRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SignRenderer.h; sourceTree = ""; }; + D5D8C4AD163932CF00FD35F0 /* PaintingRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PaintingRenderer.cpp; sourceTree = ""; }; + D5D8C4AE163932CF00FD35F0 /* PaintingRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PaintingRenderer.h; sourceTree = ""; }; + D5D8C4B11639335000FD35F0 /* HangingEntity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HangingEntity.cpp; sourceTree = ""; }; + D5D8C4B21639335000FD35F0 /* HangingEntity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HangingEntity.h; sourceTree = ""; }; + D5D8C4B31639335000FD35F0 /* Painting.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Painting.cpp; sourceTree = ""; }; + D5D8C4B41639335000FD35F0 /* Painting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Painting.h; sourceTree = ""; }; + D5D8C4C11639341100FD35F0 /* Motive.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Motive.cpp; sourceTree = ""; }; + D5D8C4C21639341100FD35F0 /* Motive.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Motive.h; sourceTree = ""; }; + D5D8C4C5163934BB00FD35F0 /* HangingEntityItem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HangingEntityItem.cpp; sourceTree = ""; }; + D5D8C4C6163934BB00FD35F0 /* HangingEntityItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HangingEntityItem.h; sourceTree = ""; }; + D5D8C4C91639362F00FD35F0 /* NetherReactorPattern.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetherReactorPattern.cpp; sourceTree = ""; }; + D5D8C4CA1639362F00FD35F0 /* NetherReactorPattern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetherReactorPattern.h; sourceTree = ""; }; + D5D961AC14E6AF0C001D1B9D /* Icon_lite.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Icon_lite.png; sourceTree = ""; }; + D5D961AD14E6AF0C001D1B9D /* Icon-72_lite.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-72_lite.png"; sourceTree = ""; }; + D5D961AE14E6AF0C001D1B9D /* Icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-72.png"; sourceTree = ""; }; + D5D961AF14E6AF0C001D1B9D /* Icon-Small_lite.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-Small_lite.png"; sourceTree = ""; }; + D5D961B014E6AF0C001D1B9D /* Icon-Small-50_lite.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-Small-50_lite.png"; sourceTree = ""; }; + D5D961B114E6AF0C001D1B9D /* Icon-Small-50.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-Small-50.png"; sourceTree = ""; }; + D5D961B214E6AF0C001D1B9D /* Icon-Small.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-Small.png"; sourceTree = ""; }; + D5D961B314E6AF0C001D1B9D /* Icon-Small@2x_lite.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-Small@2x_lite.png"; sourceTree = ""; }; + D5D961B414E6AF0C001D1B9D /* Icon-Small@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-Small@2x.png"; sourceTree = ""; }; + D5D961B514E6AF0C001D1B9D /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Icon.png; sourceTree = ""; }; + D5D961B614E6AF0C001D1B9D /* Icon@2x_lite.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon@2x_lite.png"; sourceTree = ""; }; + D5D961B714E6AF0C001D1B9D /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon@2x.png"; sourceTree = ""; }; + D5E1BA981451C881007DCC4F /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = ""; }; + D5E1BA9A1451C8A0007DCC4F /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = ""; }; + D5F0772214599DC700EC30FB /* terrain.pvr4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = terrain.pvr4; sourceTree = ""; }; + D5F07736145DE04200EC30FB /* OpenAL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenAL.framework; path = System/Library/Frameworks/OpenAL.framework; sourceTree = SDKROOT; }; + D5F07738145EB1F300EC30FB /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; + D5F07744145EF79B00EC30FB /* Default-Landscape~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-Landscape~ipad.png"; sourceTree = ""; }; + D5F3B7A314548E7900D25470 /* IASKAppSettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKAppSettingsViewController.h; sourceTree = ""; }; + D5F3B7A414548E7900D25470 /* IASKAppSettingsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKAppSettingsViewController.m; sourceTree = ""; }; + D5F3B7A514548E7900D25470 /* IASKAppSettingsWebViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKAppSettingsWebViewController.h; sourceTree = ""; }; + D5F3B7A614548E7900D25470 /* IASKAppSettingsWebViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKAppSettingsWebViewController.m; sourceTree = ""; }; + D5F3B7A714548E7900D25470 /* IASKSpecifierValuesViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSpecifierValuesViewController.h; sourceTree = ""; }; + D5F3B7A814548E7900D25470 /* IASKSpecifierValuesViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSpecifierValuesViewController.m; sourceTree = ""; }; + D5F3B7AA14548E7900D25470 /* IASKSettingsReader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSettingsReader.h; sourceTree = ""; }; + D5F3B7AB14548E7900D25470 /* IASKSettingsReader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSettingsReader.m; sourceTree = ""; }; + D5F3B7AC14548E7900D25470 /* IASKSettingsStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSettingsStore.h; sourceTree = ""; }; + D5F3B7AD14548E7900D25470 /* IASKSettingsStore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSettingsStore.m; sourceTree = ""; }; + D5F3B7AE14548E7900D25470 /* IASKSettingsStoreFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSettingsStoreFile.h; sourceTree = ""; }; + D5F3B7AF14548E7900D25470 /* IASKSettingsStoreFile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSettingsStoreFile.m; sourceTree = ""; }; + D5F3B7B014548E7900D25470 /* IASKSettingsStoreUserDefaults.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSettingsStoreUserDefaults.h; sourceTree = ""; }; + D5F3B7B114548E7900D25470 /* IASKSettingsStoreUserDefaults.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSettingsStoreUserDefaults.m; sourceTree = ""; }; + D5F3B7B214548E7900D25470 /* IASKSpecifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSpecifier.h; sourceTree = ""; }; + D5F3B7B314548E7900D25470 /* IASKSpecifier.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSpecifier.m; sourceTree = ""; }; + D5F3B7B514548E7900D25470 /* IASKPSSliderSpecifierViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKPSSliderSpecifierViewCell.h; sourceTree = ""; }; + D5F3B7B614548E7900D25470 /* IASKPSSliderSpecifierViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKPSSliderSpecifierViewCell.m; sourceTree = ""; }; + D5F3B7B714548E7900D25470 /* IASKPSTextFieldSpecifierViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKPSTextFieldSpecifierViewCell.h; sourceTree = ""; }; + D5F3B7B814548E7900D25470 /* IASKPSTextFieldSpecifierViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKPSTextFieldSpecifierViewCell.m; sourceTree = ""; }; + D5F3B7B914548E7900D25470 /* IASKPSTitleValueSpecifierViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKPSTitleValueSpecifierViewCell.h; sourceTree = ""; }; + D5F3B7BA14548E7900D25470 /* IASKPSTitleValueSpecifierViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKPSTitleValueSpecifierViewCell.m; sourceTree = ""; }; + D5F3B7BB14548E7900D25470 /* IASKPSToggleSwitchSpecifierViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKPSToggleSwitchSpecifierViewCell.h; sourceTree = ""; }; + D5F3B7BC14548E7900D25470 /* IASKPSToggleSwitchSpecifierViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKPSToggleSwitchSpecifierViewCell.m; sourceTree = ""; }; + D5F3B7BD14548E7900D25470 /* IASKSlider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSlider.h; sourceTree = ""; }; + D5F3B7BE14548E7900D25470 /* IASKSlider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSlider.m; sourceTree = ""; }; + D5F3B7BF14548E7900D25470 /* IASKSwitch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKSwitch.h; sourceTree = ""; }; + D5F3B7C014548E7900D25470 /* IASKSwitch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKSwitch.m; sourceTree = ""; }; + D5F3B7C114548E7900D25470 /* IASKTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IASKTextField.h; sourceTree = ""; }; + D5F3B7C214548E7900D25470 /* IASKTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IASKTextField.m; sourceTree = ""; }; + D5F3B7C414548E7900D25470 /* IASKAppSettingsView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IASKAppSettingsView.xib; sourceTree = ""; }; + D5F3B7C514548E7900D25470 /* IASKAppSettingsWebView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IASKAppSettingsWebView.xib; sourceTree = ""; }; + D5F3B7C614548E7900D25470 /* IASKPSSliderSpecifierViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IASKPSSliderSpecifierViewCell.xib; sourceTree = ""; }; + D5F3B7C714548E7900D25470 /* IASKPSTextFieldSpecifierViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IASKPSTextFieldSpecifierViewCell.xib; sourceTree = ""; }; + D5F3B7C814548E7900D25470 /* IASKPSToggleSwitchSpecifierViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IASKPSToggleSwitchSpecifierViewCell.xib; sourceTree = ""; }; + D5F3B7C914548E7900D25470 /* IASKSpecifierValuesView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IASKSpecifierValuesView.xib; sourceTree = ""; }; + D5F3B7E41454930400D25470 /* InAppSettings.bundle */ = {isa = PBXFileReference; explicitFileType = "wrapper.installer-pkg"; path = InAppSettings.bundle; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + D58BB552146A0B920002C9F5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D58BB553146A0B920002C9F5 /* AVFoundation.framework in Frameworks */, + D58BB554146A0B920002C9F5 /* OpenAL.framework in Frameworks */, + D58BB555146A0B920002C9F5 /* AudioToolbox.framework in Frameworks */, + D58BB556146A0B920002C9F5 /* UIKit.framework in Frameworks */, + D58BB557146A0B920002C9F5 /* Foundation.framework in Frameworks */, + D58BB558146A0B920002C9F5 /* CoreGraphics.framework in Frameworks */, + D58BB559146A0B920002C9F5 /* QuartzCore.framework in Frameworks */, + D58BB55A146A0B920002C9F5 /* OpenGLES.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D5CF9C3F144C225000E4244F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D5F07739145EB1F500EC30FB /* AVFoundation.framework in Frameworks */, + D5F07737145DE04300EC30FB /* OpenAL.framework in Frameworks */, + D572D3E0144CB23200E67862 /* AudioToolbox.framework in Frameworks */, + D5CF9C47144C225000E4244F /* UIKit.framework in Frameworks */, + D5CF9C49144C225000E4244F /* Foundation.framework in Frameworks */, + D5CF9C4B144C225000E4244F /* CoreGraphics.framework in Frameworks */, + D5CF9C4D144C225000E4244F /* QuartzCore.framework in Frameworks */, + D5CF9C4F144C225000E4244F /* OpenGLES.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 04004534169EE73C003EB6FA /* environment */ = { + isa = PBXGroup; + children = ( + 04004532169EE72E003EB6FA /* clouds.png */, + ); + name = environment; + sourceTree = ""; + }; + 0419D9A0167F207B0080CB96 /* command */ = { + isa = PBXGroup; + children = ( + 0419D99D167F206A0080CB96 /* CommandServer.cpp */, + 0419D99E167F206A0080CB96 /* CommandServer.h */, + ); + name = command; + sourceTree = ""; + }; + 0419D9B4167F21C60080CB96 /* crafting */ = { + isa = PBXGroup; + children = ( + 0413970916A82E6B008A9F1A /* CraftingFilters.cpp */, + 0413970A16A82E6B008A9F1A /* CraftingFilters.h */, + 0413970B16A82E6B008A9F1A /* StonecutterScreen.cpp */, + 0413970C16A82E6B008A9F1A /* StonecutterScreen.h */, + 0419D9AE167F21BC0080CB96 /* PaneCraftingScreen.cpp */, + 0419D9AF167F21BC0080CB96 /* PaneCraftingScreen.h */, + 0419D9B0167F21BC0080CB96 /* WorkbenchScreen.cpp */, + 0419D9B1167F21BC0080CB96 /* WorkbenchScreen.h */, + ); + name = crafting; + sourceTree = ""; + }; + 0425EB9516A94D14000C7483 /* armor */ = { + isa = PBXGroup; + children = ( + 0425EB9616A94D14000C7483 /* chain_1.png */, + 0425EB9716A94D14000C7483 /* chain_2.png */, + 0425EB9816A94D14000C7483 /* cloth_1.png */, + 0425EB9916A94D14000C7483 /* cloth_2.png */, + 0425EB9A16A94D14000C7483 /* diamond_1.png */, + 0425EB9B16A94D14000C7483 /* diamond_2.png */, + 0425EB9C16A94D14000C7483 /* gold_1.png */, + 0425EB9D16A94D14000C7483 /* gold_2.png */, + 0425EB9E16A94D14000C7483 /* iron_1.png */, + 0425EB9F16A94D14000C7483 /* iron_2.png */, + ); + path = armor; + sourceTree = ""; + }; + D5251CB51538192700FC82C8 /* raknet */ = { + isa = PBXGroup; + children = ( + D5251CB61538192700FC82C8 /* _FindFirst.cpp */, + D5251CB71538192700FC82C8 /* _FindFirst.h */, + D5251CB81538192700FC82C8 /* AutopatcherPatchContext.h */, + D5251CB91538192700FC82C8 /* AutopatcherRepositoryInterface.h */, + D5251CBA1538192700FC82C8 /* BitStream.cpp */, + D5251CBB1538192700FC82C8 /* BitStream.h */, + D5251CBC1538192700FC82C8 /* CCRakNetSlidingWindow.cpp */, + D5251CBD1538192700FC82C8 /* CCRakNetSlidingWindow.h */, + D5251CBE1538192700FC82C8 /* CCRakNetUDT.cpp */, + D5251CBF1538192700FC82C8 /* CCRakNetUDT.h */, + D5251CC01538192700FC82C8 /* CheckSum.cpp */, + D5251CC11538192700FC82C8 /* CheckSum.h */, + D5251CC21538192700FC82C8 /* CloudClient.cpp */, + D5251CC31538192700FC82C8 /* CloudClient.h */, + D5251CC41538192700FC82C8 /* CloudCommon.cpp */, + D5251CC51538192700FC82C8 /* CloudCommon.h */, + D5251CC61538192700FC82C8 /* CloudServer.cpp */, + D5251CC71538192700FC82C8 /* CloudServer.h */, + D5251CC81538192700FC82C8 /* CMakeLists.txt */, + D5251CC91538192700FC82C8 /* CommandParserInterface.cpp */, + D5251CCA1538192700FC82C8 /* CommandParserInterface.h */, + D5251CCB1538192700FC82C8 /* ConnectionGraph2.cpp */, + D5251CCC1538192700FC82C8 /* ConnectionGraph2.h */, + D5251CCD1538192700FC82C8 /* ConsoleServer.cpp */, + D5251CCE1538192700FC82C8 /* ConsoleServer.h */, + D5251CCF1538192700FC82C8 /* DataCompressor.cpp */, + D5251CD01538192700FC82C8 /* DataCompressor.h */, + D5251CD11538192700FC82C8 /* DirectoryDeltaTransfer.cpp */, + D5251CD21538192700FC82C8 /* DirectoryDeltaTransfer.h */, + D5251CD31538192700FC82C8 /* DS_BinarySearchTree.h */, + D5251CD41538192700FC82C8 /* DS_BPlusTree.h */, + D5251CD51538192700FC82C8 /* DS_BytePool.cpp */, + D5251CD61538192700FC82C8 /* DS_BytePool.h */, + D5251CD71538192700FC82C8 /* DS_ByteQueue.cpp */, + D5251CD81538192700FC82C8 /* DS_ByteQueue.h */, + D5251CD91538192700FC82C8 /* DS_Hash.h */, + D5251CDA1538192700FC82C8 /* DS_Heap.h */, + D5251CDB1538192700FC82C8 /* DS_HuffmanEncodingTree.cpp */, + D5251CDC1538192700FC82C8 /* DS_HuffmanEncodingTree.h */, + D5251CDD1538192700FC82C8 /* DS_HuffmanEncodingTreeFactory.h */, + D5251CDE1538192700FC82C8 /* DS_HuffmanEncodingTreeNode.h */, + D5251CDF1538192700FC82C8 /* DS_LinkedList.h */, + D5251CE01538192700FC82C8 /* DS_List.h */, + D5251CE11538192700FC82C8 /* DS_Map.h */, + D5251CE21538192700FC82C8 /* DS_MemoryPool.h */, + D5251CE31538192700FC82C8 /* DS_Multilist.h */, + D5251CE41538192700FC82C8 /* DS_OrderedChannelHeap.h */, + D5251CE51538192700FC82C8 /* DS_OrderedList.h */, + D5251CE61538192700FC82C8 /* DS_Queue.h */, + D5251CE71538192700FC82C8 /* DS_QueueLinkedList.h */, + D5251CE81538192700FC82C8 /* DS_RangeList.h */, + D5251CE91538192700FC82C8 /* DS_Table.cpp */, + D5251CEA1538192700FC82C8 /* DS_Table.h */, + D5251CEB1538192700FC82C8 /* DS_ThreadsafeAllocatingQueue.h */, + D5251CEC1538192700FC82C8 /* DS_Tree.h */, + D5251CED1538192700FC82C8 /* DS_WeightedGraph.h */, + D5251CEE1538192700FC82C8 /* DynDNS.cpp */, + D5251CEF1538192700FC82C8 /* DynDNS.h */, + D5251CF01538192700FC82C8 /* EmailSender.cpp */, + D5251CF11538192700FC82C8 /* EmailSender.h */, + D5251CF21538192700FC82C8 /* EncodeClassName.cpp */, + D5251CF31538192700FC82C8 /* EpochTimeToString.cpp */, + D5251CF41538192700FC82C8 /* EpochTimeToString.h */, + D5251CF51538192700FC82C8 /* Export.h */, + D5251CF61538192700FC82C8 /* FileList.cpp */, + D5251CF71538192700FC82C8 /* FileList.h */, + D5251CF81538192700FC82C8 /* FileListNodeContext.h */, + D5251CF91538192700FC82C8 /* FileListTransfer.cpp */, + D5251CFA1538192700FC82C8 /* FileListTransfer.h */, + D5251CFB1538192700FC82C8 /* FileListTransferCBInterface.h */, + D5251CFC1538192700FC82C8 /* FileOperations.cpp */, + D5251CFD1538192700FC82C8 /* FileOperations.h */, + D5251CFE1538192700FC82C8 /* FormatString.cpp */, + D5251CFF1538192700FC82C8 /* FormatString.h */, + D5251D001538192700FC82C8 /* FullyConnectedMesh2.cpp */, + D5251D011538192700FC82C8 /* FullyConnectedMesh2.h */, + D5251D021538192700FC82C8 /* Getche.cpp */, + D5251D031538192700FC82C8 /* Getche.h */, + D5251D041538192700FC82C8 /* Gets.cpp */, + D5251D051538192700FC82C8 /* Gets.h */, + D5251D061538192700FC82C8 /* GetTime.cpp */, + D5251D071538192700FC82C8 /* GetTime.h */, + D5251D081538192700FC82C8 /* gettimeofday.cpp */, + D5251D091538192700FC82C8 /* gettimeofday.h */, + D5251D0A1538192700FC82C8 /* GridSectorizer.cpp */, + D5251D0B1538192700FC82C8 /* GridSectorizer.h */, + D5251D0C1538192700FC82C8 /* HTTPConnection.cpp */, + D5251D0D1538192700FC82C8 /* HTTPConnection.h */, + D5251D0E1538192700FC82C8 /* IncrementalReadInterface.cpp */, + D5251D0F1538192700FC82C8 /* IncrementalReadInterface.h */, + D5251D101538192700FC82C8 /* InternalPacket.h */, + D5251D111538192700FC82C8 /* Itoa.cpp */, + D5251D121538192700FC82C8 /* Itoa.h */, + D5251D131538192700FC82C8 /* Kbhit.h */, + D5251D141538192700FC82C8 /* LinuxStrings.cpp */, + D5251D151538192700FC82C8 /* LinuxStrings.h */, + D5251D161538192700FC82C8 /* LocklessTypes.cpp */, + D5251D171538192700FC82C8 /* LocklessTypes.h */, + D5251D181538192700FC82C8 /* LogCommandParser.cpp */, + D5251D191538192700FC82C8 /* LogCommandParser.h */, + D5251D1A1538192700FC82C8 /* MessageFilter.cpp */, + D5251D1B1538192700FC82C8 /* MessageFilter.h */, + D5251D1C1538192700FC82C8 /* MessageIdentifiers.h */, + D5251D1D1538192700FC82C8 /* MTUSize.h */, + D5251D1E1538192700FC82C8 /* NativeFeatureIncludes.h */, + D5251D1F1538192700FC82C8 /* NativeFeatureIncludesOverrides.h */, + D5251D201538192700FC82C8 /* NativeTypes.h */, + D5251D211538192700FC82C8 /* NatPunchthroughClient.cpp */, + D5251D221538192700FC82C8 /* NatPunchthroughClient.h */, + D5251D231538192700FC82C8 /* NatPunchthroughServer.cpp */, + D5251D241538192700FC82C8 /* NatPunchthroughServer.h */, + D5251D251538192700FC82C8 /* NatTypeDetectionClient.cpp */, + D5251D261538192700FC82C8 /* NatTypeDetectionClient.h */, + D5251D271538192700FC82C8 /* NatTypeDetectionCommon.cpp */, + D5251D281538192700FC82C8 /* NatTypeDetectionCommon.h */, + D5251D291538192700FC82C8 /* NatTypeDetectionServer.cpp */, + D5251D2A1538192700FC82C8 /* NatTypeDetectionServer.h */, + D5251D2B1538192700FC82C8 /* NetworkIDManager.cpp */, + D5251D2C1538192700FC82C8 /* NetworkIDManager.h */, + D5251D2D1538192700FC82C8 /* NetworkIDObject.cpp */, + D5251D2E1538192700FC82C8 /* NetworkIDObject.h */, + D5251D2F1538192700FC82C8 /* PacketConsoleLogger.cpp */, + D5251D301538192700FC82C8 /* PacketConsoleLogger.h */, + D5251D311538192700FC82C8 /* PacketFileLogger.cpp */, + D5251D321538192700FC82C8 /* PacketFileLogger.h */, + D5251D331538192700FC82C8 /* PacketizedTCP.cpp */, + D5251D341538192700FC82C8 /* PacketizedTCP.h */, + D5251D351538192700FC82C8 /* PacketLogger.cpp */, + D5251D361538192700FC82C8 /* PacketLogger.h */, + D5251D371538192700FC82C8 /* PacketOutputWindowLogger.cpp */, + D5251D381538192700FC82C8 /* PacketOutputWindowLogger.h */, + D5251D391538192700FC82C8 /* PacketPool.h */, + D5251D3A1538192700FC82C8 /* PacketPriority.h */, + D5251D3B1538192700FC82C8 /* PluginInterface2.cpp */, + D5251D3C1538192700FC82C8 /* PluginInterface2.h */, + D5251D3D1538192700FC82C8 /* PS3Includes.h */, + D5251D3E1538192700FC82C8 /* Rackspace.cpp */, + D5251D3F1538192700FC82C8 /* Rackspace.h */, + D5251D401538192700FC82C8 /* RakAlloca.h */, + D5251D411538192700FC82C8 /* RakAssert.h */, + D5251D421538192700FC82C8 /* RakMemoryOverride.cpp */, + D5251D431538192700FC82C8 /* RakMemoryOverride.h */, + D5251D471538192700FC82C8 /* RakNetCommandParser.cpp */, + D5251D481538192700FC82C8 /* RakNetCommandParser.h */, + D5251D491538192700FC82C8 /* RakNetDefines.h */, + D5251D4A1538192700FC82C8 /* RakNetDefinesOverrides.h */, + D5251D4B1538192700FC82C8 /* RakNetSmartPtr.h */, + D5251D4C1538192700FC82C8 /* RakNetSocket.cpp */, + D5251D4D1538192700FC82C8 /* RakNetSocket.h */, + D5251D4E1538192700FC82C8 /* RakNetStatistics.cpp */, + D5251D4F1538192700FC82C8 /* RakNetStatistics.h */, + D5251D501538192700FC82C8 /* RakNetTime.h */, + D5251D511538192700FC82C8 /* RakNetTransport2.cpp */, + D5251D521538192700FC82C8 /* RakNetTransport2.h */, + D5251D531538192700FC82C8 /* RakNetTypes.cpp */, + D5251D541538192700FC82C8 /* RakNetTypes.h */, + D5251D551538192700FC82C8 /* RakNetVersion.h */, + D5251D561538192700FC82C8 /* RakPeer.cpp */, + D5251D571538192700FC82C8 /* RakPeer.h */, + D5251D581538192700FC82C8 /* RakPeerInterface.h */, + D5251D591538192700FC82C8 /* RakSleep.cpp */, + D5251D5A1538192700FC82C8 /* RakSleep.h */, + D5251D5B1538192700FC82C8 /* RakString.cpp */, + D5251D5C1538192700FC82C8 /* RakString.h */, + D5251D5D1538192700FC82C8 /* RakThread.cpp */, + D5251D5E1538192700FC82C8 /* RakThread.h */, + D5251D5F1538192700FC82C8 /* RakWString.cpp */, + D5251D601538192700FC82C8 /* RakWString.h */, + D5251D611538192700FC82C8 /* Rand.cpp */, + D5251D621538192700FC82C8 /* Rand.h */, + D5251D631538192700FC82C8 /* rdlmalloc-options.h */, + D5251D641538192700FC82C8 /* rdlmalloc.cpp */, + D5251D651538192700FC82C8 /* rdlmalloc.h */, + D5251D661538192700FC82C8 /* ReadyEvent.cpp */, + D5251D671538192700FC82C8 /* ReadyEvent.h */, + D5251D681538192700FC82C8 /* RefCountedObj.h */, + D5251D691538192700FC82C8 /* ReliabilityLayer.cpp */, + D5251D6A1538192700FC82C8 /* ReliabilityLayer.h */, + D5251D6B1538192700FC82C8 /* ReplicaEnums.h */, + D5251D6C1538192700FC82C8 /* ReplicaManager3.cpp */, + D5251D6D1538192700FC82C8 /* ReplicaManager3.h */, + D5251D6E1538192700FC82C8 /* Router2.cpp */, + D5251D6F1538192700FC82C8 /* Router2.h */, + D5251D701538192700FC82C8 /* RPC4Plugin.cpp */, + D5251D711538192700FC82C8 /* RPC4Plugin.h */, + D5251D721538192700FC82C8 /* SecureHandshake.cpp */, + D5251D731538192700FC82C8 /* SecureHandshake.h */, + D5251D741538192700FC82C8 /* SendToThread.cpp */, + D5251D751538192700FC82C8 /* SendToThread.h */, + D5251D761538192700FC82C8 /* SHA1.cpp */, + D5251D771538192700FC82C8 /* SHA1.h */, + D5251D781538192700FC82C8 /* SignaledEvent.cpp */, + D5251D791538192700FC82C8 /* SignaledEvent.h */, + D5251D7A1538192700FC82C8 /* SimpleMutex.cpp */, + D5251D7B1538192700FC82C8 /* SimpleMutex.h */, + D5251D7C1538192700FC82C8 /* SimpleTCPServer.h */, + D5251D7D1538192700FC82C8 /* SingleProducerConsumer.h */, + D5251D7E1538192700FC82C8 /* SocketDefines.h */, + D5251D7F1538192700FC82C8 /* SocketIncludes.h */, + D5251D801538192700FC82C8 /* SocketLayer.cpp */, + D5251D811538192700FC82C8 /* SocketLayer.h */, + D5251D821538192700FC82C8 /* StringCompressor.cpp */, + D5251D831538192700FC82C8 /* StringCompressor.h */, + D5251D841538192700FC82C8 /* StringTable.cpp */, + D5251D851538192700FC82C8 /* StringTable.h */, + D5251D861538192700FC82C8 /* SuperFastHash.cpp */, + D5251D871538192700FC82C8 /* SuperFastHash.h */, + D5251D881538192700FC82C8 /* TableSerializer.cpp */, + D5251D891538192700FC82C8 /* TableSerializer.h */, + D5251D8A1538192700FC82C8 /* TCPInterface.cpp */, + D5251D8B1538192700FC82C8 /* TCPInterface.h */, + D5251D8C1538192700FC82C8 /* TeamBalancer.cpp */, + D5251D8D1538192700FC82C8 /* TeamBalancer.h */, + D5251D8E1538192700FC82C8 /* TelnetTransport.cpp */, + D5251D8F1538192700FC82C8 /* TelnetTransport.h */, + D5251D901538192700FC82C8 /* ThreadPool.h */, + D5251D911538192700FC82C8 /* ThreadsafePacketLogger.cpp */, + D5251D921538192700FC82C8 /* ThreadsafePacketLogger.h */, + D5251D931538192700FC82C8 /* TransportInterface.h */, + D5251D941538192700FC82C8 /* TwoWayAuthentication.cpp */, + D5251D951538192700FC82C8 /* TwoWayAuthentication.h */, + D5251D961538192700FC82C8 /* UDPForwarder.cpp */, + D5251D971538192700FC82C8 /* UDPForwarder.h */, + D5251D981538192700FC82C8 /* UDPProxyClient.cpp */, + D5251D991538192700FC82C8 /* UDPProxyClient.h */, + D5251D9A1538192700FC82C8 /* UDPProxyCommon.h */, + D5251D9B1538192700FC82C8 /* UDPProxyCoordinator.cpp */, + D5251D9C1538192700FC82C8 /* UDPProxyCoordinator.h */, + D5251D9D1538192700FC82C8 /* UDPProxyServer.cpp */, + D5251D9E1538192700FC82C8 /* UDPProxyServer.h */, + D5251D9F1538192700FC82C8 /* VariableDeltaSerializer.cpp */, + D5251DA01538192700FC82C8 /* VariableDeltaSerializer.h */, + D5251DA11538192700FC82C8 /* VariableListDeltaTracker.cpp */, + D5251DA21538192700FC82C8 /* VariableListDeltaTracker.h */, + D5251DA31538192700FC82C8 /* VariadicSQLParser.cpp */, + D5251DA41538192700FC82C8 /* VariadicSQLParser.h */, + D5251DA51538192700FC82C8 /* VitaIncludes.cpp */, + D5251DA61538192700FC82C8 /* VitaIncludes.h */, + D5251DA71538192700FC82C8 /* WindowsIncludes.h */, + D5251DA81538192700FC82C8 /* WSAStartupSingleton.cpp */, + D5251DA91538192700FC82C8 /* WSAStartupSingleton.h */, + D5251DAA1538192700FC82C8 /* XBox360Includes.h */, + ); + path = raknet; + sourceTree = ""; + }; + D5251E72153823DC00FC82C8 /* lang */ = { + isa = PBXGroup; + children = ( + D5251E73153823DC00FC82C8 /* en_US.lang */, + ); + name = lang; + path = ../../data/lang; + sourceTree = ""; + }; + D544940315D13DB7005FA9B0 /* server */ = { + isa = PBXGroup; + children = ( + D544940415D13DB7005FA9B0 /* ServerLevel.cpp */, + D544940515D13DB7005FA9B0 /* ServerLevel.h */, + D544940615D13DB7005FA9B0 /* ServerPlayer.cpp */, + D544940715D13DB7005FA9B0 /* ServerPlayer.h */, + ); + path = server; + sourceTree = ""; + }; + D544940C15D13E27005FA9B0 /* food */ = { + isa = PBXGroup; + children = ( + D544940D15D13E27005FA9B0 /* FoodConstants.h */, + D544940E15D13E27005FA9B0 /* SimpleFoodData.cpp */, + D544940F15D13E27005FA9B0 /* SimpleFoodData.h */, + ); + path = food; + sourceTree = ""; + }; + D54954EB14E38FFC00685A35 /* dialog2 */ = { + isa = PBXGroup; + children = ( + D549551114E3D86B00685A35 /* worldname_ipad_3.png */, + D549551214E3D86B00685A35 /* worldname_ipad.png */, + D549551314E3D86C00685A35 /* worldname_iphone_3.png */, + D549551414E3D86D00685A35 /* worldname_iphone.png */, + D54954EC14E38FFC00685A35 /* cancel_0_1.png */, + D54954ED14E38FFC00685A35 /* cancel_0_3.png */, + D549551D14E3DC4300685A35 /* creative_1_3.png */, + D549551E14E3DC4300685A35 /* survival_1_3.png */, + D54954EE14E38FFC00685A35 /* cancel_1_1.png */, + 9D293CEA160720D6000305C8 /* worldname_iphone5_3.png */, + D54954EF14E38FFC00685A35 /* cancel_1_3.png */, + D54954F014E38FFC00685A35 /* create_0_1.png */, + D54954F114E38FFC00685A35 /* create_0_3.png */, + D54954F214E38FFC00685A35 /* create_1_1.png */, + D54954F314E38FFC00685A35 /* create_1_3.png */, + D54954F414E38FFC00685A35 /* creative_0_3.png */, + D54954F514E38FFC00685A35 /* survival_0_3.png */, + D54954F614E38FFC00685A35 /* worldname.png */, + D54954F714E38FFC00685A35 /* worldname_3.png */, + ); + path = dialog2; + sourceTree = ""; + }; + D549552314E3EA0B00685A35 /* ipad */ = { + isa = PBXGroup; + children = ( + D549553F14E3EAC100685A35 /* creative_0_4.png */, + D549554014E3EAC100685A35 /* survival_0_4.png */, + D549552414E3EA0B00685A35 /* cancel_0_4.png */, + D549552514E3EA0B00685A35 /* cancel_1_4.png */, + D549552614E3EA0B00685A35 /* create_0_4.png */, + D549552714E3EA0B00685A35 /* create_1_4.png */, + D549552814E3EA0B00685A35 /* creative_1_4.png */, + D549552A14E3EA0B00685A35 /* survival_1_4.png */, + D549552C14E3EA0B00685A35 /* worldname_ipad_4.png */, + ); + path = ipad; + sourceTree = ""; + }; + D572D3AA144C69F100E67862 /* Resources */ = { + isa = PBXGroup; + children = ( + D5ACF18615C03DBF00E21C22 /* aac */, + D5251E72153823DC00FC82C8 /* lang */, + D5F0773A145EF5E100EC30FB /* ios */, + D5BFCF111450BAD500A443B0 /* Fonts */, + D572D3AB144C6A1400E67862 /* images */, + ); + name = Resources; + sourceTree = ""; + }; + D572D3AB144C6A1400E67862 /* images */ = { + isa = PBXGroup; + children = ( + 0425EB9516A94D14000C7483 /* armor */, + 04004534169EE73C003EB6FA /* environment */, + D598BD96163ED24F00A36438 /* art */, + D5F0772214599DC700EC30FB /* terrain.pvr4 */, + D55B252A14598227002D9366 /* terrain.pvrtc */, + D55B201714595370002D9366 /* terrain.pvr */, + D572D3AC144C6A1400E67862 /* font */, + D572D3AE144C6A1400E67862 /* gui */, + D572D3C3144C6A1400E67862 /* item */, + D572D3C5144C6A1400E67862 /* mob */, + D572D3C7144C6A1400E67862 /* particles.png */, + D572D3C8144C6A1400E67862 /* terrain.png */, + ); + name = images; + path = ../../data/images; + sourceTree = ""; + }; + D572D3AC144C6A1400E67862 /* font */ = { + isa = PBXGroup; + children = ( + D572D3AD144C6A1400E67862 /* default8.png */, + ); + path = font; + sourceTree = ""; + }; + D572D3AE144C6A1400E67862 /* gui */ = { + isa = PBXGroup; + children = ( + D598BD9B164157C300A36438 /* badge */, + D51DC73514581D4E00E3D761 /* itemframe.png */, + D5A55E4E1450761600A7571B /* bg32.png */, + D572D3AF144C6A1400E67862 /* background.png */, + D572D3B3144C6A1400E67862 /* default_world.png */, + D572D3B6144C6A1400E67862 /* gui.png */, + D572D3B7144C6A1400E67862 /* gui_blocks.png */, + D572D3B8144C6A1400E67862 /* icons.png */, + D572D3B9144C6A1400E67862 /* items.png */, + D5251E6F15381D0500FC82C8 /* spritesheet.png */, + D572D3C1144C6A1400E67862 /* title.png */, + D572D3C2144C6A1400E67862 /* touchgui.png */, + ); + path = gui; + sourceTree = ""; + }; + D572D3C3144C6A1400E67862 /* item */ = { + isa = PBXGroup; + children = ( + D598BD90163ED0DB00A36438 /* sign.png */, + D5ACF28D15C03E8800E21C22 /* arrows.png */, + D572D3C4144C6A1400E67862 /* camera.png */, + ); + path = item; + sourceTree = ""; + }; + D572D3C5144C6A1400E67862 /* mob */ = { + isa = PBXGroup; + children = ( + D598BD93163ED14000A36438 /* pigzombie.png */, + D5B50A4614CFF492005F7284 /* chicken.png */, + D5B50A4714CFF492005F7284 /* cow.png */, + D5B50A4814CFF492005F7284 /* creeper.png */, + D5B50A4914CFF492005F7284 /* pig.png */, + D5B50A4A14CFF492005F7284 /* sheep_fur.png */, + D5B50A4B14CFF492005F7284 /* sheep.png */, + D5B50A4C14CFF492005F7284 /* skeleton.png */, + D5B50A4D14CFF492005F7284 /* spider.png */, + D5B50A4E14CFF492005F7284 /* zombie.png */, + D572D3C6144C6A1400E67862 /* char.png */, + ); + path = mob; + sourceTree = ""; + }; + D584926914FD22EE00741128 /* ai */ = { + isa = PBXGroup; + children = ( + D584927714FD23A500741128 /* PathNavigation.h */, + D584927814FD23A500741128 /* Sensing.h */, + D584927614FD238200741128 /* util */, + D584927514FD237800741128 /* goal */, + D584926B14FD22FC00741128 /* control */, + ); + name = ai; + sourceTree = ""; + }; + D584926B14FD22FC00741128 /* control */ = { + isa = PBXGroup; + children = ( + D584926F14FD236700741128 /* Control.h */, + D584927014FD236700741128 /* JumpControl.h */, + D584927114FD236700741128 /* MoveControl.cpp */, + D584927214FD236700741128 /* MoveControl.h */, + ); + name = control; + sourceTree = ""; + }; + D584927514FD237800741128 /* goal */ = { + isa = PBXGroup; + children = ( + D584928014FD23C300741128 /* target */, + D584927A14FD23BF00741128 /* BreakDoorGoal.h */, + D584927B14FD23BF00741128 /* DoorInteractGoal.h */, + D584927C14FD23BF00741128 /* Goal.h */, + D584927D14FD23BF00741128 /* GoalSelector.h */, + D584927E14FD23BF00741128 /* MeleeAttackGoal.h */, + D584927F14FD23BF00741128 /* RandomStrollGoal.h */, + ); + name = goal; + sourceTree = ""; + }; + D584927614FD238200741128 /* util */ = { + isa = PBXGroup; + children = ( + D584927914FD23B200741128 /* RandomPos.h */, + ); + name = util; + sourceTree = ""; + }; + D584928014FD23C300741128 /* target */ = { + isa = PBXGroup; + children = ( + D584928114FD23DB00741128 /* HurtByTargetGoal.h */, + D584928214FD23DB00741128 /* NearestAttackableTargetGoal.h */, + D584928314FD23DB00741128 /* TargetGoal.h */, + ); + name = target; + sourceTree = ""; + }; + D598BD96163ED24F00A36438 /* art */ = { + isa = PBXGroup; + children = ( + D598BD97163ED26500A36438 /* kz.png */, + ); + name = art; + sourceTree = ""; + }; + D598BD9B164157C300A36438 /* badge */ = { + isa = PBXGroup; + children = ( + D598BD9C164157D500A36438 /* minecon140.png */, + ); + name = badge; + sourceTree = ""; + }; + D5ACF18615C03DBF00E21C22 /* aac */ = { + isa = PBXGroup; + children = ( + D5ACF18715C03DBF00E21C22 /* damage */, + D5ACF18B15C03DBF00E21C22 /* mob */, + D5ACF1B115C03DBF00E21C22 /* random */, + D5ACF1C115C03DBF00E21C22 /* step */, + ); + name = aac; + path = ../../data/sound/aac; + sourceTree = ""; + }; + D5ACF18715C03DBF00E21C22 /* damage */ = { + isa = PBXGroup; + children = ( + D5ACF18815C03DBF00E21C22 /* fallbig1.m4a */, + D5ACF18915C03DBF00E21C22 /* fallbig2.m4a */, + D5ACF18A15C03DBF00E21C22 /* fallsmall.m4a */, + ); + path = damage; + sourceTree = ""; + }; + D5ACF18B15C03DBF00E21C22 /* mob */ = { + isa = PBXGroup; + children = ( + D5ACF18C15C03DBF00E21C22 /* chicken1.m4a */, + D5ACF18D15C03DBF00E21C22 /* chicken2.m4a */, + D5ACF18E15C03DBF00E21C22 /* chicken3.m4a */, + D5ACF18F15C03DBF00E21C22 /* chickenhurt1.m4a */, + D5ACF19015C03DBF00E21C22 /* chickenhurt2.m4a */, + D598BD6F163ED09800A36438 /* zpig1.m4a */, + D598BD70163ED09800A36438 /* zpig2.m4a */, + D598BD71163ED09800A36438 /* zpig3.m4a */, + D598BD72163ED09800A36438 /* zpig4.m4a */, + D598BD73163ED09800A36438 /* zpigangry1.m4a */, + D598BD74163ED09800A36438 /* zpigangry2.m4a */, + D598BD75163ED09800A36438 /* zpigangry3.m4a */, + D598BD76163ED09800A36438 /* zpigangry4.m4a */, + D598BD77163ED09800A36438 /* zpigdeath.m4a */, + D598BD78163ED09800A36438 /* zpighurt1.m4a */, + D598BD79163ED09800A36438 /* zpighurt2.m4a */, + D5ACF19115C03DBF00E21C22 /* chickenplop.m4a */, + D5ACF19215C03DBF00E21C22 /* cow1.m4a */, + D5ACF19315C03DBF00E21C22 /* cow2.m4a */, + D5ACF19415C03DBF00E21C22 /* cow3.m4a */, + D5ACF19515C03DBF00E21C22 /* cow4.m4a */, + D5ACF19615C03DBF00E21C22 /* cowhurt1.m4a */, + D5ACF19715C03DBF00E21C22 /* cowhurt2.m4a */, + D5ACF19815C03DBF00E21C22 /* cowhurt3.m4a */, + D5ACF19915C03DBF00E21C22 /* pig1.m4a */, + D5ACF19A15C03DBF00E21C22 /* pig2.m4a */, + D5ACF19B15C03DBF00E21C22 /* pig3.m4a */, + D5ACF19C15C03DBF00E21C22 /* pigdeath.m4a */, + D5ACF19D15C03DBF00E21C22 /* sheep1.m4a */, + D5ACF19E15C03DBF00E21C22 /* sheep2.m4a */, + D5ACF19F15C03DBF00E21C22 /* sheep3.m4a */, + D5ACF1A015C03DBF00E21C22 /* skeleton1.m4a */, + D5ACF1A115C03DBF00E21C22 /* skeleton2.m4a */, + D5ACF1A215C03DBF00E21C22 /* skeleton3.m4a */, + D5ACF1A315C03DBF00E21C22 /* skeletonhurt1.m4a */, + D5ACF1A415C03DBF00E21C22 /* skeletonhurt2.m4a */, + D5ACF1A515C03DBF00E21C22 /* skeletonhurt3.m4a */, + D5ACF1A615C03DBF00E21C22 /* skeletonhurt4.m4a */, + D5ACF1A715C03DBF00E21C22 /* spider1.m4a */, + D5ACF1A815C03DBF00E21C22 /* spider2.m4a */, + D5ACF1A915C03DBF00E21C22 /* spider3.m4a */, + D5ACF1AA15C03DBF00E21C22 /* spider4.m4a */, + D5B26C1D15E3CE51003785EA /* creeper1.m4a */, + D5B26C1E15E3CE51003785EA /* creeper2.m4a */, + D5B26C1F15E3CE51003785EA /* creeper3.m4a */, + D5B26C2015E3CE51003785EA /* creeper4.m4a */, + D5B26C2115E3CE51003785EA /* creeperdeath.m4a */, + D5B26C2215E3CE51003785EA /* spiderdeath.m4a */, + D5ACF1AB15C03DBF00E21C22 /* zombie1.m4a */, + D5ACF1AC15C03DBF00E21C22 /* zombie2.m4a */, + D5ACF1AD15C03DBF00E21C22 /* zombie3.m4a */, + D5ACF1AE15C03DBF00E21C22 /* zombiedeath.m4a */, + D5ACF1AF15C03DBF00E21C22 /* zombiehurt1.m4a */, + D5ACF1B015C03DBF00E21C22 /* zombiehurt2.m4a */, + ); + path = mob; + sourceTree = ""; + }; + D5ACF1B115C03DBF00E21C22 /* random */ = { + isa = PBXGroup; + children = ( + D5ACF1B215C03DBF00E21C22 /* bow.m4a */, + D5ACF1B315C03DBF00E21C22 /* bowhit1.m4a */, + D5ACF1B415C03DBF00E21C22 /* bowhit2.m4a */, + D5ACF1B515C03DBF00E21C22 /* bowhit3.m4a */, + D5ACF1B615C03DBF00E21C22 /* bowhit4.m4a */, + D5ACF1B715C03DBF00E21C22 /* click.m4a */, + D5ACF1B815C03DBF00E21C22 /* door_close.m4a */, + D5ACF1B915C03DBF00E21C22 /* door_open.m4a */, + D5ACF1BA15C03DBF00E21C22 /* glass1.m4a */, + D598BD6C163ED06400A36438 /* explode.m4a */, + D5ACF1BB15C03DBF00E21C22 /* glass2.m4a */, + D5B26C2F15E3CED3003785EA /* eat1.m4a */, + D5B26C3015E3CED3003785EA /* eat2.m4a */, + D5B26C3115E3CED3003785EA /* eat3.m4a */, + D5B26C3215E3CED3003785EA /* fuse.m4a */, + D5ACF1BC15C03DBF00E21C22 /* glass3.m4a */, + D5ACF1BD15C03DBF00E21C22 /* hurt.m4a */, + D5ACF1BE15C03DBF00E21C22 /* pop.m4a */, + D5ACF1BF15C03DBF00E21C22 /* splash.m4a */, + D5ACF1C015C03DBF00E21C22 /* water.m4a */, + ); + path = random; + sourceTree = ""; + }; + D5ACF1C115C03DBF00E21C22 /* step */ = { + isa = PBXGroup; + children = ( + D5ACF1C215C03DBF00E21C22 /* cloth1.m4a */, + D5ACF1C315C03DBF00E21C22 /* cloth2.m4a */, + D5ACF1C415C03DBF00E21C22 /* cloth3.m4a */, + D5ACF1C515C03DBF00E21C22 /* cloth4.m4a */, + D5ACF1C615C03DBF00E21C22 /* grass1.m4a */, + D5ACF1C715C03DBF00E21C22 /* grass2.m4a */, + D5ACF1C815C03DBF00E21C22 /* grass3.m4a */, + D5ACF1C915C03DBF00E21C22 /* grass4.m4a */, + D5ACF1CA15C03DBF00E21C22 /* gravel2.m4a */, + D5ACF1CB15C03DBF00E21C22 /* gravel3.m4a */, + D5ACF1CC15C03DBF00E21C22 /* gravel4.m4a */, + D5ACF1CD15C03DBF00E21C22 /* ladder1.m4a */, + D5ACF1CE15C03DBF00E21C22 /* ladder2.m4a */, + D5ACF1CF15C03DBF00E21C22 /* ladder3.m4a */, + D5ACF1D015C03DBF00E21C22 /* ladder4.m4a */, + D5ACF1D115C03DBF00E21C22 /* sand1.m4a */, + D5ACF1D215C03DBF00E21C22 /* sand2.m4a */, + D5ACF1D315C03DBF00E21C22 /* sand3.m4a */, + D5ACF1D415C03DBF00E21C22 /* sand4.m4a */, + D5ACF1D515C03DBF00E21C22 /* snow1.m4a */, + D5ACF1D615C03DBF00E21C22 /* snow2.m4a */, + D5ACF1D715C03DBF00E21C22 /* snow3.m4a */, + D5ACF1D815C03DBF00E21C22 /* snow4.m4a */, + D5ACF1D915C03DBF00E21C22 /* stone1.m4a */, + D5ACF1DA15C03DBF00E21C22 /* stone2.m4a */, + D5ACF1DB15C03DBF00E21C22 /* stone3.m4a */, + D5ACF1DC15C03DBF00E21C22 /* stone4.m4a */, + D5ACF1DD15C03DBF00E21C22 /* wood1.m4a */, + D5ACF1DE15C03DBF00E21C22 /* wood2.m4a */, + D5ACF1DF15C03DBF00E21C22 /* wood3.m4a */, + D5ACF1E015C03DBF00E21C22 /* wood4.m4a */, + ); + path = step; + sourceTree = ""; + }; + D5B50C1614CFF66F005F7284 /* src */ = { + isa = PBXGroup; + children = ( + D544940315D13DB7005FA9B0 /* server */, + D5B50C1714CFF66F005F7284 /* App.h */, + D5B50C1814CFF66F005F7284 /* AppConstants.h */, + D5B50C1914CFF66F005F7284 /* AppPlatform.h */, + D5B50C1B14CFF66F005F7284 /* AppPlatform_iOS.h */, + D5B50C1C14CFF66F005F7284 /* AppPlatform_iOS.mm */, + D5B50C1F14CFF66F005F7284 /* client */, + D5B50D1714CFF66F005F7284 /* EglConfigPrinter.h */, + D5B50D1814CFF66F005F7284 /* LicenseCodes.h */, + D5B50D1914CFF66F005F7284 /* locale */, + D5B50D1B14CFF66F005F7284 /* main.cpp */, + D5B50D2114CFF66F005F7284 /* nbt */, + D5B50D3014CFF66F005F7284 /* network */, + D5B50D5014CFF66F005F7284 /* NinecraftApp.cpp */, + D5B50D5114CFF66F005F7284 /* NinecraftApp.h */, + D5B50D5214CFF66F005F7284 /* Performance.cpp */, + D5B50D5314CFF66F005F7284 /* Performance.h */, + D5B50D5414CFF66F005F7284 /* platform */, + D5B50E5614CFF66F005F7284 /* SharedConstants.h */, + D5251CB51538192700FC82C8 /* raknet */, + D584926C14FD234400741128 /* SharedConstants.cpp */, + D5B50E5714CFF66F005F7284 /* terrain_4444.h */, + D5B50E5814CFF66F005F7284 /* terrain_5551.h */, + D5B50E5914CFF66F005F7284 /* terrain_565.h */, + D5B50E5A14CFF66F005F7284 /* terrain_565_2.h */, + D5B50E5B14CFF66F005F7284 /* util */, + D5B50E6C14CFF66F005F7284 /* world */, + ); + name = src; + path = ../../src; + sourceTree = ""; + }; + D5B50C1F14CFF66F005F7284 /* client */ = { + isa = PBXGroup; + children = ( + 044129061682FF9600B70EE6 /* MouseHandler.cpp */, + D584928414FD240C00741128 /* IConfigListener.cpp */, + D584928514FD240C00741128 /* IConfigListener.h */, + D5B50C2014CFF66F005F7284 /* gamemode */, + D5B50C2614CFF66F005F7284 /* gui */, + D5B50C6614CFF66F005F7284 /* KeyMapping.h */, + D5B50C6814CFF66F005F7284 /* Minecraft.cpp */, + D5B50C6914CFF66F005F7284 /* Minecraft.h */, + D5B50C6A14CFF66F005F7284 /* model */, + D5B50C8514CFF66F005F7284 /* MouseHandler.h */, + D5B50C8614CFF66F005F7284 /* multiplayer */, + D5B50C8814CFF66F005F7284 /* Options.cpp */, + D5B50C8914CFF66F005F7284 /* Options.h */, + D5B50C8A14CFF66F005F7284 /* OptionStrings.cpp */, + D5B50C8B14CFF66F005F7284 /* OptionStrings.h */, + D5B50C8C14CFF66F005F7284 /* particle */, + D5B50C9C14CFF66F005F7284 /* PixelCalc.h */, + D5B50C9D14CFF66F005F7284 /* player */, + D5B50CB214CFF66F005F7284 /* renderer */, + D5B50CF414CFF66F005F7284 /* sound */, + D5B50D1514CFF66F005F7284 /* Timer.h */, + D5B50D1614CFF66F005F7284 /* User.h */, + ); + path = client; + sourceTree = ""; + }; + D5B50C2014CFF66F005F7284 /* gamemode */ = { + isa = PBXGroup; + children = ( + D5B50C2114CFF66F005F7284 /* CreativeMode.cpp */, + D5B50C2214CFF66F005F7284 /* CreativeMode.h */, + D5B50C2314CFF66F005F7284 /* GameMode.cpp */, + D5B17ED815E2273F0056E751 /* SurvivalMode.cpp */, + D5B50C2414CFF66F005F7284 /* GameMode.h */, + D5B50C2514CFF66F005F7284 /* SurvivalMode.h */, + ); + path = gamemode; + sourceTree = ""; + }; + D5B50C2614CFF66F005F7284 /* gui */ = { + isa = PBXGroup; + children = ( + D5B50C2714CFF66F005F7284 /* components */, + D5B50C3614CFF66F005F7284 /* Font.cpp */, + D5B50C3714CFF66F005F7284 /* Font.h */, + D5B50C3814CFF66F005F7284 /* Gui.cpp */, + D5B50C3914CFF66F005F7284 /* Gui.h */, + D5B50C3A14CFF66F005F7284 /* GuiComponent.cpp */, + D5B50C3B14CFF66F005F7284 /* GuiComponent.h */, + D5B50C3C14CFF66F005F7284 /* Screen.cpp */, + D5B50C3D14CFF66F005F7284 /* Screen.h */, + D5B50C3E14CFF66F005F7284 /* screens */, + D5B50C6514CFF66F005F7284 /* TweenData.h */, + ); + path = gui; + sourceTree = ""; + }; + D5B50C2714CFF66F005F7284 /* components */ = { + isa = PBXGroup; + children = ( + 042A91A116B17517007ABBC6 /* GButton.cpp */, + 042A91A216B17517007ABBC6 /* GButton.h */, + 042A91A316B17517007ABBC6 /* GuiElement.cpp */, + 042A91A416B17517007ABBC6 /* GuiElement.h */, + 042A91A516B17517007ABBC6 /* NinePatch.cpp */, + 042A91A616B17517007ABBC6 /* NinePatch.h */, + 042A91A716B17517007ABBC6 /* OptionsGroup.cpp */, + 042A91A816B17517007ABBC6 /* OptionsGroup.h */, + 042A91A916B17517007ABBC6 /* OptionsPane.cpp */, + 042A91AA16B17517007ABBC6 /* OptionsPane.h */, + 042A91AB16B17517007ABBC6 /* TextBox.cpp */, + 042A91AC16B17517007ABBC6 /* TextBox.h */, + D5B50C2814CFF66F005F7284 /* Button.cpp */, + D5B50C2914CFF66F005F7284 /* Button.h */, + D5951ED6159348C50043A12A /* InventoryPane.cpp */, + D5951ED7159348C50043A12A /* InventoryPane.h */, + D5951ED8159348C50043A12A /* ItemPane.cpp */, + D5951ED9159348C50043A12A /* ItemPane.h */, + D5B50C2A14CFF66F005F7284 /* ImageButton.cpp */, + D5B50C2B14CFF66F005F7284 /* ImageButton.h */, + D5B50C2C14CFF66F005F7284 /* LargeImageButton.cpp */, + D5B50C2D14CFF66F005F7284 /* LargeImageButton.h */, + D5B50C2E14CFF66F005F7284 /* RolledSelectionListH.cpp */, + D5B50C2F14CFF66F005F7284 /* RolledSelectionListH.h */, + D5B50C3014CFF66F005F7284 /* RolledSelectionListV.cpp */, + D5B50C3114CFF66F005F7284 /* RolledSelectionListV.h */, + D5B50C3214CFF66F005F7284 /* ScrolledSelectionList.cpp */, + D5B862841538175500F3238A /* ScrollingPane.cpp */, + D5B50C3314CFF66F005F7284 /* ScrolledSelectionList.h */, + D5B8628B1538178F00F3238A /* ScrollingPane.h */, + D5B50C3414CFF66F005F7284 /* SmallButton.cpp */, + D5B50C3514CFF66F005F7284 /* SmallButton.h */, + ); + path = components; + sourceTree = ""; + }; + D5B50C3E14CFF66F005F7284 /* screens */ = { + isa = PBXGroup; + children = ( + 0413970F16A82E7B008A9F1A /* ArmorScreen.cpp */, + 0413971016A82E7B008A9F1A /* ArmorScreen.h */, + 0419D9B4167F21C60080CB96 /* crafting */, + 0419D9A3167F211B0080CB96 /* BaseContainerScreen.h */, + 0419D9A4167F211B0080CB96 /* ChooseLevelScreen.cpp */, + 0419D9A5167F211B0080CB96 /* ChooseLevelScreen.h */, + 0419D9A6167F211B0080CB96 /* DeathScreen.h */, + 0419D9A7167F211B0080CB96 /* SimpleChooseLevelScreen.cpp */, + 0419D9A8167F211B0080CB96 /* SimpleChooseLevelScreen.h */, + 0419D9A9167F211B0080CB96 /* TextEditScreen.cpp */, + 0419D9AA167F211B0080CB96 /* TextEditScreen.h */, + D5A6F8CF15B45E2600819B71 /* ChestScreen.cpp */, + D5A6F8D015B45E2600819B71 /* ChestScreen.h */, + D5B50C3F14CFF66F005F7284 /* BuyGameScreen.h */, + D5D8C4A5163931F000FD35F0 /* InBedScreen.cpp */, + D5D8C4A6163931F000FD35F0 /* InBedScreen.h */, + D5B50C4014CFF66F005F7284 /* ChatScreen.cpp */, + D5B5118D14DEA27E005F7284 /* DeathScreen.cpp */, + D5B50C4114CFF66F005F7284 /* ChatScreen.h */, + D5B50C4214CFF66F005F7284 /* ConfirmScreen.cpp */, + D5B50C4314CFF66F005F7284 /* ConfirmScreen.h */, + D5B50C4414CFF66F005F7284 /* DialogDefinitions.h */, + D5B50C4514CFF66F005F7284 /* DisconnectionScreen.h */, + D5B50C4614CFF66F005F7284 /* IngameBlockSelectionScreen.cpp */, + D5B50C4714CFF66F005F7284 /* IngameBlockSelectionScreen.h */, + D5B50C4814CFF66F005F7284 /* InvalidLicenseScreen.h */, + D5B50C4914CFF66F005F7284 /* JoinGameScreen.cpp */, + D5B50C4A14CFF66F005F7284 /* JoinGameScreen.h */, + D5B50C4B14CFF66F005F7284 /* OptionsScreen.cpp */, + D5951EEC159349680043A12A /* FurnaceScreen.cpp */, + D5951EED159349680043A12A /* FurnaceScreen.h */, + D5B50C4C14CFF66F005F7284 /* OptionsScreen.h */, + D5B50C4D14CFF66F005F7284 /* PauseScreen.cpp */, + D5B50C4E14CFF66F005F7284 /* PauseScreen.h */, + D5B50C4F14CFF66F005F7284 /* PrerenderTilesScreen.h */, + D5B50C5014CFF66F005F7284 /* ProgressScreen.cpp */, + D5B50C5114CFF66F005F7284 /* ProgressScreen.h */, + D5B50C5214CFF66F005F7284 /* RenameMPLevelScreen.cpp */, + D5B50C5314CFF66F005F7284 /* RenameMPLevelScreen.h */, + D5B50C5414CFF66F005F7284 /* ScreenChooser.cpp */, + D5B50C5514CFF66F005F7284 /* ScreenChooser.h */, + D5B50C5614CFF66F005F7284 /* SelectWorldScreen.cpp */, + D5B50C5714CFF66F005F7284 /* SelectWorldScreen.h */, + D5B50C5814CFF66F005F7284 /* StartMenuScreen.cpp */, + D5B50C5914CFF66F005F7284 /* StartMenuScreen.h */, + D5B50C5A14CFF66F005F7284 /* touch */, + D5B50C6314CFF66F005F7284 /* UploadPhotoScreen.cpp */, + D5B50C6414CFF66F005F7284 /* UploadPhotoScreen.h */, + ); + path = screens; + sourceTree = ""; + }; + D5B50C5A14CFF66F005F7284 /* touch */ = { + isa = PBXGroup; + children = ( + D5B50C5B14CFF66F005F7284 /* TouchIngameBlockSelectionScreen.cpp */, + D5B50C5C14CFF66F005F7284 /* TouchIngameBlockSelectionScreen.h */, + D5B50C5D14CFF66F005F7284 /* TouchJoinGameScreen.cpp */, + D5B50C5E14CFF66F005F7284 /* TouchJoinGameScreen.h */, + D5B50C5F14CFF66F005F7284 /* TouchSelectWorldScreen.cpp */, + D5B50C6014CFF66F005F7284 /* TouchSelectWorldScreen.h */, + D5B50C6114CFF66F005F7284 /* TouchStartMenuScreen.cpp */, + D5B50C6214CFF66F005F7284 /* TouchStartMenuScreen.h */, + ); + path = touch; + sourceTree = ""; + }; + D5B50C6A14CFF66F005F7284 /* model */ = { + isa = PBXGroup; + children = ( + 0419D997167F201B0080CB96 /* ChestModel.h */, + 0419D998167F201B0080CB96 /* SheepFurModel.cpp */, + 0419D999167F201B0080CB96 /* SheepModel.cpp */, + 0419D99A167F201B0080CB96 /* SignModel.h */, + D5B50C6B14CFF66F005F7284 /* ChickenModel.cpp */, + D5B50C6C14CFF66F005F7284 /* ChickenModel.h */, + D5B50C6D14CFF66F005F7284 /* CowModel.cpp */, + D5B50C6E14CFF66F005F7284 /* CowModel.h */, + D5B50C6F14CFF66F005F7284 /* CreeperModel.h */, + D5B50C7014CFF66F005F7284 /* geom */, + D5B50C7814CFF66F005F7284 /* HumanoidModel.cpp */, + D5B50C7914CFF66F005F7284 /* HumanoidModel.h */, + D5B50C7A14CFF66F005F7284 /* Model.h */, + D5B50C7B14CFF66F005F7284 /* ModelInclude.h */, + D5B50C7C14CFF66F005F7284 /* PigModel.cpp */, + D5B50C7D14CFF66F005F7284 /* PigModel.h */, + D5B50C7E14CFF66F005F7284 /* QuadrupedModel.cpp */, + D5B50C7F14CFF66F005F7284 /* QuadrupedModel.h */, + D5B50C8014CFF66F005F7284 /* SheepFurModel.h */, + D5B50C8114CFF66F005F7284 /* SheepModel.h */, + D5B50C8214CFF66F005F7284 /* SkeletonModel.h */, + D5B50C8314CFF66F005F7284 /* SpiderModel.h */, + D5B50C8414CFF66F005F7284 /* ZombieModel.h */, + ); + path = model; + sourceTree = ""; + }; + D5B50C7014CFF66F005F7284 /* geom */ = { + isa = PBXGroup; + children = ( + D5B50C7114CFF66F005F7284 /* Cube.cpp */, + D5B50C7214CFF66F005F7284 /* Cube.h */, + D5B50C7314CFF66F005F7284 /* ModelPart.cpp */, + D5B50C7414CFF66F005F7284 /* ModelPart.h */, + D5B50C7514CFF66F005F7284 /* Polygon.cpp */, + D5B50C7614CFF66F005F7284 /* Polygon.h */, + D5B50C7714CFF66F005F7284 /* Vertex.h */, + ); + path = geom; + sourceTree = ""; + }; + D5B50C8614CFF66F005F7284 /* multiplayer */ = { + isa = PBXGroup; + children = ( + D5B50C8714CFF66F005F7284 /* MultiPlayerLevel.h */, + ); + path = multiplayer; + sourceTree = ""; + }; + D5B50C8C14CFF66F005F7284 /* particle */ = { + isa = PBXGroup; + children = ( + D5B50C8D14CFF66F005F7284 /* BreakingItemParticle.h */, + D5B50C8E14CFF66F005F7284 /* BubbleParticle.h */, + D5B50C8F14CFF66F005F7284 /* ExplodeParticle.h */, + D5B50C9014CFF66F005F7284 /* FlameParticle.h */, + D5B50C9114CFF66F005F7284 /* LavaParticle.h */, + D5B50C9214CFF66F005F7284 /* Particle.cpp */, + D5B50C9314CFF66F005F7284 /* Particle.h */, + D5B50C9414CFF66F005F7284 /* ParticleEngine.cpp */, + D5B50C9514CFF66F005F7284 /* ParticleEngine.h */, + D5B50C9614CFF66F005F7284 /* ParticleInclude.h */, + D5B50C9714CFF66F005F7284 /* RedDustParticle.h */, + D5B50C9814CFF66F005F7284 /* SmokeParticle.h */, + D5B50C9914CFF66F005F7284 /* SplashParticle.h */, + D5B50C9A14CFF66F005F7284 /* TakeAnimationParticle.h */, + D5B50C9B14CFF66F005F7284 /* TerrainParticle.h */, + ); + path = particle; + sourceTree = ""; + }; + D5B50C9D14CFF66F005F7284 /* player */ = { + isa = PBXGroup; + children = ( + D5B50C9E14CFF66F005F7284 /* input */, + D5B50CB014CFF66F005F7284 /* LocalPlayer.cpp */, + D544942015D13F5E005FA9B0 /* RemotePlayer.cpp */, + D544942115D13F5E005FA9B0 /* RemotePlayer.h */, + D5B50CB114CFF66F005F7284 /* LocalPlayer.h */, + ); + path = player; + sourceTree = ""; + }; + D5B50C9E14CFF66F005F7284 /* input */ = { + isa = PBXGroup; + children = ( + D5B50C9F14CFF66F005F7284 /* ControllerTurnInput.h */, + D5B50CA014CFF66F005F7284 /* IBuildInput.h */, + D5B50CA114CFF66F005F7284 /* IInputHolder.h */, + D5B50CA214CFF66F005F7284 /* IMoveInput.h */, + D5B50CA314CFF66F005F7284 /* ITurnInput.h */, + D5B50CA414CFF66F005F7284 /* KeyboardInput.cpp */, + D5B50CA514CFF66F005F7284 /* KeyboardInput.h */, + D5B50CA614CFF66F005F7284 /* MouseBuildInput.h */, + D5B50CA714CFF66F005F7284 /* MouseTurnInput.h */, + D5B50CA814CFF66F005F7284 /* touchscreen */, + D5B50CAF14CFF66F005F7284 /* XperiaPlayInput.h */, + ); + path = input; + sourceTree = ""; + }; + D5B50CA814CFF66F005F7284 /* touchscreen */ = { + isa = PBXGroup; + children = ( + D5B50CA914CFF66F005F7284 /* ITouchScreenModel.h */, + D5B50CAA14CFF66F005F7284 /* TouchAreaModel.h */, + D5B50CAB14CFF66F005F7284 /* TouchInputHolder.h */, + D5B50CAC14CFF66F005F7284 /* TouchscreenInput.cpp */, + D5B50CAD14CFF66F005F7284 /* TouchscreenInput.h */, + D5B50CAE14CFF66F005F7284 /* TouchTurnInput.h */, + ); + path = touchscreen; + sourceTree = ""; + }; + D5B50CB214CFF66F005F7284 /* renderer */ = { + isa = PBXGroup; + children = ( + D5B50CB314CFF66F005F7284 /* Chunk.cpp */, + D5B50CB414CFF66F005F7284 /* Chunk.h */, + D5B50CB514CFF66F005F7284 /* ChunkRenderer.h */, + D5B50CB614CFF66F005F7284 /* Color4.h */, + D5B50CB714CFF66F005F7284 /* culling */, + D5B50CC314CFF66F005F7284 /* DirtyChunkSorter.h */, + D5B50CC414CFF66F005F7284 /* DistanceChunkSorter.h */, + D5B50CC514CFF66F005F7284 /* entity */, + D5B50CDC14CFF66F005F7284 /* GameRenderer.cpp */, + D5B50CDD14CFF66F005F7284 /* GameRenderer.h */, + D5B50CDE14CFF66F005F7284 /* gles.cpp */, + D5B50CDF14CFF66F005F7284 /* gles.h */, + D5B50CE014CFF66F005F7284 /* ItemInHandRenderer.cpp */, + D5B50CE114CFF66F005F7284 /* ItemInHandRenderer.h */, + D5D3820B15A1A2A000B6C50E /* EntityTileRenderer.cpp */, + D5D3820C15A1A2A000B6C50E /* EntityTileRenderer.h */, + D5B50CE214CFF66F005F7284 /* LevelRenderer.cpp */, + D5B50CE314CFF66F005F7284 /* LevelRenderer.h */, + D5B50CE414CFF66F005F7284 /* ptexture */, + D5B50CE714CFF66F005F7284 /* RenderChunk.cpp */, + D5B50CE814CFF66F005F7284 /* RenderChunk.h */, + D5B50CE914CFF66F005F7284 /* RenderChunkHandler.h */, + D5D381FE15A1A26000B6C50E /* tileentity */, + D5B50CEA14CFF66F005F7284 /* RenderList.cpp */, + D5B50CEB14CFF66F005F7284 /* RenderList.h */, + D5B50CEC14CFF66F005F7284 /* Tesselator.cpp */, + D5B50CED14CFF66F005F7284 /* Tesselator.h */, + D5B50CEE14CFF66F005F7284 /* TextureData.h */, + D5B50CEF14CFF66F005F7284 /* Textures.cpp */, + D5B50CF014CFF66F005F7284 /* Textures.h */, + D5B50CF114CFF66F005F7284 /* TileRenderer.cpp */, + D5B50CF214CFF66F005F7284 /* TileRenderer.h */, + D5B50CF314CFF66F005F7284 /* VertecDecl.h */, + ); + path = renderer; + sourceTree = ""; + }; + D5B50CB714CFF66F005F7284 /* culling */ = { + isa = PBXGroup; + children = ( + D5B50CB814CFF66F005F7284 /* AllowAllCuller.h */, + D5B50CB914CFF66F005F7284 /* Culler.h */, + D5B50CBA14CFF66F005F7284 /* Frustum.cpp */, + D5B50CBB14CFF66F005F7284 /* Frustum.h */, + D5B50CBC14CFF66F005F7284 /* FrustumCuller.h */, + D5B50CBD14CFF66F005F7284 /* FrustumData.h */, + D5B50CBE14CFF66F005F7284 /* tmp */, + ); + path = culling; + sourceTree = ""; + }; + D5B50CBE14CFF66F005F7284 /* tmp */ = { + isa = PBXGroup; + children = ( + D5B50CBF14CFF66F005F7284 /* _FrustumCuller.h */, + D5B50CC014CFF66F005F7284 /* Frustum.h */, + D5B50CC114CFF66F005F7284 /* FrustumCuller.h */, + D5B50CC214CFF66F005F7284 /* FrustumData.h */, + ); + path = tmp; + sourceTree = ""; + }; + D5B50CC514CFF66F005F7284 /* entity */ = { + isa = PBXGroup; + children = ( + 0400453816A4125B003EB6FA /* FallingTileRenderer.cpp */, + 0400453916A4125B003EB6FA /* FallingTileRenderer.h */, + 0419D9A1167F20CC0080CB96 /* SheepRenderer.cpp */, + D5ACF15415C01F7D00E21C22 /* ArrowRenderer.cpp */, + D5ACF15515C01F7D00E21C22 /* ArrowRenderer.h */, + D5B50CC614CFF66F005F7284 /* ChickenRenderer.cpp */, + D5B50CC714CFF66F005F7284 /* ChickenRenderer.h */, + D5D8C4AD163932CF00FD35F0 /* PaintingRenderer.cpp */, + D5D8C4AE163932CF00FD35F0 /* PaintingRenderer.h */, + D5B50CC814CFF66F005F7284 /* CreeperRenderer.h */, + D5B50CC914CFF66F005F7284 /* EntityRenderDispatcher.cpp */, + D5B50CCA14CFF66F005F7284 /* EntityRenderDispatcher.h */, + D544941C15D13F45005FA9B0 /* PlayerRenderer.cpp */, + D544941D15D13F45005FA9B0 /* PlayerRenderer.h */, + D5B50CCB14CFF66F005F7284 /* EntityRenderer.cpp */, + D5B50CCC14CFF66F005F7284 /* EntityRenderer.h */, + D5B50CCD14CFF66F005F7284 /* HumanoidMobRenderer.cpp */, + D5B50CCE14CFF66F005F7284 /* HumanoidMobRenderer.h */, + D5B50CCF14CFF66F005F7284 /* ItemRenderer.cpp */, + D5B50CD014CFF66F005F7284 /* ItemRenderer.h */, + D5B50CD114CFF66F005F7284 /* ItemSpriteRenderer.cpp */, + D5B50CD214CFF66F005F7284 /* ItemSpriteRenderer.h */, + D5B50CD314CFF66F005F7284 /* MobRenderer.cpp */, + D5B50CD414CFF66F005F7284 /* MobRenderer.h */, + D5B50CD514CFF66F005F7284 /* PigRenderer.h */, + D5B50CD614CFF66F005F7284 /* SheepRenderer.h */, + D5B50CD714CFF66F005F7284 /* SpiderRenderer.h */, + D5B50CD814CFF66F005F7284 /* TntRenderer.cpp */, + D5B50CD914CFF66F005F7284 /* TntRenderer.h */, + D5B50CDA14CFF66F005F7284 /* TripodCameraRenderer.cpp */, + D5B50CDB14CFF66F005F7284 /* TripodCameraRenderer.h */, + ); + path = entity; + sourceTree = ""; + }; + D5B50CE414CFF66F005F7284 /* ptexture */ = { + isa = PBXGroup; + children = ( + D5B50CE514CFF66F005F7284 /* DynamicTexture.cpp */, + D5B50CE614CFF66F005F7284 /* DynamicTexture.h */, + ); + path = ptexture; + sourceTree = ""; + }; + D5B50CF414CFF66F005F7284 /* sound */ = { + isa = PBXGroup; + children = ( + D5B50D1114CFF66F005F7284 /* Sound.cpp */, + D5251E901539A9AF00FC82C8 /* SoundEngine.mm */, + D5B50D1214CFF66F005F7284 /* Sound.h */, + D5B50D1314CFF66F005F7284 /* SoundEngine.h */, + D5B50D1414CFF66F005F7284 /* SoundRepository.h */, + ); + path = sound; + sourceTree = ""; + }; + D5B50D1914CFF66F005F7284 /* locale */ = { + isa = PBXGroup; + children = ( + D5B86280153810BD00F3238A /* I18n.cpp */, + D5B50D1A14CFF66F005F7284 /* I18n.h */, + ); + path = locale; + sourceTree = ""; + }; + D5B50D2114CFF66F005F7284 /* nbt */ = { + isa = PBXGroup; + children = ( + D5B50D2214CFF66F005F7284 /* ByteArrayTag.h */, + D5B50D2314CFF66F005F7284 /* ByteTag.h */, + D5B50D2414CFF66F005F7284 /* CompoundTag.h */, + D5B50D2514CFF66F005F7284 /* DoubleTag.h */, + D5B50D2614CFF66F005F7284 /* EndTag.h */, + D5B50D2714CFF66F005F7284 /* FloatTag.h */, + D5B50D2814CFF66F005F7284 /* IntTag.h */, + D5B50D2914CFF66F005F7284 /* ListTag.h */, + D5B50D2A14CFF66F005F7284 /* LongTag.h */, + D5B50D2B14CFF66F005F7284 /* NbtIo.h */, + D5B50D2C14CFF66F005F7284 /* ShortTag.h */, + D5B50D2D14CFF66F005F7284 /* StringTag.h */, + D5B50D2E14CFF66F005F7284 /* Tag.cpp */, + D5B50D2F14CFF66F005F7284 /* Tag.h */, + ); + path = nbt; + sourceTree = ""; + }; + D5B50D3014CFF66F005F7284 /* network */ = { + isa = PBXGroup; + children = ( + 0419D9A0167F207B0080CB96 /* command */, + D5B50D3114CFF66F005F7284 /* ClientSideNetworkHandler.cpp */, + D5B50D3214CFF66F005F7284 /* ClientSideNetworkHandler.h */, + D5B50D3314CFF66F005F7284 /* NetEventCallback.cpp */, + D5B50D3414CFF66F005F7284 /* NetEventCallback.h */, + D5B50D3514CFF66F005F7284 /* packet */, + D5B50D4A14CFF66F005F7284 /* Packet.cpp */, + D5B50D4B14CFF66F005F7284 /* Packet.h */, + D5B50D4C14CFF66F005F7284 /* RakNetInstance.cpp */, + D5B50D4D14CFF66F005F7284 /* RakNetInstance.h */, + D5B50D4E14CFF66F005F7284 /* ServerSideNetworkHandler.cpp */, + D5B50D4F14CFF66F005F7284 /* ServerSideNetworkHandler.h */, + ); + path = network; + sourceTree = ""; + }; + D5B50D3514CFF66F005F7284 /* packet */ = { + isa = PBXGroup; + children = ( + D5B50D3614CFF66F005F7284 /* AddItemEntityPacket.h */, + D5B50D3714CFF66F005F7284 /* AddMobPacket.h */, + D5951ED01593485F0043A12A /* ContainerAckPacket.h */, + D5951ED11593485F0043A12A /* ContainerClosePacket.h */, + D5951ED21593485F0043A12A /* ContainerOpenPacket.h */, + D5951ED31593485F0043A12A /* ContainerSetContentPacket.h */, + D5951ED41593485F0043A12A /* ContainerSetDataPacket.h */, + D5951ED51593485F0043A12A /* ContainerSetSlotPacket.h */, + D5B50D3814CFF66F005F7284 /* AddPlayerPacket.h */, + D5B50D3914CFF66F005F7284 /* AnimatePacket.h */, + D5B50D3A14CFF66F005F7284 /* ChunkDataPacket.h */, + D5B50D3B14CFF66F005F7284 /* InteractPacket.h */, + D5B50D3C14CFF66F005F7284 /* LoginPacket.h */, + D5B50D3D14CFF66F005F7284 /* LoginStatusPacket.h */, + D5B50D3E14CFF66F005F7284 /* MessagePacket.h */, + D5B50D3F14CFF66F005F7284 /* MoveEntityPacket.h */, + D5B50D4014CFF66F005F7284 /* MovePlayerPacket.h */, + D5B50D4114CFF66F005F7284 /* PacketInclude.h */, + D5B50D4214CFF66F005F7284 /* PlaceBlockPacket.h */, + D5B50D4314CFF66F005F7284 /* PlayerEquipmentPacket.h */, + D5B50D4414CFF66F005F7284 /* RemoveBlockPacket.h */, + D5B50D4514CFF66F005F7284 /* RemoveEntityPacket.h */, + D5B50D4614CFF66F005F7284 /* RequestChunkPacket.h */, + D5B50D4714CFF66F005F7284 /* StartGamePacket.h */, + D5B50D4814CFF66F005F7284 /* UpdateBlockPacket.h */, + D5B50D4914CFF66F005F7284 /* UseItemPacket.h */, + ); + path = packet; + sourceTree = ""; + }; + D5B50D5414CFF66F005F7284 /* platform */ = { + isa = PBXGroup; + children = ( + D5B50D5514CFF66F005F7284 /* audio */, + D5B50D5E14CFF66F005F7284 /* CThread.cpp */, + D5B50D5F14CFF66F005F7284 /* CThread.h */, + D5B50D6014CFF66F005F7284 /* file.h */, + D5B50D6114CFF66F005F7284 /* input */, + D5B50D6A14CFF66F005F7284 /* log.h */, + D5B50D6B14CFF66F005F7284 /* time.cpp */, + D5B50D6C14CFF66F005F7284 /* time.h */, + ); + path = platform; + sourceTree = ""; + }; + D5B50D5514CFF66F005F7284 /* audio */ = { + isa = PBXGroup; + children = ( + D5B50D5614CFF66F005F7284 /* ios */, + D5B50D5914CFF66F005F7284 /* SoundSystem.h */, + D5B50D5A14CFF66F005F7284 /* SoundSystemAL.cpp */, + D5B50D5B14CFF66F005F7284 /* SoundSystemAL.h */, + ); + path = audio; + sourceTree = ""; + }; + D5B50D5614CFF66F005F7284 /* ios */ = { + isa = PBXGroup; + children = ( + ); + path = ios; + sourceTree = ""; + }; + D5B50D6114CFF66F005F7284 /* input */ = { + isa = PBXGroup; + children = ( + D5B50D6214CFF66F005F7284 /* Controller.cpp */, + D5B50D6314CFF66F005F7284 /* Controller.h */, + D5B50D6414CFF66F005F7284 /* Keyboard.cpp */, + D5B50D6514CFF66F005F7284 /* Keyboard.h */, + D5B50D6614CFF66F005F7284 /* Mouse.cpp */, + D5B50D6714CFF66F005F7284 /* Mouse.h */, + D5B50D6814CFF66F005F7284 /* Multitouch.cpp */, + D5B50D6914CFF66F005F7284 /* Multitouch.h */, + ); + path = input; + sourceTree = ""; + }; + D5B50E5B14CFF66F005F7284 /* util */ = { + isa = PBXGroup; + children = ( + D5B50E5C14CFF66F005F7284 /* CollectionUtils.h */, + D5B50E5D14CFF66F005F7284 /* DataIO.cpp */, + D5B50E5E14CFF66F005F7284 /* DataIO.h */, + D5B50E5F14CFF66F005F7284 /* IntHashMap.h */, + D5B50E6014CFF66F005F7284 /* Mth.cpp */, + D5B50E6114CFF66F005F7284 /* Mth.h */, + D5B50E6214CFF66F005F7284 /* PerfRenderer.cpp */, + D5B50E6314CFF66F005F7284 /* PerfRenderer.h */, + D5B50E6414CFF66F005F7284 /* PerfTimer.cpp */, + D5B50E6514CFF66F005F7284 /* PerfTimer.h */, + D5B50E6614CFF66F005F7284 /* RakDataIO.h */, + D5B50E6714CFF66F005F7284 /* Random.h */, + D5B50E6814CFF66F005F7284 /* SmoothFloat.h */, + D5B50E6914CFF66F005F7284 /* StringUtils.cpp */, + D5B50E6A14CFF66F005F7284 /* StringUtils.h */, + D5B50E6B14CFF66F005F7284 /* WeighedRandom.h */, + ); + path = util; + sourceTree = ""; + }; + D5B50E6C14CFF66F005F7284 /* world */ = { + isa = PBXGroup; + children = ( + D5B50E6D14CFF66F005F7284 /* Container.h */, + D5B50E6E14CFF66F005F7284 /* Direction.cpp */, + D5B50E6F14CFF66F005F7284 /* Direction.h */, + D5B50E7014CFF66F005F7284 /* entity */, + D5B50EAC14CFF66F005F7284 /* Facing.h */, + D544940C15D13E27005FA9B0 /* food */, + D5B50EAD14CFF66F005F7284 /* inventory */, + D5B50EAF14CFF66F005F7284 /* item */, + D5B50ED014CFF66F005F7284 /* level */, + D5B50F6914CFF66F005F7284 /* phys */, + D5B50F6E14CFF66F005F7284 /* Pos.h */, + ); + path = world; + sourceTree = ""; + }; + D5B50E7014CFF66F005F7284 /* entity */ = { + isa = PBXGroup; + children = ( + 0419D9B5167F22150080CB96 /* AgableMob.cpp */, + 0419D9B6167F22150080CB96 /* AgableMob.h */, + D584926914FD22EE00741128 /* ai */, + D5B50E7114CFF66F005F7284 /* animal */, + D5B50E7F14CFF66F005F7284 /* Creature.h */, + D5B50E8014CFF66F005F7284 /* Entity.cpp */, + D5D8C4B11639335000FD35F0 /* HangingEntity.cpp */, + D5D8C4B21639335000FD35F0 /* HangingEntity.h */, + D5D8C4B31639335000FD35F0 /* Painting.cpp */, + D5D8C4B41639335000FD35F0 /* Painting.h */, + D5B50E8114CFF66F005F7284 /* Entity.h */, + D5B50E8214CFF66F005F7284 /* EntityEvent.h */, + D5B50E8314CFF66F005F7284 /* EntityPos.h */, + D5B50E8414CFF66F005F7284 /* EntityRendererId.h */, + D5B50E8514CFF66F005F7284 /* EntityTypes.h */, + D5D8C4C11639341100FD35F0 /* Motive.cpp */, + D5D8C4C21639341100FD35F0 /* Motive.h */, + D5ACF18215C022B500E21C22 /* EntityFactory.cpp */, + D5ACF18315C022B500E21C22 /* EntityFactory.h */, + D5B50E8614CFF66F005F7284 /* FlyingMob.cpp */, + D5B50E8714CFF66F005F7284 /* FlyingMob.h */, + D5B50E8814CFF66F005F7284 /* item */, + D5B50E9114CFF66F005F7284 /* Mob.cpp */, + D5B50E9214CFF66F005F7284 /* Mob.h */, + D5B50E9314CFF66F005F7284 /* MobCategory.cpp */, + D5B50E9414CFF66F005F7284 /* MobCategory.h */, + D5B50E9514CFF66F005F7284 /* MobFactory.h */, + D5B50E9614CFF66F005F7284 /* monster */, + D5B50E9E14CFF66F005F7284 /* PathFinderMob.cpp */, + D5B50E9F14CFF66F005F7284 /* PathfinderMob.h */, + D5B50EA014CFF66F005F7284 /* player */, + D5B50EA814CFF66F005F7284 /* projectile */, + D5B50EAB14CFF66F005F7284 /* SynchedEntityData.h */, + D5B5118A14D03342005F7284 /* SynchedEntityData.cpp */, + ); + path = entity; + sourceTree = ""; + }; + D5B50E7114CFF66F005F7284 /* animal */ = { + isa = PBXGroup; + children = ( + D5B50E7214CFF66F005F7284 /* Animal.cpp */, + D5B50E7314CFF66F005F7284 /* Animal.h */, + D5B50E7414CFF66F005F7284 /* AnimalInclude.h */, + D5B50E7514CFF66F005F7284 /* Chicken.cpp */, + D5B50E7614CFF66F005F7284 /* Chicken.h */, + D5B50E7714CFF66F005F7284 /* Cow.cpp */, + D5B50E7814CFF66F005F7284 /* Cow.h */, + D5B50E7914CFF66F005F7284 /* Pig.cpp */, + D5B50E7A14CFF66F005F7284 /* Pig.h */, + D5B50E7B14CFF66F005F7284 /* Sheep.cpp */, + D5B50E7C14CFF66F005F7284 /* Sheep.h */, + D5B50E7D14CFF66F005F7284 /* WaterAnimal.cpp */, + D5B50E7E14CFF66F005F7284 /* WaterAnimal.h */, + ); + path = animal; + sourceTree = ""; + }; + D5B50E8814CFF66F005F7284 /* item */ = { + isa = PBXGroup; + children = ( + D5B50E8914CFF66F005F7284 /* FallingTile.cpp */, + D5B50E8A14CFF66F005F7284 /* FallingTile.h */, + D5B50E8B14CFF66F005F7284 /* ItemEntity.cpp */, + D5B50E8C14CFF66F005F7284 /* ItemEntity.h */, + D5B50E8D14CFF66F005F7284 /* PrimedTnt.cpp */, + D5B50E8E14CFF66F005F7284 /* PrimedTnt.h */, + D5B50E8F14CFF66F005F7284 /* TripodCamera.cpp */, + D5B50E9014CFF66F005F7284 /* TripodCamera.h */, + ); + path = item; + sourceTree = ""; + }; + D5B50E9614CFF66F005F7284 /* monster */ = { + isa = PBXGroup; + children = ( + D5ACF16D15C0220D00E21C22 /* Creeper.cpp */, + D5ACF16E15C0220D00E21C22 /* Creeper.h */, + D5ACF16F15C0220D00E21C22 /* Monster.cpp */, + D5ACF17015C0220D00E21C22 /* Monster.h */, + D5ACF17115C0220D00E21C22 /* MonsterInclude.h */, + D5D8C4991639305100FD35F0 /* PigZombie.cpp */, + D5D8C49A1639305100FD35F0 /* PigZombie.h */, + D5ACF17215C0220D00E21C22 /* Skeleton.cpp */, + D5ACF17315C0220D00E21C22 /* Skeleton.h */, + D5ACF17415C0220D00E21C22 /* Spider.cpp */, + D5ACF17515C0220D00E21C22 /* Spider.h */, + D5ACF17615C0220D00E21C22 /* Zombie.cpp */, + D5ACF17715C0220D00E21C22 /* Zombie.h */, + ); + path = monster; + sourceTree = ""; + }; + D5B50EA014CFF66F005F7284 /* player */ = { + isa = PBXGroup; + children = ( + D5B50EA114CFF66F005F7284 /* Abilities.h */, + D5B50EA214CFF66F005F7284 /* Inventory.cpp */, + D5B50EA314CFF66F005F7284 /* Inventory.h */, + D5B50EA514CFF66F005F7284 /* InventorySlotManager.h */, + D5B50EA614CFF66F005F7284 /* Player.cpp */, + D5B50EA714CFF66F005F7284 /* Player.h */, + ); + path = player; + sourceTree = ""; + }; + D5B50EA814CFF66F005F7284 /* projectile */ = { + isa = PBXGroup; + children = ( + D5B17ED115E226F50056E751 /* Snowball.h */, + D5B17ED215E226F50056E751 /* Throwable.cpp */, + D5B17ED315E226F50056E751 /* Throwable.h */, + D5B17ED415E226F50056E751 /* ThrownEgg.h */, + D5B50EA914CFF66F005F7284 /* Arrow.cpp */, + D5B50EAA14CFF66F005F7284 /* Arrow.h */, + ); + path = projectile; + sourceTree = ""; + }; + D5B50EAD14CFF66F005F7284 /* inventory */ = { + isa = PBXGroup; + children = ( + D5A6F8D415B45EE500819B71 /* ContainerMenu.cpp */, + D5A6F8D515B45EE500819B71 /* ContainerMenu.h */, + D5D381F015A1A1CF00B6C50E /* FillingContainer.cpp */, + D5D381F115A1A1CF00B6C50E /* FillingContainer.h */, + D5951EF315934AC50043A12A /* BaseContainerMenu.cpp */, + D5951EF415934AC50043A12A /* BaseContainerMenu.h */, + D5951EF515934AC50043A12A /* FurnaceMenu.cpp */, + D5951EF615934AC50043A12A /* FurnaceMenu.h */, + D5B50EAE14CFF66F005F7284 /* CraftingContainer.h */, + ); + path = inventory; + sourceTree = ""; + }; + D5B50EAF14CFF66F005F7284 /* item */ = { + isa = PBXGroup; + children = ( + 0413970516A82E1E008A9F1A /* ArmorItem.cpp */, + 0413970616A82E1E008A9F1A /* ArmorItem.h */, + D54493FB15D13C59005FA9B0 /* BedItem.cpp */, + D54493FC15D13C59005FA9B0 /* BedItem.h */, + D5B50EB014CFF66F005F7284 /* BowItem.h */, + D5B50EB114CFF66F005F7284 /* CameraItem.h */, + D5B50EB214CFF66F005F7284 /* crafting */, + D5B50EBC14CFF66F005F7284 /* DiggerItem.h */, + D5B50EBD14CFF66F005F7284 /* DoorItem.h */, + D5B50EBE14CFF66F005F7284 /* EggItem.h */, + D54493FF15D13C93005FA9B0 /* BowlFoodItem.h */, + D544940015D13C93005FA9B0 /* ClothTileItem.h */, + D544940115D13C93005FA9B0 /* CoalItem.h */, + D544940215D13C93005FA9B0 /* FoodItem.h */, + D5B5119314DEA2EF005F7284 /* DyePowderItem.cpp */, + D5D8C4C5163934BB00FD35F0 /* HangingEntityItem.cpp */, + D5D8C4C6163934BB00FD35F0 /* HangingEntityItem.h */, + D54493F615D13C35005FA9B0 /* HoeItem.cpp */, + D54493F715D13C35005FA9B0 /* HoeItem.h */, + D54493F815D13C35005FA9B0 /* SeedItem.h */, + D5B5119614DEA304005F7284 /* DyePowderItem.h */, + D5B50EBF14CFF66F005F7284 /* HatchetItem.cpp */, + D5B50EC014CFF66F005F7284 /* HatchetItem.h */, + D5B50EC114CFF66F005F7284 /* Item.cpp */, + D5B50EC214CFF66F005F7284 /* Item.h */, + D5B50EC314CFF66F005F7284 /* ItemInclude.h */, + D5B50EC414CFF66F005F7284 /* ItemInstance.cpp */, + D5B50EC514CFF66F005F7284 /* ItemInstance.h */, + D5B50EC614CFF66F005F7284 /* PickaxeItem.cpp */, + D5B50EC714CFF66F005F7284 /* PickaxeItem.h */, + D5B50EC814CFF66F005F7284 /* ShearsItem.h */, + D5B50EC914CFF66F005F7284 /* ShovelItem.cpp */, + D5B50ECA14CFF66F005F7284 /* ShovelItem.h */, + D5B50ECB14CFF66F005F7284 /* SnowballItem.h */, + D5B50ECC14CFF66F005F7284 /* TileItem.h */, + D5B50ECD14CFF66F005F7284 /* TilePlanterItem.h */, + D5B50ECE14CFF66F005F7284 /* TreeTileItem.h */, + D5B50ECF14CFF66F005F7284 /* WeaponItem.h */, + ); + path = item; + sourceTree = ""; + }; + D5B50EB214CFF66F005F7284 /* crafting */ = { + isa = PBXGroup; + children = ( + 0413971216A82EB9008A9F1A /* ArmorRecipes.cpp */, + 0413971316A82EB9008A9F1A /* ArmorRecipes.h */, + 0413971416A82EB9008A9F1A /* OreRecipes.h */, + D5B50EB314CFF66F005F7284 /* Recipe.h */, + D5B8628E1538187400F3238A /* Recipe.cpp */, + D5B50EB414CFF66F005F7284 /* Recipes.cpp */, + D5B50EB514CFF66F005F7284 /* Recipes.h */, + D5951EC4159347EE0043A12A /* FurnaceRecipes.cpp */, + D5951EC5159347EE0043A12A /* FurnaceRecipes.h */, + D5951EC6159347EE0043A12A /* OreRecipes.cpp */, + D5B50EB614CFF66F005F7284 /* ShapedRecipe.h */, + D5B8628C1538187400F3238A /* ClothDyeRecipes.h */, + D5B8628D1538187400F3238A /* FoodRecipes.h */, + D5B8628F1538187400F3238A /* RecipeCategory.h */, + D5B862901538187400F3238A /* StructureRecipes.cpp */, + D5B862911538187400F3238A /* StructureRecipes.h */, + D5B50EB714CFF66F005F7284 /* ShapelessRecipe.h */, + D5B50EB814CFF66F005F7284 /* ToolRecipes.cpp */, + D5B50EB914CFF66F005F7284 /* ToolRecipes.h */, + D5B50EBA14CFF66F005F7284 /* WeaponRecipes.cpp */, + D5B50EBB14CFF66F005F7284 /* WeaponRecipes.h */, + ); + path = crafting; + sourceTree = ""; + }; + D5B50ED014CFF66F005F7284 /* level */ = { + isa = PBXGroup; + children = ( + D5B50ED114CFF66F005F7284 /* biome */, + D5B50EDC14CFF66F005F7284 /* chunk */, + D5B50EE614CFF66F005F7284 /* ChunkPos.h */, + D5B50EE714CFF66F005F7284 /* dimension */, + D5B50EEC14CFF66F005F7284 /* Explosion.cpp */, + D5B50EED14CFF66F005F7284 /* Explosion.h */, + D5B50EEE14CFF66F005F7284 /* Level.cpp */, + D5B50EEF14CFF66F005F7284 /* Level.h */, + D5B50EF014CFF66F005F7284 /* LevelConstants.h */, + D5B50EF114CFF66F005F7284 /* levelgen */, + D5B50F1214CFF66F005F7284 /* LevelListener.h */, + D5B50F1314CFF66F005F7284 /* LevelSettings.h */, + D5B50F1414CFF66F005F7284 /* LevelSource.h */, + D5B50F1514CFF66F005F7284 /* LightLayer.cpp */, + D5B50F1614CFF66F005F7284 /* LightLayer.h */, + D5B50F1714CFF66F005F7284 /* LightUpdate.cpp */, + D5B50F1814CFF66F005F7284 /* LightUpdate.h */, + D5B50F1914CFF66F005F7284 /* material */, + D5B50F1F14CFF66F005F7284 /* MobSpawner.cpp */, + D5B50F2014CFF66F005F7284 /* MobSpawner.h */, + D5B50F2114CFF66F005F7284 /* pathfinder */, + D5B50F2614CFF66F005F7284 /* Region.cpp */, + D5B50F2714CFF66F005F7284 /* Region.h */, + D5B50F2814CFF66F005F7284 /* storage */, + D5B50F3614CFF66F005F7284 /* TickNextTickData.cpp */, + D5B50F3714CFF66F005F7284 /* TickNextTickData.h */, + D5B50F3814CFF66F005F7284 /* tile */, + D5B50F6814CFF66F005F7284 /* TilePos.h */, + ); + path = level; + sourceTree = ""; + }; + D5B50ED114CFF66F005F7284 /* biome */ = { + isa = PBXGroup; + children = ( + D5B50ED214CFF66F005F7284 /* Biome.cpp */, + D5B50ED314CFF66F005F7284 /* Biome.h */, + D5B50ED414CFF66F005F7284 /* BiomeInclude.h */, + D5B50ED514CFF66F005F7284 /* BiomeSource.cpp */, + D5B50ED614CFF66F005F7284 /* BiomeSource.h */, + D5B50ED714CFF66F005F7284 /* FlatBiome.h */, + D5B50ED814CFF66F005F7284 /* ForestBiome.h */, + D5B50ED914CFF66F005F7284 /* RainforestBiome.h */, + D5B50EDA14CFF66F005F7284 /* SwampBiome.h */, + D5B50EDB14CFF66F005F7284 /* TaigaBiome.h */, + ); + path = biome; + sourceTree = ""; + }; + D5B50EDC14CFF66F005F7284 /* chunk */ = { + isa = PBXGroup; + children = ( + D5B50EDD14CFF66F005F7284 /* ChunkCache.h */, + D5B50EDE14CFF66F005F7284 /* ChunkSource.h */, + D5B50EDF14CFF66F005F7284 /* DataLayer.h */, + D5B50EE014CFF66F005F7284 /* EmptyLevelChunk.h */, + D5B50EE114CFF66F005F7284 /* LevelChunk.cpp */, + D5B50EE214CFF66F005F7284 /* LevelChunk.h */, + D5B50EE314CFF66F005F7284 /* storage */, + ); + path = chunk; + sourceTree = ""; + }; + D5B50EE314CFF66F005F7284 /* storage */ = { + isa = PBXGroup; + children = ( + D5B50EE414CFF66F005F7284 /* ChunkStorage.h */, + D5B50EE514CFF66F005F7284 /* MemoryChunkStorage.h */, + ); + path = storage; + sourceTree = ""; + }; + D5B50EE714CFF66F005F7284 /* dimension */ = { + isa = PBXGroup; + children = ( + D5B50EE814CFF66F005F7284 /* Dimension.cpp */, + D5B50EE914CFF66F005F7284 /* Dimension.h */, + ); + path = dimension; + sourceTree = ""; + }; + D5B50EF114CFF66F005F7284 /* levelgen */ = { + isa = PBXGroup; + children = ( + D5B50EF214CFF66F005F7284 /* CanyonFeature.cpp */, + D5B50EF314CFF66F005F7284 /* CanyonFeature.h */, + D5B50EF414CFF66F005F7284 /* DungeonFeature.cpp */, + D5B50EF514CFF66F005F7284 /* DungeonFeature.h */, + D5B50EF614CFF66F005F7284 /* feature */, + D5B50F0414CFF66F005F7284 /* LargeCaveFeature.cpp */, + D5B50F0514CFF66F005F7284 /* LargeCaveFeature.h */, + D5B50F0614CFF66F005F7284 /* LargeFeature.cpp */, + D5B50F0714CFF66F005F7284 /* LargeFeature.h */, + D5B50F0814CFF66F005F7284 /* RandomLevelSource.cpp */, + D5B50F0914CFF66F005F7284 /* RandomLevelSource.h */, + D5B50F0A14CFF66F005F7284 /* synth */, + D5B50F1114CFF66F005F7284 /* TownFeature.h */, + ); + path = levelgen; + sourceTree = ""; + }; + D5B50EF614CFF66F005F7284 /* feature */ = { + isa = PBXGroup; + children = ( + D5B50EF714CFF66F005F7284 /* BirchFeature.h */, + D5B50EF814CFF66F005F7284 /* CactusFeature.h */, + D5B50EF914CFF66F005F7284 /* ClayFeature.h */, + D5B50EFA14CFF66F005F7284 /* Feature.h */, + D5B50EFB14CFF66F005F7284 /* FeatureInclude.h */, + D5951EF015934A2D0043A12A /* Feature.cpp */, + D5B50EFC14CFF66F005F7284 /* FlowerFeature.h */, + D5B50EFD14CFF66F005F7284 /* LakeFeature.h */, + D5B50EFE14CFF66F005F7284 /* OreFeature.h */, + D5B50EFF14CFF66F005F7284 /* PineFeature.h */, + D5B50F0014CFF66F005F7284 /* ReedsFeature.h */, + D5B50F0114CFF66F005F7284 /* SpringFeature.h */, + D5B50F0214CFF66F005F7284 /* SpruceFeature.h */, + D5B50F0314CFF66F005F7284 /* TreeFeature.h */, + ); + path = feature; + sourceTree = ""; + }; + D5B50F0A14CFF66F005F7284 /* synth */ = { + isa = PBXGroup; + children = ( + D5B50F0B14CFF66F005F7284 /* ImprovedNoise.cpp */, + D5B50F0C14CFF66F005F7284 /* ImprovedNoise.h */, + D5B50F0D14CFF66F005F7284 /* PerlinNoise.cpp */, + D5B50F0E14CFF66F005F7284 /* PerlinNoise.h */, + D5B50F0F14CFF66F005F7284 /* Synth.cpp */, + D5B50F1014CFF66F005F7284 /* Synth.h */, + ); + path = synth; + sourceTree = ""; + }; + D5B50F1914CFF66F005F7284 /* material */ = { + isa = PBXGroup; + children = ( + D5B50F1A14CFF66F005F7284 /* DecorationMaterial.h */, + D5B50F1B14CFF66F005F7284 /* GasMaterial.h */, + D5B50F1C14CFF66F005F7284 /* LiquidMaterial.h */, + D5B50F1D14CFF66F005F7284 /* Material.cpp */, + D5B50F1E14CFF66F005F7284 /* Material.h */, + ); + path = material; + sourceTree = ""; + }; + D5B50F2114CFF66F005F7284 /* pathfinder */ = { + isa = PBXGroup; + children = ( + D584928814FD2FAF00741128 /* Path.cpp */, + D5B50F2214CFF66F005F7284 /* BinaryHeap.h */, + D5B50F2314CFF66F005F7284 /* Node.h */, + D5B50F2414CFF66F005F7284 /* Path.h */, + D5B50F2514CFF66F005F7284 /* PathFinder.h */, + ); + path = pathfinder; + sourceTree = ""; + }; + D5B50F2814CFF66F005F7284 /* storage */ = { + isa = PBXGroup; + children = ( + D5B50F2914CFF66F005F7284 /* ExternalFileLevelStorage.cpp */, + D5B50F2A14CFF66F005F7284 /* ExternalFileLevelStorage.h */, + D5B5119014DEA2B7005F7284 /* LevelData.cpp */, + D5B50F2B14CFF66F005F7284 /* ExternalFileLevelStorageSource.cpp */, + D5B50F2C14CFF66F005F7284 /* ExternalFileLevelStorageSource.h */, + D544941215D13E5A005FA9B0 /* FolderMethods.cpp */, + D5B50F2D14CFF66F005F7284 /* FolderMethods.h */, + D5B50F2E14CFF66F005F7284 /* LevelData.h */, + D544941515D13EE3005FA9B0 /* LevelStorageSource.cpp */, + D5B50F2F14CFF66F005F7284 /* LevelStorage.h */, + D5B50F3014CFF66F005F7284 /* LevelStorageSource.h */, + D5B50F3114CFF66F005F7284 /* MemoryLevelStorage.h */, + D5B50F3214CFF66F005F7284 /* MemoryLevelStorageSource.h */, + D5B17EDF15E260910056E751 /* MoveFolder.h */, + D5B17EE015E260910056E751 /* MoveFolder.mm */, + D5B50F3314CFF66F005F7284 /* PlayerData.h */, + D5B50F3414CFF66F005F7284 /* RegionFile.cpp */, + D5B50F3514CFF66F005F7284 /* RegionFile.h */, + ); + path = storage; + sourceTree = ""; + }; + D5B50F3814CFF66F005F7284 /* tile */ = { + isa = PBXGroup; + children = ( + 0413971616A82EF5008A9F1A /* StairTile.cpp */, + 0400453516A41236003EB6FA /* HeavyTile.cpp */, + 0400453616A41236003EB6FA /* HeavyTile.h */, + D5B50F3914CFF66F005F7284 /* BookshelfTile.h */, + D5B50F3A14CFF66F005F7284 /* Bush.h */, + D5B50F3B14CFF66F005F7284 /* CactusTile.h */, + D54493EA15D13BF0005FA9B0 /* BedTile.cpp */, + D54493EB15D13BF0005FA9B0 /* BedTile.h */, + D54493EC15D13BF0005FA9B0 /* CropTile.cpp */, + D54493ED15D13BF0005FA9B0 /* CropTile.h */, + D54493EE15D13BF0005FA9B0 /* GrassTile.cpp */, + D5B50F3C14CFF66F005F7284 /* ClayTile.h */, + D5B50F3D14CFF66F005F7284 /* ClothTile.h */, + D5B50F3E14CFF66F005F7284 /* DirtTile.h */, + D5B17EDB15E227670056E751 /* TrapDoorTile.cpp */, + D5B17EDC15E227670056E751 /* TrapDoorTile.h */, + D5D381F515A1A21800B6C50E /* EntityTile.cpp */, + D5D381F615A1A21800B6C50E /* EntityTile.h */, + D5B50F3F14CFF66F005F7284 /* DoorTile.cpp */, + D5B50F4014CFF66F005F7284 /* DoorTile.h */, + D5B50F4114CFF66F005F7284 /* entity */, + D5B50F4314CFF66F005F7284 /* FarmTile.h */, + D5B50F4414CFF66F005F7284 /* FenceGateTile.h */, + D5B50F4514CFF66F005F7284 /* FenceTile.h */, + D5B50F4614CFF66F005F7284 /* FireTile.h */, + D5B50F4714CFF66F005F7284 /* GlassTile.h */, + D5B50F4814CFF66F005F7284 /* GrassTile.h */, + D5951EE1159349000043A12A /* FurnaceTile.cpp */, + D5951EE2159349000043A12A /* FurnaceTile.h */, + D5B50F4914CFF66F005F7284 /* GravelTile.h */, + D5D8C4A1163930E600FD35F0 /* NetherReactor.cpp */, + D5D8C4A2163930E600FD35F0 /* NetherReactor.h */, + D5D8C4C91639362F00FD35F0 /* NetherReactorPattern.cpp */, + D5D8C4CA1639362F00FD35F0 /* NetherReactorPattern.h */, + D5B50F4A14CFF66F005F7284 /* HalfTransparentTile.h */, + D5D3820F15A1A2C200B6C50E /* ChestTile.cpp */, + D5D3821015A1A2C200B6C50E /* ChestTile.h */, + D5D8C49D163930D600FD35F0 /* MelonTile.cpp */, + D5D8C49E163930D600FD35F0 /* MelonTile.h */, + D5B50F4B14CFF66F005F7284 /* IceTile.h */, + D5B50F4C14CFF66F005F7284 /* InvisibleTile.h */, + D5B50F4D14CFF66F005F7284 /* LadderTile.h */, + D5B50F4E14CFF66F005F7284 /* LeafTile.h */, + D5B50F4F14CFF66F005F7284 /* LevelEvent.h */, + D5B50F5014CFF66F005F7284 /* LiquidTile.h */, + D5B50F5114CFF66F005F7284 /* LiquidTileDynamic.h */, + D5B50F5214CFF66F005F7284 /* LiquidTileStatic.h */, + D5B50F5314CFF66F005F7284 /* MetalTile.h */, + D5B50F5414CFF66F005F7284 /* ObsidianTile.h */, + D5D8C48316392FF000FD35F0 /* LightGemTile.cpp */, + D5D8C48416392FF000FD35F0 /* LightGemTile.h */, + D5D8C48516392FF000FD35F0 /* Mushroom.cpp */, + D5D8C48616392FF000FD35F0 /* Mushroom.h */, + D5D8C48716392FF000FD35F0 /* SignTile.h */, + D5D8C48816392FF000FD35F0 /* StemTile.cpp */, + D5D8C48916392FF000FD35F0 /* StemTile.h */, + D5B50F5514CFF66F005F7284 /* OreTile.h */, + D5B50F5614CFF66F005F7284 /* RedStoneOreTile.h */, + D5B50F5714CFF66F005F7284 /* ReedTile.h */, + D5B50F5814CFF66F005F7284 /* SandStoneTile.h */, + D544941815D13F06005FA9B0 /* TallGrass.cpp */, + D544941915D13F06005FA9B0 /* TallGrass.h */, + D5B50F5B14CFF66F005F7284 /* SnowTile.h */, + D5B50F5C14CFF66F005F7284 /* StairTile.h */, + D5B50F5D14CFF66F005F7284 /* StoneSlabTile.cpp */, + D5B50F5E14CFF66F005F7284 /* StoneSlabTile.h */, + D5B50F5F14CFF66F005F7284 /* StoneTile.h */, + D5B50F6014CFF66F005F7284 /* Tile.cpp */, + D5B50F6114CFF66F005F7284 /* Tile.h */, + D5B50F6214CFF66F005F7284 /* TileInclude.h */, + D5B50F6314CFF66F005F7284 /* TntTile.h */, + D5B50F6414CFF66F005F7284 /* TopSnowTile.h */, + D5B50F6514CFF66F005F7284 /* TorchTile.h */, + D5B50F6614CFF66F005F7284 /* TransparentTile.h */, + D5B50F6714CFF66F005F7284 /* TreeTile.h */, + ); + path = tile; + sourceTree = ""; + }; + D5B50F4114CFF66F005F7284 /* entity */ = { + isa = PBXGroup; + children = ( + D5D381FA15A1A22E00B6C50E /* ChestTileEntity.h */, + D5D381FB15A1A22E00B6C50E /* TileEntityRendererId.h */, + D5D3821315A1A5D100B6C50E /* ChestTileEntity.cpp */, + D5D8C4911639301700FD35F0 /* NetherReactorTileEntity.cpp */, + D5D8C4921639301700FD35F0 /* NetherReactorTileEntity.h */, + D5D8C4931639301700FD35F0 /* SignTileEntity.cpp */, + D5D8C4941639301700FD35F0 /* SignTileEntity.h */, + D5951EE5159349100043A12A /* FurnaceTileEntity.cpp */, + D5951EE6159349100043A12A /* FurnaceTileEntity.h */, + D5951EE7159349100043A12A /* TileEntity.cpp */, + D5B50F4214CFF66F005F7284 /* TileEntity.h */, + ); + path = entity; + sourceTree = ""; + }; + D5B50F6914CFF66F005F7284 /* phys */ = { + isa = PBXGroup; + children = ( + D5B50F6A14CFF66F005F7284 /* AABB.h */, + D5B50F6B14CFF66F005F7284 /* HitResult.cpp */, + D5B50F6C14CFF66F005F7284 /* HitResult.h */, + D5B50F6D14CFF66F005F7284 /* Vec3.h */, + ); + path = phys; + sourceTree = ""; + }; + D5BFCF111450BAD500A443B0 /* Fonts */ = { + isa = PBXGroup; + children = ( + D591200E1460041300AE2E58 /* minecraft.ttf */, + ); + name = Fonts; + sourceTree = ""; + }; + D5CF9C37144C225000E4244F = { + isa = PBXGroup; + children = ( + D5E1BA9A1451C8A0007DCC4F /* Default@2x.png */, + 9D959AFF16036BEE00E23A6F /* Default-568h@2x.png */, + D5F07744145EF79B00EC30FB /* Default-Landscape~ipad.png */, + D5F3B7E41454930400D25470 /* InAppSettings.bundle */, + D5E1BA981451C881007DCC4F /* Default.png */, + D5FA9A30144DB43500C449B2 /* Dialogs */, + D572D3AA144C69F100E67862 /* Resources */, + D5CF9C50144C225000E4244F /* Project */, + D5CF9C45144C225000E4244F /* Frameworks */, + D5CF9C43144C225000E4244F /* Products */, + D5B50C1614CFF66F005F7284 /* src */, + ); + sourceTree = ""; + }; + D5CF9C43144C225000E4244F /* Products */ = { + isa = PBXGroup; + children = ( + D5CF9C42144C225000E4244F /* minecraftpe.app */, + D58BB5B5146A0B920002C9F5 /* minecraftpe.demo.app */, + ); + name = Products; + sourceTree = ""; + }; + D5CF9C45144C225000E4244F /* Frameworks */ = { + isa = PBXGroup; + children = ( + D5F3B7A114548E7900D25470 /* InAppSettingsKit */, + D5F07738145EB1F300EC30FB /* AVFoundation.framework */, + D5F07736145DE04200EC30FB /* OpenAL.framework */, + D572D3DF144CB23200E67862 /* AudioToolbox.framework */, + D5CF9C46144C225000E4244F /* UIKit.framework */, + D5CF9C48144C225000E4244F /* Foundation.framework */, + D5CF9C4A144C225000E4244F /* CoreGraphics.framework */, + D5CF9C4C144C225000E4244F /* QuartzCore.framework */, + D5CF9C4E144C225000E4244F /* OpenGLES.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + D5CF9C50144C225000E4244F /* Project */ = { + isa = PBXGroup; + children = ( + D51DC74114592B8A00E3D761 /* PVRTexture.h */, + D51DC74214592B8A00E3D761 /* PVRTexture.m */, + D5CF9C59144C225000E4244F /* minecraftpeAppDelegate.h */, + D5CF9C5A144C225000E4244F /* minecraftpeAppDelegate.mm */, + D5CF9C5C144C225000E4244F /* MainWindow.xib */, + D5CF9C63144C225000E4244F /* EAGLView.h */, + D5CF9C64144C225000E4244F /* EAGLView.m */, + D5CF9C66144C225000E4244F /* minecraftpeViewController.h */, + D5CFA01C144C453900E4244F /* minecraftpeViewController.mm */, + D5CF9C69144C225000E4244F /* minecraftpeViewController.xib */, + D5CF9C51144C225000E4244F /* Supporting Files */, + 0419D9B8167F2A720080CB96 /* ShowKeyboardView.h */, + 0419D9B9167F2A720080CB96 /* ShowKeyboardView.mm */, + ); + name = Project; + path = minecraftpe; + sourceTree = ""; + }; + D5CF9C51144C225000E4244F /* Supporting Files */ = { + isa = PBXGroup; + children = ( + D51A8B01146A200000E5D720 /* minecraftpedemo-info.plist */, + D5CF9C52144C225000E4244F /* minecraftpe-Info.plist */, + D5CF9C53144C225000E4244F /* InfoPlist.strings */, + D5CF9C56144C225000E4244F /* main.mm */, + D5CF9C58144C225000E4244F /* minecraftpe-Prefix.pch */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + D5D381FE15A1A26000B6C50E /* tileentity */ = { + isa = PBXGroup; + children = ( + D5D8C4A9163932B900FD35F0 /* SignRenderer.cpp */, + D5D8C4AA163932B900FD35F0 /* SignRenderer.h */, + D5D381FF15A1A26000B6C50E /* ChestRenderer.cpp */, + D5D3820015A1A26000B6C50E /* ChestRenderer.h */, + D5D3820115A1A26000B6C50E /* TileEntityRenderDispatcher.cpp */, + D5D3820215A1A26000B6C50E /* TileEntityRenderDispatcher.h */, + D5D3820315A1A26000B6C50E /* TileEntityRenderer.cpp */, + D5D3820415A1A26000B6C50E /* TileEntityRenderer.h */, + ); + path = tileentity; + sourceTree = ""; + }; + D5D9617714E6AE0A001D1B9D /* icons */ = { + isa = PBXGroup; + children = ( + D5D961AC14E6AF0C001D1B9D /* Icon_lite.png */, + D5D961AD14E6AF0C001D1B9D /* Icon-72_lite.png */, + D5D961AE14E6AF0C001D1B9D /* Icon-72.png */, + D5D961AF14E6AF0C001D1B9D /* Icon-Small_lite.png */, + D5D961B014E6AF0C001D1B9D /* Icon-Small-50_lite.png */, + D5D961B114E6AF0C001D1B9D /* Icon-Small-50.png */, + D5D961B214E6AF0C001D1B9D /* Icon-Small.png */, + D5D961B314E6AF0C001D1B9D /* Icon-Small@2x_lite.png */, + D5D961B414E6AF0C001D1B9D /* Icon-Small@2x.png */, + D5D961B514E6AF0C001D1B9D /* Icon.png */, + D5D961B614E6AF0C001D1B9D /* Icon@2x_lite.png */, + D5D961B714E6AF0C001D1B9D /* Icon@2x.png */, + ); + path = icons; + sourceTree = ""; + }; + D5F0773A145EF5E100EC30FB /* ios */ = { + isa = PBXGroup; + children = ( + D5D9617714E6AE0A001D1B9D /* icons */, + D54954EB14E38FFC00685A35 /* dialog2 */, + D591200A145FEB8C00AE2E58 /* bg128.png */, + D5912008145FE9E600AE2E58 /* bg64.png */, + D5F0773B145EF5E100EC30FB /* dialog */, + ); + name = ios; + path = ../../data/app/ios; + sourceTree = ""; + }; + D5F0773B145EF5E100EC30FB /* dialog */ = { + isa = PBXGroup; + children = ( + D549552314E3EA0B00685A35 /* ipad */, + D5D43CCA146AFD9D002ED842 /* save_0_3.png */, + D5D43CCB146AFD9D002ED842 /* save_0.png */, + D5D43CCC146AFD9E002ED842 /* save_1_3.png */, + D5D43CCD146AFD9E002ED842 /* save_1.png */, + ); + path = dialog; + sourceTree = ""; + }; + D5F3B7A114548E7900D25470 /* InAppSettingsKit */ = { + isa = PBXGroup; + children = ( + D5F3B7A214548E7900D25470 /* Controllers */, + D5F3B7A914548E7900D25470 /* Models */, + D5F3B7B414548E7900D25470 /* Views */, + D5F3B7C314548E7900D25470 /* Xibs */, + ); + name = InAppSettingsKit; + path = ../lib_projects/InAppSettingsKit; + sourceTree = ""; + }; + D5F3B7A214548E7900D25470 /* Controllers */ = { + isa = PBXGroup; + children = ( + D5F3B7A314548E7900D25470 /* IASKAppSettingsViewController.h */, + D5F3B7A414548E7900D25470 /* IASKAppSettingsViewController.m */, + D5F3B7A514548E7900D25470 /* IASKAppSettingsWebViewController.h */, + D5F3B7A614548E7900D25470 /* IASKAppSettingsWebViewController.m */, + D5F3B7A714548E7900D25470 /* IASKSpecifierValuesViewController.h */, + D5F3B7A814548E7900D25470 /* IASKSpecifierValuesViewController.m */, + ); + path = Controllers; + sourceTree = ""; + }; + D5F3B7A914548E7900D25470 /* Models */ = { + isa = PBXGroup; + children = ( + D5F3B7AA14548E7900D25470 /* IASKSettingsReader.h */, + D5F3B7AB14548E7900D25470 /* IASKSettingsReader.m */, + D5F3B7AC14548E7900D25470 /* IASKSettingsStore.h */, + D5F3B7AD14548E7900D25470 /* IASKSettingsStore.m */, + D5F3B7AE14548E7900D25470 /* IASKSettingsStoreFile.h */, + D5F3B7AF14548E7900D25470 /* IASKSettingsStoreFile.m */, + D5F3B7B014548E7900D25470 /* IASKSettingsStoreUserDefaults.h */, + D5F3B7B114548E7900D25470 /* IASKSettingsStoreUserDefaults.m */, + D5F3B7B214548E7900D25470 /* IASKSpecifier.h */, + D5F3B7B314548E7900D25470 /* IASKSpecifier.m */, + ); + path = Models; + sourceTree = ""; + }; + D5F3B7B414548E7900D25470 /* Views */ = { + isa = PBXGroup; + children = ( + D5F3B7B514548E7900D25470 /* IASKPSSliderSpecifierViewCell.h */, + D5F3B7B614548E7900D25470 /* IASKPSSliderSpecifierViewCell.m */, + D5F3B7B714548E7900D25470 /* IASKPSTextFieldSpecifierViewCell.h */, + D5F3B7B814548E7900D25470 /* IASKPSTextFieldSpecifierViewCell.m */, + D5F3B7B914548E7900D25470 /* IASKPSTitleValueSpecifierViewCell.h */, + D5F3B7BA14548E7900D25470 /* IASKPSTitleValueSpecifierViewCell.m */, + D5F3B7BB14548E7900D25470 /* IASKPSToggleSwitchSpecifierViewCell.h */, + D5F3B7BC14548E7900D25470 /* IASKPSToggleSwitchSpecifierViewCell.m */, + D5F3B7BD14548E7900D25470 /* IASKSlider.h */, + D5F3B7BE14548E7900D25470 /* IASKSlider.m */, + D5F3B7BF14548E7900D25470 /* IASKSwitch.h */, + D5F3B7C014548E7900D25470 /* IASKSwitch.m */, + D5F3B7C114548E7900D25470 /* IASKTextField.h */, + D5F3B7C214548E7900D25470 /* IASKTextField.m */, + ); + path = Views; + sourceTree = ""; + }; + D5F3B7C314548E7900D25470 /* Xibs */ = { + isa = PBXGroup; + children = ( + D5F3B7C414548E7900D25470 /* IASKAppSettingsView.xib */, + D5F3B7C514548E7900D25470 /* IASKAppSettingsWebView.xib */, + D5F3B7C614548E7900D25470 /* IASKPSSliderSpecifierViewCell.xib */, + D5F3B7C714548E7900D25470 /* IASKPSTextFieldSpecifierViewCell.xib */, + D5F3B7C814548E7900D25470 /* IASKPSToggleSwitchSpecifierViewCell.xib */, + D5F3B7C914548E7900D25470 /* IASKSpecifierValuesView.xib */, + ); + path = Xibs; + sourceTree = ""; + }; + D5FA9A30144DB43500C449B2 /* Dialogs */ = { + isa = PBXGroup; + children = ( + D593325416077BBB00E26FC5 /* RenameMPWorld_iphone5.xib */, + D5D43CC0146AF4B4002ED842 /* RenameMPWorld_ipad.xib */, + D5D43CC1146AF4B4002ED842 /* RenameMPWorld_iphone.xib */, + D5D43CC2146AF4B4002ED842 /* RenameMPWorldViewController.h */, + D5D43CC3146AF4B4002ED842 /* RenameMPWorldViewController.mm */, + D593755014611CF200543145 /* CreateNewWorld_iphone5.xib */, + D5BFCF1A14513FF400A443B0 /* CreateNewWorld_ipad.xib */, + 9D293CE616071C08000305C8 /* CreateNewWorld_iphone.xib */, + D5A55E4714500EDE00A7571B /* CreateNewWorldViewController.h */, + D5A55E4814500EDE00A7571B /* CreateNewWorldViewController.mm */, + D5A55E4A1450353800A7571B /* IDialog.h */, + D5A55E4B145036AE00A7571B /* BaseDialogController.h */, + D5A55E4C145036AE00A7571B /* BaseDialogController.mm */, + ); + name = Dialogs; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + D58BB46C146A0B910002C9F5 /* minecraftpe.demo */ = { + isa = PBXNativeTarget; + buildConfigurationList = D58BB5B2146A0B920002C9F5 /* Build configuration list for PBXNativeTarget "minecraftpe.demo" */; + buildPhases = ( + D58BB46D146A0B910002C9F5 /* Sources */, + D58BB552146A0B920002C9F5 /* Frameworks */, + D58BB55B146A0B920002C9F5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = minecraftpe.demo; + productName = minecraftpe; + productReference = D58BB5B5146A0B920002C9F5 /* minecraftpe.demo.app */; + productType = "com.apple.product-type.application"; + }; + D5CF9C41144C225000E4244F /* minecraftpe */ = { + isa = PBXNativeTarget; + buildConfigurationList = D5CF9C6E144C225000E4244F /* Build configuration list for PBXNativeTarget "minecraftpe" */; + buildPhases = ( + D5CF9C3E144C225000E4244F /* Sources */, + D5CF9C3F144C225000E4244F /* Frameworks */, + D5CF9C40144C225000E4244F /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = minecraftpe; + productName = minecraftpe; + productReference = D5CF9C42144C225000E4244F /* minecraftpe.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D5CF9C39144C225000E4244F /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0420; + }; + buildConfigurationList = D5CF9C3C144C225000E4244F /* Build configuration list for PBXProject "minecraftpe" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = D5CF9C37144C225000E4244F; + productRefGroup = D5CF9C43144C225000E4244F /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D5CF9C41144C225000E4244F /* minecraftpe */, + D58BB46C146A0B910002C9F5 /* minecraftpe.demo */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + D58BB55B146A0B920002C9F5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D58BB55C146A0B920002C9F5 /* InfoPlist.strings in Resources */, + D58BB55D146A0B920002C9F5 /* MainWindow.xib in Resources */, + D58BB55E146A0B920002C9F5 /* minecraftpeViewController.xib in Resources */, + D58BB57A146A0B920002C9F5 /* default8.png in Resources */, + D58BB57B146A0B920002C9F5 /* background.png in Resources */, + D58BB57E146A0B920002C9F5 /* default_world.png in Resources */, + D58BB581146A0B920002C9F5 /* gui.png in Resources */, + D58BB582146A0B920002C9F5 /* gui_blocks.png in Resources */, + D58BB583146A0B920002C9F5 /* icons.png in Resources */, + D58BB584146A0B920002C9F5 /* items.png in Resources */, + D58BB58A146A0B920002C9F5 /* title.png in Resources */, + D58BB58B146A0B920002C9F5 /* touchgui.png in Resources */, + D58BB58C146A0B920002C9F5 /* camera.png in Resources */, + D58BB58D146A0B920002C9F5 /* char.png in Resources */, + D58BB58E146A0B920002C9F5 /* particles.png in Resources */, + D58BB58F146A0B920002C9F5 /* terrain.png in Resources */, + D58BB590146A0B920002C9F5 /* bg32.png in Resources */, + D58BB591146A0B920002C9F5 /* CreateNewWorld_ipad.xib in Resources */, + D58BB592146A0B920002C9F5 /* Default@2x.png in Resources */, + D58BB593146A0B920002C9F5 /* Default.png in Resources */, + D58BB594146A0B920002C9F5 /* IASKAppSettingsView.xib in Resources */, + D58BB595146A0B920002C9F5 /* IASKAppSettingsWebView.xib in Resources */, + D58BB596146A0B920002C9F5 /* IASKPSSliderSpecifierViewCell.xib in Resources */, + D58BB597146A0B920002C9F5 /* IASKPSTextFieldSpecifierViewCell.xib in Resources */, + D58BB598146A0B920002C9F5 /* IASKPSToggleSwitchSpecifierViewCell.xib in Resources */, + D58BB599146A0B920002C9F5 /* IASKSpecifierValuesView.xib in Resources */, + D58BB59A146A0B920002C9F5 /* InAppSettings.bundle in Resources */, + D58BB59B146A0B920002C9F5 /* itemframe.png in Resources */, + D58BB59C146A0B920002C9F5 /* terrain.pvr in Resources */, + D58BB59D146A0B920002C9F5 /* terrain.pvrtc in Resources */, + D58BB59E146A0B920002C9F5 /* terrain.pvr4 in Resources */, + D58BB5A3146A0B920002C9F5 /* Default-Landscape~ipad.png in Resources */, + D58BB5A8146A0B920002C9F5 /* bg64.png in Resources */, + D58BB5A9146A0B920002C9F5 /* bg128.png in Resources */, + D58BB5AA146A0B920002C9F5 /* minecraft.ttf in Resources */, + D58BB5AB146A0B920002C9F5 /* CreateNewWorld_iphone5.xib in Resources */, + D5D43CC5146AF4B4002ED842 /* RenameMPWorld_ipad.xib in Resources */, + D5D43CC7146AF4B4002ED842 /* RenameMPWorld_iphone.xib in Resources */, + D5D43CCF146AFD9E002ED842 /* save_0_3.png in Resources */, + D5D43CD1146AFD9E002ED842 /* save_0.png in Resources */, + D5D43CD3146AFD9E002ED842 /* save_1_3.png in Resources */, + D5D43CD5146AFD9E002ED842 /* save_1.png in Resources */, + D5B50A5014CFF492005F7284 /* chicken.png in Resources */, + D5B50A5214CFF492005F7284 /* cow.png in Resources */, + D5B50A5414CFF492005F7284 /* creeper.png in Resources */, + D5B50A5614CFF492005F7284 /* pig.png in Resources */, + D5B50A5814CFF492005F7284 /* sheep_fur.png in Resources */, + D5B50A5A14CFF492005F7284 /* sheep.png in Resources */, + D5B50A5C14CFF492005F7284 /* skeleton.png in Resources */, + D5B50A5E14CFF492005F7284 /* spider.png in Resources */, + D5B50A6014CFF492005F7284 /* zombie.png in Resources */, + D54954F914E38FFC00685A35 /* cancel_0_1.png in Resources */, + D54954FB14E38FFC00685A35 /* cancel_0_3.png in Resources */, + D54954FD14E38FFC00685A35 /* cancel_1_1.png in Resources */, + D54954FF14E38FFC00685A35 /* cancel_1_3.png in Resources */, + D549550114E38FFC00685A35 /* create_0_1.png in Resources */, + D549550314E38FFC00685A35 /* create_0_3.png in Resources */, + D549550514E38FFC00685A35 /* create_1_1.png in Resources */, + D549550714E38FFC00685A35 /* create_1_3.png in Resources */, + D549550914E38FFC00685A35 /* creative_0_3.png in Resources */, + D549550B14E38FFC00685A35 /* survival_0_3.png in Resources */, + D549550D14E38FFC00685A35 /* worldname.png in Resources */, + D549550F14E38FFC00685A35 /* worldname_3.png in Resources */, + D549551614E3D86D00685A35 /* worldname_ipad_3.png in Resources */, + D549551814E3D86D00685A35 /* worldname_ipad.png in Resources */, + D549551A14E3D86D00685A35 /* worldname_iphone_3.png in Resources */, + D549551C14E3D86D00685A35 /* worldname_iphone.png in Resources */, + D549552014E3DC4400685A35 /* creative_1_3.png in Resources */, + D549552214E3DC4400685A35 /* survival_1_3.png in Resources */, + D549552E14E3EA0B00685A35 /* cancel_0_4.png in Resources */, + D549553014E3EA0B00685A35 /* cancel_1_4.png in Resources */, + D549553214E3EA0B00685A35 /* create_0_4.png in Resources */, + D549553414E3EA0B00685A35 /* create_1_4.png in Resources */, + D549553614E3EA0B00685A35 /* creative_1_4.png in Resources */, + D549553A14E3EA0B00685A35 /* survival_1_4.png in Resources */, + D549553E14E3EA0B00685A35 /* worldname_ipad_4.png in Resources */, + D549554214E3EAC100685A35 /* creative_0_4.png in Resources */, + D549554414E3EAC100685A35 /* survival_0_4.png in Resources */, + D5D961B914E6AF0C001D1B9D /* Icon_lite.png in Resources */, + D5D961BB14E6AF0C001D1B9D /* Icon-72_lite.png in Resources */, + D5D961BD14E6AF0C001D1B9D /* Icon-72.png in Resources */, + D5D961BF14E6AF0C001D1B9D /* Icon-Small_lite.png in Resources */, + D5D961C114E6AF0C001D1B9D /* Icon-Small-50_lite.png in Resources */, + D5D961C314E6AF0C001D1B9D /* Icon-Small-50.png in Resources */, + D5D961C514E6AF0C001D1B9D /* Icon-Small.png in Resources */, + D5D961C714E6AF0C001D1B9D /* Icon-Small@2x_lite.png in Resources */, + D5D961C914E6AF0C001D1B9D /* Icon-Small@2x.png in Resources */, + D5D961CB14E6AF0C001D1B9D /* Icon.png in Resources */, + D5D961CD14E6AF0C001D1B9D /* Icon@2x_lite.png in Resources */, + D5D961CF14E6AF0C001D1B9D /* Icon@2x.png in Resources */, + D5251DBC1538192700FC82C8 /* CMakeLists.txt in Resources */, + D5251E7115381D0500FC82C8 /* spritesheet.png in Resources */, + D5251E75153823DC00FC82C8 /* en_US.lang in Resources */, + D5ACF1E215C03DBF00E21C22 /* fallbig1.m4a in Resources */, + D5ACF1E415C03DBF00E21C22 /* fallbig2.m4a in Resources */, + D5ACF1E615C03DBF00E21C22 /* fallsmall.m4a in Resources */, + D5ACF1E815C03DBF00E21C22 /* chicken1.m4a in Resources */, + D5ACF1EA15C03DBF00E21C22 /* chicken2.m4a in Resources */, + D5ACF1EC15C03DBF00E21C22 /* chicken3.m4a in Resources */, + D5ACF1EE15C03DBF00E21C22 /* chickenhurt1.m4a in Resources */, + D5ACF1F015C03DBF00E21C22 /* chickenhurt2.m4a in Resources */, + D5ACF1F215C03DBF00E21C22 /* chickenplop.m4a in Resources */, + D5ACF1F415C03DBF00E21C22 /* cow1.m4a in Resources */, + D5ACF1F615C03DBF00E21C22 /* cow2.m4a in Resources */, + D5ACF1F815C03DBF00E21C22 /* cow3.m4a in Resources */, + D5ACF1FA15C03DBF00E21C22 /* cow4.m4a in Resources */, + D5ACF1FC15C03DBF00E21C22 /* cowhurt1.m4a in Resources */, + D5ACF1FE15C03DBF00E21C22 /* cowhurt2.m4a in Resources */, + D5ACF20015C03DBF00E21C22 /* cowhurt3.m4a in Resources */, + D5ACF20215C03DBF00E21C22 /* pig1.m4a in Resources */, + D5ACF20415C03DBF00E21C22 /* pig2.m4a in Resources */, + D5ACF20615C03DBF00E21C22 /* pig3.m4a in Resources */, + D5ACF20815C03DBF00E21C22 /* pigdeath.m4a in Resources */, + D5ACF20A15C03DBF00E21C22 /* sheep1.m4a in Resources */, + D5ACF20C15C03DBF00E21C22 /* sheep2.m4a in Resources */, + D5ACF20E15C03DBF00E21C22 /* sheep3.m4a in Resources */, + D5ACF21015C03DBF00E21C22 /* skeleton1.m4a in Resources */, + D5ACF21215C03DBF00E21C22 /* skeleton2.m4a in Resources */, + D5ACF21415C03DBF00E21C22 /* skeleton3.m4a in Resources */, + D5ACF21615C03DBF00E21C22 /* skeletonhurt1.m4a in Resources */, + D5ACF21815C03DBF00E21C22 /* skeletonhurt2.m4a in Resources */, + D5ACF21A15C03DBF00E21C22 /* skeletonhurt3.m4a in Resources */, + D5ACF21C15C03DBF00E21C22 /* skeletonhurt4.m4a in Resources */, + D5ACF21E15C03DBF00E21C22 /* spider1.m4a in Resources */, + D5ACF22015C03DBF00E21C22 /* spider2.m4a in Resources */, + D5ACF22215C03DBF00E21C22 /* spider3.m4a in Resources */, + D5ACF22415C03DBF00E21C22 /* spider4.m4a in Resources */, + D5ACF22615C03DBF00E21C22 /* zombie1.m4a in Resources */, + D5ACF22815C03DBF00E21C22 /* zombie2.m4a in Resources */, + D5ACF22A15C03DBF00E21C22 /* zombie3.m4a in Resources */, + D5ACF22C15C03DBF00E21C22 /* zombiedeath.m4a in Resources */, + D5ACF22E15C03DBF00E21C22 /* zombiehurt1.m4a in Resources */, + D5ACF23015C03DBF00E21C22 /* zombiehurt2.m4a in Resources */, + D5ACF23215C03DBF00E21C22 /* bow.m4a in Resources */, + D5ACF23415C03DBF00E21C22 /* bowhit1.m4a in Resources */, + D5ACF23615C03DBF00E21C22 /* bowhit2.m4a in Resources */, + D5ACF23815C03DBF00E21C22 /* bowhit3.m4a in Resources */, + D5ACF23A15C03DBF00E21C22 /* bowhit4.m4a in Resources */, + D5ACF23C15C03DBF00E21C22 /* click.m4a in Resources */, + D5ACF23E15C03DBF00E21C22 /* door_close.m4a in Resources */, + D5ACF24015C03DBF00E21C22 /* door_open.m4a in Resources */, + D5ACF24215C03DBF00E21C22 /* glass1.m4a in Resources */, + D5ACF24415C03DBF00E21C22 /* glass2.m4a in Resources */, + D5ACF24615C03DBF00E21C22 /* glass3.m4a in Resources */, + D5ACF24815C03DBF00E21C22 /* hurt.m4a in Resources */, + D5ACF24A15C03DBF00E21C22 /* pop.m4a in Resources */, + D5ACF24C15C03DBF00E21C22 /* splash.m4a in Resources */, + D5ACF24E15C03DBF00E21C22 /* water.m4a in Resources */, + D5ACF25015C03DBF00E21C22 /* cloth1.m4a in Resources */, + D5ACF25215C03DBF00E21C22 /* cloth2.m4a in Resources */, + D5ACF25415C03DBF00E21C22 /* cloth3.m4a in Resources */, + D5ACF25615C03DBF00E21C22 /* cloth4.m4a in Resources */, + D5ACF25815C03DBF00E21C22 /* grass1.m4a in Resources */, + D5ACF25A15C03DBF00E21C22 /* grass2.m4a in Resources */, + D5ACF25C15C03DBF00E21C22 /* grass3.m4a in Resources */, + D5ACF25E15C03DBF00E21C22 /* grass4.m4a in Resources */, + D5ACF26015C03DBF00E21C22 /* gravel2.m4a in Resources */, + D5ACF26215C03DBF00E21C22 /* gravel3.m4a in Resources */, + D5ACF26415C03DBF00E21C22 /* gravel4.m4a in Resources */, + D5ACF26615C03DBF00E21C22 /* ladder1.m4a in Resources */, + D5ACF26815C03DBF00E21C22 /* ladder2.m4a in Resources */, + D5ACF26A15C03DBF00E21C22 /* ladder3.m4a in Resources */, + D5ACF26C15C03DBF00E21C22 /* ladder4.m4a in Resources */, + D5ACF26E15C03DBF00E21C22 /* sand1.m4a in Resources */, + D5ACF27015C03DBF00E21C22 /* sand2.m4a in Resources */, + D5ACF27215C03DBF00E21C22 /* sand3.m4a in Resources */, + D5ACF27415C03DBF00E21C22 /* sand4.m4a in Resources */, + D5ACF27615C03DBF00E21C22 /* snow1.m4a in Resources */, + D5ACF27815C03DBF00E21C22 /* snow2.m4a in Resources */, + D5ACF27A15C03DBF00E21C22 /* snow3.m4a in Resources */, + D5ACF27C15C03DBF00E21C22 /* snow4.m4a in Resources */, + D5ACF27E15C03DBF00E21C22 /* stone1.m4a in Resources */, + D5ACF28015C03DBF00E21C22 /* stone2.m4a in Resources */, + D5ACF28215C03DBF00E21C22 /* stone3.m4a in Resources */, + D5ACF28415C03DBF00E21C22 /* stone4.m4a in Resources */, + D5ACF28615C03DBF00E21C22 /* wood1.m4a in Resources */, + D5ACF28815C03DBF00E21C22 /* wood2.m4a in Resources */, + D5ACF28A15C03DBF00E21C22 /* wood3.m4a in Resources */, + D5ACF28C15C03DBF00E21C22 /* wood4.m4a in Resources */, + D5ACF28F15C03E8800E21C22 /* arrows.png in Resources */, + D5B26C2415E3CE51003785EA /* creeper1.m4a in Resources */, + D5B26C2615E3CE51003785EA /* creeper2.m4a in Resources */, + D5B26C2815E3CE51003785EA /* creeper3.m4a in Resources */, + D5B26C2A15E3CE51003785EA /* creeper4.m4a in Resources */, + D5B26C2C15E3CE51003785EA /* creeperdeath.m4a in Resources */, + D5B26C2E15E3CE51003785EA /* spiderdeath.m4a in Resources */, + D5B26C3415E3CED3003785EA /* eat1.m4a in Resources */, + D5B26C3615E3CED3003785EA /* eat2.m4a in Resources */, + D5B26C3815E3CED3003785EA /* eat3.m4a in Resources */, + D5B26C3A15E3CED3003785EA /* fuse.m4a in Resources */, + 9D293CE816071C08000305C8 /* CreateNewWorld_iphone.xib in Resources */, + 9D293CEC160720D6000305C8 /* worldname_iphone5_3.png in Resources */, + D593325616077BBB00E26FC5 /* RenameMPWorld_iphone5.xib in Resources */, + D598BD6E163ED06400A36438 /* explode.m4a in Resources */, + D598BD7B163ED09800A36438 /* zpig1.m4a in Resources */, + D598BD7D163ED09800A36438 /* zpig2.m4a in Resources */, + D598BD7F163ED09800A36438 /* zpig3.m4a in Resources */, + D598BD81163ED09800A36438 /* zpig4.m4a in Resources */, + D598BD83163ED09800A36438 /* zpigangry1.m4a in Resources */, + D598BD85163ED09800A36438 /* zpigangry2.m4a in Resources */, + D598BD87163ED09800A36438 /* zpigangry3.m4a in Resources */, + D598BD89163ED09800A36438 /* zpigangry4.m4a in Resources */, + D598BD8B163ED09800A36438 /* zpigdeath.m4a in Resources */, + D598BD8D163ED09800A36438 /* zpighurt1.m4a in Resources */, + D598BD8F163ED09800A36438 /* zpighurt2.m4a in Resources */, + D598BD92163ED0DB00A36438 /* sign.png in Resources */, + D598BD95163ED14000A36438 /* pigzombie.png in Resources */, + D598BD99163ED26500A36438 /* kz.png in Resources */, + D598BD9E164157D500A36438 /* minecon140.png in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D5CF9C40144C225000E4244F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D506D3E2161288BD0099FA65 /* Default-568h@2x.png in Resources */, + D5CF9C55144C225000E4244F /* InfoPlist.strings in Resources */, + D5CF9C5E144C225000E4244F /* MainWindow.xib in Resources */, + D5CF9C6B144C225000E4244F /* minecraftpeViewController.xib in Resources */, + D572D3C9144C6A1400E67862 /* default8.png in Resources */, + D572D3CA144C6A1400E67862 /* background.png in Resources */, + D572D3CD144C6A1400E67862 /* default_world.png in Resources */, + D572D3D0144C6A1400E67862 /* gui.png in Resources */, + D572D3D1144C6A1400E67862 /* gui_blocks.png in Resources */, + D572D3D2144C6A1400E67862 /* icons.png in Resources */, + D572D3D3144C6A1400E67862 /* items.png in Resources */, + D572D3D9144C6A1400E67862 /* title.png in Resources */, + D572D3DA144C6A1400E67862 /* touchgui.png in Resources */, + D572D3DB144C6A1400E67862 /* camera.png in Resources */, + D572D3DC144C6A1400E67862 /* char.png in Resources */, + D572D3DD144C6A1400E67862 /* particles.png in Resources */, + D572D3DE144C6A1400E67862 /* terrain.png in Resources */, + D5A55E4F1450761600A7571B /* bg32.png in Resources */, + D5BFCF1B14513FF400A443B0 /* CreateNewWorld_ipad.xib in Resources */, + D5E1BA9B1451C8A0007DCC4F /* Default@2x.png in Resources */, + D5E1BA9F1451CA2F007DCC4F /* Default.png in Resources */, + D5F3B7D914548E7900D25470 /* IASKAppSettingsView.xib in Resources */, + D5F3B7DA14548E7900D25470 /* IASKAppSettingsWebView.xib in Resources */, + D5F3B7DB14548E7900D25470 /* IASKPSSliderSpecifierViewCell.xib in Resources */, + D5F3B7DC14548E7900D25470 /* IASKPSTextFieldSpecifierViewCell.xib in Resources */, + D5F3B7DD14548E7900D25470 /* IASKPSToggleSwitchSpecifierViewCell.xib in Resources */, + D5F3B7DE14548E7900D25470 /* IASKSpecifierValuesView.xib in Resources */, + D5F3B7E51454930400D25470 /* InAppSettings.bundle in Resources */, + D51DC73614581D4E00E3D761 /* itemframe.png in Resources */, + D55B201814595370002D9366 /* terrain.pvr in Resources */, + D55B252B14598227002D9366 /* terrain.pvrtc in Resources */, + D5F0772314599DC700EC30FB /* terrain.pvr4 in Resources */, + D5F07745145EF7A000EC30FB /* Default-Landscape~ipad.png in Resources */, + D5912009145FE9E600AE2E58 /* bg64.png in Resources */, + D591200B145FEB8C00AE2E58 /* bg128.png in Resources */, + D591200F1460041300AE2E58 /* minecraft.ttf in Resources */, + D593755114611CF300543145 /* CreateNewWorld_iphone5.xib in Resources */, + D5D43CC4146AF4B4002ED842 /* RenameMPWorld_ipad.xib in Resources */, + D5D43CC6146AF4B4002ED842 /* RenameMPWorld_iphone.xib in Resources */, + D5D43CCE146AFD9E002ED842 /* save_0_3.png in Resources */, + D5D43CD0146AFD9E002ED842 /* save_0.png in Resources */, + D5D43CD2146AFD9E002ED842 /* save_1_3.png in Resources */, + D5D43CD4146AFD9E002ED842 /* save_1.png in Resources */, + D5B50A4F14CFF492005F7284 /* chicken.png in Resources */, + D5B50A5114CFF492005F7284 /* cow.png in Resources */, + D5B50A5314CFF492005F7284 /* creeper.png in Resources */, + D5B50A5514CFF492005F7284 /* pig.png in Resources */, + D5B50A5714CFF492005F7284 /* sheep_fur.png in Resources */, + D5B50A5914CFF492005F7284 /* sheep.png in Resources */, + D5B50A5B14CFF492005F7284 /* skeleton.png in Resources */, + D5B50A5D14CFF492005F7284 /* spider.png in Resources */, + D5B50A5F14CFF492005F7284 /* zombie.png in Resources */, + D54954F814E38FFC00685A35 /* cancel_0_1.png in Resources */, + D54954FA14E38FFC00685A35 /* cancel_0_3.png in Resources */, + D54954FC14E38FFC00685A35 /* cancel_1_1.png in Resources */, + D54954FE14E38FFC00685A35 /* cancel_1_3.png in Resources */, + D549550014E38FFC00685A35 /* create_0_1.png in Resources */, + D549550214E38FFC00685A35 /* create_0_3.png in Resources */, + D549550414E38FFC00685A35 /* create_1_1.png in Resources */, + D549550614E38FFC00685A35 /* create_1_3.png in Resources */, + D549550814E38FFC00685A35 /* creative_0_3.png in Resources */, + D549550A14E38FFC00685A35 /* survival_0_3.png in Resources */, + D549550C14E38FFC00685A35 /* worldname.png in Resources */, + D549550E14E38FFC00685A35 /* worldname_3.png in Resources */, + D549551514E3D86D00685A35 /* worldname_ipad_3.png in Resources */, + D549551714E3D86D00685A35 /* worldname_ipad.png in Resources */, + D549551914E3D86D00685A35 /* worldname_iphone_3.png in Resources */, + D549551B14E3D86D00685A35 /* worldname_iphone.png in Resources */, + D549551F14E3DC4400685A35 /* creative_1_3.png in Resources */, + D549552114E3DC4400685A35 /* survival_1_3.png in Resources */, + D549552D14E3EA0B00685A35 /* cancel_0_4.png in Resources */, + D549552F14E3EA0B00685A35 /* cancel_1_4.png in Resources */, + D549553114E3EA0B00685A35 /* create_0_4.png in Resources */, + D549553314E3EA0B00685A35 /* create_1_4.png in Resources */, + D549553514E3EA0B00685A35 /* creative_1_4.png in Resources */, + D549553914E3EA0B00685A35 /* survival_1_4.png in Resources */, + D549553D14E3EA0B00685A35 /* worldname_ipad_4.png in Resources */, + D549554114E3EAC100685A35 /* creative_0_4.png in Resources */, + D549554314E3EAC100685A35 /* survival_0_4.png in Resources */, + D5D961B814E6AF0C001D1B9D /* Icon_lite.png in Resources */, + D5D961BA14E6AF0C001D1B9D /* Icon-72_lite.png in Resources */, + D5D961BC14E6AF0C001D1B9D /* Icon-72.png in Resources */, + D5D961BE14E6AF0C001D1B9D /* Icon-Small_lite.png in Resources */, + D5D961C014E6AF0C001D1B9D /* Icon-Small-50_lite.png in Resources */, + D5D961C214E6AF0C001D1B9D /* Icon-Small-50.png in Resources */, + D5D961C414E6AF0C001D1B9D /* Icon-Small.png in Resources */, + D5D961C614E6AF0C001D1B9D /* Icon-Small@2x_lite.png in Resources */, + D5D961C814E6AF0C001D1B9D /* Icon-Small@2x.png in Resources */, + D5D961CA14E6AF0C001D1B9D /* Icon.png in Resources */, + D5D961CC14E6AF0C001D1B9D /* Icon@2x_lite.png in Resources */, + D5D961CE14E6AF0C001D1B9D /* Icon@2x.png in Resources */, + D5251DBB1538192700FC82C8 /* CMakeLists.txt in Resources */, + D5251E7015381D0500FC82C8 /* spritesheet.png in Resources */, + D5251E74153823DC00FC82C8 /* en_US.lang in Resources */, + D5ACF1E115C03DBF00E21C22 /* fallbig1.m4a in Resources */, + D5ACF1E315C03DBF00E21C22 /* fallbig2.m4a in Resources */, + D5ACF1E515C03DBF00E21C22 /* fallsmall.m4a in Resources */, + D5ACF1E715C03DBF00E21C22 /* chicken1.m4a in Resources */, + D5ACF1E915C03DBF00E21C22 /* chicken2.m4a in Resources */, + D5ACF1EB15C03DBF00E21C22 /* chicken3.m4a in Resources */, + D5ACF1ED15C03DBF00E21C22 /* chickenhurt1.m4a in Resources */, + D5ACF1EF15C03DBF00E21C22 /* chickenhurt2.m4a in Resources */, + D5ACF1F115C03DBF00E21C22 /* chickenplop.m4a in Resources */, + D5ACF1F315C03DBF00E21C22 /* cow1.m4a in Resources */, + D5ACF1F515C03DBF00E21C22 /* cow2.m4a in Resources */, + D5ACF1F715C03DBF00E21C22 /* cow3.m4a in Resources */, + D5ACF1F915C03DBF00E21C22 /* cow4.m4a in Resources */, + D5ACF1FB15C03DBF00E21C22 /* cowhurt1.m4a in Resources */, + D5ACF1FD15C03DBF00E21C22 /* cowhurt2.m4a in Resources */, + D5ACF1FF15C03DBF00E21C22 /* cowhurt3.m4a in Resources */, + D5ACF20115C03DBF00E21C22 /* pig1.m4a in Resources */, + D5ACF20315C03DBF00E21C22 /* pig2.m4a in Resources */, + D5ACF20515C03DBF00E21C22 /* pig3.m4a in Resources */, + D5ACF20715C03DBF00E21C22 /* pigdeath.m4a in Resources */, + D5ACF20915C03DBF00E21C22 /* sheep1.m4a in Resources */, + D5ACF20B15C03DBF00E21C22 /* sheep2.m4a in Resources */, + D5ACF20D15C03DBF00E21C22 /* sheep3.m4a in Resources */, + D5ACF20F15C03DBF00E21C22 /* skeleton1.m4a in Resources */, + D5ACF21115C03DBF00E21C22 /* skeleton2.m4a in Resources */, + D5ACF21315C03DBF00E21C22 /* skeleton3.m4a in Resources */, + D5ACF21515C03DBF00E21C22 /* skeletonhurt1.m4a in Resources */, + D5ACF21715C03DBF00E21C22 /* skeletonhurt2.m4a in Resources */, + D5ACF21915C03DBF00E21C22 /* skeletonhurt3.m4a in Resources */, + D5ACF21B15C03DBF00E21C22 /* skeletonhurt4.m4a in Resources */, + D5ACF21D15C03DBF00E21C22 /* spider1.m4a in Resources */, + D5ACF21F15C03DBF00E21C22 /* spider2.m4a in Resources */, + D5ACF22115C03DBF00E21C22 /* spider3.m4a in Resources */, + D5ACF22315C03DBF00E21C22 /* spider4.m4a in Resources */, + D5ACF22515C03DBF00E21C22 /* zombie1.m4a in Resources */, + D5ACF22715C03DBF00E21C22 /* zombie2.m4a in Resources */, + D5ACF22915C03DBF00E21C22 /* zombie3.m4a in Resources */, + D5ACF22B15C03DBF00E21C22 /* zombiedeath.m4a in Resources */, + D5ACF22D15C03DBF00E21C22 /* zombiehurt1.m4a in Resources */, + D5ACF22F15C03DBF00E21C22 /* zombiehurt2.m4a in Resources */, + D5ACF23115C03DBF00E21C22 /* bow.m4a in Resources */, + D5ACF23315C03DBF00E21C22 /* bowhit1.m4a in Resources */, + D5ACF23515C03DBF00E21C22 /* bowhit2.m4a in Resources */, + D5ACF23715C03DBF00E21C22 /* bowhit3.m4a in Resources */, + D5ACF23915C03DBF00E21C22 /* bowhit4.m4a in Resources */, + D5ACF23B15C03DBF00E21C22 /* click.m4a in Resources */, + D5ACF23D15C03DBF00E21C22 /* door_close.m4a in Resources */, + D5ACF23F15C03DBF00E21C22 /* door_open.m4a in Resources */, + D5ACF24115C03DBF00E21C22 /* glass1.m4a in Resources */, + D5ACF24315C03DBF00E21C22 /* glass2.m4a in Resources */, + D5ACF24515C03DBF00E21C22 /* glass3.m4a in Resources */, + D5ACF24715C03DBF00E21C22 /* hurt.m4a in Resources */, + D5ACF24915C03DBF00E21C22 /* pop.m4a in Resources */, + D5ACF24B15C03DBF00E21C22 /* splash.m4a in Resources */, + D5ACF24D15C03DBF00E21C22 /* water.m4a in Resources */, + D5ACF24F15C03DBF00E21C22 /* cloth1.m4a in Resources */, + D5ACF25115C03DBF00E21C22 /* cloth2.m4a in Resources */, + D5ACF25315C03DBF00E21C22 /* cloth3.m4a in Resources */, + D5ACF25515C03DBF00E21C22 /* cloth4.m4a in Resources */, + D5ACF25715C03DBF00E21C22 /* grass1.m4a in Resources */, + D5ACF25915C03DBF00E21C22 /* grass2.m4a in Resources */, + D5ACF25B15C03DBF00E21C22 /* grass3.m4a in Resources */, + D5ACF25D15C03DBF00E21C22 /* grass4.m4a in Resources */, + D5ACF25F15C03DBF00E21C22 /* gravel2.m4a in Resources */, + D5ACF26115C03DBF00E21C22 /* gravel3.m4a in Resources */, + D5ACF26315C03DBF00E21C22 /* gravel4.m4a in Resources */, + D5ACF26515C03DBF00E21C22 /* ladder1.m4a in Resources */, + D5ACF26715C03DBF00E21C22 /* ladder2.m4a in Resources */, + D5ACF26915C03DBF00E21C22 /* ladder3.m4a in Resources */, + D5ACF26B15C03DBF00E21C22 /* ladder4.m4a in Resources */, + D5ACF26D15C03DBF00E21C22 /* sand1.m4a in Resources */, + D5ACF26F15C03DBF00E21C22 /* sand2.m4a in Resources */, + D5ACF27115C03DBF00E21C22 /* sand3.m4a in Resources */, + D5ACF27315C03DBF00E21C22 /* sand4.m4a in Resources */, + D5ACF27515C03DBF00E21C22 /* snow1.m4a in Resources */, + D5ACF27715C03DBF00E21C22 /* snow2.m4a in Resources */, + D5ACF27915C03DBF00E21C22 /* snow3.m4a in Resources */, + D5ACF27B15C03DBF00E21C22 /* snow4.m4a in Resources */, + D5ACF27D15C03DBF00E21C22 /* stone1.m4a in Resources */, + D5ACF27F15C03DBF00E21C22 /* stone2.m4a in Resources */, + D5ACF28115C03DBF00E21C22 /* stone3.m4a in Resources */, + D5ACF28315C03DBF00E21C22 /* stone4.m4a in Resources */, + D5ACF28515C03DBF00E21C22 /* wood1.m4a in Resources */, + D5ACF28715C03DBF00E21C22 /* wood2.m4a in Resources */, + D5ACF28915C03DBF00E21C22 /* wood3.m4a in Resources */, + D5ACF28B15C03DBF00E21C22 /* wood4.m4a in Resources */, + D5ACF28E15C03E8800E21C22 /* arrows.png in Resources */, + D5B26C2315E3CE51003785EA /* creeper1.m4a in Resources */, + D5B26C2515E3CE51003785EA /* creeper2.m4a in Resources */, + D5B26C2715E3CE51003785EA /* creeper3.m4a in Resources */, + D5B26C2915E3CE51003785EA /* creeper4.m4a in Resources */, + D5B26C2B15E3CE51003785EA /* creeperdeath.m4a in Resources */, + D5B26C2D15E3CE51003785EA /* spiderdeath.m4a in Resources */, + D5B26C3315E3CED3003785EA /* eat1.m4a in Resources */, + D5B26C3515E3CED3003785EA /* eat2.m4a in Resources */, + D5B26C3715E3CED3003785EA /* eat3.m4a in Resources */, + D5B26C3915E3CED3003785EA /* fuse.m4a in Resources */, + 9D293CE716071C08000305C8 /* CreateNewWorld_iphone.xib in Resources */, + 9D293CEB160720D6000305C8 /* worldname_iphone5_3.png in Resources */, + D593325516077BBB00E26FC5 /* RenameMPWorld_iphone5.xib in Resources */, + D598BD6D163ED06400A36438 /* explode.m4a in Resources */, + D598BD7A163ED09800A36438 /* zpig1.m4a in Resources */, + D598BD7C163ED09800A36438 /* zpig2.m4a in Resources */, + D598BD7E163ED09800A36438 /* zpig3.m4a in Resources */, + D598BD80163ED09800A36438 /* zpig4.m4a in Resources */, + D598BD82163ED09800A36438 /* zpigangry1.m4a in Resources */, + D598BD84163ED09800A36438 /* zpigangry2.m4a in Resources */, + D598BD86163ED09800A36438 /* zpigangry3.m4a in Resources */, + D598BD88163ED09800A36438 /* zpigangry4.m4a in Resources */, + D598BD8A163ED09800A36438 /* zpigdeath.m4a in Resources */, + D598BD8C163ED09800A36438 /* zpighurt1.m4a in Resources */, + D598BD8E163ED09800A36438 /* zpighurt2.m4a in Resources */, + D598BD91163ED0DB00A36438 /* sign.png in Resources */, + D598BD94163ED14000A36438 /* pigzombie.png in Resources */, + D598BD98163ED26500A36438 /* kz.png in Resources */, + D598BD9D164157D500A36438 /* minecon140.png in Resources */, + 04004533169EE72E003EB6FA /* clouds.png in Resources */, + 0425EBA016A94D14000C7483 /* chain_1.png in Resources */, + 0425EBA116A94D14000C7483 /* chain_2.png in Resources */, + 0425EBA216A94D14000C7483 /* cloth_1.png in Resources */, + 0425EBA316A94D14000C7483 /* cloth_2.png in Resources */, + 0425EBA416A94D14000C7483 /* diamond_1.png in Resources */, + 0425EBA516A94D14000C7483 /* diamond_2.png in Resources */, + 0425EBA616A94D14000C7483 /* gold_1.png in Resources */, + 0425EBA716A94D14000C7483 /* gold_2.png in Resources */, + 0425EBA816A94D14000C7483 /* iron_1.png in Resources */, + 0425EBA916A94D14000C7483 /* iron_2.png in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + D58BB46D146A0B910002C9F5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D58BB46E146A0B910002C9F5 /* main.mm in Sources */, + D58BB46F146A0B910002C9F5 /* minecraftpeAppDelegate.mm in Sources */, + D58BB470146A0B910002C9F5 /* EAGLView.m in Sources */, + D58BB471146A0B910002C9F5 /* minecraftpeViewController.mm in Sources */, + D58BB53E146A0B910002C9F5 /* CreateNewWorldViewController.mm in Sources */, + D58BB53F146A0B910002C9F5 /* BaseDialogController.mm in Sources */, + D58BB540146A0B910002C9F5 /* IASKAppSettingsViewController.m in Sources */, + D58BB541146A0B910002C9F5 /* IASKAppSettingsWebViewController.m in Sources */, + D58BB542146A0B910002C9F5 /* IASKSpecifierValuesViewController.m in Sources */, + D58BB543146A0B910002C9F5 /* IASKSettingsReader.m in Sources */, + D58BB544146A0B910002C9F5 /* IASKSettingsStore.m in Sources */, + D58BB545146A0B910002C9F5 /* IASKSettingsStoreFile.m in Sources */, + D58BB546146A0B910002C9F5 /* IASKSettingsStoreUserDefaults.m in Sources */, + D58BB547146A0B910002C9F5 /* IASKSpecifier.m in Sources */, + D58BB548146A0B910002C9F5 /* IASKPSSliderSpecifierViewCell.m in Sources */, + D58BB549146A0B910002C9F5 /* IASKPSTextFieldSpecifierViewCell.m in Sources */, + D58BB54A146A0B910002C9F5 /* IASKPSTitleValueSpecifierViewCell.m in Sources */, + D58BB54B146A0B910002C9F5 /* IASKPSToggleSwitchSpecifierViewCell.m in Sources */, + D58BB54C146A0B910002C9F5 /* IASKSlider.m in Sources */, + D58BB54D146A0B910002C9F5 /* IASKSwitch.m in Sources */, + D58BB54E146A0B910002C9F5 /* IASKTextField.m in Sources */, + D58BB550146A0B910002C9F5 /* PVRTexture.m in Sources */, + D5D43CC9146AF4B4002ED842 /* RenameMPWorldViewController.mm in Sources */, + D5B50F7014CFF670005F7284 /* AppPlatform_iOS.mm in Sources */, + D5B50F7414CFF670005F7284 /* CreativeMode.cpp in Sources */, + D5B50F7614CFF670005F7284 /* GameMode.cpp in Sources */, + D5B50F7814CFF670005F7284 /* Button.cpp in Sources */, + D5B50F7A14CFF670005F7284 /* ImageButton.cpp in Sources */, + D5B50F7C14CFF670005F7284 /* LargeImageButton.cpp in Sources */, + D5B50F7E14CFF670005F7284 /* RolledSelectionListH.cpp in Sources */, + D5B50F8014CFF670005F7284 /* RolledSelectionListV.cpp in Sources */, + D5B50F8214CFF670005F7284 /* ScrolledSelectionList.cpp in Sources */, + D5B50F8414CFF670005F7284 /* SmallButton.cpp in Sources */, + D5B50F8614CFF670005F7284 /* Font.cpp in Sources */, + D5B50F8814CFF670005F7284 /* Gui.cpp in Sources */, + D5B50F8A14CFF670005F7284 /* GuiComponent.cpp in Sources */, + D5B50F8C14CFF670005F7284 /* Screen.cpp in Sources */, + D5B50F8E14CFF670005F7284 /* ChatScreen.cpp in Sources */, + D5B50F9014CFF670005F7284 /* ConfirmScreen.cpp in Sources */, + D5B50F9214CFF670005F7284 /* IngameBlockSelectionScreen.cpp in Sources */, + D5B50F9414CFF670005F7284 /* JoinGameScreen.cpp in Sources */, + D5B50F9614CFF670005F7284 /* OptionsScreen.cpp in Sources */, + D5B50F9814CFF670005F7284 /* PauseScreen.cpp in Sources */, + D5B50F9A14CFF670005F7284 /* ProgressScreen.cpp in Sources */, + D5B50F9C14CFF670005F7284 /* RenameMPLevelScreen.cpp in Sources */, + D5B50F9E14CFF670005F7284 /* ScreenChooser.cpp in Sources */, + D5B50FA014CFF670005F7284 /* SelectWorldScreen.cpp in Sources */, + D5B50FA214CFF670005F7284 /* StartMenuScreen.cpp in Sources */, + D5B50FA414CFF670005F7284 /* TouchIngameBlockSelectionScreen.cpp in Sources */, + D5B50FA614CFF670005F7284 /* TouchJoinGameScreen.cpp in Sources */, + D5B50FA814CFF670005F7284 /* TouchSelectWorldScreen.cpp in Sources */, + D5B50FAA14CFF670005F7284 /* TouchStartMenuScreen.cpp in Sources */, + D5B50FAC14CFF670005F7284 /* UploadPhotoScreen.cpp in Sources */, + D5B50FAE14CFF670005F7284 /* Minecraft.cpp in Sources */, + D5B50FB014CFF670005F7284 /* ChickenModel.cpp in Sources */, + D5B50FB214CFF670005F7284 /* CowModel.cpp in Sources */, + D5B50FB414CFF670005F7284 /* Cube.cpp in Sources */, + D5B50FB614CFF670005F7284 /* ModelPart.cpp in Sources */, + D5B50FB814CFF670005F7284 /* Polygon.cpp in Sources */, + D5B50FBA14CFF670005F7284 /* HumanoidModel.cpp in Sources */, + D5B50FBC14CFF670005F7284 /* PigModel.cpp in Sources */, + D5B50FBE14CFF670005F7284 /* QuadrupedModel.cpp in Sources */, + D5B50FC014CFF670005F7284 /* Options.cpp in Sources */, + D5B50FC214CFF670005F7284 /* OptionStrings.cpp in Sources */, + D5B50FC414CFF670005F7284 /* Particle.cpp in Sources */, + D5B50FC614CFF670005F7284 /* ParticleEngine.cpp in Sources */, + D5B50FC814CFF670005F7284 /* KeyboardInput.cpp in Sources */, + D5B50FCA14CFF670005F7284 /* TouchscreenInput.cpp in Sources */, + D5B50FCC14CFF670005F7284 /* LocalPlayer.cpp in Sources */, + D5B50FCE14CFF670005F7284 /* Chunk.cpp in Sources */, + D5B50FD014CFF670005F7284 /* Frustum.cpp in Sources */, + D5B50FD214CFF670005F7284 /* ChickenRenderer.cpp in Sources */, + D5B50FD414CFF670005F7284 /* EntityRenderDispatcher.cpp in Sources */, + D5B50FD614CFF670005F7284 /* EntityRenderer.cpp in Sources */, + D5B50FD814CFF670005F7284 /* HumanoidMobRenderer.cpp in Sources */, + D5B50FDA14CFF670005F7284 /* ItemRenderer.cpp in Sources */, + D5B50FDC14CFF670005F7284 /* ItemSpriteRenderer.cpp in Sources */, + D5B50FDE14CFF670005F7284 /* MobRenderer.cpp in Sources */, + D5B50FE014CFF670005F7284 /* TntRenderer.cpp in Sources */, + D5B50FE214CFF670005F7284 /* TripodCameraRenderer.cpp in Sources */, + D5B50FE414CFF670005F7284 /* GameRenderer.cpp in Sources */, + D5B50FE614CFF670005F7284 /* gles.cpp in Sources */, + D5B50FE814CFF670005F7284 /* ItemInHandRenderer.cpp in Sources */, + D5B50FEA14CFF670005F7284 /* LevelRenderer.cpp in Sources */, + D5B50FEC14CFF670005F7284 /* DynamicTexture.cpp in Sources */, + D5B50FEE14CFF670005F7284 /* RenderChunk.cpp in Sources */, + D5B50FF014CFF670005F7284 /* RenderList.cpp in Sources */, + D5B50FF214CFF670005F7284 /* Tesselator.cpp in Sources */, + D5B50FF414CFF670005F7284 /* Textures.cpp in Sources */, + D5B50FF614CFF670005F7284 /* TileRenderer.cpp in Sources */, + D5B5102E14CFF670005F7284 /* Sound.cpp in Sources */, + D5B5103014CFF670005F7284 /* main.cpp in Sources */, + D5B5103614CFF670005F7284 /* Tag.cpp in Sources */, + D5B5103814CFF670005F7284 /* ClientSideNetworkHandler.cpp in Sources */, + D5B5103A14CFF670005F7284 /* NetEventCallback.cpp in Sources */, + D5B5103C14CFF670005F7284 /* Packet.cpp in Sources */, + D5B5103E14CFF670005F7284 /* RakNetInstance.cpp in Sources */, + D5B5104014CFF670005F7284 /* ServerSideNetworkHandler.cpp in Sources */, + D5B5104214CFF670005F7284 /* NinecraftApp.cpp in Sources */, + D5B5104414CFF670005F7284 /* Performance.cpp in Sources */, + D5B5104814CFF670005F7284 /* SoundSystemAL.cpp in Sources */, + D5B5104C14CFF670005F7284 /* CThread.cpp in Sources */, + D5B5104E14CFF670005F7284 /* Controller.cpp in Sources */, + D5B5105014CFF670005F7284 /* Keyboard.cpp in Sources */, + D5B5105214CFF670005F7284 /* Mouse.cpp in Sources */, + D5B5105414CFF670005F7284 /* Multitouch.cpp in Sources */, + D5B5105614CFF670005F7284 /* time.cpp in Sources */, + D5B5110E14CFF670005F7284 /* DataIO.cpp in Sources */, + D5B5111014CFF670005F7284 /* Mth.cpp in Sources */, + D5B5111214CFF670005F7284 /* PerfRenderer.cpp in Sources */, + D5B5111414CFF670005F7284 /* PerfTimer.cpp in Sources */, + D5B5111614CFF670005F7284 /* StringUtils.cpp in Sources */, + D5B5111814CFF670005F7284 /* Direction.cpp in Sources */, + D5B5111A14CFF670005F7284 /* Animal.cpp in Sources */, + D5B5111C14CFF670005F7284 /* Chicken.cpp in Sources */, + D5B5111E14CFF670005F7284 /* Cow.cpp in Sources */, + D5B5112014CFF670005F7284 /* Pig.cpp in Sources */, + D5B5112214CFF670005F7284 /* Sheep.cpp in Sources */, + D5B5112414CFF670005F7284 /* WaterAnimal.cpp in Sources */, + D5B5112614CFF670005F7284 /* Entity.cpp in Sources */, + D5B5112814CFF670005F7284 /* FlyingMob.cpp in Sources */, + D5B5112A14CFF670005F7284 /* FallingTile.cpp in Sources */, + D5B5112C14CFF670005F7284 /* ItemEntity.cpp in Sources */, + D5B5112E14CFF670005F7284 /* PrimedTnt.cpp in Sources */, + D5B5113014CFF670005F7284 /* TripodCamera.cpp in Sources */, + D5B5113214CFF670005F7284 /* Mob.cpp in Sources */, + D5B5113414CFF670005F7284 /* MobCategory.cpp in Sources */, + D5B5113814CFF670005F7284 /* PathFinderMob.cpp in Sources */, + D5B5113A14CFF670005F7284 /* Inventory.cpp in Sources */, + D5B5113C14CFF670005F7284 /* Player.cpp in Sources */, + D5B5113E14CFF670005F7284 /* Arrow.cpp in Sources */, + D5B5114014CFF670005F7284 /* Recipes.cpp in Sources */, + D5B5114214CFF670005F7284 /* ToolRecipes.cpp in Sources */, + D5B5114414CFF670005F7284 /* WeaponRecipes.cpp in Sources */, + D5B5114614CFF670005F7284 /* HatchetItem.cpp in Sources */, + D5B5114814CFF670005F7284 /* Item.cpp in Sources */, + D5B5114A14CFF670005F7284 /* ItemInstance.cpp in Sources */, + D5B5114C14CFF670005F7284 /* PickaxeItem.cpp in Sources */, + D5B5114E14CFF670005F7284 /* ShovelItem.cpp in Sources */, + D5B5115014CFF670005F7284 /* Biome.cpp in Sources */, + D5B5115214CFF670005F7284 /* BiomeSource.cpp in Sources */, + D5B5115414CFF670005F7284 /* LevelChunk.cpp in Sources */, + D5B5115614CFF670005F7284 /* Dimension.cpp in Sources */, + D5B5115814CFF670005F7284 /* Explosion.cpp in Sources */, + D5B5115A14CFF670005F7284 /* Level.cpp in Sources */, + D5B5115C14CFF670005F7284 /* CanyonFeature.cpp in Sources */, + D5B5115E14CFF670005F7284 /* DungeonFeature.cpp in Sources */, + D5B5116014CFF670005F7284 /* LargeCaveFeature.cpp in Sources */, + D5B5116214CFF670005F7284 /* LargeFeature.cpp in Sources */, + D5B5116414CFF670005F7284 /* RandomLevelSource.cpp in Sources */, + D5B5116614CFF670005F7284 /* ImprovedNoise.cpp in Sources */, + D5B5116814CFF670005F7284 /* PerlinNoise.cpp in Sources */, + D5B5116A14CFF670005F7284 /* Synth.cpp in Sources */, + D5B5116C14CFF670005F7284 /* LightLayer.cpp in Sources */, + D5B5116E14CFF670005F7284 /* LightUpdate.cpp in Sources */, + D5B5117014CFF670005F7284 /* Material.cpp in Sources */, + D5B5117214CFF670005F7284 /* MobSpawner.cpp in Sources */, + D5B5117414CFF670005F7284 /* Region.cpp in Sources */, + D5B5117614CFF670005F7284 /* ExternalFileLevelStorage.cpp in Sources */, + D5B5117814CFF670005F7284 /* ExternalFileLevelStorageSource.cpp in Sources */, + D5B5117A14CFF670005F7284 /* RegionFile.cpp in Sources */, + D5B5117C14CFF670005F7284 /* TickNextTickData.cpp in Sources */, + D5B5117E14CFF670005F7284 /* DoorTile.cpp in Sources */, + D5B5118214CFF670005F7284 /* StoneSlabTile.cpp in Sources */, + D5B5118414CFF670005F7284 /* Tile.cpp in Sources */, + D5B5118614CFF670005F7284 /* HitResult.cpp in Sources */, + D5B5118C14D03342005F7284 /* SynchedEntityData.cpp in Sources */, + D5B5118F14DEA27F005F7284 /* DeathScreen.cpp in Sources */, + D5B5119214DEA2B7005F7284 /* LevelData.cpp in Sources */, + D5B5119514DEA2EF005F7284 /* DyePowderItem.cpp in Sources */, + D584926E14FD234400741128 /* SharedConstants.cpp in Sources */, + D584927414FD236700741128 /* MoveControl.cpp in Sources */, + D584928714FD240D00741128 /* IConfigListener.cpp in Sources */, + D584928A14FD2FAF00741128 /* Path.cpp in Sources */, + D5B86282153810BD00F3238A /* I18n.cpp in Sources */, + D5B862861538175500F3238A /* ScrollingPane.cpp in Sources */, + D5B862931538187400F3238A /* Recipe.cpp in Sources */, + D5B862951538187400F3238A /* StructureRecipes.cpp in Sources */, + D5251DAC1538192700FC82C8 /* _FindFirst.cpp in Sources */, + D5251DAE1538192700FC82C8 /* BitStream.cpp in Sources */, + D5251DB01538192700FC82C8 /* CCRakNetSlidingWindow.cpp in Sources */, + D5251DB21538192700FC82C8 /* CCRakNetUDT.cpp in Sources */, + D5251DB41538192700FC82C8 /* CheckSum.cpp in Sources */, + D5251DB61538192700FC82C8 /* CloudClient.cpp in Sources */, + D5251DB81538192700FC82C8 /* CloudCommon.cpp in Sources */, + D5251DBA1538192700FC82C8 /* CloudServer.cpp in Sources */, + D5251DBE1538192700FC82C8 /* CommandParserInterface.cpp in Sources */, + D5251DC01538192700FC82C8 /* ConnectionGraph2.cpp in Sources */, + D5251DC21538192700FC82C8 /* ConsoleServer.cpp in Sources */, + D5251DC41538192700FC82C8 /* DataCompressor.cpp in Sources */, + D5251DC61538192700FC82C8 /* DirectoryDeltaTransfer.cpp in Sources */, + D5251DC81538192700FC82C8 /* DS_BytePool.cpp in Sources */, + D5251DCA1538192700FC82C8 /* DS_ByteQueue.cpp in Sources */, + D5251DCC1538192700FC82C8 /* DS_HuffmanEncodingTree.cpp in Sources */, + D5251DCE1538192700FC82C8 /* DS_Table.cpp in Sources */, + D5251DD01538192700FC82C8 /* DynDNS.cpp in Sources */, + D5251DD21538192700FC82C8 /* EmailSender.cpp in Sources */, + D5251DD41538192700FC82C8 /* EncodeClassName.cpp in Sources */, + D5251DD61538192700FC82C8 /* EpochTimeToString.cpp in Sources */, + D5251DD81538192700FC82C8 /* FileList.cpp in Sources */, + D5251DDA1538192700FC82C8 /* FileListTransfer.cpp in Sources */, + D5251DDC1538192700FC82C8 /* FileOperations.cpp in Sources */, + D5251DDE1538192700FC82C8 /* FormatString.cpp in Sources */, + D5251DE01538192700FC82C8 /* FullyConnectedMesh2.cpp in Sources */, + D5251DE21538192700FC82C8 /* Getche.cpp in Sources */, + D5251DE41538192700FC82C8 /* Gets.cpp in Sources */, + D5251DE61538192700FC82C8 /* GetTime.cpp in Sources */, + D5251DE81538192700FC82C8 /* gettimeofday.cpp in Sources */, + D5251DEA1538192700FC82C8 /* GridSectorizer.cpp in Sources */, + D5251DEC1538192700FC82C8 /* HTTPConnection.cpp in Sources */, + D5251DEE1538192700FC82C8 /* IncrementalReadInterface.cpp in Sources */, + D5251DF01538192700FC82C8 /* Itoa.cpp in Sources */, + D5251DF21538192700FC82C8 /* LinuxStrings.cpp in Sources */, + D5251DF41538192700FC82C8 /* LocklessTypes.cpp in Sources */, + D5251DF61538192700FC82C8 /* LogCommandParser.cpp in Sources */, + D5251DF81538192700FC82C8 /* MessageFilter.cpp in Sources */, + D5251DFA1538192700FC82C8 /* NatPunchthroughClient.cpp in Sources */, + D5251DFC1538192700FC82C8 /* NatPunchthroughServer.cpp in Sources */, + D5251DFE1538192700FC82C8 /* NatTypeDetectionClient.cpp in Sources */, + D5251E001538192700FC82C8 /* NatTypeDetectionCommon.cpp in Sources */, + D5251E021538192700FC82C8 /* NatTypeDetectionServer.cpp in Sources */, + D5251E041538192700FC82C8 /* NetworkIDManager.cpp in Sources */, + D5251E061538192700FC82C8 /* NetworkIDObject.cpp in Sources */, + D5251E081538192700FC82C8 /* PacketConsoleLogger.cpp in Sources */, + D5251E0A1538192700FC82C8 /* PacketFileLogger.cpp in Sources */, + D5251E0C1538192700FC82C8 /* PacketizedTCP.cpp in Sources */, + D5251E0E1538192700FC82C8 /* PacketLogger.cpp in Sources */, + D5251E101538192700FC82C8 /* PacketOutputWindowLogger.cpp in Sources */, + D5251E121538192700FC82C8 /* PluginInterface2.cpp in Sources */, + D5251E141538192700FC82C8 /* Rackspace.cpp in Sources */, + D5251E161538192700FC82C8 /* RakMemoryOverride.cpp in Sources */, + D5251E1E1538192700FC82C8 /* RakNetCommandParser.cpp in Sources */, + D5251E201538192700FC82C8 /* RakNetSocket.cpp in Sources */, + D5251E221538192700FC82C8 /* RakNetStatistics.cpp in Sources */, + D5251E241538192700FC82C8 /* RakNetTransport2.cpp in Sources */, + D5251E261538192700FC82C8 /* RakNetTypes.cpp in Sources */, + D5251E281538192700FC82C8 /* RakPeer.cpp in Sources */, + D5251E2A1538192700FC82C8 /* RakSleep.cpp in Sources */, + D5251E2C1538192700FC82C8 /* RakString.cpp in Sources */, + D5251E2E1538192700FC82C8 /* RakThread.cpp in Sources */, + D5251E301538192700FC82C8 /* RakWString.cpp in Sources */, + D5251E321538192700FC82C8 /* Rand.cpp in Sources */, + D5251E341538192700FC82C8 /* rdlmalloc.cpp in Sources */, + D5251E361538192700FC82C8 /* ReadyEvent.cpp in Sources */, + D5251E381538192700FC82C8 /* ReliabilityLayer.cpp in Sources */, + D5251E3A1538192700FC82C8 /* ReplicaManager3.cpp in Sources */, + D5251E3C1538192700FC82C8 /* Router2.cpp in Sources */, + D5251E3E1538192700FC82C8 /* RPC4Plugin.cpp in Sources */, + D5251E401538192700FC82C8 /* SecureHandshake.cpp in Sources */, + D5251E421538192700FC82C8 /* SendToThread.cpp in Sources */, + D5251E441538192700FC82C8 /* SHA1.cpp in Sources */, + D5251E461538192700FC82C8 /* SignaledEvent.cpp in Sources */, + D5251E481538192700FC82C8 /* SimpleMutex.cpp in Sources */, + D5251E4A1538192700FC82C8 /* SocketLayer.cpp in Sources */, + D5251E4C1538192700FC82C8 /* StringCompressor.cpp in Sources */, + D5251E4E1538192700FC82C8 /* StringTable.cpp in Sources */, + D5251E501538192700FC82C8 /* SuperFastHash.cpp in Sources */, + D5251E521538192700FC82C8 /* TableSerializer.cpp in Sources */, + D5251E541538192700FC82C8 /* TCPInterface.cpp in Sources */, + D5251E561538192700FC82C8 /* TeamBalancer.cpp in Sources */, + D5251E581538192700FC82C8 /* TelnetTransport.cpp in Sources */, + D5251E5A1538192700FC82C8 /* ThreadsafePacketLogger.cpp in Sources */, + D5251E5C1538192700FC82C8 /* TwoWayAuthentication.cpp in Sources */, + D5251E5E1538192700FC82C8 /* UDPForwarder.cpp in Sources */, + D5251E601538192700FC82C8 /* UDPProxyClient.cpp in Sources */, + D5251E621538192700FC82C8 /* UDPProxyCoordinator.cpp in Sources */, + D5251E641538192700FC82C8 /* UDPProxyServer.cpp in Sources */, + D5251E661538192700FC82C8 /* VariableDeltaSerializer.cpp in Sources */, + D5251E681538192700FC82C8 /* VariableListDeltaTracker.cpp in Sources */, + D5251E6A1538192700FC82C8 /* VariadicSQLParser.cpp in Sources */, + D5251E6C1538192700FC82C8 /* VitaIncludes.cpp in Sources */, + D5251E6E1538192700FC82C8 /* WSAStartupSingleton.cpp in Sources */, + D5251E921539A9AF00FC82C8 /* SoundEngine.mm in Sources */, + D5951EC8159347EE0043A12A /* FurnaceRecipes.cpp in Sources */, + D5951ECA159347EE0043A12A /* OreRecipes.cpp in Sources */, + D5951EDC159348C50043A12A /* InventoryPane.cpp in Sources */, + D5951EDE159348C50043A12A /* ItemPane.cpp in Sources */, + D5951EE4159349000043A12A /* FurnaceTile.cpp in Sources */, + D5951EE9159349100043A12A /* FurnaceTileEntity.cpp in Sources */, + D5951EEB159349100043A12A /* TileEntity.cpp in Sources */, + D5951EEF159349680043A12A /* FurnaceScreen.cpp in Sources */, + D5951EF215934A2D0043A12A /* Feature.cpp in Sources */, + D5951EF815934AC50043A12A /* BaseContainerMenu.cpp in Sources */, + D5951EFA15934AC50043A12A /* FurnaceMenu.cpp in Sources */, + D5D381F315A1A1CF00B6C50E /* FillingContainer.cpp in Sources */, + D5D381F815A1A21800B6C50E /* EntityTile.cpp in Sources */, + D5D3820615A1A26000B6C50E /* ChestRenderer.cpp in Sources */, + D5D3820815A1A26000B6C50E /* TileEntityRenderDispatcher.cpp in Sources */, + D5D3820A15A1A26000B6C50E /* TileEntityRenderer.cpp in Sources */, + D5D3820E15A1A2A000B6C50E /* EntityTileRenderer.cpp in Sources */, + D5D3821215A1A2C200B6C50E /* ChestTile.cpp in Sources */, + D5D3821515A1A5D100B6C50E /* ChestTileEntity.cpp in Sources */, + D5A6F8D215B45E2600819B71 /* ChestScreen.cpp in Sources */, + D5A6F8D715B45EE500819B71 /* ContainerMenu.cpp in Sources */, + D5ACF15715C01F7D00E21C22 /* ArrowRenderer.cpp in Sources */, + D5ACF17915C0220D00E21C22 /* Creeper.cpp in Sources */, + D5ACF17B15C0220D00E21C22 /* Monster.cpp in Sources */, + D5ACF17D15C0220D00E21C22 /* Skeleton.cpp in Sources */, + D5ACF17F15C0220D00E21C22 /* Spider.cpp in Sources */, + D5ACF18115C0220D00E21C22 /* Zombie.cpp in Sources */, + D5ACF18515C022B500E21C22 /* EntityFactory.cpp in Sources */, + D54493F015D13BF0005FA9B0 /* BedTile.cpp in Sources */, + D54493F215D13BF0005FA9B0 /* CropTile.cpp in Sources */, + D54493F415D13BF0005FA9B0 /* GrassTile.cpp in Sources */, + D54493FA15D13C35005FA9B0 /* HoeItem.cpp in Sources */, + D54493FE15D13C59005FA9B0 /* BedItem.cpp in Sources */, + D544940915D13DB7005FA9B0 /* ServerLevel.cpp in Sources */, + D544940B15D13DB7005FA9B0 /* ServerPlayer.cpp in Sources */, + D544941115D13E27005FA9B0 /* SimpleFoodData.cpp in Sources */, + D544941415D13E5A005FA9B0 /* FolderMethods.cpp in Sources */, + D544941715D13EE3005FA9B0 /* LevelStorageSource.cpp in Sources */, + D544941B15D13F06005FA9B0 /* TallGrass.cpp in Sources */, + D544941F15D13F45005FA9B0 /* PlayerRenderer.cpp in Sources */, + D544942315D13F5E005FA9B0 /* RemotePlayer.cpp in Sources */, + D5B17ED615E226F50056E751 /* Throwable.cpp in Sources */, + D5B17EDA15E2273F0056E751 /* SurvivalMode.cpp in Sources */, + D5B17EDE15E227670056E751 /* TrapDoorTile.cpp in Sources */, + D5B17EE215E260910056E751 /* MoveFolder.mm in Sources */, + D5D8C48B16392FF000FD35F0 /* LightGemTile.cpp in Sources */, + D5D8C48D16392FF000FD35F0 /* Mushroom.cpp in Sources */, + D5D8C48F16392FF000FD35F0 /* StemTile.cpp in Sources */, + D5D8C4961639301700FD35F0 /* NetherReactorTileEntity.cpp in Sources */, + D5D8C4981639301700FD35F0 /* SignTileEntity.cpp in Sources */, + D5D8C49C1639305100FD35F0 /* PigZombie.cpp in Sources */, + D5D8C4A0163930D600FD35F0 /* MelonTile.cpp in Sources */, + D5D8C4A4163930E600FD35F0 /* NetherReactor.cpp in Sources */, + D5D8C4A8163931F000FD35F0 /* InBedScreen.cpp in Sources */, + D5D8C4AC163932B900FD35F0 /* SignRenderer.cpp in Sources */, + D5D8C4B0163932CF00FD35F0 /* PaintingRenderer.cpp in Sources */, + D5D8C4B61639335000FD35F0 /* HangingEntity.cpp in Sources */, + D5D8C4B81639335000FD35F0 /* Painting.cpp in Sources */, + D5D8C4C41639341100FD35F0 /* Motive.cpp in Sources */, + D5D8C4C8163934BB00FD35F0 /* HangingEntityItem.cpp in Sources */, + D5D8C4CC1639362F00FD35F0 /* NetherReactorPattern.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D5CF9C3E144C225000E4244F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D5CF9C57144C225000E4244F /* main.mm in Sources */, + D5CF9C5B144C225000E4244F /* minecraftpeAppDelegate.mm in Sources */, + D5CF9C65144C225000E4244F /* EAGLView.m in Sources */, + D5CFA01D144C453900E4244F /* minecraftpeViewController.mm in Sources */, + D5A55E4914500EDE00A7571B /* CreateNewWorldViewController.mm in Sources */, + D5A55E4D145036AE00A7571B /* BaseDialogController.mm in Sources */, + D5F3B7CA14548E7900D25470 /* IASKAppSettingsViewController.m in Sources */, + D5F3B7CB14548E7900D25470 /* IASKAppSettingsWebViewController.m in Sources */, + D5F3B7CC14548E7900D25470 /* IASKSpecifierValuesViewController.m in Sources */, + D5F3B7CD14548E7900D25470 /* IASKSettingsReader.m in Sources */, + D5F3B7CE14548E7900D25470 /* IASKSettingsStore.m in Sources */, + D5F3B7CF14548E7900D25470 /* IASKSettingsStoreFile.m in Sources */, + D5F3B7D014548E7900D25470 /* IASKSettingsStoreUserDefaults.m in Sources */, + D5F3B7D114548E7900D25470 /* IASKSpecifier.m in Sources */, + D5F3B7D214548E7900D25470 /* IASKPSSliderSpecifierViewCell.m in Sources */, + D5F3B7D314548E7900D25470 /* IASKPSTextFieldSpecifierViewCell.m in Sources */, + D5F3B7D414548E7900D25470 /* IASKPSTitleValueSpecifierViewCell.m in Sources */, + D5F3B7D514548E7900D25470 /* IASKPSToggleSwitchSpecifierViewCell.m in Sources */, + D5F3B7D614548E7900D25470 /* IASKSlider.m in Sources */, + D5F3B7D714548E7900D25470 /* IASKSwitch.m in Sources */, + D5F3B7D814548E7900D25470 /* IASKTextField.m in Sources */, + D51DC74314592B8B00E3D761 /* PVRTexture.m in Sources */, + D5D43CC8146AF4B4002ED842 /* RenameMPWorldViewController.mm in Sources */, + D5B50F6F14CFF670005F7284 /* AppPlatform_iOS.mm in Sources */, + D5B50F7314CFF670005F7284 /* CreativeMode.cpp in Sources */, + D5B50F7514CFF670005F7284 /* GameMode.cpp in Sources */, + D5B50F7714CFF670005F7284 /* Button.cpp in Sources */, + D5B50F7914CFF670005F7284 /* ImageButton.cpp in Sources */, + D5B50F7B14CFF670005F7284 /* LargeImageButton.cpp in Sources */, + D5B50F7D14CFF670005F7284 /* RolledSelectionListH.cpp in Sources */, + D5B50F7F14CFF670005F7284 /* RolledSelectionListV.cpp in Sources */, + D5B50F8114CFF670005F7284 /* ScrolledSelectionList.cpp in Sources */, + D5B50F8314CFF670005F7284 /* SmallButton.cpp in Sources */, + D5B50F8514CFF670005F7284 /* Font.cpp in Sources */, + D5B50F8714CFF670005F7284 /* Gui.cpp in Sources */, + D5B50F8914CFF670005F7284 /* GuiComponent.cpp in Sources */, + D5B50F8B14CFF670005F7284 /* Screen.cpp in Sources */, + D5B50F8D14CFF670005F7284 /* ChatScreen.cpp in Sources */, + D5B50F8F14CFF670005F7284 /* ConfirmScreen.cpp in Sources */, + D5B50F9114CFF670005F7284 /* IngameBlockSelectionScreen.cpp in Sources */, + D5B50F9314CFF670005F7284 /* JoinGameScreen.cpp in Sources */, + D5B50F9514CFF670005F7284 /* OptionsScreen.cpp in Sources */, + D5B50F9714CFF670005F7284 /* PauseScreen.cpp in Sources */, + D5B50F9914CFF670005F7284 /* ProgressScreen.cpp in Sources */, + D5B50F9B14CFF670005F7284 /* RenameMPLevelScreen.cpp in Sources */, + D5B50F9D14CFF670005F7284 /* ScreenChooser.cpp in Sources */, + D5B50F9F14CFF670005F7284 /* SelectWorldScreen.cpp in Sources */, + D5B50FA114CFF670005F7284 /* StartMenuScreen.cpp in Sources */, + D5B50FA314CFF670005F7284 /* TouchIngameBlockSelectionScreen.cpp in Sources */, + D5B50FA514CFF670005F7284 /* TouchJoinGameScreen.cpp in Sources */, + D5B50FA714CFF670005F7284 /* TouchSelectWorldScreen.cpp in Sources */, + D5B50FA914CFF670005F7284 /* TouchStartMenuScreen.cpp in Sources */, + D5B50FAB14CFF670005F7284 /* UploadPhotoScreen.cpp in Sources */, + D5B50FAD14CFF670005F7284 /* Minecraft.cpp in Sources */, + D5B50FAF14CFF670005F7284 /* ChickenModel.cpp in Sources */, + D5B50FB114CFF670005F7284 /* CowModel.cpp in Sources */, + D5B50FB314CFF670005F7284 /* Cube.cpp in Sources */, + D5B50FB514CFF670005F7284 /* ModelPart.cpp in Sources */, + D5B50FB714CFF670005F7284 /* Polygon.cpp in Sources */, + D5B50FB914CFF670005F7284 /* HumanoidModel.cpp in Sources */, + D5B50FBB14CFF670005F7284 /* PigModel.cpp in Sources */, + D5B50FBD14CFF670005F7284 /* QuadrupedModel.cpp in Sources */, + D5B50FBF14CFF670005F7284 /* Options.cpp in Sources */, + D5B50FC114CFF670005F7284 /* OptionStrings.cpp in Sources */, + D5B50FC314CFF670005F7284 /* Particle.cpp in Sources */, + D5B50FC514CFF670005F7284 /* ParticleEngine.cpp in Sources */, + D5B50FC714CFF670005F7284 /* KeyboardInput.cpp in Sources */, + D5B50FC914CFF670005F7284 /* TouchscreenInput.cpp in Sources */, + D5B50FCB14CFF670005F7284 /* LocalPlayer.cpp in Sources */, + D5B50FCD14CFF670005F7284 /* Chunk.cpp in Sources */, + D5B50FCF14CFF670005F7284 /* Frustum.cpp in Sources */, + D5B50FD114CFF670005F7284 /* ChickenRenderer.cpp in Sources */, + D5B50FD314CFF670005F7284 /* EntityRenderDispatcher.cpp in Sources */, + D5B50FD514CFF670005F7284 /* EntityRenderer.cpp in Sources */, + D5B50FD714CFF670005F7284 /* HumanoidMobRenderer.cpp in Sources */, + D5B50FD914CFF670005F7284 /* ItemRenderer.cpp in Sources */, + D5B50FDB14CFF670005F7284 /* ItemSpriteRenderer.cpp in Sources */, + D5B50FDD14CFF670005F7284 /* MobRenderer.cpp in Sources */, + D5B50FDF14CFF670005F7284 /* TntRenderer.cpp in Sources */, + D5B50FE114CFF670005F7284 /* TripodCameraRenderer.cpp in Sources */, + D5B50FE314CFF670005F7284 /* GameRenderer.cpp in Sources */, + D5B50FE514CFF670005F7284 /* gles.cpp in Sources */, + D5B50FE714CFF670005F7284 /* ItemInHandRenderer.cpp in Sources */, + D5B50FE914CFF670005F7284 /* LevelRenderer.cpp in Sources */, + D5B50FEB14CFF670005F7284 /* DynamicTexture.cpp in Sources */, + D5B50FED14CFF670005F7284 /* RenderChunk.cpp in Sources */, + D5B50FEF14CFF670005F7284 /* RenderList.cpp in Sources */, + D5B50FF114CFF670005F7284 /* Tesselator.cpp in Sources */, + D5B50FF314CFF670005F7284 /* Textures.cpp in Sources */, + D5B50FF514CFF670005F7284 /* TileRenderer.cpp in Sources */, + D5B5102D14CFF670005F7284 /* Sound.cpp in Sources */, + D5B5102F14CFF670005F7284 /* main.cpp in Sources */, + D5B5103514CFF670005F7284 /* Tag.cpp in Sources */, + D5B5103714CFF670005F7284 /* ClientSideNetworkHandler.cpp in Sources */, + D5B5103914CFF670005F7284 /* NetEventCallback.cpp in Sources */, + D5B5103B14CFF670005F7284 /* Packet.cpp in Sources */, + D5B5103D14CFF670005F7284 /* RakNetInstance.cpp in Sources */, + D5B5103F14CFF670005F7284 /* ServerSideNetworkHandler.cpp in Sources */, + D5B5104114CFF670005F7284 /* NinecraftApp.cpp in Sources */, + D5B5104314CFF670005F7284 /* Performance.cpp in Sources */, + D5B5104714CFF670005F7284 /* SoundSystemAL.cpp in Sources */, + D5B5104B14CFF670005F7284 /* CThread.cpp in Sources */, + D5B5104D14CFF670005F7284 /* Controller.cpp in Sources */, + D5B5104F14CFF670005F7284 /* Keyboard.cpp in Sources */, + D5B5105114CFF670005F7284 /* Mouse.cpp in Sources */, + D5B5105314CFF670005F7284 /* Multitouch.cpp in Sources */, + D5B5105514CFF670005F7284 /* time.cpp in Sources */, + D5B5110D14CFF670005F7284 /* DataIO.cpp in Sources */, + D5B5110F14CFF670005F7284 /* Mth.cpp in Sources */, + D5B5111114CFF670005F7284 /* PerfRenderer.cpp in Sources */, + D5B5111314CFF670005F7284 /* PerfTimer.cpp in Sources */, + D5B5111514CFF670005F7284 /* StringUtils.cpp in Sources */, + D5B5111714CFF670005F7284 /* Direction.cpp in Sources */, + D5B5111914CFF670005F7284 /* Animal.cpp in Sources */, + D5B5111B14CFF670005F7284 /* Chicken.cpp in Sources */, + D5B5111D14CFF670005F7284 /* Cow.cpp in Sources */, + D5B5111F14CFF670005F7284 /* Pig.cpp in Sources */, + D5B5112114CFF670005F7284 /* Sheep.cpp in Sources */, + D5B5112314CFF670005F7284 /* WaterAnimal.cpp in Sources */, + D5B5112514CFF670005F7284 /* Entity.cpp in Sources */, + D5B5112714CFF670005F7284 /* FlyingMob.cpp in Sources */, + D5B5112914CFF670005F7284 /* FallingTile.cpp in Sources */, + D5B5112B14CFF670005F7284 /* ItemEntity.cpp in Sources */, + D5B5112D14CFF670005F7284 /* PrimedTnt.cpp in Sources */, + D5B5112F14CFF670005F7284 /* TripodCamera.cpp in Sources */, + D5B5113114CFF670005F7284 /* Mob.cpp in Sources */, + D5B5113314CFF670005F7284 /* MobCategory.cpp in Sources */, + D5B5113714CFF670005F7284 /* PathFinderMob.cpp in Sources */, + D5B5113914CFF670005F7284 /* Inventory.cpp in Sources */, + D5B5113B14CFF670005F7284 /* Player.cpp in Sources */, + D5B5113D14CFF670005F7284 /* Arrow.cpp in Sources */, + D5B5113F14CFF670005F7284 /* Recipes.cpp in Sources */, + D5B5114114CFF670005F7284 /* ToolRecipes.cpp in Sources */, + D5B5114314CFF670005F7284 /* WeaponRecipes.cpp in Sources */, + D5B5114514CFF670005F7284 /* HatchetItem.cpp in Sources */, + D5B5114714CFF670005F7284 /* Item.cpp in Sources */, + D5B5114914CFF670005F7284 /* ItemInstance.cpp in Sources */, + D5B5114B14CFF670005F7284 /* PickaxeItem.cpp in Sources */, + D5B5114D14CFF670005F7284 /* ShovelItem.cpp in Sources */, + D5B5114F14CFF670005F7284 /* Biome.cpp in Sources */, + D5B5115114CFF670005F7284 /* BiomeSource.cpp in Sources */, + D5B5115314CFF670005F7284 /* LevelChunk.cpp in Sources */, + D5B5115514CFF670005F7284 /* Dimension.cpp in Sources */, + D5B5115714CFF670005F7284 /* Explosion.cpp in Sources */, + D5B5115914CFF670005F7284 /* Level.cpp in Sources */, + D5B5115B14CFF670005F7284 /* CanyonFeature.cpp in Sources */, + D5B5115D14CFF670005F7284 /* DungeonFeature.cpp in Sources */, + D5B5115F14CFF670005F7284 /* LargeCaveFeature.cpp in Sources */, + D5B5116114CFF670005F7284 /* LargeFeature.cpp in Sources */, + D5B5116314CFF670005F7284 /* RandomLevelSource.cpp in Sources */, + D5B5116514CFF670005F7284 /* ImprovedNoise.cpp in Sources */, + D5B5116714CFF670005F7284 /* PerlinNoise.cpp in Sources */, + D5B5116914CFF670005F7284 /* Synth.cpp in Sources */, + D5B5116B14CFF670005F7284 /* LightLayer.cpp in Sources */, + D5B5116D14CFF670005F7284 /* LightUpdate.cpp in Sources */, + D5B5116F14CFF670005F7284 /* Material.cpp in Sources */, + D5B5117114CFF670005F7284 /* MobSpawner.cpp in Sources */, + D5B5117314CFF670005F7284 /* Region.cpp in Sources */, + D5B5117514CFF670005F7284 /* ExternalFileLevelStorage.cpp in Sources */, + D5B5117714CFF670005F7284 /* ExternalFileLevelStorageSource.cpp in Sources */, + D5B5117914CFF670005F7284 /* RegionFile.cpp in Sources */, + D5B5117B14CFF670005F7284 /* TickNextTickData.cpp in Sources */, + D5B5117D14CFF670005F7284 /* DoorTile.cpp in Sources */, + D5B5118114CFF670005F7284 /* StoneSlabTile.cpp in Sources */, + D5B5118314CFF670005F7284 /* Tile.cpp in Sources */, + D5B5118514CFF670005F7284 /* HitResult.cpp in Sources */, + D5B5118B14D03342005F7284 /* SynchedEntityData.cpp in Sources */, + D5B5118E14DEA27F005F7284 /* DeathScreen.cpp in Sources */, + D5B5119114DEA2B7005F7284 /* LevelData.cpp in Sources */, + D5B5119414DEA2EF005F7284 /* DyePowderItem.cpp in Sources */, + D584926D14FD234400741128 /* SharedConstants.cpp in Sources */, + D584927314FD236700741128 /* MoveControl.cpp in Sources */, + D584928614FD240D00741128 /* IConfigListener.cpp in Sources */, + D584928914FD2FAF00741128 /* Path.cpp in Sources */, + D5B86281153810BD00F3238A /* I18n.cpp in Sources */, + D5B862851538175500F3238A /* ScrollingPane.cpp in Sources */, + D5B862921538187400F3238A /* Recipe.cpp in Sources */, + D5B862941538187400F3238A /* StructureRecipes.cpp in Sources */, + D5251DAB1538192700FC82C8 /* _FindFirst.cpp in Sources */, + D5251DAD1538192700FC82C8 /* BitStream.cpp in Sources */, + D5251DAF1538192700FC82C8 /* CCRakNetSlidingWindow.cpp in Sources */, + D5251DB11538192700FC82C8 /* CCRakNetUDT.cpp in Sources */, + D5251DB31538192700FC82C8 /* CheckSum.cpp in Sources */, + D5251DB51538192700FC82C8 /* CloudClient.cpp in Sources */, + D5251DB71538192700FC82C8 /* CloudCommon.cpp in Sources */, + D5251DB91538192700FC82C8 /* CloudServer.cpp in Sources */, + D5251DBD1538192700FC82C8 /* CommandParserInterface.cpp in Sources */, + D5251DBF1538192700FC82C8 /* ConnectionGraph2.cpp in Sources */, + D5251DC11538192700FC82C8 /* ConsoleServer.cpp in Sources */, + D5251DC31538192700FC82C8 /* DataCompressor.cpp in Sources */, + D5251DC51538192700FC82C8 /* DirectoryDeltaTransfer.cpp in Sources */, + D5251DC71538192700FC82C8 /* DS_BytePool.cpp in Sources */, + D5251DC91538192700FC82C8 /* DS_ByteQueue.cpp in Sources */, + D5251DCB1538192700FC82C8 /* DS_HuffmanEncodingTree.cpp in Sources */, + D5251DCD1538192700FC82C8 /* DS_Table.cpp in Sources */, + D5251DCF1538192700FC82C8 /* DynDNS.cpp in Sources */, + D5251DD11538192700FC82C8 /* EmailSender.cpp in Sources */, + D5251DD31538192700FC82C8 /* EncodeClassName.cpp in Sources */, + D5251DD51538192700FC82C8 /* EpochTimeToString.cpp in Sources */, + D5251DD71538192700FC82C8 /* FileList.cpp in Sources */, + D5251DD91538192700FC82C8 /* FileListTransfer.cpp in Sources */, + D5251DDB1538192700FC82C8 /* FileOperations.cpp in Sources */, + D5251DDD1538192700FC82C8 /* FormatString.cpp in Sources */, + D5251DDF1538192700FC82C8 /* FullyConnectedMesh2.cpp in Sources */, + D5251DE11538192700FC82C8 /* Getche.cpp in Sources */, + D5251DE31538192700FC82C8 /* Gets.cpp in Sources */, + D5251DE51538192700FC82C8 /* GetTime.cpp in Sources */, + D5251DE71538192700FC82C8 /* gettimeofday.cpp in Sources */, + D5251DE91538192700FC82C8 /* GridSectorizer.cpp in Sources */, + D5251DEB1538192700FC82C8 /* HTTPConnection.cpp in Sources */, + D5251DED1538192700FC82C8 /* IncrementalReadInterface.cpp in Sources */, + D5251DEF1538192700FC82C8 /* Itoa.cpp in Sources */, + D5251DF11538192700FC82C8 /* LinuxStrings.cpp in Sources */, + D5251DF31538192700FC82C8 /* LocklessTypes.cpp in Sources */, + D5251DF51538192700FC82C8 /* LogCommandParser.cpp in Sources */, + D5251DF71538192700FC82C8 /* MessageFilter.cpp in Sources */, + D5251DF91538192700FC82C8 /* NatPunchthroughClient.cpp in Sources */, + D5251DFB1538192700FC82C8 /* NatPunchthroughServer.cpp in Sources */, + D5251DFD1538192700FC82C8 /* NatTypeDetectionClient.cpp in Sources */, + D5251DFF1538192700FC82C8 /* NatTypeDetectionCommon.cpp in Sources */, + D5251E011538192700FC82C8 /* NatTypeDetectionServer.cpp in Sources */, + D5251E031538192700FC82C8 /* NetworkIDManager.cpp in Sources */, + D5251E051538192700FC82C8 /* NetworkIDObject.cpp in Sources */, + D5251E071538192700FC82C8 /* PacketConsoleLogger.cpp in Sources */, + D5251E091538192700FC82C8 /* PacketFileLogger.cpp in Sources */, + D5251E0B1538192700FC82C8 /* PacketizedTCP.cpp in Sources */, + D5251E0D1538192700FC82C8 /* PacketLogger.cpp in Sources */, + D5251E0F1538192700FC82C8 /* PacketOutputWindowLogger.cpp in Sources */, + D5251E111538192700FC82C8 /* PluginInterface2.cpp in Sources */, + D5251E131538192700FC82C8 /* Rackspace.cpp in Sources */, + D5251E151538192700FC82C8 /* RakMemoryOverride.cpp in Sources */, + D5251E1D1538192700FC82C8 /* RakNetCommandParser.cpp in Sources */, + D5251E1F1538192700FC82C8 /* RakNetSocket.cpp in Sources */, + D5251E211538192700FC82C8 /* RakNetStatistics.cpp in Sources */, + D5251E231538192700FC82C8 /* RakNetTransport2.cpp in Sources */, + D5251E251538192700FC82C8 /* RakNetTypes.cpp in Sources */, + D5251E271538192700FC82C8 /* RakPeer.cpp in Sources */, + D5251E291538192700FC82C8 /* RakSleep.cpp in Sources */, + D5251E2B1538192700FC82C8 /* RakString.cpp in Sources */, + D5251E2D1538192700FC82C8 /* RakThread.cpp in Sources */, + D5251E2F1538192700FC82C8 /* RakWString.cpp in Sources */, + D5251E311538192700FC82C8 /* Rand.cpp in Sources */, + D5251E331538192700FC82C8 /* rdlmalloc.cpp in Sources */, + D5251E351538192700FC82C8 /* ReadyEvent.cpp in Sources */, + D5251E371538192700FC82C8 /* ReliabilityLayer.cpp in Sources */, + D5251E391538192700FC82C8 /* ReplicaManager3.cpp in Sources */, + D5251E3B1538192700FC82C8 /* Router2.cpp in Sources */, + D5251E3D1538192700FC82C8 /* RPC4Plugin.cpp in Sources */, + D5251E3F1538192700FC82C8 /* SecureHandshake.cpp in Sources */, + D5251E411538192700FC82C8 /* SendToThread.cpp in Sources */, + D5251E431538192700FC82C8 /* SHA1.cpp in Sources */, + D5251E451538192700FC82C8 /* SignaledEvent.cpp in Sources */, + D5251E471538192700FC82C8 /* SimpleMutex.cpp in Sources */, + D5251E491538192700FC82C8 /* SocketLayer.cpp in Sources */, + D5251E4B1538192700FC82C8 /* StringCompressor.cpp in Sources */, + D5251E4D1538192700FC82C8 /* StringTable.cpp in Sources */, + D5251E4F1538192700FC82C8 /* SuperFastHash.cpp in Sources */, + D5251E511538192700FC82C8 /* TableSerializer.cpp in Sources */, + D5251E531538192700FC82C8 /* TCPInterface.cpp in Sources */, + D5251E551538192700FC82C8 /* TeamBalancer.cpp in Sources */, + D5251E571538192700FC82C8 /* TelnetTransport.cpp in Sources */, + D5251E591538192700FC82C8 /* ThreadsafePacketLogger.cpp in Sources */, + D5251E5B1538192700FC82C8 /* TwoWayAuthentication.cpp in Sources */, + D5251E5D1538192700FC82C8 /* UDPForwarder.cpp in Sources */, + D5251E5F1538192700FC82C8 /* UDPProxyClient.cpp in Sources */, + D5251E611538192700FC82C8 /* UDPProxyCoordinator.cpp in Sources */, + D5251E631538192700FC82C8 /* UDPProxyServer.cpp in Sources */, + D5251E651538192700FC82C8 /* VariableDeltaSerializer.cpp in Sources */, + D5251E671538192700FC82C8 /* VariableListDeltaTracker.cpp in Sources */, + D5251E691538192700FC82C8 /* VariadicSQLParser.cpp in Sources */, + D5251E6B1538192700FC82C8 /* VitaIncludes.cpp in Sources */, + D5251E6D1538192700FC82C8 /* WSAStartupSingleton.cpp in Sources */, + D5251E911539A9AF00FC82C8 /* SoundEngine.mm in Sources */, + D5951EC7159347EE0043A12A /* FurnaceRecipes.cpp in Sources */, + D5951EC9159347EE0043A12A /* OreRecipes.cpp in Sources */, + D5951EDB159348C50043A12A /* InventoryPane.cpp in Sources */, + D5951EDD159348C50043A12A /* ItemPane.cpp in Sources */, + D5951EE3159349000043A12A /* FurnaceTile.cpp in Sources */, + D5951EE8159349100043A12A /* FurnaceTileEntity.cpp in Sources */, + D5951EEA159349100043A12A /* TileEntity.cpp in Sources */, + D5951EEE159349680043A12A /* FurnaceScreen.cpp in Sources */, + D5951EF115934A2D0043A12A /* Feature.cpp in Sources */, + D5951EF715934AC50043A12A /* BaseContainerMenu.cpp in Sources */, + D5951EF915934AC50043A12A /* FurnaceMenu.cpp in Sources */, + D5D381F215A1A1CF00B6C50E /* FillingContainer.cpp in Sources */, + D5D381F715A1A21800B6C50E /* EntityTile.cpp in Sources */, + D5D3820515A1A26000B6C50E /* ChestRenderer.cpp in Sources */, + D5D3820715A1A26000B6C50E /* TileEntityRenderDispatcher.cpp in Sources */, + D5D3820915A1A26000B6C50E /* TileEntityRenderer.cpp in Sources */, + D5D3820D15A1A2A000B6C50E /* EntityTileRenderer.cpp in Sources */, + D5D3821115A1A2C200B6C50E /* ChestTile.cpp in Sources */, + D5D3821415A1A5D100B6C50E /* ChestTileEntity.cpp in Sources */, + D5A6F8D115B45E2600819B71 /* ChestScreen.cpp in Sources */, + D5A6F8D615B45EE500819B71 /* ContainerMenu.cpp in Sources */, + D5ACF15615C01F7D00E21C22 /* ArrowRenderer.cpp in Sources */, + D5ACF17815C0220D00E21C22 /* Creeper.cpp in Sources */, + D5ACF17A15C0220D00E21C22 /* Monster.cpp in Sources */, + D5ACF17C15C0220D00E21C22 /* Skeleton.cpp in Sources */, + D5ACF17E15C0220D00E21C22 /* Spider.cpp in Sources */, + D5ACF18015C0220D00E21C22 /* Zombie.cpp in Sources */, + D5ACF18415C022B500E21C22 /* EntityFactory.cpp in Sources */, + D54493EF15D13BF0005FA9B0 /* BedTile.cpp in Sources */, + D54493F115D13BF0005FA9B0 /* CropTile.cpp in Sources */, + D54493F315D13BF0005FA9B0 /* GrassTile.cpp in Sources */, + D54493F915D13C35005FA9B0 /* HoeItem.cpp in Sources */, + D54493FD15D13C59005FA9B0 /* BedItem.cpp in Sources */, + D544940815D13DB7005FA9B0 /* ServerLevel.cpp in Sources */, + D544940A15D13DB7005FA9B0 /* ServerPlayer.cpp in Sources */, + D544941015D13E27005FA9B0 /* SimpleFoodData.cpp in Sources */, + D544941315D13E5A005FA9B0 /* FolderMethods.cpp in Sources */, + D544941615D13EE3005FA9B0 /* LevelStorageSource.cpp in Sources */, + D544941A15D13F06005FA9B0 /* TallGrass.cpp in Sources */, + D544941E15D13F45005FA9B0 /* PlayerRenderer.cpp in Sources */, + D544942215D13F5E005FA9B0 /* RemotePlayer.cpp in Sources */, + D5B17ED515E226F50056E751 /* Throwable.cpp in Sources */, + D5B17ED915E2273F0056E751 /* SurvivalMode.cpp in Sources */, + D5B17EDD15E227670056E751 /* TrapDoorTile.cpp in Sources */, + D5B17EE115E260910056E751 /* MoveFolder.mm in Sources */, + D5D8C48A16392FF000FD35F0 /* LightGemTile.cpp in Sources */, + D5D8C48C16392FF000FD35F0 /* Mushroom.cpp in Sources */, + D5D8C48E16392FF000FD35F0 /* StemTile.cpp in Sources */, + D5D8C4951639301700FD35F0 /* NetherReactorTileEntity.cpp in Sources */, + D5D8C4971639301700FD35F0 /* SignTileEntity.cpp in Sources */, + D5D8C49B1639305100FD35F0 /* PigZombie.cpp in Sources */, + D5D8C49F163930D600FD35F0 /* MelonTile.cpp in Sources */, + D5D8C4A3163930E600FD35F0 /* NetherReactor.cpp in Sources */, + D5D8C4A7163931F000FD35F0 /* InBedScreen.cpp in Sources */, + D5D8C4AB163932B900FD35F0 /* SignRenderer.cpp in Sources */, + D5D8C4AF163932CF00FD35F0 /* PaintingRenderer.cpp in Sources */, + D5D8C4B51639335000FD35F0 /* HangingEntity.cpp in Sources */, + D5D8C4B71639335000FD35F0 /* Painting.cpp in Sources */, + D5D8C4C31639341100FD35F0 /* Motive.cpp in Sources */, + D5D8C4C7163934BB00FD35F0 /* HangingEntityItem.cpp in Sources */, + D5D8C4CB1639362F00FD35F0 /* NetherReactorPattern.cpp in Sources */, + 0419D99B167F201B0080CB96 /* SheepFurModel.cpp in Sources */, + 0419D99C167F201B0080CB96 /* SheepModel.cpp in Sources */, + 0419D99F167F206A0080CB96 /* CommandServer.cpp in Sources */, + 0419D9A2167F20CC0080CB96 /* SheepRenderer.cpp in Sources */, + 0419D9AB167F211B0080CB96 /* ChooseLevelScreen.cpp in Sources */, + 0419D9AC167F211B0080CB96 /* SimpleChooseLevelScreen.cpp in Sources */, + 0419D9AD167F211B0080CB96 /* TextEditScreen.cpp in Sources */, + 0419D9B2167F21BC0080CB96 /* PaneCraftingScreen.cpp in Sources */, + 0419D9B3167F21BC0080CB96 /* WorkbenchScreen.cpp in Sources */, + 0419D9B7167F22150080CB96 /* AgableMob.cpp in Sources */, + 0419D9BA167F2A720080CB96 /* ShowKeyboardView.mm in Sources */, + 044129071682FF9600B70EE6 /* MouseHandler.cpp in Sources */, + 0400453716A41236003EB6FA /* HeavyTile.cpp in Sources */, + 0400453A16A4125C003EB6FA /* FallingTileRenderer.cpp in Sources */, + 0413970716A82E1E008A9F1A /* ArmorItem.cpp in Sources */, + 0413970D16A82E6B008A9F1A /* CraftingFilters.cpp in Sources */, + 0413970E16A82E6B008A9F1A /* StonecutterScreen.cpp in Sources */, + 0413971116A82E7B008A9F1A /* ArmorScreen.cpp in Sources */, + 0413971516A82EB9008A9F1A /* ArmorRecipes.cpp in Sources */, + 0413971716A82EF5008A9F1A /* StairTile.cpp in Sources */, + 042A91AD16B17517007ABBC6 /* GButton.cpp in Sources */, + 042A91AE16B17517007ABBC6 /* GuiElement.cpp in Sources */, + 042A91AF16B17517007ABBC6 /* NinePatch.cpp in Sources */, + 042A91B016B17517007ABBC6 /* OptionsGroup.cpp in Sources */, + 042A91B116B17517007ABBC6 /* OptionsPane.cpp in Sources */, + 042A91B216B17517007ABBC6 /* TextBox.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + D5CF9C53144C225000E4244F /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + D5CF9C54144C225000E4244F /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + D5CF9C5C144C225000E4244F /* MainWindow.xib */ = { + isa = PBXVariantGroup; + children = ( + D5CF9C5D144C225000E4244F /* en */, + ); + name = MainWindow.xib; + sourceTree = ""; + }; + D5CF9C69144C225000E4244F /* minecraftpeViewController.xib */ = { + isa = PBXVariantGroup; + children = ( + D5CF9C6A144C225000E4244F /* en */, + ); + name = minecraftpeViewController.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + D50BE20815EE05B8008AA75E /* Ad-Hoc */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_UNIVERSAL_IPHONE_OS)"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Mojang AB"; + COPY_PHASE_STRIP = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_PREPROCESSOR_DEFINITIONS = PUBLISH; + GCC_VERSION = com.apple.compilers.llvmgcc42; + GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = NO; + GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 4.3; + OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; + "PROVISIONING_PROFILE[sdk=iphoneos*]" = "C93D3524-5C6F-466E-B12B-833663B7EAE0"; + RUN_CLANG_STATIC_ANALYZER = NO; + SDKROOT = iphoneos6.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = "Ad-Hoc"; + }; + D50BE20915EE05B8008AA75E /* Ad-Hoc */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "minecraftpe/minecraftpe-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = ""; + "GCC_THUMB_SUPPORT[arch=armv7]" = NO; + GCC_VERSION = com.apple.compilers.llvmgcc42; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO; + HEADER_SEARCH_PATHS = ""; + INFOPLIST_FILE = "minecraftpe/minecraftpe-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 4.3; + PRODUCT_NAME = "$(TARGET_NAME)"; + RUN_CLANG_STATIC_ANALYZER = NO; + SDKROOT = iphoneos6.0; + VALID_ARCHS = "i386 armv6 armv7"; + WRAPPER_EXTENSION = app; + }; + name = "Ad-Hoc"; + }; + D50BE20A15EE05B8008AA75E /* Ad-Hoc */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "minecraftpe/minecraftpe-Prefix.pch"; + "GCC_THUMB_SUPPORT[arch=armv7]" = NO; + GCC_VERSION = com.apple.compilers.llvmgcc42; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO; + HEADER_SEARCH_PATHS = ""; + INFOPLIST_FILE = "minecraftpe/minecraftpedemo-info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + OTHER_CFLAGS = ( + "-DNS_BLOCK_ASSERTIONS=1", + "-DDEMO_MODE", + ); + "OTHER_CPLUSPLUSFLAGS[arch=*]" = "$(OTHER_CFLAGS)"; + PRODUCT_NAME = minecraftpe.demo; + RUN_CLANG_STATIC_ANALYZER = NO; + VALID_ARCHS = "i386 armv6 armv7"; + WRAPPER_EXTENSION = app; + }; + name = "Ad-Hoc"; + }; + D58BB5B3146A0B920002C9F5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "minecraftpe/minecraftpe-Prefix.pch"; + "GCC_THUMB_SUPPORT[arch=armv7]" = NO; + GCC_VERSION = com.apple.compilers.llvmgcc42; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO; + HEADER_SEARCH_PATHS = ""; + INFOPLIST_FILE = "minecraftpe/minecraftpedemo-info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + OTHER_CFLAGS = "-DDEMO_MODE"; + PRODUCT_NAME = minecraftpe.demo; + RUN_CLANG_STATIC_ANALYZER = NO; + VALID_ARCHS = "i386 armv6 armv7"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + D58BB5B4146A0B920002C9F5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "minecraftpe/minecraftpe-Prefix.pch"; + "GCC_THUMB_SUPPORT[arch=armv7]" = NO; + GCC_VERSION = com.apple.compilers.llvmgcc42; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO; + HEADER_SEARCH_PATHS = ""; + INFOPLIST_FILE = "minecraftpe/minecraftpedemo-info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + OTHER_CFLAGS = ( + "-DNS_BLOCK_ASSERTIONS=1", + "-DDEMO_MODE", + ); + "OTHER_CPLUSPLUSFLAGS[arch=*]" = "$(OTHER_CFLAGS)"; + PRODUCT_NAME = minecraftpe.demo; + RUN_CLANG_STATIC_ANALYZER = NO; + VALID_ARCHS = "i386 armv6 armv7"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; + D5A20ADB146AAD9C00A52FEC /* AppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_UNIVERSAL_IPHONE_OS)"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Mojang AB"; + COPY_PHASE_STRIP = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_VERSION = com.apple.compilers.llvmgcc42; + GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = NO; + GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 4.3; + OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; + "PROVISIONING_PROFILE[sdk=iphoneos*]" = "64BA8967-1A9A-4980-972C-42E75AD5E023"; + RUN_CLANG_STATIC_ANALYZER = NO; + SDKROOT = iphoneos6.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = AppStore; + }; + D5A20ADC146AAD9C00A52FEC /* AppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Mojang AB"; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "minecraftpe/minecraftpe-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = PUBLISH; + "GCC_THUMB_SUPPORT[arch=armv7]" = NO; + GCC_VERSION = com.apple.compilers.llvmgcc42; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO; + HEADER_SEARCH_PATHS = ""; + INFOPLIST_FILE = "minecraftpe/minecraftpe-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 4.3; + OTHER_CFLAGS = ( + "-DNS_BLOCK_ASSERTIONS=1", + "-DANDROID_PUBLISH", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + "PROVISIONING_PROFILE[sdk=iphoneos*]" = "1B194957-98CF-49B7-A0E7-76692B4B722D"; + RUN_CLANG_STATIC_ANALYZER = NO; + SDKROOT = iphoneos6.0; + VALID_ARCHS = "i386 armv6 armv7"; + WRAPPER_EXTENSION = app; + }; + name = AppStore; + }; + D5A20ADD146AAD9C00A52FEC /* AppStore */ = { + isa = XCBuildConfiguration; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "minecraftpe/minecraftpe-Prefix.pch"; + "GCC_THUMB_SUPPORT[arch=armv7]" = NO; + GCC_VERSION = com.apple.compilers.llvmgcc42; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO; + HEADER_SEARCH_PATHS = ""; + INFOPLIST_FILE = "minecraftpe/minecraftpedemo-info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + OTHER_CFLAGS = ( + "-DNS_BLOCK_ASSERTIONS=1", + "-DDEMO_MODE", + "-DANDROID_PUBLISH", + ); + PRODUCT_NAME = minecraftpe.demo; + "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; + RUN_CLANG_STATIC_ANALYZER = NO; + VALID_ARCHS = "i386 armv6 armv7"; + WRAPPER_EXTENSION = app; + }; + name = AppStore; + }; + D5CF9C6C144C225000E4244F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_UNIVERSAL_IPHONE_OS)"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + PUBLISH, + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_VERSION = com.apple.compilers.llvmgcc42; + GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = NO; + GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 4.3; + RUN_CLANG_STATIC_ANALYZER = NO; + SDKROOT = iphoneos6.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + D5CF9C6D144C225000E4244F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_UNIVERSAL_IPHONE_OS)"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_PREPROCESSOR_DEFINITIONS = PUBLISH; + GCC_VERSION = com.apple.compilers.llvmgcc42; + GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = NO; + GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 4.3; + OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; + RUN_CLANG_STATIC_ANALYZER = NO; + SDKROOT = iphoneos6.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + D5CF9C6F144C225000E4244F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "minecraftpe/minecraftpe-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1"; + "GCC_THUMB_SUPPORT[arch=armv7]" = NO; + GCC_VERSION = com.apple.compilers.llvmgcc42; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO; + HEADER_SEARCH_PATHS = ""; + INFOPLIST_FILE = "minecraftpe/minecraftpe-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 4.3; + PRODUCT_NAME = "$(TARGET_NAME)"; + RUN_CLANG_STATIC_ANALYZER = NO; + SDKROOT = iphoneos6.0; + VALID_ARCHS = "i386 armv6 armv7"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + D5CF9C70144C225000E4244F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "minecraftpe/minecraftpe-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = ""; + "GCC_THUMB_SUPPORT[arch=armv7]" = NO; + GCC_VERSION = com.apple.compilers.llvmgcc42; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO; + HEADER_SEARCH_PATHS = ""; + INFOPLIST_FILE = "minecraftpe/minecraftpe-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 4.3; + PRODUCT_NAME = "$(TARGET_NAME)"; + RUN_CLANG_STATIC_ANALYZER = NO; + SDKROOT = iphoneos6.0; + VALID_ARCHS = "i386 armv6 armv7"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + D58BB5B2146A0B920002C9F5 /* Build configuration list for PBXNativeTarget "minecraftpe.demo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D58BB5B3146A0B920002C9F5 /* Debug */, + D58BB5B4146A0B920002C9F5 /* Release */, + D50BE20A15EE05B8008AA75E /* Ad-Hoc */, + D5A20ADD146AAD9C00A52FEC /* AppStore */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + D5CF9C3C144C225000E4244F /* Build configuration list for PBXProject "minecraftpe" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D5CF9C6C144C225000E4244F /* Debug */, + D5CF9C6D144C225000E4244F /* Release */, + D50BE20815EE05B8008AA75E /* Ad-Hoc */, + D5A20ADB146AAD9C00A52FEC /* AppStore */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + D5CF9C6E144C225000E4244F /* Build configuration list for PBXNativeTarget "minecraftpe" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + D5CF9C6F144C225000E4244F /* Debug */, + D5CF9C70144C225000E4244F /* Release */, + D50BE20915EE05B8008AA75E /* Ad-Hoc */, + D5A20ADC146AAD9C00A52FEC /* AppStore */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = D5CF9C39144C225000E4244F /* Project object */; +} diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..f17c5e6 --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/project.xcworkspace/xcuserdata/new.xcuserdatad/UserInterfaceState.xcuserstate b/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/project.xcworkspace/xcuserdata/new.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000..3c4cdad --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/project.xcworkspace/xcuserdata/new.xcuserdatad/UserInterfaceState.xcuserstate @@ -0,0 +1,15821 @@ + + + + + $archiver + NSKeyedArchiver + $objects + + $null + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 2 + + + CF$UID + 3 + + + CF$UID + 4 + + + NS.objects + + + CF$UID + 5 + + + CF$UID + 819 + + + CF$UID + 971 + + + + IDEWorkspaceDocument + 79915ECB-7161-463E-B2BF-AB582B05153A + 784EACEA-54C8-46B0-B40D-9EE9F0F94AE3 + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 6 + + + CF$UID + 7 + + + CF$UID + 8 + + + CF$UID + 9 + + + CF$UID + 10 + + + CF$UID + 11 + + + CF$UID + 12 + + + CF$UID + 13 + + + CF$UID + 14 + + + CF$UID + 15 + + + CF$UID + 16 + + + NS.objects + + + CF$UID + 17 + + + CF$UID + 18 + + + CF$UID + 41 + + + CF$UID + 726 + + + CF$UID + 731 + + + CF$UID + 734 + + + CF$UID + 765 + + + CF$UID + 766 + + + CF$UID + 798 + + + CF$UID + 240 + + + CF$UID + 240 + + + + BreakpointsActivated + DefaultEditorStatesForURLs + DebuggingWindowBehavior + ActiveRunDestination + ActiveScheme + LastCompletedPersistentSchemeBasedActivityReport + DocumentWindows + DefaultEditorFrameSizeForURLs + RecentEditorDocumentURLs + AppFocusInMiniDebugging + MiniDebuggingConsole + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 19 + + + CF$UID + 20 + + + CF$UID + 21 + + + CF$UID + 22 + + + CF$UID + 23 + + + CF$UID + 24 + + + CF$UID + 25 + + + NS.objects + + + CF$UID + 26 + + + CF$UID + 56 + + + CF$UID + 78 + + + CF$UID + 524 + + + CF$UID + 613 + + + CF$UID + 617 + + + CF$UID + 722 + + + + IDEQuickLookEditor.Editor + Xcode.IDEKit.EditorDocument.PlistEditor + Xcode.IDEKit.EditorDocument.SourceCode + Xcode.IDEKit.CocoaTouchIntegration.EditorDocument.CocoaTouch + Xcode.IDEKit.EditorDocument.SourceCodeComparisonEditor + Xcode.Xcode3ProjectSupport.EditorDocument.Xcode3Project + Xcode.IDEKit.EditorDocument.LogDocument + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 27 + + + CF$UID + 31 + + + CF$UID + 33 + + + NS.objects + + + CF$UID + 35 + + + CF$UID + 45 + + + CF$UID + 51 + + + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 28 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/data/fonts/Minecraft.ttf + + + $classes + + NSMutableString + NSString + NSObject + + $classname + NSMutableString + + + $classes + + NSURL + NSObject + + $classname + NSURL + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 32 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/data/images/terrain.png + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 34 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/data/fonts/minecraft.ttf + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 36 + + + NS.objects + + + CF$UID + 37 + + + + SelectedDocumentLocations + + $class + + CF$UID + 43 + + NS.objects + + + CF$UID + 38 + + + + + $class + + CF$UID + 42 + + IDEQuickLookPageNumber + + CF$UID + 41 + + documentURL + + CF$UID + 39 + + timestamp + + CF$UID + 40 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/data/fonts/Minecraft.ttf + + 340835756.18714702 + 0 + + $classes + + IDEQuickLookDocumentLocation + DVTDocumentLocation + NSObject + + $classname + IDEQuickLookDocumentLocation + + + $classes + + NSArray + NSObject + + $classname + NSArray + + + $classes + + NSMutableDictionary + NSDictionary + NSObject + + $classname + NSMutableDictionary + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 46 + + + NS.objects + + + CF$UID + 47 + + + + SelectedDocumentLocations + + $class + + CF$UID + 43 + + NS.objects + + + CF$UID + 48 + + + + + $class + + CF$UID + 42 + + IDEQuickLookPageNumber + + CF$UID + 41 + + documentURL + + CF$UID + 49 + + timestamp + + CF$UID + 50 + + + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/data/images/terrain.png + 340552287.74712098 + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 36 + + + NS.objects + + + CF$UID + 52 + + + + + $class + + CF$UID + 43 + + NS.objects + + + CF$UID + 53 + + + + + $class + + CF$UID + 42 + + IDEQuickLookPageNumber + + CF$UID + 41 + + documentURL + + CF$UID + 54 + + timestamp + + CF$UID + 55 + + + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/data/fonts/minecraft.ttf + 340835748.23811901 + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 57 + + + CF$UID + 59 + + + NS.objects + + + CF$UID + 61 + + + CF$UID + 72 + + + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 58 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/minecraftpe-Info.plist + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 60 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/Settings.bundle/Root.plist + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 62 + + + CF$UID + 63 + + + CF$UID + 64 + + + NS.objects + + + CF$UID + 65 + + + CF$UID + 66 + + + CF$UID + 67 + + + + IDE_PLIST_EDITOR_SELECTION_KEY + IDE_PLIST_EDITOR_VISIBLERECT_KEY + IDE_PLIST_EDITOR_EXPANSION_KEY + + $class + + CF$UID + 43 + + NS.objects + + + {{29, 0}, {342, 622}} + + $class + + CF$UID + 71 + + NS.objects + + + CF$UID + 68 + + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 69 + + + + UIAppFonts + + $classes + + NSMutableArray + NSArray + NSObject + + $classname + NSMutableArray + + + $classes + + NSMutableSet + NSSet + NSObject + + $classname + NSMutableSet + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 62 + + + CF$UID + 63 + + + CF$UID + 64 + + + NS.objects + + + CF$UID + 73 + + + CF$UID + 75 + + + CF$UID + 76 + + + + + $class + + CF$UID + 43 + + NS.objects + + + CF$UID + 74 + + + + PreferenceSpecifiers + {{0, 0}, {1060, 943}} + + $class + + CF$UID + 71 + + NS.objects + + + CF$UID + 77 + + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 74 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 79 + + + CF$UID + 81 + + + CF$UID + 83 + + + CF$UID + 85 + + + CF$UID + 87 + + + CF$UID + 89 + + + CF$UID + 91 + + + CF$UID + 93 + + + CF$UID + 95 + + + CF$UID + 97 + + + CF$UID + 99 + + + CF$UID + 101 + + + CF$UID + 103 + + + CF$UID + 105 + + + CF$UID + 107 + + + CF$UID + 109 + + + CF$UID + 111 + + + CF$UID + 113 + + + CF$UID + 115 + + + CF$UID + 117 + + + CF$UID + 119 + + + CF$UID + 121 + + + CF$UID + 123 + + + CF$UID + 125 + + + CF$UID + 127 + + + CF$UID + 129 + + + CF$UID + 131 + + + CF$UID + 133 + + + CF$UID + 135 + + + CF$UID + 137 + + + CF$UID + 139 + + + CF$UID + 141 + + + CF$UID + 143 + + + CF$UID + 145 + + + CF$UID + 147 + + + CF$UID + 149 + + + CF$UID + 151 + + + CF$UID + 153 + + + CF$UID + 155 + + + CF$UID + 157 + + + CF$UID + 159 + + + CF$UID + 161 + + + CF$UID + 163 + + + CF$UID + 165 + + + CF$UID + 167 + + + CF$UID + 169 + + + CF$UID + 171 + + + CF$UID + 173 + + + CF$UID + 175 + + + CF$UID + 177 + + + CF$UID + 179 + + + CF$UID + 181 + + + CF$UID + 183 + + + CF$UID + 185 + + + CF$UID + 187 + + + CF$UID + 189 + + + CF$UID + 191 + + + CF$UID + 193 + + + CF$UID + 195 + + + CF$UID + 197 + + + CF$UID + 199 + + + CF$UID + 201 + + + CF$UID + 203 + + + CF$UID + 205 + + + CF$UID + 207 + + + CF$UID + 209 + + + CF$UID + 211 + + + CF$UID + 213 + + + CF$UID + 215 + + + CF$UID + 217 + + + CF$UID + 219 + + + CF$UID + 221 + + + CF$UID + 223 + + + CF$UID + 225 + + + CF$UID + 227 + + + CF$UID + 229 + + + CF$UID + 231 + + + NS.objects + + + CF$UID + 233 + + + CF$UID + 242 + + + CF$UID + 246 + + + CF$UID + 249 + + + CF$UID + 257 + + + CF$UID + 261 + + + CF$UID + 265 + + + CF$UID + 269 + + + CF$UID + 273 + + + CF$UID + 277 + + + CF$UID + 280 + + + CF$UID + 283 + + + CF$UID + 287 + + + CF$UID + 290 + + + CF$UID + 294 + + + CF$UID + 298 + + + CF$UID + 301 + + + CF$UID + 305 + + + CF$UID + 309 + + + CF$UID + 312 + + + CF$UID + 316 + + + CF$UID + 319 + + + CF$UID + 323 + + + CF$UID + 326 + + + CF$UID + 330 + + + CF$UID + 333 + + + CF$UID + 336 + + + CF$UID + 340 + + + CF$UID + 344 + + + CF$UID + 347 + + + CF$UID + 351 + + + CF$UID + 355 + + + CF$UID + 359 + + + CF$UID + 363 + + + CF$UID + 367 + + + CF$UID + 371 + + + CF$UID + 375 + + + CF$UID + 378 + + + CF$UID + 382 + + + CF$UID + 385 + + + CF$UID + 388 + + + CF$UID + 392 + + + CF$UID + 396 + + + CF$UID + 400 + + + CF$UID + 403 + + + CF$UID + 406 + + + CF$UID + 410 + + + CF$UID + 414 + + + CF$UID + 418 + + + CF$UID + 421 + + + CF$UID + 425 + + + CF$UID + 429 + + + CF$UID + 433 + + + CF$UID + 437 + + + CF$UID + 441 + + + CF$UID + 445 + + + CF$UID + 449 + + + CF$UID + 453 + + + CF$UID + 457 + + + CF$UID + 460 + + + CF$UID + 464 + + + CF$UID + 467 + + + CF$UID + 471 + + + CF$UID + 475 + + + CF$UID + 478 + + + CF$UID + 481 + + + CF$UID + 484 + + + CF$UID + 487 + + + CF$UID + 491 + + + CF$UID + 495 + + + CF$UID + 499 + + + CF$UID + 503 + + + CF$UID + 506 + + + CF$UID + 510 + + + CF$UID + 514 + + + CF$UID + 516 + + + CF$UID + 520 + + + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 80 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/client/gui/screens/DialogDefinitions.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 82 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/client/renderer/TextureData.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 84 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/main_android.cpp + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 86 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/client/renderer/GameRenderer.cpp + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 88 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/dialogs/CreateNewWorldViewController.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 90 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/platform/audio/SoundSystemSL.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 92 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/dialogs/IDialog.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 94 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/AppPlatform.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 96 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/client/gui/screens/OptionsScreen.cpp + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 98 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/client/gui/components/RolledSelectionListV.cpp + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 100 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/minecraftpe/Shaders/Shader.fsh + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 102 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/App.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 104 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/main.mm + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 106 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/AppPlatform_iOS.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 108 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/client/gui/Screen.cpp + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 110 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/var/folders/Lm/Lm8jDJi3HfSE0j-mr0xqIk+++TQ/-Tmp-/forwardMethod2_disassembly_0x009230f4.s + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 112 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/client/renderer/gles.cpp + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 114 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/dialogs/DialogViewController.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 116 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/client/sound/SoundEngine.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 118 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/platform/input/Mouse.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 120 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/dialogs/NewWorldViewController.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 122 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/dialogs/NewWorldViewController.m + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 124 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/var/folders/Lm/Lm8jDJi3HfSE0j-mr0xqIk+++TQ/-Tmp-/UIApplicationMain_disassembly_0x00863c93.s + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 126 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/minecraftpe/EAGLView.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 128 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/main.cpp + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 130 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/EAGLView.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 132 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/platform/log.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 134 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/raknet/Export.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 136 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/AppPlatform_android.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 138 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/dialogs/CreateNewWorldViewController.m + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 140 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/client/gui/screens/touch/TouchSelectWorldScreen.cpp + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 142 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/AppPlatform_iOS.mm + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 144 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/raknet/SocketLayer.cpp + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 146 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/platform/input/Multitouch.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 148 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/System/Library/Frameworks/QuartzCore.framework/Headers/CADisplayLink.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 150 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 152 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/client/Minecraft.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 154 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/AppPlatform_win32.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 156 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/minecraftpe/en.lproj/InfoPlist.strings + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 158 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/en.lproj/InfoPlist.strings + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 160 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/minecraftpeViewController.m + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 162 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/minecraftpe/minecraftpeViewController.m + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 164 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/System/Library/Frameworks/CoreGraphics.framework/Headers/CGGeometry.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 166 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/client/Minecraft.cpp + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 168 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/client/player/input/touchscreen/TouchscreenInput.cpp + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 170 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/dialogs/DialogViewController.m + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 172 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIView.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 174 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/AppPlatform_iOS.cpp + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 176 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/platform/audio/SoundSystemSL.cpp + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 178 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/minecraftpeAppDelegate.m + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 180 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/client/Options.cpp + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 182 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/platform/audio/SoundSystem.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 184 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/dialogs/BaseDialogController.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 186 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/client/gui/screens/touch/TouchIngameBlockSelectionScreen.cpp + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 188 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/dialogs/BaseDialogController.mm + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 190 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/minecraftpe/minecraftpeViewController.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 192 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/minecraftpeViewController.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 194 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/dialogs/NewWorldViewController.mm + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 196 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/var/folders/Lm/Lm8jDJi3HfSE0j-mr0xqIk+++TQ/-Tmp-/-%5BUIViewController%20view%5D_disassembly_0x0090500e.s + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 198 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/dialogs/CreateNewWorldViewController.mm + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 200 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/Settings.bundle/en.lproj/Root.strings + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 202 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/minecraftpeViewController.mm + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 204 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/minecraftpeAppDelegate.mm + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 206 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/var/folders/Lm/Lm8jDJi3HfSE0j-mr0xqIk+++TQ/-Tmp-/__kill_disassembly_0x97acec5a.s + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 208 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/client/renderer/GameRenderer.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 210 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/AppPlatform_win32.cpp + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 212 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/minecraftpe/minecraftpeAppDelegate.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 214 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/minecraftpeAppDelegate.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 216 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObject.h + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 218 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/util/StringUtils.cpp + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 220 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/NinecraftApp.cpp + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 222 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/raknet/Gets.cpp + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 224 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/client/renderer/Tesselator.cpp + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 226 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/dialogs/BaseDialogController.m + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 228 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/minecraftpe/main.m + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 230 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/minecraftpe/EAGLView.m + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 232 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/EAGLView.m + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 238 + + + CF$UID + 239 + + + CF$UID + 240 + + + CF$UID + 241 + + + + PrimaryDocumentTimestamp + PrimaryDocumentVisibleCharacterRange + HideAllIssues + PrimaryDocumentSelectedCharacterRange + 340797362.26324201 + {0, 442} + + {0, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 243 + + + CF$UID + 244 + + + CF$UID + 240 + + + CF$UID + 245 + + + + 340556174.15654498 + {0, 416} + {342, 16} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 247 + + + CF$UID + 248 + + + CF$UID + 240 + + + CF$UID + 241 + + + + 340543736.64223099 + {0, 2315} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 250 + + + CF$UID + 251 + + + CF$UID + 252 + + + CF$UID + 253 + + + NS.objects + + + CF$UID + 254 + + + CF$UID + 255 + + + CF$UID + 240 + + + CF$UID + 256 + + + + PrimaryDocumentTimestamp + PrimaryDocumentVisibleCharacterRange + HideAllIssues + PrimaryDocumentSelectedCharacterRange + 340881331.67176199 + {818, 1855} + {1813, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 250 + + + CF$UID + 251 + + + CF$UID + 252 + + + CF$UID + 253 + + + NS.objects + + + CF$UID + 258 + + + CF$UID + 259 + + + CF$UID + 240 + + + CF$UID + 260 + + + + 340880024.17810303 + {0, 532} + {378, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 262 + + + CF$UID + 263 + + + CF$UID + 240 + + + CF$UID + 264 + + + + 340537053.91864598 + {0, 1653} + {82, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 250 + + + CF$UID + 251 + + + CF$UID + 252 + + + CF$UID + 253 + + + NS.objects + + + CF$UID + 266 + + + CF$UID + 267 + + + CF$UID + 240 + + + CF$UID + 268 + + + + 340818152.711968 + {0, 434} + {233, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 270 + + + CF$UID + 271 + + + CF$UID + 240 + + + CF$UID + 272 + + + + 340813265.18082899 + {584, 1821} + {1551, 49} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 274 + + + CF$UID + 275 + + + CF$UID + 240 + + + CF$UID + 276 + + + + 340797352.72316301 + {0, 662} + {348, 15} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 278 + + + CF$UID + 279 + + + CF$UID + 240 + + + CF$UID + 241 + + + + 340552607.17585999 + {5034, 1964} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 281 + + + CF$UID + 282 + + + CF$UID + 240 + + + CF$UID + 241 + + + + 340535047.16882098 + {0, 214} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 284 + + + CF$UID + 285 + + + CF$UID + 240 + + + CF$UID + 286 + + + + 340546757.78471798 + {36, 1455} + {234, 1} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 288 + + + CF$UID + 289 + + + CF$UID + 240 + + + CF$UID + 241 + + + + 340794732.92188603 + {0, 351} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 250 + + + CF$UID + 251 + + + CF$UID + 252 + + + CF$UID + 253 + + + NS.objects + + + CF$UID + 291 + + + CF$UID + 292 + + + CF$UID + 240 + + + CF$UID + 293 + + + + 340880996.53916597 + {0, 1432} + {831, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 295 + + + CF$UID + 296 + + + CF$UID + 240 + + + CF$UID + 297 + + + + 340549568.61774498 + {985, 1718} + {1284, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 299 + + + CF$UID + 300 + + + CF$UID + 240 + + + CF$UID + 241 + + + + 340719690.00321299 + {0, 1474} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 302 + + + CF$UID + 303 + + + CF$UID + 240 + + + CF$UID + 304 + + + + 340791960.33875799 + {7772, 2641} + {9039, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 250 + + + CF$UID + 251 + + + CF$UID + 252 + + + CF$UID + 253 + + + NS.objects + + + CF$UID + 306 + + + CF$UID + 307 + + + CF$UID + 240 + + + CF$UID + 308 + + + + 340820368.83969098 + {0, 292} + {229, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 310 + + + CF$UID + 311 + + + CF$UID + 240 + + + CF$UID + 241 + + + + 340543693.59852898 + {0, 1843} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 313 + + + CF$UID + 314 + + + CF$UID + 240 + + + CF$UID + 315 + + + + 340542672.96054202 + {0, 1537} + {57, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 317 + + + CF$UID + 318 + + + CF$UID + 240 + + + CF$UID + 241 + + + + 340791173.30940902 + {0, 205} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 320 + + + CF$UID + 321 + + + CF$UID + 240 + + + CF$UID + 322 + + + + 340721099.53803903 + {0, 2751} + {152, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 324 + + + CF$UID + 325 + + + CF$UID + 240 + + + CF$UID + 241 + + + + 340794303.946724 + {552, 2698} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 327 + + + CF$UID + 328 + + + CF$UID + 240 + + + CF$UID + 329 + + + + 340542222.46729898 + {0, 1006} + {711, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 331 + + + CF$UID + 332 + + + CF$UID + 240 + + + CF$UID + 241 + + + + 340543736.58116603 + {0, 614} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 250 + + + CF$UID + 251 + + + CF$UID + 252 + + + CF$UID + 253 + + + NS.objects + + + CF$UID + 334 + + + CF$UID + 335 + + + CF$UID + 240 + + + CF$UID + 241 + + + + 340880377.39120603 + {0, 1006} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 337 + + + CF$UID + 338 + + + CF$UID + 240 + + + CF$UID + 339 + + + + 340791705.60145098 + {0, 1143} + {31, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 341 + + + CF$UID + 342 + + + CF$UID + 240 + + + CF$UID + 343 + + + + 340791881.81944698 + {0, 624} + {624, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 345 + + + CF$UID + 346 + + + CF$UID + 240 + + + CF$UID + 241 + + + + 340569602.63351899 + {0, 1001} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 348 + + + CF$UID + 349 + + + CF$UID + 240 + + + CF$UID + 350 + + + + 340801068.43568701 + {0, 1627} + {1005, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 352 + + + CF$UID + 353 + + + CF$UID + 240 + + + CF$UID + 354 + + + + 340806194.817976 + {9965, 2382} + {10922, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 250 + + + CF$UID + 251 + + + CF$UID + 252 + + + CF$UID + 253 + + + NS.objects + + + CF$UID + 356 + + + CF$UID + 357 + + + CF$UID + 240 + + + CF$UID + 358 + + + + 340880953.02688998 + {0, 3073} + {602, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 360 + + + CF$UID + 361 + + + CF$UID + 240 + + + CF$UID + 362 + + + + 340549731.21460402 + {33366, 2268} + {34660, 13} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 364 + + + CF$UID + 365 + + + CF$UID + 240 + + + CF$UID + 366 + + + + 340619580.77385199 + {2287, 1774} + {2974, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 368 + + + CF$UID + 369 + + + CF$UID + 240 + + + CF$UID + 370 + + + + 340544930.076747 + {0, 2160} + {253, 36} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 372 + + + CF$UID + 373 + + + CF$UID + 240 + + + CF$UID + 374 + + + + 340555058.96936399 + {7851, 2942} + {9912, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 376 + + + CF$UID + 377 + + + CF$UID + 240 + + + CF$UID + 241 + + + + 340798053.717143 + {0, 1728} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 379 + + + CF$UID + 380 + + + CF$UID + 240 + + + CF$UID + 381 + + + + 340543738.26107401 + {0, 2048} + {1364, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 383 + + + CF$UID + 384 + + + CF$UID + 240 + + + CF$UID + 241 + + + + 340535143.56444699 + {0, 45} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 250 + + + CF$UID + 251 + + + CF$UID + 252 + + + CF$UID + 253 + + + NS.objects + + + CF$UID + 386 + + + CF$UID + 387 + + + CF$UID + 240 + + + CF$UID + 241 + + + + 340832546.239977 + {0, 45} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 389 + + + CF$UID + 390 + + + CF$UID + 240 + + + CF$UID + 391 + + + + 340542704.19813299 + {2727, 1915} + {4014, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 393 + + + CF$UID + 394 + + + CF$UID + 240 + + + CF$UID + 395 + + + + 340542488.42374998 + {0, 1644} + {262, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 397 + + + CF$UID + 398 + + + CF$UID + 240 + + + CF$UID + 399 + + + + 340721233.38726699 + {6543, 2401} + {8362, 64} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 401 + + + CF$UID + 402 + + + CF$UID + 240 + + + CF$UID + 241 + + + + 340806146.26956999 + {8204, 1008} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 404 + + + CF$UID + 405 + + + CF$UID + 240 + + + CF$UID + 241 + + + + 340791778.57001102 + {0, 1767} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 250 + + + CF$UID + 251 + + + CF$UID + 252 + + + CF$UID + 253 + + + NS.objects + + + CF$UID + 407 + + + CF$UID + 408 + + + CF$UID + 240 + + + CF$UID + 409 + + + + 340820368.61087102 + {0, 1507} + {1234, 40} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 411 + + + CF$UID + 412 + + + CF$UID + 240 + + + CF$UID + 413 + + + + 340718272.14271599 + {1831, 2832} + {3554, 71} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 415 + + + CF$UID + 416 + + + CF$UID + 240 + + + CF$UID + 417 + + + + 340555188.66517597 + {0, 2804} + {564, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 419 + + + CF$UID + 420 + + + CF$UID + 240 + + + CF$UID + 241 + + + + 340543820.84202802 + {0, 2164} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 422 + + + CF$UID + 423 + + + CF$UID + 240 + + + CF$UID + 424 + + + + 340545673.26639402 + {0, 2512} + {1170, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 426 + + + CF$UID + 427 + + + CF$UID + 240 + + + CF$UID + 428 + + + + 340791793.2701 + {0, 2326} + {453, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 430 + + + CF$UID + 431 + + + CF$UID + 240 + + + CF$UID + 432 + + + + 340537119.896873 + {0, 715} + {213, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 250 + + + CF$UID + 251 + + + CF$UID + 252 + + + CF$UID + 253 + + + NS.objects + + + CF$UID + 434 + + + CF$UID + 435 + + + CF$UID + 240 + + + CF$UID + 436 + + + + 340818442.000642 + {0, 676} + {582, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 438 + + + CF$UID + 439 + + + CF$UID + 240 + + + CF$UID + 440 + + + + 340541956.40699601 + {2359, 2267} + {3622, 2} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 250 + + + CF$UID + 251 + + + CF$UID + 252 + + + CF$UID + 253 + + + NS.objects + + + CF$UID + 442 + + + CF$UID + 443 + + + CF$UID + 240 + + + CF$UID + 444 + + + + 340818465.07652301 + {143, 1130} + {239, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 446 + + + CF$UID + 447 + + + CF$UID + 240 + + + CF$UID + 448 + + + + 340533993.85081398 + {0, 621} + {345, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 250 + + + CF$UID + 251 + + + CF$UID + 252 + + + CF$UID + 253 + + + NS.objects + + + CF$UID + 450 + + + CF$UID + 451 + + + CF$UID + 240 + + + CF$UID + 452 + + + + 340817874.976358 + {0, 1236} + {895, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 454 + + + CF$UID + 455 + + + CF$UID + 240 + + + CF$UID + 456 + + + + 340791172.97589397 + {2292, 2497} + {4301, 482} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 458 + + + CF$UID + 459 + + + CF$UID + 240 + + + CF$UID + 241 + + + + 340719719.164024 + {0, 2730} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 250 + + + CF$UID + 251 + + + CF$UID + 252 + + + CF$UID + 253 + + + NS.objects + + + CF$UID + 461 + + + CF$UID + 462 + + + CF$UID + 240 + + + CF$UID + 463 + + + + 340881331.67212301 + {0, 1006} + {918, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 250 + + + CF$UID + 251 + + + CF$UID + 252 + + + CF$UID + 253 + + + NS.objects + + + CF$UID + 465 + + + CF$UID + 466 + + + CF$UID + 240 + + + CF$UID + 241 + + + + 340866832.71621799 + {0, 84} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 250 + + + CF$UID + 251 + + + CF$UID + 252 + + + CF$UID + 253 + + + NS.objects + + + CF$UID + 468 + + + CF$UID + 469 + + + CF$UID + 240 + + + CF$UID + 470 + + + + 340880948.05918503 + {4485, 2547} + {6008, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 250 + + + CF$UID + 251 + + + CF$UID + 252 + + + CF$UID + 253 + + + NS.objects + + + CF$UID + 472 + + + CF$UID + 473 + + + CF$UID + 240 + + + CF$UID + 474 + + + + 340880045.64691103 + {0, 2512} + {510, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 476 + + + CF$UID + 477 + + + CF$UID + 240 + + + CF$UID + 241 + + + + 340793926.08398598 + {0, 344} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 250 + + + CF$UID + 251 + + + CF$UID + 252 + + + CF$UID + 253 + + + NS.objects + + + CF$UID + 479 + + + CF$UID + 480 + + + CF$UID + 240 + + + CF$UID + 241 + + + + 340880997.68194598 + {0, 1531} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 482 + + + CF$UID + 483 + + + CF$UID + 240 + + + CF$UID + 241 + + + + 340543749.19830197 + {0, 211} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 485 + + + CF$UID + 486 + + + CF$UID + 240 + + + CF$UID + 241 + + + + 340535142.91634798 + {0, 422} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 250 + + + CF$UID + 251 + + + CF$UID + 252 + + + CF$UID + 253 + + + NS.objects + + + CF$UID + 488 + + + CF$UID + 489 + + + CF$UID + 240 + + + CF$UID + 490 + + + + 340880023.24976403 + {0, 444} + {437, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 492 + + + CF$UID + 493 + + + CF$UID + 240 + + + CF$UID + 494 + + + + 340718295.006329 + {810, 1002} + {1205, 33} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 250 + + + CF$UID + 251 + + + CF$UID + 252 + + + CF$UID + 253 + + + NS.objects + + + CF$UID + 496 + + + CF$UID + 497 + + + CF$UID + 240 + + + CF$UID + 498 + + + + 340877860.08079201 + {0, 1507} + {502, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 500 + + + CF$UID + 501 + + + CF$UID + 240 + + + CF$UID + 502 + + + + 340557391.98813099 + {1065, 1436} + {2499, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 504 + + + CF$UID + 505 + + + CF$UID + 240 + + + CF$UID + 241 + + + + 340555057.11852503 + {0, 426} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 507 + + + CF$UID + 508 + + + CF$UID + 240 + + + CF$UID + 509 + + + + 340552679.71372902 + {6566, 1976} + {7024, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 511 + + + CF$UID + 512 + + + CF$UID + 240 + + + CF$UID + 513 + + + + 340801213.55270803 + {0, 343} + {215, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 515 + + + CF$UID + 289 + + + CF$UID + 240 + + + CF$UID + 241 + + + + 340535146.379291 + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 517 + + + CF$UID + 518 + + + CF$UID + 240 + + + CF$UID + 519 + + + + 340542225.89964199 + {1188, 2517} + {3059, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 250 + + + CF$UID + 251 + + + CF$UID + 252 + + + CF$UID + 253 + + + NS.objects + + + CF$UID + 521 + + + CF$UID + 522 + + + CF$UID + 240 + + + CF$UID + 523 + + + + 340880832.02061498 + {0, 1737} + {1064, 0} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 525 + + + CF$UID + 527 + + + CF$UID + 529 + + + CF$UID + 531 + + + CF$UID + 533 + + + CF$UID + 535 + + + CF$UID + 537 + + + CF$UID + 539 + + + CF$UID + 541 + + + NS.objects + + + CF$UID + 543 + + + CF$UID + 556 + + + CF$UID + 567 + + + CF$UID + 579 + + + CF$UID + 586 + + + CF$UID + 592 + + + CF$UID + 598 + + + CF$UID + 602 + + + CF$UID + 608 + + + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 526 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/dialogs/CreateNewWorld_modal.xib + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 528 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/dialogs/minecraftpe-Info.xib + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 530 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/dialogs/CreateNewWorld_ipad.xib + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 532 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/en.lproj/MainWindow.xib + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 534 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/DialogView.xib + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 536 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/dialogs/DialogViewController.xib + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 538 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/dialogs/NewWorld.xib + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 540 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/en.lproj/minecraftpeViewController.xib + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 542 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/dialogs/CreateNewWorld.xib + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 544 + + + CF$UID + 545 + + + CF$UID + 546 + + + CF$UID + 547 + + + NS.objects + + + CF$UID + 548 + + + CF$UID + 549 + + + CF$UID + 547 + + + CF$UID + 551 + + + + IBDockViewController + SelectedObjectIDs + SelectionProvider + IBCanvasViewController + + $class + + CF$UID + 44 + + NS.keys + + NS.objects + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 550 + + + + 1 + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 552 + + + CF$UID + 553 + + + NS.objects + + + CF$UID + 554 + + + CF$UID + 555 + + + + ObjectIDToLastKnownCanvasPositionMap + EditedTopLevelObjectIDs + + $class + + CF$UID + 44 + + NS.keys + + NS.objects + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 550 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 544 + + + CF$UID + 545 + + + CF$UID + 546 + + + CF$UID + 547 + + + NS.objects + + + CF$UID + 557 + + + CF$UID + 558 + + + CF$UID + 547 + + + CF$UID + 559 + + + + + $class + + CF$UID + 44 + + NS.keys + + NS.objects + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 550 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 552 + + + CF$UID + 553 + + + NS.objects + + + CF$UID + 560 + + + CF$UID + 566 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 561 + + + CF$UID + 550 + + + CF$UID + 562 + + + NS.objects + + + CF$UID + 563 + + + CF$UID + 564 + + + CF$UID + 565 + + + + 9 + 10 + {285, 330} + {47, 204} + {104, 180} + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 550 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 568 + + + CF$UID + 569 + + + CF$UID + 570 + + + CF$UID + 571 + + + NS.objects + + + CF$UID + 572 + + + CF$UID + 573 + + + CF$UID + 571 + + + CF$UID + 574 + + + + IBDockViewController + SelectedObjectIDs + SelectionProvider + IBCanvasViewController + + $class + + CF$UID + 44 + + NS.keys + + NS.objects + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 561 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 575 + + + CF$UID + 576 + + + NS.objects + + + CF$UID + 577 + + + CF$UID + 578 + + + + ObjectIDToLastKnownCanvasPositionMap + EditedTopLevelObjectIDs + + $class + + CF$UID + 44 + + NS.keys + + NS.objects + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 561 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 544 + + + CF$UID + 545 + + + CF$UID + 546 + + + CF$UID + 547 + + + NS.objects + + + CF$UID + 580 + + + CF$UID + 581 + + + CF$UID + 547 + + + CF$UID + 583 + + + + + $class + + CF$UID + 44 + + NS.keys + + NS.objects + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 582 + + + + 2 + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 552 + + + CF$UID + 553 + + + NS.objects + + + CF$UID + 584 + + + CF$UID + 585 + + + + + $class + + CF$UID + 44 + + NS.keys + + NS.objects + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 562 + + + CF$UID + 582 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 544 + + + CF$UID + 545 + + + CF$UID + 546 + + + CF$UID + 547 + + + NS.objects + + + CF$UID + 587 + + + CF$UID + 588 + + + CF$UID + 547 + + + CF$UID + 589 + + + + + $class + + CF$UID + 44 + + NS.keys + + NS.objects + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 550 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 552 + + + CF$UID + 553 + + + NS.objects + + + CF$UID + 590 + + + CF$UID + 591 + + + + + $class + + CF$UID + 44 + + NS.keys + + NS.objects + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 550 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 544 + + + CF$UID + 545 + + + CF$UID + 546 + + + CF$UID + 547 + + + NS.objects + + + CF$UID + 593 + + + CF$UID + 594 + + + CF$UID + 547 + + + CF$UID + 595 + + + + + $class + + CF$UID + 44 + + NS.keys + + NS.objects + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 550 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 552 + + + CF$UID + 553 + + + NS.objects + + + CF$UID + 596 + + + CF$UID + 597 + + + + + $class + + CF$UID + 44 + + NS.keys + + NS.objects + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 550 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 544 + + + CF$UID + 545 + + + CF$UID + 546 + + + CF$UID + 547 + + + NS.objects + + + CF$UID + 599 + + + CF$UID + 65 + + + CF$UID + 547 + + + CF$UID + 600 + + + + + $class + + CF$UID + 44 + + NS.keys + + NS.objects + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 552 + + + CF$UID + 553 + + + NS.objects + + + CF$UID + 560 + + + CF$UID + 601 + + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 550 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 568 + + + CF$UID + 569 + + + CF$UID + 570 + + + CF$UID + 571 + + + NS.objects + + + CF$UID + 603 + + + CF$UID + 604 + + + CF$UID + 571 + + + CF$UID + 605 + + + + + $class + + CF$UID + 44 + + NS.keys + + NS.objects + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 582 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 575 + + + CF$UID + 576 + + + NS.objects + + + CF$UID + 606 + + + CF$UID + 607 + + + + + $class + + CF$UID + 44 + + NS.keys + + NS.objects + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 582 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 568 + + + CF$UID + 569 + + + CF$UID + 570 + + + CF$UID + 571 + + + NS.objects + + + CF$UID + 609 + + + CF$UID + 65 + + + CF$UID + 610 + + + CF$UID + 611 + + + + + $class + + CF$UID + 44 + + NS.keys + + NS.objects + + + IBStructureViewController + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 575 + + + CF$UID + 576 + + + NS.objects + + + CF$UID + 560 + + + CF$UID + 612 + + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 561 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 121 + + + NS.objects + + + CF$UID + 614 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 237 + + + CF$UID + 234 + + + CF$UID + 235 + + + NS.objects + + + CF$UID + 241 + + + CF$UID + 615 + + + CF$UID + 616 + + + + 340720890.35966402 + {182, 2705} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 618 + + + CF$UID + 620 + + + NS.objects + + + CF$UID + 622 + + + CF$UID + 694 + + + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 619 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/minecraftpe.xcodeproj + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 621 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe.xcodeproj/ + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 623 + + + CF$UID + 624 + + + CF$UID + 625 + + + CF$UID + 626 + + + CF$UID + 627 + + + CF$UID + 628 + + + NS.objects + + + CF$UID + 629 + + + CF$UID + 630 + + + CF$UID + 641 + + + CF$UID + 642 + + + CF$UID + 678 + + + CF$UID + 679 + + + + Xcode3ProjectEditorPreviousProjectEditorClass + Xcode3ProjectEditor.sourceList.splitview + Xcode3ProjectEditorPreviousTargetEditorClass + Xcode3ProjectEditorSelectedDocumentLocations + Xcode3ProjectEditor_Xcode3BuildSettingsEditor + Xcode3ProjectEditor_Xcode3BuildPhasesEditor + Xcode3BuildSettingsEditor + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 631 + + + NS.objects + + + CF$UID + 632 + + + + DVTSplitViewItems + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 633 + + + CF$UID + 639 + + + + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 634 + + + CF$UID + 635 + + + NS.objects + + + CF$UID + 636 + + + CF$UID + 637 + + + + DVTIdentifier + DVTViewMagnitude + + 170 + + $classes + + NSDictionary + NSObject + + $classname + NSDictionary + + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 634 + + + CF$UID + 635 + + + NS.objects + + + CF$UID + 636 + + + CF$UID + 640 + + + + 1490 + Xcode3BuildPhasesEditor + + $class + + CF$UID + 43 + + NS.objects + + + CF$UID + 643 + + + + + $class + + CF$UID + 677 + + documentURL + + CF$UID + 644 + + selection + + CF$UID + 646 + + timestamp + + CF$UID + 645 + + + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/minecraftpe.xcodeproj/ + 340536604.39212799 + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 647 + + + CF$UID + 648 + + + CF$UID + 649 + + + NS.objects + + + CF$UID + 650 + + + CF$UID + 629 + + + CF$UID + 651 + + + + Project + Editor + Xcode3BuildSettingsEditorLocations + minecraftpe + + $class + + CF$UID + 43 + + NS.objects + + + CF$UID + 652 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 653 + + + CF$UID + 654 + + + CF$UID + 655 + + + CF$UID + 656 + + + CF$UID + 657 + + + CF$UID + 658 + + + NS.objects + + + CF$UID + 550 + + + CF$UID + 659 + + + CF$UID + 41 + + + CF$UID + 41 + + + CF$UID + 660 + + + CF$UID + 550 + + + + Xcode3BuildSettingsEditorMode + Selected Build Properties + Xcode3BuildSettingsEditorDisplayMode + Xcode3BuildPropertyValueDisplayMode + Collapsed Build Property Categories + Xcode3BuildPropertyNameDisplayMode + + $class + + CF$UID + 70 + + NS.objects + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 661 + + + CF$UID + 662 + + + CF$UID + 663 + + + CF$UID + 664 + + + CF$UID + 665 + + + CF$UID + 666 + + + CF$UID + 667 + + + CF$UID + 668 + + + CF$UID + 669 + + + CF$UID + 670 + + + CF$UID + 671 + + + CF$UID + 672 + + + CF$UID + 673 + + + CF$UID + 674 + + + CF$UID + 675 + + + CF$UID + 676 + + + + + $class + + CF$UID + 29 + + NS.string + Architectures||ARCHS + + + $class + + CF$UID + 29 + + NS.string + Architectures||SDKROOT + + + $class + + CF$UID + 29 + + NS.string + Build Options||GCC_VERSION + + + $class + + CF$UID + 29 + + NS.string + Deployment||INSTALL_PATH + + + $class + + CF$UID + 29 + + NS.string + Deployment||STRIP_INSTALLED_PRODUCT + + + $class + + CF$UID + 29 + + NS.string + Deployment||TARGETED_DEVICE_FAMILY + + + $class + + CF$UID + 29 + + NS.string + Deployment||IPHONEOS_DEPLOYMENT_TARGET + + + $class + + CF$UID + 29 + + NS.string + Packaging||INFOPLIST_FILE + + + $class + + CF$UID + 29 + + NS.string + Packaging||PRODUCT_NAME + + + $class + + CF$UID + 29 + + NS.string + Search Paths||ALWAYS_SEARCH_USER_PATHS + + + $class + + CF$UID + 29 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_DYNAMIC_NO_PIC + + + $class + + CF$UID + 29 + + NS.string + LLVM GCC 4.2 - Code Generation||GCC_SYMBOLS_PRIVATE_EXTERN + + + $class + + CF$UID + 29 + + NS.string + LLVM GCC 4.2 - Language||GCC_C_LANGUAGE_STANDARD + + + $class + + CF$UID + 29 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_ABOUT_RETURN_TYPE + + + $class + + CF$UID + 29 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_ABOUT_MISSING_PROTOTYPES + + + $class + + CF$UID + 29 + + NS.string + LLVM GCC 4.2 - Warnings||GCC_WARN_UNUSED_VARIABLE + + + $classes + + Xcode3ProjectDocumentLocation + DVTDocumentLocation + NSObject + + $classname + Xcode3ProjectDocumentLocation + + + $class + + CF$UID + 44 + + NS.keys + + NS.objects + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 680 + + + CF$UID + 681 + + + CF$UID + 682 + + + CF$UID + 683 + + + CF$UID + 684 + + + CF$UID + 685 + + + NS.objects + + + CF$UID + 686 + + + CF$UID + 689 + + + CF$UID + 690 + + + CF$UID + 691 + + + CF$UID + 692 + + + CF$UID + 693 + + + + Xcode3BuildPhasesEditorDisclosedNamesKey2.0 + D5CF9C41144C225000E4244F + D5CF9C3F144C225000E4244F + D5CF9C40144C225000E4244F + D5CF9C3E144C225000E4244F + kXcode3BuildPhasesEditorScrollPointKey + + $class + + CF$UID + 71 + + NS.objects + + + CF$UID + 687 + + + CF$UID + 688 + + + + Copy Bundle Resources + Compile Sources + + $class + + CF$UID + 44 + + NS.keys + + NS.objects + + + + $class + + CF$UID + 44 + + NS.keys + + NS.objects + + + + $class + + CF$UID + 44 + + NS.keys + + NS.objects + + + + $class + + CF$UID + 44 + + NS.keys + + NS.objects + + + {0, 3949} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 695 + + + CF$UID + 696 + + + CF$UID + 697 + + + CF$UID + 698 + + + CF$UID + 699 + + + NS.objects + + + CF$UID + 700 + + + CF$UID + 701 + + + CF$UID + 711 + + + CF$UID + 712 + + + CF$UID + 721 + + + + Xcode3ProjectEditorPreviousProjectEditorClass + Xcode3ProjectEditor.sourceList.splitview + Xcode3ProjectEditorPreviousTargetEditorClass + Xcode3ProjectEditorSelectedDocumentLocations + Xcode3ProjectEditor_Xcode3TargetEditor + Xcode3BuildSettingsEditor + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 702 + + + NS.objects + + + CF$UID + 703 + + + + DVTSplitViewItems + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 704 + + + CF$UID + 709 + + + + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 705 + + + CF$UID + 706 + + + NS.objects + + + CF$UID + 707 + + + CF$UID + 708 + + + + DVTIdentifier + DVTViewMagnitude + + 170 + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 705 + + + CF$UID + 706 + + + NS.objects + + + CF$UID + 707 + + + CF$UID + 710 + + + + 890 + Xcode3TargetEditor + + $class + + CF$UID + 43 + + NS.objects + + + CF$UID + 713 + + + + + $class + + CF$UID + 677 + + documentURL + + CF$UID + 714 + + selection + + CF$UID + 716 + + timestamp + + CF$UID + 715 + + + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe.xcodeproj/ + 340876527.804124 + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 717 + + + CF$UID + 718 + + + NS.objects + + + CF$UID + 719 + + + CF$UID + 720 + + + + Editor + Target + Xcode3TargetEditor + minecraftpe + + $class + + CF$UID + 44 + + NS.keys + + NS.objects + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 723 + + + NS.objects + + + CF$UID + 725 + + + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 724 + + + x-xcode-log://FB408BA9-222C-4255-801E-436D5F90B4A6 + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 46 + + + NS.objects + + + CF$UID + 65 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 727 + + + CF$UID + 728 + + + NS.objects + + + CF$UID + 729 + + + CF$UID + 730 + + + + IDEDeviceLocation + IDEDeviceArchitecture + dvtdevice-iphonesimulator:/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.0.sdk-iPhone + i386 + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 732 + + + NS.objects + + + CF$UID + 733 + + + + IDENameString + minecraftpe + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 735 + + + CF$UID + 736 + + + CF$UID + 737 + + + NS.objects + + + CF$UID + 738 + + + CF$UID + 764 + + + CF$UID + 745 + + + + IDEActivityReportCompletionSummaryStringSegments + IDEActivityReportOptions + IDEActivityReportTitle + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 739 + + + CF$UID + 746 + + + CF$UID + 750 + + + CF$UID + 755 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 740 + + + CF$UID + 741 + + + CF$UID + 742 + + + NS.objects + + + CF$UID + 743 + + + CF$UID + 744 + + + CF$UID + 745 + + + + IDEActivityReportStringSegmentPriority + IDEActivityReportStringSegmentBackSeparator + IDEActivityReportStringSegmentStringValue + 2 + + Build + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 740 + + + CF$UID + 741 + + + CF$UID + 742 + + + NS.objects + + + CF$UID + 747 + + + CF$UID + 748 + + + CF$UID + 749 + + + + 4 + : + minecraftpe + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 740 + + + CF$UID + 741 + + + CF$UID + 742 + + + NS.objects + + + CF$UID + 751 + + + CF$UID + 752 + + + CF$UID + 753 + + + + 1 + │ + + $class + + CF$UID + 754 + + NS.data + + YnBsaXN0MDDUAQIDBAUGOzxYJHZlcnNpb25YJG9iamVjdHNZJGFy + Y2hpdmVyVCR0b3ASAAGGoK0HCA8QGhscJCUrMTQ3VSRudWxs0wkK + CwwNDlxOU0F0dHJpYnV0ZXNWJGNsYXNzWE5TU3RyaW5ngAOADIAC + WVN1Y2NlZWRlZNMKERITFBdXTlMua2V5c1pOUy5vYmplY3RzgAui + FRaABIAFohgZgAaACVZOU0ZvbnRXTlNDb2xvctQKHR4fICEiI1ZO + U05hbWVWTlNTaXplWE5TZkZsYWdzgAiAByNAJgAAAAAAABENEF8Q + EUx1Y2lkYUdyYW5kZS1Cb2xk0iYnKClaJGNsYXNzbmFtZVgkY2xh + c3Nlc1ZOU0ZvbnSiKCpYTlNPYmplY3TTCiwtLi8wXE5TQ29sb3JT + cGFjZVdOU1doaXRlgAoQA0IwANImJzIzV05TQ29sb3KiMirSJic1 + NlxOU0RpY3Rpb25hcnmiNSrSJic4OV8QEk5TQXR0cmlidXRlZFN0 + cmluZ6I6Kl8QEk5TQXR0cmlidXRlZFN0cmluZ18QD05TS2V5ZWRB + cmNoaXZlctE9PlRyb290gAEACAARABoAIwAtADIANwBFAEsAUgBf + AGYAbwBxAHMAdQB/AIYAjgCZAJsAngCgAKIApQCnAKkAsAC4AMEA + yADPANgA2gDcAOUA6AD8AQEBDAEVARwBHwEoAS8BPAFEAUYBSAFL + AVABWAFbAWABbQFwAXUBigGNAaIBtAG3AbwAAAAAAAACAQAAAAAA + AAA/AAAAAAAAAAAAAAAAAAABvg== + + + + $classes + + NSMutableData + NSData + NSObject + + $classname + NSMutableData + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 740 + + + CF$UID + 756 + + + CF$UID + 757 + + + CF$UID + 742 + + + CF$UID + 758 + + + CF$UID + 759 + + + NS.objects + + + CF$UID + 760 + + + CF$UID + 550 + + + CF$UID + 761 + + + CF$UID + 763 + + + CF$UID + 550 + + + CF$UID + 550 + + + + IDEActivityReportStringSegmentType + IDEActivityReportStringSegmentDate + IDEActivityReportStringSegmentDateStyle + IDEActivityReportStringSegmentTimeStyle + 3 + + $class + + CF$UID + 762 + + NS.time + 340881287.433676 + + + $classes + + NSDate + NSObject + + $classname + NSDate + + Today at 11:14 + 234 + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 4 + + + CF$UID + 3 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 767 + + + CF$UID + 769 + + + CF$UID + 771 + + + CF$UID + 773 + + + CF$UID + 775 + + + CF$UID + 776 + + + NS.objects + + + CF$UID + 778 + + + CF$UID + 783 + + + CF$UID + 786 + + + CF$UID + 789 + + + CF$UID + 792 + + + CF$UID + 795 + + + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 768 + + + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/minecraftpe/Shaders/Shader.fsh + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 770 + + + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/AppPlatform_iOS.mm + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 772 + + + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/dialogs/CreateNewWorld.xib + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 774 + + + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/minecraftpeViewController.mm + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 724 + + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 777 + + + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/client/gui/screens/touch/TouchSelectWorldScreen.cpp + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 779 + + + CF$UID + 780 + + + NS.objects + + + CF$UID + 781 + + + CF$UID + 782 + + + + width + height + 600 + 600 + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 779 + + + CF$UID + 780 + + + NS.objects + + + CF$UID + 784 + + + CF$UID + 785 + + + + 600 + 600 + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 779 + + + CF$UID + 780 + + + NS.objects + + + CF$UID + 787 + + + CF$UID + 788 + + + + 600 + 578 + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 779 + + + CF$UID + 780 + + + NS.objects + + + CF$UID + 790 + + + CF$UID + 791 + + + + 600 + 600 + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 779 + + + CF$UID + 780 + + + NS.objects + + + CF$UID + 793 + + + CF$UID + 794 + + + + 600 + 600 + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 779 + + + CF$UID + 780 + + + NS.objects + + + CF$UID + 796 + + + CF$UID + 797 + + + + 600 + 600 + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 799 + + + CF$UID + 801 + + + CF$UID + 803 + + + CF$UID + 805 + + + CF$UID + 807 + + + CF$UID + 809 + + + CF$UID + 811 + + + CF$UID + 813 + + + CF$UID + 815 + + + CF$UID + 817 + + + + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 800 + + + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/client/renderer/GameRenderer.cpp + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 802 + + + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/client/renderer/GameRenderer.h + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 804 + + + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/AppPlatform_iOS.h + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 806 + + + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/AppPlatform_iOS.mm + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 808 + + + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/minecraftpeViewController.mm + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 810 + + + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/EAGLView.m + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 812 + + + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/EAGLView.h + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 814 + + + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/minecraftpeAppDelegate.mm + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 816 + + + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/dialogs/CreateNewWorldViewController.mm + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 818 + + + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/dialogs/CreateNewWorldViewController.h + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 820 + + + CF$UID + 821 + + + CF$UID + 822 + + + CF$UID + 823 + + + CF$UID + 824 + + + CF$UID + 825 + + + CF$UID + 826 + + + CF$UID + 827 + + + NS.objects + + + CF$UID + 828 + + + CF$UID + 829 + + + CF$UID + 240 + + + CF$UID + 3 + + + CF$UID + 825 + + + CF$UID + 830 + + + CF$UID + 240 + + + CF$UID + 17 + + + + IDEWindowFrame + IDEOrderedWorkspaceTabControllers + IDEWindowInFullscreenMode + IDEWorkspaceWindowControllerUniqueIdentifier + IDEActiveWorkspaceTabController + IDEWorkspaceTabController_5AB00B29-6568-407B-A13F-687A0F85973F + IDEWindowToolbarIsVisible + IDEWindowTabBarIsVisible + {{0, 132}, {600, 646}} + + $class + + CF$UID + 43 + + NS.objects + + + CF$UID + 825 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 831 + + + CF$UID + 832 + + + CF$UID + 833 + + + CF$UID + 834 + + + CF$UID + 835 + + + CF$UID + 836 + + + CF$UID + 837 + + + CF$UID + 838 + + + NS.objects + + + CF$UID + 839 + + + CF$UID + 240 + + + CF$UID + 41 + + + CF$UID + 840 + + + CF$UID + 846 + + + CF$UID + 868 + + + CF$UID + 240 + + + CF$UID + 877 + + + + IDETabLabel + IDEShowNavigator + AssistantEditorsLayout + IDEWorkspaceTabControllerUtilityAreaSplitView + IDENavigatorArea + IDEWorkspaceTabControllerDesignAreaSplitView + IDEShowUtilities + IDEEditorArea + CreateNewWorldViewController.mm + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 702 + + + NS.objects + + + CF$UID + 841 + + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 842 + + + CF$UID + 844 + + + + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 705 + + + CF$UID + 706 + + + NS.objects + + + CF$UID + 707 + + + CF$UID + 843 + + + + 281 + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 705 + + + CF$UID + 706 + + + NS.objects + + + CF$UID + 707 + + + CF$UID + 845 + + + + 319 + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 847 + + + CF$UID + 848 + + + NS.objects + + + CF$UID + 848 + + + CF$UID + 849 + + + + SelectedNavigator + Xcode.IDEKit.Navigator.Structure + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 850 + + + CF$UID + 851 + + + CF$UID + 852 + + + CF$UID + 853 + + + CF$UID + 854 + + + CF$UID + 855 + + + CF$UID + 856 + + + NS.objects + + + CF$UID + 857 + + + CF$UID + 240 + + + CF$UID + 858 + + + CF$UID + 240 + + + CF$UID + 240 + + + CF$UID + 860 + + + CF$UID + 865 + + + + IDEVisibleRect + IDEUnsavedDocumentFilteringEnabled + IDENavigatorExpandedItemsBeforeFilteringSet + IDERecentDocumentFilteringEnabled + IDESCMStatusFilteringEnabled + IDESelectedObjects + IDEExpandedItemsSet + {{0, 0}, {0, 0}} + + $class + + CF$UID + 859 + + NS.objects + + + + $classes + + NSSet + NSObject + + $classname + NSSet + + + $class + + CF$UID + 43 + + NS.objects + + + CF$UID + 861 + + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 862 + + + CF$UID + 863 + + + CF$UID + 864 + + + + minecraftpe + Dialogs + CreateNewWorldViewController.mm + + $class + + CF$UID + 859 + + NS.objects + + + CF$UID + 866 + + + CF$UID + 867 + + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 862 + + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 862 + + + CF$UID + 863 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 702 + + + NS.objects + + + CF$UID + 869 + + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 870 + + + CF$UID + 872 + + + CF$UID + 874 + + + + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 705 + + + CF$UID + 706 + + + NS.objects + + + CF$UID + 835 + + + CF$UID + 871 + + + + 311 + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 705 + + + CF$UID + 706 + + + NS.objects + + + CF$UID + 838 + + + CF$UID + 873 + + + + 1349 + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 705 + + + CF$UID + 706 + + + NS.objects + + + CF$UID + 875 + + + CF$UID + 876 + + + + IDEUtilitiesArea + 260 + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 878 + + + CF$UID + 879 + + + CF$UID + 880 + + + CF$UID + 881 + + + CF$UID + 882 + + + CF$UID + 883 + + + CF$UID + 884 + + + CF$UID + 885 + + + NS.objects + + + CF$UID + 886 + + + CF$UID + 903 + + + CF$UID + 937 + + + CF$UID + 17 + + + CF$UID + 41 + + + CF$UID + 962 + + + CF$UID + 970 + + + CF$UID + 240 + + + + layoutTree + IDEEditorMode_Standard + IDEEDitorArea_DebugArea + IDEShowEditor + EditorMode + DebuggerSplitView + DefaultPersistentRepresentations + ShowDebuggerArea + + $class + + CF$UID + 902 + + geniusEditorContextNode + + CF$UID + 0 + + primaryEditorContextNode + + CF$UID + 887 + + rootLayoutTreeNode + + CF$UID + 899 + + + + $class + + CF$UID + 901 + + children + + CF$UID + 0 + + contentType + 1 + documentArchivableRepresentation + + CF$UID + 888 + + orientation + 0 + parent + + CF$UID + 899 + + + + $class + + CF$UID + 898 + + DocumentLocation + + CF$UID + 896 + + DomainIdentifier + + CF$UID + 889 + + IdentifierPath + + CF$UID + 890 + + IndexOfDocumentIdentifier + + CF$UID + 41 + + + Xcode.IDENavigableItemDomain.WorkspaceStructure + + $class + + CF$UID + 43 + + NS.objects + + + CF$UID + 891 + + + CF$UID + 893 + + + CF$UID + 894 + + + + + $class + + CF$UID + 892 + + Identifier + + CF$UID + 864 + + + + $classes + + IDEArchivableStringIndexPair + NSObject + + $classname + IDEArchivableStringIndexPair + + + $class + + CF$UID + 892 + + Identifier + + CF$UID + 863 + + + + $class + + CF$UID + 892 + + Identifier + + CF$UID + 895 + + + minecraftpe + + $class + + CF$UID + 897 + + documentURL + + CF$UID + 198 + + timestamp + + CF$UID + 0 + + + + $classes + + DVTDocumentLocation + NSObject + + $classname + DVTDocumentLocation + + + $classes + + IDENavigableItemArchivableRepresentation + NSObject + + $classname + IDENavigableItemArchivableRepresentation + + + $class + + CF$UID + 901 + + children + + CF$UID + 900 + + contentType + 0 + documentArchivableRepresentation + + CF$UID + 0 + + orientation + 0 + parent + + CF$UID + 0 + + + + $class + + CF$UID + 43 + + NS.objects + + + CF$UID + 887 + + + + + $classes + + IDEWorkspaceTabControllerLayoutTreeNode + NSObject + + $classname + IDEWorkspaceTabControllerLayoutTreeNode + + + $classes + + IDEWorkspaceTabControllerLayoutTree + NSObject + + $classname + IDEWorkspaceTabControllerLayoutTree + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 904 + + + NS.objects + + + CF$UID + 905 + + + + EditorLayout_PersistentRepresentation + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 906 + + + NS.objects + + + CF$UID + 907 + + + + Main + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 908 + + + CF$UID + 909 + + + CF$UID + 910 + + + NS.objects + + + CF$UID + 911 + + + CF$UID + 41 + + + CF$UID + 935 + + + + EditorLayout_StateSavingStateDictionaries + EditorLayout_Selected + EditorLayout_Geometry + + $class + + CF$UID + 43 + + NS.objects + + + CF$UID + 912 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 913 + + + CF$UID + 914 + + + CF$UID + 915 + + + CF$UID + 916 + + + CF$UID + 917 + + + CF$UID + 918 + + + CF$UID + 919 + + + NS.objects + + + CF$UID + 920 + + + CF$UID + 921 + + + CF$UID + 927 + + + CF$UID + 931 + + + CF$UID + 864 + + + CF$UID + 932 + + + CF$UID + 933 + + + + FileDataType + ArchivableRepresentation + EditorState + NavigableItemName + DocumentNavigableItemName + DocumentExtensionIdentifier + DocumentURL + public.objective-c-plus-plus-source + + $class + + CF$UID + 898 + + DocumentLocation + + CF$UID + 896 + + DomainIdentifier + + CF$UID + 889 + + IdentifierPath + + CF$UID + 922 + + IndexOfDocumentIdentifier + + CF$UID + 41 + + + + $class + + CF$UID + 43 + + NS.objects + + + CF$UID + 923 + + + CF$UID + 924 + + + CF$UID + 925 + + + + + $class + + CF$UID + 892 + + Identifier + + CF$UID + 864 + + + + $class + + CF$UID + 892 + + Identifier + + CF$UID + 863 + + + + $class + + CF$UID + 892 + + Identifier + + CF$UID + 926 + + + minecraftpe + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 250 + + + CF$UID + 251 + + + CF$UID + 252 + + + CF$UID + 253 + + + NS.objects + + + CF$UID + 928 + + + CF$UID + 929 + + + CF$UID + 240 + + + CF$UID + 930 + + + + 340881331.67313403 + {0, 1006} + {918, 0} + -textFieldShouldReturn: + Xcode.IDEKit.EditorDocument.SourceCode + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 934 + + + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/dialogs/CreateNewWorldViewController.mm + + $class + + CF$UID + 43 + + NS.objects + + + CF$UID + 936 + + + + {{0, 0}, {600, 600}} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 938 + + + CF$UID + 939 + + + CF$UID + 940 + + + CF$UID + 941 + + + CF$UID + 942 + + + CF$UID + 943 + + + NS.objects + + + CF$UID + 550 + + + CF$UID + 944 + + + CF$UID + 946 + + + CF$UID + 550 + + + CF$UID + 948 + + + CF$UID + 956 + + + + LayoutFocusMode + console + variables + LayoutMode + IDEDebugArea_SplitView + IDEDebuggerAreaSplitView + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 945 + + + NS.objects + + + CF$UID + 41 + + + + ConsoleFilterMode + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 947 + + + NS.objects + + + CF$UID + 550 + + + + VariablesViewSelectedScope + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 702 + + + NS.objects + + + CF$UID + 949 + + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 950 + + + CF$UID + 953 + + + + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 705 + + + CF$UID + 706 + + + NS.objects + + + CF$UID + 951 + + + CF$UID + 952 + + + + VariablesView + 301 + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 705 + + + CF$UID + 706 + + + NS.objects + + + CF$UID + 954 + + + CF$UID + 955 + + + + ConsoleArea + 298 + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 702 + + + NS.objects + + + CF$UID + 957 + + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 958 + + + CF$UID + 960 + + + + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 705 + + + CF$UID + 706 + + + NS.objects + + + CF$UID + 951 + + + CF$UID + 959 + + + + 301 + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 705 + + + CF$UID + 706 + + + NS.objects + + + CF$UID + 954 + + + CF$UID + 961 + + + + 298 + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 702 + + + NS.objects + + + CF$UID + 963 + + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 964 + + + CF$UID + 967 + + + + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 705 + + + CF$UID + 706 + + + NS.objects + + + CF$UID + 965 + + + CF$UID + 966 + + + + IDEEditor + 203 + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 705 + + + CF$UID + 706 + + + NS.objects + + + CF$UID + 968 + + + CF$UID + 969 + + + + IDEDebuggerArea + 115 + + $class + + CF$UID + 44 + + NS.keys + + NS.objects + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 820 + + + CF$UID + 821 + + + CF$UID + 822 + + + CF$UID + 972 + + + CF$UID + 973 + + + CF$UID + 824 + + + CF$UID + 826 + + + CF$UID + 827 + + + NS.objects + + + CF$UID + 974 + + + CF$UID + 975 + + + CF$UID + 240 + + + CF$UID + 4 + + + CF$UID + 976 + + + CF$UID + 973 + + + CF$UID + 17 + + + CF$UID + 17 + + + + IDEWorkspaceWindowControllerUniqueIdentifier + IDEWorkspaceTabController_4438C65F-E9AF-46CD-AD23-D0A95A9D07AE + {{1280, -280}, {1920, 1080}} + + $class + + CF$UID + 43 + + NS.objects + + + CF$UID + 973 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 833 + + + CF$UID + 832 + + + CF$UID + 838 + + + CF$UID + 834 + + + CF$UID + 835 + + + CF$UID + 836 + + + CF$UID + 837 + + + CF$UID + 831 + + + NS.objects + + + CF$UID + 41 + + + CF$UID + 17 + + + CF$UID + 977 + + + CF$UID + 1120 + + + CF$UID + 1126 + + + CF$UID + 1205 + + + CF$UID + 17 + + + CF$UID + 1213 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 878 + + + CF$UID + 978 + + + CF$UID + 880 + + + CF$UID + 881 + + + CF$UID + 882 + + + CF$UID + 883 + + + CF$UID + 884 + + + CF$UID + 979 + + + CF$UID + 885 + + + NS.objects + + + CF$UID + 980 + + + CF$UID + 1016 + + + CF$UID + 1053 + + + CF$UID + 17 + + + CF$UID + 550 + + + CF$UID + 1068 + + + CF$UID + 1074 + + + CF$UID + 1075 + + + CF$UID + 240 + + + + IDEEditorMode_Standard + IDEEditorMode_Genius + + $class + + CF$UID + 902 + + geniusEditorContextNode + + CF$UID + 999 + + primaryEditorContextNode + + CF$UID + 981 + + rootLayoutTreeNode + + CF$UID + 997 + + + + $class + + CF$UID + 901 + + children + + CF$UID + 0 + + contentType + 1 + documentArchivableRepresentation + + CF$UID + 982 + + orientation + 0 + parent + + CF$UID + 997 + + + + $class + + CF$UID + 898 + + DocumentLocation + + CF$UID + 995 + + DomainIdentifier + + CF$UID + 983 + + IdentifierPath + + CF$UID + 984 + + IndexOfDocumentIdentifier + + CF$UID + 41 + + + Xcode.IDENavigableItemDomain.WorkspaceStructure + + $class + + CF$UID + 43 + + NS.objects + + + CF$UID + 985 + + + CF$UID + 987 + + + CF$UID + 989 + + + CF$UID + 991 + + + CF$UID + 993 + + + + + $class + + CF$UID + 892 + + Identifier + + CF$UID + 986 + + + GameRenderer.cpp + + $class + + CF$UID + 892 + + Identifier + + CF$UID + 988 + + + renderer + + $class + + CF$UID + 892 + + Identifier + + CF$UID + 990 + + + client + + $class + + CF$UID + 892 + + Identifier + + CF$UID + 992 + + + src + + $class + + CF$UID + 892 + + Identifier + + CF$UID + 994 + + + minecraftpe + + $class + + CF$UID + 897 + + documentURL + + CF$UID + 996 + + timestamp + + CF$UID + 0 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/client/renderer/GameRenderer.cpp + + + $class + + CF$UID + 901 + + children + + CF$UID + 998 + + contentType + 0 + documentArchivableRepresentation + + CF$UID + 0 + + orientation + 0 + parent + + CF$UID + 0 + + + + $class + + CF$UID + 43 + + NS.objects + + + CF$UID + 981 + + + CF$UID + 999 + + + + + $class + + CF$UID + 901 + + children + + CF$UID + 1000 + + contentType + 0 + documentArchivableRepresentation + + CF$UID + 0 + + orientation + 1 + parent + + CF$UID + 997 + + + + $class + + CF$UID + 43 + + NS.objects + + + CF$UID + 1001 + + + + + $class + + CF$UID + 901 + + children + + CF$UID + 0 + + contentType + 2 + documentArchivableRepresentation + + CF$UID + 1002 + + orientation + 0 + parent + + CF$UID + 999 + + + + $class + + CF$UID + 898 + + DocumentLocation + + CF$UID + 1015 + + DomainIdentifier + + CF$UID + 0 + + IdentifierPath + + CF$UID + 1003 + + IndexOfDocumentIdentifier + + CF$UID + 41 + + + + $class + + CF$UID + 43 + + NS.objects + + + CF$UID + 1004 + + + CF$UID + 1006 + + + CF$UID + 1007 + + + CF$UID + 1012 + + + + + $class + + CF$UID + 892 + + Identifier + + CF$UID + 1005 + + + BaseDialogController.mm + + $class + + CF$UID + 892 + + Identifier + + CF$UID + 863 + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 1008 + + + CF$UID + 1009 + + + NS.objects + + + CF$UID + 1010 + + + CF$UID + 1011 + + + + manualDomainIdentifier + navigableItem_name + Xcode.IDENavigableItemDomain.WorkspaceStructure + minecraftpe + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 1013 + + + NS.objects + + + CF$UID + 1014 + + + + identifier + Xcode.IDEKit.GeniusCategory.Manual + + $class + + CF$UID + 897 + + documentURL + + CF$UID + 188 + + timestamp + + CF$UID + 0 + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 1017 + + + NS.objects + + + CF$UID + 1018 + + + + EditorLayout_PersistentRepresentation + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 1019 + + + NS.objects + + + CF$UID + 1020 + + + + Main + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 1021 + + + CF$UID + 1022 + + + CF$UID + 1023 + + + NS.objects + + + CF$UID + 1024 + + + CF$UID + 41 + + + CF$UID + 1051 + + + + EditorLayout_StateSavingStateDictionaries + EditorLayout_Selected + EditorLayout_Geometry + + $class + + CF$UID + 43 + + NS.objects + + + CF$UID + 1025 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 1026 + + + CF$UID + 1027 + + + CF$UID + 1028 + + + CF$UID + 1029 + + + CF$UID + 1030 + + + CF$UID + 1031 + + + CF$UID + 1032 + + + NS.objects + + + CF$UID + 1033 + + + CF$UID + 1034 + + + CF$UID + 1044 + + + CF$UID + 1048 + + + CF$UID + 1037 + + + CF$UID + 21 + + + CF$UID + 1049 + + + + FileDataType + ArchivableRepresentation + EditorState + NavigableItemName + DocumentNavigableItemName + DocumentExtensionIdentifier + DocumentURL + public.c-plus-plus-source + + $class + + CF$UID + 898 + + DocumentLocation + + CF$UID + 1042 + + DomainIdentifier + + CF$UID + 983 + + IdentifierPath + + CF$UID + 1035 + + IndexOfDocumentIdentifier + + CF$UID + 41 + + + + $class + + CF$UID + 43 + + NS.objects + + + CF$UID + 1036 + + + CF$UID + 1038 + + + CF$UID + 1039 + + + CF$UID + 1041 + + + + + $class + + CF$UID + 892 + + Identifier + + CF$UID + 1037 + + + Minecraft.cpp + + $class + + CF$UID + 892 + + Identifier + + CF$UID + 990 + + + + $class + + CF$UID + 892 + + Identifier + + CF$UID + 1040 + + + src + + $class + + CF$UID + 892 + + Identifier + + CF$UID + 650 + + + + $class + + CF$UID + 897 + + documentURL + + CF$UID + 1043 + + timestamp + + CF$UID + 0 + + + + $class + + CF$UID + 29 + + NS.string + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/client/Minecraft.cpp + + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 234 + + + CF$UID + 235 + + + CF$UID + 236 + + + CF$UID + 237 + + + NS.objects + + + CF$UID + 1045 + + + CF$UID + 1046 + + + CF$UID + 240 + + + CF$UID + 1047 + + + + 340616729.64701301 + {7022, 1207} + {7427, 1} + Minecraft::update() + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 1050 + + + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/client/Minecraft.cpp + + $class + + CF$UID + 43 + + NS.objects + + + CF$UID + 1052 + + + + {{0, 0}, {1920, 845}} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 938 + + + CF$UID + 939 + + + CF$UID + 940 + + + CF$UID + 941 + + + CF$UID + 942 + + + CF$UID + 943 + + + NS.objects + + + CF$UID + 550 + + + CF$UID + 1054 + + + CF$UID + 1055 + + + CF$UID + 550 + + + CF$UID + 1056 + + + CF$UID + 1062 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 945 + + + NS.objects + + + CF$UID + 41 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 947 + + + NS.objects + + + CF$UID + 550 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 702 + + + NS.objects + + + CF$UID + 1057 + + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 1058 + + + CF$UID + 1060 + + + + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 705 + + + CF$UID + 706 + + + NS.objects + + + CF$UID + 951 + + + CF$UID + 1059 + + + + 672 + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 705 + + + CF$UID + 706 + + + NS.objects + + + CF$UID + 954 + + + CF$UID + 1061 + + + + 675 + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 702 + + + NS.objects + + + CF$UID + 1063 + + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 1064 + + + CF$UID + 1066 + + + + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 705 + + + CF$UID + 706 + + + NS.objects + + + CF$UID + 951 + + + CF$UID + 1065 + + + + 672 + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 705 + + + CF$UID + 706 + + + NS.objects + + + CF$UID + 954 + + + CF$UID + 1067 + + + + 675 + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 702 + + + NS.objects + + + CF$UID + 1069 + + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 1070 + + + CF$UID + 1072 + + + + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 705 + + + CF$UID + 706 + + + NS.objects + + + CF$UID + 965 + + + CF$UID + 1071 + + + + 656 + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 705 + + + CF$UID + 706 + + + NS.objects + + + CF$UID + 968 + + + CF$UID + 1073 + + + + 326 + + $class + + CF$UID + 44 + + NS.keys + + NS.objects + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 1076 + + + CF$UID + 904 + + + NS.objects + + + CF$UID + 1077 + + + CF$UID + 1078 + + + + SplitPosition + 0.71661722660064697 + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 1079 + + + CF$UID + 906 + + + NS.objects + + + CF$UID + 1080 + + + CF$UID + 1099 + + + + Alternate + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 908 + + + CF$UID + 909 + + + CF$UID + 910 + + + NS.objects + + + CF$UID + 1081 + + + CF$UID + 41 + + + CF$UID + 1097 + + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 1082 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 913 + + + CF$UID + 914 + + + CF$UID + 915 + + + CF$UID + 916 + + + CF$UID + 917 + + + CF$UID + 918 + + + CF$UID + 919 + + + NS.objects + + + CF$UID + 920 + + + CF$UID + 1083 + + + CF$UID + 1090 + + + CF$UID + 1094 + + + CF$UID + 1005 + + + CF$UID + 932 + + + CF$UID + 1095 + + + + + $class + + CF$UID + 898 + + DocumentLocation + + CF$UID + 1015 + + DomainIdentifier + + CF$UID + 0 + + IdentifierPath + + CF$UID + 1084 + + IndexOfDocumentIdentifier + + CF$UID + 41 + + + + $class + + CF$UID + 43 + + NS.objects + + + CF$UID + 1085 + + + CF$UID + 1086 + + + CF$UID + 1087 + + + CF$UID + 1089 + + + + + $class + + CF$UID + 892 + + Identifier + + CF$UID + 1005 + + + + $class + + CF$UID + 892 + + Identifier + + CF$UID + 863 + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 1008 + + + CF$UID + 1009 + + + NS.objects + + + CF$UID + 1010 + + + CF$UID + 1088 + + + + minecraftpe + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 1013 + + + NS.objects + + + CF$UID + 1014 + + + + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 250 + + + CF$UID + 251 + + + CF$UID + 252 + + + CF$UID + 253 + + + NS.objects + + + CF$UID + 1091 + + + CF$UID + 1092 + + + CF$UID + 240 + + + CF$UID + 1093 + + + + 340881331.67486 + {0, 1199} + {418, 0} + -init + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 1096 + + + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/project/ios/minecraftpe/dialogs/BaseDialogController.mm + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 1098 + + + + {{0, 0}, {381, 982}} + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 908 + + + CF$UID + 909 + + + CF$UID + 910 + + + NS.objects + + + CF$UID + 1100 + + + CF$UID + 41 + + + CF$UID + 1118 + + + + + $class + + CF$UID + 43 + + NS.objects + + + CF$UID + 1101 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 913 + + + CF$UID + 914 + + + CF$UID + 915 + + + CF$UID + 916 + + + CF$UID + 917 + + + CF$UID + 918 + + + CF$UID + 919 + + + NS.objects + + + CF$UID + 1102 + + + CF$UID + 1103 + + + CF$UID + 1111 + + + CF$UID + 1115 + + + CF$UID + 986 + + + CF$UID + 932 + + + CF$UID + 1116 + + + + public.c-plus-plus-source + + $class + + CF$UID + 898 + + DocumentLocation + + CF$UID + 995 + + DomainIdentifier + + CF$UID + 983 + + IdentifierPath + + CF$UID + 1104 + + IndexOfDocumentIdentifier + + CF$UID + 41 + + + + $class + + CF$UID + 43 + + NS.objects + + + CF$UID + 1105 + + + CF$UID + 1106 + + + CF$UID + 1107 + + + CF$UID + 1108 + + + CF$UID + 1109 + + + + + $class + + CF$UID + 892 + + Identifier + + CF$UID + 986 + + + + $class + + CF$UID + 892 + + Identifier + + CF$UID + 988 + + + + $class + + CF$UID + 892 + + Identifier + + CF$UID + 990 + + + + $class + + CF$UID + 892 + + Identifier + + CF$UID + 992 + + + + $class + + CF$UID + 892 + + Identifier + + CF$UID + 1110 + + + minecraftpe + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 250 + + + CF$UID + 251 + + + CF$UID + 252 + + + CF$UID + 253 + + + NS.objects + + + CF$UID + 1112 + + + CF$UID + 1113 + + + CF$UID + 240 + + + CF$UID + 1114 + + + + 340881331.67461598 + {818, 1855} + {1813, 0} + GameRenderer::setupCamera(float a, int eye) + + $class + + CF$UID + 30 + + NS.base + + CF$UID + 0 + + NS.relative + + CF$UID + 1117 + + + file://localhost/Users/new/Development/subversion/minecraftcpp/trunk/handheld/src/client/renderer/GameRenderer.cpp + + $class + + CF$UID + 43 + + NS.objects + + + CF$UID + 1119 + + + + {{0, 0}, {1348, 982}} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 702 + + + NS.objects + + + CF$UID + 1121 + + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 1122 + + + CF$UID + 1124 + + + + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 705 + + + CF$UID + 706 + + + NS.objects + + + CF$UID + 707 + + + CF$UID + 1123 + + + + 557 + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 705 + + + CF$UID + 706 + + + NS.objects + + + CF$UID + 707 + + + CF$UID + 1125 + + + + 425 + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 1127 + + + CF$UID + 1128 + + + CF$UID + 847 + + + CF$UID + 1129 + + + CF$UID + 1130 + + + CF$UID + 1131 + + + CF$UID + 848 + + + CF$UID + 1132 + + + NS.objects + + + CF$UID + 1133 + + + CF$UID + 1143 + + + CF$UID + 848 + + + CF$UID + 1156 + + + CF$UID + 1172 + + + CF$UID + 1176 + + + CF$UID + 1185 + + + CF$UID + 1198 + + + + Xcode.IDEKit.Navigator.Symbol + Xcode.IDEKit.Navigator.BatchFind + Xcode.IDEKit.Navigator.Issues + Xcode.IDEKit.Navigator.Debug + Xcode.IDEKit.Navigator.Breakpoints + Xcode.IDEKit.Navigator.Logs + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 1134 + + + CF$UID + 1135 + + + CF$UID + 1136 + + + CF$UID + 1137 + + + CF$UID + 1138 + + + CF$UID + 1139 + + + CF$UID + 1140 + + + NS.objects + + + CF$UID + 240 + + + CF$UID + 17 + + + CF$UID + 1141 + + + CF$UID + 17 + + + CF$UID + 636 + + + CF$UID + 1142 + + + CF$UID + 17 + + + + IDESymbolNavigatorShowContainersOnly + IDESymbolNavigatorShowHierarchy + IDEExpandedItems + IDESymbolNavigatorShowClassesOnly + IDESymbolNamePatternString + IDESymbolNavigatorSelectedSymbols + IDESymbolNavigatorShowWorkspaceOnly + + $class + + CF$UID + 70 + + NS.objects + + + + $class + + CF$UID + 70 + + NS.objects + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 1144 + + + CF$UID + 1145 + + + CF$UID + 1146 + + + CF$UID + 1147 + + + CF$UID + 1148 + + + CF$UID + 1149 + + + CF$UID + 1150 + + + NS.objects + + + CF$UID + 41 + + + CF$UID + 240 + + + CF$UID + 636 + + + CF$UID + 1151 + + + CF$UID + 1152 + + + CF$UID + 41 + + + CF$UID + 1154 + + + + IDEBatchFindNavigatorScrollPosition + IDEBatchFindNavigatorShowsOptions + IDEBatchFindNavigatorReplaceString + IDEBatchFindNavigatorFindString + IDEBatchFindNavigatorSelectedRowIndexes + IDEBatchFindNavigatorFindMode + IDEBatchFindNavigatorCollapsedGroups + modal + + $class + + CF$UID + 1153 + + NSLength + 1 + NSLocation + 4 + NSRangeCount + 1 + + + $classes + + NSIndexSet + NSObject + + $classname + NSIndexSet + + + $class + + CF$UID + 1155 + + NSRangeCount + 0 + + + $classes + + NSMutableIndexSet + NSIndexSet + NSObject + + $classname + NSMutableIndexSet + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 1157 + + + CF$UID + 1158 + + + CF$UID + 1159 + + + CF$UID + 1160 + + + CF$UID + 1161 + + + CF$UID + 1162 + + + CF$UID + 1163 + + + CF$UID + 1164 + + + CF$UID + 1165 + + + NS.objects + + + CF$UID + 240 + + + CF$UID + 1166 + + + CF$UID + 1167 + + + CF$UID + 1168 + + + CF$UID + 1169 + + + CF$UID + 240 + + + CF$UID + 1170 + + + CF$UID + 240 + + + CF$UID + 1171 + + + + IDEErrorFilteringEnabled + IDEVisibleRect + IDECollapsedFiles + IDEExpandedIssues + IDESelectedNavigables + IDEShowsByType + IDECollapsedTypes + IDERecentFilteringEnabled + IDECollapsedGroups + {{0, 0}, {165, 610}} + + $class + + CF$UID + 71 + + NS.objects + + + + $class + + CF$UID + 71 + + NS.objects + + + + $class + + CF$UID + 70 + + NS.objects + + + + $class + + CF$UID + 71 + + NS.objects + + + + $class + + CF$UID + 71 + + NS.objects + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 1173 + + + CF$UID + 1174 + + + CF$UID + 1175 + + + NS.objects + + + CF$UID + 582 + + + CF$UID + 41 + + + CF$UID + 240 + + + + IDEStackCompressionValue + IDEThreadOrQueueMode + IDEShowOnlyInterestingContent + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 1177 + + + CF$UID + 1178 + + + CF$UID + 1179 + + + CF$UID + 1180 + + + NS.objects + + + CF$UID + 858 + + + CF$UID + 240 + + + CF$UID + 1181 + + + CF$UID + 1184 + + + + IDECollapsedtemsSet + IDEBreakpointNavigatorFilterOnEnabled + IDESelectedObjects + IDEVisibleRect + + $class + + CF$UID + 43 + + NS.objects + + + CF$UID + 1182 + + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 650 + + + CF$UID + 1183 + + + CF$UID + 636 + + + + minecraftpeViewController.h + {{0, 0}, {259, 938}} + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 850 + + + CF$UID + 851 + + + CF$UID + 852 + + + CF$UID + 853 + + + CF$UID + 854 + + + CF$UID + 855 + + + CF$UID + 856 + + + NS.objects + + + CF$UID + 1186 + + + CF$UID + 240 + + + CF$UID + 858 + + + CF$UID + 240 + + + CF$UID + 240 + + + CF$UID + 1187 + + + CF$UID + 1190 + + + + {{0, 457}, {296, 938}} + + $class + + CF$UID + 43 + + NS.objects + + + CF$UID + 1188 + + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 1189 + + + CF$UID + 992 + + + CF$UID + 990 + + + CF$UID + 988 + + + CF$UID + 986 + + + + minecraftpe + + $class + + CF$UID + 859 + + NS.objects + + + CF$UID + 1191 + + + CF$UID + 1192 + + + CF$UID + 1193 + + + CF$UID + 1195 + + + CF$UID + 1196 + + + CF$UID + 1197 + + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 1189 + + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 1189 + + + CF$UID + 863 + + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 1189 + + + CF$UID + 1194 + + + + Project + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 1189 + + + CF$UID + 992 + + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 1189 + + + CF$UID + 992 + + + CF$UID + 990 + + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 1189 + + + CF$UID + 992 + + + CF$UID + 990 + + + CF$UID + 988 + + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 1199 + + + CF$UID + 1200 + + + CF$UID + 1201 + + + CF$UID + 1202 + + + NS.objects + + + CF$UID + 1203 + + + CF$UID + 1204 + + + CF$UID + 240 + + + CF$UID + 1184 + + + + IDELogNavigatorExpandedItemsStateKey + IDELogNavigatorSelectedObjectsStateKey + IDELogNavigatorRecentFilterStateKey + IDELogNavigatorVisibleRectStateKey + + $class + + CF$UID + 70 + + NS.objects + + + + $class + + CF$UID + 70 + + NS.objects + + + + $class + + CF$UID + 44 + + NS.keys + + + CF$UID + 702 + + + NS.objects + + + CF$UID + 1206 + + + + + $class + + CF$UID + 70 + + NS.objects + + + CF$UID + 1207 + + + CF$UID + 1209 + + + CF$UID + 1211 + + + + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 705 + + + CF$UID + 706 + + + NS.objects + + + CF$UID + 835 + + + CF$UID + 1208 + + + + 312 + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 705 + + + CF$UID + 706 + + + NS.objects + + + CF$UID + 838 + + + CF$UID + 1210 + + + + 1348 + + $class + + CF$UID + 638 + + NS.keys + + + CF$UID + 705 + + + CF$UID + 706 + + + NS.objects + + + CF$UID + 875 + + + CF$UID + 1212 + + + + 260 + GameRenderer.cpp + + $top + + State + + CF$UID + 1 + + + $version + 100000 + + diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/project.xcworkspace/xcuserdata/new.xcuserdatad/WorkspaceSettings.xcsettings b/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/project.xcworkspace/xcuserdata/new.xcuserdatad/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..6ff33e6 --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/project.xcworkspace/xcuserdata/new.xcuserdatad/WorkspaceSettings.xcsettings @@ -0,0 +1,10 @@ + + + + + IDEWorkspaceUserSettings_HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges + + IDEWorkspaceUserSettings_SnapshotAutomaticallyBeforeSignificantChanges + + + diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/xcuserdata/new.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/xcuserdata/new.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist new file mode 100644 index 0000000..05301bc --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/xcuserdata/new.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist @@ -0,0 +1,5 @@ + + + diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/xcuserdata/new.xcuserdatad/xcschemes/minecraftpe-adhoc.xcscheme b/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/xcuserdata/new.xcuserdatad/xcschemes/minecraftpe-adhoc.xcscheme new file mode 100644 index 0000000..104717e --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/xcuserdata/new.xcuserdatad/xcschemes/minecraftpe-adhoc.xcscheme @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/xcuserdata/new.xcuserdatad/xcschemes/minecraftpe-debug.xcscheme b/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/xcuserdata/new.xcuserdatad/xcschemes/minecraftpe-debug.xcscheme new file mode 100644 index 0000000..06315f1 --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/xcuserdata/new.xcuserdatad/xcschemes/minecraftpe-debug.xcscheme @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/xcuserdata/new.xcuserdatad/xcschemes/minecraftpe.demo-debug.xcscheme b/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/xcuserdata/new.xcuserdatad/xcschemes/minecraftpe.demo-debug.xcscheme new file mode 100644 index 0000000..b2df201 --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/xcuserdata/new.xcuserdatad/xcschemes/minecraftpe.demo-debug.xcscheme @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/xcuserdata/new.xcuserdatad/xcschemes/minecraftpe.demo.xcscheme b/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/xcuserdata/new.xcuserdatad/xcschemes/minecraftpe.demo.xcscheme new file mode 100644 index 0000000..7f95d4b --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/xcuserdata/new.xcuserdatad/xcschemes/minecraftpe.demo.xcscheme @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/xcuserdata/new.xcuserdatad/xcschemes/minecraftpe.xcscheme b/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/xcuserdata/new.xcuserdatad/xcschemes/minecraftpe.xcscheme new file mode 100644 index 0000000..34fb642 --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/xcuserdata/new.xcuserdatad/xcschemes/minecraftpe.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/xcuserdata/new.xcuserdatad/xcschemes/xcschememanagement.plist b/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/xcuserdata/new.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..24d10e4 --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe.xcodeproj/xcuserdata/new.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,52 @@ + + + + + SchemeUserState + + minecraftpe-adhoc.xcscheme + + orderHint + 2 + + minecraftpe-debug.xcscheme + + orderHint + 3 + + minecraftpe-demo-promo.xcscheme + + orderHint + 1 + + minecraftpe.demo-debug.xcscheme + + orderHint + 5 + + minecraftpe.demo.xcscheme + + orderHint + 4 + + minecraftpe.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + D58BB46C146A0B910002C9F5 + + primary + + + D5CF9C41144C225000E4244F + + primary + + + + + diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe/EAGLView.h b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/EAGLView.h new file mode 100644 index 0000000..37253f9 --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/EAGLView.h @@ -0,0 +1,40 @@ +// +// EAGLView.h +// OpenGLES_iPhone +// +// Created by mmalc Crawford on 11/18/10. +// Copyright 2010 Apple Inc. All rights reserved. +// + +#import + +#import +#import +#import +#import + +@class EAGLContext; + +// This class wraps the CAEAGLLayer from CoreAnimation into a convenient UIView subclass. +// The view content is basically an EAGL surface you render your OpenGL scene into. +// Note that setting the view non-opaque will only work if the EAGL surface has an alpha channel. +@interface EAGLView : UIView { + // The pixel dimensions of the CAEAGLLayer. + GLint framebufferWidth; + GLint framebufferHeight; + + // The OpenGL ES names for the framebuffer and renderbuffer used to render to this view. + GLuint defaultFramebuffer; + + GLuint colorRenderbuffer, _depthRenderBuffer; + + @public + GLfloat viewScale; +} + +@property (nonatomic, retain) EAGLContext *context; + +- (void)setFramebuffer; +- (BOOL)presentFramebuffer; + +@end diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe/EAGLView.m b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/EAGLView.m new file mode 100644 index 0000000..02697f8 --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/EAGLView.m @@ -0,0 +1,163 @@ +// +// EAGLView.m +// OpenGLES_iPhone +// +// Created by mmalc Crawford on 11/18/10. +// Copyright 2010 Apple Inc. All rights reserved. +// + +#import "EAGLView.h" + +#import + +@interface EAGLView (PrivateMethods) +- (void)createFramebuffer; +- (void)deleteFramebuffer; +@end + +@implementation EAGLView + +@synthesize context; + +// You must implement this method ++ (Class)layerClass +{ + return [CAEAGLLayer class]; +} + +//The EAGL view is stored in the nib file. When it's unarchived it's sent -initWithCoder:. +- (id)initWithCoder:(NSCoder*)coder +{ + self = [super initWithCoder:coder]; + if (self) { + CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer; + + eaglLayer.opaque = TRUE; + eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithBool:FALSE], kEAGLDrawablePropertyRetainedBacking, + kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, + nil]; + + if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] + && [self respondsToSelector:@selector(setContentScaleFactor:)]) + { + viewScale = [UIScreen mainScreen].scale; + NSLog(@"Scale is : %f\n", viewScale); + [self setContentScaleFactor: viewScale]; + eaglLayer.contentsScale = viewScale; + } + } + + return self; +} + +- (void)dealloc +{ + [self deleteFramebuffer]; + [context release]; + + [super dealloc]; +} + +- (void)setContext:(EAGLContext *)newContext +{ + if (context != newContext) { + [self deleteFramebuffer]; + + [context release]; + context = [newContext retain]; + + [EAGLContext setCurrentContext:nil]; + } +} + +- (void)createFramebuffer +{ + if (context && !defaultFramebuffer) { + [EAGLContext setCurrentContext:context]; + + // Create default framebuffer object. + glGenFramebuffers(1, &defaultFramebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer); + + // Create color render buffer and allocate backing store. + glGenRenderbuffers(1, &colorRenderbuffer); + glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); + [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer]; + glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &framebufferWidth); + glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &framebufferHeight); + + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer); + + // Create depth buffer and allocate backing store + glGenRenderbuffersOES(1, &_depthRenderBuffer); + glBindRenderbufferOES(GL_RENDERBUFFER_OES, _depthRenderBuffer); + + glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT24_OES, framebufferWidth, framebufferHeight); + glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, _depthRenderBuffer); + + NSLog(@"Created framebuffer with size %d, %d\n", framebufferWidth, framebufferHeight); + + if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) + NSLog(@"Failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER)); + } +} + +- (void)deleteFramebuffer +{ + if (context) { + [EAGLContext setCurrentContext:context]; + + if (defaultFramebuffer) { + glDeleteFramebuffers(1, &defaultFramebuffer); + defaultFramebuffer = 0; + } + + if (colorRenderbuffer) { + glDeleteRenderbuffers(1, &colorRenderbuffer); + colorRenderbuffer = 0; + } + } +} + +- (void)setFramebuffer +{ + if (context) { + [EAGLContext setCurrentContext:context]; + + if (!defaultFramebuffer) + [self createFramebuffer]; + + glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer); + + glViewport(0, 0, framebufferWidth, framebufferHeight); + } +} + +- (BOOL)presentFramebuffer +{ + BOOL success = FALSE; + + if (context) { + [EAGLContext setCurrentContext:context]; + + glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); + + success = [context presentRenderbuffer:GL_RENDERBUFFER]; + } + + return success; +} + +- (void)layoutSubviews +{ + // The framebuffer will be re-created at the beginning of the next setFramebuffer method call. + [self deleteFramebuffer]; +} + +- (BOOL) isMultipleTouchEnabled { + return YES; +} + + +@end diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe/PVRTexture.h b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/PVRTexture.h new file mode 100644 index 0000000..daeeb02 --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/PVRTexture.h @@ -0,0 +1,26 @@ +#import +#import +#import + +@interface PVRTexture : NSObject +{ + NSMutableArray *_imageData; + + GLuint _name; + uint32_t _width, _height; + GLenum _internalFormat; + BOOL _hasAlpha; +} + +- (id)initWithContentsOfFile:(NSString *)path; +- (id)initWithContentsOfURL:(NSURL *)url; ++ (id)pvrTextureWithContentsOfFile:(NSString *)path; ++ (id)pvrTextureWithContentsOfURL:(NSURL *)url; + +@property (readonly) GLuint name; +@property (readonly) uint32_t width; +@property (readonly) uint32_t height; +@property (readonly) GLenum internalFormat; +@property (readonly) BOOL hasAlpha; + +@end diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe/PVRTexture.m b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/PVRTexture.m new file mode 100644 index 0000000..ed3cc58 --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/PVRTexture.m @@ -0,0 +1,237 @@ +#import "PVRTexture.h" + +#define PVR_TEXTURE_FLAG_TYPE_MASK 0xff + +static char gPVRTexIdentifier[4] = "PVR!"; + +enum +{ + kPVRTextureFlagTypePVRTC_2 = 24, + kPVRTextureFlagTypePVRTC_4 +}; + +typedef struct _PVRTexHeader +{ + uint32_t headerLength; + uint32_t height; + uint32_t width; + uint32_t numMipmaps; + uint32_t flags; + uint32_t dataLength; + uint32_t bpp; + uint32_t bitmaskRed; + uint32_t bitmaskGreen; + uint32_t bitmaskBlue; + uint32_t bitmaskAlpha; + uint32_t pvrTag; + uint32_t numSurfs; +} PVRTexHeader; + + +@implementation PVRTexture + +@synthesize name = _name; +@synthesize width = _width; +@synthesize height = _height; +@synthesize internalFormat = _internalFormat; +@synthesize hasAlpha = _hasAlpha; + + +- (BOOL)unpackPVRData:(NSData *)data +{ + BOOL success = FALSE; + PVRTexHeader *header = NULL; + uint32_t flags, pvrTag; + uint32_t dataLength = 0, dataOffset = 0, dataSize = 0; + uint32_t blockSize = 0, widthBlocks = 0, heightBlocks = 0; + uint32_t width = 0, height = 0, bpp = 4; + uint8_t *bytes = NULL; + uint32_t formatFlags; + + header = (PVRTexHeader *)[data bytes]; + + pvrTag = CFSwapInt32LittleToHost(header->pvrTag); + + if (gPVRTexIdentifier[0] != ((pvrTag >> 0) & 0xff) || + gPVRTexIdentifier[1] != ((pvrTag >> 8) & 0xff) || + gPVRTexIdentifier[2] != ((pvrTag >> 16) & 0xff) || + gPVRTexIdentifier[3] != ((pvrTag >> 24) & 0xff)) + { + return FALSE; + } + + flags = CFSwapInt32LittleToHost(header->flags); + formatFlags = flags & PVR_TEXTURE_FLAG_TYPE_MASK; + + if (formatFlags == kPVRTextureFlagTypePVRTC_4 || formatFlags == kPVRTextureFlagTypePVRTC_2) + { + [_imageData removeAllObjects]; + + if (formatFlags == kPVRTextureFlagTypePVRTC_4) + _internalFormat = GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; + else if (formatFlags == kPVRTextureFlagTypePVRTC_2) + _internalFormat = GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; + + _width = width = CFSwapInt32LittleToHost(header->width); + _height = height = CFSwapInt32LittleToHost(header->height); + + if (CFSwapInt32LittleToHost(header->bitmaskAlpha)) + _hasAlpha = TRUE; + else + _hasAlpha = FALSE; + + dataLength = CFSwapInt32LittleToHost(header->dataLength); + + bytes = ((uint8_t *)[data bytes]) + sizeof(PVRTexHeader); + + // Calculate the data size for each texture level and respect the minimum number of blocks + while (dataOffset < dataLength) + { + if (formatFlags == kPVRTextureFlagTypePVRTC_4) + { + blockSize = 4 * 4; // Pixel by pixel block size for 4bpp + widthBlocks = width / 4; + heightBlocks = height / 4; + bpp = 4; + } + else + { + blockSize = 8 * 4; // Pixel by pixel block size for 2bpp + widthBlocks = width / 8; + heightBlocks = height / 4; + bpp = 2; + } + + // Clamp to minimum number of blocks + if (widthBlocks < 2) + widthBlocks = 2; + if (heightBlocks < 2) + heightBlocks = 2; + + dataSize = widthBlocks * heightBlocks * ((blockSize * bpp) / 8); + + [_imageData addObject:[NSData dataWithBytes:bytes+dataOffset length:dataSize]]; + + dataOffset += dataSize; + + width = MAX(width >> 1, 1); + height = MAX(height >> 1, 1); + } + + success = TRUE; + } + + return success; +} + + +- (BOOL)createGLTexture +{ + int width = _width; + int height = _height; + NSData *data; + GLenum err; + + if ([_imageData count] > 0) + { + if (_name != 0) + glDeleteTextures(1, &_name); + + glGenTextures(1, &_name); + glBindTexture(GL_TEXTURE_2D, _name); + } + + if ([_imageData count] > 1) { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + } + else { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + } + + NSLog(@"Image levels: %d\n", [_imageData count]); + for (int i=0; i < [_imageData count]; i++) + { + data = [_imageData objectAtIndex:i]; + glCompressedTexImage2D(GL_TEXTURE_2D, i, _internalFormat, width, height, 0, [data length], [data bytes]); + + err = glGetError(); + if (err != GL_NO_ERROR) + { + NSLog(@"Error uploading compressed texture level: %d. glError: 0x%04X", i, err); + return FALSE; + } + + width = MAX(width >> 1, 1); + height = MAX(height >> 1, 1); + } + + [_imageData removeAllObjects]; + + return TRUE; +} + + +- (id)initWithContentsOfFile:(NSString *)path +{ + if (self = [super init]) + { + NSData *data = [NSData dataWithContentsOfFile:path]; + + _imageData = [[NSMutableArray alloc] initWithCapacity:10]; + + _name = 0; + _width = _height = 0; + _internalFormat = GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; + _hasAlpha = FALSE; + + if (!data || ![self unpackPVRData:data] || ![self createGLTexture]) + { + [self release]; + self = nil; + } + } + + return self; +} + + +- (id)initWithContentsOfURL:(NSURL *)url +{ + if (![url isFileURL]) + { + [self release]; + return nil; + } + + return [self initWithContentsOfFile:[url path]]; +} + + ++ (id)pvrTextureWithContentsOfFile:(NSString *)path +{ + return [[[self alloc] initWithContentsOfFile:path] autorelease]; +} + + ++ (id)pvrTextureWithContentsOfURL:(NSURL *)url +{ + if (![url isFileURL]) + return nil; + + return [PVRTexture pvrTextureWithContentsOfFile:[url path]]; +} + + +- (void)dealloc +{ + [_imageData release]; + + if (_name != 0) + glDeleteTextures(1, &_name); + + [super dealloc]; +} + +@end diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe/ShowKeyboardView.h b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/ShowKeyboardView.h new file mode 100644 index 0000000..b589ea6 --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/ShowKeyboardView.h @@ -0,0 +1,23 @@ +// +// ShowKeyboardView.h +// minecraftpe +// +// Created by Johan Bernhardsson on 12/17/12. +// +// + +#import +@interface ShowKeyboardView : UIView { + UITextField* textField; + NSString* lastString; +} +- (id)initWithFrame:(CGRect)frame; +//- (void)insertText:(NSString *)text; +//- (void)deleteBackward; +- (BOOL)hasText; +- (BOOL)canBecomeFirstResponder; +- (void)showKeyboard; +- (void)hideKeyboard; +- (void)textFieldDidChange :(NSNotification *)notif; +- (BOOL)textFieldShouldReturn:(UITextField *)theTextField; +@end diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe/ShowKeyboardView.mm b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/ShowKeyboardView.mm new file mode 100644 index 0000000..96ddb0a --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/ShowKeyboardView.mm @@ -0,0 +1,88 @@ +// +// ShowKeyboardView.m +// minecraftpe +// +// Created by Johan Bernhardsson on 12/17/12. +// +// + +#import "ShowKeyboardView.h" +#import "../../../src/platform/log.h" +#include "../../../src/platform/input/Keyboard.h" +#include + +@implementation ShowKeyboardView + +- (id)initWithFrame:(CGRect)frame { + id returnId = [super initWithFrame:frame]; + textField = [[UITextField alloc] init]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChange:) name:@"UITextFieldTextDidChangeNotification" object:textField]; + [textField setDelegate:self]; + [self addSubview:textField]; + textField.text = lastString = @"AAAAAAAAAAAAAAAAAAAA"; + return returnId; +} + +/*- (void)insertText:(NSString *)text { + const char* cText = [text cStringUsingEncoding:[NSString defaultCStringEncoding]]; + //std::string textString([text cStringUsingEncoding:[NSString defaultCStringEncoding]]); + int strLength = strlen(cText); + for(int a = 0; a < strLength; ++a) { + LOGW("NewCharInput: %c (%d)\n", cText[a], cText[a]); + if(cText[a] == 0 || cText[a] == '\n') { + Keyboard::feed((char)Keyboard::KEY_RETURN, 1); + Keyboard::feed((char)Keyboard::KEY_RETURN, 0); + } else { + Keyboard::feedText(cText[a]); + } + } + //delete cText; + //LOGW("Insert text: %s\n", [text cStringUsingEncoding:[NSString defaultCStringEncoding]]); +} + +- (void)deleteBackward { + //LOGW("deleteBackward\n"); + //Keyboard::feed((char)Keyboard::KEY_BACKSPACE, 1); + //Keyboard::feed((char)Keyboard::KEY_BACKSPACE, 0);§ +}*/ + +- (BOOL)hasText { + return YES; +} + +- (BOOL)canBecomeFirstResponder { + return YES; +} + +- (void)showKeyboard { + //[self becomeFirstResponder]; + [textField becomeFirstResponder]; + //[self becomeFirstResponder]; +} + +- (void)hideKeyboard { + [textField resignFirstResponder]; + [self resignFirstResponder]; +} + +- (void)textFieldDidChange :(NSNotification *)notif { + UITextField* txt = (UITextField*)notif.object; + if(![txt.text isEqualToString:lastString]) { + if(lastString.length > txt.text.length) { + Keyboard::feed((char)Keyboard::KEY_BACKSPACE, 1); + Keyboard::feed((char)Keyboard::KEY_BACKSPACE, 0); + } else if([txt.text characterAtIndex:(txt.text.length - 1)] == '\n') { + Keyboard::feed((char)Keyboard::KEY_RETURN, 1); + Keyboard::feed((char)Keyboard::KEY_RETURN, 0); + } else { + Keyboard::feedText([txt.text characterAtIndex:(txt.text.length - 1)]); + } + textField.text = lastString = @"AAAAAAAAAAAAAAAAAAAA"; + } +} +- (BOOL)textFieldShouldReturn:(UITextField *)theTextField { + Keyboard::feed((char)Keyboard::KEY_RETURN, 1); + Keyboard::feed((char)Keyboard::KEY_RETURN, 0); + return NO; +} +@end diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/BaseDialogController.h b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/BaseDialogController.h new file mode 100644 index 0000000..9d8cdf1 --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/BaseDialogController.h @@ -0,0 +1,35 @@ +// +// BaseDialogController.h +// minecraftpe +// +// Created by rhino on 10/20/11. +// Copyright 2011 Mojang. All rights reserved. +// + +#import +#import "IDialog.h" + +@class minecraftpeViewController; + +@interface BaseDialogController : UIViewController +{ + int _status; + std::vector _strings; + + minecraftpeViewController* _listener; +} + +// Interface +-(void)addToView:(UIView*)parentView; +-(int) getUserInputStatus; +-(std::vector)getUserInput; +-(void)setListener:(minecraftpeViewController*)listener; + +// Helpers +-(void)setOk; +-(void)setCancel; +-(void)closeOk; +-(void)closeCancel; +-(void)addString:(std::string)s; + +@end diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/BaseDialogController.mm b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/BaseDialogController.mm new file mode 100644 index 0000000..7a8154d --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/BaseDialogController.mm @@ -0,0 +1,78 @@ +// +// BaseDialogController.m +// minecraftpe +// +// Created by rhino on 10/20/11. +// Copyright 2011 Mojang AB. All rights reserved. +// + +#import "BaseDialogController.h" +#import "../minecraftpeViewController.h" + +@implementation BaseDialogController + +- (id)init +{ + self = [super init]; + if (self) { + // Initialization code here. + _status = -1; + _listener = nil; + } + + return self; +} + +// +// Interface +// +- (void)addToView:(UIView*)parentView { + + // Add this view as a subview of EAGLView + [parentView addSubview:self.view]; + + // ...then fade it in using core animation + [UIView beginAnimations:nil context:NULL]; + //self.view.alpha = 1.0f; + [UIView commitAnimations]; +} + +- (int) getUserInputStatus { return _status; } + +-(std::vector)getUserInput +{ + return _strings; +} + +-(void)setListener:(minecraftpeViewController*)listener +{ + _listener = listener; +} + +// +// Helpers +// +- (void) setOk { + _status = 1; +} + +- (void) setCancel { + _status = 0; +} + +- (void) closeOk { + [self setOk]; + NSLog(@"Close dialog %p\n", _listener); + [_listener closeDialog]; +} + +- (void) closeCancel { + [self setCancel]; + [_listener closeDialog]; +} + +- (void) addString: (std::string) s { + _strings.push_back(s); +} + +@end diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/CreateNewWorldViewController.h b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/CreateNewWorldViewController.h new file mode 100644 index 0000000..02938d9 --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/CreateNewWorldViewController.h @@ -0,0 +1,36 @@ +// +// CreateNewWorldViewController.h +// minecraftpe +// +// Created by rhino on 10/20/11. +// Copyright 2011 Mojang AB. All rights reserved. +// + +#import "BaseDialogController.h" + +@interface CreateNewWorldViewController : BaseDialogController +{ + IBOutlet UILabel* _labelName; + IBOutlet UILabel* _labelSeed; + IBOutlet UILabel* _labelSeedHint; + + IBOutlet UILabel* _labelGameMode; + IBOutlet UILabel* _labelGameModeDesc; + + IBOutlet UITextField* _textName; + IBOutlet UITextField* _textSeed; + + IBOutlet UIButton* _btnGameMode; + + int _currentGameModeId; +} + +- (void) UpdateGameModeDesc; + +- (IBAction)DismissKeyboard; + +- (IBAction)Create; +- (IBAction)Cancel; +- (IBAction)ToggleGameMode; + +@end diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/CreateNewWorldViewController.mm b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/CreateNewWorldViewController.mm new file mode 100644 index 0000000..0e53ff4 --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/CreateNewWorldViewController.mm @@ -0,0 +1,187 @@ +// +// CreateNewWorldViewController.m +// minecraftpe +// +// Created by rhino on 10/20/11. +// Copyright 2011 Mojang. All rights reserved. +// + +#import "CreateNewWorldViewController.h" +#import + +static const int GameMode_Creative = 0; +static const int GameMode_Survival = 1; +static const char* getGameModeName(int mode) { + if (mode == GameMode_Survival) return "survival"; + return "creative"; +} + +@implementation CreateNewWorldViewController + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +{ + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + // Custom initialization + _currentGameModeId = GameMode_Creative; + } + return self; +} + +- (void)didReceiveMemoryWarning +{ + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Release any cached data, images, etc that aren't in use. +} + +- (void) UpdateGameModeDesc +{ + if (_currentGameModeId == GameMode_Creative) { + [_labelGameModeDesc setText:@"Unlimited resources, flying"]; + + UIImage *img = [UIImage imageNamed:@"creative_0_4.png"]; + [_btnGameMode setImage:img forState:UIControlStateNormal]; + UIImage *img2 = [UIImage imageNamed:@"creative_1_4.png"]; + [_btnGameMode setImage:img2 forState:UIControlStateHighlighted]; + } + if (_currentGameModeId == GameMode_Survival) { + [_labelGameModeDesc setText:@"Mobs, health and gather resources"]; + + UIImage *img = [UIImage imageNamed:@"survival_0_4.png"]; + [_btnGameMode setImage:img forState:UIControlStateNormal]; + UIImage *img2 = [UIImage imageNamed:@"survival_1_4.png"]; + [_btnGameMode setImage:img2 forState:UIControlStateHighlighted]; + } +} + +#pragma mark - View lifecycle + +- (BOOL)textFieldShouldReturn:(UITextField *)textField +{ + //NSLog(@"TextField should return\n"); + [textField setUserInteractionEnabled:YES]; + [self DismissKeyboard]; +// [textField resignFirstResponder]; +// if (textField == _textName) +// [_textSeed becomeFirstResponder]; +// else if (textField == _textSeed) +// [self Create]; + return YES; +} + +- (void) resizeView:(UIView*)obj width:(int)w height:(int)h { + if (w < 0) w = obj.frame.size.width; + if (h < 0) h = obj.frame.size.height; + obj.frame = CGRectMake(obj.frame.origin.x, obj.frame.origin.y, w, h); +} + +- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string +{ + if (textField == _textName) { + NSUInteger newLength = [textField.text length] + [string length] - range.length; + if (newLength > 18) + return NO; + } + + int length = [string length]; + for (int i = 0; i < length; ++i) { + unichar ch = [string characterAtIndex:i]; + + if (ch >= 128) + return NO; + } + return YES; +} + +// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. +- (void)viewDidLoad +{ + [super viewDidLoad]; + BOOL isIpad = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad); + + UIFont* fontLarge = nil; + UIFont* fontSmall = nil; + + if (isIpad) { + [self resizeView:_textName width:-1 height:48]; + [self resizeView:_textSeed width:-1 height:48]; + self.view.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed:@"bg128.png"] ]; + fontLarge = [UIFont fontWithName:@"minecraft" size:28]; + fontSmall = [UIFont fontWithName:@"minecraft" size:24]; + } else { + [self resizeView:_textName width:-1 height:32]; + [self resizeView:_textSeed width:-1 height:32]; + self.view.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed:@"bg64.png"] ]; + fontLarge = [UIFont fontWithName:@"minecraft" size:16]; + fontSmall = [UIFont fontWithName:@"minecraft" size: 14]; + } + + UIView *paddingView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 4, 20)] autorelease]; + _textName.leftView = paddingView; + _textSeed.leftView = paddingView; + + [_labelName setFont:fontLarge]; + [_labelSeed setFont:fontSmall]; + [_labelSeedHint setFont:fontSmall]; + [_labelGameMode setFont:fontSmall]; + [_labelGameModeDesc setFont:fontSmall]; + + [_textName setFont:fontLarge]; + [_textSeed setFont:fontLarge]; + + _textName.layer.borderColor = [[UIColor whiteColor] CGColor]; + _textName.layer.borderWidth = 2.0f; + + _textSeed.layer.borderColor = [[UIColor whiteColor] CGColor]; + _textSeed.layer.borderWidth = 2.0f; + + _textSeed.delegate = self; + _textName.delegate = self; + + [self UpdateGameModeDesc]; +} + +- (void)viewDidUnload +{ + [super viewDidUnload]; + // Release any retained subviews of the main view. + // e.g. self.myOutlet = nil; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation +{ + // Return YES for supported orientations + return UIInterfaceOrientationIsLandscape(interfaceOrientation); +} + +- (IBAction)Create { + //NSLog(@"I'm done!"); + // Push the strings + [self addString: [[_textName text] UTF8String]]; + [self addString: [[_textSeed text] UTF8String]]; + [self addString: getGameModeName(_currentGameModeId)]; + [self closeOk]; +} + +- (IBAction)Cancel { + //NSLog(@"I'm cancelled!"); + [self closeCancel]; +} + +- (IBAction)ToggleGameMode { + const int NumGameModes = 2; + if (++_currentGameModeId >= NumGameModes) + _currentGameModeId = 0; + + [self UpdateGameModeDesc]; +} + +- (IBAction)DismissKeyboard { + //NSLog(@"Trying to dismiss keyboard %p %p\n", _textName, _textSeed); + [_textName resignFirstResponder]; + [_textSeed resignFirstResponder]; +} + +@end diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/CreateNewWorld_ipad.xib b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/CreateNewWorld_ipad.xib new file mode 100644 index 0000000..935a2ab --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/CreateNewWorld_ipad.xib @@ -0,0 +1,628 @@ + + + + 1536 + 12C2034 + 2844 + 1187.34 + 625.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 1930 + + + YES + IBProxyObject + IBUIButton + IBUIImageView + IBUILabel + IBUITextField + IBUIView + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + + YES + + + 292 + {{274, 128}, {468, 48}} + + + + 1 + MCAwIDAAA + darkTextColor + + NO + YES + IBCocoaTouchFramework + 0 + + 1 + + 3 + MQA + + YES + 18 + + 1 + 1 + 9 + IBCocoaTouchFramework + + + AndaleMono + Andale Mono + 0 + 18 + + + Helvetica + 18 + 16 + + + + + 292 + {{274, 473}, {468, 48}} + + + + 3 + MAA + + 2 + + + NO + YES + {{1, 0}, {1, 1}} + IBCocoaTouchFramework + 0 + + 1 + + 1 + MSAxIDEAA + + YES + 24 + + 1 + 1 + 9 + IBCocoaTouchFramework + + + Helvetica + Helvetica + 0 + 24 + + + Helvetica + 24 + 16 + + + + + 292 + {{217, 422}, {565, 57}} + + + NO + YES + 7 + NO + IBCocoaTouchFramework + Seed for the World Generator + + 3 + MC42NjY2NjY2NjY3AA + + + + 3 + MC4zMzMzMzMzMzMzAA + + {2, 2} + 1 + 18 + 1 + + Minecraft + Minecraft + 0 + 18 + + + + + + 292 + {{217, 523}, {565, 57}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Leave blank for random seed + + + + {2, 2} + 1 + 18 + 1 + + + + + + 292 + {{760, 0}, {264, 104}} + + + + 1 + MC42IDAuNiAwLjYgMAA + + NO + IBCocoaTouchFramework + 0 + 0 + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + 3 + MC41AA + + + NSImage + create_1_4.png + + + NSImage + create_1.png + + + NSImage + create_0_4.png + + + Helvetica-Bold + Helvetica + 2 + 15 + + + Helvetica-Bold + 15 + 16 + + + + + 292 + {264, 104} + + + NO + IBCocoaTouchFramework + 0 + 0 + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + NSImage + cancel_1_4.png + + + NSImage + cancel_0_4.png + + + + + + + 292 + {{213, 328}, {598, 59}} + + + NO + YES + 7 + NO + IBCocoaTouchFramework + + + + + {2, 2} + 1 + 12 + 12 + 1 + + Minecraft + Minecraft + 0 + 14 + + + Helvetica + 14 + 16 + + 598 + + + + 292 + {{320, 216}, {384, 104}} + + + NO + IBCocoaTouchFramework + 0 + 0 + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + NSImage + cancel_1.png + + + NSImage + creative_1_4.png + + + + + + + 292 + {{264, 0}, {496, 104}} + + + NO + IBCocoaTouchFramework + + NSImage + worldname_ipad_4.png + + + + {1024, 742} + + + + 1 + MC40NzQ0ODk3OTU5IDAuMjc0MDc1NzkxMSAwLjIwNjM1MzA5NAA + + 4 + + 3 + 3 + + + IBUISimulatedFreeformSizeMetricsSentinel + Freeform + + IBCocoaTouchFramework + + + + + YES + + + view + + + + 12 + + + + _textName + + + + 30 + + + + _textSeed + + + + 31 + + + + _labelSeed + + + + 33 + + + + _labelGameModeDesc + + + + 38 + + + + _btnGameMode + + + + 40 + + + + _labelSeedHint + + + + 44 + + + + Create + + + 7 + + 23 + + + + Cancel + + + 7 + + 24 + + + + DismissKeyboard + + + 7 + + 28 + + + + ToggleGameMode + + + 7 + + 41 + + + + + YES + + 0 + + YES + + + + + + -1 + + + File's Owner + + + -2 + + + + + 9 + + + YES + + + + + + + + + + + + + + 8 + + + + + 7 + + + + + 5 + + + + + 4 + + + + + 3 + + + + + 36 + + + + + 37 + + + + + 42 + + + + + 43 + + + + + + + YES + + YES + -1.CustomClassName + -1.IBPluginDependency + -2.CustomClassName + -2.IBPluginDependency + 3.IBPluginDependency + 36.IBPluginDependency + 37.IBPluginDependency + 37.IBUIButtonInspectorSelectedStateConfigurationMetadataKey + 4.IBPluginDependency + 42.IBPluginDependency + 43.IBPluginDependency + 5.IBPluginDependency + 7.IBPluginDependency + 7.IBUIButtonInspectorSelectedStateConfigurationMetadataKey + 8.IBPluginDependency + 8.IBUIButtonInspectorSelectedStateConfigurationMetadataKey + 9.CustomClassName + 9.IBPluginDependency + + + YES + CreateNewWorldViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + UIControl + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + + + + YES + + + + + 44 + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + 3 + + YES + + YES + cancel_0_4.png + cancel_1.png + cancel_1_4.png + create_0_4.png + create_1.png + create_1_4.png + creative_1_4.png + worldname_ipad_4.png + + + YES + {264, 104} + {16, 16} + {264, 104} + {264, 104} + {16, 16} + {264, 104} + {384, 104} + {504, 104} + + + 1930 + + diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/CreateNewWorld_iphone.xib b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/CreateNewWorld_iphone.xib new file mode 100644 index 0000000..45b4843 --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/CreateNewWorld_iphone.xib @@ -0,0 +1,644 @@ + + + + 1536 + 11G63 + 2843 + 1138.51 + 569.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 1929 + + + YES + IBProxyObject + IBUIButton + IBUIImageView + IBUILabel + IBUITextField + IBUIView + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + + YES + + + 292 + {{130, 62}, {222, 31}} + + + + 1 + MCAwIDAAA + darkTextColor + + NO + YES + IBCocoaTouchFramework + 0 + + 1 + + 3 + MQA + + YES + 18 + + 1 + 1 + 9 + IBCocoaTouchFramework + + + AndaleMono + Andale Mono + 0 + 18 + + + Helvetica + 18 + 16 + + + + + 292 + {{130, 245}, {222, 31}} + + + 3 + MAA + + 2 + + + NO + YES + {{1, 0}, {1, 1}} + IBCocoaTouchFramework + 0 + + 1 + + 1 + MSAxIDEAA + + YES + 24 + + 1 + 1 + 9 + IBCocoaTouchFramework + + + Helvetica + Helvetica + 0 + 24 + + + Helvetica + 24 + 16 + + + + + 292 + {{86, 212}, {310, 35}} + + + NO + YES + 7 + NO + IBCocoaTouchFramework + Seed for the World Generator + + 3 + MC42NjY2NjY2NjY3AA + + + + 3 + MC4zMzMzMzMzMzMzAA + + {1, 1} + 1 + 12 + 1 + + Minecraft + Minecraft + 0 + 14 + + + Helvetica + 14 + 16 + + + + + 292 + {{86, 269}, {310, 49}} + + + NO + YES + 7 + NO + IBCocoaTouchFramework + Leave blank for a random seed + + + + {1, 1} + 1 + 12 + 1 + + Helvetica + Helvetica + 0 + 14 + + + + + + 292 + {{74, 160}, {335, 44}} + + + NO + YES + 7 + NO + IBCocoaTouchFramework + + + + + {1, 1} + 1 + 12 + 12 + 1 + + + 335 + + + + 292 + {{348, 0}, {132, 52}} + + + + 1 + MC42IDAuNiAwLjYgMAA + + NO + IBCocoaTouchFramework + 0 + 0 + Create + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + 3 + MC41AA + + + NSImage + create_1_3.png + + + + NSImage + create_0_3.png + + + Helvetica-Bold + Helvetica + 2 + 15 + + + Helvetica-Bold + 15 + 16 + + + + + 292 + {132, 52} + + + NO + IBCocoaTouchFramework + 0 + 0 + Cancel + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + NSImage + cancel_1_3.png + + + + NSImage + cancel_0_3.png + + + + + + + 292 + {{144, 109}, {191, 52}} + + + NO + IBCocoaTouchFramework + 0 + 0 + Cancel + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + NSImage + cancel_1.png + + + NSImage + creative_0_3.png + + + + + + + 292 + {{130, 0}, {220, 52}} + + + NO + IBCocoaTouchFramework + + NSImage + worldname_iphone_3.png + + + + {480, 320} + + + + 1 + MC40NzQ0ODk3OTU5IDAuMjc0MDc1NzkxMSAwLjIwNjM1MzA5NAA + + 4 + + 3 + 3 + + + IBUIScreenMetrics + + YES + + YES + + + + + YES + {320, 480} + {480, 320} + + + IBCocoaTouchFramework + Retina 3.5 Full Screen + 0 + + IBCocoaTouchFramework + + + + + YES + + + view + + + + 12 + + + + _textName + + + + 30 + + + + _textSeed + + + + 31 + + + + _labelSeed + + + + 33 + + + + _labelSeedHint + + + + 34 + + + + _labelGameModeDesc + + + + 70 + + + + _btnGameMode + + + + 73 + + + + Create + + + 7 + + 23 + + + + Cancel + + + 7 + + 24 + + + + DismissKeyboard + + + 7 + + 28 + + + + ToggleGameMode + + + 7 + + 71 + + + + + YES + + 0 + + YES + + + + + + -1 + + + File's Owner + + + -2 + + + + + 9 + + + YES + + + + + + + + + + + + + + 8 + + + + + 5 + + + + + 4 + + + + + 3 + + + + + 13 + + + + + 36 + + + + + 39 + + + + + 74 + + + + + 7 + + + + + + + YES + + YES + -1.CustomClassName + -1.IBPluginDependency + -2.CustomClassName + -2.IBPluginDependency + 13.IBPluginDependency + 3.IBPluginDependency + 36.IBPluginDependency + 36.IBUIButtonInspectorSelectedEdgeInsetMetadataKey + 36.IBUIButtonInspectorSelectedStateConfigurationMetadataKey + 39.IBPluginDependency + 4.IBPluginDependency + 5.IBPluginDependency + 7.IBPluginDependency + 7.IBUIButtonInspectorSelectedStateConfigurationMetadataKey + 74.IBPluginDependency + 8.IBPluginDependency + 8.IBUIButtonInspectorSelectedStateConfigurationMetadataKey + 9.CustomClassName + 9.IBPluginDependency + + + YES + CreateNewWorldViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + UIControl + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + + + + YES + + + + + 74 + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + 3 + + YES + + YES + cancel_0_3.png + cancel_1.png + cancel_1_3.png + create_0_3.png + create_1_3.png + creative_0_3.png + worldname_iphone_3.png + + + YES + {132, 52} + {16, 16} + {132, 52} + {132, 52} + {132, 52} + {191, 52} + {220, 52} + + + 1929 + + diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/CreateNewWorld_iphone5.xib b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/CreateNewWorld_iphone5.xib new file mode 100644 index 0000000..e5335c7 --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/CreateNewWorld_iphone5.xib @@ -0,0 +1,643 @@ + + + + 1536 + 12C2034 + 2844 + 1187.34 + 625.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 1930 + + + YES + IBProxyObject + IBUIButton + IBUIImageView + IBUILabel + IBUITextField + IBUIView + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + + YES + + + 292 + {{173, 62}, {222, 31}} + + + + 1 + MCAwIDAAA + darkTextColor + + NO + YES + IBCocoaTouchFramework + 0 + + 1 + + 3 + MQA + + YES + 18 + + 1 + 1 + 9 + IBCocoaTouchFramework + + + AndaleMono + Andale Mono + 0 + 18 + + + Helvetica + 18 + 16 + + + + + 292 + {{173, 245}, {222, 31}} + + + + 3 + MAA + + 2 + + + NO + YES + {{1, 0}, {1, 1}} + IBCocoaTouchFramework + 0 + + 1 + + 1 + MSAxIDEAA + + YES + 24 + + 1 + 1 + 9 + IBCocoaTouchFramework + + + Helvetica + Helvetica + 0 + 24 + + + Helvetica + 24 + 16 + + + + + 292 + {{129, 212}, {310, 35}} + + + NO + YES + 7 + NO + IBCocoaTouchFramework + Seed for the World Generator + + 3 + MC42NjY2NjY2NjY3AA + + + + 3 + MC4zMzMzMzMzMzMzAA + + {1, 1} + 1 + 12 + 1 + + Minecraft + Minecraft + 0 + 14 + + + Helvetica + 14 + 16 + + + + + 292 + {{129, 269}, {310, 49}} + + + NO + YES + 7 + NO + IBCocoaTouchFramework + Leave blank for a random seed + + + + {1, 1} + 1 + 12 + 1 + + Helvetica + Helvetica + 0 + 14 + + + + + + 292 + {{116, 160}, {335, 44}} + + + NO + YES + 7 + NO + IBCocoaTouchFramework + + + + + {1, 1} + 1 + 12 + 12 + 1 + + + 335 + + + + 292 + {{437, 0}, {132, 52}} + + + + 1 + MC42IDAuNiAwLjYgMAA + + NO + IBCocoaTouchFramework + 0 + 0 + Create + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + 3 + MC41AA + + + NSImage + create_1_3.png + + + + NSImage + create_0_3.png + + + Helvetica-Bold + Helvetica + 2 + 15 + + + Helvetica-Bold + 15 + 16 + + + + + 292 + {132, 52} + + + NO + IBCocoaTouchFramework + 0 + 0 + Cancel + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + NSImage + cancel_1_3.png + + + + NSImage + cancel_0_3.png + + + + + + + 292 + {{188, 109}, {191, 52}} + + + NO + IBCocoaTouchFramework + 0 + 0 + Cancel + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + NSImage + cancel_1.png + + + NSImage + creative_0_3.png + + + + + + + 292 + {{129, 0}, {310, 52}} + + + NO + IBCocoaTouchFramework + + NSImage + worldname_iphone5_3.png + + + + {480, 320} + + + + 1 + MC40NzQ0ODk3OTU5IDAuMjc0MDc1NzkxMSAwLjIwNjM1MzA5NAA + + 4 + + 3 + 3 + + + IBUIScreenMetrics + + YES + + YES + + + + + YES + {320, 480} + {480, 320} + + + IBCocoaTouchFramework + Retina 3.5 Full Screen + 0 + + IBCocoaTouchFramework + + + + + YES + + + view + + + + 12 + + + + _textName + + + + 30 + + + + _textSeed + + + + 31 + + + + _labelSeed + + + + 33 + + + + _labelSeedHint + + + + 34 + + + + _labelGameModeDesc + + + + 70 + + + + _btnGameMode + + + + 73 + + + + Create + + + 7 + + 23 + + + + Cancel + + + 7 + + 24 + + + + DismissKeyboard + + + 7 + + 28 + + + + ToggleGameMode + + + 7 + + 71 + + + + + YES + + 0 + + YES + + + + + + -1 + + + File's Owner + + + -2 + + + + + 9 + + + YES + + + + + + + + + + + + + + 8 + + + + + 7 + + + + + 5 + + + + + 4 + + + + + 3 + + + + + 13 + + + + + 36 + + + + + 39 + + + + + 74 + + + + + + + YES + + YES + -1.CustomClassName + -1.IBPluginDependency + -2.CustomClassName + -2.IBPluginDependency + 13.IBPluginDependency + 3.IBPluginDependency + 36.IBPluginDependency + 36.IBUIButtonInspectorSelectedStateConfigurationMetadataKey + 39.IBPluginDependency + 4.IBPluginDependency + 5.IBPluginDependency + 7.IBPluginDependency + 7.IBUIButtonInspectorSelectedStateConfigurationMetadataKey + 74.IBPluginDependency + 8.IBPluginDependency + 8.IBUIButtonInspectorSelectedStateConfigurationMetadataKey + 9.CustomClassName + 9.IBPluginDependency + + + YES + CreateNewWorldViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + UIControl + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + + + + YES + + + + + 75 + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + 3 + + YES + + YES + cancel_0_3.png + cancel_1.png + cancel_1_3.png + create_0_3.png + create_1_3.png + creative_0_3.png + worldname_iphone5_3.png + + + YES + {132, 52} + {16, 16} + {132, 52} + {132, 52} + {132, 52} + {191, 52} + {310, 52} + + + 1930 + + diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/IDialog.h b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/IDialog.h new file mode 100644 index 0000000..1b4b2ec --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/IDialog.h @@ -0,0 +1,23 @@ +// +// IDialog.h +// minecraftpe +// +// Created by rhino on 10/20/11. +// Copyright 2011 Mojang AB. All rights reserved. +// + +#import +#import +#import + +@class minecraftpeViewController; + +@protocol IDialog + +-(void)addToView:(UIView*)parentView; +-(void)setListener:(minecraftpeViewController*)listener; + +-(int)getUserInputStatus; +-(std::vector)getUserInput; + +@end diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/RenameMPWorldViewController.h b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/RenameMPWorldViewController.h new file mode 100644 index 0000000..c254c60 --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/RenameMPWorldViewController.h @@ -0,0 +1,23 @@ +// +// RenameMPWorldViewController.h +// minecraftpe +// +// Created by rhino on 10/20/11. +// Copyright 2011 Mojang AB. All rights reserved. +// + +#import "BaseDialogController.h" + +@interface RenameMPWorldViewController : BaseDialogController +{ + IBOutlet UILabel* _labelName; + + IBOutlet UITextField* _textName; +} + +- (IBAction)DismissKeyboard; + +- (IBAction)Create; +- (IBAction)Cancel; + +@end diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/RenameMPWorldViewController.mm b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/RenameMPWorldViewController.mm new file mode 100644 index 0000000..ebcdc01 --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/RenameMPWorldViewController.mm @@ -0,0 +1,132 @@ +// +// RenameMPWorldViewController.m +// minecraftpe +// +// Created by rhino on 10/20/11. +// Copyright 2011 Mojang. All rights reserved. +// + +#import "RenameMPWorldViewController.h" +#import + +@implementation RenameMPWorldViewController + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +{ + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + // Custom initialization + } + return self; +} + +- (void)didReceiveMemoryWarning +{ + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Release any cached data, images, etc that aren't in use. +} + +#pragma mark - View lifecycle + +- (BOOL)textFieldShouldReturn:(UITextField *)textField +{ + //NSLog(@"TextField should return\n"); + [textField setUserInteractionEnabled:YES]; + [textField resignFirstResponder]; + if (textField == _textName) + [self Create]; + return YES; +} + +- (void) resizeView:(UIView*)obj width:(int)w height:(int)h { + if (w < 0) w = obj.frame.size.width; + if (h < 0) h = obj.frame.size.height; + obj.frame = CGRectMake(obj.frame.origin.x, obj.frame.origin.y, w, h); +} + +- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string +{ + if (textField == _textName) { + NSUInteger newLength = [textField.text length] + [string length] - range.length; + if (newLength > 18) + return NO; + } + + int length = [string length]; + for (int i = 0; i < length; ++i) { + unichar ch = [string characterAtIndex:i]; + + if (ch >= 128) + return NO; + } + return YES; +} + +// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. +- (void)viewDidLoad +{ + [super viewDidLoad]; + BOOL isIpad = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad); + + UIFont* fontLarge = nil; + UIFont* fontSmall = nil; + + if (isIpad) { + [self resizeView:_textName width:-1 height:48]; + self.view.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed:@"bg128.png"] ]; + fontLarge = [UIFont fontWithName:@"minecraft" size:24]; + fontSmall = [UIFont fontWithName:@"minecraft" size:18]; + } else { + [self resizeView:_textName width:-1 height:32]; + self.view.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed:@"bg64.png"] ]; + fontLarge = [UIFont fontWithName:@"minecraft" size:16]; + fontSmall = [UIFont fontWithName:@"minecraft" size: 14]; + } + + UIView *paddingView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 4, 20)] autorelease]; + _textName.leftView = paddingView; + + [_labelName setFont:fontLarge]; + + [_textName setFont:fontLarge]; + + _textName.layer.borderColor = [[UIColor whiteColor] CGColor]; + _textName.layer.borderWidth = 2.0f; + + _textName.delegate = self; + [_textName becomeFirstResponder]; +} + +- (void)viewDidUnload +{ + [super viewDidUnload]; + // Release any retained subviews of the main view. + // e.g. self.myOutlet = nil; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation +{ + // Return YES for supported orientations + return UIInterfaceOrientationIsLandscape(interfaceOrientation); +} + +- (IBAction)Create { + //NSLog(@"I'm done!"); + // Push the strings + [self addString: [[_textName text] UTF8String]]; + [self closeOk]; +} + +- (IBAction)Cancel { + //NSLog(@"I'm cancelled!"); + [self closeCancel]; +} + +- (IBAction)DismissKeyboard { + //NSLog(@"Trying to dismiss keyboard %p %p\n", _textName, _textSeed); + [_textName resignFirstResponder]; +} + +@end diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/RenameMPWorld_ipad.xib b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/RenameMPWorld_ipad.xib new file mode 100644 index 0000000..313b099 --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/RenameMPWorld_ipad.xib @@ -0,0 +1,353 @@ + + + + 1536 + 11G63 + 2843 + 1138.51 + 569.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 1929 + + + YES + IBProxyObject + IBUIButton + IBUILabel + IBUITextField + IBUIView + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + + YES + + + 292 + {{230, 126}, {565, 31}} + + + + 1 + MCAwIDAAA + darkTextColor + + NO + YES + IBCocoaTouchFramework + 0 + + 1 + + 3 + MQA + + YES + 18 + + 1 + 1 + 1 + IBCocoaTouchFramework + + + AndaleMono + Andale Mono + 0 + 18 + + + Helvetica + 18 + 16 + + + + + 292 + {{230, 68}, {565, 55}} + + + NO + YES + 7 + NO + IBCocoaTouchFramework + Save world as + + 3 + MC42NjY2NjY2NjY3AA + + + + 3 + MC4zMzMzMzMzMzMzAA + + {2, 2} + 1 + 12 + + Minecraft + Minecraft + 0 + 14 + + + Helvetica + 14 + 16 + + + + + 292 + {{380, 214}, {264, 104}} + + + 1 + MC42IDAuNiAwLjYgMAA + + NO + IBCocoaTouchFramework + 0 + 0 + Create + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + 3 + MC41AA + + + NSImage + save_1.png + + + NSImage + create_1.png + + + NSImage + save_0.png + + + Helvetica-Bold + Helvetica + 2 + 15 + + + Helvetica-Bold + 15 + 16 + + + + {1024, 742} + + + + 1 + MC40NzQ0ODk3OTU5IDAuMjc0MDc1NzkxMSAwLjIwNjM1MzA5NAA + + 4 + + 3 + 3 + + + IBUISimulatedFreeformSizeMetricsSentinel + Freeform + + IBCocoaTouchFramework + + + + + YES + + + view + + + + 12 + + + + _textName + + + + 30 + + + + _labelName + + + + 32 + + + + Create + + + 7 + + 23 + + + + DismissKeyboard + + + 7 + + 28 + + + + + YES + + 0 + + YES + + + + + + -1 + + + File's Owner + + + -2 + + + + + 9 + + + YES + + + + + + + + 7 + + + + + 6 + + + + + 3 + + + + + + + YES + + YES + -1.CustomClassName + -1.IBPluginDependency + -2.CustomClassName + -2.IBPluginDependency + 3.IBPluginDependency + 6.IBPluginDependency + 7.IBPluginDependency + 7.IBUIButtonInspectorSelectedStateConfigurationMetadataKey + 9.CustomClassName + 9.IBPluginDependency + + + YES + CreateNewWorldViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + UIControl + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + + + + YES + + + + + 34 + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + 3 + + YES + + YES + create_1.png + save_0.png + save_1.png + + + YES + {264, 104} + {264, 104} + {264, 104} + + + 1929 + + diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/RenameMPWorld_iphone.xib b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/RenameMPWorld_iphone.xib new file mode 100644 index 0000000..9229103 --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/RenameMPWorld_iphone.xib @@ -0,0 +1,368 @@ + + + + 1536 + 11G63 + 2843 + 1138.51 + 569.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 1929 + + + YES + IBProxyObject + IBUIButton + IBUILabel + IBUITextField + IBUIView + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + + YES + + + 292 + {{112, 58}, {281, 31}} + + + + 1 + MCAwIDAAA + darkTextColor + + NO + YES + IBCocoaTouchFramework + 0 + + 1 + + 3 + MQA + + YES + 18 + + 1 + 1 + 1 + IBCocoaTouchFramework + + + AndaleMono + Andale Mono + 0 + 18 + + + Helvetica + 18 + 16 + + + + + 292 + {{112, 11}, {565, 55}} + + + NO + YES + 7 + NO + IBCocoaTouchFramework + Save world as + + 3 + MC42NjY2NjY2NjY3AA + + + + 3 + MC4zMzMzMzMzMzMzAA + + {2, 2} + 1 + 12 + + Minecraft + Minecraft + 0 + 14 + + + Helvetica + 14 + 16 + + + + + 292 + {{186, 106}, {132, 52}} + + + 1 + MC42IDAuNiAwLjYgMAA + + NO + IBCocoaTouchFramework + 0 + 0 + Create + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + 3 + MC41AA + + + NSImage + save_1.png + + + NSImage + create_1.png + + + NSImage + save_0.png + + + Helvetica-Bold + Helvetica + 2 + 15 + + + Helvetica-Bold + 15 + 16 + + + + {480, 320} + + + + 1 + MC40NzQ0ODk3OTU5IDAuMjc0MDc1NzkxMSAwLjIwNjM1MzA5NAA + + 4 + + 3 + 3 + + + IBUIScreenMetrics + + YES + + YES + + + + + YES + {320, 480} + {480, 320} + + + IBCocoaTouchFramework + Retina 3.5 Full Screen + 0 + + IBCocoaTouchFramework + + + + + YES + + + view + + + + 12 + + + + _textName + + + + 30 + + + + _labelName + + + + 32 + + + + Create + + + 7 + + 23 + + + + DismissKeyboard + + + 7 + + 28 + + + + + YES + + 0 + + YES + + + + + + -1 + + + File's Owner + + + -2 + + + + + 9 + + + YES + + + + + + + + 7 + + + + + 6 + + + + + 3 + + + + + + + YES + + YES + -1.CustomClassName + -1.IBPluginDependency + -2.CustomClassName + -2.IBPluginDependency + 3.IBPluginDependency + 6.IBPluginDependency + 7.IBPluginDependency + 7.IBUIButtonInspectorSelectedStateConfigurationMetadataKey + 9.CustomClassName + 9.IBPluginDependency + + + YES + CreateNewWorldViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + UIControl + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + + + + YES + + + + + 34 + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + 3 + + YES + + YES + create_1.png + save_0.png + save_1.png + + + YES + {264, 104} + {264, 104} + {264, 104} + + + 1929 + + diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/RenameMPWorld_iphone5.xib b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/RenameMPWorld_iphone5.xib new file mode 100644 index 0000000..a6ae64b --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/dialogs/RenameMPWorld_iphone5.xib @@ -0,0 +1,367 @@ + + + + 1536 + 11G63 + 2843 + 1138.51 + 569.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 1929 + + + YES + IBProxyObject + IBUIButton + IBUILabel + IBUITextField + IBUIView + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + + YES + + + 292 + {{150, 58}, {281, 31}} + + + 1 + MCAwIDAAA + darkTextColor + + NO + YES + IBCocoaTouchFramework + 0 + + 1 + + 3 + MQA + + YES + 18 + + 1 + 1 + 1 + IBCocoaTouchFramework + + + AndaleMono + Andale Mono + 0 + 18 + + + Helvetica + 18 + 16 + + + + + 292 + {{150, 11}, {565, 55}} + + + NO + YES + 7 + NO + IBCocoaTouchFramework + Save world as + + 3 + MC42NjY2NjY2NjY3AA + + + + 3 + MC4zMzMzMzMzMzMzAA + + {2, 2} + 1 + 12 + + Minecraft + Minecraft + 0 + 14 + + + Helvetica + 14 + 16 + + + + + 292 + {{224, 106}, {132, 52}} + + + 1 + MC42IDAuNiAwLjYgMAA + + NO + IBCocoaTouchFramework + 0 + 0 + Create + + + 1 + MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA + + + 3 + MC41AA + + + NSImage + save_1.png + + + NSImage + create_1.png + + + NSImage + save_0.png + + + Helvetica-Bold + Helvetica + 2 + 15 + + + Helvetica-Bold + 15 + 16 + + + + {480, 320} + + + + 1 + MC40NzQ0ODk3OTU5IDAuMjc0MDc1NzkxMSAwLjIwNjM1MzA5NAA + + 4 + + 3 + 3 + + + IBUIScreenMetrics + + YES + + YES + + + + + YES + {320, 480} + {480, 320} + + + IBCocoaTouchFramework + Retina 3.5 Full Screen + 0 + + IBCocoaTouchFramework + + + + + YES + + + view + + + + 12 + + + + _textName + + + + 30 + + + + _labelName + + + + 32 + + + + Create + + + 7 + + 23 + + + + DismissKeyboard + + + 7 + + 28 + + + + + YES + + 0 + + YES + + + + + + -1 + + + File's Owner + + + -2 + + + + + 9 + + + YES + + + + + + + + 7 + + + + + 6 + + + + + 3 + + + + + + + YES + + YES + -1.CustomClassName + -1.IBPluginDependency + -2.CustomClassName + -2.IBPluginDependency + 3.IBPluginDependency + 6.IBPluginDependency + 7.IBPluginDependency + 7.IBUIButtonInspectorSelectedStateConfigurationMetadataKey + 9.CustomClassName + 9.IBPluginDependency + + + YES + CreateNewWorldViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + UIControl + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + + + + YES + + + + + 34 + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + 3 + + YES + + YES + create_1.png + save_0.png + save_1.png + + + YES + {264, 104} + {264, 104} + {264, 104} + + + 1929 + + diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe/en.lproj/InfoPlist.strings b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe/en.lproj/MainWindow.xib b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/en.lproj/MainWindow.xib new file mode 100644 index 0000000..68b66a7 --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/en.lproj/MainWindow.xib @@ -0,0 +1,196 @@ + + + + 1056 + 10H574 + 1248 + 1038.35 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 106 + + + YES + IBUIWindow + IBUICustomObject + IBUIViewController + IBProxyObject + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + IBCocoaTouchFramework + + + minecraftpeViewController + + 1 + 1 + + YES + IBCocoaTouchFramework + NO + + + + 1316 + + {320, 460} + + 1 + MSAxIDEAA + + NO + IBCocoaTouchFramework + YES + YES + + + + + YES + + + delegate + + + + 4 + + + + window + + + + 5 + + + + viewController + + + + 11 + + + + + YES + + 0 + + + + + + 2 + + + YES + + + + + -1 + + + File's Owner + + + 3 + + + + + -2 + + + + + 10 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 10.CustomClassName + 10.IBEditorWindowLastContentRect + 10.IBPluginDependency + 2.IBAttributePlaceholdersKey + 2.IBEditorWindowLastContentRect + 2.IBPluginDependency + 3.CustomClassName + 3.IBPluginDependency + + + YES + UIApplication + UIResponder + minecraftpeViewController + {{415, 586}, {320, 480}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + YES + + + + {{228, 376}, {320, 480}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + minecraftpeAppDelegate + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + + + + YES + + + + + 11 + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + OpenGLES_iPhone.xcodeproj + 3 + 106 + + diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe/en.lproj/minecraftpeViewController.xib b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/en.lproj/minecraftpeViewController.xib new file mode 100644 index 0000000..067b507 --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/en.lproj/minecraftpeViewController.xib @@ -0,0 +1,145 @@ + + + + 1024 + 10H574 + 1248 + 1038.35 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 106 + + + YES + IBProxyObject + IBUIView + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + {320, 460} + + + + + 3 + MQA + + 2 + + + NO + IBCocoaTouchFramework + + + + + YES + + + view + + + + 3 + + + + + YES + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 2.CustomClassName + 2.IBEditorWindowLastContentRect + 2.IBPluginDependency + + + YES + minecraftpeViewController + UIResponder + EAGLView + {{401, 662}, {320, 460}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + + + + YES + + + + + 4 + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + Untitled.xcodeproj + 3 + 106 + + diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe/main.mm b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/main.mm new file mode 100644 index 0000000..fdf236a --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/main.mm @@ -0,0 +1,18 @@ + +// +// main.m +// minecraftpe +// +// Created by rhino on 10/17/11. +// Copyright 2011 Mojang AB. All rights reserved. +// + +#import + +int main(int argc, char *argv[]) +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + int retVal = UIApplicationMain(argc, argv, nil, nil); + [pool release]; + return retVal; +} diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe/minecraftpe-Info.plist b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/minecraftpe-Info.plist new file mode 100644 index 0000000..30bd23f --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/minecraftpe-Info.plist @@ -0,0 +1,73 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + Minecraft PE + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIconFiles + + Icon.png + Icon@2x.png + Icon-72.png + Icon-Small.png + Icon-Small-50.png + Icon-Small@2x.png + + CFBundleIcons + + CFBundlePrimaryIcon + + CFBundleIconFiles + + Icon.png + Icon@2x.png + Icon-72.png + Icon-Small.png + Icon-Small-50.png + Icon-Small@2x.png + + UIPrerenderedIcon + + + + CFBundleIdentifier + com.mojang.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + Minecraft PE + CFBundlePackageType + APPL + CFBundleShortVersionString + 0.6.0 + CFBundleSignature + ???? + CFBundleVersion + 0.6.0.0 + LSRequiresIPhoneOS + + NSMainNibFile + MainWindow + UIAppFonts + + minecraft.ttf + + UIPrerenderedIcon + + UIRequiresPersistentWiFi + + UIStatusBarHidden + + UISupportedInterfaceOrientations + + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe/minecraftpe-Prefix.pch b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/minecraftpe-Prefix.pch new file mode 100644 index 0000000..c07882f --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/minecraftpe-Prefix.pch @@ -0,0 +1,14 @@ +// +// Prefix header for all source files of the 'minecraftpe' target in the 'minecraftpe' project +// + +#import + +#ifndef __IPHONE_3_0 +#warning "This project uses features only available in iPhone SDK 3.0 and later." +#endif + +#ifdef __OBJC__ + #import + #import +#endif diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe/minecraftpeAppDelegate.h b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/minecraftpeAppDelegate.h new file mode 100644 index 0000000..0028a8c --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/minecraftpeAppDelegate.h @@ -0,0 +1,29 @@ +// +// minecraftpeAppDelegate.h +// minecraftpe +// +// Created by rhino on 10/17/11. +// Copyright 2011 Mojang AB. All rights reserved. +// + +#import +#import + +@class minecraftpeViewController; + +@interface minecraftpeAppDelegate : NSObject { + AVAudioSession* audioSession; + NSString* audioSessionSoundCategory; +} + +@property (nonatomic, retain) IBOutlet UIWindow *window; + +@property (nonatomic, retain) IBOutlet minecraftpeViewController *viewController; + +// AVAudioSessionDelegate +- (void)beginInterruption; +- (void)endInterruption; + ++ (void) initialize; + +@end diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe/minecraftpeAppDelegate.mm b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/minecraftpeAppDelegate.mm new file mode 100644 index 0000000..ea8e5a9 --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/minecraftpeAppDelegate.mm @@ -0,0 +1,180 @@ +// +// minecraftpeAppDelegate.m +// minecraftpe +// +// Created by rhino on 10/17/11. +// Copyright 2011 Mojang AB. All rights reserved. +// + +#import "minecraftpeAppDelegate.h" + +#import "EAGLView.h" + +#import "minecraftpeViewController.h" + + +@implementation minecraftpeAppDelegate + +@synthesize window = _window; +@synthesize viewController = _viewController; + + +- (void) registerDefaultsFromFile:(NSString*)filename { + NSString* pathToUserDefaultsValues = [[NSBundle mainBundle] + pathForResource:filename + ofType:@"plist"]; + NSDictionary* userDefaultsValues = [NSDictionary dictionaryWithContentsOfFile:pathToUserDefaultsValues]; + [[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsValues]; +} + +NSError* audioSessionError = nil; + +- (void) initAudio { + audioSession = [AVAudioSession sharedInstance]; + [audioSession setActive:YES error:&audioSessionError]; + + if (audioSessionError) + NSLog(@"Warning; Couldn't set audio active\n"); + + [audioSession setDelegate:self]; + + audioSessionSoundCategory = AVAudioSessionCategoryAmbient; + audioSessionError = nil; + + [audioSession setCategory:audioSessionSoundCategory error:&audioSessionError]; + + if (audioSessionError) + NSLog(@"Warning; Couldn't init audio\n"); +} + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + // Override point for customization after application launch. + [self initAudio]; + + self.window.rootViewController = self.viewController; +#ifndef ANDROID_PUBLISH + NSLog(@"ViewController: %p\n", self.viewController); +#endif + //[self registerDefaultsFromFile:@"userDefaults"]; + return YES; +} + +- (void)applicationWillResignActive:(UIApplication *)application +{ + /* + Sent when the application is about to move from active to inactive + state. This can occur for certain types of temporary interruptions + (such as an incoming phone call or SMS message) or when the user + quits the application and it begins the transition to the background + state. + Use this method to pause ongoing tasks, disable timers, and throttle + down OpenGL ES frame rates. Games should use this method to pause the game. + */ +#ifndef ANDROID_PUBLISH + NSLog(@"resign-active: %@\n", [NSThread currentThread]); +#endif + [self.viewController stopAnimation]; +} + +- (void)applicationDidEnterBackground:(UIApplication *)application +{ + /* + Use this method to release shared resources, save user data, invalidate + timers, and store enough application state information to restore your + application to its current state in case it is terminated later. + If your application supports background execution, this method is + called instead of applicationWillTerminate: when the user quits. + */ + [self.viewController enteredBackground]; +} + +- (void)applicationWillEnterForeground:(UIApplication *)application +{ + /* + Called as part of the transition from the background to the inactive state; + here you can undo many of the changes made on entering the background. + */ +} + +- (void)applicationDidBecomeActive:(UIApplication *)application +{ + /* + Restart any tasks that were paused (or not yet started) while the + application was inactive. If the application was previously in the + background, optionally refresh the user interface. + */ +#ifndef ANDROID_PUBLISH + NSLog(@"become-active: %@\n", [NSThread currentThread]); +#endif + [self.viewController startAnimation]; +} + +- (void)applicationWillTerminate:(UIApplication *)application +{ + /* + Called when the application is about to terminate. + Save data if appropriate. + See also applicationDidEnterBackground:. + */ + [self.viewController stopAnimation]; +} + +- (void)dealloc +{ + [_window release]; + [_viewController release]; + [super dealloc]; +} + ++ (void) initialize { + if ([self class] == [minecraftpeAppDelegate class]) { + } +} + + +// +// AudioSesssionDelegate +// +- (void)setAudioEnabled:(BOOL)status { + //NSLog(@"set-audio-enabled: :%d %@\n", status, [NSThread currentThread]); + + if(status) { + NSLog(@"INFO - SoundManager: OpenAL Active"); + // Set the AudioSession AudioCategory to what has been defined in soundCategory + [audioSession setCategory:audioSessionSoundCategory error:&audioSessionError]; + if(audioSessionError) { + NSLog(@"ERROR - SoundManager: Unable to set the audio session category with error: %@\n", audioSessionError); + return; + } + + // Set the audio session state to true and report any errors + [audioSession setActive:YES error:&audioSessionError]; + if (audioSessionError) { + NSLog(@"ERROR - SoundManager: Unable to set the audio session state to YES with error: %@\n", audioSessionError); + return; + } + } else { + NSLog(@"INFO - SoundManager: OpenAL Inactive"); + + // Set the audio session state to false and report any errors +// [audioSession setActive:NO error:&audioSessionError]; +// if (audioSessionError) { +// NSLog(@"ERROR - SoundManager: Unable to set the audio session state to NO with error: %@\n", audioSessionError); +// return; +// } + } + + [_viewController setAudioEnabled:status]; +} + +- (void)beginInterruption { + //NSLog(@"beginInterruption\n"); + [self setAudioEnabled:NO]; +} +- (void)endInterruption { + //NSLog(@"endInterruption\n"); + [self setAudioEnabled:YES]; +} + +@end diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe/minecraftpeViewController.h b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/minecraftpeViewController.h new file mode 100644 index 0000000..011e6e4 --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/minecraftpeViewController.h @@ -0,0 +1,78 @@ +// +// minecraftpeViewController.h +// minecraftpe +// +// Created by rhino on 10/17/11. +// Copyright 2011 Mojang AB. All rights reserved. +// + +#import + +#import +#import +#import "../../../src/App.h" +#import "../../../src/AppPlatform_iOS.h" +#import "../../../src/NinecraftApp.h" +#import "ShowKeyboardView.h" + +#import "../../lib_projects/InAppSettingsKit/Controllers/IASKAppSettingsViewController.h" + +@class EAGLContext; +//@class App; +//@class AppContext; +//@class AppPlatform_iOS; +@class BaseDialogController; + +@interface minecraftpeViewController : UIViewController { + EAGLContext *context; + + // App and AppPlatform + App* _app; + AppContext* _context; + AppPlatform_iOS* _platform; + + UITouch** _touchMap; + + BOOL animating; + NSInteger animationFrameInterval; + CADisplayLink *displayLink; + + BaseDialogController* _dialog; + + int _dialogResultStatus; + std::vector _dialogResultStrings; + + ShowKeyboardView* _keyboardView; + + @public + float viewScale; +} + +@property (readonly, nonatomic, getter=isAnimating) BOOL animating; +@property (nonatomic) NSInteger animationFrameInterval; + +@property (nonatomic, retain) IASKAppSettingsViewController *appSettingsViewController; + + +- (void)startAnimation; +- (void)stopAnimation; +- (void)enteredBackground; + +- (void)setAudioEnabled:(BOOL)status; + +-(int) getUserInputStatus; +-(std::vector)getUserInput; + +- (void)showDialog_CreateWorld; +- (void)showDialog_MainMenuOptions; +- (void)showDialog_RenameMPWorld; + +- (void)showKeyboard; +- (void)hideKeyboard; + +- (void) closeDialog; +- (BaseDialogController*) dialog; + ++ (void) initialize; + +@end diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe/minecraftpeViewController.mm b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/minecraftpeViewController.mm new file mode 100644 index 0000000..e8cec23 --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/minecraftpeViewController.mm @@ -0,0 +1,555 @@ +// +// minecraftpeViewController.m +// minecraftpe +// +// Created by rhino on 10/17/11. +// Copyright 2011 Mojang AB. All rights reserved. +// + +#import + +#import "minecraftpeViewController.h" +#import "EAGLView.h" + +#import "../../../src/platform/input/Multitouch.h" +#import "../../../src/platform/input/Mouse.h" +#import "../../../src/client/OptionStrings.h" + +#import "../../../src/App.h" +#import "../../../src/AppPlatform_iOS.h" +#import "../../../src/NinecraftApp.h" + +//#import "dialogs/DialogViewController.h" +#import "dialogs/CreateNewWorldViewController.h" +#import "dialogs/RenameMPWorldViewController.h" +#import "../../lib_projects/InAppSettingsKit/Models/IASKSettingsReader.h" + +#import "../../lib_projects/InAppSettingsKit/Views/IASKSwitch.h" +#import "../../lib_projects/InAppSettingsKit/Views/IASKPSToggleSwitchSpecifierViewCell.h" + +@interface minecraftpeViewController () +@property (nonatomic, retain) EAGLContext *context; +@property (nonatomic, assign) CADisplayLink *displayLink; +- (BOOL) initView; +- (BOOL) releaseView; + +- (void) _resetAllPointers; +@end + +static NSThread* lastThread = nil; + +@implementation minecraftpeViewController + +@synthesize animating; +@synthesize context; +@synthesize displayLink; + +@synthesize appSettingsViewController; + +- (IASKAppSettingsViewController*)appSettingsViewController { + if (!appSettingsViewController) { + appSettingsViewController = [[IASKAppSettingsViewController alloc] initWithNibName:@"IASKAppSettingsView" bundle:nil]; + appSettingsViewController.delegate = self; + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(settingToggled:) name:kIASKAppSettingChanged object:nil]; + } + return appSettingsViewController; +} + +- (void)awakeFromNib +{ + EAGLContext *aContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1]; + + if (!aContext) + NSLog(@"Failed to create ES context"); + else if (![EAGLContext setCurrentContext:aContext]) + NSLog(@"Failed to set ES context current"); + + self.context = aContext; + [aContext release]; + + [(EAGLView *)self.view setContext:context]; + [(EAGLView *)self.view setFramebuffer]; + + animating = FALSE; + animationFrameInterval = 1; + + //animationFrameInterval = 2; + + //NSString* renderer = [[NSString alloc] initWithUTF8String: (const char*)glGetString(GL_RENDERER)]; + //if (renderer != nil && [renderer rangeOfString:@"SGX"].location != NSNotFound && [renderer rangeOfString:@"543"].location != NSNotFound) + //{ + //NSLog(@"WE HAVE A FAST GRAPHICS CARD\n"); + //NSLog(@"WE HAVE A FAST GRAPHICS CARD\n"); + //NSLog(@"WE HAVE A FAST GRAPHICS CARD\n"); + //animationFrameInterval = 1; + //} + //[renderer release]; + + self.displayLink = nil; + + _platform = new AppPlatform_iOS(self); + _context = new AppContext(); + _context->platform = _platform; + _context->doRender = false; + + viewScale = 1; + + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + NSString *documentsDirectory = [paths objectAtIndex:0]; + + NSArray *tmpPaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); + NSString *cachesDirectory = [tmpPaths objectAtIndex:0]; + + _app = new NinecraftApp(); + ((Minecraft*)_app)->externalStoragePath = [documentsDirectory UTF8String]; + ((Minecraft*)_app)->externalCacheStoragePath = [cachesDirectory UTF8String]; + + [self initView]; + //_app->init(*_context); + + _touchMap = new UITouch*[Multitouch::MAX_POINTERS]; + [self _resetAllPointers]; + + _dialog = nil; +} + +- (void)dealloc +{ + // Tear down context. + if ([EAGLContext currentContext] == context) + [EAGLContext setCurrentContext:nil]; + + delete _app; + delete _platform; + delete[] _touchMap; + + [context release]; + + [super dealloc]; +} + +- (void)didReceiveMemoryWarning +{ + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Release any cached data, images, etc. that aren't in use. +} + +- (void)viewWillAppear:(BOOL)animated +{ + [self startAnimation]; + + [super viewWillAppear:animated]; +} + +- (void)viewWillDisappear:(BOOL)animated +{ + [self stopAnimation]; + + [super viewWillDisappear:animated]; +} + +- (void)viewDidLoad +{ + _keyboardView = [[ShowKeyboardView alloc] init]; + [super viewDidLoad]; +} + +- (void)viewDidUnload +{ + [super viewDidUnload]; + [_keyboardView release]; + _keyboardView = nil; + // Tear down context. + if ([EAGLContext currentContext] == context) + [EAGLContext setCurrentContext:nil]; + self.context = nil; +} + +- (NSInteger)animationFrameInterval +{ + return animationFrameInterval; +} + +- (void)setAnimationFrameInterval:(NSInteger)frameInterval +{ + if (frameInterval >= 1) { + animationFrameInterval = frameInterval; + + if (animating) { + [self stopAnimation]; + [self startAnimation]; + } + } +} + +- (void)startAnimation +{ + if (!animating) { + CADisplayLink *aDisplayLink = [[UIScreen mainScreen] displayLinkWithTarget:self selector:@selector(drawFrame)]; + [aDisplayLink setFrameInterval:animationFrameInterval]; + [aDisplayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; + self.displayLink = aDisplayLink; + + //[self initView]; + //NSLog(@"start-animation: %@\n", [NSThread currentThread]); + + animating = TRUE; + + //((Minecraft*)_app)->resetServerSocket(true); + } +} + +- (void)stopAnimation +{ + if (animating) { + [self.displayLink invalidate]; + self.displayLink = nil; + animating = FALSE; + + //[self releaseView]; + //NSLog(@"stop-animation: %@\n", [NSThread currentThread]); + } +} + +- (void)enteredBackground +{ +#ifdef APPLE_DEMO_PROMOTION + if (_app) + ((Minecraft*)_app)->leaveGame(); +#endif +} + +- (void)setAudioEnabled:(BOOL)status { + if (status) _app->audioEngineOn(); + else _app->audioEngineOff(); +} + +- (void)drawFrame +{ + NSThread* currentThread = [NSThread currentThread]; + + if (lastThread == nil) { + //NSLog(@"draw-frame: %@\n", currentThread); + lastThread = currentThread; + } + + if (currentThread != lastThread) { + NSLog(@"Warning! draw-frame thread changed (%@ -> %@)\n", lastThread, currentThread); + lastThread = currentThread; + } + + [(EAGLView *)self.view setFramebuffer]; + + _app->update(); + + const GLenum discards[] = {GL_DEPTH_ATTACHMENT}; +// glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); + glDiscardFramebufferEXT(GL_FRAMEBUFFER, 1, discards); + + [(EAGLView *)self.view presentFramebuffer]; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation +{ + // Return YES for supported orientations + return UIInterfaceOrientationIsLandscape(interfaceOrientation); +} + +- (BOOL) initView +{ + viewScale = ((EAGLView*)self.view)->viewScale; + + if (!_app->isInited()) + _app->init(*_context); + else + _app->onGraphicsReset(*_context); + + CGRect screen = [[UIScreen mainScreen] bounds]; + CGFloat width = MAX(screen.size.width, screen.size.height) * viewScale; + CGFloat height = MIN(screen.size.width, screen.size.height) * viewScale; + +// CGFloat width = ((EAGLView*)self.view)->framebufferWidth; +// CGFloat height = ((EAGLView*)self.view)->framebufferHeight; + + //NSLog(@"initView. Setting size: %f, %f\n", width, height); + _app->setSize((int)width, (int)height); + + return true; +} + +- (BOOL) releaseView +{ + return true; +} + +-(int) _getIndexForTouch:(UITouch*) touch { + for (int i = 0; i < Multitouch::MAX_POINTERS; ++i) + if (_touchMap[i] == touch) return i; + // @todo: implement a fail-safe! something like this; + // 1) If we've come here (pointer isn't found), increment missValue + // 2) If missValue >= N, call _resetAllPointers + // X) If we found a pointer, reset the missValue to 0 + return -1; +} + +-(void) _resetAllPointers { + for (int i = 0; i < Multitouch::MAX_POINTERS; ++i) + _touchMap[i] = 0; +} + +-(int) _startTrackingTouch:(UITouch*) touch { + for (int i = 0; i < Multitouch::MAX_POINTERS; ++i) + if (_touchMap[i] == 0) { + _touchMap[i] = touch; + return i; + } + return -1; +} + +-(int) _stopTrackingTouch:(UITouch*) touch { + for (int i = 0; i < Multitouch::MAX_POINTERS; ++i) + if (_touchMap[i] == touch) { + _touchMap[i] = 0; + return i; + } + return -1; +} + +// Handles the start of a touch +- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event +{ + //NSLog(@"touch began count: %d\n",[touches count]); + + for( UITouch *touch in touches ) { + int pointerId = [self _startTrackingTouch:touch]; +// NSLog(@"touch-began: %d %p\n", pointerId, touch); + if (pointerId >= 0) { + CGPoint touchLocation = [touch locationInView:[self view]]; + touchLocation.x *= viewScale; + touchLocation.y *= viewScale; + //LOGI("d: %f, %f\n", touchLocation.x, touchLocation.y); + Mouse::feed(1, 1, touchLocation.x, touchLocation.y); + Multitouch::feed(1, 1, touchLocation.x, touchLocation.y, pointerId); + } + } +} + +// Handles the continuation of a touch. +- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event +{ + //NSLog(@"touch moved: %d\n",[touches count]); + + for( UITouch *touch in touches ) { + int pointerId = [self _getIndexForTouch:touch]; + if (pointerId >= 0) { + //NSLog(@"Zilly-bop: %d %p\n", pointerId, touch); + CGPoint touchLocation = [touch locationInView:[self view]]; + touchLocation.x *= viewScale; + touchLocation.y *= viewScale; + //LOGI("t: %f, %f\n", touchLocation.x, touchLocation.y); + Mouse::feed(0, 0, touchLocation.x, touchLocation.y); + Multitouch::feed(0, 0, touchLocation.x, touchLocation.y, pointerId); + } + } +} + +// Handles the end of a touch event. +- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event +{ + for( UITouch *touch in touches ) { + int pointerId = [self _stopTrackingTouch:touch]; + if (pointerId >= 0) { + CGPoint touchLocation = [touch locationInView:[self view]]; + touchLocation.x *= viewScale; + touchLocation.y *= viewScale; + Mouse::feed(1, 0, touchLocation.x, touchLocation.y); + Multitouch::feed(1, 0, touchLocation.x, touchLocation.y, pointerId); + } + } +} + +// Handles the cancellation of a touch event. +- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event +{ + [self touchesEnded: touches withEvent:event]; +} + + +// +// Interfaces for AppPlatform +// + +-(BaseDialogController*) dialog +{ + return _dialog; +} + +- (void) initDialog { + _dialogResultStatus = -1; + _dialogResultStrings.clear(); + [_dialog setListener:self]; +} + +- (void) closeDialog { + if (_dialog != nil) { + _dialogResultStatus = [_dialog getUserInputStatus]; + _dialogResultStrings = [_dialog getUserInput]; + } + //NSLog(@"Close@vc: %p %d\n", _dialog, _dialogResultStatus); + [_dialog dismissModalViewControllerAnimated:YES]; + + [_dialog release]; + _dialog = nil; +} + +- (void)showDialog_CreateWorld +{ + if (!_dialog) { + BOOL isIpad = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad); + + CGRect screen = [[UIScreen mainScreen] bounds]; + CGFloat width = MAX(screen.size.width, screen.size.height); + BOOL isIphone5 = (width == 568); + NSString* xib = isIpad ? @"CreateNewWorld_ipad" : (isIphone5? @"CreateNewWorld_iphone5" : @"CreateNewWorld_iphone"); + _dialog = [[CreateNewWorldViewController alloc] initWithNibName:xib bundle:[NSBundle mainBundle]]; + [self presentModalViewController:_dialog animated:YES]; + [self initDialog]; + //NSLog(@"--- %p %p\n", _dialog, [self view]); + //[_dialog addToView:[self view]]; + } +} + +- (void)showDialog_MainMenuOptions +{ + if (!_dialog) { + UINavigationController *aNavController = [[UINavigationController alloc] initWithRootViewController:self.appSettingsViewController]; + [self.appSettingsViewController setShowCreditsFooter:NO]; + self.appSettingsViewController.showDoneButton = YES; + [self presentModalViewController:aNavController animated:YES]; +#ifdef APPLE_DEMO_PROMOTION + [appSettingsViewController setEnabled:NO forKey:[NSString stringWithUTF8String:OptionStrings::Multiplayer_ServerVisible]]; + [appSettingsViewController setEnabled:NO forKey:[NSString stringWithUTF8String:OptionStrings::Multiplayer_Username]]; +#endif + [self initDialog]; + [aNavController release]; + } +} + +- (void)showDialog_RenameMPWorld +{ + if (!_dialog) { + BOOL isIpad = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad); + CGRect screen = [[UIScreen mainScreen] bounds]; + CGFloat width = MAX(screen.size.width, screen.size.height); + BOOL isIphone5 = (width == 568); + NSString* xib = isIpad ? @"RenameMPWorld_ipad" : (isIphone5? @"RenameMPWorld_iphone5" : @"RenameMPWorld_iphone"); + _dialog = [[RenameMPWorldViewController alloc] initWithNibName:xib bundle:[NSBundle mainBundle]]; + [self presentModalViewController:_dialog animated:YES]; + [self initDialog]; + //NSLog(@"--- %p %p\n", _dialog, [self view]); + //[_dialog addToView:[self view]]; + } +} + +- (int) getUserInputStatus { + //NSLog(@"getUserI: %d\n", _dialogResultStatus); + return _dialogResultStatus; +} + +- (std::vector)getUserInput { + //LOGI("-----\n"); + //for (int i = 0; i < _dialogResultStrings.size(); i += 2) { + // LOGI("%d: %s, %s\n", i/2, _dialogResultStrings[i].c_str(), _dialogResultStrings[i+1].c_str()); + //} + return _dialogResultStrings; +} + +// +// IASK Delegate interface +// + +// @note: See StringIfEmpty option (added by me) in IASK as well, that one's triggered +// earlier. This one is more of a fail-safe to prevent an empty name +NSString* DefaultUsername = @"Stevie"; + +- (void)settingsViewControllerDidEnd:(IASKAppSettingsViewController*)sender { + [self dismissModalViewControllerAnimated:YES]; + + NSString* Key = [[NSString alloc] initWithUTF8String:OptionStrings::Multiplayer_Username]; + NSString* username = [[NSUserDefaults standardUserDefaults] objectForKey:Key]; + if ([username isEqualToString:@""]) { + [[NSUserDefaults standardUserDefaults] setObject:DefaultUsername forKey:Key]; + } + + [Key release]; + + _dialogResultStatus = 1; +} + +- (void)settingToggled:(NSNotification *) notification { + NSString* name = [notification object]; + NSString* KeyLowQuality = [[NSString alloc] initWithUTF8String:OptionStrings::Graphics_LowQuality]; + NSString* KeyFancy = [[NSString alloc] initWithUTF8String:OptionStrings::Graphics_Fancy]; + + if ([name isEqualToString:KeyLowQuality]) { + //NSLog(@"Notification: %d %@ %@\n", enabled, [[notification userInfo] description], [[[notification userInfo] objectForKey:name] class]); + + BOOL enabled = ! [[[notification userInfo] objectForKey:name] boolValue]; + if (!enabled) { + [appSettingsViewController getSwitch:KeyFancy].on = NO; + } + //[appSettingsViewController setEnabled:enabled forKey:KeyFancy]; + } + if ([name isEqualToString:KeyFancy]) { + BOOL enabled = ! [[[notification userInfo] objectForKey:name] boolValue]; + if (!enabled) { + [appSettingsViewController getSwitch:KeyLowQuality].on = NO; + } + } + + [KeyLowQuality release]; + [KeyFancy release]; +} + ++ (void) initialize { + if ([self class] == [minecraftpeViewController class]) { + NSDictionary* defaults = [NSDictionary dictionaryWithObjectsAndKeys: + DefaultUsername, [NSString stringWithUTF8String:OptionStrings::Multiplayer_Username], + [NSNumber numberWithBool:YES], [NSString stringWithUTF8String:OptionStrings::Multiplayer_ServerVisible], + [NSNumber numberWithBool:NO], [NSString stringWithUTF8String:OptionStrings::Graphics_Fancy], + [NSNumber numberWithBool:NO], [NSString stringWithUTF8String:OptionStrings::Graphics_LowQuality], + [NSNumber numberWithFloat:0.5f],[NSString stringWithUTF8String:OptionStrings::Controls_Sensitivity], + [NSNumber numberWithBool:NO], [NSString stringWithUTF8String:OptionStrings::Controls_InvertMouse], + [NSNumber numberWithBool:NO], [NSString stringWithUTF8String:OptionStrings::Controls_IsLefthanded], + [NSNumber numberWithBool:NO], [NSString stringWithUTF8String:OptionStrings::Controls_UseTouchJoypad], + @"2", [NSString stringWithUTF8String:OptionStrings::Game_DifficultyLevel], + nil]; + [[NSUserDefaults standardUserDefaults] registerDefaults:defaults]; + } +} + +- (void)showKeyboard { + for(UIView* view in self.view.subviews) { + if([view isKindOfClass:[ShowKeyboardView class]]) { + ShowKeyboardView* kview = (ShowKeyboardView*) view; + [kview showKeyboard]; + return; + } + } + [self.view insertSubview:_keyboardView atIndex:0]; + [_keyboardView showKeyboard]; +} +- (void)hideKeyboard { + for(UIView* view in self.view.subviews) { + if([view isKindOfClass:[ShowKeyboardView class]]) { + ShowKeyboardView* kview = (ShowKeyboardView*) view; + [kview hideKeyboard]; + [kview removeFromSuperview]; + } + } +} + +@end diff --git a/minecraftcpp-master/handheld/project/iosproj/minecraftpe/minecraftpedemo-info.plist b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/minecraftpedemo-info.plist new file mode 100644 index 0000000..39d91a6 --- /dev/null +++ b/minecraftcpp-master/handheld/project/iosproj/minecraftpe/minecraftpedemo-info.plist @@ -0,0 +1,71 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + Minecraft PE + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIconFiles + + Icon_lite.png + Icon@2x_lite.png + Icon-Small_lite.png + Icon-Small-50_lite.png + Icon-Small@2x_lite.png + Icon-72_lite.png + + CFBundleIcons + + CFBundlePrimaryIcon + + CFBundleIconFiles + + Icon_lite.png + Icon@2x_lite.png + Icon-Small_lite.png + Icon-Small-50_lite.png + Icon-Small@2x_lite.png + Icon-72_lite.png + + UIPrerenderedIcon + + + + CFBundleIdentifier + com.mojang.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + Minecraft PE + CFBundlePackageType + APPL + CFBundleShortVersionString + 0.2.1 + CFBundleSignature + ???? + CFBundleVersion + 0.2.1.0 + LSRequiresIPhoneOS + + NSMainNibFile + MainWindow + UIAppFonts + + minecraft.ttf + + UIPrerenderedIcon + + UIStatusBarHidden + + UISupportedInterfaceOrientations + + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Controllers/IASKAppSettingsViewController.h b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Controllers/IASKAppSettingsViewController.h new file mode 100644 index 0000000..0f97338 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Controllers/IASKAppSettingsViewController.h @@ -0,0 +1,79 @@ +// +// IASKAppSettingsViewController.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import +#import + +#import "IASKSettingsStore.h" + +@class IASKSettingsReader; +@class IASKAppSettingsViewController; +@class IASKSpecifier; + +@class IASKSwitch; +@class IASKPSToggleSwitchSpecifierViewCell; + +@protocol IASKSettingsDelegate +- (void)settingsViewControllerDidEnd:(IASKAppSettingsViewController*)sender; +@optional +- (CGFloat)tableView:(UITableView *)tableView heightForHeaderForKey:(NSString*)key; +- (UIView *)tableView:(UITableView *)tableView viewForHeaderForKey:(NSString*)key; + +- (CGFloat)tableView:(UITableView*)tableView heightForSpecifier:(IASKSpecifier*)specifier; +- (UITableViewCell*)tableView:(UITableView*)tableView cellForSpecifier:(IASKSpecifier*)specifier; + +- (NSString*)mailComposeBody; +//- (UIViewController*)viewControllerForMailComposeView; //@iaskmail +//- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error; + +- (void)settingsViewController:(IASKAppSettingsViewController*)sender buttonTappedForKey:(NSString*)key; +@end + +@interface IASKAppSettingsViewController : UITableViewController { + id _delegate; + + NSMutableArray *_viewList; + NSIndexPath *_currentIndexPath; + + IASKSettingsReader *_settingsReader; + id _settingsStore; + NSString *_file; + + id _currentFirstResponder; + + BOOL _showCreditsFooter; + BOOL _showDoneButton; + + NSMutableDictionary* _cells; +} + +@property (nonatomic, assign) IBOutlet id delegate; +@property (nonatomic, retain) IASKSettingsReader *settingsReader; +@property (nonatomic, retain) id settingsStore; +@property (nonatomic, copy) NSString *file; +@property (nonatomic, assign) BOOL showCreditsFooter; +@property (nonatomic, assign) BOOL showDoneButton; + +- (void)synchronizeSettings; +- (IBAction)dismiss:(id)sender; + +- (IASKSwitch*) getSwitch:(NSString*) key; +- (IASKPSToggleSwitchSpecifierViewCell*) getSwitchView:(NSString*) key; +- (void)setEnabled:(BOOL)status forKey:(NSString*)key; + +- (void)toggledValue:(id)sender; + +@end diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m new file mode 100644 index 0000000..71327ac --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m @@ -0,0 +1,850 @@ +// +// IASKAppSettingsViewController.m +// http://www.inappsettingskit.com +// +// Copyright (c) 2009-2010: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + + +#import "IASKAppSettingsViewController.h" +#import "IASKSettingsReader.h" +#import "IASKSettingsStoreUserDefaults.h" +#import "IASKPSToggleSwitchSpecifierViewCell.h" +#import "IASKPSSliderSpecifierViewCell.h" +#import "IASKPSTextFieldSpecifierViewCell.h" +#import "IASKPSTitleValueSpecifierViewCell.h" +#import "IASKSwitch.h" +#import "IASKSlider.h" +#import "IASKSpecifier.h" +#import "IASKSpecifierValuesViewController.h" +#import "IASKTextField.h" + +static const CGFloat KEYBOARD_ANIMATION_DURATION = 0.3; +static const CGFloat MINIMUM_SCROLL_FRACTION = 0.2; +static const CGFloat MAXIMUM_SCROLL_FRACTION = 0.8; + +static NSString *kIASKCredits = @"Powered by InAppSettingsKit"; // Leave this as-is!!! + +#define kIASKSpecifierValuesViewControllerIndex 0 +#define kIASKSpecifierChildViewControllerIndex 1 + +#define kIASKCreditsViewWidth 285 + +CGRect IASKCGRectSwap(CGRect rect); + +@interface IASKAppSettingsViewController () +@property (nonatomic, retain) NSMutableArray *viewList; +@property (nonatomic, retain) NSIndexPath *currentIndexPath; +@property (nonatomic, retain) id currentFirstResponder; + +- (void)_textChanged:(id)sender; +- (void)synchronizeSettings; +- (void)reload; +@end + +@implementation IASKAppSettingsViewController + +@synthesize delegate = _delegate; +@synthesize viewList = _viewList; +@synthesize currentIndexPath = _currentIndexPath; +@synthesize settingsReader = _settingsReader; +@synthesize file = _file; +@synthesize currentFirstResponder = _currentFirstResponder; +@synthesize showCreditsFooter = _showCreditsFooter; +@synthesize showDoneButton = _showDoneButton; +@synthesize settingsStore = _settingsStore; + +#pragma mark accessors +- (IASKSettingsReader*)settingsReader { + if (!_settingsReader) { + _settingsReader = [[IASKSettingsReader alloc] initWithFile:self.file]; + } + return _settingsReader; +} + +- (id)settingsStore { + if (!_settingsStore) { + _settingsStore = [[IASKSettingsStoreUserDefaults alloc] init]; + } + return _settingsStore; +} + +- (NSString*)file { + if (!_file) { + return @"Root"; + } + return [[_file retain] autorelease]; +} + +- (void)setFile:(NSString *)file { + if (file != _file) { + + [_file release]; + _file = [file copy]; + } + + self.tableView.contentOffset = CGPointMake(0, 0); + self.settingsReader = nil; // automatically initializes itself +} + +- (BOOL)isPad { + BOOL isPad = NO; +#if (__IPHONE_OS_VERSION_MAX_ALLOWED >= 30200) + isPad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad; +#endif + return isPad; +} + +#pragma mark standard view controller methods +- (id)init { + return [self initWithNibName:@"IASKAppSettingsView" bundle:nil]; +} + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { + if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) { + // If set to YES, will display credits for InAppSettingsKit creators + _showCreditsFooter = YES; + + // If set to YES, will add a DONE button at the right of the navigation bar + _showDoneButton = YES; + + _cells = [[NSMutableDictionary alloc] init]; + + if ([self isPad]) { + self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLineEtched; + } + } + return self; +} + +- (void)awakeFromNib { + // If set to YES, will display credits for InAppSettingsKit creators + _showCreditsFooter = YES; + + // If set to YES, will add a DONE button at the right of the navigation bar + // if loaded via NIB, it's likely we sit in a TabBar- or NavigationController + // and thus don't need the Done button + _showDoneButton = NO; + + if ([self isPad]) { + self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLineEtched; + } +} + +- (NSMutableArray *)viewList { + if (!_viewList) { + _viewList = [[NSMutableArray alloc] init]; + [_viewList addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"IASKSpecifierValuesView", @"ViewName",nil]]; + [_viewList addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"IASKAppSettingsView", @"ViewName",nil]]; + } + return _viewList; +} + +- (void)viewDidUnload { + // Release any retained subviews of the main view. + // e.g. self.myOutlet = nil; + self.view = nil; + self.viewList = nil; +} + +- (void)viewWillAppear:(BOOL)animated { + [self.tableView reloadData]; + + self.navigationItem.rightBarButtonItem = nil; + self.navigationController.delegate = self; + if (_showDoneButton) { + UIBarButtonItem *buttonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone + target:self + action:@selector(dismiss:)]; + self.navigationItem.rightBarButtonItem = buttonItem; + [buttonItem release]; + } + if (!self.title) { + self.title = NSLocalizedString(@"Settings", @""); + } + + if (self.currentIndexPath) { + if (animated) { + // animate deselection of previously selected row + [self.tableView selectRowAtIndexPath:self.currentIndexPath animated:NO scrollPosition:UITableViewScrollPositionNone]; + [self.tableView deselectRowAtIndexPath:self.currentIndexPath animated:YES]; + } + self.currentIndexPath = nil; + } + + [super viewWillAppear:animated]; +} + +- (CGSize)contentSizeForViewInPopover { + return [[self view] sizeThatFits:CGSizeMake(320, 2000)]; +} + +- (void)viewDidAppear:(BOOL)animated { + [super viewDidAppear:animated]; + + NSNotificationCenter *dc = [NSNotificationCenter defaultCenter]; + IASK_IF_IOS4_OR_GREATER([dc addObserver:self selector:@selector(synchronizeSettings) name:UIApplicationDidEnterBackgroundNotification object:[UIApplication sharedApplication]];); + IASK_IF_IOS4_OR_GREATER([dc addObserver:self selector:@selector(reload) name:UIApplicationWillEnterForegroundNotification object:[UIApplication sharedApplication]];); + [dc addObserver:self selector:@selector(synchronizeSettings) name:UIApplicationWillTerminateNotification object:[UIApplication sharedApplication]]; + + //NSLog(@"I have loaded shitzlets now!\n"); + + for( NSString *key in _cells ) + { + id value = [_cells objectForKey:key]; + if ([value respondsToSelector:@selector(toggle)]) { + //NSLog(@"Responds to Toggle: %@!\n", key); + [self toggledValue:[value toggle]]; + //[value toggle].on = [value toggle].on; + } + // do something + } +} + +- (void)viewWillDisappear:(BOOL)animated { + [NSObject cancelPreviousPerformRequestsWithTarget:self]; + [super viewWillDisappear:animated]; +} + +- (void)viewDidDisappear:(BOOL)animated { + [[NSNotificationCenter defaultCenter] removeObserver:self]; + + if (!self.navigationController.delegate) { + // hide the keyboard when we're popping from the navigation controller + [self.currentFirstResponder resignFirstResponder]; + } + + [super viewDidDisappear:animated]; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + return YES; +} + +- (void)didReceiveMemoryWarning { + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Release any cached data, images, etc that aren't in use. +} + +- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { + if (![viewController isKindOfClass:[IASKAppSettingsViewController class]] && ![viewController isKindOfClass:[IASKSpecifierValuesViewController class]]) { + [self dismiss:nil]; + } +} + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; + + [_viewList release], _viewList = nil; + [_currentIndexPath release], _currentIndexPath = nil; + [_file release], _file = nil; + [_currentFirstResponder release], _currentFirstResponder = nil; + [_settingsReader release], _settingsReader = nil; + [_settingsStore release], _settingsStore = nil; + [_cells release]; _cells = nil; + + _delegate = nil; + + [super dealloc]; +} + + +#pragma mark - +#pragma mark Actions + +- (IBAction)dismiss:(id)sender { + [self.settingsStore synchronize]; + self.navigationController.delegate = nil; + + if (self.delegate && [self.delegate conformsToProtocol:@protocol(IASKSettingsDelegate)]) { + [self.delegate settingsViewControllerDidEnd:self]; + } +} + +- (void)toggledValue:(id)sender { + IASKSwitch *toggle = (IASKSwitch*)sender; + IASKSpecifier *spec = [_settingsReader specifierForKey:[toggle key]]; + + if ([toggle isOn]) { + if ([spec trueValue] != nil) { + [self.settingsStore setObject:[spec trueValue] forKey:[toggle key]]; + } + else { + [self.settingsStore setBool:YES forKey:[toggle key]]; + } + } + else { + if ([spec falseValue] != nil) { + [self.settingsStore setObject:[spec falseValue] forKey:[toggle key]]; + } + else { + [self.settingsStore setBool:NO forKey:[toggle key]]; + } + } + //NSLog(@"Toggled: %@\n", [toggle key]); + [[NSNotificationCenter defaultCenter] postNotificationName:kIASKAppSettingChanged + object:[toggle key] + userInfo:[NSDictionary dictionaryWithObject:[self.settingsStore objectForKey:[toggle key]] + forKey:[toggle key]]]; +} + +- (void)sliderChangedValue:(id)sender { + IASKSlider *slider = (IASKSlider*)sender; + [self.settingsStore setFloat:[slider value] forKey:[slider key]]; + [[NSNotificationCenter defaultCenter] postNotificationName:kIASKAppSettingChanged + object:[slider key] + userInfo:[NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:[slider value]] + forKey:[slider key]]]; +} + + +#pragma mark - +#pragma mark UITableView Functions + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + return [self.settingsReader numberOfSections]; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return [self.settingsReader numberOfRowsForSection:section]; +} + +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { + IASKSpecifier *specifier = [self.settingsReader specifierForIndexPath:indexPath]; + if ([[specifier type] isEqualToString:kIASKCustomViewSpecifier]) { + if ([self.delegate respondsToSelector:@selector(tableView:heightForSpecifier:)]) { + return [self.delegate tableView:tableView heightForSpecifier:specifier]; + } else { + return 0; + } + } + return tableView.rowHeight; +} + +- (NSString *)tableView:(UITableView*)tableView titleForHeaderInSection:(NSInteger)section { + NSString *header = [self.settingsReader titleForSection:section]; + if (0 == header.length) { + return nil; + } + return header; +} + +- (UIView *)tableView:(UITableView*)tableView viewForHeaderInSection:(NSInteger)section { + NSString *key = [self.settingsReader keyForSection:section]; + if ([self.delegate respondsToSelector:@selector(tableView:viewForHeaderForKey:)]) { + return [self.delegate tableView:tableView viewForHeaderForKey:key]; + } else { + return nil; + } +} + +- (CGFloat)tableView:(UITableView*)tableView heightForHeaderInSection:(NSInteger)section { + NSString *key = [self.settingsReader keyForSection:section]; + if ([self tableView:tableView viewForHeaderInSection:section] && [self.delegate respondsToSelector:@selector(tableView:heightForHeaderForKey:)]) { + CGFloat result; + if ((result = [self.delegate tableView:tableView heightForHeaderForKey:key])) { + return result; + } + + } + NSString *title; + if ((title = [self tableView:tableView titleForHeaderInSection:section])) { + CGSize size = [title sizeWithFont:[UIFont boldSystemFontOfSize:[UIFont labelFontSize]] + constrainedToSize:CGSizeMake(tableView.frame.size.width - 2*kIASKHorizontalPaddingGroupTitles, INFINITY) + lineBreakMode:UILineBreakModeWordWrap]; + return size.height+kIASKVerticalPaddingGroupTitles; + } + return 0; +} + +- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section +{ + NSString *footerText = [self.settingsReader footerTextForSection:section]; + if (_showCreditsFooter && (section == [self.settingsReader numberOfSections]-1)) { + // show credits since this is the last section + if ((footerText == nil) || ([footerText length] == 0)) { + // show the credits on their own + return kIASKCredits; + } else { + // show the credits below the app's FooterText + return [NSString stringWithFormat:@"%@\n\n%@", footerText, kIASKCredits]; + } + } else { + if ([footerText length] == 0) { + return nil; + } + return [self.settingsReader footerTextForSection:section]; + } +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + //NSLog(@"CELL FOR ROW: %@\n", indexPath); + IASKSpecifier *specifier = [self.settingsReader specifierForIndexPath:indexPath]; + NSString *key = [specifier key]; + + if ([[specifier type] isEqualToString:kIASKCustomViewSpecifier] && [self.delegate respondsToSelector:@selector(tableView:cellForSpecifier:)]) { + return [self.delegate tableView:tableView cellForSpecifier:specifier]; + } + + //NSString *reuseId = [specifier key]; + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil]; + + if ([[specifier type] isEqualToString:kIASKPSToggleSwitchSpecifier]) { + if (!cell) { + cell = (IASKPSToggleSwitchSpecifierViewCell*) [[[NSBundle mainBundle] loadNibNamed:@"IASKPSToggleSwitchSpecifierViewCell" + owner:self + options:nil] objectAtIndex:0]; + } + ((IASKPSToggleSwitchSpecifierViewCell*)cell).label.text = [specifier title]; + + id currentValue = [self.settingsStore objectForKey:key]; + BOOL toggleState; + if (currentValue) { + if ([currentValue isEqual:[specifier trueValue]]) { + toggleState = YES; + } else if ([currentValue isEqual:[specifier falseValue]]) { + toggleState = NO; + } else { + toggleState = [currentValue boolValue]; + } + } else { + toggleState = [specifier defaultBoolValue]; + } + + ((IASKPSToggleSwitchSpecifierViewCell*)cell).toggle.on = toggleState; + [((IASKPSToggleSwitchSpecifierViewCell*)cell).toggle addTarget:self action:@selector(toggledValue:) forControlEvents:UIControlEventValueChanged]; + [((IASKPSToggleSwitchSpecifierViewCell*)cell).toggle setKey:key]; +// [((IASKPSToggleSwitchSpecifierViewCell*)cell).toggle + [_cells setObject:cell forKey:key]; + + //NSLog(@"Setting cell: %@ : %p == %p?\n", key, cell, [_cells objectForKey:key]); + //[((IASKPSToggleSwitchSpecifierViewCell*)cell).toggle setEnabled:NO]; // @iaskattn + return cell; + } + else if ([[specifier type] isEqualToString:kIASKPSMultiValueSpecifier]) { + if (!cell) { + cell = [[[IASKPSTitleValueSpecifierViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:[specifier type]] autorelease]; + cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; + cell.backgroundColor = [UIColor whiteColor]; + } + [[cell textLabel] setText:[specifier title]]; + [[cell detailTextLabel] setText:[[specifier titleForCurrentValue:[self.settingsStore objectForKey:key] != nil ? + [self.settingsStore objectForKey:key] : [specifier defaultValue]] description]]; + [_cells setValue:cell forKey:key]; + return cell; + } + else if ([[specifier type] isEqualToString:kIASKPSTitleValueSpecifier]) { + if (!cell) { + cell = [[[IASKPSTitleValueSpecifierViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:[specifier type]] autorelease]; + cell.accessoryType = UITableViewCellAccessoryNone; + cell.backgroundColor = [UIColor whiteColor]; + } + + cell.textLabel.text = [specifier title]; + id value = [self.settingsStore objectForKey:key] ? : [specifier defaultValue]; + + NSString *stringValue; + if ([specifier multipleValues] || [specifier multipleTitles]) { + stringValue = [specifier titleForCurrentValue:value]; + } else { + stringValue = [value description]; + } + + cell.detailTextLabel.text = stringValue; + [cell setUserInteractionEnabled:NO]; + + [_cells setValue:cell forKey:key]; + return cell; + } + else if ([[specifier type] isEqualToString:kIASKPSTextFieldSpecifier]) { + if (!cell) { + cell = (IASKPSTextFieldSpecifierViewCell*) [[[NSBundle mainBundle] loadNibNamed:@"IASKPSTextFieldSpecifierViewCell" + owner:self + options:nil] objectAtIndex:0]; + + ((IASKPSTextFieldSpecifierViewCell*)cell).textField.textAlignment = UITextAlignmentLeft; + ((IASKPSTextFieldSpecifierViewCell*)cell).textField.returnKeyType = UIReturnKeyDone; + ((IASKPSTextFieldSpecifierViewCell*)cell)->stringIfEmpty = [specifier stringIfEmpty]; + cell.accessoryType = UITableViewCellAccessoryNone; + } + + ((IASKPSTextFieldSpecifierViewCell*)cell).label.text = [specifier title]; + + NSString *textValue = [self.settingsStore objectForKey:key] != nil ? [self.settingsStore objectForKey:key] : [specifier defaultStringValue]; + if (textValue && ![textValue isMemberOfClass:[NSString class]]) { + textValue = [NSString stringWithFormat:@"%@", textValue]; + } + IASKTextField *textField = ((IASKPSTextFieldSpecifierViewCell*)cell).textField; + textField. text = textValue; + textField.key = key; + textField.delegate = self; + textField.secureTextEntry = [specifier isSecure]; + textField.keyboardType = [specifier keyboardType]; + textField.autocapitalizationType = [specifier autocapitalizationType]; + [textField addTarget:self action:@selector(_textChanged:) forControlEvents:UIControlEventEditingChanged]; + if([specifier isSecure]){ + textField.autocorrectionType = UITextAutocorrectionTypeNo; + } else { + textField.autocorrectionType = [specifier autoCorrectionType]; + } + [cell setNeedsLayout]; + [_cells setValue:cell forKey:key]; + return cell; + } + else if ([[specifier type] isEqualToString:kIASKPSSliderSpecifier]) { + if (!cell) { + cell = (IASKPSSliderSpecifierViewCell*) [[[NSBundle mainBundle] loadNibNamed:@"IASKPSSliderSpecifierViewCell" + owner:self + options:nil] objectAtIndex:0]; + [(IASKPSSliderSpecifierViewCell*)cell initDefaults]; + } + if ([specifier hasSpecified:kIASKTextOffsetPixels]) { + ((IASKPSSliderSpecifierViewCell*)cell)->textOffsetPixels = [specifier textOffsetPixels]; + } + if ([[specifier minimumValueImage] length] > 0) { + ((IASKPSSliderSpecifierViewCell*)cell).minImage.image = [UIImage imageWithContentsOfFile:[_settingsReader pathForImageNamed:[specifier minimumValueImage]]]; + } + + if ([[specifier maximumValueImage] length] > 0) { + ((IASKPSSliderSpecifierViewCell*)cell).maxImage.image = [UIImage imageWithContentsOfFile:[_settingsReader pathForImageNamed:[specifier minimumValueImage]]]; + } + if ([[specifier title] length] > 0) { + ((IASKPSSliderSpecifierViewCell*)cell).label.text = [specifier title]; + } + + IASKSlider *slider = ((IASKPSSliderSpecifierViewCell*)cell).slider; + slider.minimumValue = [specifier minimumValue]; + slider.maximumValue = [specifier maximumValue]; + slider.value = [self.settingsStore objectForKey:key] != nil ? [[self.settingsStore objectForKey:key] floatValue] : [[specifier defaultValue] floatValue]; + [slider addTarget:self action:@selector(sliderChangedValue:) forControlEvents:UIControlEventValueChanged]; + slider.key = key; + [cell setNeedsLayout]; + [_cells setValue:cell forKey:key]; + return cell; + } + else if ([[specifier type] isEqualToString:kIASKPSChildPaneSpecifier]) { + if (!cell) { + cell = [[[IASKPSTitleValueSpecifierViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:[specifier type]] autorelease]; + [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator]; + cell.backgroundColor = [UIColor whiteColor]; + } + + [[cell textLabel] setText:[specifier title]]; + [_cells setValue:cell forKey:key]; + return cell; + } else if ([[specifier type] isEqualToString:kIASKOpenURLSpecifier]) { + if (!cell) { + cell = [[[IASKPSTitleValueSpecifierViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:[specifier type]] autorelease]; + [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator]; + cell.backgroundColor = [UIColor whiteColor]; + } + + cell.textLabel.text = [specifier title]; + cell.detailTextLabel.text = [[specifier defaultValue] description]; + [_cells setValue:cell forKey:key]; + return cell; + } else if ([[specifier type] isEqualToString:kIASKButtonSpecifier]) { + if (!cell) { + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[specifier type]] autorelease]; + cell.backgroundColor = [UIColor whiteColor]; + } + cell.textLabel.text = [specifier title]; + cell.textLabel.textAlignment = UITextAlignmentCenter; + [_cells setValue:cell forKey:key]; + return cell; + } else if ([[specifier type] isEqualToString:kIASKMailComposeSpecifier]) { + if (!cell) { + cell = [[[IASKPSTitleValueSpecifierViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:[specifier type]] autorelease]; + [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator]; + cell.backgroundColor = [UIColor whiteColor]; + } + + cell.textLabel.text = [specifier title]; + cell.detailTextLabel.text = [[specifier defaultValue] description]; + [_cells setValue:cell forKey:key]; + return cell; + } else { + if (!cell) { + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[specifier type]] autorelease]; + cell.backgroundColor = [UIColor whiteColor]; + } + [[cell textLabel] setText:[specifier title]]; + [_cells setValue:cell forKey:key]; + return cell; + } +} + +- (IASKSwitch*) getSwitch:(NSString*) key { + return [[_cells objectForKey:key] toggle]; +} + +- (IASKPSToggleSwitchSpecifierViewCell*) getSwitchView:(NSString*) key { + return [_cells objectForKey:key]; +} + +- (void)setEnabled:(BOOL)status forKey:(NSString*)key { + id value = [_cells objectForKey:key]; + + //NSLog(@"key: %@, value: %p\n (toggle: %p)\n", key, value, [value toggle]); + + if (value == nil) return; + + [[value label] setEnabled:status]; + + // This is lazy town! Try to handle it as a toggle, slider or textfield + if ([value respondsToSelector:@selector(toggle)]) [[value toggle] setEnabled:status]; + if ([value respondsToSelector:@selector(slider)]) [[value slider] setEnabled:status]; + if ([value respondsToSelector:@selector(textField)])[[value textField] setEnabled:status]; +} + +- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { + IASKSpecifier *specifier = [self.settingsReader specifierForIndexPath:indexPath]; + + if ([[specifier type] isEqualToString:kIASKPSToggleSwitchSpecifier]) { + return nil; + } else { + return indexPath; + } +} + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + IASKSpecifier *specifier = [self.settingsReader specifierForIndexPath:indexPath]; + + if ([[specifier type] isEqualToString:kIASKPSToggleSwitchSpecifier]) { + [tableView deselectRowAtIndexPath:indexPath animated:NO]; + } + else if ([[specifier type] isEqualToString:kIASKPSMultiValueSpecifier]) { + IASKSpecifierValuesViewController *targetViewController = [[self.viewList objectAtIndex:kIASKSpecifierValuesViewControllerIndex] objectForKey:@"viewController"]; + + if (targetViewController == nil) { + // the view controller has not been created yet, create it and set it to our viewList array + // create a new dictionary with the new view controller + NSMutableDictionary *newItemDict = [NSMutableDictionary dictionaryWithCapacity:3]; + [newItemDict addEntriesFromDictionary: [self.viewList objectAtIndex:kIASKSpecifierValuesViewControllerIndex]]; // copy the title and explain strings + + targetViewController = [[IASKSpecifierValuesViewController alloc] initWithNibName:@"IASKSpecifierValuesView" bundle:nil]; + // add the new view controller to the dictionary and then to the 'viewList' array + [newItemDict setObject:targetViewController forKey:@"viewController"]; + [self.viewList replaceObjectAtIndex:kIASKSpecifierValuesViewControllerIndex withObject:newItemDict]; + [targetViewController release]; + + // load the view controll back in to push it + targetViewController = [[self.viewList objectAtIndex:kIASKSpecifierValuesViewControllerIndex] objectForKey:@"viewController"]; + } + self.currentIndexPath = indexPath; + [targetViewController setCurrentSpecifier:specifier]; + targetViewController.settingsReader = self.settingsReader; + targetViewController.settingsStore = self.settingsStore; + [[self navigationController] pushViewController:targetViewController animated:YES]; + } + else if ([[specifier type] isEqualToString:kIASKPSSliderSpecifier]) { + [tableView deselectRowAtIndexPath:indexPath animated:NO]; + } + else if ([[specifier type] isEqualToString:kIASKPSTextFieldSpecifier]) { + IASKPSTextFieldSpecifierViewCell *textFieldCell = (id)[tableView cellForRowAtIndexPath:indexPath]; + [textFieldCell.textField becomeFirstResponder]; + } + else if ([[specifier type] isEqualToString:kIASKPSChildPaneSpecifier]) { + + + Class vcClass = [specifier viewControllerClass]; + if (vcClass) { + SEL initSelector = [specifier viewControllerSelector]; + if (!initSelector) { + initSelector = @selector(init); + } + UIViewController * vc = [vcClass performSelector:@selector(alloc)]; + [vc performSelector:initSelector withObject:[specifier file] withObject:[specifier key]]; + if ([vc respondsToSelector:@selector(setDelegate:)]) { + [vc performSelector:@selector(setDelegate:) withObject:self.delegate]; + } + if ([vc respondsToSelector:@selector(setSettingsStore:)]) { + [vc performSelector:@selector(setSettingsStore:) withObject:self.settingsStore]; + } + self.navigationController.delegate = nil; + [self.navigationController pushViewController:vc animated:YES]; + [vc performSelector:@selector(release)]; + return; + } + + if (nil == [specifier file]) { + [tableView deselectRowAtIndexPath:indexPath animated:YES]; + return; + } + + IASKAppSettingsViewController *targetViewController = [[self.viewList objectAtIndex:kIASKSpecifierChildViewControllerIndex] objectForKey:@"viewController"]; + + if (targetViewController == nil) { + // the view controller has not been created yet, create it and set it to our viewList array + // create a new dictionary with the new view controller + NSMutableDictionary *newItemDict = [NSMutableDictionary dictionaryWithCapacity:3]; + [newItemDict addEntriesFromDictionary: [self.viewList objectAtIndex:kIASKSpecifierChildViewControllerIndex]]; // copy the title and explain strings + + targetViewController = [[[self class] alloc] initWithNibName:@"IASKAppSettingsView" bundle:nil]; + targetViewController.showDoneButton = NO; + targetViewController.settingsStore = self.settingsStore; + targetViewController.delegate = self.delegate; + + // add the new view controller to the dictionary and then to the 'viewList' array + [newItemDict setObject:targetViewController forKey:@"viewController"]; + [self.viewList replaceObjectAtIndex:kIASKSpecifierChildViewControllerIndex withObject:newItemDict]; + [targetViewController release]; + + // load the view controll back in to push it + targetViewController = [[self.viewList objectAtIndex:kIASKSpecifierChildViewControllerIndex] objectForKey:@"viewController"]; + } + self.currentIndexPath = indexPath; + targetViewController.file = specifier.file; + targetViewController.title = specifier.title; + targetViewController.showCreditsFooter = NO; + [[self navigationController] pushViewController:targetViewController animated:YES]; + } else if ([[specifier type] isEqualToString:kIASKOpenURLSpecifier]) { + [tableView deselectRowAtIndexPath:indexPath animated:YES]; + [[UIApplication sharedApplication] openURL:[NSURL URLWithString:specifier.file]]; + } else if ([[specifier type] isEqualToString:kIASKButtonSpecifier]) { + [tableView deselectRowAtIndexPath:indexPath animated:YES]; + if ([self.delegate respondsToSelector:@selector(settingsViewController:buttonTappedForKey:)]) { + [self.delegate settingsViewController:self buttonTappedForKey:[specifier key]]; + } else { + // legacy code, provided for backward compatibility + // the delegate mechanism above is much cleaner and doesn't leak + Class buttonClass = [specifier buttonClass]; + SEL buttonAction = [specifier buttonAction]; + if ([buttonClass respondsToSelector:buttonAction]) { + [buttonClass performSelector:buttonAction withObject:self withObject:[specifier key]]; + NSLog(@"InAppSettingsKit Warning: Using IASKButtonSpecifier without implementing the delegate method is deprecated"); + } + } + } /*else if ([[specifier type] isEqualToString:kIASKMailComposeSpecifier]) { //@iaskmail + [tableView deselectRowAtIndexPath:indexPath animated:YES]; + if ([MFMailComposeViewController canSendMail]) { + MFMailComposeViewController *mailViewController = [[MFMailComposeViewController alloc] init]; + mailViewController.navigationBar.barStyle = self.navigationController.navigationBar.barStyle; + mailViewController.navigationBar.tintColor = self.navigationController.navigationBar.tintColor; + + if ([specifier localizedObjectForKey:kIASKMailComposeSubject]) { + [mailViewController setSubject:[specifier localizedObjectForKey:kIASKMailComposeSubject]]; + } + if ([[specifier specifierDict] objectForKey:kIASKMailComposeToRecipents]) { + [mailViewController setToRecipients:[[specifier specifierDict] objectForKey:kIASKMailComposeToRecipents]]; + } + if ([[specifier specifierDict] objectForKey:kIASKMailComposeCcRecipents]) { + [mailViewController setCcRecipients:[[specifier specifierDict] objectForKey:kIASKMailComposeCcRecipents]]; + } + if ([[specifier specifierDict] objectForKey:kIASKMailComposeBccRecipents]) { + [mailViewController setBccRecipients:[[specifier specifierDict] objectForKey:kIASKMailComposeBccRecipents]]; + } + if ([specifier localizedObjectForKey:kIASKMailComposeBody]) { + BOOL isHTML = NO; + if ([[specifier specifierDict] objectForKey:kIASKMailComposeBodyIsHTML]) { + isHTML = [[[specifier specifierDict] objectForKey:kIASKMailComposeBodyIsHTML] boolValue]; + } + + if ([self.delegate respondsToSelector:@selector(mailComposeBody)]) { + [mailViewController setMessageBody:[self.delegate mailComposeBody] isHTML:isHTML]; + } + else { + [mailViewController setMessageBody:[specifier localizedObjectForKey:kIASKMailComposeBody] isHTML:isHTML]; + } + } + + UIViewController *vc = nil; + + if ([self.delegate respondsToSelector:@selector(viewControllerForMailComposeView)]) { + vc = [self.delegate viewControllerForMailComposeView]; + } + + if (vc == nil) { + vc = self; + } + + mailViewController.mailComposeDelegate = vc; + [vc presentModalViewController:mailViewController animated:YES]; + [mailViewController release]; + }else { + UIAlertView *alert = [[UIAlertView alloc] + initWithTitle:NSLocalizedString(@"Mail not configured", @"InAppSettingsKit") + message:NSLocalizedString(@"This device is not configured for sending Email. Please configure the Mail settings in the Settings app.", @"InAppSettingsKit") + delegate: nil + cancelButtonTitle:NSLocalizedString(@"OK", @"InAppSettingsKit") + otherButtonTitles:nil]; + [alert show]; + [alert release]; + } + + } */ else { + [tableView deselectRowAtIndexPath:indexPath animated:NO]; + } +} + + +//#pragma mark - +//#pragma mark MFMailComposeViewControllerDelegate Function +// +//-(void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error { +// +// // Forward the mail compose delegate +// if ([self.delegate respondsToSelector:@selector(mailComposeController: didFinishWithResult: error:)]) { +// [self.delegate mailComposeController:controller didFinishWithResult:result error:error]; +// } +// +// // NOTE: No error handling is done here +// [self dismissModalViewControllerAnimated:YES]; +//} + +#pragma mark - +#pragma mark UITextFieldDelegate Functions + +- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { + self.currentFirstResponder = textField; + return YES; +} + +- (void)_textChanged:(id)sender { + IASKTextField *text = (IASKTextField*)sender; + [_settingsStore setObject:[text text] forKey:[text key]]; + [[NSNotificationCenter defaultCenter] postNotificationName:kIASKAppSettingChanged + object:[text key] + userInfo:[NSDictionary dictionaryWithObject:[text text] + forKey:[text key]]]; +} + +- (BOOL)textFieldShouldReturn:(UITextField *)textField{ + [textField resignFirstResponder]; + self.currentFirstResponder = nil; + return YES; +} + + +#pragma mark Notifications + +- (void)synchronizeSettings { + [_settingsStore synchronize]; +} + +- (void)reload { + // wait 0.5 sec until UI is available after applicationWillEnterForeground + [self.tableView performSelector:@selector(reloadData) withObject:nil afterDelay:0.5]; +} + +#pragma mark CGRect Utility function +CGRect IASKCGRectSwap(CGRect rect) { + CGRect newRect; + newRect.origin.x = rect.origin.y; + newRect.origin.y = rect.origin.x; + newRect.size.width = rect.size.height; + newRect.size.height = rect.size.width; + return newRect; +} +@end diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.h b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.h new file mode 100644 index 0000000..4a37fae --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.h @@ -0,0 +1,30 @@ +// +// IASKAppSettingsWebViewController.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import +#import + +@interface IASKAppSettingsWebViewController : UIViewController { + UIWebView *webView; + NSURL *url; +} + +- (id)initWithFile:(NSString*)htmlFileName key:(NSString*)key; + +@property (nonatomic, retain) IBOutlet UIWebView *webView; +@property (nonatomic, retain) NSURL *url; + +@end diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.m b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.m new file mode 100644 index 0000000..852811e --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.m @@ -0,0 +1,150 @@ +// +// IASKAppSettingsWebViewController.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2010: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import "IASKAppSettingsWebViewController.h" + +@implementation IASKAppSettingsWebViewController + +@synthesize url; +@synthesize webView; + +- (id)initWithFile:(NSString*)urlString key:(NSString*)key { + if (!(self = [super initWithNibName:nil bundle:nil])) { + return nil; + } + + self.url = [NSURL URLWithString:urlString]; + if (!self.url || ![self.url scheme]) { + NSString *path = [[NSBundle mainBundle] pathForResource:[urlString stringByDeletingPathExtension] ofType:[urlString pathExtension]]; + if(path) + self.url = [NSURL fileURLWithPath:path]; + else + self.url = nil; + } + return self; +} + + +- (void)dealloc { + [webView release], webView = nil; + [url release], url = nil; + + [super dealloc]; +} + +- (void)viewWillAppear:(BOOL)animated { + [webView loadRequest:[NSURLRequest requestWithURL:self.url]]; +} + +- (void)viewDidUnload { + [super viewDidUnload]; + self.webView = nil; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + return YES; +} + +- (void)webViewDidFinishLoad:(UIWebView *)webView { + self.navigationItem.title = [self.webView stringByEvaluatingJavaScriptFromString:@"document.title"]; +} + +- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { + NSURL *newURL = [request URL]; + /* @iaskmail + // intercept mailto URL and send it to an in-app Mail compose view instead + if ([[newURL scheme] isEqualToString:@"mailto"]) { + + NSArray *rawURLparts = [[newURL resourceSpecifier] componentsSeparatedByString:@"?"]; + if (rawURLparts.count > 2) { + return NO; // invalid URL + } + + MFMailComposeViewController *mailViewController = [[MFMailComposeViewController alloc] init]; + mailViewController.mailComposeDelegate = self; + + NSMutableArray *toRecipients = [NSMutableArray array]; + NSString *defaultRecipient = [rawURLparts objectAtIndex:0]; + if (defaultRecipient.length) { + [toRecipients addObject:defaultRecipient]; + } + + if (rawURLparts.count == 2) { + NSString *queryString = [rawURLparts objectAtIndex:1]; + + NSArray *params = [queryString componentsSeparatedByString:@"&"]; + for (NSString *param in params) { + NSArray *keyValue = [param componentsSeparatedByString:@"="]; + if (keyValue.count != 2) { + continue; + } + NSString *key = [[keyValue objectAtIndex:0] lowercaseString]; + NSString *value = [keyValue objectAtIndex:1]; + + value = (NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault, + (CFStringRef)value, + CFSTR(""), + kCFStringEncodingUTF8); + [value autorelease]; + + if ([key isEqualToString:@"subject"]) { + [mailViewController setSubject:value]; + } + + if ([key isEqualToString:@"body"]) { + [mailViewController setMessageBody:value isHTML:NO]; + } + + if ([key isEqualToString:@"to"]) { + [toRecipients addObjectsFromArray:[value componentsSeparatedByString:@","]]; + } + + if ([key isEqualToString:@"cc"]) { + NSArray *recipients = [value componentsSeparatedByString:@","]; + [mailViewController setCcRecipients:recipients]; + } + + if ([key isEqualToString:@"bcc"]) { + NSArray *recipients = [value componentsSeparatedByString:@","]; + [mailViewController setBccRecipients:recipients]; + } + } + } + + [mailViewController setToRecipients:toRecipients]; + + [self presentModalViewController:mailViewController animated:YES]; + [mailViewController release]; + return NO; + } + + */ + + // open inline if host is the same, otherwise, pass to the system + if (![newURL host] || [[newURL host] isEqualToString:[self.url host]]) { + return YES; + } + [[UIApplication sharedApplication] openURL:newURL]; + return NO; +} + +//- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error { +// [self dismissModalViewControllerAnimated:YES]; +//} + + + +@end diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.h b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.h new file mode 100644 index 0000000..2df1db6 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.h @@ -0,0 +1,38 @@ +// +// IASKSpecifierValuesViewController.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import +#import "IASKSettingsStore.h" + +@class IASKSpecifier; +@class IASKSettingsReader; + +@interface IASKSpecifierValuesViewController : UIViewController { + UITableView *_tableView; + + IASKSpecifier *_currentSpecifier; + NSIndexPath *_checkedItem; + IASKSettingsReader *_settingsReader; + id _settingsStore; +} + +@property (nonatomic, retain) IBOutlet UITableView *tableView; +@property (nonatomic, retain) NSIndexPath *checkedItem; +@property (nonatomic, retain) IASKSpecifier *currentSpecifier; +@property (nonatomic, retain) IASKSettingsReader *settingsReader; +@property (nonatomic, retain) id settingsStore; + +@end diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.m b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.m new file mode 100644 index 0000000..c56e9ad --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.m @@ -0,0 +1,196 @@ +// +// IASKSpecifierValuesViewController.m +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import "IASKSpecifierValuesViewController.h" +#import "IASKSpecifier.h" +#import "IASKSettingsReader.h" +#import "IASKSettingsStoreUserDefaults.h" + +#define kCellValue @"kCellValue" + +@interface IASKSpecifierValuesViewController() +- (void)userDefaultsDidChange; +@end + +@implementation IASKSpecifierValuesViewController + +@synthesize tableView=_tableView; +@synthesize currentSpecifier=_currentSpecifier; +@synthesize checkedItem=_checkedItem; +@synthesize settingsReader = _settingsReader; +@synthesize settingsStore = _settingsStore; + +- (void) updateCheckedItem { + NSInteger index; + + // Find the currently checked item + if([self.settingsStore objectForKey:[_currentSpecifier key]]) { + index = [[_currentSpecifier multipleValues] indexOfObject:[self.settingsStore objectForKey:[_currentSpecifier key]]]; + } else { + index = [[_currentSpecifier multipleValues] indexOfObject:[_currentSpecifier defaultValue]]; + } + [self setCheckedItem:[NSIndexPath indexPathForRow:index inSection:0]]; +} + +- (id)settingsStore { + if(_settingsStore == nil) { + _settingsStore = [[IASKSettingsStoreUserDefaults alloc] init]; + } + return _settingsStore; +} + +- (void)viewWillAppear:(BOOL)animated { + if (_currentSpecifier) { + [self setTitle:[_currentSpecifier title]]; + [self updateCheckedItem]; + } + + if (_tableView) { + [_tableView reloadData]; + + // Make sure the currently checked item is visible + [_tableView scrollToRowAtIndexPath:[self checkedItem] atScrollPosition:UITableViewScrollPositionMiddle animated:NO]; + } + [super viewWillAppear:animated]; +} + +- (void)viewDidAppear:(BOOL)animated { + [_tableView flashScrollIndicators]; + [super viewDidAppear:animated]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(userDefaultsDidChange) + name:NSUserDefaultsDidChangeNotification + object:[NSUserDefaults standardUserDefaults]]; +} + +- (void)viewDidDisappear:(BOOL)animated { + [[NSNotificationCenter defaultCenter] removeObserver:self name:NSUserDefaultsDidChangeNotification object:nil]; + [super viewDidDisappear:animated]; +} + + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + return YES; +} + +- (void)didReceiveMemoryWarning { + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Release any cached data, images, etc that aren't in use. +} + +- (void)viewDidUnload { + // Release any retained subviews of the main view. + // e.g. self.myOutlet = nil; + self.tableView = nil; +} + + +- (void)dealloc { + [_currentSpecifier release], _currentSpecifier = nil; + [_checkedItem release], _checkedItem = nil; + [_settingsReader release], _settingsReader = nil; + [_settingsStore release], _settingsStore = nil; + [_tableView release], _tableView = nil; + [super dealloc]; +} + + +#pragma mark - +#pragma mark UITableView delegates + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + return 1; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return [_currentSpecifier multipleValuesCount]; +} + +- (void)selectCell:(UITableViewCell *)cell { + [cell setAccessoryType:UITableViewCellAccessoryCheckmark]; + [[cell textLabel] setTextColor:kIASKgrayBlueColor]; +} + +- (void)deselectCell:(UITableViewCell *)cell { + [cell setAccessoryType:UITableViewCellAccessoryNone]; + [[cell textLabel] setTextColor:[UIColor darkTextColor]]; +} + +- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section { + return [_currentSpecifier footerText]; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellValue]; + NSArray *titles = [_currentSpecifier multipleTitles]; + + if (!cell) { + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellValue] autorelease]; + cell.backgroundColor = [UIColor whiteColor]; + } + + if ([indexPath isEqual:[self checkedItem]]) { + [self selectCell:cell]; + } else { + [self deselectCell:cell]; + } + + @try { + [[cell textLabel] setText:[self.settingsReader titleForStringId:[titles objectAtIndex:indexPath.row]]]; + } + @catch (NSException * e) {} + return cell; +} + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + + if (indexPath == [self checkedItem]) { + [tableView deselectRowAtIndexPath:indexPath animated:YES]; + return; + } + + NSArray *values = [_currentSpecifier multipleValues]; + + [tableView deselectRowAtIndexPath:indexPath animated:YES]; + [self deselectCell:[tableView cellForRowAtIndexPath:[self checkedItem]]]; + [self selectCell:[tableView cellForRowAtIndexPath:indexPath]]; + [self setCheckedItem:indexPath]; + + [self.settingsStore setObject:[values objectAtIndex:indexPath.row] forKey:[_currentSpecifier key]]; + [self.settingsStore synchronize]; + [[NSNotificationCenter defaultCenter] postNotificationName:kIASKAppSettingChanged + object:[_currentSpecifier key] + userInfo:[NSDictionary dictionaryWithObject:[values objectAtIndex:indexPath.row] + forKey:[_currentSpecifier key]]]; +} + +#pragma mark Notifications + +- (void)userDefaultsDidChange { + NSIndexPath *oldCheckedItem = self.checkedItem; + if(_currentSpecifier) { + [self updateCheckedItem]; + } + + // only reload the table if it had changed; prevents animation cancellation + if (self.checkedItem != oldCheckedItem) { + [_tableView reloadData]; + } +} + +@end diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Models/IASKSettingsReader.h b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Models/IASKSettingsReader.h new file mode 100644 index 0000000..0f49c01 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Models/IASKSettingsReader.h @@ -0,0 +1,146 @@ +// +// IASKSettingsReader.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import + +#define kIASKPreferenceSpecifiers @"PreferenceSpecifiers" +#define kIASKType @"Type" +#define kIASKTitle @"Title" +#define kIASKFooterText @"FooterText" +#define kIASKKey @"Key" +#define kIASKFile @"File" +#define kIASKDefaultValue @"DefaultValue" +#define kIASKMinimumValue @"MinimumValue" +#define kIASKMaximumValue @"MaximumValue" +#define kIASKTextOffsetPixels @"TextOffsetPixels" +#define kIASKTrueValue @"TrueValue" +#define kIASKFalseValue @"FalseValue" +#define kIASKIsSecure @"IsSecure" +#define KIASKKeyboardType @"KeyboardType" +#define kIASKAutocapitalizationType @"AutocapitalizationType" +#define kIASKAutoCorrectionType @"AutocorrectionType" +#define kIASKValues @"Values" +#define kIASKTitles @"Titles" +#define kIASKViewControllerClass @"IASKViewControllerClass" +#define kIASKViewControllerSelector @"IASKViewControllerSelector" +#define kIASKButtonClass @"IASKButtonClass" +#define kIASKButtonAction @"IASKButtonAction" +#define kIASKMailComposeToRecipents @"IASKMailComposeToRecipents" +#define kIASKMailComposeCcRecipents @"IASKMailComposeCcRecipents" +#define kIASKMailComposeBccRecipents @"IASKMailComposeBccRecipents" +#define kIASKMailComposeSubject @"IASKMailComposeSubject" +#define kIASKMailComposeBody @"IASKMailComposeBody" +#define kIASKMailComposeBodyIsHTML @"IASKMailComposeBodyIsHTML" +#define kIASKKeyboardAlphabet @"Alphabet" +#define kIASKKeyboardASCII @"Ascii" +#define kIASKKeyboardNumbersAndPunctuation @"NumbersAndPunctuation" +#define kIASKKeyboardNumberPad @"NumberPad" +#define kIASKKeyboardDecimalPad @"DecimalPad" + +#define KIASKKeyboardURL @"URL" +#define kIASKKeyboardEmailAddress @"EmailAddress" +#define kIASKAutoCapNone @"None" +#define kIASKAutoCapSentences @"Sentences" +#define kIASKAutoCapWords @"Words" +#define kIASKAutoCapAllCharacters @"AllCharacters" +#define kIASKAutoCorrDefault @"Default" +#define kIASKAutoCorrNo @"No" +#define kIASKAutoCorrYes @"Yes" +#define kIASKMinimumValueImage @"MinimumValueImage" +#define kIASKMaximumValueImage @"MaximumValueImage" +#define kIASKStringIfEmpty @"StringIfEmpty" + +#define kIASKPSGroupSpecifier @"PSGroupSpecifier" +#define kIASKPSToggleSwitchSpecifier @"PSToggleSwitchSpecifier" +#define kIASKPSMultiValueSpecifier @"PSMultiValueSpecifier" +#define kIASKPSSliderSpecifier @"PSSliderSpecifier" +#define kIASKPSTitleValueSpecifier @"PSTitleValueSpecifier" +#define kIASKPSTextFieldSpecifier @"PSTextFieldSpecifier" +#define kIASKPSChildPaneSpecifier @"PSChildPaneSpecifier" +#define kIASKOpenURLSpecifier @"IASKOpenURLSpecifier" +#define kIASKButtonSpecifier @"IASKButtonSpecifier" +#define kIASKMailComposeSpecifier @"IASKMailComposeSpecifier" +#define kIASKCustomViewSpecifier @"IASKCustomViewSpecifier" + +#define kIASKBundleFolder @"Settings.bundle" +#define kIASKBundleFolderAlt @"InAppSettings.bundle" +#define kIASKBundleFilename @"Root.plist" +#define KIASKBundleLocaleFolderExtension @".lproj" + +#define kIASKAppSettingChanged @"kAppSettingChanged" + +#define kIASKSectionHeaderIndex 0 + +#define kIASKSliderNoImagesPadding 11 +#define kIASKSliderImagesPadding 43 + + +#define kIASKTableWidth 320 +#define kIASKSpacing 5 +#define kIASKMinLabelWidth 97 +#define kIASKMinValueWidth 35 +#define kIASKPaddingLeft 9 +#define kIASKPaddingRight 10 +#define kIASKHorizontalPaddingGroupTitles 19 +#define kIASKVerticalPaddingGroupTitles 15 + +#define kIASKLabelFontSize 17 +#define kIASKgrayBlueColor [UIColor colorWithRed:0.318 green:0.4 blue:0.569 alpha:1.0] + +#ifndef kCFCoreFoundationVersionNumber_iPhoneOS_4_0 +#define kCFCoreFoundationVersionNumber_iPhoneOS_4_0 550.32 +#endif + +#ifndef kCFCoreFoundationVersionNumber_iPhoneOS_4_1 +#define kCFCoreFoundationVersionNumber_iPhoneOS_4_1 550.38 +#endif + + +#define IASK_IF_IOS4_OR_GREATER(...) \ +if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iPhoneOS_4_0) \ +{ \ +__VA_ARGS__ \ +} + +@class IASKSpecifier; + +@interface IASKSettingsReader : NSObject { + NSString *_path; + NSString *_localizationTable; + NSString *_bundlePath; + NSDictionary *_settingsBundle; + NSArray *_dataSource; + NSBundle *_bundle; +} + +- (id)initWithFile:(NSString*)file; +- (NSInteger)numberOfSections; +- (NSInteger)numberOfRowsForSection:(NSInteger)section; +- (IASKSpecifier*)specifierForIndexPath:(NSIndexPath*)indexPath; +- (IASKSpecifier*)specifierForKey:(NSString*)key; +- (NSString*)titleForSection:(NSInteger)section; +- (NSString*)keyForSection:(NSInteger)section; +- (NSString*)footerTextForSection:(NSInteger)section; +- (NSString*)titleForStringId:(NSString*)stringId; +- (NSString*)pathForImageNamed:(NSString*)image; + +@property (nonatomic, retain) NSString *path; +@property (nonatomic, retain) NSString *localizationTable; +@property (nonatomic, retain) NSString *bundlePath; +@property (nonatomic, retain) NSDictionary *settingsBundle; +@property (nonatomic, retain) NSArray *dataSource; + +@end diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Models/IASKSettingsReader.m b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Models/IASKSettingsReader.m new file mode 100644 index 0000000..c2967ba --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Models/IASKSettingsReader.m @@ -0,0 +1,259 @@ +// +// IASKSettingsReader.m +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import "IASKSettingsReader.h" +#import "IASKSpecifier.h" + +@interface IASKSettingsReader (private) +- (void)_reinterpretBundle:(NSDictionary*)settingsBundle; +- (BOOL)_sectionHasHeading:(NSInteger)section; +- (NSString *)platformSuffix; +- (NSString *)locateSettingsFile:(NSString *)file; + +@end + +@implementation IASKSettingsReader + +@synthesize path=_path, +localizationTable=_localizationTable, +bundlePath=_bundlePath, +settingsBundle=_settingsBundle, +dataSource=_dataSource; + +- (id)init { + return [self initWithFile:@"Root"]; +} + +- (id)initWithFile:(NSString*)file { + if ((self=[super init])) { + + + self.path = [self locateSettingsFile: file]; + [self setSettingsBundle:[NSDictionary dictionaryWithContentsOfFile:self.path]]; + self.bundlePath = [self.path stringByDeletingLastPathComponent]; + _bundle = [[NSBundle bundleWithPath:[self bundlePath]] retain]; + + // Look for localization file + self.localizationTable = [self.settingsBundle objectForKey:@"StringsTable"]; + NSLog(@"Loc table: %@. bundle: %@ (%p)\n", self.localizationTable, _bundlePath, _bundle); + if (!self.localizationTable) + { + // Look for localization file using filename + self.localizationTable = [[[[self.path stringByDeletingPathExtension] // removes '.plist' + stringByDeletingPathExtension] // removes potential '.inApp' + lastPathComponent] // strip absolute path + stringByReplacingOccurrencesOfString:[self platformSuffix] withString:@""]; // removes potential '~device' (~ipad, ~iphone) + NSLog(@"Settings string filename: %@\n", self.localizationTable); + if([_bundle pathForResource:self.localizationTable ofType:@"strings"] == nil){ + // Could not find the specified localization: use default + self.localizationTable = @"Root"; + NSLog(@"Couldn't find file though..\n"); + } + } + + if (_settingsBundle) { + [self _reinterpretBundle:_settingsBundle]; + } + } + return self; +} + +- (void)dealloc { + [_path release], _path = nil; + [_localizationTable release], _localizationTable = nil; + [_bundlePath release], _bundlePath = nil; + [_settingsBundle release], _settingsBundle = nil; + [_dataSource release], _dataSource = nil; + [_bundle release], _bundle = nil; + + [super dealloc]; +} + +- (void)_reinterpretBundle:(NSDictionary*)settingsBundle { + NSArray *preferenceSpecifiers = [settingsBundle objectForKey:kIASKPreferenceSpecifiers]; + NSInteger sectionCount = -1; + NSMutableArray *dataSource = [[[NSMutableArray alloc] init] autorelease]; + + for (NSDictionary *specifier in preferenceSpecifiers) { + if ([(NSString*)[specifier objectForKey:kIASKType] isEqualToString:kIASKPSGroupSpecifier]) { + NSMutableArray *newArray = [[NSMutableArray alloc] init]; + + [newArray addObject:specifier]; + [dataSource addObject:newArray]; + [newArray release]; + sectionCount++; + } + else { + if (sectionCount == -1) { + NSMutableArray *newArray = [[NSMutableArray alloc] init]; + [dataSource addObject:newArray]; + [newArray release]; + sectionCount++; + } + + IASKSpecifier *newSpecifier = [[IASKSpecifier alloc] initWithSpecifier:specifier]; + [(NSMutableArray*)[dataSource objectAtIndex:sectionCount] addObject:newSpecifier]; + [newSpecifier release]; + } + } + [self setDataSource:dataSource]; +} + +- (BOOL)_sectionHasHeading:(NSInteger)section { + return [[[[self dataSource] objectAtIndex:section] objectAtIndex:0] isKindOfClass:[NSDictionary class]]; +} + +- (NSInteger)numberOfSections { + return [[self dataSource] count]; +} + +- (NSInteger)numberOfRowsForSection:(NSInteger)section { + int headingCorrection = [self _sectionHasHeading:section] ? 1 : 0; + return [(NSArray*)[[self dataSource] objectAtIndex:section] count] - headingCorrection; +} + +- (IASKSpecifier*)specifierForIndexPath:(NSIndexPath*)indexPath { + int headingCorrection = [self _sectionHasHeading:indexPath.section] ? 1 : 0; + + IASKSpecifier *specifier = [[[self dataSource] objectAtIndex:indexPath.section] objectAtIndex:(indexPath.row+headingCorrection)]; + specifier.settingsReader = self; + return specifier; +} + +- (IASKSpecifier*)specifierForKey:(NSString*)key { + for (NSArray *specifiers in _dataSource) { + for (id sp in specifiers) { + if ([sp isKindOfClass:[IASKSpecifier class]]) { + if ([[sp key] isEqualToString:key]) { + return sp; + } + } + } + } + return nil; +} + +- (NSString*)titleForSection:(NSInteger)section { + if ([self _sectionHasHeading:section]) { + NSDictionary *dict = [[[self dataSource] objectAtIndex:section] objectAtIndex:kIASKSectionHeaderIndex]; + return [_bundle localizedStringForKey:[dict objectForKey:kIASKTitle] value:[dict objectForKey:kIASKTitle] table:self.localizationTable]; + } + return nil; +} + +- (NSString*)keyForSection:(NSInteger)section { + if ([self _sectionHasHeading:section]) { + return [[[[self dataSource] objectAtIndex:section] objectAtIndex:kIASKSectionHeaderIndex] objectForKey:kIASKKey]; + } + return nil; +} + +- (NSString*)footerTextForSection:(NSInteger)section { + if ([self _sectionHasHeading:section]) { + NSDictionary *dict = [[[self dataSource] objectAtIndex:section] objectAtIndex:kIASKSectionHeaderIndex]; + return [_bundle localizedStringForKey:[dict objectForKey:kIASKFooterText] value:[dict objectForKey:kIASKFooterText] table:self.localizationTable]; + } + return nil; +} + +- (NSString*)titleForStringId:(NSString*)stringId { + return [_bundle localizedStringForKey:stringId value:stringId table:self.localizationTable]; +} + +- (NSString*)pathForImageNamed:(NSString*)image { + return [[self bundlePath] stringByAppendingPathComponent:image]; +} + +- (NSString *)platformSuffix { + BOOL isPad = NO; +#if (__IPHONE_OS_VERSION_MAX_ALLOWED >= 30200) + isPad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad; +#endif + return isPad ? @"~ipad" : @"~iphone"; +} + +- (NSString *)file:(NSString *)file + withBundle:(NSString *)bundle + suffix:(NSString *)suffix + extension:(NSString *)extension { + + NSString *appBundle = [[NSBundle mainBundle] bundlePath]; + bundle = [appBundle stringByAppendingPathComponent:bundle]; + file = [file stringByAppendingFormat:@"%@%@", suffix, extension]; + return [bundle stringByAppendingPathComponent:file]; + +} + +- (NSString *)locateSettingsFile: (NSString *)file { + + // The file is searched in the following order: + // + // InAppSettings.bundle/FILE~DEVICE.inApp.plist + // InAppSettings.bundle/FILE.inApp.plist + // InAppSettings.bundle/FILE~DEVICE.plist + // InAppSettings.bundle/FILE.plist + // Settings.bundle/FILE~DEVICE.inApp.plist + // Settings.bundle/FILE.inApp.plist + // Settings.bundle/FILE~DEVICE.plist + // Settings.bundle/FILE.plist + // + // where DEVICE is either "iphone" or "ipad" depending on the current + // interface idiom. + // + // Settings.app uses the ~DEVICE suffixes since iOS 4.0. There are some + // differences from this implementation: + // - For an iPhone-only app running on iPad, Settings.app will not use the + // ~iphone suffix. There is no point in using these suffixes outside + // of universal apps anyway. + // - This implementation uses the device suffixes on iOS 3.x as well. + // - also check current locale (short only) + + NSArray *bundles = + [NSArray arrayWithObjects:kIASKBundleFolderAlt, kIASKBundleFolder, nil]; + + NSArray *extensions = + [NSArray arrayWithObjects:@".inApp.plist", @".plist", nil]; + + NSArray *suffixes = + [NSArray arrayWithObjects:[self platformSuffix], @"", nil]; + + NSArray *languages = + [NSArray arrayWithObjects:[[[NSLocale preferredLanguages] objectAtIndex:0] stringByAppendingString:KIASKBundleLocaleFolderExtension], @"", nil]; + + NSString *path = nil; + NSFileManager *fileManager = [NSFileManager defaultManager]; + + for (NSString *bundle in bundles) { + for (NSString *extension in extensions) { + for (NSString *suffix in suffixes) { + for (NSString *language in languages) { + path = [self file:file + withBundle:[bundle stringByAppendingPathComponent:language] + suffix:suffix + extension:extension]; + if ([fileManager fileExistsAtPath:path]) { + goto exitFromNestedLoop; + } + } + } + } + } + +exitFromNestedLoop: + return path; +} + +@end diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Models/IASKSettingsStore.h b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Models/IASKSettingsStore.h new file mode 100644 index 0000000..c1b53ba --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Models/IASKSettingsStore.h @@ -0,0 +1,39 @@ +// +// IASKSettingsStore.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2010: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// Marc-Etienne M.Léveillé, Edovia Inc., http://www.edovia.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import + +@protocol IASKSettingsStore +@required +- (void)setBool:(BOOL)value forKey:(NSString*)key; +- (void)setFloat:(float)value forKey:(NSString*)key; +- (void)setDouble:(double)value forKey:(NSString*)key; +- (void)setInteger:(int)value forKey:(NSString*)key; +- (void)setObject:(id)value forKey:(NSString*)key; +- (BOOL)boolForKey:(NSString*)key; +- (float)floatForKey:(NSString*)key; +- (double)doubleForKey:(NSString*)key; +- (int)integerForKey:(NSString*)key; +- (id)objectForKey:(NSString*)key; +- (BOOL)synchronize; // Write settings to a permanant storage. Returns YES on success, NO otherwise +@end + + +@interface IASKAbstractSettingsStore : NSObject { +} + +@end diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Models/IASKSettingsStore.m b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Models/IASKSettingsStore.m new file mode 100644 index 0000000..8efbe7d --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Models/IASKSettingsStore.m @@ -0,0 +1,68 @@ +// +// IASKSettingsStore.m +// http://www.inappsettingskit.com +// +// Copyright (c) 2010: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// Marc-Etienne M.Léveillé, Edovia Inc., http://www.edovia.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import "IASKSettingsStore.h" + +@implementation IASKAbstractSettingsStore + +- (void)setObject:(id)value forKey:(NSString*)key { + [NSException raise:@"Unimplemented" + format:@"setObject:forKey: must be implemented in subclasses of IASKAbstractSettingsStore"]; +} + +- (id)objectForKey:(NSString*)key { + [NSException raise:@"Unimplemented" + format:@"objectForKey: must be implemented in subclasses of IASKAbstractSettingsStore"]; + return nil; +} + +- (void)setBool:(BOOL)value forKey:(NSString*)key { + [self setObject:[NSNumber numberWithBool:value] forKey:key]; +} + +- (void)setFloat:(float)value forKey:(NSString*)key { + [self setObject:[NSNumber numberWithFloat:value] forKey:key]; +} + +- (void)setInteger:(int)value forKey:(NSString*)key { + [self setObject:[NSNumber numberWithInt:value] forKey:key]; +} + +- (void)setDouble:(double)value forKey:(NSString*)key { + [self setObject:[NSNumber numberWithDouble:value] forKey:key]; +} + +- (BOOL)boolForKey:(NSString*)key { + return [[self objectForKey:key] boolValue]; +} + +- (float)floatForKey:(NSString*)key { + return [[self objectForKey:key] floatValue]; +} +- (int)integerForKey:(NSString*)key { + return [[self objectForKey:key] intValue]; +} + +- (double)doubleForKey:(NSString*)key { + return [[self objectForKey:key] doubleValue]; +} + +- (BOOL)synchronize { + return NO; +} + +@end \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Models/IASKSettingsStoreFile.h b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Models/IASKSettingsStoreFile.h new file mode 100644 index 0000000..6d4fe29 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Models/IASKSettingsStoreFile.h @@ -0,0 +1,28 @@ +// +// IASKSettingsStoreFile.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2010: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// Marc-Etienne M.Léveillé, Edovia Inc., http://www.edovia.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import +#import "IASKSettingsStore.h" + +@interface IASKSettingsStoreFile : IASKAbstractSettingsStore { + NSString * _filePath; + NSMutableDictionary * _dict; +} + +- (id)initWithPath:(NSString*)path; + +@end diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Models/IASKSettingsStoreFile.m b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Models/IASKSettingsStoreFile.m new file mode 100644 index 0000000..104642d --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Models/IASKSettingsStoreFile.m @@ -0,0 +1,54 @@ +// +// IASKSettingsStoreFile.m +// http://www.inappsettingskit.com +// +// Copyright (c) 2010: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// Marc-Etienne M.Léveillé, Edovia Inc., http://www.edovia.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import "IASKSettingsStoreFile.h" + + +@implementation IASKSettingsStoreFile + +- (id)initWithPath:(NSString*)path { + if((self = [super init])) { + _filePath = [path retain]; + _dict = [[NSMutableDictionary alloc] initWithContentsOfFile:path]; + if(_dict == nil) { + _dict = [[NSMutableDictionary alloc] init]; + } + } + return self; +} + +- (void)dealloc { + [_dict release], _dict = nil; + [_filePath release], _filePath = nil; + + [super dealloc]; +} + + +- (void)setObject:(id)value forKey:(NSString *)key { + [_dict setObject:value forKey:key]; +} + +- (id)objectForKey:(NSString *)key { + return [_dict objectForKey:key]; +} + +- (BOOL)synchronize { + return [_dict writeToFile:_filePath atomically:YES]; +} + +@end diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.h b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.h new file mode 100644 index 0000000..3731f5e --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.h @@ -0,0 +1,25 @@ +// +// IASKSettingsStoreUserDefaults.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2010: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// Marc-Etienne M.Léveillé, Edovia Inc., http://www.edovia.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import +#import "IASKSettingsStore.h" + +@interface IASKSettingsStoreUserDefaults : IASKAbstractSettingsStore { + +} + +@end diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.m b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.m new file mode 100644 index 0000000..fd24bf0 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.m @@ -0,0 +1,67 @@ +// +// IASKSettingsStoreUserDefaults.m +// http://www.inappsettingskit.com +// +// Copyright (c) 2010: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// Marc-Etienne M.Léveillé, Edovia Inc., http://www.edovia.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import "IASKSettingsStoreUserDefaults.h" + + +@implementation IASKSettingsStoreUserDefaults + +- (void)setBool:(BOOL)value forKey:(NSString*)key { + [[NSUserDefaults standardUserDefaults] setBool:value forKey:key]; +} + +- (void)setFloat:(float)value forKey:(NSString*)key { + [[NSUserDefaults standardUserDefaults] setFloat:value forKey:key]; +} + +- (void)setDouble:(double)value forKey:(NSString*)key { + [[NSUserDefaults standardUserDefaults] setDouble:value forKey:key]; +} + +- (void)setInteger:(int)value forKey:(NSString*)key { + [[NSUserDefaults standardUserDefaults] setInteger:value forKey:key]; +} + +- (void)setObject:(id)value forKey:(NSString*)key { + [[NSUserDefaults standardUserDefaults] setObject:value forKey:key]; +} + +- (BOOL)boolForKey:(NSString*)key { + return [[NSUserDefaults standardUserDefaults] boolForKey:key]; +} + +- (float)floatForKey:(NSString*)key { + return [[NSUserDefaults standardUserDefaults] floatForKey:key]; +} + +- (double)doubleForKey:(NSString*)key { + return [[NSUserDefaults standardUserDefaults] doubleForKey:key]; +} + +- (int)integerForKey:(NSString*)key { + return [[NSUserDefaults standardUserDefaults] integerForKey:key]; +} + +- (id)objectForKey:(NSString*)key { + return [[NSUserDefaults standardUserDefaults] objectForKey:key]; +} + +- (BOOL)synchronize { + return [[NSUserDefaults standardUserDefaults] synchronize]; +} + +@end diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Models/IASKSpecifier.h b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Models/IASKSpecifier.h new file mode 100644 index 0000000..5a4a9f2 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Models/IASKSpecifier.h @@ -0,0 +1,63 @@ +// +// IASKSpecifier.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import +#import + +@class IASKSettingsReader; + +@interface IASKSpecifier : NSObject { + NSDictionary *_specifierDict; + NSDictionary *_multipleValuesDict; + IASKSettingsReader *_settingsReader; +} +@property (nonatomic, retain) NSDictionary *specifierDict; +@property (nonatomic, assign) IASKSettingsReader *settingsReader; + +- (id)initWithSpecifier:(NSDictionary*)specifier; +- (NSString*)localizedObjectForKey:(NSString*)key; +- (NSString*)title; +- (NSString*)key; +- (NSString*)type; +- (NSString*)titleForCurrentValue:(id)currentValue; +- (NSInteger)multipleValuesCount; +- (NSArray*)multipleValues; +- (NSArray*)multipleTitles; +- (NSString*)file; +- (id)defaultValue; +- (id)defaultStringValue; +- (BOOL)defaultBoolValue; +- (id)trueValue; +- (id)falseValue; +- (float)minimumValue; +- (float)maximumValue; +- (int)textOffsetPixels; +- (NSString*)minimumValueImage; +- (NSString*)maximumValueImage; +- (BOOL)isSecure; +- (UIKeyboardType)keyboardType; +- (UITextAutocapitalizationType)autocapitalizationType; +- (UITextAutocorrectionType)autoCorrectionType; +- (NSString*)footerText; +- (NSString*)stringIfEmpty; +- (Class)viewControllerClass; +- (SEL)viewControllerSelector; +-(Class)buttonClass; +-(SEL)buttonAction; + +-(BOOL)hasSpecified:(NSString*)key; + +@end diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Models/IASKSpecifier.m b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Models/IASKSpecifier.m new file mode 100644 index 0000000..ab2e93e --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Models/IASKSpecifier.m @@ -0,0 +1,256 @@ +// +// IASKSpecifier.m +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import "IASKSpecifier.h" +#import "IASKSettingsReader.h" + +@interface IASKSpecifier () +@property (nonatomic, retain) NSDictionary *multipleValuesDict; +- (void)_reinterpretValues:(NSDictionary*)specifierDict; +@end + +@implementation IASKSpecifier + +@synthesize specifierDict=_specifierDict; +@synthesize multipleValuesDict=_multipleValuesDict; +@synthesize settingsReader = _settingsReader; + +- (id)initWithSpecifier:(NSDictionary*)specifier { + if ((self = [super init])) { + [self setSpecifierDict:specifier]; + + if ([[self type] isEqualToString:kIASKPSMultiValueSpecifier] || + [[self type] isEqualToString:kIASKPSTitleValueSpecifier]) { + [self _reinterpretValues:[self specifierDict]]; + } + } + return self; +} + +- (void)dealloc { + [_specifierDict release], _specifierDict = nil; + [_multipleValuesDict release], _multipleValuesDict = nil; + + _settingsReader = nil; + + [super dealloc]; +} + +-(BOOL)hasSpecified:(NSString*)key { + return [_specifierDict objectForKey:key] != nil; +} + + +- (void)_reinterpretValues:(NSDictionary*)specifierDict { + NSArray *values = [_specifierDict objectForKey:kIASKValues]; + NSArray *titles = [_specifierDict objectForKey:kIASKTitles]; + + NSMutableDictionary *multipleValuesDict = [[[NSMutableDictionary alloc] init] autorelease]; + + if (values) { + [multipleValuesDict setObject:values forKey:kIASKValues]; + } + + if (titles) { + [multipleValuesDict setObject:titles forKey:kIASKTitles]; + } + + [self setMultipleValuesDict:multipleValuesDict]; +} +- (NSString*)localizedObjectForKey:(NSString*)key { + return [self.settingsReader titleForStringId:[_specifierDict objectForKey:key]]; +} + +- (NSString*)title { + return [self localizedObjectForKey:kIASKTitle]; +} + +- (NSString*)footerText { + return [self localizedObjectForKey:kIASKFooterText]; +} + +- (NSString*)stringIfEmpty { + return [_specifierDict objectForKey:kIASKStringIfEmpty]; +} + +-(Class) viewControllerClass { + return NSClassFromString([_specifierDict objectForKey:kIASKViewControllerClass]); +} + +-(SEL) viewControllerSelector { + return NSSelectorFromString([_specifierDict objectForKey:kIASKViewControllerSelector]); +} + +-(Class)buttonClass { + return NSClassFromString([_specifierDict objectForKey:kIASKButtonClass]); +} + +-(SEL)buttonAction { + return NSSelectorFromString([_specifierDict objectForKey:kIASKButtonAction]); +} + +- (NSString*)key { + return [_specifierDict objectForKey:kIASKKey]; +} + +- (NSString*)type { + return [_specifierDict objectForKey:kIASKType]; +} + +- (NSString*)titleForCurrentValue:(id)currentValue { + NSArray *values = [self multipleValues]; + NSArray *titles = [self multipleTitles]; + if (values.count != titles.count) { + return nil; + } + NSInteger keyIndex = [values indexOfObject:currentValue]; + if (keyIndex == NSNotFound) { + return nil; + } + @try { + return [self.settingsReader titleForStringId:[titles objectAtIndex:keyIndex]]; + } + @catch (NSException * e) {} + return nil; +} + +- (NSInteger)multipleValuesCount { + return [[_multipleValuesDict objectForKey:kIASKValues] count]; +} + +- (NSArray*)multipleValues { + return [_multipleValuesDict objectForKey:kIASKValues]; +} + +- (NSArray*)multipleTitles { + return [_multipleValuesDict objectForKey:kIASKTitles]; +} + +- (NSString*)file { + return [_specifierDict objectForKey:kIASKFile]; +} + +- (id)defaultValue { + return [_specifierDict objectForKey:kIASKDefaultValue]; +} + +- (id)defaultStringValue { + return [[_specifierDict objectForKey:kIASKDefaultValue] description]; +} + +- (BOOL)defaultBoolValue { + id defaultValue = [self defaultValue]; + if ([defaultValue isEqual:[self trueValue]]) { + return YES; + } + if ([defaultValue isEqual:[self falseValue]]) { + return NO; + } + return [defaultValue boolValue]; +} + +- (id)trueValue { + return [_specifierDict objectForKey:kIASKTrueValue]; +} + +- (id)falseValue { + return [_specifierDict objectForKey:kIASKFalseValue]; +} + +- (float)minimumValue { + return [[_specifierDict objectForKey:kIASKMinimumValue] floatValue]; +} + +- (float)maximumValue { + return [[_specifierDict objectForKey:kIASKMaximumValue] floatValue]; +} + +- (int)textOffsetPixels { + return [[_specifierDict objectForKey:kIASKTextOffsetPixels] intValue]; +} + +- (NSString*)minimumValueImage { + return [_specifierDict objectForKey:kIASKMinimumValueImage]; +} + +- (NSString*)maximumValueImage { + return [_specifierDict objectForKey:kIASKMaximumValueImage]; +} + +- (BOOL)isSecure { + return [[_specifierDict objectForKey:kIASKIsSecure] boolValue]; +} + +- (UIKeyboardType)keyboardType { + if ([[_specifierDict objectForKey:KIASKKeyboardType] isEqualToString:kIASKKeyboardAlphabet]) { + return UIKeyboardTypeDefault; + } + else if ([[_specifierDict objectForKey:KIASKKeyboardType] isEqualToString:kIASKKeyboardASCII]) { + return UIKeyboardTypeASCIICapable; + } + else if ([[_specifierDict objectForKey:KIASKKeyboardType] isEqualToString:kIASKKeyboardNumbersAndPunctuation]) { + return UIKeyboardTypeNumbersAndPunctuation; + } + else if ([[_specifierDict objectForKey:KIASKKeyboardType] isEqualToString:kIASKKeyboardNumberPad]) { + return UIKeyboardTypeNumberPad; + } + else if ([[_specifierDict objectForKey:KIASKKeyboardType] isEqualToString:kIASKKeyboardDecimalPad]) { + if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iPhoneOS_4_1) { + return UIKeyboardTypeDecimalPad; + } + else { + return UIKeyboardTypeNumbersAndPunctuation; + } + } + else if ([[_specifierDict objectForKey:KIASKKeyboardType] isEqualToString:KIASKKeyboardURL]) { + return UIKeyboardTypeURL; + } + else if ([[_specifierDict objectForKey:KIASKKeyboardType] isEqualToString:kIASKKeyboardEmailAddress]) { + return UIKeyboardTypeEmailAddress; + } + return UIKeyboardTypeDefault; +} + +- (UITextAutocapitalizationType)autocapitalizationType { + if ([[_specifierDict objectForKey:kIASKAutocapitalizationType] isEqualToString:kIASKAutoCapNone]) { + return UITextAutocapitalizationTypeNone; + } + else if ([[_specifierDict objectForKey:kIASKAutocapitalizationType] isEqualToString:kIASKAutoCapSentences]) { + return UITextAutocapitalizationTypeSentences; + } + else if ([[_specifierDict objectForKey:kIASKAutocapitalizationType] isEqualToString:kIASKAutoCapWords]) { + return UITextAutocapitalizationTypeWords; + } + else if ([[_specifierDict objectForKey:kIASKAutocapitalizationType] isEqualToString:kIASKAutoCapAllCharacters]) { + return UITextAutocapitalizationTypeAllCharacters; + } + return UITextAutocapitalizationTypeNone; +} + +- (UITextAutocorrectionType)autoCorrectionType { + if ([[_specifierDict objectForKey:kIASKAutoCorrectionType] isEqualToString:kIASKAutoCorrDefault]) { + return UITextAutocorrectionTypeDefault; + } + else if ([[_specifierDict objectForKey:kIASKAutoCorrectionType] isEqualToString:kIASKAutoCorrNo]) { + return UITextAutocorrectionTypeNo; + } + else if ([[_specifierDict objectForKey:kIASKAutoCorrectionType] isEqualToString:kIASKAutoCorrYes]) { + return UITextAutocorrectionTypeYes; + } + return UITextAutocorrectionTypeDefault; +} + +@end diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.h b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.h new file mode 100644 index 0000000..77dbdb5 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.h @@ -0,0 +1,38 @@ +// +// IASKPSSliderSpecifierViewCell.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import + +@class IASKSlider; + +@interface IASKPSSliderSpecifierViewCell : UITableViewCell { + UILabel *_label; + IASKSlider *_slider; + UIImageView *_minImage; + UIImageView *_maxImage; + + @public + float textOffsetPixels; +} + +@property (nonatomic, assign) IBOutlet UILabel *label; +@property (nonatomic, assign) IBOutlet IASKSlider *slider; +@property (nonatomic, assign) IBOutlet UIImageView *minImage; +@property (nonatomic, assign) IBOutlet UIImageView *maxImage; + +- (void) initDefaults; + +@end diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.m b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.m new file mode 100644 index 0000000..6499d1f --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.m @@ -0,0 +1,92 @@ +// +// IASKPSSliderSpecifierViewCell.m +// http://www.inappsettingskit.com +// +// Copyright (c) 2009-2010: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import "IASKPSSliderSpecifierViewCell.h" +#import "IASKSlider.h" +#import "IASKSettingsReader.h" + +@implementation IASKPSSliderSpecifierViewCell + +@synthesize label=_label, + slider=_slider, + minImage=_minImage, + maxImage=_maxImage; + +- (void) initDefaults { + textOffsetPixels = -1; +} + +- (void)layoutSubviews { + [super layoutSubviews]; + CGRect sliderBounds = _slider.bounds; + CGPoint sliderCenter = _slider.center; + double superViewWidth = _slider.superview.frame.size.width; + double centerOffset = 0; + + _minImage.hidden = YES; + _maxImage.hidden = YES; + _label.hidden = YES; + + if ([_label.text length] > 0) { + _label.hidden = NO; + + if (textOffsetPixels < 0) { + CGSize size = [_label.text sizeWithFont:_label.font]; + textOffsetPixels = size.width + 4; + NSLog(@"size: %f, %f\n", size.width, size.height); + } + superViewWidth -= textOffsetPixels; + centerOffset = textOffsetPixels; + } + + sliderCenter.x = superViewWidth / 2 + centerOffset; + sliderBounds.size.width = superViewWidth - kIASKSliderNoImagesPadding * 2; + + // Check if there are min and max images. If so, change the layout accordingly. + if (_minImage.image && _maxImage.image) { + // Both images + _minImage.hidden = NO; + _maxImage.hidden = NO; + sliderBounds.size.width = superViewWidth - kIASKSliderImagesPadding * 2; + } + else if (_minImage.image) { + // Min image + _minImage.hidden = NO; + sliderCenter.x += (kIASKSliderImagesPadding - kIASKSliderNoImagesPadding) / 2; + sliderBounds.size.width = superViewWidth - kIASKSliderNoImagesPadding - kIASKSliderImagesPadding; + } + else if (_maxImage.image) { + // Max image + _maxImage.hidden = NO; + sliderCenter.x -= (kIASKSliderImagesPadding - kIASKSliderNoImagesPadding) / 2; + sliderBounds.size.width = superViewWidth - kIASKSliderNoImagesPadding - kIASKSliderImagesPadding; + } + + _slider.bounds = sliderBounds; + _slider.center = sliderCenter; +} + +- (void)dealloc { + _minImage.image = nil; + _maxImage.image = nil; + [super dealloc]; +} + +- (void)prepareForReuse { + _minImage.image = nil; + _maxImage.image = nil; +} +@end diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.h b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.h new file mode 100644 index 0000000..dba6ca5 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.h @@ -0,0 +1,32 @@ +// +// IASKPSTextFieldSpecifierViewCell.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import + +@class IASKTextField; + +@interface IASKPSTextFieldSpecifierViewCell : UITableViewCell { + UILabel *_label; + IASKTextField *_textField; + + @public + NSString* stringIfEmpty; +} + +@property (nonatomic, assign) IBOutlet UILabel *label; +@property (nonatomic, assign) IBOutlet IASKTextField *textField; + +@end diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.m b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.m new file mode 100644 index 0000000..2d31d9f --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.m @@ -0,0 +1,76 @@ +// +// IASKPSTextFieldSpecifierViewCell.m +// http://www.inappsettingskit.com +// +// Copyright (c) 2009-2010: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import "IASKPSTextFieldSpecifierViewCell.h" +#import "IASKTextField.h" +#import "IASKSettingsReader.h" + +@implementation IASKPSTextFieldSpecifierViewCell + +@synthesize label=_label, + textField=_textField; + +- (void)layoutSubviews { + [super layoutSubviews]; + CGSize labelSize = [_label sizeThatFits:CGSizeZero]; + labelSize.width = MIN(labelSize.width, _label.bounds.size.width); + + CGRect textFieldFrame = _textField.frame; + textFieldFrame.origin.x = _label.frame.origin.x + MAX(kIASKMinLabelWidth, labelSize.width) + kIASKSpacing; + if (!_label.text.length) + textFieldFrame.origin.x = _label.frame.origin.x; + textFieldFrame.size.width = _textField.superview.frame.size.width - textFieldFrame.origin.x - _label.frame.origin.x; + _textField.frame = textFieldFrame; + + [_textField setDelegate:self]; +} + +- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string +{ + NSUInteger newLength = [textField.text length] + [string length] - range.length; + if (newLength > 24) + return NO; + + int length = [string length]; + for (int i = 0; i < length; ++i) { + unichar ch = [string characterAtIndex:i]; + + if (ch >= 128) + return NO; + } + return YES; +} + +- (void)textFieldDidEndEditing:(UITextField *)textField { + if (stringIfEmpty != nil && [[textField text] isEqualToString:@""]) { + [textField setText:stringIfEmpty]; + } +} + +- (void)setSelected:(BOOL)selected animated:(BOOL)animated { + + [super setSelected:selected animated:animated]; + + // Configure the view for the selected state +} + + +- (void)dealloc { + [super dealloc]; +} + + +@end diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKPSTitleValueSpecifierViewCell.h b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKPSTitleValueSpecifierViewCell.h new file mode 100644 index 0000000..b3185b4 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKPSTitleValueSpecifierViewCell.h @@ -0,0 +1,22 @@ +// +// IASKPSTitleValueSpecifierViewCell.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2010: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import + + +@interface IASKPSTitleValueSpecifierViewCell : UITableViewCell + +@end diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKPSTitleValueSpecifierViewCell.m b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKPSTitleValueSpecifierViewCell.m new file mode 100644 index 0000000..cd6ba97 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKPSTitleValueSpecifierViewCell.m @@ -0,0 +1,54 @@ +// +// IASKPSTitleValueSpecifierViewCell.m +// http://www.inappsettingskit.com +// +// Copyright (c) 2010: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import "IASKPSTitleValueSpecifierViewCell.h" +#import "IASKSettingsReader.h" + + +@implementation IASKPSTitleValueSpecifierViewCell + +- (void)layoutSubviews { + // left align the value if the title is empty + if (!self.textLabel.text.length) { + self.textLabel.text = self.detailTextLabel.text; + self.detailTextLabel.text = nil; + if ([self.reuseIdentifier isEqualToString:kIASKPSMultiValueSpecifier]) { + self.textLabel.font = [UIFont systemFontOfSize:[UIFont labelFontSize]]; + self.textLabel.textColor = self.detailTextLabel.textColor; + } + } + [super layoutSubviews]; + + CGSize viewSize = [self.textLabel superview].frame.size; + + // set the left title label frame + CGFloat labelWidth = [self.textLabel sizeThatFits:CGSizeZero].width; + CGFloat minValueWidth = (self.detailTextLabel.text.length) ? kIASKMinValueWidth + kIASKSpacing : 0; + labelWidth = MIN(labelWidth, viewSize.width - minValueWidth - kIASKPaddingLeft -kIASKPaddingRight); + CGRect labelFrame = CGRectMake(kIASKPaddingLeft, 0, labelWidth, viewSize.height -2); + self.textLabel.frame = labelFrame; + + // set the right value label frame + if (self.detailTextLabel.text.length) { + CGRect valueFrame = CGRectMake(kIASKPaddingLeft + labelWidth + kIASKSpacing, + 0, + viewSize.width - (kIASKPaddingLeft + labelWidth + kIASKSpacing) - kIASKPaddingRight, + viewSize.height -2); + self.detailTextLabel.frame = valueFrame; + } +} + +@end diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKPSToggleSwitchSpecifierViewCell.h b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKPSToggleSwitchSpecifierViewCell.h new file mode 100644 index 0000000..a6d2864 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKPSToggleSwitchSpecifierViewCell.h @@ -0,0 +1,29 @@ +// +// IASKPSToggleSwitchSpecifierViewCell.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import + +@class IASKSwitch; + +@interface IASKPSToggleSwitchSpecifierViewCell : UITableViewCell { + UILabel *_label; + IASKSwitch *_toggle; +} + +@property (nonatomic, assign) IBOutlet UILabel *label; +@property (nonatomic, assign) IBOutlet IASKSwitch *toggle; + +@end diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKPSToggleSwitchSpecifierViewCell.m b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKPSToggleSwitchSpecifierViewCell.m new file mode 100644 index 0000000..a4a5c0d --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKPSToggleSwitchSpecifierViewCell.m @@ -0,0 +1,46 @@ +// +// IASKPSToggleSwitchSpecifierViewCell.m +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import "IASKPSToggleSwitchSpecifierViewCell.h" +#import "IASKSwitch.h" + +@implementation IASKPSToggleSwitchSpecifierViewCell + +@synthesize label=_label, + toggle=_toggle; + +- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { + if ((self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])) { + // Initialization code + } + return self; +} + + +- (void)setSelected:(BOOL)selected animated:(BOOL)animated { + + [super setSelected:selected animated:animated]; + + // Configure the view for the selected state +} + + +- (void)dealloc { + [super dealloc]; +} + + +@end diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKSlider.h b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKSlider.h new file mode 100644 index 0000000..34c5ecb --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKSlider.h @@ -0,0 +1,26 @@ +// +// IASKSlider.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import + + +@interface IASKSlider : UISlider { + NSString *_key; +} + +@property (nonatomic, retain) NSString *key; + +@end diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKSlider.m b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKSlider.m new file mode 100644 index 0000000..d591ff2 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKSlider.m @@ -0,0 +1,30 @@ +// +// IASKSlider.m +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import "IASKSlider.h" + + +@implementation IASKSlider + +@synthesize key=_key; + +- (void)dealloc { + [_key release], _key = nil; + + [super dealloc]; +} + +@end diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKSwitch.h b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKSwitch.h new file mode 100644 index 0000000..b1439bd --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKSwitch.h @@ -0,0 +1,26 @@ +// +// IASKSwitch.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import + + +@interface IASKSwitch : UISwitch { + NSString *_key; +} + +@property (nonatomic, retain) NSString *key; + +@end diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKSwitch.m b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKSwitch.m new file mode 100644 index 0000000..f32aba4 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKSwitch.m @@ -0,0 +1,31 @@ +// +// IASKSwitch.m +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import "IASKSwitch.h" + + +@implementation IASKSwitch + +@synthesize key=_key; + +- (void)dealloc { + [_key release], _key = nil; + + [super dealloc]; +} + + +@end diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKTextField.h b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKTextField.h new file mode 100644 index 0000000..47c9be3 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKTextField.h @@ -0,0 +1,26 @@ +// +// IASKTextField.h +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import + + +@interface IASKTextField : UITextField { + NSString *_key; +} + +@property (nonatomic, retain) NSString *key; + +@end diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKTextField.m b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKTextField.m new file mode 100644 index 0000000..9056896 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Views/IASKTextField.m @@ -0,0 +1,30 @@ +// +// IASKTextField.m +// http://www.inappsettingskit.com +// +// Copyright (c) 2009: +// Luc Vandal, Edovia Inc., http://www.edovia.com +// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com +// All rights reserved. +// +// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, +// as the original authors of this code. You can give credit in a blog post, a tweet or on +// a info page of your app. Also, the original authors appreciate letting them know if you use this code. +// +// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php +// + +#import "IASKTextField.h" + + +@implementation IASKTextField + +@synthesize key=_key; + +- (void)dealloc { + [_key release], _key = nil; + + [super dealloc]; +} + +@end diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Xibs/IASKAppSettingsView.xib b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Xibs/IASKAppSettingsView.xib new file mode 100644 index 0000000..74720fa --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Xibs/IASKAppSettingsView.xib @@ -0,0 +1,222 @@ + + + + 1280 + 11B26 + 1934 + 1138 + 566.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 931 + + + YES + IBProxyObject + IBUITableView + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + {320, 460} + + + + 10 + + 549453824 + {512, 1} + + YES + + YES + + + + TU0AKgAACAjFzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ +y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ +xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ +xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ +xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ +xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ +xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ +y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ +y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ +xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ +xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ +xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ +xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ +xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ +y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ +y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ +xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ +xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ +xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ +xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ +xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ +y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ +y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ +xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ +xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ +xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ +xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ +xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/ +y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ +y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ +xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ +xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ +xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ +xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/ +xczS/8vS2P/L0tj/xczU/wANAQAAAwAAAAECAAAAAQEAAwAAAAEAAQAAAQIAAwAAAAQAAAiqAQMAAwAA +AAEAAQAAAQYAAwAAAAEAAgAAAREABAAAAAEAAAAIARIAAwAAAAEAAQAAARUAAwAAAAEABAAAARYAAwAA +AAEAAQAAARcABAAAAAEAAAgAARwAAwAAAAEAAQAAAVIAAwAAAAEAAQAAAVMAAwAAAAQAAAiyAAAAAAAI +AAgACAAIAAEAAQABAAE + + + + + + 3 + MCAwAA + + + groupTableViewBackgroundColor + + NO + YES + NO + IBCocoaTouchFramework + NO + 1 + 1 + 0 + YES + 44 + 10 + 10 + + + + + YES + + + view + + + + 10 + + + + dataSource + + + + 6 + + + + delegate + + + + 7 + + + + + YES + + 0 + + YES + + + + + + -1 + + + File's Owner + + + -2 + + + + + 4 + + + + + + + YES + + YES + -1.CustomClassName + -1.IBPluginDependency + -2.CustomClassName + -2.IBPluginDependency + 4.IBPluginDependency + + + YES + IASKAppSettingsViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + + + + YES + + + + + 10 + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + 3 + 931 + + diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Xibs/IASKAppSettingsWebView.xib b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Xibs/IASKAppSettingsWebView.xib new file mode 100644 index 0000000..b814f05 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Xibs/IASKAppSettingsWebView.xib @@ -0,0 +1,378 @@ + + + + 1024 + 10F569 + 804 + 1038.29 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 123 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + + YES + + + 274 + {320, 460} + + + 3 + MQA + + IBCocoaTouchFramework + + + {320, 460} + + + + IBCocoaTouchFramework + + + + + YES + + + view + + + + 3 + + + + webView + + + + 5 + + + + delegate + + + + 6 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + -1 + + + File's Owner + + + -2 + + + + + 4 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 4.IBPluginDependency + + + YES + IASKAppSettingsWebViewController + UIResponder + {{354, 412}, {320, 480}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + YES + + + + + YES + + + YES + + + + 6 + + + + YES + + IASKAppSettingsWebViewController + UIViewController + + webView + UIWebView + + + webView + + webView + UIWebView + + + + IBProjectSource + ../InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIResponder + NSObject + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + UIWebView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIWebView.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + ../InAppSettingsKitSampleApp.xcodeproj + 3 + 123 + + diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Xibs/IASKPSSliderSpecifierViewCell.xib b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Xibs/IASKPSSliderSpecifierViewCell.xib new file mode 100644 index 0000000..47d0398 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Xibs/IASKPSSliderSpecifierViewCell.xib @@ -0,0 +1,297 @@ + + + + 1280 + 10K549 + 1938 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 933 + + + YES + IBUISlider + IBUITableViewCell + IBUIImageView + IBUILabel + IBProxyObject + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 290 + + YES + + + 256 + + YES + + + 290 + {{52, 12}, {216, 23}} + + + NO + YES + YES + IBCocoaTouchFramework + 0 + 0 + 0.5 + + + + 289 + {{289, 13}, {21, 21}} + + + NO + NO + 8 + NO + IBCocoaTouchFramework + + + + 292 + {{10, 13}, {21, 21}} + + + NO + NO + 7 + NO + IBCocoaTouchFramework + + + + 294 + {{10, 13}, {240, 21}} + + + NO + YES + NO + IBCocoaTouchFramework + + + 1 + MCAwIDAAA + + + 1 + 10 + + Helvetica-Bold + Helvetica + 2 + 17 + + + Helvetica-Bold + 17 + 16 + + + + {320, 43} + + + + 3 + MCAwAA + + NO + YES + 4 + YES + IBCocoaTouchFramework + + + {320, 44} + + + + 1 + MSAxIDEAA + + YES + NO + IBCocoaTouchFramework + 0 + + PSSliderSpecifier + + + + + YES + + + slider + + + + 12 + + + + maxImage + + + + 13 + + + + minImage + + + + 14 + + + + label + + + + 18 + + + + + YES + + 0 + + YES + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + YES + + + + + + + + + 3 + + + + + 6 + + + + + 9 + + + + + 17 + + + + + + + YES + + YES + -1.IBPluginDependency + -2.CustomClassName + -2.IBPluginDependency + 17.IBPluginDependency + 2.CustomClassName + 2.IBPluginDependency + 3.CustomClassName + 3.IBPluginDependency + 6.IBPluginDependency + 9.IBPluginDependency + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + IASKPSSliderSpecifierViewCell + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + IASKSlider + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + + + + YES + + + + + 18 + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + 3 + 933 + + diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Xibs/IASKPSTextFieldSpecifierViewCell.xib b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Xibs/IASKPSTextFieldSpecifierViewCell.xib new file mode 100644 index 0000000..1ac134b --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Xibs/IASKPSTextFieldSpecifierViewCell.xib @@ -0,0 +1,262 @@ + + + + 1280 + 10K549 + 1938 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 933 + + + YES + IBUITableViewCell + IBUILabel + IBUITextField + IBProxyObject + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 290 + + YES + + + 256 + + YES + + + 294 + {{9, 11}, {240, 21}} + + NO + YES + NO + IBCocoaTouchFramework + Label + + 1 + MCAwIDAAA + + + 1 + 10 + + Helvetica-Bold + Helvetica + 2 + 17 + + + Helvetica-Bold + 17 + 16 + + + + + 291 + {{100, 11}, {201, 21}} + + NO + NO + IBCocoaTouchFramework + hello + + 1 + MC4yNzQ1MDk4MiAwLjM3NjQ3MDYgMC41MjE1Njg2NgA + + 2 + YES + 10 + + IBCocoaTouchFramework + + + Helvetica + Helvetica + 0 + 17 + + + Helvetica + 17 + 16 + + + + {320, 43} + + + 3 + MCAwAA + + NO + YES + 4 + YES + IBCocoaTouchFramework + + + {320, 44} + + + 1 + MSAxIDEAA + + YES + NO + IBCocoaTouchFramework + 0 + + PSTextFieldSpecifier + + + + + YES + + + label + + + + 8 + + + + textField + + + + 9 + + + + delegate + + + + 10 + + + + + YES + + 0 + + YES + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + YES + + + + + + + 3 + + + + + 4 + + + + + + + YES + + YES + -1.IBPluginDependency + -2.CustomClassName + -2.IBPluginDependency + 2.CustomClassName + 2.IBPluginDependency + 3.IBPluginDependency + 4.CustomClassName + 4.IBPluginDependency + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + IASKPSTextFieldSpecifierViewCell + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + IASKTextField + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + + + + YES + + + + + 10 + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + 3 + 933 + + diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Xibs/IASKPSToggleSwitchSpecifierViewCell.xib b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Xibs/IASKPSToggleSwitchSpecifierViewCell.xib new file mode 100644 index 0000000..885c95a --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Xibs/IASKPSToggleSwitchSpecifierViewCell.xib @@ -0,0 +1,287 @@ + + + + 768 + 10J869 + 1306 + 1038.35 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 301 + + + YES + IBUITableViewCell + IBUISwitch + IBUILabel + IBProxyObject + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 290 + + YES + + + 256 + + YES + + + 294 + {{9, 10}, {200, 21}} + + + NO + YES + NO + IBCocoaTouchFramework + Label + + Helvetica-Bold + 17 + 16 + + + 1 + MCAwIDAAA + + + 1 + 10 + + + + 289 + {{218, 8}, {94, 27}} + + + NO + YES + YES + IBCocoaTouchFramework + 0 + 0 + YES + + + {320, 44} + + + + 3 + MCAwAA + + NO + YES + 4 + YES + IBCocoaTouchFramework + + + {320, 44} + + + + 1 + MSAxIDEAA + + YES + NO + IBCocoaTouchFramework + 1 + 0 + + PSToggleSwitchSpecifier + + + + + YES + + + toggle + + + + 8 + + + + label + + + + 9 + + + + + YES + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + YES + + + + + Toggle Switch Specifier View Cell - PSToggleSwitchSpecifier + + + 3 + + + + + 4 + + + + + + + YES + + YES + -2.CustomClassName + 2.CustomClassName + 2.IBEditorWindowLastContentRect + 2.IBPluginDependency + 3.IBPluginDependency + 4.CustomClassName + 4.IBPluginDependency + + + YES + UIResponder + IASKPSToggleSwitchSpecifierViewCell + {{1676, 1200}, {320, 44}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + IASKSwitch + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + + + + YES + + + + + 9 + + + + YES + + IASKPSToggleSwitchSpecifierViewCell + UITableViewCell + + YES + + YES + label + toggle + + + YES + UILabel + IASKSwitch + + + + YES + + YES + label + toggle + + + YES + + label + UILabel + + + toggle + IASKSwitch + + + + + IBProjectSource + ./Classes/IASKPSToggleSwitchSpecifierViewCell.h + + + + IASKSwitch + UISwitch + + IBProjectSource + ./Classes/IASKSwitch.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + 3 + 301 + + diff --git a/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Xibs/IASKSpecifierValuesView.xib b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Xibs/IASKSpecifierValuesView.xib new file mode 100644 index 0000000..9c7ff86 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/InAppSettingsKit/Xibs/IASKSpecifierValuesView.xib @@ -0,0 +1,255 @@ + + + + 768 + 10J567 + 1294 + 1038.35 + 462.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 294 + + + YES + IBProxyObject + IBUIView + IBUITableView + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 292 + + YES + + + 274 + {320, 460} + + + + + 10 + + 549453824 + {84, 1} + + YES + + YES + + + + TU0AKgAAAVjFzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/ +y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/ +xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/ +xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/ +xczU/8XM1P/FzNL/y9LY/8vS2P/FzNT/xczU/8XM1P/FzNT/xczS/8vS2P/L0tj/xczU/8XM1P/FzNT/ +xczU/8XM0v/L0tj/y9LY/8XM1P/FzNT/xczU/8XM1P/FzNL/y9LY/8vS2P8ADQEAAAMAAAABAFQAAAEB +AAMAAAABAAEAAAECAAMAAAAEAAAB+gEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABAAEAAAEXAAQAAAABAAABUAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAACAgAAAAAACAAIAAgACAABAAEAAQABA + + + + + + 3 + MCAwAA + + + groupTableViewBackgroundColor + + NO + YES + NO + IBCocoaTouchFramework + NO + 1 + 1 + 0 + YES + 44 + 10 + 10 + + + {320, 460} + + + + + 3 + MQA + + 2 + + + IBCocoaTouchFramework + + + + + YES + + + view + + + + 3 + + + + dataSource + + + + 5 + + + + delegate + + + + 6 + + + + _tableView + + + + 7 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + -1 + + + File's Owner + + + -2 + + + + + 4 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 4.IBPluginDependency + + + YES + IASKSpecifierValuesViewController + UIResponder + {{556, 432}, {320, 460}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + + + + YES + + + + + 7 + + + + YES + + IASKSpecifierValuesViewController + UIViewController + + _tableView + UITableView + + + _tableView + + _tableView + UITableView + + + + IBProjectSource + ./Classes/IASKSpecifierValuesViewController.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + 3 + 294 + + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/Android.mk b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/Android.mk new file mode 100644 index 0000000..50f5974 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/Android.mk @@ -0,0 +1,13 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_MODULE := RakNet + +MY_PREFIX := $(LOCAL_PATH)/RakNetSources/ +MY_SOURCES := $(wildcard $(MY_PREFIX)*.cpp) +LOCAL_SRC_FILES += $(MY_SOURCES:$(MY_PREFIX)%=RakNetSources/%) + +LOCAL_CFLAGS := -Wno-psabi $(LOCAL_CFLAGS) + +include $(BUILD_STATIC_LIBRARY) diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/Application.mk b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/Application.mk new file mode 100644 index 0000000..d276a6f --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/Application.mk @@ -0,0 +1,4 @@ +APP_PLATFORM := android-8 +APP_STL := stlport_static +APP_OPTIM := release +APP_ABI := armeabi-v7a \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/CMakeLists.txt b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/CMakeLists.txt new file mode 100644 index 0000000..fe314be --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/CMakeLists.txt @@ -0,0 +1,4 @@ +FILE(GLOB raknetCPPSources ./RaknetSources/*.cpp) +set(CMAKE_C_FLAGS -m32) +set(CMAKE_CXX_FLAGS -m32) +add_library(raknet ${raknetCPPSources}) diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/AutopatcherPatchContext.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/AutopatcherPatchContext.h new file mode 100644 index 0000000..ab5d86b --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/AutopatcherPatchContext.h @@ -0,0 +1,23 @@ +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// Usage of RakNet is subject to the appropriate license agreement. +/// + +#ifndef __AUTOPATCHER_PATCH_CONTEXT_H +#define __AUTOPATCHER_PATCH_CONTEXT_H + +enum PatchContext +{ + PC_HASH_1_WITH_PATCH, + PC_HASH_2_WITH_PATCH, + PC_WRITE_FILE, + PC_ERROR_FILE_WRITE_FAILURE, + PC_ERROR_PATCH_TARGET_MISSING, + PC_ERROR_PATCH_APPLICATION_FAILURE, + PC_ERROR_PATCH_RESULT_CHECKSUM_FAILURE, + PC_NOTICE_WILL_COPY_ON_RESTART, + PC_NOTICE_FILE_DOWNLOADED, + PC_NOTICE_FILE_DOWNLOADED_PATCH, +}; + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/AutopatcherRepositoryInterface.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/AutopatcherRepositoryInterface.h new file mode 100644 index 0000000..d1ba5a3 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/AutopatcherRepositoryInterface.h @@ -0,0 +1,72 @@ +/// +/// \file AutopatcherRepositoryInterface.h +/// \brief An interface used by AutopatcherServer to get the data necessary to run an autopatcher. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// Usage of RakNet is subject to the appropriate license agreement. +/// + +#ifndef __AUTOPATCHER_REPOSITORY_INTERFACE_H +#define __AUTOPATCHER_REPOSITORY_INTERFACE_H + +#include "IncrementalReadInterface.h" +#include "SimpleMutex.h" + +namespace RakNet +{ +/// Forward declarations +class FileList; +class BitStream; + +/// An interface used by AutopatcherServer to get the data necessary to run an autopatcher. This is up to you to implement for custom repository solutions. +class AutopatcherRepositoryInterface : public IncrementalReadInterface +{ +public: + /// Get list of files added and deleted since a certain date. This is used by AutopatcherServer and not usually explicitly called. + /// \param[in] applicationName A null terminated string identifying the application + /// \param[out] addedFiles A list of the current versions of filenames with hashes as their data that were created after \a sinceData + /// \param[out] deletedFiles A list of the current versions of filenames that were deleted after \a sinceData + /// \param[in] An input date, in whatever format your repository uses + /// \param[out] currentDate The current server date, in whatever format your repository uses + /// \return True on success, false on failure. + virtual bool GetChangelistSinceDate(const char *applicationName, FileList *addedFiles, FileList *deletedFiles, double sinceDate)=0; + + /// Get patches (or files) for every file in input, assuming that input has a hash for each of those files. + /// \param[in] applicationName A null terminated string identifying the application + /// \param[in] input A list of files with SHA1_LENGTH byte hashes to get from the database. + /// \param[out] patchList You should return list of files with either the filedata or the patch. This is a subset of \a input. The context data for each file will be either PC_WRITE_FILE (to just write the file) or PC_HASH_WITH_PATCH (to patch). If PC_HASH_WITH_PATCH, then the file contains a SHA1_LENGTH byte patch followed by the hash. The datalength is patchlength + SHA1_LENGTH + /// \param[out] currentDate The current server date, in whatever format your repository uses + /// \return True on success, false on failure. + virtual bool GetPatches(const char *applicationName, FileList *input, FileList *patchList)=0; + + /// For the most recent update, return files that were patched, added, or deleted. For files that were patched, return both the patch in \a patchedFiles and the current version in \a updatedFiles + /// The cache will be used if the client last patched between \a priorRowPatchTime and \a mostRecentRowPatchTime + /// No files changed will be returned to the client if the client last patched after mostRecentRowPatchTime + /// \param[in,out] applicationName Name of the application to get patches for. If empty, uses the most recently updated application, and the string will be updated to reflect this name. + /// \param[out] patchedFiles Given the most recent update, if a file was patched, add it to this list. The context data for each file will be PC_HASH_WITH_PATCH. The first 4 bytes of data should be a hash of the file being patched. The second 4 bytes should be the hash of the file after the patch. The remaining bytes should be the patch itself. + /// \param[out] updatedFiles The current value of the file. List should have the same length and order as \a patchedFiles + /// \param[out] updatedFileHashes The hash of the current value of the file. List should have the same length and order as \a patchedFiles + /// \param[out] deletedFiles Files that were deleted in the last patch. + /// \param[out] priorRowPatchTime When the patch before the most recent patch took place. 0 means never. + /// \param[out] mostRecentRowPatchTime When the most recent patch took place. 0 means never. + /// \return true on success, false on failure + virtual bool GetMostRecentChangelistWithPatches( + RakNet::RakString &applicationName, + FileList *patchedFiles, + FileList *updatedFiles, + FileList *updatedFileHashes, + FileList *deletedFiles, + double *priorRowPatchTime, + double *mostRecentRowPatchTime)=0; + + /// \return Whatever this function returns is sent from the AutopatcherServer to the AutopatcherClient when one of the above functions returns false. + virtual const char *GetLastError(void) const=0; + + /// \return Passed to FileListTransfer::Send() as the _chunkSize parameter. + virtual const int GetIncrementalReadChunkSize(void) const=0; +}; + +} // namespace RakNet + +#endif + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/BitStream.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/BitStream.cpp new file mode 100644 index 0000000..cdf88ac --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/BitStream.cpp @@ -0,0 +1,1172 @@ +/// \file +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#if defined(_MSC_VER) && _MSC_VER < 1299 // VC6 doesn't support template specialization +#include "BitStream_NoTemplate.cpp" +#else + +#include "BitStream.h" +#include +#include +#include + +#include "SocketIncludes.h" +#include "RakNetDefines.h" + + + +#if defined(_WIN32) +#include // htonl +#include +#include +#include + + +#else +#include +#include +#if defined(ANDROID) +#include +#else +#include +#endif +#include +#endif + +// MSWin uses _copysign, others use copysign... +#ifndef _WIN32 +#define _copysign copysign +#endif + +using namespace RakNet; + +#ifdef _MSC_VER +#pragma warning( push ) +#endif + +STATIC_FACTORY_DEFINITIONS(BitStream,BitStream) + +BitStream::BitStream() +{ + numberOfBitsUsed = 0; + //numberOfBitsAllocated = 32 * 8; + numberOfBitsAllocated = BITSTREAM_STACK_ALLOCATION_SIZE * 8; + readOffset = 0; + //data = ( unsigned char* ) rakMalloc_Ex( 32, _FILE_AND_LINE_ ); + data = ( unsigned char* ) stackData; + +#ifdef _DEBUG + // RakAssert( data ); +#endif + //memset(data, 0, 32); + copyData = true; +} + +BitStream::BitStream( const unsigned int initialBytesToAllocate ) +{ + numberOfBitsUsed = 0; + readOffset = 0; + if (initialBytesToAllocate <= BITSTREAM_STACK_ALLOCATION_SIZE) + { + data = ( unsigned char* ) stackData; + numberOfBitsAllocated = BITSTREAM_STACK_ALLOCATION_SIZE * 8; + } + else + { + data = ( unsigned char* ) rakMalloc_Ex( (size_t) initialBytesToAllocate, _FILE_AND_LINE_ ); + numberOfBitsAllocated = initialBytesToAllocate << 3; + } +#ifdef _DEBUG + RakAssert( data ); +#endif + // memset(data, 0, initialBytesToAllocate); + copyData = true; +} + +BitStream::BitStream( unsigned char* _data, const unsigned int lengthInBytes, bool _copyData ) +{ + numberOfBitsUsed = lengthInBytes << 3; + readOffset = 0; + copyData = _copyData; + numberOfBitsAllocated = lengthInBytes << 3; + + if ( copyData ) + { + if ( lengthInBytes > 0 ) + { + if (lengthInBytes < BITSTREAM_STACK_ALLOCATION_SIZE) + { + data = ( unsigned char* ) stackData; + numberOfBitsAllocated = BITSTREAM_STACK_ALLOCATION_SIZE << 3; + } + else + { + data = ( unsigned char* ) rakMalloc_Ex( (size_t) lengthInBytes, _FILE_AND_LINE_ ); + } +#ifdef _DEBUG + RakAssert( data ); +#endif + memcpy( data, _data, (size_t) lengthInBytes ); + } + else + data = 0; + } + else + data = ( unsigned char* ) _data; +} + +// Use this if you pass a pointer copy to the constructor (_copyData==false) and want to overallocate to prevent reallocation +void BitStream::SetNumberOfBitsAllocated( const BitSize_t lengthInBits ) +{ +#ifdef _DEBUG + RakAssert( lengthInBits >= ( BitSize_t ) numberOfBitsAllocated ); +#endif + numberOfBitsAllocated = lengthInBits; +} + +BitStream::~BitStream() +{ + if ( copyData && numberOfBitsAllocated > (BITSTREAM_STACK_ALLOCATION_SIZE << 3)) + rakFree_Ex( data , _FILE_AND_LINE_ ); // Use realloc and free so we are more efficient than delete and new for resizing +} + +void BitStream::Reset( void ) +{ + // Note: Do NOT reallocate memory because BitStream is used + // in places to serialize/deserialize a buffer. Reallocation + // is a dangerous operation (may result in leaks). + + if ( numberOfBitsUsed > 0 ) + { + // memset(data, 0, BITS_TO_BYTES(numberOfBitsUsed)); + } + + // Don't free memory here for speed efficiency + //free(data); // Use realloc and free so we are more efficient than delete and new for resizing + numberOfBitsUsed = 0; + + //numberOfBitsAllocated=8; + readOffset = 0; + + //data=(unsigned char*)rakMalloc_Ex(1, _FILE_AND_LINE_); + // if (numberOfBitsAllocated>0) + // memset(data, 0, BITS_TO_BYTES(numberOfBitsAllocated)); +} + +// Write an array or casted stream +void BitStream::Write( const char* inputByteArray, const unsigned int numberOfBytes ) +{ + if (numberOfBytes==0) + return; + + // Optimization: + if ((numberOfBitsUsed & 7) == 0) + { + AddBitsAndReallocate( BYTES_TO_BITS(numberOfBytes) ); + memcpy(data+BITS_TO_BYTES(numberOfBitsUsed), inputByteArray, (size_t) numberOfBytes); + numberOfBitsUsed+=BYTES_TO_BITS(numberOfBytes); + } + else + { + WriteBits( ( unsigned char* ) inputByteArray, numberOfBytes * 8, true ); + } + +} +void BitStream::Write( BitStream *bitStream) +{ + Write(bitStream, bitStream->GetNumberOfBitsUsed()-bitStream->GetReadOffset()); +} +void BitStream::Write( BitStream *bitStream, BitSize_t numberOfBits ) +{ + AddBitsAndReallocate( numberOfBits ); + BitSize_t numberOfBitsMod8; + + if ((bitStream->GetReadOffset()&7)==0 && (numberOfBitsUsed&7)==0) + { + int readOffsetBytes=bitStream->GetReadOffset()/8; + int numBytes=numberOfBits/8; + memcpy(data + (numberOfBitsUsed >> 3), bitStream->GetData()+readOffsetBytes, numBytes); + numberOfBits-=BYTES_TO_BITS(numBytes); + bitStream->SetReadOffset(BYTES_TO_BITS(numBytes+readOffsetBytes)); + numberOfBitsUsed+=BYTES_TO_BITS(numBytes); + } + + while (numberOfBits-->0 && bitStream->readOffset + 1 <= bitStream->numberOfBitsUsed) + { + numberOfBitsMod8 = numberOfBitsUsed & 7; + if ( numberOfBitsMod8 == 0 ) + { + // New byte + if (bitStream->data[ bitStream->readOffset >> 3 ] & ( 0x80 >> ( bitStream->readOffset & 7 ) ) ) + { + // Write 1 + data[ numberOfBitsUsed >> 3 ] = 0x80; + } + else + { + // Write 0 + data[ numberOfBitsUsed >> 3 ] = 0; + } + + } + else + { + // Existing byte + if (bitStream->data[ bitStream->readOffset >> 3 ] & ( 0x80 >> ( bitStream->readOffset & 7 ) ) ) + data[ numberOfBitsUsed >> 3 ] |= 0x80 >> ( numberOfBitsMod8 ); // Set the bit to 1 + // else 0, do nothing + } + + bitStream->readOffset++; + numberOfBitsUsed++; + } +} +void BitStream::Write( BitStream &bitStream, BitSize_t numberOfBits ) +{ + Write(&bitStream, numberOfBits); +} +void BitStream::Write( BitStream &bitStream ) +{ + Write(&bitStream); +} +bool BitStream::Read( BitStream *bitStream, BitSize_t numberOfBits ) +{ + if (GetNumberOfUnreadBits() < numberOfBits) + return false; + bitStream->Write(this, numberOfBits); + return true; +} +bool BitStream::Read( BitStream *bitStream ) +{ + bitStream->Write(this); + return true; +} +bool BitStream::Read( BitStream &bitStream, BitSize_t numberOfBits ) +{ + if (GetNumberOfUnreadBits() < numberOfBits) + return false; + bitStream.Write(this, numberOfBits); + return true; +} +bool BitStream::Read( BitStream &bitStream ) +{ + bitStream.Write(this); + return true; +} + +// Read an array or casted stream +bool BitStream::Read( char* outByteArray, const unsigned int numberOfBytes ) +{ + // Optimization: + if ((readOffset & 7) == 0) + { + if ( readOffset + ( numberOfBytes << 3 ) > numberOfBitsUsed ) + return false; + + // Write the data + memcpy( outByteArray, data + ( readOffset >> 3 ), (size_t) numberOfBytes ); + + readOffset += numberOfBytes << 3; + return true; + } + else + { + return ReadBits( ( unsigned char* ) outByteArray, numberOfBytes * 8 ); + } +} + +// Sets the read pointer back to the beginning of your data. +void BitStream::ResetReadPointer( void ) +{ + readOffset = 0; +} + +// Sets the write pointer back to the beginning of your data. +void BitStream::ResetWritePointer( void ) +{ + numberOfBitsUsed = 0; +} + +// Write a 0 +void BitStream::Write0( void ) +{ + AddBitsAndReallocate( 1 ); + + // New bytes need to be zeroed + if ( ( numberOfBitsUsed & 7 ) == 0 ) + data[ numberOfBitsUsed >> 3 ] = 0; + + numberOfBitsUsed++; +} + +// Write a 1 +void BitStream::Write1( void ) +{ + AddBitsAndReallocate( 1 ); + + BitSize_t numberOfBitsMod8 = numberOfBitsUsed & 7; + + if ( numberOfBitsMod8 == 0 ) + data[ numberOfBitsUsed >> 3 ] = 0x80; + else + data[ numberOfBitsUsed >> 3 ] |= 0x80 >> ( numberOfBitsMod8 ); // Set the bit to 1 + + numberOfBitsUsed++; +} + +// Returns true if the next data read is a 1, false if it is a 0 +bool BitStream::ReadBit( void ) +{ + bool result = ( data[ readOffset >> 3 ] & ( 0x80 >> ( readOffset & 7 ) ) ) !=0; + readOffset++; + return result; +} + +// Align the bitstream to the byte boundary and then write the specified number of bits. +// This is faster than WriteBits but wastes the bits to do the alignment and requires you to call +// SetReadToByteAlignment at the corresponding read position +void BitStream::WriteAlignedBytes( const unsigned char* inByteArray, const unsigned int numberOfBytesToWrite ) +{ + AlignWriteToByteBoundary(); + Write((const char*) inByteArray, numberOfBytesToWrite); +} +void BitStream::EndianSwapBytes( int byteOffset, int length ) +{ + if (DoEndianSwap()) + { + ReverseBytesInPlace(data+byteOffset, length); + } +} +/// Aligns the bitstream, writes inputLength, and writes input. Won't write beyond maxBytesToWrite +void BitStream::WriteAlignedBytesSafe( const char *inByteArray, const unsigned int inputLength, const unsigned int maxBytesToWrite ) +{ + if (inByteArray==0 || inputLength==0) + { + WriteCompressed((unsigned int)0); + return; + } + WriteCompressed(inputLength); + WriteAlignedBytes((const unsigned char*) inByteArray, inputLength < maxBytesToWrite ? inputLength : maxBytesToWrite); +} + +// Read bits, starting at the next aligned bits. Note that the modulus 8 starting offset of the +// sequence must be the same as was used with WriteBits. This will be a problem with packet coalescence +// unless you byte align the coalesced packets. +bool BitStream::ReadAlignedBytes( unsigned char* inOutByteArray, const unsigned int numberOfBytesToRead ) +{ +#ifdef _DEBUG + RakAssert( numberOfBytesToRead > 0 ); +#endif + + if ( numberOfBytesToRead <= 0 ) + return false; + + // Byte align + AlignReadToByteBoundary(); + + if ( readOffset + ( numberOfBytesToRead << 3 ) > numberOfBitsUsed ) + return false; + + // Write the data + memcpy( inOutByteArray, data + ( readOffset >> 3 ), (size_t) numberOfBytesToRead ); + + readOffset += numberOfBytesToRead << 3; + + return true; +} +bool BitStream::ReadAlignedBytesSafe( char *inOutByteArray, int &inputLength, const int maxBytesToRead ) +{ + return ReadAlignedBytesSafe(inOutByteArray,(unsigned int&) inputLength,(unsigned int)maxBytesToRead); +} +bool BitStream::ReadAlignedBytesSafe( char *inOutByteArray, unsigned int &inputLength, const unsigned int maxBytesToRead ) +{ + if (ReadCompressed(inputLength)==false) + return false; + if (inputLength > maxBytesToRead) + inputLength=maxBytesToRead; + if (inputLength==0) + return true; + return ReadAlignedBytes((unsigned char*) inOutByteArray, inputLength); +} +bool BitStream::ReadAlignedBytesSafeAlloc( char **outByteArray, int &inputLength, const unsigned int maxBytesToRead ) +{ + return ReadAlignedBytesSafeAlloc(outByteArray,(unsigned int&) inputLength, maxBytesToRead); +} +bool BitStream::ReadAlignedBytesSafeAlloc( char ** outByteArray, unsigned int &inputLength, const unsigned int maxBytesToRead ) +{ + rakFree_Ex(*outByteArray, _FILE_AND_LINE_ ); + *outByteArray=0; + if (ReadCompressed(inputLength)==false) + return false; + if (inputLength > maxBytesToRead) + inputLength=maxBytesToRead; + if (inputLength==0) + return true; + *outByteArray = (char*) rakMalloc_Ex( (size_t) inputLength, _FILE_AND_LINE_ ); + return ReadAlignedBytes((unsigned char*) *outByteArray, inputLength); +} + +// Write numberToWrite bits from the input source +void BitStream::WriteBits( const unsigned char* inByteArray, BitSize_t numberOfBitsToWrite, const bool rightAlignedBits ) +{ +// if (numberOfBitsToWrite<=0) +// return; + + AddBitsAndReallocate( numberOfBitsToWrite ); + + const BitSize_t numberOfBitsUsedMod8 = numberOfBitsUsed & 7; + + // If currently aligned and numberOfBits is a multiple of 8, just memcpy for speed + if (numberOfBitsUsedMod8==0 && (numberOfBitsToWrite&7)==0) + { + memcpy( data + ( numberOfBitsUsed >> 3 ), inByteArray, numberOfBitsToWrite>>3); + numberOfBitsUsed+=numberOfBitsToWrite; + return; + } + + unsigned char dataByte; + const unsigned char* inputPtr=inByteArray; + + // Faster to put the while at the top surprisingly enough + while ( numberOfBitsToWrite > 0 ) + //do + { + dataByte = *( inputPtr++ ); + + if ( numberOfBitsToWrite < 8 && rightAlignedBits ) // rightAlignedBits means in the case of a partial byte, the bits are aligned from the right (bit 0) rather than the left (as in the normal internal representation) + dataByte <<= 8 - numberOfBitsToWrite; // shift left to get the bits on the left, as in our internal representation + + // Writing to a new byte each time + if ( numberOfBitsUsedMod8 == 0 ) + * ( data + ( numberOfBitsUsed >> 3 ) ) = dataByte; + else + { + // Copy over the new data. + *( data + ( numberOfBitsUsed >> 3 ) ) |= dataByte >> ( numberOfBitsUsedMod8 ); // First half + + if ( 8 - ( numberOfBitsUsedMod8 ) < 8 && 8 - ( numberOfBitsUsedMod8 ) < numberOfBitsToWrite ) // If we didn't write it all out in the first half (8 - (numberOfBitsUsed%8) is the number we wrote in the first half) + { + *( data + ( numberOfBitsUsed >> 3 ) + 1 ) = (unsigned char) ( dataByte << ( 8 - ( numberOfBitsUsedMod8 ) ) ); // Second half (overlaps byte boundary) + } + } + + if ( numberOfBitsToWrite >= 8 ) + { + numberOfBitsUsed += 8; + numberOfBitsToWrite -= 8; + } + else + { + numberOfBitsUsed += numberOfBitsToWrite; + numberOfBitsToWrite=0; + } + } + // } while(numberOfBitsToWrite>0); +} + +// Set the stream to some initial data. For internal use +void BitStream::SetData( unsigned char *inByteArray ) +{ + data=inByteArray; + copyData=false; +} + +// Assume the input source points to a native type, compress and write it +void BitStream::WriteCompressed( const unsigned char* inByteArray, + const unsigned int size, const bool unsignedData ) +{ + BitSize_t currentByte = ( size >> 3 ) - 1; // PCs + + unsigned char byteMatch; + + if ( unsignedData ) + { + byteMatch = 0; + } + + else + { + byteMatch = 0xFF; + } + + // Write upper bytes with a single 1 + // From high byte to low byte, if high byte is a byteMatch then write a 1 bit. Otherwise write a 0 bit and then write the remaining bytes + while ( currentByte > 0 ) + { + if ( inByteArray[ currentByte ] == byteMatch ) // If high byte is byteMatch (0 of 0xff) then it would have the same value shifted + { + bool b = true; + Write( b ); + } + else + { + // Write the remainder of the data after writing 0 + bool b = false; + Write( b ); + + WriteBits( inByteArray, ( currentByte + 1 ) << 3, true ); + // currentByte--; + + + return ; + } + + currentByte--; + } + + // If the upper half of the last byte is a 0 (positive) or 16 (negative) then write a 1 and the remaining 4 bits. Otherwise write a 0 and the 8 bites. + if ( ( unsignedData && ( ( *( inByteArray + currentByte ) ) & 0xF0 ) == 0x00 ) || + ( unsignedData == false && ( ( *( inByteArray + currentByte ) ) & 0xF0 ) == 0xF0 ) ) + { + bool b = true; + Write( b ); + WriteBits( inByteArray + currentByte, 4, true ); + } + + else + { + bool b = false; + Write( b ); + WriteBits( inByteArray + currentByte, 8, true ); + } +} + +// Read numberOfBitsToRead bits to the output source +// alignBitsToRight should be set to true to convert internal bitstream data to userdata +// It should be false if you used WriteBits with rightAlignedBits false +bool BitStream::ReadBits( unsigned char *inOutByteArray, BitSize_t numberOfBitsToRead, const bool alignBitsToRight ) +{ +#ifdef _DEBUG + // RakAssert( numberOfBitsToRead > 0 ); +#endif + if (numberOfBitsToRead<=0) + return false; + + if ( readOffset + numberOfBitsToRead > numberOfBitsUsed ) + return false; + + + const BitSize_t readOffsetMod8 = readOffset & 7; + + // If currently aligned and numberOfBits is a multiple of 8, just memcpy for speed + if (readOffsetMod8==0 && (numberOfBitsToRead&7)==0) + { + memcpy( inOutByteArray, data + ( readOffset >> 3 ), numberOfBitsToRead>>3); + readOffset+=numberOfBitsToRead; + return true; + } + + + + BitSize_t offset = 0; + + memset( inOutByteArray, 0, (size_t) BITS_TO_BYTES( numberOfBitsToRead ) ); + + while ( numberOfBitsToRead > 0 ) + { + *( inOutByteArray + offset ) |= *( data + ( readOffset >> 3 ) ) << ( readOffsetMod8 ); // First half + + if ( readOffsetMod8 > 0 && numberOfBitsToRead > 8 - ( readOffsetMod8 ) ) // If we have a second half, we didn't read enough bytes in the first half + *( inOutByteArray + offset ) |= *( data + ( readOffset >> 3 ) + 1 ) >> ( 8 - ( readOffsetMod8 ) ); // Second half (overlaps byte boundary) + + if (numberOfBitsToRead>=8) + { + numberOfBitsToRead -= 8; + readOffset += 8; + offset++; + } + else + { + int neg = (int) numberOfBitsToRead - 8; + + if ( neg < 0 ) // Reading a partial byte for the last byte, shift right so the data is aligned on the right + { + + if ( alignBitsToRight ) + * ( inOutByteArray + offset ) >>= -neg; + + readOffset += 8 + neg; + } + else + readOffset += 8; + + offset++; + + numberOfBitsToRead=0; + } + } + + return true; +} + +// Assume the input source points to a compressed native type. Decompress and read it +bool BitStream::ReadCompressed( unsigned char* inOutByteArray, + const unsigned int size, const bool unsignedData ) +{ + unsigned int currentByte = ( size >> 3 ) - 1; + + + unsigned char byteMatch, halfByteMatch; + + if ( unsignedData ) + { + byteMatch = 0; + halfByteMatch = 0; + } + + else + { + byteMatch = 0xFF; + halfByteMatch = 0xF0; + } + + // Upper bytes are specified with a single 1 if they match byteMatch + // From high byte to low byte, if high byte is a byteMatch then write a 1 bit. Otherwise write a 0 bit and then write the remaining bytes + while ( currentByte > 0 ) + { + // If we read a 1 then the data is byteMatch. + + bool b; + + if ( Read( b ) == false ) + return false; + + if ( b ) // Check that bit + { + inOutByteArray[ currentByte ] = byteMatch; + currentByte--; + } + else + { + // Read the rest of the bytes + + if ( ReadBits( inOutByteArray, ( currentByte + 1 ) << 3 ) == false ) + return false; + + return true; + } + } + + // All but the first bytes are byteMatch. If the upper half of the last byte is a 0 (positive) or 16 (negative) then what we read will be a 1 and the remaining 4 bits. + // Otherwise we read a 0 and the 8 bytes + //RakAssert(readOffset+1 <=numberOfBitsUsed); // If this assert is hit the stream wasn't long enough to read from + if ( readOffset + 1 > numberOfBitsUsed ) + return false; + + bool b=false; + + if ( Read( b ) == false ) + return false; + + if ( b ) // Check that bit + { + + if ( ReadBits( inOutByteArray + currentByte, 4 ) == false ) + return false; + + inOutByteArray[ currentByte ] |= halfByteMatch; // We have to set the high 4 bits since these are set to 0 by ReadBits + } + else + { + if ( ReadBits( inOutByteArray + currentByte, 8 ) == false ) + return false; + } + + return true; +} + +// Reallocates (if necessary) in preparation of writing numberOfBitsToWrite +void BitStream::AddBitsAndReallocate( const BitSize_t numberOfBitsToWrite ) +{ + BitSize_t newNumberOfBitsAllocated = numberOfBitsToWrite + numberOfBitsUsed; + + if ( numberOfBitsToWrite + numberOfBitsUsed > 0 && ( ( numberOfBitsAllocated - 1 ) >> 3 ) < ( ( newNumberOfBitsAllocated - 1 ) >> 3 ) ) // If we need to allocate 1 or more new bytes + { +#ifdef _DEBUG + // If this assert hits then we need to specify true for the third parameter in the constructor + // It needs to reallocate to hold all the data and can't do it unless we allocated to begin with + // Often hits if you call Write or Serialize on a read-only bitstream + RakAssert( copyData == true ); +#endif + + // Less memory efficient but saves on news and deletes + /// Cap to 1 meg buffer to save on huge allocations + newNumberOfBitsAllocated = ( numberOfBitsToWrite + numberOfBitsUsed ) * 2; + if (newNumberOfBitsAllocated - ( numberOfBitsToWrite + numberOfBitsUsed ) > 1048576 ) + newNumberOfBitsAllocated = numberOfBitsToWrite + numberOfBitsUsed + 1048576; + + // BitSize_t newByteOffset = BITS_TO_BYTES( numberOfBitsAllocated ); + // Use realloc and free so we are more efficient than delete and new for resizing + BitSize_t amountToAllocate = BITS_TO_BYTES( newNumberOfBitsAllocated ); + if (data==(unsigned char*)stackData) + { + if (amountToAllocate > BITSTREAM_STACK_ALLOCATION_SIZE) + { + data = ( unsigned char* ) rakMalloc_Ex( (size_t) amountToAllocate, _FILE_AND_LINE_ ); + RakAssert(data); + + // need to copy the stack data over to our new memory area too + memcpy ((void *)data, (void *)stackData, (size_t) BITS_TO_BYTES( numberOfBitsAllocated )); + } + } + else + { + data = ( unsigned char* ) rakRealloc_Ex( data, (size_t) amountToAllocate, _FILE_AND_LINE_ ); + } + +#ifdef _DEBUG + RakAssert( data ); // Make sure realloc succeeded +#endif + // memset(data+newByteOffset, 0, ((newNumberOfBitsAllocated-1)>>3) - ((numberOfBitsAllocated-1)>>3)); // Set the new data block to 0 + } + + if ( newNumberOfBitsAllocated > numberOfBitsAllocated ) + numberOfBitsAllocated = newNumberOfBitsAllocated; +} +BitSize_t BitStream::GetNumberOfBitsAllocated(void) const +{ + return numberOfBitsAllocated; +} +void BitStream::PadWithZeroToByteLength( unsigned int bytes ) +{ + if (GetNumberOfBytesUsed() < bytes) + { + AlignWriteToByteBoundary(); + unsigned int numToWrite = bytes - GetNumberOfBytesUsed(); + AddBitsAndReallocate( BYTES_TO_BITS(numToWrite) ); + memset(data+BITS_TO_BYTES(numberOfBitsUsed), 0, (size_t) numToWrite); + numberOfBitsUsed+=BYTES_TO_BITS(numToWrite); + } +} + +/* +// Julius Goryavsky's version of Harley's algorithm. +// 17 elementary ops plus an indexed load, if the machine +// has "and not." + +int nlz10b(unsigned x) { + + static char table[64] = + {32,20,19, u, u,18, u, 7, 10,17, u, u,14, u, 6, u, + u, 9, u,16, u, u, 1,26, u,13, u, u,24, 5, u, u, + u,21, u, 8,11, u,15, u, u, u, u, 2,27, 0,25, u, + 22, u,12, u, u, 3,28, u, 23, u, 4,29, u, u,30,31}; + + x = x | (x >> 1); // Propagate leftmost + x = x | (x >> 2); // 1-bit to the right. + x = x | (x >> 4); + x = x | (x >> 8); + x = x & ~(x >> 16); + x = x*0xFD7049FF; // Activate this line or the following 3. +// x = (x << 9) - x; // Multiply by 511. +// x = (x << 11) - x; // Multiply by 2047. +// x = (x << 14) - x; // Multiply by 16383. + return table[x >> 26]; +} +*/ +int BitStream::NumberOfLeadingZeroes( int8_t x ) {return NumberOfLeadingZeroes((uint8_t)x);} +int BitStream::NumberOfLeadingZeroes( uint8_t x ) +{ + uint8_t y; + int n; + + n = 8; + y = x >> 4; if (y != 0) {n = n - 4; x = y;} + y = x >> 2; if (y != 0) {n = n - 2; x = y;} + y = x >> 1; if (y != 0) return n - 2; + return (int)(n - x); +} +int BitStream::NumberOfLeadingZeroes( int16_t x ) {return NumberOfLeadingZeroes((uint16_t)x);} +int BitStream::NumberOfLeadingZeroes( uint16_t x ) +{ + uint16_t y; + int n; + + n = 16; + y = x >> 8; if (y != 0) {n = n - 8; x = y;} + y = x >> 4; if (y != 0) {n = n - 4; x = y;} + y = x >> 2; if (y != 0) {n = n - 2; x = y;} + y = x >> 1; if (y != 0) return n - 2; + return (int)(n - x); +} +int BitStream::NumberOfLeadingZeroes( int32_t x ) {return NumberOfLeadingZeroes((uint32_t)x);} +int BitStream::NumberOfLeadingZeroes( uint32_t x ) +{ + uint32_t y; + int n; + + n = 32; + y = x >>16; if (y != 0) {n = n -16; x = y;} + y = x >> 8; if (y != 0) {n = n - 8; x = y;} + y = x >> 4; if (y != 0) {n = n - 4; x = y;} + y = x >> 2; if (y != 0) {n = n - 2; x = y;} + y = x >> 1; if (y != 0) return n - 2; + return (int)(n - x); +} +int BitStream::NumberOfLeadingZeroes( int64_t x ) {return NumberOfLeadingZeroes((uint64_t)x);} +int BitStream::NumberOfLeadingZeroes( uint64_t x ) +{ + uint64_t y; + int n; + + n = 64; + y = x >>32; if (y != 0) {n = n -32; x = y;} + y = x >>16; if (y != 0) {n = n -16; x = y;} + y = x >> 8; if (y != 0) {n = n - 8; x = y;} + y = x >> 4; if (y != 0) {n = n - 4; x = y;} + y = x >> 2; if (y != 0) {n = n - 2; x = y;} + y = x >> 1; if (y != 0) return n - 2; + return (int)(n - x); +} + +// Should hit if reads didn't match writes +void BitStream::AssertStreamEmpty( void ) +{ + RakAssert( readOffset == numberOfBitsUsed ); +} +void BitStream::PrintBits( char *out ) const +{ + if ( numberOfBitsUsed <= 0 ) + { + strcpy(out, "No bits\n" ); + return; + } + + unsigned int strIndex=0; + for ( BitSize_t counter = 0; counter < BITS_TO_BYTES( numberOfBitsUsed ) && strIndex < 2000 ; counter++ ) + { + BitSize_t stop; + + if ( counter == ( numberOfBitsUsed - 1 ) >> 3 ) + stop = 8 - ( ( ( numberOfBitsUsed - 1 ) & 7 ) + 1 ); + else + stop = 0; + + for ( BitSize_t counter2 = 7; counter2 >= stop; counter2-- ) + { + if ( ( data[ counter ] >> counter2 ) & 1 ) + out[strIndex++]='1'; + else + out[strIndex++]='0'; + + if (counter2==0) + break; + } + + out[strIndex++]=' '; + } + + out[strIndex++]='\n'; + + out[strIndex++]=0; +} +void BitStream::PrintBits( void ) const +{ + char out[2048]; + PrintBits(out); + RAKNET_DEBUG_PRINTF("%s", out); +} +void BitStream::PrintHex( char *out ) const +{ + BitSize_t i; + for ( i=0; i < GetNumberOfBytesUsed(); i++) + { + sprintf(out+i*3, "%02x ", data[i]); + } +} +void BitStream::PrintHex( void ) const +{ + char out[2048]; + PrintHex(out); + RAKNET_DEBUG_PRINTF("%s", out); +} + +// Exposes the data for you to look at, like PrintBits does. +// Data will point to the stream. Returns the length in bits of the stream. +BitSize_t BitStream::CopyData( unsigned char** _data ) const +{ +#ifdef _DEBUG + RakAssert( numberOfBitsUsed > 0 ); +#endif + + *_data = (unsigned char*) rakMalloc_Ex( (size_t) BITS_TO_BYTES( numberOfBitsUsed ), _FILE_AND_LINE_ ); + memcpy( *_data, data, sizeof(unsigned char) * (size_t) ( BITS_TO_BYTES( numberOfBitsUsed ) ) ); + return numberOfBitsUsed; +} + +// Ignore data we don't intend to read +void BitStream::IgnoreBits( const BitSize_t numberOfBits ) +{ + readOffset += numberOfBits; +} + +void BitStream::IgnoreBytes( const unsigned int numberOfBytes ) +{ + IgnoreBits(BYTES_TO_BITS(numberOfBytes)); +} + +// Move the write pointer to a position on the array. Dangerous if you don't know what you are doing! +// Doesn't work with non-aligned data! +void BitStream::SetWriteOffset( const BitSize_t offset ) +{ + numberOfBitsUsed = offset; +} + +/* +BitSize_t BitStream::GetWriteOffset( void ) const +{ +return numberOfBitsUsed; +} + +// Returns the length in bits of the stream +BitSize_t BitStream::GetNumberOfBitsUsed( void ) const +{ +return GetWriteOffset(); +} + +// Returns the length in bytes of the stream +BitSize_t BitStream::GetNumberOfBytesUsed( void ) const +{ +return BITS_TO_BYTES( numberOfBitsUsed ); +} + +// Returns the number of bits into the stream that we have read +BitSize_t BitStream::GetReadOffset( void ) const +{ +return readOffset; +} + + +// Sets the read bit index +void BitStream::SetReadOffset( const BitSize_t newReadOffset ) +{ +readOffset=newReadOffset; +} + +// Returns the number of bits left in the stream that haven't been read +BitSize_t BitStream::GetNumberOfUnreadBits( void ) const +{ +return numberOfBitsUsed - readOffset; +} +// Exposes the internal data +unsigned char* BitStream::GetData( void ) const +{ +return data; +} + +*/ +// If we used the constructor version with copy data off, this makes sure it is set to on and the data pointed to is copied. +void BitStream::AssertCopyData( void ) +{ + if ( copyData == false ) + { + copyData = true; + + if ( numberOfBitsAllocated > 0 ) + { + unsigned char * newdata = ( unsigned char* ) rakMalloc_Ex( (size_t) BITS_TO_BYTES( numberOfBitsAllocated ), _FILE_AND_LINE_ ); +#ifdef _DEBUG + + RakAssert( data ); +#endif + + memcpy( newdata, data, (size_t) BITS_TO_BYTES( numberOfBitsAllocated ) ); + data = newdata; + } + + else + data = 0; + } +} +bool BitStream::IsNetworkOrderInternal(void) +{ + + + + + + static const bool isNetworkOrder=(htonl(12345) == 12345); + return isNetworkOrder; + +} +void BitStream::ReverseBytes(unsigned char *inByteArray, unsigned char *inOutByteArray, const unsigned int length) +{ + for (BitSize_t i=0; i < length; i++) + inOutByteArray[i]=inByteArray[length-i-1]; +} +void BitStream::ReverseBytesInPlace(unsigned char *inOutData,const unsigned int length) +{ + unsigned char temp; + BitSize_t i; + for (i=0; i < (length>>1); i++) + { + temp = inOutData[i]; + inOutData[i]=inOutData[length-i-1]; + inOutData[length-i-1]=temp; + } +} + +bool BitStream::Read(char *varString) +{ + return RakString::Deserialize(varString,this); +} +bool BitStream::Read(unsigned char *varString) +{ + return RakString::Deserialize((char*) varString,this); +} +void BitStream::WriteAlignedVar8(const char *inByteArray) +{ + RakAssert((numberOfBitsUsed&7)==0); + AddBitsAndReallocate(1*8); + data[( numberOfBitsUsed >> 3 ) + 0] = inByteArray[0]; + numberOfBitsUsed+=1*8; +} +bool BitStream::ReadAlignedVar8(char *inOutByteArray) +{ + RakAssert((readOffset&7)==0); + if ( readOffset + 1*8 > numberOfBitsUsed ) + return false; + + inOutByteArray[0] = data[( readOffset >> 3 ) + 0]; + readOffset+=1*8; + return true; +} +void BitStream::WriteAlignedVar16(const char *inByteArray) +{ + RakAssert((numberOfBitsUsed&7)==0); + AddBitsAndReallocate(2*8); +#ifndef __BITSTREAM_NATIVE_END + if (DoEndianSwap()) + { + data[( numberOfBitsUsed >> 3 ) + 0] = inByteArray[1]; + data[( numberOfBitsUsed >> 3 ) + 1] = inByteArray[0]; + } + else +#endif + { + data[( numberOfBitsUsed >> 3 ) + 0] = inByteArray[0]; + data[( numberOfBitsUsed >> 3 ) + 1] = inByteArray[1]; + } + + numberOfBitsUsed+=2*8; +} +bool BitStream::ReadAlignedVar16(char *inOutByteArray) +{ + RakAssert((readOffset&7)==0); + if ( readOffset + 2*8 > numberOfBitsUsed ) + return false; +#ifndef __BITSTREAM_NATIVE_END + if (DoEndianSwap()) + { + inOutByteArray[0] = data[( readOffset >> 3 ) + 1]; + inOutByteArray[1] = data[( readOffset >> 3 ) + 0]; + } + else +#endif + { + inOutByteArray[0] = data[( readOffset >> 3 ) + 0]; + inOutByteArray[1] = data[( readOffset >> 3 ) + 1]; + } + + readOffset+=2*8; + return true; +} +void BitStream::WriteAlignedVar32(const char *inByteArray) +{ + RakAssert((numberOfBitsUsed&7)==0); + AddBitsAndReallocate(4*8); +#ifndef __BITSTREAM_NATIVE_END + if (DoEndianSwap()) + { + data[( numberOfBitsUsed >> 3 ) + 0] = inByteArray[3]; + data[( numberOfBitsUsed >> 3 ) + 1] = inByteArray[2]; + data[( numberOfBitsUsed >> 3 ) + 2] = inByteArray[1]; + data[( numberOfBitsUsed >> 3 ) + 3] = inByteArray[0]; + } + else +#endif + { + data[( numberOfBitsUsed >> 3 ) + 0] = inByteArray[0]; + data[( numberOfBitsUsed >> 3 ) + 1] = inByteArray[1]; + data[( numberOfBitsUsed >> 3 ) + 2] = inByteArray[2]; + data[( numberOfBitsUsed >> 3 ) + 3] = inByteArray[3]; + } + + numberOfBitsUsed+=4*8; +} +bool BitStream::ReadAlignedVar32(char *inOutByteArray) +{ + RakAssert((readOffset&7)==0); + if ( readOffset + 4*8 > numberOfBitsUsed ) + return false; +#ifndef __BITSTREAM_NATIVE_END + if (DoEndianSwap()) + { + inOutByteArray[0] = data[( readOffset >> 3 ) + 3]; + inOutByteArray[1] = data[( readOffset >> 3 ) + 2]; + inOutByteArray[2] = data[( readOffset >> 3 ) + 1]; + inOutByteArray[3] = data[( readOffset >> 3 ) + 0]; + } + else +#endif + { + inOutByteArray[0] = data[( readOffset >> 3 ) + 0]; + inOutByteArray[1] = data[( readOffset >> 3 ) + 1]; + inOutByteArray[2] = data[( readOffset >> 3 ) + 2]; + inOutByteArray[3] = data[( readOffset >> 3 ) + 3]; + } + + readOffset+=4*8; + return true; +} +bool BitStream::ReadFloat16( float &outFloat, float floatMin, float floatMax ) +{ + unsigned short percentile; + if (Read(percentile)) + { + RakAssert(floatMax>floatMin); + outFloat = floatMin + ((float) percentile / 65535.0f) * (floatMax-floatMin); + if (outFloatfloatMax) + outFloat=floatMax; + return true; + } + return false; +} +bool BitStream::SerializeFloat16(bool writeToBitstream, float &inOutFloat, float floatMin, float floatMax) +{ + if (writeToBitstream) + WriteFloat16(inOutFloat, floatMin, floatMax); + else + return ReadFloat16(inOutFloat, floatMin, floatMax); + return true; +} +void BitStream::WriteFloat16( float inOutFloat, float floatMin, float floatMax ) +{ + RakAssert(floatMax>floatMin); + if (inOutFloat>floatMax+.001) + { + RakAssert(inOutFloat<=floatMax+.001); + } + if (inOutFloat=floatMin-.001); + } + float percentile=65535.0f * (inOutFloat-floatMin)/(floatMax-floatMin); + if (percentile<0.0) + percentile=0.0; + if (percentile>65535.0f) + percentile=65535.0f; + Write((unsigned short)percentile); +} + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + +#endif // #if _MSC_VER < 1299 diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/BitStream.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/BitStream.h new file mode 100644 index 0000000..0614a2c --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/BitStream.h @@ -0,0 +1,2032 @@ +/// \file BitStream.h +/// \brief This class allows you to write and read native types as a string of bits. +/// \details BitStream is used extensively throughout RakNet and is designed to be used by users as well. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. +/// + +#if defined(_MSC_VER) && _MSC_VER < 1299 // VC6 doesn't support template specialization +#include "BitStream_NoTemplate.h" +#else + +#ifndef __BITSTREAM_H +#define __BITSTREAM_H + +#include "RakMemoryOverride.h" +#include "RakNetDefines.h" +#include "Export.h" +#include "RakNetTypes.h" +#include "RakString.h" +#include "RakWString.h" +#include "RakAssert.h" +#include +#include + +#ifdef _MSC_VER +#pragma warning( push ) +#endif + +// MSWin uses _copysign, others use copysign... +#ifndef _WIN32 +#define _copysign copysign +#endif + +namespace RakNet +{ + /// This class allows you to write and read native types as a string of bits. BitStream is used extensively throughout RakNet and is designed to be used by users as well. + /// \sa BitStreamSample.txt + class RAK_DLL_EXPORT BitStream + { + + public: + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(BitStream) + + /// Default Constructor + BitStream(); + + /// \brief Create the bitstream, with some number of bytes to immediately allocate. + /// \details There is no benefit to calling this, unless you know exactly how many bytes you need and it is greater than BITSTREAM_STACK_ALLOCATION_SIZE. + /// In that case all it does is save you one or more realloc calls. + /// \param[in] initialBytesToAllocate the number of bytes to pre-allocate. + BitStream( const unsigned int initialBytesToAllocate ); + + /// \brief Initialize the BitStream, immediately setting the data it contains to a predefined pointer. + /// \details Set \a _copyData to true if you want to make an internal copy of the data you are passing. Set it to false to just save a pointer to the data. + /// You shouldn't call Write functions with \a _copyData as false, as this will write to unallocated memory + /// 99% of the time you will use this function to cast Packet::data to a bitstream for reading, in which case you should write something as follows: + /// \code + /// RakNet::BitStream bs(packet->data, packet->length, false); + /// \endcode + /// \param[in] _data An array of bytes. + /// \param[in] lengthInBytes Size of the \a _data. + /// \param[in] _copyData true or false to make a copy of \a _data or not. + BitStream( unsigned char* _data, const unsigned int lengthInBytes, bool _copyData ); + + // Destructor + ~BitStream(); + + /// Resets the bitstream for reuse. + void Reset( void ); + + /// \brief Bidirectional serialize/deserialize any integral type to/from a bitstream. + /// \details Undefine __BITSTREAM_NATIVE_END if you need endian swapping. + /// \param[in] writeToBitstream true to write from your data to this bitstream. False to read from this bitstream and write to your data + /// \param[in] inOutTemplateVar The value to write + /// \return true if \a writeToBitstream is true. true if \a writeToBitstream is false and the read was successful. false if \a writeToBitstream is false and the read was not successful. + template + bool Serialize(bool writeToBitstream, templateType &inOutTemplateVar); + + /// \brief Bidirectional serialize/deserialize any integral type to/from a bitstream. + /// \details If the current value is different from the last value + /// the current value will be written. Otherwise, a single bit will be written + /// \param[in] writeToBitstream true to write from your data to this bitstream. False to read from this bitstream and write to your data + /// \param[in] inOutCurrentValue The current value to write + /// \param[in] lastValue The last value to compare against. Only used if \a writeToBitstream is true. + /// \return true if \a writeToBitstream is true. true if \a writeToBitstream is false and the read was successful. false if \a writeToBitstream is false and the read was not successful. + template + bool SerializeDelta(bool writeToBitstream, templateType &inOutCurrentValue, const templateType &lastValue); + + /// \brief Bidirectional version of SerializeDelta when you don't know what the last value is, or there is no last value. + /// \param[in] writeToBitstream true to write from your data to this bitstream. False to read from this bitstream and write to your data + /// \param[in] inOutCurrentValue The current value to write + /// \return true if \a writeToBitstream is true. true if \a writeToBitstream is false and the read was successful. false if \a writeToBitstream is false and the read was not successful. + template + bool SerializeDelta(bool writeToBitstream, templateType &inOutCurrentValue); + + /// \brief Bidirectional serialize/deserialize any integral type to/from a bitstream. + /// \details Undefine __BITSTREAM_NATIVE_END if you need endian swapping. + /// If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte + /// For floating point, this is lossy, using 2 bytes for a float and 4 for a double. The range must be between -1 and +1. + /// For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type + /// \param[in] writeToBitstream true to write from your data to this bitstream. False to read from this bitstream and write to your data + /// \param[in] inOutTemplateVar The value to write + /// \return true if \a writeToBitstream is true. true if \a writeToBitstream is false and the read was successful. false if \a writeToBitstream is false and the read was not successful. + template + bool SerializeCompressed(bool writeToBitstream, templateType &inOutTemplateVar); + + /// \brief Bidirectional serialize/deserialize any integral type to/from a bitstream. + /// \details If the current value is different from the last value + /// the current value will be written. Otherwise, a single bit will be written + /// For floating point, this is lossy, using 2 bytes for a float and 4 for a double. The range must be between -1 and +1. + /// For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type + /// If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte + /// \param[in] writeToBitstream true to write from your data to this bitstream. False to read from this bitstream and write to your data + /// \param[in] inOutCurrentValue The current value to write + /// \param[in] lastValue The last value to compare against. Only used if \a writeToBitstream is true. + /// \return true if \a writeToBitstream is true. true if \a writeToBitstream is false and the read was successful. false if \a writeToBitstream is false and the read was not successful. + template + bool SerializeCompressedDelta(bool writeToBitstream, templateType &inOutCurrentValue, const templateType &lastValue); + + /// \brief Save as SerializeCompressedDelta(templateType ¤tValue, const templateType &lastValue) when we have an unknown second parameter + /// \return true on data read. False on insufficient data in bitstream + template + bool SerializeCompressedDelta(bool writeToBitstream, templateType &inOutTemplateVar); + + /// \brief Bidirectional serialize/deserialize an array or casted stream or raw data. This does NOT do endian swapping. + /// \param[in] writeToBitstream true to write from your data to this bitstream. False to read from this bitstream and write to your data + /// \param[in] inOutByteArray a byte buffer + /// \param[in] numberOfBytes the size of \a input in bytes + /// \return true if \a writeToBitstream is true. true if \a writeToBitstream is false and the read was successful. false if \a writeToBitstream is false and the read was not successful. + bool Serialize(bool writeToBitstream, char* inOutByteArray, const unsigned int numberOfBytes ); + + /// \brief Serialize a float into 2 bytes, spanning the range between \a floatMin and \a floatMax + /// \param[in] writeToBitstream true to write from your data to this bitstream. False to read from this bitstream and write to your data + /// \param[in] inOutFloat The float to write + /// \param[in] floatMin Predetermined minimum value of f + /// \param[in] floatMax Predetermined maximum value of f + bool SerializeFloat16(bool writeToBitstream, float &inOutFloat, float floatMin, float floatMax); + + /// Serialize one type casted to another (smaller) type, to save bandwidth + /// serializationType should be uint8_t, uint16_t, uint24_t, or uint32_t + /// Example: int num=53; SerializeCasted(true, num); would use 1 byte to write what would otherwise be an integer (4 or 8 bytes) + /// \param[in] writeToBitstream true to write from your data to this bitstream. False to read from this bitstream and write to your data + /// \param[in] value The value to serialize + template + bool SerializeCasted( bool writeToBitstream, sourceType &value ); + + /// Given the minimum and maximum values for an integer type, figure out the minimum number of bits to represent the range + /// Then serialize only those bits + /// \note A static is used so that the required number of bits for (maximum-minimum) is only calculated once. This does require that \a minimum and \maximum are fixed values for a given line of code for the life of the program + /// \param[in] writeToBitstream true to write from your data to this bitstream. False to read from this bitstream and write to your data + /// \param[in] value Integer value to write, which should be between \a minimum and \a maximum + /// \param[in] minimum Minimum value of \a value + /// \param[in] maximum Maximum value of \a value + /// \param[in] allowOutsideRange If true, all sends will take an extra bit, however value can deviate from outside \a minimum and \a maximum. If false, will assert if the value deviates + template + bool SerializeBitsFromIntegerRange( bool writeToBitstream, templateType &value, const templateType minimum, const templateType maximum, bool allowOutsideRange=false ); + /// \param[in] requiredBits Primarily for internal use, called from above function() after calculating number of bits needed to represent maximum-minimum + template + bool SerializeBitsFromIntegerRange( bool writeToBitstream, templateType &value, const templateType minimum, const templateType maximum, const int requiredBits, bool allowOutsideRange=false ); + + /// \brief Bidirectional serialize/deserialize a normalized 3D vector, using (at most) 4 bytes + 3 bits instead of 12-24 bytes. + /// \details Will further compress y or z axis aligned vectors. + /// Accurate to 1/32767.5. + /// \param[in] writeToBitstream true to write from your data to this bitstream. False to read from this bitstream and write to your data + /// \param[in] x x + /// \param[in] y y + /// \param[in] z z + /// \return true if \a writeToBitstream is true. true if \a writeToBitstream is false and the read was successful. false if \a writeToBitstream is false and the read was not successful. + template // templateType for this function must be a float or double + bool SerializeNormVector(bool writeToBitstream, templateType &x, templateType &y, templateType &z ); + + /// \brief Bidirectional serialize/deserialize a vector, using 10 bytes instead of 12. + /// \details Loses accuracy to about 3/10ths and only saves 2 bytes, so only use if accuracy is not important. + /// \param[in] writeToBitstream true to write from your data to this bitstream. False to read from this bitstream and write to your data + /// \param[in] x x + /// \param[in] y y + /// \param[in] z z + /// \return true if \a writeToBitstream is true. true if \a writeToBitstream is false and the read was successful. false if \a writeToBitstream is false and the read was not successful. + template // templateType for this function must be a float or double + bool SerializeVector(bool writeToBitstream, templateType &x, templateType &y, templateType &z ); + + /// \brief Bidirectional serialize/deserialize a normalized quaternion in 6 bytes + 4 bits instead of 16 bytes. Slightly lossy. + /// \param[in] writeToBitstream true to write from your data to this bitstream. False to read from this bitstream and write to your data + /// \param[in] w w + /// \param[in] x x + /// \param[in] y y + /// \param[in] z z + /// \return true if \a writeToBitstream is true. true if \a writeToBitstream is false and the read was successful. false if \a writeToBitstream is false and the read was not successful. + template // templateType for this function must be a float or double + bool SerializeNormQuat(bool writeToBitstream, templateType &w, templateType &x, templateType &y, templateType &z); + + /// \brief Bidirectional serialize/deserialize an orthogonal matrix by creating a quaternion, and writing 3 components of the quaternion in 2 bytes each. + /// \details Use 6 bytes instead of 36 + /// Lossy, although the result is renormalized + /// \return true on success, false on failure. + template // templateType for this function must be a float or double + bool SerializeOrthMatrix( + bool writeToBitstream, + templateType &m00, templateType &m01, templateType &m02, + templateType &m10, templateType &m11, templateType &m12, + templateType &m20, templateType &m21, templateType &m22 ); + + /// \brief Bidirectional serialize/deserialize numberToSerialize bits to/from the input. + /// \details Right aligned data means in the case of a partial byte, the bits are aligned + /// from the right (bit 0) rather than the left (as in the normal + /// internal representation) You would set this to true when + /// writing user data, and false when copying bitstream data, such + /// as writing one bitstream to another + /// \param[in] writeToBitstream true to write from your data to this bitstream. False to read from this bitstream and write to your data + /// \param[in] inOutByteArray The data + /// \param[in] numberOfBitsToSerialize The number of bits to write + /// \param[in] rightAlignedBits if true data will be right aligned + /// \return true if \a writeToBitstream is true. true if \a writeToBitstream is false and the read was successful. false if \a writeToBitstream is false and the read was not successful. + bool SerializeBits(bool writeToBitstream, unsigned char* inOutByteArray, const BitSize_t numberOfBitsToSerialize, const bool rightAlignedBits = true ); + + /// \brief Write any integral type to a bitstream. + /// \details Undefine __BITSTREAM_NATIVE_END if you need endian swapping. + /// \param[in] inTemplateVar The value to write + template + void Write(const templateType &inTemplateVar); + + /// \brief Write the dereferenced pointer to any integral type to a bitstream. + /// \details Undefine __BITSTREAM_NATIVE_END if you need endian swapping. + /// \param[in] inTemplateVar The value to write + template + void WritePtr(templateType *inTemplateVar); + + /// \brief Write any integral type to a bitstream. + /// \details If the current value is different from the last value + /// the current value will be written. Otherwise, a single bit will be written + /// \param[in] currentValue The current value to write + /// \param[in] lastValue The last value to compare against + template + void WriteDelta(const templateType ¤tValue, const templateType &lastValue); + + /// \brief WriteDelta when you don't know what the last value is, or there is no last value. + /// \param[in] currentValue The current value to write + template + void WriteDelta(const templateType ¤tValue); + + /// \brief Write any integral type to a bitstream. + /// \details Undefine __BITSTREAM_NATIVE_END if you need endian swapping. + /// If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte + /// For floating point, this is lossy, using 2 bytes for a float and 4 for a double. The range must be between -1 and +1. + /// For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type + /// \param[in] inTemplateVar The value to write + template + void WriteCompressed(const templateType &inTemplateVar); + + /// \brief Write any integral type to a bitstream. + /// \details If the current value is different from the last value + /// the current value will be written. Otherwise, a single bit will be written + /// For floating point, this is lossy, using 2 bytes for a float and 4 for a double. The range must be between -1 and +1. + /// For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type + /// If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte + /// \param[in] currentValue The current value to write + /// \param[in] lastValue The last value to compare against + template + void WriteCompressedDelta(const templateType ¤tValue, const templateType &lastValue); + + /// \brief Save as WriteCompressedDelta(const templateType ¤tValue, const templateType &lastValue) when we have an unknown second parameter + template + void WriteCompressedDelta(const templateType ¤tValue); + + /// \brief Read any integral type from a bitstream. + /// \details Define __BITSTREAM_NATIVE_END if you need endian swapping. + /// \param[in] outTemplateVar The value to read + /// \return true on success, false on failure. + template + bool Read(templateType &outTemplateVar); + + /// \brief Read any integral type from a bitstream. + /// \details If the written value differed from the value compared against in the write function, + /// var will be updated. Otherwise it will retain the current value. + /// ReadDelta is only valid from a previous call to WriteDelta + /// \param[in] outTemplateVar The value to read + /// \return true on success, false on failure. + template + bool ReadDelta(templateType &outTemplateVar); + + /// \brief Read any integral type from a bitstream. + /// \details Undefine __BITSTREAM_NATIVE_END if you need endian swapping. + /// For floating point, this is lossy, using 2 bytes for a float and 4 for a double. The range must be between -1 and +1. + /// For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type + /// If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte + /// \param[in] outTemplateVar The value to read + /// \return true on success, false on failure. + template + bool ReadCompressed(templateType &outTemplateVar); + + /// \brief Read any integral type from a bitstream. + /// \details If the written value differed from the value compared against in the write function, + /// var will be updated. Otherwise it will retain the current value. + /// the current value will be updated. + /// For floating point, this is lossy, using 2 bytes for a float and 4 for a double. The range must be between -1 and +1. + /// For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type + /// If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte + /// ReadCompressedDelta is only valid from a previous call to WriteDelta + /// \param[in] outTemplateVar The value to read + /// \return true on success, false on failure. + template + bool ReadCompressedDelta(templateType &outTemplateVar); + + /// \brief Read one bitstream to another. + /// \param[in] numberOfBits bits to read + /// \param bitStream the bitstream to read into from + /// \return true on success, false on failure. + bool Read( BitStream *bitStream, BitSize_t numberOfBits ); + bool Read( BitStream *bitStream ); + bool Read( BitStream &bitStream, BitSize_t numberOfBits ); + bool Read( BitStream &bitStream ); + + /// \brief Write an array or casted stream or raw data. This does NOT do endian swapping. + /// \param[in] inputByteArray a byte buffer + /// \param[in] numberOfBytes the size of \a input in bytes + void Write( const char* inputByteArray, const unsigned int numberOfBytes ); + + /// \brief Write one bitstream to another. + /// \param[in] numberOfBits bits to write + /// \param bitStream the bitstream to copy from + void Write( BitStream *bitStream, BitSize_t numberOfBits ); + void Write( BitStream *bitStream ); + void Write( BitStream &bitStream, BitSize_t numberOfBits ); + void Write( BitStream &bitStream );\ + + /// \brief Write a float into 2 bytes, spanning the range between \a floatMin and \a floatMax + /// \param[in] x The float to write + /// \param[in] floatMin Predetermined minimum value of f + /// \param[in] floatMax Predetermined maximum value of f + void WriteFloat16( float x, float floatMin, float floatMax ); + + /// Write one type serialized as another (smaller) type, to save bandwidth + /// serializationType should be uint8_t, uint16_t, uint24_t, or uint32_t + /// Example: int num=53; WriteCasted(num); would use 1 byte to write what would otherwise be an integer (4 or 8 bytes) + /// \param[in] value The value to write + template + void WriteCasted( const sourceType &value ); + + /// Given the minimum and maximum values for an integer type, figure out the minimum number of bits to represent the range + /// Then write only those bits + /// \note A static is used so that the required number of bits for (maximum-minimum) is only calculated once. This does require that \a minimum and \maximum are fixed values for a given line of code for the life of the program + /// \param[in] value Integer value to write, which should be between \a minimum and \a maximum + /// \param[in] minimum Minimum value of \a value + /// \param[in] maximum Maximum value of \a value + /// \param[in] allowOutsideRange If true, all sends will take an extra bit, however value can deviate from outside \a minimum and \a maximum. If false, will assert if the value deviates. This should match the corresponding value passed to Read(). + template + void WriteBitsFromIntegerRange( const templateType value, const templateType minimum, const templateType maximum, bool allowOutsideRange=false ); + /// \param[in] requiredBits Primarily for internal use, called from above function() after calculating number of bits needed to represent maximum-minimum + template + void WriteBitsFromIntegerRange( const templateType value, const templateType minimum, const templateType maximum, const int requiredBits, bool allowOutsideRange=false ); + + /// \brief Write a normalized 3D vector, using (at most) 4 bytes + 3 bits instead of 12-24 bytes. + /// \details Will further compress y or z axis aligned vectors. + /// Accurate to 1/32767.5. + /// \param[in] x x + /// \param[in] y y + /// \param[in] z z + template // templateType for this function must be a float or double + void WriteNormVector( templateType x, templateType y, templateType z ); + + /// \brief Write a vector, using 10 bytes instead of 12. + /// \details Loses accuracy to about 3/10ths and only saves 2 bytes, + /// so only use if accuracy is not important. + /// \param[in] x x + /// \param[in] y y + /// \param[in] z z + template // templateType for this function must be a float or double + void WriteVector( templateType x, templateType y, templateType z ); + + /// \brief Write a normalized quaternion in 6 bytes + 4 bits instead of 16 bytes. Slightly lossy. + /// \param[in] w w + /// \param[in] x x + /// \param[in] y y + /// \param[in] z z + template // templateType for this function must be a float or double + void WriteNormQuat( templateType w, templateType x, templateType y, templateType z); + + /// \brief Write an orthogonal matrix by creating a quaternion, and writing 3 components of the quaternion in 2 bytes each. + /// \details Use 6 bytes instead of 36 + /// Lossy, although the result is renormalized + template // templateType for this function must be a float or double + void WriteOrthMatrix( + templateType m00, templateType m01, templateType m02, + templateType m10, templateType m11, templateType m12, + templateType m20, templateType m21, templateType m22 ); + + /// \brief Read an array or casted stream of byte. + /// \details The array is raw data. There is no automatic endian conversion with this function + /// \param[in] output The result byte array. It should be larger than @em numberOfBytes. + /// \param[in] numberOfBytes The number of byte to read + /// \return true on success false if there is some missing bytes. + bool Read( char* output, const unsigned int numberOfBytes ); + + /// \brief Read a float into 2 bytes, spanning the range between \a floatMin and \a floatMax + /// \param[in] outFloat The float to read + /// \param[in] floatMin Predetermined minimum value of f + /// \param[in] floatMax Predetermined maximum value of f + bool ReadFloat16( float &outFloat, float floatMin, float floatMax ); + + /// Read one type serialized to another (smaller) type, to save bandwidth + /// serializationType should be uint8_t, uint16_t, uint24_t, or uint32_t + /// Example: int num; ReadCasted(num); would read 1 bytefrom the stream, and put the value in an integer + /// \param[in] value The value to write + template + bool ReadCasted( sourceType &value ); + + /// Given the minimum and maximum values for an integer type, figure out the minimum number of bits to represent the range + /// Then read only those bits + /// \note A static is used so that the required number of bits for (maximum-minimum) is only calculated once. This does require that \a minimum and \maximum are fixed values for a given line of code for the life of the program + /// \param[in] value Integer value to read, which should be between \a minimum and \a maximum + /// \param[in] minimum Minimum value of \a value + /// \param[in] maximum Maximum value of \a value + /// \param[in] allowOutsideRange If true, all sends will take an extra bit, however value can deviate from outside \a minimum and \a maximum. If false, will assert if the value deviates. This should match the corresponding value passed to Write(). + template + bool ReadBitsFromIntegerRange( templateType &value, const templateType minimum, const templateType maximum, bool allowOutsideRange=false ); + /// \param[in] requiredBits Primarily for internal use, called from above function() after calculating number of bits needed to represent maximum-minimum + template + bool ReadBitsFromIntegerRange( templateType &value, const templateType minimum, const templateType maximum, const int requiredBits, bool allowOutsideRange=false ); + + /// \brief Read a normalized 3D vector, using (at most) 4 bytes + 3 bits instead of 12-24 bytes. + /// \details Will further compress y or z axis aligned vectors. + /// Accurate to 1/32767.5. + /// \param[in] x x + /// \param[in] y y + /// \param[in] z z + /// \return true on success, false on failure. + template // templateType for this function must be a float or double + bool ReadNormVector( templateType &x, templateType &y, templateType &z ); + + /// \brief Read 3 floats or doubles, using 10 bytes, where those float or doubles comprise a vector. + /// \details Loses accuracy to about 3/10ths and only saves 2 bytes, + /// so only use if accuracy is not important. + /// \param[in] x x + /// \param[in] y y + /// \param[in] z z + /// \return true on success, false on failure. + template // templateType for this function must be a float or double + bool ReadVector( templateType &x, templateType &y, templateType &z ); + + /// \brief Read a normalized quaternion in 6 bytes + 4 bits instead of 16 bytes. + /// \param[in] w w + /// \param[in] x x + /// \param[in] y y + /// \param[in] z z + /// \return true on success, false on failure. + template // templateType for this function must be a float or double + bool ReadNormQuat( templateType &w, templateType &x, templateType &y, templateType &z); + + /// \brief Read an orthogonal matrix from a quaternion, reading 3 components of the quaternion in 2 bytes each and extrapolatig the 4th. + /// \details Use 6 bytes instead of 36 + /// Lossy, although the result is renormalized + /// \return true on success, false on failure. + template // templateType for this function must be a float or double + bool ReadOrthMatrix( + templateType &m00, templateType &m01, templateType &m02, + templateType &m10, templateType &m11, templateType &m12, + templateType &m20, templateType &m21, templateType &m22 ); + + /// \brief Sets the read pointer back to the beginning of your data. + void ResetReadPointer( void ); + + /// \brief Sets the write pointer back to the beginning of your data. + void ResetWritePointer( void ); + + /// \brief This is good to call when you are done with the stream to make + /// sure you didn't leave any data left over void + void AssertStreamEmpty( void ); + + /// \brief RAKNET_DEBUG_PRINTF the bits in the stream. Great for debugging. + void PrintBits( char *out ) const; + void PrintBits( void ) const; + void PrintHex( char *out ) const; + void PrintHex( void ) const; + + /// \brief Ignore data we don't intend to read + /// \param[in] numberOfBits The number of bits to ignore + void IgnoreBits( const BitSize_t numberOfBits ); + + /// \brief Ignore data we don't intend to read + /// \param[in] numberOfBits The number of bytes to ignore + void IgnoreBytes( const unsigned int numberOfBytes ); + + /// \brief Move the write pointer to a position on the array. + /// \param[in] offset the offset from the start of the array. + /// \attention + /// \details Dangerous if you don't know what you are doing! + /// For efficiency reasons you can only write mid-stream if your data is byte aligned. + void SetWriteOffset( const BitSize_t offset ); + + /// \brief Returns the length in bits of the stream + inline BitSize_t GetNumberOfBitsUsed( void ) const {return GetWriteOffset();} + inline BitSize_t GetWriteOffset( void ) const {return numberOfBitsUsed;} + + /// \brief Returns the length in bytes of the stream + inline BitSize_t GetNumberOfBytesUsed( void ) const {return BITS_TO_BYTES( numberOfBitsUsed );} + + /// \brief Returns the number of bits into the stream that we have read + inline BitSize_t GetReadOffset( void ) const {return readOffset;} + + /// \brief Sets the read bit index + void SetReadOffset( const BitSize_t newReadOffset ) {readOffset=newReadOffset;} + + /// \brief Returns the number of bits left in the stream that haven't been read + inline BitSize_t GetNumberOfUnreadBits( void ) const {return numberOfBitsUsed - readOffset;} + + /// \brief Makes a copy of the internal data for you \a _data will point to + /// the stream. Partial bytes are left aligned. + /// \param[out] _data The allocated copy of GetData() + /// \return The length in bits of the stream. + BitSize_t CopyData( unsigned char** _data ) const; + + /// \internal + /// Set the stream to some initial data. + void SetData( unsigned char *inByteArray ); + + /// Gets the data that BitStream is writing to / reading from. + /// Partial bytes are left aligned. + /// \return A pointer to the internal state + inline unsigned char* GetData( void ) const {return data;} + + /// \brief Write numberToWrite bits from the input source. + /// \details Right aligned data means in the case of a partial byte, the bits are aligned + /// from the right (bit 0) rather than the left (as in the normal + /// internal representation) You would set this to true when + /// writing user data, and false when copying bitstream data, such + /// as writing one bitstream to another. + /// \param[in] inByteArray The data + /// \param[in] numberOfBitsToWrite The number of bits to write + /// \param[in] rightAlignedBits if true data will be right aligned + void WriteBits( const unsigned char* inByteArray, BitSize_t numberOfBitsToWrite, const bool rightAlignedBits = true ); + + /// \brief Align the bitstream to the byte boundary and then write the + /// specified number of bits. + /// \details This is faster than WriteBits but + /// wastes the bits to do the alignment and requires you to call + /// ReadAlignedBits at the corresponding read position. + /// \param[in] inByteArray The data + /// \param[in] numberOfBytesToWrite The size of input. + void WriteAlignedBytes( const unsigned char *inByteArray, const unsigned int numberOfBytesToWrite ); + + // Endian swap bytes already in the bitstream + void EndianSwapBytes( int byteOffset, int length ); + + /// \brief Aligns the bitstream, writes inputLength, and writes input. Won't write beyond maxBytesToWrite + /// \param[in] inByteArray The data + /// \param[in] inputLength The size of input. + /// \param[in] maxBytesToWrite Max bytes to write + void WriteAlignedBytesSafe( const char *inByteArray, const unsigned int inputLength, const unsigned int maxBytesToWrite ); + + /// \brief Read bits, starting at the next aligned bits. + /// \details Note that the modulus 8 starting offset of the sequence must be the same as + /// was used with WriteBits. This will be a problem with packet + /// coalescence unless you byte align the coalesced packets. + /// \param[in] inOutByteArray The byte array larger than @em numberOfBytesToRead + /// \param[in] numberOfBytesToRead The number of byte to read from the internal state + /// \return true if there is enough byte. + bool ReadAlignedBytes( unsigned char *inOutByteArray, const unsigned int numberOfBytesToRead ); + + /// \brief Reads what was written by WriteAlignedBytesSafe. + /// \param[in] inOutByteArray The data + /// \param[in] maxBytesToRead Maximum number of bytes to read + /// \return true on success, false on failure. + bool ReadAlignedBytesSafe( char *inOutByteArray, int &inputLength, const int maxBytesToRead ); + bool ReadAlignedBytesSafe( char *inOutByteArray, unsigned int &inputLength, const unsigned int maxBytesToRead ); + + /// \brief Same as ReadAlignedBytesSafe() but allocates the memory for you using new, rather than assuming it is safe to write to + /// \param[in] outByteArray outByteArray will be deleted if it is not a pointer to 0 + /// \return true on success, false on failure. + bool ReadAlignedBytesSafeAlloc( char **outByteArray, int &inputLength, const unsigned int maxBytesToRead ); + bool ReadAlignedBytesSafeAlloc( char **outByteArray, unsigned int &inputLength, const unsigned int maxBytesToRead ); + + /// \brief Align the next write and/or read to a byte boundary. + /// \details This can be used to 'waste' bits to byte align for efficiency reasons It + /// can also be used to force coalesced bitstreams to start on byte + /// boundaries so so WriteAlignedBits and ReadAlignedBits both + /// calculate the same offset when aligning. + inline void AlignWriteToByteBoundary( void ) {numberOfBitsUsed += 8 - ( (( numberOfBitsUsed - 1 ) & 7) + 1 );} + + /// \brief Align the next write and/or read to a byte boundary. + /// \details This can be used to 'waste' bits to byte align for efficiency reasons It + /// can also be used to force coalesced bitstreams to start on byte + /// boundaries so so WriteAlignedBits and ReadAlignedBits both + /// calculate the same offset when aligning. + inline void AlignReadToByteBoundary( void ) {readOffset += 8 - ( (( readOffset - 1 ) & 7 ) + 1 );} + + /// \brief Read \a numberOfBitsToRead bits to the output source. + /// \details alignBitsToRight should be set to true to convert internal + /// bitstream data to userdata. It should be false if you used + /// WriteBits with rightAlignedBits false + /// \param[in] inOutByteArray The resulting bits array + /// \param[in] numberOfBitsToRead The number of bits to read + /// \param[in] alignBitsToRight if true bits will be right aligned. + /// \return true if there is enough bits to read + bool ReadBits( unsigned char *inOutByteArray, BitSize_t numberOfBitsToRead, const bool alignBitsToRight = true ); + + /// \brief Write a 0 + void Write0( void ); + + /// \brief Write a 1 + void Write1( void ); + + /// \brief Reads 1 bit and returns true if that bit is 1 and false if it is 0. + bool ReadBit( void ); + + /// \brief If we used the constructor version with copy data off, this + /// *makes sure it is set to on and the data pointed to is copied. + void AssertCopyData( void ); + + /// \brief Use this if you pass a pointer copy to the constructor + /// *(_copyData==false) and want to overallocate to prevent + /// reallocation. + void SetNumberOfBitsAllocated( const BitSize_t lengthInBits ); + + /// \brief Reallocates (if necessary) in preparation of writing numberOfBitsToWrite + void AddBitsAndReallocate( const BitSize_t numberOfBitsToWrite ); + + /// \internal + /// \return How many bits have been allocated internally + BitSize_t GetNumberOfBitsAllocated(void) const; + + /// \brief Read strings, non reference. + bool Read(char *varString); + bool Read(unsigned char *varString); + + /// Write zeros until the bitstream is filled up to \a bytes + void PadWithZeroToByteLength( unsigned int bytes ); + + /// Get the number of leading zeros for a number + /// \param[in] x Number to test + static int NumberOfLeadingZeroes( uint8_t x ); + static int NumberOfLeadingZeroes( uint16_t x ); + static int NumberOfLeadingZeroes( uint32_t x ); + static int NumberOfLeadingZeroes( uint64_t x ); + static int NumberOfLeadingZeroes( int8_t x ); + static int NumberOfLeadingZeroes( int16_t x ); + static int NumberOfLeadingZeroes( int32_t x ); + static int NumberOfLeadingZeroes( int64_t x ); + + /// \internal Unrolled inner loop, for when performance is critical + void WriteAlignedVar8(const char *inByteArray); + /// \internal Unrolled inner loop, for when performance is critical + bool ReadAlignedVar8(char *inOutByteArray); + /// \internal Unrolled inner loop, for when performance is critical + void WriteAlignedVar16(const char *inByteArray); + /// \internal Unrolled inner loop, for when performance is critical + bool ReadAlignedVar16(char *inOutByteArray); + /// \internal Unrolled inner loop, for when performance is critical + void WriteAlignedVar32(const char *inByteArray); + /// \internal Unrolled inner loop, for when performance is critical + bool ReadAlignedVar32(char *inOutByteArray); + + inline void Write(const char * const inStringVar) + { + RakString::Serialize(inStringVar, this); + } + inline void Write(const wchar_t * const inStringVar) + { + RakWString::Serialize(inStringVar, this); + } + inline void Write(const unsigned char * const inTemplateVar) + { + Write((const char*)inTemplateVar); + } + inline void Write(char * const inTemplateVar) + { + Write((const char*)inTemplateVar); + } + inline void Write(unsigned char * const inTemplateVar) + { + Write((const char*)inTemplateVar); + } + inline void WriteCompressed(const char * const inStringVar) + { + RakString::SerializeCompressed(inStringVar,this,0,false); + } + inline void WriteCompressed(const wchar_t * const inStringVar) + { + RakWString::Serialize(inStringVar,this); + } + inline void WriteCompressed(const unsigned char * const inTemplateVar) + { + WriteCompressed((const char*) inTemplateVar); + } + inline void WriteCompressed(char * const inTemplateVar) + { + WriteCompressed((const char*) inTemplateVar); + } + inline void WriteCompressed(unsigned char * const inTemplateVar) + { + WriteCompressed((const char*) inTemplateVar); + } + + /// ---- Member function template specialization declarations ---- + // Used for VC7 +#if defined(_MSC_VER) && _MSC_VER == 1300 + /// Write a bool to a bitstream. + /// \param[in] var The value to write + template <> + void Write(const bool &var); + + /// Write a systemAddress to a bitstream + /// \param[in] var The value to write + template <> + void Write(const SystemAddress &var); + + /// Write a uint24_t to a bitstream + /// \param[in] var The value to write + template <> + void Write(const uint24_t &var); + + /// Write a RakNetGUID to a bitsteam + /// \param[in] var The value to write + template <> + void Write(const RakNetGuid &var); + + /// Write a string to a bitstream + /// \param[in] var The value to write + template <> + void Write(const char* const &var); + template <> + void Write(const unsigned char* const &var); + template <> + void Write(char* const &var); + template <> + void Write(unsigned char* const &var); + template <> + void Write(const RakString &var); + template <> + void Write(const RakWString &var); + + /// \brief Write a systemAddress. + /// \details If the current value is different from the last value + /// the current value will be written. Otherwise, a single bit will be written + /// \param[in] currentValue The current value to write + /// \param[in] lastValue The last value to compare against + template <> + void WriteDelta(const SystemAddress ¤tValue, const SystemAddress &lastValue); + + template <> + void WriteDelta(const uint24_t ¤tValue, const uint24_t &lastValue); + + template <> + void WriteDelta(const RakNetGUID ¤tValue, const RakNetGUID &lastValue); + + /// \brief Write a bool delta. + /// \details Same thing as just calling Write + /// \param[in] currentValue The current value to write + /// \param[in] lastValue The last value to compare against + template <> + void WriteDelta(const bool ¤tValue, const bool &lastValue); + + template <> + void WriteCompressed(const SystemAddress &var); + + template <> + void WriteCompressed(const uint24_t &var); + + template <> + void WriteCompressed(const RakNetGUID &var); + + template <> + void WriteCompressed(const bool &var); + + /// For values between -1 and 1 + template <> + void WriteCompressed(const float &var); + + /// For values between -1 and 1 + template <> + void WriteCompressed(const double &var); + + /// Compressed string + template <> + void WriteCompressed(const char* var); + template <> + void WriteCompressed(const unsigned char* var); + template <> + void WriteCompressed(char* var); + template <> + void WriteCompressed(unsigned char* var); + template <> + void WriteCompressed(const RakString &var); + template <> + void WriteCompressed(const RakWString &var); + + /// \brief Write a bool delta. + /// \details Same thing as just calling Write + /// \param[in] currentValue The current value to write + /// \param[in] lastValue The last value to compare against + template <> + void WriteCompressedDelta(const bool ¤tValue, const bool &lastValue); + + /// \brief Save as WriteCompressedDelta(bool currentValue, const templateType &lastValue) + /// when we have an unknown second bool + template <> + void WriteCompressedDelta(const bool ¤tValue); + + /// \brief Read a bool from a bitstream. + /// \param[in] var The value to read + /// \return true on success, false on failure. + template <> + bool Read(bool &var); + + /// \brief Read a systemAddress from a bitstream. + /// \param[in] var The value to read + /// \return true on success, false on failure. + template <> + bool Read(SystemAddress &var); + + template <> + bool Read(uint24_t &var); + + template <> + bool Read(RakNetGUID &var); + + /// \brief Read a String from a bitstream. + /// \param[in] var The value to read + /// \return true on success, false on failure. + template <> + bool Read(char *&var); + template <> + bool Read(wchar_t *&var); + template <> + bool Read(unsigned char *&var); + template <> + bool Read(RakString &var); + template <> + bool Read(RakWString &var); + + /// \brief Read a bool from a bitstream. + /// \param[in] var The value to read + /// \return true on success, false on failure. + template <> + bool ReadDelta(bool &var); + + template <> + bool ReadCompressed(SystemAddress &var); + + template <> + bool ReadCompressed(uint24_t &var); + + template <> + bool ReadCompressed(RakNetGUID &var); + + template <> + bool ReadCompressed(bool &var); + + template <> + bool ReadCompressed(float &var); + + /// For values between -1 and 1 + /// \return true on success, false on failure. + template <> + bool ReadCompressed(double &var); + + template <> + bool ReadCompressed(char* &var); + template <> + bool ReadCompressed(wchar_t* &var); + template <> + bool ReadCompressed(unsigned char *&var); + template <> + bool ReadCompressed(RakString &var); + template <> + bool ReadCompressed(RakWString &var); + + /// \brief Read a bool from a bitstream. + /// \param[in] var The value to read + /// \return true on success, false on failure. + template <> + bool ReadCompressedDelta(bool &var); +#endif + + inline static bool DoEndianSwap(void) { +#ifndef __BITSTREAM_NATIVE_END + return IsNetworkOrder()==false; +#else + return false; +#endif + } + inline static bool IsBigEndian(void) + { + return IsNetworkOrder(); + } + inline static bool IsNetworkOrder(void) {static const bool r = IsNetworkOrderInternal(); return r;} + // Not inline, won't compile on PC due to winsock include errors + static bool IsNetworkOrderInternal(void); + static void ReverseBytes(unsigned char *inByteArray, unsigned char *inOutByteArray, const unsigned int length); + static void ReverseBytesInPlace(unsigned char *inOutData,const unsigned int length); + + private: + + BitStream( const BitStream &invalid) { + (void) invalid; + RakAssert(0); + } + + /// \brief Assume the input source points to a native type, compress and write it. + void WriteCompressed( const unsigned char* inByteArray, const unsigned int size, const bool unsignedData ); + + /// \brief Assume the input source points to a compressed native type. Decompress and read it. + bool ReadCompressed( unsigned char* inOutByteArray, const unsigned int size, const bool unsignedData ); + + + BitSize_t numberOfBitsUsed; + + BitSize_t numberOfBitsAllocated; + + BitSize_t readOffset; + + unsigned char *data; + + /// true if the internal buffer is copy of the data passed to the constructor + bool copyData; + + /// BitStreams that use less than BITSTREAM_STACK_ALLOCATION_SIZE use the stack, rather than the heap to store data. It switches over if BITSTREAM_STACK_ALLOCATION_SIZE is exceeded + unsigned char stackData[BITSTREAM_STACK_ALLOCATION_SIZE]; + }; + + template + inline bool BitStream::Serialize(bool writeToBitstream, templateType &inOutTemplateVar) + { + if (writeToBitstream) + Write(inOutTemplateVar); + else + return Read(inOutTemplateVar); + return true; + } + + template + inline bool BitStream::SerializeDelta(bool writeToBitstream, templateType &inOutCurrentValue, const templateType &lastValue) + { + if (writeToBitstream) + WriteDelta(inOutCurrentValue, lastValue); + else + return ReadDelta(inOutCurrentValue); + return true; + } + + template + inline bool BitStream::SerializeDelta(bool writeToBitstream, templateType &inOutCurrentValue) + { + if (writeToBitstream) + WriteDelta(inOutCurrentValue); + else + return ReadDelta(inOutCurrentValue); + return true; + } + + template + inline bool BitStream::SerializeCompressed(bool writeToBitstream, templateType &inOutTemplateVar) + { + if (writeToBitstream) + WriteCompressed(inOutTemplateVar); + else + return ReadCompressed(inOutTemplateVar); + return true; + } + + template + inline bool BitStream::SerializeCompressedDelta(bool writeToBitstream, templateType &inOutCurrentValue, const templateType &lastValue) + { + if (writeToBitstream) + WriteCompressedDelta(inOutCurrentValue,lastValue); + else + return ReadCompressedDelta(inOutCurrentValue); + return true; + } +//Stoppedhere + template + inline bool BitStream::SerializeCompressedDelta(bool writeToBitstream, templateType &inOutCurrentValue) + { + if (writeToBitstream) + WriteCompressedDelta(inOutCurrentValue); + else + return ReadCompressedDelta(inOutCurrentValue); + return true; + } + + inline bool BitStream::Serialize(bool writeToBitstream, char* inOutByteArray, const unsigned int numberOfBytes ) + { + if (writeToBitstream) + Write(inOutByteArray, numberOfBytes); + else + return Read(inOutByteArray, numberOfBytes); + return true; + } + + template + bool BitStream::SerializeCasted( bool writeToBitstream, sourceType &value ) + { + if (writeToBitstream) WriteCasted(value); + else return ReadCasted(value); + return true; + } + + template + bool BitStream::SerializeBitsFromIntegerRange( bool writeToBitstream, templateType &value, const templateType minimum, const templateType maximum, bool allowOutsideRange ) + { + int requiredBits=BYTES_TO_BITS(sizeof(templateType))-NumberOfLeadingZeroes(templateType(maximum-minimum)); + return SerializeBitsFromIntegerRange(writeToBitstream,value,minimum,maximum,requiredBits,allowOutsideRange); + } + template + bool BitStream::SerializeBitsFromIntegerRange( bool writeToBitstream, templateType &value, const templateType minimum, const templateType maximum, const int requiredBits, bool allowOutsideRange ) + { + if (writeToBitstream) WriteBitsFromIntegerRange(value,minimum,maximum,requiredBits,allowOutsideRange); + else return ReadBitsFromIntegerRange(value,minimum,maximum,requiredBits,allowOutsideRange); + return true; + } + + template + inline bool BitStream::SerializeNormVector(bool writeToBitstream, templateType &x, templateType &y, templateType &z ) + { + if (writeToBitstream) + WriteNormVector(x,y,z); + else + return ReadNormVector(x,y,z); + return true; + } + + template + inline bool BitStream::SerializeVector(bool writeToBitstream, templateType &x, templateType &y, templateType &z ) + { + if (writeToBitstream) + WriteVector(x,y,z); + else + return ReadVector(x,y,z); + return true; + } + + template + inline bool BitStream::SerializeNormQuat(bool writeToBitstream, templateType &w, templateType &x, templateType &y, templateType &z) + { + if (writeToBitstream) + WriteNormQuat(w,x,y,z); + else + return ReadNormQuat(w,x,y,z); + return true; + } + + template + inline bool BitStream::SerializeOrthMatrix( + bool writeToBitstream, + templateType &m00, templateType &m01, templateType &m02, + templateType &m10, templateType &m11, templateType &m12, + templateType &m20, templateType &m21, templateType &m22 ) + { + if (writeToBitstream) + WriteOrthMatrix(m00,m01,m02,m10,m11,m12,m20,m21,m22); + else + return ReadOrthMatrix(m00,m01,m02,m10,m11,m12,m20,m21,m22); + return true; + } + + inline bool BitStream::SerializeBits(bool writeToBitstream, unsigned char* inOutByteArray, const BitSize_t numberOfBitsToSerialize, const bool rightAlignedBits ) + { + if (writeToBitstream) + WriteBits(inOutByteArray,numberOfBitsToSerialize,rightAlignedBits); + else + return ReadBits(inOutByteArray,numberOfBitsToSerialize,rightAlignedBits); + return true; + } + + template + inline void BitStream::Write(const templateType &inTemplateVar) + { +#ifdef _MSC_VER +#pragma warning(disable:4127) // conditional expression is constant +#endif + if (sizeof(inTemplateVar)==1) + WriteBits( ( unsigned char* ) & inTemplateVar, sizeof( templateType ) * 8, true ); + else + { +#ifndef __BITSTREAM_NATIVE_END + if (DoEndianSwap()) + { + unsigned char output[sizeof(templateType)]; + ReverseBytes((unsigned char*)&inTemplateVar, output, sizeof(templateType)); + WriteBits( ( unsigned char* ) output, sizeof(templateType) * 8, true ); + } + else +#endif + WriteBits( ( unsigned char* ) & inTemplateVar, sizeof(templateType) * 8, true ); + } + } + + template + inline void BitStream::WritePtr(templateType *inTemplateVar) + { +#ifdef _MSC_VER +#pragma warning(disable:4127) // conditional expression is constant +#endif + if (sizeof(templateType)==1) + WriteBits( ( unsigned char* ) inTemplateVar, sizeof( templateType ) * 8, true ); + else + { +#ifndef __BITSTREAM_NATIVE_END + if (DoEndianSwap()) + { + unsigned char output[sizeof(templateType)]; + ReverseBytes((unsigned char*) inTemplateVar, output, sizeof(templateType)); + WriteBits( ( unsigned char* ) output, sizeof(templateType) * 8, true ); + } + else +#endif + WriteBits( ( unsigned char* ) inTemplateVar, sizeof(templateType) * 8, true ); + } + } + + /// \brief Write a bool to a bitstream. + /// \param[in] inTemplateVar The value to write + template <> + inline void BitStream::Write(const bool &inTemplateVar) + { + if ( inTemplateVar ) + Write1(); + else + Write0(); + } + + + /// \brief Write a systemAddress to a bitstream. + /// \param[in] inTemplateVar The value to write + template <> + inline void BitStream::Write(const SystemAddress &inTemplateVar) + { + Write(inTemplateVar.GetIPVersion()); + if (inTemplateVar.GetIPVersion()==4) + { + // Hide the address so routers don't modify it + SystemAddress var2=inTemplateVar; + uint32_t binaryAddress=~inTemplateVar.address.addr4.sin_addr.s_addr; + // Don't endian swap the address or port + WriteBits((unsigned char*)&binaryAddress, sizeof(binaryAddress)*8, true); + unsigned short p = var2.GetPortNetworkOrder(); + WriteBits((unsigned char*)&p, sizeof(unsigned short)*8, true); + } + else + { +#if RAKNET_SUPPORT_IPV6==1 + // Don't endian swap + WriteBits((const unsigned char*) &inTemplateVar.address.addr6, sizeof(inTemplateVar.address.addr6)*8, true); +#endif + } + } + + template <> + inline void BitStream::Write(const uint24_t &inTemplateVar) + { + AlignWriteToByteBoundary(); + AddBitsAndReallocate(3*8); + + if (IsBigEndian()==false) + { + data[( numberOfBitsUsed >> 3 ) + 0] = ((char *)&inTemplateVar.val)[0]; + data[( numberOfBitsUsed >> 3 ) + 1] = ((char *)&inTemplateVar.val)[1]; + data[( numberOfBitsUsed >> 3 ) + 2] = ((char *)&inTemplateVar.val)[2]; + } + else + { + data[( numberOfBitsUsed >> 3 ) + 0] = ((char *)&inTemplateVar.val)[3]; + data[( numberOfBitsUsed >> 3 ) + 1] = ((char *)&inTemplateVar.val)[2]; + data[( numberOfBitsUsed >> 3 ) + 2] = ((char *)&inTemplateVar.val)[1]; + } + + numberOfBitsUsed+=3*8; + } + + template <> + inline void BitStream::Write(const RakNetGUID &inTemplateVar) + { + Write(inTemplateVar.g); + } + + /// \brief Write a string to a bitstream. + /// \param[in] var The value to write + template <> + inline void BitStream::Write(const RakString &inTemplateVar) + { + inTemplateVar.Serialize(this); + } + template <> + inline void BitStream::Write(const RakWString &inTemplateVar) + { + inTemplateVar.Serialize(this); + } + template <> + inline void BitStream::Write(const char * const &inStringVar) + { + RakString::Serialize(inStringVar, this); + } + template <> + inline void BitStream::Write(const wchar_t * const &inStringVar) + { + RakWString::Serialize(inStringVar, this); + } + template <> + inline void BitStream::Write(const unsigned char * const &inTemplateVar) + { + Write((const char*)inTemplateVar); + } + template <> + inline void BitStream::Write(char * const &inTemplateVar) + { + Write((const char*)inTemplateVar); + } + template <> + inline void BitStream::Write(unsigned char * const &inTemplateVar) + { + Write((const char*)inTemplateVar); + } + + /// \brief Write any integral type to a bitstream. + /// \details If the current value is different from the last value + /// the current value will be written. Otherwise, a single bit will be written + /// \param[in] currentValue The current value to write + /// \param[in] lastValue The last value to compare against + template + inline void BitStream::WriteDelta(const templateType ¤tValue, const templateType &lastValue) + { + if (currentValue==lastValue) + { + Write(false); + } + else + { + Write(true); + Write(currentValue); + } + } + + /// \brief Write a bool delta. Same thing as just calling Write + /// \param[in] currentValue The current value to write + /// \param[in] lastValue The last value to compare against + template <> + inline void BitStream::WriteDelta(const bool ¤tValue, const bool &lastValue) + { + (void) lastValue; + + Write(currentValue); + } + + /// \brief WriteDelta when you don't know what the last value is, or there is no last value. + /// \param[in] currentValue The current value to write + template + inline void BitStream::WriteDelta(const templateType ¤tValue) + { + Write(true); + Write(currentValue); + } + + /// \brief Write any integral type to a bitstream. + /// \details Undefine __BITSTREAM_NATIVE_END if you need endian swapping. + /// For floating point, this is lossy, using 2 bytes for a float and 4 for a double. The range must be between -1 and +1. + /// For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type + /// If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte + /// \param[in] inTemplateVar The value to write + template + inline void BitStream::WriteCompressed(const templateType &inTemplateVar) + { +#ifdef _MSC_VER +#pragma warning(disable:4127) // conditional expression is constant +#endif + if (sizeof(inTemplateVar)==1) + WriteCompressed( ( unsigned char* ) & inTemplateVar, sizeof( templateType ) * 8, true ); + else + { +#ifndef __BITSTREAM_NATIVE_END +#ifdef _MSC_VER +#pragma warning(disable:4244) // '=' : conversion from 'unsigned long' to 'unsigned short', possible loss of data +#endif + + if (DoEndianSwap()) + { + unsigned char output[sizeof(templateType)]; + ReverseBytes((unsigned char*)&inTemplateVar, output, sizeof(templateType)); + WriteCompressed( ( unsigned char* ) output, sizeof(templateType) * 8, true ); + } + else +#endif + WriteCompressed( ( unsigned char* ) & inTemplateVar, sizeof(templateType) * 8, true ); + } + } + + template <> + inline void BitStream::WriteCompressed(const SystemAddress &inTemplateVar) + { + Write(inTemplateVar); + } + + template <> + inline void BitStream::WriteCompressed(const RakNetGUID &inTemplateVar) + { + Write(inTemplateVar); + } + + template <> + inline void BitStream::WriteCompressed(const uint24_t &var) + { + Write(var); + } + + template <> + inline void BitStream::WriteCompressed(const bool &inTemplateVar) + { + Write(inTemplateVar); + } + + /// For values between -1 and 1 + template <> + inline void BitStream::WriteCompressed(const float &inTemplateVar) + { + RakAssert(inTemplateVar > -1.01f && inTemplateVar < 1.01f); + float varCopy=inTemplateVar; + if (varCopy < -1.0f) + varCopy=-1.0f; + if (varCopy > 1.0f) + varCopy=1.0f; + Write((unsigned short)((varCopy+1.0f)*32767.5f)); + } + + /// For values between -1 and 1 + template <> + inline void BitStream::WriteCompressed(const double &inTemplateVar) + { + RakAssert(inTemplateVar > -1.01 && inTemplateVar < 1.01); + double varCopy=inTemplateVar; + if (varCopy < -1.0f) + varCopy=-1.0f; + if (varCopy > 1.0f) + varCopy=1.0f; + Write((uint32_t)((varCopy+1.0)*2147483648.0)); + } + + /// Compress the string + template <> + inline void BitStream::WriteCompressed(const RakString &inTemplateVar) + { + inTemplateVar.SerializeCompressed(this,0,false); + } + template <> + inline void BitStream::WriteCompressed(const RakWString &inTemplateVar) + { + inTemplateVar.Serialize(this); + } + template <> + inline void BitStream::WriteCompressed(const char * const &inStringVar) + { + RakString::SerializeCompressed(inStringVar,this,0,false); + } + template <> + inline void BitStream::WriteCompressed(const wchar_t * const &inStringVar) + { + RakWString::Serialize(inStringVar,this); + } + template <> + inline void BitStream::WriteCompressed(const unsigned char * const &inTemplateVar) + { + WriteCompressed((const char*) inTemplateVar); + } + template <> + inline void BitStream::WriteCompressed(char * const &inTemplateVar) + { + WriteCompressed((const char*) inTemplateVar); + } + template <> + inline void BitStream::WriteCompressed(unsigned char * const &inTemplateVar) + { + WriteCompressed((const char*) inTemplateVar); + } + + + /// \brief Write any integral type to a bitstream. + /// \details If the current value is different from the last value + /// the current value will be written. Otherwise, a single bit will be written + /// For floating point, this is lossy, using 2 bytes for a float and 4 for a double. The range must be between -1 and +1. + /// For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type + /// If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte + /// \param[in] currentValue The current value to write + /// \param[in] lastValue The last value to compare against + template + inline void BitStream::WriteCompressedDelta(const templateType ¤tValue, const templateType &lastValue) + { + if (currentValue==lastValue) + { + Write(false); + } + else + { + Write(true); + WriteCompressed(currentValue); + } + } + + /// \brief Write a bool delta. Same thing as just calling Write + /// \param[in] currentValue The current value to write + /// \param[in] lastValue The last value to compare against + template <> + inline void BitStream::WriteCompressedDelta(const bool ¤tValue, const bool &lastValue) + { + (void) lastValue; + + Write(currentValue); + } + + /// \brief Save as WriteCompressedDelta(const templateType ¤tValue, const templateType &lastValue) + /// when we have an unknown second parameter + template + inline void BitStream::WriteCompressedDelta(const templateType ¤tValue) + { + Write(true); + WriteCompressed(currentValue); + } + + /// \brief Save as WriteCompressedDelta(bool currentValue, const templateType &lastValue) + /// when we have an unknown second bool + template <> + inline void BitStream::WriteCompressedDelta(const bool ¤tValue) + { + Write(currentValue); + } + + /// \brief Read any integral type from a bitstream. Define __BITSTREAM_NATIVE_END if you need endian swapping. + /// \param[in] outTemplateVar The value to read + template + inline bool BitStream::Read(templateType &outTemplateVar) + { +#ifdef _MSC_VER +#pragma warning(disable:4127) // conditional expression is constant +#endif + if (sizeof(outTemplateVar)==1) + return ReadBits( ( unsigned char* ) &outTemplateVar, sizeof(templateType) * 8, true ); + else + { +#ifndef __BITSTREAM_NATIVE_END +#ifdef _MSC_VER +#pragma warning(disable:4244) // '=' : conversion from 'unsigned long' to 'unsigned short', possible loss of data +#endif + if (DoEndianSwap()) + { + unsigned char output[sizeof(templateType)]; + if (ReadBits( ( unsigned char* ) output, sizeof(templateType) * 8, true )) + { + ReverseBytes(output, (unsigned char*)&outTemplateVar, sizeof(templateType)); + return true; + } + return false; + } + else +#endif + return ReadBits( ( unsigned char* ) & outTemplateVar, sizeof(templateType) * 8, true ); + } + } + + /// \brief Read a bool from a bitstream. + /// \param[in] outTemplateVar The value to read + template <> + inline bool BitStream::Read(bool &outTemplateVar) + { + if ( readOffset + 1 > numberOfBitsUsed ) + return false; + + if ( data[ readOffset >> 3 ] & ( 0x80 >> ( readOffset & 7 ) ) ) // Is it faster to just write it out here? + outTemplateVar = true; + else + outTemplateVar = false; + + // Has to be on a different line for Mac + readOffset++; + + return true; + } + + /// \brief Read a systemAddress from a bitstream. + /// \param[in] outTemplateVar The value to read + template <> + inline bool BitStream::Read(SystemAddress &outTemplateVar) + { + unsigned char ipVersion; + Read(ipVersion); + if (ipVersion==4) + { + outTemplateVar.address.addr4.sin_family=AF_INET; + // Read(var.binaryAddress); + // Don't endian swap the address or port + uint32_t binaryAddress; + ReadBits( ( unsigned char* ) & binaryAddress, sizeof(binaryAddress) * 8, true ); + // Unhide the IP address, done to prevent routers from changing it + outTemplateVar.address.addr4.sin_addr.s_addr=~binaryAddress; + bool b = ReadBits(( unsigned char* ) & outTemplateVar.address.addr4.sin_port, sizeof(outTemplateVar.address.addr4.sin_port) * 8, true); + outTemplateVar.debugPort=ntohs(outTemplateVar.address.addr4.sin_port); + return b; + } + else + { +#if RAKNET_SUPPORT_IPV6==1 + bool b = ReadBits((unsigned char*) &outTemplateVar.address.addr6, sizeof(outTemplateVar.address.addr6)*8, true); + outTemplateVar.debugPort=ntohs(outTemplateVar.address.addr6.sin6_port); + return b; +#else + return false; +#endif + } + } + + template <> + inline bool BitStream::Read(uint24_t &outTemplateVar) + { + AlignReadToByteBoundary(); + if ( readOffset + 3*8 > numberOfBitsUsed ) + return false; + + if (IsBigEndian()==false) + { + ((char *)&outTemplateVar.val)[0]=data[ (readOffset >> 3) + 0]; + ((char *)&outTemplateVar.val)[1]=data[ (readOffset >> 3) + 1]; + ((char *)&outTemplateVar.val)[2]=data[ (readOffset >> 3) + 2]; + ((char *)&outTemplateVar.val)[3]=0; + } + else + { + + ((char *)&outTemplateVar.val)[3]=data[ (readOffset >> 3) + 0]; + ((char *)&outTemplateVar.val)[2]=data[ (readOffset >> 3) + 1]; + ((char *)&outTemplateVar.val)[1]=data[ (readOffset >> 3) + 2]; + ((char *)&outTemplateVar.val)[0]=0; + } + + readOffset+=3*8; + return true; + } + + template <> + inline bool BitStream::Read(RakNetGUID &outTemplateVar) + { + return Read(outTemplateVar.g); + } + + + template <> + inline bool BitStream::Read(RakString &outTemplateVar) + { + return outTemplateVar.Deserialize(this); + } + template <> + inline bool BitStream::Read(RakWString &outTemplateVar) + { + return outTemplateVar.Deserialize(this); + } + template <> + inline bool BitStream::Read(char *&varString) + { + return RakString::Deserialize(varString,this); + } + template <> + inline bool BitStream::Read(wchar_t *&varString) + { + return RakWString::Deserialize(varString,this); + } + template <> + inline bool BitStream::Read(unsigned char *&varString) + { + return RakString::Deserialize((char*) varString,this); + } + + /// \brief Read any integral type from a bitstream. + /// \details If the written value differed from the value compared against in the write function, + /// var will be updated. Otherwise it will retain the current value. + /// ReadDelta is only valid from a previous call to WriteDelta + /// \param[in] outTemplateVar The value to read + template + inline bool BitStream::ReadDelta(templateType &outTemplateVar) + { + bool dataWritten; + bool success; + success=Read(dataWritten); + if (dataWritten) + success=Read(outTemplateVar); + return success; + } + + /// \brief Read a bool from a bitstream. + /// \param[in] outTemplateVar The value to read + template <> + inline bool BitStream::ReadDelta(bool &outTemplateVar) + { + return Read(outTemplateVar); + } + + /// \brief Read any integral type from a bitstream. + /// \details Undefine __BITSTREAM_NATIVE_END if you need endian swapping. + /// For floating point, this is lossy, using 2 bytes for a float and 4 for a double. The range must be between -1 and +1. + /// For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type + /// If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte + /// \param[in] outTemplateVar The value to read + template + inline bool BitStream::ReadCompressed(templateType &outTemplateVar) + { +#ifdef _MSC_VER +#pragma warning(disable:4127) // conditional expression is constant +#endif + if (sizeof(outTemplateVar)==1) + return ReadCompressed( ( unsigned char* ) &outTemplateVar, sizeof(templateType) * 8, true ); + else + { +#ifndef __BITSTREAM_NATIVE_END + if (DoEndianSwap()) + { + unsigned char output[sizeof(templateType)]; + if (ReadCompressed( ( unsigned char* ) output, sizeof(templateType) * 8, true )) + { + ReverseBytes(output, (unsigned char*)&outTemplateVar, sizeof(templateType)); + return true; + } + return false; + } + else +#endif + return ReadCompressed( ( unsigned char* ) & outTemplateVar, sizeof(templateType) * 8, true ); + } + } + + template <> + inline bool BitStream::ReadCompressed(SystemAddress &outTemplateVar) + { + return Read(outTemplateVar); + } + + template <> + inline bool BitStream::ReadCompressed(uint24_t &outTemplateVar) + { + return Read(outTemplateVar); + } + + template <> + inline bool BitStream::ReadCompressed(RakNetGUID &outTemplateVar) + { + return Read(outTemplateVar); + } + + template <> + inline bool BitStream::ReadCompressed(bool &outTemplateVar) + { + return Read(outTemplateVar); + } + + /// For values between -1 and 1 + template <> + inline bool BitStream::ReadCompressed(float &outTemplateVar) + { + unsigned short compressedFloat; + if (Read(compressedFloat)) + { + outTemplateVar = ((float)compressedFloat / 32767.5f - 1.0f); + return true; + } + return false; + } + + /// For values between -1 and 1 + template <> + inline bool BitStream::ReadCompressed(double &outTemplateVar) + { + uint32_t compressedFloat; + if (Read(compressedFloat)) + { + outTemplateVar = ((double)compressedFloat / 2147483648.0 - 1.0); + return true; + } + return false; + } + + /// For strings + template <> + inline bool BitStream::ReadCompressed(RakString &outTemplateVar) + { + return outTemplateVar.DeserializeCompressed(this,false); + } + template <> + inline bool BitStream::ReadCompressed(RakWString &outTemplateVar) + { + return outTemplateVar.Deserialize(this); + } + template <> + inline bool BitStream::ReadCompressed(char *&outTemplateVar) + { + return RakString::DeserializeCompressed(outTemplateVar,this,false); + } + template <> + inline bool BitStream::ReadCompressed(wchar_t *&outTemplateVar) + { + return RakWString::Deserialize(outTemplateVar,this); + } + template <> + inline bool BitStream::ReadCompressed(unsigned char *&outTemplateVar) + { + return RakString::DeserializeCompressed((char*) outTemplateVar,this,false); + } + + /// \brief Read any integral type from a bitstream. + /// \details If the written value differed from the value compared against in the write function, + /// var will be updated. Otherwise it will retain the current value. + /// the current value will be updated. + /// For floating point, this is lossy, using 2 bytes for a float and 4 for a double. The range must be between -1 and +1. + /// For non-floating point, this is lossless, but only has benefit if you use less than half the bits of the type + /// If you are not using __BITSTREAM_NATIVE_END the opposite is true for types larger than 1 byte + /// ReadCompressedDelta is only valid from a previous call to WriteDelta + /// \param[in] outTemplateVar The value to read + template + inline bool BitStream::ReadCompressedDelta(templateType &outTemplateVar) + { + bool dataWritten; + bool success; + success=Read(dataWritten); + if (dataWritten) + success=ReadCompressed(outTemplateVar); + return success; + } + + /// \brief Read a bool from a bitstream. + /// \param[in] outTemplateVar The value to read + template <> + inline bool BitStream::ReadCompressedDelta(bool &outTemplateVar) + { + return Read(outTemplateVar); + } + + template + void BitStream::WriteCasted( const sourceType &value ) + { + destinationType val = (destinationType) value; + Write(val); + } + + template + void BitStream::WriteBitsFromIntegerRange( const templateType value, const templateType minimum,const templateType maximum, bool allowOutsideRange ) + { + int requiredBits=BYTES_TO_BITS(sizeof(templateType))-NumberOfLeadingZeroes(templateType(maximum-minimum)); + WriteBitsFromIntegerRange(value,minimum,maximum,requiredBits,allowOutsideRange); + } + template + void BitStream::WriteBitsFromIntegerRange( const templateType value, const templateType minimum,const templateType maximum, const int requiredBits, bool allowOutsideRange ) + { + RakAssert(maximum>=minimum); + RakAssert(allowOutsideRange==true || (value>=minimum && value<=maximum)); + if (allowOutsideRange) + { + if (valuemaximum) + { + Write(true); + Write(value); + return; + } + Write(false); + } + templateType valueOffMin=value-minimum; + if (IsBigEndian()==true) + { + unsigned char output[sizeof(templateType)]; + ReverseBytes((unsigned char*)&valueOffMin, output, sizeof(templateType)); + WriteBits(output,requiredBits); + } + else + { + WriteBits((unsigned char*) &valueOffMin,requiredBits); + } + } + + template // templateType for this function must be a float or double + void BitStream::WriteNormVector( templateType x, templateType y, templateType z ) + { +#ifdef _DEBUG + RakAssert(x <= 1.01 && y <= 1.01 && z <= 1.01 && x >= -1.01 && y >= -1.01 && z >= -1.01); +#endif + + WriteFloat16((float)x,-1.0f,1.0f); + WriteFloat16((float)y,-1.0f,1.0f); + WriteFloat16((float)z,-1.0f,1.0f); + } + + template // templateType for this function must be a float or double + void BitStream::WriteVector( templateType x, templateType y, templateType z ) + { + templateType magnitude = sqrt(x * x + y * y + z * z); + Write((float)magnitude); + if (magnitude > 0.00001f) + { + WriteCompressed((float)(x/magnitude)); + WriteCompressed((float)(y/magnitude)); + WriteCompressed((float)(z/magnitude)); + // Write((unsigned short)((x/magnitude+1.0f)*32767.5f)); + // Write((unsigned short)((y/magnitude+1.0f)*32767.5f)); + // Write((unsigned short)((z/magnitude+1.0f)*32767.5f)); + } + } + + template // templateType for this function must be a float or double + void BitStream::WriteNormQuat( templateType w, templateType x, templateType y, templateType z) + { + Write((bool)(w<0.0)); + Write((bool)(x<0.0)); + Write((bool)(y<0.0)); + Write((bool)(z<0.0)); + Write((unsigned short)(fabs(x)*65535.0)); + Write((unsigned short)(fabs(y)*65535.0)); + Write((unsigned short)(fabs(z)*65535.0)); + // Leave out w and calculate it on the target + } + + template // templateType for this function must be a float or double + void BitStream::WriteOrthMatrix( + templateType m00, templateType m01, templateType m02, + templateType m10, templateType m11, templateType m12, + templateType m20, templateType m21, templateType m22 ) + { + + double qw; + double qx; + double qy; + double qz; + + // Convert matrix to quat + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/ + float sum; + sum = 1 + m00 + m11 + m22; + if (sum < 0.0f) sum=0.0f; + qw = sqrt( sum ) / 2; + sum = 1 + m00 - m11 - m22; + if (sum < 0.0f) sum=0.0f; + qx = sqrt( sum ) / 2; + sum = 1 - m00 + m11 - m22; + if (sum < 0.0f) sum=0.0f; + qy = sqrt( sum ) / 2; + sum = 1 - m00 - m11 + m22; + if (sum < 0.0f) sum=0.0f; + qz = sqrt( sum ) / 2; + if (qw < 0.0) qw=0.0; + if (qx < 0.0) qx=0.0; + if (qy < 0.0) qy=0.0; + if (qz < 0.0) qz=0.0; + qx = _copysign( (double) qx, (double) (m21 - m12) ); + qy = _copysign( (double) qy, (double) (m02 - m20) ); + qz = _copysign( (double) qz, (double) (m10 - m01) ); + + WriteNormQuat(qw,qx,qy,qz); + } + + template + bool BitStream::ReadCasted( sourceType &value ) + { + serializationType val; + bool success = Read(val); + value=(sourceType) val; + return success; + } + + template + bool BitStream::ReadBitsFromIntegerRange( templateType &value, const templateType minimum, const templateType maximum, bool allowOutsideRange ) + { + int requiredBits=BYTES_TO_BITS(sizeof(templateType))-NumberOfLeadingZeroes(templateType(maximum-minimum)); + return ReadBitsFromIntegerRange(value,minimum,maximum,requiredBits,allowOutsideRange); + } + template + bool BitStream::ReadBitsFromIntegerRange( templateType &value, const templateType minimum, const templateType maximum, const int requiredBits, bool allowOutsideRange ) + { + RakAssert(maximum>=minimum); + if (allowOutsideRange) + { + bool isOutsideRange; + Read(isOutsideRange); + if (isOutsideRange) + return Read(value); + } + unsigned char output[sizeof(templateType)]; + memset(output,0,sizeof(output)); + bool success = ReadBits(output,requiredBits); + if (success) + { + if (IsBigEndian()==true) + ReverseBytesInPlace(output,sizeof(output)); + memcpy(&value,output,sizeof(output)); + + value+=minimum; + } + + return success; + } + + template // templateType for this function must be a float or double + bool BitStream::ReadNormVector( templateType &x, templateType &y, templateType &z ) + { + float xIn,yIn,zIn; + ReadFloat16(xIn,-1.0f,1.0f); + ReadFloat16(yIn,-1.0f,1.0f); + ReadFloat16(zIn,-1.0f,1.0f); + x=xIn; + y=yIn; + z=zIn; + return true; + } + + template // templateType for this function must be a float or double + bool BitStream::ReadVector( templateType &x, templateType &y, templateType &z ) + { + float magnitude; + //unsigned short sx,sy,sz; + if (!Read(magnitude)) + return false; + if (magnitude>0.00001f) + { + // Read(sx); + // Read(sy); + // if (!Read(sz)) + // return false; + // x=((float)sx / 32767.5f - 1.0f) * magnitude; + // y=((float)sy / 32767.5f - 1.0f) * magnitude; + // z=((float)sz / 32767.5f - 1.0f) * magnitude; + float cx,cy,cz; + ReadCompressed(cx); + ReadCompressed(cy); + if (!ReadCompressed(cz)) + return false; + x=cx; + y=cy; + z=cz; + x*=magnitude; + y*=magnitude; + z*=magnitude; + } + else + { + x=0.0; + y=0.0; + z=0.0; + } + return true; + } + + template // templateType for this function must be a float or double + bool BitStream::ReadNormQuat( templateType &w, templateType &x, templateType &y, templateType &z) + { + bool cwNeg=false, cxNeg=false, cyNeg=false, czNeg=false; + unsigned short cx,cy,cz; + Read(cwNeg); + Read(cxNeg); + Read(cyNeg); + Read(czNeg); + Read(cx); + Read(cy); + if (!Read(cz)) + return false; + + // Calculate w from x,y,z + x=(templateType)(cx/65535.0); + y=(templateType)(cy/65535.0); + z=(templateType)(cz/65535.0); + if (cxNeg) x=-x; + if (cyNeg) y=-y; + if (czNeg) z=-z; + float difference = 1.0f - x*x - y*y - z*z; + if (difference < 0.0f) + difference=0.0f; + w = (templateType)(sqrt(difference)); + if (cwNeg) + w=-w; + + return true; + } + + template // templateType for this function must be a float or double + bool BitStream::ReadOrthMatrix( + templateType &m00, templateType &m01, templateType &m02, + templateType &m10, templateType &m11, templateType &m12, + templateType &m20, templateType &m21, templateType &m22 ) + { + float qw,qx,qy,qz; + if (!ReadNormQuat(qw,qx,qy,qz)) + return false; + + // Quat to orthogonal rotation matrix + // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToMatrix/index.htm + double sqw = (double)qw*(double)qw; + double sqx = (double)qx*(double)qx; + double sqy = (double)qy*(double)qy; + double sqz = (double)qz*(double)qz; + m00 = (templateType)(sqx - sqy - sqz + sqw); // since sqw + sqx + sqy + sqz =1 + m11 = (templateType)(-sqx + sqy - sqz + sqw); + m22 = (templateType)(-sqx - sqy + sqz + sqw); + + double tmp1 = (double)qx*(double)qy; + double tmp2 = (double)qz*(double)qw; + m10 = (templateType)(2.0 * (tmp1 + tmp2)); + m01 = (templateType)(2.0 * (tmp1 - tmp2)); + + tmp1 = (double)qx*(double)qz; + tmp2 = (double)qy*(double)qw; + m20 =(templateType)(2.0 * (tmp1 - tmp2)); + m02 = (templateType)(2.0 * (tmp1 + tmp2)); + tmp1 = (double)qy*(double)qz; + tmp2 = (double)qx*(double)qw; + m21 = (templateType)(2.0 * (tmp1 + tmp2)); + m12 = (templateType)(2.0 * (tmp1 - tmp2)); + + return true; + } + + template + BitStream& operator<<(BitStream& out, templateType& c) + { + out.Write(c); + return out; + } + template + BitStream& operator>>(BitStream& in, templateType& c) + { + bool success = in.Read(c); + RakAssert(success); + return in; + } + +} + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + +#endif + +#endif // VC6 diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CCRakNetSlidingWindow.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CCRakNetSlidingWindow.cpp new file mode 100644 index 0000000..cf32151 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CCRakNetSlidingWindow.cpp @@ -0,0 +1,332 @@ +#include "CCRakNetSlidingWindow.h" + +#if USE_SLIDING_WINDOW_CONGESTION_CONTROL==1 + +static const double UNSET_TIME_US=-1; + +#if CC_TIME_TYPE_BYTES==4 +static const CCTimeType SYN=10; +#else +static const CCTimeType SYN=10000; +#endif + +#include "MTUSize.h" +#include +#include +#include +#include "RakAssert.h" +#include "RakAlloca.h" + +using namespace RakNet; + +// ****************************************************** PUBLIC METHODS ****************************************************** + +CCRakNetSlidingWindow::CCRakNetSlidingWindow() +{ +} +// ---------------------------------------------------------------------------------------------------------------------------- +CCRakNetSlidingWindow::~CCRakNetSlidingWindow() +{ + +} +// ---------------------------------------------------------------------------------------------------------------------------- +void CCRakNetSlidingWindow::Init(CCTimeType curTime, uint32_t maxDatagramPayload) +{ + (void) curTime; + + RTT=UNSET_TIME_US; + MAXIMUM_MTU_INCLUDING_UDP_HEADER=maxDatagramPayload; + cwnd=maxDatagramPayload; + ssThresh=0.0; + oldestUnsentAck=0; + nextDatagramSequenceNumber=0; + nextCongestionControlBlock=0; + backoffThisBlock=speedUpThisBlock=false; + expectedNextSequenceNumber=0; + _isContinuousSend=false; +} +// ---------------------------------------------------------------------------------------------------------------------------- +void CCRakNetSlidingWindow::Update(CCTimeType curTime, bool hasDataToSendOrResend) +{ + (void) curTime; + (void) hasDataToSendOrResend; +} +// ---------------------------------------------------------------------------------------------------------------------------- +int CCRakNetSlidingWindow::GetRetransmissionBandwidth(CCTimeType curTime, CCTimeType timeSinceLastTick, uint32_t unacknowledgedBytes, bool isContinuousSend) +{ + (void) curTime; + (void) isContinuousSend; + (void) timeSinceLastTick; + + return unacknowledgedBytes; +} +// ---------------------------------------------------------------------------------------------------------------------------- +int CCRakNetSlidingWindow::GetTransmissionBandwidth(CCTimeType curTime, CCTimeType timeSinceLastTick, uint32_t unacknowledgedBytes, bool isContinuousSend) +{ + (void) curTime; + (void) timeSinceLastTick; + + _isContinuousSend=isContinuousSend; + + if (unacknowledgedBytes<=cwnd) + return (int) (cwnd-unacknowledgedBytes); + else + return 0; +} +// ---------------------------------------------------------------------------------------------------------------------------- +bool CCRakNetSlidingWindow::ShouldSendACKs(CCTimeType curTime, CCTimeType estimatedTimeToNextTick) +{ + CCTimeType rto = GetSenderRTOForACK(); + (void) estimatedTimeToNextTick; + + // iphone crashes on comparison between double and int64 http://www.jenkinssoftware.com/forum/index.php?topic=2717.0 + if (rto==(CCTimeType) UNSET_TIME_US) + { + // Unknown how long until the remote system will retransmit, so better send right away + return true; + } + + return curTime >= oldestUnsentAck + SYN; +} +// ---------------------------------------------------------------------------------------------------------------------------- +DatagramSequenceNumberType CCRakNetSlidingWindow::GetNextDatagramSequenceNumber(void) +{ + return nextDatagramSequenceNumber; +} +// ---------------------------------------------------------------------------------------------------------------------------- +DatagramSequenceNumberType CCRakNetSlidingWindow::GetAndIncrementNextDatagramSequenceNumber(void) +{ + DatagramSequenceNumberType dsnt=nextDatagramSequenceNumber; + nextDatagramSequenceNumber++; + return dsnt; +} +// ---------------------------------------------------------------------------------------------------------------------------- +void CCRakNetSlidingWindow::OnSendBytes(CCTimeType curTime, uint32_t numBytes) +{ + (void) curTime; + (void) numBytes; +} +// ---------------------------------------------------------------------------------------------------------------------------- +void CCRakNetSlidingWindow::OnGotPacketPair(DatagramSequenceNumberType datagramSequenceNumber, uint32_t sizeInBytes, CCTimeType curTime) +{ + (void) curTime; + (void) sizeInBytes; + (void) datagramSequenceNumber; +} +// ---------------------------------------------------------------------------------------------------------------------------- +bool CCRakNetSlidingWindow::OnGotPacket(DatagramSequenceNumberType datagramSequenceNumber, bool isContinuousSend, CCTimeType curTime, uint32_t sizeInBytes, uint32_t *skippedMessageCount) +{ + (void) curTime; + (void) sizeInBytes; + (void) isContinuousSend; + + if (oldestUnsentAck==0) + oldestUnsentAck=curTime; + + if (datagramSequenceNumber==expectedNextSequenceNumber) + { + *skippedMessageCount=0; + expectedNextSequenceNumber=datagramSequenceNumber+(DatagramSequenceNumberType)1; + } + else if (GreaterThan(datagramSequenceNumber, expectedNextSequenceNumber)) + { + *skippedMessageCount=datagramSequenceNumber-expectedNextSequenceNumber; + // Sanity check, just use timeout resend if this was really valid + if (*skippedMessageCount>1000) + { + // During testing, the nat punchthrough server got 51200 on the first packet. I have no idea where this comes from, but has happened twice + if (*skippedMessageCount>(uint32_t)50000) + return false; + *skippedMessageCount=1000; + } + expectedNextSequenceNumber=datagramSequenceNumber+(DatagramSequenceNumberType)1; + } + else + { + *skippedMessageCount=0; + } + + return true; +} +// ---------------------------------------------------------------------------------------------------------------------------- +void CCRakNetSlidingWindow::OnResend(CCTimeType curTime) +{ + (void) curTime; + + if (_isContinuousSend && backoffThisBlock==false && cwnd>MAXIMUM_MTU_INCLUDING_UDP_HEADER*2) + { + ssThresh=cwnd/2; + if (ssThreshssThresh && ssThresh!=0) + { + cwnd=ssThresh; + cwnd+=MAXIMUM_MTU_INCLUDING_UDP_HEADER*MAXIMUM_MTU_INCLUDING_UDP_HEADER/cwnd; + } + } + } + } + else + { + if (isNewCongestionControlPeriod) + cwnd+=MAXIMUM_MTU_INCLUDING_UDP_HEADER*MAXIMUM_MTU_INCLUDING_UDP_HEADER/cwnd; + } +} +// ---------------------------------------------------------------------------------------------------------------------------- +void CCRakNetSlidingWindow::OnDuplicateAck( CCTimeType curTime, DatagramSequenceNumberType sequenceNumber ) +{ + (void) sequenceNumber; + + OnResend(curTime); +} +// ---------------------------------------------------------------------------------------------------------------------------- +void CCRakNetSlidingWindow::OnSendAckGetBAndAS(CCTimeType curTime, bool *hasBAndAS, BytesPerMicrosecond *_B, BytesPerMicrosecond *_AS) +{ + (void) curTime; + (void) _B; + (void) _AS; + + *hasBAndAS=false; +} +// ---------------------------------------------------------------------------------------------------------------------------- +void CCRakNetSlidingWindow::OnSendAck(CCTimeType curTime, uint32_t numBytes) +{ + (void) curTime; + (void) numBytes; + + oldestUnsentAck=0; +} +// ---------------------------------------------------------------------------------------------------------------------------- +void CCRakNetSlidingWindow::OnSendNACK(CCTimeType curTime, uint32_t numBytes) +{ + (void) curTime; + (void) numBytes; + +} +// ---------------------------------------------------------------------------------------------------------------------------- +CCTimeType CCRakNetSlidingWindow::GetRTOForRetransmission(void) const +{ +#if CC_TIME_TYPE_BYTES==4 + const CCTimeType maxThreshold=2000; + const CCTimeType minThreshold=100; +#else + const CCTimeType maxThreshold=2000000; + const CCTimeType minThreshold=100000; +#endif + + if (RTT==UNSET_TIME_US) + { + return maxThreshold; + } + + if (RTT * 3 > maxThreshold) + return maxThreshold; + if (RTT * 3 < minThreshold) + return minThreshold; + return (CCTimeType) RTT * 3; +} +// ---------------------------------------------------------------------------------------------------------------------------- +void CCRakNetSlidingWindow::SetMTU(uint32_t bytes) +{ + MAXIMUM_MTU_INCLUDING_UDP_HEADER=bytes; +} +// ---------------------------------------------------------------------------------------------------------------------------- +uint32_t CCRakNetSlidingWindow::GetMTU(void) const +{ + return MAXIMUM_MTU_INCLUDING_UDP_HEADER; +} +// ---------------------------------------------------------------------------------------------------------------------------- +BytesPerMicrosecond CCRakNetSlidingWindow::GetLocalReceiveRate(CCTimeType currentTime) const +{ + (void) currentTime; + + return 0; // TODO +} +// ---------------------------------------------------------------------------------------------------------------------------- +double CCRakNetSlidingWindow::GetRTT(void) const +{ + if (RTT==UNSET_TIME_US) + return 0.0; + return RTT; +} +// ---------------------------------------------------------------------------------------------------------------------------- +bool CCRakNetSlidingWindow::GreaterThan(DatagramSequenceNumberType a, DatagramSequenceNumberType b) +{ + // a > b? + const DatagramSequenceNumberType halfSpan =(DatagramSequenceNumberType) (((DatagramSequenceNumberType)(const uint32_t)-1)/(DatagramSequenceNumberType)2); + return b!=a && b-a>halfSpan; +} +// ---------------------------------------------------------------------------------------------------------------------------- +bool CCRakNetSlidingWindow::LessThan(DatagramSequenceNumberType a, DatagramSequenceNumberType b) +{ + // a < b? + const DatagramSequenceNumberType halfSpan = ((DatagramSequenceNumberType)(const uint32_t)-1)/(DatagramSequenceNumberType)2; + return b!=a && b-a b, accounting for variable overflow? + static bool GreaterThan(DatagramSequenceNumberType a, DatagramSequenceNumberType b); + /// Is a < b, accounting for variable overflow? + static bool LessThan(DatagramSequenceNumberType a, DatagramSequenceNumberType b); +// void SetTimeBetweenSendsLimit(unsigned int bitsPerSecond); + uint64_t GetBytesPerSecondLimitByCongestionControl(void) const; + + protected: + + // Maximum amount of bytes that the user can send, e.g. the size of one full datagram + uint32_t MAXIMUM_MTU_INCLUDING_UDP_HEADER; + + double RTT; + + double cwnd; // max bytes on wire + double ssThresh; // Threshhold between slow start and congestion avoidance + + /// When we get an ack, if oldestUnsentAck==0, set it to the current time + /// When we send out acks, set oldestUnsentAck to 0 + CCTimeType oldestUnsentAck; + + CCTimeType GetSenderRTOForACK(void) const; + + /// Every outgoing datagram is assigned a sequence number, which increments by 1 every assignment + DatagramSequenceNumberType nextDatagramSequenceNumber; + DatagramSequenceNumberType nextCongestionControlBlock; + bool backoffThisBlock, speedUpThisBlock; + /// Track which datagram sequence numbers have arrived. + /// If a sequence number is skipped, send a NAK for all skipped messages + DatagramSequenceNumberType expectedNextSequenceNumber; + + bool _isContinuousSend; + + bool IsInSlowStart(void) const; +}; + +} + +#endif + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CCRakNetUDT.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CCRakNetUDT.cpp new file mode 100644 index 0000000..c6a8c79 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CCRakNetUDT.cpp @@ -0,0 +1,798 @@ +#include "CCRakNetUDT.h" + +#if USE_SLIDING_WINDOW_CONGESTION_CONTROL!=1 + +#include "Rand.h" +#include "MTUSize.h" +#include +#include +#include +//#include +#include "RakAssert.h" +#include "RakAlloca.h" + +using namespace RakNet; + +static const double UNSET_TIME_US=-1; +static const double CWND_MIN_THRESHOLD=2.0; +static const double UNDEFINED_TRANSFER_RATE=0.0; +/// Interval at which to update aspects of the system +/// 1. send acks +/// 2. update time interval between outgoing packets +/// 3, Yodate retransmit timeout +#if CC_TIME_TYPE_BYTES==4 +static const CCTimeType SYN=10; +#else +static const CCTimeType SYN=10000; +#endif + +#if CC_TIME_TYPE_BYTES==4 +#define MAX_RTT 1000 +#define RTT_TOLERANCE 30 +#else +#define MAX_RTT 1000000 +#define RTT_TOLERANCE 30000 +#endif + + +double RTTVarMultiple=4.0; + + +// ****************************************************** PUBLIC METHODS ****************************************************** + +CCRakNetUDT::CCRakNetUDT() +{ +} + +// ---------------------------------------------------------------------------------------------------------------------------- + +CCRakNetUDT::~CCRakNetUDT() +{ +} +// ---------------------------------------------------------------------------------------------------------------------------- +void CCRakNetUDT::Init(CCTimeType curTime, uint32_t maxDatagramPayload) +{ + (void) curTime; + + nextSYNUpdate=0; + packetPairRecieptHistoryWriteIndex=0; + packetArrivalHistoryWriteIndex=0; + packetArrivalHistoryWriteCount=0; + RTT=UNSET_TIME_US; + // RTTVar=UNSET_TIME_US; + isInSlowStart=true; + NAKCount=1000; + AvgNAKNum=1; + DecInterval=1; + DecCount=0; + nextDatagramSequenceNumber=0; + lastPacketPairPacketArrivalTime=0; + lastPacketPairSequenceNumber=(DatagramSequenceNumberType)(const uint32_t)-1; + lastPacketArrivalTime=0; + CWND=CWND_MIN_THRESHOLD; + lastUpdateWindowSizeAndAck=0; + lastTransmitOfBAndAS=0; + ExpCount=1.0; + totalUserDataBytesSent=0; + oldestUnsentAck=0; + MAXIMUM_MTU_INCLUDING_UDP_HEADER=maxDatagramPayload; + CWND_MAX_THRESHOLD=RESEND_BUFFER_ARRAY_LENGTH; +#if CC_TIME_TYPE_BYTES==4 + const BytesPerMicrosecond DEFAULT_TRANSFER_RATE=(BytesPerMicrosecond) 3.6; +#else + const BytesPerMicrosecond DEFAULT_TRANSFER_RATE=(BytesPerMicrosecond) .0036; +#endif + +#if CC_TIME_TYPE_BYTES==4 + lastRttOnIncreaseSendRate=1000; +#else + lastRttOnIncreaseSendRate=1000000; +#endif + nextCongestionControlBlock=0; + lastRtt=0; + + // B=DEFAULT_TRANSFER_RATE; + AS=UNDEFINED_TRANSFER_RATE; + const MicrosecondsPerByte DEFAULT_BYTE_INTERVAL=(MicrosecondsPerByte) (1.0/DEFAULT_TRANSFER_RATE); + SND=DEFAULT_BYTE_INTERVAL; + expectedNextSequenceNumber=0; + sendBAndASCount=0; + packetArrivalHistoryContinuousGapsIndex=0; + //packetPairRecipetHistoryGapsIndex=0; + hasWrittenToPacketPairReceiptHistory=false; + InitPacketArrivalHistory(); + + estimatedLinkCapacityBytesPerSecond=0; + bytesCanSendThisTick=0; + hadPacketlossThisBlock=false; + pingsLastInterval.Clear(__FILE__,__LINE__); +} +// ---------------------------------------------------------------------------------------------------------------------------- +void CCRakNetUDT::SetMTU(uint32_t bytes) +{ + MAXIMUM_MTU_INCLUDING_UDP_HEADER=bytes; +} +// ---------------------------------------------------------------------------------------------------------------------------- +uint32_t CCRakNetUDT::GetMTU(void) const +{ + return MAXIMUM_MTU_INCLUDING_UDP_HEADER; +} +// ---------------------------------------------------------------------------------------------------------------------------- +void CCRakNetUDT::Update(CCTimeType curTime, bool hasDataToSendOrResend) +{ + (void) hasDataToSendOrResend; + (void) curTime; + + return; + + // I suspect this is causing major lag + + /* + if (hasDataToSendOrResend==false) + halveSNDOnNoDataTime=0; + else if (halveSNDOnNoDataTime==0) + { + UpdateHalveSNDOnNoDataTime(curTime); + ExpCount=1.0; + } + + // If you send, and get no data at all from that time to RTO, then halve send rate7 + if (HasHalveSNDOnNoDataTimeElapsed(curTime)) + { + /// 2000 bytes per second + /// 0.0005 seconds per byte + /// 0.5 milliseconds per byte + /// 500 microseconds per byte + // printf("No incoming data, halving send rate\n"); + SND*=2.0; + CapMinSnd(_FILE_AND_LINE_); + ExpCount+=1.0; + if (ExpCount>8.0) + ExpCount=8.0; + + UpdateHalveSNDOnNoDataTime(curTime); + } + */ +} +// ---------------------------------------------------------------------------------------------------------------------------- +int CCRakNetUDT::GetRetransmissionBandwidth(CCTimeType curTime, CCTimeType timeSinceLastTick, uint32_t unacknowledgedBytes, bool isContinuousSend) +{ + (void) curTime; + + if (isInSlowStart) + { + uint32_t CWNDLimit = (uint32_t) (CWND*MAXIMUM_MTU_INCLUDING_UDP_HEADER); + return CWNDLimit; + } + return GetTransmissionBandwidth(curTime,timeSinceLastTick,unacknowledgedBytes,isContinuousSend); +} +// ---------------------------------------------------------------------------------------------------------------------------- +int CCRakNetUDT::GetTransmissionBandwidth(CCTimeType curTime, CCTimeType timeSinceLastTick, uint32_t unacknowledgedBytes, bool isContinuousSend) +{ + (void) curTime; + + if (isInSlowStart) + { + uint32_t CWNDLimit = (uint32_t) (CWND*MAXIMUM_MTU_INCLUDING_UDP_HEADER-unacknowledgedBytes); + return CWNDLimit; + } + if (bytesCanSendThisTick>0) + bytesCanSendThisTick=0; + +#if CC_TIME_TYPE_BYTES==4 + if (isContinuousSend==false && timeSinceLastTick>100) + timeSinceLastTick=100; +#else + if (isContinuousSend==false && timeSinceLastTick>100000) + timeSinceLastTick=100000; +#endif + + bytesCanSendThisTick=(int)((double)timeSinceLastTick*((double)1.0/SND)+(double)bytesCanSendThisTick); + if (bytesCanSendThisTick>0) + return bytesCanSendThisTick; + return 0; +} +uint64_t CCRakNetUDT::GetBytesPerSecondLimitByCongestionControl(void) const +{ + if (isInSlowStart) + return 0; +#if CC_TIME_TYPE_BYTES==4 + return (uint64_t) ((double)1.0/(SND*1000.0)); +#else + return (uint64_t) ((double)1.0/(SND*1000000.0)); +#endif +} +// ---------------------------------------------------------------------------------------------------------------------------- +bool CCRakNetUDT::ShouldSendACKs(CCTimeType curTime, CCTimeType estimatedTimeToNextTick) +{ + CCTimeType rto = GetSenderRTOForACK(); + + // iphone crashes on comparison between double and int64 http://www.jenkinssoftware.com/forum/index.php?topic=2717.0 + if (rto==(CCTimeType) UNSET_TIME_US) + { + // Unknown how long until the remote system will retransmit, so better send right away + return true; + } + + + // CCTimeType remoteRetransmitTime=oldestUnsentAck+rto-RTT*.5; + // CCTimeType ackArrivalTimeIfWeDelay=RTT*.5+estimatedTimeToNextTick+curTime; + // return ackArrivalTimeIfWeDelay= oldestUnsentAck + SYN || + estimatedTimeToNextTick+curTime < oldestUnsentAck+rto-RTT; +} +// ---------------------------------------------------------------------------------------------------------------------------- +DatagramSequenceNumberType CCRakNetUDT::GetNextDatagramSequenceNumber(void) +{ + return nextDatagramSequenceNumber; +} +// ---------------------------------------------------------------------------------------------------------------------------- +DatagramSequenceNumberType CCRakNetUDT::GetAndIncrementNextDatagramSequenceNumber(void) +{ + DatagramSequenceNumberType dsnt=nextDatagramSequenceNumber; + nextDatagramSequenceNumber++; + return dsnt; +} +// ---------------------------------------------------------------------------------------------------------------------------- +void CCRakNetUDT::OnSendBytes(CCTimeType curTime, uint32_t numBytes) +{ + (void) curTime; + + totalUserDataBytesSent+=numBytes; + if (isInSlowStart==false) + bytesCanSendThisTick-=numBytes; +} + +// ****************************************************** PROTECTED METHODS ****************************************************** + +void CCRakNetUDT::SetNextSYNUpdate(CCTimeType currentTime) +{ + nextSYNUpdate+=SYN; + if (nextSYNUpdate < currentTime) + nextSYNUpdate=currentTime+SYN; +} +// ---------------------------------------------------------------------------------------------------------------------------- +BytesPerMicrosecond CCRakNetUDT::ReceiverCalculateDataArrivalRate(CCTimeType curTime) const +{ + (void) curTime; + // Not an instantaneous measurement + /* + if (continuousBytesReceivedStartTime!=0 && curTime>continuousBytesReceivedStartTime) + { + #if CC_TIME_TYPE_BYTES==4 + const CCTimeType threshold=100; + #else + const CCTimeType threshold=100000; + #endif + if (curTime-continuousBytesReceivedStartTime>threshold) + return (BytesPerMicrosecond) continuousBytesReceived/(BytesPerMicrosecond) (curTime-continuousBytesReceivedStartTime); + } + + return UNDEFINED_TRANSFER_RATE; + */ + + + if (packetArrivalHistoryWriteCount=oneEighthMedian && + packetArrivalHistory[i] b? + const DatagramSequenceNumberType halfSpan =(DatagramSequenceNumberType) (((DatagramSequenceNumberType)(const uint32_t)-1)/(DatagramSequenceNumberType)2); + return b!=a && b-a>halfSpan; +} +// ---------------------------------------------------------------------------------------------------------------------------- +bool CCRakNetUDT::LessThan(DatagramSequenceNumberType a, DatagramSequenceNumberType b) +{ + // a < b? + const DatagramSequenceNumberType halfSpan = ((DatagramSequenceNumberType)(const uint32_t)-1)/(DatagramSequenceNumberType)2; + return b!=a && b-amaxThreshold) + return maxThreshold; + return ret; +} +// ---------------------------------------------------------------------------------------------------------------------------- +void CCRakNetUDT::OnResend(CCTimeType curTime) +{ + (void) curTime; + + if (isInSlowStart) + { + if (AS!=UNDEFINED_TRANSFER_RATE) + EndSlowStart(); + return; + } + + if (hadPacketlossThisBlock==false) + { + // Logging + // printf("Sending SLOWER due to Resend, Rate=%f MBPS. Rtt=%i\n", GetLocalSendRate(), lastRtt ); + + IncreaseTimeBetweenSends(); + hadPacketlossThisBlock=true; + } +} +// ---------------------------------------------------------------------------------------------------------------------------- +void CCRakNetUDT::OnNAK(CCTimeType curTime, DatagramSequenceNumberType nakSequenceNumber) +{ + (void) nakSequenceNumber; + (void) curTime; + + if (isInSlowStart) + { + if (AS!=UNDEFINED_TRANSFER_RATE) + EndSlowStart(); + return; + } + + if (hadPacketlossThisBlock==false) + { + // Logging + //printf("Sending SLOWER due to NAK, Rate=%f MBPS. Rtt=%i\n", GetLocalSendRate(), lastRtt ); + if (pingsLastInterval.Size()>10) + { + for (int i=0; i < 10; i++) + printf("%i, ", pingsLastInterval[pingsLastInterval.Size()-1-i]/1000); + } + printf("\n"); + IncreaseTimeBetweenSends(); + + hadPacketlossThisBlock=true; + } +} +// ---------------------------------------------------------------------------------------------------------------------------- +void CCRakNetUDT::EndSlowStart(void) +{ + RakAssert(isInSlowStart==true); + RakAssert(AS!=UNDEFINED_TRANSFER_RATE); + + // This overestimates + estimatedLinkCapacityBytesPerSecond=AS * 1000000.0; + + isInSlowStart=false; + SND=1.0/AS; + CapMinSnd(_FILE_AND_LINE_); + + // printf("ENDING SLOW START\n"); +#if CC_TIME_TYPE_BYTES==4 + // printf("Initial SND=%f Kilobytes per second\n", 1.0/SND); +#else + // printf("Initial SND=%f Megabytes per second\n", 1.0/SND); +#endif + if (SND > .1) + PrintLowBandwidthWarning(); +} +// ---------------------------------------------------------------------------------------------------------------------------- +void CCRakNetUDT::OnGotPacketPair(DatagramSequenceNumberType datagramSequenceNumber, uint32_t sizeInBytes, CCTimeType curTime) +{ + (void) datagramSequenceNumber; + (void) sizeInBytes; + (void) curTime; + +} +// ---------------------------------------------------------------------------------------------------------------------------- +bool CCRakNetUDT::OnGotPacket(DatagramSequenceNumberType datagramSequenceNumber, bool isContinuousSend, CCTimeType curTime, uint32_t sizeInBytes, uint32_t *skippedMessageCount) +{ + CC_DEBUG_PRINTF_2("R%i ",datagramSequenceNumber.val); + + if (datagramSequenceNumber==expectedNextSequenceNumber) + { + *skippedMessageCount=0; + expectedNextSequenceNumber=datagramSequenceNumber+(DatagramSequenceNumberType)1; + } + else if (GreaterThan(datagramSequenceNumber, expectedNextSequenceNumber)) + { + *skippedMessageCount=datagramSequenceNumber-expectedNextSequenceNumber; + // Sanity check, just use timeout resend if this was really valid + if (*skippedMessageCount>1000) + { + // During testing, the nat punchthrough server got 51200 on the first packet. I have no idea where this comes from, but has happened twice + if (*skippedMessageCount>(uint32_t)50000) + return false; + *skippedMessageCount=1000; + } + expectedNextSequenceNumber=datagramSequenceNumber+(DatagramSequenceNumberType)1; + } + else + { + *skippedMessageCount=0; + } + + if (curTime>lastPacketArrivalTime) + { + CCTimeType interval = curTime-lastPacketArrivalTime; + + // printf("Packet arrival gap is %I64u\n", (interval)); + + if (isContinuousSend) + { + continuousBytesReceived+=sizeInBytes; + if (continuousBytesReceivedStartTime==0) + continuousBytesReceivedStartTime=lastPacketArrivalTime; + + + mostRecentPacketArrivalHistory=(BytesPerMicrosecond)sizeInBytes/(BytesPerMicrosecond)interval; + + // if (mostRecentPacketArrivalHistory < (BytesPerMicrosecond)0.0035) + // { + // printf("%s:%i LIKELY BUG: Calculated packetArrivalHistory is below 28.8 Kbps modem\nReport to rakkar@jenkinssoftware.com with file and line number\n", _FILE_AND_LINE_); + // } + + packetArrivalHistoryContinuousGaps[packetArrivalHistoryContinuousGapsIndex++]=(int) interval; + packetArrivalHistoryContinuousGapsIndex&=(CC_RAKNET_UDT_PACKET_HISTORY_LENGTH-1); + + packetArrivalHistoryWriteCount++; + packetArrivalHistory[packetArrivalHistoryWriteIndex++]=mostRecentPacketArrivalHistory; + // Wrap to 0 at the end of the range + // Assumes power of 2 for CC_RAKNET_UDT_PACKET_HISTORY_LENGTH + packetArrivalHistoryWriteIndex&=(CC_RAKNET_UDT_PACKET_HISTORY_LENGTH-1); + } + else + { + continuousBytesReceivedStartTime=0; + continuousBytesReceived=0; + } + + lastPacketArrivalTime=curTime; + } + return true; +} +// ---------------------------------------------------------------------------------------------------------------------------- +void CCRakNetUDT::OnAck(CCTimeType curTime, CCTimeType rtt, bool hasBAndAS, BytesPerMicrosecond _B, BytesPerMicrosecond _AS, double totalUserDataBytesAcked, bool isContinuousSend, DatagramSequenceNumberType sequenceNumber ) +{ +#if CC_TIME_TYPE_BYTES==4 + RakAssert(rtt < 10000); +#else + RakAssert(rtt < 10000000); +#endif + (void) _B; + + if (hasBAndAS) + { + /// RakAssert(_B!=UNDEFINED_TRANSFER_RATE && _AS!=UNDEFINED_TRANSFER_RATE); + // B=B * .875 + _B * .125; + // AS is packet arrival rate + RakAssert(_AS!=UNDEFINED_TRANSFER_RATE); + AS=_AS; + CC_DEBUG_PRINTF_4("ArrivalRate=%f linkCap=%f incomingLinkCap=%f\n", _AS,B,_B); + } + + if (oldestUnsentAck==0) + oldestUnsentAck=curTime; + + if (isInSlowStart==true) + { + nextCongestionControlBlock=nextDatagramSequenceNumber; + lastRttOnIncreaseSendRate=rtt; + UpdateWindowSizeAndAckOnAckPreSlowStart(totalUserDataBytesAcked); + } + else + { + UpdateWindowSizeAndAckOnAckPerSyn(curTime, rtt, isContinuousSend, sequenceNumber); + } + + lastUpdateWindowSizeAndAck=curTime; +} +// ---------------------------------------------------------------------------------------------------------------------------- +void CCRakNetUDT::OnSendAckGetBAndAS(CCTimeType curTime, bool *hasBAndAS, BytesPerMicrosecond *_B, BytesPerMicrosecond *_AS) +{ + if (curTime>lastTransmitOfBAndAS+SYN) + { + *_B=0; + *_AS=ReceiverCalculateDataArrivalRate(curTime); + + if (*_AS==UNDEFINED_TRANSFER_RATE) + { + *hasBAndAS=false; + } + else + { + *hasBAndAS=true; + } + } + else + { + *hasBAndAS=false; + } +} +// ---------------------------------------------------------------------------------------------------------------------------- +void CCRakNetUDT::OnSendAck(CCTimeType curTime, uint32_t numBytes) +{ + (void) numBytes; + (void) curTime; + + // This is not accounted for on the remote system, and thus causes bandwidth to be underutilized + //UpdateNextAllowedSend(curTime, numBytes+UDP_HEADER_SIZE); + + oldestUnsentAck=0; +} +// ---------------------------------------------------------------------------------------------------------------------------- +void CCRakNetUDT::OnSendNACK(CCTimeType curTime, uint32_t numBytes) +{ + (void) numBytes; + (void) curTime; + + // This is not accounted for on the remote system, and thus causes bandwidth to be underutilized + // UpdateNextAllowedSend(curTime, numBytes+UDP_HEADER_SIZE); +} +// ---------------------------------------------------------------------------------------------------------------------------- +void CCRakNetUDT::UpdateWindowSizeAndAckOnAckPreSlowStart(double totalUserDataBytesAcked) +{ + // During slow start, max window size is the number of full packets that have been sent out + // CWND=(double) ((double)totalUserDataBytesSent/(double)MAXIMUM_MTU_INCLUDING_UDP_HEADER); + CC_DEBUG_PRINTF_3("CWND increasing from %f to %f\n", CWND, (double) ((double)totalUserDataBytesAcked/(double)MAXIMUM_MTU_INCLUDING_UDP_HEADER)); + CWND=(double) ((double)totalUserDataBytesAcked/(double)MAXIMUM_MTU_INCLUDING_UDP_HEADER); + if (CWND>=CWND_MAX_THRESHOLD) + { + CWND=CWND_MAX_THRESHOLD; + + if (AS!=UNDEFINED_TRANSFER_RATE) + EndSlowStart(); + } + if (CWNDintervalSize) + pingsLastInterval.Pop(); + if (GreaterThan(sequenceNumber, nextCongestionControlBlock) && + sequenceNumber-nextCongestionControlBlock>=intervalSize && + pingsLastInterval.Size()==intervalSize) + { + double slopeSum=0.0; + double average=(double) pingsLastInterval[0]; + int sampleSize=pingsLastInterval.Size(); + for (int i=1; i < sampleSize; i++) + { + slopeSum+=(double)pingsLastInterval[i]-(double)pingsLastInterval[i-1]; + average+=pingsLastInterval[i]; + } + average/=sampleSize; + + if (hadPacketlossThisBlock==true) + { + } + else if (slopeSum < -.10*average) + { + // Logging + //printf("Ping dropping. slope=%f%%. Rate=%f MBPS. Rtt=%i\n", 100.0*slopeSum/average, GetLocalSendRate(), rtt ); + } + else if (slopeSum > .10*average) + { + // Logging + //printf("Ping rising. slope=%f%%. Rate=%f MBPS. Rtt=%i\n", 100.0*slopeSum/average, GetLocalSendRate(), rtt ); + IncreaseTimeBetweenSends(); + } + else + { + // Logging + //printf("Ping stable. slope=%f%%. Rate=%f MBPS. Rtt=%i\n", 100.0*slopeSum/average, GetLocalSendRate(), rtt ); + + // No packetloss over time threshhold, and rtt decreased, so send faster + lastRttOnIncreaseSendRate=rtt; + DecreaseTimeBetweenSends(); + } + + pingsLastInterval.Clear(__FILE__,__LINE__); + hadPacketlossThisBlock=false; + nextCongestionControlBlock=nextDatagramSequenceNumber; + } + + lastRtt=rtt; +} + +// ---------------------------------------------------------------------------------------------------------------------------- +double CCRakNetUDT::BytesPerMicrosecondToPacketsPerMillisecond(BytesPerMicrosecond in) +{ +#if CC_TIME_TYPE_BYTES==4 + const BytesPerMicrosecond factor = 1.0 / (BytesPerMicrosecond) MAXIMUM_MTU_INCLUDING_UDP_HEADER; +#else + const BytesPerMicrosecond factor = 1000.0 / (BytesPerMicrosecond) MAXIMUM_MTU_INCLUDING_UDP_HEADER; +#endif + return in * factor; +} +// ---------------------------------------------------------------------------------------------------------------------------- +void CCRakNetUDT::InitPacketArrivalHistory(void) +{ + unsigned int i; + for (i=0; i < CC_RAKNET_UDT_PACKET_HISTORY_LENGTH; i++) + { + packetArrivalHistory[i]=UNDEFINED_TRANSFER_RATE; + packetArrivalHistoryContinuousGaps[i]=0; + } + + packetArrivalHistoryWriteCount=0; + continuousBytesReceived=0; + continuousBytesReceivedStartTime=0; +} +// ---------------------------------------------------------------------------------------------------------------------------- +void CCRakNetUDT::PrintLowBandwidthWarning(void) +{ + + /* + printf("\n-------LOW BANDWIDTH -----\n"); + if (isInSlowStart==false) + printf("SND=%f Megabytes per second\n", 1.0/SND); + printf("Window size=%f\n", CWND); + printf("Pipe from packet pair = %f megabytes per second\n", B); + printf("RTT=%f milliseconds\n", RTT/1000.0); + printf("RTT Variance=%f milliseconds\n", RTTVar/1000.0); + printf("Retransmission=%i milliseconds\n", GetRTOForRetransmission()/1000); + printf("Packet arrival rate on the remote system=%f megabytes per second\n", AS); + printf("Packet arrival rate on our system=%f megabytes per second\n", ReceiverCalculateDataArrivalRate()); + printf("isInSlowStart=%i\n", isInSlowStart); + printf("---------------\n"); + */ +} +BytesPerMicrosecond CCRakNetUDT::GetLocalReceiveRate(CCTimeType currentTime) const +{ + return ReceiverCalculateDataArrivalRate(currentTime); +} +double CCRakNetUDT::GetRTT(void) const +{ + if (RTT==UNSET_TIME_US) + return 0.0; + return RTT; +} +void CCRakNetUDT::CapMinSnd(const char *file, int line) +{ + (void) file; + (void) line; + + if (SND > 500) + { + SND=500; + CC_DEBUG_PRINTF_3("%s:%i LIKELY BUG: SND has gotten above 500 microseconds between messages (28.8 modem)\nReport to rakkar@jenkinssoftware.com with file and line number\n", file, line); + } +} +void CCRakNetUDT::IncreaseTimeBetweenSends(void) +{ + // In order to converge, bigger numbers have to increase slower and decrease faster + // SND==500 then increment is .02 + // SND==0 then increment is near 0 + // (SND+1.0) brings it to the range of 1 to 501 + // Square the number, which is the range of 1 to 251001 + // Divide by 251001, which is the range of 1/251001 to 1 + + double increment; + increment = .02 * ((SND+1.0) * (SND+1.0)) / (501.0*501.0) ; + // SND=500 then increment=.02 + // SND=0 then increment=near 0 + SND*=(1.02 - increment); + + // SND=0 then fast increase, slow decrease + // SND=500 then slow increase, fast decrease + CapMinSnd(__FILE__,__LINE__); +} +void CCRakNetUDT::DecreaseTimeBetweenSends(void) +{ + double increment; + increment = .01 * ((SND+1.0) * (SND+1.0)) / (501.0*501.0) ; + // SND=500 then increment=.01 + // SND=0 then increment=near 0 + SND*=(.99 - increment); +} +/* +void CCRakNetUDT::SetTimeBetweenSendsLimit(unsigned int bitsPerSecond) +{ +// bitsPerSecond / 1000000 = bitsPerMicrosecond +// bitsPerMicrosecond / 8 = BytesPerMicrosecond +// 1 / BytesPerMicrosecond = MicrosecondsPerByte +// 1 / ( (bitsPerSecond / 1000000) / 8 ) = +// 1 / (bitsPerSecond / 8000000) = +// 8000000 / bitsPerSecond + +#if CC_TIME_TYPE_BYTES==4 + MicrosecondsPerByte limit = (MicrosecondsPerByte) 8000 / (MicrosecondsPerByte)bitsPerSecond; +#else + MicrosecondsPerByte limit = (MicrosecondsPerByte) 8000000 / (MicrosecondsPerByte)bitsPerSecond; +#endif + if (limit > SND) + SND=limit; +} +*/ + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CCRakNetUDT.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CCRakNetUDT.h new file mode 100644 index 0000000..3400dde --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CCRakNetUDT.h @@ -0,0 +1,394 @@ +#include "RakNetDefines.h" + +#if USE_SLIDING_WINDOW_CONGESTION_CONTROL!=1 + +#ifndef __CONGESTION_CONTROL_UDT_H +#define __CONGESTION_CONTROL_UDT_H + +#include "NativeTypes.h" +#include "RakNetTime.h" +#include "RakNetTypes.h" +#include "DS_Queue.h" + +/// Set to 4 if you are using the iPod Touch TG. See http://www.jenkinssoftware.com/forum/index.php?topic=2717.0 +#define CC_TIME_TYPE_BYTES 8 + +namespace RakNet +{ + + +typedef uint64_t CCTimeType; + + + + +typedef uint24_t DatagramSequenceNumberType; +typedef double BytesPerMicrosecond; +typedef double BytesPerSecond; +typedef double MicrosecondsPerByte; + +/// CC_RAKNET_UDT_PACKET_HISTORY_LENGTH should be a power of 2 for the writeIndex variables to wrap properly +#define CC_RAKNET_UDT_PACKET_HISTORY_LENGTH 64 +#define RTT_HISTORY_LENGTH 64 + +/// Sizeof an UDP header in byte +#define UDP_HEADER_SIZE 28 + +#define CC_DEBUG_PRINTF_1(x) +#define CC_DEBUG_PRINTF_2(x,y) +#define CC_DEBUG_PRINTF_3(x,y,z) +#define CC_DEBUG_PRINTF_4(x,y,z,a) +#define CC_DEBUG_PRINTF_5(x,y,z,a,b) +//#define CC_DEBUG_PRINTF_1(x) printf(x) +//#define CC_DEBUG_PRINTF_2(x,y) printf(x,y) +//#define CC_DEBUG_PRINTF_3(x,y,z) printf(x,y,z) +//#define CC_DEBUG_PRINTF_4(x,y,z,a) printf(x,y,z,a) +//#define CC_DEBUG_PRINTF_5(x,y,z,a,b) printf(x,y,z,a,b) + +/// \brief Encapsulates UDT congestion control, as used by RakNet +/// Requirements: +///
    +///
  1. Each datagram is no more than MAXIMUM_MTU_SIZE, after accounting for the UDP header +///
  2. Each datagram containing a user message has a sequence number which is set after calling OnSendBytes(). Set it by calling GetAndIncrementNextDatagramSequenceNumber() +///
  3. System is designed to be used from a single thread. +///
  4. Each packet should have a timeout time based on GetSenderRTOForACK(). If this time elapses, add the packet to the head of the send list for retransmission. +///
+/// +/// Recommended: +///
    +///
  1. Call sendto in its own thread. This takes a significant amount of time in high speed networks. +///
+/// +/// Algorithm: +///
    +///
  1. On a new connection, call Init() +///
  2. On a periodic interval (SYN time is the best) call Update(). Also call ShouldSendACKs(), and send buffered ACKS if it returns true. +///
  3. Call OnSendAck() when sending acks. +///
  4. When you want to send or resend data, call GetNumberOfBytesToSend(). It will return you enough bytes to keep you busy for \a estimatedTimeToNextTick. You can send more than this to fill out a datagram, or to send packet pairs +///
  5. Call OnSendBytes() when sending datagrams. +///
  6. When data arrives, record the sequence number and buffer an ACK for it, to be sent from Update() if ShouldSendACKs() returns true +///
  7. Every 16 packets that you send, send two of them back to back (a packet pair) as long as both packets are the same size. If you don't have two packets the same size, it is fine to defer this until you do. +///
  8. When you get a packet, call OnGotPacket(). If the packet is also either of a packet pair, call OnGotPacketPair() +///
  9. If you get a packet, and the sequence number is not 1 + the last sequence number, send a NAK. On the remote system, call OnNAK() and resend that message. +///
  10. If you get an ACK, remove that message from retransmission. Call OnNonDuplicateAck(). +///
  11. If a message is not ACKed for GetRTOForRetransmission(), resend it. +///
+class CCRakNetUDT +{ + public: + + CCRakNetUDT(); + ~CCRakNetUDT(); + + /// Reset all variables to their initial states, for a new connection + void Init(CCTimeType curTime, uint32_t maxDatagramPayload); + + /// Update over time + void Update(CCTimeType curTime, bool hasDataToSendOrResend); + + int GetRetransmissionBandwidth(CCTimeType curTime, CCTimeType timeSinceLastTick, uint32_t unacknowledgedBytes, bool isContinuousSend); + int GetTransmissionBandwidth(CCTimeType curTime, CCTimeType timeSinceLastTick, uint32_t unacknowledgedBytes, bool isContinuousSend); + + /// Acks do not have to be sent immediately. Instead, they can be buffered up such that groups of acks are sent at a time + /// This reduces overall bandwidth usage + /// How long they can be buffered depends on the retransmit time of the sender + /// Should call once per update tick, and send if needed + bool ShouldSendACKs(CCTimeType curTime, CCTimeType estimatedTimeToNextTick); + + /// Every data packet sent must contain a sequence number + /// Call this function to get it. The sequence number is passed into OnGotPacketPair() + DatagramSequenceNumberType GetAndIncrementNextDatagramSequenceNumber(void); + DatagramSequenceNumberType GetNextDatagramSequenceNumber(void); + + /// Call this when you send packets + /// Every 15th and 16th packets should be sent as a packet pair if possible + /// When packets marked as a packet pair arrive, pass to OnGotPacketPair() + /// When any packets arrive, (additionally) pass to OnGotPacket + /// Packets should contain our system time, so we can pass rtt to OnNonDuplicateAck() + void OnSendBytes(CCTimeType curTime, uint32_t numBytes); + + /// Call this when you get a packet pair + void OnGotPacketPair(DatagramSequenceNumberType datagramSequenceNumber, uint32_t sizeInBytes, CCTimeType curTime); + + /// Call this when you get a packet (including packet pairs) + /// If the DatagramSequenceNumberType is out of order, skippedMessageCount will be non-zero + /// In that case, send a NAK for every sequence number up to that count + bool OnGotPacket(DatagramSequenceNumberType datagramSequenceNumber, bool isContinuousSend, CCTimeType curTime, uint32_t sizeInBytes, uint32_t *skippedMessageCount); + + /// Call when you get a NAK, with the sequence number of the lost message + /// Affects the congestion control + void OnResend(CCTimeType curTime); + void OnNAK(CCTimeType curTime, DatagramSequenceNumberType nakSequenceNumber); + + /// Call this when an ACK arrives. + /// hasBAndAS are possibly written with the ack, see OnSendAck() + /// B and AS are used in the calculations in UpdateWindowSizeAndAckOnAckPerSyn + /// B and AS are updated at most once per SYN + void OnAck(CCTimeType curTime, CCTimeType rtt, bool hasBAndAS, BytesPerMicrosecond _B, BytesPerMicrosecond _AS, double totalUserDataBytesAcked, bool isContinuousSend, DatagramSequenceNumberType sequenceNumber ); + void OnDuplicateAck( CCTimeType curTime, DatagramSequenceNumberType sequenceNumber ) {} + + /// Call when you send an ack, to see if the ack should have the B and AS parameters transmitted + /// Call before calling OnSendAck() + void OnSendAckGetBAndAS(CCTimeType curTime, bool *hasBAndAS, BytesPerMicrosecond *_B, BytesPerMicrosecond *_AS); + + /// Call when we send an ack, to write B and AS if needed + /// B and AS are only written once per SYN, to prevent slow calculations + /// Also updates SND, the period between sends, since data is written out + /// Be sure to call OnSendAckGetBAndAS() before calling OnSendAck(), since whether you write it or not affects \a numBytes + void OnSendAck(CCTimeType curTime, uint32_t numBytes); + + /// Call when we send a NACK + /// Also updates SND, the period between sends, since data is written out + void OnSendNACK(CCTimeType curTime, uint32_t numBytes); + + /// Retransmission time out for the sender + /// If the time difference between when a message was last transmitted, and the current time is greater than RTO then packet is eligible for retransmission, pending congestion control + /// RTO = (RTT + 4 * RTTVar) + SYN + /// If we have been continuously sending for the last RTO, and no ACK or NAK at all, SND*=2; + /// This is per message, which is different from UDT, but RakNet supports packetloss with continuing data where UDT is only RELIABLE_ORDERED + /// Minimum value is 100 milliseconds + CCTimeType GetRTOForRetransmission(void) const; + + /// Set the maximum amount of data that can be sent in one datagram + /// Default to MAXIMUM_MTU_SIZE-UDP_HEADER_SIZE + void SetMTU(uint32_t bytes); + + /// Return what was set by SetMTU() + uint32_t GetMTU(void) const; + + /// Query for statistics + BytesPerMicrosecond GetLocalSendRate(void) const {return 1.0 / SND;} + BytesPerMicrosecond GetLocalReceiveRate(CCTimeType currentTime) const; + BytesPerMicrosecond GetRemoveReceiveRate(void) const {return AS;} + //BytesPerMicrosecond GetEstimatedBandwidth(void) const {return B;} + BytesPerMicrosecond GetEstimatedBandwidth(void) const {return GetLinkCapacityBytesPerSecond()*1000000.0;} + double GetLinkCapacityBytesPerSecond(void) const {return estimatedLinkCapacityBytesPerSecond;}; + + /// Query for statistics + double GetRTT(void) const; + + bool GetIsInSlowStart(void) const {return isInSlowStart;} + uint32_t GetCWNDLimit(void) const {return (uint32_t) (CWND*MAXIMUM_MTU_INCLUDING_UDP_HEADER);} + + + /// Is a > b, accounting for variable overflow? + static bool GreaterThan(DatagramSequenceNumberType a, DatagramSequenceNumberType b); + /// Is a < b, accounting for variable overflow? + static bool LessThan(DatagramSequenceNumberType a, DatagramSequenceNumberType b); +// void SetTimeBetweenSendsLimit(unsigned int bitsPerSecond); + uint64_t GetBytesPerSecondLimitByCongestionControl(void) const; + + protected: + // --------------------------- PROTECTED VARIABLES --------------------------- + /// time interval between bytes, in microseconds. + /// Only used when slowStart==false + /// Increased over time as we continually get messages + /// Decreased on NAK and timeout + /// Starts at 0 (invalid) + MicrosecondsPerByte SND; + + /// Supportive window mechanism, controlling the maximum number of in-flight packets + /// Used both during and after slow-start, but primarily during slow-start + /// Starts at 2, which is also the low threshhold + /// Max is the socket receive buffer / MTU + /// CWND = AS * (RTT + SYN) + 16 + double CWND; + + /// When we do an update process on the SYN interval, nextSYNUpdate is set to the next time we should update + /// Normally this is nextSYNUpdate+=SYN, in order to update on a consistent schedule + /// However, if this would result in an immediate update yet again, it is set to SYN microseconds past the current time (in case the thread did not update for a long time) + CCTimeType nextSYNUpdate; + + + /// Index into packetPairRecieptHistory where we will next write + /// The history is always full (starting with default values) so no read index is needed + int packetPairRecieptHistoryWriteIndex; + + /// Sent to the sender by the receiver from packetPairRecieptHistory whenever a back to back packet arrives on the receiver + /// Updated by B = B * .875 + incomingB * .125 + //BytesPerMicrosecond B; + + /// Running round trip time (ping*2) + /// Only sender needs to know this + /// Initialized to UNSET + /// Set to rtt on first calculation + /// Updated gradually by RTT = RTT * 0.875 + rtt * 0.125 + double RTT; + + /// Round trip time variance + /// Only sender needs to know this + /// Initialized to UNSET + /// Set to rtt on first calculation + // double RTTVar; + /// Update: Use min/max, RTTVar follows current variance too closely resulting in packetloss + double minRTT, maxRTT; + + /// Used to calculate packet arrival rate (in UDT) but data arrival rate (in RakNet, where not all datagrams are the same size) + /// Filter is used to cull lowest half of values for bytesPerMicrosecond, to discount spikes and inactivity + /// Referred to in the documentation as AS, data arrival rate + /// AS is sent to the sender and calculated every 10th ack + /// Each node represents (curTime-lastPacketArrivalTime)/bytes + /// Used with ReceiverCalculateDataArrivalRate(); + BytesPerMicrosecond packetArrivalHistory[CC_RAKNET_UDT_PACKET_HISTORY_LENGTH]; + BytesPerMicrosecond packetArrivalHistoryContinuousGaps[CC_RAKNET_UDT_PACKET_HISTORY_LENGTH]; + unsigned char packetArrivalHistoryContinuousGapsIndex; + uint64_t continuousBytesReceived; + CCTimeType continuousBytesReceivedStartTime; + unsigned int packetArrivalHistoryWriteCount; + + /// Index into packetArrivalHistory where we will next write + /// The history is always full (starting with default values) so no read index is needed + int packetArrivalHistoryWriteIndex; + + /// Tracks the time the last packet that arrived, so BytesPerMicrosecond can be calculated for packetArrivalHistory when a new packet arrives + CCTimeType lastPacketArrivalTime; + + /// Data arrival rate from the sender to the receiver, as told to us by the receiver + /// Used to calculate initial sending rate when slow start stops + BytesPerMicrosecond AS; + + /// When the receiver last calculated and send B and AS, from packetArrivalHistory and packetPairRecieptHistory + /// Used to prevent it from being calculated and send too frequently, as they are slow operations + CCTimeType lastTransmitOfBAndAS; + + /// New connections start in slow start + /// During slow start, SND is not used, only CWND + /// Slow start ends when we get a NAK, or the maximum size of CWND is reached + /// SND is initialized to the inverse of the receiver's packet arrival rate when slow start ends + bool isInSlowStart; + + /// How many NAKs arrived this congestion period + /// Initialized to 1 when the congestion period starts + uint32_t NAKCount; + + /// How many NAKs do you get on average during a congestion period? + /// Starts at 1 + /// Used to generate a random number, DecRandom, between 1 and AvgNAKNum + uint32_t AvgNAKNum; + + /// How many times we have decremented SND this congestion period. Used to limit the number of decrements to 5 + uint32_t DecCount; + + /// Every DecInterval NAKs per congestion period, we decrease the send rate + uint32_t DecInterval; + + /// Every outgoing datagram is assigned a sequence number, which increments by 1 every assignment + DatagramSequenceNumberType nextDatagramSequenceNumber; + + /// If a packet is marked as a packet pair, lastPacketPairPacketArrivalTime is set to the time it arrives + /// This is used so when the 2nd packet of the pair arrives, we can calculate the time interval between the two + CCTimeType lastPacketPairPacketArrivalTime; + + /// If a packet is marked as a packet pair, lastPacketPairSequenceNumber is checked to see if the last packet we got + /// was the packet immediately before the one that arrived + /// If so, we can use lastPacketPairPacketArrivalTime to get the time between the two packets, and thus estimate the link capacity + /// Initialized to -1, so the first packet of a packet pair won't be treated as the second + DatagramSequenceNumberType lastPacketPairSequenceNumber; + + /// Used to cap UpdateWindowSizeAndAckOnAckPerSyn() to once speed increase per SYN + /// This is to prevent speeding up faster than congestion control can compensate for + CCTimeType lastUpdateWindowSizeAndAck; + + /// Every time SND is halved due to timeout, the RTO is increased + /// This is to prevent massive retransmissions to an unresponsive system + /// Reset on any data arriving + double ExpCount; + + /// Total number of user data bytes sent + /// Used to adjust the window size, on ACK, during slow start + uint64_t totalUserDataBytesSent; + + /// When we get an ack, if oldestUnsentAck==0, set it to the current time + /// When we send out acks, set oldestUnsentAck to 0 + CCTimeType oldestUnsentAck; + + // Maximum amount of bytes that the user can send, e.g. the size of one full datagram + uint32_t MAXIMUM_MTU_INCLUDING_UDP_HEADER; + + // Max window size + double CWND_MAX_THRESHOLD; + + /// Track which datagram sequence numbers have arrived. + /// If a sequence number is skipped, send a NAK for all skipped messages + DatagramSequenceNumberType expectedNextSequenceNumber; + + // How many times have we sent B and AS? Used to force it to send at least CC_RAKNET_UDT_PACKET_HISTORY_LENGTH times + // Otherwise, the default values in the array generate inaccuracy + uint32_t sendBAndASCount; + + /// Most recent values read into the corresponding lists + /// Used during the beginning of a connection, when the median filter is still inaccurate + BytesPerMicrosecond mostRecentPacketArrivalHistory; + + bool hasWrittenToPacketPairReceiptHistory; + +// uint32_t rttHistory[RTT_HISTORY_LENGTH]; +// uint32_t rttHistoryIndex; +// uint32_t rttHistoryWriteCount; +// uint32_t rttSum, rttLow; +// CCTimeType lastSndUpdateTime; + double estimatedLinkCapacityBytesPerSecond; + + // --------------------------- PROTECTED METHODS --------------------------- + /// Update nextSYNUpdate by SYN, or the same amount past the current time if no updates have occurred for a long time + void SetNextSYNUpdate(CCTimeType currentTime); + + /// Returns the rate of data arrival, based on packets arriving on the sender. + BytesPerMicrosecond ReceiverCalculateDataArrivalRate(CCTimeType curTime) const; + /// Returns the median of the data arrival rate + BytesPerMicrosecond ReceiverCalculateDataArrivalRateMedian(void) const; + + /// Calculates the median an array of BytesPerMicrosecond + static BytesPerMicrosecond CalculateListMedianRecursive(const BytesPerMicrosecond inputList[CC_RAKNET_UDT_PACKET_HISTORY_LENGTH], int inputListLength, int lessThanSum, int greaterThanSum); +// static uint32_t CalculateListMedianRecursive(const uint32_t inputList[RTT_HISTORY_LENGTH], int inputListLength, int lessThanSum, int greaterThanSum); + + /// Same as GetRTOForRetransmission, but does not factor in ExpCount + /// This is because the receiver does not know ExpCount for the sender, and even if it did, acks shouldn't be delayed for this reason + CCTimeType GetSenderRTOForACK(void) const; + + /// Stop slow start, and enter normal transfer rate + void EndSlowStart(void); + + /// Does the named conversion + inline double BytesPerMicrosecondToPacketsPerMillisecond(BytesPerMicrosecond in); + + /// Update the round trip time, from ACK or ACK2 + //void UpdateRTT(CCTimeType rtt); + + /// Update the corresponding variables pre-slow start + void UpdateWindowSizeAndAckOnAckPreSlowStart(double totalUserDataBytesAcked); + + /// Update the corresponding variables post-slow start + void UpdateWindowSizeAndAckOnAckPerSyn(CCTimeType curTime, CCTimeType rtt, bool isContinuousSend, DatagramSequenceNumberType sequenceNumber); + + + /// Sets halveSNDOnNoDataTime to the future, and also resets ExpCount, which is used to multiple the RTO on no data arriving at all + void ResetOnDataArrivalHalveSNDOnNoDataTime(CCTimeType curTime); + + // Init array + void InitPacketArrivalHistory(void); + + // Printf + void PrintLowBandwidthWarning(void); + + // Bug: SND can sometimes get super high - have seen 11693 + void CapMinSnd(const char *file, int line); + + void DecreaseTimeBetweenSends(void); + void IncreaseTimeBetweenSends(void); + + int bytesCanSendThisTick; + + CCTimeType lastRttOnIncreaseSendRate; + CCTimeType lastRtt; + + DatagramSequenceNumberType nextCongestionControlBlock; + bool hadPacketlossThisBlock; + DataStructures::Queue pingsLastInterval; +}; + +} + +#endif + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CheckSum.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CheckSum.cpp new file mode 100644 index 0000000..91ecc3f --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CheckSum.cpp @@ -0,0 +1,97 @@ +/** +* @file +* @brief CheckSum implementation from http://www.flounder.com/checksum.htm +* +*/ +#include "CheckSum.h" + +/**************************************************************************** +* CheckSum::add +* Inputs: +* unsigned int d: word to add +* Result: void +* +* Effect: +* Adds the bytes of the unsigned int to the CheckSum +****************************************************************************/ + +void CheckSum::Add ( unsigned int value ) +{ + union + { + unsigned int value; + unsigned char bytes[ 4 ]; + } + + data; + data.value = value; + + for ( unsigned int i = 0; i < sizeof( data.bytes ); i++ ) + Add ( data.bytes[ i ] ) + + ; +} // CheckSum::add(unsigned int) + +/**************************************************************************** +* CheckSum::add +* Inputs: +* unsigned short value: +* Result: void +* +* Effect: +* Adds the bytes of the unsigned short value to the CheckSum +****************************************************************************/ + +void CheckSum::Add ( unsigned short value ) +{ + union + { + unsigned short value; + unsigned char bytes[ 2 ]; + } + + data; + data.value = value; + + for ( unsigned int i = 0; i < sizeof( data.bytes ); i++ ) + Add ( data.bytes[ i ] ) + + ; +} // CheckSum::add(unsigned short) + +/**************************************************************************** +* CheckSum::add +* Inputs: +* unsigned char value: +* Result: void +* +* Effect: +* Adds the byte to the CheckSum +****************************************************************************/ + +void CheckSum::Add ( unsigned char value ) +{ + unsigned char cipher = (unsigned char)( value ^ ( r >> 8 ) ); + r = ( cipher + r ) * c1 + c2; + sum += cipher; +} // CheckSum::add(unsigned char) + + +/**************************************************************************** +* CheckSum::add +* Inputs: +* LPunsigned char b: pointer to byte array +* unsigned int length: count +* Result: void +* +* Effect: +* Adds the bytes to the CheckSum +****************************************************************************/ + +void CheckSum::Add ( unsigned char *b, unsigned int length ) +{ + for ( unsigned int i = 0; i < length; i++ ) + Add ( b[ i ] ) + + ; +} // CheckSum::add(LPunsigned char, unsigned int) diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CheckSum.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CheckSum.h new file mode 100644 index 0000000..bd768a1 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CheckSum.h @@ -0,0 +1,53 @@ +/// +/// \file CheckSum.cpp +/// \brief [Internal] CheckSum implementation from http://www.flounder.com/checksum.htm +/// + +#ifndef __CHECKSUM_H +#define __CHECKSUM_H + +#include "RakMemoryOverride.h" + +/// Generates and validates checksums +class CheckSum +{ + +public: + + /// Default constructor + + CheckSum() + { + Clear(); + } + + void Clear() + { + sum = 0; + r = 55665; + c1 = 52845; + c2 = 22719; + } + + void Add ( unsigned int w ); + + + void Add ( unsigned short w ); + + void Add ( unsigned char* b, unsigned int length ); + + void Add ( unsigned char b ); + + unsigned int Get () + { + return sum; + } + +protected: + unsigned short r; + unsigned short c1; + unsigned short c2; + unsigned int sum; +}; + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CloudClient.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CloudClient.cpp new file mode 100644 index 0000000..248a42d --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CloudClient.cpp @@ -0,0 +1,242 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_CloudClient==1 + +#include "CloudClient.h" +#include "GetTime.h" +#include "MessageIdentifiers.h" +#include "BitStream.h" +#include "RakPeerInterface.h" + +using namespace RakNet; + +STATIC_FACTORY_DEFINITIONS(CloudClient,CloudClient); + +CloudClient::CloudClient() +{ + callback=0; + allocator=&unsetDefaultAllocator; +} +CloudClient::~CloudClient() +{ +} +void CloudClient::SetDefaultCallbacks(CloudAllocator *_allocator, CloudClientCallback *_callback) +{ + callback=_callback; + allocator=_allocator; +} +void CloudClient::Post(CloudKey *cloudKey, const unsigned char *data, uint32_t dataLengthBytes, RakNetGUID systemIdentifier) +{ + RakAssert(cloudKey); + + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_CLOUD_POST_REQUEST); + cloudKey->Serialize(true,&bsOut); + if (data==0) + dataLengthBytes=0; + bsOut.Write(dataLengthBytes); + if (dataLengthBytes>0) + bsOut.WriteAlignedBytes((const unsigned char*) data, dataLengthBytes); + SendUnified(&bsOut, HIGH_PRIORITY, RELIABLE_ORDERED, 0, systemIdentifier, false); +} +void CloudClient::Release(DataStructures::List &keys, RakNetGUID systemIdentifier) +{ + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_CLOUD_RELEASE_REQUEST); + RakAssert(keys.Size() < (uint16_t)-1 ); + bsOut.WriteCasted(keys.Size()); + for (uint16_t i=0; i < keys.Size(); i++) + { + keys[i].Serialize(true,&bsOut); + } + SendUnified(&bsOut, HIGH_PRIORITY, RELIABLE_ORDERED, 0, systemIdentifier, false); +} +bool CloudClient::Get(CloudQuery *keyQuery, RakNetGUID systemIdentifier) +{ + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_CLOUD_GET_REQUEST); + keyQuery->Serialize(true, &bsOut); + bsOut.WriteCasted(0); // Specific systems + SendUnified(&bsOut, HIGH_PRIORITY, RELIABLE_ORDERED, 0, systemIdentifier, false); + return true; +} +bool CloudClient::Get(CloudQuery *keyQuery, DataStructures::List &specificSystems, RakNetGUID systemIdentifier) +{ + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_CLOUD_GET_REQUEST); + keyQuery->Serialize(true, &bsOut); + bsOut.WriteCasted(specificSystems.Size()); + RakAssert(specificSystems.Size() < (uint16_t)-1 ); + for (uint16_t i=0; i < specificSystems.Size(); i++) + { + bsOut.Write(specificSystems[i]); + } + SendUnified(&bsOut, HIGH_PRIORITY, RELIABLE_ORDERED, 0, systemIdentifier, false); + return true; +} +bool CloudClient::Get(CloudQuery *keyQuery, DataStructures::List &specificSystems, RakNetGUID systemIdentifier) +{ + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_CLOUD_GET_REQUEST); + keyQuery->Serialize(true, &bsOut); + bsOut.WriteCasted(specificSystems.Size()); + RakAssert(specificSystems.Size() < (uint16_t)-1 ); + for (uint16_t i=0; i < specificSystems.Size(); i++) + { + if (specificSystems[i]->clientGUID!=UNASSIGNED_RAKNET_GUID) + { + bsOut.Write(true); + bsOut.Write(specificSystems[i]->clientGUID); + } + else + { + bsOut.Write(false); + bsOut.Write(specificSystems[i]->clientSystemAddress); + } + } + SendUnified(&bsOut, HIGH_PRIORITY, RELIABLE_ORDERED, 0, systemIdentifier, false); + return true; +} +void CloudClient::Unsubscribe(DataStructures::List &keys, RakNetGUID systemIdentifier) +{ + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_CLOUD_UNSUBSCRIBE_REQUEST); + RakAssert(keys.Size() < (uint16_t)-1 ); + bsOut.WriteCasted(keys.Size()); + for (uint16_t i=0; i < keys.Size(); i++) + { + keys[i].Serialize(true,&bsOut); + } + bsOut.WriteCasted(0); + SendUnified(&bsOut, HIGH_PRIORITY, RELIABLE_ORDERED, 0, systemIdentifier, false); +} +void CloudClient::Unsubscribe(DataStructures::List &keys, DataStructures::List &specificSystems, RakNetGUID systemIdentifier) +{ + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_CLOUD_UNSUBSCRIBE_REQUEST); + RakAssert(keys.Size() < (uint16_t)-1 ); + bsOut.WriteCasted(keys.Size()); + for (uint16_t i=0; i < keys.Size(); i++) + { + keys[i].Serialize(true,&bsOut); + } + bsOut.WriteCasted(specificSystems.Size()); + RakAssert(specificSystems.Size() < (uint16_t)-1 ); + for (uint16_t i=0; i < specificSystems.Size(); i++) + { + bsOut.Write(specificSystems[i]); + } + SendUnified(&bsOut, HIGH_PRIORITY, RELIABLE_ORDERED, 0, systemIdentifier, false); +} +void CloudClient::Unsubscribe(DataStructures::List &keys, DataStructures::List &specificSystems, RakNetGUID systemIdentifier) +{ + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_CLOUD_UNSUBSCRIBE_REQUEST); + RakAssert(keys.Size() < (uint16_t)-1 ); + bsOut.WriteCasted(keys.Size()); + for (uint16_t i=0; i < keys.Size(); i++) + { + keys[i].Serialize(true,&bsOut); + } + bsOut.WriteCasted(specificSystems.Size()); + RakAssert(specificSystems.Size() < (uint16_t)-1 ); + for (uint16_t i=0; i < specificSystems.Size(); i++) + { + if (specificSystems[i]->clientGUID!=UNASSIGNED_RAKNET_GUID) + { + bsOut.Write(true); + bsOut.Write(specificSystems[i]->clientGUID); + } + else + { + bsOut.Write(false); + bsOut.Write(specificSystems[i]->clientSystemAddress); + } + } + SendUnified(&bsOut, HIGH_PRIORITY, RELIABLE_ORDERED, 0, systemIdentifier, false); +} +PluginReceiveResult CloudClient::OnReceive(Packet *packet) +{ + (void) packet; + + return RR_CONTINUE_PROCESSING; +} +void CloudClient::OnGetReponse(Packet *packet, CloudClientCallback *_callback, CloudAllocator *_allocator) +{ + if (_callback==0) + _callback=callback; + if (_allocator==0) + _allocator=allocator; + + CloudQueryResult cloudQueryResult; + + RakNet::BitStream bsIn(packet->data, packet->length, false); + bsIn.IgnoreBytes(sizeof(MessageID)); + cloudQueryResult.Serialize(false,&bsIn,_allocator); + bool deallocateRowsAfterReturn=true; + _callback->OnGet(&cloudQueryResult, &deallocateRowsAfterReturn); + if (deallocateRowsAfterReturn) + { + unsigned int i; + for (i=0; i < cloudQueryResult.rowsReturned.Size(); i++) + { + _allocator->DeallocateRowData(cloudQueryResult.rowsReturned[i]->data); + _allocator->DeallocateCloudQueryRow(cloudQueryResult.rowsReturned[i]); + } + } +} +void CloudClient::OnGetReponse(CloudQueryResult *cloudQueryResult, Packet *packet, CloudAllocator *_allocator) +{ + if (_allocator==0) + _allocator=allocator; + + RakNet::BitStream bsIn(packet->data, packet->length, false); + bsIn.IgnoreBytes(sizeof(MessageID)); + cloudQueryResult->Serialize(false,&bsIn,_allocator); +} +void CloudClient::OnSubscriptionNotification(Packet *packet, CloudClientCallback *_callback, CloudAllocator *_allocator) +{ + if (_callback==0) + _callback=callback; + if (_allocator==0) + _allocator=allocator; + + bool wasUpdated=false; + CloudQueryRow row; + + RakNet::BitStream bsIn(packet->data, packet->length, false); + bsIn.IgnoreBytes(sizeof(MessageID)); + bsIn.Read(wasUpdated); + row.Serialize(false,&bsIn,_allocator); + bool deallocateRowAfterReturn=true; + _callback->OnSubscriptionNotification(&row, wasUpdated, &deallocateRowAfterReturn); + if (deallocateRowAfterReturn) + { + _allocator->DeallocateRowData(row.data); + } +} +void CloudClient::OnSubscriptionNotification(bool *wasUpdated, CloudQueryRow *row, Packet *packet, CloudAllocator *_allocator) +{ + if (_allocator==0) + _allocator=allocator; + + RakNet::BitStream bsIn(packet->data, packet->length, false); + bsIn.IgnoreBytes(sizeof(MessageID)); + bool b=false; + bsIn.Read(b); + *wasUpdated=b; + row->Serialize(false,&bsIn,_allocator); +} +void CloudClient::DeallocateWithDefaultAllocator(CloudQueryResult *cloudQueryResult) +{ + unsigned int i; + for (i=0; i < cloudQueryResult->rowsReturned.Size(); i++) + { + allocator->DeallocateRowData(cloudQueryResult->rowsReturned[i]->data); + allocator->DeallocateCloudQueryRow(cloudQueryResult->rowsReturned[i]); + } +} +void CloudClient::DeallocateWithDefaultAllocator(CloudQueryRow *row) +{ + allocator->DeallocateRowData(row->data); +} +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CloudClient.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CloudClient.h new file mode 100644 index 0000000..dc75c1e --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CloudClient.h @@ -0,0 +1,163 @@ +/// \file CloudClient.h +/// \brief Queries CloudMemoryServer to download data that other clients have uploaded +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_CloudClient==1 + +#ifndef __CLOUD_CLIENT_H +#define __CLOUD_CLIENT_H + +#include "PluginInterface2.h" +#include "CloudCommon.h" +#include "RakMemoryOverride.h" +#include "DS_Hash.h" + +namespace RakNet +{ +/// Forward declarations +class RakPeerInterface; +class CloudClientCallback; + +/// \defgroup CLOUD_GROUP CloudComputing +/// \brief Contains the CloudClient and CloudServer plugins +/// \details The CloudServer plugins operates on requests from the CloudClient plugin. The servers are in a fully connected mesh topology, which the clients are connected to any server. Clients can interact with each other by posting and subscribing to memory updates, without being directly connected or even knowing about each other. +/// \ingroup PLUGINS_GROUP + +/// \brief Performs Post() and Get() operations on CloudMemoryServer +/// \details A CloudClient is a computer connected to one or more servers in a cloud configuration. Operations by one CloudClient can be received and subscribed to by other instances of CloudClient, without those clients being connected, even on different servers. +/// \ingroup CLOUD_GROUP +class RAK_DLL_EXPORT CloudClient : public PluginInterface2 +{ +public: + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(CloudClient) + + CloudClient(); + virtual ~CloudClient(); + + /// \brief Set the default callbacks for OnGetReponse(), OnSubscriptionNotification(), and OnSubscriptionDataDeleted() + /// \details Pointers to CloudAllocator and CloudClientCallback can be stored by the system if desired. If a callback is not provided to OnGetReponse(), OnSubscriptionNotification(), OnSubscriptionDataDeleted(), the callback passed here will be used instead. + /// \param[in] _allocator An instance of CloudAllocator + /// \param[in] _callback An instance of CloudClientCallback + virtual void SetDefaultCallbacks(CloudAllocator *_allocator, CloudClientCallback *_callback); + + /// \brief Uploads data to the cloud + /// \details Data uploaded to the cloud will be stored by the server sent to, identified by \a systemIdentifier. + /// As long as you are connected to this server, the data will persist. Queries for that data by the Get() operation will + /// return the RakNetGUID and SystemAddress of the uploader, as well as the data itself. + /// Furthermore, if any clients are subscribed to the particular CloudKey passed, those clients will get update notices that the data has changed + /// Passing data with the same \a cloudKey more than once will overwrite the prior value. + /// This call will silently fail if CloudServer::SetMaxUploadBytesPerClient() is exceeded + /// \param[in] cloudKey Identifies the data being uploaded + /// \param[in] data A pointer to data to upload. This pointer does not need to persist past the call + /// \param[in] dataLengthBytes The length in bytes of \a data + /// \param[in] systemIdentifier A remote system running CloudServer that we are already connected to. + virtual void Post(CloudKey *cloudKey, const unsigned char *data, uint32_t dataLengthBytes, RakNetGUID systemIdentifier); + + /// \brief Releases one or more data previously uploaded with Post() + /// \details If a remote system has subscribed to one or more of the \a keys uploaded, they will get ID_CLOUD_SUBSCRIPTION_NOTIFICATION notifications containing the last value uploaded before deletions + /// \param[in] cloudKey Identifies the data to release. It is possible to remove uploads from multiple Post() calls at once. + /// \param[in] systemIdentifier A remote system running CloudServer that we are already connected to. + virtual void Release(DataStructures::List &keys, RakNetGUID systemIdentifier); + + /// \brief Gets data from the cloud + /// \details For a given query containing one or more keys, return data that matches those keys. + /// The values will be returned in the ID_CLOUD_GET_RESPONSE packet, which should be passed to OnGetReponse() and will invoke CloudClientCallback::OnGet() + /// CloudQuery::startingRowIndex is used to skip the first n values that would normally be returned.. + /// CloudQuery::maxRowsToReturn is used to limit the number of rows returned. The number of rows returned may also be limited by CloudServer::SetMaxBytesPerDownload(); + /// CloudQuery::subscribeToResults if set to true, will cause ID_CLOUD_SUBSCRIPTION_NOTIFICATION to be returned to us when any of the keys in the query are updated or are deleted. + /// ID_CLOUD_GET_RESPONSE will be returned even if subscribing to the result list. Only later updates will return ID_CLOUD_SUBSCRIPTION_NOTIFICATION. + /// Calling Get() with CloudQuery::subscribeToResults false, when you are already subscribed, does not remove the subscription. Use Unsubscribe() for this. + /// Resubscribing using the same CloudKey but a different or no \a specificSystems overwrites the subscribed systems for those keys. + /// \param[in] cloudQuery One or more keys, and optional parameters to perform with the Get + /// \param[in] systemIdentifier A remote system running CloudServer that we are already connected to. + /// \param[in] specificSystems It is possible to get or subscribe to updates only for specific uploading CloudClient instances. Pass the desired instances here. The overload that does not have the specificSystems parameter is treated as subscribing to all updates from all clients. + virtual bool Get(CloudQuery *cloudQuery, RakNetGUID systemIdentifier); + virtual bool Get(CloudQuery *cloudQuery, DataStructures::List &specificSystems, RakNetGUID systemIdentifier); + virtual bool Get(CloudQuery *cloudQuery, DataStructures::List &specificSystems, RakNetGUID systemIdentifier); + + /// \brief Unsubscribe from updates previously subscribed to using Get() with the CloudQuery::subscribeToResults set to true + /// The \a keys and \a specificSystems parameters are logically treated as AND when checking subscriptions on the server + /// The overload that does not take specificSystems unsubscribes to all passed keys, regardless of system + /// You cannot unsubscribe specific systems when previously subscribed to updates from any system. To do this, first Unsubscribe() from all systems, and call Get() with the \a specificSystems parameter explicilty listing the systems you want to subscribe to. + virtual void Unsubscribe(DataStructures::List &keys, RakNetGUID systemIdentifier); + virtual void Unsubscribe(DataStructures::List &keys, DataStructures::List &specificSystems, RakNetGUID systemIdentifier); + virtual void Unsubscribe(DataStructures::List &keys, DataStructures::List &specificSystems, RakNetGUID systemIdentifier); + + /// \brief Call this when you get ID_CLOUD_GET_RESPONSE + /// If \a callback or \a allocator are 0, the default callbacks passed to SetDefaultCallbacks() are used + /// \param[in] packet Packet structure returned from RakPeerInterface + /// \param[in] _callback Callback to be called from the function containing output parameters. If 0, default is used. + /// \param[in] _allocator Allocator to be used to allocate data. If 0, default is used. + virtual void OnGetReponse(Packet *packet, CloudClientCallback *_callback=0, CloudAllocator *_allocator=0); + + /// \brief Call this when you get ID_CLOUD_GET_RESPONSE + /// Different form of OnGetReponse that returns to a structure that you pass, instead of using a callback + /// You are responsible for deallocation with this form + /// If \a allocator is 0, the default callback passed to SetDefaultCallbacks() are used + /// \param[out] cloudQueryResult A pointer to a structure that will be filled out with data + /// \param[in] packet Packet structure returned from RakPeerInterface + /// \param[in] _allocator Allocator to be used to allocate data. If 0, default is used. + virtual void OnGetReponse(CloudQueryResult *cloudQueryResult, Packet *packet, CloudAllocator *_allocator=0); + + /// \brief Call this when you get ID_CLOUD_SUBSCRIPTION_NOTIFICATION + /// If \a callback or \a allocator are 0, the default callbacks passed to SetDefaultCallbacks() are used + /// \param[in] packet Packet structure returned from RakPeerInterface + /// \param[in] _callback Callback to be called from the function containing output parameters. If 0, default is used. + /// \param[in] _allocator Allocator to be used to allocate data. If 0, default is used. + virtual void OnSubscriptionNotification(Packet *packet, CloudClientCallback *_callback=0, CloudAllocator *_allocator=0); + + /// \brief Call this when you get ID_CLOUD_SUBSCRIPTION_NOTIFICATION + /// Different form of OnSubscriptionNotification that returns to a structure that you pass, instead of using a callback + /// You are responsible for deallocation with this form + /// If \a allocator is 0, the default callback passed to SetDefaultCallbacks() are used + /// \param[out] wasUpdated If true, the row was updated. If false, it was deleted. \a result will contain the last value just before deletion + /// \param[out] row A pointer to a structure that will be filled out with data + /// \param[in] packet Packet structure returned from RakPeerInterface + /// \param[in] _allocator Allocator to be used to allocate data. If 0, default is used. + virtual void OnSubscriptionNotification(bool *wasUpdated, CloudQueryRow *row, Packet *packet, CloudAllocator *_allocator=0); + + /// If you never specified an allocator, and used the non-callback form of OnGetReponse(), deallocate cloudQueryResult with this function + virtual void DeallocateWithDefaultAllocator(CloudQueryResult *cloudQueryResult); + + /// If you never specified an allocator, and used the non-callback form of OnSubscriptionNotification(), deallocate row with this function + virtual void DeallocateWithDefaultAllocator(CloudQueryRow *row); + +protected: + PluginReceiveResult OnReceive(Packet *packet); + + CloudClientCallback *callback; + CloudAllocator *allocator; + + CloudAllocator unsetDefaultAllocator; +}; + +/// \ingroup CLOUD_GROUP +/// Parses ID_CLOUD_GET_RESPONSE and ID_CLOUD_SUBSCRIPTION_NOTIFICATION in a convenient callback form +class RAK_DLL_EXPORT CloudClientCallback +{ +public: + CloudClientCallback() {} + virtual ~CloudClientCallback() {} + + /// \brief Called in response to ID_CLOUD_GET_RESPONSE + /// \param[out] result Contains the original query passed to Get(), and a list of rows returned. + /// \param[out] deallocateRowsAfterReturn CloudQueryResult::rowsReturned will be deallocated after the function returns by default. Set to false to not deallocate these pointers. The pointers are allocated through CloudAllocator. + virtual void OnGet(RakNet::CloudQueryResult *result, bool *deallocateRowsAfterReturn) {(void) result; (void) deallocateRowsAfterReturn;} + + /// \brief Called in response to ID_CLOUD_SUBSCRIPTION_NOTIFICATION + /// \param[out] result Contains the row updated + /// \param[out] wasUpdated If true, the row was updated. If false, it was deleted. \a result will contain the last value just before deletion + /// \param[out] deallocateRowAfterReturn \a result will be deallocated after the function returns by default. Set to false to not deallocate these pointers. The pointers are allocated through CloudAllocator. + virtual void OnSubscriptionNotification(RakNet::CloudQueryRow *result, bool wasUpdated, bool *deallocateRowAfterReturn) {(void) result; (void) wasUpdated; (void) deallocateRowAfterReturn;} +}; + +} // namespace RakNet + +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CloudCommon.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CloudCommon.cpp new file mode 100644 index 0000000..083857d --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CloudCommon.cpp @@ -0,0 +1,159 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_CloudClient==1 || _RAKNET_SUPPORT_CloudServer==1 + +#include "CloudCommon.h" +#include "BitStream.h" + +using namespace RakNet; + +int RakNet::CloudKeyComp(const CloudKey &key, const CloudKey &data) +{ + if (key.primaryKey < data.primaryKey) + return -1; + if (key.primaryKey > data.primaryKey) + return 1; + if (key.secondaryKey < data.secondaryKey) + return -1; + if (key.secondaryKey > data.secondaryKey) + return 1; + return 0; +} + +CloudQueryRow* CloudAllocator::AllocateCloudQueryRow(void) +{ + return RakNet::OP_NEW(_FILE_AND_LINE_); +} +void CloudAllocator::DeallocateCloudQueryRow(CloudQueryRow *row) +{ + RakNet::OP_DELETE(row,_FILE_AND_LINE_); +} +unsigned char *CloudAllocator::AllocateRowData(uint32_t bytesNeededForData) +{ + return (unsigned char*) rakMalloc_Ex(bytesNeededForData,_FILE_AND_LINE_); +} +void CloudAllocator::DeallocateRowData(void *data) +{ + rakFree_Ex(data, _FILE_AND_LINE_); +} +void CloudKey::Serialize(bool writeToBitstream, BitStream *bitStream) +{ + bitStream->Serialize(writeToBitstream, primaryKey); + bitStream->Serialize(writeToBitstream, secondaryKey); +} +void CloudQuery::Serialize(bool writeToBitstream, BitStream *bitStream) +{ + bool startingRowIndexIsZero=0; + bool maxRowsToReturnIsZero=0; + startingRowIndexIsZero=startingRowIndex==0; + maxRowsToReturnIsZero=maxRowsToReturn==0; + bitStream->Serialize(writeToBitstream,startingRowIndexIsZero); + bitStream->Serialize(writeToBitstream,maxRowsToReturnIsZero); + bitStream->Serialize(writeToBitstream,subscribeToResults); + if (startingRowIndexIsZero==false) + bitStream->Serialize(writeToBitstream,startingRowIndex); + if (maxRowsToReturnIsZero==false) + bitStream->Serialize(writeToBitstream,maxRowsToReturn); + RakAssert(keys.Size()<(uint16_t)-1); + uint16_t numKeys = (uint16_t) keys.Size(); + bitStream->Serialize(writeToBitstream,numKeys); + if (writeToBitstream) + { + for (uint16_t i=0; i < numKeys; i++) + { + keys[i].Serialize(true,bitStream); + } + } + else + { + CloudKey cmdk; + for (uint16_t i=0; i < numKeys; i++) + { + cmdk.Serialize(false,bitStream); + keys.Push(cmdk, _FILE_AND_LINE_); + } + } +} +void CloudQueryRow::Serialize(bool writeToBitstream, BitStream *bitStream, CloudAllocator *allocator) +{ + key.Serialize(writeToBitstream,bitStream); + bitStream->Serialize(writeToBitstream,serverSystemAddress); + bitStream->Serialize(writeToBitstream,clientSystemAddress); + bitStream->Serialize(writeToBitstream,serverGUID); + bitStream->Serialize(writeToBitstream,clientGUID); + bitStream->Serialize(writeToBitstream,length); + if (writeToBitstream) + { + bitStream->WriteAlignedBytes((const unsigned char*) data,length); + } + else + { + if (length>0) + { + data = allocator->AllocateRowData(length); + if (data) + { + bitStream->ReadAlignedBytes((unsigned char *) data,length); + } + else + { + notifyOutOfMemory(_FILE_AND_LINE_); + } + } + else + data=0; + } +} +void CloudQueryResult::SerializeHeader(bool writeToBitstream, BitStream *bitStream) +{ + cloudQuery.Serialize(writeToBitstream,bitStream); + bitStream->Serialize(writeToBitstream,subscribeToResults); +} +void CloudQueryResult::SerializeNumRows(bool writeToBitstream, uint32_t &numRows, BitStream *bitStream) +{ + bitStream->Serialize(writeToBitstream,numRows); +} +void CloudQueryResult::SerializeCloudQueryRows(bool writeToBitstream, uint32_t &numRows, BitStream *bitStream, CloudAllocator *allocator) +{ + if (writeToBitstream) + { + for (uint16_t i=0; i < numRows; i++) + { + rowsReturned[i]->Serialize(true,bitStream, allocator); + } + } + else + { + CloudQueryRow* cmdr; + for (uint16_t i=0; i < numRows; i++) + { + cmdr = allocator->AllocateCloudQueryRow(); + if (cmdr) + { + cmdr->Serialize(false,bitStream,allocator); + if (cmdr->data==0 && cmdr->length>0) + { + allocator->DeallocateCloudQueryRow(cmdr); + notifyOutOfMemory(_FILE_AND_LINE_); + numRows=i; + return; + } + rowsReturned.Push(cmdr, _FILE_AND_LINE_); + } + else + { + notifyOutOfMemory(_FILE_AND_LINE_); + numRows=i; + return; + } + } + } +} +void CloudQueryResult::Serialize(bool writeToBitstream, BitStream *bitStream, CloudAllocator *allocator) +{ + SerializeHeader(writeToBitstream, bitStream); + uint32_t numRows = (uint32_t) rowsReturned.Size(); + SerializeNumRows(writeToBitstream, numRows, bitStream); + SerializeCloudQueryRows(writeToBitstream, numRows, bitStream, allocator); +} + +#endif // #if _RAKNET_SUPPORT_CloudMemoryClient==1 || _RAKNET_SUPPORT_CloudMemoryServer==1 diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CloudCommon.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CloudCommon.h new file mode 100644 index 0000000..23fdf99 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CloudCommon.h @@ -0,0 +1,141 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_CloudClient==1 || _RAKNET_SUPPORT_CloudServer==1 + +#ifndef __CLOUD_COMMON_H +#define __CLOUD_COMMON_H + +#include "RakNetTypes.h" +#include "RakString.h" + +namespace RakNet +{ + +class BitStream; +struct CloudQueryRow; + +/// Allocates CloudQueryRow and the row data. Override to use derived classes or different allocators +/// \ingroup CLOUD_GROUP +class RAK_DLL_EXPORT CloudAllocator +{ +public: + CloudAllocator() {} + virtual ~CloudAllocator() {} + + /// \brief Allocate a row + virtual CloudQueryRow* AllocateCloudQueryRow(void); + /// \brief Free a row + virtual void DeallocateCloudQueryRow(CloudQueryRow *row); + /// \brief Allocate CloudQueryRow::data + virtual unsigned char *AllocateRowData(uint32_t bytesNeededForData); + /// \brief Free CloudQueryRow::data + virtual void DeallocateRowData(void *data); +}; + +/// Serves as a key to identify data uploaded to or queried from the server. +/// \ingroup CLOUD_GROUP +struct RAK_DLL_EXPORT CloudKey +{ + CloudKey() {} + CloudKey(RakNet::RakString _primaryKey, uint32_t _secondaryKey) : primaryKey(_primaryKey), secondaryKey(_secondaryKey) {} + ~CloudKey() {} + + /// Identifies the primary key. This is intended to be a major category, such as the name of the application + /// Must be non-empty + RakNet::RakString primaryKey; + + /// Identifies the secondary key. This is intended to be a subcategory enumeration, such as PLAYER_LIST or RUNNING_SCORES + uint32_t secondaryKey; + + /// \internal + void Serialize(bool writeToBitstream, BitStream *bitStream); +}; + +/// \internal +int CloudKeyComp(const CloudKey &key, const CloudKey &data); + +/// Data members used to query the cloud +/// \ingroup CLOUD_GROUP +struct RAK_DLL_EXPORT CloudQuery +{ + CloudQuery() {startingRowIndex=0; maxRowsToReturn=0; subscribeToResults=false;} + + /// List of keys to query. Must be at least of length 1. + /// This query is run on uploads from all clients, and those that match the combination of primaryKey and secondaryKey are potentially returned + /// If you pass more than one key at a time, the results are concatenated so if you need to differentiate between queries then send two different queries + DataStructures::List keys; + + /// If limiting the number of rows to return, this is the starting offset into the list. Has no effect unless maxRowsToReturn is > 0 + uint32_t startingRowIndex; + + /// Maximum number of rows to return. Actual number may still be less than this. Pass 0 to mean no-limit. + uint32_t maxRowsToReturn; + + /// If true, automatically get updates as the results returned to you change. Unsubscribe with CloudMemoryClient::Unsubscribe() + bool subscribeToResults; + + /// \internal + void Serialize(bool writeToBitstream, BitStream *bitStream); +}; + +/// \ingroup CLOUD_GROUP +struct RAK_DLL_EXPORT CloudQueryRow +{ + /// Key used to identify this data + CloudKey key; + + /// Data uploaded + unsigned char *data; + + /// Length of data uploaded + uint32_t length; + + /// System address of server that is holding this data, and the client is connected to + SystemAddress serverSystemAddress; + + /// System address of client that uploaded this data + SystemAddress clientSystemAddress; + + /// RakNetGUID of server that is holding this data, and the client is connected to + RakNetGUID serverGUID; + + /// RakNetGUID of client that uploaded this data + RakNetGUID clientGUID; + + /// \internal + void Serialize(bool writeToBitstream, BitStream *bitStream, CloudAllocator *allocator); +}; + +/// \ingroup CLOUD_GROUP +struct RAK_DLL_EXPORT CloudQueryResult +{ + /// Query originally passed to Download() + CloudQuery cloudQuery; + + /// Results returned from query. If there were multiple keys in CloudQuery::keys then see resultKeyIndices + DataStructures::List rowsReturned; + + /// If there were multiple keys in CloudQuery::keys, then each key is processed in order and the result concatenated to rowsReturned + /// The starting index of each query is written to resultKeyIndices + /// For example, if CloudQuery::keys had 4 keys, returning 3 rows, 0, rows, 5 rows, and 12 rows then + /// resultKeyIndices would be 0, 3, 3, 8 + DataStructures::List resultKeyIndices; + + + /// Whatever was passed to CloudClient::Get() as CloudQuery::subscribeToResults + bool subscribeToResults; + + /// \internal + void Serialize(bool writeToBitstream, BitStream *bitStream, CloudAllocator *allocator); + /// \internal + void SerializeHeader(bool writeToBitstream, BitStream *bitStream); + /// \internal + void SerializeNumRows(bool writeToBitstream, uint32_t &numRows, BitStream *bitStream); + /// \internal + void SerializeCloudQueryRows(bool writeToBitstream, uint32_t &numRows, BitStream *bitStream, CloudAllocator *allocator); +}; + +} // Namespace RakNet + +#endif // __CLOUD_COMMON_H + +#endif // #if _RAKNET_SUPPORT_CloudClient==1 || _RAKNET_SUPPORT_CloudServer==1 diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CloudServer.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CloudServer.cpp new file mode 100644 index 0000000..f1c7529 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CloudServer.cpp @@ -0,0 +1,1673 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_CloudServer==1 + +#include "CloudServer.h" +#include "GetTime.h" +#include "MessageIdentifiers.h" +#include "BitStream.h" +#include "RakPeerInterface.h" + +enum ServerToServerCommands +{ + STSC_PROCESS_GET_REQUEST, + STSC_PROCESS_GET_RESPONSE, + STSC_ADD_UPLOADED_AND_SUBSCRIBED_KEYS, + STSC_ADD_UPLOADED_KEY, + STSC_ADD_SUBSCRIBED_KEY, + STSC_REMOVE_UPLOADED_KEY, + STSC_REMOVE_SUBSCRIBED_KEY, + STSC_DATA_CHANGED, +}; + +using namespace RakNet; + +int CloudServer::RemoteServerComp(const RakNetGUID &key, RemoteServer* const &data ) +{ + if (key < data->serverAddress) + return -1; + if (key > data->serverAddress) + return 1; + return 0; +} +int CloudServer::KeySubscriberIDComp(const CloudKey &key, KeySubscriberID * const &data ) +{ + if (key.primaryKey < data->key.primaryKey) + return -1; + if (key.primaryKey > data->key.primaryKey) + return 1; + if (key.secondaryKey < data->key.secondaryKey) + return -1; + if (key.secondaryKey > data->key.secondaryKey) + return 1; + return 0; +} +int CloudServer::KeyDataPtrComp( const RakNetGUID &key, CloudData* const &data ) +{ + if (key < data->clientGUID) + return -1; + if (key > data->clientGUID) + return 1; + return 0; +} +int CloudServer::KeyDataListComp( const CloudKey &key, CloudDataList * const &data ) +{ + if (key.primaryKey < data->key.primaryKey) + return -1; + if (key.primaryKey > data->key.primaryKey) + return 1; + if (key.secondaryKey < data->key.secondaryKey) + return -1; + if (key.secondaryKey > data->key.secondaryKey) + return 1; + return 0; +} +int CloudServer::BufferedGetResponseFromServerComp(const RakNetGUID &key, CloudServer::BufferedGetResponseFromServer* const &data ) +{ + if (key < data->serverAddress) + return -1; + if (key > data->serverAddress) + return 1; + return 0; +} +int CloudServer::GetRequestComp(const uint32_t &key, CloudServer::GetRequest* const &data ) +{ + if (key < data->requestId) + return -1; + if (key > data->requestId) + return -1; + return 0; +} +void CloudServer::CloudQueryWithAddresses::Serialize(bool writeToBitstream, BitStream *bitStream) +{ + cloudQuery.Serialize(writeToBitstream, bitStream); + + if (writeToBitstream) + { + bitStream->WriteCasted(specificSystems.Size()); + RakAssert(specificSystems.Size() < (uint16_t)-1 ); + for (uint16_t i=0; i < specificSystems.Size(); i++) + { + bitStream->Write(specificSystems[i]); + } + } + else + { + uint16_t specificSystemsCount; + RakNetGUID addressOrGuid; + bitStream->Read(specificSystemsCount); + for (uint16_t i=0; i < specificSystemsCount; i++) + { + bitStream->Read(addressOrGuid); + specificSystems.Push(addressOrGuid, _FILE_AND_LINE_); + } + } +} +bool CloudServer::GetRequest::AllRemoteServersHaveResponded(void) const +{ + unsigned int i; + for (i=0; i < remoteServerResponses.Size(); i++) + if (remoteServerResponses[i]->gotResult==false) + return false; + return true; +} +void CloudServer::GetRequest::Clear(CloudAllocator *allocator) +{ + unsigned int i; + for (i=0; i < remoteServerResponses.Size(); i++) + { + remoteServerResponses[i]->Clear(allocator); + RakNet::OP_DELETE(remoteServerResponses[i], _FILE_AND_LINE_); + } + remoteServerResponses.Clear(false, _FILE_AND_LINE_); +} +void CloudServer::BufferedGetResponseFromServer::Clear(CloudAllocator *allocator) +{ + unsigned int i; + for (i=0; i < queryResult.rowsReturned.Size(); i++) + { + allocator->DeallocateRowData(queryResult.rowsReturned[i]->data); + allocator->DeallocateCloudQueryRow(queryResult.rowsReturned[i]); + } + queryResult.rowsReturned.Clear(false, _FILE_AND_LINE_); +} +CloudServer::CloudServer() +{ + maxUploadBytesPerClient=0; + maxBytesPerDowload=0; + nextGetRequestId=0; + nextGetRequestsCheck=0; +} +CloudServer::~CloudServer() +{ + Clear(); +} +void CloudServer::SetMaxUploadBytesPerClient(uint64_t bytes) +{ + maxUploadBytesPerClient=bytes; +} +void CloudServer::SetMaxBytesPerDownload(uint64_t bytes) +{ + maxBytesPerDowload=bytes; +} +void CloudServer::Update(void) +{ + // Timeout getRequests + RakNet::Time time = RakNet::Time(); + if (time > nextGetRequestsCheck) + { + nextGetRequestsCheck=time+1000; + + unsigned int i=0; + while (i < getRequests.Size()) + { + if (time - getRequests[i]->requestStartTime > 3000) + { + // Remote server is not responding, just send back data with whoever did respond + ProcessAndTransmitGetRequest(getRequests[i]); + getRequests[i]->Clear(this); + RakNet::OP_DELETE(getRequests[i],_FILE_AND_LINE_); + getRequests.RemoveAtIndex(i); + } + else + { + i++; + } + } + } +} +PluginReceiveResult CloudServer::OnReceive(Packet *packet) +{ + switch (packet->data[0]) + { + case ID_CLOUD_POST_REQUEST: + OnPostRequest(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + case ID_CLOUD_RELEASE_REQUEST: + OnReleaseRequest(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + case ID_CLOUD_GET_REQUEST: + OnGetRequest(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + case ID_CLOUD_UNSUBSCRIBE_REQUEST: + OnUnsubscribeRequest(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + case ID_CLOUD_SERVER_TO_SERVER_COMMAND: + if (packet->length>1) + { + switch (packet->data[1]) + { + case STSC_PROCESS_GET_REQUEST: + OnServerToServerGetRequest(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + case STSC_PROCESS_GET_RESPONSE: + OnServerToServerGetResponse(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + case STSC_ADD_UPLOADED_AND_SUBSCRIBED_KEYS: + OnSendUploadedAndSubscribedKeysToServer(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + case STSC_ADD_UPLOADED_KEY: + OnSendUploadedKeyToServers(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + case STSC_ADD_SUBSCRIBED_KEY: + OnSendSubscribedKeyToServers(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + case STSC_REMOVE_UPLOADED_KEY: + OnRemoveUploadedKeyFromServers(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + case STSC_REMOVE_SUBSCRIBED_KEY: + OnRemoveSubscribedKeyFromServers(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + case STSC_DATA_CHANGED: + OnServerDataChanged(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + } + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + return RR_CONTINUE_PROCESSING; +} +void CloudServer::OnPostRequest(Packet *packet) +{ + RakNet::BitStream bsIn(packet->data, packet->length, false); + bsIn.IgnoreBytes(sizeof(MessageID)); + CloudKey key; + key.Serialize(false,&bsIn); + uint32_t dataLengthBytes; + bsIn.Read(dataLengthBytes); + if (maxUploadBytesPerClient>0 && dataLengthBytes>maxUploadBytesPerClient) + return; // Exceeded max upload bytes + + bsIn.AlignReadToByteBoundary(); + for (unsigned int filterIndex=0; filterIndex < queryFilters.Size(); filterIndex++) + { + if (queryFilters[filterIndex]->OnPostRequest(packet->guid, packet->systemAddress, key, dataLengthBytes, (const char*) bsIn.GetData()+BITS_TO_BYTES(bsIn.GetReadOffset()))==false) + return; + } + + unsigned char *data; + if (dataLengthBytes>CLOUD_SERVER_DATA_STACK_SIZE) + { + data = (unsigned char *) rakMalloc_Ex(dataLengthBytes,_FILE_AND_LINE_); + if (data==0) + { + notifyOutOfMemory(_FILE_AND_LINE_); + return; + } + bsIn.ReadAlignedBytes(data,dataLengthBytes); + } + else + data=0; + + // Add this system to remoteSystems if they aren't there already + DataStructures::HashIndex remoteSystemsHashIndex = remoteSystems.GetIndexOf(packet->guid); + RemoteCloudClient *remoteCloudClient; + if (remoteSystemsHashIndex.IsInvalid()) + { + remoteCloudClient = RakNet::OP_NEW(_FILE_AND_LINE_); + remoteCloudClient->uploadedKeys.Insert(key,key,true,_FILE_AND_LINE_); + remoteCloudClient->uploadedBytes=0; + remoteSystems.Push(packet->guid, remoteCloudClient, _FILE_AND_LINE_); + } + else + { + remoteCloudClient = remoteSystems.ItemAtIndex(remoteSystemsHashIndex); + bool objectExists; + // Add to RemoteCloudClient::uploadedKeys if it isn't there already + unsigned int uploadedKeysIndex = remoteCloudClient->uploadedKeys.GetIndexFromKey(key,&objectExists); + if (objectExists==false) + { + remoteCloudClient->uploadedKeys.InsertAtIndex(key, uploadedKeysIndex, _FILE_AND_LINE_); + } + } + + bool cloudDataAlreadyUploaded; + unsigned int dataRepositoryIndex; + bool dataRepositoryExists; + CloudDataList* cloudDataList = GetOrAllocateCloudDataList(key, &dataRepositoryExists, dataRepositoryIndex); + if (dataRepositoryExists==false) + { + cloudDataList->uploaderCount=1; + cloudDataAlreadyUploaded=false; + } + else + { + cloudDataAlreadyUploaded=cloudDataList->uploaderCount>0; + cloudDataList->uploaderCount++; + } + + CloudData *cloudData; + bool keyDataListExists; + unsigned int keyDataListIndex = cloudDataList->keyData.GetIndexFromKey(packet->guid, &keyDataListExists); + if (keyDataListExists==false) + { + if (maxUploadBytesPerClient>0 && remoteCloudClient->uploadedBytes+dataLengthBytes>maxUploadBytesPerClient) + { + // Undo prior insertion of cloudDataList into cloudData if needed + if (keyDataListExists==false) + { + RakNet::OP_DELETE(cloudDataList,_FILE_AND_LINE_); + dataRepository.RemoveAtIndex(dataRepositoryIndex); + } + + if (remoteCloudClient->IsUnused()) + { + RakNet::OP_DELETE(remoteCloudClient, _FILE_AND_LINE_); + remoteSystems.Remove(packet->guid, _FILE_AND_LINE_); + } + + if (dataLengthBytes>CLOUD_SERVER_DATA_STACK_SIZE) + rakFree_Ex(data, _FILE_AND_LINE_); + + return; + } + + cloudData = RakNet::OP_NEW(_FILE_AND_LINE_); + cloudData->dataLengthBytes=dataLengthBytes; + cloudData->isUploaded=true; + if (forceAddress!=UNASSIGNED_SYSTEM_ADDRESS) + { + cloudData->serverSystemAddress=forceAddress; + cloudData->serverSystemAddress.SetPort(rakPeerInterface->GetExternalID(packet->systemAddress).GetPort()); + } + else + { + cloudData->serverSystemAddress=rakPeerInterface->GetExternalID(packet->systemAddress); + } + if (cloudData->serverSystemAddress.GetPort()==0) + { + // Fix localhost port + cloudData->serverSystemAddress.SetPort(rakPeerInterface->GetSocket(UNASSIGNED_SYSTEM_ADDRESS)->boundAddress.GetPort()); + } + cloudData->clientSystemAddress=packet->systemAddress; + cloudData->serverGUID=rakPeerInterface->GetMyGUID(); + cloudData->clientGUID=packet->guid; + cloudDataList->keyData.Insert(packet->guid,cloudData,true,_FILE_AND_LINE_); + } + else + { + cloudData = cloudDataList->keyData[keyDataListIndex]; + + if (cloudDataAlreadyUploaded==false) + { + if (forceAddress!=UNASSIGNED_SYSTEM_ADDRESS) + { + cloudData->serverSystemAddress=forceAddress; + cloudData->serverSystemAddress.SetPort(rakPeerInterface->GetExternalID(packet->systemAddress).GetPort()); + } + else + { + cloudData->serverSystemAddress=rakPeerInterface->GetExternalID(packet->systemAddress); + } + if (cloudData->serverSystemAddress.GetPort()==0) + { + // Fix localhost port + cloudData->serverSystemAddress.SetPort(rakPeerInterface->GetSocket(UNASSIGNED_SYSTEM_ADDRESS)->boundAddress.GetPort()); + } + + cloudData->clientSystemAddress=packet->systemAddress; + } + + if (maxUploadBytesPerClient>0 && remoteCloudClient->uploadedBytes-cloudData->dataLengthBytes+dataLengthBytes>maxUploadBytesPerClient) + { + // Undo prior insertion of cloudDataList into cloudData if needed + if (dataRepositoryExists==false) + { + RakNet::OP_DELETE(cloudDataList,_FILE_AND_LINE_); + dataRepository.RemoveAtIndex(dataRepositoryIndex); + } + return; + } + else + { + // Subtract already used bytes we are overwriting + remoteCloudClient->uploadedBytes-=cloudData->dataLengthBytes; + } + + if (cloudData->allocatedData!=0) + rakFree_Ex(cloudData->allocatedData,_FILE_AND_LINE_); + } + + if (dataLengthBytes>CLOUD_SERVER_DATA_STACK_SIZE) + { + // Data already allocated + cloudData->allocatedData=data; + cloudData->dataPtr=data; + } + else + { + // Read to stack + if (dataLengthBytes>0) + bsIn.ReadAlignedBytes(cloudData->stackData,dataLengthBytes); + cloudData->allocatedData=0; + cloudData->dataPtr=cloudData->stackData; + } + // Update how many bytes were written for this data + cloudData->dataLengthBytes=dataLengthBytes; + remoteCloudClient->uploadedBytes+=dataLengthBytes; + + if (cloudDataAlreadyUploaded==false) + { + // New data field + SendUploadedKeyToServers(cloudDataList->key); + } + + // Existing data field changed + NotifyClientSubscribersOfDataChange(cloudData, cloudDataList->key, cloudData->specificSubscribers, true ); + NotifyClientSubscribersOfDataChange(cloudData, cloudDataList->key, cloudDataList->nonSpecificSubscribers, true ); + + // Send update to all remote servers that subscribed to this key + NotifyServerSubscribersOfDataChange(cloudData, cloudDataList->key, true); + + // I could have also subscribed to a key not yet updated locally + // This means I have to go through every RemoteClient that wants this key + // Seems like cloudData->specificSubscribers is unnecessary in that case +} +void CloudServer::OnReleaseRequest(Packet *packet) +{ + RakNet::BitStream bsIn(packet->data, packet->length, false); + bsIn.IgnoreBytes(sizeof(MessageID)); + + uint16_t keyCount; + bsIn.Read(keyCount); + + if (keyCount==0) + return; + + DataStructures::HashIndex remoteSystemIndex = remoteSystems.GetIndexOf(packet->guid); + if (remoteSystemIndex.IsInvalid()==true) + return; + + RemoteCloudClient* remoteCloudClient = remoteSystems.ItemAtIndex(remoteSystemIndex); + + CloudKey key; + + // Read all in a list first so I can run filter on it + DataStructures::List cloudKeys; + for (uint16_t keyCountIndex=0; keyCountIndex < keyCount; keyCountIndex++) + { + key.Serialize(false, &bsIn); + cloudKeys.Push(key, _FILE_AND_LINE_); + } + + for (unsigned int filterIndex=0; filterIndex < queryFilters.Size(); filterIndex++) + { + if (queryFilters[filterIndex]->OnReleaseRequest(packet->guid, packet->systemAddress, cloudKeys)) + return; + } + + for (uint16_t keyCountIndex=0; keyCountIndex < keyCount; keyCountIndex++) + { + // Serialize in list above so I can run the filter on it + // key.Serialize(false, &bsIn); + key=cloudKeys[keyCountIndex]; + + // Remove remote systems uploaded keys + bool objectExists; + unsigned int uploadedKeysIndex = remoteCloudClient->uploadedKeys.GetIndexFromKey(key,&objectExists); + if (objectExists) + { + bool dataRepositoryExists; + unsigned int dataRepositoryIndex = dataRepository.GetIndexFromKey(key, &dataRepositoryExists); + CloudDataList* cloudDataList = dataRepository[dataRepositoryIndex]; + RakAssert(cloudDataList); + + CloudData *cloudData; + bool keyDataListExists; + unsigned int keyDataListIndex = cloudDataList->keyData.GetIndexFromKey(packet->guid, &keyDataListExists); + cloudData = cloudDataList->keyData[keyDataListIndex]; + + remoteCloudClient->uploadedKeys.RemoveAtIndex(uploadedKeysIndex); + remoteCloudClient->uploadedBytes-=cloudData->dataLengthBytes; + cloudDataList->uploaderCount--; + + // Broadcast destruction of this key to subscribers + NotifyClientSubscribersOfDataChange(cloudData, cloudDataList->key, cloudData->specificSubscribers, false ); + NotifyClientSubscribersOfDataChange(cloudData, cloudDataList->key, cloudDataList->nonSpecificSubscribers, false ); + NotifyServerSubscribersOfDataChange(cloudData, cloudDataList->key, false ); + + cloudData->Clear(); + + if (cloudData->IsUnused()) + { + RakNet::OP_DELETE(cloudData, _FILE_AND_LINE_); + cloudDataList->keyData.RemoveAtIndex(keyDataListIndex); + if (cloudDataList->IsNotUploaded()) + { + // Tell other servers that this key is no longer uploaded, so they do not request it from us + RemoveUploadedKeyFromServers(cloudDataList->key); + } + + if (cloudDataList->IsUnused()) + { + RakNet::OP_DELETE(cloudDataList, _FILE_AND_LINE_); + dataRepository.RemoveAtIndex(dataRepositoryIndex); + } + } + + if (remoteCloudClient->IsUnused()) + { + RakNet::OP_DELETE(remoteCloudClient, _FILE_AND_LINE_); + remoteSystems.RemoveAtIndex(remoteSystemIndex, _FILE_AND_LINE_); + break; + } + } + } +} +void CloudServer::OnGetRequest(Packet *packet) +{ + RakNet::BitStream bsIn(packet->data, packet->length, false); + bsIn.IgnoreBytes(sizeof(MessageID)); + uint16_t specificSystemsCount; + CloudKey cloudKey; + + // Create a new GetRequest + GetRequest *getRequest; + getRequest = RakNet::OP_NEW(_FILE_AND_LINE_); + getRequest->cloudQueryWithAddresses.cloudQuery.Serialize(false, &bsIn); + getRequest->requestingClient=packet->guid; + + RakNetGUID addressOrGuid; + bsIn.Read(specificSystemsCount); + for (uint16_t i=0; i < specificSystemsCount; i++) + { + bsIn.Read(addressOrGuid); + getRequest->cloudQueryWithAddresses.specificSystems.Push(addressOrGuid, _FILE_AND_LINE_); + } + + if (getRequest->cloudQueryWithAddresses.cloudQuery.keys.Size()==0) + { + RakNet::OP_DELETE(getRequest, _FILE_AND_LINE_); + return; + } + + for (unsigned int filterIndex=0; filterIndex < queryFilters.Size(); filterIndex++) + { + if (queryFilters[filterIndex]->OnGetRequest(packet->guid, packet->systemAddress, getRequest->cloudQueryWithAddresses.cloudQuery, getRequest->cloudQueryWithAddresses.specificSystems )==false) + return; + } + + getRequest->requestStartTime=RakNet::GetTime(); + getRequest->requestId=nextGetRequestId++; + + // Send request to servers that have this data + DataStructures::List remoteServersWithData; + GetServersWithUploadedKeys(getRequest->cloudQueryWithAddresses.cloudQuery.keys, remoteServersWithData); + + if (remoteServersWithData.Size()==0) + { + ProcessAndTransmitGetRequest(getRequest); + } + else + { + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_CLOUD_SERVER_TO_SERVER_COMMAND); + bsOut.Write((MessageID)STSC_PROCESS_GET_REQUEST); + getRequest->cloudQueryWithAddresses.Serialize(true, &bsOut); + bsOut.Write(getRequest->requestId); + + for (unsigned int remoteServerIndex=0; remoteServerIndex < remoteServersWithData.Size(); remoteServerIndex++) + { + BufferedGetResponseFromServer* bufferedGetResponseFromServer = RakNet::OP_NEW(_FILE_AND_LINE_); + bufferedGetResponseFromServer->serverAddress=remoteServersWithData[remoteServerIndex]->serverAddress; + bufferedGetResponseFromServer->gotResult=false; + getRequest->remoteServerResponses.Insert(remoteServersWithData[remoteServerIndex]->serverAddress, bufferedGetResponseFromServer, true, _FILE_AND_LINE_); + + SendUnified(&bsOut, HIGH_PRIORITY, RELIABLE_ORDERED, 0, remoteServersWithData[remoteServerIndex]->serverAddress, false); + } + + // Record that this system made this request + getRequests.Insert(getRequest->requestId, getRequest, true, _FILE_AND_LINE_); + } + + if (getRequest->cloudQueryWithAddresses.cloudQuery.subscribeToResults) + { + // Add to key subscription list for the client, which contains a keyId / specificUploaderList pair + DataStructures::HashIndex remoteSystemsHashIndex = remoteSystems.GetIndexOf(packet->guid); + RemoteCloudClient *remoteCloudClient; + if (remoteSystemsHashIndex.IsInvalid()) + { + remoteCloudClient = RakNet::OP_NEW(_FILE_AND_LINE_); + remoteCloudClient->uploadedBytes=0; + remoteSystems.Push(packet->guid, remoteCloudClient, _FILE_AND_LINE_); + } + else + { + remoteCloudClient = remoteSystems.ItemAtIndex(remoteSystemsHashIndex); + } + + unsigned int keyIndex; + for (keyIndex=0; keyIndex < getRequest->cloudQueryWithAddresses.cloudQuery.keys.Size(); keyIndex++) + { + cloudKey = getRequest->cloudQueryWithAddresses.cloudQuery.keys[keyIndex]; + + unsigned int keySubscriberIndex; + bool hasKeySubscriber; + keySubscriberIndex = remoteCloudClient->subscribedKeys.GetIndexFromKey(cloudKey, &hasKeySubscriber); + KeySubscriberID* keySubscriberId; + if (hasKeySubscriber) + { + DataStructures::List specificSystems; + UnsubscribeFromKey(remoteCloudClient, packet->guid, keySubscriberIndex, cloudKey, specificSystems); + } + + keySubscriberId = RakNet::OP_NEW(_FILE_AND_LINE_); + keySubscriberId->key=cloudKey; + + unsigned int specificSystemIndex; + for (specificSystemIndex=0; specificSystemIndex < getRequest->cloudQueryWithAddresses.specificSystems.Size(); specificSystemIndex++) + { + keySubscriberId->specificSystemsSubscribedTo.Insert(getRequest->cloudQueryWithAddresses.specificSystems[specificSystemIndex], getRequest->cloudQueryWithAddresses.specificSystems[specificSystemIndex], true, _FILE_AND_LINE_); + } + + remoteCloudClient->subscribedKeys.InsertAtIndex(keySubscriberId, keySubscriberIndex, _FILE_AND_LINE_); + + // Add CloudData in a similar way + unsigned int dataRepositoryIndex; + bool dataRepositoryExists; + CloudDataList* cloudDataList = GetOrAllocateCloudDataList(cloudKey, &dataRepositoryExists, dataRepositoryIndex); + + // If this is the first local client to subscribe to this key, call SendSubscribedKeyToServers + if (cloudDataList->subscriberCount==0) + SendSubscribedKeyToServers(cloudKey); + + // If the subscription is specific, may have to also allocate CloudData + if (getRequest->cloudQueryWithAddresses.specificSystems.Size()) + { + CloudData *cloudData; + bool keyDataListExists; + + unsigned int specificSystemIndex; + for (specificSystemIndex=0; specificSystemIndex < getRequest->cloudQueryWithAddresses.specificSystems.Size(); specificSystemIndex++) + { + RakNetGUID specificSystem = getRequest->cloudQueryWithAddresses.specificSystems[specificSystemIndex]; + + unsigned int keyDataListIndex = cloudDataList->keyData.GetIndexFromKey(specificSystem, &keyDataListExists); + if (keyDataListExists==false) + { + cloudData = RakNet::OP_NEW(_FILE_AND_LINE_); + cloudData->dataLengthBytes=0; + cloudData->allocatedData=0; + cloudData->isUploaded=false; + cloudData->dataPtr=0; + cloudData->serverSystemAddress=UNASSIGNED_SYSTEM_ADDRESS; + cloudData->clientSystemAddress=UNASSIGNED_SYSTEM_ADDRESS; + cloudData->serverGUID=rakPeerInterface->GetMyGUID(); + cloudData->clientGUID=specificSystem; + cloudDataList->keyData.Insert(specificSystem,cloudData,true,_FILE_AND_LINE_); + } + else + { + cloudData = cloudDataList->keyData[keyDataListIndex]; + } + + ++cloudDataList->subscriberCount; + cloudData->specificSubscribers.Insert(packet->guid, packet->guid, true, _FILE_AND_LINE_); + } + } + else + { + ++cloudDataList->subscriberCount; + cloudDataList->nonSpecificSubscribers.Insert(packet->guid, packet->guid, true, _FILE_AND_LINE_); + + // Remove packet->guid from CloudData::specificSubscribers among all instances of cloudDataList->keyData + unsigned int subscribedKeysIndex; + bool subscribedKeysIndexExists; + subscribedKeysIndex = remoteCloudClient->subscribedKeys.GetIndexFromKey(cloudDataList->key, &subscribedKeysIndexExists); + if (subscribedKeysIndexExists) + { + KeySubscriberID* keySubscriberId; + keySubscriberId = remoteCloudClient->subscribedKeys[subscribedKeysIndex]; + unsigned int specificSystemIndex; + for (specificSystemIndex=0; specificSystemIndex < keySubscriberId->specificSystemsSubscribedTo.Size(); specificSystemIndex++) + { + bool keyDataExists; + unsigned int keyDataIndex = cloudDataList->keyData.GetIndexFromKey(keySubscriberId->specificSystemsSubscribedTo[specificSystemIndex], &keyDataExists); + if (keyDataExists) + { + CloudData *keyData = cloudDataList->keyData[keyDataIndex]; + keyData->specificSubscribers.Remove(packet->guid); + --cloudDataList->subscriberCount; + } + } + } + } + } + + if (remoteCloudClient->subscribedKeys.Size()==0) + { + // Didn't do anything + remoteSystems.Remove(packet->guid, _FILE_AND_LINE_); + RakNet::OP_DELETE(remoteCloudClient, _FILE_AND_LINE_); + } + } + + if (remoteServersWithData.Size()==0) + RakNet::OP_DELETE(getRequest, _FILE_AND_LINE_); +} +void CloudServer::OnUnsubscribeRequest(Packet *packet) +{ + RakNet::BitStream bsIn(packet->data, packet->length, false); + bsIn.IgnoreBytes(sizeof(MessageID)); + + DataStructures::HashIndex remoteSystemIndex = remoteSystems.GetIndexOf(packet->guid); + if (remoteSystemIndex.IsInvalid()==true) + return; + + RemoteCloudClient* remoteCloudClient = remoteSystems.ItemAtIndex(remoteSystemIndex); + + uint16_t keyCount, specificSystemCount; + DataStructures::List cloudKeys; + DataStructures::List specificSystems; + uint16_t index; + + CloudKey cloudKey; + bsIn.Read(keyCount); + for (index=0; index < keyCount; index++) + { + cloudKey.Serialize(false, &bsIn); + cloudKeys.Push(cloudKey, _FILE_AND_LINE_); + } + + RakNetGUID specificSystem; + bsIn.Read(specificSystemCount); + for (index=0; index < specificSystemCount; index++) + { + bsIn.Read(specificSystem); + specificSystems.Push(specificSystem, _FILE_AND_LINE_); + } + + for (unsigned int filterIndex=0; filterIndex < queryFilters.Size(); filterIndex++) + { + if (queryFilters[filterIndex]->OnUnsubscribeRequest(packet->guid, packet->systemAddress, cloudKeys, specificSystems )==false) + return; + } + +// CloudDataList *cloudDataList; + bool dataRepositoryExists; +// unsigned int dataRepositoryIndex; + + for (index=0; index < keyCount; index++) + { + CloudKey cloudKey = cloudKeys[index]; + + // dataRepositoryIndex = + dataRepository.GetIndexFromKey(cloudKey, &dataRepositoryExists); + if (dataRepositoryExists==false) + continue; +// cloudDataList = dataRepository[dataRepositoryIndex]; + + unsigned int keySubscriberIndex; + bool hasKeySubscriber; + keySubscriberIndex = remoteCloudClient->subscribedKeys.GetIndexFromKey(cloudKey, &hasKeySubscriber); + + if (hasKeySubscriber==false) + continue; + + UnsubscribeFromKey(remoteCloudClient, packet->guid, keySubscriberIndex, cloudKey, specificSystems); + } + + if (remoteCloudClient->IsUnused()) + { + RakNet::OP_DELETE(remoteCloudClient, _FILE_AND_LINE_); + remoteSystems.RemoveAtIndex(remoteSystemIndex, _FILE_AND_LINE_); + } +} +void CloudServer::OnServerToServerGetRequest(Packet *packet) +{ +// unsigned int remoteServerIndex; + bool objectExists; + //remoteServerIndex = + remoteServers.GetIndexFromKey(packet->guid, &objectExists); + if (objectExists==false) + return; + + RakNet::BitStream bsIn(packet->data, packet->length, false); + bsIn.IgnoreBytes(sizeof(MessageID)*2); + + CloudQueryWithAddresses cloudQueryWithAddresses; + uint32_t requestId; + cloudQueryWithAddresses.Serialize(false, &bsIn); + bsIn.Read(requestId); + + DataStructures::List cloudDataResultList; + DataStructures::List cloudKeyResultList; + ProcessCloudQueryWithAddresses(cloudQueryWithAddresses, cloudDataResultList, cloudKeyResultList); + + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_CLOUD_SERVER_TO_SERVER_COMMAND); + bsOut.Write((MessageID)STSC_PROCESS_GET_RESPONSE); + bsOut.Write(requestId); + WriteCloudQueryRowFromResultList(cloudDataResultList, cloudKeyResultList, &bsOut); + SendUnified(&bsOut, HIGH_PRIORITY, RELIABLE_ORDERED, 0, packet->guid, false); +} +void CloudServer::OnServerToServerGetResponse(Packet *packet) +{ + unsigned int remoteServerIndex; + bool objectExists; + remoteServerIndex = remoteServers.GetIndexFromKey(packet->guid, &objectExists); + if (objectExists==false) + return; + + RemoteServer *remoteServer = remoteServers[remoteServerIndex]; + if (remoteServer==0) + return; + + RakNet::BitStream bsIn(packet->data, packet->length, false); + bsIn.IgnoreBytes(sizeof(MessageID)*2); + + uint32_t requestId; + bsIn.Read(requestId); + + // Lookup request id + bool hasGetRequest; + unsigned int getRequestIndex; + getRequestIndex = getRequests.GetIndexFromKey(requestId, &hasGetRequest); + if (hasGetRequest==false) + return; + GetRequest *getRequest = getRequests[getRequestIndex]; + bool hasRemoteServer; + unsigned int remoteServerResponsesIndex; + remoteServerResponsesIndex = getRequest->remoteServerResponses.GetIndexFromKey(packet->guid, &hasRemoteServer); + if (hasRemoteServer==false) + return; + BufferedGetResponseFromServer *bufferedGetResponseFromServer; + bufferedGetResponseFromServer = getRequest->remoteServerResponses[remoteServerResponsesIndex]; + if (bufferedGetResponseFromServer->gotResult==true) + return; + bufferedGetResponseFromServer->gotResult=true; + uint32_t numRows; + bufferedGetResponseFromServer->queryResult.SerializeNumRows(false, numRows, &bsIn); + bufferedGetResponseFromServer->queryResult.SerializeCloudQueryRows(false, numRows, &bsIn, this); + + // If all results returned, then also process locally, and return to user + if (getRequest->AllRemoteServersHaveResponded()) + { + ProcessAndTransmitGetRequest(getRequest); + + getRequest->Clear(this); + RakNet::OP_DELETE(getRequest, _FILE_AND_LINE_); + + getRequests.RemoveAtIndex(getRequestIndex); + } +} +void CloudServer::OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ) +{ + (void) lostConnectionReason; + (void) systemAddress; + + unsigned int remoteServerIndex; + bool objectExists; + remoteServerIndex = remoteServers.GetIndexFromKey(rakNetGUID, &objectExists); + if (objectExists) + { + // Update remoteServerResponses by removing this server and sending the response if it is now complete + unsigned int getRequestIndex=0; + while (getRequestIndex < getRequests.Size()) + { + GetRequest *getRequest = getRequests[getRequestIndex]; + bool waitingForThisServer; + unsigned int remoteServerResponsesIndex = getRequest->remoteServerResponses.GetIndexFromKey(rakNetGUID, &waitingForThisServer); + if (waitingForThisServer) + { + getRequest->remoteServerResponses[remoteServerResponsesIndex]->Clear(this); + RakNet::OP_DELETE(getRequest->remoteServerResponses[remoteServerResponsesIndex], _FILE_AND_LINE_); + getRequest->remoteServerResponses.RemoveAtIndex(remoteServerResponsesIndex); + + if (getRequest->AllRemoteServersHaveResponded()) + { + ProcessAndTransmitGetRequest(getRequest); + getRequest->Clear(this); + RakNet::OP_DELETE(getRequest, _FILE_AND_LINE_); + + getRequests.RemoveAtIndex(getRequestIndex); + } + else + getRequestIndex++; + } + else + getRequestIndex++; + } + + RakNet::OP_DELETE(remoteServers[remoteServerIndex],_FILE_AND_LINE_); + remoteServers.RemoveAtIndex(remoteServerIndex); + } + + DataStructures::HashIndex remoteSystemIndex = remoteSystems.GetIndexOf(rakNetGUID); + if (remoteSystemIndex.IsInvalid()==false) + { + RemoteCloudClient* remoteCloudClient = remoteSystems.ItemAtIndex(remoteSystemIndex); + unsigned int uploadedKeysIndex; + for (uploadedKeysIndex=0; uploadedKeysIndex < remoteCloudClient->uploadedKeys.Size(); uploadedKeysIndex++) + { + // Delete keys this system has uploaded + bool keyDataRepositoryExists; + unsigned int dataRepositoryIndex = dataRepository.GetIndexFromKey(remoteCloudClient->uploadedKeys[uploadedKeysIndex], &keyDataRepositoryExists); + if (keyDataRepositoryExists) + { + CloudDataList* cloudDataList = dataRepository[dataRepositoryIndex]; + bool keyDataExists; + unsigned int keyDataIndex = cloudDataList->keyData.GetIndexFromKey(rakNetGUID, &keyDataExists); + if (keyDataExists) + { + CloudData *cloudData = cloudDataList->keyData[keyDataIndex]; + cloudDataList->uploaderCount--; + + NotifyClientSubscribersOfDataChange(cloudData, cloudDataList->key, cloudData->specificSubscribers, false ); + NotifyClientSubscribersOfDataChange(cloudData, cloudDataList->key, cloudDataList->nonSpecificSubscribers, false ); + NotifyServerSubscribersOfDataChange(cloudData, cloudDataList->key, false ); + + cloudData->Clear(); + + if (cloudData->IsUnused()) + { + RakNet::OP_DELETE(cloudData,_FILE_AND_LINE_); + cloudDataList->keyData.RemoveAtIndex(keyDataIndex); + + if (cloudDataList->IsNotUploaded()) + { + // Tell other servers that this key is no longer uploaded, so they do not request it from us + RemoveUploadedKeyFromServers(cloudDataList->key); + } + + if (cloudDataList->IsUnused()) + { + // Tell other servers that this key is no longer uploaded, so they do not request it from us + RemoveUploadedKeyFromServers(cloudDataList->key); + + RakNet::OP_DELETE(cloudDataList, _FILE_AND_LINE_); + dataRepository.RemoveAtIndex(dataRepositoryIndex); + } + } + } + } + } + + unsigned int subscribedKeysIndex; + for (subscribedKeysIndex=0; subscribedKeysIndex < remoteCloudClient->subscribedKeys.Size(); subscribedKeysIndex++) + { + KeySubscriberID* keySubscriberId; + keySubscriberId = remoteCloudClient->subscribedKeys[subscribedKeysIndex]; + + bool keyDataRepositoryExists; + unsigned int keyDataRepositoryIndex = dataRepository.GetIndexFromKey(remoteCloudClient->subscribedKeys[subscribedKeysIndex]->key, &keyDataRepositoryExists); + if (keyDataRepositoryExists) + { + CloudDataList* cloudDataList = dataRepository[keyDataRepositoryIndex]; + if (keySubscriberId->specificSystemsSubscribedTo.Size()==0) + { + cloudDataList->nonSpecificSubscribers.Remove(rakNetGUID); + --cloudDataList->subscriberCount; + } + else + { + unsigned int specificSystemIndex; + for (specificSystemIndex=0; specificSystemIndex < keySubscriberId->specificSystemsSubscribedTo.Size(); specificSystemIndex++) + { + bool keyDataExists; + unsigned int keyDataIndex = cloudDataList->keyData.GetIndexFromKey(keySubscriberId->specificSystemsSubscribedTo[specificSystemIndex], &keyDataExists); + if (keyDataExists) + { + CloudData *keyData = cloudDataList->keyData[keyDataIndex]; + keyData->specificSubscribers.Remove(rakNetGUID); + --cloudDataList->subscriberCount; + } + } + } + } + + RakNet::OP_DELETE(keySubscriberId, _FILE_AND_LINE_); + } + + // Delete and remove from remoteSystems + RakNet::OP_DELETE(remoteCloudClient, _FILE_AND_LINE_); + remoteSystems.RemoveAtIndex(remoteSystemIndex, _FILE_AND_LINE_); + } +} +void CloudServer::OnRakPeerShutdown(void) +{ + Clear(); +} +void CloudServer::Clear(void) +{ + unsigned int i,j; + for (i=0; i < dataRepository.Size(); i++) + { + CloudDataList *cloudDataList = dataRepository[i]; + for (j=0; j < cloudDataList->keyData.Size(); j++) + { + cloudDataList->keyData[j]->Clear(); + RakNet::OP_DELETE(cloudDataList->keyData[j], _FILE_AND_LINE_); + } + RakNet::OP_DELETE(cloudDataList, _FILE_AND_LINE_); + } + dataRepository.Clear(false, _FILE_AND_LINE_); + + for (i=0; i < remoteServers.Size(); i++) + { + RakNet::OP_DELETE(remoteServers[i], _FILE_AND_LINE_); + } + remoteServers.Clear(false, _FILE_AND_LINE_); + + for (i=0; i < getRequests.Size(); i++) + { + GetRequest *getRequest = getRequests[i]; + getRequest->Clear(this); + RakNet::OP_DELETE(getRequests[i], _FILE_AND_LINE_); + } + getRequests.Clear(false, _FILE_AND_LINE_); + + DataStructures::List keyList; + DataStructures::List itemList; + remoteSystems.GetAsList(itemList, keyList, _FILE_AND_LINE_); + for (i=0; i < itemList.Size(); i++) + { + RemoteCloudClient* remoteCloudClient = itemList[i]; + for (j=0; j < remoteCloudClient->subscribedKeys.Size(); j++) + { + RakNet::OP_DELETE(remoteCloudClient->subscribedKeys[j], _FILE_AND_LINE_); + } + RakNet::OP_DELETE(remoteCloudClient, _FILE_AND_LINE_); + } + remoteSystems.Clear(_FILE_AND_LINE_); +} +void CloudServer::WriteCloudQueryRowFromResultList(DataStructures::List &cloudDataResultList, DataStructures::List &cloudKeyResultList, BitStream *bsOut) +{ + bsOut->WriteCasted(cloudKeyResultList.Size()); + unsigned int i; + for (i=0; i < cloudKeyResultList.Size(); i++) + { + WriteCloudQueryRowFromResultList(i, cloudDataResultList, cloudKeyResultList, bsOut); + } +} +void CloudServer::WriteCloudQueryRowFromResultList(unsigned int i, DataStructures::List &cloudDataResultList, DataStructures::List &cloudKeyResultList, BitStream *bsOut) +{ + CloudQueryRow cloudQueryRow; + CloudData *cloudData = cloudDataResultList[i]; + cloudQueryRow.key=cloudKeyResultList[i]; + cloudQueryRow.data=cloudData->dataPtr; + cloudQueryRow.length=cloudData->dataLengthBytes; + cloudQueryRow.serverSystemAddress=cloudData->serverSystemAddress; + cloudQueryRow.clientSystemAddress=cloudData->clientSystemAddress; + cloudQueryRow.serverGUID=cloudData->serverGUID; + cloudQueryRow.clientGUID=cloudData->clientGUID; + cloudQueryRow.Serialize(true, bsOut, 0); +} +void CloudServer::NotifyClientSubscribersOfDataChange( CloudData *cloudData, CloudKey &key, DataStructures::OrderedList &subscribers, bool wasUpdated ) +{ + RakNet::BitStream bsOut; + bsOut.Write((MessageID) ID_CLOUD_SUBSCRIPTION_NOTIFICATION); + bsOut.Write(wasUpdated); + CloudQueryRow row; + row.key=key; + row.data=cloudData->dataPtr; + row.length=cloudData->dataLengthBytes; + row.serverSystemAddress=cloudData->serverSystemAddress; + row.clientSystemAddress=cloudData->clientSystemAddress; + row.serverGUID=cloudData->serverGUID; + row.clientGUID=cloudData->clientGUID; + row.Serialize(true,&bsOut,0); + + unsigned int i; + for (i=0; i < subscribers.Size(); i++) + { + SendUnified(&bsOut, HIGH_PRIORITY, RELIABLE_ORDERED, 0, subscribers[i], false); + } +} +void CloudServer::NotifyClientSubscribersOfDataChange( CloudQueryRow *row, DataStructures::OrderedList &subscribers, bool wasUpdated ) +{ + RakNet::BitStream bsOut; + bsOut.Write((MessageID) ID_CLOUD_SUBSCRIPTION_NOTIFICATION); + bsOut.Write(wasUpdated); + row->Serialize(true,&bsOut,0); + + unsigned int i; + for (i=0; i < subscribers.Size(); i++) + { + SendUnified(&bsOut, HIGH_PRIORITY, RELIABLE_ORDERED, 0, subscribers[i], false); + } +} +void CloudServer::NotifyServerSubscribersOfDataChange( CloudData *cloudData, CloudKey &key, bool wasUpdated ) +{ + // Find every server that has subscribed + // Send them change notifications + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_CLOUD_SERVER_TO_SERVER_COMMAND); + bsOut.Write((MessageID)STSC_DATA_CHANGED); + bsOut.Write(wasUpdated); + CloudQueryRow row; + row.key=key; + row.data=cloudData->dataPtr; + row.length=cloudData->dataLengthBytes; + row.serverSystemAddress=cloudData->serverSystemAddress; + row.clientSystemAddress=cloudData->clientSystemAddress; + row.serverGUID=cloudData->serverGUID; + row.clientGUID=cloudData->clientGUID; + row.Serialize(true,&bsOut,0); + + unsigned int i; + for (i=0; i < remoteServers.Size(); i++) + { + if (remoteServers[i]->gotSubscribedAndUploadedKeys==false || remoteServers[i]->subscribedKeys.HasData(key)) + { + SendUnified(&bsOut, HIGH_PRIORITY, RELIABLE_ORDERED, 0, remoteServers[i]->serverAddress, false); + } + } +} +void CloudServer::AddServer(RakNetGUID systemIdentifier) +{ + ConnectionState cs = rakPeerInterface->GetConnectionState(systemIdentifier); + if (cs==IS_DISCONNECTED || cs==IS_NOT_CONNECTED) + return; + bool objectExists; + unsigned int index = remoteServers.GetIndexFromKey(systemIdentifier,&objectExists); + if (objectExists==false) + { + RemoteServer *remoteServer = RakNet::OP_NEW(_FILE_AND_LINE_); + remoteServer->gotSubscribedAndUploadedKeys=false; + remoteServer->serverAddress=systemIdentifier; + remoteServers.InsertAtIndex(remoteServer, index, _FILE_AND_LINE_); + + SendUploadedAndSubscribedKeysToServer(systemIdentifier); + } +} +void CloudServer::RemoveServer(RakNetGUID systemAddress) +{ + bool objectExists; + unsigned int index = remoteServers.GetIndexFromKey(systemAddress,&objectExists); + if (objectExists==true) + { + RakNet::OP_DELETE(remoteServers[index],_FILE_AND_LINE_); + remoteServers.RemoveAtIndex(index); + } +} +void CloudServer::GetRemoteServers(DataStructures::List &remoteServersOut) +{ + remoteServersOut.Clear(true, _FILE_AND_LINE_); + + unsigned int i; + for (i=0; i < remoteServers.Size(); i++) + { + remoteServersOut.Push(remoteServers[i]->serverAddress, _FILE_AND_LINE_); + } +} +void CloudServer::ProcessAndTransmitGetRequest(GetRequest *getRequest) +{ + RakNet::BitStream bsOut; + bsOut.Write((MessageID) ID_CLOUD_GET_RESPONSE); + + // BufferedGetResponseFromServer getResponse; + CloudQueryResult cloudQueryResult; + cloudQueryResult.cloudQuery=getRequest->cloudQueryWithAddresses.cloudQuery; + cloudQueryResult.subscribeToResults=getRequest->cloudQueryWithAddresses.cloudQuery.subscribeToResults; + cloudQueryResult.SerializeHeader(true, &bsOut); + + DataStructures::List cloudDataResultList; + DataStructures::List cloudKeyResultList; + ProcessCloudQueryWithAddresses(getRequest->cloudQueryWithAddresses, cloudDataResultList, cloudKeyResultList); + bool unlimitedRows=getRequest->cloudQueryWithAddresses.cloudQuery.maxRowsToReturn==0; + + uint32_t localNumRows = (uint32_t) cloudDataResultList.Size(); + if (unlimitedRows==false && + localNumRows > getRequest->cloudQueryWithAddresses.cloudQuery.startingRowIndex && + localNumRows - getRequest->cloudQueryWithAddresses.cloudQuery.startingRowIndex > getRequest->cloudQueryWithAddresses.cloudQuery.maxRowsToReturn ) + localNumRows=getRequest->cloudQueryWithAddresses.cloudQuery.startingRowIndex + getRequest->cloudQueryWithAddresses.cloudQuery.maxRowsToReturn; + + BitSize_t bitStreamOffset = bsOut.GetWriteOffset(); + uint32_t localRowsToWrite; + unsigned int skipRows; + if (localNumRows>getRequest->cloudQueryWithAddresses.cloudQuery.startingRowIndex) + { + localRowsToWrite=localNumRows-getRequest->cloudQueryWithAddresses.cloudQuery.startingRowIndex; + skipRows=0; + } + else + { + localRowsToWrite=0; + skipRows=getRequest->cloudQueryWithAddresses.cloudQuery.startingRowIndex-localNumRows; + } + cloudQueryResult.SerializeNumRows(true, localRowsToWrite, &bsOut); + for (unsigned int i=getRequest->cloudQueryWithAddresses.cloudQuery.startingRowIndex; i < localNumRows; i++) + { + WriteCloudQueryRowFromResultList(i, cloudDataResultList, cloudKeyResultList, &bsOut); + } + + // Append remote systems for remaining rows + if (unlimitedRows==true || getRequest->cloudQueryWithAddresses.cloudQuery.maxRowsToReturn>localRowsToWrite) + { + uint32_t remainingRows=0; + uint32_t additionalRowsWritten=0; + if (unlimitedRows==false) + remainingRows=getRequest->cloudQueryWithAddresses.cloudQuery.maxRowsToReturn-localRowsToWrite; + + unsigned int remoteServerResponseIndex; + for (remoteServerResponseIndex=0; remoteServerResponseIndex < getRequest->remoteServerResponses.Size(); remoteServerResponseIndex++) + { + BufferedGetResponseFromServer *bufferedGetResponseFromServer = getRequest->remoteServerResponses[remoteServerResponseIndex]; + unsigned int cloudQueryRowIndex; + for (cloudQueryRowIndex=0; cloudQueryRowIndex < bufferedGetResponseFromServer->queryResult.rowsReturned.Size(); cloudQueryRowIndex++) + { + if (skipRows>0) + { + --skipRows; + continue; + } + bufferedGetResponseFromServer->queryResult.rowsReturned[cloudQueryRowIndex]->Serialize(true, &bsOut, this); + + ++additionalRowsWritten; + if (unlimitedRows==false && --remainingRows==0) + break; + } + + if (unlimitedRows==false && remainingRows==0) + break; + } + + if (additionalRowsWritten>0) + { + BitSize_t curOffset = bsOut.GetWriteOffset(); + bsOut.SetWriteOffset(bitStreamOffset); + localRowsToWrite+=additionalRowsWritten; + cloudQueryResult.SerializeNumRows(true, localRowsToWrite, &bsOut); + bsOut.SetWriteOffset(curOffset); + } + } + + SendUnified(&bsOut, HIGH_PRIORITY, RELIABLE_ORDERED, 0, getRequest->requestingClient, false); +} +void CloudServer::ProcessCloudQueryWithAddresses( CloudServer::CloudQueryWithAddresses &cloudQueryWithAddresses, DataStructures::List &cloudDataResultList, DataStructures::List &cloudKeyResultList ) +{ + CloudQueryResult cloudQueryResult; + CloudQueryRow cloudQueryRow; + unsigned int queryIndex; + bool dataRepositoryExists; + CloudDataList* cloudDataList; + unsigned int keyDataIndex; + + // If specificSystems list empty, applies to all systems + // For each of keys in cloudQueryWithAddresses, return that data, limited by maxRowsToReturn + for (queryIndex=0; queryIndex < cloudQueryWithAddresses.cloudQuery.keys.Size(); queryIndex++) + { + const CloudKey &key = cloudQueryWithAddresses.cloudQuery.keys[queryIndex]; + + unsigned int dataRepositoryIndex = dataRepository.GetIndexFromKey(key, &dataRepositoryExists); + if (dataRepositoryExists) + { + cloudDataList=dataRepository[dataRepositoryIndex]; + + if (cloudDataList->uploaderCount>0) + { + // Return all keyData that was uploaded by specificSystems, or all if not specified + if (cloudQueryWithAddresses.specificSystems.Size()>0) + { + // Return data for matching systems + unsigned int specificSystemIndex; + for (specificSystemIndex=0; specificSystemIndex < cloudQueryWithAddresses.specificSystems.Size(); specificSystemIndex++) + { + bool uploaderExists; + keyDataIndex = cloudDataList->keyData.GetIndexFromKey(cloudQueryWithAddresses.specificSystems[specificSystemIndex], &uploaderExists); + if (uploaderExists) + { + cloudDataResultList.Push(cloudDataList->keyData[keyDataIndex], _FILE_AND_LINE_); + cloudKeyResultList.Push(key, _FILE_AND_LINE_); + } + } + } + else + { + // Return data for all systems + for (keyDataIndex=0; keyDataIndex < cloudDataList->keyData.Size(); keyDataIndex++) + { + cloudDataResultList.Push(cloudDataList->keyData[keyDataIndex], _FILE_AND_LINE_); + cloudKeyResultList.Push(key, _FILE_AND_LINE_); + } + } + } + } + } +} +void CloudServer::SendUploadedAndSubscribedKeysToServer( RakNetGUID systemAddress ) +{ + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_CLOUD_SERVER_TO_SERVER_COMMAND); + bsOut.Write((MessageID)STSC_ADD_UPLOADED_AND_SUBSCRIBED_KEYS); + bsOut.WriteCasted(dataRepository.Size()); + for (unsigned int i=0; i < dataRepository.Size(); i++) + dataRepository[i]->key.Serialize(true, &bsOut); + + BitSize_t startOffset, endOffset; + uint16_t subscribedKeyCount=0; + startOffset=bsOut.GetWriteOffset(); + bsOut.WriteCasted(subscribedKeyCount); + for (unsigned int i=0; i < dataRepository.Size(); i++) + { + if (dataRepository[i]->subscriberCount>0) + { + dataRepository[i]->key.Serialize(true, &bsOut); + subscribedKeyCount++; + } + } + endOffset=bsOut.GetWriteOffset(); + bsOut.SetWriteOffset(startOffset); + bsOut.WriteCasted(subscribedKeyCount); + bsOut.SetWriteOffset(endOffset); + + if (dataRepository.Size()>0 || subscribedKeyCount>0) + SendUnified(&bsOut, HIGH_PRIORITY, RELIABLE_ORDERED, 0, systemAddress, false); +} +void CloudServer::SendUploadedKeyToServers( CloudKey &cloudKey ) +{ + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_CLOUD_SERVER_TO_SERVER_COMMAND); + bsOut.Write((MessageID)STSC_ADD_UPLOADED_KEY); + cloudKey.Serialize(true, &bsOut); + for (unsigned int i=0; i < remoteServers.Size(); i++) + SendUnified(&bsOut, HIGH_PRIORITY, RELIABLE_ORDERED, 0, remoteServers[i]->serverAddress, false); +} +void CloudServer::SendSubscribedKeyToServers( CloudKey &cloudKey ) +{ + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_CLOUD_SERVER_TO_SERVER_COMMAND); + bsOut.Write((MessageID)STSC_ADD_SUBSCRIBED_KEY); + cloudKey.Serialize(true, &bsOut); + for (unsigned int i=0; i < remoteServers.Size(); i++) + SendUnified(&bsOut, HIGH_PRIORITY, RELIABLE_ORDERED, 0, remoteServers[i]->serverAddress, false); +} +void CloudServer::RemoveUploadedKeyFromServers( CloudKey &cloudKey ) +{ + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_CLOUD_SERVER_TO_SERVER_COMMAND); + bsOut.Write((MessageID)STSC_REMOVE_UPLOADED_KEY); + cloudKey.Serialize(true, &bsOut); + for (unsigned int i=0; i < remoteServers.Size(); i++) + SendUnified(&bsOut, HIGH_PRIORITY, RELIABLE_ORDERED, 0, remoteServers[i]->serverAddress, false); +} +void CloudServer::RemoveSubscribedKeyFromServers( CloudKey &cloudKey ) +{ + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_CLOUD_SERVER_TO_SERVER_COMMAND); + bsOut.Write((MessageID)STSC_REMOVE_SUBSCRIBED_KEY); + cloudKey.Serialize(true, &bsOut); + for (unsigned int i=0; i < remoteServers.Size(); i++) + SendUnified(&bsOut, HIGH_PRIORITY, RELIABLE_ORDERED, 0, remoteServers[i]->serverAddress, false); +} +void CloudServer::OnSendUploadedAndSubscribedKeysToServer( Packet *packet ) +{ + RakNet::BitStream bsIn(packet->data, packet->length, false); + bsIn.IgnoreBytes(sizeof(MessageID)*2); + + bool objectExists; + unsigned int index = remoteServers.GetIndexFromKey(packet->guid,&objectExists); + if (objectExists==false) + return; + RemoteServer *remoteServer = remoteServers[index]; + remoteServer->gotSubscribedAndUploadedKeys=true; + +// unsigned int insertionIndex; + bool alreadyHasKey; + uint16_t numUploadedKeys, numSubscribedKeys; + bsIn.Read(numUploadedKeys); + for (uint16_t i=0; i < numUploadedKeys; i++) + { + CloudKey cloudKey; + cloudKey.Serialize(false, &bsIn); + + // insertionIndex = + remoteServer->uploadedKeys.GetIndexFromKey(cloudKey, &alreadyHasKey); + if (alreadyHasKey==false) + remoteServer->uploadedKeys.Insert(cloudKey,cloudKey,true,_FILE_AND_LINE_); + } + + bsIn.Read(numSubscribedKeys); + for (uint16_t i=0; i < numSubscribedKeys; i++) + { + CloudKey cloudKey; + cloudKey.Serialize(false, &bsIn); + + //insertionIndex = + remoteServer->subscribedKeys.GetIndexFromKey(cloudKey, &alreadyHasKey); + if (alreadyHasKey==false) + remoteServer->subscribedKeys.Insert(cloudKey,cloudKey,true,_FILE_AND_LINE_); + } + + // Potential todo - join servers + // For each uploaded key that we subscribe to, query it + // For each subscribed key that we have, send it +} +void CloudServer::OnSendUploadedKeyToServers( Packet *packet ) +{ + RakNet::BitStream bsIn(packet->data, packet->length, false); + bsIn.IgnoreBytes(sizeof(MessageID)*2); + + bool objectExists; + unsigned int index = remoteServers.GetIndexFromKey(packet->guid,&objectExists); + if (objectExists==false) + return; + RemoteServer *remoteServer = remoteServers[index]; + CloudKey cloudKey; + cloudKey.Serialize(false, &bsIn); +// unsigned int insertionIndex; + bool alreadyHasKey; +// insertionIndex = + remoteServer->uploadedKeys.GetIndexFromKey(cloudKey, &alreadyHasKey); + if (alreadyHasKey==false) + remoteServer->uploadedKeys.Insert(cloudKey,cloudKey,true,_FILE_AND_LINE_); +} +void CloudServer::OnSendSubscribedKeyToServers( Packet *packet ) +{ + RakNet::BitStream bsIn(packet->data, packet->length, false); + bsIn.IgnoreBytes(sizeof(MessageID)*2); + + bool objectExists; + unsigned int index = remoteServers.GetIndexFromKey(packet->guid,&objectExists); + if (objectExists==false) + return; + RemoteServer *remoteServer = remoteServers[index]; + CloudKey cloudKey; + cloudKey.Serialize(false, &bsIn); +// unsigned int insertionIndex; + bool alreadyHasKey; +// insertionIndex = + remoteServer->subscribedKeys.GetIndexFromKey(cloudKey, &alreadyHasKey); + + // Do not need to send current values, the Get request will do that as the Get request is sent at the same time + if (alreadyHasKey==false) + remoteServer->subscribedKeys.Insert(cloudKey,cloudKey,true,_FILE_AND_LINE_); +} +void CloudServer::OnRemoveUploadedKeyFromServers( Packet *packet ) +{ + RakNet::BitStream bsIn(packet->data, packet->length, false); + bsIn.IgnoreBytes(sizeof(MessageID)*2); + + bool objectExists; + unsigned int index = remoteServers.GetIndexFromKey(packet->guid,&objectExists); + if (objectExists==false) + return; + RemoteServer *remoteServer = remoteServers[index]; + CloudKey cloudKey; + cloudKey.Serialize(false, &bsIn); + unsigned int insertionIndex; + bool alreadyHasKey; + insertionIndex = remoteServer->uploadedKeys.GetIndexFromKey(cloudKey, &alreadyHasKey); + if (alreadyHasKey==true) + remoteServer->uploadedKeys.RemoveAtIndex(insertionIndex); +} +void CloudServer::OnRemoveSubscribedKeyFromServers( Packet *packet ) +{ + RakNet::BitStream bsIn(packet->data, packet->length, false); + bsIn.IgnoreBytes(sizeof(MessageID)*2); + + bool objectExists; + unsigned int index = remoteServers.GetIndexFromKey(packet->guid,&objectExists); + if (objectExists==false) + return; + RemoteServer *remoteServer = remoteServers[index]; + CloudKey cloudKey; + cloudKey.Serialize(false, &bsIn); + unsigned int insertionIndex; + bool alreadyHasKey; + insertionIndex = remoteServer->subscribedKeys.GetIndexFromKey(cloudKey, &alreadyHasKey); + if (alreadyHasKey==true) + remoteServer->subscribedKeys.RemoveAtIndex(insertionIndex); +} +void CloudServer::OnServerDataChanged( Packet *packet ) +{ + RakNet::BitStream bsIn(packet->data, packet->length, false); + bsIn.IgnoreBytes(sizeof(MessageID)*2); + + bool objectExists; + remoteServers.GetIndexFromKey(packet->guid,&objectExists); + if (objectExists==false) + return; + + // Find everyone that cares about this change and relay + bool wasUpdated=false; + bsIn.Read(wasUpdated); + CloudQueryRow row; + row.Serialize(false, &bsIn, this); + + CloudDataList *cloudDataList; + bool dataRepositoryExists; + unsigned int dataRepositoryIndex; + dataRepositoryIndex = dataRepository.GetIndexFromKey(row.key, &dataRepositoryExists); + if (dataRepositoryExists==false) + { + DeallocateRowData(row.data); + return; + } + cloudDataList = dataRepository[dataRepositoryIndex]; + CloudData *cloudData; + bool keyDataListExists; + unsigned int keyDataListIndex = cloudDataList->keyData.GetIndexFromKey(row.clientGUID, &keyDataListExists); + if (keyDataListExists==true) + { + cloudData = cloudDataList->keyData[keyDataListIndex]; + NotifyClientSubscribersOfDataChange(&row, cloudData->specificSubscribers, wasUpdated ); + } + + NotifyClientSubscribersOfDataChange(&row, cloudDataList->nonSpecificSubscribers, wasUpdated ); + DeallocateRowData(row.data); +} +void CloudServer::GetServersWithUploadedKeys( + DataStructures::List &keys, + DataStructures::List &remoteServersWithData + ) +{ + remoteServersWithData.Clear(true, _FILE_AND_LINE_); + + unsigned int i,j; + for (i=0; i < remoteServers.Size(); i++) + { + remoteServers[i]->workingFlag=false; + } + + for (i=0; i < remoteServers.Size(); i++) + { + if (remoteServers[i]->workingFlag==false) + { + if (remoteServers[i]->gotSubscribedAndUploadedKeys==false) + { + remoteServers[i]->workingFlag=true; + remoteServersWithData.Push(remoteServers[i], _FILE_AND_LINE_); + } + else + { + remoteServers[i]->workingFlag=false; + for (j=0; j < keys.Size(); j++) + { + if (remoteServers[i]->workingFlag==false && remoteServers[i]->uploadedKeys.HasData(keys[j])) + { + remoteServers[i]->workingFlag=true; + remoteServersWithData.Push(remoteServers[i], _FILE_AND_LINE_); + break; + } + } + } + } + } +} + +CloudServer::CloudDataList *CloudServer::GetOrAllocateCloudDataList(CloudKey key, bool *dataRepositoryExists, unsigned int &dataRepositoryIndex) +{ + CloudDataList *cloudDataList; + + dataRepositoryIndex = dataRepository.GetIndexFromKey(key, dataRepositoryExists); + if (*dataRepositoryExists==false) + { + cloudDataList = RakNet::OP_NEW(_FILE_AND_LINE_); + cloudDataList->key=key; + cloudDataList->uploaderCount=0; + cloudDataList->subscriberCount=0; + dataRepository.InsertAtIndex(cloudDataList,dataRepositoryIndex,_FILE_AND_LINE_); + } + else + { + cloudDataList = dataRepository[dataRepositoryIndex]; + } + + return cloudDataList; +} + +void CloudServer::UnsubscribeFromKey(RemoteCloudClient *remoteCloudClient, RakNetGUID remoteCloudClientGuid, unsigned int keySubscriberIndex, CloudKey &cloudKey, DataStructures::List &specificSystems) +{ + KeySubscriberID* keySubscriberId = remoteCloudClient->subscribedKeys[keySubscriberIndex]; + + // If removing specific systems, but global subscription, fail + if (keySubscriberId->specificSystemsSubscribedTo.Size()==0 && specificSystems.Size()>0) + return; + + bool dataRepositoryExists; + CloudDataList *cloudDataList; + unsigned int dataRepositoryIndex = dataRepository.GetIndexFromKey(cloudKey, &dataRepositoryExists); + if (dataRepositoryExists==false) + return; + + unsigned int i,j; + + cloudDataList = dataRepository[dataRepositoryIndex]; + if (specificSystems.Size()==0) + { + // Remove global subscriber. If returns false, have to remove specific subscribers + if (cloudDataList->RemoveSubscriber(remoteCloudClientGuid)==false) + { + for (i=0; i < keySubscriberId->specificSystemsSubscribedTo.Size(); i++) + { + RemoveSpecificSubscriber(keySubscriberId->specificSystemsSubscribedTo[i], cloudDataList, remoteCloudClientGuid); + } + } + keySubscriberId->specificSystemsSubscribedTo.Clear(true, _FILE_AND_LINE_); + } + else + { + for (j=0; j < specificSystems.Size(); j++) + { + unsigned int specificSystemsSubscribedToIndex; + bool hasSpecificSystemsSubscribedTo; + specificSystemsSubscribedToIndex=keySubscriberId->specificSystemsSubscribedTo.GetIndexFromKey(specificSystems[j], &hasSpecificSystemsSubscribedTo); + if (hasSpecificSystemsSubscribedTo) + { + RemoveSpecificSubscriber(specificSystems[j], cloudDataList, remoteCloudClientGuid); + keySubscriberId->specificSystemsSubscribedTo.RemoveAtIndex(specificSystemsSubscribedToIndex); + } + } + } + + if (keySubscriberId->specificSystemsSubscribedTo.Size()==0) + { + RakNet::OP_DELETE(keySubscriberId, _FILE_AND_LINE_); + remoteCloudClient->subscribedKeys.RemoveAtIndex(keySubscriberIndex); + } + + if (cloudDataList->subscriberCount==0) + RemoveSubscribedKeyFromServers(cloudKey); + + if (cloudDataList->IsUnused()) + { + RakNet::OP_DELETE(cloudDataList, _FILE_AND_LINE_); + dataRepository.RemoveAtIndex(dataRepositoryIndex); + } +} +void CloudServer::RemoveSpecificSubscriber(RakNetGUID specificSubscriber, CloudDataList *cloudDataList, RakNetGUID remoteCloudClientGuid) +{ + bool keyDataListExists; + unsigned int keyDataListIndex = cloudDataList->keyData.GetIndexFromKey(specificSubscriber, &keyDataListExists); + if (keyDataListExists==false) + return; + CloudData *cloudData = cloudDataList->keyData[keyDataListIndex]; + bool hasSpecificSubscriber; + unsigned int specificSubscriberIndex = cloudData->specificSubscribers.GetIndexFromKey(remoteCloudClientGuid, &hasSpecificSubscriber); + if (hasSpecificSubscriber) + { + cloudData->specificSubscribers.RemoveAtIndex(specificSubscriberIndex); + cloudDataList->subscriberCount--; + + if (cloudData->IsUnused()) + { + RakNet::OP_DELETE(cloudData, _FILE_AND_LINE_); + cloudDataList->keyData.RemoveAtIndex(keyDataListIndex); + } + } +} + +void CloudServer::ForceExternalSystemAddress(SystemAddress forcedAddress) +{ + forceAddress=forcedAddress; +} +void CloudServer::AddQueryFilter(CloudServerQueryFilter* filter) +{ + if (queryFilters.GetIndexOf(filter)!=(unsigned int) -1) + return; + queryFilters.Push(filter, _FILE_AND_LINE_); +} +void CloudServer::RemoveQueryFilter(CloudServerQueryFilter* filter) +{ + unsigned int index; + index = queryFilters.GetIndexOf(filter); + if (index != (unsigned int) -1) + queryFilters.RemoveAtIndex(index); +} +void CloudServer::RemoveAllQueryFilters(void) +{ + queryFilters.Clear(true, _FILE_AND_LINE_); +} + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CloudServer.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CloudServer.h new file mode 100644 index 0000000..391a46e --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CloudServer.h @@ -0,0 +1,375 @@ +/// \file CloudServer.h +/// \brief Stores client data, and allows cross-server communication to retrieve this data +/// \details TODO +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_CloudServer==1 + +#ifndef __CLOUD_SERVER_H +#define __CLOUD_SERVER_H + +#include "PluginInterface2.h" +#include "RakMemoryOverride.h" +#include "NativeTypes.h" +#include "RakString.h" +#include "DS_Hash.h" +#include "CloudCommon.h" +#include "DS_OrderedList.h" + +/// If the data is smaller than this value, an allocation is avoid. However, this value exists for every row +#define CLOUD_SERVER_DATA_STACK_SIZE 32 + +namespace RakNet +{ +/// Forward declarations +class RakPeerInterface; + +/// \brief Zero or more instances of CloudServerQueryFilter can be attached to CloudServer to restrict client queries +/// All attached instances of CloudServerQueryFilter on each corresponding operation, from all directly connected clients +/// If any attached instance returns false for a given operation, that operation is silently rejected +/// \ingroup CLOUD_GROUP +class RAK_DLL_EXPORT CloudServerQueryFilter +{ +public: + CloudServerQueryFilter() {} + virtual ~CloudServerQueryFilter() {} + + /// Called when a local client wants to post data + /// \return true to allow, false to reject + virtual bool OnPostRequest(RakNetGUID clientGuid, SystemAddress clientAddress, CloudKey key, uint32_t dataLength, const char *data)=0; + + /// Called when a local client wants to release data that it has previously uploaded + /// \return true to allow, false to reject + virtual bool OnReleaseRequest(RakNetGUID clientGuid, SystemAddress clientAddress, DataStructures::List &cloudKeys)=0; + + /// Called when a local client wants to query data + /// If you return false, the client will get no response at all + /// \return true to allow, false to reject + virtual bool OnGetRequest(RakNetGUID clientGuid, SystemAddress clientAddress, CloudQuery &query, DataStructures::List &specificSystems)=0; + + /// Called when a local client wants to stop getting updates for data + /// If you return false, the client will keep getting updates for that data + /// \return true to allow, false to reject + virtual bool OnUnsubscribeRequest(RakNetGUID clientGuid, SystemAddress clientAddress, DataStructures::List &cloudKeys, DataStructures::List &specificSystems)=0; +}; + +/// \brief Stores client data, and allows cross-server communication to retrieve this data +/// \ingroup CLOUD_GROUP +class RAK_DLL_EXPORT CloudServer : public PluginInterface2, CloudAllocator +{ +public: + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(CloudServer) + + CloudServer(); + virtual ~CloudServer(); + + /// \brief Max bytes a client can upload + /// Data in excess of this value is silently ignored + /// defaults to 0 (unlimited) + /// \param[in] bytes Max bytes a client can upload. 0 means unlimited. + void SetMaxUploadBytesPerClient(uint64_t bytes); + + /// \brief Max bytes returned by a download. If the number of bytes would exceed this amount, the returned list is truncated + /// However, if this would result in no rows downloaded, then one row will be returned. + /// \param[in] bytes Max bytes a client can download from a single Get(). 0 means unlimited. + void SetMaxBytesPerDownload(uint64_t bytes); + + /// \brief Add a server, which is assumed to be connected in a fully connected mesh to all other servers and also running the CloudServer plugin + /// The other system must also call AddServer before getting the subscription data, or it will be rejected. + /// Sending a message telling the other system to call AddServer(), followed by calling AddServer() locally, would be sufficient for this to work. + /// \note This sends subscription data to the other system, using RELIABLE_ORDERED on channel 0 + /// \param[in] systemIdentifier Identifier of the remote system + void AddServer(RakNetGUID systemIdentifier); + + /// \brief Removes a server added through AddServer() + /// \param[in] systemIdentifier Identifier of the remote system + void RemoveServer(RakNetGUID systemIdentifier); + + /// Return list of servers added with AddServer() + /// \param[out] remoteServers List of servers added + void GetRemoteServers(DataStructures::List &remoteServersOut); + + /// \brief Frees all memory. Does not remove query filters + void Clear(void); + + /// \brief Report the specified SystemAddress to client queries, rather than what RakPeer reads. + /// This is useful if you already know your public IP + /// This only applies to future updates, so call it before updating to apply to all queries + /// \param[in] forcedAddress The systmeAddress to return in queries. Use UNASSIGNED_SYSTEM_ADDRESS (default) to use what RakPeer returns + void ForceExternalSystemAddress(SystemAddress forcedAddress); + + /// \brief Adds a callback called on each query. If all filters returns true for an operation, the operation is allowed. + /// If the filter was already added, the function silently fails + /// \param[in] filter An externally allocated instance of CloudServerQueryFilter. The instance must remain valid until it is removed with RemoveQueryFilter() or RemoveAllQueryFilters() + void AddQueryFilter(CloudServerQueryFilter* filter); + + /// \brief Removes a callback added with AddQueryFilter() + /// The instance is not deleted, only unreferenced. It is up to the user to delete the instance, if necessary + /// \param[in] filter An externally allocated instance of CloudServerQueryFilter. The instance must remain valid until it is removed with RemoveQueryFilter() or RemoveAllQueryFilters() + void RemoveQueryFilter(CloudServerQueryFilter* filter); + + /// \brief Removes all instances of CloudServerQueryFilter added with AddQueryFilter(). + /// The instances are not deleted, only unreferenced. It is up to the user to delete the instances, if necessary + void RemoveAllQueryFilters(void); + +protected: + virtual void Update(void); + virtual PluginReceiveResult OnReceive(Packet *packet); + virtual void OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ); + virtual void OnRakPeerShutdown(void); + + + virtual void OnPostRequest(Packet *packet); + virtual void OnReleaseRequest(Packet *packet); + virtual void OnGetRequest(Packet *packet); + virtual void OnUnsubscribeRequest(Packet *packet); + virtual void OnServerToServerGetRequest(Packet *packet); + virtual void OnServerToServerGetResponse(Packet *packet); + + uint64_t maxUploadBytesPerClient, maxBytesPerDowload; + + // ---------------------------------------------------------------------------- + // For a given data key, quickly look up one or all systems that have uploaded + // ---------------------------------------------------------------------------- + struct CloudData + { + CloudData() {} + ~CloudData() {if (allocatedData) rakFree_Ex(allocatedData, _FILE_AND_LINE_);} + bool IsUnused(void) const {return isUploaded==false && specificSubscribers.Size()==0;} + void Clear(void) {if (dataPtr==allocatedData) rakFree_Ex(allocatedData, _FILE_AND_LINE_); allocatedData=0; dataPtr=0; dataLengthBytes=0; isUploaded=false;} + + unsigned char stackData[CLOUD_SERVER_DATA_STACK_SIZE]; + unsigned char *allocatedData; // Uses allocatedData instead of stackData if length of data exceeds CLOUD_SERVER_DATA_STACK_SIZE + unsigned char *dataPtr; // Points to either stackData or allocatedData + uint32_t dataLengthBytes; + bool isUploaded; + + /// System address of server that is holding this data, and the client is connected to + SystemAddress serverSystemAddress; + + /// System address of client that uploaded this data + SystemAddress clientSystemAddress; + + /// RakNetGUID of server that is holding this data, and the client is connected to + RakNetGUID serverGUID; + + /// RakNetGUID of client that uploaded this data + RakNetGUID clientGUID; + + /// When the key data changes from this particular system, notify these subscribers + /// This list mutually exclusive with CloudDataList::nonSpecificSubscribers + DataStructures::OrderedList specificSubscribers; + }; + void WriteCloudQueryRowFromResultList(unsigned int i, DataStructures::List &cloudDataResultList, DataStructures::List &cloudKeyResultList, BitStream *bsOut); + void WriteCloudQueryRowFromResultList(DataStructures::List &cloudDataResultList, DataStructures::List &cloudKeyResultList, BitStream *bsOut); + + static int KeyDataPtrComp( const RakNetGUID &key, CloudData* const &data ); + struct CloudDataList + { + bool IsUnused(void) const {return keyData.Size()==0 && nonSpecificSubscribers.Size()==0;} + bool IsNotUploaded(void) const {return uploaderCount==0;} + bool RemoveSubscriber(RakNetGUID g) { + bool objectExists; + unsigned int index; + index = nonSpecificSubscribers.GetIndexFromKey(g, &objectExists); + if (objectExists) + { + subscriberCount--; + nonSpecificSubscribers.RemoveAtIndex(index); + return true; + } + return false; + } + + unsigned int uploaderCount, subscriberCount; + CloudKey key; + + // Data uploaded from or subscribed to for various systems + DataStructures::OrderedList keyData; + + /// When the key data changes from any system, notify these subscribers + /// This list mutually exclusive with CloudData::specificSubscribers + DataStructures::OrderedList nonSpecificSubscribers; + }; + + static int KeyDataListComp( const CloudKey &key, CloudDataList * const &data ); + DataStructures::OrderedList dataRepository; + + struct KeySubscriberID + { + CloudKey key; + DataStructures::OrderedList specificSystemsSubscribedTo; + }; + static int KeySubscriberIDComp(const CloudKey &key, KeySubscriberID * const &data ); + + // Remote systems + struct RemoteCloudClient + { + bool IsUnused(void) const {return uploadedKeys.Size()==0 && subscribedKeys.Size()==0;} + + DataStructures::OrderedList uploadedKeys; + DataStructures::OrderedList subscribedKeys; + uint64_t uploadedBytes; + }; + DataStructures::Hash remoteSystems; + + // For a given user, release all subscribed and uploaded keys + void ReleaseSystem(RakNetGUID clientAddress ); + + // For a given user, release a set of keys + void ReleaseKeys(RakNetGUID clientAddress, DataStructures::List &keys ); + + void NotifyClientSubscribersOfDataChange( CloudData *cloudData, CloudKey &key, DataStructures::OrderedList &subscribers, bool wasUpdated ); + void NotifyClientSubscribersOfDataChange( CloudQueryRow *row, DataStructures::OrderedList &subscribers, bool wasUpdated ); + void NotifyServerSubscribersOfDataChange( CloudData *cloudData, CloudKey &key, bool wasUpdated ); + + struct RemoteServer + { + RakNetGUID serverAddress; + // This server needs to know about these keys when they are updated or deleted + DataStructures::OrderedList subscribedKeys; + // This server has uploaded these keys, and needs to know about Get() requests + DataStructures::OrderedList uploadedKeys; + + // Just for processing + bool workingFlag; + + // If false, we don't know what keys they have yet, so send everything + bool gotSubscribedAndUploadedKeys; + }; + + static int RemoteServerComp(const RakNetGUID &key, RemoteServer* const &data ); + DataStructures::OrderedList remoteServers; + + struct BufferedGetResponseFromServer + { + void Clear(CloudAllocator *allocator); + + RakNetGUID serverAddress; + CloudQueryResult queryResult; + bool gotResult; + }; + + struct CloudQueryWithAddresses + { + // Inputs + CloudQuery cloudQuery; + DataStructures::List specificSystems; + + void Serialize(bool writeToBitstream, BitStream *bitStream); + }; + + static int BufferedGetResponseFromServerComp(const RakNetGUID &key, BufferedGetResponseFromServer* const &data ); + struct GetRequest + { + void Clear(CloudAllocator *allocator); + bool AllRemoteServersHaveResponded(void) const; + CloudQueryWithAddresses cloudQueryWithAddresses; + + // When request started. If takes too long for a response from another system, can abort remaining systems + RakNet::Time requestStartTime; + + // Assigned by server that gets the request to identify response. See nextGetRequestId + uint32_t requestId; + + RakNetGUID requestingClient; + + DataStructures::OrderedList remoteServerResponses; + }; + static int GetRequestComp(const uint32_t &key, GetRequest* const &data ); + DataStructures::OrderedList getRequests; + RakNet::Time nextGetRequestsCheck; + + uint32_t nextGetRequestId; + + void ProcessAndTransmitGetRequest(GetRequest *getRequest); + + void ProcessCloudQueryWithAddresses( + CloudServer::CloudQueryWithAddresses &cloudQueryWithAddresses, + DataStructures::List &cloudDataResultList, + DataStructures::List &cloudKeyResultList + ); + + void SendUploadedAndSubscribedKeysToServer( RakNetGUID systemAddress ); + void SendUploadedKeyToServers( CloudKey &cloudKey ); + void SendSubscribedKeyToServers( CloudKey &cloudKey ); + void RemoveUploadedKeyFromServers( CloudKey &cloudKey ); + void RemoveSubscribedKeyFromServers( CloudKey &cloudKey ); + + void OnSendUploadedAndSubscribedKeysToServer( Packet *packet ); + void OnSendUploadedKeyToServers( Packet *packet ); + void OnSendSubscribedKeyToServers( Packet *packet ); + void OnRemoveUploadedKeyFromServers( Packet *packet ); + void OnRemoveSubscribedKeyFromServers( Packet *packet ); + void OnServerDataChanged( Packet *packet ); + + void GetServersWithUploadedKeys( + DataStructures::List &keys, + DataStructures::List &remoteServersWithData + ); + + CloudServer::CloudDataList *GetOrAllocateCloudDataList(CloudKey key, bool *dataRepositoryExists, unsigned int &dataRepositoryIndex); + + void UnsubscribeFromKey(RemoteCloudClient *remoteCloudClient, RakNetGUID remoteCloudClientGuid, unsigned int keySubscriberIndex, CloudKey &cloudKey, DataStructures::List &specificSystems); + void RemoveSpecificSubscriber(RakNetGUID specificSubscriber, CloudDataList *cloudDataList, RakNetGUID remoteCloudClientGuid); + + DataStructures::List queryFilters; + + SystemAddress forceAddress; +}; + + +} // namespace RakNet + +#endif + + +// Key subscription +// +// A given system can subscribe to one or more keys. +// The subscription can be further be defined as only subscribing to keys uploaded by or changed by a given system. +// It is possible to subscribe to keys not yet uploaded, or uploaded to another system +// +// Operations: +// +// 1. SubscribeToKey() - Get() operation with subscription +// A. Add to key subscription list for the client, which contains a keyId / specificUploaderList pair +// B. Send to remote servers that for this key, they should send us updates +// C. (Done, get operation returns current values) +// +// 2. UpdateData() - Post() operation +// A. Find all subscribers to this data, for the uploading system. +// B. Send them the uploaded data +// C. Find all servers that subscribe to this data +// D. Send them the uploaded data +// +// 3. DeleteData() - Release() operation +// A. Find all subscribers to this data, for the deleting system. +// B. Inform them of the deletion +// C. Find all servers that subscribe to this data +// D. Inform them of the deletion +// +// 4. Unsubscribe() +// A. Find this subscriber, and remove their subscription +// B. If no one else is subscribing to this key for any system, notify remote servers we no longer need subscription updates +// +// Internal operations: +// +// 1. Find if any connected client has subscribed to a given key +// A. This is used add and remove our subscription for this key to remote servers +// +// 2. For a given key and updating address, find all connected clients that care +// A. First find connected clients that have subscribed to this key, regardless of address +// B. Then find connected clients that have subscribed to this key for this particular address +// +// 3. Find all remote servers that have subscribed to a given key +// A. This is so when the key is updated or deleted, we know who to send it to +// +// 4. For a given client (such as on disconnect), remove all records of their subscriptions + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CommandParserInterface.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CommandParserInterface.cpp new file mode 100644 index 0000000..d61b41c --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CommandParserInterface.cpp @@ -0,0 +1,161 @@ +#include "CommandParserInterface.h" +#include "TransportInterface.h" +#include +#include "RakAssert.h" +#include + + +#if defined(_WIN32) +// IP_DONTFRAGMENT is different between winsock 1 and winsock 2. Therefore, Winsock2.h must be linked againt Ws2_32.lib +// winsock.h must be linked against WSock32.lib. If these two are mixed up the flag won't work correctly +#include + +#else +#include +#include +#include +#endif + +#include "LinuxStrings.h" + +using namespace RakNet; + +#ifdef _MSC_VER +#pragma warning( push ) +#endif + +const unsigned char CommandParserInterface::VARIABLE_NUMBER_OF_PARAMETERS=255; + +int RakNet::RegisteredCommandComp( const char* const & key, const RegisteredCommand &data ) +{ + return _stricmp(key,data.command); +} + +CommandParserInterface::CommandParserInterface() {} +CommandParserInterface::~CommandParserInterface() {} + +void CommandParserInterface::ParseConsoleString(char *str, const char delineator, unsigned char delineatorToggle, unsigned *numParameters, char **parameterList, unsigned parameterListLength) +{ + unsigned strIndex, parameterListIndex; + unsigned strLen; + bool replaceDelineator=true; + + strLen = (unsigned) strlen(str); + + // Replace every instance of delineator, \n, \r with 0 + for (strIndex=0; strIndex < strLen; strIndex++) + { + if (str[strIndex]==delineator && replaceDelineator) + str[strIndex]=0; + + if (str[strIndex]=='\n' || str[strIndex]=='\r') + str[strIndex]=0; + + if (str[strIndex]==delineatorToggle) + { + str[strIndex]=0; + replaceDelineator=!replaceDelineator; + } + } + + // Fill up parameterList starting at each non-0 + for (strIndex=0, parameterListIndex=0; strIndex < strLen; ) + { + if (str[strIndex]!=0) + { + parameterList[parameterListIndex]=str+strIndex; + parameterListIndex++; + RakAssert(parameterListIndex < parameterListLength); + if (parameterListIndex >= parameterListLength) + break; + + strIndex++; + while (str[strIndex]!=0 && strIndex < strLen) + strIndex++; + } + else + strIndex++; + } + + parameterList[parameterListIndex]=0; + *numParameters=parameterListIndex; +} +void CommandParserInterface::SendCommandList(TransportInterface *transport, const SystemAddress &systemAddress) +{ + unsigned i; + if (commandList.Size()) + { + for (i=0; i < commandList.Size(); i++) + { + transport->Send(systemAddress, "%s", commandList[i].command); + if (i < commandList.Size()-1) + transport->Send(systemAddress, ", "); + } + transport->Send(systemAddress, "\r\n"); + } + else + transport->Send(systemAddress, "No registered commands\r\n"); +} +void CommandParserInterface::RegisterCommand(unsigned char parameterCount, const char *command, const char *commandHelp) +{ + RegisteredCommand rc; + rc.command=command; + rc.commandHelp=commandHelp; + rc.parameterCount=parameterCount; + commandList.Insert( command, rc, true, _FILE_AND_LINE_); +} +bool CommandParserInterface::GetRegisteredCommand(const char *command, RegisteredCommand *rc) +{ + bool objectExists; + unsigned index; + index=commandList.GetIndexFromKey(command, &objectExists); + if (objectExists) + *rc=commandList[index]; + return objectExists; +} +void CommandParserInterface::OnTransportChange(TransportInterface *transport) +{ + (void) transport; +} +void CommandParserInterface::OnNewIncomingConnection(const SystemAddress &systemAddress, TransportInterface *transport) +{ + (void) systemAddress; + (void) transport; +} +void CommandParserInterface::OnConnectionLost(const SystemAddress &systemAddress, TransportInterface *transport) +{ + (void) systemAddress; + (void) transport; +} +void CommandParserInterface::ReturnResult(bool res, const char *command,TransportInterface *transport, const SystemAddress &systemAddress) +{ + if (res) + transport->Send(systemAddress, "%s returned true.\r\n", command); + else + transport->Send(systemAddress, "%s returned false.\r\n", command); +} +void CommandParserInterface::ReturnResult(int res, const char *command,TransportInterface *transport, const SystemAddress &systemAddress) +{ + transport->Send(systemAddress, "%s returned %i.\r\n", command, res); +} +void CommandParserInterface::ReturnResult(const char *command, TransportInterface *transport, const SystemAddress &systemAddress) +{ + transport->Send(systemAddress, "Successfully called %s.\r\n", command); +} +void CommandParserInterface::ReturnResult(char *res, const char *command, TransportInterface *transport, const SystemAddress &systemAddress) +{ + transport->Send(systemAddress, "%s returned %s.\r\n", command, res); +} +void CommandParserInterface::ReturnResult(SystemAddress res, const char *command, TransportInterface *transport, const SystemAddress &systemAddress) +{ + char addr[128]; + systemAddress.ToString(false,addr); + char addr2[128]; + res.ToString(false,addr2); + transport->Send(systemAddress, "%s returned %s %s:%i\r\n", command,addr,addr2,res.GetPort()); +} + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CommandParserInterface.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CommandParserInterface.h new file mode 100644 index 0000000..f795d54 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/CommandParserInterface.h @@ -0,0 +1,140 @@ +/// \file CommandParserInterface.h +/// \brief Contains CommandParserInterface , from which you derive custom command parsers +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __COMMAND_PARSER_INTERFACE +#define __COMMAND_PARSER_INTERFACE + +#include "RakMemoryOverride.h" +#include "RakNetTypes.h" +#include "DS_OrderedList.h" +#include "Export.h" + +namespace RakNet +{ +/// Forward declarations +class TransportInterface; + +/// \internal +/// Contains the information related to one command registered with RegisterCommand() +/// Implemented so I can have an automatic help system via SendCommandList() +struct RAK_DLL_EXPORT RegisteredCommand +{ + const char *command; + const char *commandHelp; + unsigned char parameterCount; +}; + +/// List of commands registered with RegisterCommand() +int RAK_DLL_EXPORT RegisteredCommandComp( const char* const & key, const RegisteredCommand &data ); + +/// \brief The interface used by command parsers. +/// \details CommandParserInterface provides a set of functions and interfaces that plug into the ConsoleServer class. +/// Each CommandParserInterface works at the same time as other interfaces in the system. +class RAK_DLL_EXPORT CommandParserInterface +{ +public: + CommandParserInterface(); + virtual ~CommandParserInterface(); + + /// You are responsible for overriding this function and returning a static string, which will identifier your parser. + /// This should return a static string + /// \return The name that you return. + virtual const char *GetName(void) const=0; + + /// \brief A callback for when \a systemAddress has connected to us. + /// \param[in] systemAddress The player that has connected. + /// \param[in] transport The transport interface that sent us this information. Can be used to send messages to this or other players. + virtual void OnNewIncomingConnection(const SystemAddress &systemAddress, TransportInterface *transport); + + /// \brief A callback for when \a systemAddress has disconnected, either gracefully or forcefully + /// \param[in] systemAddress The player that has disconnected. + /// \param[in] transport The transport interface that sent us this information. + virtual void OnConnectionLost(const SystemAddress &systemAddress, TransportInterface *transport); + + /// \brief A callback for when you are expected to send a brief description of your parser to \a systemAddress + /// \param[in] transport The transport interface we can use to write to + /// \param[in] systemAddress The player that requested help. + virtual void SendHelp(TransportInterface *transport, const SystemAddress &systemAddress)=0; + + /// \brief Given \a command with parameters \a parameterList , do whatever processing you wish. + /// \param[in] command The command to process + /// \param[in] numParameters How many parameters were passed along with the command + /// \param[in] parameterList The list of parameters. parameterList[0] is the first parameter and so on. + /// \param[in] transport The transport interface we can use to write to + /// \param[in] systemAddress The player that sent this command. + /// \param[in] originalString The string that was actually sent over the network, in case you want to do your own parsing + virtual bool OnCommand(const char *command, unsigned numParameters, char **parameterList, TransportInterface *transport, const SystemAddress &systemAddress, const char *originalString)=0; + + /// \brief This is called every time transport interface is registered. + /// \details If you want to save a copy of the TransportInterface pointer + /// This is the place to do it + /// \param[in] transport The new TransportInterface + virtual void OnTransportChange(TransportInterface *transport); + + /// \internal + /// Scan commandList and return the associated array + /// \param[in] command The string to find + /// \param[out] rc Contains the result of this operation + /// \return True if we found the command, false otherwise + virtual bool GetRegisteredCommand(const char *command, RegisteredCommand *rc); + + /// \internal + /// Goes through str, replacing the delineating character with 0's. + /// \param[in] str The string sent by the transport interface + /// \param[in] delineator The character to scan for to use as a delineator + /// \param[in] delineatorToggle When encountered the delineator replacement is toggled on and off + /// \param[out] numParameters How many pointers were written to \a parameterList + /// \param[out] parameterList An array of pointers to characters. Will hold pointers to locations inside \a str + /// \param[in] parameterListLength How big the \a parameterList array is + static void ParseConsoleString(char *str, const char delineator, unsigned char delineatorToggle, unsigned *numParameters, char **parameterList, unsigned parameterListLength); + + /// \internal + /// Goes through the variable commandList and sends the command portion of each struct + /// \param[in] transport The transport interface we can use to write to + /// \param[in] systemAddress The player to write to + virtual void SendCommandList(TransportInterface *transport, const SystemAddress &systemAddress); + + static const unsigned char VARIABLE_NUMBER_OF_PARAMETERS; + + // Currently only takes static strings - doesn't make a copy of what you pass. + // parameterCount is the number of parameters that the sender has to include with the command. + // Pass 255 to parameterCount to indicate variable number of parameters + + /// Registers a command. + /// \param[in] parameterCount How many parameters your command requires. If you want to accept a variable number of commands, pass CommandParserInterface::VARIABLE_NUMBER_OF_PARAMETERS + /// \param[in] command A pointer to a STATIC string that has your command. I keep a copy of the pointer here so don't deallocate the string. + /// \param[in] commandHelp A pointer to a STATIC string that has the help information for your command. I keep a copy of the pointer here so don't deallocate the string. + virtual void RegisterCommand(unsigned char parameterCount, const char *command, const char *commandHelp); + + /// \brief Just writes a string to the remote system based on the result ( \a res ) of your operation + /// \details This is not necessary to call, but makes it easier to return results of function calls. + /// \param[in] res The result to write + /// \param[in] command The command that this result came from + /// \param[in] transport The transport interface that will be written to + /// \param[in] systemAddress The player this result will be sent to + virtual void ReturnResult(bool res, const char *command, TransportInterface *transport, const SystemAddress &systemAddress); + virtual void ReturnResult(char *res, const char *command, TransportInterface *transport, const SystemAddress &systemAddress); + virtual void ReturnResult(SystemAddress res, const char *command, TransportInterface *transport, const SystemAddress &systemAddress); + virtual void ReturnResult(int res, const char *command,TransportInterface *transport, const SystemAddress &systemAddress); + + /// \brief Just writes a string to the remote system when you are calling a function that has no return value. + /// \details This is not necessary to call, but makes it easier to return results of function calls. + /// \param[in] res The result to write + /// \param[in] command The command that this result came from + /// \param[in] transport The transport interface that will be written to + /// \param[in] systemAddress The player this result will be sent to + virtual void ReturnResult(const char *command,TransportInterface *transport, const SystemAddress &systemAddress); + +protected: + DataStructures::OrderedList commandList; +}; + +} // namespace RakNet + +#endif + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ConnectionGraph2.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ConnectionGraph2.cpp new file mode 100644 index 0000000..5950246 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ConnectionGraph2.cpp @@ -0,0 +1,299 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_ConnectionGraph2==1 + +#include "ConnectionGraph2.h" +#include "RakPeerInterface.h" +#include "MessageIdentifiers.h" +#include "BitStream.h" + +using namespace RakNet; + +STATIC_FACTORY_DEFINITIONS(ConnectionGraph2,ConnectionGraph2); + +int RakNet::ConnectionGraph2::RemoteSystemComp( const RakNetGUID &key, RemoteSystem * const &data ) +{ + if (key < data->guid) + return -1; + if (key > data->guid) + return 1; + return 0; +} + +int RakNet::ConnectionGraph2::SystemAddressAndGuidComp( const SystemAddressAndGuid &key, const SystemAddressAndGuid &data ) +{ + if (key.guiddata.guid) + return 1; + return 0; +} +ConnectionGraph2::ConnectionGraph2() +{ + autoProcessNewConnections=true; +} +ConnectionGraph2::~ConnectionGraph2() +{ + +} +bool ConnectionGraph2::GetConnectionListForRemoteSystem(RakNetGUID remoteSystemGuid, SystemAddress *saOut, RakNetGUID *guidOut, unsigned int *outLength) +{ + if ((saOut==0 && guidOut==0) || outLength==0 || *outLength==0 || remoteSystemGuid==UNASSIGNED_RAKNET_GUID) + { + *outLength=0; + return false; + } + + bool objectExists; + unsigned int idx = remoteSystems.GetIndexFromKey(remoteSystemGuid, &objectExists); + if (objectExists==false) + { + *outLength=0; + return false; + } + + unsigned int idx2; + if (remoteSystems[idx]->remoteConnections.Size() < *outLength) + *outLength=remoteSystems[idx]->remoteConnections.Size(); + for (idx2=0; idx2 < *outLength; idx2++) + { + if (guidOut) + guidOut[idx2]=remoteSystems[idx]->remoteConnections[idx2].guid; + if (saOut) + saOut[idx2]=remoteSystems[idx]->remoteConnections[idx2].systemAddress; + } + return true; +} +bool ConnectionGraph2::ConnectionExists(RakNetGUID g1, RakNetGUID g2) +{ + if (g1==g2) + return false; + + bool objectExists; + unsigned int idx = remoteSystems.GetIndexFromKey(g1, &objectExists); + if (objectExists==false) + { + return false; + } + SystemAddressAndGuid sag; + sag.guid=g2; + return remoteSystems[idx]->remoteConnections.HasData(sag); +} +uint16_t ConnectionGraph2::GetPingBetweenSystems(RakNetGUID g1, RakNetGUID g2) const +{ + if (g1==g2) + return 0; + + if (g1==rakPeerInterface->GetMyGUID()) + return (uint16_t) rakPeerInterface->GetAveragePing(g2); + if (g2==rakPeerInterface->GetMyGUID()) + return (uint16_t) rakPeerInterface->GetAveragePing(g1); + + bool objectExists; + unsigned int idx = remoteSystems.GetIndexFromKey(g1, &objectExists); + if (objectExists==false) + { + return (uint16_t) -1; + } + + SystemAddressAndGuid sag; + sag.guid=g2; + unsigned int idx2 = remoteSystems[idx]->remoteConnections.GetIndexFromKey(sag, &objectExists); + if (objectExists==false) + { + return (uint16_t) -1; + } + return remoteSystems[idx]->remoteConnections[idx2].sendersPingToThatSystem; +} + +/// Returns the system with the lowest total ping among all its connections. This can be used as the 'best host' for a peer to peer session +RakNetGUID ConnectionGraph2::GetLowestAveragePingSystem(void) const +{ + float lowestPing=-1.0; + unsigned int lowestPingIdx=(unsigned int) -1; + float thisAvePing=0.0f; + unsigned int idx, idx2; + int ap, count=0; + + for (idx=0; idxGetAveragePing(remoteSystems[idx]->guid); + if (ap!=-1) + { + thisAvePing+=(float) ap; + count++; + } + } + + if (count>0) + { + lowestPing=thisAvePing/count; + } + + for (idx=0; idxremoteConnections.Size(); idx2++) + { + ap=remoteSystem->remoteConnections[idx2].sendersPingToThatSystem; + if (ap!=-1) + { + thisAvePing+=(float) ap; + count++; + } + } + + if (count>0 && (lowestPing==-1.0f || thisAvePing/count < lowestPing)) + { + lowestPing=thisAvePing/count; + lowestPingIdx=idx; + } + } + + if (lowestPingIdx==(unsigned int) -1) + return rakPeerInterface->GetMyGUID(); + return remoteSystems[lowestPingIdx]->guid; +} + +void ConnectionGraph2::OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ) +{ + // Send notice to all existing connections + RakNet::BitStream bs; + if (lostConnectionReason==LCR_CONNECTION_LOST) + bs.Write((MessageID)ID_REMOTE_CONNECTION_LOST); + else + bs.Write((MessageID)ID_REMOTE_DISCONNECTION_NOTIFICATION); + bs.Write(systemAddress); + bs.Write(rakNetGUID); + SendUnified(&bs,HIGH_PRIORITY,RELIABLE_ORDERED,0,systemAddress,true); + + bool objectExists; + unsigned int idx = remoteSystems.GetIndexFromKey(rakNetGUID, &objectExists); + if (objectExists) + { + RakNet::OP_DELETE(remoteSystems[idx],_FILE_AND_LINE_); + remoteSystems.RemoveAtIndex(idx); + } +} +void ConnectionGraph2::SetAutoProcessNewConnections(bool b) +{ + autoProcessNewConnections=b; +} +bool ConnectionGraph2::GetAutoProcessNewConnections(void) const +{ + return autoProcessNewConnections; +} +void ConnectionGraph2::AddParticipant(const SystemAddress &systemAddress, RakNetGUID rakNetGUID) +{ + // Relay the new connection to other systems. + RakNet::BitStream bs; + bs.Write((MessageID)ID_REMOTE_NEW_INCOMING_CONNECTION); + bs.Write((uint32_t)1); + bs.Write(systemAddress); + bs.Write(rakNetGUID); + bs.WriteCasted(rakPeerInterface->GetAveragePing(rakNetGUID)); + SendUnified(&bs,HIGH_PRIORITY,RELIABLE_ORDERED,0,systemAddress,true); + + // Send everyone to the new guy + DataStructures::List addresses; + DataStructures::List guids; + rakPeerInterface->GetSystemList(addresses, guids); + bs.Reset(); + bs.Write((MessageID)ID_REMOTE_NEW_INCOMING_CONNECTION); + BitSize_t writeOffset = bs.GetWriteOffset(); + bs.Write((uint32_t) addresses.Size()); + + unsigned int i; + uint32_t count=0; + for (i=0; i < addresses.Size(); i++) + { + if (addresses[i]==systemAddress) + continue; + + bs.Write(addresses[i]); + bs.Write(guids[i]); + bs.WriteCasted(rakPeerInterface->GetAveragePing(guids[i])); + count++; + } + + if (count>0) + { + BitSize_t writeOffset2 = bs.GetWriteOffset(); + bs.SetWriteOffset(writeOffset); + bs.Write(count); + bs.SetWriteOffset(writeOffset2); + SendUnified(&bs,HIGH_PRIORITY,RELIABLE_ORDERED,0,systemAddress,false); + } + + bool objectExists; + unsigned int ii = remoteSystems.GetIndexFromKey(rakNetGUID, &objectExists); + if (objectExists==false) + { + RemoteSystem* remoteSystem = RakNet::OP_NEW(_FILE_AND_LINE_); + remoteSystem->guid=rakNetGUID; + remoteSystems.InsertAtIndex(remoteSystem,ii,_FILE_AND_LINE_); + } +} +void ConnectionGraph2::GetParticipantList(DataStructures::OrderedList &participantList) +{ + participantList.Clear(true, _FILE_AND_LINE_); + unsigned int i; + for (i=0; i < remoteSystems.Size(); i++) + participantList.InsertAtEnd(remoteSystems[i]->guid, _FILE_AND_LINE_); +} +void ConnectionGraph2::OnNewConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, bool isIncoming) +{ + (void) isIncoming; + if (autoProcessNewConnections) + AddParticipant(systemAddress, rakNetGUID); +} +PluginReceiveResult ConnectionGraph2::OnReceive(Packet *packet) +{ + if (packet->data[0]==ID_REMOTE_CONNECTION_LOST || packet->data[0]==ID_REMOTE_DISCONNECTION_NOTIFICATION) + { + bool objectExists; + unsigned idx = remoteSystems.GetIndexFromKey(packet->guid, &objectExists); + if (objectExists) + { + RakNet::BitStream bs(packet->data,packet->length,false); + bs.IgnoreBytes(1); + SystemAddressAndGuid saag; + bs.Read(saag.systemAddress); + bs.Read(saag.guid); + unsigned long idx2 = remoteSystems[idx]->remoteConnections.GetIndexFromKey(saag, &objectExists); + if (objectExists) + remoteSystems[idx]->remoteConnections.RemoveAtIndex(idx2); + } + } + else if (packet->data[0]==ID_REMOTE_NEW_INCOMING_CONNECTION) + { + bool objectExists; + unsigned idx = remoteSystems.GetIndexFromKey(packet->guid, &objectExists); + if (objectExists) + { + uint32_t numAddresses; + RakNet::BitStream bs(packet->data,packet->length,false); + bs.IgnoreBytes(1); + bs.Read(numAddresses); + for (unsigned int idx2=0; idx2 < numAddresses; idx2++) + { + SystemAddressAndGuid saag; + bs.Read(saag.systemAddress); + bs.Read(saag.guid); + bs.Read(saag.sendersPingToThatSystem); + bool objectExists; + unsigned int ii = remoteSystems[idx]->remoteConnections.GetIndexFromKey(saag, &objectExists); + if (objectExists==false) + remoteSystems[idx]->remoteConnections.InsertAtIndex(saag,ii,_FILE_AND_LINE_); + } + } + } + + return RR_CONTINUE_PROCESSING; +} + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ConnectionGraph2.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ConnectionGraph2.h new file mode 100644 index 0000000..d5fa99a --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ConnectionGraph2.h @@ -0,0 +1,118 @@ +/// \file ConnectionGraph2.h +/// \brief Connection graph plugin, version 2. Tells new systems about existing and new connections +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_ConnectionGraph2==1 + +#ifndef __CONNECTION_GRAPH_2_H +#define __CONNECTION_GRAPH_2_H + +#include "RakMemoryOverride.h" +#include "RakNetTypes.h" +#include "PluginInterface2.h" +#include "DS_List.h" +#include "DS_WeightedGraph.h" +#include "GetTime.h" +#include "Export.h" + +namespace RakNet +{ +/// Forward declarations +class RakPeerInterface; + +/// \brief A one hop connection graph. +/// \details Sends ID_REMOTE_CONNECTION_LOST, ID_REMOTE_DISCONNECTION_NOTIFICATION, ID_REMOTE_NEW_INCOMING_CONNECTION
+/// All identifiers are followed by SystemAddress, then RakNetGUID +/// Also stores the list for you, which you can access with GetConnectionListForRemoteSystem +/// \ingroup CONNECTION_GRAPH_GROUP +class RAK_DLL_EXPORT ConnectionGraph2 : public PluginInterface2 +{ +public: + + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(ConnectionGraph2) + + ConnectionGraph2(); + ~ConnectionGraph2(); + + /// \brief Given a remote system identified by RakNetGUID, return the list of SystemAddresses and RakNetGUIDs they are connected to + /// \param[in] remoteSystemGuid Which system we are referring to. This only works for remote systems, not ourselves. + /// \param[out] saOut A preallocated array to hold the output list of SystemAddress. Can be 0 if you don't care. + /// \param[out] guidOut A preallocated array to hold the output list of RakNetGUID. Can be 0 if you don't care. + /// \param[in,out] outLength On input, the size of \a saOut and \a guidOut. On output, modified to reflect the number of elements actually written + /// \return True if \a remoteSystemGuid was found. Otherwise false, and \a saOut, \a guidOut remain unchanged. \a outLength will be set to 0. + bool GetConnectionListForRemoteSystem(RakNetGUID remoteSystemGuid, SystemAddress *saOut, RakNetGUID *guidOut, unsigned int *outLength); + + /// Returns if g1 is connected to g2 + bool ConnectionExists(RakNetGUID g1, RakNetGUID g2); + + /// Returns the average ping between two systems in the connection graph. Returns -1 if no connection exists between those systems + uint16_t GetPingBetweenSystems(RakNetGUID g1, RakNetGUID g2) const; + + /// Returns the system with the lowest average ping among all its connections. + /// If you need one system in the peer to peer group to relay data, have the FullyConnectedMesh2 host call this function after host migration, and use that system + RakNetGUID GetLowestAveragePingSystem(void) const; + + /// \brief If called with false, then new connections are only added to the connection graph when you call ProcessNewConnection(); + /// \details This is useful if you want to perform validation before connecting a system to a mesh, or if you want a submesh (for example a server cloud) + /// \param[in] b True to automatically call ProcessNewConnection() on any new connection, false to not do so. Defaults to true. + void SetAutoProcessNewConnections(bool b); + + /// \brief Returns value passed to SetAutoProcessNewConnections() + /// \return Value passed to SetAutoProcessNewConnections(), or the default of true if it was never called + bool GetAutoProcessNewConnections(void) const; + + /// \brief If you call SetAutoProcessNewConnections(false);, then you will need to manually call ProcessNewConnection() on new connections + /// \details On ID_NEW_INCOMING_CONNECTION or ID_CONNECTION_REQUEST_ACCEPTED, adds that system to the graph + /// Do not call ProcessNewConnection() manually otherwise + /// \param[in] The packet->SystemAddress member + /// \param[in] The packet->guid member + void AddParticipant(const SystemAddress &systemAddress, RakNetGUID rakNetGUID); + + /// Get the participants added with AddParticipant() + /// \param[out] participantList Participants added with AddParticipant(); + void GetParticipantList(DataStructures::OrderedList &participantList); + + /// \internal + struct SystemAddressAndGuid + { + SystemAddress systemAddress; + RakNetGUID guid; + uint16_t sendersPingToThatSystem; + }; + /// \internal + static int SystemAddressAndGuidComp( const SystemAddressAndGuid &key, const SystemAddressAndGuid &data ); + + /// \internal + struct RemoteSystem + { + DataStructures::OrderedList remoteConnections; + RakNetGUID guid; + }; + /// \internal + static int RemoteSystemComp( const RakNetGUID &key, RemoteSystem * const &data ); + +protected: + /// \internal + virtual void OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ); + /// \internal + virtual void OnNewConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, bool isIncoming); + /// \internal + virtual PluginReceiveResult OnReceive(Packet *packet); + + // List of systems I am connected to, which in turn stores which systems they are connected to + DataStructures::OrderedList remoteSystems; + + bool autoProcessNewConnections; + +}; + +} // namespace RakNet + +#endif // #ifndef __CONNECTION_GRAPH_2_H + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ConsoleServer.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ConsoleServer.cpp new file mode 100644 index 0000000..dea8703 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ConsoleServer.cpp @@ -0,0 +1,311 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_ConsoleServer==1 + +#include "ConsoleServer.h" +#include "TransportInterface.h" +#include "CommandParserInterface.h" +#include +#include + +#define COMMAND_DELINATOR ' ' +#define COMMAND_DELINATOR_TOGGLE '"' + +#include "LinuxStrings.h" + +using namespace RakNet; + +STATIC_FACTORY_DEFINITIONS(ConsoleServer,ConsoleServer); + +ConsoleServer::ConsoleServer() +{ + transport=0; + password[0]=0; + prompt=0; +} +ConsoleServer::~ConsoleServer() +{ + if (prompt) + rakFree_Ex(prompt, _FILE_AND_LINE_); +} +void ConsoleServer::SetTransportProvider(TransportInterface *transportInterface, unsigned short port) +{ + // Replace the current TransportInterface, stopping the old one, if present, and starting the new one. + if (transportInterface) + { + if (transport) + { + RemoveCommandParser(transport->GetCommandParser()); + transport->Stop(); + } + transport=transportInterface; + transport->Start(port, true); + + unsigned i; + for (i=0; i < commandParserList.Size(); i++) + commandParserList[i]->OnTransportChange(transport); + + // The transport itself might have a command parser - for example password for the RakNet transport + AddCommandParser(transport->GetCommandParser()); + } +} +void ConsoleServer::AddCommandParser(CommandParserInterface *commandParserInterface) +{ + if (commandParserInterface==0) + return; + + // Non-duplicate insertion + unsigned i; + for (i=0; i < commandParserList.Size(); i++) + { + if (commandParserList[i]==commandParserInterface) + return; + + if (_stricmp(commandParserList[i]->GetName(), commandParserInterface->GetName())==0) + { + // Naming conflict between two command parsers + RakAssert(0); + return; + } + } + + commandParserList.Insert(commandParserInterface, _FILE_AND_LINE_); + if (transport) + commandParserInterface->OnTransportChange(transport); +} +void ConsoleServer::RemoveCommandParser(CommandParserInterface *commandParserInterface) +{ + if (commandParserInterface==0) + return; + + // Overwrite the element we are removing from the back of the list and delete the back of the list + unsigned i; + for (i=0; i < commandParserList.Size(); i++) + { + if (commandParserList[i]==commandParserInterface) + { + commandParserList[i]=commandParserList[commandParserList.Size()-1]; + commandParserList.RemoveFromEnd(); + return; + } + } +} +void ConsoleServer::Update(void) +{ + unsigned i; + char *parameterList[20]; // Up to 20 parameters + unsigned numParameters; + RakNet::SystemAddress newOrLostConnectionId; + RakNet::Packet *p; + RakNet::RegisteredCommand rc; + + p = transport->Receive(); + newOrLostConnectionId=transport->HasNewIncomingConnection(); + + if (newOrLostConnectionId!=UNASSIGNED_SYSTEM_ADDRESS) + { + for (i=0; i < commandParserList.Size(); i++) + { + commandParserList[i]->OnNewIncomingConnection(newOrLostConnectionId, transport); + } + + transport->Send(newOrLostConnectionId, "Connected to remote command console.\r\nType 'help' for help.\r\n"); + ListParsers(newOrLostConnectionId); + ShowPrompt(newOrLostConnectionId); + } + + newOrLostConnectionId=transport->HasLostConnection(); + if (newOrLostConnectionId!=UNASSIGNED_SYSTEM_ADDRESS) + { + for (i=0; i < commandParserList.Size(); i++) + commandParserList[i]->OnConnectionLost(newOrLostConnectionId, transport); + } + + while (p) + { + bool commandParsed=false; + char copy[REMOTE_MAX_TEXT_INPUT]; + memcpy(copy, p->data, p->length); + copy[p->length]=0; + RakNet::CommandParserInterface::ParseConsoleString((char*)p->data, COMMAND_DELINATOR, COMMAND_DELINATOR_TOGGLE, &numParameters, parameterList, 20); // Up to 20 parameters + if (numParameters==0) + { + transport->DeallocatePacket(p); + p = transport->Receive(); + continue; + } + if (_stricmp(*parameterList, "help")==0 && numParameters<=2) + { + // Find the parser specified and display help for it + if (numParameters==1) + { + transport->Send(p->systemAddress, "\r\nINSTRUCTIONS:\r\n"); + transport->Send(p->systemAddress, "Enter commands on your keyboard, using spaces to delineate parameters.\r\n"); + transport->Send(p->systemAddress, "You can use quotation marks to toggle space delineation.\r\n"); + transport->Send(p->systemAddress, "You can connect multiple times from the same computer.\r\n"); + transport->Send(p->systemAddress, "You can direct commands to a parser by prefixing the parser name or number.\r\n"); + transport->Send(p->systemAddress, "COMMANDS:\r\n"); + transport->Send(p->systemAddress, "help Show this display.\r\n"); + transport->Send(p->systemAddress, "help Show help on a particular parser.\r\n"); + transport->Send(p->systemAddress, "help Show help on a particular command.\r\n"); + transport->Send(p->systemAddress, "quit Disconnects from the server.\r\n"); + transport->Send(p->systemAddress, "[] [] Execute a command\r\n"); + transport->Send(p->systemAddress, "[] [] Execute a command\r\n"); + ListParsers(p->systemAddress); + //ShowPrompt(p->systemAddress); + } + else // numParameters == 2, including the help tag + { + for (i=0; i < commandParserList.Size(); i++) + { + if (_stricmp(parameterList[1], commandParserList[i]->GetName())==0) + { + commandParsed=true; + commandParserList[i]->SendHelp(transport, p->systemAddress); + transport->Send(p->systemAddress, "COMMAND LIST:\r\n"); + commandParserList[i]->SendCommandList(transport, p->systemAddress); + transport->Send(p->systemAddress, "\r\n"); + break; + } + } + + if (commandParsed==false) + { + // Try again, for all commands for all parsers. + RakNet::RegisteredCommand rc; + for (i=0; i < commandParserList.Size(); i++) + { + if (commandParserList[i]->GetRegisteredCommand(parameterList[1], &rc)) + { + if (rc.parameterCount==RakNet::CommandParserInterface::VARIABLE_NUMBER_OF_PARAMETERS) + transport->Send(p->systemAddress, "(Variable parms): %s %s\r\n", rc.command, rc.commandHelp); + else + transport->Send(p->systemAddress, "(%i parms): %s %s\r\n", rc.parameterCount, rc.command, rc.commandHelp); + commandParsed=true; + break; + } + } + } + + if (commandParsed==false) + { + // Don't know what to do + transport->Send(p->systemAddress, "Unknown help topic: %s.\r\n", parameterList[1]); + } + //ShowPrompt(p->systemAddress); + } + } + else if (_stricmp(*parameterList, "quit")==0 && numParameters==1) + { + transport->Send(p->systemAddress, "Goodbye!\r\n"); + transport->CloseConnection(p->systemAddress); + } + else + { + bool tryAllParsers=true; + bool failed=false; + + if (numParameters >=2) // At minimum + { + unsigned commandParserIndex=(unsigned)-1; + // Prefixing with numbers directs to a particular parser + if (**parameterList>='0' && **parameterList<='9') + { + commandParserIndex=atoi(*parameterList); // Use specified parser unless it's an invalid number + commandParserIndex--; // Subtract 1 since we displayed numbers starting at index+1 + if (commandParserIndex >= commandParserList.Size()) + { + transport->Send(p->systemAddress, "Invalid index.\r\n"); + failed=true; + } + } + else + { + // // Prefixing with the name of a command parser directs to that parser. See if the first word matches a parser + for (i=0; i < commandParserList.Size(); i++) + { + if (_stricmp(parameterList[0], commandParserList[i]->GetName())==0) + { + commandParserIndex=i; // Matches parser at index i + break; + } + } + } + + if (failed==false) + { + // -1 means undirected, so otherwise this is directed to a target + if (commandParserIndex!=(unsigned)-1) + { + // Only this parser should use this command + tryAllParsers=false; + if (commandParserList[commandParserIndex]->GetRegisteredCommand(parameterList[1], &rc)) + { + commandParsed=true; + if (rc.parameterCount==CommandParserInterface::VARIABLE_NUMBER_OF_PARAMETERS || rc.parameterCount==numParameters-2) + commandParserList[commandParserIndex]->OnCommand(rc.command, numParameters-2, parameterList+2, transport, p->systemAddress, copy); + else + transport->Send(p->systemAddress, "Invalid parameter count.\r\n(%i parms): %s %s\r\n", rc.parameterCount, rc.command, rc.commandHelp); + } + } + } + } + + if (failed == false && tryAllParsers) + { + for (i=0; i < commandParserList.Size(); i++) + { + // Undirected command. Try all the parsers to see if they understand the command + // Pass the 1nd element as the command, and the remainder as the parameter list + if (commandParserList[i]->GetRegisteredCommand(parameterList[0], &rc)) + { + commandParsed=true; + + if (rc.parameterCount==CommandParserInterface::VARIABLE_NUMBER_OF_PARAMETERS || rc.parameterCount==numParameters-1) + commandParserList[i]->OnCommand(rc.command, numParameters-1, parameterList+1, transport, p->systemAddress, copy); + else + transport->Send(p->systemAddress, "Invalid parameter count.\r\n(%i parms): %s %s\r\n", rc.parameterCount, rc.command, rc.commandHelp); + } + } + } + if (commandParsed==false && commandParserList.Size() > 0) + { + transport->Send(p->systemAddress, "Unknown command: Type 'help' for help.\r\n"); + } + + } + + ShowPrompt(p->systemAddress); + + transport->DeallocatePacket(p); + p = transport->Receive(); + } +} + +void ConsoleServer::ListParsers(SystemAddress systemAddress) +{ + transport->Send(systemAddress,"INSTALLED PARSERS:\r\n"); + unsigned i; + for (i=0; i < commandParserList.Size(); i++) + { + transport->Send(systemAddress, "%i. %s\r\n", i+1, commandParserList[i]->GetName()); + } +} +void ConsoleServer::ShowPrompt(SystemAddress systemAddress) +{ + transport->Send(systemAddress, prompt); +} +void ConsoleServer::SetPrompt(const char *_prompt) +{ + if (prompt) + rakFree_Ex(prompt,_FILE_AND_LINE_); + if (_prompt && _prompt[0]) + { + size_t len = strlen(_prompt); + prompt = (char*) rakMalloc_Ex(len+1,_FILE_AND_LINE_); + strcpy(prompt,_prompt); + } + else + prompt=0; +} + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ConsoleServer.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ConsoleServer.h new file mode 100644 index 0000000..0776c54 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ConsoleServer.h @@ -0,0 +1,77 @@ +/// \file ConsoleServer.h +/// \brief Contains ConsoleServer , used to plugin to your game to accept remote console-based connections +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_ConsoleServer==1 + +#ifndef __CONSOLE_SERVER_H +#define __CONSOLE_SERVER_H + +#include "RakMemoryOverride.h" +#include "DS_List.h" +#include "RakNetTypes.h" +#include "Export.h" + +namespace RakNet +{ +/// Forward declarations +class TransportInterface; +class CommandParserInterface; + + +/// \brief The main entry point for the server portion of your remote console application support. +/// \details ConsoleServer takes one TransportInterface and one or more CommandParserInterface (s) +/// The TransportInterface will be used to send data between the server and the client. The connecting client must support the +/// protocol used by your derivation of TransportInterface . TelnetTransport and RakNetTransport are two such derivations . +/// When a command is sent by a remote console, it will be processed by your implementations of CommandParserInterface +class RAK_DLL_EXPORT ConsoleServer +{ +public: + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(ConsoleServer) + + ConsoleServer(); + ~ConsoleServer(); + + /// \brief Call this with a derivation of TransportInterface so that the console server can send and receive commands + /// \param[in] transportInterface Your interface to use. + /// \param[in] port The port to host on. Telnet uses port 23 by default. RakNet can use whatever you want. + void SetTransportProvider(TransportInterface *transportInterface, unsigned short port); + + /// \brief Add an implementation of CommandParserInterface to the list of command parsers. + /// \param[in] commandParserInterface The command parser referred to + void AddCommandParser(CommandParserInterface *commandParserInterface); + + /// \brief Remove an implementation of CommandParserInterface previously added with AddCommandParser(). + /// \param[in] commandParserInterface The command parser referred to + void RemoveCommandParser(CommandParserInterface *commandParserInterface); + + /// \brief Call update to read packet sent from your TransportInterface. + /// You should do this fairly frequently. + void Update(void); + + /// \brief Sets a prompt to show when waiting for user input. + /// \details Pass an empty string to clear the prompt + /// Defaults to no prompt + /// \param[in] _prompt Null-terminated string of the prompt to use. If you want a newline, be sure to use /r/n + void SetPrompt(const char *_prompt); + +protected: + void ListParsers(SystemAddress systemAddress); + void ShowPrompt(SystemAddress systemAddress); + TransportInterface *transport; + DataStructures::List commandParserList; + char* password[256]; + char *prompt; +}; + +} // namespace RakNet + +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_BPlusTree.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_BPlusTree.h new file mode 100644 index 0000000..ad4d443 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_BPlusTree.h @@ -0,0 +1,1146 @@ +/// \file DS_BPlusTree.h +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#ifndef __B_PLUS_TREE_CPP +#define __B_PLUS_TREE_CPP + +#include "DS_MemoryPool.h" +#include "DS_Queue.h" +#include +#include "Export.h" + +// Java +// http://www.seanster.com/BplusTree/BplusTree.html + +// Overview +// http://babbage.clarku.edu/~achou/cs160/B+Trees/B+Trees.htm + +// Deletion +// http://dbpubs.stanford.edu:8090/pub/1995-19 + +#ifdef _MSC_VER +#pragma warning( push ) +#endif + +#include "RakMemoryOverride.h" + +/// The namespace DataStructures was only added to avoid compiler errors for commonly named data structures +/// As these data structures are stand-alone, you can use them outside of RakNet for your own projects if you wish. +namespace DataStructures +{ + /// Used in the BPlusTree. Used for both leaf and index nodes. + /// Don't use a constructor or destructor, due to the memory pool I am using + template + struct RAK_DLL_EXPORT Page + { + // We use the same data structure for both leaf and index nodes. + // It uses a little more memory for index nodes but reduces + // memory fragmentation, allocations, and deallocations. + bool isLeaf; + + // Used for both leaf and index nodes. + // For a leaf it means the number of elements in data + // For an index it means the number of keys and is one less than the number of children pointers. + int size; + + // Used for both leaf and index nodes. + KeyType keys[order]; + + // Used only for leaf nodes. Data is the actual data, while next is the pointer to the next leaf (for B+) + DataType data[order]; + Page *next; + Page *previous; + + // Used only for index nodes. Pointers to the children of this node. + Page *children[order+1]; + }; + + /// A BPlus tree + /// Written with efficiency and speed in mind. + template + class RAK_DLL_EXPORT BPlusTree + { + public: + struct ReturnAction + { + KeyType key1; + KeyType key2; + enum + { + NO_ACTION, + REPLACE_KEY1_WITH_KEY2, + PUSH_KEY_TO_PARENT, + SET_BRANCH_KEY, + } action; // 0=none, 1=replace key1 with key2 + }; + + BPlusTree(); + ~BPlusTree(); + void SetPoolPageSize(int size); // Set the page size for the memory pool. Optionsl + bool Get(const KeyType key, DataType &out) const; + bool Delete(const KeyType key); + bool Delete(const KeyType key, DataType &out); + bool Insert(const KeyType key, const DataType &data); + void Clear(void); + unsigned Size(void) const; + bool IsEmpty(void) const; + Page *GetListHead(void) const; + DataType GetDataHead(void) const; + void PrintLeaves(void); + void ForEachLeaf(void (*func)(Page * leaf, int index)); + void ForEachData(void (*func)(DataType input, int index)); + void PrintGraph(void); + protected: + void ValidateTreeRecursive(Page *cur); + void DeleteFromPageAtIndex(const int index, Page *cur); + static void PrintLeaf(Page * leaf, int index); + void FreePages(void); + bool GetIndexOf(const KeyType key, Page *page, int *out) const; + void ShiftKeysLeft(Page *cur); + bool CanRotateLeft(Page *cur, int childIndex); + bool CanRotateRight(Page *cur, int childIndex); + void RotateRight(Page *cur, int childIndex, ReturnAction *returnAction); + void RotateLeft(Page *cur, int childIndex, ReturnAction *returnAction); + Page* InsertIntoNode(const KeyType key, const DataType &childData, int insertionIndex, Page *nodeData, Page *cur, ReturnAction* returnAction); + Page* InsertBranchDown(const KeyType key, const DataType &data,Page *cur, ReturnAction* returnAction, bool *success); + Page* GetLeafFromKey(const KeyType key) const; + bool FindDeleteRebalance(const KeyType key, Page *cur, bool *underflow, KeyType rightRootKey, ReturnAction *returnAction, DataType &out); + bool FixUnderflow(int branchIndex, Page *cur, KeyType rightRootKey, ReturnAction *returnAction); + void ShiftNodeLeft(Page *cur); + void ShiftNodeRight(Page *cur); + + MemoryPool > pagePool; + Page *root, *leftmostLeaf; + }; + + template + BPlusTree::BPlusTree () + { + RakAssert(order>1); + root=0; + leftmostLeaf=0; + } + template + BPlusTree::~BPlusTree () + { + Clear(); + } + template + void BPlusTree::SetPoolPageSize(int size) + { + pagePool.SetPageSize(size); + } + template + bool BPlusTree::Get(const KeyType key, DataType &out) const + { + if (root==0) + return false; + + Page* leaf = GetLeafFromKey(key); + int childIndex; + + if (GetIndexOf(key, leaf, &childIndex)) + { + out=leaf->data[childIndex]; + return true; + } + return false; + } + template + void BPlusTree::DeleteFromPageAtIndex(const int index, Page *cur) + { + int i; + for (i=index; i < cur->size-1; i++) + cur->keys[i]=cur->keys[i+1]; + if (cur->isLeaf) + { + for (i=index; i < cur->size-1; i++) + cur->data[i]=cur->data[i+1]; + } + else + { + for (i=index; i < cur->size-1; i++) + cur->children[i+1]=cur->children[i+2]; + } + cur->size--; + } + template + bool BPlusTree::Delete(const KeyType key) + { + DataType temp; + return Delete(key, temp); + } + template + bool BPlusTree::Delete(const KeyType key, DataType &out) + { + if (root==0) + return false; + + ReturnAction returnAction; + returnAction.action=ReturnAction::NO_ACTION; + int childIndex; + bool underflow=false; + if (root==leftmostLeaf) + { + if (GetIndexOf(key, root, &childIndex)==false) + return false; + out=root->data[childIndex]; + DeleteFromPageAtIndex(childIndex,root); + if (root->size==0) + { + pagePool.Release(root, _FILE_AND_LINE_); + root=0; + leftmostLeaf=0; + } + return true; + } + else if (FindDeleteRebalance(key, root, &underflow,root->keys[0], &returnAction, out)==false) + return false; + +// RakAssert(returnAction.action==ReturnAction::NO_ACTION); + + if (underflow && root->size==0) + { + // Move the root down. + Page *oldRoot=root; + root=root->children[0]; + pagePool.Release(oldRoot, _FILE_AND_LINE_); + // memset(oldRoot,0,sizeof(root)); + } + + return true; + } + template + bool BPlusTree::FindDeleteRebalance(const KeyType key, Page *cur, bool *underflow, KeyType rightRootKey, ReturnAction *returnAction, DataType &out) + { + // Get index of child to follow. + int branchIndex, childIndex; + if (GetIndexOf(key, cur, &childIndex)) + branchIndex=childIndex+1; + else + branchIndex=childIndex; + + // If child is not a leaf, call recursively + if (cur->children[branchIndex]->isLeaf==false) + { + if (branchIndexsize) + rightRootKey=cur->keys[branchIndex]; // Shift right to left + else + rightRootKey=cur->keys[branchIndex-1]; // Shift center to left + + if (FindDeleteRebalance(key, cur->children[branchIndex], underflow, rightRootKey, returnAction, out)==false) + return false; + + // Call again in case the root key changed + if (branchIndexsize) + rightRootKey=cur->keys[branchIndex]; // Shift right to left + else + rightRootKey=cur->keys[branchIndex-1]; // Shift center to left + + if (returnAction->action==ReturnAction::SET_BRANCH_KEY && branchIndex!=childIndex) + { + returnAction->action=ReturnAction::NO_ACTION; + cur->keys[childIndex]=returnAction->key1; + + if (branchIndexsize) + rightRootKey=cur->keys[branchIndex]; // Shift right to left + else + rightRootKey=cur->keys[branchIndex-1]; // Shift center to left + } + } + else + { + // If child is a leaf, get the index of the key. If the item is not found, cancel delete. + if (GetIndexOf(key, cur->children[branchIndex], &childIndex)==false) + return false; + + // Delete: + // Remove childIndex from the child at branchIndex + out=cur->children[branchIndex]->data[childIndex]; + DeleteFromPageAtIndex(childIndex, cur->children[branchIndex]); + + if (childIndex==0) + { + if (branchIndex>0) + cur->keys[branchIndex-1]=cur->children[branchIndex]->keys[0]; + + if (branchIndex==0) + { + returnAction->action=ReturnAction::SET_BRANCH_KEY; + returnAction->key1=cur->children[0]->keys[0]; + } + } + + if (cur->children[branchIndex]->size < order/2) + *underflow=true; + else + *underflow=false; + } + + // Fix underflow: + if (*underflow) + { + *underflow=FixUnderflow(branchIndex, cur, rightRootKey, returnAction); + } + + return true; + } + template + bool BPlusTree::FixUnderflow(int branchIndex, Page *cur, KeyType rightRootKey, ReturnAction *returnAction) + { + // Borrow from a neighbor that has excess. + Page *source; + Page *dest; + + if (branchIndex>0 && cur->children[branchIndex-1]->size > order/2) + { + dest=cur->children[branchIndex]; + source=cur->children[branchIndex-1]; + + // Left has excess + ShiftNodeRight(dest); + if (dest->isLeaf) + { + dest->keys[0]=source->keys[source->size-1]; + dest->data[0]=source->data[source->size-1]; + } + else + { + dest->children[0]=source->children[source->size]; + dest->keys[0]=cur->keys[branchIndex-1]; + } + // Update the parent key for the child (middle) + cur->keys[branchIndex-1]=source->keys[source->size-1]; + source->size--; + + // if (branchIndex==0) + // { + // returnAction->action=ReturnAction::SET_BRANCH_KEY; + // returnAction->key1=dest->keys[0]; + // } + + // No underflow + return false; + } + else if (branchIndexsize && cur->children[branchIndex+1]->size > order/2) + { + dest=cur->children[branchIndex]; + source=cur->children[branchIndex+1]; + + // Right has excess + if (dest->isLeaf) + { + dest->keys[dest->size]=source->keys[0]; + dest->data[dest->size]=source->data[0]; + + // The first key in the leaf after shifting is the parent key for the right branch + cur->keys[branchIndex]=source->keys[1]; + +#ifdef _MSC_VER +#pragma warning( disable : 4127 ) // warning C4127: conditional expression is constant +#endif + if (order<=3 && dest->size==0) + { + if (branchIndex==0) + { + returnAction->action=ReturnAction::SET_BRANCH_KEY; + returnAction->key1=dest->keys[0]; + } + else + cur->keys[branchIndex-1]=cur->children[branchIndex]->keys[0]; + } + } + else + { + if (returnAction->action==ReturnAction::NO_ACTION) + { + returnAction->action=ReturnAction::SET_BRANCH_KEY; + returnAction->key1=dest->keys[0]; + } + + dest->keys[dest->size]=rightRootKey; + dest->children[dest->size+1]=source->children[0]; + + // The shifted off key is the leftmost key for a node + cur->keys[branchIndex]=source->keys[0]; + } + + + dest->size++; + ShiftNodeLeft(source); + + //cur->keys[branchIndex]=source->keys[0]; + +// returnAction->action=ReturnAction::SET_BRANCH_KEY; +// returnAction->key1=dest->keys[dest->size-1]; + + // No underflow + return false; + } + else + { + int sourceIndex; + + // If no neighbors have excess, merge two branches. + // + // To merge two leaves, just copy the data and keys over. + // + // To merge two branches, copy the pointers and keys over, using rightRootKey as the key for the extra pointer + if (branchIndexsize) + { + // Merge right child to current child and delete right child. + dest=cur->children[branchIndex]; + source=cur->children[branchIndex+1]; + } + else + { + // Move current child to left and delete current child + dest=cur->children[branchIndex-1]; + source=cur->children[branchIndex]; + } + + // Merge + if (dest->isLeaf) + { + for (sourceIndex=0; sourceIndexsize; sourceIndex++) + { + dest->keys[dest->size]=source->keys[sourceIndex]; + dest->data[dest->size++]=source->data[sourceIndex]; + } + } + else + { + // We want the tree root key of the source, not the current. + dest->keys[dest->size]=rightRootKey; + dest->children[dest->size++ + 1]=source->children[0]; + for (sourceIndex=0; sourceIndexsize; sourceIndex++) + { + dest->keys[dest->size]=source->keys[sourceIndex]; + dest->children[dest->size++ + 1]=source->children[sourceIndex + 1]; + } + } + +#ifdef _MSC_VER +#pragma warning( disable : 4127 ) // warning C4127: conditional expression is constant +#endif + if (order<=3 && branchIndex>0 && cur->children[branchIndex]->isLeaf) // With order==2 it is possible to delete data[0], which is not possible with higher orders. + cur->keys[branchIndex-1]=cur->children[branchIndex]->keys[0]; + + if (branchIndexsize) + { + // Update the parent key, removing the source (right) + DeleteFromPageAtIndex(branchIndex, cur); + } + else + { + if (branchIndex>0) + { + // Update parent key, removing the source (current) + DeleteFromPageAtIndex(branchIndex-1, cur); + } + } + + if (branchIndex==0 && dest->isLeaf) + { + returnAction->action=ReturnAction::SET_BRANCH_KEY; + returnAction->key1=dest->keys[0]; + } + + if (source==leftmostLeaf) + leftmostLeaf=source->next; + + if (source->isLeaf) + { + if (source->previous) + source->previous->next=source->next; + if (source->next) + source->next->previous=source->previous; + } + + // Free the source node + pagePool.Release(source, _FILE_AND_LINE_); + // memset(source,0,sizeof(root)); + + // Return underflow or not of parent. + return cur->size < order/2; + } + } + template + void BPlusTree::ShiftNodeRight(Page *cur) + { + int i; + for (i=cur->size; i>0; i--) + cur->keys[i]=cur->keys[i-1]; + if (cur->isLeaf) + { + for (i=cur->size; i>0; i--) + cur->data[i]=cur->data[i-1]; + } + else + { + for (i=cur->size+1; i>0; i--) + cur->children[i]=cur->children[i-1]; + } + + cur->size++; + } + template + void BPlusTree::ShiftNodeLeft(Page *cur) + { + int i; + for (i=0; i < cur->size-1; i++) + cur->keys[i]=cur->keys[i+1]; + if (cur->isLeaf) + { + for (i=0; i < cur->size; i++) + cur->data[i]=cur->data[i+1]; + } + else + { + for (i=0; i < cur->size; i++) + cur->children[i]=cur->children[i+1]; + } + cur->size--; + } + template + Page* BPlusTree::InsertIntoNode(const KeyType key, const DataType &leafData, int insertionIndex, Page *nodeData, Page *cur, ReturnAction* returnAction) + { + int i; + if (cur->size < order) + { + for (i=cur->size; i > insertionIndex; i--) + cur->keys[i]=cur->keys[i-1]; + if (cur->isLeaf) + { + for (i=cur->size; i > insertionIndex; i--) + cur->data[i]=cur->data[i-1]; + } + else + { + for (i=cur->size+1; i > insertionIndex+1; i--) + cur->children[i]=cur->children[i-1]; + } + cur->keys[insertionIndex]=key; + if (cur->isLeaf) + cur->data[insertionIndex]=leafData; + else + cur->children[insertionIndex+1]=nodeData; + + cur->size++; + } + else + { + Page* newPage = pagePool.Allocate( _FILE_AND_LINE_ ); + newPage->isLeaf=cur->isLeaf; + if (cur->isLeaf) + { + newPage->next=cur->next; + if (cur->next) + cur->next->previous=newPage; + newPage->previous=cur; + cur->next=newPage; + } + + int destIndex, sourceIndex; + + if (insertionIndex>=(order+1)/2) + { + destIndex=0; + sourceIndex=order/2; + + for (; sourceIndex < insertionIndex; sourceIndex++, destIndex++) + { + newPage->keys[destIndex]=cur->keys[sourceIndex]; + } + newPage->keys[destIndex++]=key; + for (; sourceIndex < order; sourceIndex++, destIndex++) + { + newPage->keys[destIndex]=cur->keys[sourceIndex]; + } + + destIndex=0; + sourceIndex=order/2; + if (cur->isLeaf) + { + for (; sourceIndex < insertionIndex; sourceIndex++, destIndex++) + { + newPage->data[destIndex]=cur->data[sourceIndex]; + } + newPage->data[destIndex++]=leafData; + for (; sourceIndex < order; sourceIndex++, destIndex++) + { + newPage->data[destIndex]=cur->data[sourceIndex]; + } + } + else + { + + for (; sourceIndex < insertionIndex; sourceIndex++, destIndex++) + { + newPage->children[destIndex]=cur->children[sourceIndex+1]; + } + newPage->children[destIndex++]=nodeData; + + // sourceIndex+1 is sort of a hack but it works - because there is one extra child than keys + // skip past the last child for cur + for (; sourceIndex+1 < cur->size+1; sourceIndex++, destIndex++) + { + newPage->children[destIndex]=cur->children[sourceIndex+1]; + } + + // the first key is the middle key. Remove it from the page and push it to the parent + returnAction->action=ReturnAction::PUSH_KEY_TO_PARENT; + returnAction->key1=newPage->keys[0]; + for (int i=0; i < destIndex-1; i++) + newPage->keys[i]=newPage->keys[i+1]; + + } + cur->size=order/2; + } + else + { + destIndex=0; + sourceIndex=(order+1)/2-1; + for (; sourceIndex < order; sourceIndex++, destIndex++) + newPage->keys[destIndex]=cur->keys[sourceIndex]; + destIndex=0; + if (cur->isLeaf) + { + sourceIndex=(order+1)/2-1; + for (; sourceIndex < order; sourceIndex++, destIndex++) + newPage->data[destIndex]=cur->data[sourceIndex]; + } + else + { + sourceIndex=(order+1)/2; + for (; sourceIndex < order+1; sourceIndex++, destIndex++) + newPage->children[destIndex]=cur->children[sourceIndex]; + + // the first key is the middle key. Remove it from the page and push it to the parent + returnAction->action=ReturnAction::PUSH_KEY_TO_PARENT; + returnAction->key1=newPage->keys[0]; + for (int i=0; i < destIndex-1; i++) + newPage->keys[i]=newPage->keys[i+1]; + } + cur->size=(order+1)/2-1; + if (cur->size) + { + bool b = GetIndexOf(key, cur, &insertionIndex); + (void) b; + RakAssert(b==false); + } + else + insertionIndex=0; + InsertIntoNode(key, leafData, insertionIndex, nodeData, cur, returnAction); + } + + newPage->size=destIndex; + + return newPage; + } + + return 0; + } + + template + bool BPlusTree::CanRotateLeft(Page *cur, int childIndex) + { + return childIndex>0 && cur->children[childIndex-1]->size + void BPlusTree::RotateLeft(Page *cur, int childIndex, ReturnAction *returnAction) + { + Page *dest = cur->children[childIndex-1]; + Page *source = cur->children[childIndex]; + returnAction->key1=source->keys[0]; + dest->keys[dest->size]=source->keys[0]; + dest->data[dest->size]=source->data[0]; + dest->size++; + for (int i=0; i < source->size-1; i++) + { + source->keys[i]=source->keys[i+1]; + source->data[i]=source->data[i+1]; + } + source->size--; + cur->keys[childIndex-1]=source->keys[0]; + returnAction->key2=source->keys[0]; + } + + template + bool BPlusTree::CanRotateRight(Page *cur, int childIndex) + { + return childIndex < cur->size && cur->children[childIndex+1]->size + void BPlusTree::RotateRight(Page *cur, int childIndex, ReturnAction *returnAction) + { + Page *dest = cur->children[childIndex+1]; + Page *source = cur->children[childIndex]; + returnAction->key1=dest->keys[0]; + for (int i= dest->size; i > 0; i--) + { + dest->keys[i]=dest->keys[i-1]; + dest->data[i]=dest->data[i-1]; + } + dest->keys[0]=source->keys[source->size-1]; + dest->data[0]=source->data[source->size-1]; + dest->size++; + source->size--; + + cur->keys[childIndex]=dest->keys[0]; + returnAction->key2=dest->keys[0]; + } + template + Page* BPlusTree::GetLeafFromKey(const KeyType key) const + { + Page* cur = root; + int childIndex; + while (cur->isLeaf==false) + { + // When searching, if we match the exact key we go down the pointer after that index + if (GetIndexOf(key, cur, &childIndex)) + childIndex++; + cur = cur->children[childIndex]; + } + return cur; + } + + template + Page* BPlusTree::InsertBranchDown(const KeyType key, const DataType &data,Page *cur, ReturnAction *returnAction, bool *success) + { + int childIndex; + int branchIndex; + if (GetIndexOf(key, cur, &childIndex)) + branchIndex=childIndex+1; + else + branchIndex=childIndex; + Page* newPage; + if (cur->isLeaf==false) + { + if (cur->children[branchIndex]->isLeaf==true && cur->children[branchIndex]->size==order) + { + if (branchIndex==childIndex+1) + { + *success=false; + return 0; // Already exists + } + + if (CanRotateLeft(cur, branchIndex)) + { + returnAction->action=ReturnAction::REPLACE_KEY1_WITH_KEY2; + if (key > cur->children[branchIndex]->keys[0]) + { + RotateLeft(cur, branchIndex, returnAction); + + int insertionIndex; + GetIndexOf(key, cur->children[branchIndex], &insertionIndex); + InsertIntoNode(key, data, insertionIndex, 0, cur->children[branchIndex], 0); + } + else + { + // Move head element to left and replace it with key,data + Page* dest=cur->children[branchIndex-1]; + Page* source=cur->children[branchIndex]; + returnAction->key1=source->keys[0]; + returnAction->key2=key; + dest->keys[dest->size]=source->keys[0]; + dest->data[dest->size]=source->data[0]; + dest->size++; + source->keys[0]=key; + source->data[0]=data; + } + cur->keys[branchIndex-1]=cur->children[branchIndex]->keys[0]; + + return 0; + } + else if (CanRotateRight(cur, branchIndex)) + { + returnAction->action=ReturnAction::REPLACE_KEY1_WITH_KEY2; + + if (key < cur->children[branchIndex]->keys[cur->children[branchIndex]->size-1]) + { + RotateRight(cur, branchIndex, returnAction); + + int insertionIndex; + GetIndexOf(key, cur->children[branchIndex], &insertionIndex); + InsertIntoNode(key, data, insertionIndex, 0, cur->children[branchIndex], 0); + + } + else + { + // Insert to the head of the right leaf instead and change our key + returnAction->key1=cur->children[branchIndex+1]->keys[0]; + InsertIntoNode(key, data, 0, 0, cur->children[branchIndex+1], 0); + returnAction->key2=key; + } + cur->keys[branchIndex]=cur->children[branchIndex+1]->keys[0]; + return 0; + } + } + + newPage=InsertBranchDown(key,data,cur->children[branchIndex], returnAction, success); + if (returnAction->action==ReturnAction::REPLACE_KEY1_WITH_KEY2) + { + if (branchIndex>0 && cur->keys[branchIndex-1]==returnAction->key1) + cur->keys[branchIndex-1]=returnAction->key2; + } + if (newPage) + { + if (newPage->isLeaf==false) + { + RakAssert(returnAction->action==ReturnAction::PUSH_KEY_TO_PARENT); + newPage->size--; + return InsertIntoNode(returnAction->key1, data, branchIndex, newPage, cur, returnAction); + } + else + { + return InsertIntoNode(newPage->keys[0], data, branchIndex, newPage, cur, returnAction); + } + } + } + else + { + if (branchIndex==childIndex+1) + { + *success=false; + return 0; // Already exists + } + else + { + return InsertIntoNode(key, data, branchIndex, 0, cur, returnAction); + } + } + + return 0; + } + template + bool BPlusTree::Insert(const KeyType key, const DataType &data) + { + if (root==0) + { + // Allocate root and make root a leaf + root = pagePool.Allocate( _FILE_AND_LINE_ ); + root->isLeaf=true; + leftmostLeaf=root; + root->size=1; + root->keys[0]=key; + root->data[0]=data; + root->next=0; + root->previous=0; + } + else + { + bool success=true; + ReturnAction returnAction; + returnAction.action=ReturnAction::NO_ACTION; + Page* newPage = InsertBranchDown(key, data, root, &returnAction, &success); + if (success==false) + return false; + if (newPage) + { + KeyType newKey; + if (newPage->isLeaf==false) + { + // One key is pushed up through the stack. I store that at keys[0] but it has to be removed for the page to be correct + RakAssert(returnAction.action==ReturnAction::PUSH_KEY_TO_PARENT); + newKey=returnAction.key1; + newPage->size--; + } + else + newKey = newPage->keys[0]; + // propagate the root + Page* newRoot = pagePool.Allocate( _FILE_AND_LINE_ ); + newRoot->isLeaf=false; + newRoot->size=1; + newRoot->keys[0]=newKey; + newRoot->children[0]=root; + newRoot->children[1]=newPage; + root=newRoot; + } + } + + return true; + } + template + void BPlusTree::ShiftKeysLeft(Page *cur) + { + int i; + for (i=0; i < cur->size; i++) + cur->keys[i]=cur->keys[i+1]; + } + template + void BPlusTree::Clear(void) + { + if (root) + { + FreePages(); + leftmostLeaf=0; + root=0; + } + pagePool.Clear(_FILE_AND_LINE_); + } + template + unsigned BPlusTree::Size(void) const + { + int count=0; + DataStructures::Page *cur = GetListHead(); + while (cur) + { + count+=cur->size; + cur=cur->next; + } + return count; + } + template + bool BPlusTree::IsEmpty(void) const + { + return root==0; + } + template + bool BPlusTree::GetIndexOf(const KeyType key, Page *page, int *out) const + { + RakAssert(page->size>0); + int index, upperBound, lowerBound; + upperBound=page->size-1; + lowerBound=0; + index = page->size/2; + +#ifdef _MSC_VER +#pragma warning( disable : 4127 ) // warning C4127: conditional expression is constant +#endif + while (1) + { + if (key==page->keys[index]) + { + *out=index; + return true; + } + else if (keykeys[index]) + upperBound=index-1; + else + lowerBound=index+1; + + index=lowerBound+(upperBound-lowerBound)/2; + + if (lowerBound>upperBound) + { + *out=lowerBound; + return false; // No match + } + } + } + template + void BPlusTree::FreePages(void) + { + DataStructures::Queue *> queue; + DataStructures::Page *ptr; + int i; + queue.Push(root, _FILE_AND_LINE_ ); + while (queue.Size()) + { + ptr=queue.Pop(); + if (ptr->isLeaf==false) + { + for (i=0; i < ptr->size+1; i++) + queue.Push(ptr->children[i], _FILE_AND_LINE_ ); + } + pagePool.Release(ptr, _FILE_AND_LINE_); + // memset(ptr,0,sizeof(root)); + }; + } + template + Page *BPlusTree::GetListHead(void) const + { + return leftmostLeaf; + } + template + DataType BPlusTree::GetDataHead(void) const + { + return leftmostLeaf->data[0]; + } + template + void BPlusTree::ForEachLeaf(void (*func)(Page * leaf, int index)) + { + int count=0; + DataStructures::Page *cur = GetListHead(); + while (cur) + { + func(cur, count++); + cur=cur->next; + } + } + template + void BPlusTree::ForEachData(void (*func)(DataType input, int index)) + { + int count=0,i; + DataStructures::Page *cur = GetListHead(); + while (cur) + { + for (i=0; i < cur->size; i++) + func(cur->data[i], count++); + cur=cur->next; + } + } + template + void BPlusTree::PrintLeaf(Page * leaf, int index) + { + int i; + RAKNET_DEBUG_PRINTF("%i] SELF=%p\n", index+1, leaf); + for (i=0; i < leaf->size; i++) + RAKNET_DEBUG_PRINTF(" %i. %i\n", i+1, leaf->data[i]); + } + template + void BPlusTree::PrintLeaves(void) + { + ForEachLeaf(PrintLeaf); + } + + template + void BPlusTree::ValidateTreeRecursive(Page *cur) + { + RakAssert(cur==root || cur->size>=order/2); + + if (cur->children[0]->isLeaf) + { + RakAssert(cur->children[0]->keys[0] < cur->keys[0]); + for (int i=0; i < cur->size; i++) + { + RakAssert(cur->children[i+1]->keys[0]==cur->keys[i]); + } + } + else + { + for (int i=0; i < cur->size+1; i++) + ValidateTreeRecursive(cur->children[i]); + } + } + + template + void BPlusTree::PrintGraph(void) + { + DataStructures::Queue *> queue; + queue.Push(root,_FILE_AND_LINE_); + queue.Push(0,_FILE_AND_LINE_); + DataStructures::Page *ptr; + int i,j; + if (root) + { + RAKNET_DEBUG_PRINTF("%p(", root); + for (i=0; i < root->size; i++) + { + RAKNET_DEBUG_PRINTF("%i ", root->keys[i]); + } + RAKNET_DEBUG_PRINTF(") "); + RAKNET_DEBUG_PRINTF("\n"); + } + while (queue.Size()) + { + ptr=queue.Pop(); + if (ptr==0) + RAKNET_DEBUG_PRINTF("\n"); + else if (ptr->isLeaf==false) + { + for (i=0; i < ptr->size+1; i++) + { + RAKNET_DEBUG_PRINTF("%p(", ptr->children[i]); + //RAKNET_DEBUG_PRINTF("(", ptr->children[i]); + for (j=0; j < ptr->children[i]->size; j++) + RAKNET_DEBUG_PRINTF("%i ", ptr->children[i]->keys[j]); + RAKNET_DEBUG_PRINTF(") "); + queue.Push(ptr->children[i],_FILE_AND_LINE_); + } + queue.Push(0,_FILE_AND_LINE_); + RAKNET_DEBUG_PRINTF(" -- "); + } + } + RAKNET_DEBUG_PRINTF("\n"); + } +} +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + +#endif + +// Code to test this hellish data structure. +/* +#include "DS_BPlusTree.h" +#include + +// Handle underflow on root. If there is only one item left then I can go downwards. +// Make sure I keep the leftmost pointer valid by traversing it +// When I free a leaf, be sure to adjust the pointers around it. + +#include "Rand.h" + +void main(void) +{ + DataStructures::BPlusTree btree; + DataStructures::List haveList, removedList; + int temp; + int i, j, index; + int testSize; + bool b; + + for (testSize=0; testSize < 514; testSize++) + { + RAKNET_DEBUG_PRINTF("TestSize=%i\n", testSize); + + for (i=0; i < testSize; i++) + haveList.Insert(i); + + for (i=0; i < testSize; i++) + { + index=i+randomMT()%(testSize-i); + temp=haveList[index]; + haveList[index]=haveList[i]; + haveList[i]=temp; + } + + for (i=0; i + * + * OR + * + * AVLBalancedBinarySearchTree + * + * Use the AVL balanced tree if you want the tree to be balanced after every deletion and addition. This avoids the potential + * worst case scenario where ordered input to a binary search tree gives linear search time results. It's not needed + * if input will be evenly distributed, in which case the search time is O (log n). The search time for the AVL + * balanced binary tree is O (log n) irregardless of input. + * + * Has the following member functions + * unsigned int Height() - Returns the height of the tree at the optional specified starting index. Default is the root + * add(element) - adds an element to the BinarySearchTree + * bool del(element) - deletes the node containing element if the element is in the tree as defined by a comparison with the == operator. Returns true on success, false if the element is not found + * bool IsInelement) - returns true if element is in the tree as defined by a comparison with the == operator. Otherwise returns false + * DisplayInorder(array) - Fills an array with an inorder search of the elements in the tree. USER IS REPONSIBLE FOR ALLOCATING THE ARRAY!. + * DisplayPreorder(array) - Fills an array with an preorder search of the elements in the tree. USER IS REPONSIBLE FOR ALLOCATING THE ARRAY!. + * DisplayPostorder(array) - Fills an array with an postorder search of the elements in the tree. USER IS REPONSIBLE FOR ALLOCATING THE ARRAY!. + * DisplayBreadthFirstSearch(array) - Fills an array with a breadth first search of the elements in the tree. USER IS REPONSIBLE FOR ALLOCATING THE ARRAY!. + * clear - Destroys the tree. Same as calling the destructor + * unsigned int Height() - Returns the height of the tree + * unsigned int size() - returns the size of the BinarySearchTree + * GetPointerToNode(element) - returns a pointer to the comparision element in the tree, allowing for direct modification when necessary with complex data types. + * Be warned, it is possible to corrupt the tree if the element used for comparisons is modified. Returns NULL if the item is not found + * + * + * EXAMPLE + * @code + * BinarySearchTree A; + * A.Add(10); + * A.Add(15); + * A.Add(5); + * int* array = RakNet::OP_NEW(A.Size(), _FILE_AND_LINE_ ); + * A.DisplayInorder(array); + * array[0]; // returns 5 + * array[1]; // returns 10 + * array[2]; // returns 15 + * @endcode + * compress - reallocates memory to fit the number of elements. Best used when the number of elements decreases + * + * clear - empties the BinarySearchTree and returns storage + * The assignment and copy constructors are defined + * + * \note The template type must have the copy constructor and + * assignment operator defined and must work with >, <, and == All + * elements in the tree MUST be distinct The assignment operator is + * defined between BinarySearchTree and AVLBalancedBinarySearchTree + * as long as they are of the same template type. However, passing a + * BinarySearchTree to an AVLBalancedBinarySearchTree will lose its + * structure unless it happened to be AVL balanced to begin with + * Requires queue_linked_list.cpp for the breadth first search used + * in the copy constructor, overloaded assignment operator, and + * display_breadth_first_search. + * + * + */ + template + class RAK_DLL_EXPORT BinarySearchTree + { + + public: + + struct node + { + BinarySearchTreeType* item; + node* left; + node* right; + }; + + BinarySearchTree(); + virtual ~BinarySearchTree(); + BinarySearchTree( const BinarySearchTree& original_type ); + BinarySearchTree& operator= ( const BinarySearchTree& original_copy ); + unsigned int Size( void ); + void Clear( const char *file, unsigned int line ); + unsigned int Height( node* starting_node = 0 ); + node* Add ( const BinarySearchTreeType& input, const char *file, unsigned int line ); + node* Del( const BinarySearchTreeType& input, const char *file, unsigned int line ); + bool IsIn( const BinarySearchTreeType& input ); + void DisplayInorder( BinarySearchTreeType* return_array ); + void DisplayPreorder( BinarySearchTreeType* return_array ); + void DisplayPostorder( BinarySearchTreeType* return_array ); + void DisplayBreadthFirstSearch( BinarySearchTreeType* return_array ); + BinarySearchTreeType*& GetPointerToNode( const BinarySearchTreeType& element ); + + protected: + + node* root; + + enum Direction_Types + { + NOT_FOUND, LEFT, RIGHT, ROOT + } direction; + unsigned int HeightRecursive( node* current ); + unsigned int BinarySearchTree_size; + node*& Find( const BinarySearchTreeType& element, node** parent ); + node*& FindParent( const BinarySearchTreeType& element ); + void DisplayPostorderRecursive( node* current, BinarySearchTreeType* return_array, unsigned int& index ); + void FixTree( node* current ); + + }; + + /// An AVLBalancedBinarySearchTree is a binary tree that is always balanced + template + class RAK_DLL_EXPORT AVLBalancedBinarySearchTree : public BinarySearchTree + { + + public: + AVLBalancedBinarySearchTree() {} + virtual ~AVLBalancedBinarySearchTree(); + void Add ( const BinarySearchTreeType& input ); + void Del( const BinarySearchTreeType& input ); + BinarySearchTree& operator= ( BinarySearchTree& original_copy ) + { + return BinarySearchTree::operator= ( original_copy ); + } + + private: + void BalanceTree( typename BinarySearchTree::node* current, bool rotateOnce ); + void RotateRight( typename BinarySearchTree::node *C ); + void RotateLeft( typename BinarySearchTree::node* C ); + void DoubleRotateRight( typename BinarySearchTree::node *A ); + void DoubleRotateLeft( typename BinarySearchTree::node* A ); + bool RightHigher( typename BinarySearchTree::node* A ); + bool LeftHigher( typename BinarySearchTree::node* A ); + }; + + template + void AVLBalancedBinarySearchTree::BalanceTree( typename BinarySearchTree::node* current, bool rotateOnce ) + { + int left_height, right_height; + + while ( current ) + { + if ( current->left == 0 ) + left_height = 0; + else + left_height = Height( current->left ); + + if ( current->right == 0 ) + right_height = 0; + else + right_height = Height( current->right ); + + if ( right_height - left_height == 2 ) + { + if ( RightHigher( current->right ) ) + RotateLeft( current->right ); + else + DoubleRotateLeft( current ); + + if ( rotateOnce ) + break; + } + + else + if ( right_height - left_height == -2 ) + { + if ( LeftHigher( current->left ) ) + RotateRight( current->left ); + else + DoubleRotateRight( current ); + + if ( rotateOnce ) + break; + } + + if ( current == this->root ) + break; + + current = FindParent( *( current->item ) ); + + } + } + + template + void AVLBalancedBinarySearchTree::Add ( const BinarySearchTreeType& input ) + { + + typename BinarySearchTree::node * current = BinarySearchTree::Add ( input, _FILE_AND_LINE_ ); + BalanceTree( current, true ); + } + + template + void AVLBalancedBinarySearchTree::Del( const BinarySearchTreeType& input ) + { + typename BinarySearchTree::node * current = BinarySearchTree::Del( input, _FILE_AND_LINE_ ); + BalanceTree( current, false ); + + } + + template + bool AVLBalancedBinarySearchTree::RightHigher( typename BinarySearchTree::node *A ) + { + if ( A == 0 ) + return false; + + return Height( A->right ) > Height( A->left ); + } + + template + bool AVLBalancedBinarySearchTree::LeftHigher( typename BinarySearchTree::node *A ) + { + if ( A == 0 ) + return false; + + return Height( A->left ) > Height( A->right ); + } + + template + void AVLBalancedBinarySearchTree::RotateRight( typename BinarySearchTree::node *C ) + { + typename BinarySearchTree::node * A, *B, *D; + /* + RIGHT ROTATION + + A = parent(b) + b= parent(c) + c = node to rotate around + + A + | // Either direction + B + / \ + C + / \ + D + + TO + + A + | // Either Direction + C + / \ + B + / \ + D + + + + + */ + + B = FindParent( *( C->item ) ); + A = FindParent( *( B->item ) ); + D = C->right; + + if ( A ) + { + // Direction was set by the last find_parent call + + if ( this->direction == this->LEFT ) + A->left = C; + else + A->right = C; + } + + else + this->root = C; // If B has no parent parent then B must have been the root node + + B->left = D; + + C->right = B; + } + + template + void AVLBalancedBinarySearchTree::DoubleRotateRight( typename BinarySearchTree::node *A ) + { + // The left side of the left child must be higher for the tree to balance with a right rotation. If it isn't, rotate it left before the normal rotation so it is. + RotateLeft( A->left->right ); + RotateRight( A->left ); + } + + template + void AVLBalancedBinarySearchTree::RotateLeft( typename BinarySearchTree::node *C ) + { + typename BinarySearchTree::node * A, *B, *D; + /* + RIGHT ROTATION + + A = parent(b) + b= parent(c) + c = node to rotate around + + A + | // Either direction + B + / \ + C + / \ + D + + TO + + A + | // Either Direction + C + / \ + B + / \ + D + + + + + */ + + B = FindParent( *( C->item ) ); + A = FindParent( *( B->item ) ); + D = C->left; + + if ( A ) + { + // Direction was set by the last find_parent call + + if ( this->direction == this->LEFT ) + A->left = C; + else + A->right = C; + } + + else + this->root = C; // If B has no parent parent then B must have been the root node + + B->right = D; + + C->left = B; + } + + template + void AVLBalancedBinarySearchTree::DoubleRotateLeft( typename BinarySearchTree::node *A ) + { + // The left side of the right child must be higher for the tree to balance with a left rotation. If it isn't, rotate it right before the normal rotation so it is. + RotateRight( A->right->left ); + RotateLeft( A->right ); + } + + template + AVLBalancedBinarySearchTree::~AVLBalancedBinarySearchTree() + { + this->Clear(_FILE_AND_LINE_); + } + + template + unsigned int BinarySearchTree::Size( void ) + { + return BinarySearchTree_size; + } + + template + unsigned int BinarySearchTree::Height( typename BinarySearchTree::node* starting_node ) + { + if ( BinarySearchTree_size == 0 || starting_node == 0 ) + return 0; + else + return HeightRecursive( starting_node ); + } + + // Recursively return the height of a binary tree + template + unsigned int BinarySearchTree::HeightRecursive( typename BinarySearchTree::node* current ) + { + unsigned int left_height = 0, right_height = 0; + + if ( ( current->left == 0 ) && ( current->right == 0 ) ) + return 1; // Leaf + + if ( current->left != 0 ) + left_height = 1 + HeightRecursive( current->left ); + + if ( current->right != 0 ) + right_height = 1 + HeightRecursive( current->right ); + + if ( left_height > right_height ) + return left_height; + else + return right_height; + } + + template + BinarySearchTree::BinarySearchTree() + { + BinarySearchTree_size = 0; + root = 0; + } + + template + BinarySearchTree::~BinarySearchTree() + { + this->Clear(_FILE_AND_LINE_); + } + + template + BinarySearchTreeType*& BinarySearchTree::GetPointerToNode( const BinarySearchTreeType& element ) + { + static typename BinarySearchTree::node * tempnode; + static BinarySearchTreeType* dummyptr = 0; + tempnode = Find ( element, &tempnode ); + + if ( this->direction == this->NOT_FOUND ) + return dummyptr; + + return tempnode->item; + } + + template + typename BinarySearchTree::node*& BinarySearchTree::Find( const BinarySearchTreeType& element, typename BinarySearchTree::node** parent ) + { + static typename BinarySearchTree::node * current; + + current = this->root; + *parent = 0; + this->direction = this->ROOT; + + if ( BinarySearchTree_size == 0 ) + { + this->direction = this->NOT_FOUND; + return current = 0; + } + + // Check if the item is at the root + if ( element == *( current->item ) ) + { + this->direction = this->ROOT; + return current; + } + +#ifdef _MSC_VER +#pragma warning( disable : 4127 ) // warning C4127: conditional expression is constant +#endif + while ( true ) + { + // Move pointer + + if ( element < *( current->item ) ) + { + *parent = current; + this->direction = this->LEFT; + current = current->left; + } + + else + if ( element > *( current->item ) ) + { + *parent = current; + this->direction = this->RIGHT; + current = current->right; + } + + if ( current == 0 ) + break; + + // Check if new position holds the item + if ( element == *( current->item ) ) + { + return current; + } + } + + + this->direction = this->NOT_FOUND; + return current = 0; + } + + template + typename BinarySearchTree::node*& BinarySearchTree::FindParent( const BinarySearchTreeType& element ) + { + static typename BinarySearchTree::node * parent; + Find ( element, &parent ); + return parent; + } + + // Performs a series of value swaps starting with current to fix the tree if needed + template + void BinarySearchTree::FixTree( typename BinarySearchTree::node* current ) + { + BinarySearchTreeType temp; + + while ( 1 ) + { + if ( ( ( current->left ) != 0 ) && ( *( current->item ) < *( current->left->item ) ) ) + { + // Swap the current value with the one to the left + temp = *( current->left->item ); + *( current->left->item ) = *( current->item ); + *( current->item ) = temp; + current = current->left; + } + + else + if ( ( ( current->right ) != 0 ) && ( *( current->item ) > *( current->right->item ) ) ) + { + // Swap the current value with the one to the right + temp = *( current->right->item ); + *( current->right->item ) = *( current->item ); + *( current->item ) = temp; + current = current->right; + } + + else + break; // current points to the right place so quit + } + } + + template + typename BinarySearchTree::node* BinarySearchTree::Del( const BinarySearchTreeType& input, const char *file, unsigned int line ) + { + typename BinarySearchTree::node * node_to_delete, *current, *parent; + + if ( BinarySearchTree_size == 0 ) + return 0; + + if ( BinarySearchTree_size == 1 ) + { + Clear(file, line); + return 0; + } + + node_to_delete = Find( input, &parent ); + + if ( direction == NOT_FOUND ) + return 0; // Couldn't find the element + + current = node_to_delete; + + // Replace the deleted node with the appropriate value + if ( ( current->right ) == 0 && ( current->left ) == 0 ) // Leaf node, just remove it + { + + if ( parent ) + { + if ( direction == LEFT ) + parent->left = 0; + else + parent->right = 0; + } + + RakNet::OP_DELETE(node_to_delete->item, file, line); + RakNet::OP_DELETE(node_to_delete, file, line); + BinarySearchTree_size--; + return parent; + } + else + if ( ( current->right ) != 0 && ( current->left ) == 0 ) // Node has only one child, delete it and cause the parent to point to that child + { + + if ( parent ) + { + if ( direction == RIGHT ) + parent->right = current->right; + else + parent->left = current->right; + } + + else + root = current->right; // Without a parent this must be the root node + + RakNet::OP_DELETE(node_to_delete->item, file, line); + + RakNet::OP_DELETE(node_to_delete, file, line); + + BinarySearchTree_size--; + + return parent; + } + else + if ( ( current->right ) == 0 && ( current->left ) != 0 ) // Node has only one child, delete it and cause the parent to point to that child + { + + if ( parent ) + { + if ( direction == RIGHT ) + parent->right = current->left; + else + parent->left = current->left; + } + + else + root = current->left; // Without a parent this must be the root node + + RakNet::OP_DELETE(node_to_delete->item, file, line); + + RakNet::OP_DELETE(node_to_delete, file, line); + + BinarySearchTree_size--; + + return parent; + } + else // Go right, then as left as far as you can + { + parent = current; + direction = RIGHT; + current = current->right; // Must have a right branch because the if statements above indicated that it has 2 branches + + while ( current->left ) + { + direction = LEFT; + parent = current; + current = current->left; + } + + // Replace the value held by the node to RakNet::OP_DELETE(with the value pointed to by current, _FILE_AND_LINE_); + *( node_to_delete->item ) = *( current->item ); + + // Delete current. + // If it is a leaf node just delete it + if ( current->right == 0 ) + { + if ( direction == RIGHT ) + parent->right = 0; + else + parent->left = 0; + + RakNet::OP_DELETE(current->item, file, line); + + RakNet::OP_DELETE(current, file, line); + + BinarySearchTree_size--; + + return parent; + } + + else + { + // Skip this node and make its parent point to its right branch + + if ( direction == RIGHT ) + parent->right = current->right; + else + parent->left = current->right; + + RakNet::OP_DELETE(current->item, file, line); + + RakNet::OP_DELETE(current, file, line); + + BinarySearchTree_size--; + + return parent; + } + } + } + + template + typename BinarySearchTree::node* BinarySearchTree::Add ( const BinarySearchTreeType& input, const char *file, unsigned int line ) + { + typename BinarySearchTree::node * current; + + // Add the new element to the tree according to the following alogrithm: + // 1. If the current node is empty add the new leaf + // 2. If the element is less than the current node then go down the left branch + // 3. If the element is greater than the current node then go down the right branch + + if ( BinarySearchTree_size == 0 ) + { + BinarySearchTree_size = 1; + root = RakNet::OP_NEW( file, line ); + root->item = RakNet::OP_NEW( file, line ); + *( root->item ) = input; + root->left = 0; + root->right = 0; + + return root; + } + + else + { + // start at the root + current = root; + +#ifdef _MSC_VER +#pragma warning( disable : 4127 ) // warning C4127: conditional expression is constant +#endif + while ( true ) // This loop traverses the tree to find a spot for insertion + { + + if ( input < *( current->item ) ) + { + if ( current->left == 0 ) + { + current->left = RakNet::OP_NEW( file, line ); + current->left->item = RakNet::OP_NEW( file, line ); + current = current->left; + current->left = 0; + current->right = 0; + *( current->item ) = input; + + BinarySearchTree_size++; + return current; + } + + else + { + current = current->left; + } + } + + else + if ( input > *( current->item ) ) + { + if ( current->right == 0 ) + { + current->right = RakNet::OP_NEW( file, line ); + current->right->item = RakNet::OP_NEW( file, line ); + current = current->right; + current->left = 0; + current->right = 0; + *( current->item ) = input; + + BinarySearchTree_size++; + return current; + } + + else + { + current = current->right; + } + } + + else + return 0; // ((input == current->item) == true) which is not allowed since the tree only takes discrete values. Do nothing + } + } + } + + template + bool BinarySearchTree::IsIn( const BinarySearchTreeType& input ) + { + typename BinarySearchTree::node * parent; + find( input, &parent ); + + if ( direction != NOT_FOUND ) + return true; + else + return false; + } + + + template + void BinarySearchTree::DisplayInorder( BinarySearchTreeType* return_array ) + { + typename BinarySearchTree::node * current, *parent; + bool just_printed = false; + + unsigned int index = 0; + + current = root; + + if ( BinarySearchTree_size == 0 ) + return ; // Do nothing for an empty tree + + else + if ( BinarySearchTree_size == 1 ) + { + return_array[ 0 ] = *( root->item ); + return ; + } + + + direction = ROOT; // Reset the direction + + while ( index != BinarySearchTree_size ) + { + // direction is set by the find function and holds the direction of the parent to the last node visited. It is used to prevent revisiting nodes + + if ( ( current->left != 0 ) && ( direction != LEFT ) && ( direction != RIGHT ) ) + { + // Go left if the following 2 conditions are true + // I can go left + // I did not just move up from a right child + // I did not just move up from a left child + + current = current->left; + direction = ROOT; // Reset the direction + } + + else + if ( ( direction != RIGHT ) && ( just_printed == false ) ) + { + // Otherwise, print the current node if the following 3 conditions are true: + // I did not just move up from a right child + // I did not print this ndoe last cycle + + return_array[ index++ ] = *( current->item ); + just_printed = true; + } + + else + if ( ( current->right != 0 ) && ( direction != RIGHT ) ) + { + // Otherwise, go right if the following 2 conditions are true + // I did not just move up from a right child + // I can go right + + current = current->right; + direction = ROOT; // Reset the direction + just_printed = false; + } + + else + { + // Otherwise I've done everything I can. Move up the tree one node + parent = FindParent( *( current->item ) ); + current = parent; + just_printed = false; + } + } + } + + template + void BinarySearchTree::DisplayPreorder( BinarySearchTreeType* return_array ) + { + typename BinarySearchTree::node * current, *parent; + + unsigned int index = 0; + + current = root; + + if ( BinarySearchTree_size == 0 ) + return ; // Do nothing for an empty tree + + else + if ( BinarySearchTree_size == 1 ) + { + return_array[ 0 ] = *( root->item ); + return ; + } + + + direction = ROOT; // Reset the direction + return_array[ index++ ] = *( current->item ); + + while ( index != BinarySearchTree_size ) + { + // direction is set by the find function and holds the direction of the parent to the last node visited. It is used to prevent revisiting nodes + + if ( ( current->left != 0 ) && ( direction != LEFT ) && ( direction != RIGHT ) ) + { + + current = current->left; + direction = ROOT; + + // Everytime you move a node print it + return_array[ index++ ] = *( current->item ); + } + + else + if ( ( current->right != 0 ) && ( direction != RIGHT ) ) + { + current = current->right; + direction = ROOT; + + // Everytime you move a node print it + return_array[ index++ ] = *( current->item ); + } + + else + { + // Otherwise I've done everything I can. Move up the tree one node + parent = FindParent( *( current->item ) ); + current = parent; + } + } + } + + template + inline void BinarySearchTree::DisplayPostorder( BinarySearchTreeType* return_array ) + { + unsigned int index = 0; + + if ( BinarySearchTree_size == 0 ) + return ; // Do nothing for an empty tree + + else + if ( BinarySearchTree_size == 1 ) + { + return_array[ 0 ] = *( root->item ); + return ; + } + + DisplayPostorderRecursive( root, return_array, index ); + } + + + // Recursively do a postorder traversal + template + void BinarySearchTree::DisplayPostorderRecursive( typename BinarySearchTree::node* current, BinarySearchTreeType* return_array, unsigned int& index ) + { + if ( current->left != 0 ) + DisplayPostorderRecursive( current->left, return_array, index ); + + if ( current->right != 0 ) + DisplayPostorderRecursive( current->right, return_array, index ); + + return_array[ index++ ] = *( current->item ); + + } + + + template + void BinarySearchTree::DisplayBreadthFirstSearch( BinarySearchTreeType* return_array ) + { + typename BinarySearchTree::node * current; + unsigned int index = 0; + + // Display the tree using a breadth first search + // Put the children of the current node into the queue + // Pop the queue, put its children into the queue, repeat until queue is empty + + if ( BinarySearchTree_size == 0 ) + return ; // Do nothing for an empty tree + + else + if ( BinarySearchTree_size == 1 ) + { + return_array[ 0 ] = *( root->item ); + return ; + } + + else + { + DataStructures::QueueLinkedList tree_queue; + + // Add the root of the tree I am copying from + tree_queue.Push( root ); + + do + { + current = tree_queue.Pop(); + return_array[ index++ ] = *( current->item ); + + // Add the child or children of the tree I am copying from to the queue + + if ( current->left != 0 ) + tree_queue.Push( current->left ); + + if ( current->right != 0 ) + tree_queue.Push( current->right ); + + } + + while ( tree_queue.Size() > 0 ); + } + } + + + template + BinarySearchTree::BinarySearchTree( const BinarySearchTree& original_copy ) + { + typename BinarySearchTree::node * current; + // Copy the tree using a breadth first search + // Put the children of the current node into the queue + // Pop the queue, put its children into the queue, repeat until queue is empty + + // This is a copy of the constructor. A bug in Visual C++ made it so if I just put the constructor call here the variable assignments were ignored. + BinarySearchTree_size = 0; + root = 0; + + if ( original_copy.BinarySearchTree_size == 0 ) + { + BinarySearchTree_size = 0; + } + + else + { + DataStructures::QueueLinkedList tree_queue; + + // Add the root of the tree I am copying from + tree_queue.Push( original_copy.root ); + + do + { + current = tree_queue.Pop(); + + Add ( *( current->item ), _FILE_AND_LINE_ ) + + ; + + // Add the child or children of the tree I am copying from to the queue + if ( current->left != 0 ) + tree_queue.Push( current->left ); + + if ( current->right != 0 ) + tree_queue.Push( current->right ); + + } + + while ( tree_queue.Size() > 0 ); + } + } + + template + BinarySearchTree& BinarySearchTree::operator= ( const BinarySearchTree& original_copy ) + { + typename BinarySearchTree::node * current; + + if ( ( &original_copy ) == this ) + return *this; + + Clear( _FILE_AND_LINE_ ); // Remove the current tree + + // This is a copy of the constructor. A bug in Visual C++ made it so if I just put the constructor call here the variable assignments were ignored. + BinarySearchTree_size = 0; + + root = 0; + + + // Copy the tree using a breadth first search + // Put the children of the current node into the queue + // Pop the queue, put its children into the queue, repeat until queue is empty + if ( original_copy.BinarySearchTree_size == 0 ) + { + BinarySearchTree_size = 0; + } + + else + { + DataStructures::QueueLinkedList tree_queue; + + // Add the root of the tree I am copying from + tree_queue.Push( original_copy.root ); + + do + { + current = tree_queue.Pop(); + + Add ( *( current->item ), _FILE_AND_LINE_ ) + + ; + + // Add the child or children of the tree I am copying from to the queue + if ( current->left != 0 ) + tree_queue.Push( current->left ); + + if ( current->right != 0 ) + tree_queue.Push( current->right ); + + } + + while ( tree_queue.Size() > 0 ); + } + + return *this; + } + + template + inline void BinarySearchTree::Clear ( const char *file, unsigned int line ) + { + typename BinarySearchTree::node * current, *parent; + + current = root; + + while ( BinarySearchTree_size > 0 ) + { + if ( BinarySearchTree_size == 1 ) + { + RakNet::OP_DELETE(root->item, file, line); + RakNet::OP_DELETE(root, file, line); + root = 0; + BinarySearchTree_size = 0; + } + + else + { + if ( current->left != 0 ) + { + current = current->left; + } + + else + if ( current->right != 0 ) + { + current = current->right; + } + + else // leaf + { + // Not root node so must have a parent + parent = FindParent( *( current->item ) ); + + if ( ( parent->left ) == current ) + parent->left = 0; + else + parent->right = 0; + + RakNet::OP_DELETE(current->item, file, line); + + RakNet::OP_DELETE(current, file, line); + + current = parent; + + BinarySearchTree_size--; + } + } + } + } + +} // End namespace + +#endif + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_BytePool.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_BytePool.cpp new file mode 100644 index 0000000..9d40acf --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_BytePool.cpp @@ -0,0 +1,149 @@ +#include "DS_BytePool.h" +#include "RakAssert.h" +#ifndef __APPLE__ +// Use stdlib and not malloc for compatibility +#include +#endif + +using namespace DataStructures; + +BytePool::BytePool() +{ + pool128.SetPageSize(8192*4); + pool512.SetPageSize(8192*4); + pool2048.SetPageSize(8192*4); + pool8192.SetPageSize(8192*4); +} +BytePool::~BytePool() +{ +} +void BytePool::SetPageSize(int size) +{ + pool128.SetPageSize(size); + pool512.SetPageSize(size); + pool2048.SetPageSize(size); + pool8192.SetPageSize(size); +} +unsigned char *BytePool::Allocate(int bytesWanted, const char *file, unsigned int line) +{ +#ifdef _DISABLE_BYTE_POOL + return rakMalloc_Ex(bytesWanted, _FILE_AND_LINE_); +#endif + unsigned char *out; + if (bytesWanted <= 127) + { + #ifdef _THREADSAFE_BYTE_POOL + mutex128.Lock(); + #endif + out = (unsigned char*) pool128.Allocate(file, line); + #ifdef _THREADSAFE_BYTE_POOL + mutex128.Unlock(); + #endif + out[0]=0; + return ((unsigned char*) out)+1; + } + if (bytesWanted <= 511) + { + #ifdef _THREADSAFE_BYTE_POOL + mutex512.Lock(); + #endif + out = (unsigned char*) pool512.Allocate(file, line); + #ifdef _THREADSAFE_BYTE_POOL + mutex512.Unlock(); + #endif + out[0]=1; + return ((unsigned char*) out)+1; + } + if (bytesWanted <= 2047) + { + #ifdef _THREADSAFE_BYTE_POOL + mutex2048.Lock(); + #endif + out = (unsigned char*) pool2048.Allocate(file, line); + #ifdef _THREADSAFE_BYTE_POOL + mutex2048.Unlock(); + #endif + out[0]=2; + return ((unsigned char*) out)+1; + } + if (bytesWanted <= 8191) + { + #ifdef _THREADSAFE_BYTE_POOL + mutex8192.Lock(); + #endif + out = (unsigned char*) pool8192.Allocate(file, line); + #ifdef _THREADSAFE_BYTE_POOL + mutex8192.Unlock(); + #endif + out[0]=3; + return ((unsigned char*) out)+1; + } + + out = (unsigned char*) rakMalloc_Ex(bytesWanted+1, _FILE_AND_LINE_); + out[0]=(unsigned char)255; + return out+1; +} +void BytePool::Release(unsigned char *data, const char *file, unsigned int line) +{ +#ifdef _DISABLE_BYTE_POOL + _rakFree_Ex(data, _FILE_AND_LINE_ ); +#endif + unsigned char *realData = data-1; + switch (realData[0]) + { + case 0: + #ifdef _THREADSAFE_BYTE_POOL + mutex128.Lock(); + #endif + pool128.Release((unsigned char(*)[128]) realData, file, line ); + #ifdef _THREADSAFE_BYTE_POOL + mutex128.Unlock(); + #endif + break; + case 1: + #ifdef _THREADSAFE_BYTE_POOL + mutex512.Lock(); + #endif + pool512.Release((unsigned char(*)[512]) realData, file, line ); + #ifdef _THREADSAFE_BYTE_POOL + mutex512.Unlock(); + #endif + break; + case 2: + #ifdef _THREADSAFE_BYTE_POOL + mutex2048.Lock(); + #endif + pool2048.Release((unsigned char(*)[2048]) realData, file, line ); + #ifdef _THREADSAFE_BYTE_POOL + mutex2048.Unlock(); + #endif + break; + case 3: + #ifdef _THREADSAFE_BYTE_POOL + mutex8192.Lock(); + #endif + pool8192.Release((unsigned char(*)[8192]) realData, file, line ); + #ifdef _THREADSAFE_BYTE_POOL + mutex8192.Unlock(); + #endif + break; + case 255: + rakFree_Ex(realData, file, line ); + break; + default: + RakAssert(0); + break; + } +} +void BytePool::Clear(const char *file, unsigned int line) +{ + (void) file; + (void) line; + +#ifdef _THREADSAFE_BYTE_POOL + pool128.Clear(file, line); + pool512.Clear(file, line); + pool2048.Clear(file, line); + pool8192.Clear(file, line); +#endif +} diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_BytePool.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_BytePool.h new file mode 100644 index 0000000..53eb834 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_BytePool.h @@ -0,0 +1,46 @@ +/// \file DS_BytePool.h +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#ifndef __BYTE_POOL_H +#define __BYTE_POOL_H + +#include "RakMemoryOverride.h" +#include "DS_MemoryPool.h" +#include "Export.h" +#include "SimpleMutex.h" +#include "RakAssert.h" + +// #define _DISABLE_BYTE_POOL +// #define _THREADSAFE_BYTE_POOL + +namespace DataStructures +{ + // Allocate some number of bytes from pools. Uses the heap if necessary. + class RAK_DLL_EXPORT BytePool + { + public: + BytePool(); + ~BytePool(); + // Should be at least 8 times bigger than 8192 + void SetPageSize(int size); + unsigned char* Allocate(int bytesWanted, const char *file, unsigned int line); + void Release(unsigned char *data, const char *file, unsigned int line); + void Clear(const char *file, unsigned int line); + protected: + MemoryPool pool128; + MemoryPool pool512; + MemoryPool pool2048; + MemoryPool pool8192; +#ifdef _THREADSAFE_BYTE_POOL + SimpleMutex mutex128; + SimpleMutex mutex512; + SimpleMutex mutex2048; + SimpleMutex mutex8192; +#endif + }; +} + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_ByteQueue.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_ByteQueue.cpp new file mode 100644 index 0000000..a87b7af --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_ByteQueue.cpp @@ -0,0 +1,127 @@ +#include "DS_ByteQueue.h" +#include // Memmove +#include // realloc +#include + + +using namespace DataStructures; + +ByteQueue::ByteQueue() +{ + readOffset=writeOffset=lengthAllocated=0; + data=0; +} +ByteQueue::~ByteQueue() +{ + Clear(_FILE_AND_LINE_); + + +} +void ByteQueue::WriteBytes(const char *in, unsigned length, const char *file, unsigned int line) +{ + unsigned bytesWritten; + bytesWritten=GetBytesWritten(); + if (lengthAllocated==0 || length > lengthAllocated-bytesWritten-1) + { + unsigned oldLengthAllocated=lengthAllocated; + // Always need to waste 1 byte for the math to work, else writeoffset==readoffset + unsigned newAmountToAllocate=length+oldLengthAllocated+1; + if (newAmountToAllocate<256) + newAmountToAllocate=256; + lengthAllocated=lengthAllocated + newAmountToAllocate; + data=(char*)rakRealloc_Ex(data, lengthAllocated, file, line); + if (writeOffset < readOffset) + { + if (writeOffset <= newAmountToAllocate) + { + memcpy(data + oldLengthAllocated, data, writeOffset); + writeOffset=readOffset+bytesWritten; + } + else + { + memcpy(data + oldLengthAllocated, data, newAmountToAllocate); + memmove(data, data+newAmountToAllocate, writeOffset-newAmountToAllocate); + writeOffset-=newAmountToAllocate; + } + } + } + + if (length <= lengthAllocated-writeOffset) + memcpy(data+writeOffset, in, length); + else + { + // Wrap + memcpy(data+writeOffset, in, lengthAllocated-writeOffset); + memcpy(data, in+(lengthAllocated-writeOffset), length-(lengthAllocated-writeOffset)); + } + writeOffset=(writeOffset+length) % lengthAllocated; +} +bool ByteQueue::ReadBytes(char *out, unsigned maxLengthToRead, bool peek) +{ + unsigned bytesWritten = GetBytesWritten(); + unsigned bytesToRead = bytesWritten < maxLengthToRead ? bytesWritten : maxLengthToRead; + if (bytesToRead==0) + return false; + if (writeOffset>=readOffset) + { + memcpy(out, data+readOffset, bytesToRead); + } + else + { + unsigned availableUntilWrap = lengthAllocated-readOffset; + if (bytesToRead <= availableUntilWrap) + { + memcpy(out, data+readOffset, bytesToRead); + } + else + { + memcpy(out, data+readOffset, availableUntilWrap); + memcpy(out+availableUntilWrap, data, bytesToRead-availableUntilWrap); + } + } + + if (peek==false) + IncrementReadOffset(bytesToRead); + + return true; +} +char* ByteQueue::PeekContiguousBytes(unsigned int *outLength) const +{ + if (writeOffset>=readOffset) + *outLength=writeOffset-readOffset; + else + *outLength=lengthAllocated-readOffset; + return data+readOffset; +} +void ByteQueue::Clear(const char *file, unsigned int line) +{ + if (lengthAllocated) + rakFree_Ex(data, file, line ); + readOffset=writeOffset=lengthAllocated=0; + data=0; +} +unsigned ByteQueue::GetBytesWritten(void) const +{ + if (writeOffset>=readOffset) + return writeOffset-readOffset; + else + return writeOffset+(lengthAllocated-readOffset); +} +void ByteQueue::IncrementReadOffset(unsigned length) +{ + readOffset=(readOffset+length) % lengthAllocated; +} +void ByteQueue::DecrementReadOffset(unsigned length) +{ + if (length>readOffset) + readOffset=lengthAllocated-(length-readOffset); + else + readOffset-=length; +} +void ByteQueue::Print(void) +{ + unsigned i; + for (i=readOffset; i!=writeOffset; i++) + RAKNET_DEBUG_PRINTF("%i ", data[i]); + RAKNET_DEBUG_PRINTF("\n"); +} diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_ByteQueue.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_ByteQueue.h new file mode 100644 index 0000000..a288813 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_ByteQueue.h @@ -0,0 +1,40 @@ +/// \file DS_ByteQueue.h +/// \internal +/// \brief Byte queue +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __BYTE_QUEUE_H +#define __BYTE_QUEUE_H + +#include "RakMemoryOverride.h" +#include "Export.h" + +/// The namespace DataStructures was only added to avoid compiler errors for commonly named data structures +/// As these data structures are stand-alone, you can use them outside of RakNet for your own projects if you wish. +namespace DataStructures +{ + class ByteQueue + { + public: + ByteQueue(); + ~ByteQueue(); + void WriteBytes(const char *in, unsigned length, const char *file, unsigned int line); + bool ReadBytes(char *out, unsigned maxLengthToRead, bool peek); + unsigned GetBytesWritten(void) const; + char* PeekContiguousBytes(unsigned int *outLength) const; + void IncrementReadOffset(unsigned length); + void DecrementReadOffset(unsigned length); + void Clear(const char *file, unsigned int line); + void Print(void); + + protected: + char *data; + unsigned readOffset, writeOffset, lengthAllocated; + }; +} + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_Hash.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_Hash.h new file mode 100644 index 0000000..b61d556 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_Hash.h @@ -0,0 +1,344 @@ +/// \internal +/// \brief Hashing container +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __HASH_H +#define __HASH_H + +#include "RakAssert.h" +#include // memmove +#include "Export.h" +#include "RakMemoryOverride.h" +#include "RakString.h" + +/// The namespace DataStructures was only added to avoid compiler errors for commonly named data structures +/// As these data structures are stand-alone, you can use them outside of RakNet for your own projects if you wish. +namespace DataStructures +{ + struct HashIndex + { + unsigned int primaryIndex; + unsigned int secondaryIndex; + bool IsInvalid(void) const {return primaryIndex==(unsigned int) -1;} + void SetInvalid(void) {primaryIndex=(unsigned int) -1; secondaryIndex=(unsigned int) -1;} + }; + + /// \brief Using a string as a identifier for a node, store an allocated pointer to that node + template + class RAK_DLL_EXPORT Hash + { + public: + /// Default constructor + Hash(); + + // Destructor + ~Hash(); + + void Push(key_type key, const data_type &input, const char *file, unsigned int line ); + data_type* Peek(key_type key ); + bool Pop(data_type& out, key_type key, const char *file, unsigned int line ); + bool RemoveAtIndex(HashIndex index, const char *file, unsigned int line ); + bool Remove(key_type key, const char *file, unsigned int line ); + HashIndex GetIndexOf(key_type key); + bool HasData(key_type key); + data_type& ItemAtIndex(const HashIndex &index); + key_type KeyAtIndex(const HashIndex &index); + void GetAsList(DataStructures::List &itemList,DataStructures::List &keyList,const char *file, unsigned int line) const; + unsigned int Size(void) const; + + /// \brief Clear the list + void Clear( const char *file, unsigned int line ); + + struct Node + { + Node(key_type strIn, const data_type &_data) {string=strIn; data=_data;} + key_type string; + data_type data; + // Next in the list for this key + Node *next; + }; + + protected: + void ClearIndex(unsigned int index,const char *file, unsigned int line); + Node **nodeList; + unsigned int size; + }; + + template + Hash::Hash() + { + nodeList=0; + size=0; + } + + template + Hash::~Hash() + { + Clear(_FILE_AND_LINE_); + } + + template + void Hash::Push(key_type key, const data_type &input, const char *file, unsigned int line ) + { + unsigned long hashIndex = (*hashFunction)(key) % HASH_SIZE; + if (nodeList==0) + { + nodeList=RakNet::OP_NEW_ARRAY(HASH_SIZE,file,line); + memset(nodeList,0,sizeof(Node *)*HASH_SIZE); + } + + Node *newNode=RakNet::OP_NEW_2(file,line,key,input); + newNode->next=nodeList[hashIndex]; + nodeList[hashIndex]=newNode; + + size++; + } + + template + data_type* Hash::Peek(key_type key ) + { + unsigned long hashIndex = (*hashFunction)(key) % HASH_SIZE; + Node *node = nodeList[hashIndex]; + while (node!=0) + { + if (node->string==key) + return &node->data; + node=node->next; + } + return 0; + } + + template + bool Hash::Pop(data_type& out, key_type key, const char *file, unsigned int line ) + { + unsigned long hashIndex = (*hashFunction)(key) % HASH_SIZE; + Node *node = nodeList[hashIndex]; + if (node==0) + return false; + if (node->next==0) + { + // Only one item. + if (node->string==key) + { + // Delete last item + out=node->data; + ClearIndex(hashIndex,_FILE_AND_LINE_); + return true; + } + else + { + // Single item doesn't match + return false; + } + } + else if (node->string==key) + { + // First item does match, but more than one item + out=node->data; + nodeList[hashIndex]=node->next; + RakNet::OP_DELETE(node,file,line); + size--; + return true; + } + + Node *last=node; + node=node->next; + + while (node!=0) + { + // First item does not match, but subsequent item might + if (node->string==key) + { + out=node->data; + // Skip over subsequent item + last->next=node->next; + // Delete existing item + RakNet::OP_DELETE(node,file,line); + size--; + return true; + } + last=node; + node=node->next; + } + return false; + } + + template + bool Hash::RemoveAtIndex(HashIndex index, const char *file, unsigned int line ) + { + if (index.IsInvalid()) + return false; + + Node *node = nodeList[index.primaryIndex]; + if (node==0) + return false; + if (node->next==0) + { + // Delete last item + ClearIndex(index.primaryIndex,file,line); + return true; + } + else if (index.secondaryIndex==0) + { + // First item does match, but more than one item + nodeList[index.primaryIndex]=node->next; + RakNet::OP_DELETE(node,file,line); + size--; + return true; + } + + Node *last=node; + node=node->next; + --index.secondaryIndex; + + while (index.secondaryIndex!=0) + { + last=node; + node=node->next; + --index.secondaryIndex; + } + + // Skip over subsequent item + last->next=node->next; + // Delete existing item + RakNet::OP_DELETE(node,file,line); + size--; + return true; + } + + template + bool Hash::Remove(key_type key, const char *file, unsigned int line ) + { + return RemoveAtIndex(GetIndexOf(key),file,line); + } + + template + HashIndex Hash::GetIndexOf(key_type key) + { + if (nodeList==0) + { + HashIndex temp; + temp.SetInvalid(); + return temp; + } + HashIndex idx; + idx.primaryIndex=(*hashFunction)(key) % HASH_SIZE; + Node *node = nodeList[idx.primaryIndex]; + if (node==0) + { + idx.SetInvalid(); + return idx; + } + idx.secondaryIndex=0; + while (node!=0) + { + if (node->string==key) + { + return idx; + } + node=node->next; + idx.secondaryIndex++; + } + + idx.SetInvalid(); + return idx; + } + + template + bool Hash::HasData(key_type key) + { + return GetIndexOf(key).IsInvalid()==false; + } + + template + data_type& Hash::ItemAtIndex(const HashIndex &index) + { + Node *node = nodeList[index.primaryIndex]; + RakAssert(node); + unsigned int i; + for (i=0; i < index.secondaryIndex; i++) + { + node=node->next; + RakAssert(node); + } + return node->data; + } + + template + key_type Hash::KeyAtIndex(const HashIndex &index) + { + Node *node = nodeList[index.primaryIndex]; + RakAssert(node); + unsigned int i; + for (i=0; i < index.secondaryIndex; i++) + { + node=node->next; + RakAssert(node); + } + return node->string; + } + + template + void Hash::Clear(const char *file, unsigned int line) + { + if (nodeList) + { + unsigned int i; + for (i=0; i < HASH_SIZE; i++) + ClearIndex(i,file,line); + RakNet::OP_DELETE_ARRAY(nodeList,file,line); + nodeList=0; + size=0; + } + } + + template + void Hash::ClearIndex(unsigned int index,const char *file, unsigned int line) + { + Node *node = nodeList[index]; + Node *next; + while (node) + { + next=node->next; + RakNet::OP_DELETE(node,file,line); + node=next; + size--; + } + nodeList[index]=0; + } + + template + void Hash::GetAsList(DataStructures::List &itemList,DataStructures::List &keyList,const char *file, unsigned int line) const + { + if (nodeList==0) + return; + itemList.Clear(false,_FILE_AND_LINE_); + keyList.Clear(false,_FILE_AND_LINE_); + + Node *node; + unsigned int i; + for (i=0; i < HASH_SIZE; i++) + { + if (nodeList[i]) + { + node=nodeList[i]; + while (node) + { + itemList.Push(node->data,file,line); + keyList.Push(node->string,file,line); + node=node->next; + } + } + } + } + template + unsigned int Hash::Size(void) const + { + return size; + } +} +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_Heap.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_Heap.h new file mode 100644 index 0000000..6551b84 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_Heap.h @@ -0,0 +1,297 @@ +/// \file DS_Heap.h +/// \internal +/// \brief Heap (Also serves as a priority queue) +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __RAKNET_HEAP_H +#define __RAKNET_HEAP_H + +#include "RakMemoryOverride.h" +#include "DS_List.h" +#include "Export.h" +#include "RakAssert.h" + +#ifdef _MSC_VER +#pragma warning( push ) +#endif + +/// The namespace DataStructures was only added to avoid compiler errors for commonly named data structures +/// As these data structures are stand-alone, you can use them outside of RakNet for your own projects if you wish. +namespace DataStructures +{ + template + class RAK_DLL_EXPORT Heap + { + public: + struct HeapNode + { + HeapNode() {} + HeapNode(const weight_type &w, const data_type &d) : weight(w), data(d) {} + weight_type weight; // I'm assuming key is a native numerical type - float or int + data_type data; + }; + + Heap(); + ~Heap(); + void Push(const weight_type &weight, const data_type &data, const char *file, unsigned int line); + /// Call before calling PushSeries, for a new series of items + void StartSeries(void) {optimizeNextSeriesPush=false;} + /// If you are going to push a list of items, where the weights of the items on the list are in order and follow the heap order, PushSeries is faster than Push() + void PushSeries(const weight_type &weight, const data_type &data, const char *file, unsigned int line); + data_type Pop(const unsigned startingIndex); + data_type Peek(const unsigned startingIndex=0) const; + weight_type PeekWeight(const unsigned startingIndex=0) const; + void Clear(bool doNotDeallocateSmallBlocks, const char *file, unsigned int line); + data_type& operator[] ( const unsigned int position ) const; + unsigned Size(void) const; + + protected: + unsigned LeftChild(const unsigned i) const; + unsigned RightChild(const unsigned i) const; + unsigned Parent(const unsigned i) const; + void Swap(const unsigned i, const unsigned j); + DataStructures::List heap; + bool optimizeNextSeriesPush; + }; + + template + Heap::Heap() + { + optimizeNextSeriesPush=false; + } + + template + Heap::~Heap() + { + //Clear(true, _FILE_AND_LINE_); + } + + template + void Heap::PushSeries(const weight_type &weight, const data_type &data, const char *file, unsigned int line) + { + if (optimizeNextSeriesPush==false) + { + // If the weight of what we are inserting is greater than / less than in order of the heap of every sibling and sibling of parent, then can optimize next push + unsigned currentIndex = heap.Size(); + unsigned parentIndex; + if (currentIndex>0) + { + for (parentIndex = Parent(currentIndex); parentIndex < currentIndex; parentIndex++) + { +#ifdef _MSC_VER +#pragma warning(disable:4127) // conditional expression is constant +#endif + if (isMaxHeap) + { + // Every child is less than its parent + if (weight>heap[parentIndex].weight) + { + // Can't optimize + Push(weight,data,file,line); + return; + } + } + else + { + // Every child is greater than than its parent + if (weight + void Heap::Push(const weight_type &weight, const data_type &data, const char *file, unsigned int line) + { + unsigned currentIndex = heap.Size(); + unsigned parentIndex; + heap.Insert(HeapNode(weight, data), file, line); + while (currentIndex!=0) + { + parentIndex = Parent(currentIndex); +#ifdef _MSC_VER +#pragma warning( disable : 4127 ) // warning C4127: conditional expression is constant +#endif + if (isMaxHeap) + { + if (heap[parentIndex].weight < weight) + { + Swap(currentIndex, parentIndex); + currentIndex=parentIndex; + } + else + break; + } + else + { + if (heap[parentIndex].weight > weight) + { + Swap(currentIndex, parentIndex); + currentIndex=parentIndex; + } + else + break; + } + } + } + + template + data_type Heap::Pop(const unsigned startingIndex) + { + // While we have children, swap out with the larger of the two children. + + // This line will assert on an empty heap + data_type returnValue=heap[startingIndex].data; + + // Move the last element to the head, and re-heapify + heap[startingIndex]=heap[heap.Size()-1]; + + unsigned currentIndex,leftChild,rightChild; + weight_type currentWeight; + currentIndex=startingIndex; + currentWeight=heap[startingIndex].weight; + heap.RemoveFromEnd(); + +#ifdef _MSC_VER +#pragma warning( disable : 4127 ) // warning C4127: conditional expression is constant +#endif + while (1) + { + leftChild=LeftChild(currentIndex); + rightChild=RightChild(currentIndex); + if (leftChild >= heap.Size()) + { + // Done + return returnValue; + } + if (rightChild >= heap.Size()) + { + // Only left node. + if ((isMaxHeap==true && currentWeight < heap[leftChild].weight) || + (isMaxHeap==false && currentWeight > heap[leftChild].weight)) + Swap(leftChild, currentIndex); + + return returnValue; + } + else + { + // Swap with the bigger/smaller of the two children and continue + if (isMaxHeap) + { + if (heap[leftChild].weight <= currentWeight && heap[rightChild].weight <= currentWeight) + return returnValue; + + if (heap[leftChild].weight > heap[rightChild].weight) + { + Swap(leftChild, currentIndex); + currentIndex=leftChild; + } + else + { + Swap(rightChild, currentIndex); + currentIndex=rightChild; + } + } + else + { + if (heap[leftChild].weight >= currentWeight && heap[rightChild].weight >= currentWeight) + return returnValue; + + if (heap[leftChild].weight < heap[rightChild].weight) + { + Swap(leftChild, currentIndex); + currentIndex=leftChild; + } + else + { + Swap(rightChild, currentIndex); + currentIndex=rightChild; + } + } + } + } + } + + template + inline data_type Heap::Peek(const unsigned startingIndex) const + { + return heap[startingIndex].data; + } + + template + inline weight_type Heap::PeekWeight(const unsigned startingIndex) const + { + return heap[startingIndex].weight; + } + + template + void Heap::Clear(bool doNotDeallocateSmallBlocks, const char *file, unsigned int line) + { + heap.Clear(doNotDeallocateSmallBlocks, file, line); + } + + template + inline data_type& Heap::operator[] ( const unsigned int position ) const + { + return heap[position].data; + } + template + unsigned Heap::Size(void) const + { + return heap.Size(); + } + + template + inline unsigned Heap::LeftChild(const unsigned i) const + { + return i*2+1; + } + + template + inline unsigned Heap::RightChild(const unsigned i) const + { + return i*2+2; + } + + template + inline unsigned Heap::Parent(const unsigned i) const + { +#ifdef _DEBUG + RakAssert(i!=0); +#endif + return (i-1)/2; + } + + template + void Heap::Swap(const unsigned i, const unsigned j) + { + HeapNode temp; + temp=heap[i]; + heap[i]=heap[j]; + heap[j]=temp; + } +} + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_HuffmanEncodingTree.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_HuffmanEncodingTree.cpp new file mode 100644 index 0000000..abca294 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_HuffmanEncodingTree.cpp @@ -0,0 +1,299 @@ +/// \file +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#include "DS_HuffmanEncodingTree.h" +#include "DS_Queue.h" +#include "BitStream.h" +#include "RakAssert.h" + +#ifdef _MSC_VER +#pragma warning( push ) +#endif + +using namespace RakNet; + +HuffmanEncodingTree::HuffmanEncodingTree() +{ + root = 0; +} + +HuffmanEncodingTree::~HuffmanEncodingTree() +{ + FreeMemory(); +} + +void HuffmanEncodingTree::FreeMemory( void ) +{ + if ( root == 0 ) + return ; + + // Use an in-order traversal to delete the tree + DataStructures::Queue nodeQueue; + + HuffmanEncodingTreeNode *node; + + nodeQueue.Push( root, _FILE_AND_LINE_ ); + + while ( nodeQueue.Size() > 0 ) + { + node = nodeQueue.Pop(); + + if ( node->left ) + nodeQueue.Push( node->left, _FILE_AND_LINE_ ); + + if ( node->right ) + nodeQueue.Push( node->right, _FILE_AND_LINE_ ); + + RakNet::OP_DELETE(node, _FILE_AND_LINE_); + } + + // Delete the encoding table + for ( int i = 0; i < 256; i++ ) + rakFree_Ex(encodingTable[ i ].encoding, _FILE_AND_LINE_ ); + + root = 0; +} + + +////#include + +// Given a frequency table of 256 elements, all with a frequency of 1 or more, generate the tree +void HuffmanEncodingTree::GenerateFromFrequencyTable( unsigned int frequencyTable[ 256 ] ) +{ + int counter; + HuffmanEncodingTreeNode * node; + HuffmanEncodingTreeNode *leafList[ 256 ]; // Keep a copy of the pointers to all the leaves so we can generate the encryption table bottom-up, which is easier + // 1. Make 256 trees each with a weight equal to the frequency of the corresponding character + DataStructures::LinkedList huffmanEncodingTreeNodeList; + + FreeMemory(); + + for ( counter = 0; counter < 256; counter++ ) + { + node = RakNet::OP_NEW( _FILE_AND_LINE_ ); + node->left = 0; + node->right = 0; + node->value = (unsigned char) counter; + node->weight = frequencyTable[ counter ]; + + if ( node->weight == 0 ) + node->weight = 1; // 0 weights are illegal + + leafList[ counter ] = node; // Used later to generate the encryption table + + InsertNodeIntoSortedList( node, &huffmanEncodingTreeNodeList ); // Insert and maintain sort order. + } + + + // 2. While there is more than one tree, take the two smallest trees and merge them so that the two trees are the left and right + // children of a new node, where the new node has the weight the sum of the weight of the left and right child nodes. +#ifdef _MSC_VER +#pragma warning( disable : 4127 ) // warning C4127: conditional expression is constant +#endif + while ( 1 ) + { + huffmanEncodingTreeNodeList.Beginning(); + HuffmanEncodingTreeNode *lesser, *greater; + lesser = huffmanEncodingTreeNodeList.Pop(); + greater = huffmanEncodingTreeNodeList.Pop(); + node = RakNet::OP_NEW( _FILE_AND_LINE_ ); + node->left = lesser; + node->right = greater; + node->weight = lesser->weight + greater->weight; + lesser->parent = node; // This is done to make generating the encryption table easier + greater->parent = node; // This is done to make generating the encryption table easier + + if ( huffmanEncodingTreeNodeList.Size() == 0 ) + { + // 3. Assign the one remaining node in the list to the root node. + root = node; + root->parent = 0; + break; + } + + // Put the new node back into the list at the correct spot to maintain the sort. Linear search time + InsertNodeIntoSortedList( node, &huffmanEncodingTreeNodeList ); + } + + bool tempPath[ 256 ]; // Maximum path length is 256 + unsigned short tempPathLength; + HuffmanEncodingTreeNode *currentNode; + RakNet::BitStream bitStream; + + // Generate the encryption table. From before, we have an array of pointers to all the leaves which contain pointers to their parents. + // This can be done more efficiently but this isn't bad and it's way easier to program and debug + + for ( counter = 0; counter < 256; counter++ ) + { + // Already done at the end of the loop and before it! + tempPathLength = 0; + + // Set the current node at the leaf + currentNode = leafList[ counter ]; + + do + { + if ( currentNode->parent->left == currentNode ) // We're storing the paths in reverse order.since we are going from the leaf to the root + tempPath[ tempPathLength++ ] = false; + else + tempPath[ tempPathLength++ ] = true; + + currentNode = currentNode->parent; + } + + while ( currentNode != root ); + + // Write to the bitstream in the reverse order that we stored the path, which gives us the correct order from the root to the leaf + while ( tempPathLength-- > 0 ) + { + if ( tempPath[ tempPathLength ] ) // Write 1's and 0's because writing a bool will write the BitStream TYPE_CHECKING validation bits if that is defined along with the actual data bit, which is not what we want + bitStream.Write1(); + else + bitStream.Write0(); + } + + // Read data from the bitstream, which is written to the encoding table in bits and bitlength. Note this function allocates the encodingTable[counter].encoding pointer + encodingTable[ counter ].bitLength = ( unsigned char ) bitStream.CopyData( &encodingTable[ counter ].encoding ); + + // Reset the bitstream for the next iteration + bitStream.Reset(); + } +} + +// Pass an array of bytes to array and a preallocated BitStream to receive the output +void HuffmanEncodingTree::EncodeArray( unsigned char *input, size_t sizeInBytes, RakNet::BitStream * output ) +{ + unsigned counter; + + // For each input byte, Write out the corresponding series of 1's and 0's that give the encoded representation + for ( counter = 0; counter < sizeInBytes; counter++ ) + { + output->WriteBits( encodingTable[ input[ counter ] ].encoding, encodingTable[ input[ counter ] ].bitLength, false ); // Data is left aligned + } + + // Byte align the output so the unassigned remaining bits don't equate to some actual value + if ( output->GetNumberOfBitsUsed() % 8 != 0 ) + { + // Find an input that is longer than the remaining bits. Write out part of it to pad the output to be byte aligned. + unsigned char remainingBits = (unsigned char) ( 8 - ( output->GetNumberOfBitsUsed() % 8 ) ); + + for ( counter = 0; counter < 256; counter++ ) + if ( encodingTable[ counter ].bitLength > remainingBits ) + { + output->WriteBits( encodingTable[ counter ].encoding, remainingBits, false ); // Data is left aligned + break; + } + +#ifdef _DEBUG + RakAssert( counter != 256 ); // Given 256 elements, we should always be able to find an input that would be >= 7 bits + +#endif + + } +} + +unsigned HuffmanEncodingTree::DecodeArray( RakNet::BitStream * input, BitSize_t sizeInBits, size_t maxCharsToWrite, unsigned char *output ) +{ + HuffmanEncodingTreeNode * currentNode; + + unsigned outputWriteIndex; + outputWriteIndex = 0; + currentNode = root; + + // For each bit, go left if it is a 0 and right if it is a 1. When we reach a leaf, that gives us the desired value and we restart from the root + + for ( unsigned counter = 0; counter < sizeInBits; counter++ ) + { + if ( input->ReadBit() == false ) // left! + currentNode = currentNode->left; + else + currentNode = currentNode->right; + + if ( currentNode->left == 0 && currentNode->right == 0 ) // Leaf + { + + if ( outputWriteIndex < maxCharsToWrite ) + output[ outputWriteIndex ] = currentNode->value; + + outputWriteIndex++; + + currentNode = root; + } + } + + return outputWriteIndex; +} + +// Pass an array of encoded bytes to array and a preallocated BitStream to receive the output +void HuffmanEncodingTree::DecodeArray( unsigned char *input, BitSize_t sizeInBits, RakNet::BitStream * output ) +{ + HuffmanEncodingTreeNode * currentNode; + + if ( sizeInBits <= 0 ) + return ; + + RakNet::BitStream bitStream( input, BITS_TO_BYTES(sizeInBits), false ); + + currentNode = root; + + // For each bit, go left if it is a 0 and right if it is a 1. When we reach a leaf, that gives us the desired value and we restart from the root + for ( unsigned counter = 0; counter < sizeInBits; counter++ ) + { + if ( bitStream.ReadBit() == false ) // left! + currentNode = currentNode->left; + else + currentNode = currentNode->right; + + if ( currentNode->left == 0 && currentNode->right == 0 ) // Leaf + { + output->WriteBits( &( currentNode->value ), sizeof( char ) * 8, true ); // Use WriteBits instead of Write(char) because we want to avoid TYPE_CHECKING + currentNode = root; + } + } +} + +// Insertion sort. Slow but easy to write in this case +void HuffmanEncodingTree::InsertNodeIntoSortedList( HuffmanEncodingTreeNode * node, DataStructures::LinkedList *huffmanEncodingTreeNodeList ) const +{ + if ( huffmanEncodingTreeNodeList->Size() == 0 ) + { + huffmanEncodingTreeNodeList->Insert( node ); + return ; + } + + huffmanEncodingTreeNodeList->Beginning(); + + unsigned counter = 0; +#ifdef _MSC_VER +#pragma warning( disable : 4127 ) // warning C4127: conditional expression is constant +#endif + while ( 1 ) + { + if ( huffmanEncodingTreeNodeList->Peek()->weight < node->weight ) + ++( *huffmanEncodingTreeNodeList ); + else + { + huffmanEncodingTreeNodeList->Insert( node ); + break; + } + + // Didn't find a spot in the middle - add to the end + if ( ++counter == huffmanEncodingTreeNodeList->Size() ) + { + huffmanEncodingTreeNodeList->End(); + + huffmanEncodingTreeNodeList->Add( node ) + + ; // Add to the end + break; + } + } +} + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_HuffmanEncodingTree.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_HuffmanEncodingTree.h new file mode 100644 index 0000000..645f285 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_HuffmanEncodingTree.h @@ -0,0 +1,67 @@ +/// \file DS_HuffmanEncodingTree.h +/// \brief \b [Internal] Generates a huffman encoding tree, used for string and global compression. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __HUFFMAN_ENCODING_TREE +#define __HUFFMAN_ENCODING_TREE + +#include "RakMemoryOverride.h" +#include "DS_HuffmanEncodingTreeNode.h" +#include "BitStream.h" +#include "Export.h" +#include "DS_LinkedList.h" + +namespace RakNet +{ + +/// This generates special cases of the huffman encoding tree using 8 bit keys with the additional condition that unused combinations of 8 bits are treated as a frequency of 1 +class RAK_DLL_EXPORT HuffmanEncodingTree +{ + +public: + HuffmanEncodingTree(); + ~HuffmanEncodingTree(); + + /// \brief Pass an array of bytes to array and a preallocated BitStream to receive the output. + /// \param [in] input Array of bytes to encode + /// \param [in] sizeInBytes size of \a input + /// \param [out] output The bitstream to write to + void EncodeArray( unsigned char *input, size_t sizeInBytes, RakNet::BitStream * output ); + + // \brief Decodes an array encoded by EncodeArray(). + unsigned DecodeArray( RakNet::BitStream * input, BitSize_t sizeInBits, size_t maxCharsToWrite, unsigned char *output ); + void DecodeArray( unsigned char *input, BitSize_t sizeInBits, RakNet::BitStream * output ); + + /// \brief Given a frequency table of 256 elements, all with a frequency of 1 or more, generate the tree. + void GenerateFromFrequencyTable( unsigned int frequencyTable[ 256 ] ); + + /// \brief Free the memory used by the tree. + void FreeMemory( void ); + +private: + + /// The root node of the tree + + HuffmanEncodingTreeNode *root; + + /// Used to hold bit encoding for one character + + + struct CharacterEncoding + { + unsigned char* encoding; + unsigned short bitLength; + }; + + CharacterEncoding encodingTable[ 256 ]; + + void InsertNodeIntoSortedList( HuffmanEncodingTreeNode * node, DataStructures::LinkedList *huffmanEncodingTreeNodeList ) const; +}; + +} // namespace RakNet + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_HuffmanEncodingTreeFactory.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_HuffmanEncodingTreeFactory.h new file mode 100644 index 0000000..eab9c7b --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_HuffmanEncodingTreeFactory.h @@ -0,0 +1,57 @@ +/// \file DS_HuffmanEncodingTreeFactory.h +/// \internal +/// \brief Creates instances of the class HuffmanEncodingTree +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __HUFFMAN_ENCODING_TREE_FACTORY +#define __HUFFMAN_ENCODING_TREE_FACTORY + +#include "RakMemoryOverride.h" + +namespace RakNet { +/// Forward declarations +class HuffmanEncodingTree; + +/// \brief Creates instances of the class HuffmanEncodingTree +/// \details This class takes a frequency table and given that frequence table, will generate an instance of HuffmanEncodingTree +class HuffmanEncodingTreeFactory +{ +public: + /// Default constructor + HuffmanEncodingTreeFactory(); + + /// \brief Reset the frequency table. + /// \details You don't need to call this unless you want to reuse the class for a new tree + void Reset( void ); + + /// \brief Pass an array of bytes to this to add those elements to the frequency table. + /// \param[in] array the data to insert into the frequency table + /// \param[in] size the size of the data to insert + void AddToFrequencyTable( unsigned char *array, int size ); + + /// \brief Copies the frequency table to the array passed. Retrieve the frequency table. + /// \param[in] _frequency The frequency table used currently + void GetFrequencyTable( unsigned int _frequency[ 256 ] ); + + /// \brief Returns the frequency table as a pointer. + /// \return the address of the frenquency table + unsigned int * GetFrequencyTable( void ); + + /// \brief Generate a HuffmanEncodingTree. + /// \details You can also use GetFrequencyTable and GenerateFromFrequencyTable in the tree itself + /// \return The generated instance of HuffmanEncodingTree + HuffmanEncodingTree * GenerateTree( void ); + +private: + + /// Frequency table + unsigned int frequency[ 256 ]; +}; + +} // namespace RakNet + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_HuffmanEncodingTreeNode.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_HuffmanEncodingTreeNode.h new file mode 100644 index 0000000..f726e4f --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_HuffmanEncodingTreeNode.h @@ -0,0 +1,21 @@ +/// \file +/// \brief \b [Internal] A single node in the Huffman Encoding Tree. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __HUFFMAN_ENCODING_TREE_NODE +#define __HUFFMAN_ENCODING_TREE_NODE + +struct HuffmanEncodingTreeNode +{ + unsigned char value; + unsigned weight; + HuffmanEncodingTreeNode *left; + HuffmanEncodingTreeNode *right; + HuffmanEncodingTreeNode *parent; +}; + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_LinkedList.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_LinkedList.h new file mode 100644 index 0000000..be9548e --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_LinkedList.h @@ -0,0 +1,1252 @@ +/// \file DS_LinkedList.h +/// \internal +/// \brief Straightforward linked list data structure. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __LINKED_LIST_H +#define __LINKED_LIST_H + +#include "Export.h" +#include "RakMemoryOverride.h" + +#ifdef _MSC_VER +#pragma warning( push ) +#endif + +/// The namespace DataStructures was only added to avoid compiler errors for commonly named data structures +/// As these data structures are stand-alone, you can use them outside of RakNet for your own projects if you wish. +namespace DataStructures +{ + // Prototype to prevent error in CircularLinkedList class when a reference is made to a LinkedList class + template + class RAK_DLL_EXPORT LinkedList; + + /** + * \brief (Circular) Linked List ADT (Doubly Linked Pointer to Node Style) - + * + * \details + * By Kevin Jenkins (http://www.rakkar.org) + * Initilize with the following command + * LinkedList + * OR + * CircularLinkedList + * + * Has the following member functions + * - size: returns number of elements in the linked list + * - insert(item): inserts @em item at the current position in + * the LinkedList. + * - add(item): inserts @em item after the current position in + * the LinkedList. Does not increment the position + * - replace(item): replaces the element at the current position @em item. + * - peek: returns the element at the current position + * - pop: returns the element at the current position and deletes it + * - del: deletes the current element. Does nothing for an empty list. + * - clear: empties the LinkedList and returns storage + * - bool IsInitem): Does a linear search for @em item. Does not set + * the position to it, only returns true on item found, false otherwise + * - bool find(item): Does a linear search for @em item and sets the current + * position to point to it if and only if the item is found. Returns true + * on item found, false otherwise + * - sort: Sorts the elements of the list with a mergesort and sets the + * current pointer to the first element + * - concatenate(list L): This appends L to the current list + * - ++(prefix): moves the pointer one element up in the list and returns the + * appropriate copy of the element in the list + * - --(prefix): moves the pointer one element back in the list and returns + * the appropriate copy of the element in the list + * - beginning - moves the pointer to the start of the list. For circular + * linked lists this is first 'position' created. You should call this + * after the sort function to read the first value. + * - end - moves the pointer to the end of the list. For circular linked + * lists this is one less than the first 'position' created + * The assignment and copy constructor operators are defined + * + * \note + * 1. LinkedList and CircularLinkedList are exactly the same except LinkedList + * won't let you wrap around the root and lets you jump to two positions + * relative to the root/ + * 2. Postfix ++ and -- can be used but simply call the prefix versions. + * + * + * EXAMPLE: + * @code + * LinkedList A; // Creates a Linked List of integers called A + * CircularLinkedList B; // Creates a Circular Linked List of + * // integers called B + * + * A.Insert(20); // Adds 20 to A. A: 20 - current is 20 + * A.Insert(5); // Adds 5 to A. A: 5 20 - current is 5 + * A.Insert(1); // Adds 1 to A. A: 1 5 20 - current is 1 + * + * A.IsIn1); // returns true + * A.IsIn200); // returns false + * A.Find(5); // returns true and sets current to 5 + * A.Peek(); // returns 5 + * A.Find(1); // returns true and sets current to 1 + * + * (++A).Peek(); // Returns 5 + * A.Peek(); // Returns 5 + * + * A.Replace(10); // Replaces 5 with 10. + * A.Peek(); // Returns 10 + * + * A.Beginning(); // Current points to the beginning of the list at 1 + * + * (++A).Peek(); // Returns 5 + * A.Peek(); // Returns 10 + * + * A.Del(); // Deletes 10. Current points to the next element, which is 20 + * A.Peek(); // Returns 20 + * + * A.Beginning(); // Current points to the beginning of the list at 1 + * + * (++A).Peek(); // Returns 5 + * A.Peek(); // Returns 20 + * + * A.Clear(_FILE_AND_LINE_); // Deletes all nodes in A + * + * A.Insert(5); // A: 5 - current is 5 + * A.Insert(6); // A: 6 5 - current is 6 + * A.Insert(7); // A: 7 6 5 - current is 7 + * + * A.Clear(_FILE_AND_LINE_); + * B.Clear(_FILE_AND_LINE_); + * + * B.Add(10); + * B.Add(20); + * B.Add(30); + * B.Add(5); + * B.Add(2); + * B.Add(25); + * // Sorts the numbers in the list and sets the current pointer to the + * // first element + * B.sort(); + * + * // Postfix ++ just calls the prefix version and has no functional + * // difference. + * B.Peek(); // Returns 2 + * B++; + * B.Peek(); // Returns 5 + * B++; + * B.Peek(); // Returns 10 + * B++; + * B.Peek(); // Returns 20 + * B++; + * B.Peek(); // Returns 25 + * B++; + * B.Peek(); // Returns 30 + * @endcode + */ + template + + class CircularLinkedList + { + + public: + + struct node + { + CircularLinkedListType item; + + node* previous; + node* next; + }; + + CircularLinkedList(); + ~CircularLinkedList(); + CircularLinkedList( const CircularLinkedList& original_copy ); + // CircularLinkedList(LinkedList original_copy) {CircularLinkedList(original_copy);} // Converts linked list to circular type + bool operator= ( const CircularLinkedList& original_copy ); + CircularLinkedList& operator++(); // CircularLinkedList A; ++A; + CircularLinkedList& operator++( int ); // Circular_Linked List A; A++; + CircularLinkedList& operator--(); // CircularLinkedList A; --A; + CircularLinkedList& operator--( int ); // Circular_Linked List A; A--; + bool IsIn( const CircularLinkedListType& input ); + bool Find( const CircularLinkedListType& input ); + void Insert( const CircularLinkedListType& input ); + + CircularLinkedListType& Add ( const CircularLinkedListType& input ) + + ; // Adds after the current position + void Replace( const CircularLinkedListType& input ); + + void Del( void ); + + unsigned int Size( void ); + + CircularLinkedListType& Peek( void ); + + CircularLinkedListType Pop( void ); + + void Clear( void ); + + void Sort( void ); + + void Beginning( void ); + + void End( void ); + + void Concatenate( const CircularLinkedList& L ); + + protected: + unsigned int list_size; + + node *root; + + node *position; + + node* FindPointer( const CircularLinkedListType& input ); + + private: + CircularLinkedList Merge( CircularLinkedList L1, CircularLinkedList L2 ); + + CircularLinkedList Mergesort( const CircularLinkedList& L ); + }; + + template + + class LinkedList : public CircularLinkedList + { + + public: + LinkedList() + {} + + LinkedList( const LinkedList& original_copy ); + ~LinkedList(); + bool operator= ( const LinkedList& original_copy ); + LinkedList& operator++(); // LinkedList A; ++A; + LinkedList& operator++( int ); // Linked List A; A++; + LinkedList& operator--(); // LinkedList A; --A; + LinkedList& operator--( int ); // Linked List A; A--; + + private: + LinkedList Merge( LinkedList L1, LinkedList L2 ); + LinkedList Mergesort( const LinkedList& L ); + + }; + + + template + inline void CircularLinkedList::Beginning( void ) + { + if ( this->root ) + this->position = this->root; + } + + template + inline void CircularLinkedList::End( void ) + { + if ( this->root ) + this->position = this->root->previous; + } + + template + bool LinkedList::operator= ( const LinkedList& original_copy ) + { + typename LinkedList::node * original_copy_pointer, *last, *save_position; + + if ( ( &original_copy ) != this ) + { + + this->Clear(); + + + if ( original_copy.list_size == 0 ) + { + this->root = 0; + this->position = 0; + this->list_size = 0; + } + + else + if ( original_copy.list_size == 1 ) + { + this->root = RakNet::OP_NEW( _FILE_AND_LINE_ ); + // root->item = RakNet::OP_NEW( _FILE_AND_LINE_ ); + this->root->next = this->root; + this->root->previous = this->root; + this->list_size = 1; + this->position = this->root; + // *(root->item)=*((original_copy.root)->item); + this->root->item = original_copy.root->item; + } + + else + { + // Setup the first part of the root node + original_copy_pointer = original_copy.root; + this->root = RakNet::OP_NEW( _FILE_AND_LINE_ ); + // root->item = RakNet::OP_NEW( _FILE_AND_LINE_ ); + this->position = this->root; + // *(root->item)=*((original_copy.root)->item); + this->root->item = original_copy.root->item; + + if ( original_copy_pointer == original_copy.position ) + save_position = this->position; + + do + { + + + // Save the current element + last = this->position; + + // Point to the next node in the source list + original_copy_pointer = original_copy_pointer->next; + + // Create a new node and point position to it + this->position = RakNet::OP_NEW( _FILE_AND_LINE_ ); + // position->item = RakNet::OP_NEW( _FILE_AND_LINE_ ); + + // Copy the item to the new node + // *(position->item)=*(original_copy_pointer->item); + this->position->item = original_copy_pointer->item; + + if ( original_copy_pointer == original_copy.position ) + save_position = this->position; + + + // Set the previous pointer for the new node + ( this->position->previous ) = last; + + // Set the next pointer for the old node to the new node + ( last->next ) = this->position; + + } + + while ( ( original_copy_pointer->next ) != ( original_copy.root ) ); + + // Complete the circle. Set the next pointer of the newest node to the root and the previous pointer of the root to the newest node + this->position->next = this->root; + + this->root->previous = this->position; + + this->list_size = original_copy.list_size; + + this->position = save_position; + } + } + + return true; + } + + + template + CircularLinkedList::CircularLinkedList() + { + this->root = 0; + this->position = 0; + this->list_size = 0; + } + + template + CircularLinkedList::~CircularLinkedList() + { + this->Clear(); + } + + template + LinkedList::~LinkedList() + { + this->Clear(); + } + + template + LinkedList::LinkedList( const LinkedList& original_copy ) + { + typename LinkedList::node * original_copy_pointer, *last, *save_position; + + if ( original_copy.list_size == 0 ) + { + this->root = 0; + this->position = 0; + this->list_size = 0; + return ; + } + + else + if ( original_copy.list_size == 1 ) + { + this->root = RakNet::OP_NEW( _FILE_AND_LINE_ ); + // root->item = RakNet::OP_NEW( _FILE_AND_LINE_ ); + this->root->next = this->root; + this->root->previous = this->root; + this->list_size = 1; + this->position = this->root; + // *(root->item) = *((original_copy.root)->item); + this->root->item = original_copy.root->item; + } + + else + { + // Setup the first part of the root node + original_copy_pointer = original_copy.root; + this->root = RakNet::OP_NEW( _FILE_AND_LINE_ ); + // root->item = RakNet::OP_NEW( _FILE_AND_LINE_ ); + this->position = this->root; + // *(root->item)=*((original_copy.root)->item); + this->root->item = original_copy.root->item; + + if ( original_copy_pointer == original_copy.position ) + save_position = this->position; + + do + { + // Save the current element + last = this->position; + + // Point to the next node in the source list + original_copy_pointer = original_copy_pointer->next; + + // Create a new node and point position to it + this->position = RakNet::OP_NEW( _FILE_AND_LINE_ ); + // position->item = RakNet::OP_NEW( _FILE_AND_LINE_ ); + + // Copy the item to the new node + // *(position->item)=*(original_copy_pointer->item); + this->position->item = original_copy_pointer->item; + + if ( original_copy_pointer == original_copy.position ) + save_position = this->position; + + // Set the previous pointer for the new node + ( this->position->previous ) = last; + + // Set the next pointer for the old node to the new node + ( last->next ) = this->position; + + } + + while ( ( original_copy_pointer->next ) != ( original_copy.root ) ); + + // Complete the circle. Set the next pointer of the newest node to the root and the previous pointer of the root to the newest node + this->position->next = this->root; + + this->root->previous = this->position; + + this->list_size = original_copy.list_size; + + this->position = save_position; + } + } + +#ifdef _MSC_VER +#pragma warning( disable : 4701 ) // warning C4701: local variable may be used without having been initialized +#endif + template + CircularLinkedList::CircularLinkedList( const CircularLinkedList& original_copy ) + { + node * original_copy_pointer; + node *last; + node *save_position; + + if ( original_copy.list_size == 0 ) + { + this->root = 0; + this->position = 0; + this->list_size = 0; + return ; + } + + else + if ( original_copy.list_size == 1 ) + { + this->root = RakNet::OP_NEW( _FILE_AND_LINE_ ); + // root->item = RakNet::OP_NEW( _FILE_AND_LINE_ ); + this->root->next = this->root; + this->root->previous = this->root; + this->list_size = 1; + this->position = this->root; + // *(root->item) = *((original_copy.root)->item); + this->root->item = original_copy.root->item; + } + + else + { + // Setup the first part of the root node + original_copy_pointer = original_copy.root; + this->root = RakNet::OP_NEW( _FILE_AND_LINE_ ); + // root->item = RakNet::OP_NEW( _FILE_AND_LINE_ ); + this->position = this->root; + // *(root->item)=*((original_copy.root)->item); + this->root->item = original_copy.root->item; + + if ( original_copy_pointer == original_copy.position ) + save_position = this->position; + + do + { + + + // Save the current element + last = this->position; + + // Point to the next node in the source list + original_copy_pointer = original_copy_pointer->next; + + // Create a new node and point position to it + this->position = RakNet::OP_NEW( _FILE_AND_LINE_ ); + // position->item = RakNet::OP_NEW( _FILE_AND_LINE_ ); + + // Copy the item to the new node + // *(position->item)=*(original_copy_pointer->item); + this->position->item = original_copy_pointer->item; + + if ( original_copy_pointer == original_copy.position ) + save_position = position; + + // Set the previous pointer for the new node + ( this->position->previous ) = last; + + // Set the next pointer for the old node to the new node + ( last->next ) = this->position; + + } + + while ( ( original_copy_pointer->next ) != ( original_copy.root ) ); + + // Complete the circle. Set the next pointer of the newest node to the root and the previous pointer of the root to the newest node + this->position->next = this->root; + + this->root->previous = position; + + this->list_size = original_copy.list_size; + + this->position = save_position; + } + } + +#ifdef _MSC_VER +#pragma warning( disable : 4701 ) // warning C4701: local variable may be used without having been initialized +#endif + template + bool CircularLinkedList::operator= ( const CircularLinkedList& original_copy ) + { + node * original_copy_pointer; + node *last; + node *save_position; + + if ( ( &original_copy ) != this ) + { + + this->Clear(); + + + if ( original_copy.list_size == 0 ) + { + this->root = 0; + this->position = 0; + this->list_size = 0; + } + + else + if ( original_copy.list_size == 1 ) + { + this->root = RakNet::OP_NEW( _FILE_AND_LINE_ ); + // root->item = RakNet::OP_NEW( _FILE_AND_LINE_ ); + this->root->next = this->root; + this->root->previous = this->root; + this->list_size = 1; + this->position = this->root; + // *(root->item)=*((original_copy.root)->item); + this->root->item = original_copy.root->item; + } + + else + { + // Setup the first part of the root node + original_copy_pointer = original_copy.root; + this->root = RakNet::OP_NEW( _FILE_AND_LINE_ ); + // root->item = RakNet::OP_NEW( _FILE_AND_LINE_ ); + this->position = this->root; + // *(root->item)=*((original_copy.root)->item); + this->root->item = original_copy.root->item; + + if ( original_copy_pointer == original_copy.position ) + save_position = this->position; + + do + { + // Save the current element + last = this->position; + + // Point to the next node in the source list + original_copy_pointer = original_copy_pointer->next; + + // Create a new node and point position to it + this->position = RakNet::OP_NEW( _FILE_AND_LINE_ ); + // position->item = RakNet::OP_NEW( _FILE_AND_LINE_ ); + + // Copy the item to the new node + // *(position->item)=*(original_copy_pointer->item); + this->position->item = original_copy_pointer->item; + + if ( original_copy_pointer == original_copy.position ) + save_position = this->position; + + // Set the previous pointer for the new node + ( this->position->previous ) = last; + + // Set the next pointer for the old node to the new node + ( last->next ) = this->position; + + } + + while ( ( original_copy_pointer->next ) != ( original_copy.root ) ); + + // Complete the circle. Set the next pointer of the newest node to the root and the previous pointer of the root to the newest node + this->position->next = this->root; + + this->root->previous = this->position; + + this->list_size = original_copy.list_size; + + this->position = save_position; + } + } + + return true; + } + + template + void CircularLinkedList::Insert( const CircularLinkedListType& input ) + { + node * new_node; + + if ( list_size == 0 ) + { + this->root = RakNet::OP_NEW( _FILE_AND_LINE_ ); + // root->item = RakNet::OP_NEW( _FILE_AND_LINE_ ); + //*(root->item)=input; + this->root->item = input; + this->root->next = this->root; + this->root->previous = this->root; + this->list_size = 1; + this->position = this->root; + } + + else + if ( list_size == 1 ) + { + this->position = RakNet::OP_NEW( _FILE_AND_LINE_ ); + // position->item = RakNet::OP_NEW( _FILE_AND_LINE_ ); + this->root->next = this->position; + this->root->previous = this->position; + this->position->previous = this->root; + this->position->next = this->root; + // *(position->item)=input; + this->position->item = input; + this->root = this->position; // Since we're inserting into a 1 element list the old root is now the second item + this->list_size = 2; + } + + else + { + /* + + B + | + A --- C + + position->previous=A + new_node=B + position=C + + Note that the order of the following statements is important */ + + new_node = RakNet::OP_NEW( _FILE_AND_LINE_ ); + // new_node->item = RakNet::OP_NEW( _FILE_AND_LINE_ ); + + // *(new_node->item)=input; + new_node->item = input; + + // Point next of A to B + ( this->position->previous ) ->next = new_node; + + // Point last of B to A + new_node->previous = this->position->previous; + + // Point last of C to B + this->position->previous = new_node; + + // Point next of B to C + new_node->next = this->position; + + // Since the root pointer is bound to a node rather than an index this moves it back if you insert an element at the root + + if ( this->position == this->root ) + { + this->root = new_node; + this->position = this->root; + } + + // Increase the recorded size of the list by one + this->list_size++; + } + } + + template + CircularLinkedListType& CircularLinkedList::Add ( const CircularLinkedListType& input ) + { + node * new_node; + + if ( this->list_size == 0 ) + { + this->root = RakNet::OP_NEW( _FILE_AND_LINE_ ); + // root->item = RakNet::OP_NEW( _FILE_AND_LINE_ ); + // *(root->item)=input; + this->root->item = input; + this->root->next = this->root; + this->root->previous = this->root; + this->list_size = 1; + this->position = this->root; + // return *(position->item); + return this->position->item; + } + + else + if ( list_size == 1 ) + { + this->position = RakNet::OP_NEW( _FILE_AND_LINE_ ); + // position->item = RakNet::OP_NEW( _FILE_AND_LINE_ ); + this->root->next = this->position; + this->root->previous = this->position; + this->position->previous = this->root; + this->position->next = this->root; + // *(position->item)=input; + this->position->item = input; + this->list_size = 2; + this->position = this->root; // Don't move the position from the root + // return *(position->item); + return this->position->item; + } + + else + { + /* + + B + | + A --- C + + new_node=B + position=A + position->next=C + + Note that the order of the following statements is important */ + + new_node = RakNet::OP_NEW( _FILE_AND_LINE_ ); + // new_node->item = RakNet::OP_NEW( _FILE_AND_LINE_ ); + + // *(new_node->item)=input; + new_node->item = input; + + // Point last of B to A + new_node->previous = this->position; + + // Point next of B to C + new_node->next = ( this->position->next ); + + // Point last of C to B + ( this->position->next ) ->previous = new_node; + + // Point next of A to B + ( this->position->next ) = new_node; + + // Increase the recorded size of the list by one + this->list_size++; + + // return *(new_node->item); + return new_node->item; + } + } + + template + inline void CircularLinkedList::Replace( const CircularLinkedListType& input ) + { + if ( this->list_size > 0 ) + // *(position->item)=input; + this->position->item = input; + } + + template + void CircularLinkedList::Del() + { + node * new_position; + + if ( this->list_size == 0 ) + return ; + + else + if ( this->list_size == 1 ) + { + // RakNet::OP_DELETE(root->item, _FILE_AND_LINE_); + RakNet::OP_DELETE(this->root, _FILE_AND_LINE_); + this->root = this->position = 0; + this->list_size = 0; + } + + else + { + ( this->position->previous ) ->next = this->position->next; + ( this->position->next ) ->previous = this->position->previous; + new_position = this->position->next; + + if ( this->position == this->root ) + this->root = new_position; + + // RakNet::OP_DELETE(position->item, _FILE_AND_LINE_); + RakNet::OP_DELETE(this->position, _FILE_AND_LINE_); + + this->position = new_position; + + this->list_size--; + } + } + + template + bool CircularLinkedList::IsIn(const CircularLinkedListType& input ) + { + node * return_value, *old_position; + + old_position = this->position; + + return_value = FindPointer( input ); + this->position = old_position; + + if ( return_value != 0 ) + return true; + else + return false; // Can't find the item don't do anything + } + + template + bool CircularLinkedList::Find( const CircularLinkedListType& input ) + { + node * return_value; + + return_value = FindPointer( input ); + + if ( return_value != 0 ) + { + this->position = return_value; + return true; + } + + else + return false; // Can't find the item don't do anything + } + + template + typename CircularLinkedList::node* CircularLinkedList::FindPointer( const CircularLinkedListType& input ) + { + node * current; + + if ( this->list_size == 0 ) + return 0; + + current = this->root; + + // Search for the item starting from the root node and incrementing the pointer after every check + // If you wind up pointing at the root again you looped around the list so didn't find the item, in which case return 0 + do + { + // if (*(current->item) == input) return current; + + if ( current->item == input ) + return current; + + current = current->next; + } + + while ( current != this->root ); + + return 0; + + } + + template + inline unsigned int CircularLinkedList::Size( void ) + { + return this->list_size; + } + + template + inline CircularLinkedListType& CircularLinkedList::Peek( void ) + { + // return *(position->item); + return this->position->item; + } + + template + CircularLinkedListType CircularLinkedList::Pop( void ) + { + CircularLinkedListType element; + element = Peek(); + Del(); + return CircularLinkedListType( element ); // return temporary + } + + // Prefix + template + CircularLinkedList& CircularLinkedList::operator++() + { + if ( this->list_size != 0 ) + position = position->next; + + return *this; + } + + /* + // Postfix + template + CircularLinkedList& CircularLinkedList::operator++(int) + { + CircularLinkedList before; + before=*this; + operator++(); + return before; + } + */ + + template + CircularLinkedList& CircularLinkedList::operator++( int ) + { + return this->operator++(); + } + + // Prefix + template + CircularLinkedList& CircularLinkedList::operator--() + { + if ( this->list_size != 0 ) + this->position = this->position->previous; + + return *this; + } + + /* + // Postfix + template + CircularLinkedList& CircularLinkedList::operator--(int) + { + CircularLinkedList before; + before=*this; + operator--(); + return before; + } + */ + + template + CircularLinkedList& CircularLinkedList::operator--( int ) + { + return this->operator--(); + } + + template + void CircularLinkedList::Clear( void ) + { + if ( this->list_size == 0 ) + return ; + else + if ( this->list_size == 1 ) // {RakNet::OP_DELETE(root->item); RakNet::OP_DELETE(root, _FILE_AND_LINE_);} + { + RakNet::OP_DELETE(this->root, _FILE_AND_LINE_); + } + + else + { + node* current; + node* temp; + + current = this->root; + + do + { + temp = current; + current = current->next; + // RakNet::OP_DELETE(temp->item, _FILE_AND_LINE_); + RakNet::OP_DELETE(temp, _FILE_AND_LINE_); + } + + while ( current != this->root ); + } + + this->list_size = 0; + this->root = 0; + this->position = 0; + } + + template + inline void CircularLinkedList::Concatenate( const CircularLinkedList& L ) + { + unsigned int counter; + node* ptr; + + if ( L.list_size == 0 ) + return ; + + if ( this->list_size == 0 ) + * this = L; + + ptr = L.root; + + this->position = this->root->previous; + + // Cycle through each element in L and add it to the current list + for ( counter = 0; counter < L.list_size; counter++ ) + { + // Add item after the current item pointed to + // add(*(ptr->item)); + + Add ( ptr->item ); + + // Update pointers. Moving ptr keeps the current pointer at the end of the list since the add function does not move the pointer + ptr = ptr->next; + + this->position = this->position->next; + } + } + + template + inline void CircularLinkedList::Sort( void ) + { + if ( this->list_size <= 1 ) + return ; + + // Call equal operator to assign result of mergesort to current object + *this = Mergesort( *this ); + + this->position = this->root; + } + + template + CircularLinkedList CircularLinkedList::Mergesort( const CircularLinkedList& L ) + { + unsigned int counter; + node* location; + CircularLinkedList L1; + CircularLinkedList L2; + + location = L.root; + + // Split the list into two equal size sublists, L1 and L2 + + for ( counter = 0; counter < L.list_size / 2; counter++ ) + { + // L1.add (*(location->item)); + L1.Add ( location->item ); + location = location->next; + } + + for ( ;counter < L.list_size; counter++ ) + { + // L2.Add(*(location->item)); + L2.Add ( location->item ); + location = location->next; + } + + // Recursively sort the sublists + if ( L1.list_size > 1 ) + L1 = Mergesort( L1 ); + + if ( L2.list_size > 1 ) + L2 = Mergesort( L2 ); + + // Merge the two sublists + return Merge( L1, L2 ); + } + + template + CircularLinkedList CircularLinkedList::Merge( CircularLinkedList L1, CircularLinkedList L2 ) + { + CircularLinkedList X; + CircularLinkedListType element; + L1.position = L1.root; + L2.position = L2.root; + + // While neither list is empty + + while ( ( L1.list_size != 0 ) && ( L2.list_size != 0 ) ) + { + // Compare the first items of L1 and L2 + // Remove the smaller of the two items from the list + + if ( ( ( L1.root ) ->item ) < ( ( L2.root ) ->item ) ) + // if ((*((L1.root)->item)) < (*((L2.root)->item))) + { + // element = *((L1.root)->item); + element = ( L1.root ) ->item; + L1.Del(); + } + else + { + // element = *((L2.root)->item); + element = ( L2.root ) ->item; + L2.Del(); + } + + // Add this item to the end of X + X.Add( element ); + + X++; + } + + // Add the remaining list to X + if ( L1.list_size != 0 ) + X.Concatenate( L1 ); + else + X.Concatenate( L2 ); + + return X; + } + + template + LinkedList LinkedList::Mergesort( const LinkedList& L ) + { + unsigned int counter; + typename LinkedList::node* location; + LinkedList L1; + LinkedList L2; + + location = L.root; + + // Split the list into two equal size sublists, L1 and L2 + + for ( counter = 0; counter < L.LinkedList_size / 2; counter++ ) + { + // L1.add (*(location->item)); + L1.Add ( location->item ); + location = location->next; + } + + for ( ;counter < L.LinkedList_size; counter++ ) + { + // L2.Add(*(location->item)); + L2.Add ( location->item ); + location = location->next; + } + + // Recursively sort the sublists + if ( L1.list_size > 1 ) + L1 = Mergesort( L1 ); + + if ( L2.list_size > 1 ) + L2 = Mergesort( L2 ); + + // Merge the two sublists + return Merge( L1, L2 ); + } + + template + LinkedList LinkedList::Merge( LinkedList L1, LinkedList L2 ) + { + LinkedList X; + LinkedListType element; + L1.position = L1.root; + L2.position = L2.root; + + // While neither list is empty + + while ( ( L1.LinkedList_size != 0 ) && ( L2.LinkedList_size != 0 ) ) + { + // Compare the first items of L1 and L2 + // Remove the smaller of the two items from the list + + if ( ( ( L1.root ) ->item ) < ( ( L2.root ) ->item ) ) + // if ((*((L1.root)->item)) < (*((L2.root)->item))) + { + element = ( L1.root ) ->item; + // element = *((L1.root)->item); + L1.Del(); + } + else + { + element = ( L2.root ) ->item; + // element = *((L2.root)->item); + L2.Del(); + } + + // Add this item to the end of X + X.Add( element ); + } + + // Add the remaining list to X + if ( L1.LinkedList_size != 0 ) + X.concatenate( L1 ); + else + X.concatenate( L2 ); + + return X; + } + + + // Prefix + template + LinkedList& LinkedList::operator++() + { + if ( ( this->list_size != 0 ) && ( this->position->next != this->root ) ) + this->position = this->position->next; + + return *this; + } + + /* + // Postfix + template + LinkedList& LinkedList::operator++(int) + { + LinkedList before; + before=*this; + operator++(); + return before; + } + */ + // Postfix + template + LinkedList& LinkedList::operator++( int ) + { + return this->operator++(); + } + + // Prefix + template + LinkedList& LinkedList::operator--() + { + if ( ( this->list_size != 0 ) && ( this->position != this->root ) ) + this->position = this->position->previous; + + return *this; + } + + /* + // Postfix + template + LinkedList& LinkedList::operator--(int) + { + LinkedList before; + before=*this; + operator--(); + return before; + } + */ + + // Postfix + template + LinkedList& LinkedList::operator--( int ) + { + return this->operator--(); + } + +} // End namespace + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_List.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_List.h new file mode 100644 index 0000000..f99d411 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_List.h @@ -0,0 +1,518 @@ +/// \file DS_List.h +/// \internal +/// \brief Array based list. +/// \details Usually the Queue class is used instead, since it has all the same functionality and is only worse at random access. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __LIST_H +#define __LIST_H + +#include "RakAssert.h" +#include // memmove +#include "Export.h" +#include "RakMemoryOverride.h" + +/// Maximum unsigned long +static const unsigned int MAX_UNSIGNED_LONG = 4294967295U; + +/// The namespace DataStructures was only added to avoid compiler errors for commonly named data structures +/// As these data structures are stand-alone, you can use them outside of RakNet for your own projects if you wish. +namespace DataStructures +{ + /// \brief Array based implementation of a list. + /// \note ONLY USE THIS FOR SHALLOW COPIES. I don't bother with operator= to improve performance. + template + class RAK_DLL_EXPORT List + { + public: + /// Default constructor + List(); + + // Destructor + ~List(); + + /// \brief Copy constructor. + /// \param[in] original_copy The list to duplicate + List( const List& original_copy ); + + /// \brief Assign one list to another. + List& operator= ( const List& original_copy ); + + /// \brief Access an element by its index in the array. + /// \param[in] position The index into the array. + /// \return The element at position \a position. + list_type& operator[] ( const unsigned int position ) const; + + /// \brief Access an element by its index in the array. + /// \param[in] position The index into the array. + /// \return The element at position \a position. + list_type& Get ( const unsigned int position ) const; + + /// \brief Push an element at the end of the stack. + /// \param[in] input The new element. + void Push(const list_type &input, const char *file, unsigned int line ); + + /// \brief Pop an element from the end of the stack. + /// \pre Size()>0 + /// \return The element at the end. + list_type& Pop(void); + + /// \brief Insert an element at position \a position in the list. + /// \param[in] input The new element. + /// \param[in] position The position of the new element. + void Insert( const list_type &input, const unsigned int position, const char *file, unsigned int line ); + + /// \brief Insert at the end of the list. + /// \param[in] input The new element. + void Insert( const list_type &input, const char *file, unsigned int line ); + + /// \brief Replace the value at \a position by \a input. + /// \details If the size of the list is less than @em position, it increase the capacity of + /// the list and fill slot with @em filler. + /// \param[in] input The element to replace at position @em position. + /// \param[in] filler The element use to fill new allocated capacity. + /// \param[in] position The position of input in the list. + void Replace( const list_type &input, const list_type filler, const unsigned int position, const char *file, unsigned int line ); + + /// \brief Replace the last element of the list by \a input. + /// \param[in] input The element used to replace the last element. + void Replace( const list_type &input ); + + /// \brief Delete the element at position \a position. + /// \param[in] position The index of the element to delete + void RemoveAtIndex( const unsigned int position ); + + /// \brief Delete the element at position \a position. + /// \note - swaps middle with end of list, only use if list order does not matter + /// \param[in] position The index of the element to delete + void RemoveAtIndexFast( const unsigned int position ); + + /// \brief Delete the element at the end of the list. + void RemoveFromEnd(const unsigned num=1); + + /// \brief Returns the index of the specified item or MAX_UNSIGNED_LONG if not found. + /// \param[in] input The element to check for + /// \return The index or position of @em input in the list. + /// \retval MAX_UNSIGNED_LONG The object is not in the list + /// \retval [Integer] The index of the element in the list + unsigned int GetIndexOf( const list_type &input ) const; + + /// \return The number of elements in the list + unsigned int Size( void ) const; + + /// \brief Clear the list + void Clear( bool doNotDeallocateSmallBlocks, const char *file, unsigned int line ); + + /// \brief Preallocate the list, so it needs fewer reallocations at runtime. + void Preallocate( unsigned countNeeded, const char *file, unsigned int line ); + + /// \brief Frees overallocated members, to use the minimum memory necessary. + /// \attention + /// This is a slow operation + void Compress( const char *file, unsigned int line ); + + private: + /// An array of user values + list_type* listArray; + + /// Number of elements in the list + unsigned int list_size; + + /// Size of \a array + unsigned int allocation_size; + }; + template + List::List() + { + allocation_size = 0; + listArray = 0; + list_size = 0; + } + + template + List::~List() + { + if (allocation_size>0) + RakNet::OP_DELETE_ARRAY(listArray, _FILE_AND_LINE_); + } + + + template + List::List( const List& original_copy ) + { + // Allocate memory for copy + + if ( original_copy.list_size == 0 ) + { + list_size = 0; + allocation_size = 0; + } + else + { + listArray = RakNet::OP_NEW_ARRAY( original_copy.list_size , _FILE_AND_LINE_ ); + + for ( unsigned int counter = 0; counter < original_copy.list_size; ++counter ) + listArray[ counter ] = original_copy.listArray[ counter ]; + + // Don't call constructors, assignment operators, etc. + //memcpy(listArray, original_copy.listArray, original_copy.list_size*sizeof(list_type)); + + list_size = allocation_size = original_copy.list_size; + } + } + + template + List& List::operator= ( const List& original_copy ) + { + if ( ( &original_copy ) != this ) + { + Clear( false, _FILE_AND_LINE_ ); + + // Allocate memory for copy + + if ( original_copy.list_size == 0 ) + { + list_size = 0; + allocation_size = 0; + } + + else + { + listArray = RakNet::OP_NEW_ARRAY( original_copy.list_size , _FILE_AND_LINE_ ); + + for ( unsigned int counter = 0; counter < original_copy.list_size; ++counter ) + listArray[ counter ] = original_copy.listArray[ counter ]; + // Don't call constructors, assignment operators, etc. + //memcpy(listArray, original_copy.listArray, original_copy.list_size*sizeof(list_type)); + + list_size = allocation_size = original_copy.list_size; + } + } + + return *this; + } + + + template + inline list_type& List::operator[] ( const unsigned int position ) const + { + #ifdef _DEBUG + if (position>=list_size) + { + RakAssert ( position < list_size ); + } + #endif + return listArray[ position ]; + } + + // Just here for debugging + template + inline list_type& List::Get ( const unsigned int position ) const + { + return listArray[ position ]; + } + + template + void List::Push(const list_type &input, const char *file, unsigned int line) + { + Insert(input, file, line); + } + + template + inline list_type& List::Pop(void) + { +#ifdef _DEBUG + RakAssert(list_size>0); +#endif + --list_size; + return listArray[list_size]; + } + + template + void List::Insert( const list_type &input, const unsigned int position, const char *file, unsigned int line ) + { +#ifdef _DEBUG + if (position>list_size) + { + RakAssert( position <= list_size ); + } +#endif + + // Reallocate list if necessary + if ( list_size == allocation_size ) + { + // allocate twice the currently allocated memory + list_type * new_array; + + if ( allocation_size == 0 ) + allocation_size = 16; + else + allocation_size *= 2; + + new_array = RakNet::OP_NEW_ARRAY( allocation_size , file, line ); + + // copy old array over + for ( unsigned int counter = 0; counter < list_size; ++counter ) + new_array[ counter ] = listArray[ counter ]; + + // Don't call constructors, assignment operators, etc. + //memcpy(new_array, listArray, list_size*sizeof(list_type)); + + // set old array to point to the newly allocated and twice as large array + RakNet::OP_DELETE_ARRAY(listArray, file, line); + + listArray = new_array; + } + + // Move the elements in the list to make room + for ( unsigned int counter = list_size; counter != position; counter-- ) + listArray[ counter ] = listArray[ counter - 1 ]; + + // Don't call constructors, assignment operators, etc. + //memmove(listArray+position+1, listArray+position, (list_size-position)*sizeof(list_type)); + + // Insert the new item at the correct spot + listArray[ position ] = input; + + ++list_size; + + } + + + template + void List::Insert( const list_type &input, const char *file, unsigned int line ) + { + // Reallocate list if necessary + + if ( list_size == allocation_size ) + { + // allocate twice the currently allocated memory + list_type * new_array; + + if ( allocation_size == 0 ) + allocation_size = 16; + else + allocation_size *= 2; + + new_array = RakNet::OP_NEW_ARRAY( allocation_size , file, line ); + + if (listArray) + { + // copy old array over + for ( unsigned int counter = 0; counter < list_size; ++counter ) + new_array[ counter ] = listArray[ counter ]; + + // Don't call constructors, assignment operators, etc. + //memcpy(new_array, listArray, list_size*sizeof(list_type)); + + // set old array to point to the newly allocated and twice as large array + RakNet::OP_DELETE_ARRAY(listArray, file, line); + } + + listArray = new_array; + } + + // Insert the new item at the correct spot + listArray[ list_size ] = input; + + ++list_size; + } + + template + inline void List::Replace( const list_type &input, const list_type filler, const unsigned int position, const char *file, unsigned int line ) + { + if ( ( list_size > 0 ) && ( position < list_size ) ) + { + // Direct replacement + listArray[ position ] = input; + } + else + { + if ( position >= allocation_size ) + { + // Reallocate the list to size position and fill in blanks with filler + list_type * new_array; + allocation_size = position + 1; + + new_array = RakNet::OP_NEW_ARRAY( allocation_size , file, line ); + + // copy old array over + + for ( unsigned int counter = 0; counter < list_size; ++counter ) + new_array[ counter ] = listArray[ counter ]; + + // Don't call constructors, assignment operators, etc. + //memcpy(new_array, listArray, list_size*sizeof(list_type)); + + // set old array to point to the newly allocated array + RakNet::OP_DELETE_ARRAY(listArray, file, line); + + listArray = new_array; + } + + // Fill in holes with filler + while ( list_size < position ) + listArray[ list_size++ ] = filler; + + // Fill in the last element with the new item + listArray[ list_size++ ] = input; + +#ifdef _DEBUG + + RakAssert( list_size == position + 1 ); + +#endif + + } + } + + template + inline void List::Replace( const list_type &input ) + { + if ( list_size > 0 ) + listArray[ list_size - 1 ] = input; + } + + template + void List::RemoveAtIndex( const unsigned int position ) + { +#ifdef _DEBUG + if (position >= list_size) + { + RakAssert( position < list_size ); + return; + } +#endif + + if ( position < list_size ) + { + // Compress the array + for ( unsigned int counter = position; counter < list_size - 1 ; ++counter ) + listArray[ counter ] = listArray[ counter + 1 ]; + // Don't call constructors, assignment operators, etc. + // memmove(listArray+position, listArray+position+1, (list_size-1-position) * sizeof(list_type)); + + RemoveFromEnd(); + } + } + + template + void List::RemoveAtIndexFast( const unsigned int position ) + { +#ifdef _DEBUG + if (position >= list_size) + { + RakAssert( position < list_size ); + return; + } +#endif + --list_size; + listArray[position]=listArray[list_size]; + } + + template + inline void List::RemoveFromEnd( const unsigned num ) + { + // Delete the last elements on the list. No compression needed +#ifdef _DEBUG + RakAssert(list_size>=num); +#endif + list_size-=num; + } + + template + unsigned int List::GetIndexOf( const list_type &input ) const + { + for ( unsigned int i = 0; i < list_size; ++i ) + if ( listArray[ i ] == input ) + return i; + + return MAX_UNSIGNED_LONG; + } + + template + inline unsigned int List::Size( void ) const + { + return list_size; + } + + template + void List::Clear( bool doNotDeallocateSmallBlocks, const char *file, unsigned int line ) + { + if ( allocation_size == 0 ) + return; + + if (allocation_size>512 || doNotDeallocateSmallBlocks==false) + { + RakNet::OP_DELETE_ARRAY(listArray, file, line); + allocation_size = 0; + listArray = 0; + } + list_size = 0; + } + + template + void List::Compress( const char *file, unsigned int line ) + { + list_type * new_array; + + if ( allocation_size == 0 ) + return ; + + new_array = RakNet::OP_NEW_ARRAY( allocation_size , file, line ); + + // copy old array over + for ( unsigned int counter = 0; counter < list_size; ++counter ) + new_array[ counter ] = listArray[ counter ]; + + // Don't call constructors, assignment operators, etc. + //memcpy(new_array, listArray, list_size*sizeof(list_type)); + + // set old array to point to the newly allocated array + RakNet::OP_DELETE_ARRAY(listArray, file, line); + + listArray = new_array; + } + + template + void List::Preallocate( unsigned countNeeded, const char *file, unsigned int line ) + { + unsigned amountToAllocate = allocation_size; + if (allocation_size==0) + amountToAllocate=16; + while (amountToAllocate < countNeeded) + amountToAllocate<<=1; + + if ( allocation_size < amountToAllocate) + { + // allocate twice the currently allocated memory + list_type * new_array; + + allocation_size=amountToAllocate; + + new_array = RakNet::OP_NEW_ARRAY< list_type >( allocation_size , file, line ); + + if (listArray) + { + // copy old array over + for ( unsigned int counter = 0; counter < list_size; ++counter ) + new_array[ counter ] = listArray[ counter ]; + + // Don't call constructors, assignment operators, etc. + //memcpy(new_array, listArray, list_size*sizeof(list_type)); + + // set old array to point to the newly allocated and twice as large array + RakNet::OP_DELETE_ARRAY(listArray, file, line); + } + + listArray = new_array; + } + } + +} // End namespace + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_Map.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_Map.h new file mode 100644 index 0000000..7905de1 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_Map.h @@ -0,0 +1,321 @@ +/// \file DS_Map.h +/// \internal +/// \brief Map +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __RAKNET_MAP_H +#define __RAKNET_MAP_H + +#include "DS_OrderedList.h" +#include "Export.h" +#include "RakMemoryOverride.h" +#include "RakAssert.h" + +// If I want to change this to a red-black tree, this is a good site: http://www.cs.auckland.ac.nz/software/AlgAnim/red_black.html +// This makes insertions and deletions faster. But then traversals are slow, while they are currently fast. + +/// The namespace DataStructures was only added to avoid compiler errors for commonly named data structures +/// As these data structures are stand-alone, you can use them outside of RakNet for your own projects if you wish. +namespace DataStructures +{ + /// The default comparison has to be first so it can be called as a default parameter. + /// It then is followed by MapNode, followed by NodeComparisonFunc + template + int defaultMapKeyComparison(const key_type &a, const key_type &b) + { + if (a > + class RAK_DLL_EXPORT Map + { + public: + static void IMPLEMENT_DEFAULT_COMPARISON(void) {DataStructures::defaultMapKeyComparison(key_type(),key_type());} + + struct MapNode + { + MapNode() {} + MapNode(key_type _key, data_type _data) : mapNodeKey(_key), mapNodeData(_data) {} + MapNode& operator = ( const MapNode& input ) {mapNodeKey=input.mapNodeKey; mapNodeData=input.mapNodeData; return *this;} + MapNode( const MapNode & input) {mapNodeKey=input.mapNodeKey; mapNodeData=input.mapNodeData;} + key_type mapNodeKey; + data_type mapNodeData; + }; + + // Has to be a static because the comparison callback for DataStructures::OrderedList is a C function + static int NodeComparisonFunc(const key_type &a, const MapNode &b) + { +#ifdef _MSC_VER +#pragma warning( disable : 4127 ) // warning C4127: conditional expression is constant +#endif + return key_comparison_func(a, b.mapNodeKey); + } + + Map(); + ~Map(); + Map( const Map& original_copy ); + Map& operator= ( const Map& original_copy ); + + data_type& Get(const key_type &key) const; + data_type Pop(const key_type &key); + // Add if needed + void Set(const key_type &key, const data_type &data); + // Must already exist + void SetExisting(const key_type &key, const data_type &data); + // Must add + void SetNew(const key_type &key, const data_type &data); + bool Has(const key_type &key) const; + bool Delete(const key_type &key); + data_type& operator[] ( const unsigned int position ) const; + key_type GetKeyAtIndex( const unsigned int position ) const; + unsigned GetIndexAtKey( const key_type &key ); + void RemoveAtIndex(const unsigned index); + void Clear(void); + unsigned Size(void) const; + + protected: + DataStructures::OrderedList< key_type,MapNode,&Map::NodeComparisonFunc > mapNodeList; + + void SaveLastSearch(const key_type &key, unsigned index) const; + bool HasSavedSearchResult(const key_type &key) const; + + unsigned lastSearchIndex; + key_type lastSearchKey; + bool lastSearchIndexValid; + }; + + template + Map::Map() + { + lastSearchIndexValid=false; + } + + template + Map::~Map() + { + Clear(); + } + + template + Map::Map( const Map& original_copy ) + { + mapNodeList=original_copy.mapNodeList; + lastSearchIndex=original_copy.lastSearchIndex; + lastSearchKey=original_copy.lastSearchKey; + lastSearchIndexValid=original_copy.lastSearchIndexValid; + } + + template + Map& Map::operator= ( const Map& original_copy ) + { + mapNodeList=original_copy.mapNodeList; + lastSearchIndex=original_copy.lastSearchIndex; + lastSearchKey=original_copy.lastSearchKey; + lastSearchIndexValid=original_copy.lastSearchIndexValid; + return *this; + } + + template + data_type& Map::Get(const key_type &key) const + { + if (HasSavedSearchResult(key)) + return mapNodeList[lastSearchIndex].mapNodeData; + + bool objectExists; + unsigned index; + index=mapNodeList.GetIndexFromKey(key, &objectExists); + RakAssert(objectExists); + SaveLastSearch(key,index); + return mapNodeList[index].mapNodeData; + } + + template + unsigned Map::GetIndexAtKey( const key_type &key ) + { + if (HasSavedSearchResult(key)) + return lastSearchIndex; + + bool objectExists; + unsigned index; + index=mapNodeList.GetIndexFromKey(key, &objectExists); + if (objectExists==false) + { + RakAssert(objectExists); + } + SaveLastSearch(key,index); + return index; + } + + template + void Map::RemoveAtIndex(const unsigned index) + { + mapNodeList.RemoveAtIndex(index); + lastSearchIndexValid=false; + } + + template + data_type Map::Pop(const key_type &key) + { + bool objectExists; + unsigned index; + if (HasSavedSearchResult(key)) + index=lastSearchIndex; + else + { + index=mapNodeList.GetIndexFromKey(key, &objectExists); + RakAssert(objectExists); + } + data_type tmp = mapNodeList[index].mapNodeData; + mapNodeList.RemoveAtIndex(index); + lastSearchIndexValid=false; + return tmp; + } + + template + void Map::Set(const key_type &key, const data_type &data) + { + bool objectExists; + unsigned index; + + if (HasSavedSearchResult(key)) + { + mapNodeList[lastSearchIndex].mapNodeData=data; + return; + } + + index=mapNodeList.GetIndexFromKey(key, &objectExists); + + if (objectExists) + { + SaveLastSearch(key,index); + mapNodeList[index].mapNodeData=data; + } + else + { + SaveLastSearch(key,mapNodeList.Insert(key,MapNode(key,data), true, _FILE_AND_LINE_)); + } + } + + template + void Map::SetExisting(const key_type &key, const data_type &data) + { + bool objectExists; + unsigned index; + + if (HasSavedSearchResult(key)) + { + index=lastSearchIndex; + } + else + { + index=mapNodeList.GetIndexFromKey(key, &objectExists); + RakAssert(objectExists); + SaveLastSearch(key,index); + } + + mapNodeList[index].mapNodeData=data; + } + + template + void Map::SetNew(const key_type &key, const data_type &data) + { +#ifdef _DEBUG + bool objectExists; + mapNodeList.GetIndexFromKey(key, &objectExists); + RakAssert(objectExists==false); +#endif + SaveLastSearch(key,mapNodeList.Insert(key,MapNode(key,data), true, _FILE_AND_LINE_)); + } + + template + bool Map::Has(const key_type &key) const + { + if (HasSavedSearchResult(key)) + return true; + + bool objectExists; + unsigned index; + index=mapNodeList.GetIndexFromKey(key, &objectExists); + if (objectExists) + SaveLastSearch(key,index); + return objectExists; + } + + template + bool Map::Delete(const key_type &key) + { + if (HasSavedSearchResult(key)) + { + lastSearchIndexValid=false; + mapNodeList.RemoveAtIndex(lastSearchIndex); + return true; + } + + bool objectExists; + unsigned index; + index=mapNodeList.GetIndexFromKey(key, &objectExists); + if (objectExists) + { + lastSearchIndexValid=false; + mapNodeList.RemoveAtIndex(index); + return true; + } + else + return false; + } + + template + void Map::Clear(void) + { + lastSearchIndexValid=false; + mapNodeList.Clear(false, _FILE_AND_LINE_); + } + + template + data_type& Map::operator[]( const unsigned int position ) const + { + return mapNodeList[position].mapNodeData; + } + + template + key_type Map::GetKeyAtIndex( const unsigned int position ) const + { + return mapNodeList[position].mapNodeKey; + } + + template + unsigned Map::Size(void) const + { + return mapNodeList.Size(); + } + + template + void Map::SaveLastSearch(const key_type &key, const unsigned index) const + { + (void) key; + (void) index; + + /* + lastSearchIndex=index; + lastSearchKey=key; + lastSearchIndexValid=true; + */ + } + + template + bool Map::HasSavedSearchResult(const key_type &key) const + { + (void) key; + + // Not threadsafe! + return false; + // return lastSearchIndexValid && key_comparison_func(key,lastSearchKey)==0; + } +} + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_MemoryPool.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_MemoryPool.h new file mode 100644 index 0000000..903fd8e --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_MemoryPool.h @@ -0,0 +1,294 @@ +/// \file DS_MemoryPool.h +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#ifndef __MEMORY_POOL_H +#define __MEMORY_POOL_H + +#ifndef __APPLE__ +// Use stdlib and not malloc for compatibility +#include +#endif +#include "RakAssert.h" +#include "Export.h" + +#include "RakMemoryOverride.h" + +// DS_MEMORY_POOL_MAX_FREE_PAGES must be > 1 +#define DS_MEMORY_POOL_MAX_FREE_PAGES 4 + +//#define _DISABLE_MEMORY_POOL + +namespace DataStructures +{ + /// Very fast memory pool for allocating and deallocating structures that don't have constructors or destructors. + /// Contains a list of pages, each of which has an array of the user structures + template + class RAK_DLL_EXPORT MemoryPool + { + public: + struct Page; + struct MemoryWithPage + { + MemoryBlockType userMemory; + Page *parentPage; + }; + struct Page + { + MemoryWithPage** availableStack; + int availableStackSize; + MemoryWithPage* block; + Page *next, *prev; + }; + + MemoryPool(); + ~MemoryPool(); + void SetPageSize(int size); // Defaults to 16384 bytes + MemoryBlockType *Allocate(const char *file, unsigned int line); + void Release(MemoryBlockType *m, const char *file, unsigned int line); + void Clear(const char *file, unsigned int line); + + int GetAvailablePagesSize(void) const {return availablePagesSize;} + int GetUnavailablePagesSize(void) const {return unavailablePagesSize;} + int GetMemoryPoolPageSize(void) const {return memoryPoolPageSize;} + protected: + int BlocksPerPage(void) const; + void AllocateFirst(void); + bool InitPage(Page *page, Page *prev, const char *file, unsigned int line); + + // availablePages contains pages which have room to give the user new blocks. We return these blocks from the head of the list + // unavailablePages are pages which are totally full, and from which we do not return new blocks. + // Pages move from the head of unavailablePages to the tail of availablePages, and from the head of availablePages to the tail of unavailablePages + Page *availablePages, *unavailablePages; + int availablePagesSize, unavailablePagesSize; + int memoryPoolPageSize; + }; + + template + MemoryPool::MemoryPool() + { +#ifndef _DISABLE_MEMORY_POOL + //AllocateFirst(); + availablePagesSize=0; + unavailablePagesSize=0; + memoryPoolPageSize=16384; +#endif + } + template + MemoryPool::~MemoryPool() + { +#ifndef _DISABLE_MEMORY_POOL + Clear(_FILE_AND_LINE_); +#endif + } + + template + void MemoryPool::SetPageSize(int size) + { + memoryPoolPageSize=size; + } + + template + MemoryBlockType* MemoryPool::Allocate(const char *file, unsigned int line) + { +#ifdef _DISABLE_MEMORY_POOL + return (MemoryBlockType*) rakMalloc_Ex(sizeof(MemoryBlockType), file, line); +#else + + if (availablePagesSize>0) + { + MemoryBlockType *retVal; + Page *curPage; + curPage=availablePages; + retVal = (MemoryBlockType*) curPage->availableStack[--(curPage->availableStackSize)]; + if (curPage->availableStackSize==0) + { + --availablePagesSize; + availablePages=curPage->next; + RakAssert(availablePagesSize==0 || availablePages->availableStackSize>0); + curPage->next->prev=curPage->prev; + curPage->prev->next=curPage->next; + + if (unavailablePagesSize++==0) + { + unavailablePages=curPage; + curPage->next=curPage; + curPage->prev=curPage; + } + else + { + curPage->next=unavailablePages; + curPage->prev=unavailablePages->prev; + unavailablePages->prev->next=curPage; + unavailablePages->prev=curPage; + } + } + + RakAssert(availablePagesSize==0 || availablePages->availableStackSize>0); + return retVal; + } + + availablePages = (Page *) rakMalloc_Ex(sizeof(Page), file, line); + if (availablePages==0) + return 0; + availablePagesSize=1; + if (InitPage(availablePages, availablePages, file, line)==false) + return 0; + // If this assert hits, we couldn't allocate even 1 block per page. Increase the page size + RakAssert(availablePages->availableStackSize>1); + + return (MemoryBlockType *) availablePages->availableStack[--availablePages->availableStackSize]; +#endif + } + template + void MemoryPool::Release(MemoryBlockType *m, const char *file, unsigned int line) + { +#ifdef _DISABLE_MEMORY_POOL + rakFree_Ex(m, file, line); + return; +#else + // Find the page this block is in and return it. + Page *curPage; + MemoryWithPage *memoryWithPage = (MemoryWithPage*)m; + curPage=memoryWithPage->parentPage; + + if (curPage->availableStackSize==0) + { + // The page is in the unavailable list so move it to the available list + curPage->availableStack[curPage->availableStackSize++]=memoryWithPage; + unavailablePagesSize--; + + // As this page is no longer totally empty, move it to the end of available pages + curPage->next->prev=curPage->prev; + curPage->prev->next=curPage->next; + + if (unavailablePagesSize>0 && curPage==unavailablePages) + unavailablePages=unavailablePages->next; + + if (availablePagesSize++==0) + { + availablePages=curPage; + curPage->next=curPage; + curPage->prev=curPage; + } + else + { + curPage->next=availablePages; + curPage->prev=availablePages->prev; + availablePages->prev->next=curPage; + availablePages->prev=curPage; + } + } + else + { + curPage->availableStack[curPage->availableStackSize++]=memoryWithPage; + + if (curPage->availableStackSize==BlocksPerPage() && + availablePagesSize>=DS_MEMORY_POOL_MAX_FREE_PAGES) + { + // After a certain point, just deallocate empty pages rather than keep them around + if (curPage==availablePages) + { + availablePages=curPage->next; + RakAssert(availablePages->availableStackSize>0); + } + curPage->prev->next=curPage->next; + curPage->next->prev=curPage->prev; + availablePagesSize--; + rakFree_Ex(curPage->availableStack, file, line ); + rakFree_Ex(curPage->block, file, line ); + rakFree_Ex(curPage, file, line ); + } + } +#endif + } + template + void MemoryPool::Clear(const char *file, unsigned int line) + { +#ifdef _DISABLE_MEMORY_POOL + return; +#else + Page *cur, *freed; + + if (availablePagesSize>0) + { + cur = availablePages; +#ifdef _MSC_VER +#pragma warning(disable:4127) // conditional expression is constant +#endif + while (true) + // do + { + rakFree_Ex(cur->availableStack, file, line ); + rakFree_Ex(cur->block, file, line ); + freed=cur; + cur=cur->next; + if (cur==availablePages) + { + rakFree_Ex(freed, file, line ); + break; + } + rakFree_Ex(freed, file, line ); + }// while(cur!=availablePages); + } + + if (unavailablePagesSize>0) + { + cur = unavailablePages; + while (1) + //do + { + rakFree_Ex(cur->availableStack, file, line ); + rakFree_Ex(cur->block, file, line ); + freed=cur; + cur=cur->next; + if (cur==unavailablePages) + { + rakFree_Ex(freed, file, line ); + break; + } + rakFree_Ex(freed, file, line ); + } // while(cur!=unavailablePages); + } + + availablePagesSize=0; + unavailablePagesSize=0; +#endif + } + template + int MemoryPool::BlocksPerPage(void) const + { + return memoryPoolPageSize / sizeof(MemoryWithPage); + } + template + bool MemoryPool::InitPage(Page *page, Page *prev, const char *file, unsigned int line) + { + int i=0; + const int bpp = BlocksPerPage(); + page->block=(MemoryWithPage*) rakMalloc_Ex(memoryPoolPageSize, file, line); + if (page->block==0) + return false; + page->availableStack=(MemoryWithPage**)rakMalloc_Ex(sizeof(MemoryWithPage*)*bpp, file, line); + if (page->availableStack==0) + { + rakFree_Ex(page->block, file, line ); + return false; + } + MemoryWithPage *curBlock = page->block; + MemoryWithPage **curStack = page->availableStack; + while (i < bpp) + { + curBlock->parentPage=page; + curStack[i]=curBlock++; + i++; + } + page->availableStackSize=bpp; + page->next=availablePages; + page->prev=prev; + return true; + } +} + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_Multilist.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_Multilist.h new file mode 100644 index 0000000..370ff8d --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_Multilist.h @@ -0,0 +1,1644 @@ +/// \file DS_Multilist.h +/// \internal +/// \brief ADT that can represent an unordered list, ordered list, stack, or queue with a common interface +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __MULTILIST_H +#define __MULTILIST_H + +#include "RakAssert.h" +#include // memmove +#include "Export.h" +#include "RakMemoryOverride.h" +#include "NativeTypes.h" + + +#ifdef _MSC_VER +#pragma warning( push ) +#pragma warning( disable : 4127 ) // warning C4127: conditional expression is constant +#pragma warning( disable : 4512 ) // warning C4512: assignment operator could not be generated +#endif + +/// What algorithm to use to store the data for the Multilist +enum MultilistType +{ + /// Removing from the middle of the list will swap the end of the list rather than shift the elements. Push and Pop operate on the tail. + ML_UNORDERED_LIST, + /// A normal list, with the list order preserved. Push and Pop operate on the tail. + ML_STACK, + /// A queue. Push and Pop operate on the head + ML_QUEUE, + /// A list that is always kept in order. Elements must be unique, and compare against each other consistently using <, ==, and > + ML_ORDERED_LIST, + /// A list whose type can change at runtime + ML_VARIABLE_DURING_RUNTIME +}; + +/// The namespace DataStructures was only added to avoid compiler errors for commonly named data structures +/// As these data structures are stand-alone, you can use them outside of RakNet for your own projects if you wish. +namespace DataStructures +{ + /// Can be used with Multilist::ForEach + /// Assuming the Multilist holds pointers, will delete those pointers + template + void DeletePtr_RakNet(templateType &ptr, const char *file, unsigned int line ) {RakNet::OP_DELETE(ptr, file, line);} + + /// Can be used with Multilist::ForEach + /// Assuming the Multilist holds pointers, will delete those pointers + template + void DeletePtr(templateType &ptr) {delete ptr;} + + /// The following is invalid. + /// bool operator<( const MyClass *myClass, const int &inputKey ) {return myClass->value < inputKey;} + /// At least one type has to be a reference to a class + /// MLKeyRef is a helper class to turn a native type into a class, so you can compare that native type against a pointer to a different class + /// Used for he Multilist, when _DataType != _KeyType + template < class templateType > + class MLKeyRef + { + public: + MLKeyRef(const templateType& input) : val(input) {} + const templateType &Get(void) const {return val;} + bool operator<( const templateType &right ) {return val < right;} + bool operator>( const templateType &right ) {return val > right;} + bool operator==( const templateType &right ) {return val == right;} + protected: + const templateType &val; + }; + + /// For the Multilist, when _DataType != _KeyType, you must define the comparison operators between the key and the data + /// This is non-trivial due to the need to use MLKeyRef in case the type held is a pointer to a structure or class and the key type is not a class + /// For convenience, this macro will implement the comparison operators under the following conditions + /// 1. _DataType is a pointer to a class or structure + /// 2. The key is a member variable of _DataType + #define DEFINE_MULTILIST_PTR_TO_MEMBER_COMPARISONS( _CLASS_NAME_, _KEY_TYPE_, _MEMBER_VARIABLE_NAME_ ) \ + bool operator<( const DataStructures::MLKeyRef<_KEY_TYPE_> &inputKey, const _CLASS_NAME_ *cls ) {return inputKey.Get() < cls->_MEMBER_VARIABLE_NAME_;} \ + bool operator>( const DataStructures::MLKeyRef<_KEY_TYPE_> &inputKey, const _CLASS_NAME_ *cls ) {return inputKey.Get() > cls->_MEMBER_VARIABLE_NAME_;} \ + bool operator==( const DataStructures::MLKeyRef<_KEY_TYPE_> &inputKey, const _CLASS_NAME_ *cls ) {return inputKey.Get() == cls->_MEMBER_VARIABLE_NAME_;} + + typedef uint32_t DefaultIndexType; + + /// \brief The multilist, representing an abstract data type that generally holds lists. + /// \param[in] _MultilistType What type of list this is, \sa MultilistType + /// \param[in] _DataType What type of data this list holds. + /// \param[in] _KeyType If a function takes a key to sort on, what type of key this is. The comparison operator between _DataType and _KeyType must be defined + /// \param[in] _IndexType What variable type to use for indices + template + class RAK_DLL_EXPORT Multilist + { + public: + Multilist(); + ~Multilist(); + Multilist( const Multilist& source ); + Multilist& operator= ( const Multilist& source ); + _DataType& operator[] ( const _IndexType position ) const; + /// Unordered list, stack is LIFO + /// QUEUE is FIFO + /// Ordered list is inserted in order + void Push(const _DataType &d, const char *file=__FILE__, unsigned int line=__LINE__ ); + void Push(const _DataType &d, const _KeyType &key, const char *file=__FILE__, unsigned int line=__LINE__ ); + + /// \brief Gets or removes and gets an element from the list, according to the same rules as Push(). + /// Ordered list is LIFO for the purposes of Pop and Peek. + _DataType &Pop(const char *file=__FILE__, unsigned int line=__LINE__); + _DataType &Peek(void) const; + + /// \brief Same as Push(), except FIFO and LIFO are reversed. + /// Ordered list still inserts in order. + void PushOpposite(const _DataType &d, const char *file=__FILE__, unsigned int line=__LINE__ ); + void PushOpposite(const _DataType &d, const _KeyType &key, const char *file=__FILE__, unsigned int line=__LINE__ ); + + /// \brief Same as Pop() and Peek(), except FIFO and LIFO are reversed. + _DataType &PopOpposite(const char *file=__FILE__, unsigned int line=__LINE__); + _DataType &PeekOpposite(void) const; + + /// \brief Stack,Queue: Inserts at index indicated, elements are shifted. + /// Ordered list: Inserts, position is ignored + void InsertAtIndex(const _DataType &d, _IndexType index, const char *file=__FILE__, unsigned int line=__LINE__); + + /// \brief Unordered list, removes at index indicated, swaps last element with that element. + /// Otherwise, array is shifted left to overwrite removed element + /// \details Index[0] returns the same as Pop() for a queue. + /// Same as PopOpposite() for the list and ordered list + void RemoveAtIndex(_IndexType position, const char *file=__FILE__, unsigned int line=__LINE__); + + /// \brief Find the index of \a key, and remove at that index. + bool RemoveAtKey(_KeyType key, bool assertIfDoesNotExist, const char *file=__FILE__, unsigned int line=__LINE__); + + /// \brief Finds the index of \a key. Return -1 if the key is not found. + _IndexType GetIndexOf(_KeyType key) const; + + /// \brief Returns where in the list we should insert the item, to preserve list order. + /// Returns -1 if the item is already in the list + _IndexType GetInsertionIndex(_KeyType key) const; + + /// \brief Finds the index of \a key. Return 0 if the key is not found. Useful if _DataType is always non-zero pointers. + _DataType GetPtr(_KeyType key) const; + + /// \brief Iterate over the list, calling the function pointer on each element. + void ForEach(void (*func)(_DataType &item, const char *file, unsigned int line), const char *file, unsigned int line); + void ForEach(void (*func)(_DataType &item)); + + /// \brief Returns if the list is empty. + bool IsEmpty(void) const; + + /// \brief Returns the number of elements used in the list. + _IndexType GetSize(void) const; + + /// \brief Empties the list. The list is not deallocated if it is small, + /// unless \a deallocateSmallBlocks is true + void Clear( bool deallocateSmallBlocks=true, const char *file=__FILE__, unsigned int line=__LINE__ ); + + /// \brief Empties the list, first calling RakNet::OP_Delete on all items. + /// \details The list is not deallocated if it is small, unless \a deallocateSmallBlocks is true + void ClearPointers( bool deallocateSmallBlocks=true, const char *file=__FILE__, unsigned int line=__LINE__ ); + + /// \brief Empty one item from the list, first calling RakNet::OP_Delete on that item. + void ClearPointer( _KeyType key, const char *file=__FILE__, unsigned int line=__LINE__ ); + + /// \brief Reverses the elements in the list, and flips the sort order + /// returned by GetSortOrder() if IsSorted() returns true at the time the function is called + void ReverseList(void); + + /// \brief Reallocates the list to a larger size. + /// If \a size is smaller than the value returned by GetSize(), the call does nothing. + void Reallocate(_IndexType size, const char *file=__FILE__, unsigned int line=__LINE__); + + /// \brief Sorts the list unless it is an ordered list, in which it does nothing as the list is assumed to already be sorted. + /// \details However, if \a force is true, it will also resort the ordered list, useful if the comparison operator between _KeyType and _DataType would now return different results + /// Once the list is sorted, further operations to lookup by key will be log2(n) until the list is modified + void Sort(bool force); + + /// \brief Sets the list to be remembered as sorted. + /// \details Optimization if the source is sorted already + void TagSorted(void); + + /// \brief Defaults to ascending. + /// \details Used by Sort(), and by ML_ORDERED_LIST + void SetSortOrder(bool ascending); + + /// \brief Returns true if ascending. + bool GetSortOrder(void) const; + + /// \brief Returns true if the list is currently believed to be in a sorted state. + /// \details Doesn't actually check for sortedness, just if Sort() + /// was recently called, or MultilistType is ML_ORDERED_LIST + bool IsSorted(void) const; + + /// Returns what type of list this is + MultilistType GetMultilistType(void) const; + + /// \brief Changes what type of list this is. + /// \pre Template must be defined with ML_VARIABLE_DURING_RUNTIME for this to do anything + /// \param[in] mlType Any value of the enum MultilistType, except ML_VARIABLE_DURING_RUNTIME + void SetMultilistType(MultilistType newType); + + /// \brief Returns the intersection of two lists. + /// Intersection is items common to both lists. + static void FindIntersection( + Multilist& source1, + Multilist& source2, + Multilist& intersection, + Multilist& uniqueToSource1, + Multilist& uniqueToSource2); + + protected: + void ReallocateIfNeeded(const char *file, unsigned int line); + void DeallocateIfNeeded(const char *file, unsigned int line); + void ReallocToSize(_IndexType newAllocationSize, const char *file, unsigned int line); + void ReverseListInternal(void); + void InsertInOrderedList(const _DataType &d, const _KeyType &key); + _IndexType GetIndexFromKeyInSortedList(const _KeyType &key, bool *objectExists) const; + void InsertShiftArrayRight(const _DataType &d, _IndexType index); + void DeleteShiftArrayLeft(_IndexType index); + void QSortAscending(_IndexType left, _IndexType right); + void QSortDescending(_IndexType left, _IndexType right); + void CopySource( const Multilist& source ); + + /// An array of user values + _DataType* data; + + /// Number of elements in the list + _IndexType dataSize; + + /// Size of \a array + _IndexType allocationSize; + + /// Array index for the head of the queue + _IndexType queueHead; + + /// Array index for the tail of the queue + _IndexType queueTail; + + /// How many bytes the user chose to preallocate + /// Won't automatically deallocate below this + _IndexType preallocationSize; + + enum + { + ML_UNSORTED, + ML_SORTED_ASCENDING, + ML_SORTED_DESCENDING + } sortState; + + bool ascendingSort; + + // In case we are using the variable type multilist + MultilistType variableMultilistType; + }; + + template + Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::Multilist() + { + data=0; + dataSize=0; + allocationSize=0; + ascendingSort=true; + sortState=ML_UNSORTED; + queueHead=0; + queueTail=0; + preallocationSize=0; + + if (_MultilistType==ML_ORDERED_LIST) + sortState=ML_SORTED_ASCENDING; + else + sortState=ML_UNSORTED; + + if (_MultilistType==ML_VARIABLE_DURING_RUNTIME) + variableMultilistType=ML_UNORDERED_LIST; + } + + template + Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::~Multilist() + { + if (data!=0) + RakNet::OP_DELETE_ARRAY(data, _FILE_AND_LINE_); + } + + template + Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::Multilist( const Multilist& source ) + { + CopySource(source); + } + + template + Multilist<_MultilistType, _DataType, _KeyType, _IndexType>& Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::operator= ( const Multilist& source ) + { + Clear(true); + CopySource(source); + return *this; + } + + template + void Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::CopySource( const Multilist& source ) + { + dataSize=source.GetSize(); + ascendingSort=source.ascendingSort; + sortState=source.sortState; + queueHead=0; + queueTail=dataSize; + preallocationSize=source.preallocationSize; + variableMultilistType=source.variableMultilistType; + if (source.data==0) + { + data=0; + allocationSize=0; + } + else + { + allocationSize=dataSize; + data = RakNet::OP_NEW_ARRAY<_DataType>(dataSize,_FILE_AND_LINE_); + _IndexType i; + for (i=0; i < dataSize; i++) + data[i]=source[i]; + } + } + + template + _DataType& Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::operator[] ( const _IndexType position ) const + { + RakAssert(position= allocationSize ) + return data[ queueHead + position - allocationSize ]; + else + return data[ queueHead + position ]; + } + + return data[position]; + } + + template + void Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::Push(const _DataType &d, const char *file, unsigned int line ) + { + Push(d,d,file,line); + } + + template + void Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::Push(const _DataType &d, const _KeyType &key, const char *file, unsigned int line ) + { + ReallocateIfNeeded(file,line); + + if (GetMultilistType()==ML_UNORDERED_LIST || GetMultilistType()==ML_STACK) + { + data[dataSize]=d; + dataSize++; + } + else if (GetMultilistType()==ML_QUEUE) + { + data[queueTail++] = d; + + if ( queueTail == allocationSize ) + queueTail = 0; + dataSize++; + } + else + { + RakAssert(GetMultilistType()==ML_ORDERED_LIST); + InsertInOrderedList(d,key); + } + + if (GetMultilistType()==ML_UNORDERED_LIST || GetMultilistType()==ML_STACK || GetMultilistType()==ML_QUEUE) + { + // Break sort if no longer sorted + if (sortState!=ML_UNSORTED && dataSize>1) + { + if (ascendingSort) + { + if ( MLKeyRef<_KeyType>(key) < operator[](dataSize-2) ) + sortState=ML_UNSORTED; + } + else + { + if ( MLKeyRef<_KeyType>(key) > operator[](dataSize-2) ) + sortState=ML_UNSORTED; + } + + sortState=ML_UNSORTED; + } + } + } + + template + _DataType &Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::Pop(const char *file, unsigned int line) + { + RakAssert(IsEmpty()==false); + DeallocateIfNeeded(file,line); + if (GetMultilistType()==ML_UNORDERED_LIST || GetMultilistType()==ML_STACK || GetMultilistType()==ML_ORDERED_LIST) + { + dataSize--; + return data[dataSize]; + } + else + { + RakAssert(GetMultilistType()==ML_QUEUE); + + if ( ++queueHead == allocationSize ) + queueHead = 0; + + if ( queueHead == 0 ) + return data[ allocationSize -1 ]; + + dataSize--; + return data[ queueHead -1 ]; + } + } + + template + _DataType &Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::Peek(void) const + { + RakAssert(IsEmpty()==false); + if (GetMultilistType()==ML_UNORDERED_LIST || GetMultilistType()==ML_STACK || GetMultilistType()==ML_ORDERED_LIST) + { + return data[dataSize-1]; + } + else + { + RakAssert(GetMultilistType()==ML_QUEUE); + return data[ queueHead ]; + } + } + + template + void Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::PushOpposite(const _DataType &d, const char *file, unsigned int line ) + { + PushOpposite(d,d,file,line); + } + + template + void Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::PushOpposite(const _DataType &d, const _KeyType &key, const char *file, unsigned int line ) + { + ReallocateIfNeeded(file,line); + + // Unordered list Push at back + if (GetMultilistType()==ML_UNORDERED_LIST) + { + data[dataSize]=d; + dataSize++; + } + else if (GetMultilistType()==ML_STACK) + { + // Stack push at front of the list, instead of back as normal + InsertAtIndex(d,0,file,line); + } + else if (GetMultilistType()==ML_QUEUE) + { + // Queue push at front of the list, instead of back as normal + InsertAtIndex(d,0,file,line); + } + else + { + RakAssert(GetMultilistType()==ML_ORDERED_LIST); + InsertInOrderedList(d,key); + } + + if (GetMultilistType()==ML_UNORDERED_LIST || GetMultilistType()==ML_STACK || GetMultilistType()==ML_QUEUE) + { + // Break sort if no longer sorted + if (sortState!=ML_UNSORTED && dataSize>1) + { + if (ascendingSort) + { + if ( MLKeyRef<_KeyType>(key) > operator[](1) ) + sortState=ML_UNSORTED; + } + else + { + if ( MLKeyRef<_KeyType>(key) < operator[](1) ) + sortState=ML_UNSORTED; + } + } + } + } + + template + _DataType &Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::PopOpposite(const char *file, unsigned int line) + { + RakAssert(IsEmpty()==false); + if (GetMultilistType()==ML_UNORDERED_LIST || GetMultilistType()==ML_STACK || GetMultilistType()==ML_ORDERED_LIST) + { + // Copy leftmost to end + ReallocateIfNeeded(file,line); + data[dataSize]=data[0]; + DeleteShiftArrayLeft(0); + --dataSize; + // Assuming still leaves at least one element past the end of the list allocated + DeallocateIfNeeded(file,line); + // Return end + return data[dataSize+1]; + } + else + { + RakAssert(GetMultilistType()==ML_QUEUE); + // Deallocate first, since we are returning off the existing list + DeallocateIfNeeded(file,line); + dataSize--; + + if (queueTail==0) + queueTail=allocationSize-1; + else + --queueTail; + + return data[queueTail]; + } + } + + template + _DataType &Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::PeekOpposite(void) const + { + RakAssert(IsEmpty()==false); + if (GetMultilistType()==ML_UNORDERED_LIST || GetMultilistType()==ML_STACK || GetMultilistType()==ML_ORDERED_LIST) + { + return data[0]; + } + else + { + RakAssert(GetMultilistType()==ML_QUEUE); + _IndexType priorIndex; + if (queueTail==0) + priorIndex=allocationSize-1; + else + priorIndex=queueTail-1; + + return data[priorIndex]; + } + } + + template + void Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::InsertAtIndex(const _DataType &d, _IndexType index, const char *file, unsigned int line) + { + ReallocateIfNeeded(file,line); + + if (GetMultilistType()==ML_UNORDERED_LIST || GetMultilistType()==ML_STACK || GetMultilistType()==ML_ORDERED_LIST) + { + if (index>=dataSize) + { + // insert at end + data[dataSize]=d; + + dataSize++; + } + else + { + // insert at index + InsertShiftArrayRight(d,index); + } + } + else + { + data[queueTail++] = d; + + if ( queueTail == allocationSize ) + queueTail = 0; + + ++dataSize; + + if (dataSize==1) + return; + + _IndexType writeIndex, readIndex, trueWriteIndex, trueReadIndex; + writeIndex=dataSize-1; + readIndex=writeIndex-1; + while (readIndex >= index) + { + if ( queueHead + writeIndex >= allocationSize ) + trueWriteIndex = queueHead + writeIndex - allocationSize; + else + trueWriteIndex = queueHead + writeIndex; + + if ( queueHead + readIndex >= allocationSize ) + trueReadIndex = queueHead + readIndex - allocationSize; + else + trueReadIndex = queueHead + readIndex; + + data[trueWriteIndex]=data[trueReadIndex]; + + if (readIndex==0) + break; + writeIndex--; + readIndex--; + } + + if ( queueHead + index >= allocationSize ) + trueWriteIndex = queueHead + index - allocationSize; + else + trueWriteIndex = queueHead + index; + + data[trueWriteIndex]=d; + } + + if (_MultilistType!=ML_ORDERED_LIST) + sortState=ML_UNSORTED; + } + + template + void Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::RemoveAtIndex(_IndexType position, const char *file, unsigned int line) + { + RakAssert(position < dataSize); + RakAssert(IsEmpty()==false); + + if (GetMultilistType()==ML_UNORDERED_LIST) + { + // Copy tail to current + data[position]=data[dataSize-1]; + } + else if (GetMultilistType()==ML_STACK || GetMultilistType()==ML_ORDERED_LIST) + { + DeleteShiftArrayLeft(position); + } + else + { + RakAssert(GetMultilistType()==ML_QUEUE); + + _IndexType index, next; + + if ( queueHead + position >= allocationSize ) + index = queueHead + position - allocationSize; + else + index = queueHead + position; + + next = index + 1; + + if ( next == allocationSize ) + next = 0; + + while ( next != queueTail ) + { + // Overwrite the previous element + data[ index ] = data[ next ]; + index = next; + //next = (next + 1) % allocationSize; + + if ( ++next == allocationSize ) + next = 0; + } + + // Move the queueTail back + if ( queueTail == 0 ) + queueTail = allocationSize - 1; + else + --queueTail; + } + + + dataSize--; + DeallocateIfNeeded(file,line); + } + + template + bool Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::RemoveAtKey(_KeyType key, bool assertIfDoesNotExist, const char *file, unsigned int line) + { + _IndexType index = GetIndexOf(key); + if (index==(_IndexType)-1) + { + RakAssert(assertIfDoesNotExist==false && "RemoveAtKey element not found"); + return false; + } + RemoveAtIndex(index,file,line); + return true; + } + + template + _IndexType Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::GetIndexOf(_KeyType key) const + { + _IndexType i; + if (IsSorted()) + { + bool objectExists; + i=GetIndexFromKeyInSortedList(key, &objectExists); + if (objectExists) + return i; + return (_IndexType)-1; + } + else if (GetMultilistType()==ML_UNORDERED_LIST || GetMultilistType()==ML_STACK) + { + for (i=0; i < dataSize; i++) + { + if (MLKeyRef<_KeyType>(key)==data[i]) + return i; + } + return (_IndexType)-1; + } + else + { + RakAssert( GetMultilistType()==ML_QUEUE ); + + for (i=0; i < dataSize; i++) + { + if (MLKeyRef<_KeyType>(key)==operator[](i)) + return i; + } + return (_IndexType)-1; + } + } + + template + _IndexType Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::GetInsertionIndex(_KeyType key) const + { + _IndexType i; + if (IsSorted()) + { + bool objectExists; + i=GetIndexFromKeyInSortedList(key, &objectExists); + if (objectExists) + return (_IndexType)-1; + return i; + } + else if (GetMultilistType()==ML_UNORDERED_LIST || GetMultilistType()==ML_STACK) + { + for (i=0; i < dataSize; i++) + { + if (MLKeyRef<_KeyType>(key)==data[i]) + return (_IndexType)-1; + } + return dataSize; + } + else + { + RakAssert( GetMultilistType()==ML_QUEUE ); + + for (i=0; i < dataSize; i++) + { + if (MLKeyRef<_KeyType>(key)==operator[](i)) + return (_IndexType)-1; + } + return dataSize; + } + } + + template + _DataType Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::GetPtr(_KeyType key) const + { + _IndexType i = GetIndexOf(key); + if (i==(_IndexType)-1) + return 0; + return data[i]; + } + + template + void Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::ForEach(void (*func)(_DataType &item, const char *file, unsigned int line), const char *file, unsigned int line) + { + _IndexType i; + for (i=0; i < dataSize; i++) + func(operator[](i), file, line); + } + + template + void Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::ForEach(void (*func)(_DataType &item)) + { + _IndexType i; + for (i=0; i < dataSize; i++) + func(operator[](i)); + } + + template + bool Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::IsEmpty(void) const + { + return dataSize==0; + } + + template + _IndexType Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::GetSize(void) const + { + return dataSize; + } + + template + void Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::Clear( bool deallocateSmallBlocks, const char *file, unsigned int line ) + { + dataSize=0; + if (GetMultilistType()==ML_ORDERED_LIST) + if (ascendingSort) + sortState=ML_SORTED_ASCENDING; + else + sortState=ML_SORTED_DESCENDING; + else + sortState=ML_UNSORTED; + queueHead=0; + queueTail=0; + + if (deallocateSmallBlocks && allocationSize < 128 && data) + { + RakNet::OP_DELETE_ARRAY(data,file,line); + data=0; + allocationSize=0; + } + } + + template + void Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::ClearPointers( bool deallocateSmallBlocks, const char *file, unsigned int line ) + { + _IndexType i; + for (i=0; i < dataSize; i++) + RakNet::OP_DELETE(operator[](i), file, line); + Clear(deallocateSmallBlocks, file, line); + } + + template + void Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::ClearPointer( _KeyType key, const char *file, unsigned int line ) + { + _IndexType i; + i = GetIndexOf(key); + if (i!=-1) + { + RakNet::OP_DELETE(operator[](i), file, line); + RemoveAtIndex(i); + } + } + + template + void Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::ReverseList(void) + { + if (IsSorted()) + ascendingSort=!ascendingSort; + + ReverseListInternal(); + } + + template + void Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::Reallocate(_IndexType size, const char *file, unsigned int line) + { + _IndexType newAllocationSize; + if (size < dataSize) + newAllocationSize=dataSize; + else + newAllocationSize=size; + preallocationSize=size; + ReallocToSize(newAllocationSize,file,line); + } + + template + void Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::Sort(bool force) + { + if (IsSorted() && force==false) + return; + + if (dataSize>1) + { + if (ascendingSort) + QSortAscending(0,dataSize-1); + else + QSortDescending(0,dataSize-1); + } + + TagSorted(); + } + + template + void Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::TagSorted(void) + { + if (ascendingSort) + sortState=ML_SORTED_ASCENDING; + else + sortState=ML_SORTED_DESCENDING; + } + + template + void Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::QSortAscending(_IndexType leftEdge, _IndexType rightEdge) + { + _DataType temp; + _IndexType left=leftEdge; + _IndexType right=rightEdge; + _IndexType pivotIndex=left++; + + while (left data[pivotIndex]) + { + --left; + + data[pivotIndex]=data[left]; + data[left]=temp; + } + else + { + data[pivotIndex]=data[left]; + data[left]=temp; + + --left; + } + + if (left!=leftEdge) + QSortAscending(leftEdge, left); + + if (right!=rightEdge) + QSortAscending(right, rightEdge); + } + + template + void Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::QSortDescending(_IndexType leftEdge, _IndexType rightEdge) + { + _DataType temp; + _IndexType left=leftEdge; + _IndexType right=rightEdge; + _IndexType pivotIndex=left++; + + while (left= data[pivotIndex]) + { + ++left; + } + else + { + temp=data[left]; + data[left]=data[right]; + data[right]=temp; + --right; + } + } + + temp=data[pivotIndex]; + + // Move pivot to center + if (data[left] < data[pivotIndex]) + { + --left; + + data[pivotIndex]=data[left]; + data[left]=temp; + } + else + { + data[pivotIndex]=data[left]; + data[left]=temp; + + --left; + } + + if (left!=leftEdge) + QSortDescending(leftEdge, left); + + if (right!=rightEdge) + QSortDescending(right, rightEdge); + } + + template + void Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::SetSortOrder(bool ascending) + { + if (ascendingSort!=ascending && IsSorted()) + { + ascendingSort=ascending; + // List is sorted, and the sort order has changed. So reverse the list + ReverseListInternal(); + } + else + ascendingSort=ascending; + } + + template + bool Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::GetSortOrder(void) const + { + return ascendingSort; + } + + template + bool Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::IsSorted(void) const + { + return GetMultilistType()==ML_ORDERED_LIST || sortState!=ML_UNSORTED; + } + + template + MultilistType Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::GetMultilistType(void) const + { + if (_MultilistType==ML_VARIABLE_DURING_RUNTIME) + return variableMultilistType; + return _MultilistType; + } + + template + void Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::SetMultilistType(MultilistType newType) + { + RakAssert(_MultilistType==ML_VARIABLE_DURING_RUNTIME); + switch (variableMultilistType) + { + case ML_UNORDERED_LIST: + switch (newType) + { + case ML_UNORDERED_LIST: + // No change + break; + case ML_STACK: + // Same data format + break; + case ML_QUEUE: + queueHead=0; + queueTail=dataSize; + break; + case ML_ORDERED_LIST: + Sort(false); + break; + } + break; + case ML_STACK: + switch (newType) + { + case ML_UNORDERED_LIST: + // Same data format + break; + case ML_STACK: + // No change + break; + case ML_QUEUE: + queueHead=0; + queueTail=dataSize; + break; + case ML_ORDERED_LIST: + Sort(false); + break; + } + break; + case ML_QUEUE: + switch (newType) + { + case ML_UNORDERED_LIST: + case ML_STACK: + case ML_ORDERED_LIST: + if (queueTail < queueHead) + { + // Realign data if wrapped + ReallocToSize(dataSize, _FILE_AND_LINE_); + } + else + { + // Else can just copy starting at head + _IndexType i; + for (i=0; i < dataSize; i++) + data[i]=operator[](i); + } + if (newType==ML_ORDERED_LIST) + Sort(false); + break; + case ML_QUEUE: + // No change + break; + } + break; + case ML_ORDERED_LIST: + switch (newType) + { + case ML_UNORDERED_LIST: + case ML_STACK: + case ML_QUEUE: + // Same data format + // Tag as sorted + if (ascendingSort) + sortState=ML_SORTED_ASCENDING; + else + sortState=ML_SORTED_DESCENDING; + if (newType==ML_QUEUE) + { + queueHead=0; + queueTail=dataSize; + } + break; + case ML_ORDERED_LIST: + // No change + break; + } + break; + } + + variableMultilistType=newType; + } + + template + void Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::FindIntersection( + Multilist& source1, + Multilist& source2, + Multilist& intersection, + Multilist& uniqueToSource1, + Multilist& uniqueToSource2) + { + _IndexType index1=0, index2=0; + source1.SetSortOrder(true); + source2.SetSortOrder(true); + source1.Sort(false); + source2.Sort(false); + intersection.Clear(true,_FILE_AND_LINE_); + uniqueToSource1.Clear(true,_FILE_AND_LINE_); + uniqueToSource2.Clear(true,_FILE_AND_LINE_); + + while (index1 < source1.GetSize() && index2 < source2.GetSize()) + { + if (source1[index1] + void Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::ReallocateIfNeeded(const char *file, unsigned int line) + { + if (dataSize65536) + newAllocationSize=allocationSize+65536; + else + { + newAllocationSize=allocationSize<<1; // * 2 + // Protect against underflow + if (newAllocationSize < allocationSize) + newAllocationSize=allocationSize+65536; + } + + ReallocToSize(newAllocationSize,file,line); + } + + template + void Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::DeallocateIfNeeded(const char *file, unsigned int line) + { + if (allocationSize<512) + return; + if (dataSize >= allocationSize/3 ) + return; + if (dataSize <= preallocationSize ) + return; + + _IndexType newAllocationSize = dataSize<<1; // * 2 + + ReallocToSize(newAllocationSize,file,line); + } + + template + void Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::ReallocToSize(_IndexType newAllocationSize, const char *file, unsigned int line) + { + _DataType* newData = RakNet::OP_NEW_ARRAY<_DataType>(newAllocationSize,file,line); + _IndexType i; + for (i=0; i < dataSize; i++) + newData[i]=operator[](i); + if (dataSize>0) + { + RakNet::OP_DELETE_ARRAY(data,file,line); + if (GetMultilistType()==ML_QUEUE) + { + queueHead=0; + queueTail=dataSize; + } + } + data=newData; + allocationSize=newAllocationSize; + } + + template + void Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::ReverseListInternal(void) + { + _DataType temp; + _IndexType i; + for (i=0; i < dataSize/2; i++) + { + temp=operator[](i); + operator[](i)=operator[](dataSize-1-i); + operator[](dataSize-1-i)=temp; + } + } + + template + void Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::InsertInOrderedList(const _DataType &d, const _KeyType &key) + { + RakAssert(GetMultilistType()==ML_ORDERED_LIST); + + bool objectExists; + _IndexType index; + index = GetIndexFromKeyInSortedList(key, &objectExists); + + // if (objectExists) + // { + // Ordered list only allows unique insertions + // RakAssert("Duplicate insertion into ordered list" && false); + // return; + // } + + if (index>=dataSize) + { + // insert at end + data[dataSize]=d; + dataSize++; + } + else + { + // insert at index + InsertShiftArrayRight(d,index); + } + } + + template + _IndexType Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::GetIndexFromKeyInSortedList(const _KeyType &key, bool *objectExists) const + { + RakAssert(IsSorted()); + _IndexType index, upperBound, lowerBound; + + if (dataSize==0) + { + *objectExists=false; + return 0; + } + + upperBound=dataSize-1; + lowerBound=0; + index = dataSize/2; + +#ifdef _MSC_VER + #pragma warning( disable : 4127 ) // warning C4127: conditional expression is constant +#endif + while (1) + { + if (MLKeyRef<_KeyType>(key) > operator[](index) ) + { + if (ascendingSort) + lowerBound=index+1; + else + upperBound=index-1; + } + else if (MLKeyRef<_KeyType>(key) < operator[](index) ) + { + if (ascendingSort) + upperBound=index-1; + else + lowerBound=index+1; + } + else + { + // == + *objectExists=true; + return index; + } + + index=lowerBound+(upperBound-lowerBound)/2; + + if (lowerBound>upperBound || upperBound==(_IndexType)-1) + { + *objectExists=false; + return lowerBound; // No match + } + } + } + + template + void Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::InsertShiftArrayRight(const _DataType &d, _IndexType index) + { + RakAssert(_MultilistType!=ML_QUEUE); + + // Move the elements in the list to make room + _IndexType i; + for ( i = dataSize; i != index; i-- ) + data[ i ] = data[ i - 1 ]; + + // Insert the new item at the correct spot + data[ index ] = d; + + ++dataSize; + } + + template + void Multilist<_MultilistType, _DataType, _KeyType, _IndexType>::DeleteShiftArrayLeft( _IndexType index ) + { + RakAssert(index < dataSize); + RakAssert(_MultilistType!=ML_QUEUE); + + _IndexType i; + for ( i = index; i < dataSize-1; i++ ) + data[i]=data[i+1]; + } +}; + +/* +struct KeyAndValue +{ + int key; + short value; +}; + +DEFINE_MULTILIST_PTR_TO_MEMBER_COMPARISONS(KeyAndValue,int,key) + +void MultilistUnitTest(void) +{ + DataStructures::DefaultIndexType oldSize; + DataStructures::Multilist ml1; + ml1.Reallocate(64); + RakAssert(ml1.IsEmpty()); + ml1.Push(53); + RakAssert(ml1.Peek()==53); + RakAssert(ml1.IsEmpty()==false); + RakAssert(ml1.Pop()==53); + RakAssert(ml1.IsEmpty()==true); + for (int i=0; i < 512; i++) + ml1.Push(i); + RakAssert(ml1.GetIndexOf(200)==200); + RakAssert(ml1.PeekOpposite()==0); + RakAssert(ml1.PopOpposite()==0); + RakAssert(ml1.PeekOpposite()==1); + RakAssert(ml1.Peek()==511); + ml1.ReverseList(); + for (int i=0; i < 511; i++) + RakAssert(ml1[i]==511-i); + RakAssert(ml1.PeekOpposite()==511); + RakAssert(ml1.Peek()==1); + oldSize = ml1.GetSize(); + ml1.RemoveAtIndex(0); + RakAssert(ml1.GetSize()==oldSize-1); + RakAssert(ml1.PeekOpposite()==1); + ml1.Clear(_FILE_AND_LINE_); + RakAssert(ml1.IsEmpty()==true); + + ml1.Sort(true); + ml1.Clear(_FILE_AND_LINE_); + + ml1.Push(100); + ml1.Sort(true); + ml1.Clear(_FILE_AND_LINE_); + + ml1.Push(50); + ml1.Push(100); + ml1.Sort(true); + ml1.Clear(_FILE_AND_LINE_); + + ml1.Push(100); + ml1.Push(50); + ml1.Sort(true); + ml1.Clear(_FILE_AND_LINE_); + + ml1.Push(100); + ml1.Push(50); + ml1.Push(150); + ml1.Push(25); + ml1.Push(175); + ml1.Sort(true); + RakAssert(ml1[0]==25); + RakAssert(ml1[1]==50); + RakAssert(ml1[2]==100); + RakAssert(ml1[3]==150); + RakAssert(ml1[4]==175); + RakAssert(ml1.GetIndexOf(25)==0); + RakAssert(ml1.GetIndexOf(50)==1); + RakAssert(ml1.GetIndexOf(100)==2); + RakAssert(ml1.GetIndexOf(150)==3); + RakAssert(ml1.GetIndexOf(175)==4); + ml1.Clear(_FILE_AND_LINE_); + + ml1.Push(1); + ml1.Push(2); + ml1.Push(3); + ml1.Push(4); + ml1.Push(5); + ml1.Sort(true); + RakAssert(ml1[0]==1); + RakAssert(ml1[1]==2); + RakAssert(ml1[2]==3); + RakAssert(ml1[3]==4); + RakAssert(ml1[4]==5); + RakAssert(ml1.GetIndexOf(1)==0); + RakAssert(ml1.GetIndexOf(2)==1); + RakAssert(ml1.GetIndexOf(3)==2); + RakAssert(ml1.GetIndexOf(4)==3); + RakAssert(ml1.GetIndexOf(5)==4); + ml1.Clear(_FILE_AND_LINE_); + + ml1.Push(5); + ml1.Push(4); + ml1.Push(3); + ml1.Push(2); + ml1.Push(1); + ml1.Sort(true); + RakAssert(ml1[0]==1); + RakAssert(ml1[1]==2); + RakAssert(ml1[2]==3); + RakAssert(ml1[3]==4); + RakAssert(ml1[4]==5); + RakAssert(ml1.GetIndexOf(1)==0); + RakAssert(ml1.GetIndexOf(2)==1); + RakAssert(ml1.GetIndexOf(3)==2); + RakAssert(ml1.GetIndexOf(4)==3); + RakAssert(ml1.GetIndexOf(5)==4); + ml1.Sort(true); + RakAssert(ml1[0]==1); + RakAssert(ml1[1]==2); + RakAssert(ml1[2]==3); + RakAssert(ml1[3]==4); + RakAssert(ml1[4]==5); + RakAssert(ml1.GetIndexOf(1)==0); + RakAssert(ml1.GetIndexOf(2)==1); + RakAssert(ml1.GetIndexOf(3)==2); + RakAssert(ml1.GetIndexOf(4)==3); + RakAssert(ml1.GetIndexOf(5)==4); + ml1.Clear(_FILE_AND_LINE_); + + DataStructures::Multilist ml2; + ml2.Reallocate(64); + RakAssert(ml2.IsEmpty()); + ml2.Push(53); + RakAssert(ml2.Peek()==53); + RakAssert(ml2.IsEmpty()==false); + RakAssert(ml2.Pop()==53); + RakAssert(ml2.IsEmpty()==true); + for (int i=0; i < 512; i++) + ml2.Push(i); + RakAssert(ml2.GetIndexOf(200)==200); + RakAssert(ml2.PeekOpposite()==0); + RakAssert(ml2.PopOpposite()==0); + RakAssert(ml2.PeekOpposite()==1); + RakAssert(ml2.Peek()==511); + ml2.ReverseList(); + for (int i=0; i < 511; i++) + RakAssert(ml2[i]==511-i); + RakAssert(ml2.PeekOpposite()==511); + RakAssert(ml2.Peek()==1); + oldSize = ml2.GetSize(); + ml2.RemoveAtIndex(0); + RakAssert(ml2.GetSize()==oldSize-1); + RakAssert(ml2.Peek()==1); + RakAssert(ml2.PeekOpposite()==510); + ml2.Clear(_FILE_AND_LINE_); + RakAssert(ml2.IsEmpty()==true); + + DataStructures::Multilist ml3; + RakAssert(ml3.IsEmpty()); + ml3.Push(53); + RakAssert(ml3.Peek()==53); + RakAssert(ml3.IsEmpty()==false); + RakAssert(ml3.Pop()==53); + RakAssert(ml3.IsEmpty()==true); + for (int i=0; i < 512; i++) + ml3.Push(i); + RakAssert(ml3.GetIndexOf(200)==200); + RakAssert(ml3.PeekOpposite()==511); + RakAssert(ml3.PopOpposite()==511); + RakAssert(ml3.PeekOpposite()==510); + RakAssert(ml3.Peek()==0); + ml3.ReverseList(); + for (int i=0; i < 511; i++) + RakAssert(ml3[i]==511-1-i); + RakAssert(ml3.PeekOpposite()==0); + RakAssert(ml3.Peek()==510); + oldSize = ml3.GetSize(); + ml3.RemoveAtIndex(0); + RakAssert(ml3.GetSize()==oldSize-1); + RakAssert(ml3.Peek()==509); + RakAssert(ml3.PeekOpposite()==0); + ml3.Clear(_FILE_AND_LINE_); + RakAssert(ml3.IsEmpty()==true); + + ml3.PushOpposite(100); + ml3.PushOpposite(50); + ml3.PushOpposite(150); + ml3.PushOpposite(25); + ml3.PushOpposite(175); + ml3.Sort(true); + RakAssert(ml3[0]==25); + RakAssert(ml3[1]==50); + RakAssert(ml3[2]==100); + RakAssert(ml3[3]==150); + RakAssert(ml3[4]==175); + RakAssert(ml3.GetIndexOf(25)==0); + RakAssert(ml3.GetIndexOf(50)==1); + RakAssert(ml3.GetIndexOf(100)==2); + RakAssert(ml3.GetIndexOf(150)==3); + RakAssert(ml3.GetIndexOf(175)==4); + ml3.Clear(_FILE_AND_LINE_); + + ml3.PushOpposite(1); + ml3.PushOpposite(2); + ml3.PushOpposite(3); + ml3.PushOpposite(4); + ml3.PushOpposite(5); + ml3.Sort(true); + RakAssert(ml3[0]==1); + RakAssert(ml3[1]==2); + RakAssert(ml3[2]==3); + RakAssert(ml3[3]==4); + RakAssert(ml3[4]==5); + RakAssert(ml3.GetIndexOf(1)==0); + RakAssert(ml3.GetIndexOf(2)==1); + RakAssert(ml3.GetIndexOf(3)==2); + RakAssert(ml3.GetIndexOf(4)==3); + RakAssert(ml3.GetIndexOf(5)==4); + ml3.Clear(_FILE_AND_LINE_); + + ml3.PushOpposite(5); + ml3.PushOpposite(4); + ml3.PushOpposite(3); + ml3.PushOpposite(2); + ml3.PushOpposite(1); + ml3.Sort(true); + RakAssert(ml3[0]==1); + RakAssert(ml3[1]==2); + RakAssert(ml3[2]==3); + RakAssert(ml3[3]==4); + RakAssert(ml3[4]==5); + RakAssert(ml3.GetIndexOf(1)==0); + RakAssert(ml3.GetIndexOf(2)==1); + RakAssert(ml3.GetIndexOf(3)==2); + RakAssert(ml3.GetIndexOf(4)==3); + RakAssert(ml3.GetIndexOf(5)==4); + ml3.Sort(true); + RakAssert(ml3[0]==1); + RakAssert(ml3[1]==2); + RakAssert(ml3[2]==3); + RakAssert(ml3[3]==4); + RakAssert(ml3[4]==5); + RakAssert(ml3.GetIndexOf(1)==0); + RakAssert(ml3.GetIndexOf(2)==1); + RakAssert(ml3.GetIndexOf(3)==2); + RakAssert(ml3.GetIndexOf(4)==3); + RakAssert(ml3.GetIndexOf(5)==4); + + ml3.SetSortOrder(false); + ml3.Sort(false); + RakAssert(ml3[0]==5); + RakAssert(ml3[1]==4); + RakAssert(ml3[2]==3); + RakAssert(ml3[3]==2); + RakAssert(ml3[4]==1); + RakAssert(ml3.GetIndexOf(1)==4); + RakAssert(ml3.GetIndexOf(2)==3); + RakAssert(ml3.GetIndexOf(3)==2); + RakAssert(ml3.GetIndexOf(4)==1); + RakAssert(ml3.GetIndexOf(5)==0); + + ml3.Clear(_FILE_AND_LINE_); + + DataStructures::Multilist ml4; + ml4.Reallocate(64); + RakAssert(ml4.IsEmpty()); + ml4.Push(53); + RakAssert(ml4.Peek()==53); + RakAssert(ml4.IsEmpty()==false); + RakAssert(ml4.Pop()==53); + RakAssert(ml4.IsEmpty()==true); + for (int i=0; i < 512; i++) + ml4.Push(i); + RakAssert(ml4.GetIndexOf(200)==200); + RakAssert(ml4.PeekOpposite()==0); + RakAssert(ml4.PopOpposite()==0); + RakAssert(ml4.PeekOpposite()==1); + RakAssert(ml4.Peek()==511); + ml4.ReverseList(); + for (int i=0; i < 511; i++) + RakAssert(ml4[i]==511-i); + RakAssert(ml4.PeekOpposite()==511); + RakAssert(ml4.Peek()==1); + oldSize = ml4.GetSize(); + ml4.RemoveAtIndex(0); + RakAssert(ml4.GetSize()==oldSize-1); + RakAssert(ml4.Peek()==1); + RakAssert(ml4.PeekOpposite()==510); + ml4.Clear(_FILE_AND_LINE_); + RakAssert(ml4.IsEmpty()==true); + + DataStructures::Multilist ml5; + + for (int i=0; i < 16; i++) + { + KeyAndValue *kav = new KeyAndValue; + kav->key=i; + kav->value=i+100; + ml5.Push(kav,kav->key); + } + + RakAssert(ml5.GetIndexOf(0)==0); + RakAssert(ml5.GetIndexOf(5)==5); + RakAssert(ml5.GetIndexOf(15)==15); + RakAssert(ml5.GetIndexOf(16)==-1); + ml5.RemoveAtKey(0,true); + RakAssert(ml5.GetIndexOf(1)==0); + KeyAndValue *iPtr = ml5.GetPtr(5); + RakAssert(iPtr); + RakAssert(iPtr->value=105); + iPtr = ml5.GetPtr(1234); + RakAssert(iPtr==0); + ml5.ForEach(DataStructures::DeletePtr); + + + DataStructures::Multilist ml6; + ml6.Push(2); + ml6.Push(1); + ml6.Push(6); + ml6.Push(3); + RakAssert(ml6.Peek()==3); + ml6.SetMultilistType(ML_STACK); + RakAssert(ml6.Peek()==3); + ml6.SetMultilistType(ML_QUEUE); + RakAssert(ml6.Peek()==2); + ml6.SetMultilistType(ML_ORDERED_LIST); + RakAssert(ml6.Peek()=6); + ml6.SetMultilistType(ML_STACK); + RakAssert(ml6.Peek()==6); + ml6.SetMultilistType(ML_QUEUE); + RakAssert(ml6.Peek()==1); +} + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif +*/ + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_OrderedChannelHeap.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_OrderedChannelHeap.h new file mode 100644 index 0000000..71f71c5 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_OrderedChannelHeap.h @@ -0,0 +1,244 @@ +/// \file DS_OrderedChannelHeap.h +/// \internal +/// \brief Ordered Channel Heap . This is a heap where you add to it on multiple ordered channels, with each channel having a different weight. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __RAKNET_ORDERED_CHANNEL_HEAP_H +#define __RAKNET_ORDERED_CHANNEL_HEAP_H + +#include "DS_Heap.h" +#include "DS_Map.h" +#include "DS_Queue.h" +#include "Export.h" +#include "RakAssert.h" +#include "Rand.h" + +/// The namespace DataStructures was only added to avoid compiler errors for commonly named data structures +/// As these data structures are stand-alone, you can use them outside of RakNet for your own projects if you wish. +namespace DataStructures +{ + template > + class RAK_DLL_EXPORT OrderedChannelHeap + { + public: + static void IMPLEMENT_DEFAULT_COMPARISON(void) {DataStructures::defaultMapKeyComparison(channel_key_type(),channel_key_type());} + + OrderedChannelHeap(); + ~OrderedChannelHeap(); + void Push(const channel_key_type &channelID, const heap_data_type &data); + void PushAtHead(const unsigned index, const channel_key_type &channelID, const heap_data_type &data); + heap_data_type Pop(const unsigned startingIndex=0); + heap_data_type Peek(const unsigned startingIndex) const; + void AddChannel(const channel_key_type &channelID, const double weight); + void RemoveChannel(channel_key_type channelID); + void Clear(void); + heap_data_type& operator[] ( const unsigned int position ) const; + unsigned ChannelSize(const channel_key_type &channelID); + unsigned Size(void) const; + + struct QueueAndWeight + { + DataStructures::Queue randResultQueue; + double weight; + bool signalDeletion; + }; + + struct HeapChannelAndData + { + HeapChannelAndData() {} + HeapChannelAndData(const channel_key_type &_channel, const heap_data_type &_data) : data(_data), channel(_channel) {} + heap_data_type data; + channel_key_type channel; + }; + + protected: + DataStructures::Map map; + DataStructures::Heap heap; + void GreatestRandResult(void); + }; + + template + OrderedChannelHeap::OrderedChannelHeap() + { + } + + template + OrderedChannelHeap::~OrderedChannelHeap() + { + Clear(); + } + + template + void OrderedChannelHeap::Push(const channel_key_type &channelID, const heap_data_type &data) + { + PushAtHead(MAX_UNSIGNED_LONG, channelID, data); + } + + template + void OrderedChannelHeap::GreatestRandResult(void) + { + double greatest; + unsigned i; + greatest=0.0; + for (i=0; i < map.Size(); i++) + { + if (map[i]->randResultQueue.Size() && map[i]->randResultQueue[0]>greatest) + greatest=map[i]->randResultQueue[0]; + } + return greatest; + } + + template + void OrderedChannelHeap::PushAtHead(const unsigned index, const channel_key_type &channelID, const heap_data_type &data) + { + // If an assert hits here then this is an unknown channel. Call AddChannel first. + QueueAndWeight *queueAndWeight=map.Get(channelID); + double maxRange, minRange, rnd; + if (queueAndWeight->randResultQueue.Size()==0) + { + // Set maxRange to the greatest random number waiting to be returned, rather than 1.0 necessarily + // This is so weights are scaled similarly among channels. For example, if the head weight for a used channel was .25 + // and then we added another channel, the new channel would need to choose between .25 and 0 + // If we chose between 1.0 and 0, it would be 1/.25 (4x) more likely to be at the head of the heap than it should be + maxRange=GreatestRandResult(); + if (maxRange==0.0) + maxRange=1.0; + minRange=0.0; + } + else if (index >= queueAndWeight->randResultQueue.Size()) + { + maxRange=queueAndWeight->randResultQueue[queueAndWeight->randResultQueue.Size()-1]*.99999999; + minRange=0.0; + } + else + { + if (index==0) + { + maxRange=GreatestRandResult(); + if (maxRange==queueAndWeight->randResultQueue[0]) + maxRange=1.0; + } + else if (index >= queueAndWeight->randResultQueue.Size()) + maxRange=queueAndWeight->randResultQueue[queueAndWeight->randResultQueue.Size()-1]*.99999999; + else + maxRange=queueAndWeight->randResultQueue[index-1]*.99999999; + + minRange=maxRange=queueAndWeight->randResultQueue[index]*1.00000001; + } + +#ifdef _DEBUG + RakAssert(maxRange!=0.0); +#endif + rnd=frandomMT() * (maxRange - minRange); + if (rnd==0.0) + rnd=maxRange/2.0; + + if (index >= queueAndWeight->randResultQueue.Size()) + queueAndWeight->randResultQueue.Push(rnd); + else + queueAndWeight->randResultQueue.PushAtHead(rnd, index); + + heap.Push(rnd*queueAndWeight->weight, HeapChannelAndData(channelID, data)); + } + + template + heap_data_type OrderedChannelHeap::Pop(const unsigned startingIndex) + { + RakAssert(startingIndex < heap.Size()); + + QueueAndWeight *queueAndWeight=map.Get(heap[startingIndex].channel); + if (startingIndex!=0) + { + // Ugly - have to count in the heap how many nodes have the same channel, so we know where to delete from in the queue + unsigned indiceCount=0; + unsigned i; + for (i=0; i < startingIndex; i++) + if (channel_key_comparison_func(heap[i].channel,heap[startingIndex].channel)==0) + indiceCount++; + queueAndWeight->randResultQueue.RemoveAtIndex(indiceCount); + } + else + { + // TODO - ordered channel heap uses progressively lower values as items are inserted. But this won't give relative ordering among channels. I have to renormalize after every pop. + queueAndWeight->randResultQueue.Pop(); + } + + // Try to remove the channel after every pop, because doing so is not valid while there are elements in the list. + if (queueAndWeight->signalDeletion) + RemoveChannel(heap[startingIndex].channel); + + return heap.Pop(startingIndex).data; + } + + template + heap_data_type OrderedChannelHeap::Peek(const unsigned startingIndex) const + { + HeapChannelAndData heapChannelAndData = heap.Peek(startingIndex); + return heapChannelAndData.data; + } + + template + void OrderedChannelHeap::AddChannel(const channel_key_type &channelID, const double weight) + { + QueueAndWeight *qaw = RakNet::OP_NEW( _FILE_AND_LINE_ ); + qaw->weight=weight; + qaw->signalDeletion=false; + map.SetNew(channelID, qaw); + } + + template + void OrderedChannelHeap::RemoveChannel(channel_key_type channelID) + { + if (map.Has(channelID)) + { + unsigned i; + i=map.GetIndexAtKey(channelID); + if (map[i]->randResultQueue.Size()==0) + { + RakNet::OP_DELETE(map[i], _FILE_AND_LINE_); + map.RemoveAtIndex(i); + } + else + { + // Signal this channel for deletion later, because the heap has nodes with this channel right now + map[i]->signalDeletion=true; + } + } + } + + template + unsigned OrderedChannelHeap::Size(void) const + { + return heap.Size(); + } + + template + heap_data_type& OrderedChannelHeap::operator[]( const unsigned int position ) const + { + return heap[position].data; + } + + + template + unsigned OrderedChannelHeap::ChannelSize(const channel_key_type &channelID) + { + QueueAndWeight *queueAndWeight=map.Get(channelID); + return queueAndWeight->randResultQueue.Size(); + } + + template + void OrderedChannelHeap::Clear(void) + { + unsigned i; + for (i=0; i < map.Size(); i++) + RakNet::OP_DELETE(map[i], _FILE_AND_LINE_); + map.Clear(_FILE_AND_LINE_); + heap.Clear(_FILE_AND_LINE_); + } +} + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_OrderedList.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_OrderedList.h new file mode 100644 index 0000000..b979def --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_OrderedList.h @@ -0,0 +1,263 @@ +/// \file DS_OrderedList.h +/// \internal +/// \brief Quicksort ordered list. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#include "DS_List.h" +#include "RakMemoryOverride.h" +#include "Export.h" + +#ifndef __ORDERED_LIST_H +#define __ORDERED_LIST_H + +/// The namespace DataStructures was only added to avoid compiler errors for commonly named data structures +/// As these data structures are stand-alone, you can use them outside of RakNet for your own projects if you wish. +namespace DataStructures +{ + template + int defaultOrderedListComparison(const key_type &a, const data_type &b) + { + if (a > + class RAK_DLL_EXPORT OrderedList + { + public: + static void IMPLEMENT_DEFAULT_COMPARISON(void) {DataStructures::defaultOrderedListComparison(key_type(),data_type());} + + OrderedList(); + ~OrderedList(); + OrderedList( const OrderedList& original_copy ); + OrderedList& operator= ( const OrderedList& original_copy ); + + /// comparisonFunction must take a key_type and a data_type and return <0, ==0, or >0 + /// If the data type has comparison operators already defined then you can just use defaultComparison + bool HasData(const key_type &key, int (*cf)(const key_type&, const data_type&)=default_comparison_function) const; + // GetIndexFromKey returns where the insert should go at the same time checks if it is there + unsigned GetIndexFromKey(const key_type &key, bool *objectExists, int (*cf)(const key_type&, const data_type&)=default_comparison_function) const; + data_type GetElementFromKey(const key_type &key, int (*cf)(const key_type&, const data_type&)=default_comparison_function) const; + bool GetElementFromKey(const key_type &key, data_type &element, int (*cf)(const key_type&, const data_type&)=default_comparison_function) const; + unsigned Insert(const key_type &key, const data_type &data, bool assertOnDuplicate, const char *file, unsigned int line, int (*cf)(const key_type&, const data_type&)=default_comparison_function); + unsigned Remove(const key_type &key, int (*cf)(const key_type&, const data_type&)=default_comparison_function); + unsigned RemoveIfExists(const key_type &key, int (*cf)(const key_type&, const data_type&)=default_comparison_function); + data_type& operator[] ( const unsigned int position ) const; + void RemoveAtIndex(const unsigned index); + void InsertAtIndex(const data_type &data, const unsigned index, const char *file, unsigned int line); + void InsertAtEnd(const data_type &data, const char *file, unsigned int line); + void RemoveFromEnd(const unsigned num=1); + void Clear(bool doNotDeallocate, const char *file, unsigned int line); + unsigned Size(void) const; + + protected: + DataStructures::List orderedList; + }; + + template + OrderedList::OrderedList() + { + } + + template + OrderedList::~OrderedList() + { + Clear(false, _FILE_AND_LINE_); + } + + template + OrderedList::OrderedList( const OrderedList& original_copy ) + { + orderedList=original_copy.orderedList; + } + + template + OrderedList& OrderedList::operator= ( const OrderedList& original_copy ) + { + orderedList=original_copy.orderedList; + return *this; + } + + template + bool OrderedList::HasData(const key_type &key, int (*cf)(const key_type&, const data_type&)) const + { + bool objectExists; + GetIndexFromKey(key, &objectExists, cf); + return objectExists; + } + + template + data_type OrderedList::GetElementFromKey(const key_type &key, int (*cf)(const key_type&, const data_type&)) const + { + bool objectExists; + unsigned index; + index = GetIndexFromKey(key, &objectExists, cf); + RakAssert(objectExists); + return orderedList[index]; + } + template + bool OrderedList::GetElementFromKey(const key_type &key, data_type &element, int (*cf)(const key_type&, const data_type&)) const + { + bool objectExists; + unsigned index; + index = GetIndexFromKey(key, &objectExists, cf); + if (objectExists) + element = orderedList[index]; + return objectExists; + } + template + unsigned OrderedList::GetIndexFromKey(const key_type &key, bool *objectExists, int (*cf)(const key_type&, const data_type&)) const + { + int index, upperBound, lowerBound; + int res; + + if (orderedList.Size()==0) + { + *objectExists=false; + return 0; + } + + upperBound=(int)orderedList.Size()-1; + lowerBound=0; + index = (int)orderedList.Size()/2; + +#ifdef _MSC_VER + #pragma warning( disable : 4127 ) // warning C4127: conditional expression is constant +#endif + while (1) + { + res = cf(key,orderedList[index]); + if (res==0) + { + *objectExists=true; + return index; + } + else if (res<0) + { + upperBound=index-1; + } + else// if (res>0) + { + lowerBound=index+1; + } + + index=lowerBound+(upperBound-lowerBound)/2; + + if (lowerBound>upperBound) + { + *objectExists=false; + return lowerBound; // No match + } + } + } + + template + unsigned OrderedList::Insert(const key_type &key, const data_type &data, bool assertOnDuplicate, const char *file, unsigned int line, int (*cf)(const key_type&, const data_type&)) + { + (void) assertOnDuplicate; + bool objectExists; + unsigned index; + index = GetIndexFromKey(key, &objectExists, cf); + + // Don't allow duplicate insertion. + if (objectExists) + { + // This is usually a bug! + RakAssert(assertOnDuplicate==false); + return (unsigned)-1; + } + + if (index>=orderedList.Size()) + { + orderedList.Insert(data, file, line); + return orderedList.Size()-1; + } + else + { + orderedList.Insert(data,index, file, line); + return index; + } + } + + template + unsigned OrderedList::Remove(const key_type &key, int (*cf)(const key_type&, const data_type&)) + { + bool objectExists; + unsigned index; + index = GetIndexFromKey(key, &objectExists, cf); + + // Can't find the element to remove if this assert hits + // RakAssert(objectExists==true); + if (objectExists==false) + { + RakAssert(objectExists==true); + return 0; + } + + orderedList.RemoveAtIndex(index); + return index; + } + + template + unsigned OrderedList::RemoveIfExists(const key_type &key, int (*cf)(const key_type&, const data_type&)) + { + bool objectExists; + unsigned index; + index = GetIndexFromKey(key, &objectExists, cf); + + // Can't find the element to remove if this assert hits + if (objectExists==false) + return 0; + + orderedList.RemoveAtIndex(index); + return index; + } + + template + void OrderedList::RemoveAtIndex(const unsigned index) + { + orderedList.RemoveAtIndex(index); + } + + template + void OrderedList::InsertAtIndex(const data_type &data, const unsigned index, const char *file, unsigned int line) + { + orderedList.Insert(data, index, file, line); + } + + template + void OrderedList::InsertAtEnd(const data_type &data, const char *file, unsigned int line) + { + orderedList.Insert(data, file, line); + } + + template + void OrderedList::RemoveFromEnd(const unsigned num) + { + orderedList.RemoveFromEnd(num); + } + + template + void OrderedList::Clear(bool doNotDeallocate, const char *file, unsigned int line) + { + orderedList.Clear(doNotDeallocate, file, line); + } + + template + data_type& OrderedList::operator[]( const unsigned int position ) const + { + return orderedList[position]; + } + + template + unsigned OrderedList::Size(void) const + { + return orderedList.Size(); + } +} + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_Queue.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_Queue.h new file mode 100644 index 0000000..ffa22af --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_Queue.h @@ -0,0 +1,435 @@ +/// \file DS_Queue.h +/// \internal +/// \brief A queue used by RakNet. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __QUEUE_H +#define __QUEUE_H + +// Template classes have to have all the code in the header file +#include "RakAssert.h" +#include "Export.h" +#include "RakMemoryOverride.h" + +/// The namespace DataStructures was only added to avoid compiler errors for commonly named data structures +/// As these data structures are stand-alone, you can use them outside of RakNet for your own projects if you wish. +namespace DataStructures +{ + /// \brief A queue implemented as an array with a read and write index. + template + class RAK_DLL_EXPORT Queue + { + public: + Queue(); + ~Queue(); + Queue( Queue& original_copy ); + bool operator= ( const Queue& original_copy ); + void Push( const queue_type& input, const char *file, unsigned int line ); + void PushAtHead( const queue_type& input, unsigned index, const char *file, unsigned int line ); + queue_type& operator[] ( unsigned int position ) const; // Not a normal thing you do with a queue but can be used for efficiency + void RemoveAtIndex( unsigned int position ); // Not a normal thing you do with a queue but can be used for efficiency + inline queue_type Peek( void ) const; + inline queue_type PeekTail( void ) const; + inline queue_type Pop( void ); + // Debug: Set pointer to 0, for memory leak detection + inline queue_type PopDeref( void ); + inline unsigned int Size( void ) const; + inline bool IsEmpty(void) const; + inline unsigned int AllocationSize( void ) const; + inline void Clear( const char *file, unsigned int line ); + void Compress( const char *file, unsigned int line ); + bool Find ( queue_type q ); + void ClearAndForceAllocation( int size, const char *file, unsigned int line ); // Force a memory allocation to a certain larger size + + private: + queue_type* array; + unsigned int head; // Array index for the head of the queue + unsigned int tail; // Array index for the tail of the queue + unsigned int allocation_size; + }; + + + template + inline unsigned int Queue::Size( void ) const + { + if ( head <= tail ) + return tail -head; + else + return allocation_size -head + tail; + } + + template + inline bool Queue::IsEmpty(void) const + { + return head==tail; + } + + template + inline unsigned int Queue::AllocationSize( void ) const + { + return allocation_size; + } + + template + Queue::Queue() + { + //allocation_size = 16; + //array = RakNet::OP_NEW_ARRAY(allocation_size, _FILE_AND_LINE_ ); + allocation_size = 0; + array=0; + head = 0; + tail = 0; + } + + template + Queue::~Queue() + { + if (allocation_size>0) + RakNet::OP_DELETE_ARRAY(array, _FILE_AND_LINE_); + } + + template + inline queue_type Queue::Pop( void ) + { +#ifdef _DEBUG + RakAssert( head != tail); +#endif + //head=(head+1) % allocation_size; + + if ( ++head == allocation_size ) + head = 0; + + if ( head == 0 ) + return ( queue_type ) array[ allocation_size -1 ]; + + return ( queue_type ) array[ head -1 ]; + } + + template + inline queue_type Queue::PopDeref( void ) + { + if ( ++head == allocation_size ) + head = 0; + + queue_type q; + if ( head == 0 ) + { + q=array[ allocation_size -1 ]; + array[ allocation_size -1 ]=0; + return q; + } + + q=array[ head -1 ]; + array[ head -1 ]=0; + return q; + } + + template + void Queue::PushAtHead( const queue_type& input, unsigned index, const char *file, unsigned int line ) + { + RakAssert(index <= Size()); + + // Just force a reallocation, will be overwritten + Push(input, file, line ); + + if (Size()==1) + return; + + unsigned writeIndex, readIndex, trueWriteIndex, trueReadIndex; + writeIndex=Size()-1; + readIndex=writeIndex-1; + while (readIndex >= index) + { + if ( head + writeIndex >= allocation_size ) + trueWriteIndex = head + writeIndex - allocation_size; + else + trueWriteIndex = head + writeIndex; + + if ( head + readIndex >= allocation_size ) + trueReadIndex = head + readIndex - allocation_size; + else + trueReadIndex = head + readIndex; + + array[trueWriteIndex]=array[trueReadIndex]; + + if (readIndex==0) + break; + writeIndex--; + readIndex--; + } + + if ( head + index >= allocation_size ) + trueWriteIndex = head + index - allocation_size; + else + trueWriteIndex = head + index; + + array[trueWriteIndex]=input; + } + + + template + inline queue_type Queue::Peek( void ) const + { +#ifdef _DEBUG + RakAssert( head != tail ); +#endif + + return ( queue_type ) array[ head ]; + } + + template + inline queue_type Queue::PeekTail( void ) const + { +#ifdef _DEBUG + RakAssert( head != tail ); +#endif + if (tail!=0) + return ( queue_type ) array[ tail-1 ]; + else + return ( queue_type ) array[ allocation_size-1 ]; + } + + template + void Queue::Push( const queue_type& input, const char *file, unsigned int line ) + { + if ( allocation_size == 0 ) + { + array = RakNet::OP_NEW_ARRAY(16, file, line ); + head = 0; + tail = 1; + array[ 0 ] = input; + allocation_size = 16; + return ; + } + + array[ tail++ ] = input; + + if ( tail == allocation_size ) + tail = 0; + + if ( tail == head ) + { + // unsigned int index=tail; + + // Need to allocate more memory. + queue_type * new_array; + new_array = RakNet::OP_NEW_ARRAY(allocation_size * 2, file, line ); +#ifdef _DEBUG + RakAssert( new_array ); +#endif + if (new_array==0) + return; + + for ( unsigned int counter = 0; counter < allocation_size; ++counter ) + new_array[ counter ] = array[ ( head + counter ) % ( allocation_size ) ]; + + head = 0; + + tail = allocation_size; + + allocation_size *= 2; + + // Delete the old array and move the pointer to the new array + RakNet::OP_DELETE_ARRAY(array, file, line); + + array = new_array; + } + + } + + template + Queue::Queue( Queue& original_copy ) + { + // Allocate memory for copy + + if ( original_copy.Size() == 0 ) + { + allocation_size = 0; + } + + else + { + array = RakNet::OP_NEW_ARRAY( original_copy.Size() + 1 , _FILE_AND_LINE_ ); + + for ( unsigned int counter = 0; counter < original_copy.Size(); ++counter ) + array[ counter ] = original_copy.array[ ( original_copy.head + counter ) % ( original_copy.allocation_size ) ]; + + head = 0; + + tail = original_copy.Size(); + + allocation_size = original_copy.Size() + 1; + } + } + + template + bool Queue::operator= ( const Queue& original_copy ) + { + if ( ( &original_copy ) == this ) + return false; + + Clear(_FILE_AND_LINE_); + + // Allocate memory for copy + if ( original_copy.Size() == 0 ) + { + allocation_size = 0; + } + + else + { + array = RakNet::OP_NEW_ARRAY( original_copy.Size() + 1 , _FILE_AND_LINE_ ); + + for ( unsigned int counter = 0; counter < original_copy.Size(); ++counter ) + array[ counter ] = original_copy.array[ ( original_copy.head + counter ) % ( original_copy.allocation_size ) ]; + + head = 0; + + tail = original_copy.Size(); + + allocation_size = original_copy.Size() + 1; + } + + return true; + } + + template + inline void Queue::Clear ( const char *file, unsigned int line ) + { + if ( allocation_size == 0 ) + return ; + + if (allocation_size > 32) + { + RakNet::OP_DELETE_ARRAY(array, file, line); + allocation_size = 0; + } + + head = 0; + tail = 0; + } + + template + void Queue::Compress ( const char *file, unsigned int line ) + { + queue_type* new_array; + unsigned int newAllocationSize; + if (allocation_size==0) + return; + + newAllocationSize=1; + while (newAllocationSize <= Size()) + newAllocationSize<<=1; // Must be a better way to do this but I'm too dumb to figure it out quickly :) + + new_array = RakNet::OP_NEW_ARRAY(newAllocationSize, file, line ); + + for (unsigned int counter=0; counter < Size(); ++counter) + new_array[counter] = array[(head + counter)%(allocation_size)]; + + tail=Size(); + allocation_size=newAllocationSize; + head=0; + + // Delete the old array and move the pointer to the new array + RakNet::OP_DELETE_ARRAY(array, file, line); + array=new_array; + } + + template + bool Queue::Find ( queue_type q ) + { + if ( allocation_size == 0 ) + return false; + + unsigned int counter = head; + + while ( counter != tail ) + { + if ( array[ counter ] == q ) + return true; + + counter = ( counter + 1 ) % allocation_size; + } + + return false; + } + + template + void Queue::ClearAndForceAllocation( int size, const char *file, unsigned int line ) + { + RakNet::OP_DELETE_ARRAY(array, file, line); + if (size>0) + array = RakNet::OP_NEW_ARRAY(size, file, line ); + else + array=0; + allocation_size = size; + head = 0; + tail = 0; + } + + template + inline queue_type& Queue::operator[] ( unsigned int position ) const + { +#ifdef _DEBUG + RakAssert( position < Size() ); +#endif + //return array[(head + position) % allocation_size]; + + if ( head + position >= allocation_size ) + return array[ head + position - allocation_size ]; + else + return array[ head + position ]; + } + + template + void Queue::RemoveAtIndex( unsigned int position ) + { +#ifdef _DEBUG + RakAssert( position < Size() ); + RakAssert( head != tail ); +#endif + + if ( head == tail || position >= Size() ) + return ; + + unsigned int index; + + unsigned int next; + + //index = (head + position) % allocation_size; + if ( head + position >= allocation_size ) + index = head + position - allocation_size; + else + index = head + position; + + //next = (index + 1) % allocation_size; + next = index + 1; + + if ( next == allocation_size ) + next = 0; + + while ( next != tail ) + { + // Overwrite the previous element + array[ index ] = array[ next ]; + index = next; + //next = (next + 1) % allocation_size; + + if ( ++next == allocation_size ) + next = 0; + } + + // Move the tail back + if ( tail == 0 ) + tail = allocation_size - 1; + else + --tail; + } +} // End namespace + +#endif + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_QueueLinkedList.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_QueueLinkedList.h new file mode 100644 index 0000000..4b3499c --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_QueueLinkedList.h @@ -0,0 +1,103 @@ +/// \file DS_QueueLinkedList.h +/// \internal +/// \brief A queue implemented as a linked list. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __QUEUE_LINKED_LIST_H +#define __QUEUE_LINKED_LIST_H + +#include "DS_LinkedList.h" +#include "Export.h" +#include "RakMemoryOverride.h" + +/// The namespace DataStructures was only added to avoid compiler errors for commonly named data structures +/// As these data structures are stand-alone, you can use them outside of RakNet for your own projects if you wish. +namespace DataStructures +{ + /// \brief A queue implemented using a linked list. Rarely used. + template + class RAK_DLL_EXPORT QueueLinkedList + { + + public: + QueueLinkedList(); + QueueLinkedList( const QueueLinkedList& original_copy ); + bool operator= ( const QueueLinkedList& original_copy ); + QueueType Pop( void ); + QueueType& Peek( void ); + QueueType& EndPeek( void ); + void Push( const QueueType& input ); + unsigned int Size( void ); + void Clear( void ); + void Compress( void ); + + private: + LinkedList data; + }; + + template + QueueLinkedList::QueueLinkedList() + { + } + + template + inline unsigned int QueueLinkedList::Size() + { + return data.Size(); + } + + template + inline QueueType QueueLinkedList::Pop( void ) + { + data.Beginning(); + return ( QueueType ) data.Pop(); + } + + template + inline QueueType& QueueLinkedList::Peek( void ) + { + data.Beginning(); + return ( QueueType ) data.Peek(); + } + + template + inline QueueType& QueueLinkedList::EndPeek( void ) + { + data.End(); + return ( QueueType ) data.Peek(); + } + + template + void QueueLinkedList::Push( const QueueType& input ) + { + data.End(); + data.Add( input ); + } + + template + QueueLinkedList::QueueLinkedList( const QueueLinkedList& original_copy ) + { + data = original_copy.data; + } + + template + bool QueueLinkedList::operator= ( const QueueLinkedList& original_copy ) + { + if ( ( &original_copy ) == this ) + return false; + + data = original_copy.data; + } + + template + void QueueLinkedList::Clear ( void ) + { + data.Clear(); + } +} // End namespace + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_RangeList.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_RangeList.h new file mode 100644 index 0000000..4136737 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_RangeList.h @@ -0,0 +1,236 @@ +/// \file DS_RangeList.h +/// \internal +/// \brief A queue implemented as a linked list. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __RANGE_LIST_H +#define __RANGE_LIST_H + +#include "DS_OrderedList.h" +#include "BitStream.h" +#include "RakMemoryOverride.h" +#include "RakAssert.h" + +namespace DataStructures +{ + template + struct RangeNode + { + RangeNode() {} + ~RangeNode() {} + RangeNode(range_type min, range_type max) {minIndex=min; maxIndex=max;} + range_type minIndex; + range_type maxIndex; + }; + + + template + int RangeNodeComp(const range_type &a, const RangeNode &b) + { + if (a + class RAK_DLL_EXPORT RangeList + { + public: + RangeList(); + ~RangeList(); + void Insert(range_type index); + void Clear(void); + unsigned Size(void) const; + unsigned RangeSum(void) const; + RakNet::BitSize_t Serialize(RakNet::BitStream *in, RakNet::BitSize_t maxBits, bool clearSerialized); + bool Deserialize(RakNet::BitStream *out); + + DataStructures::OrderedList , RangeNodeComp > ranges; + }; + + template + RakNet::BitSize_t RangeList::Serialize(RakNet::BitStream *in, RakNet::BitSize_t maxBits, bool clearSerialized) + { + RakAssert(ranges.Size() < (unsigned short)-1); + RakNet::BitStream tempBS; + RakNet::BitSize_t bitsWritten; + unsigned short countWritten; + unsigned i; + countWritten=0; + bitsWritten=0; + for (i=0; i < ranges.Size(); i++) + { + if ((int)sizeof(unsigned short)*8+bitsWritten+(int)sizeof(range_type)*8*2+1>maxBits) + break; + unsigned char minEqualsMax; + if (ranges[i].minIndex==ranges[i].maxIndex) + minEqualsMax=1; + else + minEqualsMax=0; + tempBS.Write(minEqualsMax); // Use one byte, intead of one bit, for speed, as this is done a lot + tempBS.Write(ranges[i].minIndex); + bitsWritten+=sizeof(range_type)*8+8; + if (ranges[i].minIndex!=ranges[i].maxIndex) + { + tempBS.Write(ranges[i].maxIndex); + bitsWritten+=sizeof(range_type)*8; + } + countWritten++; + } + + in->AlignWriteToByteBoundary(); + RakNet::BitSize_t before=in->GetWriteOffset(); + in->Write(countWritten); + bitsWritten+=in->GetWriteOffset()-before; + // RAKNET_DEBUG_PRINTF("%i ", in->GetNumberOfBitsUsed()); + in->Write(&tempBS, tempBS.GetNumberOfBitsUsed()); + // RAKNET_DEBUG_PRINTF("%i %i \n", tempBS.GetNumberOfBitsUsed(),in->GetNumberOfBitsUsed()); + + if (clearSerialized && countWritten) + { + unsigned rangeSize=ranges.Size(); + for (i=0; i < rangeSize-countWritten; i++) + { + ranges[i]=ranges[i+countWritten]; + } + ranges.RemoveFromEnd(countWritten); + } + + return bitsWritten; + } + template + bool RangeList::Deserialize(RakNet::BitStream *out) + { + ranges.Clear(true, _FILE_AND_LINE_); + unsigned short count; + out->AlignReadToByteBoundary(); + out->Read(count); + unsigned short i; + range_type min,max; + unsigned char maxEqualToMin=0; + + for (i=0; i < count; i++) + { + out->Read(maxEqualToMin); + if (out->Read(min)==false) + return false; + if (maxEqualToMin==false) + { + if (out->Read(max)==false) + return false; + if (max(min,max), _FILE_AND_LINE_); + } + return true; + } + + template + RangeList::RangeList() + { + RangeNodeComp(0, RangeNode()); + } + + template + RangeList::~RangeList() + { + Clear(); + } + + template + void RangeList::Insert(range_type index) + { + if (ranges.Size()==0) + { + ranges.Insert(index, RangeNode(index, index), true, _FILE_AND_LINE_); + return; + } + + bool objectExists; + unsigned insertionIndex=ranges.GetIndexFromKey(index, &objectExists); + if (insertionIndex==ranges.Size()) + { + if (index == ranges[insertionIndex-1].maxIndex+(range_type)1) + ranges[insertionIndex-1].maxIndex++; + else if (index > ranges[insertionIndex-1].maxIndex+(range_type)1) + { + // Insert at end + ranges.Insert(index, RangeNode(index, index), true, _FILE_AND_LINE_); + } + + return; + } + + if (index < ranges[insertionIndex].minIndex-(range_type)1) + { + // Insert here + ranges.InsertAtIndex(RangeNode(index, index), insertionIndex, _FILE_AND_LINE_); + + return; + } + else if (index == ranges[insertionIndex].minIndex-(range_type)1) + { + // Decrease minIndex and join left + ranges[insertionIndex].minIndex--; + if (insertionIndex>0 && ranges[insertionIndex-1].maxIndex+(range_type)1==ranges[insertionIndex].minIndex) + { + ranges[insertionIndex-1].maxIndex=ranges[insertionIndex].maxIndex; + ranges.RemoveAtIndex(insertionIndex); + } + + return; + } + else if (index >= ranges[insertionIndex].minIndex && index <= ranges[insertionIndex].maxIndex) + { + // Already exists + return; + } + else if (index == ranges[insertionIndex].maxIndex+(range_type)1) + { + // Increase maxIndex and join right + ranges[insertionIndex].maxIndex++; + if (insertionIndex + void RangeList::Clear(void) + { + ranges.Clear(true, _FILE_AND_LINE_); + } + + template + unsigned RangeList::Size(void) const + { + return ranges.Size(); + } + + template + unsigned RangeList::RangeSum(void) const + { + unsigned sum=0,i; + for (i=0; i < ranges.Size(); i++) + sum+=ranges[i].maxIndex-ranges[i].minIndex+1; + return sum; + } + +} + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_Table.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_Table.cpp new file mode 100644 index 0000000..0e35893 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_Table.cpp @@ -0,0 +1,1118 @@ +#include "DS_Table.h" +#include "DS_OrderedList.h" +#include +#include "RakAssert.h" +#include "RakAssert.h" +#include "Itoa.h" + +using namespace DataStructures; + +#ifdef _MSC_VER +#pragma warning( push ) +#endif + +void ExtendRows(Table::Row* input, int index) +{ + (void) index; + input->cells.Insert(RakNet::OP_NEW(_FILE_AND_LINE_), _FILE_AND_LINE_ ); +} +void FreeRow(Table::Row* input, int index) +{ + (void) index; + + unsigned i; + for (i=0; i < input->cells.Size(); i++) + { + RakNet::OP_DELETE(input->cells[i], _FILE_AND_LINE_); + } + RakNet::OP_DELETE(input, _FILE_AND_LINE_); +} +Table::Cell::Cell() +{ + isEmpty=true; + c=0; + ptr=0; + i=0.0; +} +Table::Cell::~Cell() +{ + Clear(); +} +Table::Cell& Table::Cell::operator = ( const Table::Cell& input ) +{ + isEmpty=input.isEmpty; + i=input.i; + ptr=input.ptr; + if (c) + rakFree_Ex(c, _FILE_AND_LINE_); + if (input.c) + { + c = (char*) rakMalloc_Ex( (int) i, _FILE_AND_LINE_ ); + memcpy(c, input.c, (int) i); + } + else + c=0; + return *this; +} +Table::Cell::Cell( const Table::Cell & input) +{ + isEmpty=input.isEmpty; + i=input.i; + ptr=input.ptr; + if (input.c) + { + if (c) + rakFree_Ex(c, _FILE_AND_LINE_); + c = (char*) rakMalloc_Ex( (int) i, _FILE_AND_LINE_ ); + memcpy(c, input.c, (int) i); + } +} +void Table::Cell::Set(double input) +{ + Clear(); + i=input; + c=0; + ptr=0; + isEmpty=false; +} +void Table::Cell::Set(unsigned int input) +{ + Set((int) input); +} +void Table::Cell::Set(int input) +{ + Clear(); + i=(double) input; + c=0; + ptr=0; + isEmpty=false; +} + +void Table::Cell::Set(const char *input) +{ + Clear(); + + if (input) + { + i=(int)strlen(input)+1; + c = (char*) rakMalloc_Ex( (int) i, _FILE_AND_LINE_ ); + strcpy(c, input); + } + else + { + c=0; + i=0; + } + ptr=0; + isEmpty=false; +} +void Table::Cell::Set(const char *input, int inputLength) +{ + Clear(); + if (input) + { + c = (char*) rakMalloc_Ex( inputLength, _FILE_AND_LINE_ ); + i=inputLength; + memcpy(c, input, inputLength); + } + else + { + c=0; + i=0; + } + ptr=0; + isEmpty=false; +} +void Table::Cell::SetPtr(void* p) +{ + Clear(); + c=0; + ptr=p; + isEmpty=false; +} +void Table::Cell::Get(int *output) +{ + RakAssert(isEmpty==false); + int o = (int) i; + *output=o; +} +void Table::Cell::Get(double *output) +{ + RakAssert(isEmpty==false); + *output=i; +} +void Table::Cell::Get(char *output) +{ + RakAssert(isEmpty==false); + strcpy(output, c); +} +void Table::Cell::Get(char *output, int *outputLength) +{ + RakAssert(isEmpty==false); + memcpy(output, c, (int) i); + if (outputLength) + *outputLength=(int) i; +} +RakNet::RakString Table::Cell::ToString(ColumnType columnType) +{ + if (isEmpty) + return RakNet::RakString(); + + if (columnType==NUMERIC) + { + return RakNet::RakString("%f", i); + } + else if (columnType==STRING) + { + return RakNet::RakString(c); + } + else if (columnType==BINARY) + { + return RakNet::RakString(""); + } + else if (columnType==POINTER) + { + return RakNet::RakString("%p", ptr); + } + + return RakNet::RakString(); +} +Table::Cell::Cell(double numericValue, char *charValue, void *ptr, ColumnType type) +{ + SetByType(numericValue,charValue,ptr,type); +} +void Table::Cell::SetByType(double numericValue, char *charValue, void *ptr, ColumnType type) +{ + isEmpty=true; + if (type==NUMERIC) + { + Set(numericValue); + } + else if (type==STRING) + { + Set(charValue); + } + else if (type==BINARY) + { + Set(charValue, (int) numericValue); + } + else if (type==POINTER) + { + SetPtr(ptr); + } + else + { + ptr=(void*) charValue; + } +} +Table::ColumnType Table::Cell::EstimateColumnType(void) const +{ + if (c) + if (i!=0.0f) + return BINARY; + else + return STRING; + if (ptr) + return POINTER; + return NUMERIC; +} +void Table::Cell::Clear(void) +{ + if (isEmpty==false && c) + { + rakFree_Ex(c, _FILE_AND_LINE_); + c=0; + } + isEmpty=true; +} +Table::ColumnDescriptor::ColumnDescriptor() +{ + +} +Table::ColumnDescriptor::~ColumnDescriptor() +{ + +} +Table::ColumnDescriptor::ColumnDescriptor(const char cn[_TABLE_MAX_COLUMN_NAME_LENGTH], ColumnType ct) +{ + columnType=ct; + strcpy(columnName, cn); +} +void Table::Row::UpdateCell(unsigned columnIndex, double value) +{ + cells[columnIndex]->Clear(); + cells[columnIndex]->Set(value); + +// cells[columnIndex]->i=value; +// cells[columnIndex]->c=0; +// cells[columnIndex]->isEmpty=false; +} +void Table::Row::UpdateCell(unsigned columnIndex, const char *str) +{ + cells[columnIndex]->Clear(); + cells[columnIndex]->Set(str); +} +void Table::Row::UpdateCell(unsigned columnIndex, int byteLength, const char *data) +{ + cells[columnIndex]->Clear(); + cells[columnIndex]->Set(data,byteLength); +} +Table::Table() +{ +} +Table::~Table() +{ + Clear(); +} +unsigned Table::AddColumn(const char columnName[_TABLE_MAX_COLUMN_NAME_LENGTH], ColumnType columnType) +{ + if (columnName[0]==0) + return (unsigned) -1; + + // Add this column. + columns.Insert(Table::ColumnDescriptor(columnName, columnType), _FILE_AND_LINE_); + + // Extend the rows by one + rows.ForEachData(ExtendRows); + + return columns.Size()-1; +} +void Table::RemoveColumn(unsigned columnIndex) +{ + if (columnIndex >= columns.Size()) + return; + + columns.RemoveAtIndex(columnIndex); + + // Remove this index from each row. + int i; + DataStructures::Page *cur = rows.GetListHead(); + while (cur) + { + for (i=0; i < cur->size; i++) + { + RakNet::OP_DELETE(cur->data[i]->cells[columnIndex], _FILE_AND_LINE_); + cur->data[i]->cells.RemoveAtIndex(columnIndex); + } + + cur=cur->next; + } +} +unsigned Table::ColumnIndex(const char *columnName) const +{ + unsigned columnIndex; + for (columnIndex=0; columnIndex= columns.Size()) + return 0; + else + return (char*)columns[index].columnName; +} +Table::ColumnType Table::GetColumnType(unsigned index) const +{ + if (index >= columns.Size()) + return (Table::ColumnType) 0; + else + return columns[index].columnType; +} +unsigned Table::GetColumnCount(void) const +{ + return columns.Size(); +} +unsigned Table::GetRowCount(void) const +{ + return rows.Size(); +} +Table::Row* Table::AddRow(unsigned rowId) +{ + Row *newRow; + newRow = RakNet::OP_NEW( _FILE_AND_LINE_ ); + if (rows.Insert(rowId, newRow)==false) + { + RakNet::OP_DELETE(newRow, _FILE_AND_LINE_); + return 0; // Already exists + } + unsigned rowIndex; + for (rowIndex=0; rowIndex < columns.Size(); rowIndex++) + newRow->cells.Insert( RakNet::OP_NEW(_FILE_AND_LINE_), _FILE_AND_LINE_ ); + return newRow; +} +Table::Row* Table::AddRow(unsigned rowId, DataStructures::List &initialCellValues) +{ + Row *newRow = RakNet::OP_NEW( _FILE_AND_LINE_ ); + unsigned rowIndex; + for (rowIndex=0; rowIndex < columns.Size(); rowIndex++) + { + if (rowIndex < initialCellValues.Size() && initialCellValues[rowIndex].isEmpty==false) + { + Table::Cell *c; + c = RakNet::OP_NEW(_FILE_AND_LINE_); + c->SetByType(initialCellValues[rowIndex].i,initialCellValues[rowIndex].c,initialCellValues[rowIndex].ptr,columns[rowIndex].columnType); + newRow->cells.Insert(c, _FILE_AND_LINE_ ); + } + else + newRow->cells.Insert(RakNet::OP_NEW(_FILE_AND_LINE_), _FILE_AND_LINE_ ); + } + rows.Insert(rowId, newRow); + return newRow; +} +Table::Row* Table::AddRow(unsigned rowId, DataStructures::List &initialCellValues, bool copyCells) +{ + Row *newRow = RakNet::OP_NEW( _FILE_AND_LINE_ ); + unsigned rowIndex; + for (rowIndex=0; rowIndex < columns.Size(); rowIndex++) + { + if (rowIndex < initialCellValues.Size() && initialCellValues[rowIndex] && initialCellValues[rowIndex]->isEmpty==false) + { + if (copyCells==false) + newRow->cells.Insert(RakNet::OP_NEW_4( _FILE_AND_LINE_, initialCellValues[rowIndex]->i, initialCellValues[rowIndex]->c, initialCellValues[rowIndex]->ptr, columns[rowIndex].columnType), _FILE_AND_LINE_); + else + { + Table::Cell *c = RakNet::OP_NEW( _FILE_AND_LINE_ ); + newRow->cells.Insert(c, _FILE_AND_LINE_); + *c=*(initialCellValues[rowIndex]); + } + } + else + newRow->cells.Insert(RakNet::OP_NEW(_FILE_AND_LINE_), _FILE_AND_LINE_); + } + rows.Insert(rowId, newRow); + return newRow; +} +Table::Row* Table::AddRowColumns(unsigned rowId, Row *row, DataStructures::List columnIndices) +{ + Row *newRow = RakNet::OP_NEW( _FILE_AND_LINE_ ); + unsigned columnIndex; + for (columnIndex=0; columnIndex < columnIndices.Size(); columnIndex++) + { + if (row->cells[columnIndices[columnIndex]]->isEmpty==false) + { + newRow->cells.Insert(RakNet::OP_NEW_4( _FILE_AND_LINE_, + row->cells[columnIndices[columnIndex]]->i, + row->cells[columnIndices[columnIndex]]->c, + row->cells[columnIndices[columnIndex]]->ptr, + columns[columnIndex].columnType + ), _FILE_AND_LINE_); + } + else + { + newRow->cells.Insert(RakNet::OP_NEW(_FILE_AND_LINE_), _FILE_AND_LINE_); + } + } + rows.Insert(rowId, newRow); + return newRow; +} +bool Table::RemoveRow(unsigned rowId) +{ + Row *out; + if (rows.Delete(rowId, out)) + { + DeleteRow(out); + return true; + } + return false; +} +void Table::RemoveRows(Table *tableContainingRowIDs) +{ + unsigned i; + DataStructures::Page *cur = tableContainingRowIDs->GetRows().GetListHead(); + while (cur) + { + for (i=0; i < (unsigned)cur->size; i++) + { + rows.Delete(cur->keys[i]); + } + cur=cur->next; + } + return; +} +bool Table::UpdateCell(unsigned rowId, unsigned columnIndex, int value) +{ + RakAssert(columns[columnIndex].columnType==NUMERIC); + + Row *row = GetRowByID(rowId); + if (row) + { + row->UpdateCell(columnIndex, value); + return true; + } + return false; +} +bool Table::UpdateCell(unsigned rowId, unsigned columnIndex, char *str) +{ + RakAssert(columns[columnIndex].columnType==STRING); + + Row *row = GetRowByID(rowId); + if (row) + { + row->UpdateCell(columnIndex, str); + return true; + } + return false; +} +bool Table::UpdateCell(unsigned rowId, unsigned columnIndex, int byteLength, char *data) +{ + RakAssert(columns[columnIndex].columnType==BINARY); + + Row *row = GetRowByID(rowId); + if (row) + { + row->UpdateCell(columnIndex, byteLength, data); + return true; + } + return false; +} +bool Table::UpdateCellByIndex(unsigned rowIndex, unsigned columnIndex, int value) +{ + RakAssert(columns[columnIndex].columnType==NUMERIC); + + Row *row = GetRowByIndex(rowIndex,0); + if (row) + { + row->UpdateCell(columnIndex, value); + return true; + } + return false; +} +bool Table::UpdateCellByIndex(unsigned rowIndex, unsigned columnIndex, char *str) +{ + RakAssert(columns[columnIndex].columnType==STRING); + + Row *row = GetRowByIndex(rowIndex,0); + if (row) + { + row->UpdateCell(columnIndex, str); + return true; + } + return false; +} +bool Table::UpdateCellByIndex(unsigned rowIndex, unsigned columnIndex, int byteLength, char *data) +{ + RakAssert(columns[columnIndex].columnType==BINARY); + + Row *row = GetRowByIndex(rowIndex,0); + if (row) + { + row->UpdateCell(columnIndex, byteLength, data); + return true; + } + return false; +} +void Table::GetCellValueByIndex(unsigned rowIndex, unsigned columnIndex, int *output) +{ + RakAssert(columns[columnIndex].columnType==NUMERIC); + + Row *row = GetRowByIndex(rowIndex,0); + if (row) + { + row->cells[columnIndex]->Get(output); + } +} +void Table::GetCellValueByIndex(unsigned rowIndex, unsigned columnIndex, char *output) +{ + RakAssert(columns[columnIndex].columnType==STRING); + + Row *row = GetRowByIndex(rowIndex,0); + if (row) + { + row->cells[columnIndex]->Get(output); + } +} +void Table::GetCellValueByIndex(unsigned rowIndex, unsigned columnIndex, char *output, int *outputLength) +{ + RakAssert(columns[columnIndex].columnType==BINARY); + + Row *row = GetRowByIndex(rowIndex,0); + if (row) + { + row->cells[columnIndex]->Get(output, outputLength); + } +} +Table::FilterQuery::FilterQuery() +{ + columnName[0]=0; +} +Table::FilterQuery::~FilterQuery() +{ + +} +Table::FilterQuery::FilterQuery(unsigned column, Cell *cell, FilterQueryType op) +{ + columnIndex=column; + cellValue=cell; + operation=op; +} +Table::Row* Table::GetRowByID(unsigned rowId) const +{ + Row *row; + if (rows.Get(rowId, row)) + return row; + return 0; +} + +Table::Row* Table::GetRowByIndex(unsigned rowIndex, unsigned *key) const +{ + DataStructures::Page *cur = rows.GetListHead(); + while (cur) + { + if (rowIndex < (unsigned)cur->size) + { + if (key) + *key=cur->keys[rowIndex]; + return cur->data[rowIndex]; + } + if (rowIndex <= (unsigned)cur->size) + rowIndex-=cur->size; + else + return 0; + cur=cur->next; + } + return 0; +} + +void Table::QueryTable(unsigned *columnIndicesSubset, unsigned numColumnSubset, FilterQuery *inclusionFilters, unsigned numInclusionFilters, unsigned *rowIds, unsigned numRowIDs, Table *result) +{ + unsigned i; + DataStructures::List columnIndicesToReturn; + + // Clear the result table. + result->Clear(); + + if (columnIndicesSubset && numColumnSubset>0) + { + for (i=0; i < numColumnSubset; i++) + { + if (columnIndicesSubset[i]AddColumn(columns[columnIndicesToReturn[i]].columnName,columns[columnIndicesToReturn[i]].columnType); + } + + // Get the column indices of the filter queries. + DataStructures::List inclusionFilterColumnIndices; + if (inclusionFilters && numInclusionFilters>0) + { + for (i=0; i < numInclusionFilters; i++) + { + if (inclusionFilters[i].columnName[0]) + inclusionFilters[i].columnIndex=ColumnIndex(inclusionFilters[i].columnName); + if (inclusionFilters[i].columnIndex *cur = rows.GetListHead(); + while (cur) + { + for (i=0; i < (unsigned)cur->size; i++) + { + QueryRow(inclusionFilterColumnIndices, columnIndicesToReturn, cur->keys[i], cur->data[i], inclusionFilters, result); + } + cur=cur->next; + } + } + else + { + // Specific rows + Row *row; + for (i=0; i < numRowIDs; i++) + { + if (rows.Get(rowIds[i], row)) + { + QueryRow(inclusionFilterColumnIndices, columnIndicesToReturn, rowIds[i], row, inclusionFilters, result); + } + } + } +} + +void Table::QueryRow(DataStructures::List &inclusionFilterColumnIndices, DataStructures::List &columnIndicesToReturn, unsigned key, Table::Row* row, FilterQuery *inclusionFilters, Table *result) +{ + bool pass=false; + unsigned columnIndex; + unsigned j; + + // If no inclusion filters, just add the row + if (inclusionFilterColumnIndices.Size()==0) + { + result->AddRowColumns(key, row, columnIndicesToReturn); + } + else + { + // Go through all inclusion filters. Only add this row if all filters pass. + for (j=0; jcells[columnIndex]->isEmpty==false ) + { + if (columns[inclusionFilterColumnIndices[j]].columnType==STRING && + (row->cells[columnIndex]->c==0 || + inclusionFilters[j].cellValue->c==0) ) + continue; + + switch (inclusionFilters[j].operation) + { + case QF_EQUAL: + switch(columns[inclusionFilterColumnIndices[j]].columnType) + { + case NUMERIC: + pass=row->cells[columnIndex]->i==inclusionFilters[j].cellValue->i; + break; + case STRING: + pass=strcmp(row->cells[columnIndex]->c,inclusionFilters[j].cellValue->c)==0; + break; + case BINARY: + pass=row->cells[columnIndex]->i==inclusionFilters[j].cellValue->i && + memcmp(row->cells[columnIndex]->c,inclusionFilters[j].cellValue->c, (int) row->cells[columnIndex]->i)==0; + break; + case POINTER: + pass=row->cells[columnIndex]->ptr==inclusionFilters[j].cellValue->ptr; + break; + } + break; + case QF_NOT_EQUAL: + switch(columns[inclusionFilterColumnIndices[j]].columnType) + { + case NUMERIC: + pass=row->cells[columnIndex]->i!=inclusionFilters[j].cellValue->i; + break; + case STRING: + pass=strcmp(row->cells[columnIndex]->c,inclusionFilters[j].cellValue->c)!=0; + break; + case BINARY: + pass=row->cells[columnIndex]->i==inclusionFilters[j].cellValue->i && + memcmp(row->cells[columnIndex]->c,inclusionFilters[j].cellValue->c, (int) row->cells[columnIndex]->i)==0; + break; + case POINTER: + pass=row->cells[columnIndex]->ptr!=inclusionFilters[j].cellValue->ptr; + break; + } + break; + case QF_GREATER_THAN: + switch(columns[inclusionFilterColumnIndices[j]].columnType) + { + case NUMERIC: + pass=row->cells[columnIndex]->i>inclusionFilters[j].cellValue->i; + break; + case STRING: + pass=strcmp(row->cells[columnIndex]->c,inclusionFilters[j].cellValue->c)>0; + break; + case BINARY: + break; + case POINTER: + pass=row->cells[columnIndex]->ptr>inclusionFilters[j].cellValue->ptr; + break; + } + break; + case QF_GREATER_THAN_EQ: + switch(columns[inclusionFilterColumnIndices[j]].columnType) + { + case NUMERIC: + pass=row->cells[columnIndex]->i>=inclusionFilters[j].cellValue->i; + break; + case STRING: + pass=strcmp(row->cells[columnIndex]->c,inclusionFilters[j].cellValue->c)>=0; + break; + case BINARY: + break; + case POINTER: + pass=row->cells[columnIndex]->ptr>=inclusionFilters[j].cellValue->ptr; + break; + } + break; + case QF_LESS_THAN: + switch(columns[inclusionFilterColumnIndices[j]].columnType) + { + case NUMERIC: + pass=row->cells[columnIndex]->ii; + break; + case STRING: + pass=strcmp(row->cells[columnIndex]->c,inclusionFilters[j].cellValue->c)<0; + break; + case BINARY: + break; + case POINTER: + pass=row->cells[columnIndex]->ptrptr; + break; + } + break; + case QF_LESS_THAN_EQ: + switch(columns[inclusionFilterColumnIndices[j]].columnType) + { + case NUMERIC: + pass=row->cells[columnIndex]->i<=inclusionFilters[j].cellValue->i; + break; + case STRING: + pass=strcmp(row->cells[columnIndex]->c,inclusionFilters[j].cellValue->c)<=0; + break; + case BINARY: + break; + case POINTER: + pass=row->cells[columnIndex]->ptr<=inclusionFilters[j].cellValue->ptr; + break; + } + break; + case QF_IS_EMPTY: + pass=false; + break; + case QF_NOT_EMPTY: + pass=true; + break; + default: + pass=false; + RakAssert(0); + break; + } + } + else + { + if (inclusionFilters[j].operation==QF_IS_EMPTY) + pass=true; + else + pass=false; // No value for this cell + } + + if (pass==false) + break; + } + + if (pass) + { + result->AddRowColumns(key, row, columnIndicesToReturn); + } + } +} + +static Table::SortQuery *_sortQueries; +static unsigned _numSortQueries; +static DataStructures::List *_columnIndices; +static DataStructures::List *_columns; +int RowSort(Table::Row* const &first, Table::Row* const &second) // first is the one inserting, second is the one already there. +{ + unsigned i, columnIndex; + for (i=0; i<_numSortQueries; i++) + { + columnIndex=(*_columnIndices)[i]; + if (columnIndex==(unsigned)-1) + continue; + + if (first->cells[columnIndex]->isEmpty==true && second->cells[columnIndex]->isEmpty==false) + return 1; // Empty cells always go at the end + + if (first->cells[columnIndex]->isEmpty==false && second->cells[columnIndex]->isEmpty==true) + return -1; // Empty cells always go at the end + + if (_sortQueries[i].operation==Table::QS_INCREASING_ORDER) + { + if ((*_columns)[columnIndex].columnType==Table::NUMERIC) + { + if (first->cells[columnIndex]->i>second->cells[columnIndex]->i) + return 1; + if (first->cells[columnIndex]->icells[columnIndex]->i) + return -1; + } + else + { + // String + if (strcmp(first->cells[columnIndex]->c,second->cells[columnIndex]->c)>0) + return 1; + if (strcmp(first->cells[columnIndex]->c,second->cells[columnIndex]->c)<0) + return -1; + } + } + else + { + if ((*_columns)[columnIndex].columnType==Table::NUMERIC) + { + if (first->cells[columnIndex]->icells[columnIndex]->i) + return 1; + if (first->cells[columnIndex]->i>second->cells[columnIndex]->i) + return -1; + } + else + { + // String + if (strcmp(first->cells[columnIndex]->c,second->cells[columnIndex]->c)<0) + return 1; + if (strcmp(first->cells[columnIndex]->c,second->cells[columnIndex]->c)>0) + return -1; + } + } + } + + return 0; +} +void Table::SortTable(Table::SortQuery *sortQueries, unsigned numSortQueries, Table::Row** out) +{ + unsigned i; + unsigned outLength; + DataStructures::List columnIndices; + _sortQueries=sortQueries; + _numSortQueries=numSortQueries; + _columnIndices=&columnIndices; + _columns=&columns; + bool anyValid=false; + + for (i=0; i < numSortQueries; i++) + { + if (sortQueries[i].columnIndex *cur; + cur = rows.GetListHead(); + if (anyValid==false) + { + outLength=0; + while (cur) + { + for (i=0; i < (unsigned)cur->size; i++) + { + out[(outLength)++]=cur->data[i]; + } + cur=cur->next; + } + return; + } + + // Start adding to ordered list. + DataStructures::OrderedList orderedList; + while (cur) + { + for (i=0; i < (unsigned)cur->size; i++) + { + RakAssert(cur->data[i]); + orderedList.Insert(cur->data[i],cur->data[i], true, _FILE_AND_LINE_); + } + cur=cur->next; + } + + outLength=0; + for (i=0; i < orderedList.Size(); i++) + out[(outLength)++]=orderedList[i]; +} +void Table::PrintColumnHeaders(char *out, int outLength, char columnDelineator) const +{ + if (outLength<=0) + return; + if (outLength==1) + { + *out=0; + return; + } + + unsigned i; + out[0]=0; + int len; + for (i=0; i < columns.Size(); i++) + { + if (i!=0) + { + len = (int) strlen(out); + if (len < outLength-1) + sprintf(out+len, "%c", columnDelineator); + else + return; + } + + len = (int) strlen(out); + if (len < outLength-(int) strlen(columns[i].columnName)) + sprintf(out+len, "%s", columns[i].columnName); + else + return; + } +} +void Table::PrintRow(char *out, int outLength, char columnDelineator, bool printDelineatorForBinary, Table::Row* inputRow) const +{ + if (outLength<=0) + return; + if (outLength==1) + { + *out=0; + return; + } + + if (inputRow->cells.Size()!=columns.Size()) + { + strncpy(out, "Cell width does not match column width.\n", outLength); + out[outLength-1]=0; + return; + } + + char buff[512]; + unsigned i; + int len; + out[0]=0; + for (i=0; i < columns.Size(); i++) + { + if (columns[i].columnType==NUMERIC) + { + if (inputRow->cells[i]->isEmpty==false) + { + sprintf(buff, "%f", inputRow->cells[i]->i); + len=(int)strlen(buff); + } + else + len=0; + if (i+1!=columns.Size()) + buff[len++]=columnDelineator; + buff[len]=0; + } + else if (columns[i].columnType==STRING) + { + if (inputRow->cells[i]->isEmpty==false && inputRow->cells[i]->c) + { + strncpy(buff, inputRow->cells[i]->c, 512-2); + buff[512-2]=0; + len=(int)strlen(buff); + } + else + len=0; + if (i+1!=columns.Size()) + buff[len++]=columnDelineator; + buff[len]=0; + } + else if (columns[i].columnType==POINTER) + { + if (inputRow->cells[i]->isEmpty==false && inputRow->cells[i]->ptr) + { + sprintf(buff, "%p", inputRow->cells[i]->ptr); + len=(int)strlen(buff); + } + else + len=0; + if (i+1!=columns.Size()) + buff[len++]=columnDelineator; + buff[len]=0; + } + else + { + if (printDelineatorForBinary) + { + if (i+1!=columns.Size()) + buff[0]=columnDelineator; + buff[1]=0; + } + else + buff[0]=0; + + } + + len=(int)strlen(out); + if (outLength==len+1) + break; + strncpy(out+len, buff, outLength-len); + out[outLength-1]=0; + } +} + +void Table::Clear(void) +{ + rows.ForEachData(FreeRow); + rows.Clear(); + columns.Clear(true, _FILE_AND_LINE_); +} +const List& Table::GetColumns(void) const +{ + return columns; +} +const DataStructures::BPlusTree& Table::GetRows(void) const +{ + return rows; +} +DataStructures::Page * Table::GetListHead(void) +{ + return rows.GetListHead(); +} +unsigned Table::GetAvailableRowId(void) const +{ + bool setKey=false; + unsigned key=0; + int i; + DataStructures::Page *cur = rows.GetListHead(); + + while (cur) + { + for (i=0; i < cur->size; i++) + { + if (setKey==false) + { + key=cur->keys[i]+1; + setKey=true; + } + else + { + if (key!=cur->keys[i]) + return key; + key++; + } + } + + cur=cur->next; + } + return key; +} +void Table::DeleteRow(Table::Row *row) +{ + unsigned rowIndex; + for (rowIndex=0; rowIndex < row->cells.Size(); rowIndex++) + { + RakNet::OP_DELETE(row->cells[rowIndex], _FILE_AND_LINE_); + } + RakNet::OP_DELETE(row, _FILE_AND_LINE_); +} +Table& Table::operator = ( const Table& input ) +{ + Clear(); + + unsigned int i; + for (i=0; i < input.GetColumnCount(); i++) + AddColumn(input.ColumnName(i), input.GetColumnType(i)); + + DataStructures::Page *cur = input.GetRows().GetListHead(); + while (cur) + { + for (i=0; i < (unsigned int) cur->size; i++) + { + AddRow(cur->keys[i], cur->data[i]->cells, false); + } + + cur=cur->next; + } + + return *this; +} + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_Table.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_Table.h new file mode 100644 index 0000000..9699b3e --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_Table.h @@ -0,0 +1,343 @@ +/// \file DS_Table.h +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#ifndef __TABLE_H +#define __TABLE_H + +#ifdef _MSC_VER +#pragma warning( push ) +#endif + +#include "DS_List.h" +#include "DS_BPlusTree.h" +#include "RakMemoryOverride.h" +#include "Export.h" +#include "RakString.h" + +#define _TABLE_BPLUS_TREE_ORDER 16 +#define _TABLE_MAX_COLUMN_NAME_LENGTH 64 + +/// The namespace DataStructures was only added to avoid compiler errors for commonly named data structures +/// As these data structures are stand-alone, you can use them outside of RakNet for your own projects if you wish. +namespace DataStructures +{ + + /// \brief Holds a set of columns, a set of rows, and rows times columns cells. + /// \details The table data structure is useful if you want to store a set of structures and perform queries on those structures.
+ /// This is a relatively simple and fast implementation of the types of tables commonly used in databases.
+ /// See TableSerializer to serialize data members of the table.
+ /// See LightweightDatabaseClient and LightweightDatabaseServer to transmit the table over the network. + class RAK_DLL_EXPORT Table + { + public: + + enum ColumnType + { + // Cell::i used + NUMERIC, + + // Cell::c used to hold a null terminated string. + STRING, + + // Cell::c holds data. Cell::i holds data length of c in bytes. + BINARY, + + // Cell::c holds data. Not deallocated. Set manually by assigning ptr. + POINTER, + }; + + + /// Holds the actual data in the table + // Note: If this structure is changed the struct in the swig files need to be changed as well + struct RAK_DLL_EXPORT Cell + { + Cell(); + ~Cell(); + Cell(double numericValue, char *charValue, void *ptr, ColumnType type); + void SetByType(double numericValue, char *charValue, void *ptr, ColumnType type); + void Clear(void); + + /// Numeric + void Set(int input); + void Set(unsigned int input); + void Set(double input); + + /// String + void Set(const char *input); + + /// Binary + void Set(const char *input, int inputLength); + + /// Pointer + void SetPtr(void* p); + + /// Numeric + void Get(int *output); + void Get(double *output); + + /// String + void Get(char *output); + + /// Binary + void Get(char *output, int *outputLength); + + RakNet::RakString ToString(ColumnType columnType); + + // assignment operator and copy constructor + Cell& operator = ( const Cell& input ); + Cell( const Cell & input); + + ColumnType EstimateColumnType(void) const; + + bool isEmpty; + double i; + char *c; + void *ptr; + }; + + /// Stores the name and type of the column + /// \internal + // Note: If this structure is changed the struct in the swig files need to be changed as well + struct RAK_DLL_EXPORT ColumnDescriptor + { + ColumnDescriptor(); + ~ColumnDescriptor(); + ColumnDescriptor(const char cn[_TABLE_MAX_COLUMN_NAME_LENGTH],ColumnType ct); + + char columnName[_TABLE_MAX_COLUMN_NAME_LENGTH]; + ColumnType columnType; + }; + + /// Stores the list of cells for this row, and a special flag used for internal sorting + // Note: If this structure is changed the struct in the swig files need to be changed as well + struct RAK_DLL_EXPORT Row + { + // list of cells + DataStructures::List cells; + + /// Numeric + void UpdateCell(unsigned columnIndex, double value); + + /// String + void UpdateCell(unsigned columnIndex, const char *str); + + /// Binary + void UpdateCell(unsigned columnIndex, int byteLength, const char *data); + }; + + // Operations to perform for cell comparison + enum FilterQueryType + { + QF_EQUAL, + QF_NOT_EQUAL, + QF_GREATER_THAN, + QF_GREATER_THAN_EQ, + QF_LESS_THAN, + QF_LESS_THAN_EQ, + QF_IS_EMPTY, + QF_NOT_EMPTY, + }; + + // Compare the cell value for a row at columnName to the cellValue using operation. + // Note: If this structure is changed the struct in the swig files need to be changed as well + struct RAK_DLL_EXPORT FilterQuery + { + FilterQuery(); + ~FilterQuery(); + FilterQuery(unsigned column, Cell *cell, FilterQueryType op); + + // If columnName is specified, columnIndex will be looked up using it. + char columnName[_TABLE_MAX_COLUMN_NAME_LENGTH]; + unsigned columnIndex; + Cell *cellValue; + FilterQueryType operation; + }; + + /// Increasing or decreasing sort order + enum SortQueryType + { + QS_INCREASING_ORDER, + QS_DECREASING_ORDER, + }; + + // Sort on increasing or decreasing order for a particular column + // Note: If this structure is changed the struct in the swig files need to be changed as well + struct RAK_DLL_EXPORT SortQuery + { + /// The index of the table column we are sorting on + unsigned columnIndex; + + /// See SortQueryType + SortQueryType operation; + }; + + // Constructor + Table(); + + // Destructor + ~Table(); + + /// \brief Adds a column to the table + /// \param[in] columnName The name of the column + /// \param[in] columnType What type of data this column will hold + /// \return The index of the new column + unsigned AddColumn(const char columnName[_TABLE_MAX_COLUMN_NAME_LENGTH], ColumnType columnType); + + /// \brief Removes a column by index + /// \param[in] columnIndex The index of the column to remove + void RemoveColumn(unsigned columnIndex); + + /// \brief Gets the index of a column by name + /// \details Column indices are stored in the order they are added. + /// \param[in] columnName The name of the column + /// \return The index of the column, or (unsigned)-1 if no such column + unsigned ColumnIndex(char columnName[_TABLE_MAX_COLUMN_NAME_LENGTH]) const; + unsigned ColumnIndex(const char *columnName) const; + + /// \brief Gives the string name of the column at a certain index + /// \param[in] index The index of the column + /// \return The name of the column, or 0 if an invalid index + char* ColumnName(unsigned index) const; + + /// \brief Returns the type of a column, referenced by index + /// \param[in] index The index of the column + /// \return The type of the column + ColumnType GetColumnType(unsigned index) const; + + /// Returns the number of columns + /// \return The number of columns in the table + unsigned GetColumnCount(void) const; + + /// Returns the number of rows + /// \return The number of rows in the table + unsigned GetRowCount(void) const; + + /// \brief Adds a row to the table + /// \details New rows are added with empty values for all cells. However, if you specify initialCelLValues you can specify initial values + /// It's up to you to ensure that the values in the specific cells match the type of data used by that row + /// rowId can be considered the primary key for the row. It is much faster to lookup a row by its rowId than by searching keys. + /// rowId must be unique + /// Rows are stored in sorted order in the table, using rowId as the sort key + /// \param[in] rowId The UNIQUE primary key for the row. This can never be changed. + /// \param[in] initialCellValues Initial values to give the row (optional) + /// \return The newly added row + Table::Row* AddRow(unsigned rowId); + Table::Row* AddRow(unsigned rowId, DataStructures::List &initialCellValues); + Table::Row* AddRow(unsigned rowId, DataStructures::List &initialCellValues, bool copyCells=false); + + /// \brief Removes a row specified by rowId. + /// \param[in] rowId The ID of the row + /// \return true if the row was deleted. False if not. + bool RemoveRow(unsigned rowId); + + /// \brief Removes all the rows with IDs that the specified table also has. + /// \param[in] tableContainingRowIDs The IDs of the rows + void RemoveRows(Table *tableContainingRowIDs); + + /// \brief Updates a particular cell in the table. + /// \note If you are going to update many cells of a particular row, it is more efficient to call GetRow and perform the operations on the row directly. + /// \note Row pointers do not change, so you can also write directly to the rows for more efficiency. + /// \param[in] rowId The ID of the row + /// \param[in] columnIndex The column of the cell + /// \param[in] value The data to set + bool UpdateCell(unsigned rowId, unsigned columnIndex, int value); + bool UpdateCell(unsigned rowId, unsigned columnIndex, char *str); + bool UpdateCell(unsigned rowId, unsigned columnIndex, int byteLength, char *data); + bool UpdateCellByIndex(unsigned rowIndex, unsigned columnIndex, int value); + bool UpdateCellByIndex(unsigned rowIndex, unsigned columnIndex, char *str); + bool UpdateCellByIndex(unsigned rowIndex, unsigned columnIndex, int byteLength, char *data); + + /// \brief Note this is much less efficient to call than GetRow, then working with the cells directly. + /// Numeric, string, binary + void GetCellValueByIndex(unsigned rowIndex, unsigned columnIndex, int *output); + void GetCellValueByIndex(unsigned rowIndex, unsigned columnIndex, char *output); + void GetCellValueByIndex(unsigned rowIndex, unsigned columnIndex, char *output, int *outputLength); + + /// \brief Gets a row. More efficient to do this and access Row::cells than to repeatedly call GetCell. + /// You can also update cells in rows from this function. + /// \param[in] rowId The ID of the row + /// \return The desired row, or 0 if no such row. + Row* GetRowByID(unsigned rowId) const; + + /// \brief Gets a row at a specific index. + /// rowIndex should be less than GetRowCount() + /// \param[in] rowIndex The index of the row + /// \param[out] key The ID of the row returned + /// \return The desired row, or 0 if no such row. + Row* GetRowByIndex(unsigned rowIndex, unsigned *key) const; + + /// \brief Queries the table, optionally returning only a subset of columns and rows. + /// \param[in] columnSubset An array of column indices. Only columns in this array are returned. Pass 0 for all columns + /// \param[in] numColumnSubset The number of elements in \a columnSubset + /// \param[in] inclusionFilters An array of FilterQuery. All filters must pass for the row to be returned. + /// \param[in] numInclusionFilters The number of elements in \a inclusionFilters + /// \param[in] rowIds An arrow of row IDs. Only these rows with these IDs are returned. Pass 0 for all rows. + /// \param[in] numRowIDs The number of elements in \a rowIds + /// \param[out] result The result of the query. If no rows are returned, the table will only have columns. + void QueryTable(unsigned *columnIndicesSubset, unsigned numColumnSubset, FilterQuery *inclusionFilters, unsigned numInclusionFilters, unsigned *rowIds, unsigned numRowIDs, Table *result); + + /// \brief Sorts the table by rows + /// \details You can sort the table in ascending or descending order on one or more columns + /// Columns have precedence in the order they appear in the \a sortQueries array + /// If a row cell on column n has the same value as a a different row on column n, then the row will be compared on column n+1 + /// \param[in] sortQueries A list of SortQuery structures, defining the sorts to perform on the table + /// \param[in] numColumnSubset The number of elements in \a numSortQueries + /// \param[out] out The address of an array of Rows, which will receive the sorted output. The array must be long enough to contain all returned rows, up to GetRowCount() + void SortTable(Table::SortQuery *sortQueries, unsigned numSortQueries, Table::Row** out); + + /// \brief Frees all memory in the table. + void Clear(void); + + /// \brief Prints out the names of all the columns. + /// \param[out] out A pointer to an array of bytes which will hold the output. + /// \param[in] outLength The size of the \a out array + /// \param[in] columnDelineator What character to print to delineate columns + void PrintColumnHeaders(char *out, int outLength, char columnDelineator) const; + + /// \brief Writes a text representation of the row to \a out. + /// \param[out] out A pointer to an array of bytes which will hold the output. + /// \param[in] outLength The size of the \a out array + /// \param[in] columnDelineator What character to print to delineate columns + /// \param[in] printDelineatorForBinary Binary output is not printed. True to still print the delineator. + /// \param[in] inputRow The row to print + void PrintRow(char *out, int outLength, char columnDelineator, bool printDelineatorForBinary, Table::Row* inputRow) const; + + /// \brief Direct access to make things easier. + const DataStructures::List& GetColumns(void) const; + + /// \brief Direct access to make things easier. + const DataStructures::BPlusTree& GetRows(void) const; + + /// \brief Get the head of a linked list containing all the row data. + DataStructures::Page * GetListHead(void); + + /// \brief Get the first free row id. + /// This could be made more efficient. + unsigned GetAvailableRowId(void) const; + + Table& operator = ( const Table& input ); + + protected: + Table::Row* AddRowColumns(unsigned rowId, Row *row, DataStructures::List columnIndices); + + void DeleteRow(Row *row); + + void QueryRow(DataStructures::List &inclusionFilterColumnIndices, DataStructures::List &columnIndicesToReturn, unsigned key, Table::Row* row, FilterQuery *inclusionFilters, Table *result); + + // 16 is arbitrary and is the order of the BPlus tree. Higher orders are better for searching while lower orders are better for + // Insertions and deletions. + DataStructures::BPlusTree rows; + + // Columns in the table. + DataStructures::List columns; + }; +} + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_ThreadsafeAllocatingQueue.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_ThreadsafeAllocatingQueue.h new file mode 100644 index 0000000..178d77e --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_ThreadsafeAllocatingQueue.h @@ -0,0 +1,143 @@ +/// \file DS_ThreadsafeAllocatingQueue.h +/// \internal +/// A threadsafe queue, that also uses a memory pool for allocation + +#ifndef __THREADSAFE_ALLOCATING_QUEUE +#define __THREADSAFE_ALLOCATING_QUEUE + +#include "DS_Queue.h" +#include "SimpleMutex.h" +#include "DS_MemoryPool.h" + +// #if defined(new) +// #pragma push_macro("new") +// #undef new +// #define RMO_NEW_UNDEF_ALLOCATING_QUEUE +// #endif + +namespace DataStructures +{ + +template +class RAK_DLL_EXPORT ThreadsafeAllocatingQueue +{ +public: + // Queue operations + void Push(structureType *s); + structureType *PopInaccurate(void); + structureType *Pop(void); + void SetPageSize(int size); + bool IsEmpty(void); + + // Memory pool operations + structureType *Allocate(const char *file, unsigned int line); + void Deallocate(structureType *s, const char *file, unsigned int line); + void Clear(const char *file, unsigned int line); +protected: + + MemoryPool memoryPool; + RakNet::SimpleMutex memoryPoolMutex; + Queue queue; + RakNet::SimpleMutex queueMutex; +}; + +template +void ThreadsafeAllocatingQueue::Push(structureType *s) +{ + queueMutex.Lock(); + queue.Push(s, _FILE_AND_LINE_ ); + queueMutex.Unlock(); +} + +template +structureType *ThreadsafeAllocatingQueue::PopInaccurate(void) +{ + structureType *s; + if (queue.IsEmpty()) + return 0; + queueMutex.Lock(); + if (queue.IsEmpty()==false) + s=queue.Pop(); + else + s=0; + queueMutex.Unlock(); + return s; +} + +template +structureType *ThreadsafeAllocatingQueue::Pop(void) +{ + structureType *s; + queueMutex.Lock(); + if (queue.IsEmpty()) + { + queueMutex.Unlock(); + return 0; + } + s=queue.Pop(); + queueMutex.Unlock(); + return s; +} + +template +structureType *ThreadsafeAllocatingQueue::Allocate(const char *file, unsigned int line) +{ + structureType *s; + memoryPoolMutex.Lock(); + s=memoryPool.Allocate(file, line); + memoryPoolMutex.Unlock(); + // Call new operator, memoryPool doesn't do this + s = new ((void*)s) structureType; + return s; +} +template +void ThreadsafeAllocatingQueue::Deallocate(structureType *s, const char *file, unsigned int line) +{ + // Call delete operator, memory pool doesn't do this + s->~structureType(); + memoryPoolMutex.Lock(); + memoryPool.Release(s, file, line); + memoryPoolMutex.Unlock(); +} + +template +void ThreadsafeAllocatingQueue::Clear(const char *file, unsigned int line) +{ + memoryPoolMutex.Lock(); + for (unsigned int i=0; i < queue.Size(); i++) + { + queue[i]->~structureType(); + memoryPool.Release(queue[i], file, line); + } + queue.Clear(file, line); + memoryPoolMutex.Unlock(); + memoryPoolMutex.Lock(); + memoryPool.Clear(file, line); + memoryPoolMutex.Unlock(); +} + +template +void ThreadsafeAllocatingQueue::SetPageSize(int size) +{ + memoryPool.SetPageSize(size); +} + +template +bool ThreadsafeAllocatingQueue::IsEmpty(void) +{ + bool isEmpty; + queueMutex.Lock(); + isEmpty=queue.IsEmpty(); + queueMutex.Unlock(); + return isEmpty; +} + +}; + + +// #if defined(RMO_NEW_UNDEF_ALLOCATING_QUEUE) +// #pragma pop_macro("new") +// #undef RMO_NEW_UNDEF_ALLOCATING_QUEUE +// #endif + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_Tree.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_Tree.h new file mode 100644 index 0000000..98949f1 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_Tree.h @@ -0,0 +1,98 @@ +/// \file DS_Tree.h +/// \internal +/// \brief Just a regular tree +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __DS_TREE_H +#define __DS_TREE_H + +#include "Export.h" +#include "DS_List.h" +#include "DS_Queue.h" +#include "RakMemoryOverride.h" + +/// The namespace DataStructures was only added to avoid compiler errors for commonly named data structures +/// As these data structures are stand-alone, you can use them outside of RakNet for your own projects if you wish. +namespace DataStructures +{ + template + class RAK_DLL_EXPORT Tree + { + public: + Tree(); + Tree(TreeType &inputData); + ~Tree(); + void LevelOrderTraversal(DataStructures::List &output); + void AddChild(TreeType &newData); + void DeleteDecendants(void); + + TreeType data; + DataStructures::List children; + }; + + template + Tree::Tree() + { + + } + + template + Tree::Tree(TreeType &inputData) + { + data=inputData; + } + + template + Tree::~Tree() + { + DeleteDecendants(); + } + + template + void Tree::LevelOrderTraversal(DataStructures::List &output) + { + unsigned i; + Tree *node; + DataStructures::Queue*> queue; + + for (i=0; i < children.Size(); i++) + queue.Push(children[i]); + + while (queue.Size()) + { + node=queue.Pop(); + output.Insert(node, _FILE_AND_LINE_); + for (i=0; i < node->children.Size(); i++) + queue.Push(node->children[i]); + } + } + + template + void Tree::AddChild(TreeType &newData) + { + children.Insert(RakNet::OP_NEW(newData, _FILE_AND_LINE_)); + } + + template + void Tree::DeleteDecendants(void) + { + /* + DataStructures::List output; + LevelOrderTraversal(output); + unsigned i; + for (i=0; i < output.Size(); i++) + RakNet::OP_DELETE(output[i], _FILE_AND_LINE_); +*/ + + // Already recursive to do this + unsigned int i; + for (i=0; i < children.Size(); i++) + RakNet::OP_DELETE(children[i], _FILE_AND_LINE_); + } +} + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_WeightedGraph.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_WeightedGraph.h new file mode 100644 index 0000000..d2ad665 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DS_WeightedGraph.h @@ -0,0 +1,537 @@ +/// \file DS_WeightedGraph.h +/// \internal +/// \brief Weighted graph. +/// \details I'm assuming the indices are complex map types, rather than sequential numbers (which could be implemented much more efficiently). +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __WEIGHTED_GRAPH_H +#define __WEIGHTED_GRAPH_H + +#include "DS_OrderedList.h" +#include "DS_Map.h" +#include "DS_Heap.h" +#include "DS_Queue.h" +#include "DS_Tree.h" +#include "RakAssert.h" +#include "RakMemoryOverride.h" +#ifdef _DEBUG +#include +#endif + +#ifdef _MSC_VER +#pragma warning( push ) +#endif + +/// The namespace DataStructures was only added to avoid compiler errors for commonly named data structures +/// As these data structures are stand-alone, you can use them outside of RakNet for your own projects if you wish. +namespace DataStructures +{ + template + class RAK_DLL_EXPORT WeightedGraph + { + public: + static void IMPLEMENT_DEFAULT_COMPARISON(void) {DataStructures::defaultMapKeyComparison(node_type(),node_type());} + + WeightedGraph(); + ~WeightedGraph(); + WeightedGraph( const WeightedGraph& original_copy ); + WeightedGraph& operator= ( const WeightedGraph& original_copy ); + void AddNode(const node_type &node); + void RemoveNode(const node_type &node); + void AddConnection(const node_type &node1, const node_type &node2, weight_type weight); + void RemoveConnection(const node_type &node1, const node_type &node2); + bool HasConnection(const node_type &node1, const node_type &node2); + void Print(void); + void Clear(void); + bool GetShortestPath(DataStructures::List &path, node_type startNode, node_type endNode, weight_type INFINITE_WEIGHT); + bool GetSpanningTree(DataStructures::Tree &outTree, DataStructures::List *inputNodes, node_type startNode, weight_type INFINITE_WEIGHT ); + unsigned GetNodeCount(void) const; + unsigned GetConnectionCount(unsigned nodeIndex) const; + void GetConnectionAtIndex(unsigned nodeIndex, unsigned connectionIndex, node_type &outNode, weight_type &outWeight) const; + node_type GetNodeAtIndex(unsigned nodeIndex) const; + + protected: + void ClearDijkstra(void); + void GenerateDisjktraMatrix(node_type startNode, weight_type INFINITE_WEIGHT); + + DataStructures::Map *> adjacencyLists; + + // All these variables are for path finding with Dijkstra + // 08/23/06 Won't compile as a DLL inside this struct + // struct + // { + bool isValidPath; + node_type rootNode; + DataStructures::OrderedList costMatrixIndices; + weight_type *costMatrix; + node_type *leastNodeArray; + // } dijkstra; + + struct NodeAndParent + { + DataStructures::Tree*node; + DataStructures::Tree*parent; + }; + }; + + template + WeightedGraph::WeightedGraph() + { + isValidPath=false; + costMatrix=0; + } + + template + WeightedGraph::~WeightedGraph() + { + Clear(); + } + + template + WeightedGraph::WeightedGraph( const WeightedGraph& original_copy ) + { + adjacencyLists=original_copy.adjacencyLists; + + isValidPath=original_copy.isValidPath; + if (isValidPath) + { + rootNode=original_copy.rootNode; + costMatrixIndices=original_copy.costMatrixIndices; + costMatrix = RakNet::OP_NEW_ARRAY(costMatrixIndices.Size() * costMatrixIndices.Size(), _FILE_AND_LINE_ ); + leastNodeArray = RakNet::OP_NEW_ARRAY(costMatrixIndices.Size(), _FILE_AND_LINE_ ); + memcpy(costMatrix, original_copy.costMatrix, costMatrixIndices.Size() * costMatrixIndices.Size() * sizeof(weight_type)); + memcpy(leastNodeArray, original_copy.leastNodeArray, costMatrixIndices.Size() * sizeof(weight_type)); + } + } + + template + WeightedGraph& WeightedGraph::operator=( const WeightedGraph& original_copy ) + { + adjacencyLists=original_copy.adjacencyLists; + + isValidPath=original_copy.isValidPath; + if (isValidPath) + { + rootNode=original_copy.rootNode; + costMatrixIndices=original_copy.costMatrixIndices; + costMatrix = RakNet::OP_NEW_ARRAY(costMatrixIndices.Size() * costMatrixIndices.Size(), _FILE_AND_LINE_ ); + leastNodeArray = RakNet::OP_NEW_ARRAY(costMatrixIndices.Size(), _FILE_AND_LINE_ ); + memcpy(costMatrix, original_copy.costMatrix, costMatrixIndices.Size() * costMatrixIndices.Size() * sizeof(weight_type)); + memcpy(leastNodeArray, original_copy.leastNodeArray, costMatrixIndices.Size() * sizeof(weight_type)); + } + + return *this; + } + + template + void WeightedGraph::AddNode(const node_type &node) + { + adjacencyLists.SetNew(node, RakNet::OP_NEW >( _FILE_AND_LINE_) ); + } + + template + void WeightedGraph::RemoveNode(const node_type &node) + { + unsigned i; + DataStructures::Queue removeNodeQueue; + + removeNodeQueue.Push(node, _FILE_AND_LINE_ ); + while (removeNodeQueue.Size()) + { + RakNet::OP_DELETE(adjacencyLists.Pop(removeNodeQueue.Pop()), _FILE_AND_LINE_); + + // Remove this node from all of the other lists as well + for (i=0; i < adjacencyLists.Size(); i++) + { + adjacencyLists[i]->Delete(node); + +#ifdef _MSC_VER +#pragma warning( disable : 4127 ) // warning C4127: conditional expression is constant +#endif + if (allow_unlinkedNodes==false && adjacencyLists[i]->Size()==0) + removeNodeQueue.Push(adjacencyLists.GetKeyAtIndex(i), _FILE_AND_LINE_ ); + } + } + + ClearDijkstra(); + } + + template + bool WeightedGraph::HasConnection(const node_type &node1, const node_type &node2) + { + if (node1==node2) + return false; + if (adjacencyLists.Has(node1)==false) + return false; + return adjacencyLists.Get(node1)->Has(node2); + } + + template + void WeightedGraph::AddConnection(const node_type &node1, const node_type &node2, weight_type weight) + { + if (node1==node2) + return; + + if (adjacencyLists.Has(node1)==false) + AddNode(node1); + adjacencyLists.Get(node1)->Set(node2, weight); + if (adjacencyLists.Has(node2)==false) + AddNode(node2); + adjacencyLists.Get(node2)->Set(node1, weight); + } + + template + void WeightedGraph::RemoveConnection(const node_type &node1, const node_type &node2) + { + adjacencyLists.Get(node2)->Delete(node1); + adjacencyLists.Get(node1)->Delete(node2); + +#ifdef _MSC_VER +#pragma warning( disable : 4127 ) // warning C4127: conditional expression is constant +#endif + if (allow_unlinkedNodes==false) // If we do not allow _unlinked nodes, then if there are no connections, remove the node + { + if (adjacencyLists.Get(node1)->Size()==0) + RemoveNode(node1); // Will also remove node1 from the adjacency list of node2 + if (adjacencyLists.Has(node2) && adjacencyLists.Get(node2)->Size()==0) + RemoveNode(node2); + } + + ClearDijkstra(); + } + + template + void WeightedGraph::Clear(void) + { + unsigned i; + for (i=0; i < adjacencyLists.Size(); i++) + RakNet::OP_DELETE(adjacencyLists[i], _FILE_AND_LINE_); + adjacencyLists.Clear(); + + ClearDijkstra(); + } + + template + bool WeightedGraph::GetShortestPath(DataStructures::List &path, node_type startNode, node_type endNode, weight_type INFINITE_WEIGHT) + { + path.Clear(false, _FILE_AND_LINE_); + if (startNode==endNode) + { + path.Insert(startNode, _FILE_AND_LINE_); + path.Insert(endNode, _FILE_AND_LINE_); + return true; + } + + if (isValidPath==false || rootNode!=startNode) + { + ClearDijkstra(); + GenerateDisjktraMatrix(startNode, INFINITE_WEIGHT); + } + + // return the results + bool objectExists; + unsigned col,row; + weight_type currentWeight; + DataStructures::Queue outputQueue; + col=costMatrixIndices.GetIndexFromKey(endNode, &objectExists); + if (costMatrixIndices.Size()<2) + { + return false; + } + if (objectExists==false) + { + return false; + } + node_type vertex; + row=costMatrixIndices.Size()-2; + if (row==0) + { + path.Insert(startNode, _FILE_AND_LINE_); + path.Insert(endNode, _FILE_AND_LINE_); + return true; + } + currentWeight=costMatrix[row*adjacencyLists.Size() + col]; + if (currentWeight==INFINITE_WEIGHT) + { + // No path + return true; + } + vertex=endNode; + outputQueue.PushAtHead(vertex, 0, _FILE_AND_LINE_); + row--; +#ifdef _MSC_VER +#pragma warning( disable : 4127 ) // warning C4127: conditional expression is constant +#endif + while (1) + { + while (costMatrix[row*adjacencyLists.Size() + col] == currentWeight) + { + if (row==0) + { + path.Insert(startNode, _FILE_AND_LINE_); + for (col=0; outputQueue.Size(); col++) + path.Insert(outputQueue.Pop(), _FILE_AND_LINE_); + return true; + } + --row; + } + + vertex=leastNodeArray[row]; + outputQueue.PushAtHead(vertex, 0, _FILE_AND_LINE_); + if (row==0) + break; + col=costMatrixIndices.GetIndexFromKey(vertex, &objectExists); + currentWeight=costMatrix[row*adjacencyLists.Size() + col]; + } + + path.Insert(startNode, _FILE_AND_LINE_); + for (col=0; outputQueue.Size(); col++) + path.Insert(outputQueue.Pop(), _FILE_AND_LINE_); + return true; + } + + template + node_type WeightedGraph::GetNodeAtIndex(unsigned nodeIndex) const + { + return adjacencyLists.GetKeyAtIndex(nodeIndex); + } + + template + unsigned WeightedGraph::GetNodeCount(void) const + { + return adjacencyLists.Size(); + } + + template + unsigned WeightedGraph::GetConnectionCount(unsigned nodeIndex) const + { + return adjacencyLists[nodeIndex]->Size(); + } + + template + void WeightedGraph::GetConnectionAtIndex(unsigned nodeIndex, unsigned connectionIndex, node_type &outNode, weight_type &outWeight) const + { + outWeight=adjacencyLists[nodeIndex]->operator[](connectionIndex); + outNode=adjacencyLists[nodeIndex]->GetKeyAtIndex(connectionIndex); + } + + template + bool WeightedGraph::GetSpanningTree(DataStructures::Tree &outTree, DataStructures::List *inputNodes, node_type startNode, weight_type INFINITE_WEIGHT ) + { + // Find the shortest path from the start node to each of the input nodes. Add this path to a new WeightedGraph if the result is reachable + DataStructures::List path; + DataStructures::WeightedGraph outGraph; + bool res; + unsigned i,j; + for (i=0; i < inputNodes->Size(); i++) + { + res=GetShortestPath(path, startNode, (*inputNodes)[i], INFINITE_WEIGHT); + if (res && path.Size()>0) + { + for (j=0; j < path.Size()-1; j++) + { + // Don't bother looking up the weight + outGraph.AddConnection(path[j], path[j+1], INFINITE_WEIGHT); + } + } + } + + // Copy the graph to a tree. + DataStructures::Queue nodesToProcess; + DataStructures::Tree *current; + DataStructures::Map *adjacencyList; + node_type key; + NodeAndParent nap, nap2; + outTree.DeleteDecendants(); + outTree.data=startNode; + current=&outTree; + if (outGraph.adjacencyLists.Has(startNode)==false) + return false; + adjacencyList = outGraph.adjacencyLists.Get(startNode); + + for (i=0; i < adjacencyList->Size(); i++) + { + nap2.node=RakNet::OP_NEW >( _FILE_AND_LINE_ ); + nap2.node->data=adjacencyList->GetKeyAtIndex(i); + nap2.parent=current; + nodesToProcess.Push(nap2, _FILE_AND_LINE_ ); + current->children.Insert(nap2.node, _FILE_AND_LINE_); + } + + while (nodesToProcess.Size()) + { + nap=nodesToProcess.Pop(); + current=nap.node; + adjacencyList = outGraph.adjacencyLists.Get(nap.node->data); + + for (i=0; i < adjacencyList->Size(); i++) + { + key=adjacencyList->GetKeyAtIndex(i); + if (key!=nap.parent->data) + { + nap2.node=RakNet::OP_NEW >( _FILE_AND_LINE_ ); + nap2.node->data=key; + nap2.parent=current; + nodesToProcess.Push(nap2, _FILE_AND_LINE_ ); + current->children.Insert(nap2.node, _FILE_AND_LINE_); + } + } + } + + return true; + } + + template + void WeightedGraph::GenerateDisjktraMatrix(node_type startNode, weight_type INFINITE_WEIGHT) + { + if (adjacencyLists.Size()==0) + return; + + costMatrix = RakNet::OP_NEW_ARRAY(adjacencyLists.Size() * adjacencyLists.Size(), _FILE_AND_LINE_ ); + leastNodeArray = RakNet::OP_NEW_ARRAY(adjacencyLists.Size(), _FILE_AND_LINE_ ); + + node_type currentNode; + unsigned col, row, row2, openSetIndex; + node_type adjacentKey; + unsigned adjacentIndex; + weight_type edgeWeight, currentNodeWeight, adjacentNodeWeight; + DataStructures::Map *adjacencyList; + DataStructures::Heap minHeap; + DataStructures::Map openSet; + + for (col=0; col < adjacencyLists.Size(); col++) + { + // This should be already sorted, so it's a bit inefficient to do an insertion sort, but what the heck + costMatrixIndices.Insert(adjacencyLists.GetKeyAtIndex(col),adjacencyLists.GetKeyAtIndex(col), true, _FILE_AND_LINE_); + } + for (col=0; col < adjacencyLists.Size() * adjacencyLists.Size(); col++) + costMatrix[col]=INFINITE_WEIGHT; + currentNode=startNode; + row=0; + currentNodeWeight=0; + rootNode=startNode; + + // Clear the starting node column + if (adjacencyLists.Size()) + { + adjacentIndex=adjacencyLists.GetIndexAtKey(startNode); + for (row2=0; row2 < adjacencyLists.Size(); row2++) + costMatrix[row2*adjacencyLists.Size() + adjacentIndex]=0; + } + + while (row < adjacencyLists.Size()-1) + { + adjacencyList = adjacencyLists.Get(currentNode); + // Go through all connections from the current node. If the new weight is less than the current weight, then update that weight. + for (col=0; col < adjacencyList->Size(); col++) + { + edgeWeight=(*adjacencyList)[col]; + adjacentKey=adjacencyList->GetKeyAtIndex(col); + adjacentIndex=adjacencyLists.GetIndexAtKey(adjacentKey); + adjacentNodeWeight=costMatrix[row*adjacencyLists.Size() + adjacentIndex]; + + if (currentNodeWeight + edgeWeight < adjacentNodeWeight) + { + // Update the weight for the adjacent node + for (row2=row; row2 < adjacencyLists.Size(); row2++) + costMatrix[row2*adjacencyLists.Size() + adjacentIndex]=currentNodeWeight + edgeWeight; + openSet.Set(adjacentKey, currentNodeWeight + edgeWeight); + } + } + + // Find the lowest in the open set + minHeap.Clear(true,_FILE_AND_LINE_); + for (openSetIndex=0; openSetIndex < openSet.Size(); openSetIndex++) + minHeap.Push(openSet[openSetIndex], openSet.GetKeyAtIndex(openSetIndex),_FILE_AND_LINE_); + + /* + unsigned i,j; + for (i=0; i < adjacencyLists.Size()-1; i++) + { + for (j=0; j < adjacencyLists.Size(); j++) + { + RAKNET_DEBUG_PRINTF("%2i ", costMatrix[i*adjacencyLists.Size() + j]); + } + RAKNET_DEBUG_PRINTF("Node=%i", leastNodeArray[i]); + RAKNET_DEBUG_PRINTF("\n"); + } + */ + + if (minHeap.Size()==0) + { + // Unreachable nodes + isValidPath=true; + return; + } + + currentNodeWeight=minHeap.PeekWeight(0); + leastNodeArray[row]=minHeap.Pop(0); + currentNode=leastNodeArray[row]; + openSet.Delete(currentNode); + row++; + } + + /* +#ifdef _DEBUG + unsigned i,j; + for (i=0; i < adjacencyLists.Size()-1; i++) + { + for (j=0; j < adjacencyLists.Size(); j++) + { + RAKNET_DEBUG_PRINTF("%2i ", costMatrix[i*adjacencyLists.Size() + j]); + } + RAKNET_DEBUG_PRINTF("Node=%i", leastNodeArray[i]); + RAKNET_DEBUG_PRINTF("\n"); + } +#endif + */ + + isValidPath=true; + } + + template + void WeightedGraph::ClearDijkstra(void) + { + if (isValidPath) + { + isValidPath=false; + RakNet::OP_DELETE_ARRAY(costMatrix, _FILE_AND_LINE_); + RakNet::OP_DELETE_ARRAY(leastNodeArray, _FILE_AND_LINE_); + costMatrixIndices.Clear(false, _FILE_AND_LINE_); + } + } + + template + void WeightedGraph::Print(void) + { +#ifdef _DEBUG + unsigned i,j; + for (i=0; i < adjacencyLists.Size(); i++) + { + //RAKNET_DEBUG_PRINTF("%i connected to ", i); + RAKNET_DEBUG_PRINTF("%s connected to ", adjacencyLists.GetKeyAtIndex(i).systemAddress.ToString()); + + if (adjacencyLists[i]->Size()==0) + RAKNET_DEBUG_PRINTF(""); + else + { + for (j=0; j < adjacencyLists[i]->Size(); j++) + // RAKNET_DEBUG_PRINTF("%i (%.2f) ", adjacencyLists.GetIndexAtKey(adjacencyLists[i]->GetKeyAtIndex(j)), (float) adjacencyLists[i]->operator[](j) ); + RAKNET_DEBUG_PRINTF("%s (%.2f) ", adjacencyLists[i]->GetKeyAtIndex(j).systemAddress.ToString(), (float) adjacencyLists[i]->operator[](j) ); + } + + RAKNET_DEBUG_PRINTF("\n"); + } +#endif + } +} + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DataCompressor.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DataCompressor.cpp new file mode 100644 index 0000000..5cf1d34 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DataCompressor.cpp @@ -0,0 +1,63 @@ +#include "DataCompressor.h" +#include "DS_HuffmanEncodingTree.h" +#include "RakAssert.h" +#include // Use string.h rather than memory.h for a console + +using namespace RakNet; + +STATIC_FACTORY_DEFINITIONS(DataCompressor,DataCompressor) + +void DataCompressor::Compress( unsigned char *userData, unsigned sizeInBytes, RakNet::BitStream * output ) +{ + // Don't use this for small files as you will just make them bigger! + RakAssert(sizeInBytes > 2048); + + unsigned int frequencyTable[ 256 ]; + unsigned int i; + memset(frequencyTable,0,256*sizeof(unsigned int)); + for (i=0; i < sizeInBytes; i++) + ++frequencyTable[userData[i]]; + HuffmanEncodingTree tree; + BitSize_t writeOffset1, writeOffset2, bitsUsed1, bitsUsed2; + tree.GenerateFromFrequencyTable(frequencyTable); + output->WriteCompressed(sizeInBytes); + for (i=0; i < 256; i++) + output->WriteCompressed(frequencyTable[i]); + output->AlignWriteToByteBoundary(); + writeOffset1=output->GetWriteOffset(); + output->Write((unsigned int)0); // Dummy value + bitsUsed1=output->GetNumberOfBitsUsed(); + tree.EncodeArray(userData, sizeInBytes, output); + bitsUsed2=output->GetNumberOfBitsUsed(); + writeOffset2=output->GetWriteOffset(); + output->SetWriteOffset(writeOffset1); + output->Write(bitsUsed2-bitsUsed1); // Go back and write how many bits were used for the encoding + output->SetWriteOffset(writeOffset2); +} + +unsigned DataCompressor::DecompressAndAllocate( RakNet::BitStream * input, unsigned char **output ) +{ + HuffmanEncodingTree tree; + unsigned int bitsUsed, destinationSizeInBytes; + unsigned int decompressedBytes; + unsigned int frequencyTable[ 256 ]; + unsigned i; + + input->ReadCompressed(destinationSizeInBytes); + for (i=0; i < 256; i++) + input->ReadCompressed(frequencyTable[i]); + input->AlignReadToByteBoundary(); + if (input->Read(bitsUsed)==false) + { + // Read error +#ifdef _DEBUG + RakAssert(0); +#endif + return 0; + } + *output = (unsigned char*) rakMalloc_Ex(destinationSizeInBytes, _FILE_AND_LINE_); + tree.GenerateFromFrequencyTable(frequencyTable); + decompressedBytes=tree.DecodeArray(input, bitsUsed, destinationSizeInBytes, *output ); + RakAssert(decompressedBytes==destinationSizeInBytes); + return destinationSizeInBytes; +} diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DataCompressor.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DataCompressor.h new file mode 100644 index 0000000..57f88ce --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DataCompressor.h @@ -0,0 +1,33 @@ +/// \file DataCompressor.h +/// \brief DataCompressor does compression on a block of data. +/// \details Not very good compression, but it's small and fast so is something you can use per-message at runtime. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __DATA_COMPRESSOR_H +#define __DATA_COMPRESSOR_H + +#include "RakMemoryOverride.h" +#include "DS_HuffmanEncodingTree.h" +#include "Export.h" + +namespace RakNet +{ + +/// \brief Does compression on a block of data. Not very good compression, but it's small and fast so is something you can compute at runtime. +class RAK_DLL_EXPORT DataCompressor +{ +public: + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(DataCompressor) + + static void Compress( unsigned char *userData, unsigned sizeInBytes, RakNet::BitStream * output ); + static unsigned DecompressAndAllocate( RakNet::BitStream * input, unsigned char **output ); +}; + +} // namespace RakNet + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DirectoryDeltaTransfer.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DirectoryDeltaTransfer.cpp new file mode 100644 index 0000000..2386ff9 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DirectoryDeltaTransfer.cpp @@ -0,0 +1,242 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_DirectoryDeltaTransfer==1 && _RAKNET_SUPPORT_FileOperations==1 + +#include "DirectoryDeltaTransfer.h" +#include "FileList.h" +#include "StringCompressor.h" +#include "RakPeerInterface.h" +#include "FileListTransfer.h" +#include "FileListTransferCBInterface.h" +#include "BitStream.h" +#include "MessageIdentifiers.h" +#include "FileOperations.h" +#include "IncrementalReadInterface.h" + +using namespace RakNet; + +#ifdef _MSC_VER +#pragma warning( push ) +#endif + +class DDTCallback : public FileListTransferCBInterface +{ +public: + unsigned subdirLen; + char outputSubdir[512]; + FileListTransferCBInterface *onFileCallback; + + DDTCallback() {} + virtual ~DDTCallback() {} + + virtual bool OnFile(OnFileStruct *onFileStruct) + { + char fullPathToDir[1024]; + + if (onFileStruct->fileName && onFileStruct->fileData && subdirLen < strlen(onFileStruct->fileName)) + { + strcpy(fullPathToDir, outputSubdir); + strcat(fullPathToDir, onFileStruct->fileName+subdirLen); + WriteFileWithDirectories(fullPathToDir, (char*)onFileStruct->fileData, (unsigned int ) onFileStruct->byteLengthOfThisFile); + } + else + fullPathToDir[0]=0; + + return onFileCallback->OnFile(onFileStruct); + } + + virtual void OnFileProgress(FileProgressStruct *fps) + { + char fullPathToDir[1024]; + + if (fps->onFileStruct->fileName && subdirLen < strlen(fps->onFileStruct->fileName)) + { + strcpy(fullPathToDir, outputSubdir); + strcat(fullPathToDir, fps->onFileStruct->fileName+subdirLen); + } + else + fullPathToDir[0]=0; + + onFileCallback->OnFileProgress(fps); + } + virtual bool OnDownloadComplete(DownloadCompleteStruct *dcs) + { + return onFileCallback->OnDownloadComplete(dcs); + } +}; + +STATIC_FACTORY_DEFINITIONS(DirectoryDeltaTransfer,DirectoryDeltaTransfer); + +DirectoryDeltaTransfer::DirectoryDeltaTransfer() +{ + applicationDirectory[0]=0; + fileListTransfer=0; + availableUploads = RakNet::OP_NEW( _FILE_AND_LINE_ ); + priority=HIGH_PRIORITY; + orderingChannel=0; + incrementalReadInterface=0; +} +DirectoryDeltaTransfer::~DirectoryDeltaTransfer() +{ + RakNet::OP_DELETE(availableUploads, _FILE_AND_LINE_); +} +void DirectoryDeltaTransfer::SetFileListTransferPlugin(FileListTransfer *flt) +{ + if (fileListTransfer) + { + DataStructures::List fileListProgressList; + fileListTransfer->GetCallbacks(fileListProgressList); + unsigned int i; + for (i=0; i < fileListProgressList.Size(); i++) + availableUploads->RemoveCallback(fileListProgressList[i]); + } + + fileListTransfer=flt; + + if (flt) + { + DataStructures::List fileListProgressList; + flt->GetCallbacks(fileListProgressList); + unsigned int i; + for (i=0; i < fileListProgressList.Size(); i++) + availableUploads->AddCallback(fileListProgressList[i]); + } + else + { + availableUploads->ClearCallbacks(); + } +} +void DirectoryDeltaTransfer::SetApplicationDirectory(const char *pathToApplication) +{ + if (pathToApplication==0 || pathToApplication[0]==0) + applicationDirectory[0]=0; + else + { + strncpy(applicationDirectory, pathToApplication, 510); + if (applicationDirectory[strlen(applicationDirectory)-1]!='/' && applicationDirectory[strlen(applicationDirectory)-1]!='\\') + strcat(applicationDirectory, "/"); + applicationDirectory[511]=0; + } +} +void DirectoryDeltaTransfer::SetUploadSendParameters(PacketPriority _priority, char _orderingChannel) +{ + priority=_priority; + orderingChannel=_orderingChannel; +} +void DirectoryDeltaTransfer::AddUploadsFromSubdirectory(const char *subdir) +{ + availableUploads->AddFilesFromDirectory(applicationDirectory, subdir, true, false, true, FileListNodeContext(0,0)); +} +unsigned short DirectoryDeltaTransfer::DownloadFromSubdirectory(FileList &localFiles, const char *subdir, const char *outputSubdir, bool prependAppDirToOutputSubdir, SystemAddress host, FileListTransferCBInterface *onFileCallback, PacketPriority _priority, char _orderingChannel, FileListProgress *cb) +{ + RakAssert(host!=UNASSIGNED_SYSTEM_ADDRESS); + + DDTCallback *transferCallback; + + localFiles.AddCallback(cb); + + // Prepare the callback data + transferCallback = RakNet::OP_NEW( _FILE_AND_LINE_ ); + if (subdir && subdir[0]) + { + transferCallback->subdirLen=(unsigned int)strlen(subdir); + if (subdir[transferCallback->subdirLen-1]!='/' && subdir[transferCallback->subdirLen-1]!='\\') + transferCallback->subdirLen++; + } + else + transferCallback->subdirLen=0; + if (prependAppDirToOutputSubdir) + strcpy(transferCallback->outputSubdir, applicationDirectory); + else + transferCallback->outputSubdir[0]=0; + if (outputSubdir) + strcat(transferCallback->outputSubdir, outputSubdir); + if (transferCallback->outputSubdir[strlen(transferCallback->outputSubdir)-1]!='/' && transferCallback->outputSubdir[strlen(transferCallback->outputSubdir)-1]!='\\') + strcat(transferCallback->outputSubdir, "/"); + transferCallback->onFileCallback=onFileCallback; + + // Setup the transfer plugin to get the response to this download request + unsigned short setId = fileListTransfer->SetupReceive(transferCallback, true, host); + + // Send to the host, telling it to process this request + RakNet::BitStream outBitstream; + outBitstream.Write((MessageID)ID_DDT_DOWNLOAD_REQUEST); + outBitstream.Write(setId); + StringCompressor::Instance()->EncodeString(subdir, 256, &outBitstream); + StringCompressor::Instance()->EncodeString(outputSubdir, 256, &outBitstream); + localFiles.Serialize(&outBitstream); + SendUnified(&outBitstream, _priority, RELIABLE_ORDERED, _orderingChannel, host, false); + + return setId; +} +unsigned short DirectoryDeltaTransfer::DownloadFromSubdirectory(const char *subdir, const char *outputSubdir, bool prependAppDirToOutputSubdir, SystemAddress host, FileListTransferCBInterface *onFileCallback, PacketPriority _priority, char _orderingChannel, FileListProgress *cb) +{ + FileList localFiles; + // Get a hash of all the files that we already have (if any) + localFiles.AddFilesFromDirectory(prependAppDirToOutputSubdir ? applicationDirectory : 0, outputSubdir, true, false, true, FileListNodeContext(0,0)); + return DownloadFromSubdirectory(localFiles, subdir, outputSubdir, prependAppDirToOutputSubdir, host, onFileCallback, _priority, _orderingChannel, cb); +} +void DirectoryDeltaTransfer::GenerateHashes(FileList &localFiles, const char *outputSubdir, bool prependAppDirToOutputSubdir) +{ + localFiles.AddFilesFromDirectory(prependAppDirToOutputSubdir ? applicationDirectory : 0, outputSubdir, true, false, true, FileListNodeContext(0,0)); +} +void DirectoryDeltaTransfer::ClearUploads(void) +{ + availableUploads->Clear(); +} +void DirectoryDeltaTransfer::OnDownloadRequest(Packet *packet) +{ + char subdir[256]; + char remoteSubdir[256]; + RakNet::BitStream inBitstream(packet->data, packet->length, false); + FileList remoteFileHash; + FileList delta; + unsigned short setId; + inBitstream.IgnoreBits(8); + inBitstream.Read(setId); + StringCompressor::Instance()->DecodeString(subdir, 256, &inBitstream); + StringCompressor::Instance()->DecodeString(remoteSubdir, 256, &inBitstream); + if (remoteFileHash.Deserialize(&inBitstream)==false) + { +#ifdef _DEBUG + RakAssert(0); +#endif + return; + } + + availableUploads->GetDeltaToCurrent(&remoteFileHash, &delta, subdir, remoteSubdir); + if (incrementalReadInterface==0) + delta.PopulateDataFromDisk(applicationDirectory, true, false, true); + else + delta.FlagFilesAsReferences(); + + // This will call the ddtCallback interface that was passed to FileListTransfer::SetupReceive on the remote system + fileListTransfer->Send(&delta, rakPeerInterface, packet->systemAddress, setId, priority, orderingChannel, incrementalReadInterface, chunkSize); +} +PluginReceiveResult DirectoryDeltaTransfer::OnReceive(Packet *packet) +{ + switch (packet->data[0]) + { + case ID_DDT_DOWNLOAD_REQUEST: + OnDownloadRequest(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + + return RR_CONTINUE_PROCESSING; +} + +unsigned DirectoryDeltaTransfer::GetNumberOfFilesForUpload(void) const +{ + return availableUploads->fileList.Size(); +} + +void DirectoryDeltaTransfer::SetDownloadRequestIncrementalReadInterface(IncrementalReadInterface *_incrementalReadInterface, unsigned int _chunkSize) +{ + incrementalReadInterface=_incrementalReadInterface; + chunkSize=_chunkSize; +} + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DirectoryDeltaTransfer.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DirectoryDeltaTransfer.h new file mode 100644 index 0000000..1162e28 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DirectoryDeltaTransfer.h @@ -0,0 +1,164 @@ +/// \file DirectoryDeltaTransfer.h +/// \brief Simple class to send changes between directories. +/// \details In essence, a simple autopatcher that can be used for transmitting levels, skins, etc. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_DirectoryDeltaTransfer==1 && _RAKNET_SUPPORT_FileOperations==1 + +#ifndef __DIRECTORY_DELTA_TRANSFER_H +#define __DIRECTORY_DELTA_TRANSFER_H + +#include "RakMemoryOverride.h" +#include "RakNetTypes.h" +#include "Export.h" +#include "PluginInterface2.h" +#include "DS_Map.h" +#include "PacketPriority.h" + +/// \defgroup DIRECTORY_DELTA_TRANSFER_GROUP DirectoryDeltaTransfer +/// \brief Simple class to send changes between directories +/// \details +/// \ingroup PLUGINS_GROUP + +/// \brief Simple class to send changes between directories. In essence, a simple autopatcher that can be used for transmitting levels, skins, etc. +/// \details +/// \sa AutopatcherClient class for database driven patching, including binary deltas and search by date. +/// +/// To use, first set the path to your application. For example "C:/Games/MyRPG/"
+/// To allow other systems to download files, call AddUploadsFromSubdirectory, where the parameter is a path relative
+/// to the path to your application. This includes subdirectories.
+/// For example:
+/// SetApplicationDirectory("C:/Games/MyRPG/");
+/// AddUploadsFromSubdirectory("Mods/Skins/");
+/// would allow downloads from
+/// "C:/Games/MyRPG/Mods/Skins/*.*" as well as "C:/Games/MyRPG/Mods/Skins/Level1/*.*"
+/// It would NOT allow downloads from C:/Games/MyRPG/Levels, nor would it allow downloads from C:/Windows
+/// While pathToApplication can be anything you want, applicationSubdirectory must match either partially or fully between systems. +/// \ingroup DIRECTORY_DELTA_TRANSFER_GROUP + +namespace RakNet +{ +/// Forward declarations +class RakPeerInterface; +class FileList; +struct Packet; +struct InternalPacket; +struct DownloadRequest; +class FileListTransfer; +class FileListTransferCBInterface; +class FileListProgress; +class IncrementalReadInterface; + +class RAK_DLL_EXPORT DirectoryDeltaTransfer : public PluginInterface2 +{ +public: + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(DirectoryDeltaTransfer) + + // Constructor + DirectoryDeltaTransfer(); + + // Destructor + virtual ~DirectoryDeltaTransfer(); + + /// \brief This plugin has a dependency on the FileListTransfer plugin, which it uses to actually send the files. + /// \details So you need an instance of that plugin registered with RakPeerInterface, and a pointer to that interface should be passed here. + /// \param[in] flt A pointer to a registered instance of FileListTransfer + void SetFileListTransferPlugin(FileListTransfer *flt); + + /// \brief Set the local root directory to base all file uploads and downloads off of. + /// \param[in] pathToApplication This path will be prepended to \a applicationSubdirectory in AddUploadsFromSubdirectory to find the actual path on disk. + void SetApplicationDirectory(const char *pathToApplication); + + /// \brief What parameters to use for the RakPeerInterface::Send() call when uploading files. + /// \param[in] _priority See RakPeerInterface::Send() + /// \param[in] _orderingChannel See RakPeerInterface::Send() + void SetUploadSendParameters(PacketPriority _priority, char _orderingChannel); + + /// \brief Add all files in the specified subdirectory recursively. + /// \details \a subdir is appended to \a pathToApplication in SetApplicationDirectory(). + /// All files in the resultant directory and subdirectories are then hashed so that users can download them. + /// \pre You must call SetFileListTransferPlugin with a valid FileListTransfer plugin + /// \param[in] subdir Concatenated with pathToApplication to form the final path from which to allow uploads. + void AddUploadsFromSubdirectory(const char *subdir); + + /// \brief Downloads files from the matching parameter \a subdir in AddUploadsFromSubdirectory. + /// \details \a subdir must contain all starting characters in \a subdir in AddUploadsFromSubdirectory + /// Therefore, + /// AddUploadsFromSubdirectory("Levels/Level1/"); would allow you to download using DownloadFromSubdirectory("Levels/Level1/Textures/"... + /// but it would NOT allow you to download from DownloadFromSubdirectory("Levels/"... or DownloadFromSubdirectory("Levels/Level2/"... + /// \pre You must call SetFileListTransferPlugin with a valid FileListTransfer plugin + /// \note Blocking. Will block while hashes of the local files are generated + /// \param[in] subdir A directory passed to AddUploadsFromSubdirectory on the remote system. The passed dir can be more specific than the remote dir. + /// \param[in] outputSubdir The directory to write the output to. Usually this will match \a subdir but it can be different if you want. + /// \param[in] prependAppDirToOutputSubdir True to prepend outputSubdir with pathToApplication when determining the final output path. Usually you want this to be true. + /// \param[in] host The address of the remote system to send the message to. + /// \param[in] onFileCallback Callback to call per-file (optional). When fileIndex+1==setCount in the callback then the download is done + /// \param[in] _priority See RakPeerInterface::Send() + /// \param[in] _orderingChannel See RakPeerInterface::Send() + /// \param[in] cb Callback to get progress updates. Pass 0 to not use. + /// \return A set ID, identifying this download set. Returns 65535 on host unreachable. + unsigned short DownloadFromSubdirectory(const char *subdir, const char *outputSubdir, bool prependAppDirToOutputSubdir, SystemAddress host, FileListTransferCBInterface *onFileCallback, PacketPriority _priority, char _orderingChannel, FileListProgress *cb); + + /// \brief Downloads files from the matching parameter \a subdir in AddUploadsFromSubdirectory. + /// \details \a subdir must contain all starting characters in \a subdir in AddUploadsFromSubdirectory + /// Therefore, + /// AddUploadsFromSubdirectory("Levels/Level1/"); would allow you to download using DownloadFromSubdirectory("Levels/Level1/Textures/"... + /// but it would NOT allow you to download from DownloadFromSubdirectory("Levels/"... or DownloadFromSubdirectory("Levels/Level2/"... + /// \pre You must call SetFileListTransferPlugin with a valid FileListTransfer plugin + /// \note Nonblocking, but requires call to GenerateHashes() + /// \param[in] localFiles Hashes of local files already on the harddrive. Populate with GenerateHashes(), which you may wish to call from a thread + /// \param[in] subdir A directory passed to AddUploadsFromSubdirectory on the remote system. The passed dir can be more specific than the remote dir. + /// \param[in] outputSubdir The directory to write the output to. Usually this will match \a subdir but it can be different if you want. + /// \param[in] prependAppDirToOutputSubdir True to prepend outputSubdir with pathToApplication when determining the final output path. Usually you want this to be true. + /// \param[in] host The address of the remote system to send the message to. + /// \param[in] onFileCallback Callback to call per-file (optional). When fileIndex+1==setCount in the callback then the download is done + /// \param[in] _priority See RakPeerInterface::Send() + /// \param[in] _orderingChannel See RakPeerInterface::Send() + /// \param[in] cb Callback to get progress updates. Pass 0 to not use. + /// \return A set ID, identifying this download set. Returns 65535 on host unreachable. + unsigned short DownloadFromSubdirectory(FileList &localFiles, const char *subdir, const char *outputSubdir, bool prependAppDirToOutputSubdir, SystemAddress host, FileListTransferCBInterface *onFileCallback, PacketPriority _priority, char _orderingChannel, FileListProgress *cb); + + /// Hash files already on the harddrive, in preparation for a call to DownloadFromSubdirectory(). Passed to second version of DownloadFromSubdirectory() + /// This is slow, and it is exposed so you can call it from a thread before calling DownloadFromSubdirectory() + /// \param[out] localFiles List of hashed files populated from \a outputSubdir and \a prependAppDirToOutputSubdir + /// \param[in] outputSubdir The directory to write the output to. Usually this will match \a subdir but it can be different if you want. + /// \param[in] prependAppDirToOutputSubdir True to prepend outputSubdir with pathToApplication when determining the final output path. Usually you want this to be true. + void GenerateHashes(FileList &localFiles, const char *outputSubdir, bool prependAppDirToOutputSubdir); + + /// \brief Clear all allowed uploads previously set with AddUploadsFromSubdirectory + void ClearUploads(void); + + /// \brief Returns how many files are available for upload + /// \return How many files are available for upload + unsigned GetNumberOfFilesForUpload(void) const; + + /// \brief Normally, if a remote system requests files, those files are all loaded into memory and sent immediately. + /// \details This function allows the files to be read in incremental chunks, saving memory + /// \param[in] _incrementalReadInterface If a file in \a fileList has no data, filePullInterface will be used to read the file in chunks of size \a chunkSize + /// \param[in] _chunkSize How large of a block of a file to send at once + void SetDownloadRequestIncrementalReadInterface(IncrementalReadInterface *_incrementalReadInterface, unsigned int _chunkSize); + + /// \internal For plugin handling + virtual PluginReceiveResult OnReceive(Packet *packet); +protected: + void OnDownloadRequest(Packet *packet); + + char applicationDirectory[512]; + FileListTransfer *fileListTransfer; + FileList *availableUploads; + PacketPriority priority; + char orderingChannel; + IncrementalReadInterface *incrementalReadInterface; + unsigned int chunkSize; +}; + +} // namespace RakNet + +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DynDNS.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DynDNS.cpp new file mode 100644 index 0000000..bd51714 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DynDNS.cpp @@ -0,0 +1,236 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_DynDNS==1 && _RAKNET_SUPPORT_TCPInterface==1 + +#include "TCPInterface.h" +#include "SocketLayer.h" +#include "DynDNS.h" +#include "GetTime.h" + +using namespace RakNet; + +struct DynDnsResult +{ + const char *description; + const char *code; + DynDnsResultCode resultCode; +}; + +DynDnsResult resultTable[13] = +{ + // See http://www.dyndns.com/developers/specs/flow.pdf + {"DNS update success.\nPlease wait up to 60 seconds for the change to take effect.\n", "good", RC_SUCCESS}, // Even with success, it takes time for the cache to update! + {"No change", "nochg", RC_NO_CHANGE}, + {"Host has been blocked. You will need to contact DynDNS to reenable.", "abuse", RC_ABUSE}, + {"Useragent is blocked", "badagent", RC_BAD_AGENT}, + {"Username/password pair bad", "badauth", RC_BAD_AUTH}, + {"Bad system parameter", "badsys", RC_BAD_SYS}, + {"DNS inconsistency", "dnserr", RC_DNS_ERROR}, + {"Paid account feature", "!donator", RC_NOT_DONATOR}, + {"No such host in system", "nohost", RC_NO_HOST}, + {"Invalid hostname format", "notfqdn", RC_NOT_FQDN}, + {"Serious error", "numhost", RC_NUM_HOST}, + {"This host exists, but does not belong to you", "!yours", RC_NOT_YOURS}, + {"911", "911", RC_911}, +}; +DynDNS::DynDNS() +{ + connectPhase=CP_IDLE; + tcp=0; +} +DynDNS::~DynDNS() +{ + if (tcp) + RakNet::OP_DELETE(tcp, _FILE_AND_LINE_); +} +void DynDNS::Stop(void) +{ + tcp->Stop(); + connectPhase = CP_IDLE; + RakNet::OP_DELETE(tcp, _FILE_AND_LINE_); + tcp=0; +} + + +// newIPAddress is optional - if left out, DynDNS will use whatever it receives +void DynDNS::UpdateHostIP(const char *dnsHost, const char *newIPAddress, const char *usernameAndPassword ) +{ + myIPStr[0]=0; + + if (tcp==0) + tcp = RakNet::OP_NEW(_FILE_AND_LINE_); + connectPhase = CP_IDLE; + host = dnsHost; + + if (tcp->Start(0, 1)==false) + { + SetCompleted(RC_TCP_FAILED_TO_START, "TCP failed to start"); + return; + } + + connectPhase = CP_CONNECTING_TO_CHECKIP; + tcp->Connect("checkip.dyndns.org", 80, false); + + // See https://www.dyndns.com/developers/specs/syntax.html + getString="GET /nic/update?hostname="; + getString+=dnsHost; + if (newIPAddress) + { + getString+="&myip="; + getString+=newIPAddress; + } + getString+="&wildcard=NOCHG&mx=NOCHG&backmx=NOCHG HTTP/1.0\n"; + getString+="Host: members.dyndns.org\n"; + getString+="Authorization: Basic "; + char outputData[512]; + TCPInterface::Base64Encoding(usernameAndPassword, (int) strlen(usernameAndPassword), outputData); + getString+=outputData; + getString+="User-Agent: Jenkins Software LLC - PC - 1.0\n\n"; +} +void DynDNS::Update(void) +{ + if (connectPhase==CP_IDLE) + return; + + serverAddress=tcp->HasFailedConnectionAttempt(); + if (serverAddress!=UNASSIGNED_SYSTEM_ADDRESS) + { + SetCompleted(RC_TCP_DID_NOT_CONNECT, "Could not connect to DynDNS"); + return; + } + + serverAddress=tcp->HasCompletedConnectionAttempt(); + if (serverAddress!=UNASSIGNED_SYSTEM_ADDRESS) + { + if (connectPhase == CP_CONNECTING_TO_CHECKIP) + { + checkIpAddress=serverAddress; + connectPhase = CP_WAITING_FOR_CHECKIP_RESPONSE; + tcp->Send("GET\n\n", (unsigned int) strlen("GET\n\n"), serverAddress, false); // Needs 2 newlines! This is not documented and wasted a lot of my time + } + else + { + connectPhase = CP_WAITING_FOR_DYNDNS_RESPONSE; + tcp->Send(getString.C_String(), (unsigned int) getString.GetLength(), serverAddress, false); + } + phaseTimeout=RakNet::GetTime()+1000; + } + + if (connectPhase==CP_WAITING_FOR_CHECKIP_RESPONSE && RakNet::GetTime()>phaseTimeout) + { + connectPhase = CP_CONNECTING_TO_DYNDNS; + tcp->CloseConnection(checkIpAddress); + tcp->Connect("members.dyndns.org", 80, false); + } + else if (connectPhase==CP_WAITING_FOR_DYNDNS_RESPONSE && RakNet::GetTime()>phaseTimeout) + { + SetCompleted(RC_DYNDNS_TIMEOUT, "DynDNS did not respond"); + return; + } + + Packet *packet = tcp->Receive(); + if (packet) + { + if (connectPhase==CP_WAITING_FOR_DYNDNS_RESPONSE) + { + unsigned int i; + + char *result; + result=strstr((char*) packet->data, "Connection: close"); + if (result!=0) + { + result+=strlen("Connection: close"); + while (*result && (*result=='\r') || (*result=='\n') || (*result==' ') ) + result++; + for (i=0; i < 13; i++) + { + if (strncmp(resultTable[i].code, result, strlen(resultTable[i].code))==0) + { + if (resultTable[i].resultCode==RC_SUCCESS) + { + // Read my external IP into myIPStr + // Advance until we hit a number + while (*result && ((*result<'0') || (*result>'9')) ) + result++; + if (*result) + { + SystemAddress parser; + parser.FromString(result); + parser.ToString(false, myIPStr); + } + } + tcp->DeallocatePacket(packet); + SetCompleted(resultTable[i].resultCode, resultTable[i].description); + break; + } + } + if (i==13) + { + tcp->DeallocatePacket(packet); + SetCompleted(RC_UNKNOWN_RESULT, "DynDNS returned unknown result"); + } + } + else + { + tcp->DeallocatePacket(packet); + SetCompleted(RC_PARSING_FAILURE, "Parsing failure on returned string from DynDNS"); + } + + return; + } + else + { + /* + HTTP/1.1 200 OK + Content-Type: text/html + Server: DynDNS-CheckIP/1.0 + Connection: close + Cache-Control: no-cache + Pragma: no-cache + Content-Length: 105 + + Current IP CheckCurrent IP Address: 98.1 + 89.219.22 + + + Connection to host lost. + */ + + char *result; + result=strstr((char*) packet->data, "Current IP Address: "); + if (result!=0) + { + result+=strlen("Current IP Address: "); + SystemAddress myIp; + myIp.FromString(result); + myIp.ToString(false, myIPStr); + + // Resolve DNS we are setting. If equal to current then abort + const char *existingHost = ( char* ) SocketLayer::DomainNameToIP( host.C_String() ); + if (existingHost && strcmp(existingHost, myIPStr)==0) + { + // DynDNS considers setting the IP to what it is already set abuse + tcp->DeallocatePacket(packet); + SetCompleted(RC_DNS_ALREADY_SET, "No action needed"); + return; + } + } + + tcp->DeallocatePacket(packet); + tcp->CloseConnection(packet->systemAddress); + + connectPhase = CP_CONNECTING_TO_DYNDNS; + tcp->Connect("members.dyndns.org", 80, false); + } + } + + if (tcp->HasLostConnection()!=UNASSIGNED_SYSTEM_ADDRESS) + { + if (connectPhase==CP_WAITING_FOR_DYNDNS_RESPONSE) + { + SetCompleted(RC_CONNECTION_LOST_WITHOUT_RESPONSE, "Connection lost to DynDNS during GET operation"); + } + } +} + + +#endif // _RAKNET_SUPPORT_DynDNS diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DynDNS.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DynDNS.h new file mode 100644 index 0000000..e163377 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/DynDNS.h @@ -0,0 +1,100 @@ +/// \file DynDNS.h +/// \brief Helper to class to update DynDNS +/// This can be used to determine what permissions are should be allowed to the other system +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_DynDNS==1 && _RAKNET_SUPPORT_TCPInterface==1 + +class TCPInterface; + +#ifndef __DYN_DNS_H +#define __DYN_DNS_H + +namespace RakNet +{ + +enum DynDnsResultCode +{ + // ----- Success ----- + RC_SUCCESS, + RC_DNS_ALREADY_SET, // RakNet detects no action is needed + + // ----- Ignorable failure (treat same as success) ----- + RC_NO_CHANGE, // DynDNS detects no action is needed (treated as abuse though) + + // ----- User error ----- + RC_NOT_DONATOR, // You have to pay to do this + RC_NO_HOST, // This host does not exist at all + RC_BAD_AUTH, // You set the wrong password + RC_NOT_YOURS, // This is not your host + + // ----- Permanent failure ----- + RC_ABUSE, // Your host has been blocked, too many failures disable your account + RC_TCP_FAILED_TO_START, // TCP port already in use + RC_TCP_DID_NOT_CONNECT, // DynDNS down? + RC_UNKNOWN_RESULT, // DynDNS returned a result code that was not documented as of 12/4/2010 on http://www.dyndns.com/developers/specs/flow.pdf + RC_PARSING_FAILURE, // Can't read the result returned, format change? + RC_CONNECTION_LOST_WITHOUT_RESPONSE, // Lost the connection to DynDNS while communicating + RC_BAD_AGENT, // ??? + RC_BAD_SYS, // ??? + RC_DNS_ERROR, // ??? + RC_NOT_FQDN, // ??? + RC_NUM_HOST, // ??? + RC_911, // ??? + RC_DYNDNS_TIMEOUT, // DynDNS did not respond +}; + +// Can only process one at a time with the current implementation +class RAK_DLL_EXPORT DynDNS +{ +public: + DynDNS(); + ~DynDNS(); + + // Pass 0 for newIPAddress to autodetect whatever you are uploading from + // usernameAndPassword should be in the format username:password + void UpdateHostIP(const char *dnsHost, const char *newIPAddress, const char *usernameAndPassword ); + void Update(void); + + // Output + bool IsRunning(void) const {return connectPhase!=CP_IDLE;} + bool IsCompleted(void) const {return connectPhase==CP_IDLE;} + RakNet::DynDnsResultCode GetCompletedResultCode(void) {return result;} + const char *GetCompletedDescription(void) const {return resultDescription;} + bool WasResultSuccessful(void) const {return result==RC_SUCCESS || result==RC_DNS_ALREADY_SET || result==RC_NO_CHANGE;} + char *GetMyPublicIP(void) const {return (char*) myIPStr;} // We get our public IP as part of the process. This is valid once completed + +protected: + void Stop(void); + void SetCompleted(RakNet::DynDnsResultCode _result, const char *_resultDescription) {Stop(); result=_result; resultDescription=_resultDescription;} + + enum ConnectPhase + { + CP_CONNECTING_TO_CHECKIP, + CP_WAITING_FOR_CHECKIP_RESPONSE, + CP_CONNECTING_TO_DYNDNS, + CP_WAITING_FOR_DYNDNS_RESPONSE, + CP_IDLE, + }; + + TCPInterface *tcp; + RakNet::RakString getString; + SystemAddress serverAddress; + ConnectPhase connectPhase; + RakNet::RakString host; + RakNet::Time phaseTimeout; + SystemAddress checkIpAddress; + const char *resultDescription; + RakNet::DynDnsResultCode result; + char myIPStr[32]; +}; + +} // namespace RakNet + +#endif // __DYN_DNS_H + +#endif // _RAKNET_SUPPORT_DynDNS diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/EmailSender.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/EmailSender.cpp new file mode 100644 index 0000000..2a0e4a4 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/EmailSender.cpp @@ -0,0 +1,362 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_EmailSender==1 && _RAKNET_SUPPORT_TCPInterface==1 && _RAKNET_SUPPORT_FileOperations==1 + +// Useful sites +// http://www.faqs.org\rfcs\rfc2821.html +// http://www2.rad.com\networks/1995/mime/examples.htm + +#include "EmailSender.h" +#include "TCPInterface.h" +#include "GetTime.h" +#include "Rand.h" +#include "FileList.h" +#include "BitStream.h" +#include + + + + + +#include "RakSleep.h" + +using namespace RakNet; + + +STATIC_FACTORY_DEFINITIONS(EmailSender,EmailSender); + +const char *EmailSender::Send(const char *hostAddress, unsigned short hostPort, const char *sender, const char *recipient, const char *senderName, const char *recipientName, const char *subject, const char *body, FileList *attachedFiles, bool doPrintf, const char *password) +{ + RakNet::Packet *packet; + char query[1024]; + TCPInterface tcpInterface; + SystemAddress emailServer; + if (tcpInterface.Start(0, 0)==false) + return "Unknown error starting TCP"; + emailServer=tcpInterface.Connect(hostAddress, hostPort,true); + if (emailServer==UNASSIGNED_SYSTEM_ADDRESS) + return "Failed to connect to host"; +#if OPEN_SSL_CLIENT_SUPPORT==1 + tcpInterface.StartSSLClient(emailServer); +#endif + RakNet::TimeMS timeoutTime = RakNet::GetTimeMS()+3000; + packet=0; + while (RakNet::GetTimeMS() < timeoutTime) + { + packet = tcpInterface.Receive(); + if (packet) + { + if (doPrintf) + RAKNET_DEBUG_PRINTF("%s", packet->data); + break; + } + RakSleep(250); + } + + if (packet==0) + return "Timeout while waiting for initial data from server."; + + tcpInterface.Send("EHLO\r\n", 6, emailServer,false); + const char *response; + bool authenticate=false; +#ifdef _MSC_VER +#pragma warning(disable:4127) // conditional expression is constant +#endif + while (1) + { + response=GetResponse(&tcpInterface, emailServer, doPrintf); + + if (response!=0 && strcmp(response, "AUTHENTICATE")==0) + { + authenticate=true; + break; + } + + // Something other than continue? + if (response!=0 && strcmp(response, "CONTINUE")!=0) + return response; + + // Success? + if (response==0) + break; + } + + if (authenticate) + { + sprintf(query, "EHLO %s\r\n", sender); + tcpInterface.Send(query, (unsigned int)strlen(query), emailServer,false); + response=GetResponse(&tcpInterface, emailServer, doPrintf); + if (response!=0) + return response; + if (password==0) + return "Password needed"; + char *outputData = RakNet::OP_NEW_ARRAY((const int) (strlen(sender)+strlen(password)+2)*3, _FILE_AND_LINE_ ); + RakNet::BitStream bs; + char zero=0; + bs.Write(&zero,1); + bs.Write(sender,(const unsigned int)strlen(sender)); + //bs.Write("jms1@jms1.net",(const unsigned int)strlen("jms1@jms1.net")); + bs.Write(&zero,1); + bs.Write(password,(const unsigned int)strlen(password)); + bs.Write(&zero,1); + //bs.Write("not.my.real.password",(const unsigned int)strlen("not.my.real.password")); + TCPInterface::Base64Encoding((const char*)bs.GetData(), bs.GetNumberOfBytesUsed(), outputData); + sprintf(query, "AUTH PLAIN %s", outputData); + tcpInterface.Send(query, (unsigned int)strlen(query), emailServer,false); + response=GetResponse(&tcpInterface, emailServer, doPrintf); + if (response!=0) + return response; + } + + + if (sender) + sprintf(query, "MAIL From: <%s>\r\n", sender); + else + sprintf(query, "MAIL From: <>\r\n"); + tcpInterface.Send(query, (unsigned int)strlen(query), emailServer,false); + response=GetResponse(&tcpInterface, emailServer, doPrintf); + if (response!=0) + return response; + + if (recipient) + sprintf(query, "RCPT TO: <%s>\r\n", recipient); + else + sprintf(query, "RCPT TO: <>\r\n"); + tcpInterface.Send(query, (unsigned int)strlen(query), emailServer,false); + response=GetResponse(&tcpInterface, emailServer, doPrintf); + if (response!=0) + return response; + + tcpInterface.Send("DATA\r\n", (unsigned int)strlen("DATA\r\n"), emailServer,false); + + // Wait for 354... + + response=GetResponse(&tcpInterface, emailServer, doPrintf); + if (response!=0) + return response; + + if (subject) + { + sprintf(query, "Subject: %s\r\n", subject); + tcpInterface.Send(query, (unsigned int)strlen(query), emailServer,false); + } + if (senderName) + { + sprintf(query, "From: %s\r\n", senderName); + tcpInterface.Send(query, (unsigned int)strlen(query), emailServer,false); + } + if (recipientName) + { + sprintf(query, "To: %s\r\n", recipientName); + tcpInterface.Send(query, (unsigned int)strlen(query), emailServer,false); + } + + const int boundarySize=60; + char boundary[boundarySize+1]; + int i,j; + if (attachedFiles && attachedFiles->fileList.Size()) + { + rakNetRandom.SeedMT((unsigned int) RakNet::GetTimeMS()); + // Random multipart message boundary + for (i=0; i < boundarySize; i++) + boundary[i]=TCPInterface::Base64Map()[rakNetRandom.RandomMT()%64]; + boundary[boundarySize]=0; + } + + sprintf(query, "MIME-version: 1.0\r\n"); + tcpInterface.Send(query, (unsigned int)strlen(query), emailServer,false); + + if (attachedFiles && attachedFiles->fileList.Size()) + { + sprintf(query, "Content-type: multipart/mixed; BOUNDARY=\"%s\"\r\n\r\n", boundary); + tcpInterface.Send(query, (unsigned int)strlen(query), emailServer,false); + + sprintf(query, "This is a multi-part message in MIME format.\r\n\r\n--%s\r\n", boundary); + tcpInterface.Send(query, (unsigned int)strlen(query), emailServer,false); + } + + sprintf(query, "Content-Type: text/plain; charset=\"US-ASCII\"\r\n\r\n"); + tcpInterface.Send(query, (unsigned int)strlen(query), emailServer,false); + + // Write the body of the email, doing some lame shitty shit where I have to make periods at the start of a newline have a second period. + char *newBody; + int bodyLength; + bodyLength=(int)strlen(body); + newBody = (char*) rakMalloc_Ex( bodyLength*3, _FILE_AND_LINE_ ); + if (bodyLength>0) + newBody[0]=body[0]; + for (i=1, j=1; i < bodyLength; i++) + { + // Transform \n . \r \n into \n . . \r \n + if (i < bodyLength-2 && + body[i-1]=='\n' && + body[i+0]=='.' && + body[i+1]=='\r' && + body[i+2]=='\n') + { + newBody[j++]='.'; + newBody[j++]='.'; + newBody[j++]='\r'; + newBody[j++]='\n'; + i+=2; + } + // Transform \n . . \r \n into \n . . . \r \n + // Having to process .. is a bug in the mail server - the spec says ONLY \r\n.\r\n should be transformed + else if (i <= bodyLength-3 && + body[i-1]=='\n' && + body[i+0]=='.' && + body[i+1]=='.' && + body[i+2]=='\r' && + body[i+3]=='\n') + { + newBody[j++]='.'; + newBody[j++]='.'; + newBody[j++]='.'; + newBody[j++]='\r'; + newBody[j++]='\n'; + i+=3; + } + // Transform \n . \n into \n . . \r \n (this is a bug in the mail server - the spec says do not count \n alone but it does) + else if (i < bodyLength-1 && + body[i-1]=='\n' && + body[i+0]=='.' && + body[i+1]=='\n') + { + newBody[j++]='.'; + newBody[j++]='.'; + newBody[j++]='\r'; + newBody[j++]='\n'; + i+=1; + } + // Transform \n . . \n into \n . . . \r \n (this is a bug in the mail server - the spec says do not count \n alone but it does) + // In fact having to process .. is a bug too - because the spec says ONLY \r\n.\r\n should be transformed + else if (i <= bodyLength-2 && + body[i-1]=='\n' && + body[i+0]=='.' && + body[i+1]=='.' && + body[i+2]=='\n') + { + newBody[j++]='.'; + newBody[j++]='.'; + newBody[j++]='.'; + newBody[j++]='\r'; + newBody[j++]='\n'; + i+=2; + } + else + newBody[j++]=body[i]; + } + + newBody[j++]='\r'; + newBody[j++]='\n'; + tcpInterface.Send(newBody, j, emailServer,false); + + rakFree_Ex(newBody, _FILE_AND_LINE_ ); + int outputOffset; + + // What a pain in the rear. I have to map the binary to printable characters using 6 bits per character. + if (attachedFiles && attachedFiles->fileList.Size()) + { + for (i=0; i < (int) attachedFiles->fileList.Size(); i++) + { + // Write boundary + sprintf(query, "\r\n--%s\r\n", boundary); + tcpInterface.Send(query, (unsigned int)strlen(query), emailServer,false); + + sprintf(query, "Content-Type: APPLICATION/Octet-Stream; SizeOnDisk=%i; name=\"%s\"\r\nContent-Transfer-Encoding: BASE64\r\nContent-Description: %s\r\n\r\n", attachedFiles->fileList[i].dataLengthBytes, attachedFiles->fileList[i].filename.C_String(), attachedFiles->fileList[i].filename.C_String()); + tcpInterface.Send(query, (unsigned int)strlen(query), emailServer,false); + + newBody = (char*) rakMalloc_Ex( (size_t) (attachedFiles->fileList[i].dataLengthBytes*3)/2, _FILE_AND_LINE_ ); + + outputOffset=TCPInterface::Base64Encoding(attachedFiles->fileList[i].data, (int) attachedFiles->fileList[i].dataLengthBytes, newBody); + + // Send the base64 mapped file. + tcpInterface.Send(newBody, outputOffset, emailServer,false); + rakFree_Ex(newBody, _FILE_AND_LINE_ ); + + } + + // Write last boundary + sprintf(query, "\r\n--%s--\r\n", boundary); + tcpInterface.Send(query, (unsigned int)strlen(query), emailServer,false); + } + + + sprintf(query, "\r\n.\r\n"); + tcpInterface.Send(query, (unsigned int)strlen(query), emailServer,false); + response=GetResponse(&tcpInterface, emailServer, doPrintf); + if (response!=0) + return response; + + tcpInterface.Send("QUIT\r\n", (unsigned int)strlen("QUIT\r\n"), emailServer,false); + + RakSleep(30); + if (doPrintf) + { + packet = tcpInterface.Receive(); + while (packet) + { + RAKNET_DEBUG_PRINTF("%s", packet->data); + packet = tcpInterface.Receive(); + } + } + tcpInterface.Stop(); + return 0; // Success +} + +const char *EmailSender::GetResponse(TCPInterface *tcpInterface, const SystemAddress &emailServer, bool doPrintf) +{ + RakNet::Packet *packet; + RakNet::TimeMS timeout; + timeout=RakNet::GetTimeMS()+5000; +#ifdef _MSC_VER + #pragma warning( disable : 4127 ) // warning C4127: conditional expression is constant +#endif + while (1) + { + if (tcpInterface->HasLostConnection()==emailServer) + return "Connection to server lost."; + packet = tcpInterface->Receive(); + if (packet) + { + if (doPrintf) + { + RAKNET_DEBUG_PRINTF("%s", packet->data); + } +#if OPEN_SSL_CLIENT_SUPPORT==1 + if (strstr((const char*)packet->data, "220")) + { + tcpInterface->StartSSLClient(packet->systemAddress); + return "AUTHENTICATE"; // OK + } +// if (strstr((const char*)packet->data, "250-AUTH LOGIN PLAIN")) +// { +// tcpInterface->StartSSLClient(packet->systemAddress); +// return "AUTHENTICATE"; // OK +// } +#endif + if (strstr((const char*)packet->data, "235")) + return 0; // Authentication accepted + if (strstr((const char*)packet->data, "354")) + return 0; // Go ahead +#if OPEN_SSL_CLIENT_SUPPORT==1 + if (strstr((const char*)packet->data, "250-STARTTLS")) + { + tcpInterface->Send("STARTTLS\r\n", (unsigned int) strlen("STARTTLS\r\n"), packet->systemAddress, false); + return "CONTINUE"; + } +#endif + if (strstr((const char*)packet->data, "250")) + return 0; // OK + if (strstr((const char*)packet->data, "550")) + return "Failed on error code 550"; + if (strstr((const char*)packet->data, "553")) + return "Failed on error code 553"; + } + if (RakNet::GetTimeMS() > timeout) + return "Timed out"; + RakSleep(100); + } +} + + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/EmailSender.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/EmailSender.h new file mode 100644 index 0000000..04c0880 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/EmailSender.h @@ -0,0 +1,58 @@ +/// \file EmailSender.h +/// \brief Rudimentary class to send email from code. Don't expect anything fancy. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_EmailSender==1 && _RAKNET_SUPPORT_TCPInterface==1 && _RAKNET_SUPPORT_FileOperations==1 + +#ifndef __EMAIL_SENDER_H +#define __EMAIL_SENDER_H + +#include "RakNetTypes.h" +#include "RakMemoryOverride.h" +#include "Export.h" +#include "Rand.h" +#include "TCPInterface.h" + +namespace RakNet +{ +/// Forward declarations +class FileList; +class TCPInterface; + +/// \brief Rudimentary class to send email from code. +class RAK_DLL_EXPORT EmailSender +{ +public: + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(EmailSender) + + /// \brief Sends an email. + /// \param[in] hostAddress The address of the email server. + /// \param[in] hostPort The port of the email server (usually 25) + /// \param[in] sender The email address you are sending from. + /// \param[in] recipient The email address you are sending to. + /// \param[in] senderName The email address you claim to be sending from + /// \param[in] recipientName The email address you claim to be sending to + /// \param[in] subject Email subject + /// \param[in] body Email body + /// \param[in] attachedFiles List of files to attach to the email. (Can be 0 to send none). + /// \param[in] doPrintf true to output SMTP info to console(for debugging?) + /// \param[in] password Used if the server uses AUTHENTICATE PLAIN over TLS (such as gmail) + /// \return 0 on success, otherwise a string indicating the error message + const char *Send(const char *hostAddress, unsigned short hostPort, const char *sender, const char *recipient, const char *senderName, const char *recipientName, const char *subject, const char *body, FileList *attachedFiles, bool doPrintf, const char *password); + +protected: + const char *GetResponse(TCPInterface *tcpInterface, const SystemAddress &emailServer, bool doPrintf); + RakNetRandom rakNetRandom; +}; + +} // namespace RakNet + +#endif + + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/EncodeClassName.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/EncodeClassName.cpp new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/EncodeClassName.cpp @@ -0,0 +1 @@ + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/EpochTimeToString.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/EpochTimeToString.cpp new file mode 100644 index 0000000..c0174aa --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/EpochTimeToString.cpp @@ -0,0 +1,35 @@ +#include "FormatString.h" +#include "EpochTimeToString.h" +#include +#include +#include +// localtime +#include +#include "LinuxStrings.h" + +char * EpochTimeToString(long long time) +{ + static int textIndex=0; + static char text[4][64]; + + if (++textIndex==4) + textIndex=0; + + struct tm * timeinfo; + time_t t = time; + timeinfo = localtime ( &t ); + strftime (text[textIndex],64,"%c.",timeinfo); + + /* + time_t + // Copied from the docs + struct tm *newtime; + newtime = _localtime64(& time); + asctime_s( text[textIndex], sizeof(text[textIndex]), newtime ); + + while (text[textIndex][0] && (text[textIndex][strlen(text[textIndex])-1]=='\n' || text[textIndex][strlen(text[textIndex])-1]=='\r')) + text[textIndex][strlen(text[textIndex])-1]=0; + */ + + return text[textIndex]; +} diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/EpochTimeToString.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/EpochTimeToString.h new file mode 100644 index 0000000..b6b299a --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/EpochTimeToString.h @@ -0,0 +1,15 @@ +/// \file EpochTimeToString.h +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#ifndef __EPOCH_TIME_TO_STRING_H +#define __EPOCH_TIME_TO_STRING_H + +#include "Export.h" + +RAK_DLL_EXPORT char * EpochTimeToString(long long time); + +#endif + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Export.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Export.h new file mode 100644 index 0000000..50ca3eb --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Export.h @@ -0,0 +1,13 @@ +#include "RakNetDefines.h" + +#if defined(_WIN32) && !(defined(__GNUC__) || defined(__GCCXML__)) && !defined(_RAKNET_LIB) && defined(_RAKNET_DLL) +#define RAK_DLL_EXPORT __declspec(dllexport) +#else +#define RAK_DLL_EXPORT +#endif + +#define STATIC_FACTORY_DECLARATIONS(x) static x* GetInstance(void); \ +static void DestroyInstance( x *i); + +#define STATIC_FACTORY_DEFINITIONS(x,y) x* x::GetInstance(void) {return RakNet::OP_NEW( _FILE_AND_LINE_ );} \ +void x::DestroyInstance( x *i) {RakNet::OP_DELETE(( y* ) i, _FILE_AND_LINE_);} diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FileList.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FileList.cpp new file mode 100644 index 0000000..4bccf72 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FileList.cpp @@ -0,0 +1,794 @@ +#include "FileList.h" + +#if _RAKNET_SUPPORT_FileOperations==1 + +#include // RAKNET_DEBUG_PRINTF +#include "RakAssert.h" +#if defined(ANDROID) +#include +#elif defined(_WIN32) || defined(__CYGWIN__) +#include + + +#elif !defined ( __APPLE__ ) && !defined ( __APPLE_CC__ ) && !defined ( __PPC__ ) && !defined ( __FreeBSD__ ) && !defined ( __S3E__ ) +#include +#endif + + +#ifdef _WIN32 +// For mkdir +#include + + +#else +#include +#endif + +//#include "SHA1.h" +#include "DS_Queue.h" +#include "StringCompressor.h" +#include "BitStream.h" +#include "FileOperations.h" +#include "SuperFastHash.h" +#include "RakAssert.h" +#include "LinuxStrings.h" + +#define MAX_FILENAME_LENGTH 512 +static const unsigned HASH_LENGTH=4; + +using namespace RakNet; + +// alloca + +#if defined(_WIN32) +#include + + +#else +#if !defined ( __FreeBSD__ ) +#include +#endif +#include +#include +#include +#include "_FindFirst.h" +#include //defines intptr_t +#endif + +#include "RakAlloca.h" + +//int RAK_DLL_EXPORT FileListNodeComp( char * const &key, const FileListNode &data ) +//{ +// return strcmp(key, data.filename); +//} + + +STATIC_FACTORY_DEFINITIONS(FileListProgress,FileListProgress) +STATIC_FACTORY_DEFINITIONS(FLP_Printf,FLP_Printf) +STATIC_FACTORY_DEFINITIONS(FileList,FileList) + +#ifdef _MSC_VER +#pragma warning( push ) +#endif + +/// First callback called when FileList::AddFilesFromDirectory() starts +void FLP_Printf::OnAddFilesFromDirectoryStarted(FileList *fileList, char *dir) { + (void) fileList; + RAKNET_DEBUG_PRINTF("Adding files from directory %s\n",dir);} + +/// Called for each directory, when that directory begins processing +void FLP_Printf::OnDirectory(FileList *fileList, char *dir, unsigned int directoriesRemaining) { + (void) fileList; + RAKNET_DEBUG_PRINTF("Adding %s. %i remaining.\n", dir, directoriesRemaining);} +void FLP_Printf::OnFilePushesComplete( SystemAddress systemAddress, unsigned short setID ) +{ + (void) setID; + + char str[32]; + systemAddress.ToString(true, (char*) str); + RAKNET_DEBUG_PRINTF("File pushes complete to %s\n", str); +} +void FLP_Printf::OnSendAborted( SystemAddress systemAddress ) +{ + char str[32]; + systemAddress.ToString(true, (char*) str); + RAKNET_DEBUG_PRINTF("Send aborted to %s\n", str); +} +FileList::FileList() +{ +} +FileList::~FileList() +{ + Clear(); +} +void FileList::AddFile(const char *filepath, const char *filename, FileListNodeContext context) +{ + if (filepath==0 || filename==0) + return; + + char *data; + //std::fstream file; + //file.open(filename, std::ios::in | std::ios::binary); + + FILE *fp = fopen(filepath, "rb"); + if (fp==0) + return; + fseek(fp, 0, SEEK_END); + int length = ftell(fp); + fseek(fp, 0, SEEK_SET); + + if (length > (int) ((unsigned int)-1 / 8)) + { + // If this assert hits, split up your file. You could also change BitSize_t in RakNetTypes.h to unsigned long long but this is not recommended for performance reasons + RakAssert("Cannot add files over 536 MB" && 0); + fclose(fp); + return; + } + + + + bool usedAlloca=false; + if (length < MAX_ALLOCA_STACK_ALLOCATION) + { + data = ( char* ) alloca( length ); + usedAlloca=true; + } + else + + { + data = (char*) rakMalloc_Ex( length, _FILE_AND_LINE_ ); + } + + fread(data, 1, length, fp); + AddFile(filename, filepath, data, length, length, context); + fclose(fp); + + + if (usedAlloca==false) + + rakFree_Ex(data, _FILE_AND_LINE_ ); + +} +void FileList::AddFile(const char *filename, const char *fullPathToFile, const char *data, const unsigned dataLength, const unsigned fileLength, FileListNodeContext context, bool isAReference, bool takeDataPointer) +{ + if (filename==0) + return; + if (strlen(filename)>MAX_FILENAME_LENGTH) + { + // Should be enough for anyone + RakAssert(0); + return; + } + // If adding a reference, do not send data + RakAssert(isAReference==false || data==0); + // Avoid duplicate insertions unless the data is different, in which case overwrite the old data + unsigned i; + for (i=0; i dirList; + char root[260]; + char fullPath[520]; + _finddata_t fileInfo; + intptr_t dir; + FILE *fp; + char *dirSoFar, *fileData; + dirSoFar=(char*) rakMalloc_Ex( 520, _FILE_AND_LINE_ ); + + if (applicationDirectory) + strcpy(root, applicationDirectory); + else + root[0]=0; + + int rootLen=(int)strlen(root); + if (rootLen) + { + strcpy(dirSoFar, root); + if (FixEndingSlash(dirSoFar)) + rootLen++; + } + else + dirSoFar[0]=0; + + if (subDirectory) + { + strcat(dirSoFar, subDirectory); + FixEndingSlash(dirSoFar); + } + for (unsigned int flpcIndex=0; flpcIndex < fileListProgressCallbacks.Size(); flpcIndex++) + fileListProgressCallbacks[flpcIndex]->OnAddFilesFromDirectoryStarted(this, dirSoFar); + // RAKNET_DEBUG_PRINTF("Adding files from directory %s\n",dirSoFar); + dirList.Push(dirSoFar, _FILE_AND_LINE_ ); + while (dirList.Size()) + { + dirSoFar=dirList.Pop(); + strcpy(fullPath, dirSoFar); + // Changed from *.* to * for Linux compatibility + strcat(fullPath, "*"); + + + dir=_findfirst(fullPath, &fileInfo ); + if (dir==-1) + { + _findclose(dir); + rakFree_Ex(dirSoFar, _FILE_AND_LINE_ ); + unsigned i; + for (i=0; i < dirList.Size(); i++) + rakFree_Ex(dirList[i], _FILE_AND_LINE_ ); + return; + } + +// RAKNET_DEBUG_PRINTF("Adding %s. %i remaining.\n", fullPath, dirList.Size()); + for (unsigned int flpcIndex=0; flpcIndex < fileListProgressCallbacks.Size(); flpcIndex++) + fileListProgressCallbacks[flpcIndex]->OnDirectory(this, fullPath, dirList.Size()); + + do + { + // no guarantee these entries are first... + if (strcmp("." , fileInfo.name) == 0 || + strcmp("..", fileInfo.name) == 0) + { + continue; + } + + if ((fileInfo.attrib & (_A_HIDDEN | _A_SUBDIR | _A_SYSTEM))==0) + { + strcpy(fullPath, dirSoFar); + strcat(fullPath, fileInfo.name); + fileData=0; + + for (unsigned int flpcIndex=0; flpcIndex < fileListProgressCallbacks.Size(); flpcIndex++) + fileListProgressCallbacks[flpcIndex]->OnFile(this, dirSoFar, fileInfo.name, fileInfo.size); + + if (writeData && writeHash) + { + fp = fopen(fullPath, "rb"); + if (fp) + { + fileData= (char*) rakMalloc_Ex( fileInfo.size+HASH_LENGTH, _FILE_AND_LINE_ ); + fread(fileData+HASH_LENGTH, fileInfo.size, 1, fp); + fclose(fp); + + unsigned int hash = SuperFastHash(fileData+HASH_LENGTH, fileInfo.size); + if (RakNet::BitStream::DoEndianSwap()) + RakNet::BitStream::ReverseBytesInPlace((unsigned char*) &hash, sizeof(hash)); + memcpy(fileData, &hash, HASH_LENGTH); + + // sha1.Reset(); + // sha1.Update( ( unsigned char* ) fileData+HASH_LENGTH, fileInfo.size ); + // sha1.Final(); + // memcpy(fileData, sha1.GetHash(), HASH_LENGTH); + // File data and hash + AddFile((const char*)fullPath+rootLen, fullPath, fileData, fileInfo.size+HASH_LENGTH, fileInfo.size, context); + } + } + else if (writeHash) + { +// sha1.Reset(); +// sha1.HashFile((char*)fullPath); +// sha1.Final(); + + unsigned int hash = SuperFastHashFile(fullPath); + if (RakNet::BitStream::DoEndianSwap()) + RakNet::BitStream::ReverseBytesInPlace((unsigned char*) &hash, sizeof(hash)); + + // Hash only + // AddFile((const char*)fullPath+rootLen, (const char*)sha1.GetHash(), HASH_LENGTH, fileInfo.size, context); + AddFile((const char*)fullPath+rootLen, fullPath, (const char*)&hash, HASH_LENGTH, fileInfo.size, context); + } + else if (writeData) + { + fileData= (char*) rakMalloc_Ex( fileInfo.size, _FILE_AND_LINE_ ); + fp = fopen(fullPath, "rb"); + fread(fileData, fileInfo.size, 1, fp); + fclose(fp); + + // File data only + AddFile(fullPath+rootLen, fullPath, fileData, fileInfo.size, fileInfo.size, context); + } + else + { + // Just the filename + AddFile(fullPath+rootLen, fullPath, 0, 0, fileInfo.size, context); + } + + if (fileData) + rakFree_Ex(fileData, _FILE_AND_LINE_ ); + } + else if ((fileInfo.attrib & _A_SUBDIR) && (fileInfo.attrib & (_A_HIDDEN | _A_SYSTEM))==0 && recursive) + { + char *newDir=(char*) rakMalloc_Ex( 520, _FILE_AND_LINE_ ); + strcpy(newDir, dirSoFar); + strcat(newDir, fileInfo.name); + strcat(newDir, "/"); + dirList.Push(newDir, _FILE_AND_LINE_ ); + } + + } while (_findnext(dir, &fileInfo ) != -1); + + _findclose(dir); + rakFree_Ex(dirSoFar, _FILE_AND_LINE_ ); + } + +} +void FileList::Clear(void) +{ + unsigned i; + for (i=0; iWriteCompressed(fileList.Size()); + unsigned i; + for (i=0; i < fileList.Size(); i++) + { + outBitStream->WriteCompressed(fileList[i].context.op); + outBitStream->WriteCompressed(fileList[i].context.fileId); + StringCompressor::Instance()->EncodeString(fileList[i].filename.C_String(), MAX_FILENAME_LENGTH, outBitStream); + + bool writeFileData = fileList[i].dataLengthBytes>0==true; + outBitStream->Write(writeFileData); + if (writeFileData) + { + outBitStream->WriteCompressed(fileList[i].dataLengthBytes); + outBitStream->Write(fileList[i].data, fileList[i].dataLengthBytes); + } + + outBitStream->Write((bool)(fileList[i].fileLengthBytes==fileList[i].dataLengthBytes)); + if (fileList[i].fileLengthBytes!=fileList[i].dataLengthBytes) + outBitStream->WriteCompressed(fileList[i].fileLengthBytes); + } +} +bool FileList::Deserialize(RakNet::BitStream *inBitStream) +{ + bool b, dataLenNonZero=false, fileLenMatchesDataLen=false; + char filename[512]; + unsigned int fileListSize; + FileListNode n; + b=inBitStream->ReadCompressed(fileListSize); +#ifdef _DEBUG + RakAssert(b); + RakAssert(fileListSize < 10000); +#endif + if (b==false || fileListSize > 10000) + return false; // Sanity check + Clear(); + unsigned i; + for (i=0; i < fileListSize; i++) + { + inBitStream->ReadCompressed(n.context.op); + inBitStream->ReadCompressed(n.context.fileId); + StringCompressor::Instance()->DecodeString((char*)filename, MAX_FILENAME_LENGTH, inBitStream); + inBitStream->Read(dataLenNonZero); + if (dataLenNonZero) + { + inBitStream->ReadCompressed(n.dataLengthBytes); + // sanity check + if (n.dataLengthBytes>2000000000) + { +#ifdef _DEBUG + RakAssert(n.dataLengthBytes<=2000000000); +#endif + return false; + } + n.data=(char*) rakMalloc_Ex( (size_t) n.dataLengthBytes, _FILE_AND_LINE_ ); + inBitStream->Read(n.data, n.dataLengthBytes); + } + else + { + n.dataLengthBytes=0; + n.data=0; + } + + b=inBitStream->Read(fileLenMatchesDataLen); + if (fileLenMatchesDataLen) + n.fileLengthBytes=(unsigned) n.dataLengthBytes; + else + b=inBitStream->ReadCompressed(n.fileLengthBytes); +#ifdef _DEBUG + RakAssert(b); +#endif + if (b==0) + { + Clear(); + return false; + } + n.filename=filename; + n.fullPathToFile=filename; + fileList.Insert(n, _FILE_AND_LINE_); + } + + return true; +} +void FileList::GetDeltaToCurrent(FileList *input, FileList *output, const char *dirSubset, const char *remoteSubdir) +{ + // For all files in this list that do not match the input list, write them to the output list. + // dirSubset allows checking only a portion of the files in this list. + unsigned thisIndex, inputIndex; + unsigned dirSubsetLen, localPathLen, remoteSubdirLen; + bool match; + if (dirSubset) + dirSubsetLen = (unsigned int) strlen(dirSubset); + else + dirSubsetLen = 0; + if (remoteSubdir && remoteSubdir[0]) + { + remoteSubdirLen=(unsigned int) strlen(remoteSubdir); + if (IsSlash(remoteSubdir[remoteSubdirLen-1])) + remoteSubdirLen--; + } + else + remoteSubdirLen=0; + + for (thisIndex=0; thisIndex < fileList.Size(); thisIndex++) + { + localPathLen = (unsigned int) fileList[thisIndex].filename.GetLength(); + while (localPathLen>0) + { + if (IsSlash(fileList[thisIndex].filename[localPathLen-1])) + { + localPathLen--; + break; + } + localPathLen--; + } + + // fileList[thisIndex].filename has to match dirSubset and be shorter or equal to it in length. + if (dirSubsetLen>0 && + (localPathLendirSubsetLen && IsSlash(fileList[thisIndex].filename[dirSubsetLen])==false))) + continue; + + match=false; + for (inputIndex=0; inputIndex < input->fileList.Size(); inputIndex++) + { + // If the filenames, hashes, and lengths match then skip this element in fileList. Otherwise write it to output + if (_stricmp(input->fileList[inputIndex].filename.C_String()+remoteSubdirLen,fileList[thisIndex].filename.C_String()+dirSubsetLen)==0) + { + match=true; + if (input->fileList[inputIndex].fileLengthBytes==fileList[thisIndex].fileLengthBytes && + input->fileList[inputIndex].dataLengthBytes==fileList[thisIndex].dataLengthBytes && + memcmp(input->fileList[inputIndex].data,fileList[thisIndex].data,(size_t) fileList[thisIndex].dataLengthBytes)==0) + { + // File exists on both machines and is the same. + break; + } + else + { + // File exists on both machines and is not the same. + output->AddFile(fileList[thisIndex].filename, fileList[thisIndex].fullPathToFile, 0,0, fileList[thisIndex].fileLengthBytes, FileListNodeContext(0,0), false); + break; + } + } + } + if (match==false) + { + // Other system does not have the file at all + output->AddFile(fileList[thisIndex].filename, fileList[thisIndex].fullPathToFile, 0,0, fileList[thisIndex].fileLengthBytes, FileListNodeContext(0,0), false); + } + } +} +void FileList::ListMissingOrChangedFiles(const char *applicationDirectory, FileList *missingOrChangedFiles, bool alwaysWriteHash, bool neverWriteHash) +{ + unsigned fileLength; +// CSHA1 sha1; + FILE *fp; + char fullPath[512]; + unsigned i; +// char *fileData; + + for (i=0; i < fileList.Size(); i++) + { + strcpy(fullPath, applicationDirectory); + FixEndingSlash(fullPath); + strcat(fullPath,fileList[i].filename); + fp=fopen(fullPath, "rb"); + if (fp==0) + { + missingOrChangedFiles->AddFile(fileList[i].filename, fileList[i].fullPathToFile, 0, 0, 0, FileListNodeContext(0,0), false); + } + else + { + fseek(fp, 0, SEEK_END); + fileLength = ftell(fp); + fseek(fp, 0, SEEK_SET); + + if (fileLength != fileList[i].fileLengthBytes && alwaysWriteHash==false) + { + missingOrChangedFiles->AddFile(fileList[i].filename, fileList[i].fullPathToFile, 0, 0, fileLength, FileListNodeContext(0,0), false); + } + else + { + +// fileData= (char*) rakMalloc_Ex( fileLength, _FILE_AND_LINE_ ); +// fread(fileData, fileLength, 1, fp); + +// sha1.Reset(); +// sha1.Update( ( unsigned char* ) fileData, fileLength ); +// sha1.Final(); + +// rakFree_Ex(fileData, _FILE_AND_LINE_ ); + + unsigned int hash = SuperFastHashFilePtr(fp); + if (RakNet::BitStream::DoEndianSwap()) + RakNet::BitStream::ReverseBytesInPlace((unsigned char*) &hash, sizeof(hash)); + + //if (fileLength != fileList[i].fileLength || memcmp( sha1.GetHash(), fileList[i].data, HASH_LENGTH)!=0) + if (fileLength != fileList[i].fileLengthBytes || memcmp( &hash, fileList[i].data, HASH_LENGTH)!=0) + { + if (neverWriteHash==false) + // missingOrChangedFiles->AddFile((const char*)fileList[i].filename, (const char*)sha1.GetHash(), HASH_LENGTH, fileLength, 0); + missingOrChangedFiles->AddFile((const char*)fileList[i].filename, (const char*)fileList[i].fullPathToFile, (const char *) &hash, HASH_LENGTH, fileLength, FileListNodeContext(0,0), false); + else + missingOrChangedFiles->AddFile((const char*)fileList[i].filename, (const char*)fileList[i].fullPathToFile, 0, 0, fileLength, FileListNodeContext(0,0), false); + } + } + fclose(fp); + } + } +} +void FileList::PopulateDataFromDisk(const char *applicationDirectory, bool writeFileData, bool writeFileHash, bool removeUnknownFiles) +{ + FILE *fp; + char fullPath[512]; + unsigned i; +// CSHA1 sha1; + + i=0; + while (i < fileList.Size()) + { + rakFree_Ex(fileList[i].data, _FILE_AND_LINE_ ); + strcpy(fullPath, applicationDirectory); + FixEndingSlash(fullPath); + strcat(fullPath,fileList[i].filename.C_String()); + fp=fopen(fullPath, "rb"); + if (fp) + { + if (writeFileHash || writeFileData) + { + fseek(fp, 0, SEEK_END); + fileList[i].fileLengthBytes = ftell(fp); + fseek(fp, 0, SEEK_SET); + if (writeFileHash) + { + if (writeFileData) + { + // Hash + data so offset the data by HASH_LENGTH + fileList[i].data=(char*) rakMalloc_Ex( fileList[i].fileLengthBytes+HASH_LENGTH, _FILE_AND_LINE_ ); + fread(fileList[i].data+HASH_LENGTH, fileList[i].fileLengthBytes, 1, fp); +// sha1.Reset(); +// sha1.Update((unsigned char*)fileList[i].data+HASH_LENGTH, fileList[i].fileLength); +// sha1.Final(); + unsigned int hash = SuperFastHash(fileList[i].data+HASH_LENGTH, fileList[i].fileLengthBytes); + if (RakNet::BitStream::DoEndianSwap()) + RakNet::BitStream::ReverseBytesInPlace((unsigned char*) &hash, sizeof(hash)); +// memcpy(fileList[i].data, sha1.GetHash(), HASH_LENGTH); + memcpy(fileList[i].data, &hash, HASH_LENGTH); + } + else + { + // Hash only + fileList[i].dataLengthBytes=HASH_LENGTH; + if (fileList[i].fileLengthBytes < HASH_LENGTH) + fileList[i].data=(char*) rakMalloc_Ex( HASH_LENGTH, _FILE_AND_LINE_ ); + else + fileList[i].data=(char*) rakMalloc_Ex( fileList[i].fileLengthBytes, _FILE_AND_LINE_ ); + fread(fileList[i].data, fileList[i].fileLengthBytes, 1, fp); + // sha1.Reset(); + // sha1.Update((unsigned char*)fileList[i].data, fileList[i].fileLength); + // sha1.Final(); + unsigned int hash = SuperFastHash(fileList[i].data, fileList[i].fileLengthBytes); + if (RakNet::BitStream::DoEndianSwap()) + RakNet::BitStream::ReverseBytesInPlace((unsigned char*) &hash, sizeof(hash)); + // memcpy(fileList[i].data, sha1.GetHash(), HASH_LENGTH); + memcpy(fileList[i].data, &hash, HASH_LENGTH); + } + } + else + { + // Data only + fileList[i].dataLengthBytes=fileList[i].fileLengthBytes; + fileList[i].data=(char*) rakMalloc_Ex( fileList[i].fileLengthBytes, _FILE_AND_LINE_ ); + fread(fileList[i].data, fileList[i].fileLengthBytes, 1, fp); + } + + fclose(fp); + i++; + } + else + { + fileList[i].data=0; + fileList[i].dataLengthBytes=0; + } + } + else + { + if (removeUnknownFiles) + { + fileList.RemoveAtIndex(i); + } + else + i++; + } + } +} +void FileList::FlagFilesAsReferences(void) +{ + for (unsigned int i=0; i < fileList.Size(); i++) + { + fileList[i].isAReference=true; + fileList[i].dataLengthBytes=fileList[i].fileLengthBytes; + } +} +void FileList::WriteDataToDisk(const char *applicationDirectory) +{ + char fullPath[512]; + unsigned i,j; + + for (i=0; i < fileList.Size(); i++) + { + strcpy(fullPath, applicationDirectory); + FixEndingSlash(fullPath); + strcat(fullPath,fileList[i].filename.C_String()); + + // Security - Don't allow .. in the filename anywhere so you can't write outside of the root directory + for (j=1; j < fileList[i].filename.GetLength(); j++) + { + if (fileList[i].filename[j]=='.' && fileList[i].filename[j-1]=='.') + { +#ifdef _DEBUG + RakAssert(0); +#endif + // Just cancel the write entirely + return; + } + } + + WriteFileWithDirectories(fullPath, fileList[i].data, (unsigned int) fileList[i].dataLengthBytes); + } +} + +#ifdef _MSC_VER +#pragma warning( disable : 4966 ) // unlink declared deprecated by Microsoft in order to make it harder to be cross platform. I don't agree it's deprecated. +#endif +void FileList::DeleteFiles(const char *applicationDirectory) +{ + + + + char fullPath[512]; + unsigned i,j; + + for (i=0; i < fileList.Size(); i++) + { + // The filename should not have .. in the path - if it does ignore it + for (j=1; j < fileList[i].filename.GetLength(); j++) + { + if (fileList[i].filename[j]=='.' && fileList[i].filename[j-1]=='.') + { +#ifdef _DEBUG + RakAssert(0); +#endif + // Just cancel the deletion entirely + return; + } + } + + strcpy(fullPath, applicationDirectory); + FixEndingSlash(fullPath); + strcat(fullPath, fileList[i].filename.C_String()); + +#ifdef _MSC_VER +#pragma warning( disable : 4966 ) // unlink declared deprecated by Microsoft in order to make it harder to be cross platform. I don't agree it's deprecated. +#endif + int result = unlink(fullPath); + if (result!=0) + { + RAKNET_DEBUG_PRINTF("FileList::DeleteFiles: unlink (%s) failed.\n", fullPath); + } + } + +} + +void FileList::AddCallback(FileListProgress *cb) +{ + if (cb==0) + return; + + if ((unsigned int) fileListProgressCallbacks.GetIndexOf(cb)==(unsigned int)-1) + fileListProgressCallbacks.Push(cb, _FILE_AND_LINE_); +} +void FileList::RemoveCallback(FileListProgress *cb) +{ + unsigned int idx = fileListProgressCallbacks.GetIndexOf(cb); + if (idx!=(unsigned int) -1) + fileListProgressCallbacks.RemoveAtIndex(idx); +} +void FileList::ClearCallbacks(void) +{ + fileListProgressCallbacks.Clear(true, _FILE_AND_LINE_); +} +void FileList::GetCallbacks(DataStructures::List &callbacks) +{ + callbacks = fileListProgressCallbacks; +} + + +bool FileList::FixEndingSlash(char *str) +{ +#ifdef _WIN32 + if (str[strlen(str)-1]!='/' && str[strlen(str)-1]!='\\') + { + strcat(str, "\\"); // Only \ works with system commands, used by AutopatcherClient + return true; + } +#else + if (str[strlen(str)-1]!='\\' && str[strlen(str)-1]!='/') + { + strcat(str, "/"); // Only / works with Linux + return true; + } +#endif + + return false; +} + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + +#endif // _RAKNET_SUPPORT_FileOperations diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FileList.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FileList.h new file mode 100644 index 0000000..4642658 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FileList.h @@ -0,0 +1,258 @@ +/// \file FileList.h +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_FileOperations==1 + +#ifndef __FILE_LIST +#define __FILE_LIST + +#include "Export.h" +#include "DS_List.h" +#include "RakMemoryOverride.h" +#include "RakNetTypes.h" +#include "FileListNodeContext.h" +#include "RakString.h" + +#ifdef _MSC_VER +#pragma warning( push ) +#endif + +namespace RakNet +{ + class BitStream; +} + +namespace RakNet +{ +/// Forward declarations +class RakPeerInterface; +class FileList; + + +/// Represents once instance of a file +struct FileListNode +{ + /// Name of the file + RakNet::RakString filename; + + /// Full path to the file, which may be different than filename + RakNet::RakString fullPathToFile; + + /// File data (may be null if not ready) + char *data; + + /// Length of \a data. May be greater than fileLength if prepended with a file hash + BitSize_t dataLengthBytes; + + /// Length of the file + unsigned fileLengthBytes; + + /// User specific data for whatever, describing this file. + FileListNodeContext context; + + /// If true, data and dataLengthBytes should be empty. This is just storing the filename + bool isAReference; +}; + +/// Callback interface set with FileList::SetCallback() in case you want progress notifications when FileList::AddFilesFromDirectory() is called +class RAK_DLL_EXPORT FileListProgress +{ +public: + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(FileListProgress) + + FileListProgress() {} + virtual ~FileListProgress() {} + + /// First callback called when FileList::AddFilesFromDirectory() starts + virtual void OnAddFilesFromDirectoryStarted(FileList *fileList, char *dir) { + (void) fileList; + (void) dir; + } + + /// Called for each directory, when that directory begins processing + virtual void OnDirectory(FileList *fileList, char *dir, unsigned int directoriesRemaining) { + (void) fileList; + (void) dir; + (void) directoriesRemaining; + } + + /// Called for each file, when that file begins processing + virtual void OnFile(FileList *fileList, char *dir, char *fileName, unsigned int fileSize) { + (void) fileList; + (void) dir; + (void) fileName; + (void) fileSize; + } + + /// \brief This function is called when we are sending a file to a remote system. + /// \param[in] fileName The name of the file being sent + /// \param[in] fileLengthBytes How long the file is + /// \param[in] offset The offset in bytes into the file that we are sending + /// \param[in] bytesBeingSent How many bytes we are sending this push + /// \param[in] done If this file is now done with this push + /// \param[in] targetSystem Who we are sending to + virtual void OnFilePush(const char *fileName, unsigned int fileLengthBytes, unsigned int offset, unsigned int bytesBeingSent, bool done, SystemAddress targetSystem, unsigned short setId) + { + (void) fileName; + (void) fileLengthBytes; + (void) offset; + (void) bytesBeingSent; + (void) done; + (void) targetSystem; + (void) setId; + } + + /// \brief This function is called when all files have been read and are being transferred to a remote system + virtual void OnFilePushesComplete( SystemAddress systemAddress, unsigned short setId ) + { + (void) systemAddress; + (void) setId; + } + + /// \brief This function is called when a send to a system was aborted (probably due to disconnection) + virtual void OnSendAborted( SystemAddress systemAddress ) + { + (void) systemAddress; + } +}; + +/// Implementation of FileListProgress to use RAKNET_DEBUG_PRINTF +class RAK_DLL_EXPORT FLP_Printf : public FileListProgress +{ +public: + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(FLP_Printf) + + FLP_Printf() {} + virtual ~FLP_Printf() {} + + /// First callback called when FileList::AddFilesFromDirectory() starts + virtual void OnAddFilesFromDirectoryStarted(FileList *fileList, char *dir); + + /// Called for each directory, when that directory begins processing + virtual void OnDirectory(FileList *fileList, char *dir, unsigned int directoriesRemaining); + + /// \brief This function is called when all files have been transferred to a particular remote system + virtual void OnFilePushesComplete( SystemAddress systemAddress, unsigned short setID ); + + /// \brief This function is called when a send to a system was aborted (probably due to disconnection) + virtual void OnSendAborted( SystemAddress systemAddress ); +}; + +class RAK_DLL_EXPORT FileList +{ +public: + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(FileList) + + FileList(); + ~FileList(); + /// \brief Add all the files at a given directory. + /// \param[in] applicationDirectory The first part of the path. This is not stored as part of the filename. Use \ as the path delineator. + /// \param[in] subDirectory The rest of the path to the file. This is stored as a prefix to the filename + /// \param[in] writeHash The first 4 bytes is a hash of the file, with the remainder the actual file data (should \a writeData be true) + /// \param[in] writeData Write the contents of each file + /// \param[in] recursive Whether or not to visit subdirectories + /// \param[in] context User defined byte to store with each file. Use for whatever you want. + void AddFilesFromDirectory(const char *applicationDirectory, const char *subDirectory, bool writeHash, bool writeData, bool recursive, FileListNodeContext context); + + /// Deallocate all memory + void Clear(void); + + /// Write all encoded data into a bitstream + void Serialize(RakNet::BitStream *outBitStream); + + /// Read all encoded data from a bitstream. Clear() is called before deserializing. + bool Deserialize(RakNet::BitStream *inBitStream); + + /// \brief Given the existing set of files, search applicationDirectory for the same files. + /// \details For each file that is missing or different, add that file to \a missingOrChangedFiles. Note: the file contents are not written, and only the hash if written if \a alwaysWriteHash is true + /// alwaysWriteHash and neverWriteHash are optimizations to avoid reading the file contents to generate the hash if not necessary because the file is missing or has different lengths anyway. + /// \param[in] applicationDirectory The first part of the path. This is not stored as part of the filename. Use \ as the path delineator. + /// \param[out] missingOrChangedFiles Output list written to + /// \param[in] alwaysWriteHash If true, and neverWriteHash is false, will hash the file content of the file on disk, and write that as the file data with a length of SHA1_LENGTH bytes. If false, if the file length is different, will only write the filename. + /// \param[in] neverWriteHash If true, will never write the hash, even if available. If false, will write the hash if the file lengths are the same and it was forced to do a comparison. + void ListMissingOrChangedFiles(const char *applicationDirectory, FileList *missingOrChangedFiles, bool alwaysWriteHash, bool neverWriteHash); + + /// \brief Return the files that need to be written to make \a input match this current FileList. + /// \details Specify dirSubset to only consider files that start with this path + /// specify remoteSubdir to assume that all filenames in input start with this path, so strip it off when comparing filenames. + /// \param[in] input Full list of files + /// \param[out] output Files that we need to match input + /// \param[in] dirSubset If the filename does not start with this path, just skip this file. + /// \param[in] remoteSubdir Remove this from the filenames of \a input when comparing to existing filenames. + void GetDeltaToCurrent(FileList *input, FileList *output, const char *dirSubset, const char *remoteSubdir); + + /// \brief Assuming FileList contains a list of filenames presumably without data, read the data for these filenames + /// \param[in] applicationDirectory Prepend this path to each filename. Trailing slash will be added if necessary. Use \ as the path delineator. + /// \param[in] writeFileData True to read and store the file data. The first SHA1_LENGTH bytes will contain the hash if \a writeFileHash is true + /// \param[in] writeFileHash True to read and store the hash of the file data. The first SHA1_LENGTH bytes will contain the hash if \a writeFileHash is true + /// \param[in] removeUnknownFiles If a file does not exist on disk but is in the file list, remove it from the file list? + void PopulateDataFromDisk(const char *applicationDirectory, bool writeFileData, bool writeFileHash, bool removeUnknownFiles); + + /// By default, GetDeltaToCurrent tags files as non-references, meaning they are assumed to be populated later + /// This tags all files as references, required for IncrementalReadInterface to process them incrementally + void FlagFilesAsReferences(void); + + /// \brief Write all files to disk, prefixing the paths with applicationDirectory + /// \param[in] applicationDirectory path prefix + void WriteDataToDisk(const char *applicationDirectory); + + /// \brief Add a file, given data already in memory. + /// \param[in] filename Name of a file, optionally prefixed with a partial or complete path. Use \ as the path delineator. + /// \param[in] fullPathToFile Full path to the file on disk + /// \param[in] data Contents to write + /// \param[in] dataLength length of the data, which may be greater than fileLength should you prefix extra data, such as the hash + /// \param[in] fileLength Length of the file + /// \param[in] context User defined byte to store with each file. Use for whatever you want. + /// \param[in] isAReference Means that this is just a reference to a file elsewhere - does not actually have any data + /// \param[in] takeDataPointer If true, do not allocate dataLength. Just take the pointer passed to the \a data parameter + void AddFile(const char *filename, const char *fullPathToFile, const char *data, const unsigned dataLength, const unsigned fileLength, FileListNodeContext context, bool isAReference=false, bool takeDataPointer=false); + + /// \brief Add a file, reading it from disk. + /// \param[in] filepath Complete path to the file, including the filename itself + /// \param[in] filename filename to store internally, anything you want, but usually either the complete path or a subset of the complete path. + /// \param[in] context User defined byte to store with each file. Use for whatever you want. + void AddFile(const char *filepath, const char *filename, FileListNodeContext context); + + /// \brief Delete all files stored in the file list. + /// \param[in] applicationDirectory Prefixed to the path to each filename. Use \ as the path delineator. + void DeleteFiles(const char *applicationDirectory); + + /// \brief Adds a callback to get progress reports about what the file list instances do. + /// \param[in] cb A pointer to an externally defined instance of FileListProgress. This pointer is held internally, so should remain valid as long as this class is valid. + void AddCallback(FileListProgress *cb); + + /// \brief Removes a callback + /// \param[in] cb A pointer to an externally defined instance of FileListProgress that was previously added with AddCallback() + void RemoveCallback(FileListProgress *cb); + + /// \brief Removes all callbacks + void ClearCallbacks(void); + + /// Returns all callbacks added with AddCallback() + /// \param[out] callbacks The list is set to the list of callbacks + void GetCallbacks(DataStructures::List &callbacks); + + // Here so you can read it, but don't modify it + DataStructures::List fileList; + + static bool FixEndingSlash(char *str); +protected: + DataStructures::List fileListProgressCallbacks; +}; + +} // namespace RakNet + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + +#endif + +#endif // _RAKNET_SUPPORT_FileOperations diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FileListNodeContext.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FileListNodeContext.h new file mode 100644 index 0000000..6ec227a --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FileListNodeContext.h @@ -0,0 +1,39 @@ +/// \file FileListNodeContext.h +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#ifndef __FILE_LIST_NODE_CONTEXT_H +#define __FILE_LIST_NODE_CONTEXT_H + +#include "BitStream.h" + +struct FileListNodeContext +{ + FileListNodeContext() {dataPtr=0; dataLength=0;} + FileListNodeContext(unsigned char o, unsigned int f) : op(o), fileId(f) {dataPtr=0; dataLength=0;} + ~FileListNodeContext() {} + + unsigned char op; + unsigned int fileId; + void *dataPtr; + unsigned int dataLength; +}; + +inline RakNet::BitStream& operator<<(RakNet::BitStream& out, FileListNodeContext& in) +{ + out.Write(in.op); + out.Write(in.fileId); + return out; +} +inline RakNet::BitStream& operator>>(RakNet::BitStream& in, FileListNodeContext& out) +{ + in.Read(out.op); + bool success = in.Read(out.fileId); + (void) success; + assert(success); + return in; +} + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FileListTransfer.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FileListTransfer.cpp new file mode 100644 index 0000000..11fbe5f --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FileListTransfer.cpp @@ -0,0 +1,1086 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_FileListTransfer==1 && _RAKNET_SUPPORT_FileOperations==1 + +#include "FileListTransfer.h" +#include "DS_HuffmanEncodingTree.h" +#include "FileListTransferCBInterface.h" +#include "StringCompressor.h" +#include "FileList.h" +#include "DS_Queue.h" +#include "MessageIdentifiers.h" +#include "RakNetTypes.h" +#include "RakPeerInterface.h" +#include "RakNetStatistics.h" +#include "IncrementalReadInterface.h" +#include "RakAssert.h" +#include "RakAlloca.h" + +#ifdef _MSC_VER +#pragma warning( push ) +#endif + +namespace RakNet +{ + +struct FLR_MemoryBlock +{ + char *flrMemoryBlock; +}; + +struct FileListReceiver +{ + FileListReceiver(); + ~FileListReceiver(); + FileListTransferCBInterface *downloadHandler; + SystemAddress allowedSender; + unsigned short setID; + unsigned setCount; + unsigned setTotalCompressedTransmissionLength; + unsigned setTotalFinalLength; + unsigned setTotalDownloadedLength; + bool gotSetHeader; + bool deleteDownloadHandler; + bool isCompressed; + int filesReceived; + DataStructures::Map pushedFiles; + + // Notifications + unsigned int partLength; + +}; + +} // namespace RakNet + +using namespace RakNet; + +FileListReceiver::FileListReceiver() {filesReceived=0; setTotalDownloadedLength=0; partLength=1; DataStructures::Map::IMPLEMENT_DEFAULT_COMPARISON();} +FileListReceiver::~FileListReceiver() { + unsigned int i=0; + for (i=0; i < pushedFiles.Size(); i++) + rakFree_Ex(pushedFiles[i].flrMemoryBlock, _FILE_AND_LINE_ ); +} + +STATIC_FACTORY_DEFINITIONS(FileListTransfer,FileListTransfer) + +void FileListTransfer::FileToPushRecipient::DeleteThis(void) +{ + for (unsigned int j=0; j < filesToPush.Size(); j++) + RakNet::OP_DELETE(filesToPush[j],_FILE_AND_LINE_); + RakNet::OP_DELETE(this,_FILE_AND_LINE_); +} +void FileListTransfer::FileToPushRecipient::AddRef(void) +{ + refCountMutex.Lock(); + ++refCount; + refCountMutex.Unlock(); +} +void FileListTransfer::FileToPushRecipient::Deref(void) +{ + refCountMutex.Lock(); + --refCount; + if (refCount==0) + { + refCountMutex.Unlock(); + DeleteThis(); + return; + } + refCountMutex.Unlock(); +} +FileListTransfer::FileListTransfer() +{ + setId=0; + DataStructures::Map::IMPLEMENT_DEFAULT_COMPARISON(); +} +FileListTransfer::~FileListTransfer() +{ + threadPool.StopThreads(); + Clear(); +} +void FileListTransfer::StartIncrementalReadThreads(int numThreads, int threadPriority) +{ + (void) threadPriority; + + threadPool.StartThreads(numThreads, 0); +} +unsigned short FileListTransfer::SetupReceive(FileListTransferCBInterface *handler, bool deleteHandler, SystemAddress allowedSender) +{ + if (rakPeerInterface && rakPeerInterface->GetConnectionState(allowedSender)!=IS_CONNECTED) + return (unsigned short)-1; + FileListReceiver *receiver; + + if (fileListReceivers.Has(setId)) + { + receiver=fileListReceivers.Get(setId); + receiver->downloadHandler->OnDereference(); + if (receiver->deleteDownloadHandler) + RakNet::OP_DELETE(receiver->downloadHandler, _FILE_AND_LINE_); + RakNet::OP_DELETE(receiver, _FILE_AND_LINE_); + fileListReceivers.Delete(setId); + } + + unsigned short oldId; + receiver = RakNet::OP_NEW( _FILE_AND_LINE_ ); + RakAssert(handler); + receiver->downloadHandler=handler; + receiver->allowedSender=allowedSender; + receiver->gotSetHeader=false; + receiver->deleteDownloadHandler=deleteHandler; + receiver->setID=setId; + fileListReceivers.Set(setId, receiver); + oldId=setId; + if (++setId==(unsigned short)-1) + setId=0; + return oldId; +} + +void FileListTransfer::Send(FileList *fileList, RakNet::RakPeerInterface *rakPeer, SystemAddress recipient, unsigned short setID, PacketPriority priority, char orderingChannel, IncrementalReadInterface *_incrementalReadInterface, unsigned int _chunkSize) +{ + for (unsigned int flpcIndex=0; flpcIndex < fileListProgressCallbacks.Size(); flpcIndex++) + fileList->AddCallback(fileListProgressCallbacks[flpcIndex]); + + unsigned int i, totalLength; + RakNet::BitStream outBitstream; + bool sendReference; + const char *dataBlocks[2]; + int lengths[2]; + totalLength=0; + for (i=0; i < fileList->fileList.Size(); i++) + { + const FileListNode &fileListNode = fileList->fileList[i]; + totalLength+=fileListNode.fileLengthBytes; + } + + // Write the chunk header, which contains the frequency table, the total number of files, and the total number of bytes + bool anythingToWrite; + outBitstream.Write((MessageID)ID_FILE_LIST_TRANSFER_HEADER); + outBitstream.Write(setID); + anythingToWrite=fileList->fileList.Size()>0; + outBitstream.Write(anythingToWrite); + if (anythingToWrite) + { + outBitstream.WriteCompressed(fileList->fileList.Size()); + outBitstream.WriteCompressed(totalLength); + + if (rakPeer) + rakPeer->Send(&outBitstream, priority, RELIABLE_ORDERED, orderingChannel, recipient, false); + else + SendUnified(&outBitstream, priority, RELIABLE_ORDERED, orderingChannel, recipient, false); + + DataStructures::Queue filesToPush; + + for (i=0; i < fileList->fileList.Size(); i++) + { + sendReference = fileList->fileList[i].isAReference && _incrementalReadInterface!=0; + if (sendReference) + { + FileToPush *fileToPush = RakNet::OP_NEW(_FILE_AND_LINE_); + fileToPush->fileListNode.context=fileList->fileList[i].context; + fileToPush->setIndex=i; + fileToPush->fileListNode.filename=fileList->fileList[i].filename; + fileToPush->fileListNode.fullPathToFile=fileList->fileList[i].fullPathToFile; + fileToPush->fileListNode.fileLengthBytes=fileList->fileList[i].fileLengthBytes; + fileToPush->fileListNode.dataLengthBytes=fileList->fileList[i].dataLengthBytes; + // fileToPush->systemAddress=recipient; + fileToPush->setID=setID; + fileToPush->packetPriority=priority; + fileToPush->orderingChannel=orderingChannel; + fileToPush->currentOffset=0; + fileToPush->incrementalReadInterface=_incrementalReadInterface; + fileToPush->chunkSize=_chunkSize; + filesToPush.Push(fileToPush,_FILE_AND_LINE_); + } + else + { + outBitstream.Reset(); + outBitstream.Write((MessageID)ID_FILE_LIST_TRANSFER_FILE); + outBitstream << fileList->fileList[i].context; + // outBitstream.Write(fileList->fileList[i].context); + outBitstream.Write(setID); + StringCompressor::Instance()->EncodeString(fileList->fileList[i].filename, 512, &outBitstream); + + outBitstream.WriteCompressed(i); + outBitstream.WriteCompressed(fileList->fileList[i].dataLengthBytes); // Original length in bytes + + outBitstream.AlignWriteToByteBoundary(); + + dataBlocks[0]=(char*) outBitstream.GetData(); + lengths[0]=outBitstream.GetNumberOfBytesUsed(); + dataBlocks[1]=fileList->fileList[i].data; + lengths[1]=fileList->fileList[i].dataLengthBytes; + SendListUnified(dataBlocks,lengths,2,priority, RELIABLE_ORDERED, orderingChannel, recipient, false); + } + } + + if (filesToPush.IsEmpty()==false) + { + FileToPushRecipient *ftpr=0; + + fileToPushRecipientListMutex.Lock(); + for (unsigned int i=0; i < fileToPushRecipientList.Size(); i++) + { + if (fileToPushRecipientList[i]->systemAddress==recipient) + { + ftpr=fileToPushRecipientList[i]; + ftpr->AddRef(); + break; + } + } + fileToPushRecipientListMutex.Unlock(); + + if (ftpr==0) + { + ftpr = RakNet::OP_NEW(_FILE_AND_LINE_); + ftpr->systemAddress=recipient; + ftpr->refCount=2; // Allocated and in the list + fileToPushRecipientList.Push(ftpr, _FILE_AND_LINE_); + } + while (filesToPush.IsEmpty()==false) + { + ftpr->filesToPush.Push(filesToPush.Pop(), _FILE_AND_LINE_); + } + // ftpr out of scope + ftpr->Deref(); + SendIRIToAddress(recipient); + return; + } + else + { + for (unsigned int flpcIndex=0; flpcIndex < fileListProgressCallbacks.Size(); flpcIndex++) + fileListProgressCallbacks[flpcIndex]->OnFilePushesComplete(recipient, setID); + } + } + else + { + for (unsigned int flpcIndex=0; flpcIndex < fileListProgressCallbacks.Size(); flpcIndex++) + fileListProgressCallbacks[flpcIndex]->OnFilePushesComplete(recipient, setID); + + if (rakPeer) + rakPeer->Send(&outBitstream, priority, RELIABLE_ORDERED, orderingChannel, recipient, false); + else + SendUnified(&outBitstream, priority, RELIABLE_ORDERED, orderingChannel, recipient, false); + } +} + +bool FileListTransfer::DecodeSetHeader(Packet *packet) +{ + bool anythingToWrite=false; + unsigned short setID; + RakNet::BitStream inBitStream(packet->data, packet->length, false); + inBitStream.IgnoreBits(8); + inBitStream.Read(setID); + FileListReceiver *fileListReceiver; + if (fileListReceivers.Has(setID)==false) + { + // If this assert hits you didn't call SetupReceive +#ifdef _DEBUG + RakAssert(0); +#endif + return false; + } + fileListReceiver=fileListReceivers.Get(setID); + if (fileListReceiver->allowedSender!=packet->systemAddress) + { +#ifdef _DEBUG + RakAssert(0); +#endif + return false; + } + +#ifdef _DEBUG + RakAssert(fileListReceiver->gotSetHeader==false); +#endif + + inBitStream.Read(anythingToWrite); + + if (anythingToWrite) + { + inBitStream.ReadCompressed(fileListReceiver->setCount); + if (inBitStream.ReadCompressed(fileListReceiver->setTotalFinalLength)) + { + fileListReceiver->setTotalCompressedTransmissionLength=fileListReceiver->setTotalFinalLength; + fileListReceiver->gotSetHeader=true; + return true; + } + + } + else + { + FileListTransferCBInterface::DownloadCompleteStruct dcs; + dcs.setID=fileListReceiver->setID; + dcs.numberOfFilesInThisSet=fileListReceiver->setCount; + dcs.byteLengthOfThisSet=fileListReceiver->setTotalFinalLength; + dcs.senderSystemAddress=packet->systemAddress; + dcs.senderGuid=packet->guid; + + if (fileListReceiver->downloadHandler->OnDownloadComplete(&dcs)==false) + { + fileListReceiver->downloadHandler->OnDereference(); + fileListReceivers.Delete(setID); + if (fileListReceiver->deleteDownloadHandler) + RakNet::OP_DELETE(fileListReceiver->downloadHandler, _FILE_AND_LINE_); + RakNet::OP_DELETE(fileListReceiver, _FILE_AND_LINE_); + } + + return true; + } + + return false; +} + +bool FileListTransfer::DecodeFile(Packet *packet, bool isTheFileAndIsNotDownloadProgress) +{ + FileListTransferCBInterface::OnFileStruct onFileStruct; + RakNet::BitStream inBitStream(packet->data, packet->length, false); + inBitStream.IgnoreBits(8); + + onFileStruct.senderSystemAddress=packet->systemAddress; + onFileStruct.senderGuid=packet->guid; + + unsigned int partCount=0; + unsigned int partTotal=0; + unsigned int partLength=0; + onFileStruct.fileData=0; + if (isTheFileAndIsNotDownloadProgress==false) + { + // Disable endian swapping on reading this, as it's generated locally in ReliabilityLayer.cpp + inBitStream.ReadBits( (unsigned char* ) &partCount, BYTES_TO_BITS(sizeof(partCount)), true ); + inBitStream.ReadBits( (unsigned char* ) &partTotal, BYTES_TO_BITS(sizeof(partTotal)), true ); + inBitStream.ReadBits( (unsigned char* ) &partLength, BYTES_TO_BITS(sizeof(partLength)), true ); + inBitStream.IgnoreBits(8); + // The header is appended to every chunk, which we continue to read after this statement flrMemoryBlock + } + inBitStream >> onFileStruct.context; + // inBitStream.Read(onFileStruct.context); + inBitStream.Read(onFileStruct.setID); + FileListReceiver *fileListReceiver; + if (fileListReceivers.Has(onFileStruct.setID)==false) + { + return false; + } + fileListReceiver=fileListReceivers.Get(onFileStruct.setID); + if (fileListReceiver->allowedSender!=packet->systemAddress) + { +#ifdef _DEBUG + RakAssert(0); +#endif + return false; + } + +#ifdef _DEBUG + RakAssert(fileListReceiver->gotSetHeader==true); +#endif + + if (StringCompressor::Instance()->DecodeString(onFileStruct.fileName, 512, &inBitStream)==false) + { +#ifdef _DEBUG + RakAssert(0); +#endif + return false; + } + + inBitStream.ReadCompressed(onFileStruct.fileIndex); + inBitStream.ReadCompressed(onFileStruct.byteLengthOfThisFile); + onFileStruct.bytesDownloadedForThisFile=onFileStruct.byteLengthOfThisFile; + + if (isTheFileAndIsNotDownloadProgress) + { + // Support SendLists + inBitStream.AlignReadToByteBoundary(); + + onFileStruct.fileData = (char*) rakMalloc_Ex( (size_t) onFileStruct.byteLengthOfThisFile, _FILE_AND_LINE_ ); + + inBitStream.Read((char*)onFileStruct.fileData, onFileStruct.byteLengthOfThisFile); + + fileListReceiver->setTotalDownloadedLength+=onFileStruct.byteLengthOfThisFile; + } + + + onFileStruct.numberOfFilesInThisSet=fileListReceiver->setCount; +// onFileStruct.setTotalCompressedTransmissionLength=fileListReceiver->setTotalCompressedTransmissionLength; + onFileStruct.byteLengthOfThisSet=fileListReceiver->setTotalFinalLength; + + // User callback for this file. + if (isTheFileAndIsNotDownloadProgress) + { + onFileStruct.bytesDownloadedForThisSet=fileListReceiver->setTotalDownloadedLength; + + FileListTransferCBInterface::FileProgressStruct fps; + fps.onFileStruct=&onFileStruct; + fps.partCount=1; + fps.partTotal=1; + fps.dataChunkLength=onFileStruct.byteLengthOfThisFile; + fps.firstDataChunk=onFileStruct.fileData; + fps.iriDataChunk=onFileStruct.fileData; + fps.allocateIrIDataChunkAutomatically=true; + fps.iriWriteOffset=0; + fps.senderSystemAddress=packet->systemAddress; + fps.senderGuid=packet->guid; + fileListReceiver->downloadHandler->OnFileProgress(&fps); + + // Got a complete file + // Either we are using IncrementalReadInterface and it was a small file or + // We are not using IncrementalReadInterface + if (fileListReceiver->downloadHandler->OnFile(&onFileStruct)) + rakFree_Ex(onFileStruct.fileData, _FILE_AND_LINE_ ); + + fileListReceiver->filesReceived++; + + // If this set is done, free the memory for it. + if ((int) fileListReceiver->setCount==fileListReceiver->filesReceived) + { + FileListTransferCBInterface::DownloadCompleteStruct dcs; + dcs.setID=fileListReceiver->setID; + dcs.numberOfFilesInThisSet=fileListReceiver->setCount; + dcs.byteLengthOfThisSet=fileListReceiver->setTotalFinalLength; + dcs.senderSystemAddress=packet->systemAddress; + dcs.senderGuid=packet->guid; + + if (fileListReceiver->downloadHandler->OnDownloadComplete(&dcs)==false) + { + fileListReceiver->downloadHandler->OnDereference(); + if (fileListReceiver->deleteDownloadHandler) + RakNet::OP_DELETE(fileListReceiver->downloadHandler, _FILE_AND_LINE_); + fileListReceivers.Delete(onFileStruct.setID); + RakNet::OP_DELETE(fileListReceiver, _FILE_AND_LINE_); + } + } + + } + else + { + inBitStream.AlignReadToByteBoundary(); + + char *firstDataChunk; + unsigned int unreadBits = inBitStream.GetNumberOfUnreadBits(); + unsigned int unreadBytes = BITS_TO_BYTES(unreadBits); + firstDataChunk=(char*) inBitStream.GetData()+BITS_TO_BYTES(inBitStream.GetReadOffset()); + + onFileStruct.bytesDownloadedForThisSet=fileListReceiver->setTotalDownloadedLength+unreadBytes; + onFileStruct.bytesDownloadedForThisFile=onFileStruct.byteLengthOfThisFile; + + FileListTransferCBInterface::FileProgressStruct fps; + fps.onFileStruct=&onFileStruct; + fps.partCount=partCount; + fps.partTotal=partTotal; + fps.dataChunkLength=unreadBytes; + fps.firstDataChunk=firstDataChunk; + fps.iriDataChunk=0; + fps.allocateIrIDataChunkAutomatically=true; + fps.iriWriteOffset=0; + fps.senderSystemAddress=packet->systemAddress; + fps.senderGuid=packet->guid; + + // Remote system is sending a complete file, but the file is large enough that we get ID_PROGRESS_NOTIFICATION from the transport layer + fileListReceiver->downloadHandler->OnFileProgress(&fps); + + } + + return true; +} +PluginReceiveResult FileListTransfer::OnReceive(Packet *packet) +{ + switch (packet->data[0]) + { + case ID_FILE_LIST_TRANSFER_HEADER: + DecodeSetHeader(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + case ID_FILE_LIST_TRANSFER_FILE: + DecodeFile(packet, true); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + case ID_FILE_LIST_REFERENCE_PUSH: + OnReferencePush(packet, true); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + case ID_FILE_LIST_REFERENCE_PUSH_ACK: + OnReferencePushAck(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + case ID_DOWNLOAD_PROGRESS: + if (packet->length>sizeof(MessageID)+sizeof(unsigned int)*3) + { + if (packet->data[sizeof(MessageID)+sizeof(unsigned int)*3]==ID_FILE_LIST_TRANSFER_FILE) + { + DecodeFile(packet, false); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + if (packet->data[sizeof(MessageID)+sizeof(unsigned int)*3]==ID_FILE_LIST_REFERENCE_PUSH) + { + OnReferencePush(packet, false); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + } + break; + } + + return RR_CONTINUE_PROCESSING; +} +void FileListTransfer::OnRakPeerShutdown(void) +{ + threadPool.StopThreads(); + threadPool.ClearInput(); + Clear(); +} +void FileListTransfer::Clear(void) +{ + unsigned i; + for (i=0; i < fileListReceivers.Size(); i++) + { + fileListReceivers[i]->downloadHandler->OnDereference(); + if (fileListReceivers[i]->deleteDownloadHandler) + RakNet::OP_DELETE(fileListReceivers[i]->downloadHandler, _FILE_AND_LINE_); + RakNet::OP_DELETE(fileListReceivers[i], _FILE_AND_LINE_); + } + fileListReceivers.Clear(); + + fileToPushRecipientListMutex.Lock(); + for (unsigned int i=0; i < fileToPushRecipientList.Size(); i++) + { + FileToPushRecipient *ftpr = fileToPushRecipientList[i]; + // Taken out of the list + ftpr->Deref(); + } + fileToPushRecipientList.Clear(false,_FILE_AND_LINE_); + fileToPushRecipientListMutex.Unlock(); + + //filesToPush.Clear(false, _FILE_AND_LINE_); +} +void FileListTransfer::OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ) +{ + (void) lostConnectionReason; + (void) rakNetGUID; + + RemoveReceiver(systemAddress); +} +void FileListTransfer::CancelReceive(unsigned short setId) +{ + if (fileListReceivers.Has(setId)==false) + { +#ifdef _DEBUG + RakAssert(0); +#endif + return; + } + FileListReceiver *fileListReceiver=fileListReceivers.Get(setId); + fileListReceiver->downloadHandler->OnDereference(); + if (fileListReceiver->deleteDownloadHandler) + RakNet::OP_DELETE(fileListReceiver->downloadHandler, _FILE_AND_LINE_); + RakNet::OP_DELETE(fileListReceiver, _FILE_AND_LINE_); + fileListReceivers.Delete(setId); +} +void FileListTransfer::RemoveReceiver(SystemAddress systemAddress) +{ + unsigned i; + i=0; + threadPool.LockInput(); + while (i < threadPool.InputSize()) + { + if (threadPool.GetInputAtIndex(i).systemAddress==systemAddress) + { + threadPool.RemoveInputAtIndex(i); + } + else + i++; + } + threadPool.UnlockInput(); + + i=0; + while (i < fileListReceivers.Size()) + { + if (fileListReceivers[i]->allowedSender==systemAddress) + { + fileListReceivers[i]->downloadHandler->OnDereference(); + if (fileListReceivers[i]->deleteDownloadHandler) + RakNet::OP_DELETE(fileListReceivers[i]->downloadHandler, _FILE_AND_LINE_); + RakNet::OP_DELETE(fileListReceivers[i], _FILE_AND_LINE_); + fileListReceivers.RemoveAtIndex(i); + } + else + i++; + } + + fileToPushRecipientListMutex.Lock(); + for (unsigned int i=0; i < fileToPushRecipientList.Size(); i++) + { + if (fileToPushRecipientList[i]->systemAddress==systemAddress) + { + FileToPushRecipient *ftpr = fileToPushRecipientList[i]; + + // Tell the user that this recipient was lost + for (unsigned int flpcIndex=0; flpcIndex < fileListProgressCallbacks.Size(); flpcIndex++) + fileListProgressCallbacks[flpcIndex]->OnSendAborted(ftpr->systemAddress); + + fileToPushRecipientList.RemoveAtIndex(i); + // Taken out of the list + ftpr->Deref(); + break; + } + } + fileToPushRecipientListMutex.Unlock(); +} +bool FileListTransfer::IsHandlerActive(unsigned short setId) +{ + return fileListReceivers.Has(setId); +} +void FileListTransfer::AddCallback(FileListProgress *cb) +{ + if (cb==0) + return; + + if (fileListProgressCallbacks.GetIndexOf(cb)==(unsigned int) -1) + fileListProgressCallbacks.Push(cb, _FILE_AND_LINE_); +} +void FileListTransfer::RemoveCallback(FileListProgress *cb) +{ + unsigned int idx = fileListProgressCallbacks.GetIndexOf(cb); + if (idx!=(unsigned int) -1) + fileListProgressCallbacks.RemoveAtIndex(idx); +} +void FileListTransfer::ClearCallbacks(void) +{ + fileListProgressCallbacks.Clear(true, _FILE_AND_LINE_); +} +void FileListTransfer::GetCallbacks(DataStructures::List &callbacks) +{ + callbacks = fileListProgressCallbacks; +} + +void FileListTransfer::Update(void) +{ + unsigned i; + i=0; + while (i < fileListReceivers.Size()) + { + if (fileListReceivers[i]->downloadHandler->Update()==false) + { + fileListReceivers[i]->downloadHandler->OnDereference(); + if (fileListReceivers[i]->deleteDownloadHandler) + RakNet::OP_DELETE(fileListReceivers[i]->downloadHandler, _FILE_AND_LINE_); + RakNet::OP_DELETE(fileListReceivers[i], _FILE_AND_LINE_); + fileListReceivers.RemoveAtIndex(i); + } + else + i++; + } +} +void FileListTransfer::OnReferencePush(Packet *packet, bool isTheFileAndIsNotDownloadProgress) +{ + RakNet::BitStream refPushAck; + if (isTheFileAndIsNotDownloadProgress) + { + // This is not a progress notification, it is actually the entire packet + refPushAck.Write((MessageID)ID_FILE_LIST_REFERENCE_PUSH_ACK); + SendUnified(&refPushAck,HIGH_PRIORITY, RELIABLE, 0, packet->systemAddress, false); + } + else + { + // 12/23/09 Why do I care about ID_DOWNLOAD_PROGRESS for reference pushes? + return; + } + + FileListTransferCBInterface::OnFileStruct onFileStruct; + RakNet::BitStream inBitStream(packet->data, packet->length, false); + inBitStream.IgnoreBits(8); + + unsigned int partCount=0; + unsigned int partTotal=1; + unsigned int partLength=0; + onFileStruct.fileData=0; + if (isTheFileAndIsNotDownloadProgress==false) + { + // UNREACHABLE CODE + // Disable endian swapping on reading this, as it's generated locally in ReliabilityLayer.cpp + inBitStream.ReadBits( (unsigned char* ) &partCount, BYTES_TO_BITS(sizeof(partCount)), true ); + inBitStream.ReadBits( (unsigned char* ) &partTotal, BYTES_TO_BITS(sizeof(partTotal)), true ); + inBitStream.ReadBits( (unsigned char* ) &partLength, BYTES_TO_BITS(sizeof(partLength)), true ); + inBitStream.IgnoreBits(8); + // The header is appended to every chunk, which we continue to read after this statement flrMemoryBlock + } + + inBitStream >> onFileStruct.context; + // inBitStream.Read(onFileStruct.context); + inBitStream.Read(onFileStruct.setID); + FileListReceiver *fileListReceiver; + if (fileListReceivers.Has(onFileStruct.setID)==false) + { + return; + } + fileListReceiver=fileListReceivers.Get(onFileStruct.setID); + if (fileListReceiver->allowedSender!=packet->systemAddress) + { +#ifdef _DEBUG + RakAssert(0); +#endif + return; + } + +#ifdef _DEBUG + RakAssert(fileListReceiver->gotSetHeader==true); +#endif + + if (StringCompressor::Instance()->DecodeString(onFileStruct.fileName, 512, &inBitStream)==false) + { +#ifdef _DEBUG + RakAssert(0); +#endif + return; + } + + inBitStream.ReadCompressed(onFileStruct.fileIndex); + inBitStream.ReadCompressed(onFileStruct.byteLengthOfThisFile); + unsigned int offset; + unsigned int chunkLength; + inBitStream.ReadCompressed(offset); + inBitStream.ReadCompressed(chunkLength); + + bool lastChunk=false; + inBitStream.Read(lastChunk); + bool finished = lastChunk && isTheFileAndIsNotDownloadProgress; + + if (isTheFileAndIsNotDownloadProgress==false) + fileListReceiver->partLength=partLength; + + FLR_MemoryBlock mb; + if (fileListReceiver->pushedFiles.Has(onFileStruct.fileIndex)==false) + { + mb.flrMemoryBlock=(char*) rakMalloc_Ex(onFileStruct.byteLengthOfThisFile, _FILE_AND_LINE_); + fileListReceiver->pushedFiles.SetNew(onFileStruct.fileIndex, mb); + } + else + { + mb=fileListReceiver->pushedFiles.Get(onFileStruct.fileIndex); + } + + unsigned int unreadBits = inBitStream.GetNumberOfUnreadBits(); + unsigned int unreadBytes = BITS_TO_BYTES(unreadBits); + unsigned int amountToRead; + if (isTheFileAndIsNotDownloadProgress) + amountToRead=chunkLength; + else + amountToRead=unreadBytes; + + inBitStream.AlignReadToByteBoundary(); + + FileListTransferCBInterface::FileProgressStruct fps; + + if (isTheFileAndIsNotDownloadProgress) + { + if (mb.flrMemoryBlock) + { + // Either the very first block, or a subsequent block and allocateIrIDataChunkAutomatically was true for the first block + memcpy(mb.flrMemoryBlock+offset, inBitStream.GetData()+BITS_TO_BYTES(inBitStream.GetReadOffset()), amountToRead); + fps.iriDataChunk=mb.flrMemoryBlock+offset; + } + else + { + // In here mb.flrMemoryBlock is null + // This means the first block explicitly deallocated the memory, and no blocks will be permanently held by RakNet + fps.iriDataChunk=(char*) inBitStream.GetData()+BITS_TO_BYTES(inBitStream.GetReadOffset()); + } + + onFileStruct.bytesDownloadedForThisFile=offset+amountToRead; + } + else + { + fileListReceiver->setTotalDownloadedLength+=partLength; + onFileStruct.bytesDownloadedForThisFile=partCount*partLength; + fps.iriDataChunk=(char*) inBitStream.GetData()+BITS_TO_BYTES(inBitStream.GetReadOffset()); + } + onFileStruct.bytesDownloadedForThisSet=fileListReceiver->setTotalDownloadedLength; + + onFileStruct.numberOfFilesInThisSet=fileListReceiver->setCount; +// onFileStruct.setTotalCompressedTransmissionLength=fileListReceiver->setTotalCompressedTransmissionLength; + onFileStruct.byteLengthOfThisSet=fileListReceiver->setTotalFinalLength; + // Note: mb.flrMemoryBlock may be null here + onFileStruct.fileData=mb.flrMemoryBlock; + onFileStruct.senderSystemAddress=packet->systemAddress; + onFileStruct.senderGuid=packet->guid; + + unsigned int totalNotifications; + unsigned int currentNotificationIndex; + if (chunkLength==0 || chunkLength==onFileStruct.byteLengthOfThisFile) + totalNotifications=1; + else + totalNotifications = onFileStruct.byteLengthOfThisFile / chunkLength + 1; + + if (chunkLength==0) + currentNotificationIndex = 0; + else + currentNotificationIndex = offset / chunkLength; + + fps.onFileStruct=&onFileStruct; + fps.partCount=currentNotificationIndex; + fps.partTotal=totalNotifications; + fps.dataChunkLength=amountToRead; + fps.firstDataChunk=mb.flrMemoryBlock; + fps.allocateIrIDataChunkAutomatically=true; + fps.onFileStruct->fileData=mb.flrMemoryBlock; + fps.iriWriteOffset=offset; + fps.senderSystemAddress=packet->systemAddress; + fps.senderGuid=packet->guid; + + if (finished) + { + char *oldFileData=fps.onFileStruct->fileData; + if (fps.partCount==0) + fps.firstDataChunk=fps.iriDataChunk; + if (fps.partTotal==1) + fps.onFileStruct->fileData=fps.iriDataChunk; + fileListReceiver->downloadHandler->OnFileProgress(&fps); + + // Incremental read interface sent us a file chunk + // This is the last file chunk we were waiting for to consider the file done + if (fileListReceiver->downloadHandler->OnFile(&onFileStruct)) + rakFree_Ex(oldFileData, _FILE_AND_LINE_ ); + fileListReceiver->pushedFiles.Delete(onFileStruct.fileIndex); + + fileListReceiver->filesReceived++; + + // If this set is done, free the memory for it. + if ((int) fileListReceiver->setCount==fileListReceiver->filesReceived) + { + FileListTransferCBInterface::DownloadCompleteStruct dcs; + dcs.setID=fileListReceiver->setID; + dcs.numberOfFilesInThisSet=fileListReceiver->setCount; + dcs.byteLengthOfThisSet=fileListReceiver->setTotalFinalLength; + dcs.senderSystemAddress=packet->systemAddress; + dcs.senderGuid=packet->guid; + + if (fileListReceiver->downloadHandler->OnDownloadComplete(&dcs)==false) + { + fileListReceiver->downloadHandler->OnDereference(); + fileListReceivers.Delete(onFileStruct.setID); + if (fileListReceiver->deleteDownloadHandler) + RakNet::OP_DELETE(fileListReceiver->downloadHandler, _FILE_AND_LINE_); + RakNet::OP_DELETE(fileListReceiver, _FILE_AND_LINE_); + } + } + } + else + { + if (isTheFileAndIsNotDownloadProgress) + { + // 12/23/09 Don't use OnReferencePush anymore, just use OnFileProgress + fileListReceiver->downloadHandler->OnFileProgress(&fps); + + if (fps.allocateIrIDataChunkAutomatically==false) + { + rakFree_Ex(fileListReceiver->pushedFiles.Get(onFileStruct.fileIndex).flrMemoryBlock, _FILE_AND_LINE_ ); + fileListReceiver->pushedFiles.Get(onFileStruct.fileIndex).flrMemoryBlock=0; + } + } + else + { + // This is a download progress notification for a file chunk using incremental read interface + // We don't have all the data for this chunk yet + + // UNREACHABLE CODE + totalNotifications = onFileStruct.byteLengthOfThisFile / fileListReceiver->partLength + 1; + if (isTheFileAndIsNotDownloadProgress==false) + currentNotificationIndex = (offset+partCount*fileListReceiver->partLength) / fileListReceiver->partLength ; + else + currentNotificationIndex = (offset+chunkLength) / fileListReceiver->partLength ; + unreadBytes = onFileStruct.byteLengthOfThisFile - ((currentNotificationIndex+1) * fileListReceiver->partLength); + + if (rakPeerInterface) + { + // Thus chunk is incomplete + fps.iriDataChunk=0; + + fileListReceiver->downloadHandler->OnFileProgress(&fps); + } + } + } + + return; +} +namespace RakNet +{ +int SendIRIToAddressCB(FileListTransfer::ThreadData threadData, bool *returnOutput, void* perThreadData) +{ + (void) perThreadData; + + FileListTransfer *fileListTransfer = threadData.fileListTransfer; + SystemAddress systemAddress = threadData.systemAddress; + *returnOutput=false; + + // Was previously using GetStatistics to get outgoing buffer size, but TCP with UnifiedSend doesn't have this + unsigned int bytesRead; + const char *dataBlocks[2]; + int lengths[2]; + unsigned int smallFileTotalSize=0; + RakNet::BitStream outBitstream; + unsigned int ftpIndex; + + fileListTransfer->fileToPushRecipientListMutex.Lock(); + for (ftpIndex=0; ftpIndex < fileListTransfer->fileToPushRecipientList.Size(); ftpIndex++) + { + FileListTransfer::FileToPushRecipient *ftpr = fileListTransfer->fileToPushRecipientList[ftpIndex]; + // Referenced by both ftpr and list + ftpr->AddRef(); + + fileListTransfer->fileToPushRecipientListMutex.Unlock(); + + if (ftpr->systemAddress==systemAddress) + { + FileListTransfer::FileToPush *ftp = ftpr->filesToPush.Peek(); + + // Read and send chunk. If done, delete at this index + void *buff = rakMalloc_Ex(ftp->chunkSize, _FILE_AND_LINE_); + if (buff==0) + { + ftpr->Deref(); + notifyOutOfMemory(_FILE_AND_LINE_); + return 0; + } + + // Read the next file chunk + bytesRead=ftp->incrementalReadInterface->GetFilePart(ftp->fileListNode.fullPathToFile, ftp->currentOffset, ftp->chunkSize, buff, ftp->fileListNode.context); + + bool done = ftp->fileListNode.dataLengthBytes == ftp->currentOffset+bytesRead; + while (done && ftp->currentOffset==0 && ftpr->filesToPush.Size()>=2 && smallFileTotalSizechunkSize) + { + // Send all small files at once, rather than wait for ID_FILE_LIST_REFERENCE_PUSH. But at least one ID_FILE_LIST_REFERENCE_PUSH must be sent + outBitstream.Reset(); + outBitstream.Write((MessageID)ID_FILE_LIST_TRANSFER_FILE); + // outBitstream.Write(ftp->fileListNode.context); + outBitstream << ftp->fileListNode.context; + outBitstream.Write(ftp->setID); + StringCompressor::Instance()->EncodeString(ftp->fileListNode.filename, 512, &outBitstream); + outBitstream.WriteCompressed(ftp->setIndex); + outBitstream.WriteCompressed(ftp->fileListNode.dataLengthBytes); // Original length in bytes + outBitstream.AlignWriteToByteBoundary(); + dataBlocks[0]=(char*) outBitstream.GetData(); + lengths[0]=outBitstream.GetNumberOfBytesUsed(); + dataBlocks[1]=(const char*) buff; + lengths[1]=bytesRead; + + fileListTransfer->SendListUnified(dataBlocks,lengths,2,ftp->packetPriority, RELIABLE_ORDERED, ftp->orderingChannel, systemAddress, false); + + // LWS : fixed freed pointer reference +// unsigned int chunkSize = ftp->chunkSize; + RakNet::OP_DELETE(ftp,_FILE_AND_LINE_); + ftpr->filesToPush.Pop(); + smallFileTotalSize+=bytesRead; + //done = bytesRead!=ftp->chunkSize; + ftp = ftpr->filesToPush.Peek(); + + bytesRead=ftp->incrementalReadInterface->GetFilePart(ftp->fileListNode.fullPathToFile, ftp->currentOffset, ftp->chunkSize, buff, ftp->fileListNode.context); + done = ftp->fileListNode.dataLengthBytes == ftp->currentOffset+bytesRead; + } + + + outBitstream.Reset(); + outBitstream.Write((MessageID)ID_FILE_LIST_REFERENCE_PUSH); + // outBitstream.Write(ftp->fileListNode.context); + outBitstream << ftp->fileListNode.context; + outBitstream.Write(ftp->setID); + StringCompressor::Instance()->EncodeString(ftp->fileListNode.filename, 512, &outBitstream); + outBitstream.WriteCompressed(ftp->setIndex); + outBitstream.WriteCompressed(ftp->fileListNode.dataLengthBytes); // Original length in bytes + outBitstream.WriteCompressed(ftp->currentOffset); + ftp->currentOffset+=bytesRead; + outBitstream.WriteCompressed(bytesRead); + outBitstream.Write(done); + + for (unsigned int flpcIndex=0; flpcIndex < fileListTransfer->fileListProgressCallbacks.Size(); flpcIndex++) + fileListTransfer->fileListProgressCallbacks[flpcIndex]->OnFilePush(ftp->fileListNode.filename, ftp->fileListNode.fileLengthBytes, ftp->currentOffset-bytesRead, bytesRead, done, systemAddress, ftp->setID); + + dataBlocks[0]=(char*) outBitstream.GetData(); + lengths[0]=outBitstream.GetNumberOfBytesUsed(); + dataBlocks[1]=(char*) buff; + lengths[1]=bytesRead; + //rakPeerInterface->SendList(dataBlocks,lengths,2,ftp->packetPriority, RELIABLE_ORDERED, ftp->orderingChannel, ftp->systemAddress, false); + fileListTransfer->SendListUnified(dataBlocks,lengths,2,ftp->packetPriority, RELIABLE_ORDERED, ftp->orderingChannel, systemAddress, false); + + // Mutex state: FileToPushRecipient (ftpr) has AddRef. fileToPushRecipientListMutex not locked. + if (done) + { + // Done + unsigned short setId = ftp->setID; + RakNet::OP_DELETE(ftp,_FILE_AND_LINE_); + ftpr->filesToPush.Pop(); + + if (ftpr->filesToPush.Size()==0) + { + for (unsigned int flpcIndex=0; flpcIndex < fileListTransfer->fileListProgressCallbacks.Size(); flpcIndex++) + fileListTransfer->fileListProgressCallbacks[flpcIndex]->OnFilePushesComplete(systemAddress, setId); + + // Remove ftpr from fileToPushRecipientList + fileListTransfer->RemoveFromList(ftpr); + } + } + + // ftpr out of scope + ftpr->Deref(); + + rakFree_Ex(buff, _FILE_AND_LINE_ ); + return 0; + } + else + { + ftpr->Deref(); + fileListTransfer->fileToPushRecipientListMutex.Lock(); + } + } + + fileListTransfer->fileToPushRecipientListMutex.Unlock(); + + return 0; +} +} +void FileListTransfer::SendIRIToAddress(SystemAddress systemAddress) +{ + ThreadData threadData; + threadData.fileListTransfer=this; + threadData.systemAddress=systemAddress; + + if (threadPool.WasStarted()) + { + threadPool.AddInput(SendIRIToAddressCB, threadData); + } + else + { + bool doesNothing; + SendIRIToAddressCB(threadData, &doesNothing, 0); + } +} +void FileListTransfer::OnReferencePushAck(Packet *packet) +{ + SendIRIToAddress(packet->systemAddress); +} +void FileListTransfer::RemoveFromList(FileToPushRecipient *ftpr) +{ + fileToPushRecipientListMutex.Lock(); + for (unsigned int i=0; i < fileToPushRecipientList.Size(); i++) + { + if (fileToPushRecipientList[i]==ftpr) + { + fileToPushRecipientList.RemoveAtIndex(i); + // List no longer references + ftpr->Deref(); + fileToPushRecipientListMutex.Unlock(); + return; + } + } + fileToPushRecipientListMutex.Unlock(); +} +unsigned int FileListTransfer::GetPendingFilesToAddress(SystemAddress recipient) +{ + fileToPushRecipientListMutex.Lock(); + for (unsigned int i=0; i < fileToPushRecipientList.Size(); i++) + { + if (fileToPushRecipientList[i]->systemAddress==recipient) + { + unsigned int size = fileToPushRecipientList[i]->filesToPush.Size(); + fileToPushRecipientListMutex.Unlock(); + return size; + } + } + fileToPushRecipientListMutex.Unlock(); + + return 0; +} + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FileListTransfer.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FileListTransfer.h new file mode 100644 index 0000000..c3d794c --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FileListTransfer.h @@ -0,0 +1,173 @@ +/// \file FileListTransfer.h +/// \brief A plugin to provide a simple way to compress and incrementally send the files in the FileList structure. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_FileListTransfer==1 && _RAKNET_SUPPORT_FileOperations==1 + +#ifndef __FILE_LIST_TRANFER_H +#define __FILE_LIST_TRANFER_H + +#include "RakNetTypes.h" +#include "Export.h" +#include "PluginInterface2.h" +#include "DS_Map.h" +#include "RakNetTypes.h" +#include "PacketPriority.h" +#include "RakMemoryOverride.h" +#include "FileList.h" +#include "DS_Queue.h" +#include "SimpleMutex.h" +#include "ThreadPool.h" + +namespace RakNet +{ +/// Forward declarations +class IncrementalReadInterface; +class FileListTransferCBInterface; +class FileListProgress; +struct FileListReceiver; + +/// \defgroup FILE_LIST_TRANSFER_GROUP FileListTransfer +/// \brief A plugin to provide a simple way to compress and incrementally send the files in the FileList structure. +/// \details +/// \ingroup PLUGINS_GROUP + +/// \brief A plugin to provide a simple way to compress and incrementally send the files in the FileList structure. +/// \details Similar to the DirectoryDeltaTransfer plugin, except that it doesn't send deltas based on pre-existing files or actually write the files to disk. +/// +/// Usage: +/// Call SetupReceive to allow one file set to arrive. The value returned by FileListTransfer::SetupReceive() +/// is the setID that is allowed. +/// It's up to you to transmit this value to the other system, along with information indicating what kind of files you want to get. +/// The other system should then prepare a FileList and call FileListTransfer::Send(), passing the return value of FileListTransfer::SetupReceive() +/// as the \a setID parameter to FileListTransfer::Send() +/// \ingroup FILE_LIST_TRANSFER_GROUP +class RAK_DLL_EXPORT FileListTransfer : public PluginInterface2 +{ +public: + + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(FileListTransfer) + + FileListTransfer(); + virtual ~FileListTransfer(); + + /// \brief Optionally start worker threads when using _incrementalReadInterface for the Send() operation + /// \param[in] numThreads how many worker threads to start + /// \param[in] threadPriority Passed to the thread creation routine. Use THREAD_PRIORITY_NORMAL for Windows. For Linux based systems, you MUST pass something reasonable based on the thread priorities for your application. + void StartIncrementalReadThreads(int numThreads, int threadPriority=-99999); + + /// \brief Allows one corresponding Send() call from another system to arrive. + /// \param[in] handler The class to call on each file + /// \param[in] deleteHandler True to delete the handler when it is no longer needed. False to not do so. + /// \param[in] allowedSender Which system to allow files from. + /// \return A set ID value, which should be passed as the \a setID value to the Send() call on the other system. This value will be returned in the callback and is unique per file set. Returns 65535 on failure (not connected to sender) + unsigned short SetupReceive(FileListTransferCBInterface *handler, bool deleteHandler, SystemAddress allowedSender); + + /// \brief Send the FileList structure to another system, which must have previously called SetupReceive(). + /// \param[in] fileList A list of files. The data contained in FileList::data will be sent incrementally and compressed among all files in the set + /// \param[in] rakPeer The instance of RakNet to use to send the message. Pass 0 to use the instance the plugin is attached to + /// \param[in] recipient The address of the system to send to + /// \param[in] setID The return value of SetupReceive() which was previously called on \a recipient + /// \param[in] priority Passed to RakPeerInterface::Send() + /// \param[in] orderingChannel Passed to RakPeerInterface::Send() + /// \param[in] _incrementalReadInterface If a file in \a fileList has no data, _incrementalReadInterface will be used to read the file in chunks of size \a chunkSize + /// \param[in] _chunkSize How large of a block of a file to send at once + void Send(FileList *fileList, RakNet::RakPeerInterface *rakPeer, SystemAddress recipient, unsigned short setID, PacketPriority priority, char orderingChannel, IncrementalReadInterface *_incrementalReadInterface=0, unsigned int _chunkSize=262144*4*16); + + /// Return number of files waiting to go out to a particular address + unsigned int GetPendingFilesToAddress(SystemAddress recipient); + + /// \brief Stop a download. + void CancelReceive(unsigned short setId); + + /// \brief Remove all handlers associated with a particular system address. + void RemoveReceiver(SystemAddress systemAddress); + + /// \brief Is a handler passed to SetupReceive still running? + bool IsHandlerActive(unsigned short setId); + + /// \brief Adds a callback to get progress reports about what the file list instances do. + /// \param[in] cb A pointer to an externally defined instance of FileListProgress. This pointer is held internally, so should remain valid as long as this class is valid. + void AddCallback(FileListProgress *cb); + + /// \brief Removes a callback + /// \param[in] cb A pointer to an externally defined instance of FileListProgress that was previously added with AddCallback() + void RemoveCallback(FileListProgress *cb); + + /// \brief Removes all callbacks + void ClearCallbacks(void); + + /// Returns all callbacks added with AddCallback() + /// \param[out] callbacks The list is set to the list of callbacks + void GetCallbacks(DataStructures::List &callbacks); + + /// \internal For plugin handling + virtual PluginReceiveResult OnReceive(Packet *packet); + /// \internal For plugin handling + virtual void OnRakPeerShutdown(void); + /// \internal For plugin handling + virtual void OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ); + /// \internal For plugin handling + virtual void Update(void); + +protected: + bool DecodeSetHeader(Packet *packet); + bool DecodeFile(Packet *packet, bool fullFile); + + void Clear(void); + + void OnReferencePush(Packet *packet, bool fullFile); + void OnReferencePushAck(Packet *packet); + void SendIRIToAddress(SystemAddress systemAddress); + + DataStructures::Map fileListReceivers; + unsigned short setId; + DataStructures::List fileListProgressCallbacks; + + struct FileToPush + { + FileListNode fileListNode; + PacketPriority packetPriority; + char orderingChannel; + unsigned int currentOffset; + unsigned short setID; + unsigned int setIndex; + IncrementalReadInterface *incrementalReadInterface; + unsigned int chunkSize; + }; + struct FileToPushRecipient + { + unsigned int refCount; + SimpleMutex refCountMutex; + void DeleteThis(void); + void AddRef(void); + void Deref(void); + + SystemAddress systemAddress; + DataStructures::Queue filesToPush; + }; + DataStructures::List< FileToPushRecipient* > fileToPushRecipientList; + SimpleMutex fileToPushRecipientListMutex; + void RemoveFromList(FileToPushRecipient *ftpr); + + struct ThreadData + { + FileListTransfer *fileListTransfer; + SystemAddress systemAddress; + }; + + ThreadPool threadPool; + + friend int SendIRIToAddressCB(FileListTransfer::ThreadData threadData, bool *returnOutput, void* perThreadData); +}; + +} // namespace RakNet + +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FileListTransferCBInterface.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FileListTransferCBInterface.h new file mode 100644 index 0000000..ed1fb91 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FileListTransferCBInterface.h @@ -0,0 +1,154 @@ +/// \file FileListTransferCBInterface.h +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#ifndef __FILE_LIST_TRANSFER_CALLBACK_INTERFACE_H +#define __FILE_LIST_TRANSFER_CALLBACK_INTERFACE_H + +#include "RakMemoryOverride.h" +#include "FileListNodeContext.h" + +#ifdef _MSC_VER +#pragma warning( push ) +#endif + +namespace RakNet +{ + +/// \brief Used by FileListTransfer plugin as a callback for when we get a file. +/// \details You get the last file when fileIndex==numberOfFilesInThisSet +/// \sa FileListTransfer +class FileListTransferCBInterface +{ +public: + // Note: If this structure is changed the struct in the swig files need to be changed as well + struct OnFileStruct + { + /// \brief The index into the set of files, from 0 to numberOfFilesInThisSet + unsigned fileIndex; + + /// \brief The name of the file + char fileName[512]; + + /// \brief The data pointed to by the file + char *fileData; + + /// \brief The actual length of this file. + BitSize_t byteLengthOfThisFile; + + /// \brief How many bytes of this file has been downloaded + BitSize_t bytesDownloadedForThisFile; + + /// \brief Files are transmitted in sets, where more than one set of files can be transmitted at the same time. + /// \details This is the identifier for the set, which is returned by FileListTransfer::SetupReceive + unsigned short setID; + + /// \brief The number of files that are in this set. + unsigned numberOfFilesInThisSet; + + /// \brief The total length of the transmitted files for this set, after being uncompressed + unsigned byteLengthOfThisSet; + + /// \brief The total length, in bytes, downloaded for this set. + unsigned bytesDownloadedForThisSet; + + /// \brief User data passed to one of the functions in the FileList class. + /// \details However, on error, this is instead changed to one of the enumerations in the PatchContext structure. + FileListNodeContext context; + + /// \brief Who sent this file + SystemAddress senderSystemAddress; + + /// \brief Who sent this file. Not valid when using TCP, only RakPeer (UDP) + RakNetGUID senderGuid; + }; + + // Note: If this structure is changed the struct in the swig files need to be changed as well + struct FileProgressStruct + { + /// \param[out] onFileStruct General information about this file, such as the filename and the first \a partLength bytes. You do NOT need to save this data yourself. The complete file will arrive normally. + OnFileStruct *onFileStruct; + /// \param[out] partCount The zero based index into partTotal. The percentage complete done of this file is 100 * (partCount+1)/partTotal + unsigned int partCount; + /// \param[out] partTotal The total number of parts this file was split into. Each part will be roughly the MTU size, minus the UDP header and RakNet headers + unsigned int partTotal; + /// \param[out] dataChunkLength How many bytes long firstDataChunk and iriDataChunk are + unsigned int dataChunkLength; + /// \param[out] firstDataChunk The first \a partLength of the final file. If you store identifying information about the file in the first \a partLength bytes, you can read them while the download is taking place. If this hasn't arrived yet, firstDataChunk will be 0 + char *firstDataChunk; + /// \param[out] iriDataChunk If the remote system is sending this file using IncrementalReadInterface, then this is the chunk we just downloaded. It will not exist in memory after this callback. You should either store this to disk, or in memory. If it is 0, then the file is smaller than one chunk, and will be held in memory automatically + char *iriDataChunk; + /// \param[out] iriWriteOffset Offset in bytes from the start of the file for the data pointed to by iriDataChunk + unsigned int iriWriteOffset; + /// \param[out] Who sent this file + SystemAddress senderSystemAddress; + /// \param[out] Who sent this file. Not valid when using TCP, only RakPeer (UDP) + RakNetGUID senderGuid; + /// \param[in] allocateIrIDataChunkAutomatically If true, then RakNet will hold iriDataChunk for you and return it in OnFile. Defaults to true + bool allocateIrIDataChunkAutomatically; + }; + + struct DownloadCompleteStruct + { + /// \brief Files are transmitted in sets, where more than one set of files can be transmitted at the same time. + /// \details This is the identifier for the set, which is returned by FileListTransfer::SetupReceive + unsigned short setID; + + /// \brief The number of files that are in this set. + unsigned numberOfFilesInThisSet; + + /// \brief The total length of the transmitted files for this set, after being uncompressed + unsigned byteLengthOfThisSet; + + /// \brief Who sent this file + SystemAddress senderSystemAddress; + + /// \brief Who sent this file. Not valid when using TCP, only RakPeer (UDP) + RakNetGUID senderGuid; + }; + + FileListTransferCBInterface() {} + virtual ~FileListTransferCBInterface() {} + + /// \brief Got a file. + /// \details This structure is only valid for the duration of this function call. + /// \return Return true to have RakNet delete the memory allocated to hold this file for this function call. + virtual bool OnFile(OnFileStruct *onFileStruct)=0; + + /// \brief Got part of a big file internally in RakNet + /// \details This is called in one of two circumstances: Either the transport layer is returning ID_PROGRESS_NOTIFICATION, or you got a block via IncrementalReadInterface + /// If the transport layer is returning ID_PROGRESS_NOTIFICATION (see RakPeer::SetSplitMessageProgressInterval()) then FileProgressStruct::iriDataChunk will be 0. + /// If this is a block via IncrementalReadInterface, then iriDataChunk will point to the block just downloaded. + /// If not using IncrementalReadInterface, then you only care about partCount and partTotal to tell how far the download has progressed. YOu can use firstDataChunk to read the first part of the file if desired. The file is usable when you get the OnFile callback. + /// If using IncrementalReadInterface and you let RakNet buffer the files in memory (default), then it is the same as above. The file is usable when you get the OnFile callback. + /// If using IncrementalReadInterface and you do not let RakNet buffer the files in memory, then set allocateIrIDataChunkAutomatically to false. Write the file to disk whenever you get OnFileProgress and iriDataChunk is not 0, and ignore OnFile. + virtual void OnFileProgress(FileProgressStruct *fps)=0; + + /// \brief Called while the handler is active by FileListTransfer + /// \details Return false when you are done with the class. + /// At that point OnDereference will be called and the class will no longer be maintained by the FileListTransfer plugin. + virtual bool Update(void) {return true;} + + /// \brief Called when the download is completed. + /// \details If you are finished with this class, return false. + /// At that point OnDereference will be called and the class will no longer be maintained by the FileListTransfer plugin. + /// Otherwise return true, and Update will continue to be called. + virtual bool OnDownloadComplete(DownloadCompleteStruct *dcs) {(void) dcs; return false;} + + /// \brief This function is called when this instance is about to be dereferenced by the FileListTransfer plugin. + /// \details Update will no longer be called. + /// It will will be deleted automatically if true was passed to FileListTransfer::SetupReceive::deleteHandler + /// Otherwise it is up to you to delete it yourself. + virtual void OnDereference(void) {} +}; + +} // namespace RakNet + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + +#endif + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FileOperations.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FileOperations.cpp new file mode 100644 index 0000000..92f3af3 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FileOperations.cpp @@ -0,0 +1,173 @@ +#include "FileOperations.h" +#if _RAKNET_SUPPORT_FileOperations==1 +#include "RakMemoryOverride.h" +#include "_FindFirst.h" // For linux +#include +#include +#ifdef _WIN32 +// For mkdir +#include +#include +#else +#include +#include +#include "_FindFirst.h" +#endif +#include "errno.h" + +#ifdef _MSC_VER +#pragma warning( push ) +#endif + +#ifdef _MSC_VER +#pragma warning( disable : 4966 ) // mkdir declared deprecated by Microsoft in order to make it harder to be cross platform. I don't agree it's deprecated. +#endif +bool WriteFileWithDirectories( const char *path, char *data, unsigned dataLength ) +{ + int index; + FILE *fp; + char *pathCopy; + int res; + + if ( path == 0 || path[ 0 ] == 0 ) + return false; + + pathCopy = (char*) rakMalloc_Ex( strlen( path ) + 1, _FILE_AND_LINE_ ); + + strcpy( pathCopy, path ); + + // Ignore first / if there is one + if (pathCopy[0]) + { + index = 1; + while ( pathCopy[ index ] ) + { + if ( pathCopy[ index ] == '/' || pathCopy[ index ] == '\\') + { + pathCopy[ index ] = 0; + + #ifdef _WIN32 + #pragma warning( disable : 4966 ) // mkdir declared deprecated by Microsoft in order to make it harder to be cross platform. I don't agree it's deprecated. + res = mkdir( pathCopy ); + #else + + res = mkdir( pathCopy, 0744 ); + #endif + if (res<0 && errno!=EEXIST && errno!=EACCES) + { + rakFree_Ex(pathCopy, _FILE_AND_LINE_ ); + return false; + } + + pathCopy[ index ] = '/'; + } + + index++; + } + } + + if (data) + { + fp = fopen( path, "wb" ); + + if ( fp == 0 ) + { + rakFree_Ex(pathCopy, _FILE_AND_LINE_ ); + return false; + } + + fwrite( data, 1, dataLength, fp ); + + fclose( fp ); + } + else + { +#ifdef _WIN32 +#pragma warning( disable : 4966 ) // mkdir declared deprecated by Microsoft in order to make it harder to be cross platform. I don't agree it's deprecated. + res = mkdir( pathCopy ); +#else + res = mkdir( pathCopy, 0744 ); +#endif + + if (res<0 && errno!=EEXIST) + { + rakFree_Ex(pathCopy, _FILE_AND_LINE_ ); + return false; + } + } + + rakFree_Ex(pathCopy, _FILE_AND_LINE_ ); + + return true; +} +bool IsSlash(unsigned char c) +{ + return c=='/' || c=='\\'; +} + +void AddSlash( char *input ) +{ + if (input==0 || input[0]==0) + return; + + int lastCharIndex=(int) strlen(input)-1; + if (input[lastCharIndex]=='\\') + input[lastCharIndex]='/'; + else if (input[lastCharIndex]!='/') + { + input[lastCharIndex+1]='/'; + input[lastCharIndex+2]=0; + } +} +bool DirectoryExists(const char *directory) +{ + _finddata_t fileInfo; + intptr_t dir; + char baseDirWithStars[560]; + strcpy(baseDirWithStars, directory); + AddSlash(baseDirWithStars); + strcat(baseDirWithStars, "*.*"); + dir=_findfirst(baseDirWithStars, &fileInfo ); + if (dir==-1) + return false; + _findclose(dir); + return true; +} +void QuoteIfSpaces(char *str) +{ + unsigned i; + bool hasSpace=false; + for (i=0; str[i]; i++) + { + if (str[i]==' ') + { + hasSpace=true; + break; + } + } + if (hasSpace) + { + int len=(int)strlen(str); + memmove(str+1, str, len); + str[0]='\"'; + str[len]='\"'; + str[len+1]=0; + } +} +unsigned int GetFileLength(const char *path) +{ + FILE *fp = fopen(path, "rb"); + if (fp==0) return 0; + fseek(fp, 0, SEEK_END); + unsigned int fileLength = ftell(fp); + fclose(fp); + return fileLength; + +} + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + +#endif // _RAKNET_SUPPORT_FileOperations + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FileOperations.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FileOperations.h new file mode 100644 index 0000000..1e44bd8 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FileOperations.h @@ -0,0 +1,24 @@ +/// \file FileOperations.h +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_FileOperations==1 + +#ifndef __FILE_OPERATIONS_H +#define __FILE_OPERATIONS_H + +#include "Export.h" + +bool RAK_DLL_EXPORT WriteFileWithDirectories( const char *path, char *data, unsigned dataLength ); +bool RAK_DLL_EXPORT IsSlash(unsigned char c); +void RAK_DLL_EXPORT AddSlash( char *input ); +void RAK_DLL_EXPORT QuoteIfSpaces(char *str); +bool RAK_DLL_EXPORT DirectoryExists(const char *directory); +unsigned int RAK_DLL_EXPORT GetFileLength(const char *path); + +#endif + +#endif // _RAKNET_SUPPORT_FileOperations diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FormatString.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FormatString.cpp new file mode 100644 index 0000000..e4df09e --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FormatString.cpp @@ -0,0 +1,30 @@ +#include "FormatString.h" +#include +#include +#include +#include "LinuxStrings.h" + +char * FormatString(const char *format, ...) +{ + static int textIndex=0; + static char text[4][8096]; + va_list ap; + va_start(ap, format); + + if (++textIndex==4) + textIndex=0; + _vsnprintf(text[textIndex], 8096, format, ap); + va_end(ap); + text[textIndex][8096-1]=0; + + return text[textIndex]; +} + +char * FormatStringTS(char *output, const char *format, ...) +{ + va_list ap; + va_start(ap, format); + _vsnprintf(output, 512, format, ap); + va_end(ap); + return output; +} diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FormatString.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FormatString.h new file mode 100644 index 0000000..1ebdab9 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FormatString.h @@ -0,0 +1,22 @@ +/// \file FormatString.h +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#ifndef __FORMAT_STRING_H +#define __FORMAT_STRING_H + +#include "Export.h" + +extern "C" { +char * FormatString(const char *format, ...); +} +// Threadsafe +extern "C" { +char * FormatStringTS(char *output, const char *format, ...); +} + + +#endif + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FullyConnectedMesh2.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FullyConnectedMesh2.cpp new file mode 100644 index 0000000..3837a3e --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FullyConnectedMesh2.cpp @@ -0,0 +1,552 @@ +/// \file +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_FullyConnectedMesh2==1 + +#include "FullyConnectedMesh2.h" +#include "RakPeerInterface.h" +#include "MessageIdentifiers.h" +#include "BitStream.h" +#include "RakAssert.h" +#include "GetTime.h" +#include "Rand.h" +#include "DS_OrderedList.h" + +using namespace RakNet; + +int FCM2ParticipantComp( const FullyConnectedMesh2::FCM2Participant &key, const FullyConnectedMesh2::FCM2Participant &data ) +{ + if (key.fcm2Guid < data.fcm2Guid) + return -1; + if (key.fcm2Guid > data.fcm2Guid) + return 1; + return 0; +} + +STATIC_FACTORY_DEFINITIONS(FullyConnectedMesh2,FullyConnectedMesh2); + +FullyConnectedMesh2::FullyConnectedMesh2() +{ + startupTime=0; + totalConnectionCount=0; + ourFCMGuid=0; + autoParticipateConnections=true; + + + + + connectOnNewRemoteConnections=true; + + hostRakNetGuid=UNASSIGNED_RAKNET_GUID; +} +FullyConnectedMesh2::~FullyConnectedMesh2() +{ + Clear(); +} +RakNetGUID FullyConnectedMesh2::GetConnectedHost(void) const +{ + if (ourFCMGuid==0) + return UNASSIGNED_RAKNET_GUID; + return hostRakNetGuid; +} +SystemAddress FullyConnectedMesh2::GetConnectedHostAddr(void) const +{ + if (ourFCMGuid==0) + return UNASSIGNED_SYSTEM_ADDRESS; + return rakPeerInterface->GetSystemAddressFromGuid(hostRakNetGuid); +} +RakNetGUID FullyConnectedMesh2::GetHostSystem(void) const +{ + if (ourFCMGuid==0) + return rakPeerInterface->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS); + + return hostRakNetGuid; +} +bool FullyConnectedMesh2::IsHostSystem(void) const +{ + return GetHostSystem()==rakPeerInterface->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS); +} +void FullyConnectedMesh2::GetHostOrder(DataStructures::List &hostList) +{ + hostList.Clear(true, _FILE_AND_LINE_); + + if (ourFCMGuid==0 || fcm2ParticipantList.Size()==0) + { + hostList.Push(rakPeerInterface->GetMyGUID(), _FILE_AND_LINE_); + return; + } + + FCM2Participant fcm2; + fcm2.fcm2Guid=ourFCMGuid; + fcm2.rakNetGuid=rakPeerInterface->GetMyGUID(); + + DataStructures::OrderedList olist; + olist.Insert(fcm2, fcm2, true, _FILE_AND_LINE_); + for (unsigned int i=0; i < fcm2ParticipantList.Size(); i++) + olist.Insert(fcm2ParticipantList[i], fcm2ParticipantList[i], true, _FILE_AND_LINE_); + + for (unsigned int i=0; i < olist.Size(); i++) + { + hostList.Push(olist[i].rakNetGuid, _FILE_AND_LINE_); + } +} +bool FullyConnectedMesh2::IsConnectedHost(void) const +{ + return GetConnectedHost()==rakPeerInterface->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS); +} +void FullyConnectedMesh2::SetAutoparticipateConnections(bool b) +{ + autoParticipateConnections=b; +} +void FullyConnectedMesh2::ResetHostCalculation(void) +{ + hostRakNetGuid=UNASSIGNED_RAKNET_GUID; + startupTime=RakNet::GetTimeUS(); + totalConnectionCount=0; + ourFCMGuid=0; + for (unsigned int i=0; i < fcm2ParticipantList.Size(); i++) + SendFCMGuidRequest(fcm2ParticipantList[i].rakNetGuid); +} +bool FullyConnectedMesh2::AddParticipantInternal( RakNetGUID rakNetGuid, FCM2Guid theirFCMGuid ) +{ + for (unsigned int i=0; i < fcm2ParticipantList.Size(); i++) + { + if (fcm2ParticipantList[i].rakNetGuid==rakNetGuid) + { + if (theirFCMGuid!=0) + fcm2ParticipantList[i].fcm2Guid=theirFCMGuid; + return false; + } + } + + FCM2Participant participant; + participant.rakNetGuid=rakNetGuid; + participant.fcm2Guid=theirFCMGuid; + fcm2ParticipantList.Push(participant,_FILE_AND_LINE_); + + SendFCMGuidRequest(rakNetGuid); + + return true; +} +void FullyConnectedMesh2::AddParticipant( RakNetGUID rakNetGuid ) +{ + if (rakPeerInterface->GetConnectionState(rakPeerInterface->GetSystemAddressFromGuid(rakNetGuid))!=IS_CONNECTED) + { +#ifdef DEBUG_FCM2 + printf("AddParticipant to %s failed (not connected)\n", rakNetGuid.ToString()); +#endif + return; + } + + AddParticipantInternal(rakNetGuid,0); +} +void FullyConnectedMesh2::GetParticipantList(DataStructures::List &participantList) +{ + participantList.Clear(true, _FILE_AND_LINE_); + unsigned int i; + for (i=0; i < fcm2ParticipantList.Size(); i++) + participantList.Push(fcm2ParticipantList[i].rakNetGuid, _FILE_AND_LINE_); +} +PluginReceiveResult FullyConnectedMesh2::OnReceive(Packet *packet) +{ + switch (packet->data[0]) + { + case ID_REMOTE_NEW_INCOMING_CONNECTION: + { + if (connectOnNewRemoteConnections) + ConnectToRemoteNewIncomingConnections(packet); + } + break; + case ID_FCM2_REQUEST_FCMGUID: + OnRequestFCMGuid(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + case ID_FCM2_RESPOND_CONNECTION_COUNT: + OnRespondConnectionCount(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + case ID_FCM2_INFORM_FCMGUID: + OnInformFCMGuid(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + case ID_FCM2_UPDATE_MIN_TOTAL_CONNECTION_COUNT: + OnUpdateMinTotalConnectionCount(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + case ID_FCM2_NEW_HOST: + if (packet->wasGeneratedLocally==false) + return RR_STOP_PROCESSING_AND_DEALLOCATE; + break; + } + return RR_CONTINUE_PROCESSING; +} +void FullyConnectedMesh2::OnRakPeerStartup(void) +{ + Clear(); + startupTime=RakNet::GetTimeUS(); +} +void FullyConnectedMesh2::OnAttach(void) +{ + Clear(); + // In case Startup() was called first + if (rakPeerInterface->IsActive()) + startupTime=RakNet::GetTimeUS(); +} +void FullyConnectedMesh2::OnRakPeerShutdown(void) +{ + Clear(); + startupTime=0; +} +void FullyConnectedMesh2::OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ) +{ + (void) lostConnectionReason; + (void) systemAddress; + (void) rakNetGUID; + + unsigned int idx; + for (idx=0; idx < fcm2ParticipantList.Size(); idx++) + { + if (fcm2ParticipantList[idx].rakNetGuid==rakNetGUID) + { + fcm2ParticipantList[idx]=fcm2ParticipantList[fcm2ParticipantList.Size()-1]; +#ifdef DEBUG_FCM2 + printf("Popping participant %s\n", fcm2ParticipantList[fcm2ParticipantList.Size()-1].rakNetGuid.ToString()); +#endif + + fcm2ParticipantList.Pop(); + if (rakNetGUID==hostRakNetGuid && ourFCMGuid!=0) + { + if (fcm2ParticipantList.Size()==0) + { + hostRakNetGuid=rakPeerInterface->GetMyGUID(); + hostFCM2Guid=ourFCMGuid; + } + else + { + CalculateHost(&hostRakNetGuid, &hostFCM2Guid); + } + PushNewHost(hostRakNetGuid, rakNetGUID); + } + return; + } + } + +} +RakNet::TimeUS FullyConnectedMesh2::GetElapsedRuntime(void) +{ + RakNet::TimeUS curTime=RakNet::GetTimeUS(); + if (curTime>startupTime) + return curTime-startupTime; + else + return 0; +} +void FullyConnectedMesh2::OnNewConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, bool isIncoming) +{ + (void) isIncoming; + (void) rakNetGUID; + (void) systemAddress; + + if (autoParticipateConnections) + AddParticipant(rakNetGUID); +} +void FullyConnectedMesh2::Clear(void) +{ + fcm2ParticipantList.Clear(false, _FILE_AND_LINE_); + + totalConnectionCount=0; + ourFCMGuid=0; + lastPushedHost=UNASSIGNED_RAKNET_GUID; +} +void FullyConnectedMesh2::PushNewHost(const RakNetGUID &guid, RakNetGUID oldHost) +{ + Packet *p = AllocatePacketUnified(sizeof(MessageID)+sizeof(oldHost)); + RakNet::BitStream bs(p->data,p->length,false); + bs.SetWriteOffset(0); + bs.Write((MessageID)ID_FCM2_NEW_HOST); + bs.Write(oldHost); + p->systemAddress=rakPeerInterface->GetSystemAddressFromGuid(guid); + p->systemAddress.systemIndex=(SystemIndex)-1; + p->guid=guid; + p->wasGeneratedLocally=true; + rakPeerInterface->PushBackPacket(p, true); + + lastPushedHost=guid; +} +void FullyConnectedMesh2::SendFCMGuidRequest(RakNetGUID rakNetGuid) +{ + if (rakNetGuid==rakPeerInterface->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS)) + return; + + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_FCM2_REQUEST_FCMGUID); + if (ourFCMGuid==0) + { + bsOut.Write(false); + bsOut.Write(GetElapsedRuntime()); + } + else + { + bsOut.Write(true); + bsOut.Write(totalConnectionCount); + bsOut.Write(ourFCMGuid); + } + rakPeerInterface->Send(&bsOut,HIGH_PRIORITY,RELIABLE_ORDERED,0,rakNetGuid,false); +} +void FullyConnectedMesh2::SendOurFCMGuid(SystemAddress addr) +{ + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_FCM2_INFORM_FCMGUID); + RakAssert(ourFCMGuid!=0); // Can't inform others of our FCM2Guid if it's unset! + bsOut.Write(ourFCMGuid); + bsOut.Write(totalConnectionCount); + rakPeerInterface->Send(&bsOut,HIGH_PRIORITY,RELIABLE_ORDERED,0,addr,false); +} +void FullyConnectedMesh2::SendConnectionCountResponse(SystemAddress addr, unsigned int responseTotalConnectionCount) +{ + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_FCM2_RESPOND_CONNECTION_COUNT); + bsOut.Write(responseTotalConnectionCount); + rakPeerInterface->Send(&bsOut,HIGH_PRIORITY,RELIABLE_ORDERED,0,addr,false); +} +void FullyConnectedMesh2::AssignOurFCMGuid(void) +{ + // Only assigned once ever + RakAssert(ourFCMGuid==0); + unsigned int randomNumber = randomMT(); + randomNumber ^= (unsigned int) (RakNet::GetTimeUS() & 0xFFFFFFFF); + randomNumber ^= (unsigned int) (rakPeerInterface->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS).g & 0xFFFFFFFF); + ourFCMGuid |= randomNumber; + uint64_t reponse64 = totalConnectionCount; + ourFCMGuid |= reponse64<<32; +} +void FullyConnectedMesh2::CalculateHost(RakNetGUID *rakNetGuid, FCM2Guid *fcm2Guid) +{ + // Can't calculate host without knowing our own + RakAssert(ourFCMGuid!=0); + + // Can't calculate host without being connected to anyone else + RakAssert(fcm2ParticipantList.Size()>0); + + // Return the lowest value of all FCM2Guid + FCM2Guid lowestFCMGuid=ourFCMGuid; + // SystemAddress associatedSystemAddress=UNASSIGNED_SYSTEM_ADDRESS; + RakNetGUID associatedRakNetGuid=rakPeerInterface->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS); + + unsigned int idx; + for (idx=0; idx < fcm2ParticipantList.Size(); idx++) + { + if (fcm2ParticipantList[idx].fcm2Guid!=0 && fcm2ParticipantList[idx].fcm2Guiddata,packet->length,false); + bsIn.IgnoreBytes(sizeof(MessageID)); + bool hasRemoteFCMGuid=false; + bsIn.Read(hasRemoteFCMGuid); + RakNet::TimeUS senderElapsedRuntime=0; + unsigned int remoteTotalConnectionCount=0; + FCM2Guid theirFCMGuid=0; + if (hasRemoteFCMGuid) + { + bsIn.Read(remoteTotalConnectionCount); + bsIn.Read(theirFCMGuid); + } + else + { + bsIn.Read(senderElapsedRuntime); + } + AddParticipantInternal(packet->guid,theirFCMGuid); + if (ourFCMGuid==0) + { + if (hasRemoteFCMGuid==false) + { + // Nobody has a fcmGuid + + RakNet::TimeUS ourElapsedRuntime = GetElapsedRuntime(); + if (ourElapsedRuntime>senderElapsedRuntime) + { + // We are probably host + SendConnectionCountResponse(packet->systemAddress, 2); + } + else + { + // They are probably host + SendConnectionCountResponse(packet->systemAddress, 1); + } + } + else + { + // They have a fcmGuid, we do not + IncrementTotalConnectionCount(remoteTotalConnectionCount+1); + + AssignOurFCMGuid(); + unsigned int idx; + for (idx=0; idx < fcm2ParticipantList.Size(); idx++) + SendOurFCMGuid(rakPeerInterface->GetSystemAddressFromGuid(fcm2ParticipantList[idx].rakNetGuid)); + } + } + else + { + if (hasRemoteFCMGuid==false) + { + // We have a fcmGuid they do not + SendConnectionCountResponse(packet->systemAddress, totalConnectionCount+1); + } + else + { + // We both have fcmGuids + IncrementTotalConnectionCount(remoteTotalConnectionCount); + + SendOurFCMGuid(packet->systemAddress); + } + } + CalculateAndPushHost(); +} +void FullyConnectedMesh2::OnRespondConnectionCount(Packet *packet) +{ + RakNet::BitStream bsIn(packet->data,packet->length,false); + bsIn.IgnoreBytes(sizeof(MessageID)); + unsigned int responseTotalConnectionCount; + bsIn.Read(responseTotalConnectionCount); + IncrementTotalConnectionCount(responseTotalConnectionCount); + bool wasAssigned; + if (ourFCMGuid==0) + { + wasAssigned=true; + AssignOurFCMGuid(); + } + else + wasAssigned=false; + + // 1 is returned to give us lower priority, but the actual minimum is 2 + IncrementTotalConnectionCount(2); + + if (wasAssigned==true) + { + unsigned int idx; + for (idx=0; idx < fcm2ParticipantList.Size(); idx++) + SendOurFCMGuid(rakPeerInterface->GetSystemAddressFromGuid(fcm2ParticipantList[idx].rakNetGuid)); + CalculateAndPushHost(); + } +} +void FullyConnectedMesh2::OnInformFCMGuid(Packet *packet) +{ + RakNet::BitStream bsIn(packet->data,packet->length,false); + bsIn.IgnoreBytes(sizeof(MessageID)); + + FCM2Guid theirFCMGuid; + unsigned int theirTotalConnectionCount; + bsIn.Read(theirFCMGuid); + bsIn.Read(theirTotalConnectionCount); + IncrementTotalConnectionCount(theirTotalConnectionCount); + + if (AddParticipantInternal(packet->guid,theirFCMGuid)) + { + // 1/19/2010 - Relay increased total connection count in case new participant only connects to part of the mesh + unsigned int idx; + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_FCM2_UPDATE_MIN_TOTAL_CONNECTION_COUNT); + bsOut.Write(totalConnectionCount); + for (idx=0; idx < fcm2ParticipantList.Size(); idx++) + { + if (packet->guid!=fcm2ParticipantList[idx].rakNetGuid) + rakPeerInterface->Send(&bsOut,HIGH_PRIORITY,RELIABLE_ORDERED,0,fcm2ParticipantList[idx].rakNetGuid,false); + } + } + + if (ourFCMGuid==0) + { + AssignOurFCMGuid(); + unsigned int idx; + for (idx=0; idx < fcm2ParticipantList.Size(); idx++) + SendOurFCMGuid(rakPeerInterface->GetSystemAddressFromGuid(fcm2ParticipantList[idx].rakNetGuid)); + } + + CalculateAndPushHost(); +} +void FullyConnectedMesh2::OnUpdateMinTotalConnectionCount(Packet *packet) +{ + RakNet::BitStream bsIn(packet->data,packet->length,false); + bsIn.IgnoreBytes(sizeof(MessageID)); + unsigned int newMin; + bsIn.Read(newMin); + IncrementTotalConnectionCount(newMin); +} +void FullyConnectedMesh2::GetParticipantCount(unsigned int *participantListSize) const +{ + *participantListSize=fcm2ParticipantList.Size(); +} + +unsigned int FullyConnectedMesh2::GetParticipantCount(void) const +{ + return fcm2ParticipantList.Size(); +} +void FullyConnectedMesh2::CalculateAndPushHost(void) +{ + RakNetGUID newHostGuid; + FCM2Guid newFcmGuid; + if (ParticipantListComplete()) + { + CalculateHost(&newHostGuid, &newFcmGuid); + if (newHostGuid!=lastPushedHost) + { + hostRakNetGuid=newHostGuid; + hostFCM2Guid=newFcmGuid; + PushNewHost(hostRakNetGuid, hostRakNetGuid); + } + } +} +bool FullyConnectedMesh2::ParticipantListComplete(void) +{ + for (unsigned int i=0; i < fcm2ParticipantList.Size(); i++) + { + if (fcm2ParticipantList[i].fcm2Guid==0) + return false; + } + return true; +} +void FullyConnectedMesh2::IncrementTotalConnectionCount(unsigned int i) +{ + if (i>totalConnectionCount) + { + totalConnectionCount=i; + // printf("totalConnectionCount=%i\n",i); + } +} +void FullyConnectedMesh2::SetConnectOnNewRemoteConnection(bool attemptConnection, RakNet::RakString pw) +{ + connectOnNewRemoteConnections=attemptConnection; + connectionPassword=pw; +} + +void FullyConnectedMesh2::ConnectToRemoteNewIncomingConnections(Packet *packet) +{ + unsigned int count; + RakNet::BitStream bsIn(packet->data, packet->length, false); + bsIn.IgnoreBytes(sizeof(MessageID)); + bsIn.Read(count); + SystemAddress remoteAddress; + RakNetGUID remoteGuid; + char str[64]; + for (unsigned int i=0; i < count; i++) + { + bsIn.Read(remoteAddress); + bsIn.Read(remoteGuid); + remoteAddress.ToString(false,str); + rakPeerInterface->Connect(str,remoteAddress.GetPort(),connectionPassword.C_String(),(int) connectionPassword.GetLength()); + } +} +unsigned int FullyConnectedMesh2::GetTotalConnectionCount(void) const +{ + return totalConnectionCount; +} + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FullyConnectedMesh2.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FullyConnectedMesh2.h new file mode 100644 index 0000000..a8f94b1 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/FullyConnectedMesh2.h @@ -0,0 +1,253 @@ +/// \file FullyConnectedMesh2.h +/// \brief Fully connected mesh plugin, revision 2. +/// \details This will connect RakPeer to all connecting peers, and all peers the connecting peer knows about. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_FullyConnectedMesh2==1 + +#ifndef __FULLY_CONNECTED_MESH_2_H +#define __FULLY_CONNECTED_MESH_2_H + +#include "PluginInterface2.h" +#include "RakMemoryOverride.h" +#include "NativeTypes.h" +#include "DS_List.h" +#include "RakString.h" + +typedef int64_t FCM2Guid; + +namespace RakNet +{ +/// Forward declarations +class RakPeerInterface; + +/// \brief Fully connected mesh plugin, revision 2 +/// \details This will connect RakPeer to all connecting peers, and all peers the connecting peer knows about.
+/// It will also calculate which system has been running longest, to find out who should be host, if you need one system to act as a host +/// \pre You must also install the ConnectionGraph2 plugin in order to use SetConnectOnNewRemoteConnection() +/// \ingroup FULLY_CONNECTED_MESH_GROUP +class RAK_DLL_EXPORT FullyConnectedMesh2 : public PluginInterface2 +{ +public: + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(FullyConnectedMesh2) + + FullyConnectedMesh2(); + virtual ~FullyConnectedMesh2(); + + /// When the message ID_REMOTE_NEW_INCOMING_CONNECTION arrives, we try to connect to that system + /// If \a attemptConnection is false, you can manually connect to all systems listed in ID_REMOTE_NEW_INCOMING_CONNECTION with ConnectToRemoteNewIncomingConnections() + /// \note This will not work on any console. It will also not work if NAT punchthrough is needed. Generally, this should be false and you should connect manually. It is here for legacy reasons. + /// \param[in] attemptConnection If true, we try to connect to any systems we are notified about with ID_REMOTE_NEW_INCOMING_CONNECTION, which comes from the ConnectionGraph2 plugin. Defaults to true. + /// \param[in] pw The password to use to connect with. Only used if \a attemptConnection is true + void SetConnectOnNewRemoteConnection(bool attemptConnection, RakNet::RakString pw); + + /// \brief The connected host is whichever system we are connected to that has been running the longest. + /// \details Will return UNASSIGNED_RAKNET_GUID if we are not connected to anyone, or if we are connected and are calculating the host + /// If includeCalculating is true, will return the estimated calculated host as long as the calculation is nearly complete + /// includeCalculating should be true if you are taking action based on another system becoming host, because not all host calculations may complete at the exact same time + /// \sa ConnectionGraph2::GetLowestAveragePingSystem() . If you need one system in the peer to peer group to relay data, have the host call this function after host migration, and use that system + /// \return System address of whichever system is host. + RakNetGUID GetConnectedHost(void) const; + SystemAddress GetConnectedHostAddr(void) const; + + /// \return System address of whichever system is host. Always returns something, even though it may be our own system. + RakNetGUID GetHostSystem(void) const; + + /// \return If our system is host + bool IsHostSystem(void) const; + + /// Get the list of connected systems, from oldest connected to newest + /// This is also the order that the hosts will be chosen in + void GetHostOrder(DataStructures::List &hostList); + + /// \param[in] includeCalculating If true, and we are currently calculating a new host, return the new host if the calculation is nearly complete + /// \return If our system is host + bool IsConnectedHost(void) const; + + /// \brief Automatically add new connections to the fully connected mesh. + /// Each remote system that you want to check should be added as a participant, either through SetAutoparticipateConnections() or by calling this function + /// \details Defaults to true. + /// \param[in] b As stated + void SetAutoparticipateConnections(bool b); + + /// Clear our own host order, and recalculate as if we had just reconnected + /// Call this to reset the running time of the host just before joining/creating a game room for networking + void ResetHostCalculation(void); + + /// \brief if SetAutoparticipateConnections() is called with false, then you need to use AddParticipant before these systems will be added to the mesh + /// FullyConnectedMesh2 will track who is the who host among a fully connected mesh of participants + /// Each remote system that you want to check should be added as a participant, either through SetAutoparticipateConnections() or by calling this function + /// \param[in] participant The new participant + void AddParticipant(RakNetGUID rakNetGuid); + + /// Get the participants added with AddParticipant() + /// \param[out] participantList Participants added with AddParticipant(); + void GetParticipantList(DataStructures::List &participantList); + + /// Connect to all systems from ID_REMOTE_NEW_INCOMING_CONNECTION + /// You can call this if SetConnectOnNewRemoteConnection is false + /// \param[in] packet The packet containing ID_REMOTE_NEW_INCOMING_CONNECTION + /// \param[in] connectionPassword Password passed to RakPeerInterface::Connect() + /// \param[in] connectionPasswordLength Password length passed to RakPeerInterface::Connect() + void ConnectToRemoteNewIncomingConnections(Packet *packet); + + /// \brief Clear all memory and reset everything + void Clear(void); + + unsigned int GetParticipantCount(void) const; + void GetParticipantCount(unsigned int *participantListSize) const; + /// \internal + RakNet::TimeUS GetElapsedRuntime(void); + + /// \internal + virtual PluginReceiveResult OnReceive(Packet *packet); + /// \internal + virtual void OnRakPeerStartup(void); + /// \internal + virtual void OnAttach(void); + /// \internal + virtual void OnRakPeerShutdown(void); + /// \internal + virtual void OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ); + /// \internal + virtual void OnNewConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, bool isIncoming); + + /// \internal + struct FCM2Participant + { + FCM2Participant() {} + FCM2Participant(const FCM2Guid &_fcm2Guid, const RakNetGUID &_rakNetGuid) : fcm2Guid(_fcm2Guid), rakNetGuid(_rakNetGuid) {} + + // Low half is a random number. + // High half is the order we connected in (totalConnectionCount) + FCM2Guid fcm2Guid; + RakNetGUID rakNetGuid; + }; + + /// \internal for debugging + unsigned int GetTotalConnectionCount(void) const; + +protected: + void PushNewHost(const RakNetGUID &guid, RakNetGUID oldHost); + void SendOurFCMGuid(SystemAddress addr); + void SendFCMGuidRequest(RakNetGUID rakNetGuid); + void SendConnectionCountResponse(SystemAddress addr, unsigned int responseTotalConnectionCount); + void OnRequestFCMGuid(Packet *packet); + void OnRespondConnectionCount(Packet *packet); + void OnInformFCMGuid(Packet *packet); + void OnUpdateMinTotalConnectionCount(Packet *packet); + void AssignOurFCMGuid(void); + void CalculateHost(RakNetGUID *rakNetGuid, FCM2Guid *fcm2Guid); + bool AddParticipantInternal( RakNetGUID rakNetGuid, FCM2Guid theirFCMGuid ); + void CalculateAndPushHost(void); + bool ParticipantListComplete(void); + void IncrementTotalConnectionCount(unsigned int i); + + // Used to track how long RakNet has been running. This is so we know who has been running longest + RakNet::TimeUS startupTime; + + // Option for SetAutoparticipateConnections + bool autoParticipateConnections; + + // totalConnectionCount is roughly maintained across all systems, and increments by 1 each time a new system connects to the mesh + // It is always kept at the highest known value + // It is used as the high 4 bytes for new FCMGuids. This causes newer values of FCM2Guid to be higher than lower values. The lowest value is the host. + unsigned int totalConnectionCount; + + // Our own ourFCMGuid. Starts at unassigned (0). Assigned once we send ID_FCM2_REQUEST_FCMGUID and get back ID_FCM2_RESPOND_CONNECTION_COUNT + FCM2Guid ourFCMGuid; + + /// List of systems we know the FCM2Guid for + DataStructures::List fcm2ParticipantList; + + RakNetGUID lastPushedHost; + + // Optimization: Store last calculated host in these variables. + RakNetGUID hostRakNetGuid; + FCM2Guid hostFCM2Guid; + + RakNet::RakString connectionPassword; + bool connectOnNewRemoteConnections; +}; + +} // namespace RakNet + +/* +Startup() +ourFCMGuid=unknown +totalConnectionCount=0 +Set startupTime + +AddParticipant() +if (sender by guid is a participant) +return; +AddParticipantInternal(guid); +if (ourFCMGuid==unknown) +Send to that system a request for their fcmGuid, totalConnectionCount. Inform startupTime. +else +Send to that system a request for their fcmGuid. Inform total connection count, our fcmGuid + +OnRequestGuid() +if (sender by guid is not a participant) +{ + // They added us as a participant, but we didn't add them. This can be caused by lag where both participants are not added at the same time. + // It doesn't affect the outcome as long as we still process the data + AddParticipantInternal(guid); +} +if (ourFCMGuid==unknown) +{ + if (includedStartupTime) + { + // Nobody has a fcmGuid + + if (their startup time is greater than our startup time) + ReplyConnectionCount(1); + else + ReplyConnectionCount(2); + } + else + { + // They have a fcmGuid, we do not + + SetMaxTotalConnectionCount(remoteCount); + AssignTheirGuid() + GenerateOurGuid(); + SendOurGuid(all); + } +} +else +{ + if (includedStartupTime) + { + // We have a fcmGuid they do not + + ReplyConnectionCount(totalConnectionCount+1); + SendOurGuid(sender); + } + else + { + // We both have fcmGuids + + SetMaxTotalConnectionCount(remoteCount); + AssignTheirGuid(); + SendOurGuid(sender); + } +} + +OnReplyConnectionCount() +SetMaxTotalConnectionCount(remoteCount); +GenerateOurGuid(); +SendOurGuid(allParticipants); + +OnReceiveTheirGuid() +AssignTheirGuid() +*/ + +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/GetTime.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/GetTime.cpp new file mode 100644 index 0000000..deec092 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/GetTime.cpp @@ -0,0 +1,220 @@ +/// \file +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#if defined(_WIN32) +#include "WindowsIncludes.h" +// To call timeGetTime +// on Code::Blocks, this needs to be libwinmm.a instead +#pragma comment(lib, "Winmm.lib") +#endif + +#include "GetTime.h" + + + + +#if defined(_WIN32) +DWORD mProcMask; +DWORD mSysMask; +HANDLE mThread; + + + + + + + + + +#else +#include +#include +RakNet::TimeUS initialTime; +#endif + +static bool initialized=false; + +#if defined(GET_TIME_SPIKE_LIMIT) && GET_TIME_SPIKE_LIMIT>0 +#include "SimpleMutex.h" +RakNet::TimeUS lastNormalizedReturnedValue=0; +RakNet::TimeUS lastNormalizedInputValue=0; +/// This constraints timer forward jumps to 1 second, and does not let it jump backwards +/// See http://support.microsoft.com/kb/274323 where the timer can sometimes jump forward by hours or days +/// This also has the effect where debugging a sending system won't treat the time spent halted past 1 second as elapsed network time +RakNet::TimeUS NormalizeTime(RakNet::TimeUS timeIn) +{ + RakNet::TimeUS diff, lastNormalizedReturnedValueCopy; + static RakNet::SimpleMutex mutex; + + mutex.Lock(); + if (timeIn>=lastNormalizedInputValue) + { + diff = timeIn-lastNormalizedInputValue; + if (diff > GET_TIME_SPIKE_LIMIT) + lastNormalizedReturnedValue+=GET_TIME_SPIKE_LIMIT; + else + lastNormalizedReturnedValue+=diff; + } + else + lastNormalizedReturnedValue+=GET_TIME_SPIKE_LIMIT; + + lastNormalizedInputValue=timeIn; + lastNormalizedReturnedValueCopy=lastNormalizedReturnedValue; + mutex.Unlock(); + + return lastNormalizedReturnedValueCopy; +} +#endif // #if defined(GET_TIME_SPIKE_LIMIT) && GET_TIME_SPIKE_LIMIT>0 +RakNet::Time RakNet::GetTime( void ) +{ + return (RakNet::Time)(GetTimeUS()/1000); +} +RakNet::TimeMS RakNet::GetTimeMS( void ) +{ + return (RakNet::TimeMS)(GetTimeUS()/1000); +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#if defined(_WIN32) +RakNet::TimeUS GetTimeUS_Windows( void ) +{ + if ( initialized == false) + { + initialized = true; + + // Save the current process +#if !defined(_WIN32_WCE) + HANDLE mProc = GetCurrentProcess(); + + // Get the current Affinity +#if _MSC_VER >= 1400 && defined (_M_X64) + GetProcessAffinityMask(mProc, (PDWORD_PTR)&mProcMask, (PDWORD_PTR)&mSysMask); +#else + GetProcessAffinityMask(mProc, &mProcMask, &mSysMask); +#endif + mThread = GetCurrentThread(); + +#endif // _WIN32_WCE + } + + // 9/26/2010 In China running LuDaShi, QueryPerformanceFrequency has to be called every time because CPU clock speeds can be different + RakNet::TimeUS curTime; + LARGE_INTEGER PerfVal; + LARGE_INTEGER yo1; + + QueryPerformanceFrequency( &yo1 ); + QueryPerformanceCounter( &PerfVal ); + + __int64 quotient, remainder; + quotient=((PerfVal.QuadPart) / yo1.QuadPart); + remainder=((PerfVal.QuadPart) % yo1.QuadPart); + curTime = (RakNet::TimeUS) quotient*(RakNet::TimeUS)1000000 + (remainder*(RakNet::TimeUS)1000000 / yo1.QuadPart); + +#if defined(GET_TIME_SPIKE_LIMIT) && GET_TIME_SPIKE_LIMIT>0 + return NormalizeTime(curTime); +#else + return curTime; +#endif // #if defined(GET_TIME_SPIKE_LIMIT) && GET_TIME_SPIKE_LIMIT>0 +} +#elif defined(__GNUC__) || defined(__GCCXML__) || defined(__S3E__) +RakNet::TimeUS GetTimeUS_Linux( void ) +{ + timeval tp; + if ( initialized == false) + { + gettimeofday( &tp, 0 ); + initialized=true; + // I do this because otherwise RakNet::Time in milliseconds won't work as it will underflow when dividing by 1000 to do the conversion + initialTime = ( tp.tv_sec ) * (RakNet::TimeUS) 1000000 + ( tp.tv_usec ); + } + + // GCC + RakNet::TimeUS curTime; + gettimeofday( &tp, 0 ); + + curTime = ( tp.tv_sec ) * (RakNet::TimeUS) 1000000 + ( tp.tv_usec ); + +#if defined(GET_TIME_SPIKE_LIMIT) && GET_TIME_SPIKE_LIMIT>0 + return NormalizeTime(curTime - initialTime); +#else + return curTime - initialTime; +#endif // #if defined(GET_TIME_SPIKE_LIMIT) && GET_TIME_SPIKE_LIMIT>0 +} +#endif + +RakNet::TimeUS RakNet::GetTimeUS( void ) +{ + + + + + + +#if defined(_WIN32) + return GetTimeUS_Windows(); +#else + return GetTimeUS_Linux(); +#endif +} +bool RakNet::GreaterThan(RakNet::Time a, RakNet::Time b) +{ + // a > b? + const RakNet::Time halfSpan =(RakNet::Time) (((RakNet::Time)(const RakNet::Time)-1)/(RakNet::Time)2); + return b!=a && b-a>halfSpan; +} +bool RakNet::LessThan(RakNet::Time a, RakNet::Time b) +{ + // a < b? + const RakNet::Time halfSpan = ((RakNet::Time)(const RakNet::Time)-1)/(RakNet::Time)2; + return b!=a && b-a b? + extern RAK_DLL_EXPORT bool GreaterThan(RakNet::Time a, RakNet::Time b); + /// a < b? + extern RAK_DLL_EXPORT bool LessThan(RakNet::Time a, RakNet::Time b); +} + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Getche.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Getche.cpp new file mode 100644 index 0000000..6f8e420 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Getche.cpp @@ -0,0 +1,27 @@ + + +#if defined(_WIN32) +#include /* getche() */ +#elif defined(__S3E__) + +#else + +#include "Getche.h" + +char getche() +{ + + + struct termios oldt, + newt; + char ch; + tcgetattr( STDIN_FILENO, &oldt ); + newt = oldt; + newt.c_lflag &= ~( ICANON | ECHO ); + tcsetattr( STDIN_FILENO, TCSANOW, &newt ); + ch = getchar(); + tcsetattr( STDIN_FILENO, TCSANOW, &oldt ); + return ch; + +} +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Getche.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Getche.h new file mode 100644 index 0000000..dff2ac3 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Getche.h @@ -0,0 +1,11 @@ + + +#if defined(_WIN32) +#include /* getche() */ + +#else +#include +#include +#include +char getche(); +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Gets.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Gets.cpp new file mode 100644 index 0000000..be17d65 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Gets.cpp @@ -0,0 +1,25 @@ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +char * Gets ( char * str, int num ) +{ + fgets(str, num, stdin); + if (str[0]=='\n' || str[0]=='\r') + str[0]=0; + + size_t len=strlen(str); + if (len>0 && (str[len-1]=='\n' || str[len-1]=='\r')) + str[len-1]=0; + if (len>1 && (str[len-2]=='\n' || str[len-2]=='\r')) + str[len-2]=0; + + return str; +} + +#ifdef __cplusplus +} +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Gets.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Gets.h new file mode 100644 index 0000000..8925288 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Gets.h @@ -0,0 +1,14 @@ +#ifndef __GETS__H_ +#define __GETS__H_ + +#ifdef __cplusplus +extern "C" { +#endif + +char * Gets ( char * str, int num ); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/GridSectorizer.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/GridSectorizer.cpp new file mode 100644 index 0000000..3fb9870 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/GridSectorizer.cpp @@ -0,0 +1,191 @@ +#include "RakAssert.h" +#include "GridSectorizer.h" +//#include +#include + +GridSectorizer::GridSectorizer() +{ + grid=0; +} +GridSectorizer::~GridSectorizer() +{ + if (grid) + RakNet::OP_DELETE_ARRAY(grid, _FILE_AND_LINE_); +} +void GridSectorizer::Init(const float _maxCellWidth, const float _maxCellHeight, const float minX, const float minY, const float maxX, const float maxY) +{ + RakAssert(_maxCellWidth > 0.0f && _maxCellHeight > 0.0f); + if (grid) + RakNet::OP_DELETE_ARRAY(grid, _FILE_AND_LINE_); + + cellOriginX=minX; + cellOriginY=minY; + gridWidth=maxX-minX; + gridHeight=maxY-minY; + gridCellWidthCount=(int) ceil(gridWidth/_maxCellWidth); + gridCellHeightCount=(int) ceil(gridHeight/_maxCellHeight); + // Make the cells slightly smaller, so we allocate an extra unneeded cell if on the edge. This way we don't go outside the array on rounding errors. + cellWidth=gridWidth/gridCellWidthCount; + cellHeight=gridHeight/gridCellHeightCount; + invCellWidth = 1.0f / cellWidth; + invCellHeight = 1.0f / cellHeight; + +#ifdef _USE_ORDERED_LIST + grid = RakNet::OP_NEW>(gridCellWidthCount*gridCellHeightCount, _FILE_AND_LINE_ ); + DataStructures::OrderedList::IMPLEMENT_DEFAULT_COMPARISON(); +#else + grid = RakNet::OP_NEW_ARRAY >(gridCellWidthCount*gridCellHeightCount, _FILE_AND_LINE_ ); +#endif +} +void GridSectorizer::AddEntry(void *entry, const float minX, const float minY, const float maxX, const float maxY) +{ + RakAssert(cellWidth>0.0f); + RakAssert(minX < maxX && minY < maxY); + + int xStart, yStart, xEnd, yEnd, xCur, yCur; + xStart=WorldToCellXOffsetAndClamped(minX); + yStart=WorldToCellYOffsetAndClamped(minY); + xEnd=WorldToCellXOffsetAndClamped(maxX); + yEnd=WorldToCellYOffsetAndClamped(maxY); + + for (xCur=xStart; xCur <= xEnd; ++xCur) + { + for (yCur=yStart; yCur <= yEnd; ++yCur) + { +#ifdef _USE_ORDERED_LIST + grid[yCur*gridCellWidthCount+xCur].Insert(entry,entry, true); +#else + grid[yCur*gridCellWidthCount+xCur].Insert(entry, _FILE_AND_LINE_); +#endif + } + } +} +#ifdef _USE_ORDERED_LIST +void GridSectorizer::RemoveEntry(void *entry, const float minX, const float minY, const float maxX, const float maxY) +{ + RakAssert(cellWidth>0.0f); + RakAssert(minX <= maxX && minY <= maxY); + + int xStart, yStart, xEnd, yEnd, xCur, yCur; + xStart=WorldToCellXOffsetAndClamped(minX); + yStart=WorldToCellYOffsetAndClamped(minY); + xEnd=WorldToCellXOffsetAndClamped(maxX); + yEnd=WorldToCellYOffsetAndClamped(maxY); + + for (xCur=xStart; xCur <= xEnd; ++xCur) + { + for (yCur=yStart; yCur <= yEnd; ++yCur) + { + grid[yCur*gridCellWidthCount+xCur].RemoveIfExists(entry); + } + } +} +void GridSectorizer::MoveEntry(void *entry, const float sourceMinX, const float sourceMinY, const float sourceMaxX, const float sourceMaxY, + const float destMinX, const float destMinY, const float destMaxX, const float destMaxY) +{ + RakAssert(cellWidth>0.0f); + RakAssert(sourceMinX < sourceMaxX && sourceMinY < sourceMaxY); + RakAssert(destMinX < destMaxX && destMinY < destMaxY); + + if (PositionCrossesCells(sourceMinX, sourceMinY, destMinX, destMinY)==false && + PositionCrossesCells(destMinX, destMinY, destMinX, destMinY)==false) + return; + + int xStartSource, yStartSource, xEndSource, yEndSource; + int xStartDest, yStartDest, xEndDest, yEndDest; + int xCur, yCur; + xStartSource=WorldToCellXOffsetAndClamped(sourceMinX); + yStartSource=WorldToCellYOffsetAndClamped(sourceMinY); + xEndSource=WorldToCellXOffsetAndClamped(sourceMaxX); + yEndSource=WorldToCellYOffsetAndClamped(sourceMaxY); + + xStartDest=WorldToCellXOffsetAndClamped(destMinX); + yStartDest=WorldToCellYOffsetAndClamped(destMinY); + xEndDest=WorldToCellXOffsetAndClamped(destMaxX); + yEndDest=WorldToCellYOffsetAndClamped(destMaxY); + + // Remove source that is not in dest + for (xCur=xStartSource; xCur <= xEndSource; ++xCur) + { + for (yCur=yStartSource; yCur <= yEndSource; ++yCur) + { + if (xCur < xStartDest || xCur > xEndDest || + yCur < yStartDest || yCur > yEndDest) + { + grid[yCur*gridCellWidthCount+xCur].RemoveIfExists(entry); + } + } + } + + // Add dest that is not in source + for (xCur=xStartDest; xCur <= xEndDest; ++xCur) + { + for (yCur=yStartDest; yCur <= yEndDest; ++yCur) + { + if (xCur < xStartSource || xCur > xEndSource || + yCur < yStartSource || yCur > yEndSource) + { + grid[yCur*gridCellWidthCount+xCur].Insert(entry,entry, true); + } + } + } +} +#endif +void GridSectorizer::GetEntries(DataStructures::List& intersectionList, const float minX, const float minY, const float maxX, const float maxY) +{ +#ifdef _USE_ORDERED_LIST + DataStructures::OrderedList* cell; +#else + DataStructures::List* cell; +#endif + int xStart, yStart, xEnd, yEnd, xCur, yCur; + unsigned index; + xStart=WorldToCellXOffsetAndClamped(minX); + yStart=WorldToCellYOffsetAndClamped(minY); + xEnd=WorldToCellXOffsetAndClamped(maxX); + yEnd=WorldToCellYOffsetAndClamped(maxY); + + intersectionList.Clear(true, _FILE_AND_LINE_); + for (xCur=xStart; xCur <= xEnd; ++xCur) + { + for (yCur=yStart; yCur <= yEnd; ++yCur) + { + cell = grid+yCur*gridCellWidthCount+xCur; + for (index=0; index < cell->Size(); ++index) + intersectionList.Insert(cell->operator [](index), _FILE_AND_LINE_); + } + } +} +bool GridSectorizer::PositionCrossesCells(const float originX, const float originY, const float destinationX, const float destinationY) const +{ + return originX/cellWidth!=destinationX/cellWidth || originY/cellHeight!=destinationY/cellHeight; +} +int GridSectorizer::WorldToCellX(const float input) const +{ + return (int)((input-cellOriginX)*invCellWidth); +} +int GridSectorizer::WorldToCellY(const float input) const +{ + return (int)((input-cellOriginY)*invCellHeight); +} +int GridSectorizer::WorldToCellXOffsetAndClamped(const float input) const +{ + int cell=WorldToCellX(input); + cell = cell > 0 ? cell : 0; // __max(cell,0); + cell = gridCellWidthCount-1 < cell ? gridCellWidthCount-1 : cell; // __min(gridCellWidthCount-1, cell); + return cell; +} +int GridSectorizer::WorldToCellYOffsetAndClamped(const float input) const +{ + int cell=WorldToCellY(input); + cell = cell > 0 ? cell : 0; // __max(cell,0); + cell = gridCellHeightCount-1 < cell ? gridCellHeightCount-1 : cell; // __min(gridCellHeightCount-1, cell); + return cell; +} +void GridSectorizer::Clear(void) +{ + int cur; + int count = gridCellWidthCount*gridCellHeightCount; + for (cur=0; cur& intersectionList, const float minX, const float minY, const float maxX, const float maxY); + + void Clear(void); + +protected: + int WorldToCellX(const float input) const; + int WorldToCellY(const float input) const; + int WorldToCellXOffsetAndClamped(const float input) const; + int WorldToCellYOffsetAndClamped(const float input) const; + + // Returns true or false if a position crosses cells in the grid. If false, you don't need to move entries + bool PositionCrossesCells(const float originX, const float originY, const float destinationX, const float destinationY) const; + + float cellOriginX, cellOriginY; + float cellWidth, cellHeight; + float invCellWidth, invCellHeight; + float gridWidth, gridHeight; + int gridCellWidthCount, gridCellHeightCount; + + + // int gridWidth, gridHeight; + +#ifdef _USE_ORDERED_LIST + DataStructures::OrderedList* grid; +#else + DataStructures::List* grid; +#endif +}; + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/HTTPConnection.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/HTTPConnection.cpp new file mode 100644 index 0000000..78b6e1c --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/HTTPConnection.cpp @@ -0,0 +1,313 @@ +/// \file +/// \brief Contains HTTPConnection, used to communicate with web servers +/// +/// This file is part of RakNet Copyright 2008 Kevin Jenkins. +/// +/// Usage of RakNet is subject to the appropriate license agreement. +/// Creative Commons Licensees are subject to the +/// license found at +/// http://creativecommons.org/licenses/by-nc/2.5/ +/// Single application licensees are subject to the license found at +/// http://www.jenkinssoftware.com/SingleApplicationLicense.html +/// Custom license users are subject to the terms therein. +/// GPL license users are subject to 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. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_HTTPConnection==1 && _RAKNET_SUPPORT_TCPInterface==1 + +#include "TCPInterface.h" +#include "HTTPConnection.h" +#include "RakSleep.h" +#include "RakString.h" +#include "RakAssert.h" +#include +#include +#include +#include + +using namespace RakNet; + +STATIC_FACTORY_DEFINITIONS(HTTPConnection,HTTPConnection); + +HTTPConnection::HTTPConnection() : connectionState(CS_NONE) +{ + tcp=0; +} + +void HTTPConnection::Init(TCPInterface* _tcp, const char *_host, unsigned short _port) +{ + tcp=_tcp; + host=_host; + port=_port; +} + +void HTTPConnection::Post(const char *remote_path, const char *data, const char *_contentType) +{ + OutgoingCommand op; + op.contentType=_contentType; + op.data=data; + op.remotePath=remote_path; + op.isPost=true; + outgoingCommand.Push(op, _FILE_AND_LINE_ ); + //printf("Adding outgoing post\n"); +} + +void HTTPConnection::Get(const char *path) +{ + OutgoingCommand op; + op.remotePath=path; + op.isPost=false; + outgoingCommand.Push(op, _FILE_AND_LINE_ ); +} + +bool HTTPConnection::HasBadResponse(int *code, RakNet::RakString *data) +{ + if(badResponses.IsEmpty()) + return false; + + if (code) + *code = badResponses.Peek().code; + if (data) + *data = badResponses.Pop().data; + return true; +} +void HTTPConnection::CloseConnection() +{ + connectionState=CS_DISCONNECTING; +} +void HTTPConnection::Update(void) +{ + SystemAddress sa; + sa = tcp->HasCompletedConnectionAttempt(); + while (sa!=UNASSIGNED_SYSTEM_ADDRESS) + { +// printf("Connected\n"); + connectionState=CS_CONNECTED; + server=sa; + sa = tcp->HasCompletedConnectionAttempt(); + } + + sa = tcp->HasFailedConnectionAttempt(); + while (sa!=UNASSIGNED_SYSTEM_ADDRESS) + { + //printf("Failed connected\n"); + CloseConnection(); + sa = tcp->HasFailedConnectionAttempt(); + } + + sa = tcp->HasLostConnection(); + while (sa!=UNASSIGNED_SYSTEM_ADDRESS) + { + //printf("Lost connection\n"); + CloseConnection(); + sa = tcp->HasLostConnection(); + } + + + switch (connectionState) + { + case CS_NONE: + { + if (outgoingCommand.IsEmpty()) + return; + + //printf("Connecting\n"); + server = tcp->Connect(host, port, false); + connectionState = CS_CONNECTING; + } + break; + case CS_DISCONNECTING: + { + if (tcp->ReceiveHasPackets()==false) + { + if (incomingData.IsEmpty()==false) + { + results.Push(incomingData, _FILE_AND_LINE_ ); + } + incomingData.Clear(); + tcp->CloseConnection(server); + connectionState=CS_NONE; + } + } + break; + case CS_CONNECTING: + { + } + break; + case CS_CONNECTED: + { + //printf("Connected\n"); + if (outgoingCommand.IsEmpty()) + { + //printf("Closed connection (nothing to do)\n"); + CloseConnection(); + return; + } + +#if OPEN_SSL_CLIENT_SUPPORT==1 + tcp->StartSSLClient(server); +#endif + + //printf("Sending request\n"); + currentProcessingCommand = outgoingCommand.Pop(); + RakString request; + if (currentProcessingCommand.isPost) + { + request.Set("POST %s HTTP/1.0\r\n" + "Host: %s:%i\r\n" + "Content-Type: %s\r\n" + "Content-Length: %u\r\n" + "\r\n" + "%s", + currentProcessingCommand.remotePath.C_String(), + host.C_String(), + port, + currentProcessingCommand.contentType.C_String(), + (unsigned) currentProcessingCommand.data.GetLength(), + currentProcessingCommand.data.C_String()); + } + else + { + // request.Set("GET %s\r\n", host.C_String()); + // http://www.jenkinssoftware.com/forum/index.php?topic=4601.0;topicseen + request.Set("GET %s HTTP/1.0\r\n" + "Host: %s:%i\r\n" + "\r\n", + currentProcessingCommand.remotePath.C_String(), + host.C_String(), + port); + } + + // printf(request.C_String()); + // request.URLEncode(); + tcp->Send(request.C_String(), (unsigned int) request.GetLength(), server,false); + connectionState=CS_PROCESSING; + } + break; + case CS_PROCESSING: + { + } + } + +// if (connectionState==CS_PROCESSING && currentProcessingCommand.data.IsEmpty()==false) +// outgoingCommand.PushAtHead(currentProcessingCommand); +} +bool HTTPConnection::HasRead(void) const +{ + return results.IsEmpty()==false; +} +RakString HTTPConnection::Read(void) +{ + if (results.IsEmpty()) + return RakString(); + + RakNet::RakString resultStr = results.Pop(); + // const char *start_of_body = strstr(resultStr.C_String(), "\r\n\r\n"); + const char *start_of_body = strpbrk(resultStr.C_String(), "\001\002\003%"); + + if(start_of_body) + return RakNet::RakString::NonVariadic(start_of_body); + else + return resultStr; +} +SystemAddress HTTPConnection::GetServerAddress(void) const +{ + return server; +} +void HTTPConnection::ProcessTCPPacket(Packet *packet) +{ + RakAssert(packet); + + // read all the packets possible + if(packet->systemAddress == server) + { + if(incomingData.GetLength() == 0) + { + int response_code = atoi((char *)packet->data + strlen("HTTP/1.0 ")); + + if(response_code > 299) + { + badResponses.Push(BadResponse(packet->data, response_code), _FILE_AND_LINE_ ); + //printf("Closed connection (Bad response 2)\n"); + CloseConnection(); + return; + } + } + + RakNet::RakString incomingTemp = RakNet::RakString::NonVariadic((const char*) packet->data); + incomingTemp.URLDecode(); + incomingData += incomingTemp; + + // printf((const char*) packet->data); + // printf("\n"); + + RakAssert(strlen((char *)packet->data) == packet->length); // otherwise it contains Null bytes + + const char *start_of_body = strstr(incomingData, "\r\n\r\n"); + + // besides having the server close the connection, they may + // provide a length header and supply that many bytes + if( + // Why was start_of_body here? Makes the GET command fail + // start_of_body && + connectionState == CS_PROCESSING) + { + /* + // The stupid programmer that wrote this originally didn't think that just because the header contains this value doesn't mean you got the whole message + if (strstr((const char*) packet->data, "\r\nConnection: close\r\n")) + { + CloseConnection(); + } + else + { + */ + long length_of_headers; + if (start_of_body) + { + length_of_headers = (long)(start_of_body + 4 - incomingData.C_String()); + const char *length_header = strstr(incomingData, "\r\nLength: "); + + if(length_header) + { + long length = atol(length_header + 10) + length_of_headers; + + if((long) incomingData.GetLength() >= length) + { + //printf("Closed connection (Got all data due to length header)\n"); + CloseConnection(); + } + } + } + else + { + // No processing needed + } + + + //} + } + } +} + +bool HTTPConnection::IsBusy(void) const +{ + return connectionState != CS_NONE; +} + +int HTTPConnection::GetState(void) const +{ + return connectionState; +} + + +HTTPConnection::~HTTPConnection(void) +{ + if (tcp) + tcp->CloseConnection(server); +} + + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/HTTPConnection.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/HTTPConnection.h new file mode 100644 index 0000000..b2e3921 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/HTTPConnection.h @@ -0,0 +1,176 @@ +/// \file HTTPConnection.h +/// \brief Contains HTTPConnection, used to communicate with web servers +/// +/// This file is part of RakNet Copyright 2008 Kevin Jenkins. +/// +/// Usage of RakNet is subject to the appropriate license agreement. +/// Creative Commons Licensees are subject to the +/// license found at +/// http://creativecommons.org/licenses/by-nc/2.5/ +/// Single application licensees are subject to the license found at +/// http://www.jenkinssoftware.com/SingleApplicationLicense.html +/// Custom license users are subject to the terms therein. +/// GPL license users are subject to 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. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_HTTPConnection==1 && _RAKNET_SUPPORT_TCPInterface==1 + +#ifndef __HTTP_CONNECTION +#define __HTTP_CONNECTION + +#include "Export.h" +#include "RakString.h" +#include "RakMemoryOverride.h" +#include "RakNetTypes.h" +#include "DS_Queue.h" + +namespace RakNet +{ +/// Forward declarations +class TCPInterface; +struct SystemAddress; + +/// \brief Use HTTPConnection to communicate with a web server. +/// \details Start an instance of TCPInterface via the Start() command. +/// Instantiate a new instance of HTTPConnection, and associate TCPInterface with the class in the constructor. +/// Use Post() to send commands to the web server, and ProcessDataPacket() to update the connection with packets returned from TCPInterface that have the system address of the web server +/// This class will handle connecting and reconnecting as necessary. +/// +/// Note that only one Post() can be handled at a time. +class RAK_DLL_EXPORT HTTPConnection +{ +public: + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(HTTPConnection) + + /// Returns a HTTP object associated with this tcp connection + HTTPConnection(); + virtual ~HTTPConnection(); + + /// \pre tcp should already be started + void Init(TCPInterface *_tcp, const char *host, unsigned short port=80); + + /// Submit data to the HTTP server + /// HTTP only allows one request at a time per connection + /// + /// \pre IsBusy()==false + /// \param path the path on the remote server you want to POST to. For example "index.html" + /// \param data A NULL terminated string to submit to the server + /// \param contentType "Content-Type:" passed to post. + void Post(const char *path, const char *data, const char *_contentType="application/x-www-form-urlencoded"); + + /// Get a file from a webserver + /// \param path the path on the remote server you want to GET from. For example "index.html" + void Get(const char *path); + + /// Is there a Read result ready? + bool HasRead(void) const; + + /// Get one result from the server + /// \pre HasResult must return true + RakNet::RakString Read(void); + + /// Call periodically to do time-based updates + void Update(void); + + /// Returns the address of the server we are connected to + SystemAddress GetServerAddress(void) const; + + /// Process an HTTP data packet returned from TCPInterface + /// Returns true when we have gotten all the data from the HTTP server. + /// If this returns true then it's safe to Post() another request + /// Deallocate the packet as usual via TCPInterface + /// \param packet NULL or a packet associated with our host and port + void ProcessTCPPacket(Packet *packet); + + /// Results of HTTP requests. Standard response codes are < 999 + /// ( define HTTP codes and our internal codes as needed ) + enum ResponseCodes { NoBody=1001, OK=200, Deleted=1002 }; + + HTTPConnection& operator=(const HTTPConnection& rhs){(void) rhs; return *this;} + + /// Encapsulates a raw HTTP response and response code + struct BadResponse + { + public: + BadResponse() {code=0;} + + BadResponse(const unsigned char *_data, int _code) + : data((const char *)_data), code(_code) {} + + BadResponse(const char *_data, int _code) + : data(_data), code(_code) {} + + operator int () const { return code; } + + RakNet::RakString data; + int code; // ResponseCodes + }; + + /// Queued events of failed exchanges with the HTTP server + bool HasBadResponse(int *code, RakNet::RakString *data); + + /// Returns false if the connection is not doing anything else + bool IsBusy(void) const; + + /// \internal + int GetState(void) const; + + struct OutgoingCommand + { + RakNet::RakString remotePath; + RakNet::RakString data; + RakNet::RakString contentType; + bool isPost; + }; + + DataStructures::Queue outgoingCommand; + OutgoingCommand currentProcessingCommand; + +private: + SystemAddress server; + TCPInterface *tcp; + RakNet::RakString host; + unsigned short port; + DataStructures::Queue badResponses; + + enum ConnectionState + { + CS_NONE, + CS_DISCONNECTING, + CS_CONNECTING, + CS_CONNECTED, + CS_PROCESSING, + } connectionState; + + RakNet::RakString incomingData; + DataStructures::Queue results; + + void CloseConnection(); + + /* + enum { RAK_HTTP_INITIAL, + RAK_HTTP_STARTING, + RAK_HTTP_CONNECTING, + RAK_HTTP_ESTABLISHED, + RAK_HTTP_REQUEST_SENT, + RAK_HTTP_IDLE } state; + + RakNet::RakString outgoing, incoming, path, contentType; + void Process(Packet *packet); // the workhorse + + // this helps check the various status lists in TCPInterface + typedef SystemAddress (TCPInterface::*StatusCheckFunction)(void); + bool InList(StatusCheckFunction func); + */ + +}; + +} // namespace RakNet + +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/IncrementalReadInterface.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/IncrementalReadInterface.cpp new file mode 100644 index 0000000..238f8a9 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/IncrementalReadInterface.cpp @@ -0,0 +1,15 @@ +#include "IncrementalReadInterface.h" +#include + +using namespace RakNet; + +unsigned int IncrementalReadInterface::GetFilePart( const char *filename, unsigned int startReadBytes, unsigned int numBytesToRead, void *preallocatedDestination, FileListNodeContext context) +{ + FILE *fp = fopen(filename, "rb"); + if (fp==0) + return 0; + fseek(fp,startReadBytes,SEEK_SET); + unsigned int numRead = (unsigned int) fread(preallocatedDestination,1,numBytesToRead, fp); + fclose(fp); + return numRead; +} diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/IncrementalReadInterface.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/IncrementalReadInterface.h new file mode 100644 index 0000000..3f396e4 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/IncrementalReadInterface.h @@ -0,0 +1,28 @@ +#ifndef __INCREMENTAL_READ_INTERFACE_H +#define __INCREMENTAL_READ_INTERFACE_H + +#include "FileListNodeContext.h" +#include "Export.h" + +namespace RakNet +{ + +class RAK_DLL_EXPORT IncrementalReadInterface +{ +public: + IncrementalReadInterface() {} + virtual ~IncrementalReadInterface() {} + + /// Read part of a file into \a destination + /// Return the number of bytes written. Return 0 when file is done. + /// \param[in] filename Filename to read + /// \param[in] startReadBytes What offset from the start of the file to read from + /// \param[in] numBytesToRead How many bytes to read. This is also how many bytes have been allocated to preallocatedDestination + /// \param[out] preallocatedDestination Write your data here + /// \return The number of bytes read, or 0 if none + virtual unsigned int GetFilePart( const char *filename, unsigned int startReadBytes, unsigned int numBytesToRead, void *preallocatedDestination, FileListNodeContext context); +}; + +} // namespace RakNet + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/InternalPacket.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/InternalPacket.h new file mode 100644 index 0000000..790fbbe --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/InternalPacket.h @@ -0,0 +1,131 @@ +/// \file +/// \brief \b [Internal] A class which stores a user message, and all information associated with sending and receiving that message. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. +/// Creative Commons Licensees are subject to the +/// license found at +/// http://creativecommons.org/licenses/by-nc/2.5/ +/// Single application licensees are subject to the license found at +/// http://www.jenkinssoftware.com/SingleApplicationLicense.html +/// Custom license users are subject to the terms therein. +/// GPL license users are subject to 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. + +#ifndef __INTERNAL_PACKET_H +#define __INTERNAL_PACKET_H + +#include "PacketPriority.h" +#include "RakNetTypes.h" +#include "RakMemoryOverride.h" +#include "RakNetDefines.h" +#include "NativeTypes.h" +#include "RakNetDefines.h" +#if USE_SLIDING_WINDOW_CONGESTION_CONTROL!=1 +#include "CCRakNetUDT.h" +#else +#include "CCRakNetSlidingWindow.h" +#endif + +namespace RakNet { + +typedef uint16_t SplitPacketIdType; +typedef uint32_t SplitPacketIndexType; + +/// This is the counter used for holding packet numbers, so we can detect duplicate packets. It should be large enough that if the variables +/// Internally assumed to be 4 bytes, but written as 3 bytes in ReliabilityLayer::WriteToBitStreamFromInternalPacket +typedef uint24_t MessageNumberType; + +/// This is the counter used for holding ordered packet numbers, so we can detect out-of-order packets. It should be large enough that if the variables +/// were to wrap, the newly wrapped values would no longer be in use. Warning: Too large of a value wastes bandwidth! +typedef MessageNumberType OrderingIndexType; + +typedef RakNet::TimeUS RemoteSystemTimeType; + +struct InternalPacketFixedSizeTransmissionHeader +{ + /// A unique numerical identifier given to this user message. Used to identify reliable messages on the network + MessageNumberType reliableMessageNumber; + ///The ID used as identification for ordering messages. Also included in sequenced messages + OrderingIndexType orderingIndex; + // Used only with sequenced messages + OrderingIndexType sequencingIndex; + ///What ordering channel this packet is on, if the reliability type uses ordering channels + unsigned char orderingChannel; + ///The ID of the split packet, if we have split packets. This is the maximum number of split messages we can send simultaneously per connection. + SplitPacketIdType splitPacketId; + ///If this is a split packet, the index into the array of subsplit packets + SplitPacketIndexType splitPacketIndex; + ///The size of the array of subsplit packets + SplitPacketIndexType splitPacketCount;; + ///How many bits long the data is + BitSize_t dataBitLength; + ///What type of reliability algorithm to use with this packet + PacketReliability reliability; + // Not endian safe + // unsigned char priority : 3; + // unsigned char reliability : 5; +}; + +/// Used in InternalPacket when pointing to sharedDataBlock, rather than allocating itself +struct InternalPacketRefCountedData +{ + unsigned char *sharedDataBlock; + unsigned int refCount; +}; + +/// Holds a user message, and related information +/// Don't use a constructor or destructor, due to the memory pool I am using +struct InternalPacket : public InternalPacketFixedSizeTransmissionHeader +{ + /// Identifies the order in which this number was sent. Used locally + MessageNumberType messageInternalOrder; + /// Has this message number been assigned yet? We don't assign until the message is actually sent. + /// This fixes a bug where pre-determining message numbers and then sending a message on a different channel creates a huge gap. + /// This causes performance problems and causes those messages to timeout. + bool messageNumberAssigned; + /// Was this packet number used this update to track windowing drops or increases? Each packet number is only used once per update. +// bool allowWindowUpdate; + ///When this packet was created + RakNet::TimeUS creationTime; + ///The resendNext time to take action on this packet + RakNet::TimeUS nextActionTime; + // Size of the header when encoded into a bitstream + BitSize_t headerLength; + /// Buffer is a pointer to the actual data, assuming this packet has data at all + unsigned char *data; + /// How to alloc and delete the data member + enum AllocationScheme + { + /// Data is allocated using rakMalloc. Just free it + NORMAL, + + /// data points to a larger block of data, where the larger block is reference counted. internalPacketRefCountedData is used in this case + REF_COUNTED, + + /// If allocation scheme is STACK, data points to stackData and should not be deallocated + /// This is only used when sending. Received packets are deallocated in RakPeer + STACK + } allocationScheme; + InternalPacketRefCountedData *refCountedData; + /// How many attempts we made at sending this message +// unsigned char timesSent; + /// The priority level of this packet + PacketPriority priority; + /// If the reliability type requires a receipt, then return this number with it + uint32_t sendReceiptSerial; + + // Used for the resend queue + // Linked list implementation so I can remove from the list via a pointer, without finding it in the list + InternalPacket *resendPrev, *resendNext,*unreliablePrev,*unreliableNext; + + unsigned char stackData[128]; +}; + +} // namespace RakNet + +#endif + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Itoa.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Itoa.cpp new file mode 100644 index 0000000..0d8a7ae --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Itoa.cpp @@ -0,0 +1,52 @@ +#ifdef __cplusplus +extern "C" { +#endif + +// Fast itoa from http://www.jb.man.ac.uk/~slowe/cpp/itoa.html for Linux since it seems like Linux doesn't support this function. +// I modified it to remove the std dependencies. +char* Itoa( int value, char* result, int base ) + { + // check that the base if valid + if (base < 2 || base > 16) { *result = 0; return result; } + char* out = result; + int quotient = value; + + int absQModB; + + do { + // KevinJ - get rid of this dependency + //*out = "0123456789abcdef"[ std::abs( quotient % base ) ]; + absQModB=quotient % base; + if (absQModB < 0) + absQModB=-absQModB; + *out = "0123456789abcdef"[ absQModB ]; + ++out; + quotient /= base; + } while ( quotient ); + + // Only apply negative sign for base 10 + if ( value < 0 && base == 10) *out++ = '-'; + + // KevinJ - get rid of this dependency + // std::reverse( result, out ); + *out = 0; + + // KevinJ - My own reverse code + char *start = result; + char temp; + out--; + while (start < out) + { + temp=*start; + *start=*out; + *out=temp; + start++; + out--; + } + + return result; +} + +#ifdef __cplusplus +} +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Itoa.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Itoa.h new file mode 100644 index 0000000..d7eb6a3 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Itoa.h @@ -0,0 +1,15 @@ +#ifndef __RAK_ITOA_H +#define __RAK_ITOA_H + +#ifdef __cplusplus +extern "C" { +#endif + +char* Itoa( int value, char* result, int base ); + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Kbhit.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Kbhit.h new file mode 100644 index 0000000..8568d35 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Kbhit.h @@ -0,0 +1,84 @@ +/***************************************************************************** +kbhit() and getch() for Linux/UNIX +Chris Giese http://my.execpc.com/~geezer +Release date: ? +This code is public domain (no copyright). +You can do whatever you want with it. +*****************************************************************************/ +#if defined(_WIN32) +#include /* kbhit(), getch() */ + +#else +#include /* struct timeval, select() */ +/* ICANON, ECHO, TCSANOW, struct termios */ +#include /* tcgetattr(), tcsetattr() */ +#include /* atexit(), exit() */ +#include /* read() */ +#include /* printf() */ +#include /* memcpy */ + +static struct termios g_old_kbd_mode; +/***************************************************************************** +*****************************************************************************/ +static void cooked(void) +{ + tcsetattr(0, TCSANOW, &g_old_kbd_mode); +} +/***************************************************************************** +*****************************************************************************/ +static void raw(void) +{ + static char init; +/**/ + struct termios new_kbd_mode; + + if(init) + return; +/* put keyboard (stdin, actually) in raw, unbuffered mode */ + tcgetattr(0, &g_old_kbd_mode); + memcpy(&new_kbd_mode, &g_old_kbd_mode, sizeof(struct termios)); + new_kbd_mode.c_lflag &= ~(ICANON /*| ECHO */ ); + new_kbd_mode.c_cc[VTIME] = 0; + new_kbd_mode.c_cc[VMIN] = 1; + tcsetattr(0, TCSANOW, &new_kbd_mode); +/* when we exit, go back to normal, "cooked" mode */ + atexit(cooked); + + init = 1; +} +/***************************************************************************** +*****************************************************************************/ +static int kbhit(void) +{ + struct timeval timeout; + fd_set read_handles; + int status; + + raw(); +/* check stdin (fd 0) for activity */ + FD_ZERO(&read_handles); + FD_SET(0, &read_handles); + timeout.tv_sec = timeout.tv_usec = 0; + status = select(0 + 1, &read_handles, NULL, NULL, &timeout); + if(status < 0) + { + printf("select() failed in kbhit()\n"); + exit(1); + } + return status; +} +/***************************************************************************** +*****************************************************************************/ +static int getch(void) +{ + unsigned char temp; + + raw(); +/* stdin = fd 0 */ + if(read(0, &temp, 1) != 1) + return 0; + return temp; +} +#endif + + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/LinuxStrings.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/LinuxStrings.cpp new file mode 100644 index 0000000..93c8491 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/LinuxStrings.cpp @@ -0,0 +1,26 @@ +#if (defined(__GNUC__) || defined(__ARMCC_VERSION) || defined(__GCCXML__) || defined(__S3E__)) && !defined(_WIN32) +#include +#ifndef _stricmp +int _stricmp(const char* s1, const char* s2) +{ + return strcasecmp(s1,s2); +} +#endif +int _strnicmp(const char* s1, const char* s2, size_t n) +{ + return strncasecmp(s1,s2,n); +} +#ifndef __APPLE__ +char *_strlwr(char * str ) +{ + if (str==0) + return 0; + for (int i=0; str[i]; i++) + { + if (str[i]>='A' && str[i]<='Z') + str[i]+='a'-'A'; + } + return str; +} +#endif +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/LinuxStrings.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/LinuxStrings.h new file mode 100644 index 0000000..f92b444 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/LinuxStrings.h @@ -0,0 +1,26 @@ +#ifndef _GCC_WIN_STRINGS +#define _GCC_WIN_STRINGS + + + + + + + + + + #if (defined(__GNUC__) || defined(__GCCXML__) || defined(__S3E__)) && !defined(_WIN32) + #ifndef _stricmp + int _stricmp(const char* s1, const char* s2); + #endif + int _strnicmp(const char* s1, const char* s2, size_t n); +#ifndef __APPLE__ + char *_strlwr(char * str ); //this won't compile on OSX for some reason +#endif + #ifndef _vsnprintf + #define _vsnprintf vsnprintf + #endif + #endif + + +#endif // _GCC_WIN_STRINGS diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/LocklessTypes.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/LocklessTypes.cpp new file mode 100644 index 0000000..650320a --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/LocklessTypes.cpp @@ -0,0 +1,42 @@ +#include "LocklessTypes.h" + +using namespace RakNet; + +LocklessUint32_t::LocklessUint32_t() +{ + value=0; +} +LocklessUint32_t::LocklessUint32_t(uint32_t initial) +{ + value=initial; +} +uint32_t LocklessUint32_t::Increment(void) +{ +#ifdef _WIN32 + return (uint32_t) InterlockedIncrement(&value); +#elif defined(ANDROID) || defined(__S3E__) + uint32_t v; + mutex.Lock(); + ++value; + v=value; + mutex.Unlock(); + return v; +#else + return __sync_fetch_and_add (&value, (uint32_t) 1); +#endif +} +uint32_t LocklessUint32_t::Decrement(void) +{ +#ifdef _WIN32 + return (uint32_t) InterlockedDecrement(&value); +#elif defined(ANDROID) || defined(__S3E__) + uint32_t v; + mutex.Lock(); + --value; + v=value; + mutex.Unlock(); + return v; +#else + return __sync_fetch_and_add (&value, (uint32_t) -1); +#endif +} diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/LocklessTypes.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/LocklessTypes.h new file mode 100644 index 0000000..36902a6 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/LocklessTypes.h @@ -0,0 +1,40 @@ +#ifndef __LOCKLESS_TYPES_H +#define __LOCKLESS_TYPES_H + +#include "Export.h" +#include "NativeTypes.h" +#include "WindowsIncludes.h" +#if defined(ANDROID) || defined(__S3E__) +// __sync_fetch_and_add not supported apparently +#include "SimpleMutex.h" +#endif + +namespace RakNet +{ + +class RAK_DLL_EXPORT LocklessUint32_t +{ +public: + LocklessUint32_t(); + explicit LocklessUint32_t(uint32_t initial); + // Returns variable value after changing it + uint32_t Increment(void); + // Returns variable value after changing it + uint32_t Decrement(void); + volatile uint32_t GetValue(void) const {return value;} + +protected: +#ifdef _WIN32 + volatile LONG value; +#elif defined(ANDROID) || defined(__S3E__) + // __sync_fetch_and_add not supported apparently + SimpleMutex mutex; + uint32_t value; +#else + volatile uint32_t value; +#endif +}; + +}; + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/LogCommandParser.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/LogCommandParser.cpp new file mode 100644 index 0000000..c6bbe77 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/LogCommandParser.cpp @@ -0,0 +1,279 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_LogCommandParser==1 + +#include "LogCommandParser.h" +#include "TransportInterface.h" + +#include + +#include +#include +#include + +#include "LinuxStrings.h" + +#ifdef _MSC_VER +#pragma warning( push ) +#endif + +using namespace RakNet; + +STATIC_FACTORY_DEFINITIONS(LogCommandParser,LogCommandParser); + +LogCommandParser::LogCommandParser() +{ + RegisterCommand(CommandParserInterface::VARIABLE_NUMBER_OF_PARAMETERS,"Subscribe","[] - Subscribes to a named channel, or all channels"); + RegisterCommand(CommandParserInterface::VARIABLE_NUMBER_OF_PARAMETERS,"Unsubscribe","[] - Unsubscribes from a named channel, or all channels"); + memset(channelNames,0,sizeof(channelNames)); +} +LogCommandParser::~LogCommandParser() +{ +} +bool LogCommandParser::OnCommand(const char *command, unsigned numParameters, char **parameterList, TransportInterface *transport, const SystemAddress &systemAddress, const char *originalString) +{ + (void) originalString; + + if (strcmp(command, "Subscribe")==0) + { + unsigned channelIndex; + if (numParameters==0) + { + Subscribe(systemAddress, 0); + transport->Send(systemAddress, "Subscribed to all channels.\r\n"); + } + else if (numParameters==1) + { + if ((channelIndex=Subscribe(systemAddress, parameterList[0]))!=(unsigned)-1) + { + transport->Send(systemAddress, "You are now subscribed to channel %s.\r\n", channelNames[channelIndex]); + } + else + { + transport->Send(systemAddress, "Cannot find channel %s.\r\n", parameterList[0]); + PrintChannels(systemAddress, transport); + } + } + else + { + transport->Send(systemAddress, "Subscribe takes either 0 or 1 parameters.\r\n"); + } + } + else if (strcmp(command, "Unsubscribe")==0) + { + unsigned channelIndex; + if (numParameters==0) + { + Unsubscribe(systemAddress, 0); + transport->Send(systemAddress, "Unsubscribed from all channels.\r\n"); + } + else if (numParameters==1) + { + if ((channelIndex=Unsubscribe(systemAddress, parameterList[0]))!=(unsigned)-1) + { + transport->Send(systemAddress, "You are now unsubscribed from channel %s.\r\n", channelNames[channelIndex]); + } + else + { + transport->Send(systemAddress, "Cannot find channel %s.\r\n", parameterList[0]); + PrintChannels(systemAddress, transport); + } + } + else + { + transport->Send(systemAddress, "Unsubscribe takes either 0 or 1 parameters.\r\n"); + } + } + + return true; +} +const char *LogCommandParser::GetName(void) const +{ + return "Logger"; +} +void LogCommandParser::SendHelp(TransportInterface *transport, const SystemAddress &systemAddress) +{ + transport->Send(systemAddress, "The logger will accept user log data via the Log(...) function.\r\n"); + transport->Send(systemAddress, "Each log is associated with a named channel.\r\n"); + transport->Send(systemAddress, "You can subscribe to or unsubscribe from named channels.\r\n"); + PrintChannels(systemAddress, transport); +} +void LogCommandParser::AddChannel(const char *channelName) +{ + unsigned channelIndex=0; + channelIndex = GetChannelIndexFromName(channelName); + // Each channel can only be added once. + RakAssert(channelIndex==(unsigned)-1); + + unsigned i; + for (i=0; i < 32; i++) + { + if (channelNames[i]==0) + { + // Assuming a persistent static string. + channelNames[i]=channelName; + return; + } + } + + // No more available channels - max 32 with this implementation where I save subscribed channels with bit operations + RakAssert(0); +} +void LogCommandParser::WriteLog(const char *channelName, const char *format, ...) +{ + if (channelName==0 || format==0) + return; + + unsigned channelIndex; + channelIndex = GetChannelIndexFromName(channelName); + if (channelIndex==(unsigned)-1) + { + AddChannel(channelName); + } + + char text[REMOTE_MAX_TEXT_INPUT]; + va_list ap; + va_start(ap, format); + _vsnprintf(text, REMOTE_MAX_TEXT_INPUT, format, ap); + va_end(ap); + text[REMOTE_MAX_TEXT_INPUT-1]=0; + + // Make sure that text ends in \r\n + int textLen; + textLen=(int)strlen(text); + if (textLen==0) + return; + if (text[textLen-1]=='\n') + { + text[textLen-1]=0; + } + if (textLen < REMOTE_MAX_TEXT_INPUT-4) + strcat(text, "\r\n"); + else + { + text[textLen-3]='\r'; + text[textLen-2]='\n'; + text[textLen-1]=0; + } + + // For each user that subscribes to this channel, send to them. + unsigned i; + for (i=0; i < remoteUsers.Size(); i++) + { + if (remoteUsers[i].channels & (1 << channelIndex)) + { + trans->Send(remoteUsers[i].systemAddress, text); + } + } +} +void LogCommandParser::PrintChannels(const SystemAddress &systemAddress, TransportInterface *transport) const +{ + unsigned i; + bool anyChannels=false; + transport->Send(systemAddress, "CHANNELS:\r\n"); + for (i=0; i < 32; i++) + { + if (channelNames[i]) + { + transport->Send(systemAddress, "%i. %s\r\n", i+1,channelNames[i]); + anyChannels=true; + } + } + if (anyChannels==false) + transport->Send(systemAddress, "None.\r\n"); +} +void LogCommandParser::OnNewIncomingConnection(const SystemAddress &systemAddress, TransportInterface *transport) +{ + (void) systemAddress; + (void) transport; +} +void LogCommandParser::OnConnectionLost(const SystemAddress &systemAddress, TransportInterface *transport) +{ + (void) transport; + Unsubscribe(systemAddress, 0); +} +unsigned LogCommandParser::Unsubscribe(const SystemAddress &systemAddress, const char *channelName) +{ + unsigned i; + for (i=0; i < remoteUsers.Size(); i++) + { + if (remoteUsers[i].systemAddress==systemAddress) + { + if (channelName==0) + { + // Unsubscribe from all and delete this user. + remoteUsers[i]=remoteUsers[remoteUsers.Size()-1]; + remoteUsers.RemoveFromEnd(); + return 0; + } + else + { + unsigned channelIndex; + channelIndex = GetChannelIndexFromName(channelName); + if (channelIndex!=(unsigned)-1) + { + remoteUsers[i].channels&=0xFFFF ^ (1< remoteUsers; + + /// Names of the channels at each bit, or 0 for an unused channel + const char *channelNames[32]; + + /// This is so I can save the current transport provider, solely so I can use it without having the user pass it to Log + TransportInterface *trans; +}; + +} // namespace RakNet + +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/MTUSize.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/MTUSize.h new file mode 100644 index 0000000..4a627b6 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/MTUSize.h @@ -0,0 +1,31 @@ +/// \file +/// \brief \b [Internal] Defines the default maximum transfer unit. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef MAXIMUM_MTU_SIZE + +/// \li \em 17914 16 Mbit/Sec Token Ring +/// \li \em 4464 4 Mbits/Sec Token Ring +/// \li \em 4352 FDDI +/// \li \em 1500. The largest Ethernet packet size \b recommended. This is the typical setting for non-PPPoE, non-VPN connections. The default value for NETGEAR routers, adapters and switches. +/// \li \em 1492. The size PPPoE prefers. +/// \li \em 1472. Maximum size to use for pinging. (Bigger packets are fragmented.) +/// \li \em 1468. The size DHCP prefers. +/// \li \em 1460. Usable by AOL if you don't have large email attachments, etc. +/// \li \em 1430. The size VPN and PPTP prefer. +/// \li \em 1400. Maximum size for AOL DSL. +/// \li \em 576. Typical value to connect to dial-up ISPs. +/// The largest value for an UDP datagram + + + +#define MAXIMUM_MTU_SIZE 1492 + + +#define MINIMUM_MTU_SIZE 400 + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Makefile b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Makefile new file mode 100644 index 0000000..30cebf8 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Makefile @@ -0,0 +1,23 @@ +MODULE := raknet +SOURCES := $(wildcard *.cpp) + +CFLAGS:=-I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads $(CFLAGS) +CFLAGS+=-DNDEBUG -s -O1 +LDFLAGS:=-L/opt/vc/lib -lpthread +CC:=g++ + +OBJECTS:=$(SOURCES:%.cpp=%.o) + +all: $(MODULE) + +%.o: %.cpp + $(CC) -fpic -g -c $(CFLAGS) $< -o $@ + +$(MODULE): $(OBJECTS) + $(CC) $(LDFLAGS) $(OBJECTS) -shared -o libRakNet.so + +static: $(OBJECTS) + ar rvs libRaknet.a $(OBJECTS) + +clean: + rm -f $(OBJECTS) $(MODULE) diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/MessageFilter.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/MessageFilter.cpp new file mode 100644 index 0000000..c2fc37a --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/MessageFilter.cpp @@ -0,0 +1,408 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_MessageFilter==1 + +#include "MessageFilter.h" +#include "RakAssert.h" +#include "GetTime.h" +#include "MessageIdentifiers.h" +#include "RakAssert.h" +#include "RakPeerInterface.h" +#include "PacketizedTCP.h" +#include "BitStream.h" + +#ifdef _MSC_VER +#pragma warning( push ) +#endif + +using namespace RakNet; + +int RakNet::MessageFilterStrComp( char *const &key,char *const &data ) +{ + return strcmp(key,data); +} + +int RakNet::FilterSetComp( const int &key, FilterSet * const &data ) +{ + if (key < data->filterSetID) + return -1; + else if (key==data->filterSetID) + return 0; + else + return 1; +} +STATIC_FACTORY_DEFINITIONS(MessageFilter,MessageFilter); + +MessageFilter::MessageFilter() +{ + whenLastTimeoutCheck=RakNet::GetTime(); +} +MessageFilter::~MessageFilter() +{ + Clear(); +} +void MessageFilter::SetAutoAddNewConnectionsToFilter(int filterSetID) +{ + autoAddNewConnectionsToFilter=filterSetID; +} +void MessageFilter::SetAllowMessageID(bool allow, int messageIDStart, int messageIDEnd,int filterSetID) +{ + RakAssert(messageIDStart <= messageIDEnd); + FilterSet *filterSet = GetFilterSetByID(filterSetID); + int i; + for (i=messageIDStart; i <= messageIDEnd; ++i) + filterSet->allowedIDs[i]=allow; +} +void MessageFilter::SetAllowRPC4(bool allow, const char* uniqueID, int filterSetID) +{ + FilterSet *filterSet = GetFilterSetByID(filterSetID); + bool objectExists; + unsigned int idx = filterSet->allowedRPC4.GetIndexFromKey(uniqueID, &objectExists); + if (allow) + { + if (objectExists==false) + { + filterSet->allowedRPC4.InsertAtIndex(uniqueID, idx, _FILE_AND_LINE_); + filterSet->allowedIDs[ID_RPC_PLUGIN]=true; + } + } + else + { + if (objectExists==true) + { + filterSet->allowedRPC4.RemoveAtIndex(idx); + if (filterSet->allowedRPC4.Size()==0) + { + filterSet->allowedIDs[ID_RPC_PLUGIN]=false; + } + } + } +} +void MessageFilter::SetActionOnDisallowedMessage(bool kickOnDisallowed, bool banOnDisallowed, RakNet::TimeMS banTimeMS, int filterSetID) +{ + FilterSet *filterSet = GetFilterSetByID(filterSetID); + filterSet->kickOnDisallowedMessage=kickOnDisallowed; + filterSet->disallowedMessageBanTimeMS=banTimeMS; + filterSet->banOnDisallowedMessage=banOnDisallowed; +} +void MessageFilter::SetDisallowedMessageCallback(int filterSetID, void *userData, void (*invalidMessageCallback)(RakPeerInterface *peer, AddressOrGUID systemAddress, int filterSetID, void *userData, unsigned char messageID)) +{ + FilterSet *filterSet = GetFilterSetByID(filterSetID); + filterSet->invalidMessageCallback=invalidMessageCallback; + filterSet->disallowedCallbackUserData=userData; +} +void MessageFilter::SetTimeoutCallback(int filterSetID, void *userData, void (*invalidMessageCallback)(RakPeerInterface *peer, AddressOrGUID systemAddress, int filterSetID, void *userData)) +{ + FilterSet *filterSet = GetFilterSetByID(filterSetID); + filterSet->timeoutCallback=invalidMessageCallback; + filterSet->timeoutUserData=userData; +} +void MessageFilter::SetFilterMaxTime(int allowedTimeMS, bool banOnExceed, RakNet::TimeMS banTimeMS, int filterSetID) +{ + FilterSet *filterSet = GetFilterSetByID(filterSetID); + filterSet->maxMemberTimeMS=allowedTimeMS; + filterSet->banOnFilterTimeExceed=banOnExceed; + filterSet->timeExceedBanTimeMS=banTimeMS; +} +int MessageFilter::GetSystemFilterSet(AddressOrGUID systemAddress) +{ +// bool objectExists; +// unsigned index = systemList.GetIndexFromKey(systemAddress, &objectExists); +// if (objectExists==false) +// return -1; +// else +// return systemList[index].filter->filterSetID; + + DataStructures::HashIndex index = systemList.GetIndexOf(systemAddress); + if (index.IsInvalid()) + return -1; + else + return systemList.ItemAtIndex(index).filter->filterSetID; +} +void MessageFilter::SetSystemFilterSet(AddressOrGUID addressOrGUID, int filterSetID) +{ + // Allocate this filter set if it doesn't exist. + RakAssert(addressOrGUID.IsUndefined()==false); +// bool objectExists; +// unsigned index = systemList.GetIndexFromKey(addressOrGUID, &objectExists); +// if (objectExists==false) + DataStructures::HashIndex index = systemList.GetIndexOf(addressOrGUID); + if (index.IsInvalid()) + { + if (filterSetID<0) + return; + + FilteredSystem filteredSystem; + filteredSystem.filter = GetFilterSetByID(filterSetID); + // filteredSystem.addressOrGUID=addressOrGUID; + filteredSystem.timeEnteredThisSet=RakNet::GetTimeMS(); + // systemList.Insert(addressOrGUID, filteredSystem, true, _FILE_AND_LINE_); + systemList.Push(addressOrGUID,filteredSystem,_FILE_AND_LINE_); + } + else + { + if (filterSetID>=0) + { + FilterSet *filterSet = GetFilterSetByID(filterSetID); + systemList.ItemAtIndex(index).timeEnteredThisSet=RakNet::GetTimeMS(); + systemList.ItemAtIndex(index).filter=filterSet; + } + else + { + systemList.RemoveAtIndex(index, _FILE_AND_LINE_); + } + } +} +unsigned MessageFilter::GetSystemCount(int filterSetID) const +{ + if (filterSetID==-1) + { + return systemList.Size(); + } + else + { + unsigned i; + unsigned count=0; + DataStructures::List< FilteredSystem > itemList; + DataStructures::List< AddressOrGUID > keyList; + systemList.GetAsList(itemList, keyList, _FILE_AND_LINE_); + for (i=0; i < itemList.Size(); i++) + if (itemList[i].filter->filterSetID==filterSetID) + ++count; + return count; + } +} +unsigned MessageFilter::GetFilterSetCount(void) const +{ + return filterList.Size(); +} +int MessageFilter::GetFilterSetIDByIndex(unsigned index) +{ + return filterList[index]->filterSetID; +} +void MessageFilter::DeleteFilterSet(int filterSetID) +{ + FilterSet *filterSet; + bool objectExists; + unsigned i,index; + index = filterList.GetIndexFromKey(filterSetID, &objectExists); + if (objectExists) + { + filterSet=filterList[index]; + DeallocateFilterSet(filterSet); + filterList.RemoveAtIndex(index); + + DataStructures::List< FilteredSystem > itemList; + DataStructures::List< AddressOrGUID > keyList; + systemList.GetAsList(itemList, keyList, _FILE_AND_LINE_); + for (i=0; i < itemList.Size(); i++) + { + if (itemList[i].filter==filterSet) + { + systemList.Remove(keyList[i], _FILE_AND_LINE_); + } + } + + /* + // Don't reference this pointer any longer + i=0; + while (i < systemList.Size()) + { + if (systemList[i].filter==filterSet) + systemList.RemoveAtIndex(i); + else + ++i; + } + */ + } +} +void MessageFilter::Clear(void) +{ + unsigned i; + systemList.Clear(_FILE_AND_LINE_); + for (i=0; i < filterList.Size(); i++) + DeallocateFilterSet(filterList[i]); + filterList.Clear(false, _FILE_AND_LINE_); +} +void MessageFilter::DeallocateFilterSet(FilterSet* filterSet) +{ + RakNet::OP_DELETE(filterSet, _FILE_AND_LINE_); +} +FilterSet* MessageFilter::GetFilterSetByID(int filterSetID) +{ + RakAssert(filterSetID>=0); + bool objectExists; + unsigned index; + index = filterList.GetIndexFromKey(filterSetID, &objectExists); + if (objectExists) + return filterList[index]; + else + { + FilterSet *newFilterSet = RakNet::OP_NEW( _FILE_AND_LINE_ ); + memset(newFilterSet->allowedIDs, 0, MESSAGE_FILTER_MAX_MESSAGE_ID * sizeof(bool)); + newFilterSet->banOnFilterTimeExceed=false; + newFilterSet->kickOnDisallowedMessage=false; + newFilterSet->banOnDisallowedMessage=false; + newFilterSet->disallowedMessageBanTimeMS=0; + newFilterSet->timeExceedBanTimeMS=0; + newFilterSet->maxMemberTimeMS=0; + newFilterSet->filterSetID=filterSetID; + newFilterSet->invalidMessageCallback=0; + newFilterSet->timeoutCallback=0; + newFilterSet->timeoutUserData=0; + filterList.Insert(filterSetID, newFilterSet, true, _FILE_AND_LINE_); + return newFilterSet; + } +} +void MessageFilter::OnInvalidMessage(FilterSet *filterSet, AddressOrGUID systemAddress, unsigned char messageID) +{ + if (filterSet->invalidMessageCallback) + filterSet->invalidMessageCallback(rakPeerInterface, systemAddress, filterSet->filterSetID, filterSet->disallowedCallbackUserData, messageID); + if (filterSet->banOnDisallowedMessage && rakPeerInterface) + { + char str1[64]; + systemAddress.systemAddress.ToString(false, str1); + rakPeerInterface->AddToBanList(str1, filterSet->disallowedMessageBanTimeMS); + } + if (filterSet->kickOnDisallowedMessage) + { + if (rakPeerInterface) + rakPeerInterface->CloseConnection(systemAddress, true, 0); +#if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1 + else + packetizedTCP->CloseConnection(systemAddress.systemAddress); +#endif + } +} +void MessageFilter::Update(void) +{ + // Update all timers for all systems. If those systems' filter sets are expired, take the appropriate action. + RakNet::Time curTime = RakNet::GetTime(); + if (GreaterThan(curTime - 1000, whenLastTimeoutCheck)) + { + DataStructures::List< FilteredSystem > itemList; + DataStructures::List< AddressOrGUID > keyList; + systemList.GetAsList(itemList, keyList, _FILE_AND_LINE_); + + unsigned int index; + for (index=0; index < itemList.Size(); index++) + { + if (itemList[index].filter && + itemList[index].filter->maxMemberTimeMS>0 && + curTime-itemList[index].timeEnteredThisSet >= itemList[index].filter->maxMemberTimeMS) + { + if (itemList[index].filter->timeoutCallback) + itemList[index].filter->timeoutCallback(rakPeerInterface, keyList[index], itemList[index].filter->filterSetID, itemList[index].filter->timeoutUserData); + + if (itemList[index].filter->banOnFilterTimeExceed && rakPeerInterface) + { + char str1[64]; + keyList[index].ToString(false, str1); + rakPeerInterface->AddToBanList(str1, itemList[index].filter->timeExceedBanTimeMS); + } + if (rakPeerInterface) + rakPeerInterface->CloseConnection(keyList[index], true, 0); +#if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1 + else + packetizedTCP->CloseConnection(keyList[index].systemAddress); +#endif + + systemList.Remove(keyList[index], _FILE_AND_LINE_); + } + } + + whenLastTimeoutCheck=curTime+1000; + } +} +void MessageFilter::OnNewConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, bool isIncoming) +{ + (void) systemAddress; + (void) rakNetGUID; + (void) isIncoming; + + AddressOrGUID aog; + aog.rakNetGuid=rakNetGUID; + aog.systemAddress=systemAddress; + + // New system, automatically assign to filter set if appropriate + if (autoAddNewConnectionsToFilter>=0 && systemList.HasData(aog)==false) + SetSystemFilterSet(aog, autoAddNewConnectionsToFilter); +} +void MessageFilter::OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ) +{ + (void) rakNetGUID; + (void) lostConnectionReason; + + AddressOrGUID aog; + aog.rakNetGuid=rakNetGUID; + aog.systemAddress=systemAddress; + + // Lost system, remove from the list + systemList.Remove(aog, _FILE_AND_LINE_); +} + PluginReceiveResult MessageFilter::OnReceive(Packet *packet) +{ + DataStructures::HashIndex index; + unsigned char messageId; + + switch (packet->data[0]) + { + case ID_NEW_INCOMING_CONNECTION: + case ID_CONNECTION_REQUEST_ACCEPTED: + case ID_CONNECTION_LOST: + case ID_DISCONNECTION_NOTIFICATION: + case ID_CONNECTION_ATTEMPT_FAILED: + case ID_NO_FREE_INCOMING_CONNECTIONS: + case ID_IP_RECENTLY_CONNECTED: + case ID_CONNECTION_BANNED: + case ID_INVALID_PASSWORD: + case ID_UNCONNECTED_PONG: + case ID_ALREADY_CONNECTED: + case ID_ADVERTISE_SYSTEM: + case ID_REMOTE_DISCONNECTION_NOTIFICATION: + case ID_REMOTE_CONNECTION_LOST: + case ID_REMOTE_NEW_INCOMING_CONNECTION: + case ID_DOWNLOAD_PROGRESS: + break; + default: + if (packet->data[0]==ID_TIMESTAMP) + { + if (packet->lengthdata[sizeof(MessageID) + sizeof(RakNet::TimeMS)]; + } + else + messageId=packet->data[0]; + // If this system is filtered, check if this message is allowed. If not allowed, return RR_STOP_PROCESSING_AND_DEALLOCATE + // index = systemList.GetIndexFromKey(packet->addressOrGUID, &objectExists); + index = systemList.GetIndexOf(packet); + if (index.IsInvalid()) + break; + if (systemList.ItemAtIndex(index).filter->allowedIDs[messageId]==false) + { + OnInvalidMessage(systemList.ItemAtIndex(index).filter, packet, packet->data[0]); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + if (packet->data[0]==ID_RPC_PLUGIN) + { + RakNet::BitStream bsIn(packet->data,packet->length,false); + bsIn.IgnoreBytes(2); + RakNet::RakString functionName; + bsIn.ReadCompressed(functionName); + if (systemList.ItemAtIndex(index).filter->allowedRPC4.HasData(functionName)==false) + { + OnInvalidMessage(systemList.ItemAtIndex(index).filter, packet, packet->data[0]); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + } + + break; + } + + return RR_CONTINUE_PROCESSING; +} + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/MessageFilter.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/MessageFilter.h new file mode 100644 index 0000000..8befe7b --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/MessageFilter.h @@ -0,0 +1,191 @@ +/// \file +/// \brief Message filter plugin. Assigns systems to FilterSets. Each FilterSet limits what messages are allowed. This is a security related plugin. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_MessageFilter==1 + +#ifndef __MESSAGE_FILTER_PLUGIN_H +#define __MESSAGE_FILTER_PLUGIN_H + +#include "RakNetTypes.h" +#include "PluginInterface2.h" +#include "DS_OrderedList.h" +#include "DS_Hash.h" +#include "Export.h" + +/// MessageIdentifier (ID_*) values shoudln't go higher than this. Change it if you do. +#define MESSAGE_FILTER_MAX_MESSAGE_ID 256 + +namespace RakNet +{ +/// Forward declarations +class RakPeerInterface; + +/// \internal Has to be public so some of the shittier compilers can use it. +int RAK_DLL_EXPORT MessageFilterStrComp( char *const &key,char *const &data ); + +/// \internal Has to be public so some of the shittier compilers can use it. +struct FilterSet +{ + bool banOnFilterTimeExceed; + bool kickOnDisallowedMessage; + bool banOnDisallowedMessage; + RakNet::TimeMS disallowedMessageBanTimeMS; + RakNet::TimeMS timeExceedBanTimeMS; + RakNet::TimeMS maxMemberTimeMS; + void (*invalidMessageCallback)(RakPeerInterface *peer, AddressOrGUID systemAddress, int filterSetID, void *userData, unsigned char messageID); + void *disallowedCallbackUserData; + void (*timeoutCallback)(RakPeerInterface *peer, AddressOrGUID systemAddress, int filterSetID, void *userData); + void *timeoutUserData; + int filterSetID; + bool allowedIDs[MESSAGE_FILTER_MAX_MESSAGE_ID]; + DataStructures::OrderedList allowedRPC4; +}; + +/// \internal Has to be public so some of the shittier compilers can use it. +int RAK_DLL_EXPORT FilterSetComp( const int &key, FilterSet * const &data ); + +/// \internal Has to be public so some of the shittier compilers can use it. +struct FilteredSystem +{ + FilterSet *filter; + RakNet::TimeMS timeEnteredThisSet; +}; + +/// \defgroup MESSAGEFILTER_GROUP MessageFilter +/// \brief Remote incoming packets from unauthorized systems +/// \details +/// \ingroup PLUGINS_GROUP + +/// \brief Assigns systems to FilterSets. Each FilterSet limits what kinds of messages are allowed. +/// \details The MessageFilter plugin is used for security where you limit what systems can send what kind of messages.
+/// You implicitly define FilterSets, and add allowed message IDs to these FilterSets.
+/// You then add systems to these filters, such that those systems are limited to sending what the filters allows.
+/// You can automatically assign systems to a filter.
+/// You can automatically kick and possibly ban users that stay in a filter too long, or send the wrong message.
+/// Each system is a member of either zero or one filters.
+/// Add this plugin before any plugin you wish to filter (most likely just add this plugin before any other). +/// \ingroup MESSAGEFILTER_GROUP +class RAK_DLL_EXPORT MessageFilter : public PluginInterface2 +{ +public: + + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(MessageFilter) + + MessageFilter(); + virtual ~MessageFilter(); + + // -------------------------------------------------------------------------------------------- + // User functions + // -------------------------------------------------------------------------------------------- + + /// Automatically add all new systems to a particular filter + /// Defaults to -1 + /// \param[in] filterSetID Which filter to add new systems to. <0 for do not add. + void SetAutoAddNewConnectionsToFilter(int filterSetID); + + /// Allow a range of message IDs + /// Always allowed by default: ID_CONNECTION_REQUEST_ACCEPTED through ID_DOWNLOAD_PROGRESS + /// Usually you specify a range to make it easier to add new enumerations without having to constantly refer back to this function. + /// \param[in] allow True to allow this message ID, false to disallow. By default, all messageIDs except the noted types are disallowed. This includes messages from other plugins! + /// \param[in] messageIDStart The first ID_* message to allow in the range. Inclusive. + /// \param[in] messageIDEnd The last ID_* message to allow in the range. Inclusive. + /// \param[in] filterSetID A user defined ID to represent a filter set. If no filter with this ID exists, one will be created with default settings. + void SetAllowMessageID(bool allow, int messageIDStart, int messageIDEnd,int filterSetID); + + /// Allow a specific RPC4 call + /// \pre MessageFilter must be attached before RPC4 + /// \param[in] uniqueID Identifier passed to RegisterFunction() + /// \param[in] filterSetID A user defined ID to represent a filter set. If no filter with this ID exists, one will be created with default settings. + void SetAllowRPC4(bool allow, const char* uniqueID, int filterSetID); + + /// What action to take on a disallowed message. You can kick or not. You can add them to the ban list for some time + /// By default no action is taken. The message is simply ignored. + /// param[in] 0 for permanent ban, >0 for ban time in milliseconds. + /// \param[in] kickOnDisallowed kick the system that sent a disallowed message. + /// \param[in] banOnDisallowed ban the system that sent a disallowed message. See \a banTimeMS for the ban duration + /// \param[in] banTimeMS Passed to the milliseconds parameter of RakPeer::AddToBanList. + /// \param[in] filterSetID A user defined ID to represent a filter set. If no filter with this ID exists, one will be created with default settings. + void SetActionOnDisallowedMessage(bool kickOnDisallowed, bool banOnDisallowed, RakNet::TimeMS banTimeMS, int filterSetID); + + /// Set a user callback to be called on an invalid message for a particular filterSet + /// \param[in] filterSetID A user defined ID to represent a filter set. If no filter with this ID exists, one will be created with default settings. + /// \param[in] userData A pointer passed with the callback + /// \param[in] invalidMessageCallback A pointer to a C function to be called back with the specified parameters. + void SetDisallowedMessageCallback(int filterSetID, void *userData, void (*invalidMessageCallback)(RakPeerInterface *peer, AddressOrGUID addressOrGUID, int filterSetID, void *userData, unsigned char messageID)); + + /// Set a user callback to be called when a user is disconnected due to SetFilterMaxTime + /// \param[in] filterSetID A user defined ID to represent a filter set. If no filter with this ID exists, one will be created with default settings. + /// \param[in] userData A pointer passed with the callback + /// \param[in] invalidMessageCallback A pointer to a C function to be called back with the specified parameters. + void SetTimeoutCallback(int filterSetID, void *userData, void (*invalidMessageCallback)(RakPeerInterface *peer, AddressOrGUID addressOrGUID, int filterSetID, void *userData)); + + /// Limit how long a connection can stay in a particular filterSetID. After this time, the connection is kicked and possibly banned. + /// By default there is no limit to how long a connection can stay in a particular filter set. + /// \param[in] allowedTimeMS How many milliseconds to allow a connection to stay in this filter set. + /// \param[in] banOnExceed True or false to ban the system, or not, when \a allowedTimeMS is exceeded + /// \param[in] banTimeMS Passed to the milliseconds parameter of RakPeer::AddToBanList. + /// \param[in] filterSetID A user defined ID to represent a filter set. If no filter with this ID exists, one will be created with default settings. + void SetFilterMaxTime(int allowedTimeMS, bool banOnExceed, RakNet::TimeMS banTimeMS, int filterSetID); + + /// Get the filterSetID a system is using. Returns -1 for none. + /// \param[in] addressOrGUID The system we are referring to + int GetSystemFilterSet(AddressOrGUID addressOrGUID); + + /// Assign a system to a filter set. + /// Systems are automatically added to filter sets (or not) based on SetAutoAddNewConnectionsToFilter() + /// This function is used to change the filter set a system is using, to add it to a new filter set, or to remove it from all existin filter sets. + /// \param[in] addressOrGUID The system we are referring to + /// \param[in] filterSetID A user defined ID to represent a filter set. If no filter with this ID exists, one will be created with default settings. If -1, the system will be removed from all filter sets. + void SetSystemFilterSet(AddressOrGUID addressOrGUID, int filterSetID); + + /// Returns the number of systems subscribed to a particular filter set + /// Using anything other than -1 for \a filterSetID is slow, so you should store the returned value. + /// \param[in] filterSetID The filter set to limit to. Use -1 for none (just returns the total number of filter systems in that case). + unsigned GetSystemCount(int filterSetID) const; + + /// Returns the total number of filter sets. + /// \return The total number of filter sets. + unsigned GetFilterSetCount(void) const; + + /// Returns the ID of a filter set, by index + /// \param[in] An index between 0 and GetFilterSetCount()-1 inclusive + int GetFilterSetIDByIndex(unsigned index); + + /// Delete a FilterSet. All systems formerly subscribed to this filter are now unrestricted. + /// \param[in] filterSetID The ID of the filter set to delete. + void DeleteFilterSet(int filterSetID); + + // -------------------------------------------------------------------------------------------- + // Packet handling functions + // -------------------------------------------------------------------------------------------- + virtual void Update(void); + virtual PluginReceiveResult OnReceive(Packet *packet); + virtual void OnNewConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, bool isIncoming); + virtual void OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ); + +protected: + + void Clear(void); + void DeallocateFilterSet(FilterSet *filterSet); + FilterSet* GetFilterSetByID(int filterSetID); + void OnInvalidMessage(FilterSet *filterSet, AddressOrGUID systemAddress, unsigned char messageID); + + DataStructures::OrderedList filterList; + // Change to guid + DataStructures::Hash systemList; + + int autoAddNewConnectionsToFilter; + RakNet::Time whenLastTimeoutCheck; +}; + +} // namespace RakNet + +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/MessageIdentifiers.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/MessageIdentifiers.h new file mode 100644 index 0000000..6788de2 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/MessageIdentifiers.h @@ -0,0 +1,403 @@ +/// \file +/// \brief All the message identifiers used by RakNet. Message identifiers comprise the first byte of any message. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __MESSAGE_IDENTIFIERS_H +#define __MESSAGE_IDENTIFIERS_H + +#if defined(RAKNET_USE_CUSTOM_PACKET_IDS) +#include "CustomPacketIdentifiers.h" +#else + +enum OutOfBandIdentifiers +{ + ID_NAT_ESTABLISH_UNIDIRECTIONAL, + ID_NAT_ESTABLISH_BIDIRECTIONAL, + ID_NAT_TYPE_DETECT, + ID_ROUTER_2_REPLY_TO_SENDER_PORT, + ID_ROUTER_2_REPLY_TO_SPECIFIED_PORT, + ID_ROUTER_2_MINI_PUNCH_REPLY, + ID_ROUTER_2_MINI_PUNCH_REPLY_BOUNCE, + ID_XBOX_360_VOICE, + ID_XBOX_360_GET_NETWORK_ROOM, + ID_XBOX_360_RETURN_NETWORK_ROOM, +}; + +/// You should not edit the file MessageIdentifiers.h as it is a part of RakNet static library +/// To define your own message id, define an enum following the code example that follows. +/// +/// \code +/// enum { +/// ID_MYPROJECT_MSG_1 = ID_USER_PACKET_ENUM, +/// ID_MYPROJECT_MSG_2, +/// ... +/// }; +/// \endcode +/// +/// \note All these enumerations should be casted to (unsigned char) before writing them to RakNet::BitStream +enum DefaultMessageIDTypes +{ + // + // RESERVED TYPES - DO NOT CHANGE THESE + // All types from RakPeer + // + /// These types are never returned to the user. + /// Ping from a connected system. Update timestamps (internal use only) + ID_CONNECTED_PING, + /// Ping from an unconnected system. Reply but do not update timestamps. (internal use only) + ID_UNCONNECTED_PING, + /// Ping from an unconnected system. Only reply if we have open connections. Do not update timestamps. (internal use only) + ID_UNCONNECTED_PING_OPEN_CONNECTIONS, + /// Pong from a connected system. Update timestamps (internal use only) + ID_CONNECTED_PONG, + /// A reliable packet to detect lost connections (internal use only) + ID_DETECT_LOST_CONNECTIONS, + /// C2S: Initial query: Header(1), OfflineMesageID(16), Protocol number(1), Pad(toMTU), sent with no fragment set. + /// If protocol fails on server, returns ID_INCOMPATIBLE_PROTOCOL_VERSION to client + ID_OPEN_CONNECTION_REQUEST_1, + /// S2C: Header(1), OfflineMesageID(16), server GUID(8), HasSecurity(1), Cookie(4, if HasSecurity) + /// , public key (if do security is true), MTU(2). If public key fails on client, returns ID_PUBLIC_KEY_MISMATCH + ID_OPEN_CONNECTION_REPLY_1, + /// C2S: Header(1), OfflineMesageID(16), Cookie(4, if HasSecurity is true on the server), clientSupportsSecurity(1 bit), + /// handshakeChallenge (if has security on both server and client), remoteBindingAddress(6), MTU(2), client GUID(8) + /// Connection slot allocated if cookie is valid, server is not full, GUID and IP not already in use. + ID_OPEN_CONNECTION_REQUEST_2, + /// S2C: Header(1), OfflineMesageID(16), server GUID(8), mtu(2), doSecurity(1 bit), handshakeAnswer (if do security is true) + ID_OPEN_CONNECTION_REPLY_2, + /// C2S: Header(1), GUID(8), Timestamp, HasSecurity(1), Proof(32) + ID_CONNECTION_REQUEST, + /// RakPeer - Remote system requires secure connections, pass a public key to RakPeerInterface::Connect() + ID_REMOTE_SYSTEM_REQUIRES_PUBLIC_KEY, + /// RakPeer - We passed a public key to RakPeerInterface::Connect(), but the other system did not have security turned on + ID_OUR_SYSTEM_REQUIRES_SECURITY, + /// RakPeer - Wrong public key passed to RakPeerInterface::Connect() + ID_PUBLIC_KEY_MISMATCH, + /// RakPeer - Same as ID_ADVERTISE_SYSTEM, but intended for internal use rather than being passed to the user. + /// Second byte indicates type. Used currently for NAT punchthrough for receiver port advertisement. See ID_NAT_ADVERTISE_RECIPIENT_PORT + ID_OUT_OF_BAND_INTERNAL, + /// If RakPeerInterface::Send() is called where PacketReliability contains _WITH_ACK_RECEIPT, then on a later call to + /// RakPeerInterface::Receive() you will get ID_SND_RECEIPT_ACKED or ID_SND_RECEIPT_LOSS. The message will be 5 bytes long, + /// and bytes 1-4 inclusive will contain a number in native order containing a number that identifies this message. + /// This number will be returned by RakPeerInterface::Send() or RakPeerInterface::SendList(). ID_SND_RECEIPT_ACKED means that + /// the message arrived + ID_SND_RECEIPT_ACKED, + /// If RakPeerInterface::Send() is called where PacketReliability contains UNRELIABLE_WITH_ACK_RECEIPT, then on a later call to + /// RakPeerInterface::Receive() you will get ID_SND_RECEIPT_ACKED or ID_SND_RECEIPT_LOSS. The message will be 5 bytes long, + /// and bytes 1-4 inclusive will contain a number in native order containing a number that identifies this message. This number + /// will be returned by RakPeerInterface::Send() or RakPeerInterface::SendList(). ID_SND_RECEIPT_LOSS means that an ack for the + /// message did not arrive (it may or may not have been delivered, probably not). On disconnect or shutdown, you will not get + /// ID_SND_RECEIPT_LOSS for unsent messages, you should consider those messages as all lost. + ID_SND_RECEIPT_LOSS, + + + // + // USER TYPES - DO NOT CHANGE THESE + // + + /// RakPeer - In a client/server environment, our connection request to the server has been accepted. + ID_CONNECTION_REQUEST_ACCEPTED, + /// RakPeer - Sent to the player when a connection request cannot be completed due to inability to connect. + ID_CONNECTION_ATTEMPT_FAILED, + /// RakPeer - Sent a connect request to a system we are currently connected to. + ID_ALREADY_CONNECTED, + /// RakPeer - A remote system has successfully connected. + ID_NEW_INCOMING_CONNECTION, + /// RakPeer - The system we attempted to connect to is not accepting new connections. + ID_NO_FREE_INCOMING_CONNECTIONS, + /// RakPeer - The system specified in Packet::systemAddress has disconnected from us. For the client, this would mean the + /// server has shutdown. + ID_DISCONNECTION_NOTIFICATION, + /// RakPeer - Reliable packets cannot be delivered to the system specified in Packet::systemAddress. The connection to that + /// system has been closed. + ID_CONNECTION_LOST, + /// RakPeer - We are banned from the system we attempted to connect to. + ID_CONNECTION_BANNED, + /// RakPeer - The remote system is using a password and has refused our connection because we did not set the correct password. + ID_INVALID_PASSWORD, + // RAKNET_PROTOCOL_VERSION in RakNetVersion.h does not match on the remote system what we have on our system + // This means the two systems cannot communicate. + // The 2nd byte of the message contains the value of RAKNET_PROTOCOL_VERSION for the remote system + ID_INCOMPATIBLE_PROTOCOL_VERSION, + // Means that this IP address connected recently, and can't connect again as a security measure. See + /// RakPeer::SetLimitIPConnectionFrequency() + ID_IP_RECENTLY_CONNECTED, + /// RakPeer - The sizeof(RakNetTime) bytes following this byte represent a value which is automatically modified by the difference + /// in system times between the sender and the recipient. Requires that you call SetOccasionalPing. + ID_TIMESTAMP, + /// RakPeer - Pong from an unconnected system. First byte is ID_UNCONNECTED_PONG, second sizeof(RakNet::TimeMS) bytes is the ping, + /// following bytes is system specific enumeration data. + /// Read using bitstreams + ID_UNCONNECTED_PONG, + /// RakPeer - Inform a remote system of our IP/Port. On the recipient, all data past ID_ADVERTISE_SYSTEM is whatever was passed to + /// the data parameter + ID_ADVERTISE_SYSTEM, + // RakPeer - Downloading a large message. Format is ID_DOWNLOAD_PROGRESS (MessageID), partCount (unsigned int), + /// partTotal (unsigned int), + /// partLength (unsigned int), first part data (length <= MAX_MTU_SIZE). See the three parameters partCount, partTotal + /// and partLength in OnFileProgress in FileListTransferCBInterface.h + ID_DOWNLOAD_PROGRESS, + + /// ConnectionGraph2 plugin - In a client/server environment, a client other than ourselves has disconnected gracefully. + /// Packet::systemAddress is modified to reflect the systemAddress of this client. + ID_REMOTE_DISCONNECTION_NOTIFICATION, + /// ConnectionGraph2 plugin - In a client/server environment, a client other than ourselves has been forcefully dropped. + /// Packet::systemAddress is modified to reflect the systemAddress of this client. + ID_REMOTE_CONNECTION_LOST, + /// ConnectionGraph2 plugin: Bytes 1-4 = count. for (count items) contains {SystemAddress, RakNetGUID, 2 byte ping} + ID_REMOTE_NEW_INCOMING_CONNECTION, + + /// FileListTransfer plugin - Setup data + ID_FILE_LIST_TRANSFER_HEADER, + /// FileListTransfer plugin - A file + ID_FILE_LIST_TRANSFER_FILE, + // Ack for reference push, to send more of the file + ID_FILE_LIST_REFERENCE_PUSH_ACK, + + /// DirectoryDeltaTransfer plugin - Request from a remote system for a download of a directory + ID_DDT_DOWNLOAD_REQUEST, + + /// RakNetTransport plugin - Transport provider message, used for remote console + ID_TRANSPORT_STRING, + + /// ReplicaManager plugin - Create an object + ID_REPLICA_MANAGER_CONSTRUCTION, + /// ReplicaManager plugin - Changed scope of an object + ID_REPLICA_MANAGER_SCOPE_CHANGE, + /// ReplicaManager plugin - Serialized data of an object + ID_REPLICA_MANAGER_SERIALIZE, + /// ReplicaManager plugin - New connection, about to send all world objects + ID_REPLICA_MANAGER_DOWNLOAD_STARTED, + /// ReplicaManager plugin - Finished downloading all serialized objects + ID_REPLICA_MANAGER_DOWNLOAD_COMPLETE, + + /// RakVoice plugin - Open a communication channel + ID_RAKVOICE_OPEN_CHANNEL_REQUEST, + /// RakVoice plugin - Communication channel accepted + ID_RAKVOICE_OPEN_CHANNEL_REPLY, + /// RakVoice plugin - Close a communication channel + ID_RAKVOICE_CLOSE_CHANNEL, + /// RakVoice plugin - Voice data + ID_RAKVOICE_DATA, + + /// Autopatcher plugin - Get a list of files that have changed since a certain date + ID_AUTOPATCHER_GET_CHANGELIST_SINCE_DATE, + /// Autopatcher plugin - A list of files to create + ID_AUTOPATCHER_CREATION_LIST, + /// Autopatcher plugin - A list of files to delete + ID_AUTOPATCHER_DELETION_LIST, + /// Autopatcher plugin - A list of files to get patches for + ID_AUTOPATCHER_GET_PATCH, + /// Autopatcher plugin - A list of patches for a list of files + ID_AUTOPATCHER_PATCH_LIST, + /// Autopatcher plugin - Returned to the user: An error from the database repository for the autopatcher. + ID_AUTOPATCHER_REPOSITORY_FATAL_ERROR, + /// Autopatcher plugin - Finished getting all files from the autopatcher + ID_AUTOPATCHER_FINISHED_INTERNAL, + ID_AUTOPATCHER_FINISHED, + /// Autopatcher plugin - Returned to the user: You must restart the application to finish patching. + ID_AUTOPATCHER_RESTART_APPLICATION, + + /// NATPunchthrough plugin: internal + ID_NAT_PUNCHTHROUGH_REQUEST, + /// NATPunchthrough plugin: internal + ID_NAT_GROUP_PUNCHTHROUGH_REQUEST, + /// NATPunchthrough plugin: internal + ID_NAT_GROUP_PUNCHTHROUGH_REPLY, + /// NATPunchthrough plugin: internal + ID_NAT_CONNECT_AT_TIME, + /// NATPunchthrough plugin: internal + ID_NAT_GET_MOST_RECENT_PORT, + /// NATPunchthrough plugin: internal + ID_NAT_CLIENT_READY, + /// NATPunchthrough plugin: internal + ID_NAT_GROUP_PUNCHTHROUGH_FAILURE_NOTIFICATION, + + /// NATPunchthrough plugin: Destination system is not connected to the server. Bytes starting at offset 1 contains the + /// RakNetGUID destination field of NatPunchthroughClient::OpenNAT(). + ID_NAT_TARGET_NOT_CONNECTED, + /// NATPunchthrough plugin: Destination system is not responding to ID_NAT_GET_MOST_RECENT_PORT. Possibly the plugin is not installed. + /// Bytes starting at offset 1 contains the RakNetGUID destination field of NatPunchthroughClient::OpenNAT(). + ID_NAT_TARGET_UNRESPONSIVE, + /// NATPunchthrough plugin: The server lost the connection to the destination system while setting up punchthrough. + /// Possibly the plugin is not installed. Bytes starting at offset 1 contains the RakNetGUID destination + /// field of NatPunchthroughClient::OpenNAT(). + ID_NAT_CONNECTION_TO_TARGET_LOST, + /// NATPunchthrough plugin: This punchthrough is already in progress. Possibly the plugin is not installed. + /// Bytes starting at offset 1 contains the RakNetGUID destination field of NatPunchthroughClient::OpenNAT(). + ID_NAT_ALREADY_IN_PROGRESS, + /// NATPunchthrough plugin: This message is generated on the local system, and does not come from the network. + /// packet::guid contains the destination field of NatPunchthroughClient::OpenNAT(). Byte 1 contains 1 if you are the sender, 0 if not + ID_NAT_PUNCHTHROUGH_FAILED, + /// NATPunchthrough plugin: Punchthrough succeeded. See packet::systemAddress and packet::guid. Byte 1 contains 1 if you are the sender, + /// 0 if not. You can now use RakPeer::Connect() or other calls to communicate with this system. + ID_NAT_PUNCHTHROUGH_SUCCEEDED, + /// NATPunchthrough plugin: OpenNATGroup failed. + /// packet::guid contains the facilitator field of NatPunchthroughClient::OpenNAT() + /// Data format starts at byte 1:
+ /// (char) passedSystemsCount,
+ /// (RakNetGuid, SystemAddress) (for passedSystemsCount),
+ /// (char) ignoredSystemsCount (caused by ID_NAT_TARGET_NOT_CONNECTED, ID_NAT_CONNECTION_TO_TARGET_LOST, ID_NAT_TARGET_UNRESPONSIVE),
+ /// RakNetGuid (for ignoredSystemsCount),
+ /// (char) failedSystemsCount,
+ /// RakNetGuid (for failedSystemsCount)
+ ID_NAT_GROUP_PUNCH_FAILED, + /// NATPunchthrough plugin: OpenNATGroup succeeded. + /// packet::guid contains the facilitator field of NatPunchthroughClient::OpenNAT() + /// See ID_NAT_GROUP_PUNCH_FAILED for data format + ID_NAT_GROUP_PUNCH_SUCCEEDED, + + /// ReadyEvent plugin - Set the ready state for a particular system + /// First 4 bytes after the message contains the id + ID_READY_EVENT_SET, + /// ReadyEvent plugin - Unset the ready state for a particular system + /// First 4 bytes after the message contains the id + ID_READY_EVENT_UNSET, + /// All systems are in state ID_READY_EVENT_SET + /// First 4 bytes after the message contains the id + ID_READY_EVENT_ALL_SET, + /// \internal, do not process in your game + /// ReadyEvent plugin - Request of ready event state - used for pulling data when newly connecting + ID_READY_EVENT_QUERY, + + /// Lobby packets. Second byte indicates type. + ID_LOBBY_GENERAL, + + // RPC3, RPC4Plugin error + ID_RPC_REMOTE_ERROR, + /// Plugin based replacement for RPC system + ID_RPC_PLUGIN, + + /// FileListTransfer transferring large files in chunks that are read only when needed, to save memory + ID_FILE_LIST_REFERENCE_PUSH, + /// Force the ready event to all set + ID_READY_EVENT_FORCE_ALL_SET, + + /// Rooms function + ID_ROOMS_EXECUTE_FUNC, + ID_ROOMS_LOGON_STATUS, + ID_ROOMS_HANDLE_CHANGE, + + /// Lobby2 message + ID_LOBBY2_SEND_MESSAGE, + ID_LOBBY2_SERVER_ERROR, + + /// Informs user of a new host GUID. Packet::Guid contains this new host RakNetGuid. The old host can be read out using BitStream->Read(RakNetGuid) starting on byte 1 + /// This is not returned until connected to a remote system + /// If the oldHost is UNASSIGNED_RAKNET_GUID, then this is the first time the host has been determined + ID_FCM2_NEW_HOST, + /// \internal For FullyConnectedMesh2 plugin + ID_FCM2_REQUEST_FCMGUID, + /// \internal For FullyConnectedMesh2 plugin + ID_FCM2_RESPOND_CONNECTION_COUNT, + /// \internal For FullyConnectedMesh2 plugin + ID_FCM2_INFORM_FCMGUID, + /// \internal For FullyConnectedMesh2 plugin + ID_FCM2_UPDATE_MIN_TOTAL_CONNECTION_COUNT, + + /// UDP proxy messages. Second byte indicates type. + ID_UDP_PROXY_GENERAL, + + /// SQLite3Plugin - execute + ID_SQLite3_EXEC, + /// SQLite3Plugin - Remote database is unknown + ID_SQLite3_UNKNOWN_DB, + /// Events happening with SQLiteClientLoggerPlugin + ID_SQLLITE_LOGGER, + + /// Sent to NatTypeDetectionServer + ID_NAT_TYPE_DETECTION_REQUEST, + /// Sent to NatTypeDetectionClient. Byte 1 contains the type of NAT detected. + ID_NAT_TYPE_DETECTION_RESULT, + + /// Used by the router2 plugin + ID_ROUTER_2_INTERNAL, + /// No path is available or can be established to the remote system + /// Packet::guid contains the endpoint guid that we were trying to reach + ID_ROUTER_2_FORWARDING_NO_PATH, + /// \brief You can now call connect, ping, or other operations to the destination system. + /// + /// Connect as follows: + /// + /// RakNet::BitStream bs(packet->data, packet->length, false); + /// bs.IgnoreBytes(sizeof(MessageID)); + /// RakNetGUID endpointGuid; + /// bs.Read(endpointGuid); + /// unsigned short sourceToDestPort; + /// bs.Read(sourceToDestPort); + /// char ipAddressString[32]; + /// packet->systemAddress.ToString(false, ipAddressString); + /// rakPeerInterface->Connect(ipAddressString, sourceToDestPort, 0,0); + ID_ROUTER_2_FORWARDING_ESTABLISHED, + /// The IP address for a forwarded connection has changed + /// Read endpointGuid and port as per ID_ROUTER_2_FORWARDING_ESTABLISHED + ID_ROUTER_2_REROUTED, + + /// \internal Used by the team balancer plugin + ID_TEAM_BALANCER_INTERNAL, + /// Cannot switch to the desired team because it is full. However, if someone on that team leaves, you will + /// get ID_TEAM_BALANCER_SET_TEAM later. Byte 1 contains the team you requested to join. Following bytes contain NetworkID of which member. + ID_TEAM_BALANCER_REQUESTED_TEAM_CHANGE_PENDING, + /// Cannot switch to the desired team because all teams are locked. However, if someone on that team leaves, + /// you will get ID_TEAM_BALANCER_SET_TEAM later. Byte 1 contains the team you requested to join. + ID_TEAM_BALANCER_TEAMS_LOCKED, + /// Team balancer plugin informing you of your team. Byte 1 contains the team you requested to join. Following bytes contain NetworkID of which member. + ID_TEAM_BALANCER_TEAM_ASSIGNED, + + /// Gamebryo Lightspeed integration + ID_LIGHTSPEED_INTEGRATION, + + /// XBOX integration + ID_XBOX_LOBBY, + + /// The password we used to challenge the other system passed, meaning the other system has called TwoWayAuthentication::AddPassword() with the same password we passed to TwoWayAuthentication::Challenge() + /// You can read the identifier used to challenge as follows: + /// RakNet::BitStream bs(packet->data, packet->length, false); bs.IgnoreBytes(sizeof(RakNet::MessageID)); RakNet::RakString password; bs.Read(password); + ID_TWO_WAY_AUTHENTICATION_INCOMING_CHALLENGE_SUCCESS, + ID_TWO_WAY_AUTHENTICATION_OUTGOING_CHALLENGE_SUCCESS, + /// A remote system sent us a challenge using TwoWayAuthentication::Challenge(), and the challenge failed. + /// If the other system must pass the challenge to stay connected, you should call RakPeer::CloseConnection() to terminate the connection to the other system. + ID_TWO_WAY_AUTHENTICATION_INCOMING_CHALLENGE_FAILURE, + /// The other system did not add the password we used to TwoWayAuthentication::AddPassword() + /// You can read the identifier used to challenge as follows: + /// RakNet::BitStream bs(packet->data, packet->length, false); bs.IgnoreBytes(sizeof(MessageID)); RakNet::RakString password; bs.Read(password); + ID_TWO_WAY_AUTHENTICATION_OUTGOING_CHALLENGE_FAILURE, + /// The other system did not respond within a timeout threshhold. Either the other system is not running the plugin or the other system was blocking on some operation for a long time. + /// You can read the identifier used to challenge as follows: + /// RakNet::BitStream bs(packet->data, packet->length, false); bs.IgnoreBytes(sizeof(MessageID)); RakNet::RakString password; bs.Read(password); + ID_TWO_WAY_AUTHENTICATION_OUTGOING_CHALLENGE_TIMEOUT, + /// \internal + ID_TWO_WAY_AUTHENTICATION_NEGOTIATION, + + /// CloudClient / CloudServer + ID_CLOUD_POST_REQUEST, + ID_CLOUD_RELEASE_REQUEST, + ID_CLOUD_GET_REQUEST, + ID_CLOUD_GET_RESPONSE, + ID_CLOUD_UNSUBSCRIBE_REQUEST, + ID_CLOUD_SERVER_TO_SERVER_COMMAND, + ID_CLOUD_SUBSCRIPTION_NOTIFICATION, + + // So I can add more without changing user enumerations + ID_RESERVED_1, + ID_RESERVED_2, + ID_RESERVED_3, + ID_RESERVED_4, + ID_RESERVED_5, + ID_RESERVED_6, + ID_RESERVED_7, + ID_RESERVED_8, + ID_RESERVED_9, + + // For the user to use. Start your first enumeration at this value. + ID_USER_PACKET_ENUM, + //------------------------------------------------------------------------------------------------------------- + +}; + +#endif // RAKNET_USE_CUSTOM_PACKET_IDS + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NatPunchthroughClient.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NatPunchthroughClient.cpp new file mode 100644 index 0000000..28a9de4 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NatPunchthroughClient.cpp @@ -0,0 +1,970 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_NatPunchthroughClient==1 + +#include "NatPunchthroughClient.h" +#include "BitStream.h" +#include "MessageIdentifiers.h" +#include "RakPeerInterface.h" +#include "GetTime.h" +#include "PacketLogger.h" +#include "Itoa.h" + +using namespace RakNet; + +void NatPunchthroughDebugInterface_Printf::OnClientMessage(const char *msg) +{ + printf("%s\n", msg); +} +#if _RAKNET_SUPPORT_PacketLogger==1 +void NatPunchthroughDebugInterface_PacketLogger::OnClientMessage(const char *msg) +{ + if (pl) + { + pl->WriteMiscellaneous("Nat", msg); + } +} +#endif + +STATIC_FACTORY_DEFINITIONS(NatPunchthroughClient,NatPunchthroughClient); + +NatPunchthroughClient::NatPunchthroughClient() +{ + natPunchthroughDebugInterface=0; + mostRecentNewExternalPort=0; + sp.nextActionTime=0; +} +NatPunchthroughClient::~NatPunchthroughClient() +{ + rakPeerInterface=0; + Clear(); +} +bool NatPunchthroughClient::OpenNAT(RakNetGUID destination, const SystemAddress &facilitator) +{ + ConnectionState cs = rakPeerInterface->GetConnectionState(facilitator); + if (cs!=IS_CONNECTED) + return false; + + SendPunchthrough(destination, facilitator); + return true; +} +bool NatPunchthroughClient::OpenNATGroup(DataStructures::List destinationSystems, const SystemAddress &facilitator) +{ + ConnectionState cs = rakPeerInterface->GetConnectionState(facilitator); + if (cs!=IS_CONNECTED) + return false; + + unsigned long i; + for (i=0; i < destinationSystems.Size(); i++) + { + SendPunchthrough(destinationSystems[i], facilitator); + } + + GroupPunchRequest *gpr = RakNet::OP_NEW(_FILE_AND_LINE_); + gpr->facilitator=facilitator; + gpr->pendingList=destinationSystems; + groupPunchRequests.Push(gpr, _FILE_AND_LINE_); + + return true; +} +void NatPunchthroughClient::SetDebugInterface(NatPunchthroughDebugInterface *i) +{ + natPunchthroughDebugInterface=i; +} +void NatPunchthroughClient::Update(void) +{ + RakNet::Time time = RakNet::GetTime(); + if (sp.nextActionTime && sp.nextActionTime < time) + { + RakNet::Time delta = time - sp.nextActionTime; + if (sp.testMode==SendPing::TESTING_INTERNAL_IPS) + { + SendOutOfBand(sp.internalIds[sp.attemptCount],ID_NAT_ESTABLISH_UNIDIRECTIONAL); + + if (++sp.retryCount>=pc.UDP_SENDS_PER_PORT_INTERNAL) + { + ++sp.attemptCount; + sp.retryCount=0; + } + + if (sp.attemptCount>=pc.MAXIMUM_NUMBER_OF_INTERNAL_IDS_TO_CHECK) + { + sp.testMode=SendPing::WAITING_FOR_INTERNAL_IPS_RESPONSE; + if (pc.INTERNAL_IP_WAIT_AFTER_ATTEMPTS>0) + { + sp.nextActionTime=time+pc.INTERNAL_IP_WAIT_AFTER_ATTEMPTS-delta; + } + else + { + // TESTING: Try sending to unused ports on the remote system to reserve our own ports while not getting banned + sp.testMode=SendPing::SEND_WITH_TTL; + // sp.testMode=SendPing::TESTING_EXTERNAL_IPS_FACILITATOR_PORT_TO_FACILITATOR_PORT; + sp.attemptCount=0; + } + } + else + { + sp.nextActionTime=time+pc.TIME_BETWEEN_PUNCH_ATTEMPTS_INTERNAL-delta; + } + } + else if (sp.testMode==SendPing::WAITING_FOR_INTERNAL_IPS_RESPONSE) + { + // TESTING: Try sending to unused ports on the remote system to reserve our own ports while not getting banned + sp.testMode=SendPing::SEND_WITH_TTL; + // sp.testMode=SendPing::TESTING_EXTERNAL_IPS_FACILITATOR_PORT_TO_FACILITATOR_PORT; + sp.attemptCount=0; + } + else if (sp.testMode==SendPing::SEND_WITH_TTL) + { + // See http://www.jenkinssoftware.com/forum/index.php?topic=4021.0 + // For Linux 2.6.32 soft-router (ip-tables) + /* + If I understand correctly, getting a datagram on a particular address that was not previously used causes that the port for that address to not be used for when a reply would have otherwise been sent back from that address. + + PHASE 1: + 1. System 1 and 2 send to each other. + 2. Due to latency, system 1 sends first using the server port. + 3. System 2 gets the datagram and no longer uses the server port. Instead, it replies using port 1024. + 4. System 1 gets the reply. The source port is wrong, so it is rejected. + + To put it another way, if a router gets a datagram on a port that was not previously used, it will not reply on that port. However, if it doesn't reply on that port, the message will not be accepted by the remote system. + */ + + // Send to unused port. We do not want the message to arrive, just to open our router's table + SystemAddress sa=sp.targetAddress; + int ttlSendIndex; + for (ttlSendIndex=0; ttlSendIndex <= pc.MAX_PREDICTIVE_PORT_RANGE; ttlSendIndex++) + { + sa.SetPort((unsigned short) (sp.targetAddress.GetPort()+ttlSendIndex)); + SendTTL(sa); + } + + // Only do this stage once + // Wait 250 milliseconds for next stage. The delay is so that even with timing errors both systems send out the + // datagram with TTL before either sends a real one + sp.testMode=SendPing::TESTING_EXTERNAL_IPS_FACILITATOR_PORT_TO_FACILITATOR_PORT; + sp.nextActionTime=time-delta+250; + } + else if (sp.testMode==SendPing::TESTING_EXTERNAL_IPS_FACILITATOR_PORT_TO_FACILITATOR_PORT) + { + SystemAddress sa=sp.targetAddress; + sa.SetPort((unsigned short) (sa.GetPort()+sp.attemptCount)); + SendOutOfBand(sa,ID_NAT_ESTABLISH_UNIDIRECTIONAL); + + IncrementExternalAttemptCount(time, delta); + + if (sp.attemptCount>pc.MAX_PREDICTIVE_PORT_RANGE) + { + sp.testMode=SendPing::WAITING_AFTER_ALL_ATTEMPTS; + sp.nextActionTime=time+pc.EXTERNAL_IP_WAIT_AFTER_ALL_ATTEMPTS-delta; + + // Skip TESTING_EXTERNAL_IPS_1024_TO_FACILITATOR_PORT, etc. + /* + sp.testMode=SendPing::TESTING_EXTERNAL_IPS_1024_TO_FACILITATOR_PORT; + sp.attemptCount=0; + */ + } + } + else if (sp.testMode==SendPing::TESTING_EXTERNAL_IPS_1024_TO_FACILITATOR_PORT) + { + SystemAddress sa=sp.targetAddress; + if ( sp.targetGuid < rakPeerInterface->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS) ) + sa.SetPort((unsigned short) (1024+sp.attemptCount)); + else + sa.SetPort((unsigned short) (sa.GetPort()+sp.attemptCount)); + SendOutOfBand(sa,ID_NAT_ESTABLISH_UNIDIRECTIONAL); + + IncrementExternalAttemptCount(time, delta); + + if (sp.attemptCount>pc.MAX_PREDICTIVE_PORT_RANGE) + { + // From 1024 disabled, never helps as I've seen, but slows down the process by half + sp.testMode=SendPing::TESTING_EXTERNAL_IPS_FACILITATOR_PORT_TO_1024; + sp.attemptCount=0; + } + + } + else if (sp.testMode==SendPing::TESTING_EXTERNAL_IPS_FACILITATOR_PORT_TO_1024) + { + SystemAddress sa=sp.targetAddress; + if ( sp.targetGuid > rakPeerInterface->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS) ) + sa.SetPort((unsigned short) (1024+sp.attemptCount)); + else + sa.SetPort((unsigned short) (sa.GetPort()+sp.attemptCount)); + SendOutOfBand(sa,ID_NAT_ESTABLISH_UNIDIRECTIONAL); + + IncrementExternalAttemptCount(time, delta); + + if (sp.attemptCount>pc.MAX_PREDICTIVE_PORT_RANGE) + { + // From 1024 disabled, never helps as I've seen, but slows down the process by half + sp.testMode=SendPing::TESTING_EXTERNAL_IPS_1024_TO_1024; + sp.attemptCount=0; + } + } + else if (sp.testMode==SendPing::TESTING_EXTERNAL_IPS_1024_TO_1024) + { + SystemAddress sa=sp.targetAddress; + sa.SetPort((unsigned short) (1024+sp.attemptCount)); + SendOutOfBand(sa,ID_NAT_ESTABLISH_UNIDIRECTIONAL); + + IncrementExternalAttemptCount(time, delta); + + if (sp.attemptCount>pc.MAX_PREDICTIVE_PORT_RANGE) + { + if (natPunchthroughDebugInterface) + { + char ipAddressString[32]; + sp.targetAddress.ToString(true, ipAddressString); + char guidString[128]; + sp.targetGuid.ToString(guidString); + natPunchthroughDebugInterface->OnClientMessage(RakNet::RakString("Likely bidirectional punchthrough failure to guid %s, system address %s.", guidString, ipAddressString)); + } + + sp.testMode=SendPing::WAITING_AFTER_ALL_ATTEMPTS; + sp.nextActionTime=time+pc.EXTERNAL_IP_WAIT_AFTER_ALL_ATTEMPTS-delta; + } + } + else if (sp.testMode==SendPing::WAITING_AFTER_ALL_ATTEMPTS) + { + // Failed. Tell the user + OnPunchthroughFailure(); + UpdateGroupPunchOnNatResult(sp.facilitator, sp.targetGuid, sp.targetAddress, 1); + } + + if (sp.testMode==SendPing::PUNCHING_FIXED_PORT) + { + SendOutOfBand(sp.targetAddress,ID_NAT_ESTABLISH_BIDIRECTIONAL); + if (++sp.retryCount>=sp.punchingFixedPortAttempts) + { + if (natPunchthroughDebugInterface) + { + char ipAddressString[32]; + sp.targetAddress.ToString(true, ipAddressString); + char guidString[128]; + sp.targetGuid.ToString(guidString); + natPunchthroughDebugInterface->OnClientMessage(RakNet::RakString("Likely unidirectional punchthrough failure to guid %s, system address %s.", guidString, ipAddressString)); + } + + sp.testMode=SendPing::WAITING_AFTER_ALL_ATTEMPTS; + sp.nextActionTime=time+pc.EXTERNAL_IP_WAIT_AFTER_ALL_ATTEMPTS-delta; + } + else + { + if ((sp.retryCount%pc.UDP_SENDS_PER_PORT_EXTERNAL)==0) + sp.nextActionTime=time+pc.EXTERNAL_IP_WAIT_BETWEEN_PORTS-delta; + else + sp.nextActionTime=time+pc.TIME_BETWEEN_PUNCH_ATTEMPTS_EXTERNAL-delta; + } + } + } + + // Remove elapsed groupRequestsInProgress + unsigned int i; + i=0; + while (i < groupRequestsInProgress.Size()) + { + if (time > groupRequestsInProgress[i].time) + groupRequestsInProgress.RemoveAtIndexFast(i); + else + i++; + } +} +void NatPunchthroughClient::PushFailure(void) +{ + Packet *p = AllocatePacketUnified(sizeof(MessageID)+sizeof(unsigned char)); + p->data[0]=ID_NAT_PUNCHTHROUGH_FAILED; + p->systemAddress=sp.targetAddress; + p->systemAddress.systemIndex=(SystemIndex)-1; + p->guid=sp.targetGuid; + if (sp.weAreSender) + p->data[1]=1; + else + p->data[1]=0; + p->wasGeneratedLocally=true; + rakPeerInterface->PushBackPacket(p, true); +} +void NatPunchthroughClient::OnPunchthroughFailure(void) +{ + if (pc.retryOnFailure==false) + { + if (natPunchthroughDebugInterface) + { + char ipAddressString[32]; + sp.targetAddress.ToString(true, ipAddressString); + char guidString[128]; + sp.targetGuid.ToString(guidString); + natPunchthroughDebugInterface->OnClientMessage(RakNet::RakString("Failed punchthrough once. Returning failure to guid %s, system address %s to user.", guidString, ipAddressString)); + } + + PushFailure(); + OnReadyForNextPunchthrough(); + return; + } + + unsigned int i; + for (i=0; i < failedAttemptList.Size(); i++) + { + if (failedAttemptList[i].guid==sp.targetGuid) + { + if (natPunchthroughDebugInterface) + { + char ipAddressString[32]; + sp.targetAddress.ToString(true, ipAddressString); + char guidString[128]; + sp.targetGuid.ToString(guidString); + natPunchthroughDebugInterface->OnClientMessage(RakNet::RakString("Failed punchthrough twice. Returning failure to guid %s, system address %s to user.", guidString, ipAddressString)); + } + + // Failed a second time, so return failed to user + PushFailure(); + + OnReadyForNextPunchthrough(); + + failedAttemptList.RemoveAtIndexFast(i); + return; + } + } + + if (rakPeerInterface->GetConnectionState(sp.facilitator)!=IS_CONNECTED) + { + if (natPunchthroughDebugInterface) + { + char ipAddressString[32]; + sp.targetAddress.ToString(true, ipAddressString); + char guidString[128]; + sp.targetGuid.ToString(guidString); + natPunchthroughDebugInterface->OnClientMessage(RakNet::RakString("Not connected to facilitator, so cannot retry punchthrough after first failure. Returning failure onj guid %s, system address %s to user.", guidString, ipAddressString)); + } + + // Failed, and can't try again because no facilitator + PushFailure(); + return; + } + + if (natPunchthroughDebugInterface) + { + char ipAddressString[32]; + sp.targetAddress.ToString(true, ipAddressString); + char guidString[128]; + sp.targetGuid.ToString(guidString); + natPunchthroughDebugInterface->OnClientMessage(RakNet::RakString("First punchthrough failure on guid %s, system address %s. Reattempting.", guidString, ipAddressString)); + } + + // Failed the first time. Add to the failure queue and try again + AddrAndGuid aag; + aag.addr=sp.targetAddress; + aag.guid=sp.targetGuid; + failedAttemptList.Push(aag, _FILE_AND_LINE_); + + // Tell the server we are ready + OnReadyForNextPunchthrough(); + + // If we are the sender, try again, immediately if possible, else added to the queue on the faciltiator + if (sp.weAreSender) + SendPunchthrough(sp.targetGuid, sp.facilitator); +} +PluginReceiveResult NatPunchthroughClient::OnReceive(Packet *packet) +{ + switch (packet->data[0]) + { + case ID_NAT_GET_MOST_RECENT_PORT: + { + OnGetMostRecentPort(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + case ID_NAT_PUNCHTHROUGH_FAILED: + case ID_NAT_PUNCHTHROUGH_SUCCEEDED: + if (packet->wasGeneratedLocally==false) + return RR_STOP_PROCESSING_AND_DEALLOCATE; + break; + case ID_OUT_OF_BAND_INTERNAL: + if (packet->length>=2 && + (packet->data[1]==ID_NAT_ESTABLISH_UNIDIRECTIONAL || packet->data[1]==ID_NAT_ESTABLISH_BIDIRECTIONAL) && + sp.nextActionTime!=0) + { + RakNet::BitStream bs(packet->data,packet->length,false); + bs.IgnoreBytes(2); + uint16_t sessionId; + bs.Read(sessionId); +// RakAssert(sessionId<100); + if (sessionId!=sp.sessionId) + break; + + char ipAddressString[32]; + packet->systemAddress.ToString(true,ipAddressString); + // sp.targetGuid==packet->guid is because the internal IP addresses reported may include loopbacks not reported by RakPeer::IsLocalIP() + if (packet->data[1]==ID_NAT_ESTABLISH_UNIDIRECTIONAL && sp.targetGuid==packet->guid) + { + if (natPunchthroughDebugInterface) + { + char guidString[128]; + sp.targetGuid.ToString(guidString); + natPunchthroughDebugInterface->OnClientMessage(RakNet::RakString("Received ID_NAT_ESTABLISH_UNIDIRECTIONAL from guid %s, system address %s.", guidString, ipAddressString)); + } + if (sp.testMode!=SendPing::PUNCHING_FIXED_PORT) + { + sp.testMode=SendPing::PUNCHING_FIXED_PORT; + sp.retryCount+=sp.attemptCount*pc.UDP_SENDS_PER_PORT_EXTERNAL; + sp.targetAddress=packet->systemAddress; + // Keeps trying until the other side gives up too, in case it is unidirectional + sp.punchingFixedPortAttempts=pc.UDP_SENDS_PER_PORT_EXTERNAL*(pc.MAX_PREDICTIVE_PORT_RANGE+1); + } + + SendOutOfBand(sp.targetAddress,ID_NAT_ESTABLISH_BIDIRECTIONAL); + } + else if (packet->data[1]==ID_NAT_ESTABLISH_BIDIRECTIONAL && + sp.targetGuid==packet->guid) + { + // They send back our port + bs.Read(mostRecentNewExternalPort); + + SendOutOfBand(packet->systemAddress,ID_NAT_ESTABLISH_BIDIRECTIONAL); + + // Tell the user about the success + sp.targetAddress=packet->systemAddress; + PushSuccess(); + UpdateGroupPunchOnNatResult(sp.facilitator, sp.targetGuid, sp.targetAddress, 1); + OnReadyForNextPunchthrough(); + bool removedFromFailureQueue=RemoveFromFailureQueue(); + + if (natPunchthroughDebugInterface) + { + char guidString[128]; + sp.targetGuid.ToString(guidString); + if (removedFromFailureQueue) + natPunchthroughDebugInterface->OnClientMessage(RakNet::RakString("Punchthrough to guid %s, system address %s succeeded on 2nd attempt.", guidString, ipAddressString)); + else + natPunchthroughDebugInterface->OnClientMessage(RakNet::RakString("Punchthrough to guid %s, system address %s succeeded on 1st attempt.", guidString, ipAddressString)); + } + } + + // mostRecentNewExternalPort=packet->systemAddress.GetPort(); + } + return RR_STOP_PROCESSING_AND_DEALLOCATE; + case ID_NAT_ALREADY_IN_PROGRESS: + { + RakNet::BitStream incomingBs(packet->data, packet->length, false); + incomingBs.IgnoreBytes(sizeof(MessageID)); + RakNetGUID targetGuid; + incomingBs.Read(targetGuid); + // Don't update group, just use later message + // UpdateGroupPunchOnNatResult(packet->systemAddress, targetGuid, UNASSIGNED_SYSTEM_ADDRESS, 2); + if (natPunchthroughDebugInterface) + { + char guidString[128]; + targetGuid.ToString(guidString); + natPunchthroughDebugInterface->OnClientMessage(RakNet::RakString("Punchthrough retry to guid %s failed due to ID_NAT_ALREADY_IN_PROGRESS. Returning failure.", guidString)); + } + + } + break; + case ID_NAT_TARGET_NOT_CONNECTED: + case ID_NAT_CONNECTION_TO_TARGET_LOST: + case ID_NAT_TARGET_UNRESPONSIVE: + { + const char *reason; + if (packet->data[0]==ID_NAT_TARGET_NOT_CONNECTED) + reason=(char *)"ID_NAT_TARGET_NOT_CONNECTED"; + else if (packet->data[0]==ID_NAT_CONNECTION_TO_TARGET_LOST) + reason=(char *)"ID_NAT_CONNECTION_TO_TARGET_LOST"; + else + reason=(char *)"ID_NAT_TARGET_UNRESPONSIVE"; + + + RakNet::BitStream incomingBs(packet->data, packet->length, false); + incomingBs.IgnoreBytes(sizeof(MessageID)); + + RakNetGUID targetGuid; + incomingBs.Read(targetGuid); + UpdateGroupPunchOnNatResult(packet->systemAddress, targetGuid, UNASSIGNED_SYSTEM_ADDRESS, 2); + + if (packet->data[0]==ID_NAT_CONNECTION_TO_TARGET_LOST || + packet->data[0]==ID_NAT_TARGET_UNRESPONSIVE) + { + uint16_t sessionId; + incomingBs.Read(sessionId); + if (sessionId!=sp.sessionId) + break; + } + + unsigned int i; + for (i=0; i < failedAttemptList.Size(); i++) + { + if (failedAttemptList[i].guid==targetGuid) + { + if (natPunchthroughDebugInterface) + { + char guidString[128]; + targetGuid.ToString(guidString); + natPunchthroughDebugInterface->OnClientMessage(RakNet::RakString("Punchthrough retry to guid %s failed due to %s.", guidString, reason)); + + } + + // If the retry target is not connected, or loses connection, or is not responsive, then previous failures cannot be retried. + + // Don't need to return failed, the other messages indicate failure anyway + /* + Packet *p = AllocatePacketUnified(sizeof(MessageID)); + p->data[0]=ID_NAT_PUNCHTHROUGH_FAILED; + p->systemAddress=failedAttemptList[i].addr; + p->systemAddress.systemIndex=(SystemIndex)-1; + p->guid=failedAttemptList[i].guid; + rakPeerInterface->PushBackPacket(p, false); + */ + + failedAttemptList.RemoveAtIndexFast(i); + break; + } + } + + if (natPunchthroughDebugInterface) + { + char guidString[128]; + targetGuid.ToString(guidString); + natPunchthroughDebugInterface->OnClientMessage(RakNet::RakString("Punchthrough attempt to guid %s failed due to %s.", guidString, reason)); + } + + // Stop trying punchthrough + sp.nextActionTime=0; + + /* + RakNet::BitStream bs(packet->data, packet->length, false); + bs.IgnoreBytes(sizeof(MessageID)); + RakNetGUID failedSystem; + bs.Read(failedSystem); + bool deletedFirst=false; + unsigned int i=0; + while (i < pendingOpenNAT.Size()) + { + if (pendingOpenNAT[i].destination==failedSystem) + { + if (i==0) + deletedFirst=true; + pendingOpenNAT.RemoveAtIndex(i); + } + else + i++; + } + // Failed while in progress. Go to next in attempt queue + if (deletedFirst && pendingOpenNAT.Size()) + { + SendPunchthrough(pendingOpenNAT[0].destination, pendingOpenNAT[0].facilitator); + sp.nextActionTime=0; + } + */ + } + break; + case ID_TIMESTAMP: + if (packet->data[sizeof(MessageID)+sizeof(RakNet::Time)]==ID_NAT_CONNECT_AT_TIME) + { + OnConnectAtTime(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + break; + } + return RR_CONTINUE_PROCESSING; +} +/* +void NatPunchthroughClient::ProcessNextPunchthroughQueue(void) +{ + // Go to the next attempt + if (pendingOpenNAT.Size()) + pendingOpenNAT.RemoveAtIndex(0); + + // Do next punchthrough attempt + if (pendingOpenNAT.Size()) + SendPunchthrough(pendingOpenNAT[0].destination, pendingOpenNAT[0].facilitator); + + sp.nextActionTime=0; +} +*/ +void NatPunchthroughClient::OnConnectAtTime(Packet *packet) +{ +// RakAssert(sp.nextActionTime==0); + + RakNet::BitStream bs(packet->data, packet->length, false); + bs.IgnoreBytes(sizeof(MessageID)); + bs.Read(sp.nextActionTime); + bs.IgnoreBytes(sizeof(MessageID)); + bs.Read(sp.sessionId); + bs.Read(sp.targetAddress); + int j; +// int k; +// k=0; + for (j=0; j < MAXIMUM_NUMBER_OF_INTERNAL_IDS; j++) + bs.Read(sp.internalIds[j]); + + // Prevents local testing + /* + for (j=0; j < MAXIMUM_NUMBER_OF_INTERNAL_IDS; j++) + { + SystemAddress id; + bs.Read(id); + char str[32]; + id.ToString(false,str); + if (rakPeerInterface->IsLocalIP(str)==false) + sp.internalIds[k++]=id; + } + */ + sp.attemptCount=0; + sp.retryCount=0; + if (pc.MAXIMUM_NUMBER_OF_INTERNAL_IDS_TO_CHECK>0) + { + sp.testMode=SendPing::TESTING_INTERNAL_IPS; + } + else + { + // TESTING: Try sending to unused ports on the remote system to reserve our own ports while not getting banned + sp.testMode=SendPing::SEND_WITH_TTL; + // sp.testMode=SendPing::TESTING_EXTERNAL_IPS_FACILITATOR_PORT_TO_FACILITATOR_PORT; + } + bs.Read(sp.targetGuid); + bs.Read(sp.weAreSender); +} +void NatPunchthroughClient::SendTTL(const SystemAddress &sa) +{ + if (sa==UNASSIGNED_SYSTEM_ADDRESS) + return; + if (sa.GetPort()==0) + return; + + char ipAddressString[32]; + sa.ToString(false, ipAddressString); + // TTL of 1 doesn't get past the router, 2 might hit the other system on a LAN + rakPeerInterface->SendTTL(ipAddressString,sa.GetPort(), 2); +} +void NatPunchthroughClient::SendOutOfBand(SystemAddress sa, MessageID oobId) +{ + if (sa==UNASSIGNED_SYSTEM_ADDRESS) + return; + if (sa.GetPort()==0) + return; + + RakNet::BitStream oob; + oob.Write(oobId); + oob.Write(sp.sessionId); +// RakAssert(sp.sessionId<100); + if (oobId==ID_NAT_ESTABLISH_BIDIRECTIONAL) + oob.Write(sa.GetPort()); + char ipAddressString[32]; + sa.ToString(false, ipAddressString); + rakPeerInterface->SendOutOfBand((const char*) ipAddressString,sa.GetPort(),(const char*) oob.GetData(),oob.GetNumberOfBytesUsed()); + + if (natPunchthroughDebugInterface) + { + sa.ToString(true,ipAddressString); + char guidString[128]; + sp.targetGuid.ToString(guidString); + + if (oobId==ID_NAT_ESTABLISH_UNIDIRECTIONAL) + natPunchthroughDebugInterface->OnClientMessage(RakNet::RakString("Sent OOB ID_NAT_ESTABLISH_UNIDIRECTIONAL to guid %s, system address %s.", guidString, ipAddressString)); + else + natPunchthroughDebugInterface->OnClientMessage(RakNet::RakString("Sent OOB ID_NAT_ESTABLISH_BIDIRECTIONAL to guid %s, system address %s.", guidString, ipAddressString)); + } +} +void NatPunchthroughClient::OnNewConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, bool isIncoming) +{ + (void) rakNetGUID; + (void) isIncoming; + + // Try to track new port mappings on the router. Not reliable, but better than nothing. + SystemAddress ourExternalId = rakPeerInterface->GetExternalID(systemAddress); + if (ourExternalId!=UNASSIGNED_SYSTEM_ADDRESS) + mostRecentNewExternalPort=ourExternalId.GetPort(); + + unsigned int i; + i=0; + while (i < groupRequestsInProgress.Size()) + { + if (groupRequestsInProgress[i].guid==rakNetGUID) + { + groupRequestsInProgress.RemoveAtIndexFast(i); + } + else + { + i++; + } + } +} + +void NatPunchthroughClient::OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ) +{ + (void) systemAddress; + (void) rakNetGUID; + (void) lostConnectionReason; + + if (sp.facilitator==systemAddress) + { + // If we lose the connection to the facilitator, all previous failures not currently in progress are returned as such + unsigned int i=0; + while (i < failedAttemptList.Size()) + { + if (sp.nextActionTime!=0 && sp.targetGuid==failedAttemptList[i].guid) + { + i++; + continue; + } + + PushFailure(); + + failedAttemptList.RemoveAtIndexFast(i); + } + } + + unsigned int i; + i=0; + while (i < groupPunchRequests.Size()) + { + if (groupPunchRequests[i]->facilitator==systemAddress) + { + RakNet::OP_DELETE(groupPunchRequests[i],_FILE_AND_LINE_); + groupPunchRequests.RemoveAtIndexFast(i); + } + else + { + i++; + } + } + +} +void NatPunchthroughClient::GetUPNPPortMappings(char *externalPort, char *internalPort, const SystemAddress &natPunchthroughServerAddress) +{ + DataStructures::List > sockets; + rakPeerInterface->GetSockets(sockets); + Itoa(sockets[0]->boundAddress.GetPort(),internalPort,10); + if (mostRecentNewExternalPort==0) + mostRecentNewExternalPort=rakPeerInterface->GetExternalID(natPunchthroughServerAddress).GetPort(); + Itoa(mostRecentNewExternalPort,externalPort,10); +} +void NatPunchthroughClient::OnFailureNotification(Packet *packet) +{ + RakNet::BitStream incomingBs(packet->data,packet->length,false); + incomingBs.IgnoreBytes(sizeof(MessageID)); + RakNetGUID senderGuid; + incomingBs.Read(senderGuid); + + unsigned int i; + i=0; + while (i < groupRequestsInProgress.Size()) + { + if (groupRequestsInProgress[i].guid==senderGuid) + { + groupRequestsInProgress.RemoveAtIndexFast(i); + break; + } + else + { + i++; + } + } +} +void NatPunchthroughClient::OnGetMostRecentPort(Packet *packet) +{ + RakNet::BitStream incomingBs(packet->data,packet->length,false); + incomingBs.IgnoreBytes(sizeof(MessageID)); + uint16_t sessionId; + incomingBs.Read(sessionId); + + RakNet::BitStream outgoingBs; + outgoingBs.Write((MessageID)ID_NAT_GET_MOST_RECENT_PORT); + outgoingBs.Write(sessionId); + if (mostRecentNewExternalPort==0) + mostRecentNewExternalPort=rakPeerInterface->GetExternalID(packet->systemAddress).GetPort(); + RakAssert(mostRecentNewExternalPort!=0); + outgoingBs.Write(mostRecentNewExternalPort); + rakPeerInterface->Send(&outgoingBs,HIGH_PRIORITY,RELIABLE_ORDERED,0,packet->systemAddress,false); + sp.facilitator=packet->systemAddress; +} +/* +unsigned int NatPunchthroughClient::GetPendingOpenNATIndex(RakNetGUID destination, const SystemAddress &facilitator) +{ + unsigned int i; + for (i=0; i < pendingOpenNAT.Size(); i++) + { + if (pendingOpenNAT[i].destination==destination && pendingOpenNAT[i].facilitator==facilitator) + return i; + } + return (unsigned int) -1; +} +*/ +void NatPunchthroughClient::SendPunchthrough(RakNetGUID destination, const SystemAddress &facilitator) +{ + RakNet::BitStream outgoingBs; + outgoingBs.Write((MessageID)ID_NAT_PUNCHTHROUGH_REQUEST); + outgoingBs.Write(destination); + rakPeerInterface->Send(&outgoingBs,HIGH_PRIORITY,RELIABLE_ORDERED,0,facilitator,false); + +// RakAssert(rakPeerInterface->GetSystemAddressFromGuid(destination)==UNASSIGNED_SYSTEM_ADDRESS); + + if (natPunchthroughDebugInterface) + { + char guidString[128]; + destination.ToString(guidString); + natPunchthroughDebugInterface->OnClientMessage(RakNet::RakString("Starting ID_NAT_PUNCHTHROUGH_REQUEST to guid %s.", guidString)); + } +} +void NatPunchthroughClient::OnAttach(void) +{ + Clear(); +} +void NatPunchthroughClient::OnDetach(void) +{ + Clear(); +} +void NatPunchthroughClient::OnRakPeerShutdown(void) +{ + Clear(); +} +void NatPunchthroughClient::Clear(void) +{ + OnReadyForNextPunchthrough(); + + failedAttemptList.Clear(false, _FILE_AND_LINE_); + groupRequestsInProgress.Clear(false, _FILE_AND_LINE_); + unsigned int i; + for (i=0; i < groupPunchRequests.Size(); i++) + { + RakNet::OP_DELETE(groupPunchRequests[i],_FILE_AND_LINE_); + } + groupPunchRequests.Clear(true, _FILE_AND_LINE_); +} +PunchthroughConfiguration* NatPunchthroughClient::GetPunchthroughConfiguration(void) +{ + return &pc; +} +void NatPunchthroughClient::OnReadyForNextPunchthrough(void) +{ + if (rakPeerInterface==0) + return; + + sp.nextActionTime=0; + + RakNet::BitStream outgoingBs; + outgoingBs.Write((MessageID)ID_NAT_CLIENT_READY); + rakPeerInterface->Send(&outgoingBs,HIGH_PRIORITY,RELIABLE_ORDERED,0,sp.facilitator,false); +} + +void NatPunchthroughClient::PushSuccess(void) +{ + Packet *p = AllocatePacketUnified(sizeof(MessageID)+sizeof(unsigned char)); + p->data[0]=ID_NAT_PUNCHTHROUGH_SUCCEEDED; + p->systemAddress=sp.targetAddress; + p->systemAddress.systemIndex=(SystemIndex)-1; + p->guid=sp.targetGuid; + if (sp.weAreSender) + p->data[1]=1; + else + p->data[1]=0; + p->wasGeneratedLocally=true; + rakPeerInterface->PushBackPacket(p, true); +} +bool NatPunchthroughClient::RemoveFromFailureQueue(void) +{ + unsigned int i; + for (i=0; i < failedAttemptList.Size(); i++) + { + if (failedAttemptList[i].guid==sp.targetGuid) + { + // Remove from failure queue + failedAttemptList.RemoveAtIndexFast(i); + return true; + } + } + return false; +} + +void NatPunchthroughClient::IncrementExternalAttemptCount(RakNet::Time time, RakNet::Time delta) +{ + if (++sp.retryCount>=pc.UDP_SENDS_PER_PORT_EXTERNAL) + { + ++sp.attemptCount; + sp.retryCount=0; + sp.nextActionTime=time+pc.EXTERNAL_IP_WAIT_BETWEEN_PORTS-delta; + } + else + { + sp.nextActionTime=time+pc.TIME_BETWEEN_PUNCH_ATTEMPTS_EXTERNAL-delta; + } +} +// 0=failed, 1=success, 2=ignore +void NatPunchthroughClient::UpdateGroupPunchOnNatResult(SystemAddress facilitator, RakNetGUID targetSystem, SystemAddress targetSystemAddress, int result) +{ + GroupPunchRequest *gpr; + unsigned long i,j,k; + i=0; + while (i < groupPunchRequests.Size()) + { + gpr = groupPunchRequests[i]; + if (gpr->facilitator==facilitator) + { + j=0; + while (j < gpr->pendingList.Size()) + { + if (gpr->pendingList[j]==targetSystem) + { + if (result==0) + { + gpr->failedList.Push(targetSystem, _FILE_AND_LINE_); + } + else if (result==1) + { + gpr->passedListGuid.Push(targetSystem, _FILE_AND_LINE_); + gpr->passedListAddress.Push(targetSystemAddress, _FILE_AND_LINE_); + } + else + { + gpr->ignoredList.Push(targetSystem, _FILE_AND_LINE_); + } + gpr->pendingList.RemoveAtIndex(j); + } + else + j++; + } + } + if (gpr->pendingList.Size()==0) + { + RakNet::BitStream output; + if (gpr->failedList.Size()==0) + { + output.Write(ID_NAT_GROUP_PUNCH_SUCCEEDED); + } + else + { + output.Write(ID_NAT_GROUP_PUNCH_FAILED); + } + + output.WriteCasted(gpr->passedListGuid.Size()); + for (k=0; k < gpr->passedListGuid.Size(); k++) + { + output.Write(gpr->passedListGuid[k]); + output.Write(gpr->passedListAddress[k]); + } + output.WriteCasted(gpr->ignoredList.Size()); + for (k=0; k < gpr->ignoredList.Size(); k++) + { + output.Write(gpr->ignoredList[k]); + } + output.WriteCasted(gpr->failedList.Size()); + for (k=0; k < gpr->failedList.Size(); k++) + { + output.Write(gpr->failedList[k]); + } + + Packet *p = AllocatePacketUnified(output.GetNumberOfBytesUsed()); + p->systemAddress=gpr->facilitator; + p->systemAddress.systemIndex=(SystemIndex)-1; + p->guid=rakPeerInterface->GetGuidFromSystemAddress(gpr->facilitator); + p->wasGeneratedLocally=true; + memcpy(p->data, output.GetData(), output.GetNumberOfBytesUsed()); + rakPeerInterface->PushBackPacket(p, true); + + groupPunchRequests.RemoveAtIndex(i); + RakNet::OP_DELETE(gpr, _FILE_AND_LINE_); + } + else + i++; + } +} + +#endif // _RAKNET_SUPPORT_* + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NatPunchthroughClient.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NatPunchthroughClient.h new file mode 100644 index 0000000..c12b390 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NatPunchthroughClient.h @@ -0,0 +1,265 @@ + +/// \file +/// \brief Contains the NAT-punchthrough plugin for the client. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_NatPunchthroughClient==1 + +#ifndef __NAT_PUNCHTHROUGH_CLIENT_H +#define __NAT_PUNCHTHROUGH_CLIENT_H + +#include "RakNetTypes.h" +#include "Export.h" +#include "PluginInterface2.h" +#include "PacketPriority.h" +#include "SocketIncludes.h" +#include "DS_List.h" +#include "RakString.h" + +// Trendnet TEW-632BRP sometimes starts at port 1024 and increments sequentially. +// Zonnet zsr1134we. Replies go out on the net, but are always absorbed by the remote router?? +// Dlink ebr2310 to Trendnet ok +// Trendnet TEW-652BRP to Trendnet 632BRP OK +// Trendnet TEW-632BRP to Trendnet 632BRP OK +// Buffalo WHR-HP-G54 OK +// Netgear WGR614 ok + +namespace RakNet +{ +/// Forward declarations +class RakPeerInterface; +struct Packet; +#if _RAKNET_SUPPORT_PacketLogger==1 +class PacketLogger; +#endif + +/// \ingroup NAT_PUNCHTHROUGH_GROUP +struct RAK_DLL_EXPORT PunchthroughConfiguration +{ + /// internal: (15 ms * 2 tries + 30 wait) * 5 ports * 8 players = 2.4 seconds + /// external: (50 ms * 8 sends + 100 wait) * 2 port * 8 players = 8 seconds + /// Total: 8 seconds + PunchthroughConfiguration() { + TIME_BETWEEN_PUNCH_ATTEMPTS_INTERNAL=15; + TIME_BETWEEN_PUNCH_ATTEMPTS_EXTERNAL=50; + UDP_SENDS_PER_PORT_INTERNAL=2; + UDP_SENDS_PER_PORT_EXTERNAL=8; + INTERNAL_IP_WAIT_AFTER_ATTEMPTS=30; + MAXIMUM_NUMBER_OF_INTERNAL_IDS_TO_CHECK=5; /// set to 0 to not do lan connects + MAX_PREDICTIVE_PORT_RANGE=2; + EXTERNAL_IP_WAIT_BETWEEN_PORTS=100; + EXTERNAL_IP_WAIT_AFTER_ALL_ATTEMPTS=EXTERNAL_IP_WAIT_BETWEEN_PORTS; + retryOnFailure=false; + } + + /// How much time between each UDP send + RakNet::Time TIME_BETWEEN_PUNCH_ATTEMPTS_INTERNAL; + RakNet::Time TIME_BETWEEN_PUNCH_ATTEMPTS_EXTERNAL; + + /// How many tries for one port before giving up and going to the next port + int UDP_SENDS_PER_PORT_INTERNAL; + int UDP_SENDS_PER_PORT_EXTERNAL; + + /// After giving up on one internal port, how long to wait before trying the next port + int INTERNAL_IP_WAIT_AFTER_ATTEMPTS; + + /// How many external ports to try past the last known starting port + int MAX_PREDICTIVE_PORT_RANGE; + + /// After giving up on one external port, how long to wait before trying the next port + int EXTERNAL_IP_WAIT_BETWEEN_PORTS; + + /// After trying all external ports, how long to wait before returning ID_NAT_PUNCHTHROUGH_FAILED + int EXTERNAL_IP_WAIT_AFTER_ALL_ATTEMPTS; + + /// Maximum number of internal IP address to try to connect to. + /// Cannot be greater than MAXIMUM_NUMBER_OF_INTERNAL_IDS + /// Should be high enough to try all internal IP addresses on the majority of computers + int MAXIMUM_NUMBER_OF_INTERNAL_IDS_TO_CHECK; + + /// If the first punchthrough attempt fails, try again + /// This sometimes works because the remote router was looking for an incoming message on a higher numbered port before responding to a lower numbered port from the other system + bool retryOnFailure; +}; + +/// \ingroup NAT_PUNCHTHROUGH_GROUP +struct RAK_DLL_EXPORT NatPunchthroughDebugInterface +{ + NatPunchthroughDebugInterface() {} + virtual ~NatPunchthroughDebugInterface() {} + virtual void OnClientMessage(const char *msg)=0; +}; + +/// \ingroup NAT_PUNCHTHROUGH_GROUP +struct RAK_DLL_EXPORT NatPunchthroughDebugInterface_Printf : public NatPunchthroughDebugInterface +{ + virtual void OnClientMessage(const char *msg); +}; + +#if _RAKNET_SUPPORT_PacketLogger==1 +/// \ingroup NAT_PUNCHTHROUGH_GROUP +struct RAK_DLL_EXPORT NatPunchthroughDebugInterface_PacketLogger : public NatPunchthroughDebugInterface +{ + // Set to non-zero to write to the packetlogger! + PacketLogger *pl; + + NatPunchthroughDebugInterface_PacketLogger() {pl=0;} + ~NatPunchthroughDebugInterface_PacketLogger() {} + virtual void OnClientMessage(const char *msg); +}; +#endif + +/// \brief Client code for NATPunchthrough +/// \details Maintain connection to NatPunchthroughServer to process incoming connection attempts through NatPunchthroughClient
+/// Client will send datagrams to port to estimate next port
+/// Will simultaneously connect with another client once ports are estimated. +/// \sa NatTypeDetectionClient +/// See also http://www.jenkinssoftware.com/raknet/manual/natpunchthrough.html +/// \ingroup NAT_PUNCHTHROUGH_GROUP +class RAK_DLL_EXPORT NatPunchthroughClient : public PluginInterface2 +{ +public: + + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(NatPunchthroughClient) + + NatPunchthroughClient(); + ~NatPunchthroughClient(); + + /// Punchthrough a NAT. Doesn't connect, just tries to setup the routing table + /// \param[in] destination The system to punch. Must already be connected to \a facilitator + /// \param[in] facilitator A system we are already connected to running the NatPunchthroughServer plugin + /// \sa OpenNATGroup() + /// You will get ID_NAT_PUNCHTHROUGH_SUCCEEDED on success + /// You will get ID_NAT_TARGET_NOT_CONNECTED, ID_NAT_TARGET_UNRESPONSIVE, ID_NAT_CONNECTION_TO_TARGET_LOST, ID_NAT_ALREADY_IN_PROGRESS, or ID_NAT_PUNCHTHROUGH_FAILED on failures of various types + /// However, if you lose connection to the facilitator, you may not necessarily get above + bool OpenNAT(RakNetGUID destination, const SystemAddress &facilitator); + + /// Same as calling OpenNAT for a list of systems, but reply is delayed until all systems pass. + /// This is useful for peer to peer games where you want to connect to every system in the remote session, not just one particular system + /// \note For cloud computing, all systems in the group must be connected to the same facilitator since we're only specifying one + /// You will get ID_NAT_GROUP_PUNCH_SUCCEEDED on success + /// You will get ID_NAT_TARGET_NOT_CONNECTED, ID_NAT_ALREADY_IN_PROGRESS, or ID_NAT_GROUP_PUNCH_FAILED on failures of various types + /// However, if you lose connection to the facilitator, you may not necessarily get above + bool OpenNATGroup(DataStructures::List destinationSystems, const SystemAddress &facilitator); + + /// Modify the system configuration if desired + /// Don't modify the variables in the structure while punchthrough is in progress + PunchthroughConfiguration* GetPunchthroughConfiguration(void); + + /// Sets a callback to be called with debug messages + /// \param[in] i Pointer to an interface. The pointer is stored, so don't delete it while in progress. Pass 0 to clear. + void SetDebugInterface(NatPunchthroughDebugInterface *i); + + /// Get the port mappings you should pass to UPNP (for miniupnpc-1.5, for the function UPNP_AddPortMapping) + void GetUPNPPortMappings(char *externalPort, char *internalPort, const SystemAddress &natPunchthroughServerAddress); + + /// \internal For plugin handling + virtual void Update(void); + + /// \internal For plugin handling + virtual PluginReceiveResult OnReceive(Packet *packet); + + /// \internal For plugin handling + virtual void OnNewConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, bool isIncoming); + + /// \internal For plugin handling + virtual void OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ); + + virtual void OnAttach(void); + virtual void OnDetach(void); + virtual void OnRakPeerShutdown(void); + void Clear(void); + +protected: + unsigned short mostRecentNewExternalPort; + void OnNatGroupPunchthroughRequest(Packet *packet); + void OnFailureNotification(Packet *packet); + void OnNatGroupPunchthroughReply(Packet *packet); + void OnGetMostRecentPort(Packet *packet); + void OnConnectAtTime(Packet *packet); + unsigned int GetPendingOpenNATIndex(RakNetGUID destination, const SystemAddress &facilitator); + void SendPunchthrough(RakNetGUID destination, const SystemAddress &facilitator); + void SendTTL(const SystemAddress &sa); + void SendOutOfBand(SystemAddress sa, MessageID oobId); + void OnPunchthroughFailure(void); + void OnReadyForNextPunchthrough(void); + void PushFailure(void); + bool RemoveFromFailureQueue(void); + void PushSuccess(void); + + struct SendPing + { + RakNet::Time nextActionTime; + SystemAddress targetAddress; + SystemAddress facilitator; + SystemAddress internalIds[MAXIMUM_NUMBER_OF_INTERNAL_IDS]; + RakNetGUID targetGuid; + bool weAreSender; + int attemptCount; + int retryCount; + int punchingFixedPortAttempts; // only used for TestMode::PUNCHING_FIXED_PORT + uint16_t sessionId; + // Give priority to internal IP addresses because if we are on a LAN, we don't want to try to connect through the internet + enum TestMode + { + TESTING_INTERNAL_IPS, + WAITING_FOR_INTERNAL_IPS_RESPONSE, + SEND_WITH_TTL, + TESTING_EXTERNAL_IPS_FACILITATOR_PORT_TO_FACILITATOR_PORT, + TESTING_EXTERNAL_IPS_1024_TO_FACILITATOR_PORT, + TESTING_EXTERNAL_IPS_FACILITATOR_PORT_TO_1024, + TESTING_EXTERNAL_IPS_1024_TO_1024, + WAITING_AFTER_ALL_ATTEMPTS, + + // The trendnet remaps the remote port to 1024. + // If you continue punching on a different port for the same IP it bans you and the communication becomes unidirectioal + PUNCHING_FIXED_PORT, + + // try port 1024-1028 + } testMode; + } sp; + + PunchthroughConfiguration pc; + NatPunchthroughDebugInterface *natPunchthroughDebugInterface; + + // The first time we fail a NAT attempt, we add it to failedAttemptList and try again, since sometimes trying again later fixes the problem + // The second time we fail, we return ID_NAT_PUNCHTHROUGH_FAILED + struct AddrAndGuid + { + SystemAddress addr; + RakNetGUID guid; + }; + DataStructures::List failedAttemptList; + + void IncrementExternalAttemptCount(RakNet::Time time, RakNet::Time delta); + + struct TimeAndGuid + { + RakNet::Time time; + RakNetGUID guid; + }; + DataStructures::List groupRequestsInProgress; + + struct GroupPunchRequest + { + SystemAddress facilitator; + DataStructures::List pendingList; + DataStructures::List passedListGuid; + DataStructures::List passedListAddress; + DataStructures::List failedList; + DataStructures::List ignoredList; + }; + DataStructures::List groupPunchRequests; + void UpdateGroupPunchOnNatResult(SystemAddress facilitator, RakNetGUID targetSystem, SystemAddress targetSystemAddress, int result); // 0=failed, 1=success, 2=ignore +}; + +} // namespace RakNet + +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NatPunchthroughServer.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NatPunchthroughServer.cpp new file mode 100644 index 0000000..fd057eb --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NatPunchthroughServer.cpp @@ -0,0 +1,563 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_NatPunchthroughServer==1 + +#include "NatPunchthroughServer.h" +#include "SocketLayer.h" +#include "BitStream.h" +#include "MessageIdentifiers.h" +#include "RakPeerInterface.h" +#include "MTUSize.h" +#include "GetTime.h" +#include "PacketLogger.h" + +using namespace RakNet; + +void NatPunchthroughServerDebugInterface_Printf::OnServerMessage(const char *msg) +{ + printf("%s\n", msg); +} +#if _RAKNET_SUPPORT_PacketLogger==1 +void NatPunchthroughServerDebugInterface_PacketLogger::OnServerMessage(const char *msg) +{ + if (pl) + { + pl->WriteMiscellaneous("Nat", msg); + } +} +#endif + +void NatPunchthroughServer::User::DeleteConnectionAttempt(NatPunchthroughServer::ConnectionAttempt *ca) +{ + unsigned int index = connectionAttempts.GetIndexOf(ca); + if ((unsigned int)index!=(unsigned int)-1) + { + RakNet::OP_DELETE(ca,_FILE_AND_LINE_); + connectionAttempts.RemoveAtIndex(index); + } +} +void NatPunchthroughServer::User::DerefConnectionAttempt(NatPunchthroughServer::ConnectionAttempt *ca) +{ + unsigned int index = connectionAttempts.GetIndexOf(ca); + if ((unsigned int)index!=(unsigned int)-1) + { + connectionAttempts.RemoveAtIndex(index); + } +} +bool NatPunchthroughServer::User::HasConnectionAttemptToUser(User *user) +{ + unsigned int index; + for (index=0; index < connectionAttempts.Size(); index++) + { + if (connectionAttempts[index]->recipient->guid==user->guid || + connectionAttempts[index]->sender->guid==user->guid) + return true; + } + return false; +} +void NatPunchthroughServer::User::LogConnectionAttempts(RakNet::RakString &rs) +{ + rs.Clear(); + unsigned int index; + char guidStr[128], ipStr[128]; + guid.ToString(guidStr); + systemAddress.ToString(true,ipStr); + rs=RakNet::RakString("User systemAddress=%s guid=%s\n", ipStr, guidStr); + rs+=RakNet::RakString("%i attempts in list:\n", connectionAttempts.Size()); + for (index=0; index < connectionAttempts.Size(); index++) + { + rs+=RakNet::RakString("%i. SessionID=%i ", index+1, connectionAttempts[index]->sessionId); + if (connectionAttempts[index]->sender==this) + rs+="(We are sender) "; + else + rs+="(We are recipient) "; + if (isReady) + rs+="(READY TO START) "; + else + rs+="(NOT READY TO START) "; + if (connectionAttempts[index]->attemptPhase==NatPunchthroughServer::ConnectionAttempt::NAT_ATTEMPT_PHASE_NOT_STARTED) + rs+="(NOT_STARTED). "; + else + rs+="(GETTING_RECENT_PORTS). "; + if (connectionAttempts[index]->sender==this) + { + connectionAttempts[index]->recipient->guid.ToString(guidStr); + connectionAttempts[index]->recipient->systemAddress.ToString(true,ipStr); + } + else + { + connectionAttempts[index]->sender->guid.ToString(guidStr); + connectionAttempts[index]->sender->systemAddress.ToString(true,ipStr); + } + + rs+=RakNet::RakString("Target systemAddress=%s, guid=%s.\n", ipStr, guidStr); + } +} + +int RakNet::NatPunchthroughServer::NatPunchthroughUserComp( const RakNetGUID &key, User * const &data ) +{ + if (key < data->guid) + return -1; + if (key > data->guid) + return 1; + return 0; +} + +STATIC_FACTORY_DEFINITIONS(NatPunchthroughServer,NatPunchthroughServer); + +NatPunchthroughServer::NatPunchthroughServer() +{ + lastUpdate=0; + sessionId=0; + natPunchthroughServerDebugInterface=0; +} +NatPunchthroughServer::~NatPunchthroughServer() +{ + User *user, *otherUser; + ConnectionAttempt *connectionAttempt; + unsigned int j; + while(users.Size()) + { + user = users[0]; + for (j=0; j < user->connectionAttempts.Size(); j++) + { + connectionAttempt=user->connectionAttempts[j]; + if (connectionAttempt->sender==user) + otherUser=connectionAttempt->recipient; + else + otherUser=connectionAttempt->sender; + otherUser->DeleteConnectionAttempt(connectionAttempt); + } + RakNet::OP_DELETE(user,_FILE_AND_LINE_); + users[0]=users[users.Size()-1]; + users.RemoveAtIndex(users.Size()-1); + } +} +void NatPunchthroughServer::SetDebugInterface(NatPunchthroughServerDebugInterface *i) +{ + natPunchthroughServerDebugInterface=i; +} +void NatPunchthroughServer::Update(void) +{ + ConnectionAttempt *connectionAttempt; + User *user, *recipient; + unsigned int i,j; + RakNet::Time time = RakNet::GetTime(); + if (time > lastUpdate+250) + { + lastUpdate=time; + + for (i=0; i < users.Size(); i++) + { + user=users[i]; + for (j=0; j < user->connectionAttempts.Size(); j++) + { + connectionAttempt=user->connectionAttempts[j]; + if (connectionAttempt->sender==user) + { + if (connectionAttempt->attemptPhase!=ConnectionAttempt::NAT_ATTEMPT_PHASE_NOT_STARTED && + time > connectionAttempt->startTime && + time > 10000 + connectionAttempt->startTime ) // Formerly 5000, but sometimes false positives + { + RakNet::BitStream outgoingBs; + + // that other system might not be running the plugin + outgoingBs.Write((MessageID)ID_NAT_TARGET_UNRESPONSIVE); + outgoingBs.Write(connectionAttempt->recipient->guid); + outgoingBs.Write(connectionAttempt->sessionId); + rakPeerInterface->Send(&outgoingBs,HIGH_PRIORITY,RELIABLE_ORDERED,0,connectionAttempt->sender->systemAddress,false); + + // 05/28/09 Previously only told sender about ID_NAT_CONNECTION_TO_TARGET_LOST + // However, recipient may be expecting it due to external code + // In that case, recipient would never get any response if the sender dropped + outgoingBs.Reset(); + outgoingBs.Write((MessageID)ID_NAT_TARGET_UNRESPONSIVE); + outgoingBs.Write(connectionAttempt->sender->guid); + outgoingBs.Write(connectionAttempt->sessionId); + rakPeerInterface->Send(&outgoingBs,HIGH_PRIORITY,RELIABLE_ORDERED,0,connectionAttempt->recipient->systemAddress,false); + + connectionAttempt->sender->isReady=true; + connectionAttempt->recipient->isReady=true; + recipient=connectionAttempt->recipient; + + + if (natPunchthroughServerDebugInterface) + { + char str[1024]; + char addr1[128], addr2[128]; + // 8/01/09 Fixed bug where this was after DeleteConnectionAttempt() + connectionAttempt->sender->systemAddress.ToString(true,addr1); + connectionAttempt->recipient->systemAddress.ToString(true,addr2); + sprintf(str, "Sending ID_NAT_TARGET_UNRESPONSIVE to sender %s and recipient %s.", addr1, addr2); + natPunchthroughServerDebugInterface->OnServerMessage(str); + RakNet::RakString log; + connectionAttempt->sender->LogConnectionAttempts(log); + connectionAttempt->recipient->LogConnectionAttempts(log); + } + + + connectionAttempt->sender->DerefConnectionAttempt(connectionAttempt); + connectionAttempt->recipient->DeleteConnectionAttempt(connectionAttempt); + + StartPunchthroughForUser(user); + StartPunchthroughForUser(recipient); + + break; + } + } + } + } + } +} +PluginReceiveResult NatPunchthroughServer::OnReceive(Packet *packet) +{ + switch (packet->data[0]) + { + case ID_NAT_PUNCHTHROUGH_REQUEST: + OnNATPunchthroughRequest(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + case ID_NAT_GET_MOST_RECENT_PORT: + OnGetMostRecentPort(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + case ID_NAT_CLIENT_READY: + OnClientReady(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + return RR_CONTINUE_PROCESSING; +} +void NatPunchthroughServer::OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ) +{ + (void) lostConnectionReason; + (void) systemAddress; + + unsigned int i=0; + bool objectExists; + i = users.GetIndexFromKey(rakNetGUID, &objectExists); + if (objectExists) + { + RakNet::BitStream outgoingBs; + DataStructures::List freedUpInProgressUsers; + User *user = users[i]; + User *otherUser; + unsigned int connectionAttemptIndex; + ConnectionAttempt *connectionAttempt; + for (connectionAttemptIndex=0; connectionAttemptIndex < user->connectionAttempts.Size(); connectionAttemptIndex++) + { + connectionAttempt=user->connectionAttempts[connectionAttemptIndex]; + outgoingBs.Reset(); + if (connectionAttempt->recipient==user) + { + otherUser=connectionAttempt->sender; + } + else + { + otherUser=connectionAttempt->recipient; + } + + // 05/28/09 Previously only told sender about ID_NAT_CONNECTION_TO_TARGET_LOST + // However, recipient may be expecting it due to external code + // In that case, recipient would never get any response if the sender dropped + outgoingBs.Write((MessageID)ID_NAT_CONNECTION_TO_TARGET_LOST); + outgoingBs.Write(rakNetGUID); + outgoingBs.Write(connectionAttempt->sessionId); + rakPeerInterface->Send(&outgoingBs,HIGH_PRIORITY,RELIABLE_ORDERED,0,otherUser->systemAddress,false); + + // 4/22/09 - Bug: was checking inProgress, legacy variable not used elsewhere + if (connectionAttempt->attemptPhase==ConnectionAttempt::NAT_ATTEMPT_PHASE_GETTING_RECENT_PORTS) + { + otherUser->isReady=true; + freedUpInProgressUsers.Insert(otherUser, _FILE_AND_LINE_ ); + } + + otherUser->DeleteConnectionAttempt(connectionAttempt); + } + + RakNet::OP_DELETE(users[i], _FILE_AND_LINE_); + users.RemoveAtIndex(i); + + for (i=0; i < freedUpInProgressUsers.Size(); i++) + { + StartPunchthroughForUser(freedUpInProgressUsers[i]); + } + } + + // Also remove from groupPunchthroughRequests + for (i=0; i < users.Size(); i++) + { + bool objectExists; + unsigned int gprIndex; + gprIndex = users[i]->groupPunchthroughRequests.GetIndexFromKey(rakNetGUID, &objectExists); + if (objectExists) + { +// printf("DEBUG %i\n", __LINE__); + + RakNet::BitStream outgoingBs; + outgoingBs.Write((MessageID)ID_NAT_TARGET_NOT_CONNECTED); + outgoingBs.Write(rakNetGUID); + rakPeerInterface->Send(&outgoingBs,HIGH_PRIORITY,RELIABLE_ORDERED,0,users[i]->systemAddress,false); + + users[i]->groupPunchthroughRequests.RemoveAtIndex(gprIndex); + } + } +} + +void NatPunchthroughServer::OnNewConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, bool isIncoming) +{ + (void) systemAddress; + (void) isIncoming; + + User *user = RakNet::OP_NEW(_FILE_AND_LINE_); + user->guid=rakNetGUID; + user->mostRecentPort=0; + user->systemAddress=systemAddress; + user->isReady=true; + users.Insert(rakNetGUID, user, true, _FILE_AND_LINE_); + +// printf("Adding to users %s\n", rakNetGUID.ToString()); +// printf("DEBUG users[0] guid=%s\n", users[0]->guid.ToString()); +} +void NatPunchthroughServer::OnNATPunchthroughRequest(Packet *packet) +{ + RakNet::BitStream outgoingBs; + RakNet::BitStream incomingBs(packet->data, packet->length, false); + incomingBs.IgnoreBytes(sizeof(MessageID)); + RakNetGUID recipientGuid, senderGuid; + incomingBs.Read(recipientGuid); + senderGuid=packet->guid; + unsigned int i; + bool objectExists; + i = users.GetIndexFromKey(senderGuid, &objectExists); + RakAssert(objectExists); + + ConnectionAttempt *ca = RakNet::OP_NEW(_FILE_AND_LINE_); + ca->sender=users[i]; + ca->sessionId=sessionId++; + i = users.GetIndexFromKey(recipientGuid, &objectExists); + if (objectExists==false) + { +// printf("DEBUG %i\n", __LINE__); +// printf("DEBUG recipientGuid=%s\n", recipientGuid.ToString()); +// printf("DEBUG users[0] guid=%s\n", users[0]->guid.ToString()); + + outgoingBs.Write((MessageID)ID_NAT_TARGET_NOT_CONNECTED); + outgoingBs.Write(recipientGuid); + rakPeerInterface->Send(&outgoingBs,HIGH_PRIORITY,RELIABLE_ORDERED,0,packet->systemAddress,false); + RakNet::OP_DELETE(ca,_FILE_AND_LINE_); + return; + } + ca->recipient=users[i]; + if (ca->recipient->HasConnectionAttemptToUser(ca->sender)) + { + outgoingBs.Write((MessageID)ID_NAT_ALREADY_IN_PROGRESS); + outgoingBs.Write(recipientGuid); + rakPeerInterface->Send(&outgoingBs,HIGH_PRIORITY,RELIABLE_ORDERED,0,packet->systemAddress,false); + RakNet::OP_DELETE(ca,_FILE_AND_LINE_); + return; + } + + ca->sender->connectionAttempts.Insert(ca, _FILE_AND_LINE_ ); + ca->recipient->connectionAttempts.Insert(ca, _FILE_AND_LINE_ ); + + StartPunchthroughForUser(ca->sender); +} +void NatPunchthroughServer::OnClientReady(Packet *packet) +{ + unsigned int i; + bool objectExists; + i = users.GetIndexFromKey(packet->guid, &objectExists); + if (objectExists) + { + users[i]->isReady=true; + StartPunchthroughForUser(users[i]); + } +} +void NatPunchthroughServer::OnGetMostRecentPort(Packet *packet) +{ + RakNet::BitStream bsIn(packet->data, packet->length, false); + bsIn.IgnoreBytes(sizeof(MessageID)); + uint16_t sessionId; + unsigned short mostRecentPort; + bsIn.Read(sessionId); + bsIn.Read(mostRecentPort); + + unsigned int i,j; + User *user; + ConnectionAttempt *connectionAttempt; + bool objectExists; + i = users.GetIndexFromKey(packet->guid, &objectExists); + + if (natPunchthroughServerDebugInterface) + { + RakNet::RakString log; + char addr1[128], addr2[128]; + packet->systemAddress.ToString(true,addr1); + packet->guid.ToString(addr2); + log=RakNet::RakString("Got ID_NAT_GET_MOST_RECENT_PORT from systemAddress %s guid %s. port=%i. sessionId=%i. userFound=%i.", addr1, addr2, mostRecentPort, sessionId, objectExists); + natPunchthroughServerDebugInterface->OnServerMessage(log.C_String()); + } + + if (objectExists) + { + user=users[i]; + user->mostRecentPort=mostRecentPort; + RakNet::Time time = RakNet::GetTime(); + + for (j=0; j < user->connectionAttempts.Size(); j++) + { + connectionAttempt=user->connectionAttempts[j]; + if (connectionAttempt->attemptPhase==ConnectionAttempt::NAT_ATTEMPT_PHASE_GETTING_RECENT_PORTS && + connectionAttempt->sender->mostRecentPort!=0 && + connectionAttempt->recipient->mostRecentPort!=0 && + // 04/29/08 add sessionId to prevent processing for other systems + connectionAttempt->sessionId==sessionId) + { + SystemAddress senderSystemAddress = connectionAttempt->sender->systemAddress; + SystemAddress recipientSystemAddress = connectionAttempt->recipient->systemAddress; + SystemAddress recipientTargetAddress = recipientSystemAddress; + SystemAddress senderTargetAddress = senderSystemAddress; + recipientTargetAddress.SetPort(connectionAttempt->recipient->mostRecentPort); + senderTargetAddress.SetPort(connectionAttempt->sender->mostRecentPort); + + // Pick a time far enough in the future that both systems will have gotten the message + int targetPing = rakPeerInterface->GetAveragePing(recipientTargetAddress); + int senderPing = rakPeerInterface->GetAveragePing(senderSystemAddress); + RakNet::Time simultaneousAttemptTime; + if (targetPing==-1 || senderPing==-1) + simultaneousAttemptTime = time + 1500; + else + { + int largerPing = targetPing > senderPing ? targetPing : senderPing; + if (largerPing * 4 < 100) + simultaneousAttemptTime = time + 100; + else + simultaneousAttemptTime = time + (largerPing * 4); + } + + if (natPunchthroughServerDebugInterface) + { + RakNet::RakString log; + char addr1[128], addr2[128]; + recipientSystemAddress.ToString(true,addr1); + connectionAttempt->recipient->guid.ToString(addr2); + log=RakNet::RakString("Sending ID_NAT_CONNECT_AT_TIME to recipient systemAddress %s guid %s", addr1, addr2); + natPunchthroughServerDebugInterface->OnServerMessage(log.C_String()); + } + + // Send to recipient timestamped message to connect at time + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_TIMESTAMP); + bsOut.Write(simultaneousAttemptTime); + bsOut.Write((MessageID)ID_NAT_CONNECT_AT_TIME); + bsOut.Write(connectionAttempt->sessionId); + bsOut.Write(senderTargetAddress); // Public IP, using most recent port + for (j=0; j < MAXIMUM_NUMBER_OF_INTERNAL_IDS; j++) // Internal IP + bsOut.Write(rakPeerInterface->GetInternalID(senderSystemAddress,j)); + bsOut.Write(connectionAttempt->sender->guid); + bsOut.Write(false); + rakPeerInterface->Send(&bsOut,HIGH_PRIORITY,RELIABLE_ORDERED,0,recipientSystemAddress,false); + + + if (natPunchthroughServerDebugInterface) + { + RakNet::RakString log; + char addr1[128], addr2[128]; + senderSystemAddress.ToString(true,addr1); + connectionAttempt->sender->guid.ToString(addr2); + log=RakNet::RakString("Sending ID_NAT_CONNECT_AT_TIME to sender systemAddress %s guid %s", addr1, addr2); + natPunchthroughServerDebugInterface->OnServerMessage(log.C_String()); + } + + + // Same for sender + bsOut.Reset(); + bsOut.Write((MessageID)ID_TIMESTAMP); + bsOut.Write(simultaneousAttemptTime); + bsOut.Write((MessageID)ID_NAT_CONNECT_AT_TIME); + bsOut.Write(connectionAttempt->sessionId); + bsOut.Write(recipientTargetAddress); // Public IP, using most recent port + for (j=0; j < MAXIMUM_NUMBER_OF_INTERNAL_IDS; j++) // Internal IP + bsOut.Write(rakPeerInterface->GetInternalID(recipientSystemAddress,j)); + bsOut.Write(connectionAttempt->recipient->guid); + bsOut.Write(true); + rakPeerInterface->Send(&bsOut,HIGH_PRIORITY,RELIABLE_ORDERED,0,senderSystemAddress,false); + + connectionAttempt->recipient->DerefConnectionAttempt(connectionAttempt); + connectionAttempt->sender->DeleteConnectionAttempt(connectionAttempt); + + // 04/29/08 missing return + return; + } + } + } + else + { + + if (natPunchthroughServerDebugInterface) + { + RakNet::RakString log; + char addr1[128], addr2[128]; + packet->systemAddress.ToString(true,addr1); + packet->guid.ToString(addr2); + log=RakNet::RakString("Ignoring ID_NAT_GET_MOST_RECENT_PORT from systemAddress %s guid %s", addr1, addr2); + natPunchthroughServerDebugInterface->OnServerMessage(log.C_String()); + } + + } +} +void NatPunchthroughServer::StartPunchthroughForUser(User *user) +{ + if (user->isReady==false) + return; + + ConnectionAttempt *connectionAttempt; + User *sender,*recipient,*otherUser; + unsigned int i; + for (i=0; i < user->connectionAttempts.Size(); i++) + { + connectionAttempt=user->connectionAttempts[i]; + if (connectionAttempt->sender==user) + { + otherUser=connectionAttempt->recipient; + sender=user; + recipient=otherUser; + } + else + { + otherUser=connectionAttempt->sender; + recipient=user; + sender=otherUser; + } + + if (otherUser->isReady) + { + if (natPunchthroughServerDebugInterface) + { + char str[1024]; + char addr1[128], addr2[128]; + sender->systemAddress.ToString(true,addr1); + recipient->systemAddress.ToString(true,addr2); + sprintf(str, "Sending NAT_ATTEMPT_PHASE_GETTING_RECENT_PORTS to sender %s and recipient %s.", addr1, addr2); + natPunchthroughServerDebugInterface->OnServerMessage(str); + } + + sender->isReady=false; + recipient->isReady=false; + connectionAttempt->attemptPhase=ConnectionAttempt::NAT_ATTEMPT_PHASE_GETTING_RECENT_PORTS; + connectionAttempt->startTime=RakNet::GetTime(); + + sender->mostRecentPort=0; + recipient->mostRecentPort=0; + + RakNet::BitStream outgoingBs; + outgoingBs.Write((MessageID)ID_NAT_GET_MOST_RECENT_PORT); + // 4/29/09 Write sessionID so we don't use returned port for a system we don't want + outgoingBs.Write(connectionAttempt->sessionId); + rakPeerInterface->Send(&outgoingBs,HIGH_PRIORITY,RELIABLE_ORDERED,0,sender->systemAddress,false); + rakPeerInterface->Send(&outgoingBs,HIGH_PRIORITY,RELIABLE_ORDERED,0,recipient->systemAddress,false); + + // 4/22/09 - BUG: missing break statement here + break; + } + } +} + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NatPunchthroughServer.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NatPunchthroughServer.h new file mode 100644 index 0000000..7a7e138 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NatPunchthroughServer.h @@ -0,0 +1,145 @@ +/// \file +/// \brief Contains the NAT-punchthrough plugin for the server. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_NatPunchthroughServer==1 + +#ifndef __NAT_PUNCHTHROUGH_SERVER_H +#define __NAT_PUNCHTHROUGH_SERVER_H + +#include "RakNetTypes.h" +#include "Export.h" +#include "PluginInterface2.h" +#include "PacketPriority.h" +#include "SocketIncludes.h" +#include "DS_OrderedList.h" +#include "RakString.h" + +namespace RakNet +{ +/// Forward declarations +class RakPeerInterface; +struct Packet; +#if _RAKNET_SUPPORT_PacketLogger==1 +class PacketLogger; +#endif + +/// \defgroup NAT_PUNCHTHROUGH_GROUP NatPunchthrough +/// \brief Connect systems despite both systems being behind a router +/// \details +/// \ingroup PLUGINS_GROUP + +/// \ingroup NAT_PUNCHTHROUGH_GROUP +struct RAK_DLL_EXPORT NatPunchthroughServerDebugInterface +{ + NatPunchthroughServerDebugInterface() {} + virtual ~NatPunchthroughServerDebugInterface() {} + virtual void OnServerMessage(const char *msg)=0; +}; + +/// \ingroup NAT_PUNCHTHROUGH_GROUP +struct RAK_DLL_EXPORT NatPunchthroughServerDebugInterface_Printf : public NatPunchthroughServerDebugInterface +{ + virtual void OnServerMessage(const char *msg); +}; + +#if _RAKNET_SUPPORT_PacketLogger==1 +/// \ingroup NAT_PUNCHTHROUGH_GROUP +struct RAK_DLL_EXPORT NatPunchthroughServerDebugInterface_PacketLogger : public NatPunchthroughServerDebugInterface +{ + // Set to non-zero to write to the packetlogger! + PacketLogger *pl; + + NatPunchthroughServerDebugInterface_PacketLogger() {pl=0;} + ~NatPunchthroughServerDebugInterface_PacketLogger() {} + virtual void OnServerMessage(const char *msg); +}; +#endif + +/// \brief Server code for NATPunchthrough +/// \details Maintain connection to NatPunchthroughServer to process incoming connection attempts through NatPunchthroughClient
+/// Server maintains two sockets clients can connect to so as to estimate the next port choice
+/// Server tells other client about port estimate, current public port to the server, and a time to start connection attempts +/// \sa NatTypeDetectionClient +/// See also http://www.jenkinssoftware.com/raknet/manual/natpunchthrough.html +/// \ingroup NAT_PUNCHTHROUGH_GROUP +class RAK_DLL_EXPORT NatPunchthroughServer : public PluginInterface2 +{ +public: + + STATIC_FACTORY_DECLARATIONS(NatPunchthroughServer) + + // Constructor + NatPunchthroughServer(); + + // Destructor + virtual ~NatPunchthroughServer(); + + /// Sets a callback to be called with debug messages + /// \param[in] i Pointer to an interface. The pointer is stored, so don't delete it while in progress. Pass 0 to clear. + void SetDebugInterface(NatPunchthroughServerDebugInterface *i); + + /// \internal For plugin handling + virtual void Update(void); + + /// \internal For plugin handling + virtual PluginReceiveResult OnReceive(Packet *packet); + + /// \internal For plugin handling + virtual void OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ); + virtual void OnNewConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, bool isIncoming); + + // Each connected user has a ready state. Ready means ready for nat punchthrough. + struct User; + struct ConnectionAttempt + { + ConnectionAttempt() {sender=0; recipient=0; startTime=0; attemptPhase=NAT_ATTEMPT_PHASE_NOT_STARTED;} + User *sender, *recipient; + uint16_t sessionId; + RakNet::Time startTime; + enum + { + NAT_ATTEMPT_PHASE_NOT_STARTED, + NAT_ATTEMPT_PHASE_GETTING_RECENT_PORTS, + } attemptPhase; + }; + struct User + { + RakNetGUID guid; + SystemAddress systemAddress; + unsigned short mostRecentPort; + bool isReady; + DataStructures::OrderedList groupPunchthroughRequests; + + DataStructures::List connectionAttempts; + bool HasConnectionAttemptToUser(User *user); + void DerefConnectionAttempt(ConnectionAttempt *ca); + void DeleteConnectionAttempt(ConnectionAttempt *ca); + void LogConnectionAttempts(RakNet::RakString &rs); + }; + RakNet::Time lastUpdate; + static int NatPunchthroughUserComp( const RakNetGUID &key, User * const &data ); +protected: + void OnNATPunchthroughRequest(Packet *packet); + DataStructures::OrderedList users; + + void OnGetMostRecentPort(Packet *packet); + void OnClientReady(Packet *packet); + + void SendTimestamps(void); + void StartPendingPunchthrough(void); + void StartPunchthroughForUser(User*user); + uint16_t sessionId; + NatPunchthroughServerDebugInterface *natPunchthroughServerDebugInterface; + +}; + +} // namespace RakNet + +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NatTypeDetectionClient.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NatTypeDetectionClient.cpp new file mode 100644 index 0000000..b18ac7f --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NatTypeDetectionClient.cpp @@ -0,0 +1,170 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_NatTypeDetectionClient==1 + +#include "NatTypeDetectionClient.h" +#include "RakNetSocket.h" +#include "RakNetSmartPtr.h" +#include "BitStream.h" +#include "SocketIncludes.h" +#include "RakString.h" +#include "RakPeerInterface.h" +#include "MessageIdentifiers.h" +#include "SocketLayer.h" +#include "SocketDefines.h" + +using namespace RakNet; + +STATIC_FACTORY_DEFINITIONS(NatTypeDetectionClient,NatTypeDetectionClient); + +NatTypeDetectionClient::NatTypeDetectionClient() +{ + c2=INVALID_SOCKET; +} +NatTypeDetectionClient::~NatTypeDetectionClient() +{ + if (c2!=INVALID_SOCKET) + { + closesocket__(c2); + } +} +void NatTypeDetectionClient::DetectNATType(SystemAddress _serverAddress) +{ + if (IsInProgress()) + return; + + if (c2==INVALID_SOCKET) + { + DataStructures::List > sockets; + rakPeerInterface->GetSockets(sockets); + SystemAddress sockAddr; + SocketLayer::GetSystemAddress(sockets[0]->s, &sockAddr); + char str[64]; + sockAddr.ToString(false,str); + c2=CreateNonblockingBoundSocket(str); + c2Port=SocketLayer::GetLocalPort(c2); + } + + + serverAddress=_serverAddress; + + RakNet::BitStream bs; + bs.Write((unsigned char)ID_NAT_TYPE_DETECTION_REQUEST); + bs.Write(true); // IsRequest + bs.Write(c2Port); + rakPeerInterface->Send(&bs,MEDIUM_PRIORITY,RELIABLE,0,serverAddress,false); +} +void NatTypeDetectionClient::OnCompletion(NATTypeDetectionResult result) +{ + Packet *p = AllocatePacketUnified(sizeof(MessageID)+sizeof(unsigned char)*2); + printf("Returning nat detection result to the user\n"); + p->data[0]=ID_NAT_TYPE_DETECTION_RESULT; + p->systemAddress=serverAddress; + p->systemAddress.systemIndex=(SystemIndex)-1; + p->guid=rakPeerInterface->GetGuidFromSystemAddress(serverAddress); + p->data[1]=(unsigned char) result; + p->wasGeneratedLocally=true; + rakPeerInterface->PushBackPacket(p, true); + + // Symmetric and port restricted are determined by server, so no need to notify server we are done + if (result!=NAT_TYPE_PORT_RESTRICTED && result!=NAT_TYPE_SYMMETRIC) + { + // Otherwise tell the server we got this message, so it stops sending tests to us + RakNet::BitStream bs; + bs.Write((unsigned char)ID_NAT_TYPE_DETECTION_REQUEST); + bs.Write(false); // Done + rakPeerInterface->Send(&bs,HIGH_PRIORITY,RELIABLE,0,serverAddress,false); + } + + Shutdown(); +} +bool NatTypeDetectionClient::IsInProgress(void) const +{ + return serverAddress!=UNASSIGNED_SYSTEM_ADDRESS; +} +void NatTypeDetectionClient::Update(void) +{ + if (IsInProgress()) + { + char data[ MAXIMUM_MTU_SIZE ]; + int len; + SystemAddress sender; + len=NatTypeRecvFrom(data, c2, sender); + if (len==1 && data[0]==NAT_TYPE_NONE) + { + OnCompletion(NAT_TYPE_NONE); + RakAssert(IsInProgress()==false); + } + } +} +PluginReceiveResult NatTypeDetectionClient::OnReceive(Packet *packet) +{ + if (IsInProgress()) + { + switch (packet->data[0]) + { + case ID_OUT_OF_BAND_INTERNAL: + { + if (packet->length>=3 && packet->data[1]==ID_NAT_TYPE_DETECT) + { + OnCompletion((NATTypeDetectionResult)packet->data[2]); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + } + break; + case ID_NAT_TYPE_DETECTION_RESULT: + if (packet->wasGeneratedLocally==false) + { + OnCompletion((NATTypeDetectionResult)packet->data[1]); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + else + break; + case ID_NAT_TYPE_DETECTION_REQUEST: + OnTestPortRestricted(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + } + + return RR_CONTINUE_PROCESSING; +} +void NatTypeDetectionClient::OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ) +{ + (void) lostConnectionReason; + (void) rakNetGUID; + + if (IsInProgress() && systemAddress==serverAddress) + Shutdown(); +} +void NatTypeDetectionClient::OnTestPortRestricted(Packet *packet) +{ + RakNet::BitStream bsIn(packet->data,packet->length,false); + bsIn.IgnoreBytes(sizeof(MessageID)); + RakNet::RakString s3p4StrAddress; + bsIn.Read(s3p4StrAddress); + unsigned short s3p4Port; + bsIn.Read(s3p4Port); + + DataStructures::List > sockets; + rakPeerInterface->GetSockets(sockets); + SystemAddress s3p4Addr = sockets[0]->boundAddress; + s3p4Addr.FromStringExplicitPort(s3p4StrAddress.C_String(), s3p4Port); + + // Send off the RakNet socket to the specified address, message is unformatted + // Server does this twice, so don't have to unduly worry about packetloss + RakNet::BitStream bsOut; + bsOut.Write((MessageID) NAT_TYPE_PORT_RESTRICTED); + bsOut.Write(rakPeerInterface->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS)); + SocketLayer::SendTo_PC( sockets[0]->s, (const char*) bsOut.GetData(), bsOut.GetNumberOfBytesUsed(), s3p4Addr, __FILE__, __LINE__ ); +} +void NatTypeDetectionClient::Shutdown(void) +{ + serverAddress=UNASSIGNED_SYSTEM_ADDRESS; + if (c2!=INVALID_SOCKET) + { + closesocket__(c2); + c2=INVALID_SOCKET; + } + +} + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NatTypeDetectionClient.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NatTypeDetectionClient.h new file mode 100644 index 0000000..09614dc --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NatTypeDetectionClient.h @@ -0,0 +1,81 @@ +/// \file +/// \brief Contains the NAT-type detection code for the client +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_NatTypeDetectionClient==1 + +#ifndef __NAT_TYPE_DETECTION_CLIENT_H +#define __NAT_TYPE_DETECTION_CLIENT_H + +#include "RakNetTypes.h" +#include "Export.h" +#include "PluginInterface2.h" +#include "PacketPriority.h" +#include "SocketIncludes.h" +#include "DS_OrderedList.h" +#include "RakString.h" +#include "NatTypeDetectionCommon.h" + +namespace RakNet +{ +/// Forward declarations +class RakPeerInterface; +struct Packet; + + /// \brief Client code for NatTypeDetection + /// \details See NatTypeDetectionServer.h for algorithm + /// To use, just connect to the server, and call DetectNAT + /// You will get back ID_NAT_TYPE_DETECTION_RESULT with one of the enumerated values of NATTypeDetectionResult found in NATTypeDetectionCommon.h + /// See also http://www.jenkinssoftware.com/raknet/manual/natpunchthrough.html + /// \sa NatPunchthroughClient + /// \sa NatTypeDetectionServer + /// \ingroup NAT_TYPE_DETECTION_GROUP + class RAK_DLL_EXPORT NatTypeDetectionClient : public PluginInterface2 + { + public: + + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(NatTypeDetectionClient) + + // Constructor + NatTypeDetectionClient(); + + // Destructor + virtual ~NatTypeDetectionClient(); + + /// Send the message to the server to detect the nat type + /// Server must be running NatTypeDetectionServer + /// We must already be connected to the server + /// \param[in] serverAddress address of the server + void DetectNATType(SystemAddress _serverAddress); + + /// \internal For plugin handling + virtual void Update(void); + + /// \internal For plugin handling + virtual PluginReceiveResult OnReceive(Packet *packet); + + virtual void OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ); + + protected: + SOCKET c2; + unsigned short c2Port; + void Shutdown(void); + void OnCompletion(NATTypeDetectionResult result); + bool IsInProgress(void) const; + + void OnTestPortRestricted(Packet *packet); + SystemAddress serverAddress; + }; + + +} + + +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NatTypeDetectionCommon.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NatTypeDetectionCommon.cpp new file mode 100644 index 0000000..89856d5 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NatTypeDetectionCommon.cpp @@ -0,0 +1,116 @@ +#include "NatTypeDetectionCommon.h" +#include "SocketLayer.h" +#include "SocketIncludes.h" +#include "SocketDefines.h" + +using namespace RakNet; + +bool RakNet::CanConnect(NATTypeDetectionResult type1, NATTypeDetectionResult type2) +{ + /// If one system is NAT_TYPE_SYMMETRIC, the other must be NAT_TYPE_ADDRESS_RESTRICTED or less + /// If one system is NAT_TYPE_PORT_RESTRICTED, the other must be NAT_TYPE_PORT_RESTRICTED or less + bool connectionGraph[NAT_TYPE_COUNT][NAT_TYPE_COUNT] = + { + // None, Full Cone, Address Restricted, Port Restricted, Symmetric, Unknown, InProgress, Supports_UPNP + {true, true, true, true, true, false, false, false}, // None + {true, true, true, true, true, false, false, false}, // Full Cone + {true, true, true, true, true, false, false, false}, // Address restricted + {true, true, true, true, false, false, false, false}, // Port restricted + {true, true, true, false, false, false, false, false}, // Symmetric + {false, false, false, false, false, false, false, false}, // Unknown + {false, false, false, false, false, false, false, false}, // InProgress + {false, false, false, false, false, false, false, false} // Supports_UPNP + }; + + return connectionGraph[(int) type1][(int) type2]; +} + +const char *RakNet::NATTypeDetectionResultToString(NATTypeDetectionResult type) +{ + switch (type) + { + case NAT_TYPE_NONE: + return "None"; + case NAT_TYPE_FULL_CONE: + return "Full cone"; + case NAT_TYPE_ADDRESS_RESTRICTED: + return "Address restricted"; + case NAT_TYPE_PORT_RESTRICTED: + return "Port restricted"; + case NAT_TYPE_SYMMETRIC: + return "Symmetric"; + case NAT_TYPE_UNKNOWN: + return "Unknown"; + case NAT_TYPE_DETECTION_IN_PROGRESS: + return "In Progress"; + case NAT_TYPE_SUPPORTS_UPNP: + return "Supports UPNP"; + case NAT_TYPE_COUNT: + return "NAT_TYPE_COUNT"; + } + return "Error, unknown enum in NATTypeDetectionResult"; +} + +// None and relaxed can connect to anything +// Moderate can connect to moderate or less +// Strict can connect to relaxed or less +const char *RakNet::NATTypeDetectionResultToStringFriendly(NATTypeDetectionResult type) +{ + switch (type) + { + case NAT_TYPE_NONE: + return "Open"; + case NAT_TYPE_FULL_CONE: + return "Relaxed"; + case NAT_TYPE_ADDRESS_RESTRICTED: + return "Relaxed"; + case NAT_TYPE_PORT_RESTRICTED: + return "Moderate"; + case NAT_TYPE_SYMMETRIC: + return "Strict"; + case NAT_TYPE_UNKNOWN: + return "Unknown"; + case NAT_TYPE_DETECTION_IN_PROGRESS: + return "In Progress"; + case NAT_TYPE_SUPPORTS_UPNP: + return "Supports UPNP"; + case NAT_TYPE_COUNT: + return "NAT_TYPE_COUNT"; + } + return "Error, unknown enum in NATTypeDetectionResult"; +} + + +SOCKET RakNet::CreateNonblockingBoundSocket(const char *bindAddr ) +{ + SOCKET s = SocketLayer::CreateBoundSocket( 0, false, bindAddr, true, 0, AF_INET ); + #ifdef _WIN32 + unsigned long nonblocking = 1; + ioctlsocket__( s, FIONBIO, &nonblocking ); + + + + #else + fcntl( s, F_SETFL, O_NONBLOCK ); + #endif + return s; +} + +int RakNet::NatTypeRecvFrom(char *data, SOCKET socket, SystemAddress &sender) +{ + sockaddr_in sa; + socklen_t len2; + const int flag=0; + len2 = sizeof( sa ); + sa.sin_family = AF_INET; + sa.sin_port=0; + int len = recvfrom__( socket, data, MAXIMUM_MTU_SIZE, flag, ( sockaddr* ) & sa, ( socklen_t* ) & len2 ); + if (len>0) + { + sender.address.addr4.sin_family=AF_INET; + sender.address.addr4.sin_addr.s_addr = sa.sin_addr.s_addr; + //sender.SetPort( ntohs( sa.sin_port ) ); + sender.SetPort( ntohs( sa.sin_port ) ); + } + return len; +} diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NatTypeDetectionCommon.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NatTypeDetectionCommon.h new file mode 100644 index 0000000..6c59c03 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NatTypeDetectionCommon.h @@ -0,0 +1,56 @@ +/// \defgroup NAT_TYPE_DETECTION_GROUP NatTypeDetection +/// \brief Use a remote server with multiple IP addresses to determine what type of NAT your router is using +/// \details +/// \ingroup PLUGINS_GROUP + +#ifndef __NAT_TYPE_DETECTION_COMMON_H +#define __NAT_TYPE_DETECTION_COMMON_H + +#include "SocketIncludes.h" +#include "RakNetTypes.h" + +namespace RakNet +{ + /// All possible types of NATs (except NAT_TYPE_COUNT, which is an internal value) + enum NATTypeDetectionResult + { + /// Works with anyone + NAT_TYPE_NONE, + /// Accepts any datagrams to a port that has been previously used. Will accept the first datagram from the remote peer. + NAT_TYPE_FULL_CONE, + /// Accepts datagrams to a port as long as the datagram source IP address is a system we have already sent to. Will accept the first datagram if both systems send simultaneously. Otherwise, will accept the first datagram after we have sent one datagram. + NAT_TYPE_ADDRESS_RESTRICTED, + /// Same as address-restricted cone NAT, but we had to send to both the correct remote IP address and correct remote port. The same source address and port to a different destination uses the same mapping. + NAT_TYPE_PORT_RESTRICTED, + /// A different port is chosen for every remote destination. The same source address and port to a different destination uses a different mapping. Since the port will be different, the first external punchthrough attempt will fail. For this to work it requires port-prediction (MAX_PREDICTIVE_PORT_RANGE>1) and that the router chooses ports sequentially. + NAT_TYPE_SYMMETRIC, + /// Hasn't been determined. NATTypeDetectionClient does not use this, but other plugins might + NAT_TYPE_UNKNOWN, + /// In progress. NATTypeDetectionClient does not use this, but other plugins might + NAT_TYPE_DETECTION_IN_PROGRESS, + /// Didn't bother figuring it out, as we support UPNP, so it is equivalent to NAT_TYPE_NONE. NATTypeDetectionClient does not use this, but other plugins might + NAT_TYPE_SUPPORTS_UPNP, + /// \internal Must be last + NAT_TYPE_COUNT + }; + + /// \return Can one system with NATTypeDetectionResult \a type1 connect to \a type2 + bool RAK_DLL_EXPORT CanConnect(NATTypeDetectionResult type1, NATTypeDetectionResult type2); + + /// Return a technical string representin the enumeration + RAK_DLL_EXPORT const char * NATTypeDetectionResultToString(NATTypeDetectionResult type); + + /// Return a friendly string representing the enumeration + /// None and relaxed can connect to anything + /// Moderate can connect to moderate or less + /// Strict can connect to relaxed or less + RAK_DLL_EXPORT const char * NATTypeDetectionResultToStringFriendly(NATTypeDetectionResult type); + + /// \internal + SOCKET RAK_DLL_EXPORT CreateNonblockingBoundSocket(const char *bindAddr); + + /// \internal + int NatTypeRecvFrom(char *data, SOCKET socket, SystemAddress &sender); +} + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NatTypeDetectionServer.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NatTypeDetectionServer.cpp new file mode 100644 index 0000000..ede3af3 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NatTypeDetectionServer.cpp @@ -0,0 +1,263 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_NatTypeDetectionServer==1 + +#include "NatTypeDetectionServer.h" +#include "SocketLayer.h" +#include "RakNetSocket.h" +#include "RakNetSmartPtr.h" +#include "SocketIncludes.h" +#include "RakPeerInterface.h" +#include "MessageIdentifiers.h" +#include "GetTime.h" +#include "BitStream.h" +#include "SocketDefines.h" + +using namespace RakNet; + +STATIC_FACTORY_DEFINITIONS(NatTypeDetectionServer,NatTypeDetectionServer); + +NatTypeDetectionServer::NatTypeDetectionServer() +{ + s1p2=s2p3=s3p4=s4p5=INVALID_SOCKET; +} +NatTypeDetectionServer::~NatTypeDetectionServer() +{ + Shutdown(); +} +void NatTypeDetectionServer::Startup( + const char *nonRakNetIP2, + const char *nonRakNetIP3, + const char *nonRakNetIP4) +{ + DataStructures::List > sockets; + rakPeerInterface->GetSockets(sockets); + char str[64]; + sockets[0]->boundAddress.ToString(false,str); + s1p2=CreateNonblockingBoundSocket(str); + s1p2Port=SocketLayer::GetLocalPort(s1p2); + s2p3=CreateNonblockingBoundSocket(nonRakNetIP2); + s2p3Port=SocketLayer::GetLocalPort(s2p3); + s3p4=CreateNonblockingBoundSocket(nonRakNetIP3); + s3p4Port=SocketLayer::GetLocalPort(s3p4); + s4p5=CreateNonblockingBoundSocket(nonRakNetIP4); + s4p5Port=SocketLayer::GetLocalPort(s4p5); + strcpy(s3p4Address, nonRakNetIP3); +} +void NatTypeDetectionServer::Shutdown() +{ + if (s1p2!=INVALID_SOCKET) + { + closesocket__(s1p2); + s1p2=INVALID_SOCKET; + } + if (s2p3!=INVALID_SOCKET) + { + closesocket__(s2p3); + s2p3=INVALID_SOCKET; + } + if (s3p4!=INVALID_SOCKET) + { + closesocket__(s3p4); + s3p4=INVALID_SOCKET; + } + if (s4p5!=INVALID_SOCKET) + { + closesocket__(s4p5); + s4p5=INVALID_SOCKET; + } +} +void NatTypeDetectionServer::Update(void) +{ + int i=0; + RakNet::TimeMS time = RakNet::GetTimeMS(); + RakNet::BitStream bs; + SystemAddress boundAddress; + + // Only socket that receives messages is s3p4, to see if the external address is different than that of the connection to rakPeerInterface + char data[ MAXIMUM_MTU_SIZE ]; + int len; + SystemAddress senderAddr; + len=NatTypeRecvFrom(data, s3p4, senderAddr); + // Client is asking us if this is port restricted. Only client requests of this type come in on s3p4 + while (len>0 && data[0]==NAT_TYPE_PORT_RESTRICTED) + { + RakNet::BitStream bsIn((unsigned char*) data,len,false); + RakNetGUID senderGuid; + bsIn.IgnoreBytes(sizeof(MessageID)); + bool readSuccess = bsIn.Read(senderGuid); + RakAssert(readSuccess); + if (readSuccess) + { + unsigned int i = GetDetectionAttemptIndex(senderGuid); + if (i!=(unsigned int)-1) + { + bs.Reset(); + bs.Write((unsigned char) ID_NAT_TYPE_DETECTION_RESULT); + // If different, then symmetric + if (senderAddr!=natDetectionAttempts[i].systemAddress) + { + printf("Determined client is symmetric\n"); + bs.Write((unsigned char) NAT_TYPE_SYMMETRIC); + } + else + { + // else port restricted + printf("Determined client is port restricted\n"); + bs.Write((unsigned char) NAT_TYPE_PORT_RESTRICTED); + } + + rakPeerInterface->Send(&bs,HIGH_PRIORITY,RELIABLE,0,natDetectionAttempts[i].systemAddress,false); + + // Done + natDetectionAttempts.RemoveAtIndexFast(i); + } + else + { + // RakAssert("i==0 in Update when looking up GUID in NatTypeDetectionServer.cpp. Either a bug or a late resend" && 0); + } + } + else + { + // RakAssert("Didn't read GUID in Update in NatTypeDetectionServer.cpp. Message format error" && 0); + } + + len=NatTypeRecvFrom(data, s3p4, senderAddr); + } + + + while (i < (int) natDetectionAttempts.Size()) + { + if (time > natDetectionAttempts[i].nextStateTime) + { + natDetectionAttempts[i].detectionState=(NATDetectionState)((int)natDetectionAttempts[i].detectionState+1); + natDetectionAttempts[i].nextStateTime=time+natDetectionAttempts[i].timeBetweenAttempts; + SystemAddress saOut; + unsigned char c; + bs.Reset(); + switch (natDetectionAttempts[i].detectionState) + { + case STATE_TESTING_NONE_1: + case STATE_TESTING_NONE_2: + c = NAT_TYPE_NONE; + printf("Testing NAT_TYPE_NONE\n"); + // S4P5 sends to C2. If arrived, no NAT. Done. (Else S4P5 potentially banned, do not use again). + saOut=natDetectionAttempts[i].systemAddress; + saOut.SetPort(natDetectionAttempts[i].c2Port); + SocketLayer::SendTo_PC( s4p5, (const char*) &c, 1, saOut, __FILE__, __LINE__ ); + break; + case STATE_TESTING_FULL_CONE_1: + case STATE_TESTING_FULL_CONE_2: + printf("Testing NAT_TYPE_FULL_CONE\n"); + rakPeerInterface->WriteOutOfBandHeader(&bs); + bs.Write((unsigned char) ID_NAT_TYPE_DETECT); + bs.Write((unsigned char) NAT_TYPE_FULL_CONE); + // S2P3 sends to C1 (Different address, different port, to previously used port on client). If received, Full-cone nat. Done. (Else S2P3 potentially banned, do not use again). + saOut=natDetectionAttempts[i].systemAddress; + saOut.SetPort(natDetectionAttempts[i].systemAddress.GetPort()); + SocketLayer::SendTo_PC( s2p3, (const char*) bs.GetData(), bs.GetNumberOfBytesUsed(), saOut, __FILE__, __LINE__ ); + break; + case STATE_TESTING_ADDRESS_RESTRICTED_1: + case STATE_TESTING_ADDRESS_RESTRICTED_2: + printf("Testing NAT_TYPE_ADDRESS_RESTRICTED\n"); + rakPeerInterface->WriteOutOfBandHeader(&bs); + bs.Write((unsigned char) ID_NAT_TYPE_DETECT); + bs.Write((unsigned char) NAT_TYPE_ADDRESS_RESTRICTED); + // S1P2 sends to C1 (Same address, different port, to previously used port on client). If received, address-restricted cone nat. Done. + saOut=natDetectionAttempts[i].systemAddress; + saOut.SetPort(natDetectionAttempts[i].systemAddress.GetPort()); + SocketLayer::SendTo_PC( s1p2, (const char*) bs.GetData(), bs.GetNumberOfBytesUsed(), saOut, __FILE__, __LINE__ ); + break; + case STATE_TESTING_PORT_RESTRICTED_1: + case STATE_TESTING_PORT_RESTRICTED_2: + // C1 sends to S3P4. If address of C1 as seen by S3P4 is the same as the address of C1 as seen by S1P1, then port-restricted cone nat. Done + printf("Testing NAT_TYPE_PORT_RESTRICTED\n"); + bs.Write((unsigned char) ID_NAT_TYPE_DETECTION_REQUEST); + bs.Write(RakString::NonVariadic(s3p4Address)); + bs.Write(s3p4Port); + rakPeerInterface->Send(&bs,HIGH_PRIORITY,RELIABLE,0,natDetectionAttempts[i].systemAddress,false); + break; + default: + printf("Warning, exceeded final check STATE_TESTING_PORT_RESTRICTED_2.\nExpected that client would have sent NAT_TYPE_PORT_RESTRICTED on s3p4.\nDefaulting to Symmetric\n"); + bs.Write((unsigned char) ID_NAT_TYPE_DETECTION_RESULT); + bs.Write((unsigned char) NAT_TYPE_SYMMETRIC); + rakPeerInterface->Send(&bs,HIGH_PRIORITY,RELIABLE,0,natDetectionAttempts[i].systemAddress,false); + natDetectionAttempts.RemoveAtIndexFast(i); + i--; + break; + } + + } + i++; + } +} +PluginReceiveResult NatTypeDetectionServer::OnReceive(Packet *packet) +{ + switch (packet->data[0]) + { + case ID_NAT_TYPE_DETECTION_REQUEST: + OnDetectionRequest(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + return RR_CONTINUE_PROCESSING; +} +void NatTypeDetectionServer::OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ) +{ + (void) lostConnectionReason; + (void) rakNetGUID; + + unsigned int i = GetDetectionAttemptIndex(systemAddress); + if (i==(unsigned int)-1) + return; + natDetectionAttempts.RemoveAtIndexFast(i); +} +void NatTypeDetectionServer::OnDetectionRequest(Packet *packet) +{ + unsigned int i = GetDetectionAttemptIndex(packet->systemAddress); + + RakNet::BitStream bsIn(packet->data, packet->length, false); + bsIn.IgnoreBytes(1); + bool isRequest=false; + bsIn.Read(isRequest); + if (isRequest) + { + if (i!=(unsigned int)-1) + return; // Already in progress + + NATDetectionAttempt nda; + nda.detectionState=STATE_NONE; + nda.systemAddress=packet->systemAddress; + nda.guid=packet->guid; + bsIn.Read(nda.c2Port); + nda.nextStateTime=0; + nda.timeBetweenAttempts=rakPeerInterface->GetLastPing(nda.systemAddress)*3+50; + natDetectionAttempts.Push(nda, _FILE_AND_LINE_); + } + else + { + if (i==(unsigned int)-1) + return; // Unknown + // They are done + natDetectionAttempts.RemoveAtIndexFast(i); + } + +} +unsigned int NatTypeDetectionServer::GetDetectionAttemptIndex(const SystemAddress &sa) +{ + for (unsigned int i=0; i < natDetectionAttempts.Size(); i++) + { + if (natDetectionAttempts[i].systemAddress==sa) + return i; + } + return (unsigned int) -1; +} +unsigned int NatTypeDetectionServer::GetDetectionAttemptIndex(RakNetGUID guid) +{ + for (unsigned int i=0; i < natDetectionAttempts.Size(); i++) + { + if (natDetectionAttempts[i].guid==guid) + return i; + } + return (unsigned int) -1; +} + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NatTypeDetectionServer.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NatTypeDetectionServer.h new file mode 100644 index 0000000..6c72559 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NatTypeDetectionServer.h @@ -0,0 +1,120 @@ +/// \file +/// \brief Contains the NAT-type detection code for the server +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_NatTypeDetectionServer==1 + +#ifndef __NAT_TYPE_DETECTION_SERVER_H +#define __NAT_TYPE_DETECTION_SERVER_H + +#include "RakNetTypes.h" +#include "Export.h" +#include "PluginInterface2.h" +#include "PacketPriority.h" +#include "SocketIncludes.h" +#include "DS_OrderedList.h" +#include "RakString.h" +#include "NatTypeDetectionCommon.h" + + +namespace RakNet +{ +/// Forward declarations +class RakPeerInterface; +struct Packet; + +/// \brief Server code for NatTypeDetection +/// \details +/// Sends to a remote system on certain ports and addresses to determine what type of router, if any, that client is behind +/// Requires that the server have 4 external IP addresses +///
    +///
  1. Server has 1 instance of RakNet. Server has four external ip addresses S1 to S4. Five ports are used in total P1 to P5. RakNet is bound to S1P1. Sockets are bound to S1P2, S2P3, S3P4, S4P5 +///
  2. Client with one port using RakNet (C1). Another port not using anything (C2). +///
  3. C1 connects to S1P1 for normal communication. +///
  4. S4P5 sends to C2. If arrived, no NAT. Done. (If didn't arrive, S4P5 potentially banned, do not use again). +///
  5. S2P3 sends to C1 (Different address, different port, to previously used port on client). If received, Full-cone nat. Done. (If didn't arrive, S2P3 potentially banned, do not use again). +///
  6. S1P2 sends to C1 (Same address, different port, to previously used port on client). If received, address-restricted cone nat. Done. +///
  7. Server via RakNet connection tells C1 to send to to S3P4. If address of C1 as seen by S3P4 is the same as the address of C1 as seen by S1P1 (RakNet connection), then port-restricted cone nat. Done +///
  8. Else symmetric nat. Done. +///
+/// See also http://www.jenkinssoftware.com/raknet/manual/natpunchthrough.html +/// \sa NatPunchthroughServer +/// \sa NatTypeDetectionClient +/// \ingroup NAT_TYPE_DETECTION_GROUP +class RAK_DLL_EXPORT NatTypeDetectionServer : public PluginInterface2 +{ +public: + + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(NatTypeDetectionServer) + + // Constructor + NatTypeDetectionServer(); + + // Destructor + virtual ~NatTypeDetectionServer(); + + /// Start the system, binding to 3 external IPs not already in useS + /// \param[in] nonRakNetIP2 First unused external IP + /// \param[in] nonRakNetIP3 Second unused external IP + /// \param[in] nonRakNetIP4 Third unused external IP + void Startup( + const char *nonRakNetIP2, + const char *nonRakNetIP3, + const char *nonRakNetIP4); + + // Releases the sockets created in Startup(); + void Shutdown(void); + + /// \internal For plugin handling + virtual void Update(void); + + /// \internal For plugin handling + virtual PluginReceiveResult OnReceive(Packet *packet); + virtual void OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ); + + enum NATDetectionState + { + STATE_NONE, + STATE_TESTING_NONE_1, + STATE_TESTING_NONE_2, + STATE_TESTING_FULL_CONE_1, + STATE_TESTING_FULL_CONE_2, + STATE_TESTING_ADDRESS_RESTRICTED_1, + STATE_TESTING_ADDRESS_RESTRICTED_2, + STATE_TESTING_PORT_RESTRICTED_1, + STATE_TESTING_PORT_RESTRICTED_2, + STATE_DONE, + }; + + struct NATDetectionAttempt + { + SystemAddress systemAddress; + NATDetectionState detectionState; + RakNet::TimeMS nextStateTime; + RakNet::TimeMS timeBetweenAttempts; + unsigned short c2Port; + RakNetGUID guid; + }; + +protected: + void OnDetectionRequest(Packet *packet); + DataStructures::List natDetectionAttempts; + unsigned int GetDetectionAttemptIndex(const SystemAddress &sa); + unsigned int GetDetectionAttemptIndex(RakNetGUID guid); + + // s1p1 is rakpeer itself + SOCKET s1p2,s2p3,s3p4,s4p5; + unsigned short s1p2Port, s2p3Port, s3p4Port, s4p5Port; + char s3p4Address[64]; +}; +} + + +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NativeFeatureIncludes.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NativeFeatureIncludes.h new file mode 100644 index 0000000..5c59be3 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NativeFeatureIncludes.h @@ -0,0 +1,175 @@ +// If you want to change these defines, put them in NativeFeatureIncludesOverrides so your changes are not lost when updating RakNet +// The user should not edit this file +#include "NativeFeatureIncludesOverrides.h" + +#ifndef __NATIVE_FEATURE_INCLDUES_H +#define __NATIVE_FEATURE_INCLDUES_H + +// Uncomment below defines, and paste to NativeFeatureIncludesOverrides.h, to exclude plugins that you do not want to build into the static library, or DLL +// These are not all the plugins, only those that are in the core library +// Other plugins are located in DependentExtensions +// #define _RAKNET_SUPPORT_ConnectionGraph2 0 +// #define _RAKNET_SUPPORT_DirectoryDeltaTransfer 0 +// #define _RAKNET_SUPPORT_FileListTransfer 0 +// #define _RAKNET_SUPPORT_FullyConnectedMesh2 0 +// #define _RAKNET_SUPPORT_MessageFilter 0 +// #define _RAKNET_SUPPORT_NatPunchthroughClient 0 +// #define _RAKNET_SUPPORT_NatPunchthroughServer 0 +// #define _RAKNET_SUPPORT_NatTypeDetectionClient 0 +// #define _RAKNET_SUPPORT_NatTypeDetectionServer 0 +// #define _RAKNET_SUPPORT_PacketLogger 0 +// #define _RAKNET_SUPPORT_ReadyEvent 0 +// #define _RAKNET_SUPPORT_ReplicaManager3 0 +// #define _RAKNET_SUPPORT_Router2 0 +// #define _RAKNET_SUPPORT_RPC4Plugin 0 +// #define _RAKNET_SUPPORT_TeamBalancer 0 +// #define _RAKNET_SUPPORT_UDPProxyClient 0 +// #define _RAKNET_SUPPORT_UDPProxyCoordinator 0 +// #define _RAKNET_SUPPORT_UDPProxyServer 0 +// #define _RAKNET_SUPPORT_ConsoleServer 0 +// #define _RAKNET_SUPPORT_RakNetTransport 0 +// #define _RAKNET_SUPPORT_TelnetTransport 0 +// #define _RAKNET_SUPPORT_TCPInterface 0 +// #define _RAKNET_SUPPORT_LogCommandParser 0 +// #define _RAKNET_SUPPORT_RakNetCommandParser 0 +// #define _RAKNET_SUPPORT_EmailSender 0 +// #define _RAKNET_SUPPORT_HTTPConnection 0 +// #define _RAKNET_SUPPORT_PacketizedTCP 0 +// #define _RAKNET_SUPPORT_TwoWayAuthentication 0 + +// SET DEFAULTS IF UNDEFINED +#ifndef LIBCAT_SECURITY +#define LIBCAT_SECURITY 0 +#endif +#ifndef _RAKNET_SUPPORT_ConnectionGraph2 +#define _RAKNET_SUPPORT_ConnectionGraph2 1 +#endif +#ifndef _RAKNET_SUPPORT_DirectoryDeltaTransfer +#define _RAKNET_SUPPORT_DirectoryDeltaTransfer 1 +#endif +#ifndef _RAKNET_SUPPORT_FileListTransfer +#define _RAKNET_SUPPORT_FileListTransfer 1 +#endif +#ifndef _RAKNET_SUPPORT_FullyConnectedMesh +#define _RAKNET_SUPPORT_FullyConnectedMesh 1 +#endif +#ifndef _RAKNET_SUPPORT_FullyConnectedMesh2 +#define _RAKNET_SUPPORT_FullyConnectedMesh2 1 +#endif +#ifndef _RAKNET_SUPPORT_MessageFilter +#define _RAKNET_SUPPORT_MessageFilter 1 +#endif +#ifndef _RAKNET_SUPPORT_NatPunchthroughClient +#define _RAKNET_SUPPORT_NatPunchthroughClient 1 +#endif +#ifndef _RAKNET_SUPPORT_NatPunchthroughServer +#define _RAKNET_SUPPORT_NatPunchthroughServer 1 +#endif +#ifndef _RAKNET_SUPPORT_NatTypeDetectionClient +#define _RAKNET_SUPPORT_NatTypeDetectionClient 1 +#endif +#ifndef _RAKNET_SUPPORT_NatTypeDetectionServer +#define _RAKNET_SUPPORT_NatTypeDetectionServer 1 +#endif +#ifndef _RAKNET_SUPPORT_PacketLogger +#define _RAKNET_SUPPORT_PacketLogger 1 +#endif +#ifndef _RAKNET_SUPPORT_ReadyEvent +#define _RAKNET_SUPPORT_ReadyEvent 1 +#endif +#ifndef _RAKNET_SUPPORT_ReplicaManager3 +#define _RAKNET_SUPPORT_ReplicaManager3 1 +#endif +#ifndef _RAKNET_SUPPORT_Router2 +#define _RAKNET_SUPPORT_Router2 1 +#endif +#ifndef _RAKNET_SUPPORT_RPC4Plugin +#define _RAKNET_SUPPORT_RPC4Plugin 1 +#endif +#ifndef _RAKNET_SUPPORT_TeamBalancer +#define _RAKNET_SUPPORT_TeamBalancer 1 +#endif +#ifndef _RAKNET_SUPPORT_UDPProxyClient +#define _RAKNET_SUPPORT_UDPProxyClient 1 +#endif +#ifndef _RAKNET_SUPPORT_UDPProxyCoordinator +#define _RAKNET_SUPPORT_UDPProxyCoordinator 1 +#endif +#ifndef _RAKNET_SUPPORT_UDPProxyServer +#define _RAKNET_SUPPORT_UDPProxyServer 1 +#endif +#ifndef _RAKNET_SUPPORT_ConsoleServer +#define _RAKNET_SUPPORT_ConsoleServer 1 +#endif +#ifndef _RAKNET_SUPPORT_RakNetTransport +#define _RAKNET_SUPPORT_RakNetTransport 1 +#endif +#ifndef _RAKNET_SUPPORT_TelnetTransport +#define _RAKNET_SUPPORT_TelnetTransport 1 +#endif +#ifndef _RAKNET_SUPPORT_TCPInterface +#define _RAKNET_SUPPORT_TCPInterface 1 +#endif +#ifndef _RAKNET_SUPPORT_LogCommandParser +#define _RAKNET_SUPPORT_LogCommandParser 1 +#endif +#ifndef _RAKNET_SUPPORT_RakNetCommandParser +#define _RAKNET_SUPPORT_RakNetCommandParser 1 +#endif +#ifndef _RAKNET_SUPPORT_EmailSender +#define _RAKNET_SUPPORT_EmailSender 1 +#endif +#ifndef _RAKNET_SUPPORT_HTTPConnection +#define _RAKNET_SUPPORT_HTTPConnection 1 +#endif +#ifndef _RAKNET_SUPPORT_PacketizedTCP +#define _RAKNET_SUPPORT_PacketizedTCP 1 +#endif +#ifndef _RAKNET_SUPPORT_TwoWayAuthentication +#define _RAKNET_SUPPORT_TwoWayAuthentication 1 +#endif +#ifndef _RAKNET_SUPPORT_CloudClient +#define _RAKNET_SUPPORT_CloudClient 1 +#endif +#ifndef _RAKNET_SUPPORT_CloudServer +#define _RAKNET_SUPPORT_CloudServer 1 +#endif +#ifndef _RAKNET_SUPPORT_DynDNS +#define _RAKNET_SUPPORT_DynDNS 1 +#endif +#ifndef _RAKNET_SUPPORT_Rackspace +#define _RAKNET_SUPPORT_Rackspace 1 +#endif +#ifndef _RAKNET_SUPPORT_FileOperations +#define _RAKNET_SUPPORT_FileOperations 1 +#endif +#ifndef _RAKNET_SUPPORT_UDPForwarder +#define _RAKNET_SUPPORT_UDPForwarder 1 +#endif + +// Take care of dependencies + +#undef _RAKNET_SUPPORT_FileListTransfer +#define _RAKNET_SUPPORT_FileListTransfer 1 + + +#undef _RAKNET_SUPPORT_ConnectionGraph2 +#define _RAKNET_SUPPORT_ConnectionGraph2 1 + + +#undef _RAKNET_SUPPORT_PacketizedTCP +#define _RAKNET_SUPPORT_PacketizedTCP 1 + + +#undef _RAKNET_SUPPORT_TCPInterface +#define _RAKNET_SUPPORT_TCPInterface 1 + + + + + + + + + +#endif // __NATIVE_FEATURE_INCLDUES_H diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NativeFeatureIncludesOverrides.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NativeFeatureIncludesOverrides.h new file mode 100644 index 0000000..d76ef48 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NativeFeatureIncludesOverrides.h @@ -0,0 +1,9 @@ +// USER EDITABLE FILE +// See NativeFeatureIncludes.h + +#ifndef __NATIVE_FEATURE_INCLDUES_OVERRIDES_H +#define __NATIVE_FEATURE_INCLDUES_OVERRIDES_H + +//#define LIBCAT_SECURITY 1 + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NativeTypes.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NativeTypes.h new file mode 100644 index 0000000..bf3c5bb --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NativeTypes.h @@ -0,0 +1,23 @@ +#ifndef __NATIVE_TYPES_H +#define __NATIVE_TYPES_H + +#if defined(__GNUC__) || defined(__GCCXML__) || defined(__SNC__) || defined(__S3E__) +#include +#elif !defined(_STDINT_H) && !defined(_SN_STDINT_H) && !defined(_SYS_STDINT_H_) && !defined(_STDINT) && !defined(_MACHTYPES_H_) && !defined(_STDINT_H_) + typedef unsigned char uint8_t; + typedef unsigned short uint16_t; + typedef unsigned __int32 uint32_t; + typedef signed char int8_t; + typedef signed short int16_t; + typedef __int32 int32_t; + #if defined(_MSC_VER) && _MSC_VER < 1300 + typedef unsigned __int64 uint64_t; + typedef signed __int64 int64_t; + #else + typedef unsigned long long int uint64_t; + typedef signed long long int64_t; + #endif +#endif + + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NetworkIDManager.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NetworkIDManager.cpp new file mode 100644 index 0000000..ed82ee2 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NetworkIDManager.cpp @@ -0,0 +1,108 @@ +/// \file +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NetworkIDManager.h" +#include "NetworkIDObject.h" +#include "RakAssert.h" +#include "GetTime.h" +#include "RakSleep.h" +#include "SuperFastHash.h" +#include "RakPeerInterface.h" + +using namespace RakNet; + +STATIC_FACTORY_DEFINITIONS(NetworkIDManager,NetworkIDManager) + +NetworkIDManager::NetworkIDManager() +{ + startingOffset = RakPeerInterface::Get64BitUniqueRandomNumber(); + memset(networkIdHash,0,sizeof(networkIdHash)); +} +NetworkIDManager::~NetworkIDManager(void) +{ + +} +NetworkIDObject *NetworkIDManager::GET_BASE_OBJECT_FROM_ID(NetworkID x) +{ + unsigned int hashIndex=NetworkIDToHashIndex(x); + NetworkIDObject *nio=networkIdHash[hashIndex]; + while (nio) + { + if (nio->GetNetworkID()==x) + return nio; + nio=nio->nextInstanceForNetworkIDManager; + } + return 0; +} +NetworkID NetworkIDManager::GetNewNetworkID(void) +{ + while (GET_BASE_OBJECT_FROM_ID(++startingOffset)) + ; + return startingOffset; +} +unsigned int NetworkIDManager::NetworkIDToHashIndex(NetworkID networkId) +{ +// return SuperFastHash((const char*) &networkId.guid.g,sizeof(networkId.guid.g)) % NETWORK_ID_MANAGER_HASH_LENGTH; + return (unsigned int) (networkId % NETWORK_ID_MANAGER_HASH_LENGTH); +} +void NetworkIDManager::TrackNetworkIDObject(NetworkIDObject *networkIdObject) +{ + RakAssert(networkIdObject->GetNetworkID()!=UNASSIGNED_NETWORK_ID); + unsigned int hashIndex=NetworkIDToHashIndex(networkIdObject->GetNetworkID()); +// printf("TrackNetworkIDObject hashIndex=%i guid=%s\n",hashIndex, networkIdObject->GetNetworkID().guid.ToString()); // removeme + if (networkIdHash[hashIndex]==0) + { + networkIdHash[hashIndex]=networkIdObject; + return; + } + NetworkIDObject *nio=networkIdHash[hashIndex]; + // Duplicate insertion? + RakAssert(nio!=networkIdObject); + // Random GUID conflict? + RakAssert(nio->GetNetworkID()!=networkIdObject->GetNetworkID()); + + while (nio->nextInstanceForNetworkIDManager!=0) + { + nio=nio->nextInstanceForNetworkIDManager; + + // Duplicate insertion? + RakAssert(nio!=networkIdObject); + // Random GUID conflict? + RakAssert(nio->GetNetworkID()!=networkIdObject->GetNetworkID()); + } + + networkIdObject->nextInstanceForNetworkIDManager=0; + nio->nextInstanceForNetworkIDManager=networkIdObject; +} +void NetworkIDManager::StopTrackingNetworkIDObject(NetworkIDObject *networkIdObject) +{ + RakAssert(networkIdObject->GetNetworkID()!=UNASSIGNED_NETWORK_ID); + unsigned int hashIndex=NetworkIDToHashIndex(networkIdObject->GetNetworkID()); +// printf("hashIndex=%i\n",hashIndex); // removeme + NetworkIDObject *nio=networkIdHash[hashIndex]; + if (nio==0) + { + RakAssert("NetworkIDManager::StopTrackingNetworkIDObject didn't find object" && 0); + return; + } + if (nio==networkIdObject) + { + networkIdHash[hashIndex]=nio->nextInstanceForNetworkIDManager; + return; + } + + while (nio) + { + if (nio->nextInstanceForNetworkIDManager==networkIdObject) + { + nio->nextInstanceForNetworkIDManager=networkIdObject->nextInstanceForNetworkIDManager; + return; + } + nio=nio->nextInstanceForNetworkIDManager; + } + + RakAssert("NetworkIDManager::StopTrackingNetworkIDObject didn't find object" && 0); +} diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NetworkIDManager.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NetworkIDManager.h new file mode 100644 index 0000000..ae009be --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NetworkIDManager.h @@ -0,0 +1,70 @@ +/// \file +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __NETWORK_ID_MANAGER_H +#define __NETWORK_ID_MANAGER_H + +#include "RakNetTypes.h" +#include "Export.h" +#include "RakMemoryOverride.h" +#include "NetworkIDObject.h" +#include "Rand.h" + +namespace RakNet +{ + +/// Increase this value if you plan to have many persistent objects +/// This value must match on all systems +#define NETWORK_ID_MANAGER_HASH_LENGTH 1024 + +/// This class is simply used to generate a unique number for a group of instances of NetworkIDObject +/// An instance of this class is required to use the ObjectID to pointer lookup system +/// You should have one instance of this class per game instance. +/// Call SetIsNetworkIDAuthority before using any functions of this class, or of NetworkIDObject +class RAK_DLL_EXPORT NetworkIDManager +{ +public: + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(NetworkIDManager) + + NetworkIDManager(); + virtual ~NetworkIDManager(void); + + /// Returns the parent object, or this instance if you don't use a parent. + /// Supports NetworkIDObject anywhere in the inheritance hierarchy + /// \pre You must first call SetNetworkIDManager before using this function + template + returnType GET_OBJECT_FROM_ID(NetworkID x) { + NetworkIDObject *nio = GET_BASE_OBJECT_FROM_ID(x); + if (nio==0) + return 0; + if (nio->GetParent()) + return (returnType) nio->GetParent(); + return (returnType) nio; + } + + /// \internal + NetworkIDObject *GET_BASE_OBJECT_FROM_ID(NetworkID x); + + /// \internal + void TrackNetworkIDObject(NetworkIDObject *networkIdObject); + void StopTrackingNetworkIDObject(NetworkIDObject *networkIdObject); + +protected: + friend class NetworkIDObject; + + NetworkIDObject *networkIdHash[NETWORK_ID_MANAGER_HASH_LENGTH]; + unsigned int NetworkIDToHashIndex(NetworkID networkId); + uint64_t startingOffset; + /// \internal + NetworkID GetNewNetworkID(void); + +}; + +} // namespace RakNet + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NetworkIDObject.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NetworkIDObject.cpp new file mode 100644 index 0000000..60a2345 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NetworkIDObject.cpp @@ -0,0 +1,62 @@ +/// \file +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#include "NetworkIDObject.h" +#include "NetworkIDManager.h" +#include "RakAssert.h" +#include "RakAlloca.h" + +using namespace RakNet; + +NetworkIDObject::NetworkIDObject() +{ + networkID=UNASSIGNED_NETWORK_ID; + parent=0; + networkIDManager=0; + nextInstanceForNetworkIDManager=0; +} +NetworkIDObject::~NetworkIDObject() +{ + if (networkID!=UNASSIGNED_NETWORK_ID) + networkIDManager->StopTrackingNetworkIDObject(this); +} +void NetworkIDObject::SetNetworkIDManager( NetworkIDManager *manager) +{ + networkIDManager=manager; +} +NetworkIDManager * NetworkIDObject::GetNetworkIDManager( void ) +{ + return networkIDManager; +} +NetworkID NetworkIDObject::GetNetworkID( void ) +{ + if (networkID==UNASSIGNED_NETWORK_ID) + { + RakAssert(networkIDManager); + networkID = networkIDManager->GetNewNetworkID(); + networkIDManager->TrackNetworkIDObject(this); + } + return networkID; +} +void NetworkIDObject::SetNetworkID( NetworkID id ) +{ + if (id==networkID) + return; + + if (networkID!=UNASSIGNED_NETWORK_ID) + networkIDManager->StopTrackingNetworkIDObject(this); + networkID = id; + networkIDManager->TrackNetworkIDObject(this); +} +void NetworkIDObject::SetParent( void *_parent ) +{ + parent=_parent; +} +void* NetworkIDObject::GetParent( void ) const +{ + return parent; +} diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NetworkIDObject.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NetworkIDObject.h new file mode 100644 index 0000000..69aaf34 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/NetworkIDObject.h @@ -0,0 +1,81 @@ +/// \file +/// \brief A class you can derive from to make it easier to represent every networked object with an integer. This way you can refer to objects over the network. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#if !defined(__NETWORK_ID_GENERATOR) +#define __NETWORK_ID_GENERATOR + +#include "RakNetTypes.h" +#include "RakMemoryOverride.h" +#include "Export.h" + +namespace RakNet +{ +/// Forward declarations +class NetworkIDManager; + +typedef uint32_t NetworkIDType; + +/// \brief Unique shared ids for each object instance +/// \details A class you can derive from to make it easier to represent every networked object with an integer. This way you can refer to objects over the network. +/// One system should return true for IsNetworkIDAuthority() and the rest should return false. When an object needs to be created, have the the one system create the object. +/// Then have that system send a message to all other systems, and include the value returned from GetNetworkID() in that packet. All other systems should then create the same +/// class of object, and call SetNetworkID() on that class with the NetworkID in the packet. +/// \see the manual for more information on this. +class RAK_DLL_EXPORT NetworkIDObject +{ +public: + // Constructor. NetworkIDs, if IsNetworkIDAuthority() is true, are created here. + NetworkIDObject(); + + // Destructor. Used NetworkIDs, if any, are freed here. + virtual ~NetworkIDObject(); + + /// Sets the manager class from which to request unique network IDs + /// Unlike previous versions, the NetworkIDObject relies on a manager class to provide IDs, rather than using statics, + /// So you can have more than one set of IDs on the same system. + virtual void SetNetworkIDManager( NetworkIDManager *manager); + + /// Returns what was passed to SetNetworkIDManager + virtual NetworkIDManager * GetNetworkIDManager( void ); + + /// Returns the NetworkID that you can use to refer to this object over the network. + /// \pre You must first call SetNetworkIDManager before using this function + /// \retval UNASSIGNED_NETWORK_ID UNASSIGNED_NETWORK_ID is returned IsNetworkIDAuthority() is false and SetNetworkID() was not previously called. This is also returned if you call this function in the constructor. + /// \retval 0-65534 Any other value is a valid NetworkID. NetworkIDs start at 0 and go to 65534, wrapping at that point. + virtual NetworkID GetNetworkID( void ); + + /// Sets the NetworkID for this instance. Usually this is called by the clients and determined from the servers. However, if you save multiplayer games you would likely use + /// This on load as well. + virtual void SetNetworkID( NetworkID id ); + + /// Your class does not have to derive from NetworkIDObject, although that is the easiest way to implement this. + /// If you want this to be a member object of another class, rather than inherit, then call SetParent() with a pointer to the parent class instance. + /// GET_OBJECT_FROM_ID will then return the parent rather than this instance. + virtual void SetParent( void *_parent ); + + /// Return what was passed to SetParent + /// \return The value passed to SetParent, or 0 if it was never called. + virtual void* GetParent( void ) const; + +protected: + /// The network ID of this object + NetworkID networkID; + + NetworkIDManager *networkIDManager; + + /// The parent set by SetParent() + void *parent; + + /// \internal, used by NetworkIDManager + friend class NetworkIDManager; + NetworkIDObject *nextInstanceForNetworkIDManager; +}; + +} // namespace RakNet + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PS3Includes.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PS3Includes.h new file mode 100644 index 0000000..ff1a125 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PS3Includes.h @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketConsoleLogger.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketConsoleLogger.cpp new file mode 100644 index 0000000..4788618 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketConsoleLogger.cpp @@ -0,0 +1,26 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_LogCommandParser==1 && _RAKNET_SUPPORT_PacketLogger==1 +#include "PacketConsoleLogger.h" +#include "LogCommandParser.h" +#include + +using namespace RakNet; + +PacketConsoleLogger::PacketConsoleLogger() +{ + logCommandParser=0; +} + +void PacketConsoleLogger::SetLogCommandParser(LogCommandParser *lcp) +{ + logCommandParser=lcp; + if (logCommandParser) + logCommandParser->AddChannel("PacketConsoleLogger"); +} +void PacketConsoleLogger::WriteLog(const char *str) +{ + if (logCommandParser) + logCommandParser->WriteLog("PacketConsoleLogger", str); +} + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketConsoleLogger.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketConsoleLogger.h new file mode 100644 index 0000000..62bc001 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketConsoleLogger.h @@ -0,0 +1,38 @@ +/// \file +/// \brief This will write all incoming and outgoing network messages to the log command parser, which can be accessed through Telnet +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_LogCommandParser==1 && _RAKNET_SUPPORT_PacketLogger==1 + +#ifndef __PACKET_CONSOLE_LOGGER_H_ +#define __PACKET_CONSOLE_LOGGER_H_ + +#include "PacketLogger.h" + +namespace RakNet +{ +/// Forward declarations +class LogCommandParser; + +/// \ingroup PACKETLOGGER_GROUP +/// \brief Packetlogger that logs to a remote command console +class RAK_DLL_EXPORT PacketConsoleLogger : public PacketLogger +{ +public: + PacketConsoleLogger(); + // Writes to the command parser used for logging, which is accessed through a secondary communication layer (such as Telnet or RakNet) - See ConsoleServer.h + virtual void SetLogCommandParser(LogCommandParser *lcp); + virtual void WriteLog(const char *str); +protected: + LogCommandParser *logCommandParser; +}; + +} // namespace RakNet + +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketFileLogger.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketFileLogger.cpp new file mode 100644 index 0000000..02aabd7 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketFileLogger.cpp @@ -0,0 +1,45 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_PacketLogger==1 +#include "PacketFileLogger.h" +#include "GetTime.h" + +using namespace RakNet; + +PacketFileLogger::PacketFileLogger() +{ + packetLogFile=0; +} +PacketFileLogger::~PacketFileLogger() +{ + if (packetLogFile) + { + fflush(packetLogFile); + fclose(packetLogFile); + } +} +void PacketFileLogger::StartLog(const char *filenamePrefix) +{ + // Open file for writing + char filename[256]; + if (filenamePrefix) + sprintf(filename, "%s_%i.csv", filenamePrefix, (int) RakNet::GetTimeMS()); + else + sprintf(filename, "PacketLog_%i.csv", (int) RakNet::GetTimeMS()); + packetLogFile = fopen(filename, "wt"); + LogHeader(); + if (packetLogFile) + { + fflush(packetLogFile); + } +} + +void PacketFileLogger::WriteLog(const char *str) +{ + if (packetLogFile) + { + fprintf(packetLogFile, "%s\n", str); + fflush(packetLogFile); + } +} + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketFileLogger.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketFileLogger.h new file mode 100644 index 0000000..1e08f28 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketFileLogger.h @@ -0,0 +1,37 @@ +/// \file +/// \brief This will write all incoming and outgoing network messages to a file +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_PacketLogger==1 + +#ifndef __PACKET_FILE_LOGGER_H_ +#define __PACKET_FILE_LOGGER_H_ + +#include "PacketLogger.h" +#include + +namespace RakNet +{ + +/// \ingroup PACKETLOGGER_GROUP +/// \brief Packetlogger that outputs to a file +class RAK_DLL_EXPORT PacketFileLogger : public PacketLogger +{ +public: + PacketFileLogger(); + virtual ~PacketFileLogger(); + void StartLog(const char *filenamePrefix); + virtual void WriteLog(const char *str); +protected: + FILE *packetLogFile; +}; + +} // namespace RakNet + +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketLogger.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketLogger.cpp new file mode 100644 index 0000000..60c77af --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketLogger.cpp @@ -0,0 +1,456 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_PacketLogger==1 + +#include "PacketLogger.h" +#include "BitStream.h" +#include "DS_List.h" +#include "InternalPacket.h" +#include "RakPeerInterface.h" +#include "MessageIdentifiers.h" +#include "StringCompressor.h" +#include "GetTime.h" +#include +#include +#include +#include "Itoa.h" +#include +#include "SocketIncludes.h" +#include "gettimeofday.h" + +#ifdef _MSC_VER +#pragma warning( push ) +#endif + +using namespace RakNet; + +STATIC_FACTORY_DEFINITIONS(PacketLogger,PacketLogger); + +PacketLogger::PacketLogger() +{ + printId=true; + printAcks=true; + prefix[0]=0; + suffix[0]=0; + logDirectMessages=true; +} +PacketLogger::~PacketLogger() +{ +} +void PacketLogger::FormatLine( +char* into, const char* dir, const char* type, unsigned int reliableMessageNumber, unsigned int frame, unsigned char id +, const BitSize_t bitLen, unsigned long long time, const SystemAddress& local, const SystemAddress& remote, +unsigned int splitPacketId, unsigned int splitPacketIndex, unsigned int splitPacketCount, unsigned int orderingIndex) +{ + char numericID[16]; + const char* idToPrint = NULL; + if(printId) + { + if (splitPacketCount>0 && splitPacketCount!=(unsigned int)-1) + idToPrint="(SPLIT PACKET)"; + else + idToPrint = IDTOString(id); + } + // If printId is false, idToPrint will be NULL, as it will + // in the case of an unrecognized id. Testing printId for false + // would just be redundant. + if(idToPrint == NULL) + { + sprintf(numericID, "%5u", id); + idToPrint = numericID; + } + + FormatLine(into, dir, type, reliableMessageNumber, frame, idToPrint, bitLen, time, local, remote,splitPacketId,splitPacketIndex,splitPacketCount, orderingIndex); +} + +void PacketLogger::FormatLine( +char* into, const char* dir, const char* type, unsigned int reliableMessageNumber, unsigned int frame, const char* idToPrint +, const BitSize_t bitLen, unsigned long long time, const SystemAddress& local, const SystemAddress& remote, +unsigned int splitPacketId, unsigned int splitPacketIndex, unsigned int splitPacketCount, unsigned int orderingIndex) +{ + char str1[64], str2[62]; + local.ToString(true, str1); + remote.ToString(true, str2); + char localtime[128]; + GetLocalTime(localtime); + char str3[64]; + if (reliableMessageNumber==(unsigned int)-1) + { + str3[0]='N'; + str3[1]='/'; + str3[2]='A'; + str3[3]=0; + } + else + { + sprintf(str3,"%5u",reliableMessageNumber); + } + + sprintf(into, "%s,%s%s,%s,%s,%5u,%s,%u,%"PRINTF_64_BIT_MODIFIER"u,%s,%s,%i,%i,%i,%i,%s," + , localtime + , prefix + , dir + , type + , str3 + , frame + , idToPrint + , bitLen + , time + , str1 + , str2 + , splitPacketId + , splitPacketIndex + , splitPacketCount + , orderingIndex + , suffix + ); +} +void PacketLogger::OnDirectSocketSend(const char *data, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress) +{ + if (logDirectMessages==false) + return; + + char str[256]; + FormatLine(str, "Snd", "Raw", 0, 0, data[0], bitsUsed, RakNet::GetTimeMS(), rakPeerInterface->GetExternalID(remoteSystemAddress), remoteSystemAddress, (unsigned int)-1,(unsigned int)-1,(unsigned int)-1,(unsigned int)-1); + AddToLog(str); +} + +void PacketLogger::LogHeader(void) +{ + // Last 5 are splitpacket id, split packet index, split packet count, ordering index, suffix + AddToLog("Clock,S|R,Typ,Reliable#,Frm #,PktID,BitLn,Time ,Local IP:Port ,RemoteIP:Port,SPID,SPIN,SPCO,OI,Suffix,Miscellaneous\n"); +} +void PacketLogger::OnDirectSocketReceive(const char *data, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress) +{ + if (logDirectMessages==false) + return; + + char str[256]; + FormatLine(str, "Rcv", "Raw", 0, 0, data[0], bitsUsed, RakNet::GetTime(), rakPeerInterface->GetInternalID(UNASSIGNED_SYSTEM_ADDRESS), remoteSystemAddress,(unsigned int)-1,(unsigned int)-1,(unsigned int)-1,(unsigned int)-1); + AddToLog(str); +} +void PacketLogger::OnReliabilityLayerPacketError(const char *errorMessage, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress) +{ + char str[1024]; + FormatLine(str, "RcvErr", errorMessage, 0, 0, "", bitsUsed, RakNet::GetTime(), rakPeerInterface->GetInternalID(UNASSIGNED_SYSTEM_ADDRESS), remoteSystemAddress,(unsigned int)-1,(unsigned int)-1,(unsigned int)-1,(unsigned int)-1); + AddToLog(str); +} +void PacketLogger::OnAck(unsigned int messageNumber, SystemAddress remoteSystemAddress, RakNet::TimeMS time) +{ + char str[256]; + char str1[64], str2[62]; + SystemAddress localSystemAddress = rakPeerInterface->GetExternalID(remoteSystemAddress); + localSystemAddress.ToString(true, str1); + remoteSystemAddress.ToString(true, str2); + char localtime[128]; + GetLocalTime(localtime); + + sprintf(str, "%s,Rcv,Ack,%i,,,,%"PRINTF_64_BIT_MODIFIER"u,%s,%s,,,,,," + , localtime + , messageNumber + , (unsigned long long) time + , str1 + , str2 + ); + AddToLog(str); +} +void PacketLogger::OnPushBackPacket(const char *data, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress) +{ + char str[256]; + char str1[64], str2[62]; + SystemAddress localSystemAddress = rakPeerInterface->GetExternalID(remoteSystemAddress); + localSystemAddress.ToString(true, str1); + remoteSystemAddress.ToString(true, str2); + RakNet::TimeMS time = RakNet::GetTimeMS(); + char localtime[128]; + GetLocalTime(localtime); + + sprintf(str, "%s,Lcl,PBP,,,%s,%i,%"PRINTF_64_BIT_MODIFIER"u,%s,%s,,,,,," + , localtime + , BaseIDTOString(data[0]) + , bitsUsed + , (unsigned long long) time + , str1 + , str2 + ); + AddToLog(str); +} +void PacketLogger::OnInternalPacket(InternalPacket *internalPacket, unsigned frameNumber, SystemAddress remoteSystemAddress, RakNet::TimeMS time, int isSend) +{ + char str[256]; + const char *sendTypes[] = + { + "Rcv", + "Snd", + "Err1", + "Err2", + "Err3", + "Err4", + "Err5", + "Err6", + }; + const char *sendType = sendTypes[isSend]; + SystemAddress localSystemAddress = rakPeerInterface->GetExternalID(remoteSystemAddress); + + unsigned int reliableMessageNumber; + if (internalPacket->reliability==UNRELIABLE || internalPacket->reliability==UNRELIABLE_SEQUENCED || internalPacket->reliability==UNRELIABLE_WITH_ACK_RECEIPT) + reliableMessageNumber=(unsigned int)-1; + else + reliableMessageNumber=internalPacket->reliableMessageNumber; + + if (internalPacket->data[0]==ID_TIMESTAMP) + { + FormatLine(str, sendType, "Tms", reliableMessageNumber, frameNumber, internalPacket->data[1+sizeof(RakNet::Time)], internalPacket->dataBitLength, (unsigned long long)time, localSystemAddress, remoteSystemAddress, internalPacket->splitPacketId, internalPacket->splitPacketIndex, internalPacket->splitPacketCount, internalPacket->orderingIndex); + } + else + { + FormatLine(str, sendType, "Nrm", reliableMessageNumber, frameNumber, internalPacket->data[0], internalPacket->dataBitLength, (unsigned long long)time, localSystemAddress, remoteSystemAddress, internalPacket->splitPacketId, internalPacket->splitPacketIndex, internalPacket->splitPacketCount, internalPacket->orderingIndex); + } + + AddToLog(str); +} +void PacketLogger::AddToLog(const char *str) +{ + WriteLog(str); +} +void PacketLogger::WriteLog(const char *str) +{ + RAKNET_DEBUG_PRINTF("%s\n", str); +} +void PacketLogger::WriteMiscellaneous(const char *type, const char *msg) +{ + char str[1024]; + char str1[64]; + SystemAddress localSystemAddress = rakPeerInterface->GetInternalID(); + localSystemAddress.ToString(true, str1); + RakNet::TimeMS time = RakNet::GetTimeMS(); + char localtime[128]; + GetLocalTime(localtime); + + sprintf(str, "%s,Lcl,%s,,,,,%"PRINTF_64_BIT_MODIFIER"u,%s,,,,,,,%s" + , localtime + , type + , (unsigned long long) time + , str1 + , msg + ); + + AddToLog(msg); +} +void PacketLogger::SetPrintID(bool print) +{ + printId=print; +} +void PacketLogger::SetPrintAcks(bool print) +{ + printAcks=print; +} +const char* PacketLogger::BaseIDTOString(unsigned char Id) +{ + if (Id >= ID_USER_PACKET_ENUM) + return 0; + + const char *IDTable[((int)ID_USER_PACKET_ENUM)+1]= + { + "ID_CONNECTED_PING", + "ID_UNCONNECTED_PING", + "ID_UNCONNECTED_PING_OPEN_CONNECTIONS", + "ID_CONNECTED_PONG", + "ID_DETECT_LOST_CONNECTIONS", + "ID_OPEN_CONNECTION_REQUEST_1", + "ID_OPEN_CONNECTION_REPLY_1", + "ID_OPEN_CONNECTION_REQUEST_2", + "ID_OPEN_CONNECTION_REPLY_2", + "ID_CONNECTION_REQUEST", + "ID_REMOTE_SYSTEM_REQUIRES_PUBLIC_KEY", + "ID_OUR_SYSTEM_REQUIRES_SECURITY", + "ID_PUBLIC_KEY_MISMATCH", + "ID_OUT_OF_BAND_INTERNAL", + "ID_SND_RECEIPT_ACKED", + "ID_SND_RECEIPT_LOSS", + "ID_CONNECTION_REQUEST_ACCEPTED", + "ID_CONNECTION_ATTEMPT_FAILED", + "ID_ALREADY_CONNECTED", + "ID_NEW_INCOMING_CONNECTION", + "ID_NO_FREE_INCOMING_CONNECTIONS", + "ID_DISCONNECTION_NOTIFICATION", + "ID_CONNECTION_LOST", + "ID_CONNECTION_BANNED", + "ID_INVALID_PASSWORD", + "ID_INCOMPATIBLE_PROTOCOL_VERSION", + "ID_IP_RECENTLY_CONNECTED", + "ID_TIMESTAMP", + "ID_UNCONNECTED_PONG", + "ID_ADVERTISE_SYSTEM", + "ID_DOWNLOAD_PROGRESS", + "ID_REMOTE_DISCONNECTION_NOTIFICATION", + "ID_REMOTE_CONNECTION_LOST", + "ID_REMOTE_NEW_INCOMING_CONNECTION", + "ID_FILE_LIST_TRANSFER_HEADER", + "ID_FILE_LIST_TRANSFER_FILE", + "ID_FILE_LIST_REFERENCE_PUSH_ACK", + "ID_DDT_DOWNLOAD_REQUEST", + "ID_TRANSPORT_STRING", + "ID_REPLICA_MANAGER_CONSTRUCTION", + "ID_REPLICA_MANAGER_SCOPE_CHANGE", + "ID_REPLICA_MANAGER_SERIALIZE", + "ID_REPLICA_MANAGER_DOWNLOAD_STARTED", + "ID_REPLICA_MANAGER_DOWNLOAD_COMPLETE", + "ID_RAKVOICE_OPEN_CHANNEL_REQUEST", + "ID_RAKVOICE_OPEN_CHANNEL_REPLY", + "ID_RAKVOICE_CLOSE_CHANNEL", + "ID_RAKVOICE_DATA", + "ID_AUTOPATCHER_GET_CHANGELIST_SINCE_DATE", + "ID_AUTOPATCHER_CREATION_LIST", + "ID_AUTOPATCHER_DELETION_LIST", + "ID_AUTOPATCHER_GET_PATCH", + "ID_AUTOPATCHER_PATCH_LIST", + "ID_AUTOPATCHER_REPOSITORY_FATAL_ERROR", + "ID_AUTOPATCHER_FINISHED_INTERNAL", + "ID_AUTOPATCHER_FINISHED", + "ID_AUTOPATCHER_RESTART_APPLICATION", + "ID_NAT_PUNCHTHROUGH_REQUEST", + "ID_NAT_GROUP_PUNCHTHROUGH_REQUEST", + "ID_NAT_GROUP_PUNCHTHROUGH_REPLY", + "ID_NAT_CONNECT_AT_TIME", + "ID_NAT_GET_MOST_RECENT_PORT", + "ID_NAT_CLIENT_READY", + "ID_NAT_GROUP_PUNCHTHROUGH_FAILURE_NOTIFICATION", + "ID_NAT_TARGET_NOT_CONNECTED", + "ID_NAT_TARGET_UNRESPONSIVE", + "ID_NAT_CONNECTION_TO_TARGET_LOST", + "ID_NAT_ALREADY_IN_PROGRESS", + "ID_NAT_PUNCHTHROUGH_FAILED", + "ID_NAT_PUNCHTHROUGH_SUCCEEDED", + "ID_NAT_GROUP_PUNCH_FAILED", + "ID_NAT_GROUP_PUNCH_SUCCEEDED", + "ID_READY_EVENT_SET", + "ID_READY_EVENT_UNSET", + "ID_READY_EVENT_ALL_SET", + "ID_READY_EVENT_QUERY", + "ID_LOBBY_GENERAL", + "ID_RPC_REMOTE_ERROR", + "ID_RPC_PLUGIN", + "ID_FILE_LIST_REFERENCE_PUSH", + "ID_READY_EVENT_FORCE_ALL_SET", + "ID_ROOMS_EXECUTE_FUNC", + "ID_ROOMS_LOGON_STATUS", + "ID_ROOMS_HANDLE_CHANGE", + "ID_LOBBY2_SEND_MESSAGE", + "ID_LOBBY2_SERVER_ERROR", + "ID_FCM2_NEW_HOST", + "ID_FCM2_REQUEST_FCMGUID", + "ID_FCM2_RESPOND_CONNECTION_COUNT", + "ID_FCM2_INFORM_FCMGUID", + "ID_FCM2_UPDATE_MIN_TOTAL_CONNECTION_COUNT", + "ID_UDP_PROXY_GENERAL", + "ID_SQLite3_EXEC", + "ID_SQLite3_UNKNOWN_DB", + "ID_SQLLITE_LOGGER", + "ID_NAT_TYPE_DETECTION_REQUEST", + "ID_NAT_TYPE_DETECTION_RESULT", + "ID_ROUTER_2_INTERNAL", + "ID_ROUTER_2_FORWARDING_NO_PATH", + "ID_ROUTER_2_FORWARDING_ESTABLISHED", + "ID_ROUTER_2_REROUTED", + "ID_TEAM_BALANCER_INTERNAL", + "ID_TEAM_BALANCER_REQUESTED_TEAM_CHANGE_PENDING", + "ID_TEAM_BALANCER_TEAMS_LOCKED", + "ID_TEAM_BALANCER_TEAM_ASSIGNED", + "ID_LIGHTSPEED_INTEGRATION", + "ID_XBOX_LOBBY", + "ID_TWO_WAY_AUTHENTICATION_INCOMING_CHALLENGE_SUCCESS", + "ID_TWO_WAY_AUTHENTICATION_OUTGOING_CHALLENGE_SUCCESS", + "ID_TWO_WAY_AUTHENTICATION_INCOMING_CHALLENGE_FAILURE", + "ID_TWO_WAY_AUTHENTICATION_OUTGOING_CHALLENGE_FAILURE", + "ID_TWO_WAY_AUTHENTICATION_OUTGOING_CHALLENGE_TIMEOUT", + "ID_TWO_WAY_AUTHENTICATION_NEGOTIATION", + "ID_CLOUD_POST_REQUEST", + "ID_CLOUD_RELEASE_REQUEST", + "ID_CLOUD_GET_REQUEST", + "ID_CLOUD_GET_RESPONSE", + "ID_CLOUD_UNSUBSCRIBE_REQUEST", + "ID_CLOUD_SERVER_TO_SERVER_COMMAND", + "ID_CLOUD_SUBSCRIPTION_NOTIFICATION", + "ID_RESERVED_1", + "ID_RESERVED_2", + "ID_RESERVED_3", + "ID_RESERVED_4", + "ID_RESERVED_5", + "ID_RESERVED_6", + "ID_RESERVED_7", + "ID_RESERVED_8", + "ID_RESERVED_9", + "ID_USER_PACKET_ENUM", + }; + + return (char*)IDTable[Id]; +} +const char* PacketLogger::UserIDTOString(unsigned char Id) +{ + // Users should override this + static char str[256]; + Itoa(Id, str, 10); + return (const char*) str; +} +const char* PacketLogger::IDTOString(unsigned char Id) +{ + const char *out; + out=BaseIDTOString(Id); + if (out) + return out; + return UserIDTOString(Id); +} +void PacketLogger::SetPrefix(const char *_prefix) +{ + strncpy(prefix, _prefix, 255); + prefix[255]=0; +} +void PacketLogger::SetSuffix(const char *_suffix) +{ + strncpy(suffix, _suffix, 255); + suffix[255]=0; +} +void PacketLogger::GetLocalTime(char buffer[128]) +{ +#if defined(_WIN32) && !defined(__GNUC__) && !defined(__GCCXML__) + time_t rawtime; + struct timeval tv; + // If you get an arror about an incomplete type, just delete this file + struct timezone tz; + gettimeofday(&tv, &tz); + // time ( &rawtime ); + rawtime=tv.tv_sec; + + struct tm * timeinfo; + timeinfo = localtime ( &rawtime ); + strftime (buffer,128,"%x %X",timeinfo); + char buff[32]; + sprintf(buff, ".%i", tv.tv_usec); + strcat(buffer,buff); + + // Commented version puts the time first + /* + struct tm * timeinfo; + timeinfo = localtime ( &rawtime ); + strftime (buffer,128,"%X",timeinfo); + char buff[32]; + sprintf(buff, ".%i ", tv.tv_usec); + strcat(buffer,buff); + char buff2[32]; + strftime (buff2,32,"%x",timeinfo); + strcat(buffer,buff2); + */ +#else + buffer[0]=0; +#endif +} +void PacketLogger::SetLogDirectMessages(bool send) +{ + logDirectMessages=send; +} + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketLogger.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketLogger.h new file mode 100644 index 0000000..3ad9988 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketLogger.h @@ -0,0 +1,101 @@ +/// \file +/// \brief This will write all incoming and outgoing network messages to the local console screen. See derived functions for other outputs +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_PacketLogger==1 + +#ifndef __PACKET_LOGGER_H +#define __PACKET_LOGGER_H + +#include "RakNetTypes.h" +#include "PluginInterface2.h" +#include "Export.h" + +namespace RakNet +{ +/// Forward declarations +class RakPeerInterface; + +/// \defgroup PACKETLOGGER_GROUP PacketLogger +/// \brief Print out incoming messages to a target destination +/// \details +/// \ingroup PLUGINS_GROUP + +/// \brief Writes incoming and outgoing messages to the screen. +/// This will write all incoming and outgoing messages to the console window, or to a file if you override it and give it this functionality. +/// \ingroup PACKETLOGGER_GROUP +class RAK_DLL_EXPORT PacketLogger : public PluginInterface2 +{ +public: + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(PacketLogger) + + PacketLogger(); + virtual ~PacketLogger(); + + // Translate the supplied parameters into an output line - overloaded version that takes a MessageIdentifier + // and translates it into a string (numeric or textual representation based on printId); this calls the + // second version which takes a const char* argument for the messageIdentifier + virtual void FormatLine(char* into, const char* dir, const char* type, unsigned int reliableMessageNumber, unsigned int frame + , unsigned char messageIdentifier, const BitSize_t bitLen, unsigned long long time, const SystemAddress& local, const SystemAddress& remote, + unsigned int splitPacketId, unsigned int splitPacketIndex, unsigned int splitPacketCount, unsigned int orderingIndex); + virtual void FormatLine(char* into, const char* dir, const char* type, unsigned int reliableMessageNumber, unsigned int frame + , const char* idToPrint, const BitSize_t bitLen, unsigned long long time, const SystemAddress& local, const SystemAddress& remote, + unsigned int splitPacketId, unsigned int splitPacketIndex, unsigned int splitPacketCount, unsigned int orderingIndex); + + /// Events on low level sends and receives. These functions may be called from different threads at the same time. + virtual void OnDirectSocketSend(const char *data, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress); + virtual void OnDirectSocketReceive(const char *data, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress); + virtual void OnReliabilityLayerPacketError(const char *errorMessage, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress); + virtual void OnInternalPacket(InternalPacket *internalPacket, unsigned frameNumber, SystemAddress remoteSystemAddress, RakNet::TimeMS time, int isSend); + virtual void OnAck(unsigned int messageNumber, SystemAddress remoteSystemAddress, RakNet::TimeMS time); + virtual void OnPushBackPacket(const char *data, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress); + + /// Logs out a header for all the data + virtual void LogHeader(void); + + /// Override this to log strings to wherever. Log should be threadsafe + virtual void WriteLog(const char *str); + + // Write informational messages + virtual void WriteMiscellaneous(const char *type, const char *msg); + + + // Set to true to print ID_* instead of numbers + virtual void SetPrintID(bool print); + // Print or hide acks (clears up the screen not to print them but is worse for debugging) + virtual void SetPrintAcks(bool print); + + /// Prepend this string to output logs. + virtual void SetPrefix(const char *_prefix); + + /// Append this string to output logs. (newline is useful here) + virtual void SetSuffix(const char *_suffix); + static const char* BaseIDTOString(unsigned char Id); + + /// Log the direct sends and receives or not. Default true + void SetLogDirectMessages(bool send); +protected: + + virtual bool UsesReliabilityLayer(void) const {return true;} + const char* IDTOString(unsigned char Id); + virtual void AddToLog(const char *str); + // Users should override this + virtual const char* UserIDTOString(unsigned char Id); + void GetLocalTime(char buffer[128]); + bool logDirectMessages; + + bool printId, printAcks; + char prefix[256]; + char suffix[256]; +}; + +} // namespace RakNet + +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketOutputWindowLogger.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketOutputWindowLogger.cpp new file mode 100644 index 0000000..7f2d3aa --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketOutputWindowLogger.cpp @@ -0,0 +1,39 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_PacketLogger==1 + +#if defined(UNICODE) +#include "RakWString.h" +#endif + +#include "PacketOutputWindowLogger.h" +#include "RakString.h" +#if defined(_WIN32) && !defined(X360__) +#include "WindowsIncludes.h" +#endif + +using namespace RakNet; + +PacketOutputWindowLogger::PacketOutputWindowLogger() +{ +} +PacketOutputWindowLogger::~PacketOutputWindowLogger() +{ +} +void PacketOutputWindowLogger::WriteLog(const char *str) +{ +#if defined(_WIN32) && !defined(X360__) + + #if defined(UNICODE) + RakNet::RakWString str2 = str; + str2+="\n"; + OutputDebugString(str2.C_String()); + #else + RakNet::RakString str2 = str; + str2+="\n"; + OutputDebugString(str2.C_String()); + #endif + +#endif +} + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketOutputWindowLogger.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketOutputWindowLogger.h new file mode 100644 index 0000000..a1dd760 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketOutputWindowLogger.h @@ -0,0 +1,34 @@ +/// \file +/// \brief This will write all incoming and outgoing network messages to a file +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_PacketLogger==1 + +#ifndef __PACKET_OUTPUT_WINDOW_LOGGER_H_ +#define __PACKET_OUTPUT_WINDOW_LOGGER_H_ + +#include "PacketLogger.h" + +namespace RakNet +{ + +/// \ingroup PACKETLOGGER_GROUP +/// \brief Packetlogger that outputs to the output window in the debugger. Windows only. +class RAK_DLL_EXPORT PacketOutputWindowLogger : public PacketLogger +{ +public: + PacketOutputWindowLogger(); + virtual ~PacketOutputWindowLogger(); + virtual void WriteLog(const char *str); +protected: +}; + +} // namespace RakNet + +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketPool.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketPool.h new file mode 100644 index 0000000..b534cac --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketPool.h @@ -0,0 +1 @@ +// REMOVEME \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketPriority.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketPriority.h new file mode 100644 index 0000000..ff84dab --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketPriority.h @@ -0,0 +1,79 @@ +/// \file +/// \brief This file contains enumerations for packet priority and reliability enumerations. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __PACKET_PRIORITY_H +#define __PACKET_PRIORITY_H + +/// These enumerations are used to describe when packets are delivered. +enum PacketPriority +{ + /// The highest possible priority. These message trigger sends immediately, and are generally not buffered or aggregated into a single datagram. + IMMEDIATE_PRIORITY, + + /// For every 2 IMMEDIATE_PRIORITY messages, 1 HIGH_PRIORITY will be sent. + /// Messages at this priority and lower are buffered to be sent in groups at 10 millisecond intervals to reduce UDP overhead and better measure congestion control. + HIGH_PRIORITY, + + /// For every 2 HIGH_PRIORITY messages, 1 MEDIUM_PRIORITY will be sent. + /// Messages at this priority and lower are buffered to be sent in groups at 10 millisecond intervals to reduce UDP overhead and better measure congestion control. + MEDIUM_PRIORITY, + + /// For every 2 MEDIUM_PRIORITY messages, 1 LOW_PRIORITY will be sent. + /// Messages at this priority and lower are buffered to be sent in groups at 10 millisecond intervals to reduce UDP overhead and better measure congestion control. + LOW_PRIORITY, + + /// \internal + NUMBER_OF_PRIORITIES +}; + +/// These enumerations are used to describe how packets are delivered. +/// \note Note to self: I write this with 3 bits in the stream. If I add more remember to change that +/// \note In ReliabilityLayer::WriteToBitStreamFromInternalPacket I assume there are 5 major types +/// \note Do not reorder, I check on >= UNRELIABLE_WITH_ACK_RECEIPT +enum PacketReliability +{ + /// Same as regular UDP, except that it will also discard duplicate datagrams. RakNet adds (6 to 17) + 21 bits of overhead, 16 of which is used to detect duplicate packets and 6 to 17 of which is used for message length. + UNRELIABLE, + + /// Regular UDP with a sequence counter. Out of order messages will be discarded. + /// Sequenced and ordered messages sent on the same channel will arrive in the order sent. + UNRELIABLE_SEQUENCED, + + /// The message is sent reliably, but not necessarily in any order. Same overhead as UNRELIABLE. + RELIABLE, + + /// This message is reliable and will arrive in the order you sent it. Messages will be delayed while waiting for out of order messages. Same overhead as UNRELIABLE_SEQUENCED. + /// Sequenced and ordered messages sent on the same channel will arrive in the order sent. + RELIABLE_ORDERED, + + /// This message is reliable and will arrive in the sequence you sent it. Out or order messages will be dropped. Same overhead as UNRELIABLE_SEQUENCED. + /// Sequenced and ordered messages sent on the same channel will arrive in the order sent. + RELIABLE_SEQUENCED, + + /// Same as UNRELIABLE, however the user will get either ID_SND_RECEIPT_ACKED or ID_SND_RECEIPT_LOSS based on the result of sending this message when calling RakPeerInterface::Receive(). Bytes 1-4 will contain the number returned from the Send() function. On disconnect or shutdown, all messages not previously acked should be considered lost. + UNRELIABLE_WITH_ACK_RECEIPT, + + /// Same as UNRELIABLE_SEQUENCED, however the user will get either ID_SND_RECEIPT_ACKED or ID_SND_RECEIPT_LOSS based on the result of sending this message when calling RakPeerInterface::Receive(). Bytes 1-4 will contain the number returned from the Send() function. On disconnect or shutdown, all messages not previously acked should be considered lost. + /// 05/04/10 You can't have sequenced and ack receipts, because you don't know if the other system discarded the message, meaning you don't know if the message was processed + // UNRELIABLE_SEQUENCED_WITH_ACK_RECEIPT, + + /// Same as RELIABLE. The user will also get ID_SND_RECEIPT_ACKED after the message is delivered when calling RakPeerInterface::Receive(). ID_SND_RECEIPT_ACKED is returned when the message arrives, not necessarily the order when it was sent. Bytes 1-4 will contain the number returned from the Send() function. On disconnect or shutdown, all messages not previously acked should be considered lost. This does not return ID_SND_RECEIPT_LOSS. + RELIABLE_WITH_ACK_RECEIPT, + + /// Same as RELIABLE_ORDERED_ACK_RECEIPT. The user will also get ID_SND_RECEIPT_ACKED after the message is delivered when calling RakPeerInterface::Receive(). ID_SND_RECEIPT_ACKED is returned when the message arrives, not necessarily the order when it was sent. Bytes 1-4 will contain the number returned from the Send() function. On disconnect or shutdown, all messages not previously acked should be considered lost. This does not return ID_SND_RECEIPT_LOSS. + RELIABLE_ORDERED_WITH_ACK_RECEIPT, + + /// Same as RELIABLE_SEQUENCED. The user will also get ID_SND_RECEIPT_ACKED after the message is delivered when calling RakPeerInterface::Receive(). Bytes 1-4 will contain the number returned from the Send() function. On disconnect or shutdown, all messages not previously acked should be considered lost. + /// 05/04/10 You can't have sequenced and ack receipts, because you don't know if the other system discarded the message, meaning you don't know if the message was processed + // RELIABLE_SEQUENCED_WITH_ACK_RECEIPT, + + /// \internal + NUMBER_OF_RELIABILITIES +}; + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketizedTCP.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketizedTCP.cpp new file mode 100644 index 0000000..b5f4fe5 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketizedTCP.cpp @@ -0,0 +1,408 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1 + +#include "PacketizedTCP.h" +#include "NativeTypes.h" +#include "BitStream.h" +#include "MessageIdentifiers.h" +#include "RakAlloca.h" + +using namespace RakNet; + +typedef uint32_t PTCPHeader; + +STATIC_FACTORY_DEFINITIONS(PacketizedTCP,PacketizedTCP); + +PacketizedTCP::PacketizedTCP() +{ + +} +PacketizedTCP::~PacketizedTCP() +{ + ClearAllConnections(); +} + +bool PacketizedTCP::Start(unsigned short port, unsigned short maxIncomingConnections, int threadPriority, unsigned short socketFamily) +{ + bool success = TCPInterface::Start(port, maxIncomingConnections,0,threadPriority, socketFamily); + if (success) + { + unsigned int i; + for (i=0; i < messageHandlerList.Size(); i++) + messageHandlerList[i]->OnRakPeerStartup(); + } + return success; +} + +void PacketizedTCP::Stop(void) +{ + unsigned int i; + for (i=0; i < messageHandlerList.Size(); i++) + messageHandlerList[i]->OnRakPeerShutdown(); + for (i=0; i < waitingPackets.Size(); i++) + DeallocatePacket(waitingPackets[i]); + TCPInterface::Stop(); + ClearAllConnections(); +} + +void PacketizedTCP::Send( const char *data, unsigned length, const SystemAddress &systemAddress, bool broadcast ) +{ + PTCPHeader dataLength; + dataLength=length; +#ifndef __BITSTREAM_NATIVE_END + if (RakNet::BitStream::DoEndianSwap()) + RakNet::BitStream::ReverseBytes((unsigned char*) &length,(unsigned char*) &dataLength,sizeof(dataLength)); +#else + dataLength=length; +#endif + + unsigned int lengthsArray[2]; + const char *dataArray[2]; + dataArray[0]=(char*) &dataLength; + dataArray[1]=data; + lengthsArray[0]=sizeof(dataLength); + lengthsArray[1]=length; + TCPInterface::SendList(dataArray,lengthsArray,2,systemAddress,broadcast); +} +bool PacketizedTCP::SendList( const char **data, const int *lengths, const int numParameters, const SystemAddress &systemAddress, bool broadcast ) +{ + if (isStarted==false) + return false; + if (data==0) + return false; + if (systemAddress==UNASSIGNED_SYSTEM_ADDRESS && broadcast==false) + return false; + PTCPHeader totalLengthOfUserData=0; + int i; + for (i=0; i < numParameters; i++) + { + if (lengths[i]>0) + totalLengthOfUserData+=lengths[i]; + } + if (totalLengthOfUserData==0) + return false; + + PTCPHeader dataLength; +#ifndef __BITSTREAM_NATIVE_END + if (RakNet::BitStream::DoEndianSwap()) + RakNet::BitStream::ReverseBytes((unsigned char*) &totalLengthOfUserData,(unsigned char*) &dataLength,sizeof(dataLength)); +#else + dataLength=totalLengthOfUserData; +#endif + + + unsigned int lengthsArray[512]; + const char *dataArray[512]; + dataArray[0]=(char*) &dataLength; + lengthsArray[0]=sizeof(dataLength); + for (int i=0; i < 512 && i < numParameters; i++) + { + dataArray[i+1]=data[i]; + lengthsArray[i+1]=lengths[i]; + } + return TCPInterface::SendList(dataArray,lengthsArray,numParameters+1,systemAddress,broadcast); +} +void PacketizedTCP::PushNotificationsToQueues(void) +{ + SystemAddress sa; + sa = TCPInterface::HasNewIncomingConnection(); + if (sa!=UNASSIGNED_SYSTEM_ADDRESS) + { + _newIncomingConnections.Push(sa, _FILE_AND_LINE_ ); + AddToConnectionList(sa); + unsigned int i; + for (i=0; i < messageHandlerList.Size(); i++) + messageHandlerList[i]->OnNewConnection(sa, UNASSIGNED_RAKNET_GUID, true); + } + + sa = TCPInterface::HasFailedConnectionAttempt(); + if (sa!=UNASSIGNED_SYSTEM_ADDRESS) + { + _failedConnectionAttempts.Push(sa, _FILE_AND_LINE_ ); + unsigned int i; + for (i=0; i < messageHandlerList.Size(); i++) + { + Packet p; + p.systemAddress=sa; + p.data=0; + p.length=0; + p.bitSize=0; + messageHandlerList[i]->OnFailedConnectionAttempt(&p, FCAR_CONNECTION_ATTEMPT_FAILED); + } + } + + sa = TCPInterface::HasLostConnection(); + if (sa!=UNASSIGNED_SYSTEM_ADDRESS) + { + _lostConnections.Push(sa, _FILE_AND_LINE_ ); + RemoveFromConnectionList(sa); + unsigned int i; + for (i=0; i < messageHandlerList.Size(); i++) + messageHandlerList[i]->OnClosedConnection(sa, UNASSIGNED_RAKNET_GUID, LCR_DISCONNECTION_NOTIFICATION); + } + + sa = TCPInterface::HasCompletedConnectionAttempt(); + if (sa!=UNASSIGNED_SYSTEM_ADDRESS) + { + _completedConnectionAttempts.Push(sa, _FILE_AND_LINE_ ); + AddToConnectionList(sa); + unsigned int i; + for (i=0; i < messageHandlerList.Size(); i++) + messageHandlerList[i]->OnNewConnection(sa, UNASSIGNED_RAKNET_GUID, true); + } +} +Packet* PacketizedTCP::Receive( void ) +{ + PushNotificationsToQueues(); + + unsigned int i; + for (i=0; i < messageHandlerList.Size(); i++) + messageHandlerList[i]->Update(); + + Packet *outgoingPacket=ReturnOutgoingPacket(); + if (outgoingPacket) + return outgoingPacket; + + Packet *incomingPacket; + incomingPacket = TCPInterface::Receive(); + unsigned int index; + + while (incomingPacket) + { + if (connections.Has(incomingPacket->systemAddress)) + index = connections.GetIndexAtKey(incomingPacket->systemAddress); + else + index=(unsigned int) -1; + if ((unsigned int)index==(unsigned int)-1) + { + DeallocatePacket(incomingPacket); + incomingPacket = TCPInterface::Receive(); + continue; + } + + + if (incomingPacket->deleteData==true) + { + // Came from network + SystemAddress systemAddressFromPacket; + if (index < connections.Size()) + { + DataStructures::ByteQueue *bq = connections[index]; + // Buffer data + bq->WriteBytes((const char*) incomingPacket->data,incomingPacket->length, _FILE_AND_LINE_); + systemAddressFromPacket=incomingPacket->systemAddress; + PTCPHeader dataLength; + + // Peek the header to see if a full message is waiting + bq->ReadBytes((char*) &dataLength,sizeof(PTCPHeader),true); + if (RakNet::BitStream::DoEndianSwap()) + RakNet::BitStream::ReverseBytesInPlace((unsigned char*) &dataLength,sizeof(dataLength)); + // Header indicates packet length. If enough data is available, read out and return one packet + if (bq->GetBytesWritten()>=dataLength+sizeof(PTCPHeader)) + { + do + { + bq->IncrementReadOffset(sizeof(PTCPHeader)); + outgoingPacket = RakNet::OP_NEW(_FILE_AND_LINE_); + outgoingPacket->length=dataLength; + outgoingPacket->bitSize=BYTES_TO_BITS(dataLength); + outgoingPacket->guid=UNASSIGNED_RAKNET_GUID; + outgoingPacket->systemAddress=systemAddressFromPacket; + outgoingPacket->deleteData=false; // Did not come from the network + outgoingPacket->data=(unsigned char*) rakMalloc_Ex(dataLength, _FILE_AND_LINE_); + if (outgoingPacket->data==0) + { + notifyOutOfMemory(_FILE_AND_LINE_); + RakNet::OP_DELETE(outgoingPacket,_FILE_AND_LINE_); + return 0; + } + bq->ReadBytes((char*) outgoingPacket->data,dataLength,false); + + waitingPackets.Push(outgoingPacket, _FILE_AND_LINE_ ); + + // Peek the header to see if a full message is waiting + if (bq->ReadBytes((char*) &dataLength,sizeof(PTCPHeader),true)) + { + if (RakNet::BitStream::DoEndianSwap()) + RakNet::BitStream::ReverseBytesInPlace((unsigned char*) &dataLength,sizeof(dataLength)); + } + else + break; + } while (bq->GetBytesWritten()>=dataLength+sizeof(PTCPHeader)); + } + else + { + + unsigned int oldWritten = bq->GetBytesWritten()-incomingPacket->length; + unsigned int newWritten = bq->GetBytesWritten(); + + // Return ID_DOWNLOAD_PROGRESS + if (newWritten/65536!=oldWritten/65536) + { + outgoingPacket = RakNet::OP_NEW(_FILE_AND_LINE_); + outgoingPacket->length=sizeof(MessageID) + + sizeof(unsigned int)*2 + + sizeof(unsigned int) + + 65536; + outgoingPacket->bitSize=BYTES_TO_BITS(incomingPacket->length); + outgoingPacket->guid=UNASSIGNED_RAKNET_GUID; + outgoingPacket->systemAddress=incomingPacket->systemAddress; + outgoingPacket->deleteData=false; + outgoingPacket->data=(unsigned char*) rakMalloc_Ex(outgoingPacket->length, _FILE_AND_LINE_); + if (outgoingPacket->data==0) + { + notifyOutOfMemory(_FILE_AND_LINE_); + RakNet::OP_DELETE(outgoingPacket,_FILE_AND_LINE_); + return 0; + } + + outgoingPacket->data[0]=(MessageID)ID_DOWNLOAD_PROGRESS; + unsigned int totalParts=dataLength/65536; + unsigned int partIndex=newWritten/65536; + unsigned int oneChunkSize=65536; + memcpy(outgoingPacket->data+sizeof(MessageID), &partIndex, sizeof(unsigned int)); + memcpy(outgoingPacket->data+sizeof(MessageID)+sizeof(unsigned int)*1, &totalParts, sizeof(unsigned int)); + memcpy(outgoingPacket->data+sizeof(MessageID)+sizeof(unsigned int)*2, &oneChunkSize, sizeof(unsigned int)); + bq->IncrementReadOffset(sizeof(PTCPHeader)); + bq->ReadBytes((char*) outgoingPacket->data+sizeof(MessageID)+sizeof(unsigned int)*3,oneChunkSize,true); + bq->DecrementReadOffset(sizeof(PTCPHeader)); + + waitingPackets.Push(outgoingPacket, _FILE_AND_LINE_ ); + } + } + + } + + DeallocatePacket(incomingPacket); + incomingPacket=0; + } + else + waitingPackets.Push(incomingPacket, _FILE_AND_LINE_ ); + + incomingPacket = TCPInterface::Receive(); + } + + return ReturnOutgoingPacket(); +} +Packet *PacketizedTCP::ReturnOutgoingPacket(void) +{ + Packet *outgoingPacket=0; + unsigned int i; + while (outgoingPacket==0 && waitingPackets.IsEmpty()==false) + { + outgoingPacket=waitingPackets.Pop(); + PluginReceiveResult pluginResult; + for (i=0; i < messageHandlerList.Size(); i++) + { + pluginResult=messageHandlerList[i]->OnReceive(outgoingPacket); + if (pluginResult==RR_STOP_PROCESSING_AND_DEALLOCATE) + { + DeallocatePacket( outgoingPacket ); + outgoingPacket=0; // Will do the loop again and get another packet + break; // break out of the enclosing for + } + else if (pluginResult==RR_STOP_PROCESSING) + { + outgoingPacket=0; + break; + } + } + } + + return outgoingPacket; +} + +void PacketizedTCP::AttachPlugin( PluginInterface2 *plugin ) +{ + if (messageHandlerList.GetIndexOf(plugin)==MAX_UNSIGNED_LONG) + { + messageHandlerList.Insert(plugin, _FILE_AND_LINE_); + plugin->SetPacketizedTCP(this); + plugin->OnAttach(); + } +} +void PacketizedTCP::DetachPlugin( PluginInterface2 *plugin ) +{ + if (plugin==0) + return; + + unsigned int index; + index = messageHandlerList.GetIndexOf(plugin); + if (index!=MAX_UNSIGNED_LONG) + { + messageHandlerList[index]->OnDetach(); + // Unordered list so delete from end for speed + messageHandlerList[index]=messageHandlerList[messageHandlerList.Size()-1]; + messageHandlerList.RemoveFromEnd(); + plugin->SetPacketizedTCP(0); + } +} +void PacketizedTCP::CloseConnection( SystemAddress systemAddress ) +{ + RemoveFromConnectionList(systemAddress); + unsigned int i; + for (i=0; i < messageHandlerList.Size(); i++) + messageHandlerList[i]->OnClosedConnection(systemAddress, UNASSIGNED_RAKNET_GUID, LCR_CLOSED_BY_USER); + TCPInterface::CloseConnection(systemAddress); +} +void PacketizedTCP::RemoveFromConnectionList(const SystemAddress &sa) +{ + if (sa==UNASSIGNED_SYSTEM_ADDRESS) + return; + if (connections.Has(sa)) + { + unsigned int index = connections.GetIndexAtKey(sa); + if (index!=(unsigned int)-1) + { + RakNet::OP_DELETE(connections[index],_FILE_AND_LINE_); + connections.RemoveAtIndex(index); + } + } +} +void PacketizedTCP::AddToConnectionList(const SystemAddress &sa) +{ + if (sa==UNASSIGNED_SYSTEM_ADDRESS) + return; + connections.SetNew(sa, RakNet::OP_NEW(_FILE_AND_LINE_)); +} +void PacketizedTCP::ClearAllConnections(void) +{ + unsigned int i; + for (i=0; i < connections.Size(); i++) + RakNet::OP_DELETE(connections[i],_FILE_AND_LINE_); + connections.Clear(); +} +SystemAddress PacketizedTCP::HasCompletedConnectionAttempt(void) +{ + PushNotificationsToQueues(); + + if (_completedConnectionAttempts.IsEmpty()==false) + return _completedConnectionAttempts.Pop(); + return UNASSIGNED_SYSTEM_ADDRESS; +} +SystemAddress PacketizedTCP::HasFailedConnectionAttempt(void) +{ + PushNotificationsToQueues(); + + if (_failedConnectionAttempts.IsEmpty()==false) + return _failedConnectionAttempts.Pop(); + return UNASSIGNED_SYSTEM_ADDRESS; +} +SystemAddress PacketizedTCP::HasNewIncomingConnection(void) +{ + PushNotificationsToQueues(); + + if (_newIncomingConnections.IsEmpty()==false) + return _newIncomingConnections.Pop(); + return UNASSIGNED_SYSTEM_ADDRESS; +} +SystemAddress PacketizedTCP::HasLostConnection(void) +{ + PushNotificationsToQueues(); + + if (_lostConnections.IsEmpty()==false) + return _lostConnections.Pop(); + return UNASSIGNED_SYSTEM_ADDRESS; +} + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketizedTCP.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketizedTCP.h new file mode 100644 index 0000000..986fc11 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PacketizedTCP.h @@ -0,0 +1,93 @@ +/// \file +/// \brief A simple TCP based server allowing sends and receives. Can be connected by any TCP client, including telnet. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1 + +#ifndef __PACKETIZED_TCP +#define __PACKETIZED_TCP + +#include "TCPInterface.h" +#include "DS_ByteQueue.h" +#include "PluginInterface2.h" +#include "DS_Map.h" + +namespace RakNet +{ + +class RAK_DLL_EXPORT PacketizedTCP : public TCPInterface +{ +public: + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(PacketizedTCP) + + PacketizedTCP(); + virtual ~PacketizedTCP(); + + /// Starts the TCP server on the indicated port + /// \param[in] port Which port to listen on. + /// \param[in] maxIncomingConnections Max incoming connections we will accept + /// \param[in] maxConnections Max total connections, which should be >= maxIncomingConnections + /// \param[in] threadPriority Passed to the thread creation routine. Use THREAD_PRIORITY_NORMAL for Windows. For Linux based systems, you MUST pass something reasonable based on the thread priorities for your application. + /// \param[in] socketFamily IP version: For IPV4, use AF_INET (default). For IPV6, use AF_INET6. To autoselect, use AF_UNSPEC. + bool Start(unsigned short port, unsigned short maxIncomingConnections, int threadPriority=-99999, unsigned short socketFamily=AF_INET); + + /// Stops the TCP server + void Stop(void); + + /// Sends a byte stream + void Send( const char *data, unsigned length, const SystemAddress &systemAddress, bool broadcast ); + + // Sends a concatenated list of byte streams + bool SendList( const char **data, const int *lengths, const int numParameters, const SystemAddress &systemAddress, bool broadcast ); + + /// Returns data received + Packet* Receive( void ); + + /// Disconnects a player/address + void CloseConnection( SystemAddress systemAddress ); + + /// Has a previous call to connect succeeded? + /// \return UNASSIGNED_SYSTEM_ADDRESS = no. Anything else means yes. + SystemAddress HasCompletedConnectionAttempt(void); + + /// Has a previous call to connect failed? + /// \return UNASSIGNED_SYSTEM_ADDRESS = no. Anything else means yes. + SystemAddress HasFailedConnectionAttempt(void); + + /// Queued events of new incoming connections + SystemAddress HasNewIncomingConnection(void); + + /// Queued events of lost connections + SystemAddress HasLostConnection(void); + + // Only currently tested with FileListTransfer! + void AttachPlugin( PluginInterface2 *plugin ); + void DetachPlugin( PluginInterface2 *plugin ); + +protected: + void ClearAllConnections(void); + void RemoveFromConnectionList(const SystemAddress &sa); + void AddToConnectionList(const SystemAddress &sa); + void PushNotificationsToQueues(void); + Packet *ReturnOutgoingPacket(void); + + // Plugins + DataStructures::List messageHandlerList; + // A single TCP recieve may generate multiple split packets. They are stored in the waitingPackets list until Receive is called + DataStructures::Queue waitingPackets; + DataStructures::Map connections; + + // Mirrors single producer / consumer, but processes them in Receive() before returning to user + DataStructures::Queue _newIncomingConnections, _lostConnections, _failedConnectionAttempts, _completedConnectionAttempts; +}; + +} // namespace RakNet + +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PluginInterface2.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PluginInterface2.cpp new file mode 100644 index 0000000..10d9bd7 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PluginInterface2.cpp @@ -0,0 +1,89 @@ +/// \file +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#include "PluginInterface2.h" +#include "PacketizedTCP.h" +#include "RakPeerInterface.h" +#include "BitStream.h" + +using namespace RakNet; + +PluginInterface2::PluginInterface2() +{ + rakPeerInterface=0; +#if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1 + packetizedTCP=0; +#endif +} +PluginInterface2::~PluginInterface2() +{ + +} +void PluginInterface2::SendUnified( const RakNet::BitStream * bitStream, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast ) +{ + if (rakPeerInterface) + rakPeerInterface->Send(bitStream,priority,reliability,orderingChannel,systemIdentifier,broadcast); +#if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1 + else + packetizedTCP->Send((const char*) bitStream->GetData(), bitStream->GetNumberOfBytesUsed(), systemIdentifier.systemAddress, broadcast); +#endif +} +Packet *PluginInterface2::AllocatePacketUnified(unsigned dataSize) +{ + if (rakPeerInterface) + return rakPeerInterface->AllocatePacket(dataSize); +#if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1 + else + return packetizedTCP->AllocatePacket(dataSize); +#else + return 0; +#endif + +} +void PluginInterface2::PushBackPacketUnified(Packet *packet, bool pushAtHead) +{ + if (rakPeerInterface) + rakPeerInterface->PushBackPacket(packet,pushAtHead); +#if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1 + else + packetizedTCP->PushBackPacket(packet,pushAtHead); +#endif +} +void PluginInterface2::DeallocPacketUnified(Packet *packet) +{ + if (rakPeerInterface) + rakPeerInterface->DeallocatePacket(packet); +#if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1 + else + packetizedTCP->DeallocatePacket(packet); +#endif +} +bool PluginInterface2::SendListUnified( const char **data, const int *lengths, const int numParameters, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast ) +{ + if (rakPeerInterface) + { + return rakPeerInterface->SendList(data,lengths,numParameters,priority,reliability,orderingChannel,systemIdentifier,broadcast)!=0; + } +#if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1 + else + { + return packetizedTCP->SendList(data,lengths,numParameters,systemIdentifier.systemAddress,broadcast ); + } +#else + return false; +#endif +} +void PluginInterface2::SetRakPeerInterface( RakPeerInterface *ptr ) +{ + rakPeerInterface=ptr; +} +#if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1 +void PluginInterface2::SetPacketizedTCP( PacketizedTCP *ptr ) +{ + packetizedTCP=ptr; +} +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PluginInterface2.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PluginInterface2.h new file mode 100644 index 0000000..48f8284 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/PluginInterface2.h @@ -0,0 +1,200 @@ +/// \file +/// \brief \b RakNet's plugin functionality system, version 2. You can derive from this to create your own plugins. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __PLUGIN_INTERFACE_2_H +#define __PLUGIN_INTERFACE_2_H + +#include "NativeFeatureIncludes.h" +#include "RakNetTypes.h" +#include "Export.h" +#include "PacketPriority.h" + +namespace RakNet { + +/// Forward declarations +class RakPeerInterface; +class PacketizedTCP; +struct Packet; +struct InternalPacket; + +/// \defgroup PLUGIN_INTERFACE_GROUP PluginInterface2 + +/// \defgroup PLUGINS_GROUP Plugins +/// \ingroup PLUGIN_INTERFACE_GROUP + +/// For each message that arrives on an instance of RakPeer, the plugins get an opportunity to process them first. This enumeration represents what to do with the message +/// \ingroup PLUGIN_INTERFACE_GROUP +enum PluginReceiveResult +{ + /// The plugin used this message and it shouldn't be given to the user. + RR_STOP_PROCESSING_AND_DEALLOCATE=0, + + /// This message will be processed by other plugins, and at last by the user. + RR_CONTINUE_PROCESSING, + + /// The plugin is going to hold on to this message. Do not deallocate it but do not pass it to other plugins either. + RR_STOP_PROCESSING, +}; + +/// Reasons why a connection was lost +/// \ingroup PLUGIN_INTERFACE_GROUP +enum PI2_LostConnectionReason +{ + /// Called RakPeer::CloseConnection() + LCR_CLOSED_BY_USER, + + /// Got ID_DISCONNECTION_NOTIFICATION + LCR_DISCONNECTION_NOTIFICATION, + + /// GOT ID_CONNECTION_LOST + LCR_CONNECTION_LOST +}; + +/// Returns why a connection attempt failed +/// \ingroup PLUGIN_INTERFACE_GROUP +enum PI2_FailedConnectionAttemptReason +{ + FCAR_CONNECTION_ATTEMPT_FAILED, + FCAR_ALREADY_CONNECTED, + FCAR_NO_FREE_INCOMING_CONNECTIONS, + FCAR_SECURITY_PUBLIC_KEY_MISMATCH, + FCAR_CONNECTION_BANNED, + FCAR_INVALID_PASSWORD, + FCAR_INCOMPATIBLE_PROTOCOL, + FCAR_IP_RECENTLY_CONNECTED, + FCAR_REMOTE_SYSTEM_REQUIRES_PUBLIC_KEY, + FCAR_OUR_SYSTEM_REQUIRES_SECURITY, + FCAR_PUBLIC_KEY_MISMATCH, +}; + +/// RakNet's plugin system. Each plugin processes the following events: +/// -Connection attempts +/// -The result of connection attempts +/// -Each incoming message +/// -Updates over time, when RakPeer::Receive() is called +/// +/// \ingroup PLUGIN_INTERFACE_GROUP +class RAK_DLL_EXPORT PluginInterface2 +{ +public: + PluginInterface2(); + virtual ~PluginInterface2(); + + /// Called when the interface is attached + virtual void OnAttach(void) {} + + /// Called when the interface is detached + virtual void OnDetach(void) {} + + /// Update is called every time a packet is checked for . + virtual void Update(void) {} + + /// OnReceive is called for every packet. + /// \param[in] packet the packet that is being returned to the user + /// \return True to allow the game and other plugins to get this message, false to absorb it + virtual PluginReceiveResult OnReceive(Packet *packet) {(void) packet; return RR_CONTINUE_PROCESSING;} + + /// Called when RakPeer is initialized + virtual void OnRakPeerStartup(void) {} + + /// Called when RakPeer is shutdown + virtual void OnRakPeerShutdown(void) {} + + /// Called when a connection is dropped because the user called RakPeer::CloseConnection() for a particular system + /// \param[in] systemAddress The system whose connection was closed + /// \param[in] rakNetGuid The guid of the specified system + /// \param[in] lostConnectionReason How the connection was closed: manually, connection lost, or notification of disconnection + virtual void OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ){(void) systemAddress; (void) rakNetGUID; (void) lostConnectionReason;} + + /// Called when we got a new connection + /// \param[in] systemAddress Address of the new connection + /// \param[in] rakNetGuid The guid of the specified system + /// \param[in] isIncoming If true, this is ID_NEW_INCOMING_CONNECTION, or the equivalent + virtual void OnNewConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, bool isIncoming) {(void) systemAddress; (void) rakNetGUID; (void) isIncoming;} + + /// Called when a connection attempt fails + /// \param[in] packet Packet to be returned to the user + /// \param[in] failedConnectionReason Why the connection failed + virtual void OnFailedConnectionAttempt(Packet *packet, PI2_FailedConnectionAttemptReason failedConnectionAttemptReason) {(void) packet; (void) failedConnectionAttemptReason;} + + /// Queried when attached to RakPeer + /// Return true to call OnDirectSocketSend(), OnDirectSocketReceive(), OnReliabilityLayerPacketError(), OnInternalPacket(), and OnAck() + /// If true, then you cannot call RakPeer::AttachPlugin() or RakPeer::DetachPlugin() for this plugin, while RakPeer is active + virtual bool UsesReliabilityLayer(void) const {return false;} + + /// Called on a send to the socket, per datagram, that does not go through the reliability layer + /// \pre To be called, UsesReliabilityLayer() must return true + /// \param[in] data The data being sent + /// \param[in] bitsUsed How many bits long \a data is + /// \param[in] remoteSystemAddress Which system this message is being sent to + virtual void OnDirectSocketSend(const char *data, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress) {(void) data; (void) bitsUsed; (void) remoteSystemAddress;} + + /// Called on a receive from the socket, per datagram, that does not go through the reliability layer + /// \pre To be called, UsesReliabilityLayer() must return true + /// \param[in] data The data being sent + /// \param[in] bitsUsed How many bits long \a data is + /// \param[in] remoteSystemAddress Which system this message is being sent to + virtual void OnDirectSocketReceive(const char *data, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress) {(void) data; (void) bitsUsed; (void) remoteSystemAddress;} + + /// Called when the reliability layer rejects a send or receive + /// \pre To be called, UsesReliabilityLayer() must return true + /// \param[in] bitsUsed How many bits long \a data is + /// \param[in] remoteSystemAddress Which system this message is being sent to + virtual void OnReliabilityLayerPacketError(const char *errorMessage, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress) {(void) errorMessage; (void) bitsUsed; (void) remoteSystemAddress;} + + /// Called on a send or receive of a message within the reliability layer + /// \pre To be called, UsesReliabilityLayer() must return true + /// \param[in] internalPacket The user message, along with all send data. + /// \param[in] frameNumber The number of frames sent or received so far for this player depending on \a isSend . Indicates the frame of this user message. + /// \param[in] remoteSystemAddress The player we sent or got this packet from + /// \param[in] time The current time as returned by RakNet::GetTimeMS() + /// \param[in] isSend Is this callback representing a send event or receive event? + virtual void OnInternalPacket(InternalPacket *internalPacket, unsigned frameNumber, SystemAddress remoteSystemAddress, RakNet::TimeMS time, int isSend) {(void) internalPacket; (void) frameNumber; (void) remoteSystemAddress; (void) time; (void) isSend;} + + /// Called when we get an ack for a message we reliably sent + /// \pre To be called, UsesReliabilityLayer() must return true + /// \param[in] messageNumber The numerical identifier for which message this is + /// \param[in] remoteSystemAddress The player we sent or got this packet from + /// \param[in] time The current time as returned by RakNet::GetTimeMS() + virtual void OnAck(unsigned int messageNumber, SystemAddress remoteSystemAddress, RakNet::TimeMS time) {(void) messageNumber; (void) remoteSystemAddress; (void) time;} + + /// System called RakPeerInterface::PushBackPacket + /// \param[in] data The data being sent + /// \param[in] bitsUsed How many bits long \a data is + /// \param[in] remoteSystemAddress The player we sent or got this packet from + virtual void OnPushBackPacket(const char *data, const BitSize_t bitsUsed, SystemAddress remoteSystemAddress) {(void) data; (void) bitsUsed; (void) remoteSystemAddress;} + + RakPeerInterface *GetRakPeerInterface(void) const {return rakPeerInterface;} + + /// \internal + void SetRakPeerInterface( RakPeerInterface *ptr ); + +#if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1 + /// \internal + void SetPacketizedTCP( PacketizedTCP *ptr ); +#endif +protected: + // Send through either rakPeerInterface or packetizedTCP, whichever is available + void SendUnified( const RakNet::BitStream * bitStream, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast ); + bool SendListUnified( const char **data, const int *lengths, const int numParameters, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast ); + + Packet *AllocatePacketUnified(unsigned dataSize); + void PushBackPacketUnified(Packet *packet, bool pushAtHead); + void DeallocPacketUnified(Packet *packet); + + // Filled automatically in when attached + RakPeerInterface *rakPeerInterface; +#if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1 + PacketizedTCP *packetizedTCP; +#endif +}; + +} // namespace RakNet + +#endif + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RPC4Plugin.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RPC4Plugin.cpp new file mode 100644 index 0000000..64303ba --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RPC4Plugin.cpp @@ -0,0 +1,594 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_RPC4Plugin==1 + +#include "RPC4Plugin.h" +#include "MessageIdentifiers.h" +#include "RakPeerInterface.h" +#include "PacketizedTCP.h" +#include "RakSleep.h" +#include "RakNetDefines.h" +#include "DS_Queue.h" + +using namespace RakNet; + +STATIC_FACTORY_DEFINITIONS(RPC4,RPC4); + +struct GlobalRegistration +{ + void ( *registerFunctionPointer ) ( RakNet::BitStream *userData, Packet *packet ); + void ( *registerBlockingFunctionPointer ) ( RakNet::BitStream *userData, RakNet::BitStream *returnData, Packet *packet ); + char functionName[RPC4_GLOBAL_REGISTRATION_MAX_FUNCTION_NAME_LENGTH]; + MessageID messageId; + int callPriority; +}; +static GlobalRegistration globalRegistrationBuffer[RPC4_GLOBAL_REGISTRATION_MAX_FUNCTIONS]; +static unsigned int globalRegistrationIndex=0; + +RPC4GlobalRegistration::RPC4GlobalRegistration(const char* uniqueID, void ( *functionPointer ) ( RakNet::BitStream *userData, Packet *packet )) +{ + RakAssert(globalRegistrationIndex!=RPC4_GLOBAL_REGISTRATION_MAX_FUNCTIONS); + unsigned int i; + for (i=0; uniqueID[i]; i++) + { + RakAssert(i<=RPC4_GLOBAL_REGISTRATION_MAX_FUNCTION_NAME_LENGTH-1); + globalRegistrationBuffer[globalRegistrationIndex].functionName[i]=uniqueID[i]; + } + globalRegistrationBuffer[globalRegistrationIndex].registerFunctionPointer=functionPointer; + globalRegistrationBuffer[globalRegistrationIndex].registerBlockingFunctionPointer=0; + globalRegistrationBuffer[globalRegistrationIndex].callPriority=0xFFFFFFFF; + globalRegistrationIndex++; +} +RPC4GlobalRegistration::RPC4GlobalRegistration(const char* uniqueID, void ( *functionPointer ) ( RakNet::BitStream *userData, Packet *packet ), int callPriority) +{ + RakAssert(globalRegistrationIndex!=RPC4_GLOBAL_REGISTRATION_MAX_FUNCTIONS); + unsigned int i; + for (i=0; uniqueID[i]; i++) + { + RakAssert(i<=RPC4_GLOBAL_REGISTRATION_MAX_FUNCTION_NAME_LENGTH-1); + globalRegistrationBuffer[globalRegistrationIndex].functionName[i]=uniqueID[i]; + } + globalRegistrationBuffer[globalRegistrationIndex].registerFunctionPointer=functionPointer; + globalRegistrationBuffer[globalRegistrationIndex].registerBlockingFunctionPointer=0; + RakAssert(callPriority!=0xFFFFFFFF); + globalRegistrationBuffer[globalRegistrationIndex].callPriority=callPriority; + globalRegistrationIndex++; +} +RPC4GlobalRegistration::RPC4GlobalRegistration(const char* uniqueID, void ( *functionPointer ) ( RakNet::BitStream *userData, RakNet::BitStream *returnData, Packet *packet )) +{ + RakAssert(globalRegistrationIndex!=RPC4_GLOBAL_REGISTRATION_MAX_FUNCTIONS); + unsigned int i; + for (i=0; uniqueID[i]; i++) + { + RakAssert(i<=RPC4_GLOBAL_REGISTRATION_MAX_FUNCTION_NAME_LENGTH-1); + globalRegistrationBuffer[globalRegistrationIndex].functionName[i]=uniqueID[i]; + } + globalRegistrationBuffer[globalRegistrationIndex].registerFunctionPointer=0; + globalRegistrationBuffer[globalRegistrationIndex].registerBlockingFunctionPointer=functionPointer; + globalRegistrationIndex++; +} +RPC4GlobalRegistration::RPC4GlobalRegistration(const char* uniqueID, MessageID messageId) +{ + RakAssert(globalRegistrationIndex!=RPC4_GLOBAL_REGISTRATION_MAX_FUNCTIONS); + unsigned int i; + for (i=0; uniqueID[i]; i++) + { + RakAssert(i<=RPC4_GLOBAL_REGISTRATION_MAX_FUNCTION_NAME_LENGTH-1); + globalRegistrationBuffer[globalRegistrationIndex].functionName[i]=uniqueID[i]; + } + globalRegistrationBuffer[globalRegistrationIndex].registerFunctionPointer=0; + globalRegistrationBuffer[globalRegistrationIndex].registerBlockingFunctionPointer=0; + globalRegistrationBuffer[globalRegistrationIndex].messageId=messageId; + globalRegistrationIndex++; +} + +enum RPC4Identifiers +{ + ID_RPC4_CALL, + ID_RPC4_RETURN, + ID_RPC4_SIGNAL, +}; +int RPC4::LocalSlotObjectComp( const LocalSlotObject &key, const LocalSlotObject &data ) +{ + if (key.callPriority>data.callPriority) + return -1; + if (key.callPriority==data.callPriority) + { + if (key.registrationCountmessageId) + return -1; + if (key > data->messageId) + return 1; + return 0; +} + +RPC4::RPC4() +{ + gotBlockingReturnValue=false; + nextSlotRegistrationCount=0; + interruptSignal=false; +} +RPC4::~RPC4() +{ + unsigned int i; + for (i=0; i < localCallbacks.Size(); i++) + { + RakNet::OP_DELETE(localCallbacks[i],_FILE_AND_LINE_); + } + + DataStructures::List keyList; + DataStructures::List outputList; + localSlots.GetAsList(outputList,keyList,_FILE_AND_LINE_); + unsigned int j; + for (j=0; j < outputList.Size(); j++) + { + RakNet::OP_DELETE(outputList[j],_FILE_AND_LINE_); + } + localSlots.Clear(_FILE_AND_LINE_); +} +bool RPC4::RegisterFunction(const char* uniqueID, void ( *functionPointer ) ( RakNet::BitStream *userData, Packet *packet )) +{ + DataStructures::HashIndex skhi = registeredNonblockingFunctions.GetIndexOf(uniqueID); + if (skhi.IsInvalid()==false) + return false; + + registeredNonblockingFunctions.Push(uniqueID,functionPointer,_FILE_AND_LINE_); + return true; +} +void RPC4::RegisterSlot(const char *sharedIdentifier, void ( *functionPointer ) ( RakNet::BitStream *userData, Packet *packet ), int callPriority) +{ + LocalSlotObject lso(nextSlotRegistrationCount++, callPriority, functionPointer); + DataStructures::HashIndex idx = GetLocalSlotIndex(sharedIdentifier); + LocalSlot *localSlot; + if (idx.IsInvalid()) + { + localSlot = RakNet::OP_NEW(_FILE_AND_LINE_); + localSlots.Push(sharedIdentifier, localSlot,_FILE_AND_LINE_); + } + else + { + localSlot=localSlots.ItemAtIndex(idx); + } + localSlot->slotObjects.Insert(lso,lso,true,_FILE_AND_LINE_); +} +bool RPC4::RegisterBlockingFunction(const char* uniqueID, void ( *functionPointer ) ( RakNet::BitStream *userData, RakNet::BitStream *returnData, Packet *packet )) +{ + DataStructures::HashIndex skhi = registeredBlockingFunctions.GetIndexOf(uniqueID); + if (skhi.IsInvalid()==false) + return false; + + registeredBlockingFunctions.Push(uniqueID,functionPointer,_FILE_AND_LINE_); + return true; +} +void RPC4::RegisterLocalCallback(const char* uniqueID, MessageID messageId) +{ + bool objectExists; + unsigned int index; + LocalCallback *lc; + RakNet::RakString str; + str=uniqueID; + index = localCallbacks.GetIndexFromKey(messageId,&objectExists); + if (objectExists) + { + lc = localCallbacks[index]; + index = lc->functions.GetIndexFromKey(str,&objectExists); + if (objectExists==false) + lc->functions.InsertAtIndex(str,index,_FILE_AND_LINE_); + } + else + { + lc = RakNet::OP_NEW(_FILE_AND_LINE_); + lc->messageId=messageId; + lc->functions.Insert(str,str,false,_FILE_AND_LINE_); + localCallbacks.InsertAtIndex(lc,index,_FILE_AND_LINE_); + } +} +bool RPC4::UnregisterFunction(const char* uniqueID) +{ + void ( *f ) ( RakNet::BitStream *, Packet * ); + return registeredNonblockingFunctions.Pop(f,uniqueID,_FILE_AND_LINE_); +} +bool RPC4::UnregisterBlockingFunction(const char* uniqueID) +{ + void ( *f ) ( RakNet::BitStream *, RakNet::BitStream *,Packet * ); + return registeredBlockingFunctions.Pop(f,uniqueID,_FILE_AND_LINE_); +} +bool RPC4::UnregisterLocalCallback(const char* uniqueID, MessageID messageId) +{ + bool objectExists; + unsigned int index, index2; + LocalCallback *lc; + RakNet::RakString str; + str=uniqueID; + index = localCallbacks.GetIndexFromKey(messageId,&objectExists); + if (objectExists) + { + lc = localCallbacks[index]; + index2 = lc->functions.GetIndexFromKey(str,&objectExists); + if (objectExists) + { + lc->functions.RemoveAtIndex(index2); + if (lc->functions.Size()==0) + { + RakNet::OP_DELETE(lc,_FILE_AND_LINE_); + localCallbacks.RemoveAtIndex(index); + return true; + } + } + } + return false; +} +bool RPC4::UnregisterSlot(const char* sharedIdentifier) +{ + DataStructures::HashIndex hi = localSlots.GetIndexOf(sharedIdentifier); + if (hi.IsInvalid()==false) + { + LocalSlot *ls = localSlots.ItemAtIndex(hi); + RakNet::OP_DELETE(ls, _FILE_AND_LINE_); + localSlots.RemoveAtIndex(hi, _FILE_AND_LINE_); + return true; + } + + return false; +} +void RPC4::CallLoopback( const char* uniqueID, RakNet::BitStream * bitStream ) +{ + Packet *p=0; + + DataStructures::HashIndex skhi = registeredNonblockingFunctions.GetIndexOf(uniqueID); + + if (skhi.IsInvalid()==true) + { + if (rakPeerInterface) + p=AllocatePacketUnified(sizeof(MessageID)+sizeof(unsigned char)+(unsigned int) strlen(uniqueID)+1); +#if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1 + else + p=packetizedTCP->AllocatePacket(sizeof(MessageID)+sizeof(unsigned char)+(unsigned int) strlen(uniqueID)+1); +#endif + + if (rakPeerInterface) + p->guid=rakPeerInterface->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS); +#if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1 + else + p->guid=UNASSIGNED_RAKNET_GUID; +#endif + + p->systemAddress=UNASSIGNED_SYSTEM_ADDRESS; + p->systemAddress.systemIndex=(SystemIndex)-1; + p->data[0]=ID_RPC_REMOTE_ERROR; + p->data[1]=RPC_ERROR_FUNCTION_NOT_REGISTERED; + strcpy((char*) p->data+2, uniqueID); + + PushBackPacketUnified(p,false); + + return; + } + + RakNet::BitStream out; + out.Write((MessageID) ID_RPC_PLUGIN); + out.Write((MessageID) ID_RPC4_CALL); + out.WriteCompressed(uniqueID); + out.Write(false); // nonblocking + if (bitStream) + { + bitStream->ResetReadPointer(); + out.AlignWriteToByteBoundary(); + out.Write(bitStream); + } + if (rakPeerInterface) + p=AllocatePacketUnified(out.GetNumberOfBytesUsed()); +#if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1 + else + p=packetizedTCP->AllocatePacket(out.GetNumberOfBytesUsed()); +#endif + + if (rakPeerInterface) + p->guid=rakPeerInterface->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS); +#if _RAKNET_SUPPORT_PacketizedTCP==1 && _RAKNET_SUPPORT_TCPInterface==1 + else + p->guid=UNASSIGNED_RAKNET_GUID; +#endif + p->systemAddress=UNASSIGNED_SYSTEM_ADDRESS; + p->systemAddress.systemIndex=(SystemIndex)-1; + memcpy(p->data,out.GetData(),out.GetNumberOfBytesUsed()); + PushBackPacketUnified(p,false); + return; +} +void RPC4::Call( const char* uniqueID, RakNet::BitStream * bitStream, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast ) +{ + RakNet::BitStream out; + out.Write((MessageID) ID_RPC_PLUGIN); + out.Write((MessageID) ID_RPC4_CALL); + out.WriteCompressed(uniqueID); + out.Write(false); // Nonblocking + if (bitStream) + { + bitStream->ResetReadPointer(); + out.AlignWriteToByteBoundary(); + out.Write(bitStream); + } + SendUnified(&out,priority,reliability,orderingChannel,systemIdentifier,broadcast); +} +bool RPC4::CallBlocking( const char* uniqueID, RakNet::BitStream * bitStream, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, RakNet::BitStream *returnData ) +{ + RakNet::BitStream out; + out.Write((MessageID) ID_RPC_PLUGIN); + out.Write((MessageID) ID_RPC4_CALL); + out.WriteCompressed(uniqueID); + out.Write(true); // Blocking + if (bitStream) + { + bitStream->ResetReadPointer(); + out.AlignWriteToByteBoundary(); + out.Write(bitStream); + } + RakAssert(returnData); + RakAssert(rakPeerInterface); + ConnectionState cs; + cs = rakPeerInterface->GetConnectionState(systemIdentifier); + if (cs!=IS_CONNECTED) + return false; + + SendUnified(&out,priority,reliability,orderingChannel,systemIdentifier,false); + + returnData->Reset(); + blockingReturnValue.Reset(); + gotBlockingReturnValue=false; + Packet *packet; + DataStructures::Queue packetQueue; + while (gotBlockingReturnValue==false) + { + // TODO - block, filter until gotBlockingReturnValue==true or ID_CONNECTION_LOST or ID_DISCONNECTION_NOTIFICXATION or ID_RPC_REMOTE_ERROR/RPC_ERROR_FUNCTION_NOT_REGISTERED + RakSleep(30); + + packet=rakPeerInterface->Receive(); + + if (packet) + { + if ( + (packet->data[0]==ID_CONNECTION_LOST || packet->data[0]==ID_DISCONNECTION_NOTIFICATION) && + ((systemIdentifier.rakNetGuid!=UNASSIGNED_RAKNET_GUID && packet->guid==systemIdentifier.rakNetGuid) || + (systemIdentifier.systemAddress!=UNASSIGNED_SYSTEM_ADDRESS && packet->systemAddress==systemIdentifier.systemAddress)) + ) + { + // Push back to head in reverse order + rakPeerInterface->PushBackPacket(packet,true); + while (packetQueue.Size()) + rakPeerInterface->PushBackPacket(packetQueue.Pop(),true); + return false; + } + else if (packet->data[0]==ID_RPC_REMOTE_ERROR && packet->data[1]==RPC_ERROR_FUNCTION_NOT_REGISTERED) + { + RakNet::RakString functionName; + RakNet::BitStream bsIn(packet->data,packet->length,false); + bsIn.IgnoreBytes(2); + bsIn.Read(functionName); + if (functionName==uniqueID) + { + // Push back to head in reverse order + rakPeerInterface->PushBackPacket(packet,true); + while (packetQueue.Size()) + rakPeerInterface->PushBackPacket(packetQueue.Pop(),true); + return false; + } + else + { + packetQueue.PushAtHead(packet,0,_FILE_AND_LINE_); + } + } + else + { + packetQueue.PushAtHead(packet,0,_FILE_AND_LINE_); + } + } + } + + returnData->Read(blockingReturnValue); + return true; +} +void RPC4::Signal(const char *sharedIdentifier, RakNet::BitStream *bitStream, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast, bool invokeLocal) +{ + RakNet::BitStream out; + out.Write((MessageID) ID_RPC_PLUGIN); + out.Write((MessageID) ID_RPC4_SIGNAL); + out.WriteCompressed(sharedIdentifier); + if (bitStream) + { + bitStream->ResetReadPointer(); + out.AlignWriteToByteBoundary(); + out.Write(bitStream); + } + SendUnified(&out,priority,reliability,orderingChannel,systemIdentifier,broadcast); + + if (invokeLocal) + { + DataStructures::HashIndex functionIndex; + functionIndex = localSlots.GetIndexOf(sharedIdentifier); + if (functionIndex.IsInvalid()) + return; + + Packet p; + p.guid=rakPeerInterface->GetMyGUID(); + p.systemAddress=rakPeerInterface->GetMyBoundAddress(0); + p.wasGeneratedLocally=true; + RakNet::BitStream *bsptr, bstemp; + if (bitStream) + { + bitStream->ResetReadPointer(); + p.length=bitStream->GetNumberOfBytesUsed(); + p.bitSize=bitStream->GetNumberOfBitsUsed(); + bsptr=bitStream; + } + else + { + p.length=0; + p.bitSize=0; + bsptr=&bstemp; + } + InvokeSignal(functionIndex, bsptr, &p); + } +} +void RPC4::InvokeSignal(DataStructures::HashIndex functionIndex, RakNet::BitStream *serializedParameters, Packet *packet) +{ + if (functionIndex.IsInvalid()) + return; + + interruptSignal=false; + LocalSlot *localSlot = localSlots.ItemAtIndex(functionIndex); + unsigned int i; + i=0; + while (i < localSlot->slotObjects.Size()) + { + localSlot->slotObjects[i].functionPointer(serializedParameters, packet); + + // Not threadsafe + if (interruptSignal==true) + break; + + serializedParameters->ResetReadPointer(); + + i++; + } +} +void RPC4::InterruptSignal(void) +{ + interruptSignal=true; +} +void RPC4::OnAttach(void) +{ + unsigned int i; + for (i=0; i < globalRegistrationIndex; i++) + { + if (globalRegistrationBuffer[i].registerFunctionPointer) + { + if (globalRegistrationBuffer[i].callPriority==(int)0xFFFFFFFF) + RegisterFunction(globalRegistrationBuffer[i].functionName, globalRegistrationBuffer[i].registerFunctionPointer); + else + RegisterSlot(globalRegistrationBuffer[i].functionName, globalRegistrationBuffer[i].registerFunctionPointer, globalRegistrationBuffer[i].callPriority); + } + else if (globalRegistrationBuffer[i].registerBlockingFunctionPointer) + RegisterBlockingFunction(globalRegistrationBuffer[i].functionName, globalRegistrationBuffer[i].registerBlockingFunctionPointer); + else + RegisterLocalCallback(globalRegistrationBuffer[i].functionName, globalRegistrationBuffer[i].messageId); + } +} +PluginReceiveResult RPC4::OnReceive(Packet *packet) +{ + if (packet->data[0]==ID_RPC_PLUGIN) + { + RakNet::BitStream bsIn(packet->data,packet->length,false); + bsIn.IgnoreBytes(2); + + if (packet->data[1]==ID_RPC4_CALL) + { + RakNet::RakString functionName; + bsIn.ReadCompressed(functionName); + bool isBlocking=false; + bsIn.Read(isBlocking); + if (isBlocking==false) + { + DataStructures::HashIndex skhi = registeredNonblockingFunctions.GetIndexOf(functionName.C_String()); + if (skhi.IsInvalid()) + { + RakNet::BitStream bsOut; + bsOut.Write((unsigned char) ID_RPC_REMOTE_ERROR); + bsOut.Write((unsigned char) RPC_ERROR_FUNCTION_NOT_REGISTERED); + bsOut.Write(functionName.C_String(),(unsigned int) functionName.GetLength()+1); + SendUnified(&bsOut,HIGH_PRIORITY,RELIABLE_ORDERED,0,packet->systemAddress,false); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + + void ( *fp ) ( RakNet::BitStream *, Packet * ); + fp = registeredNonblockingFunctions.ItemAtIndex(skhi); + bsIn.AlignReadToByteBoundary(); + fp(&bsIn,packet); + } + else + { + DataStructures::HashIndex skhi = registeredBlockingFunctions.GetIndexOf(functionName.C_String()); + if (skhi.IsInvalid()) + { + RakNet::BitStream bsOut; + bsOut.Write((unsigned char) ID_RPC_REMOTE_ERROR); + bsOut.Write((unsigned char) RPC_ERROR_FUNCTION_NOT_REGISTERED); + bsOut.Write(functionName.C_String(),(unsigned int) functionName.GetLength()+1); + SendUnified(&bsOut,HIGH_PRIORITY,RELIABLE_ORDERED,0,packet->systemAddress,false); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + + void ( *fp ) ( RakNet::BitStream *, RakNet::BitStream *, Packet * ); + fp = registeredBlockingFunctions.ItemAtIndex(skhi); + RakNet::BitStream returnData; + bsIn.AlignReadToByteBoundary(); + fp(&bsIn, &returnData, packet); + + RakNet::BitStream out; + out.Write((MessageID) ID_RPC_PLUGIN); + out.Write((MessageID) ID_RPC4_RETURN); + returnData.ResetReadPointer(); + out.AlignWriteToByteBoundary(); + out.Write(returnData); + SendUnified(&out,IMMEDIATE_PRIORITY,RELIABLE_ORDERED,0,packet->systemAddress,false); + } + } + else if (packet->data[1]==ID_RPC4_SIGNAL) + { + RakNet::RakString sharedIdentifier; + bsIn.ReadCompressed(sharedIdentifier); + DataStructures::HashIndex functionIndex; + functionIndex = localSlots.GetIndexOf(sharedIdentifier); + RakNet::BitStream serializedParameters; + bsIn.AlignReadToByteBoundary(); + bsIn.Read(&serializedParameters); + InvokeSignal(functionIndex, &serializedParameters, packet); + } + else + { + RakAssert(packet->data[1]==ID_RPC4_RETURN); + blockingReturnValue.Reset(); + blockingReturnValue.Read(bsIn); + gotBlockingReturnValue=true; + } + + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + + bool objectExists; + unsigned int index, index2; + index = localCallbacks.GetIndexFromKey(packet->data[0],&objectExists); + if (objectExists) + { + LocalCallback *lc; + lc = localCallbacks[index]; + for (index2=0; index2 < lc->functions.Size(); index2++) + { + RakNet::BitStream bsIn(packet->data, packet->length, false); + + DataStructures::HashIndex skhi = registeredNonblockingFunctions.GetIndexOf(lc->functions[index2].C_String()); + if (skhi.IsInvalid()==false) + { + void ( *fp ) ( RakNet::BitStream *, Packet * ); + fp = registeredNonblockingFunctions.ItemAtIndex(skhi); + bsIn.AlignReadToByteBoundary(); + fp(&bsIn,packet); + } + } + } + + return RR_CONTINUE_PROCESSING; +} +DataStructures::HashIndex RPC4::GetLocalSlotIndex(const char *sharedIdentifier) +{ + return localSlots.GetIndexOf(sharedIdentifier); +} + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RPC4Plugin.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RPC4Plugin.h new file mode 100644 index 0000000..cce5978 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RPC4Plugin.h @@ -0,0 +1,236 @@ +/// \file +/// \brief Remote procedure call, supporting C functions only. No external dependencies required. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_RPC4Plugin==1 + +#ifndef __RPC_4_PLUGIN_H +#define __RPC_4_PLUGIN_H + +#include "PluginInterface2.h" +#include "PacketPriority.h" +#include "RakNetTypes.h" +#include "BitStream.h" +#include "RakString.h" +#include "NetworkIDObject.h" +#include "DS_Hash.h" +#include "DS_OrderedList.h" + +#ifdef _MSC_VER +#pragma warning( push ) +#endif + +/// \defgroup RPC_PLUGIN_GROUP RPC +/// \brief Remote procedure calls, without external dependencies. +/// \details This should not be used at the same time as RPC3. This is a less functional version of RPC3, and is here for users that do not want the Boost dependency of RPC3. +/// \ingroup PLUGINS_GROUP + +namespace RakNet +{ +/// Forward declarations +class RakPeerInterface; +class NetworkIDManager; + + /// \brief Error codes returned by a remote system as to why an RPC function call cannot execute + /// \details Error code follows packet ID ID_RPC_REMOTE_ERROR, that is packet->data[1]
+ /// Name of the function will be appended starting at packet->data[2] + /// \ingroup RPC_PLUGIN_GROUP + enum RPCErrorCodes + { + /// Named function was not registered with RegisterFunction(). Check your spelling. + RPC_ERROR_FUNCTION_NOT_REGISTERED, + }; + + /// \brief Instantiate this class globally if you want to register a function with RPC4 at the global space + class RAK_DLL_EXPORT RPC4GlobalRegistration + { + public: + /// \brief Queue a call to RPC4::RegisterFunction() globally. Actual call occurs once RPC4 is attached to an instance of RakPeer or TCPInterface. + RPC4GlobalRegistration(const char* uniqueID, void ( *functionPointer ) ( RakNet::BitStream *userData, Packet *packet )); + + /// \brief Queue a call to RPC4::RegisterSlot() globally. Actual call occurs once RPC4 is attached to an instance of RakPeer or TCPInterface. + RPC4GlobalRegistration(const char* uniqueID, void ( *functionPointer ) ( RakNet::BitStream *userData, Packet *packet ), int callPriority); + + /// \brief Queue a call to RPC4::RegisterBlockingFunction() globally. Actual call occurs once RPC4 is attached to an instance of RakPeer or TCPInterface. + RPC4GlobalRegistration(const char* uniqueID, void ( *functionPointer ) ( RakNet::BitStream *userData, RakNet::BitStream *returnData, Packet *packet )); + + /// \brief Queue a call to RPC4::RegisterLocalCallback() globally. Actual call occurs once RPC4 is attached to an instance of RakPeer or TCPInterface. + RPC4GlobalRegistration(const char* uniqueID, MessageID messageId); + }; + + /// \brief The RPC4 plugin is just an association between a C function pointer and a string. + /// \details It is for users that want to use RPC, but do not want to use boost. + /// You do not have the automatic serialization or other features of RPC3, and C++ member calls are not supported. + /// \note You cannot use RPC4 at the same time as RPC3Plugin + /// \ingroup RPC_PLUGIN_GROUP + class RAK_DLL_EXPORT RPC4 : public PluginInterface2 + { + public: + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(RPC4) + + // Constructor + RPC4(); + + // Destructor + virtual ~RPC4(); + + /// \deprecated Use RegisterSlot + /// \brief Register a function pointer to be callable from a remote system + /// \details The hash of the function name will be stored as an association with the function pointer + /// When a call is made to call this function from the \a Call() or CallLoopback() function, the function pointer will be invoked with the passed bitStream to Call() and the actual Packet that RakNet got. + /// \sa RegisterPacketCallback() + /// \param[in] uniqueID Identifier to be associated with \a functionPointer. If this identifier is already in use, the call will return false. + /// \param[in] functionPointer C function pointer to be called + /// \return True if the hash of uniqueID is not in use, false otherwise. + bool RegisterFunction(const char* uniqueID, void ( *functionPointer ) ( RakNet::BitStream *userData, Packet *packet )); + + /// Register a slot, which is a function pointer to one or more implementations that supports this function signature + /// When a signal occurs, all slots with the same identifier are called. + /// \param[in] sharedIdentifier A string to identify the slot. Recommended to be the same as the name of the function. + /// \param[in] functionPtr Pointer to the function. For C, just pass the name of the function. For C++, use ARPC_REGISTER_CPP_FUNCTION + /// \param[in] callPriority Slots are called by order of the highest callPriority first. For slots with the same priority, they are called in the order they are registered + void RegisterSlot(const char *sharedIdentifier, void ( *functionPointer ) ( RakNet::BitStream *userData, Packet *packet ), int callPriority); + + /// \brief Same as \a RegisterFunction, but is called with CallBlocking() instead of Call() and returns a value to the caller + bool RegisterBlockingFunction(const char* uniqueID, void ( *functionPointer ) ( RakNet::BitStream *userData, RakNet::BitStream *returnData, Packet *packet )); + + /// \deprecated Use RegisterSlot and invoke on self only when the packet you want arrives + /// When a RakNet Packet with the specified identifier is returned, execute CallLoopback() on a function previously registered with RegisterFunction() + /// For example, you could call "OnClosedConnection" whenever you get ID_DISCONNECTION_NOTIFICATION or ID_CONNECTION_LOST + /// \param[in] uniqueID Identifier passed to RegisterFunction() + /// \param[in] messageId What RakNet packet ID to call on, for example ID_DISCONNECTION_NOTIFICATION or ID_CONNECTION_LOST + void RegisterLocalCallback(const char* uniqueID, MessageID messageId); + + /// \brief Unregister a function pointer previously registered with RegisterFunction() + /// \param[in] Identifier originally passed to RegisterFunction() + /// \return True if the hash of uniqueID was in use, and hence removed. false otherwise. + bool UnregisterFunction(const char* uniqueID); + + /// \brief Same as UnregisterFunction, except for a blocking function + bool UnregisterBlockingFunction(const char* uniqueID); + + /// Remove the association created with RegisterPacketCallback() + /// \param[in] uniqueID Identifier passed as uniqueID to RegisterLocalCallback() + /// \param[in] messageId Identifier passed as messageId to RegisterLocalCallback() + /// \return True if the combination of uniqueID and messageId was in use, and hence removed + bool UnregisterLocalCallback(const char* uniqueID, MessageID messageId); + + /// Remove the association created with RegisterSlot() + /// \param[in] sharedIdentifier Identifier passed as sharedIdentifier to RegisterSlot() + bool UnregisterSlot(const char* sharedIdentifier); + + /// \deprecated Use RegisterSlot() and Signal() with your own RakNetGUID as the send target + /// Send to the attached instance of RakPeer. See RakPeerInterface::SendLoopback() + /// \param[in] Identifier originally passed to RegisterFunction() on the local system + /// \param[in] bitStream bitStream encoded data to send to the function callback + void CallLoopback( const char* uniqueID, RakNet::BitStream * bitStream ); + + /// \deprecated, use Signal() + /// Send to the specified remote instance of RakPeer. + /// \param[in] uniqueID Identifier originally passed to RegisterFunction() on the remote system(s) + /// \param[in] bitStream bitStream encoded data to send to the function callback + /// \param[in] priority See RakPeerInterface::Send() + /// \param[in] reliability See RakPeerInterface::Send() + /// \param[in] orderingChannel See RakPeerInterface::Send() + /// \param[in] systemIdentifier See RakPeerInterface::Send() + /// \param[in] broadcast See RakPeerInterface::Send() + void Call( const char* uniqueID, RakNet::BitStream * bitStream, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast ); + + /// \brief Same as call, but don't return until the remote system replies. + /// Broadcasting parameter does not exist, this can only call one remote system + /// \note This function does not return until the remote system responds, disconnects, or was never connected to begin with + /// \param[in] Identifier originally passed to RegisterBlockingFunction() on the remote system(s) + /// \param[in] bitStream bitStream encoded data to send to the function callback + /// \param[in] priority See RakPeerInterface::Send() + /// \param[in] reliability See RakPeerInterface::Send() + /// \param[in] orderingChannel See RakPeerInterface::Send() + /// \param[in] systemIdentifier See RakPeerInterface::Send() + /// \param[out] returnData Written to by the function registered with RegisterBlockingFunction. + /// \return true if successfully called. False on disconnect, function not registered, or not connected to begin with + bool CallBlocking( const char* uniqueID, RakNet::BitStream * bitStream, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, RakNet::BitStream *returnData ); + + /// Calls zero or more functions identified by sharedIdentifier registered with RegisterSlot() + /// \param[in] sharedIdentifier parameter of the same name passed to RegisterSlot() on the remote system + /// \param[in] bitStream bitStream encoded data to send to the function callback + /// \param[in] priority See RakPeerInterface::Send() + /// \param[in] reliability See RakPeerInterface::Send() + /// \param[in] orderingChannel See RakPeerInterface::Send() + /// \param[in] systemIdentifier See RakPeerInterface::Send() + /// \param[in] broadcast See RakPeerInterface::Send() + /// \param[in] invokeLocal If true, also sends to self. + void Signal(const char *sharedIdentifier, RakNet::BitStream * bitStream, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast, bool invokeLocal); + + /// If called while processing a slot, no further slots for the currently executing signal will be executed + void InterruptSignal(void); + + /// \internal + struct LocalCallback + { + MessageID messageId; + DataStructures::OrderedList functions; + }; + static int LocalCallbackComp(const MessageID &key, LocalCallback* const &data ); + + /// \internal + // Callable object, along with priority to call relative to other objects + struct LocalSlotObject + { + LocalSlotObject() {} + LocalSlotObject(unsigned int _registrationCount,int _callPriority, void ( *_functionPointer ) ( RakNet::BitStream *userData, Packet *packet )) + {registrationCount=_registrationCount;callPriority=_callPriority;functionPointer=_functionPointer;} + ~LocalSlotObject() {} + + // Used so slots are called in the order they are registered + unsigned int registrationCount; + int callPriority; + void ( *functionPointer ) ( RakNet::BitStream *userData, Packet *packet ); + }; + + static int LocalSlotObjectComp( const LocalSlotObject &key, const LocalSlotObject &data ); + + /// \internal + struct LocalSlot + { + DataStructures::OrderedList slotObjects; + }; + DataStructures::Hash localSlots; + + protected: + + // -------------------------------------------------------------------------------------------- + // Packet handling functions + // -------------------------------------------------------------------------------------------- + virtual void OnAttach(void); + virtual PluginReceiveResult OnReceive(Packet *packet); + + DataStructures::Hash registeredNonblockingFunctions; + DataStructures::Hash registeredBlockingFunctions; + DataStructures::OrderedList localCallbacks; + + RakNet::BitStream blockingReturnValue; + bool gotBlockingReturnValue; + + DataStructures::HashIndex GetLocalSlotIndex(const char *sharedIdentifier); + + /// Used so slots are called in the order they are registered + unsigned int nextSlotRegistrationCount; + + bool interruptSignal; + + void InvokeSignal(DataStructures::HashIndex functionIndex, RakNet::BitStream *serializedParameters, Packet *packet); + }; + +} // End namespace + +#endif + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Rackspace.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Rackspace.cpp new file mode 100644 index 0000000..13541ce --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Rackspace.cpp @@ -0,0 +1,655 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_Rackspace==1 && _RAKNET_SUPPORT_TCPInterface==1 + +#include "Rackspace.h" +#include "RakString.h" +#include "TCPInterface.h" + +using namespace RakNet; + +Rackspace::Rackspace() +{ + tcpInterface=0; +} + +Rackspace::~Rackspace() +{ + +} + +void Rackspace::AddEventCallback(RackspaceEventCallback *callback) +{ + unsigned int idx = eventCallbacks.GetIndexOf(callback); + if (idx == (unsigned int)-1) + eventCallbacks.Push(callback,_FILE_AND_LINE_); +} +void Rackspace::RemoveEventCallback(RackspaceEventCallback *callback) +{ + unsigned int idx = eventCallbacks.GetIndexOf(callback); + if (idx != (unsigned int)-1) + eventCallbacks.RemoveAtIndex(idx); +} +void Rackspace::ClearEventCallbacks(void) +{ + eventCallbacks.Clear(true, _FILE_AND_LINE_); +} +SystemAddress Rackspace::Authenticate(TCPInterface *_tcpInterface, const char *_authenticationURL, const char *_rackspaceCloudUsername, const char *_apiAccessKey) +{ + unsigned int index = GetOperationOfTypeIndex(RO_CONNECT_AND_AUTHENTICATE); + if (index!=(unsigned int)-1) + { + // In progress + return operations[index].connectionAddress; + } + + tcpInterface=_tcpInterface; + + rackspaceCloudUsername=_rackspaceCloudUsername; + apiAccessKey=_apiAccessKey; + + unsigned int i; + + RackspaceOperation ro; + ro.type=RO_CONNECT_AND_AUTHENTICATE; + ro.isPendingAuthentication=false; + + RakAssert(tcpInterface->WasStarted()); + ro.connectionAddress=tcpInterface->Connect(_authenticationURL,443,true); + if (ro.connectionAddress==UNASSIGNED_SYSTEM_ADDRESS) + { + for (i=0; i < eventCallbacks.Size(); i++) + eventCallbacks[i]->OnConnectionAttemptFailure(RO_CONNECT_AND_AUTHENTICATE, _authenticationURL); + + return UNASSIGNED_SYSTEM_ADDRESS; + } + +#if OPEN_SSL_CLIENT_SUPPORT==1 + tcpInterface->StartSSLClient(ro.connectionAddress); +#endif + + RakNet::RakString command( + "GET /v1.0 HTTP/1.1\n" + "Host: %s\n" + "X-Auth-User: %s\n" + "X-Auth-Key: %s\n\n" + ,_authenticationURL, _rackspaceCloudUsername, _apiAccessKey); + tcpInterface->Send(command.C_String(), (unsigned int) command.GetLength(), ro.connectionAddress, false); + + operations.Insert(ro,_FILE_AND_LINE_); + return ro.connectionAddress; +} + +const char * Rackspace::EventTypeToString(RackspaceEventType eventType) +{ + switch (eventType) + { + case RET_Success_200: + return "Success_200"; + case RET_Success_201: + return "Success_201"; + case RET_Success_202: + return "Success_202"; + case RET_Success_203: + return "Success_203"; + case RET_Success_204: + return "Success_204"; + case RET_Cloud_Servers_Fault_500: + return "Cloud_Servers_Fault_500"; + case RET_Service_Unavailable_503: + return "Service_Unavailable_503"; + case RET_Unauthorized_401: + return "Unauthorized_401"; + case RET_Bad_Request_400: + return "Bad_Request_400"; + case RET_Over_Limit_413: + return "Over_Limit_413"; + case RET_Bad_Media_Type_415: + return "Bad_Media_Type_415"; + case RET_Item_Not_Found_404: + return "Item_Not_Found_404"; + case RET_Build_In_Progress_409: + return "Build_In_Progress_409"; + case RET_Resize_Not_Allowed_403: + return "Resize_Not_Allowed_403"; + case RET_Connection_Closed_Without_Reponse: + return "Connection_Closed_Without_Reponse"; + case RET_Unknown_Failure: + return "Unknown_Failure"; + } + return "Unknown event type (bug)"; +} +void Rackspace::AddOperation(RackspaceOperationType type, RakNet::RakString httpCommand, RakNet::RakString operation, RakNet::RakString xml) +{ + RackspaceOperation ro; + ro.type=type; + ro.httpCommand=httpCommand; + ro.operation=operation; + ro.xml=xml; + ro.isPendingAuthentication=HasOperationOfType(RO_CONNECT_AND_AUTHENTICATE); + if (ro.isPendingAuthentication==false) + { + if (ExecuteOperation(ro)) + operations.Insert(ro,_FILE_AND_LINE_); + } + else + operations.Insert(ro,_FILE_AND_LINE_); +} +void Rackspace::ListServers(void) +{ + AddOperation(RO_LIST_SERVERS, "GET", "servers", ""); +} +void Rackspace::ListServersWithDetails(void) +{ + AddOperation(RO_LIST_SERVERS_WITH_DETAILS, "GET", "servers/detail", ""); +} +void Rackspace::CreateServer(RakNet::RakString name, RakNet::RakString imageId, RakNet::RakString flavorId) +{ + RakNet::RakString xml( + "" + "" + "" + ,name.C_String() ,imageId.C_String(), flavorId.C_String()); + AddOperation(RO_CREATE_SERVER, "POST", "servers", xml); +} +void Rackspace::GetServerDetails(RakNet::RakString serverId) +{ + AddOperation(RO_GET_SERVER_DETAILS, "GET", RakNet::RakString("servers/%s", serverId.C_String()), ""); +} +void Rackspace::UpdateServerNameOrPassword(RakNet::RakString serverId, RakNet::RakString newName, RakNet::RakString newPassword) +{ + if (newName.IsEmpty() && newPassword.IsEmpty()) + return; + RakNet::RakString xml( + "" + "" + "", + rebootType.C_String()); + + AddOperation(RO_REBOOT_SERVER, "POST", RakNet::RakString("servers/%s/action", serverId.C_String()), xml); +} +void Rackspace::RebuildServer(RakNet::RakString serverId, RakNet::RakString imageId) +{ + RakNet::RakString xml( + "" + "", + imageId.C_String()); + + AddOperation(RO_REBUILD_SERVER, "POST", RakNet::RakString("servers/%s/action", serverId.C_String()), xml); +} +void Rackspace::ResizeServer(RakNet::RakString serverId, RakNet::RakString flavorId) +{ + RakNet::RakString xml( + "" + "", + flavorId.C_String()); + + AddOperation(RO_RESIZE_SERVER, "POST", RakNet::RakString("servers/%s/action", serverId.C_String()), xml); +} +void Rackspace::ConfirmResizedServer(RakNet::RakString serverId) +{ + RakNet::RakString xml( + "" + ""); + AddOperation(RO_CONFIRM_RESIZED_SERVER, "POST", RakNet::RakString("servers/%s/action", serverId.C_String()), xml); +} +void Rackspace::RevertResizedServer(RakNet::RakString serverId) +{ + RakNet::RakString xml( + "" + ""); + AddOperation(RO_REVERT_RESIZED_SERVER, "POST", RakNet::RakString("servers/%s/action", serverId.C_String()), xml); +} +void Rackspace::ListFlavors(void) +{ + AddOperation(RO_LIST_FLAVORS, "GET", "flavors", ""); +} +void Rackspace::GetFlavorDetails(RakNet::RakString flavorId) +{ + AddOperation(RO_GET_FLAVOR_DETAILS, "GET", RakNet::RakString("flavors/%s", flavorId.C_String()), ""); +} +void Rackspace::ListImages(void) +{ + AddOperation(RO_LIST_IMAGES, "GET", "images", ""); +} +void Rackspace::CreateImage(RakNet::RakString serverId, RakNet::RakString imageName) +{ + RakNet::RakString xml( + "" + "", + imageName.C_String(),serverId.C_String()); + + AddOperation(RO_CREATE_IMAGE, "POST", "images", xml); +} +void Rackspace::GetImageDetails(RakNet::RakString imageId) +{ + AddOperation(RO_GET_IMAGE_DETAILS, "GET", RakNet::RakString("images/%s", imageId.C_String()), ""); +} +void Rackspace::DeleteImage(RakNet::RakString imageId) +{ + AddOperation(RO_DELETE_IMAGE, "DELETE", RakNet::RakString("images/%s", imageId.C_String()), ""); +} +void Rackspace::ListSharedIPGroups(void) +{ + AddOperation(RO_LIST_SHARED_IP_GROUPS, "GET", "shared_ip_groups", ""); +} +void Rackspace::ListSharedIPGroupsWithDetails(void) +{ + AddOperation(RO_LIST_SHARED_IP_GROUPS_WITH_DETAILS, "GET", "shared_ip_groups/detail", ""); +} +void Rackspace::CreateSharedIPGroup(RakNet::RakString name, RakNet::RakString optionalServerId) +{ + RakNet::RakString xml( + "" + "", name.C_String()); + if (optionalServerId.IsEmpty()==false) + xml+=RakNet::RakString("", optionalServerId.C_String()); + xml+=""; + + AddOperation(RO_CREATE_SHARED_IP_GROUP, "POST", "shared_ip_groups", xml); +} +void Rackspace::GetSharedIPGroupDetails(RakNet::RakString groupId) +{ + AddOperation(RO_GET_SHARED_IP_GROUP_DETAILS, "GET", RakNet::RakString("shared_ip_groups/%s", groupId.C_String()), ""); +} +void Rackspace::DeleteSharedIPGroup(RakNet::RakString groupId) +{ + AddOperation(RO_DELETE_SHARED_IP_GROUP, "DELETE", RakNet::RakString("shared_ip_groups/%s", groupId.C_String()), ""); +} +void Rackspace::OnClosedConnection(SystemAddress systemAddress) +{ + if (systemAddress==UNASSIGNED_SYSTEM_ADDRESS) + return; + + unsigned int i, operationsIndex; + operationsIndex=0; + while (operationsIndex < operations.Size()) + { + if (operations[operationsIndex].isPendingAuthentication==false && operations[operationsIndex].connectionAddress==systemAddress) + { + RackspaceOperation ro = operations[operationsIndex]; + operations.RemoveAtIndex(operationsIndex); + + RakNet::RakString packetDataString = ro.incomingStream; + const char *packetData = packetDataString.C_String(); + + char resultCodeStr[32]; + int resultCodeInt; + + RackspaceEventType rackspaceEventType; + char *result; + result=strstr((char*) packetData, "HTTP/1.1 "); + if (result!=0) + { + result+=strlen("HTTP/1.1 "); + for (i=0; i < sizeof(resultCodeStr)-1 && result[i] && result[i]>='0' && result[i]<='9'; i++) + resultCodeStr[i]=result[i]; + resultCodeStr[i]=0; + resultCodeInt=atoi(resultCodeStr); + + switch (resultCodeInt) + { + case 200: rackspaceEventType=RET_Success_200; break; + case 201: rackspaceEventType=RET_Success_201; break; + case 202: rackspaceEventType=RET_Success_202; break; + case 203: rackspaceEventType=RET_Success_203; break; + case 204: rackspaceEventType=RET_Success_204; break; + case 500: rackspaceEventType=RET_Cloud_Servers_Fault_500; break; + case 503: rackspaceEventType=RET_Service_Unavailable_503; break; + case 401: rackspaceEventType=RET_Unauthorized_401; break; + case 400: rackspaceEventType=RET_Bad_Request_400; break; + case 413: rackspaceEventType=RET_Over_Limit_413; break; + case 415: rackspaceEventType=RET_Bad_Media_Type_415; break; + case 404: rackspaceEventType=RET_Item_Not_Found_404; break; + case 409: rackspaceEventType=RET_Build_In_Progress_409; break; + case 403: rackspaceEventType=RET_Resize_Not_Allowed_403; break; + default: rackspaceEventType=RET_Unknown_Failure; break; + } + } + else + { + rackspaceEventType=RET_Connection_Closed_Without_Reponse; + } + + switch (ro.type) + { + case RO_CONNECT_AND_AUTHENTICATE: + { + if (rackspaceEventType==RET_Success_204) + { + RakNet::RakString header; + ReadLine(packetData, "X-Server-Management-Url: ", serverManagementURL); + serverManagementURL.SplitURI(header, serverManagementDomain, serverManagementPath); + ReadLine(packetData, "X-Storage-Url: ", storageURL); + storageURL.SplitURI(header, storageDomain, storagePath); + ReadLine(packetData, "X-CDN-Management-Url: ", cdnManagementURL); + cdnManagementURL.SplitURI(header, cdnManagementDomain, cdnManagementPath); + ReadLine(packetData, "X-Auth-Token: ", authToken); + ReadLine(packetData, "X-Storage-Token: ", storageToken); + + operationsIndex=0; + while (operationsIndex < operations.Size()) + { + if (operations[operationsIndex].isPendingAuthentication==true) + { + operations[operationsIndex].isPendingAuthentication=false; + if (ExecuteOperation(operations[operationsIndex])==false) + { + operations.RemoveAtIndex(operationsIndex); + } + else + operationsIndex++; + } + else + operationsIndex++; + } + + // Restart in list + operationsIndex=0; + } + + for (i=0; i < eventCallbacks.Size(); i++) + eventCallbacks[i]->OnAuthenticationResult(rackspaceEventType, (const char*) packetData); + + break; + } + case RO_LIST_SERVERS: + { + for (i=0; i < eventCallbacks.Size(); i++) + eventCallbacks[i]->OnListServersResult(rackspaceEventType, (const char*) packetData); + break; + } + case RO_LIST_SERVERS_WITH_DETAILS: + { + for (i=0; i < eventCallbacks.Size(); i++) + eventCallbacks[i]->OnListServersWithDetailsResult(rackspaceEventType, (const char*) packetData); + break; + } + case RO_CREATE_SERVER: + { + for (i=0; i < eventCallbacks.Size(); i++) + eventCallbacks[i]->OnCreateServerResult(rackspaceEventType, (const char*) packetData); + break; + } + + case RO_GET_SERVER_DETAILS: + { + for (i=0; i < eventCallbacks.Size(); i++) + eventCallbacks[i]->OnGetServerDetails(rackspaceEventType, (const char*) packetData); + break; + } + case RO_UPDATE_SERVER_NAME_OR_PASSWORD: + { + for (i=0; i < eventCallbacks.Size(); i++) + eventCallbacks[i]->OnUpdateServerNameOrPassword(rackspaceEventType, (const char*) packetData); + break; + } + case RO_DELETE_SERVER: + { + for (i=0; i < eventCallbacks.Size(); i++) + eventCallbacks[i]->OnDeleteServer(rackspaceEventType, (const char*) packetData); + break; + } + case RO_LIST_SERVER_ADDRESSES: + { + for (i=0; i < eventCallbacks.Size(); i++) + eventCallbacks[i]->OnListServerAddresses(rackspaceEventType, (const char*) packetData); + break; + } + case RO_SHARE_SERVER_ADDRESS: + { + for (i=0; i < eventCallbacks.Size(); i++) + eventCallbacks[i]->OnShareServerAddress(rackspaceEventType, (const char*) packetData); + break; + } + case RO_DELETE_SERVER_ADDRESS: + { + for (i=0; i < eventCallbacks.Size(); i++) + eventCallbacks[i]->OnDeleteServerAddress(rackspaceEventType, (const char*) packetData); + break; + } + case RO_REBOOT_SERVER: + { + for (i=0; i < eventCallbacks.Size(); i++) + eventCallbacks[i]->OnRebootServer(rackspaceEventType, (const char*) packetData); + break; + } + case RO_REBUILD_SERVER: + { + for (i=0; i < eventCallbacks.Size(); i++) + eventCallbacks[i]->OnRebuildServer(rackspaceEventType, (const char*) packetData); + break; + } + case RO_RESIZE_SERVER: + { + for (i=0; i < eventCallbacks.Size(); i++) + eventCallbacks[i]->OnResizeServer(rackspaceEventType, (const char*) packetData); + break; + } + case RO_CONFIRM_RESIZED_SERVER: + { + for (i=0; i < eventCallbacks.Size(); i++) + eventCallbacks[i]->OnConfirmResizedServer(rackspaceEventType, (const char*) packetData); + break; + } + case RO_REVERT_RESIZED_SERVER: + { + for (i=0; i < eventCallbacks.Size(); i++) + eventCallbacks[i]->OnRevertResizedServer(rackspaceEventType, (const char*) packetData); + break; + } + + + case RO_LIST_FLAVORS: + { + for (i=0; i < eventCallbacks.Size(); i++) + eventCallbacks[i]->OnListFlavorsResult(rackspaceEventType, (const char*) packetData); + break; + } + case RO_GET_FLAVOR_DETAILS: + { + for (i=0; i < eventCallbacks.Size(); i++) + eventCallbacks[i]->OnGetFlavorDetailsResult(rackspaceEventType, (const char*) packetData); + break; + } + case RO_LIST_IMAGES: + { + for (i=0; i < eventCallbacks.Size(); i++) + eventCallbacks[i]->OnListImagesResult(rackspaceEventType, (const char*) packetData); + break; + } + case RO_CREATE_IMAGE: + { + for (i=0; i < eventCallbacks.Size(); i++) + eventCallbacks[i]->OnCreateImageResult(rackspaceEventType, (const char*) packetData); + break; + } + case RO_GET_IMAGE_DETAILS: + { + for (i=0; i < eventCallbacks.Size(); i++) + eventCallbacks[i]->OnGetImageDetailsResult(rackspaceEventType, (const char*) packetData); + break; + } + case RO_DELETE_IMAGE: + { + for (i=0; i < eventCallbacks.Size(); i++) + eventCallbacks[i]->OnDeleteImageResult(rackspaceEventType, (const char*) packetData); + break; + } + case RO_LIST_SHARED_IP_GROUPS: + { + for (i=0; i < eventCallbacks.Size(); i++) + eventCallbacks[i]->OnListSharedIPGroups(rackspaceEventType, (const char*) packetData); + break; + } + case RO_LIST_SHARED_IP_GROUPS_WITH_DETAILS: + { + for (i=0; i < eventCallbacks.Size(); i++) + eventCallbacks[i]->OnListSharedIPGroupsWithDetails(rackspaceEventType, (const char*) packetData); + break; + } + case RO_CREATE_SHARED_IP_GROUP: + { + for (i=0; i < eventCallbacks.Size(); i++) + eventCallbacks[i]->OnCreateSharedIPGroup(rackspaceEventType, (const char*) packetData); + break; + } + case RO_GET_SHARED_IP_GROUP_DETAILS: + { + for (i=0; i < eventCallbacks.Size(); i++) + eventCallbacks[i]->OnGetSharedIPGroupDetails(rackspaceEventType, (const char*) packetData); + break; + } + case RO_DELETE_SHARED_IP_GROUP: + { + for (i=0; i < eventCallbacks.Size(); i++) + eventCallbacks[i]->OnDeleteSharedIPGroup(rackspaceEventType, (const char*) packetData); + break; + } + default: + break; + + } + } + else + { + operationsIndex++; + } + } +} +void Rackspace::OnReceive(Packet *packet) +{ + unsigned int operationsIndex; + for (operationsIndex=0; operationsIndex < operations.Size(); operationsIndex++) + { + if (operations[operationsIndex].isPendingAuthentication==false && operations[operationsIndex].connectionAddress==packet->systemAddress) + { + operations[operationsIndex].incomingStream+=packet->data; + } + } +} +bool Rackspace::ExecuteOperation(RackspaceOperation &ro) +{ + if (ConnectToServerManagementDomain(ro)==false) + return false; + + RakNet::RakString command( + "%s %s/%s HTTP/1.1\n" + "Host: %s\n" + "Content-Type: application/xml\n" + "Content-Length: %i\n" + "Accept: application/xml\n" + "X-Auth-Token: %s\n", + ro.httpCommand.C_String(), serverManagementPath.C_String(), ro.operation.C_String(), serverManagementDomain.C_String(), + ro.xml.GetLength(), + authToken.C_String()); + + if (ro.xml.IsEmpty()==false) + { + command+="\n"; + command+=ro.xml; + command+="\n"; + } + + command+="\n"; + + //printf(command.C_String()); + + tcpInterface->Send(command.C_String(), (unsigned int) command.GetLength(), ro.connectionAddress, false); + return true; +} +void Rackspace::ReadLine(const char *data, const char *stringStart, RakNet::RakString &output) +{ + output.Clear(); + + char *result, *resultEnd; + + result=strstr((char*) data, stringStart); + result+=strlen(stringStart); + if (result==0) + { + RakAssert(0); + return; + } + + output=result; + resultEnd=result; + while (*resultEnd && (*resultEnd!='\r') && (*resultEnd!='\n') ) + resultEnd++; + output.Truncate((unsigned int) (resultEnd-result)); +} + + +bool Rackspace::ConnectToServerManagementDomain(RackspaceOperation &ro) +{ + unsigned int i; + + ro.connectionAddress=tcpInterface->Connect(serverManagementDomain.C_String(),443,true); + if (ro.connectionAddress==UNASSIGNED_SYSTEM_ADDRESS) + { + for (i=0; i < eventCallbacks.Size(); i++) + eventCallbacks[i]->OnConnectionAttemptFailure(ro.type, serverManagementURL); + return false; + } + +#if OPEN_SSL_CLIENT_SUPPORT==1 + tcpInterface->StartSSLClient(ro.connectionAddress); +#endif + + return true; +} +bool Rackspace::HasOperationOfType(RackspaceOperationType t) +{ + unsigned int i; + for (i=0; i < operations.Size(); i++) + { + if (operations[i].type==t) + return true; + } + return false; +} +unsigned int Rackspace::GetOperationOfTypeIndex(RackspaceOperationType t) +{ + unsigned int i; + for (i=0; i < operations.Size(); i++) + { + if (operations[i].type==t) + return i; + } + return (unsigned int) -1; +} + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Rackspace.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Rackspace.h new file mode 100644 index 0000000..d2fc16e --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Rackspace.h @@ -0,0 +1,405 @@ +/// \file Rackspace.h +/// \brief Helper to class to manage Rackspace servers +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" + +#if _RAKNET_SUPPORT_Rackspace==1 && _RAKNET_SUPPORT_TCPInterface==1 + +#include "Export.h" +#include "DS_List.h" +#include "RakNetTypes.h" +#include "DS_Queue.h" +#include "RakString.h" + +#ifndef __RACKSPACE_H +#define __RACKSPACE_H + +namespace RakNet +{ + + class TCPInterface; + struct Packet; + + /// \brief Result codes for Rackspace commands + /// /sa Rackspace::EventTypeToString() + enum RackspaceEventType + { + RET_Success_200, + RET_Success_201, + RET_Success_202, + RET_Success_203, + RET_Success_204, + RET_Cloud_Servers_Fault_500, + RET_Service_Unavailable_503, + RET_Unauthorized_401, + RET_Bad_Request_400, + RET_Over_Limit_413, + RET_Bad_Media_Type_415, + RET_Item_Not_Found_404, + RET_Build_In_Progress_409, + RET_Resize_Not_Allowed_403, + RET_Connection_Closed_Without_Reponse, + RET_Unknown_Failure, + }; + + /// \internal + enum RackspaceOperationType + { + RO_CONNECT_AND_AUTHENTICATE, + RO_LIST_SERVERS, + RO_LIST_SERVERS_WITH_DETAILS, + RO_CREATE_SERVER, + RO_GET_SERVER_DETAILS, + RO_UPDATE_SERVER_NAME_OR_PASSWORD, + RO_DELETE_SERVER, + RO_LIST_SERVER_ADDRESSES, + RO_SHARE_SERVER_ADDRESS, + RO_DELETE_SERVER_ADDRESS, + RO_REBOOT_SERVER, + RO_REBUILD_SERVER, + RO_RESIZE_SERVER, + RO_CONFIRM_RESIZED_SERVER, + RO_REVERT_RESIZED_SERVER, + RO_LIST_FLAVORS, + RO_GET_FLAVOR_DETAILS, + RO_LIST_IMAGES, + RO_CREATE_IMAGE, + RO_GET_IMAGE_DETAILS, + RO_DELETE_IMAGE, + RO_LIST_SHARED_IP_GROUPS, + RO_LIST_SHARED_IP_GROUPS_WITH_DETAILS, + RO_CREATE_SHARED_IP_GROUP, + RO_GET_SHARED_IP_GROUP_DETAILS, + RO_DELETE_SHARED_IP_GROUP, + + RO_NONE, + }; + + /// \brief Callback interface to receive the results of operations + class RAK_DLL_EXPORT RackspaceEventCallback + { + public: + RackspaceEventCallback() {} + virtual ~RackspaceEventCallback() {} + virtual void OnAuthenticationResult(RackspaceEventType eventType, const char *htmlAdditionalInfo)=0; + virtual void OnListServersResult(RackspaceEventType eventType, const char *htmlAdditionalInfo)=0; + virtual void OnListServersWithDetailsResult(RackspaceEventType eventType, const char *htmlAdditionalInfo)=0; + virtual void OnCreateServerResult(RackspaceEventType eventType, const char *htmlAdditionalInfo)=0; + virtual void OnGetServerDetails(RackspaceEventType eventType, const char *htmlAdditionalInfo)=0; + virtual void OnUpdateServerNameOrPassword(RackspaceEventType eventType, const char *htmlAdditionalInfo)=0; + virtual void OnDeleteServer(RackspaceEventType eventType, const char *htmlAdditionalInfo)=0; + virtual void OnListServerAddresses(RackspaceEventType eventType, const char *htmlAdditionalInfo)=0; + virtual void OnShareServerAddress(RackspaceEventType eventType, const char *htmlAdditionalInfo)=0; + virtual void OnDeleteServerAddress(RackspaceEventType eventType, const char *htmlAdditionalInfo)=0; + virtual void OnRebootServer(RackspaceEventType eventType, const char *htmlAdditionalInfo)=0; + virtual void OnRebuildServer(RackspaceEventType eventType, const char *htmlAdditionalInfo)=0; + virtual void OnResizeServer(RackspaceEventType eventType, const char *htmlAdditionalInfo)=0; + virtual void OnConfirmResizedServer(RackspaceEventType eventType, const char *htmlAdditionalInfo)=0; + virtual void OnRevertResizedServer(RackspaceEventType eventType, const char *htmlAdditionalInfo)=0; + virtual void OnListFlavorsResult(RackspaceEventType eventType, const char *htmlAdditionalInfo)=0; + virtual void OnGetFlavorDetailsResult(RackspaceEventType eventType, const char *htmlAdditionalInfo)=0; + virtual void OnListImagesResult(RackspaceEventType eventType, const char *htmlAdditionalInfo)=0; + virtual void OnCreateImageResult(RackspaceEventType eventType, const char *htmlAdditionalInfo)=0; + virtual void OnGetImageDetailsResult(RackspaceEventType eventType, const char *htmlAdditionalInfo)=0; + virtual void OnDeleteImageResult(RackspaceEventType eventType, const char *htmlAdditionalInfo)=0; + virtual void OnListSharedIPGroups(RackspaceEventType eventType, const char *htmlAdditionalInfo)=0; + virtual void OnListSharedIPGroupsWithDetails(RackspaceEventType eventType, const char *htmlAdditionalInfo)=0; + virtual void OnCreateSharedIPGroup(RackspaceEventType eventType, const char *htmlAdditionalInfo)=0; + virtual void OnGetSharedIPGroupDetails(RackspaceEventType eventType, const char *htmlAdditionalInfo)=0; + virtual void OnDeleteSharedIPGroup(RackspaceEventType eventType, const char *htmlAdditionalInfo)=0; + + virtual void OnConnectionAttemptFailure(RackspaceOperationType operationType, const char *url)=0; + }; + + /// \brief Callback interface to receive the results of operations, with a default result + class RAK_DLL_EXPORT RackspaceEventCallback_Default : public RackspaceEventCallback + { + public: + virtual void ExecuteDefault(const char *callbackName, RackspaceEventType eventType, const char *htmlAdditionalInfo) {(void) callbackName; (void) eventType; (void) htmlAdditionalInfo;} + + virtual void OnAuthenticationResult(RackspaceEventType eventType, const char *htmlAdditionalInfo) {ExecuteDefault("OnAuthenticationResult", eventType, htmlAdditionalInfo);} + virtual void OnListServersResult(RackspaceEventType eventType, const char *htmlAdditionalInfo) {ExecuteDefault("OnListServersResult", eventType, htmlAdditionalInfo);} + virtual void OnListServersWithDetailsResult(RackspaceEventType eventType, const char *htmlAdditionalInfo) {ExecuteDefault("OnListServersWithDetailsResult", eventType, htmlAdditionalInfo);} + virtual void OnCreateServerResult(RackspaceEventType eventType, const char *htmlAdditionalInfo) {ExecuteDefault("OnCreateServerResult", eventType, htmlAdditionalInfo);} + virtual void OnGetServerDetails(RackspaceEventType eventType, const char *htmlAdditionalInfo) {ExecuteDefault("OnGetServerDetails", eventType, htmlAdditionalInfo);} + virtual void OnUpdateServerNameOrPassword(RackspaceEventType eventType, const char *htmlAdditionalInfo) {ExecuteDefault("OnUpdateServerNameOrPassword", eventType, htmlAdditionalInfo);} + virtual void OnDeleteServer(RackspaceEventType eventType, const char *htmlAdditionalInfo) {ExecuteDefault("OnDeleteServer", eventType, htmlAdditionalInfo);} + virtual void OnListServerAddresses(RackspaceEventType eventType, const char *htmlAdditionalInfo) {ExecuteDefault("OnListServerAddresses", eventType, htmlAdditionalInfo);} + virtual void OnShareServerAddress(RackspaceEventType eventType, const char *htmlAdditionalInfo) {ExecuteDefault("OnShareServerAddress", eventType, htmlAdditionalInfo);} + virtual void OnDeleteServerAddress(RackspaceEventType eventType, const char *htmlAdditionalInfo) {ExecuteDefault("OnDeleteServerAddress", eventType, htmlAdditionalInfo);} + virtual void OnRebootServer(RackspaceEventType eventType, const char *htmlAdditionalInfo) {ExecuteDefault("OnRebootServer", eventType, htmlAdditionalInfo);} + virtual void OnRebuildServer(RackspaceEventType eventType, const char *htmlAdditionalInfo) {ExecuteDefault("OnRebuildServer", eventType, htmlAdditionalInfo);} + virtual void OnResizeServer(RackspaceEventType eventType, const char *htmlAdditionalInfo) {ExecuteDefault("OnResizeServer", eventType, htmlAdditionalInfo);} + virtual void OnConfirmResizedServer(RackspaceEventType eventType, const char *htmlAdditionalInfo) {ExecuteDefault("OnConfirmResizedServer", eventType, htmlAdditionalInfo);} + virtual void OnRevertResizedServer(RackspaceEventType eventType, const char *htmlAdditionalInfo) {ExecuteDefault("OnRevertResizedServer", eventType, htmlAdditionalInfo);} + virtual void OnListFlavorsResult(RackspaceEventType eventType, const char *htmlAdditionalInfo) {ExecuteDefault("OnListFlavorsResult", eventType, htmlAdditionalInfo);} + virtual void OnGetFlavorDetailsResult(RackspaceEventType eventType, const char *htmlAdditionalInfo) {ExecuteDefault("OnGetFlavorDetailsResult", eventType, htmlAdditionalInfo);} + virtual void OnListImagesResult(RackspaceEventType eventType, const char *htmlAdditionalInfo) {ExecuteDefault("OnListImagesResult", eventType, htmlAdditionalInfo);} + virtual void OnCreateImageResult(RackspaceEventType eventType, const char *htmlAdditionalInfo) {ExecuteDefault("OnCreateImageResult", eventType, htmlAdditionalInfo);} + virtual void OnGetImageDetailsResult(RackspaceEventType eventType, const char *htmlAdditionalInfo) {ExecuteDefault("OnGetImageDetailsResult", eventType, htmlAdditionalInfo);} + virtual void OnDeleteImageResult(RackspaceEventType eventType, const char *htmlAdditionalInfo) {ExecuteDefault("OnDeleteImageResult", eventType, htmlAdditionalInfo);} + virtual void OnListSharedIPGroups(RackspaceEventType eventType, const char *htmlAdditionalInfo) {ExecuteDefault("OnListSharedIPGroups", eventType, htmlAdditionalInfo);} + virtual void OnListSharedIPGroupsWithDetails(RackspaceEventType eventType, const char *htmlAdditionalInfo) {ExecuteDefault("OnListSharedIPGroupsWithDetails", eventType, htmlAdditionalInfo);} + virtual void OnCreateSharedIPGroup(RackspaceEventType eventType, const char *htmlAdditionalInfo) {ExecuteDefault("OnCreateSharedIPGroup", eventType, htmlAdditionalInfo);} + virtual void OnGetSharedIPGroupDetails(RackspaceEventType eventType, const char *htmlAdditionalInfo) {ExecuteDefault("OnGetSharedIPGroupDetails", eventType, htmlAdditionalInfo);} + virtual void OnDeleteSharedIPGroup(RackspaceEventType eventType, const char *htmlAdditionalInfo) {ExecuteDefault("OnDeleteSharedIPGroup", eventType, htmlAdditionalInfo);} + + virtual void OnConnectionAttemptFailure(RackspaceOperationType operationType, const char *url) {(void) operationType; (void) url;} + }; + + /// \brief Code that uses the TCPInterface class to communicate with the Rackspace API servers + /// \pre Compile RakNet with OPEN_SSL_CLIENT_SUPPORT set to 1 + /// \pre Packets returned from TCPInterface::OnReceive() must be passed to Rackspace::OnReceive() + /// \pre Packets returned from TCPInterface::HasLostConnection() must be passed to Rackspace::OnClosedConnection() + class RAK_DLL_EXPORT Rackspace + { + public: + Rackspace(); + ~Rackspace(); + + /// \brief Authenticate with Rackspace servers, required before executing any commands. + /// \details All requests to authenticate and operate against Cloud Servers are performed using SSL over HTTP (HTTPS) on TCP port 443. + /// Times out after 24 hours - if you get RET_Authenticate_Unauthorized in the RackspaceEventCallback callback, call again + /// \sa RackspaceEventCallback::OnAuthenticationResult() + /// \param[in] _tcpInterface An instance of TCPInterface, build with OPEN_SSL_CLIENT_SUPPORT 1 and already started + /// \param[in] _authenticationURL See http://docs.rackspacecloud.com/servers/api/v1.0/cs-devguide-20110112.pdf . US-based accounts authenticate through auth.api.rackspacecloud.com. UK-based accounts authenticate through lon.auth.api.rackspacecloud.com + /// \param[in] _rackspaceCloudUsername Username you registered with Rackspace on their website + /// \param[in] _apiAccessKey Obtain your API access key from the Rackspace Cloud Control Panel in the Your Account API Access section. + /// \return The address of the authentication server, or UNASSIGNED_SYSTEM_ADDRESS if the connection attempt failed + SystemAddress Authenticate(TCPInterface *_tcpInterface, const char *_authenticationURL, const char *_rackspaceCloudUsername, const char *_apiAccessKey); + + /// \brief Get a list of running servers + /// \sa http://docs.rackspacecloud.com/servers/api/v1.0/cs-devguide-20110112.pdf + /// \sa RackspaceEventCallback::OnListServersResult() + void ListServers(void); + + /// \brief Get a list of running servers, with extended details on each server + /// \sa GetServerDetails() + /// \sa http://docs.rackspacecloud.com/servers/api/v1.0/cs-devguide-20110112.pdf + /// \sa RackspaceEventCallback::OnListServersWithDetailsResult() + void ListServersWithDetails(void); + + /// \brief Create a server + /// \details Create a server with a given image (harddrive contents) and flavor (hardware configuration) + /// Get the available images with ListImages() + /// Get the available flavors with ListFlavors() + /// It is possible to configure the server in more detail. See the XML schema at http://docs.rackspacecloud.com/servers/api/v1.0 + /// You can execute such a custom command by calling AddOperation() manually. See the implementation of CreateServer for how to do so. + /// The server takes a while to build. Call GetServerDetails() to get the current build status. Server id to pass to GetServerDetails() is returned in the field + /// \sa http://docs.rackspacecloud.com/servers/api/v1.0/cs-devguide-20110112.pdf + /// \sa RackspaceEventCallback::OnCreateServerResult() + /// \param[in] name Name of the server. Only alphanumeric characters, periods, and hyphens are valid. Server Name cannot start or end with a period or hyphen. + /// \param[in] imageId Which image (harddrive contents, including OS) to use + /// \param[in] flavorId Which flavor (hardware config) to use, primarily how much memory is available. + void CreateServer(RakNet::RakString name, RakNet::RakString imageId, RakNet::RakString flavorId); + + /// \brief Get details on a particular server + /// \sa http://docs.rackspacecloud.com/servers/api/v1.0/cs-devguide-20110112.pdf + /// \sa RackspaceEventCallback::OnGetServerDetailsResult() + /// \param[in] serverId Which server to get details on. You can call ListServers() to get the list of active servers. + void GetServerDetails(RakNet::RakString serverId); + + /// \brief Changes the name or password for a server + /// \sa http://docs.rackspacecloud.com/servers/api/v1.0/cs-devguide-20110112.pdf + /// \sa RackspaceEventCallback::OnUpdateServerNameOrPasswordResult() + /// \param[in] serverId Which server to get details on. You can call ListServers() to get the list of active servers. + /// \param[in] newName The new server name. Leave blank to leave unchanged. Only alphanumeric characters, periods, and hyphens are valid. Server Name cannot start or end with a period or hyphen. + /// \param[in] newPassword The new server password. Leave blank to leave unchanged. + void UpdateServerNameOrPassword(RakNet::RakString serverId, RakNet::RakString newName, RakNet::RakString newPassword); + + /// \brief Deletes a server + /// \sa http://docs.rackspacecloud.com/servers/api/v1.0/cs-devguide-20110112.pdf + /// \sa RackspaceEventCallback::OnDeleteServerResult() + /// \param[in] serverId Which server to get details on. You can call ListServers() to get the list of active servers. + void DeleteServer(RakNet::RakString serverId); + + /// \brief Lists the IP addresses available to a server + /// \sa http://docs.rackspacecloud.com/servers/api/v1.0/cs-devguide-20110112.pdf + /// \sa RackspaceEventCallback::OnListServerAddressesResult() + /// \param[in] serverId Which server to operate on. You can call ListServers() to get the list of active servers. + void ListServerAddresses(RakNet::RakString serverId); + + /// \brief Shares an IP address with a server + /// \sa http://docs.rackspacecloud.com/servers/api/v1.0/cs-devguide-20110112.pdf + /// \sa RackspaceEventCallback::OnShareServerAddressResult() + /// \param[in] serverId Which server to operate on. You can call ListServers() to get the list of active servers. + /// \param[in] ipAddress Which IP address. You can call ListServerAddresses() to get the list of addresses for the specified server + void ShareServerAddress(RakNet::RakString serverId, RakNet::RakString ipAddress); + + /// \brief Stops sharing an IP address with a server + /// \sa http://docs.rackspacecloud.com/servers/api/v1.0/cs-devguide-20110112.pdf + /// \sa RackspaceEventCallback::OnDeleteServerAddressResult() + /// \param[in] serverId Which server to operate on. You can call ListServers() to get the list of active servers. + /// \param[in] ipAddress Which IP address. You can call ListServerAddresses() to get the list of addresses for the specified server + void DeleteServerAddress(RakNet::RakString serverId, RakNet::RakString ipAddress); + + /// \brief Reboots a server + /// \sa http://docs.rackspacecloud.com/servers/api/v1.0/cs-devguide-20110112.pdf + /// \sa RackspaceEventCallback::OnRebootServerResult() + /// \param[in] serverId Which server to operate on. You can call ListServers() to get the list of active servers. + /// \param[in] rebootType Should be either "HARD" or "SOFT" + void RebootServer(RakNet::RakString serverId, RakNet::RakString rebootType); + + /// \brief Rebuilds a server with a different image (harddrive contents) + /// \sa http://docs.rackspacecloud.com/servers/api/v1.0/cs-devguide-20110112.pdf + /// \sa RackspaceEventCallback::OnRebuildServerResult() + /// \param[in] serverId Which server to operate on. You can call ListServers() to get the list of active servers. + /// \param[in] imageId Which image (harddrive contents, including OS) to use + void RebuildServer(RakNet::RakString serverId, RakNet::RakString imageId); + + /// \brief Changes the hardware configuration of a server. This does not take effect until you call ConfirmResizedServer() + /// \sa http://docs.rackspacecloud.com/servers/api/v1.0/cs-devguide-20110112.pdf + /// \sa RackspaceEventCallback::OnResizeServerResult() + /// \sa RevertResizedServer() + /// \param[in] serverId Which server to operate on. You can call ListServers() to get the list of active servers. + /// \param[in] flavorId Which flavor (hardware config) to use, primarily how much memory is available. + void ResizeServer(RakNet::RakString serverId, RakNet::RakString flavorId); + + /// \brief Confirm a resize for the specified server + /// \sa http://docs.rackspacecloud.com/servers/api/v1.0/cs-devguide-20110112.pdf + /// \sa RackspaceEventCallback::OnConfirmResizedServerResult() + /// \sa ResizeServer() + /// \param[in] serverId Which server to operate on. You can call ListServers() to get the list of active servers. + void ConfirmResizedServer(RakNet::RakString serverId); + + /// \brief Reverts a resize for the specified server + /// \sa http://docs.rackspacecloud.com/servers/api/v1.0/cs-devguide-20110112.pdf + /// \sa RackspaceEventCallback::OnRevertResizedServerResult() + /// \sa ResizeServer() + /// \param[in] serverId Which server to operate on. You can call ListServers() to get the list of active servers. + void RevertResizedServer(RakNet::RakString serverId); + + /// \brief List all flavors (hardware configs, primarily memory) + /// \sa http://docs.rackspacecloud.com/servers/api/v1.0/cs-devguide-20110112.pdf + /// \sa RackspaceEventCallback::OnListFlavorsResult() + void ListFlavors(void); + + /// \brief Get extended details about a specific flavor + /// \sa http://docs.rackspacecloud.com/servers/api/v1.0/cs-devguide-20110112.pdf + /// \sa RackspaceEventCallback::OnGetFlavorDetailsResult() + /// \sa ListFlavors() + /// \param[in] flavorId Which flavor (hardware config) + void GetFlavorDetails(RakNet::RakString flavorId); + + /// \brief List all images (software configs, including operating systems), which includes images you create yourself + /// \sa http://docs.rackspacecloud.com/servers/api/v1.0/cs-devguide-20110112.pdf + /// \sa RackspaceEventCallback::OnListImagesResult() + /// \sa CreateImage() + void ListImages(void); + + /// \brief Images a running server. This essentially copies the harddrive, and lets you start a server with the same harddrive contents later + /// \sa http://docs.rackspacecloud.com/servers/api/v1.0/cs-devguide-20110112.pdf + /// \sa RackspaceEventCallback::OnCreateImageResult() + /// \sa ListImages() + /// \param[in] serverId Which server to operate on. You can call ListServers() to get the list of active servers. + /// \param[in] imageName What to call this image + void CreateImage(RakNet::RakString serverId, RakNet::RakString imageName); + + /// \brief Get extended details about a particular image + /// \sa http://docs.rackspacecloud.com/servers/api/v1.0/cs-devguide-20110112.pdf + /// \sa RackspaceEventCallback::OnGetImageDetailsResult() + /// \sa ListImages() + /// \param[in] imageId Which image + void GetImageDetails(RakNet::RakString imageId); + + /// \brief Delete a custom image created with CreateImage() + /// \sa http://docs.rackspacecloud.com/servers/api/v1.0/cs-devguide-20110112.pdf + /// \sa RackspaceEventCallback::OnDeleteImageResult() + /// \sa ListImages() + /// \param[in] imageId Which image + void DeleteImage(RakNet::RakString imageId); + + /// \brief List IP groups + /// \sa http://docs.rackspacecloud.com/servers/api/v1.0/cs-devguide-20110112.pdf + /// \sa RackspaceEventCallback::OnListSharedIPGroupsResult() + void ListSharedIPGroups(void); + + /// \brief List IP groups with extended details + /// \sa http://docs.rackspacecloud.com/servers/api/v1.0/cs-devguide-20110112.pdf + /// \sa RackspaceEventCallback::OnListSharedIPGroupsWithDetailsResult() + void ListSharedIPGroupsWithDetails(void); + + // I don't know what this does + void CreateSharedIPGroup(RakNet::RakString name, RakNet::RakString optionalServerId); + // I don't know what this does + void GetSharedIPGroupDetails(RakNet::RakString groupId); + // I don't know what this does + void DeleteSharedIPGroup(RakNet::RakString groupId); + + /// \brief Adds a callback to the list of callbacks to be called when any of the above functions finish executing + /// The callbacks are called in the order they are added + void AddEventCallback(RackspaceEventCallback *callback); + /// \brief Removes a callback from the list of callbacks to be called when any of the above functions finish executing + /// The callbacks are called in the order they are added + void RemoveEventCallback(RackspaceEventCallback *callback); + /// \brief Removes all callbacks + void ClearEventCallbacks(void); + + /// Call this anytime TCPInterface returns a packet + void OnReceive(Packet *packet); + + /// Call this when TCPInterface returns something other than UNASSIGNED_SYSTEM_ADDRESS from HasLostConnection() + void OnClosedConnection(SystemAddress systemAddress); + + /// String representation of each RackspaceEventType + static const char * EventTypeToString(RackspaceEventType eventType); + + /// \brief Mostly for internal use, but you can use it to execute an operation with more complex xml if desired + /// See the Rackspace.cpp on how to use it + void AddOperation(RackspaceOperationType type, RakNet::RakString httpCommand, RakNet::RakString operation, RakNet::RakString xml); + protected: + + DataStructures::List eventCallbacks; + + struct RackspaceOperation + { + RackspaceOperationType type; + // RakNet::RakString stringInfo; + SystemAddress connectionAddress; + bool isPendingAuthentication; + RakNet::RakString incomingStream; + RakNet::RakString httpCommand; + RakNet::RakString operation; + RakNet::RakString xml; + }; + + TCPInterface *tcpInterface; + + // RackspaceOperationType currentOperation; + // DataStructures::Queue nextOperationQueue; + + DataStructures::List operations; + bool HasOperationOfType(RackspaceOperationType t); + unsigned int GetOperationOfTypeIndex(RackspaceOperationType t); + + RakNet::RakString serverManagementURL; + RakNet::RakString serverManagementDomain; + RakNet::RakString serverManagementPath; + RakNet::RakString storageURL; + RakNet::RakString storageDomain; + RakNet::RakString storagePath; + RakNet::RakString cdnManagementURL; + RakNet::RakString cdnManagementDomain; + RakNet::RakString cdnManagementPath; + + RakNet::RakString storageToken; + RakNet::RakString authToken; + RakNet::RakString rackspaceCloudUsername; + RakNet::RakString apiAccessKey; + + bool ExecuteOperation(RackspaceOperation &ro); + void ReadLine(const char *data, const char *stringStart, RakNet::RakString &output); + bool ConnectToServerManagementDomain(RackspaceOperation &ro); + + + }; + +} // namespace RakNet + +#endif // __RACKSPACE_API_H + +#endif // _RAKNET_SUPPORT_Rackspace diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakAlloca.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakAlloca.h new file mode 100644 index 0000000..1647f27 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakAlloca.h @@ -0,0 +1,16 @@ +#if defined(__FreeBSD__) +#include + + + + +#elif defined ( __APPLE__ ) || defined ( __APPLE_CC__ ) +#include +#include +#elif defined(_WIN32) +#include +#else +#include +// Alloca needed on Ubuntu apparently +#include +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakAssert.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakAssert.h new file mode 100644 index 0000000..f0cc96f --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakAssert.h @@ -0,0 +1,2 @@ +#include +#include "RakNetDefines.h" diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakMemoryOverride.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakMemoryOverride.cpp new file mode 100644 index 0000000..45d77ab --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakMemoryOverride.cpp @@ -0,0 +1,294 @@ +#include "RakMemoryOverride.h" +#include "RakAssert.h" +#include + +#ifdef _RAKNET_SUPPORT_DL_MALLOC +#include "rdlmalloc.h" +#endif + + + + + +using namespace RakNet; + +#if _USE_RAK_MEMORY_OVERRIDE==1 + #if defined(malloc) + #pragma push_macro("malloc") + #undef malloc + #define RMO_MALLOC_UNDEF + #endif + + #if defined(realloc) + #pragma push_macro("realloc") + #undef realloc + #define RMO_REALLOC_UNDEF + #endif + + #if defined(free) + #pragma push_macro("free") + #undef free + #define RMO_FREE_UNDEF + #endif +#endif + +void DefaultOutOfMemoryHandler(const char *file, const long line) +{ + (void) file; + (void) line; + RakAssert(0); +} + +void * (*rakMalloc) (size_t size) = RakNet::_RakMalloc; +void* (*rakRealloc) (void *p, size_t size) = RakNet::_RakRealloc; +void (*rakFree) (void *p) = RakNet::_RakFree; +void* (*rakMalloc_Ex) (size_t size, const char *file, unsigned int line) = RakNet::_RakMalloc_Ex; +void* (*rakRealloc_Ex) (void *p, size_t size, const char *file, unsigned int line) = RakNet::_RakRealloc_Ex; +void (*rakFree_Ex) (void *p, const char *file, unsigned int line) = RakNet::_RakFree_Ex; +void (*notifyOutOfMemory) (const char *file, const long line)=DefaultOutOfMemoryHandler; +void * (*dlMallocMMap) (size_t size) = RakNet::_DLMallocMMap; +void * (*dlMallocDirectMMap) (size_t size) = RakNet::_DLMallocDirectMMap; +int (*dlMallocMUnmap) (void* ptr, size_t size) = RakNet::_DLMallocMUnmap; + +void SetMalloc( void* (*userFunction)(size_t size) ) +{ + rakMalloc=userFunction; +} +void SetRealloc( void* (*userFunction)(void *p, size_t size) ) +{ + rakRealloc=userFunction; +} +void SetFree( void (*userFunction)(void *p) ) +{ + rakFree=userFunction; +} +void SetMalloc_Ex( void* (*userFunction)(size_t size, const char *file, unsigned int line) ) +{ + rakMalloc_Ex=userFunction; +} +void SetRealloc_Ex( void* (*userFunction)(void *p, size_t size, const char *file, unsigned int line) ) +{ + rakRealloc_Ex=userFunction; +} +void SetFree_Ex( void (*userFunction)(void *p, const char *file, unsigned int line) ) +{ + rakFree_Ex=userFunction; +} +void SetNotifyOutOfMemory( void (*userFunction)(const char *file, const long line) ) +{ + notifyOutOfMemory=userFunction; +} +void SetDLMallocMMap( void* (*userFunction)(size_t size) ) +{ + dlMallocMMap=userFunction; +} +void SetDLMallocDirectMMap( void* (*userFunction)(size_t size) ) +{ + dlMallocDirectMMap=userFunction; +} +void SetDLMallocMUnmap( int (*userFunction)(void* ptr, size_t size) ) +{ + dlMallocMUnmap=userFunction; +} +void * (*GetMalloc()) (size_t size) +{ + return rakMalloc; +} +void * (*GetRealloc()) (void *p, size_t size) +{ + return rakRealloc; +} +void (*GetFree()) (void *p) +{ + return rakFree; +} +void * (*GetMalloc_Ex()) (size_t size, const char *file, unsigned int line) +{ + return rakMalloc_Ex; +} +void * (*GetRealloc_Ex()) (void *p, size_t size, const char *file, unsigned int line) +{ + return rakRealloc_Ex; +} +void (*GetFree_Ex()) (void *p, const char *file, unsigned int line) +{ + return rakFree_Ex; +} +void *(*GetDLMallocMMap())(size_t size) +{ + return dlMallocMMap; +} +void *(*GetDLMallocDirectMMap())(size_t size) +{ + return dlMallocDirectMMap; +} +int (*GetDLMallocMUnmap())(void* ptr, size_t size) +{ + return dlMallocMUnmap; +} +void* RakNet::_RakMalloc (size_t size) +{ + return malloc(size); +} + +void* RakNet::_RakRealloc (void *p, size_t size) +{ + return realloc(p,size); +} + +void RakNet::_RakFree (void *p) +{ + free(p); +} + +void* RakNet::_RakMalloc_Ex (size_t size, const char *file, unsigned int line) +{ + (void) file; + (void) line; + + return malloc(size); +} + +void* RakNet::_RakRealloc_Ex (void *p, size_t size, const char *file, unsigned int line) +{ + (void) file; + (void) line; + + return realloc(p,size); +} + +void RakNet::_RakFree_Ex (void *p, const char *file, unsigned int line) +{ + (void) file; + (void) line; + + free(p); +} +#ifdef _RAKNET_SUPPORT_DL_MALLOC +void * RakNet::_DLMallocMMap (size_t size) +{ + return RAK_MMAP_DEFAULT(size); +} +void * RakNet::_DLMallocDirectMMap (size_t size) +{ + return RAK_DIRECT_MMAP_DEFAULT(size); +} +int RakNet::_DLMallocMUnmap (void *p, size_t size) +{ + return RAK_MUNMAP_DEFAULT(p,size); +} + +static mspace rakNetFixedHeapMSpace=0; + +void* _DLMalloc(size_t size) +{ + return rak_mspace_malloc(rakNetFixedHeapMSpace,size); +} + +void* _DLRealloc(void *p, size_t size) +{ + return rak_mspace_realloc(rakNetFixedHeapMSpace,p,size); +} + +void _DLFree(void *p) +{ + if (p) + rak_mspace_free(rakNetFixedHeapMSpace,p); +} +void* _DLMalloc_Ex (size_t size, const char *file, unsigned int line) +{ + (void) file; + (void) line; + + return rak_mspace_malloc(rakNetFixedHeapMSpace,size); +} + +void* _DLRealloc_Ex (void *p, size_t size, const char *file, unsigned int line) +{ + (void) file; + (void) line; + + return rak_mspace_realloc(rakNetFixedHeapMSpace,p,size); +} + +void _DLFree_Ex (void *p, const char *file, unsigned int line) +{ + (void) file; + (void) line; + + if (p) + rak_mspace_free(rakNetFixedHeapMSpace,p); +} + +void UseRaknetFixedHeap(size_t initialCapacity, + void * (*yourMMapFunction) (size_t size), + void * (*yourDirectMMapFunction) (size_t size), + int (*yourMUnmapFunction) (void *p, size_t size)) +{ + SetDLMallocMMap(yourMMapFunction); + SetDLMallocDirectMMap(yourDirectMMapFunction); + SetDLMallocMUnmap(yourMUnmapFunction); + SetMalloc(_DLMalloc); + SetRealloc(_DLRealloc); + SetFree(_DLFree); + SetMalloc_Ex(_DLMalloc_Ex); + SetRealloc_Ex(_DLRealloc_Ex); + SetFree_Ex(_DLFree_Ex); + + rakNetFixedHeapMSpace=rak_create_mspace(initialCapacity, 0); +} +void FreeRakNetFixedHeap(void) +{ + if (rakNetFixedHeapMSpace) + { + rak_destroy_mspace(rakNetFixedHeapMSpace); + rakNetFixedHeapMSpace=0; + } + + SetMalloc(_RakMalloc); + SetRealloc(_RakRealloc); + SetFree(_RakFree); + SetMalloc_Ex(_RakMalloc_Ex); + SetRealloc_Ex(_RakRealloc_Ex); + SetFree_Ex(_RakFree_Ex); +} +#else +void * RakNet::_DLMallocMMap (size_t size) {(void) size; return 0;} +void * RakNet::_DLMallocDirectMMap (size_t size) {(void) size; return 0;} +int RakNet::_DLMallocMUnmap (void *p, size_t size) {(void) size; (void) p; return 0;} +void* _DLMalloc(size_t size) {(void) size; return 0;} +void* _DLRealloc(void *p, size_t size) {(void) p; (void) size; return 0;} +void _DLFree(void *p) {(void) p;} +void* _DLMalloc_Ex (size_t size, const char *file, unsigned int line) {(void) size; (void) file; (void) line; return 0;} +void* _DLRealloc_Ex (void *p, size_t size, const char *file, unsigned int line) {(void) p; (void) size; (void) file; (void) line; return 0;} +void _DLFree_Ex (void *p, const char *file, unsigned int line) {(void) p; (void) file; (void) line;} + +void UseRaknetFixedHeap(size_t initialCapacity, + void * (*yourMMapFunction) (size_t size), + void * (*yourDirectMMapFunction) (size_t size), + int (*yourMUnmapFunction) (void *p, size_t size)) +{ + (void) initialCapacity; + (void) yourMMapFunction; + (void) yourDirectMMapFunction; + (void) yourMUnmapFunction; +} +void FreeRakNetFixedHeap(void) {} +#endif + +#if _USE_RAK_MEMORY_OVERRIDE==1 + + #pragma pop_macro("malloc") + #undef RMO_MALLOC_UNDEF + + + + #pragma pop_macro("realloc") + #undef RMO_REALLOC_UNDEF + + + + #pragma pop_macro("free") + #undef RMO_FREE_UNDEF + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakMemoryOverride.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakMemoryOverride.h new file mode 100644 index 0000000..5eb84b8 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakMemoryOverride.h @@ -0,0 +1,236 @@ +/// \file +/// \brief If _USE_RAK_MEMORY_OVERRIDE is defined, memory allocations go through rakMalloc, rakRealloc, and rakFree +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __RAK_MEMORY_H +#define __RAK_MEMORY_H + +#include "Export.h" +#include "RakNetDefines.h" +#include + + + + + + + +#include "RakAlloca.h" + +// #if _USE_RAK_MEMORY_OVERRIDE==1 +// #if defined(new) +// #pragma push_macro("new") +// #undef new +// #define RMO_NEW_UNDEF +// #endif +// #endif + + +// These pointers are statically and globally defined in RakMemoryOverride.cpp +// Change them to point to your own allocators if you want. +// Use the functions for a DLL, or just reassign the variable if using source +extern RAK_DLL_EXPORT void * (*rakMalloc) (size_t size); +extern RAK_DLL_EXPORT void * (*rakRealloc) (void *p, size_t size); +extern RAK_DLL_EXPORT void (*rakFree) (void *p); +extern RAK_DLL_EXPORT void * (*rakMalloc_Ex) (size_t size, const char *file, unsigned int line); +extern RAK_DLL_EXPORT void * (*rakRealloc_Ex) (void *p, size_t size, const char *file, unsigned int line); +extern RAK_DLL_EXPORT void (*rakFree_Ex) (void *p, const char *file, unsigned int line); +extern RAK_DLL_EXPORT void (*notifyOutOfMemory) (const char *file, const long line); +extern RAK_DLL_EXPORT void * (*dlMallocMMap) (size_t size); +extern RAK_DLL_EXPORT void * (*dlMallocDirectMMap) (size_t size); +extern RAK_DLL_EXPORT int (*dlMallocMUnmap) (void* ptr, size_t size); + +// Change to a user defined allocation function +void RAK_DLL_EXPORT SetMalloc( void* (*userFunction)(size_t size) ); +void RAK_DLL_EXPORT SetRealloc( void* (*userFunction)(void *p, size_t size) ); +void RAK_DLL_EXPORT SetFree( void (*userFunction)(void *p) ); +void RAK_DLL_EXPORT SetMalloc_Ex( void* (*userFunction)(size_t size, const char *file, unsigned int line) ); +void RAK_DLL_EXPORT SetRealloc_Ex( void* (*userFunction)(void *p, size_t size, const char *file, unsigned int line) ); +void RAK_DLL_EXPORT SetFree_Ex( void (*userFunction)(void *p, const char *file, unsigned int line) ); +// Change to a user defined out of memory function +void RAK_DLL_EXPORT SetNotifyOutOfMemory( void (*userFunction)(const char *file, const long line) ); +void RAK_DLL_EXPORT SetDLMallocMMap( void* (*userFunction)(size_t size) ); +void RAK_DLL_EXPORT SetDLMallocDirectMMap( void* (*userFunction)(size_t size) ); +void RAK_DLL_EXPORT SetDLMallocMUnmap( int (*userFunction)(void* ptr, size_t size) ); + +extern RAK_DLL_EXPORT void * (*GetMalloc()) (size_t size); +extern RAK_DLL_EXPORT void * (*GetRealloc()) (void *p, size_t size); +extern RAK_DLL_EXPORT void (*GetFree()) (void *p); +extern RAK_DLL_EXPORT void * (*GetMalloc_Ex()) (size_t size, const char *file, unsigned int line); +extern RAK_DLL_EXPORT void * (*GetRealloc_Ex()) (void *p, size_t size, const char *file, unsigned int line); +extern RAK_DLL_EXPORT void (*GetFree_Ex()) (void *p, const char *file, unsigned int line); +extern RAK_DLL_EXPORT void *(*GetDLMallocMMap())(size_t size); +extern RAK_DLL_EXPORT void *(*GetDLMallocDirectMMap())(size_t size); +extern RAK_DLL_EXPORT int (*GetDLMallocMUnmap())(void* ptr, size_t size); + +namespace RakNet +{ + + template + RAK_DLL_EXPORT Type* OP_NEW(const char *file, unsigned int line) + { +#if _USE_RAK_MEMORY_OVERRIDE==1 + char *buffer = (char *) (GetMalloc_Ex())(sizeof(Type), file, line); + Type *t = new (buffer) Type; + return t; +#else + (void) file; + (void) line; + return new Type; +#endif + } + + template + RAK_DLL_EXPORT Type* OP_NEW_1(const char *file, unsigned int line, const P1 &p1) + { +#if _USE_RAK_MEMORY_OVERRIDE==1 + char *buffer = (char *) (GetMalloc_Ex())(sizeof(Type), file, line); + Type *t = new (buffer) Type(p1); + return t; +#else + (void) file; + (void) line; + return new Type(p1); +#endif + } + + template + RAK_DLL_EXPORT Type* OP_NEW_2(const char *file, unsigned int line, const P1 &p1, const P2 &p2) + { +#if _USE_RAK_MEMORY_OVERRIDE==1 + char *buffer = (char *) (GetMalloc_Ex())(sizeof(Type), file, line); + Type *t = new (buffer) Type(p1, p2); + return t; +#else + (void) file; + (void) line; + return new Type(p1, p2); +#endif + } + + template + RAK_DLL_EXPORT Type* OP_NEW_3(const char *file, unsigned int line, const P1 &p1, const P2 &p2, const P3 &p3) + { +#if _USE_RAK_MEMORY_OVERRIDE==1 + char *buffer = (char *) (GetMalloc_Ex())(sizeof(Type), file, line); + Type *t = new (buffer) Type(p1, p2, p3); + return t; +#else + (void) file; + (void) line; + return new Type(p1, p2, p3); +#endif + } + + template + RAK_DLL_EXPORT Type* OP_NEW_4(const char *file, unsigned int line, const P1 &p1, const P2 &p2, const P3 &p3, const P4 &p4) + { +#if _USE_RAK_MEMORY_OVERRIDE==1 + char *buffer = (char *) (GetMalloc_Ex())(sizeof(Type), file, line); + Type *t = new (buffer) Type(p1, p2, p3, p4); + return t; +#else + (void) file; + (void) line; + return new Type(p1, p2, p3, p4); +#endif + } + + + template + RAK_DLL_EXPORT Type* OP_NEW_ARRAY(const int count, const char *file, unsigned int line) + { + if (count==0) + return 0; + +#if _USE_RAK_MEMORY_OVERRIDE==1 +// Type *t; + char *buffer = (char *) (GetMalloc_Ex())(sizeof(int)+sizeof(Type)*count, file, line); + ((int*)buffer)[0]=count; + for (int i=0; i + RAK_DLL_EXPORT void OP_DELETE(Type *buff, const char *file, unsigned int line) + { +#if _USE_RAK_MEMORY_OVERRIDE==1 + if (buff==0) return; + buff->~Type(); + (GetFree_Ex())((char*)buff, file, line ); +#else + (void) file; + (void) line; + delete buff; +#endif + + } + + template + RAK_DLL_EXPORT void OP_DELETE_ARRAY(Type *buff, const char *file, unsigned int line) + { +#if _USE_RAK_MEMORY_OVERRIDE==1 + if (buff==0) + return; + + int count = ((int*)((char*)buff-sizeof(int)))[0]; + Type *t; + for (int i=0; i~Type(); + } + (GetFree_Ex())((char*)buff-sizeof(int), file, line ); +#else + (void) file; + (void) line; + delete [] buff; +#endif + + } + + void RAK_DLL_EXPORT * _RakMalloc (size_t size); + void RAK_DLL_EXPORT * _RakRealloc (void *p, size_t size); + void RAK_DLL_EXPORT _RakFree (void *p); + void RAK_DLL_EXPORT * _RakMalloc_Ex (size_t size, const char *file, unsigned int line); + void RAK_DLL_EXPORT * _RakRealloc_Ex (void *p, size_t size, const char *file, unsigned int line); + void RAK_DLL_EXPORT _RakFree_Ex (void *p, const char *file, unsigned int line); + void RAK_DLL_EXPORT * _DLMallocMMap (size_t size); + void RAK_DLL_EXPORT * _DLMallocDirectMMap (size_t size); + int RAK_DLL_EXPORT _DLMallocMUnmap (void *p, size_t size); + +} + +// Call to make RakNet allocate a large block of memory, and do all subsequent allocations in that memory block +// Initial and reallocations will be done through whatever function is pointed to by yourMMapFunction, and yourDirectMMapFunction (default is malloc) +// Allocations will be freed through whatever function is pointed to by yourMUnmapFunction (default free) +void UseRaknetFixedHeap(size_t initialCapacity, + void * (*yourMMapFunction) (size_t size) = RakNet::_DLMallocMMap, + void * (*yourDirectMMapFunction) (size_t size) = RakNet::_DLMallocDirectMMap, + int (*yourMUnmapFunction) (void *p, size_t size) = RakNet::_DLMallocMUnmap); + +// Free memory allocated from UseRaknetFixedHeap +void FreeRakNetFixedHeap(void); + +// #if _USE_RAK_MEMORY_OVERRIDE==1 +// #if defined(RMO_NEW_UNDEF) +// #pragma pop_macro("new") +// #undef RMO_NEW_UNDEF +// #endif +// #endif + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNet.vcproj b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNet.vcproj new file mode 100644 index 0000000..78bd057 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNet.vcproj @@ -0,0 +1,845 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetCommandParser.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetCommandParser.cpp new file mode 100644 index 0000000..f572d54 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetCommandParser.cpp @@ -0,0 +1,302 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_RakNetCommandParser==1 + +#include "RakNetCommandParser.h" +#include "TransportInterface.h" +#include "RakPeerInterface.h" +#include "BitStream.h" +#include "RakAssert.h" +#include +#include +#include + +#ifdef _MSC_VER +#pragma warning( push ) +#endif + +using namespace RakNet; + +STATIC_FACTORY_DEFINITIONS(RakNetCommandParser,RakNetCommandParser); + +RakNetCommandParser::RakNetCommandParser() +{ + RegisterCommand(4, "Startup","( unsigned short maxConnections, unsigned short localPort, const char *forceHostAddress );"); + RegisterCommand(0,"InitializeSecurity","();"); + RegisterCommand(0,"DisableSecurity","( void );"); + RegisterCommand(1,"AddToSecurityExceptionList","( const char *ip );"); + RegisterCommand(1,"RemoveFromSecurityExceptionList","( const char *ip );"); + RegisterCommand(1,"IsInSecurityExceptionList","( const char *ip );"); + RegisterCommand(1,"SetMaximumIncomingConnections","( unsigned short numberAllowed );"); + RegisterCommand(0,"GetMaximumIncomingConnections","( void ) const;"); + RegisterCommand(4,"Connect","( const char* host, unsigned short remotePort, const char *passwordData, int passwordDataLength );"); + RegisterCommand(2,"Disconnect","( unsigned int blockDuration, unsigned char orderingChannel=0 );"); + RegisterCommand(0,"IsActive","( void ) const;"); + RegisterCommand(0,"GetConnectionList","() const;"); + RegisterCommand(3,"CloseConnection","( const SystemAddress target, bool sendDisconnectionNotification, unsigned char orderingChannel=0 );"); + RegisterCommand(2,"IsConnected","( );"); + RegisterCommand(1,"GetIndexFromSystemAddress","( const SystemAddress systemAddress );"); + RegisterCommand(1,"GetSystemAddressFromIndex","( int index );"); + RegisterCommand(2,"AddToBanList","( const char *IP, RakNet::TimeMS milliseconds=0 );"); + RegisterCommand(1,"RemoveFromBanList","( const char *IP );"); + RegisterCommand(0,"ClearBanList","( void );"); + RegisterCommand(1,"IsBanned","( const char *IP );"); + RegisterCommand(1,"Ping1","( const SystemAddress target );"); + RegisterCommand(3,"Ping2","( const char* host, unsigned short remotePort, bool onlyReplyOnAcceptingConnections );"); + RegisterCommand(1,"GetAveragePing","( const SystemAddress systemAddress );"); + RegisterCommand(1,"GetLastPing","( const SystemAddress systemAddress ) const;"); + RegisterCommand(1,"GetLowestPing","( const SystemAddress systemAddress ) const;"); + RegisterCommand(1,"SetOccasionalPing","( bool doPing );"); + RegisterCommand(2,"SetOfflinePingResponse","( const char *data, const unsigned int length );"); + RegisterCommand(0,"GetInternalID","( void ) const;"); + RegisterCommand(1,"GetExternalID","( const SystemAddress target ) const;"); + RegisterCommand(2,"SetTimeoutTime","( RakNet::TimeMS timeMS, const SystemAddress target );"); +// RegisterCommand(1,"SetMTUSize","( int size );"); + RegisterCommand(0,"GetMTUSize","( void ) const;"); + RegisterCommand(0,"GetNumberOfAddresses","( void );"); + RegisterCommand(1,"GetLocalIP","( unsigned int index );"); + RegisterCommand(1,"AllowConnectionResponseIPMigration","( bool allow );"); + RegisterCommand(4,"AdvertiseSystem","( const char *host, unsigned short remotePort, const char *data, int dataLength );"); + RegisterCommand(2,"SetIncomingPassword","( const char* passwordData, int passwordDataLength );"); + RegisterCommand(0,"GetIncomingPassword","( void );"); + RegisterCommand(0,"IsNetworkSimulatorActive","( void );"); +} +RakNetCommandParser::~RakNetCommandParser() +{ +} +void RakNetCommandParser::SetRakPeerInterface(RakNet::RakPeerInterface *rakPeer) +{ + peer=rakPeer; +} +bool RakNetCommandParser::OnCommand(const char *command, unsigned numParameters, char **parameterList, TransportInterface *transport, const SystemAddress &systemAddress, const char *originalString) +{ + (void) originalString; + (void) numParameters; + + if (peer==0) + return false; + + if (strcmp(command, "Startup")==0) + { + RakNet::SocketDescriptor socketDescriptor((unsigned short)atoi(parameterList[1]), parameterList[2]); + ReturnResult(peer->Startup((unsigned short)atoi(parameterList[0]), &socketDescriptor, 1), command, transport, systemAddress); + } + else if (strcmp(command, "InitializeSecurity")==0) + { + ReturnResult(peer->InitializeSecurity(parameterList[0],parameterList[1]), command, transport, systemAddress); + } + else if (strcmp(command, "DisableSecurity")==0) + { + peer->DisableSecurity(); + ReturnResult(command, transport, systemAddress); + } + else if (strcmp(command, "AddToSecurityExceptionList")==0) + { + peer->AddToSecurityExceptionList(parameterList[1]); + ReturnResult(command, transport, systemAddress); + } + else if (strcmp(command, "RemoveFromSecurityExceptionList")==0) + { + peer->RemoveFromSecurityExceptionList(parameterList[1]); + ReturnResult(command, transport, systemAddress); + } + else if (strcmp(command, "IsInSecurityExceptionList")==0) + { + ReturnResult(peer->IsInSecurityExceptionList(parameterList[1]),command, transport, systemAddress); + } + else if (strcmp(command, "SetMaximumIncomingConnections")==0) + { + peer->SetMaximumIncomingConnections((unsigned short)atoi(parameterList[0])); + ReturnResult(command, transport, systemAddress); + } + else if (strcmp(command, "GetMaximumIncomingConnections")==0) + { + ReturnResult(peer->GetMaximumIncomingConnections(), command, transport, systemAddress); + } + else if (strcmp(command, "Connect")==0) + { + ReturnResult(peer->Connect(parameterList[0], (unsigned short)atoi(parameterList[1]),parameterList[2],atoi(parameterList[3]))==RakNet::CONNECTION_ATTEMPT_STARTED, command, transport, systemAddress); + } + else if (strcmp(command, "Disconnect")==0) + { + peer->Shutdown(atoi(parameterList[0]), (unsigned char)atoi(parameterList[1])); + ReturnResult(command, transport, systemAddress); + } + else if (strcmp(command, "IsActive")==0) + { + ReturnResult(peer->IsActive(), command, transport, systemAddress); + } + else if (strcmp(command, "GetConnectionList")==0) + { + SystemAddress remoteSystems[32]; + unsigned short count=32; + unsigned i; + if (peer->GetConnectionList(remoteSystems, &count)) + { + if (count==0) + { + transport->Send(systemAddress, "GetConnectionList() returned no systems connected.\r\n"); + } + else + { + transport->Send(systemAddress, "GetConnectionList() returned:\r\n"); + for (i=0; i < count; i++) + { + char str1[64]; + remoteSystems[i].ToString(true, str1); + transport->Send(systemAddress, "%i %s\r\n", i, str1); + } + } + } + else + transport->Send(systemAddress, "GetConnectionList() returned false.\r\n"); + } + else if (strcmp(command, "CloseConnection")==0) + { + peer->CloseConnection(SystemAddress(parameterList[0]), atoi(parameterList[1])!=0,(unsigned char)atoi(parameterList[2])); + ReturnResult(command, transport, systemAddress); + } + else if (strcmp(command, "GetConnectionState")==0) + { + ReturnResult((int) peer->GetConnectionState(SystemAddress(parameterList[0])), command, transport, systemAddress); + } + else if (strcmp(command, "GetIndexFromSystemAddress")==0) + { + ReturnResult(peer->GetIndexFromSystemAddress(SystemAddress(parameterList[0])), command, transport, systemAddress); + } + else if (strcmp(command, "GetSystemAddressFromIndex")==0) + { + ReturnResult(peer->GetSystemAddressFromIndex(atoi(parameterList[0])), command, transport, systemAddress); + } + else if (strcmp(command, "AddToBanList")==0) + { + peer->AddToBanList(parameterList[0], atoi(parameterList[1])); + ReturnResult(command, transport, systemAddress); + } + else if (strcmp(command, "RemoveFromBanList")==0) + { + peer->RemoveFromBanList(parameterList[0]); + ReturnResult(command, transport, systemAddress); + } + else if (strcmp(command, "ClearBanList")==0) + { + peer->ClearBanList(); + ReturnResult(command, transport, systemAddress); + } + else if (strcmp(command, "IsBanned")==0) + { + ReturnResult(peer->IsBanned(parameterList[0]), command, transport, systemAddress); + } + else if (strcmp(command, "Ping1")==0) + { + peer->Ping(SystemAddress(parameterList[0])); + ReturnResult(command, transport, systemAddress); + } + else if (strcmp(command, "Ping2")==0) + { + peer->Ping(parameterList[0], (unsigned short) atoi(parameterList[1]), atoi(parameterList[2])!=0); + ReturnResult(command, transport, systemAddress); + } + else if (strcmp(command, "GetAveragePing")==0) + { + ReturnResult(peer->GetAveragePing(SystemAddress(parameterList[0])), command, transport, systemAddress); + } + else if (strcmp(command, "GetLastPing")==0) + { + ReturnResult(peer->GetLastPing(SystemAddress(parameterList[0])), command, transport, systemAddress); + } + else if (strcmp(command, "GetLowestPing")==0) + { + ReturnResult(peer->GetLowestPing(SystemAddress(parameterList[0])), command, transport, systemAddress); + } + else if (strcmp(command, "SetOccasionalPing")==0) + { + peer->SetOccasionalPing(atoi(parameterList[0])!=0); + ReturnResult(command, transport, systemAddress); + } + else if (strcmp(command, "SetOfflinePingResponse")==0) + { + peer->SetOfflinePingResponse(parameterList[0], atoi(parameterList[1])); + ReturnResult(command, transport, systemAddress); + } + else if (strcmp(command, "GetInternalID")==0) + { + ReturnResult(peer->GetInternalID(), command, transport, systemAddress); + } + else if (strcmp(command, "GetExternalID")==0) + { + ReturnResult(peer->GetExternalID(SystemAddress(parameterList[0])), command, transport, systemAddress); + } + else if (strcmp(command, "SetTimeoutTime")==0) + { + peer->SetTimeoutTime(atoi(parameterList[0]), SystemAddress(parameterList[1])); + ReturnResult(command, transport, systemAddress); + } + /* + else if (strcmp(command, "SetMTUSize")==0) + { + ReturnResult(peer->SetMTUSize(atoi(parameterList[0]), UNASSIGNED_SYSTEM_ADDRESS), command, transport, systemAddress); + } + */ + else if (strcmp(command, "GetMTUSize")==0) + { + ReturnResult(peer->GetMTUSize(UNASSIGNED_SYSTEM_ADDRESS), command, transport, systemAddress); + } + else if (strcmp(command, "GetNumberOfAddresses")==0) + { + ReturnResult((int)peer->GetNumberOfAddresses(), command, transport, systemAddress); + } + else if (strcmp(command, "GetLocalIP")==0) + { + ReturnResult((char*) peer->GetLocalIP(atoi(parameterList[0])), command, transport, systemAddress); + } + else if (strcmp(command, "AllowConnectionResponseIPMigration")==0) + { + peer->AllowConnectionResponseIPMigration(atoi(parameterList[0])!=0); + ReturnResult(command, transport, systemAddress); + } + else if (strcmp(command, "AdvertiseSystem")==0) + { + peer->AdvertiseSystem(parameterList[0], (unsigned short) atoi(parameterList[1]),parameterList[2],atoi(parameterList[3])); + ReturnResult(command, transport, systemAddress); + } + else if (strcmp(command, "SetIncomingPassword")==0) + { + peer->SetIncomingPassword(parameterList[0], atoi(parameterList[1])); + ReturnResult(command, transport, systemAddress); + } + else if (strcmp(command, "GetIncomingPassword")==0) + { + char password[256]; + int passwordLength; + peer->GetIncomingPassword(password, &passwordLength); + if (passwordLength) + ReturnResult((char*)password, command, transport, systemAddress); + else + ReturnResult(0, command, transport, systemAddress); + } + + return true; +} +const char *RakNetCommandParser::GetName(void) const +{ + return "RakNet"; +} +void RakNetCommandParser::SendHelp(TransportInterface *transport, const SystemAddress &systemAddress) +{ + if (peer) + { + transport->Send(systemAddress, "The RakNet parser provides mirror functions to RakPeer\r\n"); + transport->Send(systemAddress, "SystemAddresss take two parameters: send .\r\n"); + transport->Send(systemAddress, "For bool, send 1 or 0.\r\n"); + } + else + { + transport->Send(systemAddress, "Parser not active. Call SetRakPeerInterface.\r\n"); + } +} + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetCommandParser.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetCommandParser.h new file mode 100644 index 0000000..4760291 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetCommandParser.h @@ -0,0 +1,63 @@ +/// \file +/// \brief Contains RakNetCommandParser , used to send commands to an instance of RakPeer +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_RakNetCommandParser==1 + +#ifndef __RAKNET_COMMAND_PARSER +#define __RAKNET_COMMAND_PARSER + +#include "CommandParserInterface.h" +#include "Export.h" + +namespace RakNet +{ +class RakPeerInterface; + +/// \brief This allows a console client to call most of the functions in RakPeer +class RAK_DLL_EXPORT RakNetCommandParser : public CommandParserInterface +{ +public: + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(RakNetCommandParser) + + RakNetCommandParser(); + ~RakNetCommandParser(); + + /// Given \a command with parameters \a parameterList , do whatever processing you wish. + /// \param[in] command The command to process + /// \param[in] numParameters How many parameters were passed along with the command + /// \param[in] parameterList The list of parameters. parameterList[0] is the first parameter and so on. + /// \param[in] transport The transport interface we can use to write to + /// \param[in] systemAddress The player that sent this command. + /// \param[in] originalString The string that was actually sent over the network, in case you want to do your own parsing + bool OnCommand(const char *command, unsigned numParameters, char **parameterList, TransportInterface *transport, const SystemAddress &systemAddress, const char *originalString); + + /// You are responsible for overriding this function and returning a static string, which will identifier your parser. + /// This should return a static string + /// \return The name that you return. + const char *GetName(void) const; + + /// A callback for when you are expected to send a brief description of your parser to \a systemAddress + /// \param[in] transport The transport interface we can use to write to + /// \param[in] systemAddress The player that requested help. + void SendHelp(TransportInterface *transport, const SystemAddress &systemAddress); + + /// Records the instance of RakPeer to perform the desired commands on + /// \param[in] rakPeer The RakPeer instance, or a derived class (e.g. RakPeer or RakPeer) + void SetRakPeerInterface(RakNet::RakPeerInterface *rakPeer); +protected: + + /// Which instance of RakPeer we are working on. Set from SetRakPeerInterface() + RakPeerInterface *peer; +}; + +} // namespace RakNet + +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetDefines.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetDefines.h new file mode 100644 index 0000000..a0d1cfe --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetDefines.h @@ -0,0 +1,169 @@ +#ifndef __RAKNET_DEFINES_H +#define __RAKNET_DEFINES_H + +// If you want to change these defines, put them in RakNetDefinesOverrides so your changes are not lost when updating RakNet +// The user should not edit this file +#include "RakNetDefinesOverrides.h" + +/// Define __GET_TIME_64BIT to have RakNet::TimeMS use a 64, rather than 32 bit value. A 32 bit value will overflow after about 5 weeks. +/// However, this doubles the bandwidth use for sending times, so don't do it unless you have a reason to. +/// Comment out if you are using the iPod Touch TG. See http://www.jenkinssoftware.com/forum/index.php?topic=2717.0 +/// This must be the same on all systems, or they won't connect +#ifndef __GET_TIME_64BIT +#define __GET_TIME_64BIT 1 +#endif + +// Define _FILE_AND_LINE_ to "",0 if you want to strip out file and line info for memory tracking from the EXE +#ifndef _FILE_AND_LINE_ +#define _FILE_AND_LINE_ __FILE__,__LINE__ +#endif + +/// Define __BITSTREAM_NATIVE_END to NOT support endian swapping in the BitStream class. This is faster and is what you should use +/// unless you actually plan to have different endianness systems connect to each other +/// Enabled by default. +// #define __BITSTREAM_NATIVE_END + +/// Maximum (stack) size to use with _alloca before using new and delete instead. +#ifndef MAX_ALLOCA_STACK_ALLOCATION +#define MAX_ALLOCA_STACK_ALLOCATION 1048576 +#endif + +// Use WaitForSingleObject instead of sleep. +// Defining it plays nicer with other systems, and uses less CPU, but gives worse RakNet performance +// Undefining it uses more CPU time, but is more responsive and faster. +#ifndef _WIN32_WCE +#define USE_WAIT_FOR_MULTIPLE_EVENTS +#endif + +/// Uncomment to use RakMemoryOverride for custom memory tracking +/// See RakMemoryOverride.h. +#ifndef _USE_RAK_MEMORY_OVERRIDE +#define _USE_RAK_MEMORY_OVERRIDE 0 +#endif + +/// If defined, OpenSSL is enabled for the class TCPInterface +/// This is necessary to use the SendEmail class with Google POP servers +/// Note that OpenSSL carries its own license restrictions that you should be aware of. If you don't agree, don't enable this define +/// This also requires that you enable header search paths to DependentExtensions\openssl-0.9.8g +// #define OPEN_SSL_CLIENT_SUPPORT +#ifndef OPEN_SSL_CLIENT_SUPPORT +#define OPEN_SSL_CLIENT_SUPPORT 0 +#endif + +/// Threshold at which to do a malloc / free rather than pushing data onto a fixed stack for the bitstream class +/// Arbitrary size, just picking something likely to be larger than most packets +#ifndef BITSTREAM_STACK_ALLOCATION_SIZE +#define BITSTREAM_STACK_ALLOCATION_SIZE 256 +#endif + +// Redefine if you want to disable or change the target for debug RAKNET_DEBUG_PRINTF +#ifndef RAKNET_DEBUG_PRINTF +#define RAKNET_DEBUG_PRINTF printf +#endif + +// Maximum number of local IP addresses supported +#ifndef MAXIMUM_NUMBER_OF_INTERNAL_IDS +#define MAXIMUM_NUMBER_OF_INTERNAL_IDS 10 +#endif + +#ifndef RakAssert + + + + +#if defined(_DEBUG) +#define RakAssert(x) assert(x); +#else +#define RakAssert(x) +#endif + +#endif + +/// This controls the amount of memory used per connection. +/// This many datagrams are tracked by datagramNumber. If more than this many datagrams are sent, then an ack for an older datagram would be ignored +/// This results in an unnecessary resend in that case +#ifndef DATAGRAM_MESSAGE_ID_ARRAY_LENGTH +#define DATAGRAM_MESSAGE_ID_ARRAY_LENGTH 512 +#endif + +/// This is the maximum number of reliable user messages that can be on the wire at a time +/// If this is too low, then high ping connections with a large throughput will be underutilized +/// This will be evident because RakNetStatistics::messagesInSend buffer will increase over time, yet at the same time the outgoing bandwidth per second is less than your connection supports +#ifndef RESEND_BUFFER_ARRAY_LENGTH +#define RESEND_BUFFER_ARRAY_LENGTH 512 +#define RESEND_BUFFER_ARRAY_MASK 511 +#endif + +/// Uncomment if you want to link in the DLMalloc library to use with RakMemoryOverride +// #define _LINK_DL_MALLOC + +#ifndef GET_TIME_SPIKE_LIMIT +/// Workaround for http://support.microsoft.com/kb/274323 +/// If two calls between RakNet::GetTime() happen farther apart than this time in microseconds, this delta will be returned instead +/// Note: This will cause ID_TIMESTAMP to be temporarily inaccurate if you set a breakpoint that pauses the UpdateNetworkLoop() thread in RakPeer +/// Define in RakNetDefinesOverrides.h to enable (non-zero) or disable (0) +#define GET_TIME_SPIKE_LIMIT 0 +#endif + +// Use sliding window congestion control instead of ping based congestion control +#ifndef USE_SLIDING_WINDOW_CONGESTION_CONTROL +#define USE_SLIDING_WINDOW_CONGESTION_CONTROL 1 +#endif + +// When a large message is arriving, preallocate the memory for the entire block +// This results in large messages not taking up time to reassembly with memcpy, but is vulnerable to attackers causing the host to run out of memory +#ifndef PREALLOCATE_LARGE_MESSAGES +#define PREALLOCATE_LARGE_MESSAGES 0 +#endif + +#ifndef RAKNET_SUPPORT_IPV6 +#define RAKNET_SUPPORT_IPV6 0 +#endif + + + + + + + + + + + +#ifndef RAKSTRING_TYPE +#if defined(_UNICODE) +#define RAKSTRING_TYPE RakWString +#define RAKSTRING_TYPE_IS_UNICODE 1 +#else +#define RAKSTRING_TYPE RakString +#define RAKSTRING_TYPE_IS_UNICODE 0 +#endif +#endif + +#ifndef RPC4_GLOBAL_REGISTRATION_MAX_FUNCTIONS +#define RPC4_GLOBAL_REGISTRATION_MAX_FUNCTIONS 32 +#endif + +#ifndef RPC4_GLOBAL_REGISTRATION_MAX_FUNCTION_NAME_LENGTH +#define RPC4_GLOBAL_REGISTRATION_MAX_FUNCTION_NAME_LENGTH 32 +#endif + +#ifndef XBOX_BYPASS_SECURITY +#define XBOX_BYPASS_SECURITY 1 +#endif + +// Controls how many allocations occur at once for the memory pool of incoming datagrams waiting to be transferred between the recvfrom thread and the main update thread +// Has large effect on memory usage, per instance of RakPeer. Approximately MAXIMUM_MTU_SIZE*BUFFERED_PACKETS_PAGE_SIZE bytes, once after calling RakPeer::Startup() +#ifndef BUFFERED_PACKETS_PAGE_SIZE +#define BUFFERED_PACKETS_PAGE_SIZE 8 +#endif + +// Controls how many allocations occur at once for the memory pool of incoming or outgoing datagrams. +// Has small effect on memory usage per connection. Uses about 256 bytes*INTERNAL_PACKET_PAGE_SIZE per connection +#ifndef INTERNAL_PACKET_PAGE_SIZE +#define INTERNAL_PACKET_PAGE_SIZE 8 +#endif + +//#define USE_THREADED_SEND + +#endif // __RAKNET_DEFINES_H diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetDefinesOverrides.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetDefinesOverrides.h new file mode 100644 index 0000000..913357a --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetDefinesOverrides.h @@ -0,0 +1,2 @@ +// USER EDITABLE FILE + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetSmartPtr.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetSmartPtr.h new file mode 100644 index 0000000..4e5a8d7 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetSmartPtr.h @@ -0,0 +1,173 @@ +#ifndef __RAKNET_SMART_PTR_H +#define __RAKNET_SMART_PTR_H + +// From http://www.codeproject.com/KB/cpp/SmartPointers.aspx +// with bugs fixed + +#include "RakMemoryOverride.h" +#include "Export.h" + +//static int allocCount=0; +//static int deallocCount=0; + +namespace RakNet +{ + +class RAK_DLL_EXPORT ReferenceCounter +{ +private: + int refCount; + +public: + ReferenceCounter() {refCount=0;} + ~ReferenceCounter() {} + void AddRef() {refCount++;} + int Release() {return --refCount;} + int GetRefCount(void) const {return refCount;} +}; + +template < typename T > class RAK_DLL_EXPORT RakNetSmartPtr +{ +private: + T* ptr; // pointer + ReferenceCounter* reference; // Reference refCount + +public: + RakNetSmartPtr() : ptr(0), reference(0) + { + // Do not allocate by default, wasteful if we just have a list of preallocated and unassigend smart pointers + } + + RakNetSmartPtr(T* pValue) : ptr(pValue) + { + reference = RakNet::OP_NEW(_FILE_AND_LINE_); + reference->AddRef(); + +// allocCount+=2; +// printf("allocCount=%i deallocCount=%i Line=%i\n",allocCount, deallocCount, __LINE__); + } + + RakNetSmartPtr(const RakNetSmartPtr& sp) : ptr(sp.ptr), reference(sp.reference) + { + if (reference) + reference->AddRef(); + } + + ~RakNetSmartPtr() + { + if(reference && reference->Release() == 0) + { + RakNet::OP_DELETE(ptr, _FILE_AND_LINE_); + RakNet::OP_DELETE(reference, _FILE_AND_LINE_); + +// deallocCount+=2; +// printf("allocCount=%i deallocCount=%i Line=%i\n",allocCount, deallocCount, __LINE__); + } + } + + bool IsNull(void) const + { + return ptr==0; + } + + void SetNull(void) + { + if(reference && reference->Release() == 0) + { + RakNet::OP_DELETE(ptr, _FILE_AND_LINE_); + RakNet::OP_DELETE(reference, _FILE_AND_LINE_); + +// deallocCount+=2; +// printf("allocCount=%i deallocCount=%i Line=%i\n",allocCount, deallocCount, __LINE__); + } + ptr=0; + reference=0; + } + + bool IsUnique(void) const + { + return reference->GetRefCount()==1; + } + + // Allow you to change the values of the internal contents of the pointer, without changing what is pointed to by other instances of the smart pointer + void Clone(bool copyContents) + { + if (IsUnique()==false) + { + reference->Release(); + + reference = RakNet::OP_NEW(_FILE_AND_LINE_); + reference->AddRef(); + T* oldPtr=ptr; + ptr=RakNet::OP_NEW(_FILE_AND_LINE_); + if (copyContents) + *ptr=*oldPtr; + } + } + + int GetRefCount(void) const + { + return reference->GetRefCount(); + } + + T& operator* () + { + return *ptr; + } + + const T& operator* () const + { + return *ptr; + } + + T* operator-> () + { + return ptr; + } + + const T* operator-> () const + { + return ptr; + } + + bool operator == (const RakNetSmartPtr& sp) + { + return ptr == sp.ptr; + } + bool operator<( const RakNetSmartPtr &right ) {return ptr < right.ptr;} + bool operator>( const RakNetSmartPtr &right ) {return ptr > right.ptr;} + + bool operator != (const RakNetSmartPtr& sp) + { + return ptr != sp.ptr; + } + + RakNetSmartPtr& operator = (const RakNetSmartPtr& sp) + { + // Assignment operator + + if (this != &sp) // Avoid self assignment + { + if(reference && reference->Release() == 0) + { + RakNet::OP_DELETE(ptr, _FILE_AND_LINE_); + RakNet::OP_DELETE(reference, _FILE_AND_LINE_); + +// deallocCount+=2; +// printf("allocCount=%i deallocCount=%i Line=%i\n",allocCount, deallocCount, __LINE__); + } + + ptr = sp.ptr; + reference = sp.reference; + if (reference) + reference->AddRef(); + } + return *this; + } + + +}; + +} // namespace RakNet + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetSocket.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetSocket.cpp new file mode 100644 index 0000000..da95fb2 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetSocket.cpp @@ -0,0 +1,25 @@ +#include "RakNetSocket.h" +#include "SocketIncludes.h" +#include "SocketDefines.h" + +using namespace RakNet; + +RakNetSocket::RakNetSocket() { + s = (unsigned int)-1; +#if defined (_WIN32) && defined(USE_WAIT_FOR_MULTIPLE_EVENTS) + recvEvent=INVALID_HANDLE_VALUE; +#endif +} +RakNetSocket::~RakNetSocket() +{ + if ((SOCKET)s != (SOCKET)-1) + closesocket__(s); + +#if defined (_WIN32) && defined(USE_WAIT_FOR_MULTIPLE_EVENTS) + if (recvEvent!=INVALID_HANDLE_VALUE) + { + CloseHandle( recvEvent ); + recvEvent = INVALID_HANDLE_VALUE; + } +#endif +} diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetSocket.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetSocket.h new file mode 100644 index 0000000..d55068f --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetSocket.h @@ -0,0 +1,38 @@ +#ifndef __RAKNET_SOCKET_H +#define __RAKNET_SOCKET_H + +#include "RakNetTypes.h" +#include "RakNetDefines.h" +#include "Export.h" + +namespace RakNet +{ + +struct RAK_DLL_EXPORT RakNetSocket +{ + RakNetSocket(); + ~RakNetSocket(); + // SocketIncludes.h includes Windows.h, which messes up a lot of compiles + // SOCKET s; + unsigned int s; + unsigned int userConnectionSocketIndex; + SystemAddress boundAddress; + unsigned short socketFamily; + +#if defined (_WIN32) && defined(USE_WAIT_FOR_MULTIPLE_EVENTS) + void* recvEvent; +#endif + + + + + + + unsigned short remotePortRakNetWasStartedOn_PS3_PSP2; + + unsigned int extraSocketOptions; +}; + +} // namespace RakNet + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetStatistics.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetStatistics.cpp new file mode 100644 index 0000000..0dfb586 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetStatistics.cpp @@ -0,0 +1,148 @@ +/// \file +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#include "RakNetStatistics.h" +#include // sprintf +#include "GetTime.h" +#include "RakString.h" + +using namespace RakNet; + +// Verbosity level currently supports 0 (low), 1 (medium), 2 (high) +// Buffer must be hold enough to hold the output string. See the source to get an idea of how many bytes will be output +void RAK_DLL_EXPORT RakNet::StatisticsToString( RakNetStatistics *s, char *buffer, int verbosityLevel ) +{ + if ( s == 0 ) + { + sprintf( buffer, "stats is a NULL pointer in statsToString\n" ); + return ; + } + + if (verbosityLevel==0) + { + sprintf(buffer, + "Bytes per second sent %"PRINTF_64_BIT_MODIFIER"u\n" + "Bytes per second received %"PRINTF_64_BIT_MODIFIER"u\n" + "Current packetloss %.1f%%\n", + (long long unsigned int) s->valueOverLastSecond[ACTUAL_BYTES_SENT], + (long long unsigned int) s->valueOverLastSecond[ACTUAL_BYTES_RECEIVED], + s->packetlossLastSecond*100.0f + ); + } + else if (verbosityLevel==1) + { + sprintf(buffer, + "Actual bytes per second sent %"PRINTF_64_BIT_MODIFIER"u\n" + "Actual bytes per second received %"PRINTF_64_BIT_MODIFIER"u\n" + "Message bytes per second pushed %"PRINTF_64_BIT_MODIFIER"u\n" + "Total actual bytes sent %"PRINTF_64_BIT_MODIFIER"u\n" + "Total actual bytes received %"PRINTF_64_BIT_MODIFIER"u\n" + "Total message bytes pushed %"PRINTF_64_BIT_MODIFIER"u\n" + "Current packetloss %.1f%%\n" + "Average packetloss %.1f%%\n" + "Elapsed connection time in seconds %"PRINTF_64_BIT_MODIFIER"u\n", + (long long unsigned int) s->valueOverLastSecond[ACTUAL_BYTES_SENT], + (long long unsigned int) s->valueOverLastSecond[ACTUAL_BYTES_RECEIVED], + (long long unsigned int) s->valueOverLastSecond[USER_MESSAGE_BYTES_PUSHED], + (long long unsigned int) s->runningTotal[ACTUAL_BYTES_SENT], + (long long unsigned int) s->runningTotal[ACTUAL_BYTES_RECEIVED], + (long long unsigned int) s->runningTotal[USER_MESSAGE_BYTES_PUSHED], + s->packetlossLastSecond*100.0f, + s->packetlossTotal*100.0f, + (long long unsigned int) (uint64_t)((RakNet::GetTimeUS()-s->connectionStartTime)/1000000) + ); + + if (s->BPSLimitByCongestionControl!=0) + { + char buff2[128]; + sprintf(buff2, + "Send capacity %"PRINTF_64_BIT_MODIFIER"u bytes per second (%.0f%%)\n", + (long long unsigned int) s->BPSLimitByCongestionControl, + 100.0f * s->valueOverLastSecond[ACTUAL_BYTES_SENT] / s->BPSLimitByCongestionControl + ); + strcat(buffer,buff2); + } + if (s->BPSLimitByOutgoingBandwidthLimit!=0) + { + char buff2[128]; + sprintf(buff2, + "Send limit %"PRINTF_64_BIT_MODIFIER"u (%.0f%%)\n", + (long long unsigned int) s->BPSLimitByOutgoingBandwidthLimit, + 100.0f * s->valueOverLastSecond[ACTUAL_BYTES_SENT] / s->BPSLimitByOutgoingBandwidthLimit + ); + strcat(buffer,buff2); + } + } + else + { + sprintf(buffer, + "Actual bytes per second sent %"PRINTF_64_BIT_MODIFIER"u\n" + "Actual bytes per second received %"PRINTF_64_BIT_MODIFIER"u\n" + "Message bytes per second sent %"PRINTF_64_BIT_MODIFIER"u\n" + "Message bytes per second resent %"PRINTF_64_BIT_MODIFIER"u\n" + "Message bytes per second pushed %"PRINTF_64_BIT_MODIFIER"u\n" + "Message bytes per second processed %"PRINTF_64_BIT_MODIFIER"u\n" + "Message bytes per second ignored %"PRINTF_64_BIT_MODIFIER"u\n" + "Total bytes sent %"PRINTF_64_BIT_MODIFIER"u\n" + "Total bytes received %"PRINTF_64_BIT_MODIFIER"u\n" + "Total message bytes sent %"PRINTF_64_BIT_MODIFIER"u\n" + "Total message bytes resent %"PRINTF_64_BIT_MODIFIER"u\n" + "Total message bytes pushed %"PRINTF_64_BIT_MODIFIER"u\n" + "Total message bytes received %"PRINTF_64_BIT_MODIFIER"u\n" + "Total message bytes ignored %"PRINTF_64_BIT_MODIFIER"u\n" + "Messages in send buffer, by priority %i,%i,%i,%i\n" + "Bytes in send buffer, by priority %i,%i,%i,%i\n" + "Messages in resend buffer %i\n" + "Bytes in resend buffer %"PRINTF_64_BIT_MODIFIER"u\n" + "Current packetloss %.1f%%\n" + "Average packetloss %.1f%%\n" + "Elapsed connection time in seconds %"PRINTF_64_BIT_MODIFIER"u\n", + (long long unsigned int) s->valueOverLastSecond[ACTUAL_BYTES_SENT], + (long long unsigned int) s->valueOverLastSecond[ACTUAL_BYTES_RECEIVED], + (long long unsigned int) s->valueOverLastSecond[USER_MESSAGE_BYTES_SENT], + (long long unsigned int) s->valueOverLastSecond[USER_MESSAGE_BYTES_RESENT], + (long long unsigned int) s->valueOverLastSecond[USER_MESSAGE_BYTES_PUSHED], + (long long unsigned int) s->valueOverLastSecond[USER_MESSAGE_BYTES_RECEIVED_PROCESSED], + (long long unsigned int) s->valueOverLastSecond[USER_MESSAGE_BYTES_RECEIVED_IGNORED], + (long long unsigned int) s->runningTotal[ACTUAL_BYTES_SENT], + (long long unsigned int) s->runningTotal[ACTUAL_BYTES_RECEIVED], + (long long unsigned int) s->runningTotal[USER_MESSAGE_BYTES_SENT], + (long long unsigned int) s->runningTotal[USER_MESSAGE_BYTES_RESENT], + (long long unsigned int) s->runningTotal[USER_MESSAGE_BYTES_PUSHED], + (long long unsigned int) s->runningTotal[USER_MESSAGE_BYTES_RECEIVED_PROCESSED], + (long long unsigned int) s->runningTotal[USER_MESSAGE_BYTES_RECEIVED_IGNORED], + s->messageInSendBuffer[IMMEDIATE_PRIORITY],s->messageInSendBuffer[HIGH_PRIORITY],s->messageInSendBuffer[MEDIUM_PRIORITY],s->messageInSendBuffer[LOW_PRIORITY], + (unsigned int) s->bytesInSendBuffer[IMMEDIATE_PRIORITY],(unsigned int) s->bytesInSendBuffer[HIGH_PRIORITY],(unsigned int) s->bytesInSendBuffer[MEDIUM_PRIORITY],(unsigned int) s->bytesInSendBuffer[LOW_PRIORITY], + s->messagesInResendBuffer, + (long long unsigned int) s->bytesInResendBuffer, + s->packetlossLastSecond*100.0f, + s->packetlossTotal*100.0f, + (long long unsigned int) (uint64_t)((RakNet::GetTimeUS()-s->connectionStartTime)/1000000) + ); + + if (s->BPSLimitByCongestionControl!=0) + { + char buff2[128]; + sprintf(buff2, + "Send capacity %"PRINTF_64_BIT_MODIFIER"u bytes per second (%.0f%%)\n", + (long long unsigned int) s->BPSLimitByCongestionControl, + 100.0f * s->valueOverLastSecond[ACTUAL_BYTES_SENT] / s->BPSLimitByCongestionControl + ); + strcat(buffer,buff2); + } + if (s->BPSLimitByOutgoingBandwidthLimit!=0) + { + char buff2[128]; + sprintf(buff2, + "Send limit %"PRINTF_64_BIT_MODIFIER"u (%.0f%%)\n", + (long long unsigned int) s->BPSLimitByOutgoingBandwidthLimit, + 100.0f * s->valueOverLastSecond[ACTUAL_BYTES_SENT] / s->BPSLimitByOutgoingBandwidthLimit + ); + strcat(buffer,buff2); + } + } +} diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetStatistics.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetStatistics.h new file mode 100644 index 0000000..634a010 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetStatistics.h @@ -0,0 +1,126 @@ +/// \file +/// \brief A structure that holds all statistical data returned by RakNet. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + + +#ifndef __RAK_NET_STATISTICS_H +#define __RAK_NET_STATISTICS_H + +#include "PacketPriority.h" +#include "Export.h" +#include "RakNetTypes.h" + +namespace RakNet +{ + +enum RNSPerSecondMetrics +{ + /// How many bytes per pushed via a call to RakPeerInterface::Send() + USER_MESSAGE_BYTES_PUSHED, + + /// How many user message bytes were sent via a call to RakPeerInterface::Send(). This is less than or equal to USER_MESSAGE_BYTES_PUSHED. + /// A message would be pushed, but not yet sent, due to congestion control + USER_MESSAGE_BYTES_SENT, + + /// How many user message bytes were resent. A message is resent if it is marked as reliable, and either the message didn't arrive or the message ack didn't arrive. + USER_MESSAGE_BYTES_RESENT, + + /// How many user message bytes were received, and processed successfully. + USER_MESSAGE_BYTES_RECEIVED_PROCESSED, + + /// How many user message bytes were received, but ignored due to data format errors. This will usually be 0. + USER_MESSAGE_BYTES_RECEIVED_IGNORED, + + /// How many actual bytes were sent, including per-message and per-datagram overhead, and reliable message acks + ACTUAL_BYTES_SENT, + + /// How many actual bytes were received, including overead and acks. + ACTUAL_BYTES_RECEIVED, + + /// \internal + RNS_PER_SECOND_METRICS_COUNT +}; + +/// \brief Network Statisics Usage +/// +/// Store Statistics information related to network usage +struct RAK_DLL_EXPORT RakNetStatistics +{ + /// For each type in RNSPerSecondMetrics, what is the value over the last 1 second? + uint64_t valueOverLastSecond[RNS_PER_SECOND_METRICS_COUNT]; + + /// For each type in RNSPerSecondMetrics, what is the total value over the lifetime of the connection? + uint64_t runningTotal[RNS_PER_SECOND_METRICS_COUNT]; + + /// When did the connection start? + /// \sa RakNet::GetTimeUS() + RakNet::TimeUS connectionStartTime; + + /// Is our current send rate throttled by congestion control? + /// This value should be true if you send more data per second than your bandwidth capacity + bool isLimitedByCongestionControl; + + /// If \a isLimitedByCongestionControl is true, what is the limit, in bytes per second? + uint64_t BPSLimitByCongestionControl; + + /// Is our current send rate throttled by a call to RakPeer::SetPerConnectionOutgoingBandwidthLimit()? + bool isLimitedByOutgoingBandwidthLimit; + + /// If \a isLimitedByOutgoingBandwidthLimit is true, what is the limit, in bytes per second? + uint64_t BPSLimitByOutgoingBandwidthLimit; + + /// For each priority level, how many messages are waiting to be sent out? + unsigned int messageInSendBuffer[NUMBER_OF_PRIORITIES]; + + /// For each priority level, how many bytes are waiting to be sent out? + double bytesInSendBuffer[NUMBER_OF_PRIORITIES]; + + /// How many messages are waiting in the resend buffer? This includes messages waiting for an ack, so should normally be a small value + /// If the value is rising over time, you are exceeding the bandwidth capacity. See BPSLimitByCongestionControl + unsigned int messagesInResendBuffer; + + /// How many bytes are waiting in the resend buffer. See also messagesInResendBuffer + uint64_t bytesInResendBuffer; + + /// Over the last second, what was our packetloss? This number will range from 0.0 (for none) to 1.0 (for 100%) + float packetlossLastSecond; + + /// What is the average total packetloss over the lifetime of the connection? + float packetlossTotal; + + RakNetStatistics& operator +=(const RakNetStatistics& other) + { + unsigned i; + for (i=0; i < NUMBER_OF_PRIORITIES; i++) + { + messageInSendBuffer[i]+=other.messageInSendBuffer[i]; + bytesInSendBuffer[i]+=other.bytesInSendBuffer[i]; + } + + for (i=0; i < RNS_PER_SECOND_METRICS_COUNT; i++) + { + valueOverLastSecond[i]+=other.valueOverLastSecond[i]; + runningTotal[i]+=other.runningTotal[i]; + } + + return *this; + } +}; + +/// Verbosity level currently supports 0 (low), 1 (medium), 2 (high) +/// \param[in] s The Statistical information to format out +/// \param[in] buffer The buffer containing a formated report +/// \param[in] verbosityLevel +/// 0 low +/// 1 medium +/// 2 high +/// 3 debugging congestion control +void RAK_DLL_EXPORT StatisticsToString( RakNetStatistics *s, char *buffer, int verbosityLevel ); + +} // namespace RakNet + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetTime.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetTime.h new file mode 100644 index 0000000..1c76b83 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetTime.h @@ -0,0 +1,23 @@ +#ifndef __RAKNET_TIME_H +#define __RAKNET_TIME_H + +#include "NativeTypes.h" +#include "RakNetDefines.h" + +namespace RakNet { + +// Define __GET_TIME_64BIT if you want to use large types for GetTime (takes more bandwidth when you transmit time though!) +// You would want to do this if your system is going to run long enough to overflow the millisecond counter (over a month) +#if __GET_TIME_64BIT==1 +typedef uint64_t Time; +typedef uint32_t TimeMS; +typedef uint64_t TimeUS; +#else +typedef uint32_t Time; +typedef uint32_t TimeMS; +typedef uint64_t TimeUS; +#endif + +}; // namespace RakNet + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetTransport2.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetTransport2.cpp new file mode 100644 index 0000000..e03e155 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetTransport2.cpp @@ -0,0 +1,128 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_TelnetTransport==1 + +#include "RakNetTransport2.h" + +#include "RakPeerInterface.h" +#include "BitStream.h" +#include "MessageIdentifiers.h" +#include +#include +#include +#include "LinuxStrings.h" + +#ifdef _MSC_VER +#pragma warning( push ) +#endif + +using namespace RakNet; + +STATIC_FACTORY_DEFINITIONS(RakNetTransport2,RakNetTransport2); + +RakNetTransport2::RakNetTransport2() +{ +} +RakNetTransport2::~RakNetTransport2() +{ + Stop(); +} +bool RakNetTransport2::Start(unsigned short port, bool serverMode) +{ + (void) port; + (void) serverMode; + return true; +} +void RakNetTransport2::Stop(void) +{ + newConnections.Clear(_FILE_AND_LINE_); + lostConnections.Clear(_FILE_AND_LINE_); + for (unsigned int i=0; i < packetQueue.Size(); i++) + { + rakFree_Ex(packetQueue[i]->data,_FILE_AND_LINE_); + RakNet::OP_DELETE(packetQueue[i],_FILE_AND_LINE_); + } + packetQueue.Clear(_FILE_AND_LINE_); +} +void RakNetTransport2::Send( SystemAddress systemAddress, const char *data, ... ) +{ + if (data==0 || data[0]==0) return; + + char text[REMOTE_MAX_TEXT_INPUT]; + va_list ap; + va_start(ap, data); + _vsnprintf(text, REMOTE_MAX_TEXT_INPUT, data, ap); + va_end(ap); + text[REMOTE_MAX_TEXT_INPUT-1]=0; + + RakNet::BitStream str; + str.Write((MessageID)ID_TRANSPORT_STRING); + str.Write(text, (int) strlen(text)); + str.Write((unsigned char) 0); // Null terminate the string + rakPeerInterface->Send(&str, MEDIUM_PRIORITY, RELIABLE_ORDERED, 0, systemAddress, (systemAddress==UNASSIGNED_SYSTEM_ADDRESS)!=0); +} +void RakNetTransport2::CloseConnection( SystemAddress systemAddress ) +{ + rakPeerInterface->CloseConnection(systemAddress, true, 0); +} +Packet* RakNetTransport2::Receive( void ) +{ + if (packetQueue.Size()==0) + return 0; + return packetQueue.Pop(); +} +SystemAddress RakNetTransport2::HasNewIncomingConnection(void) +{ + if (newConnections.Size()) + return newConnections.Pop(); + return UNASSIGNED_SYSTEM_ADDRESS; +} +SystemAddress RakNetTransport2::HasLostConnection(void) +{ + if (lostConnections.Size()) + return lostConnections.Pop(); + return UNASSIGNED_SYSTEM_ADDRESS; +} +void RakNetTransport2::DeallocatePacket( Packet *packet ) +{ + rakFree_Ex(packet->data, _FILE_AND_LINE_ ); + RakNet::OP_DELETE(packet, _FILE_AND_LINE_ ); +} +PluginReceiveResult RakNetTransport2::OnReceive(Packet *packet) +{ + switch (packet->data[0]) + { + case ID_TRANSPORT_STRING: + { + if (packet->length==sizeof(MessageID)) + return RR_STOP_PROCESSING_AND_DEALLOCATE; + + Packet *p = RakNet::OP_NEW(_FILE_AND_LINE_); + *p=*packet; + p->bitSize-=8; + p->length--; + p->data=(unsigned char*) rakMalloc_Ex(p->length,_FILE_AND_LINE_); + memcpy(p->data, packet->data+1, p->length); + packetQueue.Push(p, _FILE_AND_LINE_ ); + + } + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + return RR_CONTINUE_PROCESSING; +} +void RakNetTransport2::OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ) +{ + (void) rakNetGUID; + (void) lostConnectionReason; + lostConnections.Push(systemAddress, _FILE_AND_LINE_ ); +} +void RakNetTransport2::OnNewConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, bool isIncoming) +{ + (void) rakNetGUID; + (void) isIncoming; + newConnections.Push(systemAddress, _FILE_AND_LINE_ ); +} +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetTransport2.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetTransport2.h new file mode 100644 index 0000000..1125048 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetTransport2.h @@ -0,0 +1,102 @@ +/// \file +/// \brief Contains RakNetTransportCommandParser and RakNetTransport used to provide a secure console connection. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_TelnetTransport==1 + +#ifndef __RAKNET_TRANSPORT_2 +#define __RAKNET_TRANSPORT_2 + +#include "TransportInterface.h" +#include "DS_Queue.h" +#include "CommandParserInterface.h" +#include "PluginInterface2.h" +#include "Export.h" + +namespace RakNet +{ +/// Forward declarations +class BitStream; +class RakPeerInterface; +class RakNetTransport; + +/// \defgroup RAKNET_TRANSPORT_GROUP RakNetTransport +/// \brief UDP based transport implementation for the ConsoleServer +/// \details +/// \ingroup PLUGINS_GROUP + +/// \brief Use RakNetTransport if you need a secure connection between the client and the console server. +/// \details RakNetTransport automatically initializes security for the system. Use the project CommandConsoleClient to connect +/// To the ConsoleServer if you use RakNetTransport +/// \ingroup RAKNET_TRANSPORT_GROUP +class RAK_DLL_EXPORT RakNetTransport2 : public TransportInterface, public PluginInterface2 +{ +public: + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(RakNetTransport2) + + RakNetTransport2(); + virtual ~RakNetTransport2(); + + /// Start the transport provider on the indicated port. + /// \param[in] port The port to start the transport provider on + /// \param[in] serverMode If true, you should allow incoming connections (I don't actually use this anywhere) + /// \return Return true on success, false on failure. + bool Start(unsigned short port, bool serverMode); + + /// Stop the transport provider. You can clear memory and shutdown threads here. + void Stop(void); + + /// Send a null-terminated string to \a systemAddress + /// If your transport method requires particular formatting of the outgoing data (e.g. you don't just send strings) you can do it here + /// and parse it out in Receive(). + /// \param[in] systemAddress The player to send the string to + /// \param[in] data format specifier - same as RAKNET_DEBUG_PRINTF + /// \param[in] ... format specification arguments - same as RAKNET_DEBUG_PRINTF + void Send( SystemAddress systemAddress, const char *data, ... ); + + /// Disconnect \a systemAddress . The binary address and port defines the SystemAddress structure. + /// \param[in] systemAddress The player/address to disconnect + void CloseConnection( SystemAddress systemAddress ); + + /// Return a string. The string should be allocated and written to Packet::data . + /// The byte length should be written to Packet::length . The player/address should be written to Packet::systemAddress + /// If your transport protocol adds special formatting to the data stream you should parse it out before returning it in the packet + /// and thus only return a string in Packet::data + /// \return The packet structure containing the result of Receive, or 0 if no data is available + Packet* Receive( void ); + + /// Deallocate the Packet structure returned by Receive + /// \param[in] The packet to deallocate + void DeallocatePacket( Packet *packet ); + + /// If a new system connects to you, you should queue that event and return the systemAddress/address of that player in this function. + /// \return The SystemAddress/address of the system + SystemAddress HasNewIncomingConnection(void); + + /// If a system loses the connection, you should queue that event and return the systemAddress/address of that player in this function. + /// \return The SystemAddress/address of the system + SystemAddress HasLostConnection(void); + + virtual CommandParserInterface* GetCommandParser(void) {return 0;} + + /// \internal + virtual PluginReceiveResult OnReceive(Packet *packet); + /// \internal + virtual void OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ); + /// \internal + virtual void OnNewConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, bool isIncoming); +protected: + DataStructures::Queue newConnections, lostConnections; + DataStructures::Queue packetQueue; +}; + +} // namespace RakNet + +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetTypes.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetTypes.cpp new file mode 100644 index 0000000..2a2b109 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetTypes.cpp @@ -0,0 +1,725 @@ +/// \file +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#include "RakNetTypes.h" +#include "RakAssert.h" +#include +#include +#include "WindowsIncludes.h" +#include "WSAStartupSingleton.h" +#include "SocketDefines.h" + + +#if defined(_WIN32) +// extern __int64 _strtoui64(const char*, char**, int); // needed for Code::Blocks. Does not compile on Visual Studio 2010 +// IP_DONTFRAGMENT is different between winsock 1 and winsock 2. Therefore, Winsock2.h must be linked againt Ws2_32.lib +// winsock.h must be linked against WSock32.lib. If these two are mixed up the flag won't work correctly +#include + +#else +#include +#include +#include +#endif + +#include // strncasecmp +#include "Itoa.h" +#include "SocketLayer.h" +#include "SuperFastHash.h" +#include + +using namespace RakNet; + +const char *IPV6_LOOPBACK="::1"; +const char *IPV4_LOOPBACK="127.0.0.1"; + +AddressOrGUID::AddressOrGUID( Packet *packet ) +{ + rakNetGuid=packet->guid; + systemAddress=packet->systemAddress; +} + +unsigned long AddressOrGUID::ToInteger( const AddressOrGUID &aog ) +{ + if (aog.rakNetGuid!=UNASSIGNED_RAKNET_GUID) + return RakNetGUID::ToUint32(aog.rakNetGuid); + return SystemAddress::ToInteger(aog.systemAddress); +} +const char *AddressOrGUID::ToString(bool writePort) const +{ + if (rakNetGuid!=UNASSIGNED_RAKNET_GUID) + return rakNetGuid.ToString(); + return systemAddress.ToString(writePort); +} +void AddressOrGUID::ToString(bool writePort, char *dest) const +{ + if (rakNetGuid!=UNASSIGNED_RAKNET_GUID) + return rakNetGuid.ToString(dest); + return systemAddress.ToString(writePort,dest); +} +bool RakNet::NonNumericHostString( const char *host ) +{ + if ( host[ 0 ] >= '0' && host[ 0 ] <= '9' ) + return false; + + if ( (host[ 0 ] == '-') && ( host[ 1 ] >= '0' && host[ 1 ] <= '9' ) ) + return false; + + if ( strstr(host,":") ) + return false; + + return true; +} + +SocketDescriptor::SocketDescriptor() {port=0; hostAddress[0]=0; remotePortRakNetWasStartedOn_PS3_PSP2=0; extraSocketOptions=0; socketFamily=AF_INET;} +SocketDescriptor::SocketDescriptor(unsigned short _port, const char *_hostAddress) +{ + remotePortRakNetWasStartedOn_PS3_PSP2=0; + port=_port; + if (_hostAddress) + strcpy(hostAddress, _hostAddress); + else + hostAddress[0]=0; + extraSocketOptions=0; + socketFamily=AF_INET; +} + +// Defaults to not in peer to peer mode for NetworkIDs. This only sends the localSystemAddress portion in the BitStream class +// This is what you want for client/server, where the server assigns all NetworkIDs and it is unnecessary to transmit the full structure. +// For peer to peer, this will transmit the systemAddress of the system that created the object in addition to localSystemAddress. This allows +// Any system to create unique ids locally. +// All systems must use the same value for this variable. +//bool RAK_DLL_EXPORT NetworkID::peerToPeerMode=false; + +SystemAddress& SystemAddress::operator = ( const SystemAddress& input ) +{ + memcpy(&address, &input.address, sizeof(address)); + systemIndex = input.systemIndex; + debugPort = input.debugPort; + return *this; +} +bool SystemAddress::EqualsExcludingPort( const SystemAddress& right ) const +{ + return (address.addr4.sin_family==AF_INET && address.addr4.sin_addr.s_addr==right.address.addr4.sin_addr.s_addr) +#if RAKNET_SUPPORT_IPV6==1 + || (address.addr4.sin_family==AF_INET6 && memcmp(address.addr6.sin6_addr.s6_addr, right.address.addr6.sin6_addr.s6_addr, sizeof(address.addr6.sin6_addr.s6_addr))==0) +#endif + ; +} +unsigned short SystemAddress::GetPort(void) const +{ + return ntohs(address.addr4.sin_port); +} +unsigned short SystemAddress::GetPortNetworkOrder(void) const +{ + return address.addr4.sin_port; +} +void SystemAddress::SetPort(unsigned short s) +{ + address.addr4.sin_port=htons(s); + debugPort=s; +} +void SystemAddress::SetPortNetworkOrder(unsigned short s) +{ + address.addr4.sin_port=s; + debugPort=ntohs(s); +} +bool SystemAddress::operator==( const SystemAddress& right ) const +{ + return address.addr4.sin_port == right.address.addr4.sin_port && EqualsExcludingPort(right); +} + +bool SystemAddress::operator!=( const SystemAddress& right ) const +{ + return (*this==right)==false; +} + +bool SystemAddress::operator>( const SystemAddress& right ) const +{ + if (address.addr4.sin_port == right.address.addr4.sin_port) + { +#if RAKNET_SUPPORT_IPV6==1 + if (address.addr4.sin_family==AF_INET) + return address.addr4.sin_addr.s_addr>right.address.addr4.sin_addr.s_addr; + return memcmp(address.addr6.sin6_addr.s6_addr, right.address.addr6.sin6_addr.s6_addr, sizeof(address.addr6.sin6_addr.s6_addr))>0; +#else + return address.addr4.sin_addr.s_addr>right.address.addr4.sin_addr.s_addr; +#endif + } + return address.addr4.sin_port>right.address.addr4.sin_port; +} + +bool SystemAddress::operator<( const SystemAddress& right ) const +{ + if (address.addr4.sin_port == right.address.addr4.sin_port) + { +#if RAKNET_SUPPORT_IPV6==1 + if (address.addr4.sin_family==AF_INET) + return address.addr4.sin_addr.s_addr0; +#else + return address.addr4.sin_addr.s_addr'9')) + break; + IPPart[index]=str[index]; + } + IPPart[index]=0; + portPart[0]=0; + if (str[index] && str[index+1]) + { + index++; + for (portIndex=0; portIndex<10 && str[index] && index < 22+10; index++, portIndex++) + { + if (str[index]<'0' || str[index]>'9') + break; + + portPart[portIndex]=str[index]; + } + portPart[portIndex]=0; + } + + + + + + + + + + + + + + if (IPPart[0]) + { + + + + address.addr4.sin_addr.s_addr=inet_addr__(IPPart); + + } + + + if (portPart[0]) + { + address.addr4.sin_port=htons((unsigned short) atoi(portPart)); + debugPort=ntohs(address.addr4.sin_port); + } + //#endif + } +} + +bool SystemAddress::FromString(const char *str, char portDelineator, int ipVersion) +{ +#if RAKNET_SUPPORT_IPV6!=1 + (void) ipVersion; + SetBinaryAddress(str,portDelineator); + return true; +#else + if (str==0) + { + memset(&address,0,sizeof(address)); + address.addr4.sin_family=AF_INET; + return true; + } +#if RAKNET_SUPPORT_IPV6==1 + char ipPart[INET6_ADDRSTRLEN]; +#else + char ipPart[INET_ADDRSTRLEN]; +#endif + char portPart[32]; + int i=0,j; + + // TODO - what about 255.255.255.255? + if (ipVersion==4 && strcmp(str, IPV6_LOOPBACK)==0) + { + strcpy(ipPart,IPV4_LOOPBACK); + } + else if (ipVersion==6 && strcmp(str, IPV4_LOOPBACK)==0) + { + address.addr4.sin_family=AF_INET6; + strcpy(ipPart,IPV6_LOOPBACK); + } + else if (NonNumericHostString(str)==false) + { + for (; i < sizeof(ipPart) && str[i]!=0 && str[i]!=portDelineator; i++) + { + if ((str[i]<'0' || str[i]>'9') && (str[i]<'a' || str[i]>'f') && (str[i]<'A' || str[i]>'F') && str[i]!='.' && str[i]!=':' && str[i]!='%' && str[i]!='-' && str[i]!='/') + break; + + ipPart[i]=str[i]; + } + ipPart[i]=0; + } + else + { + strncpy(ipPart,str,sizeof(ipPart)); + ipPart[sizeof(ipPart)-1]=0; + } + + j=0; + if (str[i]==portDelineator && portDelineator!=0) + { + i++; + for (; j < sizeof(portPart) && str[i]!=0; i++, j++) + { + portPart[j]=str[i]; + } + } + portPart[j]=0; + + + + + + + + + + + // needed for getaddrinfo + WSAStartupSingleton::AddRef(); + + // This could be a domain, or a printable address such as "192.0.2.1" or "2001:db8:63b3:1::3490" + // I want to convert it to its binary representation + addrinfo hints, *servinfo=0; + memset(&hints, 0, sizeof hints); + hints.ai_socktype = SOCK_DGRAM; + if (ipVersion==6) + hints.ai_family = AF_INET6; + else if (ipVersion==4) + hints.ai_family = AF_INET; + else + hints.ai_family = AF_UNSPEC; + getaddrinfo(ipPart, "", &hints, &servinfo); + if (servinfo==0) + return false; + RakAssert(servinfo); + + unsigned short oldPort = address.addr4.sin_port; +#if RAKNET_SUPPORT_IPV6==1 + if (servinfo->ai_family == AF_INET) + { +// if (ipVersion==6) +// { + address.addr4.sin_family=AF_INET6; +// memset(&address.addr6,0,sizeof(address.addr6)); +// memcpy(address.addr6.sin6_addr.s6_addr+12,&((struct sockaddr_in *)servinfo->ai_addr)->sin_addr.s_addr,sizeof(unsigned long)); +// } +// else +// { + address.addr4.sin_family=AF_INET; + memcpy(&address.addr4, (struct sockaddr_in *)servinfo->ai_addr,sizeof(struct sockaddr_in)); +// } + } + else + { + address.addr4.sin_family=AF_INET6; + memcpy(&address.addr6, (struct sockaddr_in6 *)servinfo->ai_addr,sizeof(struct sockaddr_in6)); + } +#else + address.addr4.sin_family=AF_INET4; + memcpy(&address.addr4, (struct sockaddr_in *)servinfo->ai_addr,sizeof(struct sockaddr_in)); +#endif + + freeaddrinfo(servinfo); // free the linked list + + // needed for getaddrinfo + WSAStartupSingleton::Deref(); + + // PORT + if (portPart[0]) + { + address.addr4.sin_port=htons((unsigned short) atoi(portPart)); + debugPort=ntohs(address.addr4.sin_port); + } + else + { + address.addr4.sin_port=oldPort; + } +#endif // #if RAKNET_SUPPORT_IPV6!=1 + + return true; +} +bool SystemAddress::FromStringExplicitPort(const char *str, unsigned short port, int ipVersion) +{ + bool b = FromString(str,(char) 0,ipVersion); + if (b==false) + return false; + address.addr4.sin_port=htons(port); + debugPort=ntohs(address.addr4.sin_port); + return true; +} +void SystemAddress::CopyPort( const SystemAddress& right ) +{ + address.addr4.sin_port=right.address.addr4.sin_port; + debugPort=right.debugPort; +} +RakNetGUID::RakNetGUID() +{ + systemIndex=(SystemIndex)-1; + *this=UNASSIGNED_RAKNET_GUID; +} +bool RakNetGUID::operator==( const RakNetGUID& right ) const +{ + return g==right.g; +} +bool RakNetGUID::operator!=( const RakNetGUID& right ) const +{ + return g!=right.g; +} +bool RakNetGUID::operator > ( const RakNetGUID& right ) const +{ + return g > right.g; +} +bool RakNetGUID::operator < ( const RakNetGUID& right ) const +{ + return g < right.g; +} +const char *RakNetGUID::ToString(void) const +{ + static unsigned char strIndex=0; + static char str[8][64]; + + unsigned char lastStrIndex=strIndex; + strIndex++; + ToString(str[lastStrIndex&7]); + return (char*) str[lastStrIndex&7]; +} +void RakNetGUID::ToString(char *dest) const +{ + if (*this==UNASSIGNED_RAKNET_GUID) + strcpy(dest, "UNASSIGNED_RAKNET_GUID"); + + //sprintf(dest, "%u.%u.%u.%u.%u.%u", g[0], g[1], g[2], g[3], g[4], g[5]); + sprintf(dest, "%" PRINTF_64_BIT_MODIFIER "u", (long long unsigned int) g); + // sprintf(dest, "%u.%u.%u.%u.%u.%u", g[0], g[1], g[2], g[3], g[4], g[5]); +} +bool RakNetGUID::FromString(const char *source) +{ + if (source==0) + return false; + + + +#if defined(WIN32) + g=_strtoui64(source, NULL, 10); + + +#else + // Changed from g=strtoull(source,0,10); for android + g=strtoull(source, (char **)NULL, 10); +#endif + return true; + +} +unsigned long RakNetGUID::ToUint32( const RakNetGUID &g ) +{ + return ((unsigned long) (g.g >> 32)) ^ ((unsigned long) (g.g & 0xFFFFFFFF)); +} diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetTypes.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetTypes.h new file mode 100644 index 0000000..063be59 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetTypes.h @@ -0,0 +1,482 @@ +/// \file +/// \brief Types used by RakNet, most of which involve user code. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __NETWORK_TYPES_H +#define __NETWORK_TYPES_H + +#include "RakNetDefines.h" +#include "NativeTypes.h" +#include "RakNetTime.h" +#include "Export.h" +#include "SocketIncludes.h" +#include "WindowsIncludes.h" +#include "XBox360Includes.h" + + + + + +namespace RakNet { +/// Forward declarations +class RakPeerInterface; +class BitStream; +struct Packet; + +enum StartupResult +{ + RAKNET_STARTED, + RAKNET_ALREADY_STARTED, + INVALID_SOCKET_DESCRIPTORS, + INVALID_MAX_CONNECTIONS, + SOCKET_FAMILY_NOT_SUPPORTED, + SOCKET_PORT_ALREADY_IN_USE, + SOCKET_FAILED_TO_BIND, + SOCKET_FAILED_TEST_SEND, + PORT_CANNOT_BE_ZERO, + FAILED_TO_CREATE_NETWORK_THREAD, + STARTUP_OTHER_FAILURE, +}; + + +enum ConnectionAttemptResult +{ + CONNECTION_ATTEMPT_STARTED, + INVALID_PARAMETER, + CANNOT_RESOLVE_DOMAIN_NAME, + ALREADY_CONNECTED_TO_ENDPOINT, + CONNECTION_ATTEMPT_ALREADY_IN_PROGRESS, + SECURITY_INITIALIZATION_FAILED +}; + +/// Returned from RakPeerInterface::GetConnectionState() +enum ConnectionState +{ + /// Connect() was called, but the process hasn't started yet + IS_PENDING, + /// Processing the connection attempt + IS_CONNECTING, + /// Is connected and able to communicate + IS_CONNECTED, + /// Was connected, but will disconnect as soon as the remaining messages are delivered + IS_DISCONNECTING, + /// A connection attempt failed and will be aborted + IS_SILENTLY_DISCONNECTING, + /// No longer connected + IS_DISCONNECTED, + /// Was never connected, or else was disconnected long enough ago that the entry has been discarded + IS_NOT_CONNECTED, +}; + +/// Given a number of bits, return how many bytes are needed to represent that. +#define BITS_TO_BYTES(x) (((x)+7)>>3) +#define BYTES_TO_BITS(x) ((x)<<3) + +/// \sa NetworkIDObject.h +typedef unsigned char UniqueIDType; +typedef unsigned short SystemIndex; +typedef unsigned char RPCIndex; +const int MAX_RPC_MAP_SIZE=((RPCIndex)-1)-1; +const int UNDEFINED_RPC_INDEX=((RPCIndex)-1); + +/// First byte of a network message +typedef unsigned char MessageID; + +typedef uint32_t BitSize_t; + +#if defined(_MSC_VER) && _MSC_VER > 0 +#define PRINTF_64_BIT_MODIFIER "I64" +#else +#define PRINTF_64_BIT_MODIFIER "ll" +#endif + +/// Used with the PublicKey structure +enum PublicKeyMode +{ + /// The connection is insecure. You can also just pass 0 for the pointer to PublicKey in RakPeerInterface::Connect() + PKM_INSECURE_CONNECTION, + + /// Accept whatever public key the server gives us. This is vulnerable to man in the middle, but does not require + /// distribution of the public key in advance of connecting. + PKM_ACCEPT_ANY_PUBLIC_KEY, + + /// Use a known remote server public key. PublicKey::remoteServerPublicKey must be non-zero. + /// This is the recommended mode for secure connections. + PKM_USE_KNOWN_PUBLIC_KEY, + + /// Use a known remote server public key AND provide a public key for the connecting client. + /// PublicKey::remoteServerPublicKey, myPublicKey and myPrivateKey must be all be non-zero. + /// The server must cooperate for this mode to work. + /// I recommend not using this mode except for server-to-server communication as it significantly increases the CPU requirements during connections for both sides. + /// Furthermore, when it is used, a connection password should be used as well to avoid DoS attacks. + PKM_USE_TWO_WAY_AUTHENTICATION +}; + +/// Passed to RakPeerInterface::Connect() +struct RAK_DLL_EXPORT PublicKey +{ + /// How to interpret the public key, see above + PublicKeyMode publicKeyMode; + + /// Pointer to a public key of length cat::EasyHandshake::PUBLIC_KEY_BYTES. See the Encryption sample. + char *remoteServerPublicKey; + + /// (Optional) Pointer to a public key of length cat::EasyHandshake::PUBLIC_KEY_BYTES + char *myPublicKey; + + /// (Optional) Pointer to a private key of length cat::EasyHandshake::PRIVATE_KEY_BYTES + char *myPrivateKey; +}; + +/// Describes the local socket to use for RakPeer::Startup +struct RAK_DLL_EXPORT SocketDescriptor +{ + SocketDescriptor(); + SocketDescriptor(unsigned short _port, const char *_hostAddress); + + /// The local port to bind to. Pass 0 to have the OS autoassign a port. + unsigned short port; + + /// The local network card address to bind to, such as "127.0.0.1". Pass an empty string to use INADDR_ANY. + char hostAddress[32]; + + /// IP version: For IPV4, use AF_INET (default). For IPV6, use AF_INET6. To autoselect, use AF_UNSPEC. + /// IPV6 is the newer internet protocol. Instead of addresses such as 94.198.81.195, you may have an address such as fe80::7c:31f7:fec4:27de%14. + /// Encoding takes 16 bytes instead of 4, so IPV6 is less efficient for bandwidth. + /// On the positive side, NAT Punchthrough is not needed and should not be used with IPV6 because there are enough addresses that routers do not need to create address mappings. + /// RakPeer::Startup() will fail if this IP version is not supported. + /// \pre RAKNET_SUPPORT_IPV6 must be set to 1 in RakNetDefines.h for AF_INET6 + short socketFamily; + + + + + + + + + + unsigned short remotePortRakNetWasStartedOn_PS3_PSP2; + + /// XBOX only: set IPPROTO_VDP if you want to use VDP. If enabled, this socket does not support broadcast to 255.255.255.255 + unsigned int extraSocketOptions; +}; + +extern bool NonNumericHostString( const char *host ); + +/// \brief Network address for a system +/// \details Corresponds to a network address
+/// This is not necessarily a unique identifier. For example, if a system has both LAN and internet connections, the system may be identified by either one, depending on who is communicating
+/// Therefore, you should not transmit the SystemAddress over the network and expect it to identify a system, or use it to connect to that system, except in the case where that system is not behind a NAT (such as with a dedciated server) +/// Use RakNetGUID for a unique per-instance of RakPeer to identify systems +struct RAK_DLL_EXPORT SystemAddress +{ + /// Constructors + SystemAddress(); + SystemAddress(const char *str); + SystemAddress(const char *str, unsigned short port); + + + + + + + + /// SystemAddress, with RAKNET_SUPPORT_IPV6 defined, holds both an sockaddr_in6 and a sockaddr_in + union// In6OrIn4 + { +#if RAKNET_SUPPORT_IPV6==1 + struct sockaddr_in6 addr6; +#endif + + struct sockaddr_in addr4; + } address; + + /// This is not used internally, but holds a copy of the port held in the address union, so for debugging it's easier to check what port is being held + unsigned short debugPort; + + /// \internal Return the size to write to a bitStream + static int size(void); + + /// Hash the system address + static unsigned long ToInteger( const SystemAddress &sa ); + + /// Return the IP version, either IPV4 or IPV6 + /// \return Either 4 or 6 + unsigned char GetIPVersion(void) const; + + /// \internal Returns either IPPROTO_IP or IPPROTO_IPV6 + /// \sa GetIPVersion + unsigned int GetIPPROTO(void) const; + + /// Call SetToLoopback(), with whatever IP version is currently held. Defaults to IPV4 + void SetToLoopback(void); + + /// Call SetToLoopback() with a specific IP version + /// \param[in] ipVersion Either 4 for IPV4 or 6 for IPV6 + void SetToLoopback(unsigned char ipVersion); + + /// \return If was set to 127.0.0.1 or ::1 + bool IsLoopback(void) const; + + // Return the systemAddress as a string in the format | + // Returns a static string + // NOT THREADSAFE + // portDelineator should not be '.', ':', '%', '-', '/', a number, or a-f + const char *ToString(bool writePort=true, char portDelineator='|') const; + + // Return the systemAddress as a string in the format | + // dest must be large enough to hold the output + // portDelineator should not be '.', ':', '%', '-', '/', a number, or a-f + // THREADSAFE + void ToString(bool writePort, char *dest, char portDelineator='|') const; + + /// Set the system address from a printable IP string, for example "192.0.2.1" or "2001:db8:63b3:1::3490" + /// You can write the port as well, using the portDelineator, for example "192.0.2.1|1234" + /// \param[in] str A printable IP string, for example "192.0.2.1" or "2001:db8:63b3:1::3490". Pass 0 for \a str to set to UNASSIGNED_SYSTEM_ADDRESS + /// \param[in] portDelineator if \a str contains a port, delineate the port with this character. portDelineator should not be '.', ':', '%', '-', '/', a number, or a-f + /// \param[in] ipVersion Only used if str is a pre-defined address in the wrong format, such as 127.0.0.1 but you want ip version 6, so you can pass 6 here to do the conversion + /// \note The current port is unchanged if a port is not specified in \a str + /// \return True on success, false on ipVersion does not match type of passed string + bool FromString(const char *str, char portDelineator='|', int ipVersion=0); + + /// Same as FromString(), but you explicitly set a port at the same time + bool FromStringExplicitPort(const char *str, unsigned short port, int ipVersion=0); + + /// Copy the port from another SystemAddress structure + void CopyPort( const SystemAddress& right ); + + /// Returns if two system addresses have the same IP (port is not checked) + bool EqualsExcludingPort( const SystemAddress& right ) const; + + /// Returns the port in host order (this is what you normally use) + unsigned short GetPort(void) const; + + /// \internal Returns the port in network order + unsigned short GetPortNetworkOrder(void) const; + + /// Sets the port. The port value should be in host order (this is what you normally use) + void SetPort(unsigned short s); + + /// \internal Sets the port. The port value should already be in network order. + void SetPortNetworkOrder(unsigned short s); + + /// Old version, for crap platforms that don't support newer socket functions + void SetBinaryAddress(const char *str, char portDelineator=':'); + /// Old version, for crap platforms that don't support newer socket functions + void ToString_Old(bool writePort, char *dest, char portDelineator=':') const; + + /// \internal sockaddr_in6 requires extra data beyond just the IP and port. Copy that extra data from an existing SystemAddress that already has it + void FixForIPVersion(const SystemAddress &boundAddressToSocket); + + SystemAddress& operator = ( const SystemAddress& input ); + bool operator==( const SystemAddress& right ) const; + bool operator!=( const SystemAddress& right ) const; + bool operator > ( const SystemAddress& right ) const; + bool operator < ( const SystemAddress& right ) const; + + /// \internal Used internally for fast lookup. Optional (use -1 to do regular lookup). Don't transmit this. + SystemIndex systemIndex; + + private: + +#if RAKNET_SUPPORT_IPV6==1 + void ToString_New(bool writePort, char *dest, char portDelineator) const; +#endif +}; + +/// Uniquely identifies an instance of RakPeer. Use RakPeer::GetGuidFromSystemAddress() and RakPeer::GetSystemAddressFromGuid() to go between SystemAddress and RakNetGUID +/// Use RakPeer::GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS) to get your own GUID +struct RAK_DLL_EXPORT RakNetGUID +{ + RakNetGUID(); + explicit RakNetGUID(uint64_t _g) {g=_g; systemIndex=(SystemIndex)-1;} +// uint32_t g[6]; + uint64_t g; + + // Return the GUID as a string + // Returns a static string + // NOT THREADSAFE + const char *ToString(void) const; + + // Return the GUID as a string + // dest must be large enough to hold the output + // THREADSAFE + void ToString(char *dest) const; + + bool FromString(const char *source); + + static unsigned long ToUint32( const RakNetGUID &g ); + + RakNetGUID& operator = ( const RakNetGUID& input ) + { + g=input.g; + systemIndex=input.systemIndex; + return *this; + } + + // Used internally for fast lookup. Optional (use -1 to do regular lookup). Don't transmit this. + SystemIndex systemIndex; + static int size() {return (int) sizeof(uint64_t);} + + bool operator==( const RakNetGUID& right ) const; + bool operator!=( const RakNetGUID& right ) const; + bool operator > ( const RakNetGUID& right ) const; + bool operator < ( const RakNetGUID& right ) const; +}; + +/// Index of an invalid SystemAddress +//const SystemAddress UNASSIGNED_SYSTEM_ADDRESS = +//{ +// 0xFFFFFFFF, 0xFFFF +//}; +#ifndef SWIG +const SystemAddress UNASSIGNED_SYSTEM_ADDRESS; +const RakNetGUID UNASSIGNED_RAKNET_GUID((uint64_t)-1); +#endif +//{ +// {0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF} +// 0xFFFFFFFFFFFFFFFF +//}; + + +struct RAK_DLL_EXPORT AddressOrGUID +{ + RakNetGUID rakNetGuid; + SystemAddress systemAddress; + + SystemIndex GetSystemIndex(void) const {if (rakNetGuid!=UNASSIGNED_RAKNET_GUID) return rakNetGuid.systemIndex; else return systemAddress.systemIndex;} + bool IsUndefined(void) const {return rakNetGuid==UNASSIGNED_RAKNET_GUID && systemAddress==UNASSIGNED_SYSTEM_ADDRESS;} + void SetUndefined(void) {rakNetGuid=UNASSIGNED_RAKNET_GUID; systemAddress=UNASSIGNED_SYSTEM_ADDRESS;} + static unsigned long ToInteger( const AddressOrGUID &aog ); + const char *ToString(bool writePort=true) const; + void ToString(bool writePort, char *dest) const; + + AddressOrGUID() {} + AddressOrGUID( const AddressOrGUID& input ) + { + rakNetGuid=input.rakNetGuid; + systemAddress=input.systemAddress; + } + AddressOrGUID( const SystemAddress& input ) + { + rakNetGuid=UNASSIGNED_RAKNET_GUID; + systemAddress=input; + } + AddressOrGUID( Packet *packet ); + AddressOrGUID( const RakNetGUID& input ) + { + rakNetGuid=input; + systemAddress=UNASSIGNED_SYSTEM_ADDRESS; + } + AddressOrGUID& operator = ( const AddressOrGUID& input ) + { + rakNetGuid=input.rakNetGuid; + systemAddress=input.systemAddress; + return *this; + } + + AddressOrGUID& operator = ( const SystemAddress& input ) + { + rakNetGuid=UNASSIGNED_RAKNET_GUID; + systemAddress=input; + return *this; + } + + AddressOrGUID& operator = ( const RakNetGUID& input ) + { + rakNetGuid=input; + systemAddress=UNASSIGNED_SYSTEM_ADDRESS; + return *this; + } + + inline bool operator==( const AddressOrGUID& right ) const {return (rakNetGuid!=UNASSIGNED_RAKNET_GUID && rakNetGuid==right.rakNetGuid) || (systemAddress!=UNASSIGNED_SYSTEM_ADDRESS && systemAddress==right.systemAddress);} +}; + +typedef uint64_t NetworkID; + +/// This represents a user message from another system. +struct Packet +{ + /// The system that send this packet. + SystemAddress systemAddress; + + /// A unique identifier for the system that sent this packet, regardless of IP address (internal / external / remote system) + /// Only valid once a connection has been established (ID_CONNECTION_REQUEST_ACCEPTED, or ID_NEW_INCOMING_CONNECTION) + /// Until that time, will be UNASSIGNED_RAKNET_GUID + RakNetGUID guid; + + /// The length of the data in bytes + unsigned int length; + + /// The length of the data in bits + BitSize_t bitSize; + + /// The data from the sender + unsigned char* data; + + /// @internal + /// Indicates whether to delete the data, or to simply delete the packet. + bool deleteData; + + /// @internal + /// If true, this message is meant for the user, not for the plugins, so do not process it through plugins + bool wasGeneratedLocally; +}; + +/// Index of an unassigned player +const SystemIndex UNASSIGNED_PLAYER_INDEX = 65535; + +/// Unassigned object ID +const NetworkID UNASSIGNED_NETWORK_ID = (uint64_t) -1; + +const int PING_TIMES_ARRAY_SIZE = 5; + +struct RAK_DLL_EXPORT uint24_t +{ + uint32_t val; + + uint24_t() {} + inline operator uint32_t() { return val; } + inline operator uint32_t() const { return val; } + + inline uint24_t(const uint24_t& a) {val=a.val;} + inline uint24_t operator++() {++val; val&=0x00FFFFFF; return *this;} + inline uint24_t operator--() {--val; val&=0x00FFFFFF; return *this;} + inline uint24_t operator++(int) {uint24_t temp(val); ++val; val&=0x00FFFFFF; return temp;} + inline uint24_t operator--(int) {uint24_t temp(val); --val; val&=0x00FFFFFF; return temp;} + inline uint24_t operator&(const uint24_t& a) {return uint24_t(val&a.val);} + inline uint24_t& operator=(const uint24_t& a) { val=a.val; return *this; } + inline uint24_t& operator+=(const uint24_t& a) { val+=a.val; val&=0x00FFFFFF; return *this; } + inline uint24_t& operator-=(const uint24_t& a) { val-=a.val; val&=0x00FFFFFF; return *this; } + inline bool operator==( const uint24_t& right ) const {return val==right.val;} + inline bool operator!=( const uint24_t& right ) const {return val!=right.val;} + inline bool operator > ( const uint24_t& right ) const {return val>right.val;} + inline bool operator < ( const uint24_t& right ) const {return val ( const uint32_t& right ) const {return val>(right&0x00FFFFFF);} + inline bool operator < ( const uint32_t& right ) const {return val<(right&0x00FFFFFF);} + inline const uint24_t operator+( const uint32_t &other ) const { return uint24_t(val+other); } + inline const uint24_t operator-( const uint32_t &other ) const { return uint24_t(val-other); } + inline const uint24_t operator/( const uint32_t &other ) const { return uint24_t(val/other); } + inline const uint24_t operator*( const uint32_t &other ) const { return uint24_t(val*other); } +}; + +} // namespace RakNet + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetVersion.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetVersion.h new file mode 100644 index 0000000..5ef88c8 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNetVersion.h @@ -0,0 +1,8 @@ +#define RAKNET_VERSION "4.036" +#define RAKNET_VERSION_NUMBER 4.036 + +#define RAKNET_DATE "2/1/2012" + +// What compatible protocol version RakNet is using. When this value changes, it indicates this version of RakNet cannot connection to an older version. +// ID_INCOMPATIBLE_PROTOCOL_VERSION will be returned on connection attempt in this case +#define RAKNET_PROTOCOL_VERSION 5 diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNet_vc8.vcproj b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNet_vc8.vcproj new file mode 100644 index 0000000..a75edee --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNet_vc8.vcproj @@ -0,0 +1,849 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNet_vc9.vcproj b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNet_vc9.vcproj new file mode 100644 index 0000000..a75edee --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakNet_vc9.vcproj @@ -0,0 +1,849 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakPeer.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakPeer.cpp new file mode 100644 index 0000000..5608422 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakPeer.cpp @@ -0,0 +1,5964 @@ +// \file +// +// This file is part of RakNet Copyright 2003 Jenkins Software LLC +// +// Usage of RakNet is subject to the appropriate license agreement. + + +#define CAT_NEUTER_EXPORT /* Neuter dllimport for libcat */ + +#include "RakNetDefines.h" +#include "RakPeer.h" +#include "RakNetTypes.h" + +#ifdef _WIN32 + +#else +#include +#endif + +// #if defined(new) +// #pragma push_macro("new") +// #undef new +// #define RMO_NEW_UNDEF_ALLOCATING_QUEUE +// #endif + +#include +#include // toupper +#include +#include "GetTime.h" +#include "MessageIdentifiers.h" +#include "DS_HuffmanEncodingTree.h" +#include "Rand.h" +#include "PluginInterface2.h" +#include "StringCompressor.h" +#include "StringTable.h" +#include "NetworkIDObject.h" +#include "RakNetTypes.h" +#include "SHA1.h" +#include "RakSleep.h" +#include "RakAssert.h" +#include "RakNetVersion.h" +#include "NetworkIDManager.h" +#include "gettimeofday.h" +#include "SignaledEvent.h" +#include "SuperFastHash.h" +#include "RakAlloca.h" +#include "WSAStartupSingleton.h" + +#ifdef USE_THREADED_SEND +#include "SendToThread.h" +#endif + +#ifdef CAT_AUDIT +#define CAT_AUDIT_PRINTF(...) printf(__VA_ARGS__) +#else +#define CAT_AUDIT_PRINTF(...) +#endif + +namespace RakNet +{ +RAK_THREAD_DECLARATION(UpdateNetworkLoop); +RAK_THREAD_DECLARATION(RecvFromLoop); +RAK_THREAD_DECLARATION(UDTConnect); +} +#define REMOTE_SYSTEM_LOOKUP_HASH_MULTIPLE 8 + +#if !defined ( __APPLE__ ) && !defined ( __APPLE_CC__ ) +#include // malloc +#endif + + + +#if defined(_WIN32) +// +#else +/* +#include // Console 2 +#include +extern bool _extern_Console2LoadModules(void); +extern int _extern_Console2GetConnectionStatus(void); +extern int _extern_Console2GetLobbyStatus(void); +//extern bool Console2StartupFluff(unsigned int *); +extern void Console2ShutdownFluff(void); +//extern unsigned int Console2ActivateConnection(unsigned int, void *); +//extern bool Console2BlockOnEstablished(void); +extern void Console2GetIPAndPort(unsigned int, char *, unsigned short *, unsigned int ); +//extern void Console2DeactivateConnection(unsigned int, unsigned int); +*/ +#endif + + +static const int NUM_MTU_SIZES=3; + + + +static const int mtuSizes[NUM_MTU_SIZES]={MAXIMUM_MTU_SIZE, 1200, 576}; + + +// Note to self - if I change this it might affect RECIPIENT_OFFLINE_MESSAGE_INTERVAL in Natpunchthrough.cpp +//static const int MAX_OPEN_CONNECTION_REQUESTS=8; +//static const int TIME_BETWEEN_OPEN_CONNECTION_REQUESTS=500; + +#ifdef _MSC_VER +#pragma warning( push ) +#endif + +using namespace RakNet; + +static RakNetRandom rnr; + +struct RakPeerAndIndex +{ + SOCKET s; + unsigned short remotePortRakNetWasStartedOn_PS3; + RakPeer *rakPeer; + unsigned int extraSocketOptions; +}; + +static const unsigned int MAX_OFFLINE_DATA_LENGTH=400; // I set this because I limit ID_CONNECTION_REQUEST to 512 bytes, and the password is appended to that packet. + +// Used to distinguish between offline messages with data, and messages from the reliability layer +// Should be different than any message that could result from messages from the reliability layer +#if !defined(__GNUC__) +#pragma warning(disable:4309) // 'initializing' : truncation of constant value +#endif +// Make sure highest bit is 0, so isValid in DatagramHeaderFormat is false +static const char OFFLINE_MESSAGE_DATA_ID[16]={0x00,0xFF,0xFF,0x00,0xFE,0xFE,0xFE,0xFE,0xFD,0xFD,0xFD,0xFD,0x12,0x34,0x56,0x78}; + +struct PacketFollowedByData +{ + Packet p; + unsigned char data[1]; +}; + +Packet *RakPeer::AllocPacket(unsigned dataSize, const char *file, unsigned int line) +{ + // Crashes when dataSize is 4 bytes - not sure why +// unsigned char *data = (unsigned char *) rakMalloc_Ex(sizeof(PacketFollowedByData)+dataSize, file, line); +// Packet *p = &((PacketFollowedByData *)data)->p; +// p->data=((PacketFollowedByData *)data)->data; +// p->length=dataSize; +// p->bitSize=BYTES_TO_BITS(dataSize); +// p->deleteData=false; +// p->guid=UNASSIGNED_RAKNET_GUID; +// return p; + + RakNet::Packet *p; + packetAllocationPoolMutex.Lock(); + p = packetAllocationPool.Allocate(file,line); + packetAllocationPoolMutex.Unlock(); + p = new ((void*)p) Packet; + p->data=(unsigned char*) rakMalloc_Ex(dataSize,file,line); + p->length=dataSize; + p->bitSize=BYTES_TO_BITS(dataSize); + p->deleteData=true; + p->guid=UNASSIGNED_RAKNET_GUID; + p->wasGeneratedLocally=false; + return p; +} + +Packet *RakPeer::AllocPacket(unsigned dataSize, unsigned char *data, const char *file, unsigned int line) +{ + // Packet *p = (Packet *)rakMalloc_Ex(sizeof(Packet), file, line); + RakNet::Packet *p; + packetAllocationPoolMutex.Lock(); + p = packetAllocationPool.Allocate(file,line); + packetAllocationPoolMutex.Unlock(); + p = new ((void*)p) Packet; + RakAssert(p); + p->data=data; + p->length=dataSize; + p->bitSize=BYTES_TO_BITS(dataSize); + p->deleteData=true; + p->guid=UNASSIGNED_RAKNET_GUID; + p->wasGeneratedLocally=false; + return p; +} + +STATIC_FACTORY_DEFINITIONS(RakPeerInterface,RakPeer) + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Constructor +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +RakPeer::RakPeer() +{ + errorState = 0; +#if LIBCAT_SECURITY==1 + // Encryption and security + CAT_AUDIT_PRINTF("AUDIT: Initializing RakPeer security flags: using_security = false, server_handshake = null, cookie_jar = null\n"); + _using_security = false; + _server_handshake = 0; + _cookie_jar = 0; +#endif + + StringCompressor::AddReference(); + RakNet::StringTable::AddReference(); + WSAStartupSingleton::AddRef(); + + defaultMTUSize = mtuSizes[NUM_MTU_SIZES-1]; + trackFrequencyTable = false; + maximumIncomingConnections = 0; + maximumNumberOfPeers = 0; + //remoteSystemListSize=0; + remoteSystemList = 0; + activeSystemList = 0; + activeSystemListSize=0; + remoteSystemLookup=0; + bytesSentPerSecond = bytesReceivedPerSecond = 0; + endThreads = true; + isMainLoopThreadActive = false; + + + + + + // isRecvfromThreadActive=false; +#if defined(GET_TIME_SPIKE_LIMIT) && GET_TIME_SPIKE_LIMIT>0 + occasionalPing = true; +#else + occasionalPing = false; +#endif + allowInternalRouting=false; + for (unsigned int i=0; i < MAXIMUM_NUMBER_OF_INTERNAL_IDS; i++) + ipList[i]=UNASSIGNED_SYSTEM_ADDRESS; + allowConnectionResponseIPMigration = false; + //incomingPasswordLength=outgoingPasswordLength=0; + incomingPasswordLength=0; + splitMessageProgressInterval=0; + //unreliableTimeout=0; + unreliableTimeout=1000; + maxOutgoingBPS=0; + firstExternalID=UNASSIGNED_SYSTEM_ADDRESS; + myGuid=UNASSIGNED_RAKNET_GUID; + userUpdateThreadPtr=0; + userUpdateThreadData=0; + +#ifdef _DEBUG + // Wait longer to disconnect in debug so I don't get disconnected while tracing + defaultTimeoutTime=30000; +#else + defaultTimeoutTime=10000; +#endif + +#ifdef _DEBUG + _packetloss=0.0; + _minExtraPing=0; + _extraPingVariance=0; +#endif + + bufferedCommands.SetPageSize(sizeof(BufferedCommandStruct)*16); + socketQueryOutput.SetPageSize(sizeof(SocketQueryOutput)*8); + bufferedPackets.SetPageSize(sizeof(RecvFromStruct)*BUFFERED_PACKETS_PAGE_SIZE); // This is big, keep the size down + + packetAllocationPoolMutex.Lock(); + packetAllocationPool.SetPageSize(sizeof(DataStructures::MemoryPool::MemoryWithPage)*32); + packetAllocationPoolMutex.Unlock(); + + remoteSystemIndexPool.SetPageSize(sizeof(DataStructures::MemoryPool::MemoryWithPage)*32); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GenerateGUID(); + + quitAndDataEvents.InitEvent(); + limitConnectionFrequencyFromTheSameIP=false; + ResetSendReceipt(); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Destructor +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +RakPeer::~RakPeer() +{ + Shutdown( 0, 0 ); + + // Free the ban list. + ClearBanList(); + + StringCompressor::RemoveReference(); + RakNet::StringTable::RemoveReference(); + WSAStartupSingleton::Deref(); + + quitAndDataEvents.CloseEvent(); + +#if LIBCAT_SECURITY==1 + // Encryption and security + CAT_AUDIT_PRINTF("AUDIT: Deleting RakPeer security objects, handshake = %x, cookie jar = %x\n", _server_handshake, _cookie_jar); + if (_server_handshake) RakNet::OP_DELETE(_server_handshake,_FILE_AND_LINE_); + if (_cookie_jar) RakNet::OP_DELETE(_cookie_jar,_FILE_AND_LINE_); +#endif + + + + + + + + + + +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// \brief Starts the network threads, opens the listen port. +// You must call this before calling Connect(). +// Multiple calls while already active are ignored. To call this function again with different settings, you must first call Shutdown(). +// \note Call SetMaximumIncomingConnections if you want to accept incoming connections +// \param[in] maxConnections The maximum number of connections between this instance of RakPeer and another instance of RakPeer. Required so the network can preallocate and for thread safety. A pure client would set this to 1. A pure server would set it to the number of allowed clients.- A hybrid would set it to the sum of both types of connections +// \param[in] localPort The port to listen for connections on. +// \param[in] _threadSleepTimer How many ms to Sleep each internal update cycle. With new congestion control, the best results will be obtained by passing 10. +// \param[in] socketDescriptors An array of SocketDescriptor structures to force RakNet to listen on a particular IP address or port (or both). Each SocketDescriptor will represent one unique socket. Do not pass redundant structures. To listen on a specific port, you can pass &socketDescriptor, 1SocketDescriptor(myPort,0); such as for a server. For a client, it is usually OK to just pass SocketDescriptor(); +// \param[in] socketDescriptorCount The size of the \a socketDescriptors array. Pass 1 if you are not sure what to pass. +// \return False on failure (can't create socket or thread), true on success. +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +StartupResult RakPeer::Startup( unsigned short maxConnections, SocketDescriptor *socketDescriptors, unsigned socketDescriptorCount, int threadPriority ) +{ + errorState = 0; + + if (IsActive()) + return RAKNET_ALREADY_STARTED; + + if (threadPriority==-99999) + { + + +#if defined(_WIN32) + threadPriority=0; + + +#else + threadPriority=1000; +#endif + } + + + // Fill out ipList structure + unsigned int i; + + SocketLayer::GetMyIP( ipList ); +// for (i=0; i < MAXIMUM_NUMBER_OF_INTERNAL_IDS; i++) +// { +// if (ipList[i]!=UNASSIGNED_SYSTEM_ADDRESS) +// { +// char str[128]; +// ipList[i].ToString(false,str); +// printf("%s\n",str); +// } +// } + + + if (myGuid==UNASSIGNED_RAKNET_GUID) + { + rnr.SeedMT( GenerateSeedFromGuid() ); + } + + RakPeerAndIndex rpai[32]; + RakAssert(socketDescriptorCount<32); + + RakAssert(socketDescriptors && socketDescriptorCount>=1); + + if (socketDescriptors==0 || socketDescriptorCount<1) + return INVALID_SOCKET_DESCRIPTORS; + + //unsigned short localPort; + //localPort=socketDescriptors[0].port; + + RakAssert( maxConnections > 0 ); + + if ( maxConnections <= 0 ) + return INVALID_MAX_CONNECTIONS; + + DerefAllSockets(); + + + // Go through all socket descriptors and precreate sockets on the specified addresses + for (i=0; i rns(RakNet::OP_NEW(_FILE_AND_LINE_)); + if (socketDescriptors[i].remotePortRakNetWasStartedOn_PS3_PSP2==0) + { + rns->s = (unsigned int) SocketLayer::CreateBoundSocket( socketDescriptors[i].port, true, addrToBind, 100, socketDescriptors[i].extraSocketOptions, socketDescriptors[i].socketFamily ); + } + else + { + + + + + + } + + if ((SOCKET)rns->s==(SOCKET)-1) + { + DerefAllSockets(); + return SOCKET_FAILED_TO_BIND; + } + + SocketLayer::GetSystemAddress( rns->s, &rns->boundAddress ); + + rns->remotePortRakNetWasStartedOn_PS3_PSP2=socketDescriptors[i].remotePortRakNetWasStartedOn_PS3_PSP2; + rns->extraSocketOptions=socketDescriptors[i].extraSocketOptions; + rns->userConnectionSocketIndex=i; + +#if RAKNET_SUPPORT_IPV6==0 + if (addrToBind==0) + rns->boundAddress.SetToLoopback(4); +#endif + + int zero=0; + if (SocketLayer::SendTo((SOCKET)rns->s, (const char*) &zero,4,rns->boundAddress, rns->remotePortRakNetWasStartedOn_PS3_PSP2, rns->extraSocketOptions, _FILE_AND_LINE_)!=0) + { + DerefAllSockets(); + return SOCKET_FAILED_TEST_SEND; + } + + socketList.Push(rns, _FILE_AND_LINE_ ); + + } + + + if ( maximumNumberOfPeers == 0 ) + { + // Don't allow more incoming connections than we have peers. + if ( maximumIncomingConnections > maxConnections ) + maximumIncomingConnections = maxConnections; + + maximumNumberOfPeers = maxConnections; + // 04/19/2006 - Don't overallocate because I'm no longer allowing connected pings. + // The disconnects are not consistently processed and the process was sloppy and complicated. + // Allocate 10% extra to handle new connections from players trying to connect when the server is full + //remoteSystemListSize = maxConnections;// * 11 / 10 + 1; + + // remoteSystemList in Single thread + //remoteSystemList = RakNet::OP_NEW( _FILE_AND_LINE_ ); + remoteSystemList = RakNet::OP_NEW_ARRAY(maximumNumberOfPeers, _FILE_AND_LINE_ ); + + remoteSystemLookup = RakNet::OP_NEW_ARRAY((unsigned int) maximumNumberOfPeers * REMOTE_SYSTEM_LOOKUP_HASH_MULTIPLE, _FILE_AND_LINE_ ); + + activeSystemList = RakNet::OP_NEW_ARRAY(maximumNumberOfPeers, _FILE_AND_LINE_ ); + + for ( i = 0; i < maximumNumberOfPeers; i++ ) + //for ( i = 0; i < remoteSystemListSize; i++ ) + { + // remoteSystemList in Single thread + remoteSystemList[ i ].isActive = false; + remoteSystemList[ i ].systemAddress = UNASSIGNED_SYSTEM_ADDRESS; + remoteSystemList[ i ].guid = UNASSIGNED_RAKNET_GUID; + remoteSystemList[ i ].myExternalSystemAddress = UNASSIGNED_SYSTEM_ADDRESS; + remoteSystemList[ i ].connectMode=RemoteSystemStruct::NO_ACTION; + remoteSystemList[ i ].MTUSize = defaultMTUSize; + remoteSystemList[ i ].remoteSystemIndex = (SystemIndex) i; +#ifdef _DEBUG + remoteSystemList[ i ].reliabilityLayer.ApplyNetworkSimulator(_packetloss, _minExtraPing, _extraPingVariance); +#endif + + // All entries in activeSystemList have valid pointers all the time. + activeSystemList[ i ] = &remoteSystemList[ i ]; + } + + for (unsigned int i=0; i < (unsigned int) maximumNumberOfPeers*REMOTE_SYSTEM_LOOKUP_HASH_MULTIPLE; i++) + { + remoteSystemLookup[i]=0; + } + } + + // For histogram statistics + // nextReadBytesTime=0; + // lastSentBytes=lastReceivedBytes=0; + + if ( endThreads ) + { + updateCycleIsRunning = false; + endThreads = false; + + ClearBufferedCommands(); + ClearBufferedPackets(); + ClearSocketQueryOutput(); + + if ( isMainLoopThreadActive == false ) + { + int errorCode; + + + + + + + + errorCode = RakNet::RakThread::Create(UpdateNetworkLoop, this, threadPriority); + + + if ( errorCode != 0 ) + { + Shutdown( 0, 0 ); + return FAILED_TO_CREATE_NETWORK_THREAD; + } + + RakAssert(isRecvFromLoopThreadActive.GetValue()==0); + for (i=0; is; + rpai[i].rakPeer=this; + + + + + + errorCode = RakNet::RakThread::Create(RecvFromLoop, &rpai[i], threadPriority); + + + if ( errorCode != 0 ) + { + Shutdown( 0, 0 ); + return FAILED_TO_CREATE_NETWORK_THREAD; + } + } + + + while ( isRecvFromLoopThreadActive.GetValue() < (uint32_t) socketDescriptorCount ) + RakSleep(10); + } + + // Wait for the threads to activate. When they are active they will set these variables to true + + while ( isMainLoopThreadActive == false ) + RakSleep(10); + + } + + for (i=0; i < pluginListTS.Size(); i++) + { + pluginListTS[i]->OnRakPeerStartup(); + } + + for (i=0; i < pluginListNTS.Size(); i++) + { + pluginListNTS[i]->OnRakPeerStartup(); + } + +#ifdef USE_THREADED_SEND + RakNet::SendToThread::AddRef(); +#endif + + return RAKNET_STARTED; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description: +// Must be called while offline +// +// If you accept connections, you must call this or else security will not be enabled for incoming connections. +// +// This feature requires more round trips, bandwidth, and CPU time for the connection handshake +// x64 builds require under 25% of the CPU time of other builds +// +// See the Encryption sample for example usage +// +// Parameters: +// publicKey = A pointer to the public key for accepting new connections +// privateKey = A pointer to the private key for accepting new connections +// If the private keys are 0, then a new key will be generated when this function is called +// bRequireClientKey: Should be set to false for most servers. Allows the server to accept a public key from connecting clients as a proof of identity but eats twice as much CPU time as a normal connection +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +bool RakPeer::InitializeSecurity(const char *public_key, const char *private_key, bool bRequireClientKey) +{ +#if LIBCAT_SECURITY==1 + if ( endThreads == false ) + return false; + + // Copy client public key requirement flag + _require_client_public_key = bRequireClientKey; + + if (_server_handshake) + { + CAT_AUDIT_PRINTF("AUDIT: Deleting old server_handshake %x\n", _server_handshake); + RakNet::OP_DELETE(_server_handshake,_FILE_AND_LINE_); + } + if (_cookie_jar) + { + CAT_AUDIT_PRINTF("AUDIT: Deleting old cookie jar %x\n", _cookie_jar); + RakNet::OP_DELETE(_cookie_jar,_FILE_AND_LINE_); + } + + _server_handshake = RakNet::OP_NEW(_FILE_AND_LINE_); + _cookie_jar = RakNet::OP_NEW(_FILE_AND_LINE_); + + CAT_AUDIT_PRINTF("AUDIT: Created new server_handshake %x\n", _server_handshake); + CAT_AUDIT_PRINTF("AUDIT: Created new cookie jar %x\n", _cookie_jar); + CAT_AUDIT_PRINTF("AUDIT: Running _server_handshake->Initialize()\n"); + + if (_server_handshake->Initialize(public_key, private_key)) + { + CAT_AUDIT_PRINTF("AUDIT: Successfully initialized, filling cookie jar with goodies, storing public key and setting using security flag to true\n"); + + _server_handshake->FillCookieJar(_cookie_jar); + + memcpy(my_public_key, public_key, sizeof(my_public_key)); + + _using_security = true; + return true; + } + + CAT_AUDIT_PRINTF("AUDIT: Failure to initialize so deleting server handshake and cookie jar; also setting using_security flag = false\n"); + + RakNet::OP_DELETE(_server_handshake,_FILE_AND_LINE_); + _server_handshake=0; + RakNet::OP_DELETE(_cookie_jar,_FILE_AND_LINE_); + _cookie_jar=0; + _using_security = false; + return false; +#else + (void) public_key; + (void) private_key; + (void) bRequireClientKey; + + return false; +#endif +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description +// Must be called while offline +// Disables security for incoming connections. +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::DisableSecurity( void ) +{ +#if LIBCAT_SECURITY==1 + CAT_AUDIT_PRINTF("AUDIT: DisableSecurity() called, so deleting _server_handshake %x and cookie_jar %x\n", _server_handshake, _cookie_jar); + RakNet::OP_DELETE(_server_handshake,_FILE_AND_LINE_); + _server_handshake=0; + RakNet::OP_DELETE(_cookie_jar,_FILE_AND_LINE_); + _cookie_jar=0; + + _using_security = false; +#endif +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::AddToSecurityExceptionList(const char *ip) +{ + securityExceptionMutex.Lock(); + securityExceptionList.Insert(RakString(ip), _FILE_AND_LINE_); + securityExceptionMutex.Unlock(); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::RemoveFromSecurityExceptionList(const char *ip) +{ + if (securityExceptionList.Size()==0) + return; + + if (ip==0) + { + securityExceptionMutex.Lock(); + securityExceptionList.Clear(false, _FILE_AND_LINE_); + securityExceptionMutex.Unlock(); + } + else + { + unsigned i=0; + securityExceptionMutex.Lock(); + while (i < securityExceptionList.Size()) + { + if (securityExceptionList[i].IPAddressMatch(ip)) + { + securityExceptionList[i]=securityExceptionList[securityExceptionList.Size()-1]; + securityExceptionList.RemoveAtIndex(securityExceptionList.Size()-1); + } + else + i++; + } + securityExceptionMutex.Unlock(); + } +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +bool RakPeer::IsInSecurityExceptionList(const char *ip) +{ + if (securityExceptionList.Size()==0) + return false; + + unsigned i=0; + securityExceptionMutex.Lock(); + for (; i < securityExceptionList.Size(); i++) + { + if (securityExceptionList[i].IPAddressMatch(ip)) + { + securityExceptionMutex.Unlock(); + return true; + } + } + securityExceptionMutex.Unlock(); + return false; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description: +// Sets how many incoming connections are allowed. If this is less than the number of players currently connected, no +// more players will be allowed to connect. If this is greater than the maximum number of peers allowed, it will be reduced +// to the maximum number of peers allowed. Defaults to 0. +// +// Parameters: +// numberAllowed - Maximum number of incoming connections allowed. +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::SetMaximumIncomingConnections( unsigned short numberAllowed ) +{ + maximumIncomingConnections = numberAllowed; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description: +// Returns the maximum number of incoming connections, which is always <= maxConnections +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +unsigned short RakPeer::GetMaximumIncomingConnections( void ) const +{ + return maximumIncomingConnections; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Returns how many open connections there are at this time +// \return the number of open connections +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +unsigned short RakPeer::NumberOfConnections(void) const +{ + DataStructures::List addresses; + DataStructures::List guids; + GetSystemList(addresses, guids); + return (unsigned short) addresses.Size(); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description: +// Sets the password incoming connections must match in the call to Connect (defaults to none) +// Pass 0 to passwordData to specify no password +// +// Parameters: +// passwordData: A data block that incoming connections must match. This can be just a password, or can be a stream of data. +// - Specify 0 for no password data +// passwordDataLength: The length in bytes of passwordData +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::SetIncomingPassword( const char* passwordData, int passwordDataLength ) +{ + //if (passwordDataLength > MAX_OFFLINE_DATA_LENGTH) + // passwordDataLength=MAX_OFFLINE_DATA_LENGTH; + + if (passwordDataLength > 255) + passwordDataLength=255; + + if (passwordData==0) + passwordDataLength=0; + + // Not threadsafe but it's not important enough to lock. Who is going to change the password a lot during runtime? + // It won't overflow at least because incomingPasswordLength is an unsigned char + if (passwordDataLength>0) + memcpy(incomingPassword, passwordData, passwordDataLength); + incomingPasswordLength=(unsigned char)passwordDataLength; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::GetIncomingPassword( char* passwordData, int *passwordDataLength ) +{ + if (passwordData==0) + { + *passwordDataLength=incomingPasswordLength; + return; + } + + if (*passwordDataLength > incomingPasswordLength) + *passwordDataLength=incomingPasswordLength; + + if (*passwordDataLength>0) + memcpy(passwordData, incomingPassword, *passwordDataLength); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description: +// Call this to connect to the specified host (ip or domain name) and server port. +// Calling Connect and not calling SetMaximumIncomingConnections acts as a dedicated client. Calling both acts as a true peer. +// This is a non-blocking connection. You know the connection is successful when IsConnected() returns true +// or receive gets a packet with the type identifier ID_CONNECTION_REQUEST_ACCEPTED. If the connection is not +// successful, such as rejected connection or no response then neither of these things will happen. +// Requires that you first call Initialize +// +// Parameters: +// host: Either a dotted IP address or a domain name +// remotePort: Which port to connect to on the remote machine. +// passwordData: A data block that must match the data block on the server. This can be just a password, or can be a stream of data +// passwordDataLength: The length in bytes of passwordData +// +// Returns: +// True on successful initiation. False on incorrect parameters, internal error, or too many existing peers +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ConnectionAttemptResult RakPeer::Connect( const char* host, unsigned short remotePort, const char *passwordData, int passwordDataLength, PublicKey *publicKey, unsigned connectionSocketIndex, unsigned sendConnectionAttemptCount, unsigned timeBetweenSendConnectionAttemptsMS, RakNet::TimeMS timeoutTime ) +{ + // If endThreads is true here you didn't call Startup() first. + if ( host == 0 || endThreads || connectionSocketIndex>=socketList.Size() ) + return INVALID_PARAMETER; + + RakAssert(remotePort!=0); + + connectionSocketIndex=GetRakNetSocketFromUserConnectionSocketIndex(connectionSocketIndex); + + if (passwordDataLength>255) + passwordDataLength=255; + + if (passwordData==0) + passwordDataLength=0; + + // Not threadsafe but it's not important enough to lock. Who is going to change the password a lot during runtime? + // It won't overflow at least because outgoingPasswordLength is an unsigned char +// if (passwordDataLength>0) +// memcpy(outgoingPassword, passwordData, passwordDataLength); +// outgoingPasswordLength=(unsigned char) passwordDataLength; + + // 04/02/09 - Can't remember why I disabled connecting to self, but it seems to work + // Connecting to ourselves in the same instance of the program? +// if ( ( strcmp( host, "127.0.0.1" ) == 0 || strcmp( host, "0.0.0.0" ) == 0 ) && remotePort == mySystemAddress[0].port ) +// return false; + + return SendConnectionRequest( host, remotePort, passwordData, passwordDataLength, publicKey, connectionSocketIndex, 0, sendConnectionAttemptCount, timeBetweenSendConnectionAttemptsMS, timeoutTime); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +ConnectionAttemptResult RakPeer::ConnectWithSocket(const char* host, unsigned short remotePort, const char *passwordData, int passwordDataLength, RakNetSmartPtr socket, PublicKey *publicKey, unsigned sendConnectionAttemptCount, unsigned timeBetweenSendConnectionAttemptsMS, RakNet::TimeMS timeoutTime) +{ + if ( host == 0 || endThreads || socket.IsNull() ) + return INVALID_PARAMETER; + + if (passwordDataLength>255) + passwordDataLength=255; + + if (passwordData==0) + passwordDataLength=0; + + return SendConnectionRequest( host, remotePort, passwordData, passwordDataLength, publicKey, 0, 0, sendConnectionAttemptCount, timeBetweenSendConnectionAttemptsMS, timeoutTime, socket ); + +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description: +// Stops the network threads and close all connections. Multiple calls are ok. +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::Shutdown( unsigned int blockDuration, unsigned char orderingChannel, PacketPriority disconnectionNotificationPriority ) +{ + unsigned i,j; + bool anyActive; + RakNet::TimeMS startWaitingTime; +// SystemAddress systemAddress; + RakNet::TimeMS time; + //unsigned short systemListSize = remoteSystemListSize; // This is done for threading reasons + unsigned short systemListSize = maximumNumberOfPeers; + + if ( blockDuration > 0 ) + { + for ( i = 0; i < systemListSize; i++ ) + { + // remoteSystemList in user thread + if (remoteSystemList[i].isActive) + NotifyAndFlagForShutdown(remoteSystemList[i].systemAddress, false, orderingChannel, disconnectionNotificationPriority); + } + + time = RakNet::GetTimeMS(); + startWaitingTime = time; + while ( time - startWaitingTime < blockDuration ) + { + anyActive=false; + for (j=0; j < systemListSize; j++) + { + // remoteSystemList in user thread + if (remoteSystemList[j].isActive) + { + anyActive=true; + break; + } + } + + // If this system is out of packets to send, then stop waiting + if ( anyActive==false ) + break; + + // This will probably cause the update thread to run which will probably + // send the disconnection notification + + RakSleep(15); + time = RakNet::GetTimeMS(); + } + } + for (i=0; i < pluginListTS.Size(); i++) + { + pluginListTS[i]->OnRakPeerShutdown(); + } + for (i=0; i < pluginListNTS.Size(); i++) + { + pluginListNTS[i]->OnRakPeerShutdown(); + } + + activeSystemListSize=0; + + quitAndDataEvents.SetEvent(); + + endThreads = true; + // Get recvfrom to unblock + for (i=0; i < socketList.Size(); i++) + { + SystemAddress sa2 = socketList[i]->boundAddress; + if (SocketLayer::SendTo(socketList[i]->s, (const char*) &i,1,sa2, socketList[i]->remotePortRakNetWasStartedOn_PS3_PSP2, socketList[i]->extraSocketOptions, _FILE_AND_LINE_)!=0) + break; + } + while ( isMainLoopThreadActive ) + { + endThreads = true; + RakSleep(15); + } + + RakNet::TimeMS timeout = RakNet::GetTimeMS()+1000; + while ( isRecvFromLoopThreadActive.GetValue()>0 && RakNet::GetTimeMS()boundAddress; + SocketLayer::SendTo(socketList[i]->s, (const char*) &i,1,sa2, socketList[i]->remotePortRakNetWasStartedOn_PS3_PSP2, socketList[i]->extraSocketOptions, _FILE_AND_LINE_); + } + + RakSleep(30); + } + +// char c=0; +// unsigned int socketIndex; + // remoteSystemList in Single thread + for ( i = 0; i < systemListSize; i++ ) + { + // Reserve this reliability layer for ourselves + remoteSystemList[ i ].isActive = false; + + // Remove any remaining packets + remoteSystemList[ i ].reliabilityLayer.Reset(false, remoteSystemList[ i ].MTUSize, false); + remoteSystemList[ i ].rakNetSocket.SetNull(); + + } + + + // Setting maximumNumberOfPeers to 0 allows remoteSystemList to be reallocated in Initialize. + // Setting remoteSystemListSize prevents threads from accessing the reliability layer + maximumNumberOfPeers = 0; + //remoteSystemListSize = 0; + + // Free any packets the user didn't deallocate + packetReturnMutex.Lock(); + for (i=0; i < packetReturnQueue.Size(); i++) + DeallocatePacket(packetReturnQueue[i]); + packetReturnQueue.Clear(_FILE_AND_LINE_); + packetReturnMutex.Unlock(); + packetAllocationPoolMutex.Lock(); + packetAllocationPool.Clear(_FILE_AND_LINE_); + packetAllocationPoolMutex.Unlock(); + + if (isRecvFromLoopThreadActive.GetValue()>0) + { + timeout = RakNet::GetTimeMS()+1000; + while ( isRecvFromLoopThreadActive.GetValue()>0 && RakNet::GetTimeMS() addresses; + DataStructures::List guids; + GetSystemList(addresses, guids); + if (remoteSystems) + { + unsigned short i; + for (i=0; i < *numberOfSystems && i < addresses.Size(); i++) + remoteSystems[i]=addresses[i]; + *numberOfSystems=i; + } + else + { + *numberOfSystems=(unsigned short) addresses.Size(); + } + return true; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +uint32_t RakPeer::GetNextSendReceipt(void) +{ + sendReceiptSerialMutex.Lock(); + uint32_t retVal = sendReceiptSerial; + sendReceiptSerialMutex.Unlock(); + return retVal; +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +uint32_t RakPeer::IncrementNextSendReceipt(void) +{ + sendReceiptSerialMutex.Lock(); + uint32_t returned = sendReceiptSerial; + if (++sendReceiptSerial==0) + sendReceiptSerial=1; + sendReceiptSerialMutex.Unlock(); + return returned; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description: +// Sends a block of data to the specified system that you are connected to. +// This function only works while the client is connected (Use the Connect function). +// The first byte should be a message identifier starting at ID_USER_PACKET_ENUM +// +// Parameters: +// data: The block of data to send +// length: The size in bytes of the data to send +// bitStream: The bitstream to send +// priority: What priority level to send on. +// reliability: How reliability to send this data +// orderingChannel: When using ordered or sequenced packets, what channel to order these on. +// - Packets are only ordered relative to other packets on the same stream +// systemAddress: Who to send this packet to, or in the case of broadcasting who not to send it to. Use UNASSIGNED_SYSTEM_ADDRESS to specify none +// broadcast: True to send this packet to all connected systems. If true, then systemAddress specifies who not to send the packet to. +// Returns: +// \return 0 on bad input. Otherwise a number that identifies this message. If \a reliability is a type that returns a receipt, on a later call to Receive() you will get ID_SND_RECEIPT_ACKED or ID_SND_RECEIPT_LOSS with bytes 1-4 inclusive containing this number +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +uint32_t RakPeer::Send( const char *data, const int length, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast, uint32_t forceReceiptNumber ) +{ +#ifdef _DEBUG + RakAssert( data && length > 0 ); +#endif + RakAssert( !( reliability >= NUMBER_OF_RELIABILITIES || reliability < 0 ) ); + RakAssert( !( priority > NUMBER_OF_PRIORITIES || priority < 0 ) ); + RakAssert( !( orderingChannel >= NUMBER_OF_ORDERED_STREAMS ) ); + + if ( data == 0 || length < 0 ) + return 0; + + if ( remoteSystemList == 0 || endThreads == true ) + return 0; + + if ( broadcast == false && systemIdentifier.IsUndefined()) + return 0; + + uint32_t usedSendReceipt; + if (forceReceiptNumber!=0) + usedSendReceipt=forceReceiptNumber; + else + usedSendReceipt=IncrementNextSendReceipt(); + + if (broadcast==false && IsLoopbackAddress(systemIdentifier,true)) + { + SendLoopback(data,length); + + if (reliability>=UNRELIABLE_WITH_ACK_RECEIPT) + { + char buff[5]; + buff[0]=ID_SND_RECEIPT_ACKED; + sendReceiptSerialMutex.Lock(); + memcpy(buff+1, &sendReceiptSerial, 4); + sendReceiptSerialMutex.Unlock(); + SendLoopback( buff, 5 ); + } + + return usedSendReceipt; + } + + SendBuffered(data, length*8, priority, reliability, orderingChannel, systemIdentifier, broadcast, RemoteSystemStruct::NO_ACTION, usedSendReceipt); + + return usedSendReceipt; +} + +void RakPeer::SendLoopback( const char *data, const int length ) +{ + if ( data == 0 || length < 0 ) + return; + + Packet *packet = AllocPacket(length, _FILE_AND_LINE_); + memcpy(packet->data, data, length); + packet->systemAddress = GetLoopbackAddress(); + packet->guid=myGuid; + PushBackPacket(packet, false); +} + +uint32_t RakPeer::Send( const RakNet::BitStream * bitStream, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast, uint32_t forceReceiptNumber ) +{ +#ifdef _DEBUG + RakAssert( bitStream->GetNumberOfBytesUsed() > 0 ); +#endif + + RakAssert( !( reliability >= NUMBER_OF_RELIABILITIES || reliability < 0 ) ); + RakAssert( !( priority > NUMBER_OF_PRIORITIES || priority < 0 ) ); + RakAssert( !( orderingChannel >= NUMBER_OF_ORDERED_STREAMS ) ); + + if ( bitStream->GetNumberOfBytesUsed() == 0 ) + return 0; + + if ( remoteSystemList == 0 || endThreads == true ) + return 0; + + if ( broadcast == false && systemIdentifier.IsUndefined() ) + return 0; + + uint32_t usedSendReceipt; + if (forceReceiptNumber!=0) + usedSendReceipt=forceReceiptNumber; + else + usedSendReceipt=IncrementNextSendReceipt(); + + if (broadcast==false && IsLoopbackAddress(systemIdentifier,true)) + { + SendLoopback((const char*) bitStream->GetData(),bitStream->GetNumberOfBytesUsed()); + if (reliability>=UNRELIABLE_WITH_ACK_RECEIPT) + { + char buff[5]; + buff[0]=ID_SND_RECEIPT_ACKED; + sendReceiptSerialMutex.Lock(); + memcpy(buff+1, &sendReceiptSerial,4); + sendReceiptSerialMutex.Unlock(); + SendLoopback( buff, 5 ); + } + return usedSendReceipt; + } + + // Sends need to be buffered and processed in the update thread because the systemAddress associated with the reliability layer can change, + // from that thread, resulting in a send to the wrong player! While I could mutex the systemAddress, that is much slower than doing this + SendBuffered((const char*)bitStream->GetData(), bitStream->GetNumberOfBitsUsed(), priority, reliability, orderingChannel, systemIdentifier, broadcast, RemoteSystemStruct::NO_ACTION, usedSendReceipt); + + + return usedSendReceipt; +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Sends multiple blocks of data, concatenating them automatically. +// +// This is equivalent to: +// RakNet::BitStream bs; +// bs.WriteAlignedBytes(block1, blockLength1); +// bs.WriteAlignedBytes(block2, blockLength2); +// bs.WriteAlignedBytes(block3, blockLength3); +// Send(&bs, ...) +// +// This function only works while the connected +// \param[in] data An array of pointers to blocks of data +// \param[in] lengths An array of integers indicating the length of each block of data +// \param[in] numParameters Length of the arrays data and lengths +// \param[in] priority What priority level to send on. See PacketPriority.h +// \param[in] reliability How reliability to send this data. See PacketPriority.h +// \param[in] orderingChannel When using ordered or sequenced messages, what channel to order these on. Messages are only ordered relative to other messages on the same stream +// \param[in] systemIdentifier Who to send this packet to, or in the case of broadcasting who not to send it to. Pass either a SystemAddress structure or a RakNetGUID structure. Use UNASSIGNED_SYSTEM_ADDRESS or to specify none +// \param[in] broadcast True to send this packet to all connected systems. If true, then systemAddress specifies who not to send the packet to. +// \return False if we are not connected to the specified recipient. True otherwise +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +uint32_t RakPeer::SendList( const char **data, const int *lengths, const int numParameters, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast, uint32_t forceReceiptNumber ) +{ +#ifdef _DEBUG + RakAssert( data ); +#endif + + if ( data == 0 || lengths == 0 ) + return 0; + + if ( remoteSystemList == 0 || endThreads == true ) + return 0; + + if (numParameters==0) + return 0; + + if (lengths==0) + return 0; + + if ( broadcast == false && systemIdentifier.IsUndefined() ) + return 0; + + uint32_t usedSendReceipt; + if (forceReceiptNumber!=0) + usedSendReceipt=forceReceiptNumber; + else + usedSendReceipt=IncrementNextSendReceipt(); + + SendBufferedList(data, lengths, numParameters, priority, reliability, orderingChannel, systemIdentifier, broadcast, RemoteSystemStruct::NO_ACTION, usedSendReceipt); + + return usedSendReceipt; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description: +// Gets a packet from the incoming packet queue. Use DeallocatePacket to deallocate the packet after you are done with it. +// Check the Packet struct at the top of CoreNetworkStructures.h for the format of the struct +// +// Returns: +// 0 if no packets are waiting to be handled, otherwise an allocated packet +// If the client is not active this will also return 0, as all waiting packets are flushed when the client is Disconnected +// This also updates all memory blocks associated with synchronized memory and distributed objects +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +#ifdef _MSC_VER +#pragma warning( disable : 4701 ) // warning C4701: local variable may be used without having been initialized +#endif +Packet* RakPeer::Receive( void ) +{ + if ( !( IsActive() ) ) + return 0; + + RakNet::Packet *packet; +// Packet **threadPacket; + PluginReceiveResult pluginResult; + + int offset; + unsigned int i; + + for (i=0; i < pluginListTS.Size(); i++) + { + pluginListTS[i]->Update(); + } + for (i=0; i < pluginListNTS.Size(); i++) + { + pluginListNTS[i]->Update(); + } + + do + { + packetReturnMutex.Lock(); + if (packetReturnQueue.IsEmpty()) + packet=0; + else + packet = packetReturnQueue.Pop(); + packetReturnMutex.Unlock(); + if (packet==0) + return 0; + +// unsigned char msgId; + if ( ( packet->length >= sizeof(unsigned char) + sizeof( RakNet::Time ) ) && + ( (unsigned char) packet->data[ 0 ] == ID_TIMESTAMP ) ) + { + offset = sizeof(unsigned char); + ShiftIncomingTimestamp( packet->data + offset, packet->systemAddress ); +// msgId=packet->data[sizeof(unsigned char) + sizeof( RakNet::Time )]; + } +// else + // msgId=packet->data[0]; + + // Some locally generated packets need to be processed by plugins, for example ID_FCM2_NEW_HOST + // The plugin itself should intercept these messages generated remotely +// if (packet->wasGeneratedLocally) +// return packet; + + + CallPluginCallbacks(pluginListTS, packet); + CallPluginCallbacks(pluginListNTS, packet); + + for (i=0; i < pluginListTS.Size(); i++) + { + pluginResult=pluginListTS[i]->OnReceive(packet); + if (pluginResult==RR_STOP_PROCESSING_AND_DEALLOCATE) + { + DeallocatePacket( packet ); + packet=0; // Will do the loop again and get another packet + break; // break out of the enclosing for + } + else if (pluginResult==RR_STOP_PROCESSING) + { + packet=0; + break; + } + } + + for (i=0; i < pluginListNTS.Size(); i++) + { + pluginResult=pluginListNTS[i]->OnReceive(packet); + if (pluginResult==RR_STOP_PROCESSING_AND_DEALLOCATE) + { + DeallocatePacket( packet ); + packet=0; // Will do the loop again and get another packet + break; // break out of the enclosing for + } + else if (pluginResult==RR_STOP_PROCESSING) + { + packet=0; + break; + } + } + + } while(packet==0); + +#ifdef _DEBUG + RakAssert( packet->data ); +#endif + + return packet; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description: +// Call this to deallocate a packet returned by Receive +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::DeallocatePacket( Packet *packet ) +{ + if ( packet == 0 ) + return; + + if (packet->deleteData) + { + rakFree_Ex(packet->data, _FILE_AND_LINE_ ); + packet->~Packet(); + packetAllocationPoolMutex.Lock(); + packetAllocationPool.Release(packet,_FILE_AND_LINE_); + packetAllocationPoolMutex.Unlock(); + } + else + { + rakFree_Ex(packet, _FILE_AND_LINE_ ); + } +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description: +// Return the total number of connections we are allowed +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +unsigned short RakPeer::GetMaximumNumberOfPeers( void ) const +{ + return maximumNumberOfPeers; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description: +// Close the connection to another host (if we initiated the connection it will disconnect, if they did it will kick them out). +// +// Parameters: +// target: Which connection to close +// sendDisconnectionNotification: True to send ID_DISCONNECTION_NOTIFICATION to the recipient. False to close it silently. +// channel: If blockDuration > 0, the disconnect packet will be sent on this channel +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::CloseConnection( const AddressOrGUID target, bool sendDisconnectionNotification, unsigned char orderingChannel, PacketPriority disconnectionNotificationPriority ) +{ + /* + // This only be called from the user thread, for the user shutting down. + // From the network thread, this should occur because of ID_DISCONNECTION_NOTIFICATION and ID_CONNECTION_LOST + unsigned j; + for (j=0; j < messageHandlerList.Size(); j++) + { + messageHandlerList[j]->OnClosedConnection( + target.systemAddress==UNASSIGNED_SYSTEM_ADDRESS ? GetSystemAddressFromGuid(target.rakNetGuid) : target.systemAddress, + target.rakNetGuid==UNASSIGNED_RAKNET_GUID ? GetGuidFromSystemAddress(target.systemAddress) : target.rakNetGuid, + LCR_CLOSED_BY_USER); + } + */ + + CloseConnectionInternal(target, sendDisconnectionNotification, false, orderingChannel, disconnectionNotificationPriority); + + // 12/14/09 Return ID_CONNECTION_LOST when calling CloseConnection with sendDisconnectionNotification==false, elsewise it is never returned + if (sendDisconnectionNotification==false && GetConnectionState(target)==IS_CONNECTED) + { + Packet *packet=AllocPacket(sizeof( char ), _FILE_AND_LINE_); + packet->data[ 0 ] = ID_CONNECTION_LOST; // DeadConnection + packet->guid = target.rakNetGuid==UNASSIGNED_RAKNET_GUID ? GetGuidFromSystemAddress(target.systemAddress) : target.rakNetGuid; + packet->systemAddress = target.systemAddress==UNASSIGNED_SYSTEM_ADDRESS ? GetSystemAddressFromGuid(target.rakNetGuid) : target.systemAddress; + packet->systemAddress.systemIndex = (SystemIndex) GetIndexFromSystemAddress(packet->systemAddress); + packet->guid.systemIndex=packet->systemAddress.systemIndex; + packet->wasGeneratedLocally=true; // else processed twice + AddPacketToProducer(packet); + } +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Cancel a pending connection attempt +// If we are already connected, the connection stays open +// \param[in] target Which system to cancel +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::CancelConnectionAttempt( const SystemAddress target ) +{ + unsigned int i; + + // Cancel pending connection attempt, if there is one + i=0; + requestedConnectionQueueMutex.Lock(); + while (i < requestedConnectionQueue.Size()) + { + if (requestedConnectionQueue[i]->systemAddress==target) + { +#if LIBCAT_SECURITY==1 + CAT_AUDIT_PRINTF("AUDIT: Deleting requestedConnectionQueue %i client_handshake %x\n", i, requestedConnectionQueue[ i ]->client_handshake); + RakNet::OP_DELETE(requestedConnectionQueue[i]->client_handshake, _FILE_AND_LINE_ ); +#endif + RakNet::OP_DELETE(requestedConnectionQueue[i], _FILE_AND_LINE_ ); + requestedConnectionQueue.RemoveAtIndex(i); + break; + } + else + i++; + } + requestedConnectionQueueMutex.Unlock(); + +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +ConnectionState RakPeer::GetConnectionState(const AddressOrGUID systemIdentifier) +{ + if (systemIdentifier.systemAddress!=UNASSIGNED_SYSTEM_ADDRESS) + { + unsigned int i=0; + requestedConnectionQueueMutex.Lock(); + for (; i < requestedConnectionQueue.Size(); i++) + { + if (requestedConnectionQueue[i]->systemAddress==systemIdentifier.systemAddress) + { + requestedConnectionQueueMutex.Unlock(); + return IS_PENDING; + } + } + requestedConnectionQueueMutex.Unlock(); + } + + int index; + if (systemIdentifier.systemAddress!=UNASSIGNED_SYSTEM_ADDRESS) + { + index = GetIndexFromSystemAddress(systemIdentifier.systemAddress, false); + } + else + { + index = GetIndexFromGuid(systemIdentifier.rakNetGuid); + } + + if (index==-1) + return IS_NOT_CONNECTED; + + if (remoteSystemList[index].isActive==false) + return IS_DISCONNECTED; + + switch (remoteSystemList[index].connectMode) + { + case RemoteSystemStruct::DISCONNECT_ASAP: + return IS_DISCONNECTING; + case RemoteSystemStruct::DISCONNECT_ASAP_SILENTLY: + return IS_SILENTLY_DISCONNECTING; + case RemoteSystemStruct::DISCONNECT_ON_NO_ACK: + return IS_DISCONNECTING; + case RemoteSystemStruct::REQUESTED_CONNECTION: + return IS_CONNECTING; + case RemoteSystemStruct::HANDLING_CONNECTION_REQUEST: + return IS_CONNECTING; + case RemoteSystemStruct::UNVERIFIED_SENDER: + return IS_CONNECTING; + case RemoteSystemStruct::CONNECTED: + return IS_CONNECTED; + default: + return IS_NOT_CONNECTED; + } + + return IS_NOT_CONNECTED; +} + + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description: +// Given a systemAddress, returns an index from 0 to the maximum number of players allowed - 1. +// +// Parameters +// systemAddress - The systemAddress to search for +// +// Returns +// An integer from 0 to the maximum number of peers -1, or -1 if that player is not found +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +int RakPeer::GetIndexFromSystemAddress( const SystemAddress systemAddress ) const +{ + return GetIndexFromSystemAddress(systemAddress, false); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description: +// This function is only useful for looping through all players. +// +// Parameters +// index - an integer between 0 and the maximum number of players allowed - 1. +// +// Returns +// A valid systemAddress or UNASSIGNED_SYSTEM_ADDRESS if no such player at that index +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +SystemAddress RakPeer::GetSystemAddressFromIndex( int index ) +{ + // remoteSystemList in user thread + //if ( index >= 0 && index < remoteSystemListSize ) + if ( index >= 0 && index < maximumNumberOfPeers ) + if (remoteSystemList[index].isActive && remoteSystemList[ index ].connectMode==RakPeer::RemoteSystemStruct::CONNECTED) // Don't give the user players that aren't fully connected, since sends will fail + return remoteSystemList[ index ].systemAddress; + + return UNASSIGNED_SYSTEM_ADDRESS; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Same as GetSystemAddressFromIndex but returns RakNetGUID +// \param[in] index Index should range between 0 and the maximum number of players allowed - 1. +// \return The RakNetGUID +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +RakNetGUID RakPeer::GetGUIDFromIndex( int index ) +{ + // remoteSystemList in user thread + //if ( index >= 0 && index < remoteSystemListSize ) + if ( index >= 0 && index < maximumNumberOfPeers ) + if (remoteSystemList[index].isActive && remoteSystemList[ index ].connectMode==RakPeer::RemoteSystemStruct::CONNECTED) // Don't give the user players that aren't fully connected, since sends will fail + return remoteSystemList[ index ].guid; + + return UNASSIGNED_RAKNET_GUID; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Same as calling GetSystemAddressFromIndex and GetGUIDFromIndex for all systems, but more efficient +// Indices match each other, so \a addresses[0] and \a guids[0] refer to the same system +// \param[out] addresses All system addresses. Size of the list is the number of connections. Size of the list will match the size of the \a guids list. +// \param[out] guids All guids. Size of the list is the number of connections. Size of the list will match the size of the \a addresses list. +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::GetSystemList(DataStructures::List &addresses, DataStructures::List &guids) const +{ + addresses.Clear(false, _FILE_AND_LINE_); + guids.Clear(false, _FILE_AND_LINE_); + + if ( remoteSystemList == 0 || endThreads == true ) + return; + + unsigned int i; + for (i=0; i < activeSystemListSize; i++) + { + if ((activeSystemList[i])->isActive && + (activeSystemList[i])->connectMode==RakPeer::RemoteSystemStruct::CONNECTED) + { + addresses.Push((activeSystemList[i])->systemAddress, _FILE_AND_LINE_ ); + guids.Push((activeSystemList[i])->guid, _FILE_AND_LINE_ ); + } + } +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description: +// Bans an IP from connecting. Banned IPs persist between connections. +// +// Parameters +// IP - Dotted IP address. Can use * as a wildcard, such as 128.0.0.* will ban +// All IP addresses starting with 128.0.0 +// milliseconds - how many ms for a temporary ban. Use 0 for a permanent ban +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::AddToBanList( const char *IP, RakNet::TimeMS milliseconds ) +{ + unsigned index; + RakNet::TimeMS time = RakNet::GetTimeMS(); + + if ( IP == 0 || IP[ 0 ] == 0 || strlen( IP ) > 15 ) + return ; + + // If this guy is already in the ban list, do nothing + index = 0; + + banListMutex.Lock(); + + for ( ; index < banList.Size(); index++ ) + { + if ( strcmp( IP, banList[ index ]->IP ) == 0 ) + { + // Already in the ban list. Just update the time + if (milliseconds==0) + banList[ index ]->timeout=0; // Infinite + else + banList[ index ]->timeout=time+milliseconds; + banListMutex.Unlock(); + return; + } + } + + banListMutex.Unlock(); + + BanStruct *banStruct = RakNet::OP_NEW( _FILE_AND_LINE_ ); + banStruct->IP = (char*) rakMalloc_Ex( 16, _FILE_AND_LINE_ ); + if (milliseconds==0) + banStruct->timeout=0; // Infinite + else + banStruct->timeout=time+milliseconds; + strcpy( banStruct->IP, IP ); + banListMutex.Lock(); + banList.Insert( banStruct, _FILE_AND_LINE_ ); + banListMutex.Unlock(); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description: +// Allows a previously banned IP to connect. +// +// Parameters +// IP - Dotted IP address. Can use * as a wildcard, such as 128.0.0.* will ban +// All IP addresses starting with 128.0.0 +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::RemoveFromBanList( const char *IP ) +{ + unsigned index; + BanStruct *temp; + + if ( IP == 0 || IP[ 0 ] == 0 || strlen( IP ) > 15 ) + return ; + + index = 0; + temp=0; + + banListMutex.Lock(); + + for ( ; index < banList.Size(); index++ ) + { + if ( strcmp( IP, banList[ index ]->IP ) == 0 ) + { + temp = banList[ index ]; + banList[ index ] = banList[ banList.Size() - 1 ]; + banList.RemoveAtIndex( banList.Size() - 1 ); + break; + } + } + + banListMutex.Unlock(); + + if (temp) + { + rakFree_Ex(temp->IP, _FILE_AND_LINE_ ); + RakNet::OP_DELETE(temp, _FILE_AND_LINE_); + } + +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description: +// Allows all previously banned IPs to connect. +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::ClearBanList( void ) +{ + unsigned index; + index = 0; + banListMutex.Lock(); + + for ( ; index < banList.Size(); index++ ) + { + rakFree_Ex(banList[ index ]->IP, _FILE_AND_LINE_ ); + RakNet::OP_DELETE(banList[ index ], _FILE_AND_LINE_); + } + + banList.Clear(false, _FILE_AND_LINE_); + + banListMutex.Unlock(); +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::SetLimitIPConnectionFrequency(bool b) +{ + limitConnectionFrequencyFromTheSameIP=b; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description: +// Determines if a particular IP is banned. +// +// Parameters +// IP - Complete dotted IP address +// +// Returns +// True if IP matches any IPs in the ban list, accounting for any wildcards. +// False otherwise. +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +bool RakPeer::IsBanned( const char *IP ) +{ + unsigned banListIndex, characterIndex; + RakNet::TimeMS time; + BanStruct *temp; + + if ( IP == 0 || IP[ 0 ] == 0 || strlen( IP ) > 15 ) + return false; + + banListIndex = 0; + + if ( banList.Size() == 0 ) + return false; // Skip the mutex if possible + + time = RakNet::GetTimeMS(); + + banListMutex.Lock(); + + while ( banListIndex < banList.Size() ) + { + if (banList[ banListIndex ]->timeout>0 && banList[ banListIndex ]->timeoutIP, _FILE_AND_LINE_ ); + RakNet::OP_DELETE(temp, _FILE_AND_LINE_); + } + else + { + characterIndex = 0; + +#ifdef _MSC_VER +#pragma warning( disable : 4127 ) // warning C4127: conditional expression is constant +#endif + while ( true ) + { + if ( banList[ banListIndex ]->IP[ characterIndex ] == IP[ characterIndex ] ) + { + // Equal characters + + if ( IP[ characterIndex ] == 0 ) + { + banListMutex.Unlock(); + // End of the string and the strings match + + return true; + } + + characterIndex++; + } + + else + { + if ( banList[ banListIndex ]->IP[ characterIndex ] == 0 || IP[ characterIndex ] == 0 ) + { + // End of one of the strings + break; + } + + // Characters do not match + if ( banList[ banListIndex ]->IP[ characterIndex ] == '*' ) + { + banListMutex.Unlock(); + + // Domain is banned. + return true; + } + + // Characters do not match and it is not a * + break; + } + } + + banListIndex++; + } + } + + banListMutex.Unlock(); + + // No match found. + return false; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description: +// Send a ping to the specified connected system. +// +// Parameters: +// target - who to ping +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::Ping( const SystemAddress target ) +{ + PingInternal(target, false, UNRELIABLE); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description: +// Send a ping to the specified unconnected system. +// The remote system, if it is Initialized, will respond with ID_UNCONNECTED_PONG. +// The final ping time will be encoded in the following sizeof(RakNet::TimeMS) bytes. (Default is 4 bytes - See __GET_TIME_64BIT in RakNetTypes.h +// +// Parameters: +// host: Either a dotted IP address or a domain name. Can be 255.255.255.255 for LAN broadcast. +// remotePort: Which port to connect to on the remote machine. +// onlyReplyOnAcceptingConnections: Only request a reply if the remote system has open connections +// connectionSocketIndex Index into the array of socket descriptors passed to socketDescriptors in RakPeer::Startup() to send on. +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +bool RakPeer::Ping( const char* host, unsigned short remotePort, bool onlyReplyOnAcceptingConnections, unsigned connectionSocketIndex ) +{ + if ( host == 0 ) + return false; + + // If this assert hits then Startup wasn't called or the call failed. + RakAssert(connectionSocketIndex < socketList.Size()); + +// if ( IsActive() == false ) +// return; + + RakNet::BitStream bitStream( sizeof(unsigned char) + sizeof(RakNet::Time) ); + if ( onlyReplyOnAcceptingConnections ) + bitStream.Write((MessageID)ID_UNCONNECTED_PING_OPEN_CONNECTIONS); + else + bitStream.Write((MessageID)ID_UNCONNECTED_PING); + + bitStream.Write(RakNet::GetTime()); + + bitStream.WriteAlignedBytes((const unsigned char*) OFFLINE_MESSAGE_DATA_ID, sizeof(OFFLINE_MESSAGE_DATA_ID)); + + // No timestamp for 255.255.255.255 + unsigned int realIndex = GetRakNetSocketFromUserConnectionSocketIndex(connectionSocketIndex); + + SystemAddress systemAddress; + systemAddress.FromStringExplicitPort(host,remotePort, socketList[realIndex]->boundAddress.GetIPVersion()); + systemAddress.FixForIPVersion(socketList[realIndex]->boundAddress); + + unsigned i; + for (i=0; i < pluginListNTS.Size(); i++) + pluginListNTS[i]->OnDirectSocketSend((const char*)bitStream.GetData(), bitStream.GetNumberOfBitsUsed(), systemAddress); + SocketLayer::SendTo( socketList[realIndex]->s, (const char*)bitStream.GetData(), (int) bitStream.GetNumberOfBytesUsed(), systemAddress, socketList[realIndex]->remotePortRakNetWasStartedOn_PS3_PSP2, socketList[realIndex]->extraSocketOptions, _FILE_AND_LINE_ ); + + return true; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description: +// Returns the average of all ping times read for a specified target +// +// Parameters: +// target - whose time to read +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +int RakPeer::GetAveragePing( const AddressOrGUID systemIdentifier ) +{ + int sum, quantity; + RemoteSystemStruct *remoteSystem = GetRemoteSystem( systemIdentifier, false, false ); + + if ( remoteSystem == 0 ) + return -1; + + for ( sum = 0, quantity = 0; quantity < PING_TIMES_ARRAY_SIZE; quantity++ ) + { + if ( remoteSystem->pingAndClockDifferential[ quantity ].pingTime == 65535 ) + break; + else + sum += remoteSystem->pingAndClockDifferential[ quantity ].pingTime; + } + + if ( quantity > 0 ) + return sum / quantity; + else + return -1; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description: +// Returns the last ping time read for the specific player or -1 if none read yet +// +// Parameters: +// target - whose time to read +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +int RakPeer::GetLastPing( const AddressOrGUID systemIdentifier ) const +{ + RemoteSystemStruct * remoteSystem = GetRemoteSystem( systemIdentifier, false, false ); + + if ( remoteSystem == 0 ) + return -1; + +// return (int)(remoteSystem->reliabilityLayer.GetAckPing()/(RakNet::TimeUS)1000); + + if ( remoteSystem->pingAndClockDifferentialWriteIndex == 0 ) + return remoteSystem->pingAndClockDifferential[ PING_TIMES_ARRAY_SIZE - 1 ].pingTime; + else + return remoteSystem->pingAndClockDifferential[ remoteSystem->pingAndClockDifferentialWriteIndex - 1 ].pingTime; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description: +// Returns the lowest ping time read or -1 if none read yet +// +// Parameters: +// target - whose time to read +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +int RakPeer::GetLowestPing( const AddressOrGUID systemIdentifier ) const +{ + RemoteSystemStruct * remoteSystem = GetRemoteSystem( systemIdentifier, false, false ); + + if ( remoteSystem == 0 ) + return -1; + + return remoteSystem->lowestPing; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description: +// Ping the remote systems every so often. This is off by default +// This will work anytime +// +// Parameters: +// doPing - True to start occasional pings. False to stop them. +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::SetOccasionalPing( bool doPing ) +{ + occasionalPing = doPing; +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description: +// Length should be under 400 bytes, as a security measure against flood attacks +// Sets the data to send with an (LAN server discovery) /(offline ping) response +// See the Ping sample project for how this is used. +// data: a block of data to store, or 0 for none +// length: The length of data in bytes, or 0 for none +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::SetOfflinePingResponse( const char *data, const unsigned int length ) +{ + RakAssert(length < 400); + + rakPeerMutexes[ offlinePingResponse_Mutex ].Lock(); + offlinePingResponse.Reset(); + + if ( data && length > 0 ) + offlinePingResponse.Write( data, length ); + + rakPeerMutexes[ offlinePingResponse_Mutex ].Unlock(); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Returns pointers to a copy of the data passed to SetOfflinePingResponse +// \param[out] data A pointer to a copy of the data passed to \a SetOfflinePingResponse() +// \param[out] length A pointer filled in with the length parameter passed to SetOfflinePingResponse() +// \sa SetOfflinePingResponse +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::GetOfflinePingResponse( char **data, unsigned int *length ) +{ + rakPeerMutexes[ offlinePingResponse_Mutex ].Lock(); + *data = (char*) offlinePingResponse.GetData(); + *length = (int) offlinePingResponse.GetNumberOfBytesUsed(); + rakPeerMutexes[ offlinePingResponse_Mutex ].Unlock(); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description: +// Return the unique SystemAddress that represents you on the the network +// Note that unlike in previous versions, this is a struct and is not sequential +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +SystemAddress RakPeer::GetInternalID( const SystemAddress systemAddress, const int index ) const +{ + if (systemAddress==UNASSIGNED_SYSTEM_ADDRESS) + { + return ipList[index]; + } + else + { + +// SystemAddress returnValue; + RemoteSystemStruct * remoteSystem = GetRemoteSystemFromSystemAddress( systemAddress, false, true ); + if (remoteSystem==0) + return UNASSIGNED_SYSTEM_ADDRESS; + + return remoteSystem->theirInternalSystemAddress[index]; + /* + sockaddr_in sa; + socklen_t len = sizeof(sa); + if (getsockname__(connectionSockets[remoteSystem->connectionSocketIndex], (sockaddr*)&sa, &len)!=0) + return UNASSIGNED_SYSTEM_ADDRESS; + returnValue.port=ntohs(sa.sin_port); + returnValue.binaryAddress=sa.sin_addr.s_addr; + return returnValue; +*/ + + + + } +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description: +// Return the unique address identifier that represents you on the the network and is based on your external +// IP / port (the IP / port the specified player uses to communicate with you) +// Note that unlike in previous versions, this is a struct and is not sequential +// +// Parameters: +// target: Which remote system you are referring to for your external ID +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +SystemAddress RakPeer::GetExternalID( const SystemAddress target ) const +{ + unsigned i; + SystemAddress inactiveExternalId; + + inactiveExternalId=UNASSIGNED_SYSTEM_ADDRESS; + + if (target==UNASSIGNED_SYSTEM_ADDRESS) + return firstExternalID; + + // First check for active connection with this systemAddress + for ( i = 0; i < maximumNumberOfPeers; i++ ) + { + if (remoteSystemList[ i ].systemAddress == target ) + { + if ( remoteSystemList[ i ].isActive ) + return remoteSystemList[ i ].myExternalSystemAddress; + else if (remoteSystemList[ i ].myExternalSystemAddress!=UNASSIGNED_SYSTEM_ADDRESS) + inactiveExternalId=remoteSystemList[ i ].myExternalSystemAddress; + } + } + + return inactiveExternalId; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +const RakNetGUID RakPeer::GetMyGUID(void) const +{ + return myGuid; +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +SystemAddress RakPeer::GetMyBoundAddress(const int socketIndex) +{ + DataStructures::List > sockets; + GetSockets( sockets ); + if (sockets.Size()>0) + return sockets[socketIndex]->boundAddress; + else + return UNASSIGNED_SYSTEM_ADDRESS; +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +const RakNetGUID& RakPeer::GetGuidFromSystemAddress( const SystemAddress input ) const +{ + if (input==UNASSIGNED_SYSTEM_ADDRESS) + return myGuid; + + if (input.systemIndex!=(SystemIndex)-1 && input.systemIndexreliabilityLayer.SetTimeoutTime(timeMS); + } +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +RakNet::TimeMS RakPeer::GetTimeoutTime( const SystemAddress target ) +{ + if (target==UNASSIGNED_SYSTEM_ADDRESS) + { + return defaultTimeoutTime; + } + else + { + RemoteSystemStruct * remoteSystem = GetRemoteSystemFromSystemAddress( target, false, true ); + + if ( remoteSystem != 0 ) + remoteSystem->reliabilityLayer.GetTimeoutTime(); + } + return defaultTimeoutTime; +} + + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description: +// Returns the current MTU size +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +int RakPeer::GetMTUSize( const SystemAddress target ) const +{ + if (target!=UNASSIGNED_SYSTEM_ADDRESS) + { + RemoteSystemStruct *rss=GetRemoteSystemFromSystemAddress(target, false, true); + if (rss) + return rss->MTUSize; + } + return defaultMTUSize; +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description: +// Returns the number of IP addresses we have +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +unsigned int RakPeer::GetNumberOfAddresses( void ) +{ + + int i = 0; + + while ( ipList[ i ]!=UNASSIGNED_SYSTEM_ADDRESS ) + i++; + + return i; + + + + +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Returns an IP address at index 0 to GetNumberOfAddresses-1 +// \param[in] index index into the list of IP addresses +// \return The local IP address at this index +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +const char* RakPeer::GetLocalIP( unsigned int index ) +{ + if (IsActive()==false) + { + // Fill out ipList structure + + SocketLayer::GetMyIP( ipList ); + + } + + + static char str[128]; + ipList[index].ToString(false,str); + return str; + + + + +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Is this a local IP? +// \param[in] An IP address to check +// \return True if this is one of the IP addresses returned by GetLocalIP +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +bool RakPeer::IsLocalIP( const char *ip ) +{ + if (ip==0 || ip[0]==0) + return false; + + + if (strcmp(ip, "127.0.0.1")==0 || strcmp(ip, "localhost")==0) + return true; + + int num = GetNumberOfAddresses(); + int i; + for (i=0; i < num; i++) + { + if (strcmp(ip, GetLocalIP(i))==0) + return true; + } + + + + + return false; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description: +// Allow or disallow connection responses from any IP. Normally this should be false, but may be necessary +// when connection to servers with multiple IP addresses +// +// Parameters: +// allow - True to allow this behavior, false to not allow. Defaults to false. Value persists between connections +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::AllowConnectionResponseIPMigration( bool allow ) +{ + allowConnectionResponseIPMigration = allow; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Description: +// Sends a message ID_ADVERTISE_SYSTEM to the remote unconnected system. +// This will tell the remote system our external IP outside the LAN, and can be used for NAT punch through +// +// Requires: +// The sender and recipient must already be started via a successful call to Initialize +// +// host: Either a dotted IP address or a domain name +// remotePort: Which port to connect to on the remote machine. +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +bool RakPeer::AdvertiseSystem( const char *host, unsigned short remotePort, const char *data, int dataLength, unsigned connectionSocketIndex ) +{ + RakNet::BitStream bs; + bs.Write((MessageID)ID_ADVERTISE_SYSTEM); + bs.WriteAlignedBytes((const unsigned char*) data,dataLength); + return SendOutOfBand(host, remotePort, (const char*) bs.GetData(), bs.GetNumberOfBytesUsed(), connectionSocketIndex ); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Controls how often to return ID_DOWNLOAD_PROGRESS for large message downloads. +// ID_DOWNLOAD_PROGRESS is returned to indicate a new partial message chunk, roughly the MTU size, has arrived +// As it can be slow or cumbersome to get this notification for every chunk, you can set the interval at which it is returned. +// Defaults to 0 (never return this notification) +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::SetSplitMessageProgressInterval(int interval) +{ + RakAssert(interval>=0); + splitMessageProgressInterval=interval; + for ( unsigned short i = 0; i < maximumNumberOfPeers; i++ ) + remoteSystemList[ i ].reliabilityLayer.SetSplitMessageProgressInterval(splitMessageProgressInterval); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Returns what was passed to SetSplitMessageProgressInterval() +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +int RakPeer::GetSplitMessageProgressInterval(void) const +{ + return splitMessageProgressInterval; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Set how long to wait before giving up on sending an unreliable message +// Useful if the network is clogged up. +// Set to 0 or less to never timeout. Defaults to 0. +// timeoutMS How many ms to wait before simply not sending an unreliable message. +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::SetUnreliableTimeout(RakNet::TimeMS timeoutMS) +{ + unreliableTimeout=timeoutMS; + for ( unsigned short i = 0; i < maximumNumberOfPeers; i++ ) + remoteSystemList[ i ].reliabilityLayer.SetUnreliableTimeout(unreliableTimeout); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Send a message to host, with the IP socket option TTL set to 3 +// This message will not reach the host, but will open the router. +// Used for NAT-Punchthrough +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::SendTTL( const char* host, unsigned short remotePort, int ttl, unsigned connectionSocketIndex ) +{ + char fakeData[2]; + fakeData[0]=0; + fakeData[1]=1; + unsigned int realIndex = GetRakNetSocketFromUserConnectionSocketIndex(connectionSocketIndex); + SystemAddress systemAddress = socketList[realIndex]->boundAddress; + systemAddress.FromStringExplicitPort(host,remotePort); + SocketLayer::SendToTTL( socketList[realIndex]->s, (char*)fakeData, 2, systemAddress, ttl ); +} + + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Attatches a Plugin interface to run code automatically on message receipt in the Receive call +// +// \param messageHandler Pointer to a plugin to attach +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::AttachPlugin( PluginInterface2 *plugin ) +{ + bool isNotThreadsafe = plugin->UsesReliabilityLayer(); + if (isNotThreadsafe) + { + if (pluginListNTS.GetIndexOf(plugin)==MAX_UNSIGNED_LONG) + { + plugin->SetRakPeerInterface(this); + plugin->OnAttach(); + pluginListNTS.Insert(plugin, _FILE_AND_LINE_); + } + } + else + { + if (pluginListTS.GetIndexOf(plugin)==MAX_UNSIGNED_LONG) + { + plugin->SetRakPeerInterface(this); + plugin->OnAttach(); + pluginListTS.Insert(plugin, _FILE_AND_LINE_); + } + } +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Detaches a Plugin interface to run code automatically on message receipt +// +// \param messageHandler Pointer to a plugin to detach +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::DetachPlugin( PluginInterface2 *plugin ) +{ + if (plugin==0) + return; + + unsigned int index; + + bool isNotThreadsafe = plugin->UsesReliabilityLayer(); + if (isNotThreadsafe) + { + index = pluginListNTS.GetIndexOf(plugin); + if (index!=MAX_UNSIGNED_LONG) + { + // Unordered list so delete from end for speed + pluginListNTS[index]=pluginListNTS[pluginListNTS.Size()-1]; + pluginListNTS.RemoveFromEnd(); + } + } + else + { + index = pluginListTS.GetIndexOf(plugin); + if (index!=MAX_UNSIGNED_LONG) + { + // Unordered list so delete from end for speed + pluginListTS[index]=pluginListTS[pluginListTS.Size()-1]; + pluginListTS.RemoveFromEnd(); + } + } + plugin->OnDetach(); + plugin->SetRakPeerInterface(0); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Put a packet back at the end of the receive queue in case you don't want to deal with it immediately +// +// packet The packet you want to push back. +// pushAtHead True to push the packet so that the next receive call returns it. False to push it at the end of the queue (obviously pushing it at the end makes the packets out of order) +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::PushBackPacket( Packet *packet, bool pushAtHead) +{ + if (packet==0) + return; + + unsigned i; + for (i=0; i < pluginListTS.Size(); i++) + pluginListTS[i]->OnPushBackPacket((const char*) packet->data, packet->bitSize, packet->systemAddress); + for (i=0; i < pluginListNTS.Size(); i++) + pluginListNTS[i]->OnPushBackPacket((const char*) packet->data, packet->bitSize, packet->systemAddress); + + packetReturnMutex.Lock(); + if (pushAtHead) + packetReturnQueue.PushAtHead(packet,0,_FILE_AND_LINE_); + else + packetReturnQueue.Push(packet,_FILE_AND_LINE_); + packetReturnMutex.Unlock(); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::ChangeSystemAddress(RakNetGUID guid, const SystemAddress &systemAddress) +{ + BufferedCommandStruct *bcs; + + bcs=bufferedCommands.Allocate( _FILE_AND_LINE_ ); + bcs->data = 0; + bcs->systemIdentifier.systemAddress=systemAddress; + bcs->systemIdentifier.rakNetGuid=guid; + bcs->command=BufferedCommandStruct::BCS_CHANGE_SYSTEM_ADDRESS; + bufferedCommands.Push(bcs); +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Packet* RakPeer::AllocatePacket(unsigned dataSize) +{ + return AllocPacket(dataSize, _FILE_AND_LINE_); +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +RakNetSmartPtr RakPeer::GetSocket( const SystemAddress target ) +{ + // Send a query to the thread to get the socket, and return when we got it + BufferedCommandStruct *bcs; + bcs=bufferedCommands.Allocate( _FILE_AND_LINE_ ); + bcs->command=BufferedCommandStruct::BCS_GET_SOCKET; + bcs->systemIdentifier=target; + bcs->data=0; + bufferedCommands.Push(bcs); + + // Block up to one second to get the socket, although it should actually take virtually no time + SocketQueryOutput *sqo; + RakNet::TimeMS stopWaiting = RakNet::GetTimeMS()+1000; + DataStructures::List > output; + while (RakNet::GetTimeMS() < stopWaiting) + { + if (isMainLoopThreadActive==false) + return RakNetSmartPtr(); + + RakSleep(0); + + sqo = socketQueryOutput.Pop(); + if (sqo) + { + output=sqo->sockets; + sqo->sockets.Clear(false, _FILE_AND_LINE_); + socketQueryOutput.Deallocate(sqo, _FILE_AND_LINE_); + if (output.Size()) + return output[0]; + break; + } + } + return RakNetSmartPtr(); +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::GetSockets( DataStructures::List > &sockets ) +{ + sockets.Clear(false, _FILE_AND_LINE_); + + // Send a query to the thread to get the socket, and return when we got it + BufferedCommandStruct *bcs; + + bcs=bufferedCommands.Allocate( _FILE_AND_LINE_ ); + bcs->command=BufferedCommandStruct::BCS_GET_SOCKET; + bcs->systemIdentifier=UNASSIGNED_SYSTEM_ADDRESS; + bcs->data=0; + bufferedCommands.Push(bcs); + + // Block up to one second to get the socket, although it should actually take virtually no time + SocketQueryOutput *sqo; + RakNetSmartPtr output; + while (1) + { + if (isMainLoopThreadActive==false) + return; + + RakSleep(0); + + sqo = socketQueryOutput.Pop(); + if (sqo) + { + sockets=sqo->sockets; + sqo->sockets.Clear(false, _FILE_AND_LINE_); + socketQueryOutput.Deallocate(sqo, _FILE_AND_LINE_); + return; + } + } + return; +} +void RakPeer::ReleaseSockets( DataStructures::List > &sockets ) +{ + sockets.Clear(false,_FILE_AND_LINE_); +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Adds simulated ping and packet loss to the outgoing data flow. +// To simulate bi-directional ping and packet loss, you should call this on both the sender and the recipient, with half the total ping and maxSendBPS value on each. +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::ApplyNetworkSimulator( float packetloss, unsigned short minExtraPing, unsigned short extraPingVariance) +{ +#ifdef _DEBUG + if (remoteSystemList) + { + unsigned short i; + for (i=0; i < maximumNumberOfPeers; i++) + //for (i=0; i < remoteSystemListSize; i++) + remoteSystemList[i].reliabilityLayer.ApplyNetworkSimulator(packetloss, minExtraPing, extraPingVariance); + } + + _packetloss=packetloss; + _minExtraPing=minExtraPing; + _extraPingVariance=extraPingVariance; +#endif +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void RakPeer::SetPerConnectionOutgoingBandwidthLimit( unsigned maxBitsPerSecond ) +{ + maxOutgoingBPS=maxBitsPerSecond; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Returns if you previously called ApplyNetworkSimulator +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +bool RakPeer::IsNetworkSimulatorActive( void ) +{ +#ifdef _DEBUG + return _packetloss>0 || _minExtraPing>0 || _extraPingVariance>0; +#else + return false; +#endif +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::WriteOutOfBandHeader(RakNet::BitStream *bitStream) +{ + bitStream->Write((MessageID)ID_OUT_OF_BAND_INTERNAL); + bitStream->Write(myGuid); + bitStream->WriteAlignedBytes((const unsigned char*) OFFLINE_MESSAGE_DATA_ID, sizeof(OFFLINE_MESSAGE_DATA_ID)); +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::SetUserUpdateThread(void (*_userUpdateThreadPtr)(RakPeerInterface *, void *), void *_userUpdateThreadData) +{ + userUpdateThreadPtr=_userUpdateThreadPtr; + userUpdateThreadData=_userUpdateThreadData; +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +bool RakPeer::SendOutOfBand(const char *host, unsigned short remotePort, const char *data, BitSize_t dataLength, unsigned connectionSocketIndex ) +{ + if ( IsActive() == false ) + return false; + + if (host==0 || host[0]==0) + return false; + + // If this assert hits then Startup wasn't called or the call failed. + RakAssert(connectionSocketIndex < socketList.Size()); + + // This is a security measure. Don't send data longer than this value + RakAssert(dataLength <= (MAX_OFFLINE_DATA_LENGTH + sizeof(unsigned char)+sizeof(RakNet::Time)+RakNetGUID::size()+sizeof(OFFLINE_MESSAGE_DATA_ID))); + + if (host==0) + return false; + + // 34 bytes + RakNet::BitStream bitStream; + WriteOutOfBandHeader(&bitStream); + + if (dataLength>0) + { + bitStream.Write(data, dataLength); + } + + unsigned int realIndex = GetRakNetSocketFromUserConnectionSocketIndex(connectionSocketIndex); + + SystemAddress systemAddress; + systemAddress.FromStringExplicitPort(host,remotePort, socketList[realIndex]->boundAddress.GetIPVersion()); + systemAddress.FixForIPVersion(socketList[realIndex]->boundAddress); + + unsigned i; + for (i=0; i < pluginListNTS.Size(); i++) + pluginListNTS[i]->OnDirectSocketSend((const char*)bitStream.GetData(), bitStream.GetNumberOfBitsUsed(), systemAddress); + + SocketLayer::SendTo( socketList[realIndex]->s, (const char*)bitStream.GetData(), (int) bitStream.GetNumberOfBytesUsed(), systemAddress, socketList[realIndex]->remotePortRakNetWasStartedOn_PS3_PSP2, socketList[realIndex]->extraSocketOptions, _FILE_AND_LINE_ ); + + return true; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +RakNetStatistics * RakPeer::GetStatistics( const SystemAddress systemAddress, RakNetStatistics *rns ) +{ + static RakNetStatistics staticStatistics; + RakNetStatistics *systemStats; + if (rns==0) + systemStats=&staticStatistics; + else + systemStats=rns; + + if (systemAddress==UNASSIGNED_SYSTEM_ADDRESS) + { + bool firstWrite=false; + // Return a crude sum + for ( unsigned short i = 0; i < maximumNumberOfPeers; i++ ) + { + if (remoteSystemList[ i ].isActive) + { + RakNetStatistics rnsTemp; + remoteSystemList[ i ].reliabilityLayer.GetStatistics(&rnsTemp); + + if (firstWrite==false) + { + memcpy(systemStats, &rnsTemp, sizeof(RakNetStatistics)); + firstWrite=true; + } + else + (*systemStats)+=rnsTemp; + } + } + return systemStats; + } + else + { + RemoteSystemStruct * rss; + rss = GetRemoteSystemFromSystemAddress( systemAddress, false, false ); + if ( rss && endThreads==false ) + { + rss->reliabilityLayer.GetStatistics(systemStats); + return systemStats; + } + } + + return 0; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +bool RakPeer::GetStatistics( const int index, RakNetStatistics *rns ) +{ + if (index < maximumNumberOfPeers && remoteSystemList[ index ].isActive) + { + remoteSystemList[ index ].reliabilityLayer.GetStatistics(rns); + return true; + } + return false; +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +unsigned int RakPeer::GetReceiveBufferSize(void) +{ + unsigned int size; + packetReturnMutex.Lock(); + size=packetReturnQueue.Size(); + packetReturnMutex.Unlock(); + return size; +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +int RakPeer::GetIndexFromSystemAddress( const SystemAddress systemAddress, bool calledFromNetworkThread ) const +{ + unsigned i; + + if ( systemAddress == UNASSIGNED_SYSTEM_ADDRESS ) + return -1; + + if (systemAddress.systemIndex!=(SystemIndex)-1 && systemAddress.systemIndex < maximumNumberOfPeers && remoteSystemList[systemAddress.systemIndex].systemAddress==systemAddress && remoteSystemList[ systemAddress.systemIndex ].isActive) + return systemAddress.systemIndex; + + if (calledFromNetworkThread) + { + return GetRemoteSystemIndex(systemAddress); + } + else + { + // remoteSystemList in user and network thread + for ( i = 0; i < maximumNumberOfPeers; i++ ) + if ( remoteSystemList[ i ].isActive && remoteSystemList[ i ].systemAddress == systemAddress ) + return i; + + // If no active results found, try previously active results. + for ( i = 0; i < maximumNumberOfPeers; i++ ) + if ( remoteSystemList[ i ].systemAddress == systemAddress ) + return i; + } + + return -1; +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +int RakPeer::GetIndexFromGuid( const RakNetGUID guid ) +{ + unsigned i; + + if ( guid == UNASSIGNED_RAKNET_GUID ) + return -1; + + if (guid.systemIndex!=(SystemIndex)-1 && guid.systemIndex < maximumNumberOfPeers && remoteSystemList[guid.systemIndex].guid==guid && remoteSystemList[ guid.systemIndex ].isActive) + return guid.systemIndex; + + // remoteSystemList in user and network thread + for ( i = 0; i < maximumNumberOfPeers; i++ ) + if ( remoteSystemList[ i ].isActive && remoteSystemList[ i ].guid == guid ) + return i; + + // If no active results found, try previously active results. + for ( i = 0; i < maximumNumberOfPeers; i++ ) + if ( remoteSystemList[ i ].guid == guid ) + return i; + + return -1; +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +#if LIBCAT_SECURITY==1 +bool RakPeer::GenerateConnectionRequestChallenge(RequestedConnectionStruct *rcs,PublicKey *publicKey) +{ + CAT_AUDIT_PRINTF("AUDIT: In GenerateConnectionRequestChallenge()\n"); + + rcs->client_handshake = 0; + rcs->publicKeyMode = PKM_INSECURE_CONNECTION; + + if (!publicKey) return true; + + switch (publicKey->publicKeyMode) + { + default: + case PKM_INSECURE_CONNECTION: + break; + + case PKM_ACCEPT_ANY_PUBLIC_KEY: + CAT_OBJCLR(rcs->remote_public_key); + rcs->client_handshake = RakNet::OP_NEW(_FILE_AND_LINE_); + + rcs->publicKeyMode = PKM_ACCEPT_ANY_PUBLIC_KEY; + break; + + case PKM_USE_TWO_WAY_AUTHENTICATION: + if (publicKey->myPublicKey == 0 || publicKey->myPrivateKey == 0 || + publicKey->remoteServerPublicKey == 0) + { + return false; + } + + rcs->client_handshake = RakNet::OP_NEW(_FILE_AND_LINE_); + memcpy(rcs->remote_public_key, publicKey->remoteServerPublicKey, cat::EasyHandshake::PUBLIC_KEY_BYTES); + + if (!rcs->client_handshake->Initialize(publicKey->remoteServerPublicKey) || + !rcs->client_handshake->SetIdentity(publicKey->myPublicKey, publicKey->myPrivateKey) || + !rcs->client_handshake->GenerateChallenge(rcs->handshakeChallenge)) + { + CAT_AUDIT_PRINTF("AUDIT: Failure initializing new client_handshake object with identity for this RequestedConnectionStruct\n"); + RakNet::OP_DELETE(rcs->client_handshake,_FILE_AND_LINE_); + rcs->client_handshake=0; + return false; + } + + CAT_AUDIT_PRINTF("AUDIT: Success initializing new client handshake object with identity for this RequestedConnectionStruct -- pre-generated challenge\n"); + + rcs->publicKeyMode = PKM_USE_TWO_WAY_AUTHENTICATION; + break; + + case PKM_USE_KNOWN_PUBLIC_KEY: + if (publicKey->remoteServerPublicKey == 0) + return false; + + rcs->client_handshake = RakNet::OP_NEW(_FILE_AND_LINE_); + memcpy(rcs->remote_public_key, publicKey->remoteServerPublicKey, cat::EasyHandshake::PUBLIC_KEY_BYTES); + + if (!rcs->client_handshake->Initialize(publicKey->remoteServerPublicKey) || + !rcs->client_handshake->GenerateChallenge(rcs->handshakeChallenge)) + { + CAT_AUDIT_PRINTF("AUDIT: Failure initializing new client_handshake object for this RequestedConnectionStruct\n"); + RakNet::OP_DELETE(rcs->client_handshake,_FILE_AND_LINE_); + rcs->client_handshake=0; + return false; + } + + CAT_AUDIT_PRINTF("AUDIT: Success initializing new client handshake object for this RequestedConnectionStruct -- pre-generated challenge\n"); + + rcs->publicKeyMode = PKM_USE_KNOWN_PUBLIC_KEY; + break; + } + + return true; +} +#endif +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +ConnectionAttemptResult RakPeer::SendConnectionRequest( const char* host, unsigned short remotePort, const char *passwordData, int passwordDataLength, PublicKey *publicKey, unsigned connectionSocketIndex, unsigned int extraData, unsigned sendConnectionAttemptCount, unsigned timeBetweenSendConnectionAttemptsMS, RakNet::TimeMS timeoutTime ) +{ + RakAssert(passwordDataLength <= 256); + RakAssert(remotePort!=0); + SystemAddress systemAddress; + if (!systemAddress.FromStringExplicitPort(host,remotePort,socketList[connectionSocketIndex]->boundAddress.GetIPVersion())) + return CANNOT_RESOLVE_DOMAIN_NAME; + + // Already connected? + if (GetRemoteSystemFromSystemAddress(systemAddress, false, true)) + return ALREADY_CONNECTED_TO_ENDPOINT; + + //RequestedConnectionStruct *rcs = (RequestedConnectionStruct *) rakMalloc_Ex(sizeof(RequestedConnectionStruct), _FILE_AND_LINE_); + RequestedConnectionStruct *rcs = RakNet::OP_NEW(_FILE_AND_LINE_); + + rcs->systemAddress=systemAddress; + rcs->nextRequestTime=RakNet::GetTimeMS(); + rcs->requestsMade=0; + rcs->data=0; + rcs->extraData=extraData; + rcs->socketIndex=connectionSocketIndex; + rcs->actionToTake=RequestedConnectionStruct::CONNECT; + rcs->sendConnectionAttemptCount=sendConnectionAttemptCount; + rcs->timeBetweenSendConnectionAttemptsMS=timeBetweenSendConnectionAttemptsMS; + memcpy(rcs->outgoingPassword, passwordData, passwordDataLength); + rcs->outgoingPasswordLength=(unsigned char) passwordDataLength; + rcs->timeoutTime=timeoutTime; + +#if LIBCAT_SECURITY==1 + CAT_AUDIT_PRINTF("AUDIT: In SendConnectionRequest()\n"); + if (!GenerateConnectionRequestChallenge(rcs,publicKey)) + return SECURITY_INITIALIZATION_FAILED; +#else + (void) publicKey; +#endif + + // Return false if already pending, else push on queue + unsigned int i=0; + requestedConnectionQueueMutex.Lock(); + for (; i < requestedConnectionQueue.Size(); i++) + { + if (requestedConnectionQueue[i]->systemAddress==systemAddress) + { + requestedConnectionQueueMutex.Unlock(); + // Not necessary + //RakNet::OP_DELETE(rcs->client_handshake,_FILE_AND_LINE_); + RakNet::OP_DELETE(rcs,_FILE_AND_LINE_); + return CONNECTION_ATTEMPT_ALREADY_IN_PROGRESS; + } + } + requestedConnectionQueue.Push(rcs, _FILE_AND_LINE_ ); + requestedConnectionQueueMutex.Unlock(); + + return CONNECTION_ATTEMPT_STARTED; +} +ConnectionAttemptResult RakPeer::SendConnectionRequest( const char* host, unsigned short remotePort, const char *passwordData, int passwordDataLength, PublicKey *publicKey, unsigned connectionSocketIndex, unsigned int extraData, unsigned sendConnectionAttemptCount, unsigned timeBetweenSendConnectionAttemptsMS, RakNet::TimeMS timeoutTime, RakNetSmartPtr socket ) +{ + RakAssert(passwordDataLength <= 256); + SystemAddress systemAddress; + systemAddress.FromStringExplicitPort(host,remotePort); + + // Already connected? + if (GetRemoteSystemFromSystemAddress(systemAddress, false, true)) + return ALREADY_CONNECTED_TO_ENDPOINT; + + //RequestedConnectionStruct *rcs = (RequestedConnectionStruct *) rakMalloc_Ex(sizeof(RequestedConnectionStruct), _FILE_AND_LINE_); + RequestedConnectionStruct *rcs = RakNet::OP_NEW(_FILE_AND_LINE_); + + rcs->systemAddress=systemAddress; + rcs->nextRequestTime=RakNet::GetTimeMS(); + rcs->requestsMade=0; + rcs->data=0; + rcs->extraData=extraData; + rcs->socketIndex=connectionSocketIndex; + rcs->actionToTake=RequestedConnectionStruct::CONNECT; + rcs->sendConnectionAttemptCount=sendConnectionAttemptCount; + rcs->timeBetweenSendConnectionAttemptsMS=timeBetweenSendConnectionAttemptsMS; + memcpy(rcs->outgoingPassword, passwordData, passwordDataLength); + rcs->outgoingPasswordLength=(unsigned char) passwordDataLength; + rcs->timeoutTime=timeoutTime; + rcs->socket=socket; + +#if LIBCAT_SECURITY==1 + if (!GenerateConnectionRequestChallenge(rcs,publicKey)) + return SECURITY_INITIALIZATION_FAILED; +#else + (void) publicKey; +#endif + + // Return false if already pending, else push on queue + unsigned int i=0; + requestedConnectionQueueMutex.Lock(); + for (; i < requestedConnectionQueue.Size(); i++) + { + if (requestedConnectionQueue[i]->systemAddress==systemAddress) + { + requestedConnectionQueueMutex.Unlock(); + // Not necessary + //RakNet::OP_DELETE(rcs->client_handshake,_FILE_AND_LINE_); + RakNet::OP_DELETE(rcs,_FILE_AND_LINE_); + return CONNECTION_ATTEMPT_ALREADY_IN_PROGRESS; + } + } + requestedConnectionQueue.Push(rcs, _FILE_AND_LINE_ ); + requestedConnectionQueueMutex.Unlock(); + + return CONNECTION_ATTEMPT_STARTED; +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::ValidateRemoteSystemLookup(void) const +{ +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +RakPeer::RemoteSystemStruct *RakPeer::GetRemoteSystem( const AddressOrGUID systemIdentifier, bool calledFromNetworkThread, bool onlyActive ) const +{ + if (systemIdentifier.rakNetGuid!=UNASSIGNED_RAKNET_GUID) + return GetRemoteSystemFromGUID(systemIdentifier.rakNetGuid, onlyActive); + else + return GetRemoteSystemFromSystemAddress(systemIdentifier.systemAddress, calledFromNetworkThread, onlyActive); +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +RakPeer::RemoteSystemStruct *RakPeer::GetRemoteSystemFromSystemAddress( const SystemAddress systemAddress, bool calledFromNetworkThread, bool onlyActive ) const +{ + unsigned i; + + if ( systemAddress == UNASSIGNED_SYSTEM_ADDRESS ) + return 0; + + if (calledFromNetworkThread) + { + unsigned int index = GetRemoteSystemIndex(systemAddress); + if (index!=(unsigned int) -1) + { + if (onlyActive==false || remoteSystemList[ index ].isActive==true ) + { + RakAssert(remoteSystemList[index].systemAddress==systemAddress); + return remoteSystemList + index; + } + } + } + else + { + int deadConnectionIndex=-1; + + // Active connections take priority. But if there are no active connections, return the first systemAddress match found + for ( i = 0; i < maximumNumberOfPeers; i++ ) + { + if (remoteSystemList[ i ].systemAddress == systemAddress) + { + if ( remoteSystemList[ i ].isActive ) + return remoteSystemList + i; + else if (deadConnectionIndex==-1) + deadConnectionIndex=i; + } + } + + if (deadConnectionIndex!=-1 && onlyActive==false) + return remoteSystemList + deadConnectionIndex; + } + + return 0; +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +RakPeer::RemoteSystemStruct *RakPeer::GetRemoteSystemFromGUID( const RakNetGUID guid, bool onlyActive ) const +{ + if (guid==UNASSIGNED_RAKNET_GUID) + return 0; + + unsigned i; + for ( i = 0; i < maximumNumberOfPeers; i++ ) + { + if (remoteSystemList[ i ].guid == guid && (onlyActive==false || remoteSystemList[ i ].isActive)) + { + return remoteSystemList + i; + } + } + return 0; +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::ParseConnectionRequestPacket( RakPeer::RemoteSystemStruct *remoteSystem, const SystemAddress &systemAddress, const char *data, int byteSize ) +{ + RakNet::BitStream bs((unsigned char*) data,byteSize,false); + bs.IgnoreBytes(sizeof(MessageID)); + RakNetGUID guid; + bs.Read(guid); + RakNet::Time incomingTimestamp; + bs.Read(incomingTimestamp); + unsigned char doSecurity; + bs.Read(doSecurity); + +#if LIBCAT_SECURITY==1 + unsigned char doClientKey; + if (_using_security) + { + // Ignore message on bad state + if (doSecurity != 1 || !remoteSystem->reliabilityLayer.GetAuthenticatedEncryption()) + return; + + // Validate client proof of key + unsigned char proof[cat::EasyHandshake::PROOF_BYTES]; + bs.ReadAlignedBytes(proof, sizeof(proof)); + if (!remoteSystem->reliabilityLayer.GetAuthenticatedEncryption()->ValidateProof(proof, sizeof(proof))) + { + remoteSystem->connectMode = RemoteSystemStruct::DISCONNECT_ASAP_SILENTLY; + return; + } + + CAT_OBJCLR(remoteSystem->client_public_key); + + bs.Read(doClientKey); + + // Check if client wants to prove identity + if (doClientKey == 1) + { + // Read identity proof + unsigned char ident[cat::EasyHandshake::IDENTITY_BYTES]; + bs.ReadAlignedBytes(ident, sizeof(ident)); + + // If we are listening to these proofs, + if (_require_client_public_key) + { + // Validate client identity + if (!_server_handshake->VerifyInitiatorIdentity(remoteSystem->answer, ident, remoteSystem->client_public_key)) + { + RakNet::BitStream bitStream; + bitStream.Write((MessageID)ID_REMOTE_SYSTEM_REQUIRES_PUBLIC_KEY); // Report an error since the client is not providing an identity when it is necessary to connect + bitStream.Write((unsigned char)2); // Indicate client identity is invalid + SendImmediate((char*) bitStream.GetData(), bitStream.GetNumberOfBytesUsed(), IMMEDIATE_PRIORITY, RELIABLE, 0, systemAddress, false, false, RakNet::GetTimeUS(), 0); + remoteSystem->connectMode = RemoteSystemStruct::DISCONNECT_ASAP_SILENTLY; + return; + } + } + + // Otherwise ignore the client public key + } + else + { + // If no client key was provided but it is required, + if (_require_client_public_key) + { + RakNet::BitStream bitStream; + bitStream.Write((MessageID)ID_REMOTE_SYSTEM_REQUIRES_PUBLIC_KEY); // Report an error since the client is not providing an identity when it is necessary to connect + bitStream.Write((unsigned char)1); // Indicate client identity is missing + SendImmediate((char*) bitStream.GetData(), bitStream.GetNumberOfBytesUsed(), IMMEDIATE_PRIORITY, RELIABLE, 0, systemAddress, false, false, RakNet::GetTimeUS(), 0); + remoteSystem->connectMode = RemoteSystemStruct::DISCONNECT_ASAP_SILENTLY; + return; + } + } + } +#endif // LIBCAT_SECURITY + + unsigned char *password = bs.GetData()+BITS_TO_BYTES(bs.GetReadOffset()); + int passwordLength = byteSize - BITS_TO_BYTES(bs.GetReadOffset()); + if ( incomingPasswordLength != passwordLength || + memcmp( password, incomingPassword, incomingPasswordLength ) != 0 ) + { + CAT_AUDIT_PRINTF("AUDIT: Invalid password\n"); + // This one we only send once since we don't care if it arrives. + RakNet::BitStream bitStream; + bitStream.Write((MessageID)ID_INVALID_PASSWORD); + bitStream.Write(GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS)); + SendImmediate((char*) bitStream.GetData(), bitStream.GetNumberOfBytesUsed(), IMMEDIATE_PRIORITY, RELIABLE, 0, systemAddress, false, false, RakNet::GetTimeUS(), 0); + remoteSystem->connectMode=RemoteSystemStruct::DISCONNECT_ASAP_SILENTLY; + return; + } + + // OK + remoteSystem->connectMode=RemoteSystemStruct::HANDLING_CONNECTION_REQUEST; + + OnConnectionRequest( remoteSystem, incomingTimestamp ); +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::OnConnectionRequest( RakPeer::RemoteSystemStruct *remoteSystem, RakNet::Time incomingTimestamp ) +{ + RakNet::BitStream bitStream; + bitStream.Write((MessageID)ID_CONNECTION_REQUEST_ACCEPTED); + bitStream.Write(remoteSystem->systemAddress); + SystemIndex systemIndex = (SystemIndex) GetIndexFromSystemAddress( remoteSystem->systemAddress, true ); + RakAssert(systemIndex!=65535); + bitStream.Write(systemIndex); + for (unsigned int i=0; i < MAXIMUM_NUMBER_OF_INTERNAL_IDS; i++) + bitStream.Write(ipList[i]); + bitStream.Write(incomingTimestamp); + bitStream.Write(RakNet::GetTime()); + + SendImmediate((char*)bitStream.GetData(), bitStream.GetNumberOfBitsUsed(), IMMEDIATE_PRIORITY, RELIABLE_ORDERED, 0, remoteSystem->systemAddress, false, false, RakNet::GetTimeUS(), 0); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::NotifyAndFlagForShutdown( const SystemAddress systemAddress, bool performImmediate, unsigned char orderingChannel, PacketPriority disconnectionNotificationPriority ) +{ + RakNet::BitStream temp( sizeof(unsigned char) ); + temp.Write( (MessageID)ID_DISCONNECTION_NOTIFICATION ); + if (performImmediate) + { + SendImmediate((char*)temp.GetData(), temp.GetNumberOfBitsUsed(), disconnectionNotificationPriority, RELIABLE_ORDERED, orderingChannel, systemAddress, false, false, RakNet::GetTimeUS(), 0); + RemoteSystemStruct *rss=GetRemoteSystemFromSystemAddress(systemAddress, true, true); + rss->connectMode=RemoteSystemStruct::DISCONNECT_ASAP; + } + else + { + SendBuffered((const char*)temp.GetData(), temp.GetNumberOfBitsUsed(), disconnectionNotificationPriority, RELIABLE_ORDERED, orderingChannel, systemAddress, false, RemoteSystemStruct::DISCONNECT_ASAP, 0); + } +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +unsigned short RakPeer::GetNumberOfRemoteInitiatedConnections( void ) const +{ + if ( remoteSystemList == 0 || endThreads == true ) + return 0; + + unsigned short numberOfIncomingConnections; + numberOfIncomingConnections = 0; + unsigned int i; + for (i=0; i < activeSystemListSize; i++) + { + if ((activeSystemList[i])->isActive && + (activeSystemList[i])->connectMode==RakPeer::RemoteSystemStruct::CONNECTED && + (activeSystemList[i])->weInitiatedTheConnection==false + ) + { + numberOfIncomingConnections++; + } + } + return numberOfIncomingConnections; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +RakPeer::RemoteSystemStruct * RakPeer::AssignSystemAddressToRemoteSystemList( const SystemAddress systemAddress, RemoteSystemStruct::ConnectMode connectionMode, RakNetSmartPtr incomingRakNetSocket, bool *thisIPConnectedRecently, SystemAddress bindingAddress, int incomingMTU, RakNetGUID guid, bool useSecurity ) +{ + RemoteSystemStruct * remoteSystem; + unsigned i,j,assignedIndex; + RakNet::TimeMS time = RakNet::GetTimeMS(); +#ifdef _DEBUG + RakAssert(systemAddress!=UNASSIGNED_SYSTEM_ADDRESS); +#endif + + if (limitConnectionFrequencyFromTheSameIP) + { + if (IsLoopbackAddress(systemAddress,false)==false) + { + for ( i = 0; i < maximumNumberOfPeers; i++ ) + { + if ( remoteSystemList[ i ].isActive==true && + remoteSystemList[ i ].systemAddress.EqualsExcludingPort(systemAddress) && + time >= remoteSystemList[ i ].connectionTime && + time - remoteSystemList[ i ].connectionTime < 100 + ) + { + // 4/13/09 Attackers can flood ID_OPEN_CONNECTION_REQUEST and use up all available connection slots + // Ignore connection attempts if this IP address connected within the last 100 milliseconds + *thisIPConnectedRecently=true; + ValidateRemoteSystemLookup(); + return 0; + } + } + } + } + + // Don't use a different port than what we received on + bindingAddress.CopyPort(incomingRakNetSocket->boundAddress); + + *thisIPConnectedRecently=false; + for ( assignedIndex = 0; assignedIndex < maximumNumberOfPeers; assignedIndex++ ) + { + if ( remoteSystemList[ assignedIndex ].isActive==false ) + { + remoteSystem=remoteSystemList+assignedIndex; + ReferenceRemoteSystem(systemAddress, assignedIndex); + remoteSystem->MTUSize=defaultMTUSize; + remoteSystem->guid=guid; + remoteSystem->isActive = true; // This one line causes future incoming packets to go through the reliability layer + // Reserve this reliability layer for ourselves. + if (incomingMTU > remoteSystem->MTUSize) + remoteSystem->MTUSize=incomingMTU; + remoteSystem->reliabilityLayer.Reset(true, remoteSystem->MTUSize, useSecurity); + remoteSystem->reliabilityLayer.SetSplitMessageProgressInterval(splitMessageProgressInterval); + remoteSystem->reliabilityLayer.SetUnreliableTimeout(unreliableTimeout); + remoteSystem->reliabilityLayer.SetTimeoutTime(defaultTimeoutTime); + AddToActiveSystemList(assignedIndex); + if (incomingRakNetSocket->boundAddress==bindingAddress) + { + remoteSystem->rakNetSocket=incomingRakNetSocket; + } + else + { + char str[256]; + bindingAddress.ToString(true,str); + // See if this is an internal IP address. + // If so, force binding on it so we reply on the same IP address as they sent to. + unsigned int ipListIndex, foundIndex=(unsigned int)-1; + + for (ipListIndex=0; ipListIndex < MAXIMUM_NUMBER_OF_INTERNAL_IDS; ipListIndex++) + { + if (ipList[ipListIndex]==UNASSIGNED_SYSTEM_ADDRESS) + break; + + if (bindingAddress.EqualsExcludingPort(ipList[ipListIndex])) + { + foundIndex=ipListIndex; + break; + } + } + + // 06/26/09 Unconfirmed report that Vista firewall blocks the reply if we force a binding + // For now use the incoming socket only + // Originally this code was to force a machine with multiple IP addresses to reply back on the IP + // that the datagram came in on + if (1 || foundIndex==(unsigned int)-1) + { + // Must not be an internal LAN address. Just use whatever socket it came in on + remoteSystem->rakNetSocket=incomingRakNetSocket; + } + else + { + // Force binding + unsigned int socketListIndex; + for (socketListIndex=0; socketListIndex < socketList.Size(); socketListIndex++) + { + if (socketList[socketListIndex]->boundAddress==bindingAddress) + { + // Force binding with existing socket + remoteSystem->rakNetSocket=socketList[socketListIndex]; + break; + } + } + + if (socketListIndex==socketList.Size()) + { + char ipListFoundIndexStr[128]; + ipList[foundIndex].ToString(false,str); + + // Force binding with new socket + RakNetSmartPtr rns(RakNet::OP_NEW(_FILE_AND_LINE_)); + if (incomingRakNetSocket->remotePortRakNetWasStartedOn_PS3_PSP2==0) + rns->s = (unsigned int) SocketLayer::CreateBoundSocket( bindingAddress.GetPort(), true, ipListFoundIndexStr, 0, incomingRakNetSocket->extraSocketOptions, incomingRakNetSocket->socketFamily ); + else + rns->s = (unsigned int) SocketLayer::CreateBoundSocket_PS3Lobby( bindingAddress.GetPort(), true, ipListFoundIndexStr, incomingRakNetSocket->socketFamily ); + if ((SOCKET)rns->s==(SOCKET)-1) + { + // Can't bind. Just use whatever socket it came in on + remoteSystem->rakNetSocket=incomingRakNetSocket; + } + else + { + rns->boundAddress=bindingAddress; + rns->remotePortRakNetWasStartedOn_PS3_PSP2=incomingRakNetSocket->remotePortRakNetWasStartedOn_PS3_PSP2; + rns->extraSocketOptions=incomingRakNetSocket->extraSocketOptions; + rns->userConnectionSocketIndex=(unsigned int)-1; + socketList.Push(rns, _FILE_AND_LINE_ ); + remoteSystem->rakNetSocket=rns; + + RakPeerAndIndex rpai; + rpai.remotePortRakNetWasStartedOn_PS3=rns->remotePortRakNetWasStartedOn_PS3_PSP2; + rpai.extraSocketOptions=rns->extraSocketOptions; + rpai.s=rns->s; + rpai.rakPeer=this; +#ifdef _WIN32 + int highPriority=THREAD_PRIORITY_ABOVE_NORMAL; +#else + int highPriority=-10; +#endif + +//#if !defined(_XBOX) && !defined(X360) + highPriority=0; +//#endif + + + + + + + + RakNet::RakThread::Create(RecvFromLoop, &rpai, highPriority); + + RakSleep(10); + + + /* +#if defined (_WIN32) && defined(USE_WAIT_FOR_MULTIPLE_EVENTS) + if (threadSleepTimer>0) + { + rns->recvEvent=CreateEvent(0,FALSE,FALSE,0); + WSAEventSelect(rns->s,rns->recvEvent,FD_READ); + } +#endif + */ + } + } + } + } + + for ( j = 0; j < (unsigned) PING_TIMES_ARRAY_SIZE; j++ ) + { + remoteSystem->pingAndClockDifferential[ j ].pingTime = 65535; + remoteSystem->pingAndClockDifferential[ j ].clockDifferential = 0; + } + + remoteSystem->connectMode=connectionMode; + remoteSystem->pingAndClockDifferentialWriteIndex = 0; + remoteSystem->lowestPing = 65535; + remoteSystem->nextPingTime = 0; // Ping immediately + remoteSystem->weInitiatedTheConnection = false; + remoteSystem->connectionTime = time; + remoteSystem->myExternalSystemAddress = UNASSIGNED_SYSTEM_ADDRESS; + remoteSystem->lastReliableSend=time; + +#ifdef _DEBUG + int indexLoopupCheck=GetIndexFromSystemAddress( systemAddress, true ); + if ((int) indexLoopupCheck!=(int) assignedIndex) + { + RakAssert((int) indexLoopupCheck==(int) assignedIndex); + } +#endif + + return remoteSystem; + } + } + + return 0; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Adjust the first four bytes (treated as unsigned int) of the pointer +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::ShiftIncomingTimestamp( unsigned char *data, const SystemAddress &systemAddress ) const +{ +#ifdef _DEBUG + RakAssert( IsActive() ); + RakAssert( data ); +#endif + + RakNet::BitStream timeBS( data, sizeof(RakNet::Time), false); + RakNet::Time encodedTimestamp; + timeBS.Read(encodedTimestamp); + + encodedTimestamp = encodedTimestamp - GetBestClockDifferential( systemAddress ); + timeBS.SetWriteOffset(0); + timeBS.Write(encodedTimestamp); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// Thanks to Chris Taylor (cat02e@fsu.edu) for the improved timestamping algorithm +RakNet::Time RakPeer::GetBestClockDifferential( const SystemAddress systemAddress ) const +{ + int counter, lowestPingSoFar; + RakNet::Time clockDifferential; + RemoteSystemStruct *remoteSystem = GetRemoteSystemFromSystemAddress( systemAddress, true, true ); + + if ( remoteSystem == 0 ) + return 0; + + lowestPingSoFar = 65535; + + clockDifferential = 0; + + for ( counter = 0; counter < PING_TIMES_ARRAY_SIZE; counter++ ) + { + if ( remoteSystem->pingAndClockDifferential[ counter ].pingTime == 65535 ) + break; + + if ( remoteSystem->pingAndClockDifferential[ counter ].pingTime < lowestPingSoFar ) + { + clockDifferential = remoteSystem->pingAndClockDifferential[ counter ].clockDifferential; + lowestPingSoFar = remoteSystem->pingAndClockDifferential[ counter ].pingTime; + } + } + + return clockDifferential; +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +unsigned int RakPeer::RemoteSystemLookupHashIndex(const SystemAddress &sa) const +{ + return SystemAddress::ToInteger(sa) % ((unsigned int) maximumNumberOfPeers * REMOTE_SYSTEM_LOOKUP_HASH_MULTIPLE); +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::ReferenceRemoteSystem(const SystemAddress &sa, unsigned int remoteSystemListIndex) +{ +// #ifdef _DEBUG +// for ( int remoteSystemIndex = 0; remoteSystemIndex < maximumNumberOfPeers; ++remoteSystemIndex ) +// { +// if (remoteSystemList[remoteSystemIndex].isActive ) +// { +// unsigned int hashIndex = GetRemoteSystemIndex(remoteSystemList[remoteSystemIndex].systemAddress); +// RakAssert(hashIndex==remoteSystemIndex); +// } +// } +// #endif + + + SystemAddress oldAddress = remoteSystemList[remoteSystemListIndex].systemAddress; + if (oldAddress!=UNASSIGNED_SYSTEM_ADDRESS) + { + // The system might be active if rerouting +// RakAssert(remoteSystemList[remoteSystemListIndex].isActive==false); + + // Remove the reference if the reference is pointing to this inactive system + if (GetRemoteSystem(oldAddress)==&remoteSystemList[remoteSystemListIndex]) + DereferenceRemoteSystem(oldAddress); + } + DereferenceRemoteSystem(sa); + +// #ifdef _DEBUG +// for ( int remoteSystemIndex = 0; remoteSystemIndex < maximumNumberOfPeers; ++remoteSystemIndex ) +// { +// if (remoteSystemList[remoteSystemIndex].isActive ) +// { +// unsigned int hashIndex = GetRemoteSystemIndex(remoteSystemList[remoteSystemIndex].systemAddress); +// if (hashIndex!=remoteSystemIndex) +// { +// RakAssert(hashIndex==remoteSystemIndex); +// } +// } +// } +// #endif + + + remoteSystemList[remoteSystemListIndex].systemAddress=sa; + + unsigned int hashIndex = RemoteSystemLookupHashIndex(sa); + RemoteSystemIndex *rsi; + rsi = remoteSystemIndexPool.Allocate(_FILE_AND_LINE_); + if (remoteSystemLookup[hashIndex]==0) + { + rsi->next=0; + rsi->index=remoteSystemListIndex; + remoteSystemLookup[hashIndex]=rsi; + } + else + { + RemoteSystemIndex *cur = remoteSystemLookup[hashIndex]; + while (cur->next!=0) + { + cur=cur->next; + } + + rsi = remoteSystemIndexPool.Allocate(_FILE_AND_LINE_); + rsi->next=0; + rsi->index=remoteSystemListIndex; + cur->next=rsi; + } + +// #ifdef _DEBUG +// for ( int remoteSystemIndex = 0; remoteSystemIndex < maximumNumberOfPeers; ++remoteSystemIndex ) +// { +// if (remoteSystemList[remoteSystemIndex].isActive ) +// { +// unsigned int hashIndex = GetRemoteSystemIndex(remoteSystemList[remoteSystemIndex].systemAddress); +// RakAssert(hashIndex==remoteSystemIndex); +// } +// } +// #endif + + + RakAssert(GetRemoteSystemIndex(sa)==remoteSystemListIndex); +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::DereferenceRemoteSystem(const SystemAddress &sa) +{ + unsigned int hashIndex = RemoteSystemLookupHashIndex(sa); + RemoteSystemIndex *cur = remoteSystemLookup[hashIndex]; + RemoteSystemIndex *last = 0; + while (cur!=0) + { + if (remoteSystemList[cur->index].systemAddress==sa) + { + if (last==0) + { + remoteSystemLookup[hashIndex]=cur->next; + } + else + { + last->next=cur->next; + } + remoteSystemIndexPool.Release(cur,_FILE_AND_LINE_); + break; + } + last=cur; + cur=cur->next; + } +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +unsigned int RakPeer::GetRemoteSystemIndex(const SystemAddress &sa) const +{ + unsigned int hashIndex = RemoteSystemLookupHashIndex(sa); + RemoteSystemIndex *cur = remoteSystemLookup[hashIndex]; + while (cur!=0) + { + if (remoteSystemList[cur->index].systemAddress==sa) + return cur->index; + cur=cur->next; + } + return (unsigned int) -1; +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +RakPeer::RemoteSystemStruct* RakPeer::GetRemoteSystem(const SystemAddress &sa) const +{ + unsigned int remoteSystemIndex = GetRemoteSystemIndex(sa); + if (remoteSystemIndex==(unsigned int)-1) + return 0; + return remoteSystemList + remoteSystemIndex; +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::ClearRemoteSystemLookup(void) +{ + remoteSystemIndexPool.Clear(_FILE_AND_LINE_); + RakNet::OP_DELETE_ARRAY(remoteSystemLookup,_FILE_AND_LINE_); + remoteSystemLookup=0; +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::AddToActiveSystemList(unsigned int remoteSystemListIndex) +{ + activeSystemList[activeSystemListSize++]=remoteSystemList+remoteSystemListIndex; +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::RemoveFromActiveSystemList(const SystemAddress &sa) +{ + unsigned int i; + for (i=0; i < activeSystemListSize; i++) + { + RemoteSystemStruct *rss=activeSystemList[i]; + if (rss->systemAddress==sa) + { + activeSystemList[i]=activeSystemList[activeSystemListSize-1]; + activeSystemListSize--; + return; + } + } + RakAssert("activeSystemList invalid, entry not found in RemoveFromActiveSystemList. Ensure that AddToActiveSystemList and RemoveFromActiveSystemList are called by the same thread." && 0); +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +/* +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +unsigned int RakPeer::LookupIndexUsingHashIndex(const SystemAddress &sa) const +{ + unsigned int scanCount=0; + unsigned int index = RemoteSystemLookupHashIndex(sa); + if (remoteSystemLookup[index].index==(unsigned int)-1) + return (unsigned int) -1; + while (remoteSystemList[remoteSystemLookup[index].index].systemAddress!=sa) + { + if (++index==(unsigned int) maximumNumberOfPeers*REMOTE_SYSTEM_LOOKUP_HASH_MULTIPLE) + index=0; + if (++scanCount>(unsigned int) maximumNumberOfPeers*REMOTE_SYSTEM_LOOKUP_HASH_MULTIPLE) + return (unsigned int) -1; + if (remoteSystemLookup[index].index==-1) + return (unsigned int) -1; + } + return index; +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +unsigned int RakPeer::RemoteSystemListIndexUsingHashIndex(const SystemAddress &sa) const +{ + unsigned int index = LookupIndexUsingHashIndex(sa); + if (index!=(unsigned int) -1) + { + return remoteSystemLookup[index].index; + } + return (unsigned int) -1; +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +unsigned int RakPeer::FirstFreeRemoteSystemLookupIndex(const SystemAddress &sa) const +{ +// unsigned int collisionCount=0; + unsigned int index = RemoteSystemLookupHashIndex(sa); + while (remoteSystemLookup[index].index!=(unsigned int)-1) + { + if (++index==(unsigned int) maximumNumberOfPeers*REMOTE_SYSTEM_LOOKUP_HASH_MULTIPLE) + index=0; +// collisionCount++; + } +// printf("%i collisions. Using index %i\n", collisionCount, index); + return index; +} +*/ +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +bool RakPeer::IsLoopbackAddress(const AddressOrGUID &systemIdentifier, bool matchPort) const +{ + if (systemIdentifier.rakNetGuid!=UNASSIGNED_RAKNET_GUID) + return systemIdentifier.rakNetGuid==myGuid; + + for (int i=0; i < MAXIMUM_NUMBER_OF_INTERNAL_IDS && ipList[i]!=UNASSIGNED_SYSTEM_ADDRESS; i++) + { + if (matchPort) + { + if (ipList[i]==systemIdentifier.systemAddress) + return true; + } + else + { + if (ipList[i].EqualsExcludingPort(systemIdentifier.systemAddress)) + return true; + } + } + + return (matchPort==true && systemIdentifier.systemAddress==firstExternalID) || + (matchPort==false && systemIdentifier.systemAddress.EqualsExcludingPort(firstExternalID)); +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +SystemAddress RakPeer::GetLoopbackAddress(void) const +{ + + return ipList[0]; + + + +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +bool RakPeer::AllowIncomingConnections(void) const +{ + return GetNumberOfRemoteInitiatedConnections() < GetMaximumIncomingConnections(); +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::PingInternal( const SystemAddress target, bool performImmediate, PacketReliability reliability ) +{ + if ( IsActive() == false ) + return ; + + RakNet::BitStream bitStream(sizeof(unsigned char)+sizeof(RakNet::Time)); + bitStream.Write((MessageID)ID_CONNECTED_PING); + bitStream.Write(RakNet::GetTime()); + if (performImmediate) + SendImmediate( (char*)bitStream.GetData(), bitStream.GetNumberOfBitsUsed(), IMMEDIATE_PRIORITY, reliability, 0, target, false, false, RakNet::GetTimeUS(), 0 ); + else + Send( &bitStream, IMMEDIATE_PRIORITY, reliability, 0, target, false ); +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::CloseConnectionInternal( const AddressOrGUID& systemIdentifier, bool sendDisconnectionNotification, bool performImmediate, unsigned char orderingChannel, PacketPriority disconnectionNotificationPriority ) +{ +#ifdef _DEBUG + RakAssert(orderingChannel < 32); +#endif + + if (systemIdentifier.IsUndefined()) + return; + + if ( remoteSystemList == 0 || endThreads == true ) + return; + + SystemAddress target; + if (systemIdentifier.systemAddress!=UNASSIGNED_SYSTEM_ADDRESS) + { + target=systemIdentifier.systemAddress; + } + else + { + target=GetSystemAddressFromGuid(systemIdentifier.rakNetGuid); + } + + if (target!=UNASSIGNED_SYSTEM_ADDRESS && performImmediate) + target.FixForIPVersion(socketList[0]->boundAddress); + + if (sendDisconnectionNotification) + { + NotifyAndFlagForShutdown(target, performImmediate, orderingChannel, disconnectionNotificationPriority); + } + else + { + if (performImmediate) + { + unsigned int index = GetRemoteSystemIndex(target); + if (index!=(unsigned int) -1) + { + if ( remoteSystemList[index].isActive ) + { + RemoveFromActiveSystemList(target); + + // Found the index to stop + remoteSystemList[index].isActive = false; + + remoteSystemList[index].guid=UNASSIGNED_RAKNET_GUID; + + // Reserve this reliability layer for ourselves + //remoteSystemList[ remoteSystemLookup[index].index ].systemAddress = UNASSIGNED_SYSTEM_ADDRESS; + + // Clear any remaining messages + remoteSystemList[index].reliabilityLayer.Reset(false, remoteSystemList[index].MTUSize, false); + + // Not using this socket + remoteSystemList[index].rakNetSocket.SetNull(); + } + } + } + else + { + BufferedCommandStruct *bcs; + bcs=bufferedCommands.Allocate( _FILE_AND_LINE_ ); + bcs->command=BufferedCommandStruct::BCS_CLOSE_CONNECTION; + bcs->systemIdentifier=target; + bcs->data=0; + bcs->orderingChannel=orderingChannel; + bcs->priority=disconnectionNotificationPriority; + bufferedCommands.Push(bcs); + } + } +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::SendBuffered( const char *data, BitSize_t numberOfBitsToSend, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast, RemoteSystemStruct::ConnectMode connectionMode, uint32_t receipt ) +{ + BufferedCommandStruct *bcs; + + bcs=bufferedCommands.Allocate( _FILE_AND_LINE_ ); + bcs->data = (char*) rakMalloc_Ex( (size_t) BITS_TO_BYTES(numberOfBitsToSend), _FILE_AND_LINE_ ); // Making a copy doesn't lose efficiency because I tell the reliability layer to use this allocation for its own copy + if (bcs->data==0) + { + notifyOutOfMemory(_FILE_AND_LINE_); + bufferedCommands.Deallocate(bcs, _FILE_AND_LINE_); + return; + } + memcpy(bcs->data, data, (size_t) BITS_TO_BYTES(numberOfBitsToSend)); + bcs->numberOfBitsToSend=numberOfBitsToSend; + bcs->priority=priority; + bcs->reliability=reliability; + bcs->orderingChannel=orderingChannel; + bcs->systemIdentifier=systemIdentifier; + bcs->broadcast=broadcast; + bcs->connectionMode=connectionMode; + bcs->receipt=receipt; + bcs->command=BufferedCommandStruct::BCS_SEND; + bufferedCommands.Push(bcs); + + if (priority==IMMEDIATE_PRIORITY) + { + // Forces pending sends to go out now, rather than waiting to the next update interval + quitAndDataEvents.SetEvent(); + } +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::SendBufferedList( const char **data, const int *lengths, const int numParameters, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast, RemoteSystemStruct::ConnectMode connectionMode, uint32_t receipt ) +{ + BufferedCommandStruct *bcs; + unsigned int totalLength=0; + unsigned int lengthOffset; + int i; + for (i=0; i < numParameters; i++) + { + if (lengths[i]>0) + totalLength+=lengths[i]; + } + if (totalLength==0) + return; + + char *dataAggregate; + dataAggregate = (char*) rakMalloc_Ex( (size_t) totalLength, _FILE_AND_LINE_ ); // Making a copy doesn't lose efficiency because I tell the reliability layer to use this allocation for its own copy + if (dataAggregate==0) + { + notifyOutOfMemory(_FILE_AND_LINE_); + return; + } + for (i=0, lengthOffset=0; i < numParameters; i++) + { + if (lengths[i]>0) + { + memcpy(dataAggregate+lengthOffset, data[i], lengths[i]); + lengthOffset+=lengths[i]; + } + } + + if (broadcast==false && IsLoopbackAddress(systemIdentifier,true)) + { + SendLoopback(dataAggregate,totalLength); + rakFree_Ex(dataAggregate,_FILE_AND_LINE_); + return; + } + + bcs=bufferedCommands.Allocate( _FILE_AND_LINE_ ); + bcs->data = dataAggregate; + bcs->numberOfBitsToSend=BYTES_TO_BITS(totalLength); + bcs->priority=priority; + bcs->reliability=reliability; + bcs->orderingChannel=orderingChannel; + bcs->systemIdentifier=systemIdentifier; + bcs->broadcast=broadcast; + bcs->connectionMode=connectionMode; + bcs->receipt=receipt; + bcs->command=BufferedCommandStruct::BCS_SEND; + bufferedCommands.Push(bcs); + + if (priority==IMMEDIATE_PRIORITY) + { + // Forces pending sends to go out now, rather than waiting to the next update interval + quitAndDataEvents.SetEvent(); + } +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +bool RakPeer::SendImmediate( char *data, BitSize_t numberOfBitsToSend, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast, bool useCallerDataAllocation, RakNet::TimeUS currentTime, uint32_t receipt ) +{ + unsigned *sendList; + unsigned sendListSize; + bool callerDataAllocationUsed; + unsigned int remoteSystemIndex, sendListIndex; // Iterates into the list of remote systems +// unsigned numberOfBytesUsed = (unsigned) BITS_TO_BYTES(numberOfBitsToSend); + callerDataAllocationUsed=false; + + sendListSize=0; + + if (systemIdentifier.systemAddress!=UNASSIGNED_SYSTEM_ADDRESS) + remoteSystemIndex=GetIndexFromSystemAddress( systemIdentifier.systemAddress, true ); + else if (systemIdentifier.rakNetGuid!=UNASSIGNED_RAKNET_GUID) + remoteSystemIndex=GetSystemIndexFromGuid(systemIdentifier.rakNetGuid); + else + remoteSystemIndex=(unsigned int) -1; + + // 03/06/06 - If broadcast is false, use the optimized version of GetIndexFromSystemAddress + if (broadcast==false) + { + if (remoteSystemIndex==(unsigned int) -1) + { +#ifdef _DEBUG +// int debugIndex = GetRemoteSystemIndex(systemIdentifier.systemAddress); +#endif + return false; + } + + + sendList=(unsigned *)alloca(sizeof(unsigned)); + + + + + if (remoteSystemList[remoteSystemIndex].isActive && + remoteSystemList[remoteSystemIndex].connectMode!=RemoteSystemStruct::DISCONNECT_ASAP && + remoteSystemList[remoteSystemIndex].connectMode!=RemoteSystemStruct::DISCONNECT_ASAP_SILENTLY && + remoteSystemList[remoteSystemIndex].connectMode!=RemoteSystemStruct::DISCONNECT_ON_NO_ACK) + { + sendList[0]=remoteSystemIndex; + sendListSize=1; + } + } + else + { + + //sendList=(unsigned *)alloca(sizeof(unsigned)*remoteSystemListSize); + sendList=(unsigned *)alloca(sizeof(unsigned)*maximumNumberOfPeers); + + + + + + // remoteSystemList in network thread + unsigned int idx; + for ( idx = 0; idx < maximumNumberOfPeers; idx++ ) + { + if (remoteSystemIndex!=(unsigned int) -1 && idx==remoteSystemIndex) + continue; + + if ( remoteSystemList[ idx ].isActive && remoteSystemList[ idx ].systemAddress != UNASSIGNED_SYSTEM_ADDRESS ) + sendList[sendListSize++]=idx; + } + } + + if (sendListSize==0) + { + + + + return false; + } + + for (sendListIndex=0; sendListIndex < sendListSize; sendListIndex++) + { + // Send may split the packet and thus deallocate data. Don't assume data is valid if we use the callerAllocationData + bool useData = useCallerDataAllocation && callerDataAllocationUsed==false && sendListIndex+1==sendListSize; + remoteSystemList[sendList[sendListIndex]].reliabilityLayer.Send( data, numberOfBitsToSend, priority, reliability, orderingChannel, useData==false, remoteSystemList[sendList[sendListIndex]].MTUSize, currentTime, receipt ); + if (useData) + callerDataAllocationUsed=true; + + if (reliability==RELIABLE || + reliability==RELIABLE_ORDERED || + reliability==RELIABLE_SEQUENCED || + reliability==RELIABLE_WITH_ACK_RECEIPT || + reliability==RELIABLE_ORDERED_WITH_ACK_RECEIPT +// || +// reliability==RELIABLE_SEQUENCED_WITH_ACK_RECEIPT + ) + remoteSystemList[sendList[sendListIndex]].lastReliableSend=(RakNet::TimeMS)(currentTime/(RakNet::TimeUS)1000); + } + + + + + + // Return value only meaningful if true was passed for useCallerDataAllocation. Means the reliability layer used that data copy, so the caller should not deallocate it + return callerDataAllocationUsed; +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::ResetSendReceipt(void) +{ + sendReceiptSerialMutex.Lock(); + sendReceiptSerial=1; + sendReceiptSerialMutex.Unlock(); +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::OnConnectedPong(RakNet::Time sendPingTime, RakNet::Time sendPongTime, RemoteSystemStruct *remoteSystem) +{ + RakNet::Time ping; +// RakNet::TimeMS lastPing; + RakNet::Time time = RakNet::GetTime(); // Update the time value to be accurate + if (time > sendPingTime) + ping = time - sendPingTime; + else + ping=0; + +// lastPing = remoteSystem->pingAndClockDifferential[ remoteSystem->pingAndClockDifferentialWriteIndex ].pingTime; + + remoteSystem->pingAndClockDifferential[ remoteSystem->pingAndClockDifferentialWriteIndex ].pingTime = ( unsigned short ) ping; + // Thanks to Chris Taylor (cat02e@fsu.edu) for the improved timestamping algorithm + // Divide each integer by 2, rather than the sum by 2, to prevent overflow + remoteSystem->pingAndClockDifferential[ remoteSystem->pingAndClockDifferentialWriteIndex ].clockDifferential = sendPongTime - ( time/2 + sendPingTime/2 ); + + if ( remoteSystem->lowestPing == (unsigned short)-1 || remoteSystem->lowestPing > (int) ping ) + remoteSystem->lowestPing = (unsigned short) ping; + + if ( ++( remoteSystem->pingAndClockDifferentialWriteIndex ) == (RakNet::Time) PING_TIMES_ARRAY_SIZE ) + remoteSystem->pingAndClockDifferentialWriteIndex = 0; +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::ClearBufferedCommands(void) +{ + BufferedCommandStruct *bcs; + + while ((bcs=bufferedCommands.Pop())!=0) + { + if (bcs->data) + rakFree_Ex(bcs->data, _FILE_AND_LINE_ ); + + bufferedCommands.Deallocate(bcs, _FILE_AND_LINE_); + } + bufferedCommands.Clear(_FILE_AND_LINE_); +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::ClearBufferedPackets(void) +{ + RecvFromStruct *bcs; + + while ((bcs=bufferedPackets.Pop())!=0) + { + bufferedPackets.Deallocate(bcs, _FILE_AND_LINE_); + } + bufferedPackets.Clear(_FILE_AND_LINE_); +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::ClearSocketQueryOutput(void) +{ + socketQueryOutput.Clear(_FILE_AND_LINE_); +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::ClearRequestedConnectionList(void) +{ + DataStructures::Queue freeQueue; + requestedConnectionQueueMutex.Lock(); + while (requestedConnectionQueue.Size()) + freeQueue.Push(requestedConnectionQueue.Pop(), _FILE_AND_LINE_ ); + requestedConnectionQueueMutex.Unlock(); + unsigned i; + for (i=0; i < freeQueue.Size(); i++) + { +#if LIBCAT_SECURITY==1 + CAT_AUDIT_PRINTF("AUDIT: In ClearRequestedConnectionList(), Deleting freeQueue index %i client_handshake %x\n", i, freeQueue[i]->client_handshake); + RakNet::OP_DELETE(freeQueue[i]->client_handshake,_FILE_AND_LINE_); +#endif + RakNet::OP_DELETE(freeQueue[i], _FILE_AND_LINE_ ); + } +} +inline void RakPeer::AddPacketToProducer(RakNet::Packet *p) +{ + packetReturnMutex.Lock(); + packetReturnQueue.Push(p,_FILE_AND_LINE_); + packetReturnMutex.Unlock(); +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +union Buff6AndBuff8 +{ + unsigned char buff6[6]; + uint64_t buff8; +}; +uint64_t RakPeerInterface::Get64BitUniqueRandomNumber(void) +{ + // Mac address is a poor solution because you can't have multiple connections from the same system + + + + + + + + + + + + + +#if defined(_WIN32) + uint64_t g=RakNet::GetTimeUS(); + + RakNet::TimeUS lastTime, thisTime; + int j; + // Sleep a small random time, then use the last 4 bits as a source of randomness + for (j=0; j < 8; j++) + { + lastTime = RakNet::GetTimeUS(); + RakSleep(1); + RakSleep(0); + thisTime = RakNet::GetTimeUS(); + RakNet::TimeUS diff = thisTime-lastTime; + unsigned int diff4Bits = (unsigned int) (diff & 15); + diff4Bits <<= 32-4; + diff4Bits >>= j*4; + ((char*)&g)[j] ^= diff4Bits; + } + return g; + +#else + struct timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_usec + tv.tv_sec * 1000000; +#endif +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::GenerateGUID(void) +{ + myGuid.g=Get64BitUniqueRandomNumber(); + +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +// void RakNet::ProcessPortUnreachable( SystemAddress systemAddress, RakPeer *rakPeer ) +// { +// (void) binaryAddress; +// (void) port; +// (void) rakPeer; +// +// } +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +namespace RakNet { +bool ProcessOfflineNetworkPacket( SystemAddress systemAddress, const char *data, const int length, RakPeer *rakPeer, RakNetSmartPtr rakNetSocket, bool *isOfflineMessage, RakNet::TimeUS timeRead ) +{ + (void) timeRead; + RakPeer::RemoteSystemStruct *remoteSystem; + RakNet::Packet *packet; + unsigned i; + + + char str1[64]; + systemAddress.ToString(false, str1); + if (rakPeer->IsBanned( str1 )) + { + for (i=0; i < rakPeer->pluginListNTS.Size(); i++) + rakPeer->pluginListNTS[i]->OnDirectSocketReceive(data, length*8, systemAddress); + + RakNet::BitStream bs; + bs.Write((MessageID)ID_CONNECTION_BANNED); + bs.WriteAlignedBytes((const unsigned char*) OFFLINE_MESSAGE_DATA_ID, sizeof(OFFLINE_MESSAGE_DATA_ID)); + bs.Write(rakPeer->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS)); + + unsigned i; + for (i=0; i < rakPeer->pluginListNTS.Size(); i++) + rakPeer->pluginListNTS[i]->OnDirectSocketSend((char*) bs.GetData(), bs.GetNumberOfBitsUsed(), systemAddress); + SocketLayer::SendTo( rakNetSocket->s, (char*) bs.GetData(), bs.GetNumberOfBytesUsed(), systemAddress, rakNetSocket->remotePortRakNetWasStartedOn_PS3_PSP2, rakNetSocket->extraSocketOptions, _FILE_AND_LINE_ ); + + return true; + } + + + + // The reason for all this is that the reliability layer has no way to tell between offline messages that arrived late for a player that is now connected, + // and a regular encoding. So I insert OFFLINE_MESSAGE_DATA_ID into the stream, the encoding of which is essentially impossible to hit by chance + if (length <=2) + { + *isOfflineMessage=true; + } + else if ( + ((unsigned char)data[0] == ID_UNCONNECTED_PING || + (unsigned char)data[0] == ID_UNCONNECTED_PING_OPEN_CONNECTIONS) && + length == sizeof(unsigned char) + sizeof(RakNet::Time) + sizeof(OFFLINE_MESSAGE_DATA_ID)) + { + *isOfflineMessage=memcmp(data+sizeof(unsigned char) + sizeof(RakNet::Time), OFFLINE_MESSAGE_DATA_ID, sizeof(OFFLINE_MESSAGE_DATA_ID))==0; + } + else if ((unsigned char)data[0] == ID_UNCONNECTED_PONG && (size_t) length >= sizeof(unsigned char) + sizeof(RakNet::TimeMS) + RakNetGUID::size() + sizeof(OFFLINE_MESSAGE_DATA_ID)) + { + *isOfflineMessage=memcmp(data+sizeof(unsigned char) + sizeof(RakNet::Time) + RakNetGUID::size(), OFFLINE_MESSAGE_DATA_ID, sizeof(OFFLINE_MESSAGE_DATA_ID))==0; + } + else if ( + (unsigned char)data[0] == ID_OUT_OF_BAND_INTERNAL && + (size_t) length >= sizeof(MessageID) + RakNetGUID::size() + sizeof(OFFLINE_MESSAGE_DATA_ID)) + { + *isOfflineMessage=memcmp(data+sizeof(MessageID) + RakNetGUID::size(), OFFLINE_MESSAGE_DATA_ID, sizeof(OFFLINE_MESSAGE_DATA_ID))==0; + } + else if ( + ( + (unsigned char)data[0] == ID_OPEN_CONNECTION_REPLY_1 || + (unsigned char)data[0] == ID_OPEN_CONNECTION_REPLY_2 || + (unsigned char)data[0] == ID_OPEN_CONNECTION_REQUEST_1 || + (unsigned char)data[0] == ID_OPEN_CONNECTION_REQUEST_2 || + (unsigned char)data[0] == ID_CONNECTION_ATTEMPT_FAILED || + (unsigned char)data[0] == ID_NO_FREE_INCOMING_CONNECTIONS || + (unsigned char)data[0] == ID_CONNECTION_BANNED || + (unsigned char)data[0] == ID_ALREADY_CONNECTED || + (unsigned char)data[0] == ID_IP_RECENTLY_CONNECTED) && + (size_t) length >= sizeof(MessageID) + RakNetGUID::size() + sizeof(OFFLINE_MESSAGE_DATA_ID)) + { + *isOfflineMessage=memcmp(data+sizeof(MessageID), OFFLINE_MESSAGE_DATA_ID, sizeof(OFFLINE_MESSAGE_DATA_ID))==0; + } + else if (((unsigned char)data[0] == ID_INCOMPATIBLE_PROTOCOL_VERSION&& + (size_t) length == sizeof(MessageID)*2 + RakNetGUID::size() + sizeof(OFFLINE_MESSAGE_DATA_ID))) + { + *isOfflineMessage=memcmp(data+sizeof(MessageID)*2, OFFLINE_MESSAGE_DATA_ID, sizeof(OFFLINE_MESSAGE_DATA_ID))==0; + } + else + { + *isOfflineMessage=false; + } + + if (*isOfflineMessage) + { + for (i=0; i < rakPeer->pluginListNTS.Size(); i++) + rakPeer->pluginListNTS[i]->OnDirectSocketReceive(data, length*8, systemAddress); + + // These are all messages from unconnected systems. Messages here can be any size, but are never processed from connected systems. + if ( ( (unsigned char) data[ 0 ] == ID_UNCONNECTED_PING_OPEN_CONNECTIONS + || (unsigned char)(data)[0] == ID_UNCONNECTED_PING) && length == sizeof(unsigned char)+sizeof(RakNet::Time)+sizeof(OFFLINE_MESSAGE_DATA_ID) ) + { + if ( (unsigned char)(data)[0] == ID_UNCONNECTED_PING || + rakPeer->AllowIncomingConnections() ) // Open connections with players + { +// #if !defined(_XBOX) && !defined(X360) + RakNet::BitStream inBitStream( (unsigned char *) data, length, false ); + inBitStream.IgnoreBits(8); + RakNet::Time sendPingTime; + inBitStream.Read(sendPingTime); + + RakNet::BitStream outBitStream; + outBitStream.Write((MessageID)ID_UNCONNECTED_PONG); // Should be named ID_UNCONNECTED_PONG eventually + outBitStream.Write(sendPingTime); + outBitStream.Write(rakPeer->myGuid); + outBitStream.WriteAlignedBytes((const unsigned char*) OFFLINE_MESSAGE_DATA_ID, sizeof(OFFLINE_MESSAGE_DATA_ID)); + + rakPeer->rakPeerMutexes[ RakPeer::offlinePingResponse_Mutex ].Lock(); + // They are connected, so append offline ping data + outBitStream.Write( (char*)rakPeer->offlinePingResponse.GetData(), rakPeer->offlinePingResponse.GetNumberOfBytesUsed() ); + rakPeer->rakPeerMutexes[ RakPeer::offlinePingResponse_Mutex ].Unlock(); + + unsigned i; + for (i=0; i < rakPeer->pluginListNTS.Size(); i++) + rakPeer->pluginListNTS[i]->OnDirectSocketSend((const char*)outBitStream.GetData(), outBitStream.GetNumberOfBytesUsed(), systemAddress); + + SocketLayer::SendTo( rakNetSocket->s, (const char*)outBitStream.GetData(), (unsigned int) outBitStream.GetNumberOfBytesUsed(), systemAddress, rakNetSocket->remotePortRakNetWasStartedOn_PS3_PSP2, rakNetSocket->extraSocketOptions, _FILE_AND_LINE_ ); + + packet=rakPeer->AllocPacket(sizeof(MessageID), _FILE_AND_LINE_); + packet->data[0]=data[0]; + packet->systemAddress = systemAddress; + packet->guid=UNASSIGNED_RAKNET_GUID; + packet->systemAddress.systemIndex = ( SystemIndex ) rakPeer->GetIndexFromSystemAddress( systemAddress, true ); + packet->guid.systemIndex=packet->systemAddress.systemIndex; + rakPeer->AddPacketToProducer(packet); +// #endif + } + } + // UNCONNECTED MESSAGE Pong with no data. + else if ((unsigned char) data[ 0 ] == ID_UNCONNECTED_PONG && (size_t) length >= sizeof(unsigned char)+sizeof(RakNet::Time)+RakNetGUID::size()+sizeof(OFFLINE_MESSAGE_DATA_ID) && (size_t) length < sizeof(unsigned char)+sizeof(RakNet::Time)+RakNetGUID::size()+sizeof(OFFLINE_MESSAGE_DATA_ID)+MAX_OFFLINE_DATA_LENGTH) + { + packet=rakPeer->AllocPacket((unsigned int) (length-sizeof(OFFLINE_MESSAGE_DATA_ID)-RakNetGUID::size()-sizeof(RakNet::Time)+sizeof(RakNet::TimeMS)), _FILE_AND_LINE_); + RakNet::BitStream bsIn((unsigned char*) data, length, false); + bsIn.IgnoreBytes(sizeof(unsigned char)); + RakNet::Time ping; + bsIn.Read(ping); + bsIn.Read(packet->guid); + + RakNet::BitStream bsOut((unsigned char*) packet->data, packet->length, false); + bsOut.ResetWritePointer(); + bsOut.Write((unsigned char)ID_UNCONNECTED_PONG); + RakNet::TimeMS pingMS=(RakNet::TimeMS)ping; + bsOut.Write(pingMS); + bsOut.WriteAlignedBytes( + (const unsigned char*)data+sizeof(unsigned char)+sizeof(RakNet::Time)+RakNetGUID::size()+sizeof(OFFLINE_MESSAGE_DATA_ID), + length-sizeof(unsigned char)-sizeof(RakNet::Time)-RakNetGUID::size()-sizeof(OFFLINE_MESSAGE_DATA_ID) + ); + + packet->systemAddress = systemAddress; + packet->systemAddress.systemIndex = ( SystemIndex ) rakPeer->GetIndexFromSystemAddress( systemAddress, true ); + packet->guid.systemIndex=packet->systemAddress.systemIndex; + rakPeer->AddPacketToProducer(packet); + } + else if ((unsigned char) data[ 0 ] == ID_OUT_OF_BAND_INTERNAL && + (size_t) length < MAX_OFFLINE_DATA_LENGTH+sizeof(OFFLINE_MESSAGE_DATA_ID)+sizeof(MessageID)+RakNetGUID::size()) + { + unsigned int dataLength = (unsigned int) (length-sizeof(OFFLINE_MESSAGE_DATA_ID)-RakNetGUID::size()-sizeof(MessageID)); + RakAssert(dataLength<1024); + packet=rakPeer->AllocPacket(dataLength+1, _FILE_AND_LINE_); + RakAssert(packet->length<1024); + + RakNet::BitStream bs2((unsigned char*) data, length, false); + bs2.IgnoreBytes(sizeof(MessageID)); + bs2.Read(packet->guid); + + if (data[sizeof(OFFLINE_MESSAGE_DATA_ID)+sizeof(MessageID) + RakNetGUID::size()]==ID_ADVERTISE_SYSTEM) + { + packet->length--; + packet->bitSize=BYTES_TO_BITS(packet->length); + packet->data[0]=ID_ADVERTISE_SYSTEM; + memcpy(packet->data+1, data+sizeof(OFFLINE_MESSAGE_DATA_ID)+sizeof(MessageID)*2 + RakNetGUID::size(), dataLength-1); + } + else + { + packet->data[0]=ID_OUT_OF_BAND_INTERNAL; + memcpy(packet->data+1, data+sizeof(OFFLINE_MESSAGE_DATA_ID)+sizeof(MessageID) + RakNetGUID::size(), dataLength); + } + + packet->systemAddress = systemAddress; + packet->systemAddress.systemIndex = ( SystemIndex ) rakPeer->GetIndexFromSystemAddress( systemAddress, true ); + packet->guid.systemIndex=packet->systemAddress.systemIndex; + rakPeer->AddPacketToProducer(packet); + } + else if ((unsigned char)(data)[0] == (MessageID)ID_OPEN_CONNECTION_REPLY_1) + { + for (i=0; i < rakPeer->pluginListNTS.Size(); i++) + rakPeer->pluginListNTS[i]->OnDirectSocketReceive(data, length*8, systemAddress); + + RakNet::BitStream bsIn((unsigned char*) data,length,false); + bsIn.IgnoreBytes(sizeof(MessageID)); + bsIn.IgnoreBytes(sizeof(OFFLINE_MESSAGE_DATA_ID)); + RakNetGUID serverGuid; + bsIn.Read(serverGuid); + unsigned char serverHasSecurity; + uint32_t cookie; + (void) cookie; + bsIn.Read(serverHasSecurity); + // Even if the server has security, it may not be required of us if we are in the security exception list + if (serverHasSecurity) + { + bsIn.Read(cookie); + } + + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_OPEN_CONNECTION_REQUEST_2); + bsOut.WriteAlignedBytes((const unsigned char*) OFFLINE_MESSAGE_DATA_ID, sizeof(OFFLINE_MESSAGE_DATA_ID)); + if (serverHasSecurity) + bsOut.Write(cookie); + + unsigned i; + rakPeer->requestedConnectionQueueMutex.Lock(); + for (i=0; i < rakPeer->requestedConnectionQueue.Size(); i++) + { + RakPeer::RequestedConnectionStruct *rcs; + rcs=rakPeer->requestedConnectionQueue[i]; + if (rcs->systemAddress==systemAddress) + { + if (serverHasSecurity) + { +#if LIBCAT_SECURITY==1 + unsigned char public_key[cat::EasyHandshake::PUBLIC_KEY_BYTES]; + bsIn.ReadAlignedBytes(public_key, sizeof(public_key)); + + if (rcs->publicKeyMode==PKM_ACCEPT_ANY_PUBLIC_KEY) + { + memcpy(rcs->remote_public_key, public_key, cat::EasyHandshake::PUBLIC_KEY_BYTES); + if (!rcs->client_handshake->Initialize(public_key) || + !rcs->client_handshake->GenerateChallenge(rcs->handshakeChallenge)) + { + CAT_AUDIT_PRINTF("AUDIT: Server passed a bad public key with PKM_ACCEPT_ANY_PUBLIC_KEY"); + return true; + } + } + + if (cat::SecureEqual(public_key, + rcs->remote_public_key, + cat::EasyHandshake::PUBLIC_KEY_BYTES)==false) + { + rakPeer->requestedConnectionQueueMutex.Unlock(); + CAT_AUDIT_PRINTF("AUDIT: Expected public key does not match what was sent by server -- Reporting back ID_PUBLIC_KEY_MISMATCH to user\n"); + + packet=rakPeer->AllocPacket(sizeof( char ), _FILE_AND_LINE_); + packet->data[ 0 ] = ID_PUBLIC_KEY_MISMATCH; // Attempted a connection and couldn't + packet->bitSize = ( sizeof( char ) * 8); + packet->systemAddress = rcs->systemAddress; + packet->guid=serverGuid; + rakPeer->AddPacketToProducer(packet); + return true; + } + + if (rcs->client_handshake==0) + { + // Message does not contain a challenge + // We might still pass if we are in the security exception list + bsOut.Write((unsigned char)0); + } + else + { + // Message contains a challenge + bsOut.Write((unsigned char)1); + // challenge + CAT_AUDIT_PRINTF("AUDIT: Sending challenge\n"); + bsOut.WriteAlignedBytes((const unsigned char*) rcs->handshakeChallenge,cat::EasyHandshake::CHALLENGE_BYTES); + } +#else // LIBCAT_SECURITY + // Message does not contain a challenge + bsOut.Write((unsigned char)0); +#endif // LIBCAT_SECURITY + } + else + { + // Server does not need security +#if LIBCAT_SECURITY==1 + if (rcs->client_handshake!=0) + { + rakPeer->requestedConnectionQueueMutex.Unlock(); + CAT_AUDIT_PRINTF("AUDIT: Security disabled by server but we expected security (indicated by client_handshake not null) so failing!\n"); + + packet=rakPeer->AllocPacket(sizeof( char ), _FILE_AND_LINE_); + packet->data[ 0 ] = ID_OUR_SYSTEM_REQUIRES_SECURITY; // Attempted a connection and couldn't + packet->bitSize = ( sizeof( char ) * 8); + packet->systemAddress = rcs->systemAddress; + packet->guid=serverGuid; + rakPeer->AddPacketToProducer(packet); + return true; + } +#endif // LIBCAT_SECURITY + + } + + uint16_t mtu; + bsIn.Read(mtu); + + // Binding address + bsOut.Write(rcs->systemAddress); + rakPeer->requestedConnectionQueueMutex.Unlock(); + // MTU + bsOut.Write(mtu); + // Our guid + bsOut.Write(rakPeer->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS)); + + for (i=0; i < rakPeer->pluginListNTS.Size(); i++) + rakPeer->pluginListNTS[i]->OnDirectSocketSend((const char*) bsOut.GetData(), bsOut.GetNumberOfBitsUsed(), rcs->systemAddress); + + SocketLayer::SendTo( rakPeer->socketList[rcs->socketIndex]->s, (const char*) bsOut.GetData(), bsOut.GetNumberOfBytesUsed(), rcs->systemAddress, rakPeer->socketList[rcs->socketIndex]->remotePortRakNetWasStartedOn_PS3_PSP2, rakPeer->socketList[rcs->socketIndex]->extraSocketOptions, _FILE_AND_LINE_ ); + + return true; + } + } + rakPeer->requestedConnectionQueueMutex.Unlock(); + } + else if ((unsigned char)(data)[0] == (MessageID)ID_OPEN_CONNECTION_REPLY_2) + { + for (i=0; i < rakPeer->pluginListNTS.Size(); i++) + rakPeer->pluginListNTS[i]->OnDirectSocketReceive(data, length*8, systemAddress); + + RakNet::BitStream bs((unsigned char*) data,length,false); + bs.IgnoreBytes(sizeof(MessageID)); + bs.IgnoreBytes(sizeof(OFFLINE_MESSAGE_DATA_ID)); + RakNetGUID guid; + bs.Read(guid); + SystemAddress bindingAddress; + bool b = bs.Read(bindingAddress); + RakAssert(b); + uint16_t mtu; + b=bs.Read(mtu); + RakAssert(b); + bool doSecurity=false; + b=bs.Read(doSecurity); + RakAssert(b); + +#if LIBCAT_SECURITY==1 + char answer[cat::EasyHandshake::ANSWER_BYTES]; + CAT_AUDIT_PRINTF("AUDIT: Got ID_OPEN_CONNECTION_REPLY_2 and given doSecurity=%i\n", (int)doSecurity); + if (doSecurity) + { + CAT_AUDIT_PRINTF("AUDIT: Reading cookie and public key\n"); + bs.ReadAlignedBytes((unsigned char*) answer, sizeof(answer)); + } + cat::ClientEasyHandshake *client_handshake=0; +#endif // LIBCAT_SECURITY + + RakPeer::RequestedConnectionStruct *rcs; + bool unlock=true; + unsigned i; + rakPeer->requestedConnectionQueueMutex.Lock(); + for (i=0; i < rakPeer->requestedConnectionQueue.Size(); i++) + { + rcs=rakPeer->requestedConnectionQueue[i]; + + + if (rcs->systemAddress==systemAddress) + { +#if LIBCAT_SECURITY==1 + CAT_AUDIT_PRINTF("AUDIT: System address matches an entry in the requestedConnectionQueue and doSecurity=%i\n", (int)doSecurity); + if (doSecurity) + { + if (rcs->client_handshake==0) + { + CAT_AUDIT_PRINTF("AUDIT: Server wants security but we didn't set a public key -- Reporting back ID_REMOTE_SYSTEM_REQUIRES_PUBLIC_KEY to user\n"); + rakPeer->requestedConnectionQueueMutex.Unlock(); + + packet=rakPeer->AllocPacket(2, _FILE_AND_LINE_); + packet->data[ 0 ] = ID_REMOTE_SYSTEM_REQUIRES_PUBLIC_KEY; // Attempted a connection and couldn't + packet->data[ 1 ] = 0; // Indicate server public key is missing + packet->bitSize = ( sizeof( char ) * 8); + packet->systemAddress = rcs->systemAddress; + packet->guid=guid; + rakPeer->AddPacketToProducer(packet); + return true; + } + + CAT_AUDIT_PRINTF("AUDIT: Looks good, preparing to send challenge to server! client_handshake = %x\n", client_handshake); + } + +#endif // LIBCAT_SECURITY + + rakPeer->requestedConnectionQueueMutex.Unlock(); + unlock=false; + + RakAssert(rcs->actionToTake==RakPeer::RequestedConnectionStruct::CONNECT); + // You might get this when already connected because of cross-connections + bool thisIPConnectedRecently=false; + remoteSystem=rakPeer->GetRemoteSystemFromSystemAddress( systemAddress, true, true ); + if (remoteSystem==0) + { + if (rcs->socket.IsNull()) + { + remoteSystem=rakPeer->AssignSystemAddressToRemoteSystemList(systemAddress, RakPeer::RemoteSystemStruct::UNVERIFIED_SENDER, rakNetSocket, &thisIPConnectedRecently, bindingAddress, mtu, guid, doSecurity); + } + else + { + remoteSystem=rakPeer->AssignSystemAddressToRemoteSystemList(systemAddress, RakPeer::RemoteSystemStruct::UNVERIFIED_SENDER, rcs->socket, &thisIPConnectedRecently, bindingAddress, mtu, guid, doSecurity); + } + } + + // 4/13/09 Attackers can flood ID_OPEN_CONNECTION_REQUEST and use up all available connection slots + // Ignore connection attempts if this IP address connected within the last 100 milliseconds + if (thisIPConnectedRecently==false) + { + // Don't check GetRemoteSystemFromGUID, server will verify + if (remoteSystem) + { + // Move pointer from RequestedConnectionStruct to RemoteSystemStruct +#if LIBCAT_SECURITY==1 + cat::u8 ident[cat::EasyHandshake::IDENTITY_BYTES]; + bool doIdentity = false; + + if (rcs->client_handshake) + { + CAT_AUDIT_PRINTF("AUDIT: Processing answer\n"); + if (rcs->publicKeyMode == PKM_USE_TWO_WAY_AUTHENTICATION) + { + if (!rcs->client_handshake->ProcessAnswerWithIdentity(answer, ident, remoteSystem->reliabilityLayer.GetAuthenticatedEncryption())) + { + CAT_AUDIT_PRINTF("AUDIT: Processing answer -- Invalid Answer\n"); + rakPeer->requestedConnectionQueueMutex.Unlock(); + + return true; + } + + doIdentity = true; + } + else + { + if (!rcs->client_handshake->ProcessAnswer(answer, remoteSystem->reliabilityLayer.GetAuthenticatedEncryption())) + { + CAT_AUDIT_PRINTF("AUDIT: Processing answer -- Invalid Answer\n"); + rakPeer->requestedConnectionQueueMutex.Unlock(); + + return true; + } + } + CAT_AUDIT_PRINTF("AUDIT: Success!\n"); + + RakNet::OP_DELETE(rcs->client_handshake,_FILE_AND_LINE_); + rcs->client_handshake=0; + } +#endif // LIBCAT_SECURITY + + remoteSystem->weInitiatedTheConnection=true; + remoteSystem->connectMode=RakPeer::RemoteSystemStruct::REQUESTED_CONNECTION; + if (rcs->timeoutTime!=0) + remoteSystem->reliabilityLayer.SetTimeoutTime(rcs->timeoutTime); + + RakNet::BitStream temp; + temp.Write( (MessageID)ID_CONNECTION_REQUEST); + temp.Write(rakPeer->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS)); + temp.Write(RakNet::GetTime()); + +#if LIBCAT_SECURITY==1 + temp.Write((unsigned char)(doSecurity ? 1 : 0)); + + if (doSecurity) + { + unsigned char proof[32]; + remoteSystem->reliabilityLayer.GetAuthenticatedEncryption()->GenerateProof(proof, sizeof(proof)); + temp.WriteAlignedBytes(proof, sizeof(proof)); + + temp.Write((unsigned char)(doIdentity ? 1 : 0)); + + if (doIdentity) + { + temp.WriteAlignedBytes(ident, sizeof(ident)); + } + } +#else + temp.Write((unsigned char)0); +#endif // LIBCAT_SECURITY + + if ( rcs->outgoingPasswordLength > 0 ) + temp.Write( ( char* ) rcs->outgoingPassword, rcs->outgoingPasswordLength ); + + rakPeer->SendImmediate((char*)temp.GetData(), temp.GetNumberOfBitsUsed(), IMMEDIATE_PRIORITY, RELIABLE, 0, systemAddress, false, false, timeRead, 0 ); + } + else + { + // Failed, no connections available anymore + packet=rakPeer->AllocPacket(sizeof( char ), _FILE_AND_LINE_); + packet->data[ 0 ] = ID_CONNECTION_ATTEMPT_FAILED; // Attempted a connection and couldn't + packet->bitSize = ( sizeof( char ) * 8); + packet->systemAddress = rcs->systemAddress; + packet->guid=guid; + rakPeer->AddPacketToProducer(packet); + } + } + + rakPeer->requestedConnectionQueueMutex.Lock(); + for (unsigned int k=0; k < rakPeer->requestedConnectionQueue.Size(); k++) + { + if (rakPeer->requestedConnectionQueue[k]->systemAddress==systemAddress) + { + rakPeer->requestedConnectionQueue.RemoveAtIndex(k); + break; + } + } + rakPeer->requestedConnectionQueueMutex.Unlock(); + +#if LIBCAT_SECURITY==1 + CAT_AUDIT_PRINTF("AUDIT: Deleting client_handshake object %x and rcs->client_handshake object %x\n", client_handshake, rcs->client_handshake); + RakNet::OP_DELETE(client_handshake,_FILE_AND_LINE_); + RakNet::OP_DELETE(rcs->client_handshake,_FILE_AND_LINE_); +#endif // LIBCAT_SECURITY + RakNet::OP_DELETE(rcs,_FILE_AND_LINE_); + + break; + } + } + + if (unlock) + rakPeer->requestedConnectionQueueMutex.Unlock(); + + return true; + + } + else if ((unsigned char)(data)[0] == (MessageID)ID_CONNECTION_ATTEMPT_FAILED || + (unsigned char)(data)[0] == (MessageID)ID_NO_FREE_INCOMING_CONNECTIONS || + (unsigned char)(data)[0] == (MessageID)ID_CONNECTION_BANNED || + (unsigned char)(data)[0] == (MessageID)ID_ALREADY_CONNECTED || + (unsigned char)(data)[0] == (MessageID)ID_INVALID_PASSWORD || + (unsigned char)(data)[0] == (MessageID)ID_IP_RECENTLY_CONNECTED || + (unsigned char)(data)[0] == (MessageID)ID_INCOMPATIBLE_PROTOCOL_VERSION) + { + + RakNet::BitStream bs((unsigned char*) data,length,false); + bs.IgnoreBytes(sizeof(MessageID)); + bs.IgnoreBytes(sizeof(OFFLINE_MESSAGE_DATA_ID)); + if ((unsigned char)(data)[0] == (MessageID)ID_INCOMPATIBLE_PROTOCOL_VERSION) + bs.IgnoreBytes(sizeof(unsigned char)); + + RakNetGUID guid; + bs.Read(guid); + + RakPeer::RequestedConnectionStruct *rcs; + bool connectionAttemptCancelled=false; + unsigned i; + rakPeer->requestedConnectionQueueMutex.Lock(); + for (i=0; i < rakPeer->requestedConnectionQueue.Size(); i++) + { + rcs=rakPeer->requestedConnectionQueue[i]; + if (rcs->actionToTake==RakPeer::RequestedConnectionStruct::CONNECT && rcs->systemAddress==systemAddress) + { + connectionAttemptCancelled=true; + rakPeer->requestedConnectionQueue.RemoveAtIndex(i); + +#if LIBCAT_SECURITY==1 + CAT_AUDIT_PRINTF("AUDIT: Connection attempt canceled so deleting rcs->client_handshake object %x\n", rcs->client_handshake); + RakNet::OP_DELETE(rcs->client_handshake,_FILE_AND_LINE_); +#endif // LIBCAT_SECURITY + RakNet::OP_DELETE(rcs,_FILE_AND_LINE_); + break; + } + } + + rakPeer->requestedConnectionQueueMutex.Unlock(); + + if (connectionAttemptCancelled) + { + // Tell user of connection attempt failed + packet=rakPeer->AllocPacket(sizeof( char ), _FILE_AND_LINE_); + packet->data[ 0 ] = data[0]; // Attempted a connection and couldn't + packet->bitSize = ( sizeof( char ) * 8); + packet->systemAddress = systemAddress; + packet->guid=guid; + rakPeer->AddPacketToProducer(packet); + } + } + else if ((unsigned char)(data)[0] == ID_OPEN_CONNECTION_REQUEST_1 && length > (int) (1+sizeof(OFFLINE_MESSAGE_DATA_ID))) + {/* + static int x = 0; + ++x; + + SystemAddress *addr = (SystemAddress*)&systemAddress; + addr->binaryAddress += x;*/ + + unsigned int i; + //RAKNET_DEBUG_PRINTF("%i:IOCR, ", __LINE__); + char remoteProtocol=data[1+sizeof(OFFLINE_MESSAGE_DATA_ID)]; + if (remoteProtocol!=RAKNET_PROTOCOL_VERSION) + { + RakNet::BitStream bs; + bs.Write((MessageID)ID_INCOMPATIBLE_PROTOCOL_VERSION); + bs.Write((unsigned char)RAKNET_PROTOCOL_VERSION); + bs.WriteAlignedBytes((const unsigned char*) OFFLINE_MESSAGE_DATA_ID, sizeof(OFFLINE_MESSAGE_DATA_ID)); + bs.Write(rakPeer->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS)); + + for (i=0; i < rakPeer->pluginListNTS.Size(); i++) + rakPeer->pluginListNTS[i]->OnDirectSocketSend((char*)bs.GetData(), bs.GetNumberOfBitsUsed(), systemAddress); + + SocketLayer::SendTo( rakNetSocket->s, (char*)bs.GetData(), bs.GetNumberOfBytesUsed(), systemAddress, rakNetSocket->remotePortRakNetWasStartedOn_PS3_PSP2, rakNetSocket->extraSocketOptions, _FILE_AND_LINE_ ); + return true; + } + + for (i=0; i < rakPeer->pluginListNTS.Size(); i++) + rakPeer->pluginListNTS[i]->OnDirectSocketReceive(data, length*8, systemAddress); + + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_OPEN_CONNECTION_REPLY_1); + bsOut.WriteAlignedBytes((const unsigned char*) OFFLINE_MESSAGE_DATA_ID, sizeof(OFFLINE_MESSAGE_DATA_ID)); + bsOut.Write(rakPeer->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS)); +#if LIBCAT_SECURITY==1 + if (rakPeer->_using_security) + { + bsOut.Write((unsigned char) 1); // HasCookie Yes + // Write cookie + uint32_t cookie = rakPeer->_cookie_jar->Generate(&systemAddress.address,sizeof(systemAddress.address)); + CAT_AUDIT_PRINTF("AUDIT: Writing cookie %i to %i:%i\n", cookie, systemAddress); + bsOut.Write(cookie); + // Write my public key + bsOut.WriteAlignedBytes((const unsigned char *) rakPeer->my_public_key,sizeof(rakPeer->my_public_key)); + } + else +#endif // LIBCAT_SECURITY + bsOut.Write((unsigned char) 0); // HasCookie No + + // MTU + bsOut.Write((uint16_t) (length+UDP_HEADER_SIZE)); + + for (i=0; i < rakPeer->pluginListNTS.Size(); i++) + rakPeer->pluginListNTS[i]->OnDirectSocketSend((const char*) bsOut.GetData(), bsOut.GetNumberOfBitsUsed(), systemAddress); + SocketLayer::SendTo( rakNetSocket->s, (const char*) bsOut.GetData(), bsOut.GetNumberOfBytesUsed(), systemAddress, rakNetSocket->remotePortRakNetWasStartedOn_PS3_PSP2, rakNetSocket->extraSocketOptions, _FILE_AND_LINE_ ); + } + else if ((unsigned char)(data)[0] == ID_OPEN_CONNECTION_REQUEST_2) + { + SystemAddress bindingAddress; + RakNetGUID guid; + RakNet::BitStream bsOut; + RakNet::BitStream bs((unsigned char*) data, length, false); + bs.IgnoreBytes(sizeof(MessageID)); + bs.IgnoreBytes(sizeof(OFFLINE_MESSAGE_DATA_ID)); + + bool requiresSecurityOfThisClient=false; +#if LIBCAT_SECURITY==1 + char remoteHandshakeChallenge[cat::EasyHandshake::CHALLENGE_BYTES]; + + if (rakPeer->_using_security) + { + char str1[64]; + systemAddress.ToString(false, str1); + requiresSecurityOfThisClient=rakPeer->IsInSecurityExceptionList(str1)==false; + + uint32_t cookie; + bs.Read(cookie); + CAT_AUDIT_PRINTF("AUDIT: Got cookie %i from %i:%i\n", cookie, systemAddress); + if (rakPeer->_cookie_jar->Verify(&systemAddress.address,sizeof(systemAddress.address), cookie)==false) + { + return true; + } + CAT_AUDIT_PRINTF("AUDIT: Cookie good!\n"); + + unsigned char clientWroteChallenge; + bs.Read(clientWroteChallenge); + + if (requiresSecurityOfThisClient==true && clientWroteChallenge==0) + { + // Fail, client doesn't support security, and it is required + return true; + } + + if (clientWroteChallenge) + { + bs.ReadAlignedBytes((unsigned char*) remoteHandshakeChallenge, cat::EasyHandshake::CHALLENGE_BYTES); +#ifdef CAT_AUDIT + printf("AUDIT: RECV CHALLENGE "); + for (int ii = 0; ii < sizeof(remoteHandshakeChallenge); ++ii) + { + printf("%02x", (cat::u8)remoteHandshakeChallenge[ii]); + } + printf("\n"); +#endif + } + } +#endif // LIBCAT_SECURITY + + bs.Read(bindingAddress); + uint16_t mtu; + bs.Read(mtu); + bs.Read(guid); + + RakPeer::RemoteSystemStruct *rssFromSA = rakPeer->GetRemoteSystemFromSystemAddress( systemAddress, true, true ); + bool IPAddrInUse = rssFromSA != 0 && rssFromSA->isActive; + RakPeer::RemoteSystemStruct *rssFromGuid = rakPeer->GetRemoteSystemFromGUID(guid, true); + bool GUIDInUse = rssFromGuid != 0 && rssFromGuid->isActive; + + // IPAddrInUse, GuidInUse, outcome + // TRUE, , TRUE , ID_OPEN_CONNECTION_REPLY if they are the same, else ID_ALREADY_CONNECTED + // FALSE, , TRUE , ID_ALREADY_CONNECTED (someone else took this guid) + // TRUE, , FALSE , ID_ALREADY_CONNECTED (silently disconnected, restarted rakNet) + // FALSE , FALSE , Allow connection + + int outcome; + if (IPAddrInUse & GUIDInUse) + { + if (rssFromSA==rssFromGuid && rssFromSA->connectMode==RakPeer::RemoteSystemStruct::UNVERIFIED_SENDER) + { + // ID_OPEN_CONNECTION_REPLY if they are the same + outcome=1; + } + else + { + // ID_ALREADY_CONNECTED (restarted raknet, connected again from same ip, plus someone else took this guid) + outcome=2; + } + } + else if (IPAddrInUse==false && GUIDInUse==true) + { + // ID_ALREADY_CONNECTED (someone else took this guid) + outcome=3; + } + else if (IPAddrInUse==true && GUIDInUse==false) + { + // ID_ALREADY_CONNECTED (silently disconnected, restarted rakNet) + outcome=4; + } + else + { + // Allow connection + outcome=0; + } + + RakNet::BitStream bsAnswer; + bsAnswer.Write((MessageID)ID_OPEN_CONNECTION_REPLY_2); + bsAnswer.WriteAlignedBytes((const unsigned char*) OFFLINE_MESSAGE_DATA_ID, sizeof(OFFLINE_MESSAGE_DATA_ID)); + bsAnswer.Write(rakPeer->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS)); + bsAnswer.Write(systemAddress); + bsAnswer.Write(mtu); + bsAnswer.Write(requiresSecurityOfThisClient); + + if (outcome==1) + { + // Duplicate connection request packet from packetloss + // Send back the same answer +#if LIBCAT_SECURITY==1 + if (requiresSecurityOfThisClient) + { + CAT_AUDIT_PRINTF("AUDIT: Resending public key and answer from packetloss. Sending ID_OPEN_CONNECTION_REPLY_2\n"); + bsAnswer.WriteAlignedBytes((const unsigned char *) rssFromSA->answer,sizeof(rssFromSA->answer)); + } +#endif // LIBCAT_SECURITY + + unsigned int i; + for (i=0; i < rakPeer->pluginListNTS.Size(); i++) + rakPeer->pluginListNTS[i]->OnDirectSocketSend((const char*) bsAnswer.GetData(), bsAnswer.GetNumberOfBitsUsed(), systemAddress); + SocketLayer::SendTo( rakNetSocket->s, (const char*) bsAnswer.GetData(), bsAnswer.GetNumberOfBytesUsed(), systemAddress, rakNetSocket->remotePortRakNetWasStartedOn_PS3_PSP2, rakNetSocket->extraSocketOptions, _FILE_AND_LINE_ ); + + return true; + } + else if (outcome!=0) + { + bsOut.Write((MessageID)ID_ALREADY_CONNECTED); + bsOut.WriteAlignedBytes((const unsigned char*) OFFLINE_MESSAGE_DATA_ID, sizeof(OFFLINE_MESSAGE_DATA_ID)); + bsOut.Write(guid); + for (i=0; i < rakPeer->pluginListNTS.Size(); i++) + rakPeer->pluginListNTS[i]->OnDirectSocketSend((const char*) bsOut.GetData(), bsOut.GetNumberOfBitsUsed(), systemAddress); + SocketLayer::SendTo( rakNetSocket->s, (const char*) bsOut.GetData(), bsOut.GetNumberOfBytesUsed(), systemAddress, rakNetSocket->remotePortRakNetWasStartedOn_PS3_PSP2, rakNetSocket->extraSocketOptions, _FILE_AND_LINE_ ); + + return true; + } + + if (rakPeer->AllowIncomingConnections()==false) + { + bsOut.Write((MessageID)ID_NO_FREE_INCOMING_CONNECTIONS); + bsOut.WriteAlignedBytes((const unsigned char*) OFFLINE_MESSAGE_DATA_ID, sizeof(OFFLINE_MESSAGE_DATA_ID)); + bsOut.Write(guid); + for (i=0; i < rakPeer->pluginListNTS.Size(); i++) + rakPeer->pluginListNTS[i]->OnDirectSocketSend((const char*) bsOut.GetData(), bsOut.GetNumberOfBitsUsed(), systemAddress); + SocketLayer::SendTo( rakNetSocket->s, (const char*) bsOut.GetData(), bsOut.GetNumberOfBytesUsed(), systemAddress, rakNetSocket->remotePortRakNetWasStartedOn_PS3_PSP2, rakNetSocket->extraSocketOptions, _FILE_AND_LINE_ ); + + return true; + } + + bool thisIPConnectedRecently=false; + rssFromSA = rakPeer->AssignSystemAddressToRemoteSystemList(systemAddress, RakPeer::RemoteSystemStruct::UNVERIFIED_SENDER, rakNetSocket, &thisIPConnectedRecently, bindingAddress, mtu, guid, requiresSecurityOfThisClient); + + if (thisIPConnectedRecently==true) + { + bsOut.Write((MessageID)ID_IP_RECENTLY_CONNECTED); + bsOut.WriteAlignedBytes((const unsigned char*) OFFLINE_MESSAGE_DATA_ID, sizeof(OFFLINE_MESSAGE_DATA_ID)); + bsOut.Write(guid); + for (i=0; i < rakPeer->pluginListNTS.Size(); i++) + rakPeer->pluginListNTS[i]->OnDirectSocketSend((const char*) bsOut.GetData(), bsOut.GetNumberOfBitsUsed(), systemAddress); + SocketLayer::SendTo( rakNetSocket->s, (const char*) bsOut.GetData(), bsOut.GetNumberOfBytesUsed(), systemAddress, rakNetSocket->remotePortRakNetWasStartedOn_PS3_PSP2, rakNetSocket->extraSocketOptions, _FILE_AND_LINE_ ); + + return true; + } + +#if LIBCAT_SECURITY==1 + if (requiresSecurityOfThisClient) + { + CAT_AUDIT_PRINTF("AUDIT: Writing public key. Sending ID_OPEN_CONNECTION_REPLY_2\n"); + if (rakPeer->_server_handshake->ProcessChallenge(remoteHandshakeChallenge, rssFromSA->answer, rssFromSA->reliabilityLayer.GetAuthenticatedEncryption() )) + { + CAT_AUDIT_PRINTF("AUDIT: Challenge good!\n"); + // Keep going to OK block + } + else + { + CAT_AUDIT_PRINTF("AUDIT: Challenge BAD!\n"); + + // Unassign this remote system + rakPeer->DereferenceRemoteSystem(systemAddress); + return true; + } + + bsAnswer.WriteAlignedBytes((const unsigned char *) rssFromSA->answer,sizeof(rssFromSA->answer)); + } +#endif // LIBCAT_SECURITY + + unsigned int i; + for (i=0; i < rakPeer->pluginListNTS.Size(); i++) + rakPeer->pluginListNTS[i]->OnDirectSocketSend((const char*) bsAnswer.GetData(), bsAnswer.GetNumberOfBitsUsed(), systemAddress); + SocketLayer::SendTo( rakNetSocket->s, (const char*) bsAnswer.GetData(), bsAnswer.GetNumberOfBytesUsed(), systemAddress, rakNetSocket->remotePortRakNetWasStartedOn_PS3_PSP2, rakNetSocket->extraSocketOptions, _FILE_AND_LINE_ ); + } + return true; + } + + return false; +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void ProcessNetworkPacket( SystemAddress systemAddress, const char *data, const int length, RakPeer *rakPeer, RakNet::TimeUS timeRead, BitStream &updateBitStream ) +{ + ProcessNetworkPacket(systemAddress,data,length,rakPeer,rakPeer->socketList[0],timeRead, updateBitStream); +} +void ProcessNetworkPacket( SystemAddress systemAddress, const char *data, const int length, RakPeer *rakPeer, RakNetSmartPtr rakNetSocket, RakNet::TimeUS timeRead, BitStream &updateBitStream ) +{ +#if LIBCAT_SECURITY==1 +#ifdef CAT_AUDIT + printf("AUDIT: RECV "); + for (int ii = 0; ii < length; ++ii) + { + printf("%02x", (cat::u8)data[ii]); + } + printf("\n"); +#endif +#endif // LIBCAT_SECURITY + + RakAssert(systemAddress.GetPort()); + bool isOfflineMessage; + if (ProcessOfflineNetworkPacket(systemAddress, data, length, rakPeer, rakNetSocket, &isOfflineMessage, timeRead)) + { + return; + } + +// RakNet::Packet *packet; + RakPeer::RemoteSystemStruct *remoteSystem; + + // See if this datagram came from a connected system + remoteSystem = rakPeer->GetRemoteSystemFromSystemAddress( systemAddress, true, true ); + if ( remoteSystem ) + { + // Handle regular incoming data + // HandleSocketReceiveFromConnectedPlayer is only safe to be called from the same thread as Update, which is this thread + if ( isOfflineMessage==false) + { + remoteSystem->reliabilityLayer.HandleSocketReceiveFromConnectedPlayer( + data, length, systemAddress, rakPeer->pluginListNTS, remoteSystem->MTUSize, + rakNetSocket->s, &rnr, rakNetSocket->remotePortRakNetWasStartedOn_PS3_PSP2, rakNetSocket->extraSocketOptions, timeRead, updateBitStream); + } + } +} + +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +unsigned int RakPeer::GenerateSeedFromGuid(void) +{ + /* + // Construct a random seed based on the initial guid value, and the last digits of the difference to each subsequent number + // This assumes that only the last 3 bits of each guidId integer has a meaningful amount of randomness between it and the prior number + unsigned int t = guid.g[0]; + unsigned int i; + for (i=1; i < sizeof(guid.g) / sizeof(guid.g[0]); i++) + { + unsigned int diff = guid.g[i]-guid.g[i-1]; + unsigned int diff3Bits = diff & 0x0007; + diff3Bits <<= 29; + diff3Bits >>= (i-1)*3; + t ^= diff3Bits; + } + + return t; + */ + return (unsigned int) ((myGuid.g >> 32) ^ myGuid.g); +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void RakPeer::DerefAllSockets(void) +{ + unsigned int i; + for (i=0; i < socketList.Size(); i++) + { + socketList[i].SetNull(); + } + socketList.Clear(false, _FILE_AND_LINE_); +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +unsigned int RakPeer::GetRakNetSocketFromUserConnectionSocketIndex(unsigned int userIndex) const +{ + unsigned int i; + for (i=0; i < socketList.Size(); i++) + { + if (socketList[i]->userConnectionSocketIndex==userIndex) + return i; + } + RakAssert("GetRakNetSocketFromUserConnectionSocketIndex failed" && 0); + return (unsigned int) -1; +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +bool RakPeer::RunUpdateCycle( RakNet::TimeUS timeNS, RakNet::Time timeMS, BitStream &updateBitStream ) +{ + RakPeer::RemoteSystemStruct * remoteSystem; + unsigned int activeSystemListIndex; + Packet *packet; + // int currentSentBytes,currentReceivedBytes; +// unsigned numberOfBytesUsed; +// BitSize_t numberOfBitsUsed; + //SystemAddress authoritativeClientSystemAddress; + BitSize_t bitSize; + unsigned int byteSize; + unsigned char *data; + SystemAddress systemAddress; + BufferedCommandStruct *bcs; + bool callerDataAllocationUsed; + RakNetStatistics *rnss; + + // This is here so RecvFromBlocking actually gets data from the same thread + if (SocketLayer::GetSocketLayerOverride()) + { + int len; + SystemAddress sender; + char dataOut[ MAXIMUM_MTU_SIZE ]; + do { + len = SocketLayer::GetSocketLayerOverride()->RakNetRecvFrom(socketList[0]->s,this,dataOut,&sender,true); + if (len>0) + ProcessNetworkPacket( sender, dataOut, len, this, socketList[0], RakNet::GetTimeUS(), updateBitStream ); + } while (len>0); + } + + unsigned int socketListIndex; + RakPeer::RecvFromStruct *recvFromStruct; + while ((recvFromStruct=bufferedPackets.PopInaccurate())!=0) + { + for (socketListIndex=0; socketListIndex < socketList.Size(); socketListIndex++) + { + if ((SOCKET) socketList[socketListIndex]->s==recvFromStruct->s) + break; + } + if (socketListIndex!=socketList.Size()) + ProcessNetworkPacket(recvFromStruct->systemAddress, recvFromStruct->data, recvFromStruct->bytesRead, this, socketList[socketListIndex], recvFromStruct->timeRead, updateBitStream); + bufferedPackets.Deallocate(recvFromStruct, _FILE_AND_LINE_); + } + + while ((bcs=bufferedCommands.PopInaccurate())!=0) + { + if (bcs->command==BufferedCommandStruct::BCS_SEND) + { + // GetTime is a very slow call so do it once and as late as possible + if (timeNS==0) + { + timeNS = RakNet::GetTimeUS(); + timeMS = (RakNet::TimeMS)(timeNS/(RakNet::TimeUS)1000); + } + + callerDataAllocationUsed=SendImmediate((char*)bcs->data, bcs->numberOfBitsToSend, bcs->priority, bcs->reliability, bcs->orderingChannel, bcs->systemIdentifier, bcs->broadcast, true, timeNS, bcs->receipt); + if ( callerDataAllocationUsed==false ) + rakFree_Ex(bcs->data, _FILE_AND_LINE_ ); + + // Set the new connection state AFTER we call sendImmediate in case we are setting it to a disconnection state, which does not allow further sends + if (bcs->connectionMode!=RemoteSystemStruct::NO_ACTION ) + { + remoteSystem=GetRemoteSystem( bcs->systemIdentifier, true, true ); + if (remoteSystem) + remoteSystem->connectMode=bcs->connectionMode; + } + } + else if (bcs->command==BufferedCommandStruct::BCS_CLOSE_CONNECTION) + { + CloseConnectionInternal(bcs->systemIdentifier, false, true, bcs->orderingChannel, bcs->priority); + } + else if (bcs->command==BufferedCommandStruct::BCS_CHANGE_SYSTEM_ADDRESS) + { + // Reroute + RakPeer::RemoteSystemStruct *rssFromGuid = GetRemoteSystem(bcs->systemIdentifier.rakNetGuid,true,true); + if (rssFromGuid!=0) + { + unsigned int existingSystemIndex = GetRemoteSystemIndex(rssFromGuid->systemAddress); + ReferenceRemoteSystem(bcs->systemIdentifier.systemAddress, existingSystemIndex); + } + } + else if (bcs->command==BufferedCommandStruct::BCS_GET_SOCKET) + { + SocketQueryOutput *sqo; + if (bcs->systemIdentifier.IsUndefined()) + { + sqo = socketQueryOutput.Allocate( _FILE_AND_LINE_ ); + sqo->sockets=socketList; + socketQueryOutput.Push(sqo); + } + else + { + remoteSystem=GetRemoteSystem( bcs->systemIdentifier, true, true ); + sqo = socketQueryOutput.Allocate( _FILE_AND_LINE_ ); + + sqo->sockets.Clear(false, _FILE_AND_LINE_); + if (remoteSystem) + { + sqo->sockets.Push(remoteSystem->rakNetSocket, _FILE_AND_LINE_ ); + } + else + { + // Leave empty smart pointer + } + socketQueryOutput.Push(sqo); + } + + } + +#ifdef _DEBUG + bcs->data=0; +#endif + + bufferedCommands.Deallocate(bcs, _FILE_AND_LINE_); + } + + if (requestedConnectionQueue.IsEmpty()==false) + { + if (timeNS==0) + { + timeNS = RakNet::GetTimeUS(); + timeMS = (RakNet::TimeMS)(timeNS/(RakNet::TimeUS)1000); + } + + bool condition1, condition2; + unsigned requestedConnectionQueueIndex=0; + requestedConnectionQueueMutex.Lock(); + while (requestedConnectionQueueIndex < requestedConnectionQueue.Size()) + { + RequestedConnectionStruct *rcs; + rcs = requestedConnectionQueue[requestedConnectionQueueIndex]; + requestedConnectionQueueMutex.Unlock(); + if (rcs->nextRequestTime < timeMS) + { + condition1=rcs->requestsMade==rcs->sendConnectionAttemptCount+1; + condition2=(bool)((rcs->systemAddress==UNASSIGNED_SYSTEM_ADDRESS)==1); + // If too many requests made or a hole then remove this if possible, otherwise invalidate it + if (condition1 || condition2) + { + if (rcs->data) + { + rakFree_Ex(rcs->data, _FILE_AND_LINE_ ); + rcs->data=0; + } + + if (condition1 && !condition2 && rcs->actionToTake==RequestedConnectionStruct::CONNECT) + { + // Tell user of connection attempt failed + packet=AllocPacket(sizeof( char ), _FILE_AND_LINE_); + packet->data[ 0 ] = ID_CONNECTION_ATTEMPT_FAILED; // Attempted a connection and couldn't + packet->bitSize = ( sizeof( char ) * 8); + packet->systemAddress = rcs->systemAddress; + AddPacketToProducer(packet); + } + +#if LIBCAT_SECURITY==1 + CAT_AUDIT_PRINTF("AUDIT: Connection attempt FAILED so deleting rcs->client_handshake object %x\n", rcs->client_handshake); + RakNet::OP_DELETE(rcs->client_handshake,_FILE_AND_LINE_); +#endif + RakNet::OP_DELETE(rcs,_FILE_AND_LINE_); + + requestedConnectionQueueMutex.Lock(); + for (unsigned int k=0; k < requestedConnectionQueue.Size(); k++) + { + if (requestedConnectionQueue[k]==rcs) + { + requestedConnectionQueue.RemoveAtIndex(k); + break; + } + } + requestedConnectionQueueMutex.Unlock(); + } + else + { + + int MTUSizeIndex = rcs->requestsMade / (rcs->sendConnectionAttemptCount/NUM_MTU_SIZES); + if (MTUSizeIndex>=NUM_MTU_SIZES) + MTUSizeIndex=NUM_MTU_SIZES-1; + rcs->requestsMade++; + rcs->nextRequestTime=timeMS+rcs->timeBetweenSendConnectionAttemptsMS; + + RakNet::BitStream bitStream; + //WriteOutOfBandHeader(&bitStream, ID_USER_PACKET_ENUM); + bitStream.Write((MessageID)ID_OPEN_CONNECTION_REQUEST_1); + bitStream.WriteAlignedBytes((const unsigned char*) OFFLINE_MESSAGE_DATA_ID, sizeof(OFFLINE_MESSAGE_DATA_ID)); + bitStream.Write((MessageID)RAKNET_PROTOCOL_VERSION); + bitStream.PadWithZeroToByteLength(mtuSizes[MTUSizeIndex]-UDP_HEADER_SIZE); + + char str[256]; + rcs->systemAddress.ToString(true,str); + + //RAKNET_DEBUG_PRINTF("%i:IOCR, ", __LINE__); + + unsigned i; + for (i=0; i < pluginListNTS.Size(); i++) + pluginListNTS[i]->OnDirectSocketSend((const char*) bitStream.GetData(), bitStream.GetNumberOfBitsUsed(), rcs->systemAddress); + + if (rcs->socket.IsNull()) + { + rcs->systemAddress.FixForIPVersion(socketList[rcs->socketIndex]->boundAddress); + SocketLayer::SetDoNotFragment(socketList[rcs->socketIndex]->s, 1, socketList[rcs->socketIndex]->boundAddress.GetIPPROTO()); + RakNet::Time sendToStart=RakNet::GetTime(); + if (SocketLayer::SendTo( socketList[rcs->socketIndex]->s, (const char*) bitStream.GetData(), bitStream.GetNumberOfBytesUsed(), rcs->systemAddress, socketList[rcs->socketIndex]->remotePortRakNetWasStartedOn_PS3_PSP2, socketList[rcs->socketIndex]->extraSocketOptions, _FILE_AND_LINE_ )==-10040) + { + // Don't use this MTU size again + rcs->requestsMade = (unsigned char) ((MTUSizeIndex + 1) * (rcs->sendConnectionAttemptCount/NUM_MTU_SIZES)); + rcs->nextRequestTime=timeMS; + } + else + { + RakNet::Time sendToEnd=RakNet::GetTime(); + if (sendToEnd-sendToStart>100) + { + // Drop to lowest MTU + int lowestMtuIndex = rcs->sendConnectionAttemptCount/NUM_MTU_SIZES * (NUM_MTU_SIZES - 1); + if (lowestMtuIndex > rcs->requestsMade) + { + rcs->requestsMade = (unsigned char) lowestMtuIndex; + rcs->nextRequestTime=timeMS; + } + else + rcs->requestsMade=(unsigned char)(rcs->sendConnectionAttemptCount+1); + } + } + SocketLayer::SetDoNotFragment(socketList[rcs->socketIndex]->s, 0, socketList[rcs->socketIndex]->boundAddress.GetIPPROTO()); + } + else + { + rcs->systemAddress.FixForIPVersion(rcs->socket->boundAddress); + SocketLayer::SetDoNotFragment(rcs->socket->s, 1, rcs->socket->boundAddress.GetIPPROTO()); + RakNet::Time sendToStart=RakNet::GetTime(); + if (SocketLayer::SendTo( rcs->socket->s, (const char*) bitStream.GetData(), bitStream.GetNumberOfBytesUsed(), rcs->systemAddress, socketList[rcs->socketIndex]->remotePortRakNetWasStartedOn_PS3_PSP2, socketList[rcs->socketIndex]->extraSocketOptions, _FILE_AND_LINE_ )==-10040) + { + // Don't use this MTU size again + rcs->requestsMade = (unsigned char) ((MTUSizeIndex + 1) * (rcs->sendConnectionAttemptCount/NUM_MTU_SIZES)); + rcs->nextRequestTime=timeMS; + } + else + { + RakNet::Time sendToEnd=RakNet::GetTime(); + if (sendToEnd-sendToStart>100) + { + // Drop to lowest MTU + int lowestMtuIndex = rcs->sendConnectionAttemptCount/NUM_MTU_SIZES * (NUM_MTU_SIZES - 1); + if (lowestMtuIndex > rcs->requestsMade) + { + rcs->requestsMade = (unsigned char) lowestMtuIndex; + rcs->nextRequestTime=timeMS; + } + else + rcs->requestsMade= (unsigned char) rcs->sendConnectionAttemptCount+1; + } + } + SocketLayer::SetDoNotFragment(rcs->socket->s, 0, rcs->socket->boundAddress.GetIPPROTO()); + } + + requestedConnectionQueueIndex++; + } + } + else + requestedConnectionQueueIndex++; + + requestedConnectionQueueMutex.Lock(); + } + requestedConnectionQueueMutex.Unlock(); + } + + // remoteSystemList in network thread + for ( activeSystemListIndex = 0; activeSystemListIndex < activeSystemListSize; ++activeSystemListIndex ) + //for ( remoteSystemIndex = 0; remoteSystemIndex < remoteSystemListSize; ++remoteSystemIndex ) + { + // I'm using systemAddress from remoteSystemList but am not locking it because this loop is called very frequently and it doesn't + // matter if we miss or do an extra update. The reliability layers themselves never care which player they are associated with + //systemAddress = remoteSystemList[ remoteSystemIndex ].systemAddress; + // Allow the systemAddress for this remote system list to change. We don't care if it changes now. + // remoteSystemList[ remoteSystemIndex ].allowSystemAddressAssigment=true; + + + // Found an active remote system + remoteSystem = activeSystemList[ activeSystemListIndex ]; + systemAddress = remoteSystem->systemAddress; + RakAssert(systemAddress!=UNASSIGNED_SYSTEM_ADDRESS); + // Update is only safe to call from the same thread that calls HandleSocketReceiveFromConnectedPlayer, + // which is this thread + + if (timeNS==0) + { + timeNS = RakNet::GetTimeUS(); + timeMS = (RakNet::TimeMS)(timeNS/(RakNet::TimeUS)1000); + //RAKNET_DEBUG_PRINTF("timeNS = %I64i timeMS=%i\n", timeNS, timeMS); + } + + + if (timeMS > remoteSystem->lastReliableSend && timeMS-remoteSystem->lastReliableSend > remoteSystem->reliabilityLayer.GetTimeoutTime()/2 && remoteSystem->connectMode==RemoteSystemStruct::CONNECTED) + { + // If no reliable packets are waiting for an ack, do a one byte reliable send so that disconnections are noticed + RakNetStatistics rakNetStatistics; + rnss=remoteSystem->reliabilityLayer.GetStatistics(&rakNetStatistics); + if (rnss->messagesInResendBuffer==0) + { + PingInternal( systemAddress, true, RELIABLE ); + + //remoteSystem->lastReliableSend=timeMS+remoteSystem->reliabilityLayer.GetTimeoutTime(); + remoteSystem->lastReliableSend=timeMS; + } + } + + remoteSystem->reliabilityLayer.Update( remoteSystem->rakNetSocket->s, systemAddress, remoteSystem->MTUSize, timeNS, maxOutgoingBPS, pluginListNTS, &rnr, remoteSystem->rakNetSocket->remotePortRakNetWasStartedOn_PS3_PSP2, remoteSystem->rakNetSocket->extraSocketOptions, updateBitStream ); // systemAddress only used for the internet simulator test + + // Check for failure conditions + if ( remoteSystem->reliabilityLayer.IsDeadConnection() || + ((remoteSystem->connectMode==RemoteSystemStruct::DISCONNECT_ASAP || remoteSystem->connectMode==RemoteSystemStruct::DISCONNECT_ASAP_SILENTLY) && remoteSystem->reliabilityLayer.IsOutgoingDataWaiting()==false) || + (remoteSystem->connectMode==RemoteSystemStruct::DISCONNECT_ON_NO_ACK && (remoteSystem->reliabilityLayer.AreAcksWaiting()==false || remoteSystem->reliabilityLayer.AckTimeout(timeMS)==true)) || + (( + (remoteSystem->connectMode==RemoteSystemStruct::REQUESTED_CONNECTION || + remoteSystem->connectMode==RemoteSystemStruct::HANDLING_CONNECTION_REQUEST || + remoteSystem->connectMode==RemoteSystemStruct::UNVERIFIED_SENDER) + && timeMS > remoteSystem->connectionTime && timeMS - remoteSystem->connectionTime > 10000)) + ) + { + // RAKNET_DEBUG_PRINTF("timeMS=%i remoteSystem->connectionTime=%i\n", timeMS, remoteSystem->connectionTime ); + + // Failed. Inform the user? + // TODO - RakNet 4.0 - Return a different message identifier for DISCONNECT_ASAP_SILENTLY and DISCONNECT_ASAP than for DISCONNECT_ON_NO_ACK + // The first two mean we called CloseConnection(), the last means the other system sent us ID_DISCONNECTION_NOTIFICATION + if (remoteSystem->connectMode==RemoteSystemStruct::CONNECTED || remoteSystem->connectMode==RemoteSystemStruct::REQUESTED_CONNECTION + || remoteSystem->connectMode==RemoteSystemStruct::DISCONNECT_ASAP || remoteSystem->connectMode==RemoteSystemStruct::DISCONNECT_ON_NO_ACK) + { + +// RakNet::BitStream undeliveredMessages; +// remoteSystem->reliabilityLayer.GetUndeliveredMessages(&undeliveredMessages,remoteSystem->MTUSize); + +// packet=AllocPacket(sizeof( char ) + undeliveredMessages.GetNumberOfBytesUsed()); + packet=AllocPacket(sizeof( char ), _FILE_AND_LINE_); + if (remoteSystem->connectMode==RemoteSystemStruct::REQUESTED_CONNECTION) + packet->data[ 0 ] = ID_CONNECTION_ATTEMPT_FAILED; // Attempted a connection and couldn't + else if (remoteSystem->connectMode==RemoteSystemStruct::CONNECTED) + packet->data[ 0 ] = ID_CONNECTION_LOST; // DeadConnection + else + packet->data[ 0 ] = ID_DISCONNECTION_NOTIFICATION; // DeadConnection + +// memcpy(packet->data+1, undeliveredMessages.GetData(), undeliveredMessages.GetNumberOfBytesUsed()); + + packet->guid = remoteSystem->guid; + packet->systemAddress = systemAddress; + packet->systemAddress.systemIndex = remoteSystem->remoteSystemIndex; + packet->guid.systemIndex=packet->systemAddress.systemIndex; + + AddPacketToProducer(packet); + } + // else connection shutting down, don't bother telling the user + +#ifdef _DO_PRINTF + RAKNET_DEBUG_PRINTF("Connection dropped for player %i:%i\n", systemAddress); +#endif + CloseConnectionInternal( systemAddress, false, true, 0, LOW_PRIORITY ); + continue; + } + + // Ping this guy if it is time to do so + if ( remoteSystem->connectMode==RemoteSystemStruct::CONNECTED && timeMS > remoteSystem->nextPingTime && ( occasionalPing || remoteSystem->lowestPing == (unsigned short)-1 ) ) + { + remoteSystem->nextPingTime = timeMS + 5000; + PingInternal( systemAddress, true, UNRELIABLE ); + + // Update again immediately after this tick so the ping goes out right away + quitAndDataEvents.SetEvent(); + } + + // Find whoever has the lowest player ID + //if (systemAddress < authoritativeClientSystemAddress) + // authoritativeClientSystemAddress=systemAddress; + + // Does the reliability layer have any packets waiting for us? + // To be thread safe, this has to be called in the same thread as HandleSocketReceiveFromConnectedPlayer + bitSize = remoteSystem->reliabilityLayer.Receive( &data ); + + while ( bitSize > 0 ) + { + // These types are for internal use and should never arrive from a network packet + if (data[0]==ID_CONNECTION_ATTEMPT_FAILED) + { + RakAssert(0); + bitSize=0; + continue; + } + + // Fast and easy - just use the data that was returned + byteSize = (unsigned int) BITS_TO_BYTES( bitSize ); + + // For unknown senders we only accept a few specific packets + if (remoteSystem->connectMode==RemoteSystemStruct::UNVERIFIED_SENDER) + { + if ( (unsigned char)(data)[0] == ID_CONNECTION_REQUEST ) + { + ParseConnectionRequestPacket(remoteSystem, systemAddress, (const char*)data, byteSize); + rakFree_Ex(data, _FILE_AND_LINE_ ); + } + else + { + CloseConnectionInternal( systemAddress, false, true, 0, LOW_PRIORITY ); +#ifdef _DO_PRINTF + RAKNET_DEBUG_PRINTF("Temporarily banning %i:%i for sending nonsense data\n", systemAddress); +#endif + + char str1[64]; + systemAddress.ToString(false, str1); + AddToBanList(str1, remoteSystem->reliabilityLayer.GetTimeoutTime()); + + + rakFree_Ex(data, _FILE_AND_LINE_ ); + } + } + else + { + // However, if we are connected we still take a connection request in case both systems are trying to connect to each other + // at the same time + if ( (unsigned char)(data)[0] == ID_CONNECTION_REQUEST ) + { + // 04/27/06 This is wrong. With cross connections, we can both have initiated the connection are in state REQUESTED_CONNECTION + // 04/28/06 Downgrading connections from connected will close the connection due to security at ((remoteSystem->connectMode!=RemoteSystemStruct::CONNECTED && time > remoteSystem->connectionTime && time - remoteSystem->connectionTime > 10000)) + if (remoteSystem->connectMode==RemoteSystemStruct::REQUESTED_CONNECTION) + { + ParseConnectionRequestPacket(remoteSystem, systemAddress, (const char*)data, byteSize); + } + else + { + + RakNet::BitStream bs((unsigned char*) data,byteSize,false); + bs.IgnoreBytes(sizeof(MessageID)); + bs.IgnoreBytes(sizeof(OFFLINE_MESSAGE_DATA_ID)); + bs.IgnoreBytes(RakNetGUID::size()); + RakNet::Time incomingTimestamp; + bs.Read(incomingTimestamp); + + // Got a connection request message from someone we are already connected to. Just reply normally. + // This can happen due to race conditions with the fully connected mesh + OnConnectionRequest( remoteSystem, incomingTimestamp ); + } + rakFree_Ex(data, _FILE_AND_LINE_ ); + } + else if ( (unsigned char) data[ 0 ] == ID_NEW_INCOMING_CONNECTION && byteSize > sizeof(unsigned char)+sizeof(unsigned int)+sizeof(unsigned short)+sizeof(RakNet::Time)*2 ) + { + if (remoteSystem->connectMode==RemoteSystemStruct::HANDLING_CONNECTION_REQUEST) + { + remoteSystem->connectMode=RemoteSystemStruct::CONNECTED; + PingInternal( systemAddress, true, UNRELIABLE ); + + // Update again immediately after this tick so the ping goes out right away + quitAndDataEvents.SetEvent(); + + RakNet::BitStream inBitStream((unsigned char *) data, byteSize, false); + SystemAddress bsSystemAddress; + + inBitStream.IgnoreBits(8); + inBitStream.Read(bsSystemAddress); + for (unsigned int i=0; i < MAXIMUM_NUMBER_OF_INTERNAL_IDS; i++) + inBitStream.Read(remoteSystem->theirInternalSystemAddress[i]); + + RakNet::Time sendPingTime, sendPongTime; + inBitStream.Read(sendPingTime); + inBitStream.Read(sendPongTime); + OnConnectedPong(sendPingTime,sendPongTime,remoteSystem); + + // Overwrite the data in the packet + // NewIncomingConnectionStruct newIncomingConnectionStruct; + // RakNet::BitStream nICS_BS( data, NewIncomingConnectionStruct_Size, false ); + // newIncomingConnectionStruct.Deserialize( nICS_BS ); + + remoteSystem->myExternalSystemAddress = bsSystemAddress; + firstExternalID=bsSystemAddress; + firstExternalID.debugPort=ntohs(firstExternalID.address.addr4.sin_port); + + // Send this info down to the game + packet=AllocPacket(byteSize, data, _FILE_AND_LINE_); + packet->bitSize = bitSize; + packet->systemAddress = systemAddress; + packet->systemAddress.systemIndex = remoteSystem->remoteSystemIndex; + packet->guid = remoteSystem->guid; + packet->guid.systemIndex=packet->systemAddress.systemIndex; + AddPacketToProducer(packet); + } + else + { + // Send to game even if already connected. This could happen when connecting to 127.0.0.1 + // Ignore, already connected + // rakFree_Ex(data, _FILE_AND_LINE_ ); + } + } + else if ( (unsigned char) data[ 0 ] == ID_CONNECTED_PONG && byteSize == sizeof(unsigned char)+sizeof(RakNet::Time)*2 ) + { + RakNet::Time sendPingTime, sendPongTime; + + // Copy into the ping times array the current time - the value returned + // First extract the sent ping + RakNet::BitStream inBitStream( (unsigned char *) data, byteSize, false ); + //PingStruct ps; + //ps.Deserialize(psBS); + inBitStream.IgnoreBits(8); + inBitStream.Read(sendPingTime); + inBitStream.Read(sendPongTime); + + OnConnectedPong(sendPingTime,sendPongTime,remoteSystem); + + rakFree_Ex(data, _FILE_AND_LINE_ ); + } + else if ( (unsigned char)data[0] == ID_CONNECTED_PING && byteSize == sizeof(unsigned char)+sizeof(RakNet::Time) ) + { + RakNet::BitStream inBitStream( (unsigned char *) data, byteSize, false ); + inBitStream.IgnoreBits(8); + RakNet::Time sendPingTime; + inBitStream.Read(sendPingTime); + + RakNet::BitStream outBitStream; + outBitStream.Write((MessageID)ID_CONNECTED_PONG); + outBitStream.Write(sendPingTime); + outBitStream.Write(RakNet::GetTime()); + SendImmediate( (char*)outBitStream.GetData(), outBitStream.GetNumberOfBitsUsed(), IMMEDIATE_PRIORITY, UNRELIABLE, 0, systemAddress, false, false, RakNet::GetTimeUS(), 0 ); + + // Update again immediately after this tick so the ping goes out right away + quitAndDataEvents.SetEvent(); + + rakFree_Ex(data, _FILE_AND_LINE_ ); + } + else if ( (unsigned char) data[ 0 ] == ID_DISCONNECTION_NOTIFICATION ) + { + // We shouldn't close the connection immediately because we need to ack the ID_DISCONNECTION_NOTIFICATION + remoteSystem->connectMode=RemoteSystemStruct::DISCONNECT_ON_NO_ACK; + rakFree_Ex(data, _FILE_AND_LINE_ ); + + // AddPacketToProducer(packet); + } + else if ( (unsigned char)(data)[0] == ID_DETECT_LOST_CONNECTIONS && byteSize == sizeof(unsigned char) ) + { + // Do nothing + rakFree_Ex(data, _FILE_AND_LINE_ ); + } + else if ( (unsigned char)(data)[0] == ID_INVALID_PASSWORD ) + { + if (remoteSystem->connectMode==RemoteSystemStruct::REQUESTED_CONNECTION) + { + packet=AllocPacket(byteSize, data, _FILE_AND_LINE_); + packet->bitSize = bitSize; + packet->systemAddress = systemAddress; + packet->systemAddress.systemIndex = remoteSystem->remoteSystemIndex; + packet->guid = remoteSystem->guid; + packet->guid.systemIndex=packet->systemAddress.systemIndex; + AddPacketToProducer(packet); + + remoteSystem->connectMode=RemoteSystemStruct::DISCONNECT_ASAP_SILENTLY; + } + else + { + rakFree_Ex(data, _FILE_AND_LINE_ ); + } + } + else if ( (unsigned char)(data)[0] == ID_CONNECTION_REQUEST_ACCEPTED ) + { + if (byteSize > sizeof(MessageID)+sizeof(unsigned int)+sizeof(unsigned short)+sizeof(SystemIndex)+sizeof(RakNet::Time)*2) + { + // Make sure this connection accept is from someone we wanted to connect to + bool allowConnection, alreadyConnected; + + if (remoteSystem->connectMode==RemoteSystemStruct::HANDLING_CONNECTION_REQUEST || + remoteSystem->connectMode==RemoteSystemStruct::REQUESTED_CONNECTION || + allowConnectionResponseIPMigration) + allowConnection=true; + else + allowConnection=false; + + if (remoteSystem->connectMode==RemoteSystemStruct::HANDLING_CONNECTION_REQUEST) + alreadyConnected=true; + else + alreadyConnected=false; + + if ( allowConnection ) + { + SystemAddress externalID; + SystemIndex systemIndex; +// SystemAddress internalID; + + RakNet::BitStream inBitStream((unsigned char *) data, byteSize, false); + inBitStream.IgnoreBits(8); + // inBitStream.Read(remotePort); + inBitStream.Read(externalID); + inBitStream.Read(systemIndex); + for (unsigned int i=0; i < MAXIMUM_NUMBER_OF_INTERNAL_IDS; i++) + inBitStream.Read(remoteSystem->theirInternalSystemAddress[i]); + + RakNet::Time sendPingTime, sendPongTime; + inBitStream.Read(sendPingTime); + inBitStream.Read(sendPongTime); + OnConnectedPong(sendPingTime, sendPongTime, remoteSystem); + + // Find a free remote system struct to use + // RakNet::BitStream casBitS(data, byteSize, false); + // ConnectionAcceptStruct cas; + // cas.Deserialize(casBitS); + // systemAddress.GetPort() = remotePort; + + // The remote system told us our external IP, so save it + remoteSystem->myExternalSystemAddress = externalID; + remoteSystem->connectMode=RemoteSystemStruct::CONNECTED; + + firstExternalID=externalID; + firstExternalID.debugPort=ntohs(firstExternalID.address.addr4.sin_port); + + // Send the connection request complete to the game + packet=AllocPacket(byteSize, data, _FILE_AND_LINE_); + packet->bitSize = byteSize * 8; + packet->systemAddress = systemAddress; + packet->systemAddress.systemIndex = ( SystemIndex ) GetIndexFromSystemAddress( systemAddress, true ); + packet->guid = remoteSystem->guid; + packet->guid.systemIndex=packet->systemAddress.systemIndex; + AddPacketToProducer(packet); + + RakNet::BitStream outBitStream; + outBitStream.Write((MessageID)ID_NEW_INCOMING_CONNECTION); + outBitStream.Write(systemAddress); + for (unsigned int i=0; i < MAXIMUM_NUMBER_OF_INTERNAL_IDS; i++) + outBitStream.Write(ipList[i]); + outBitStream.Write(sendPongTime); + outBitStream.Write(RakNet::GetTime()); + + + // We turned on encryption with SetEncryptionKey. This pads packets to up to a multiple of 16 bytes. + // As soon as a multiple of 16 byte packet arrives on the remote system, we will turn on AES. This works because all encrypted packets are multiples of 16 and the + // packets I happen to be sending before this are not a multiple of 16 bytes. Otherwise there is no way to know if a packet that arrived is + // encrypted or not so the other side won't know to turn on encryption or not. + RakAssert((outBitStream.GetNumberOfBytesUsed()&15)!=0); + SendImmediate( (char*)outBitStream.GetData(), outBitStream.GetNumberOfBitsUsed(), IMMEDIATE_PRIORITY, RELIABLE_ORDERED, 0, systemAddress, false, false, RakNet::GetTimeUS(), 0 ); + + if (alreadyConnected==false) + { + PingInternal( systemAddress, true, UNRELIABLE ); + } + } + else + { + // Ignore, already connected + rakFree_Ex(data, _FILE_AND_LINE_ ); + } + } + else + { + // Version mismatch error? + RakAssert(0); + rakFree_Ex(data, _FILE_AND_LINE_ ); + } + } + else + { + // What do I do if I get a message from a system, before I am fully connected? + // I can either ignore it or give it to the user + // It seems like giving it to the user is a better option + if ((data[0]>=(MessageID)ID_TIMESTAMP || data[0]==ID_SND_RECEIPT_ACKED || data[0]==ID_SND_RECEIPT_LOSS) && + remoteSystem->isActive + ) + { + packet=AllocPacket(byteSize, data, _FILE_AND_LINE_); + packet->bitSize = bitSize; + packet->systemAddress = systemAddress; + packet->systemAddress.systemIndex = remoteSystem->remoteSystemIndex; + packet->guid = remoteSystem->guid; + packet->guid.systemIndex=packet->systemAddress.systemIndex; + AddPacketToProducer(packet); + } + else + { + rakFree_Ex(data, _FILE_AND_LINE_ ); + } + } + } + + // Does the reliability layer have any more packets waiting for us? + // To be thread safe, this has to be called in the same thread as HandleSocketReceiveFromConnectedPlayer + bitSize = remoteSystem->reliabilityLayer.Receive( &data ); + } + + } + + return true; +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +RAK_THREAD_DECLARATION(RakNet::RecvFromLoop) +{ + + + + RakPeerAndIndex *rpai = ( RakPeerAndIndex * ) arguments; + + RakPeer * rakPeer = rpai->rakPeer; + SOCKET s = rpai->s; + unsigned short remotePortRakNetWasStartedOn_PS3 = rpai->remotePortRakNetWasStartedOn_PS3; + unsigned int extraSocketOptions = rpai->extraSocketOptions; + + rakPeer->isRecvFromLoopThreadActive.Increment(); + + RakPeer::RecvFromStruct *recvFromStruct; + while ( rakPeer->endThreads == false ) + { + recvFromStruct=rakPeer->bufferedPackets.Allocate( _FILE_AND_LINE_ ); + if (recvFromStruct != NULL) + { + recvFromStruct->s=s; + recvFromStruct->remotePortRakNetWasStartedOn_PS3=remotePortRakNetWasStartedOn_PS3; + recvFromStruct->extraSocketOptions=extraSocketOptions; + SocketLayer::RecvFromBlocking(s, rakPeer, remotePortRakNetWasStartedOn_PS3, extraSocketOptions, recvFromStruct->data, &recvFromStruct->bytesRead, &recvFromStruct->systemAddress, &recvFromStruct->timeRead); + + if (recvFromStruct->bytesRead>0) + { + RakAssert(recvFromStruct->systemAddress.GetPort()); + rakPeer->bufferedPackets.Push(recvFromStruct); + rakPeer->quitAndDataEvents.SetEvent(); + rakPeer->errorState = 0; + } + else + { + if (recvFromStruct->bytesRead < 0) { + --rakPeer->errorState; + RakSleep(30); + } + rakPeer->bufferedPackets.Deallocate(recvFromStruct, _FILE_AND_LINE_); + } + } + else + RakSleep(30); + } + rakPeer->isRecvFromLoopThreadActive.Decrement(); + + + + + return 0; + +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +RAK_THREAD_DECLARATION(RakNet::UpdateNetworkLoop) +{ + + + + RakPeer * rakPeer = ( RakPeer * ) arguments; + + +/* + // 11/15/05 - this is slower than Sleep() +#ifdef _WIN32 +#if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400) + // Lets see if these timers give better performance than Sleep + HANDLE timerHandle; + LARGE_INTEGER dueTime; + + if ( rakPeer->threadSleepTimer <= 0 ) + rakPeer->threadSleepTimer = 1; + + // 2nd parameter of false means synchronization timer instead of manual-reset timer + timerHandle = CreateWaitableTimer( NULL, FALSE, 0 ); + + RakAssert( timerHandle ); + + dueTime.QuadPart = -10000 * rakPeer->threadSleepTimer; // 10000 is 1 ms? + + BOOL success = SetWaitableTimer( timerHandle, &dueTime, rakPeer->threadSleepTimer, NULL, NULL, FALSE ); + (void) success; + RakAssert( success ); + +#endif +#endif +*/ + + BitStream updateBitStream( MAXIMUM_MTU_SIZE +#if LIBCAT_SECURITY==1 + + cat::AuthenticatedEncryption::OVERHEAD_BYTES +#endif + ); + + RakNet::TimeUS timeNS; + RakNet::TimeMS timeMS; + + rakPeer->isMainLoopThreadActive = true; + + while ( rakPeer->endThreads == false ) + { + // Set inside RunUpdateCycle() itself, this is here for testing + timeNS=0; + timeMS=0; + +// #ifdef _DEBUG +// // Sanity check, make sure RunUpdateCycle does not block or not otherwise get called for a long time +// RakNetTime thisCall=RakNet::GetTime(); +// RakAssert(thisCall-lastCall<250); +// lastCall=thisCall; +// #endif + if (rakPeer->userUpdateThreadPtr) + rakPeer->userUpdateThreadPtr(rakPeer, rakPeer->userUpdateThreadData); + + rakPeer->RunUpdateCycle(timeNS, timeMS, updateBitStream); + + // Pending sends go out this often, unless quitAndDataEvents is set + rakPeer->quitAndDataEvents.WaitOnEvent(10); + + /* + +// #if ((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && +#if defined(USE_WAIT_FOR_MULTIPLE_EVENTS) && defined(_WIN32) + + if (rakPeer->threadSleepTimer>0) + { + WSAEVENT eventArray[256]; + unsigned int i, eventArrayIndex; + for (i=0,eventArrayIndex=0; i < rakPeer->socketList.Size(); i++) + { + if (rakPeer->socketList[i]->recvEvent!=INVALID_HANDLE_VALUE) + { + eventArray[eventArrayIndex]=rakPeer->socketList[i]->recvEvent; + eventArrayIndex++; + if (eventArrayIndex==256) + break; + } + } + WSAWaitForMultipleEvents(eventArrayIndex,(const HANDLE*) &eventArray,FALSE,rakPeer->threadSleepTimer,FALSE); + } + else + { + RakSleep(0); + } + +#else // ((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && defined(USE_WAIT_FOR_MULTIPLE_EVENTS) + #pragma message("-- RakNet: Using Sleep(). Uncomment USE_WAIT_FOR_MULTIPLE_EVENTS in RakNetDefines.h if you want to use WaitForSingleObject instead. --") + + RakSleep( rakPeer->threadSleepTimer ); +#endif + */ + } + + rakPeer->isMainLoopThreadActive = false; + + /* +#ifdef _WIN32 +#if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400) + CloseHandle(timerHandle); +#endif +#endif + */ + + + + + return 0; + +} + +void RakPeer::CallPluginCallbacks(DataStructures::List &pluginList, Packet *packet) +{ + for (unsigned int i=0; i < pluginList.Size(); i++) + { + switch (packet->data[0]) + { + case ID_DISCONNECTION_NOTIFICATION: + pluginList[i]->OnClosedConnection(packet->systemAddress, packet->guid, LCR_DISCONNECTION_NOTIFICATION); + break; + case ID_CONNECTION_LOST: + pluginList[i]->OnClosedConnection(packet->systemAddress, packet->guid, LCR_CONNECTION_LOST); + break; + case ID_NEW_INCOMING_CONNECTION: + pluginList[i]->OnNewConnection(packet->systemAddress, packet->guid, true); + break; + case ID_CONNECTION_REQUEST_ACCEPTED: + pluginList[i]->OnNewConnection(packet->systemAddress, packet->guid, false); + break; + case ID_CONNECTION_ATTEMPT_FAILED: + pluginList[i]->OnFailedConnectionAttempt(packet, FCAR_CONNECTION_ATTEMPT_FAILED); + break; + case ID_REMOTE_SYSTEM_REQUIRES_PUBLIC_KEY: + pluginList[i]->OnFailedConnectionAttempt(packet, FCAR_REMOTE_SYSTEM_REQUIRES_PUBLIC_KEY); + break; + case ID_OUR_SYSTEM_REQUIRES_SECURITY: + pluginList[i]->OnFailedConnectionAttempt(packet, FCAR_OUR_SYSTEM_REQUIRES_SECURITY); + break; + case ID_PUBLIC_KEY_MISMATCH: + pluginList[i]->OnFailedConnectionAttempt(packet, FCAR_PUBLIC_KEY_MISMATCH); + break; + case ID_ALREADY_CONNECTED: + pluginList[i]->OnFailedConnectionAttempt(packet, FCAR_ALREADY_CONNECTED); + break; + case ID_NO_FREE_INCOMING_CONNECTIONS: + pluginList[i]->OnFailedConnectionAttempt(packet, FCAR_NO_FREE_INCOMING_CONNECTIONS); + break; + case ID_CONNECTION_BANNED: + pluginList[i]->OnFailedConnectionAttempt(packet, FCAR_CONNECTION_BANNED); + break; + case ID_INVALID_PASSWORD: + pluginList[i]->OnFailedConnectionAttempt(packet, FCAR_INVALID_PASSWORD); + break; + case ID_INCOMPATIBLE_PROTOCOL_VERSION: + pluginList[i]->OnFailedConnectionAttempt(packet, FCAR_INCOMPATIBLE_PROTOCOL); + break; + case ID_IP_RECENTLY_CONNECTED: + pluginList[i]->OnFailedConnectionAttempt(packet, FCAR_IP_RECENTLY_CONNECTED); + break; + } + } +} + +// #if defined(RMO_NEW_UNDEF_ALLOCATING_QUEUE) +// #pragma pop_macro("new") +// #undef RMO_NEW_UNDEF_ALLOCATING_QUEUE +// #endif + + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakPeer.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakPeer.h new file mode 100644 index 0000000..ded067c --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakPeer.h @@ -0,0 +1,984 @@ +/// \file +/// \brief Declares RakPeer class. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +// TODO - RakNet 4 - Add network simulator +// TODO - RakNet 4 - Enable disabling flow control per connections + +#ifndef __RAK_PEER_H +#define __RAK_PEER_H + +#include "ReliabilityLayer.h" +#include "RakPeerInterface.h" +#include "BitStream.h" +#include "SingleProducerConsumer.h" +#include "SimpleMutex.h" +#include "DS_OrderedList.h" +#include "Export.h" +#include "RakString.h" +#include "RakThread.h" +#include "RakNetSocket.h" +#include "RakNetSmartPtr.h" +#include "DS_ThreadsafeAllocatingQueue.h" +#include "SignaledEvent.h" +#include "NativeFeatureIncludes.h" +#include "SecureHandshake.h" +#include "LocklessTypes.h" + +namespace RakNet { +/// Forward declarations +class HuffmanEncodingTree; +class PluginInterface2; + +// Sucks but this struct has to be outside the class. Inside and DevCPP won't let you refer to the struct as RakPeer::RemoteSystemIndex while GCC +// forces you to do RakPeer::RemoteSystemIndex +struct RemoteSystemIndex{unsigned index; RemoteSystemIndex *next;}; +//int RAK_DLL_EXPORT SystemAddressAndIndexComp( const SystemAddress &key, const RemoteSystemIndex &data ); // GCC requires RakPeer::RemoteSystemIndex or it won't compile + +///\brief Main interface for network communications. +/// \details It implements most of RakNet's functionality and is the primary interface for RakNet. +/// +/// Inherits RakPeerInterface. +/// +/// See the individual functions for what the class can do. +/// +class RAK_DLL_EXPORT RakPeer : public RakPeerInterface +{ +public: + ///Constructor + RakPeer(); + + ///Destructor + virtual ~RakPeer(); + + // --------------------------------------------------------------------------------------------Major Low Level Functions - Functions needed by most users-------------------------------------------------------------------------------------------- + /// \brief Starts the network threads and opens the listen port. + /// \details You must call this before calling Connect(). + /// \pre On the PS3, call Startup() after Client_Login() + /// \note Multiple calls while already active are ignored. To call this function again with different settings, you must first call Shutdown(). + /// \note Call SetMaximumIncomingConnections if you want to accept incoming connections. + /// \param[in] maxConnections Maximum number of connections between this instance of RakPeer and another instance of RakPeer. Required so that the network can preallocate and for thread safety. A pure client would set this to 1. A pure server would set it to the number of allowed clients.A hybrid would set it to the sum of both types of connections. + /// \param[in] localPort The port to listen for connections on. On linux the system may be set up so thast ports under 1024 are restricted for everything but the root user. Use a higher port for maximum compatibility. + /// \param[in] socketDescriptors An array of SocketDescriptor structures to force RakNet to listen on a particular IP address or port (or both). Each SocketDescriptor will represent one unique socket. Do not pass redundant structures. To listen on a specific port, you can pass SocketDescriptor(myPort,0); such as for a server. For a client, it is usually OK to just pass SocketDescriptor(); However, on the XBOX be sure to use IPPROTO_VDP + /// \param[in] socketDescriptorCount The size of the \a socketDescriptors array. Pass 1 if you are not sure what to pass. + /// \param[in] threadPriority Passed to the thread creation routine. Use THREAD_PRIORITY_NORMAL for Windows. For Linux based systems, you MUST pass something reasonable based on the thread priorities for your application. + /// \return RAKNET_STARTED on success, otherwise appropriate failure enumeration. + StartupResult Startup( unsigned short maxConnections, SocketDescriptor *socketDescriptors, unsigned socketDescriptorCount, int threadPriority=-99999 ); + + /// If you accept connections, you must call this or else security will not be enabled for incoming connections. + /// This feature requires more round trips, bandwidth, and CPU time for the connection handshake + /// x64 builds require under 25% of the CPU time of other builds + /// See the Encryption sample for example usage + /// \pre Must be called while offline + /// \pre LIBCAT_SECURITY must be defined to 1 in NativeFeatureIncludes.h for this function to have any effect + /// \param[in] publicKey A pointer to the public key for accepting new connections + /// \param[in] privateKey A pointer to the private key for accepting new connections + /// \param[in] bRequireClientKey: Should be set to false for most servers. Allows the server to accept a public key from connecting clients as a proof of identity but eats twice as much CPU time as a normal connection + bool InitializeSecurity( const char *publicKey, const char *privateKey, bool bRequireClientKey = false ); + + /// Disables security for incoming connections. + /// \note Must be called while offline + void DisableSecurity( void ); + + /// \brief This is useful if you have a fixed-address internal server behind a LAN. + /// + /// Secure connections are determined by the recipient of an incoming connection. This has no effect if called on the system attempting to connect. + /// \note If secure connections are on, do not use secure connections for a specific IP address. + /// \param[in] ip IP address to add. * wildcards are supported. + void AddToSecurityExceptionList(const char *ip); + + /// \brief Remove a specific connection previously added via AddToSecurityExceptionList. + /// \param[in] ip IP address to remove. Pass 0 to remove all IP addresses. * wildcards are supported. + void RemoveFromSecurityExceptionList(const char *ip); + + /// \brief Checks to see if a given IP is in the security exception list. + /// \param[in] IP address to check. + /// \return True if the IP address is found in security exception list, else returns false. + bool IsInSecurityExceptionList(const char *ip); + + /// \brief Sets the maximum number of incoming connections allowed. + /// \details If the number of incoming connections is less than the number of players currently connected, + /// no more players will be allowed to connect. If this is greater than the maximum number of peers allowed, + /// it will be reduced to the maximum number of peers allowed. + /// + /// Defaults to 0, meaning by default, nobody can connect to you + /// \param[in] numberAllowed Maximum number of incoming connections allowed. + void SetMaximumIncomingConnections( unsigned short numberAllowed ); + + /// \brief Returns the value passed to SetMaximumIncomingConnections(). + /// \return Maximum number of incoming connections, which is always <= maxConnections + unsigned short GetMaximumIncomingConnections( void ) const; + + /// \brief Returns how many open connections exist at this time. + /// \return Number of open connections. + unsigned short NumberOfConnections(void) const; + + /// \brief Sets the password for the incoming connections. + /// \details The password must match in the call to Connect (defaults to none). + /// Pass 0 to passwordData to specify no password. + /// This is a way to set a low level password for all incoming connections. To selectively reject connections, implement your own scheme using CloseConnection() to remove unwanted connections. + /// \param[in] passwordData A data block that incoming connections must match. This can be just a password, or can be a stream of data. Specify 0 for no password data + /// \param[in] passwordDataLength The length in bytes of passwordData + void SetIncomingPassword( const char* passwordData, int passwordDataLength ); + + /// \brief Gets the password passed to SetIncomingPassword + /// \param[out] passwordData Should point to a block large enough to hold the password data you passed to SetIncomingPassword() + /// \param[in,out] passwordDataLength Maximum size of the passwordData array. Modified to hold the number of bytes actually written. + void GetIncomingPassword( char* passwordData, int *passwordDataLength ); + + /// \brief Connect to the specified host (ip or domain name) and server port. + /// \details Calling Connect and not calling SetMaximumIncomingConnections acts as a dedicated client. + /// Calling both acts as a true peer. + /// + /// This is a non-blocking connection. + /// + /// The connection is successful when GetConnectionState() returns IS_CONNECTED or Receive() gets a message with the type identifier ID_CONNECTION_REQUEST_ACCEPTED. + /// If the connection is not successful, such as a rejected connection or no response then neither of these things will happen. + /// \pre Requires that you first call Initialize. + /// \param[in] host Either a dotted IP address or a domain name. + /// \param[in] remotePort Port to connect to on the remote machine. + /// \param[in] passwordData A data block that must match the data block on the server passed to SetIncomingPassword(). This can be a string or can be a stream of data. Use 0 for no password. + /// \param[in] passwordDataLength The length in bytes of passwordData. + /// \param[in] publicKey The public key the server is using. If 0, the server is not using security. If non-zero, the publicKeyMode member determines how to connect + /// \param[in] connectionSocketIndex Index into the array of socket descriptors passed to socketDescriptors in RakPeer::Startup() to determine the one to send on. + /// \param[in] sendConnectionAttemptCount Number of datagrams to send to the other system to try to connect. + /// \param[in] timeBetweenSendConnectionAttemptsMS Time to elapse before a datagram is sent to the other system to try to connect. After sendConnectionAttemptCount number of attempts, ID_CONNECTION_ATTEMPT_FAILED is returned. Under low bandwidth conditions with multiple simultaneous outgoing connections, this value should be raised to 1000 or higher, or else the MTU detection can overrun the available bandwidth. + /// \param[in] timeoutTime Time to elapse before dropping the connection if a reliable message could not be sent. 0 to use the default value from SetTimeoutTime(UNASSIGNED_SYSTEM_ADDRESS); + /// \return CONNECTION_ATTEMPT_STARTED on successful initiation. Otherwise, an appropriate enumeration indicating failure. + /// \note CONNECTION_ATTEMPT_STARTED does not mean you are already connected! + /// \note It is possible to immediately get back ID_CONNECTION_ATTEMPT_FAILED if you exceed the maxConnections parameter passed to Startup(). This could happen if you call CloseConnection() with sendDisconnectionNotificaiton true, then immediately call Connect() before the connection has closed. + ConnectionAttemptResult Connect( const char* host, unsigned short remotePort, const char *passwordData, int passwordDataLength, PublicKey *publicKey=0, unsigned connectionSocketIndex=0, unsigned sendConnectionAttemptCount=6, unsigned timeBetweenSendConnectionAttemptsMS=1000, RakNet::TimeMS timeoutTime=0 ); + + /// \brief Connect to the specified host (ip or domain name) and server port. + /// \param[in] host Either a dotted IP address or a domain name. + /// \param[in] remotePort Which port to connect to on the remote machine. + /// \param[in] passwordData A data block that must match the data block on the server passed to SetIncomingPassword(). This can be a string or can be a stream of data. Use 0 for no password. + /// \param[in] passwordDataLength The length in bytes of passwordData. + /// \param[in] socket A bound socket returned by another instance of RakPeerInterface. + /// \param[in] sendConnectionAttemptCount Number of datagrams to send to the other system to try to connect. + /// \param[in] timeBetweenSendConnectionAttemptsMS Time to elapse before a datagram is sent to the other system to try to connect. After sendConnectionAttemptCount number of attempts, ID_CONNECTION_ATTEMPT_FAILED is returned.. Under low bandwidth conditions with multiple simultaneous outgoing connections, this value should be raised to 1000 or higher, or else the MTU detection can overrun the available bandwidth. + /// \param[in] timeoutTime Time to elapse before dropping the connection if a reliable message could not be sent. 0 to use the default from SetTimeoutTime(UNASSIGNED_SYSTEM_ADDRESS); + /// \return CONNECTION_ATTEMPT_STARTED on successful initiation. Otherwise, an appropriate enumeration indicating failure. + /// \note CONNECTION_ATTEMPT_STARTED does not mean you are already connected! + virtual ConnectionAttemptResult ConnectWithSocket(const char* host, unsigned short remotePort, const char *passwordData, int passwordDataLength, RakNetSmartPtr socket, PublicKey *publicKey=0, unsigned sendConnectionAttemptCount=6, unsigned timeBetweenSendConnectionAttemptsMS=1000, RakNet::TimeMS timeoutTime=0); + + /* /// \brief Connect to the specified network ID (Platform specific console function) + /// \details Does built-in NAT traversal + /// \param[in] networkServiceId Network ID structure for the online service + /// \param[in] passwordData A data block that must match the data block on the server passed to SetIncomingPassword(). This can be a string or can be a stream of data. Use 0 for no password. + /// \param[in] passwordDataLength The length in bytes of passwordData. + //bool Console2LobbyConnect( void *networkServiceId, const char *passwordData, int passwordDataLength );*/ + + /// \brief Stops the network threads and closes all connections. + /// \param[in] blockDuration Wait time(milli seconds) for all remaining messages to go out, including ID_DISCONNECTION_NOTIFICATION. If 0, it doesn't wait at all. + /// \param[in] orderingChannel Channel on which ID_DISCONNECTION_NOTIFICATION will be sent, if blockDuration > 0. + /// \param[in] disconnectionNotificationPriority Priority of sending ID_DISCONNECTION_NOTIFICATION. + /// If set to 0, the disconnection notification won't be sent. + void Shutdown( unsigned int blockDuration, unsigned char orderingChannel=0, PacketPriority disconnectionNotificationPriority=LOW_PRIORITY ); + + /// \brief Returns true if the network thread is running. + /// \return True if the network thread is running, False otherwise + bool IsActive( void ) const; + + /// \brief Fills the array remoteSystems with the SystemAddress of all the systems we are connected to. + /// \param[out] remoteSystems An array of SystemAddress structures, to be filled with the SystemAddresss of the systems we are connected to. Pass 0 to remoteSystems to get the number of systems we are connected to. + /// \param[in, out] numberOfSystems As input, the size of remoteSystems array. As output, the number of elements put into the array. + bool GetConnectionList( SystemAddress *remoteSystems, unsigned short *numberOfSystems ) const; + + /// Returns the next uint32_t that Send() will return + /// \note If using RakPeer from multiple threads, this may not be accurate for your thread. Use IncrementNextSendReceipt() in that case. + /// \return The next uint32_t that Send() or SendList will return + virtual uint32_t GetNextSendReceipt(void); + + /// Returns the next uint32_t that Send() will return, and increments the value by one + /// \note If using RakPeer from multiple threads, pass this to forceReceipt in the send function + /// \return The next uint32_t that Send() or SendList will return + virtual uint32_t IncrementNextSendReceipt(void); + + /// \brief Sends a block of data to the specified system that you are connected to. + /// \note This function only works while the connected. + /// \note The first byte should be a message identifier starting at ID_USER_PACKET_ENUM. + /// \param[in] data Block of data to send. + /// \param[in] length Size in bytes of the data to send. + /// \param[in] priority Priority level to send on. See PacketPriority.h + /// \param[in] reliability How reliably to send this data. See PacketPriority.h + /// \param[in] orderingChannel When using ordered or sequenced messages, the channel to order these on. Messages are only ordered relative to other messages on the same stream. + /// \param[in] systemIdentifier Who to send this packet to, or in the case of broadcasting who not to send it to. Pass either a SystemAddress structure or a RakNetGUID structure. Use UNASSIGNED_SYSTEM_ADDRESS or to specify none + /// \param[in] broadcast True to send this packet to all connected systems. If true, then systemAddress specifies who not to send the packet to. + /// \param[in] forceReceipt If 0, will automatically determine the receipt number to return. If non-zero, will return what you give it. + /// \return 0 on bad input. Otherwise a number that identifies this message. If \a reliability is a type that returns a receipt, on a later call to Receive() you will get ID_SND_RECEIPT_ACKED or ID_SND_RECEIPT_LOSS with bytes 1-4 inclusive containing this number + uint32_t Send( const char *data, const int length, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast, uint32_t forceReceiptNumber=0 ); + + /// \brief "Send" to yourself rather than a remote system. + /// \details The message will be processed through the plugins and returned to the game as usual. + /// This function works anytime + /// \note The first byte should be a message identifier starting at ID_USER_PACKET_ENUM + /// \param[in] data Block of data to send. + /// \param[in] length Size in bytes of the data to send. + void SendLoopback( const char *data, const int length ); + + /// \brief Sends a block of data to the specified system that you are connected to. + /// + /// Same as the above version, but takes a BitStream as input. + /// \param[in] bitStream Bitstream to send + /// \param[in] priority Priority level to send on. See PacketPriority.h + /// \param[in] reliability How reliably to send this data. See PacketPriority.h + /// \param[in] orderingChannel Channel to order the messages on, when using ordered or sequenced messages. Messages are only ordered relative to other messages on the same stream. + /// \param[in] systemIdentifier System Address or RakNetGUID to send this packet to, or in the case of broadcasting, the address not to send it to. Use UNASSIGNED_SYSTEM_ADDRESS to specify none. + /// \param[in] broadcast True to send this packet to all connected systems. If true, then systemAddress specifies who not to send the packet to. + /// \param[in] forceReceipt If 0, will automatically determine the receipt number to return. If non-zero, will return what you give it. + /// \return 0 on bad input. Otherwise a number that identifies this message. If \a reliability is a type that returns a receipt, on a later call to Receive() you will get ID_SND_RECEIPT_ACKED or ID_SND_RECEIPT_LOSS with bytes 1-4 inclusive containing this number + /// \note COMMON MISTAKE: When writing the first byte, bitStream->Write((unsigned char) ID_MY_TYPE) be sure it is casted to a byte, and you are not writing a 4 byte enumeration. + uint32_t Send( const RakNet::BitStream * bitStream, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast, uint32_t forceReceiptNumber=0 ); + + /// \brief Sends multiple blocks of data, concatenating them automatically. + /// + /// This is equivalent to: + /// RakNet::BitStream bs; + /// bs.WriteAlignedBytes(block1, blockLength1); + /// bs.WriteAlignedBytes(block2, blockLength2); + /// bs.WriteAlignedBytes(block3, blockLength3); + /// Send(&bs, ...) + /// + /// This function only works when connected. + /// \param[in] data An array of pointers to blocks of data + /// \param[in] lengths An array of integers indicating the length of each block of data + /// \param[in] numParameters Length of the arrays data and lengths + /// \param[in] priority Priority level to send on. See PacketPriority.h + /// \param[in] reliability How reliably to send this data. See PacketPriority.h + /// \param[in] orderingChannel Channel to order the messages on, when using ordered or sequenced messages. Messages are only ordered relative to other messages on the same stream. + /// \param[in] systemIdentifier System Address or RakNetGUID to send this packet to, or in the case of broadcasting, the address not to send it to. Use UNASSIGNED_SYSTEM_ADDRESS to specify none. + /// \param[in] broadcast True to send this packet to all connected systems. If true, then systemAddress specifies who not to send the packet to. + /// \param[in] forceReceipt If 0, will automatically determine the receipt number to return. If non-zero, will return what you give it. + /// \return 0 on bad input. Otherwise a number that identifies this message. If \a reliability is a type that returns a receipt, on a later call to Receive() you will get ID_SND_RECEIPT_ACKED or ID_SND_RECEIPT_LOSS with bytes 1-4 inclusive containing this number + uint32_t SendList( const char **data, const int *lengths, const int numParameters, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast, uint32_t forceReceiptNumber=0 ); + + /// \brief Gets a message from the incoming message queue. + /// \details Use DeallocatePacket() to deallocate the message after you are done with it. + /// User-thread functions, such as RPC calls and the plugin function PluginInterface::Update occur here. + /// \return 0 if no packets are waiting to be handled, otherwise a pointer to a packet. + /// \note COMMON MISTAKE: Be sure to call this in a loop, once per game tick, until it returns 0. If you only process one packet per game tick they will buffer up. + /// \sa RakNetTypes.h contains struct Packet. + Packet* Receive( void ); + + /// \brief Call this to deallocate a message returned by Receive() when you are done handling it. + /// \param[in] packet Message to deallocate. + void DeallocatePacket( Packet *packet ); + + /// \brief Return the total number of connections we are allowed. + /// \return Total number of connections allowed. + unsigned short GetMaximumNumberOfPeers( void ) const; + + // -------------------------------------------------------------------------------------------- Connection Management Functions-------------------------------------------------------------------------------------------- + /// \brief Close the connection to another host (if we initiated the connection it will disconnect, if they did it will kick them out). + /// \details This method closes the connection irrespective of who initiated the connection. + /// \param[in] target Which system to close the connection to. + /// \param[in] sendDisconnectionNotification True to send ID_DISCONNECTION_NOTIFICATION to the recipient. False to close it silently. + /// \param[in] channel Which ordering channel to send the disconnection notification on, if any + /// \param[in] disconnectionNotificationPriority Priority to send ID_DISCONNECTION_NOTIFICATION on. + void CloseConnection( const AddressOrGUID target, bool sendDisconnectionNotification, unsigned char orderingChannel=0, PacketPriority disconnectionNotificationPriority=LOW_PRIORITY ); + + /// \brief Cancel a pending connection attempt. + /// \details If we are already connected, the connection stays open + /// \param[in] target Target system to cancel. + void CancelConnectionAttempt( const SystemAddress target ); + /// Returns if a system is connected, disconnected, connecting in progress, or various other states + /// \param[in] systemIdentifier The system we are referring to + /// \note This locks a mutex, do not call too frequently during connection attempts or the attempt will take longer and possibly even timeout + /// \return What state the remote system is in + ConnectionState GetConnectionState(const AddressOrGUID systemIdentifier); + + /// \brief Given \a systemAddress, returns its index into remoteSystemList. + /// \details Values range from 0 to the maximum number of players allowed - 1. + /// This includes systems which were formerly connected, but are now not connected. + /// \param[in] systemAddress The SystemAddress we are referring to + /// \return The index of this SystemAddress or -1 on system not found. + int GetIndexFromSystemAddress( const SystemAddress systemAddress ) const; + + /// \brief Given \a index into remoteSystemList, will return a SystemAddress. + /// This function is only useful for looping through all systems. + /// + /// \param[in] index Index should range between 0 and the maximum number of players allowed - 1. + /// \return The SystemAddress structure corresponding to \a index in remoteSystemList. + SystemAddress GetSystemAddressFromIndex( int index ); + + /// \brief Same as GetSystemAddressFromIndex but returns RakNetGUID + /// \param[in] index Index should range between 0 and the maximum number of players allowed - 1. + /// \return The RakNetGUID + RakNetGUID GetGUIDFromIndex( int index ); + + /// \brief Same as calling GetSystemAddressFromIndex and GetGUIDFromIndex for all systems, but more efficient + /// Indices match each other, so \a addresses[0] and \a guids[0] refer to the same system + /// \param[out] addresses All system addresses. Size of the list is the number of connections. Size of the \a addresses list will match the size of the \a guids list. + /// \param[out] guids All guids. Size of the list is the number of connections. Size of the list will match the size of the \a addresses list. + void GetSystemList(DataStructures::List &addresses, DataStructures::List &guids) const; + + /// \brief Bans an IP from connecting. + /// \details Banned IPs persist between connections but are not saved on shutdown nor loaded on startup. + /// \param[in] IP Dotted IP address. You can use * for a wildcard address, such as 128.0.0. * will ban all IP addresses starting with 128.0.0. + /// \param[in] milliseconds Gives time in milli seconds for a temporary ban of the IP address. Use 0 for a permanent ban. + void AddToBanList( const char *IP, RakNet::TimeMS milliseconds=0 ); + + /// \brief Allows a previously banned IP to connect. + /// param[in] Dotted IP address. You can use * as a wildcard. An IP such as 128.0.0.* will ban all IP addresses starting with 128.0.0. + void RemoveFromBanList( const char *IP ); + + /// \brief Allows all previously banned IPs to connect. + void ClearBanList( void ); + + /// \brief Returns true or false indicating if a particular IP is banned. + /// \param[in] IP Dotted IP address. + /// \return True if IP matches any IPs in the ban list, accounting for any wildcards. False otherwise. + bool IsBanned( const char *IP ); + + /// \brief Enable or disable allowing frequent connections from the same IP adderss + /// \details This is a security measure which is disabled by default, but can be set to true to prevent attackers from using up all connection slots. + /// \param[in] b True to limit connections from the same ip to at most 1 per 100 milliseconds. + void SetLimitIPConnectionFrequency(bool b); + + // --------------------------------------------------------------------------------------------Pinging Functions - Functions dealing with the automatic ping mechanism-------------------------------------------------------------------------------------------- + /// Send a ping to the specified connected system. + /// \pre The sender and recipient must already be started via a successful call to Startup() + /// \param[in] target Which system to ping + void Ping( const SystemAddress target ); + + /// \brief Send a ping to the specified unconnected system. + /// \details The remote system, if it is Initialized, will respond with ID_PONG followed by sizeof(RakNet::TimeMS) containing the system time the ping was sent. Default is 4 bytes - See __GET_TIME_64BIT in RakNetTypes.h + /// System should reply with ID_PONG if it is active + /// \param[in] host Either a dotted IP address or a domain name. Can be 255.255.255.255 for LAN broadcast. + /// \param[in] remotePort Which port to connect to on the remote machine. + /// \param[in] onlyReplyOnAcceptingConnections Only request a reply if the remote system is accepting connections + /// \param[in] connectionSocketIndex Index into the array of socket descriptors passed to socketDescriptors in RakPeer::Startup() to send on. + /// \return true on success, false on failure (unknown hostname) + bool Ping( const char* host, unsigned short remotePort, bool onlyReplyOnAcceptingConnections, unsigned connectionSocketIndex=0 ); + + /// \brief Returns the average of all ping times read for the specific system or -1 if none read yet + /// \param[in] systemAddress Which system we are referring to + /// \return The ping time for this system, or -1 + int GetAveragePing( const AddressOrGUID systemIdentifier ); + + /// \brief Returns the last ping time read for the specific system or -1 if none read yet. + /// \param[in] systemAddress Which system we are referring to + /// \return The last ping time for this system, or -1. + int GetLastPing( const AddressOrGUID systemIdentifier ) const; + + /// \brief Returns the lowest ping time read or -1 if none read yet. + /// \param[in] systemAddress Which system we are referring to + /// \return The lowest ping time for this system, or -1. + int GetLowestPing( const AddressOrGUID systemIdentifier ) const; + + /// Ping the remote systems every so often, or not. Can be called anytime. + /// By default this is true. Recommended to leave on, because congestion control uses it to determine how often to resend lost packets. + /// It would be true by default to prevent timestamp drift, since in the event of a clock spike, the timestamp deltas would no longer be accurate + /// \param[in] doPing True to start occasional pings. False to stop them. + void SetOccasionalPing( bool doPing ); + + // --------------------------------------------------------------------------------------------Static Data Functions - Functions dealing with API defined synchronized memory-------------------------------------------------------------------------------------------- + /// \brief Sets the data to send along with a LAN server discovery or offline ping reply. + /// \param[in] data Block of data to send, or 0 for none + /// \param[in] length Length of the data in bytes, or 0 for none + /// \note \a length should be under 400 bytes, as a security measure against flood attacks + /// \sa Ping.cpp + void SetOfflinePingResponse( const char *data, const unsigned int length ); + + /// \brief Returns pointers to a copy of the \a data passed to SetOfflinePingResponse. + /// \param[out] data A pointer to a copy of the data passed to SetOfflinePingResponse() + /// \param[out] length A pointer filled in with the length parameter passed to SetOfflinePingResponse() + /// \sa SetOfflinePingResponse + void GetOfflinePingResponse( char **data, unsigned int *length ); + + //--------------------------------------------------------------------------------------------Network Functions - Functions dealing with the network in general-------------------------------------------------------------------------------------------- + /// \brief Returns the unique address identifier that represents you or another system on the the network and is based on your local IP / port. + /// \note Not supported by the XBOX + /// \param[in] systemAddress Use UNASSIGNED_SYSTEM_ADDRESS to get your behind-LAN address. Use a connected system to get their behind-LAN address + /// \param[in] index When you have multiple internal IDs, which index to return? Currently limited to MAXIMUM_NUMBER_OF_INTERNAL_IDS (so the maximum value of this variable is MAXIMUM_NUMBER_OF_INTERNAL_IDS-1) + /// \return Identifier of your system internally, which may not be how other systems see if you if you are behind a NAT or proxy + SystemAddress GetInternalID( const SystemAddress systemAddress=UNASSIGNED_SYSTEM_ADDRESS, const int index=0 ) const; + + /// \brief Returns the unique address identifier that represents the target on the the network and is based on the target's external IP / port. + /// \param[in] target The SystemAddress of the remote system. Usually the same for all systems, unless you have two or more network cards. + SystemAddress GetExternalID( const SystemAddress target ) const; + + /// Return my own GUID + const RakNetGUID GetMyGUID(void) const; + + /// Return the address bound to a socket at the specified index + SystemAddress GetMyBoundAddress(const int socketIndex=0); + + /// \brief Given a connected system address, this method gives the unique GUID representing that instance of RakPeer. + /// This will be the same on all systems connected to that instance of RakPeer, even if the external system addresses are different. + /// Complexity is O(log2(n)). + /// If \a input is UNASSIGNED_SYSTEM_ADDRESS, will return your own GUID + /// \pre Call Startup() first, or the function will return UNASSIGNED_RAKNET_GUID + /// \param[in] input The system address of the target system we are connected to. + const RakNetGUID& GetGuidFromSystemAddress( const SystemAddress input ) const; + + /// \brief Gives the system address of a connected system, given its GUID. + /// The GUID will be the same on all systems connected to that instance of RakPeer, even if the external system addresses are different. + /// Currently O(log(n)), but this may be improved in the future + /// If \a input is UNASSIGNED_RAKNET_GUID, UNASSIGNED_SYSTEM_ADDRESS is returned. + /// \param[in] input The RakNetGUID of the target system. + SystemAddress GetSystemAddressFromGuid( const RakNetGUID input ) const; + + /// Given the SystemAddress of a connected system, get the public key they provided as an identity + /// Returns false if system address was not found or client public key is not known + /// \param[in] input The RakNetGUID of the system + /// \param[in] client_public_key The connected client's public key is copied to this address. Buffer must be cat::EasyHandshake::PUBLIC_KEY_BYTES bytes in length. + bool GetClientPublicKeyFromSystemAddress( const SystemAddress input, char *client_public_key ) const; + + /// \brief Set the time, in MS, to use before considering ourselves disconnected after not being able to deliver a reliable message. + + /// Set the time, in MS, to use before considering ourselves disconnected after not being able to deliver a reliable message. + /// Default time is 10,000 or 10 seconds in release and 30,000 or 30 seconds in debug. + /// Do not set different values for different computers that are connected to each other, or you won't be able to reconnect after ID_CONNECTION_LOST + /// \param[in] timeMS Time, in MS + /// \param[in] target SystemAddress structure of the target system. Pass UNASSIGNED_SYSTEM_ADDRESS for all systems. + void SetTimeoutTime( RakNet::TimeMS timeMS, const SystemAddress target ); + + /// \brief Returns the Timeout time for the given system. + /// \param[in] target Target system to get the TimeoutTime for. Pass UNASSIGNED_SYSTEM_ADDRESS to get the default value. + /// \return Timeout time for a given system. + RakNet::TimeMS GetTimeoutTime( const SystemAddress target ); + + /// \brief Returns the current MTU size + /// \param[in] target Which system to get MTU for. UNASSIGNED_SYSTEM_ADDRESS to get the default + /// \return The current MTU size of the target system. + int GetMTUSize( const SystemAddress target ) const; + + /// \brief Returns the number of IP addresses this system has internally. + /// \details Get the actual addresses from GetLocalIP() + unsigned GetNumberOfAddresses( void ); + + /// Returns an IP address at index 0 to GetNumberOfAddresses-1 in ipList array. + /// \param[in] index index into the list of IP addresses + /// \return The local IP address at this index + const char* GetLocalIP( unsigned int index ); + + /// Is this a local IP? + /// Checks if this ip is in the ipList array. + /// \param[in] An IP address to check, excluding the port. + /// \return True if this is one of the IP addresses returned by GetLocalIP + bool IsLocalIP( const char *ip ); + + /// \brief Allow or disallow connection responses from any IP. + /// \details Normally this should be false, but may be necessary when connecting to servers with multiple IP addresses. + /// \param[in] allow - True to allow this behavior, false to not allow. Defaults to false. Value persists between connections. + void AllowConnectionResponseIPMigration( bool allow ); + + /// \brief Sends a one byte message ID_ADVERTISE_SYSTEM to the remote unconnected system. + /// This will send our external IP outside the LAN along with some user data to the remote system. + /// \pre The sender and recipient must already be started via a successful call to Initialize + /// \param[in] host Either a dotted IP address or a domain name + /// \param[in] remotePort Which port to connect to on the remote machine. + /// \param[in] data Optional data to append to the packet. + /// \param[in] dataLength Length of data in bytes. Use 0 if no data. + /// \param[in] connectionSocketIndex Index into the array of socket descriptors passed to socketDescriptors in RakPeer::Startup() to send on. + /// \return False if IsActive()==false or the host is unresolvable. True otherwise. + bool AdvertiseSystem( const char *host, unsigned short remotePort, const char *data, int dataLength, unsigned connectionSocketIndex=0 ); + + /// \brief Controls how often to return ID_DOWNLOAD_PROGRESS for large message downloads. + /// \details ID_DOWNLOAD_PROGRESS is returned to indicate a new partial message chunk, roughly the MTU size, has arrived. + /// As it can be slow or cumbersome to get this notification for every chunk, you can set the interval at which it is returned. + /// Defaults to 0 (never return this notification). + /// \param[in] interval How many messages to use as an interval before a download progress notification is returned. + void SetSplitMessageProgressInterval(int interval); + + /// \brief Returns what was passed to SetSplitMessageProgressInterval(). + /// \return Number of messages to be recieved before a download progress notification is returned. Default to 0. + int GetSplitMessageProgressInterval(void) const; + + /// \brief Set how long to wait before giving up on sending an unreliable message. + /// Useful if the network is clogged up. + /// Set to 0 or less to never timeout. Defaults to 0. + /// \param[in] timeoutMS How many ms to wait before simply not sending an unreliable message. + void SetUnreliableTimeout(RakNet::TimeMS timeoutMS); + + /// \brief Send a message to a host, with the IP socket option TTL set to 3. + /// \details This message will not reach the host, but will open the router. + /// \param[in] host The address of the remote host in dotted notation. + /// \param[in] remotePort The port number to send to. + /// \param[in] ttl Max hops of datagram, set to 3 + /// \param[in] connectionSocketIndex userConnectionSocketIndex. + /// \remarks Used for NAT-Punchthrough + void SendTTL( const char* host, unsigned short remotePort, int ttl, unsigned connectionSocketIndex=0 ); + + // -------------------------------------------------------------------------------------------- Plugin Functions-------------------------------------------------------------------------------------------- + /// \brief Attaches a Plugin interface to an instance of the base class (RakPeer or PacketizedTCP) to run code automatically on message receipt in the Receive call. + /// If the plugin returns false from PluginInterface::UsesReliabilityLayer(), which is the case for all plugins except PacketLogger, you can call AttachPlugin() and DetachPlugin() for this plugin while RakPeer is active. + /// \param[in] messageHandler Pointer to the plugin to attach. + void AttachPlugin( PluginInterface2 *plugin ); + + /// \brief Detaches a Plugin interface from the instance of the base class (RakPeer or PacketizedTCP) it is attached to. + /// \details This method disables the plugin code from running automatically on base class's updates or message receipt. + /// If the plugin returns false from PluginInterface::UsesReliabilityLayer(), which is the case for all plugins except PacketLogger, you can call AttachPlugin() and DetachPlugin() for this plugin while RakPeer is active. + /// \param[in] messageHandler Pointer to a plugin to detach. + void DetachPlugin( PluginInterface2 *messageHandler ); + + // --------------------------------------------------------------------------------------------Miscellaneous Functions-------------------------------------------------------------------------------------------- + /// \brief Puts a message back in the receive queue in case you don't want to deal with it immediately. + /// \param[in] packet The pointer to the packet you want to push back. + /// \param[in] pushAtHead True to push the packet at the start of the queue so that the next receive call returns it. False to push it at the end of the queue. + /// \note Setting pushAtHead to false end makes the packets out of order. + void PushBackPacket( Packet *packet, bool pushAtHead ); + + /// \internal + /// \brief For a given system identified by \a guid, change the SystemAddress to send to. + /// \param[in] guid The connection we are referring to + /// \param[in] systemAddress The new address to send to + void ChangeSystemAddress(RakNetGUID guid, const SystemAddress &systemAddress); + + /// \brief Returns a packet for you to write to if you want to create a Packet for some reason. + /// You can add it to the receive buffer with PushBackPacket + /// \param[in] dataSize How many bytes to allocate for the buffer + /// \return A packet. + Packet* AllocatePacket(unsigned dataSize); + + /// \brief Get the socket used with a particular active connection. + /// The smart pointer reference counts the RakNetSocket object, so the socket will remain active as long as the smart pointer does, even if RakNet were to shutdown or close the connection. + /// \note This sends a query to the thread and blocks on the return value for up to one second. In practice it should only take a millisecond or so. + /// \param[in] target Which system. + /// \return A smart pointer object containing the socket information about the target. Be sure to check IsNull() which is returned if the update thread is unresponsive, shutting down, or if this system is not connected. + virtual RakNetSmartPtr GetSocket( const SystemAddress target ); + + /// \brief Gets all sockets in use. + /// \note This sends a query to the thread and blocks on the return value for up to one second. In practice it should only take a millisecond or so. + /// \param[out] sockets List of RakNetSocket structures in use. Sockets will not be closed until \a sockets goes out of scope + virtual void GetSockets( DataStructures::List > &sockets ); + virtual void ReleaseSockets( DataStructures::List > &sockets ); + + /// \internal + virtual void WriteOutOfBandHeader(RakNet::BitStream *bitStream); + + /// If you need code to run in the same thread as RakNet's update thread, this function can be used for that + /// \param[in] _userUpdateThreadPtr C callback function + /// \param[in] _userUpdateThreadData Passed to C callback function + virtual void SetUserUpdateThread(void (*_userUpdateThreadPtr)(RakPeerInterface *, void *), void *_userUpdateThreadData); + + // --------------------------------------------------------------------------------------------Network Simulator Functions-------------------------------------------------------------------------------------------- + /// Adds simulated ping and packet loss to the outgoing data flow. + /// To simulate bi-directional ping and packet loss, you should call this on both the sender and the recipient, with half the total ping and packetloss value on each. + /// You can exclude network simulator code with the _RELEASE #define to decrease code size + /// \deprecated Use http://www.jenkinssoftware.com/forum/index.php?topic=1671.0 instead. + /// \note Doesn't work past version 3.6201 + /// \param[in] packetloss Chance to lose a packet. Ranges from 0 to 1. + /// \param[in] minExtraPing The minimum time to delay sends. + /// \param[in] extraPingVariance The additional random time to delay sends. + virtual void ApplyNetworkSimulator( float packetloss, unsigned short minExtraPing, unsigned short extraPingVariance); + + /// Limits how much outgoing bandwidth can be sent per-connection. + /// This limit does not apply to the sum of all connections! + /// Exceeding the limit queues up outgoing traffic + /// \param[in] maxBitsPerSecond Maximum bits per second to send. Use 0 for unlimited (default). Once set, it takes effect immedately and persists until called again. + virtual void SetPerConnectionOutgoingBandwidthLimit( unsigned maxBitsPerSecond ); + + /// Returns if you previously called ApplyNetworkSimulator + /// \return If you previously called ApplyNetworkSimulator + virtual bool IsNetworkSimulatorActive( void ); + + // --------------------------------------------------------------------------------------------Statistical Functions - Functions dealing with API performance-------------------------------------------------------------------------------------------- + + /// \brief Returns a structure containing a large set of network statistics for the specified system. + /// You can map this data to a string using the C style StatisticsToString() function + /// \param[in] systemAddress Which connected system to get statistics for. + /// \param[in] rns If you supply this structure,the network statistics will be written to it. Otherwise the method uses a static struct to write the data, which is not threadsafe. + /// \return 0 if the specified system can't be found. Otherwise a pointer to the struct containing the specified system's network statistics. + /// \sa RakNetStatistics.h + RakNetStatistics * GetStatistics( const SystemAddress systemAddress, RakNetStatistics *rns=0 ); + /// \brief Returns the network statistics of the system at the given index in the remoteSystemList. + /// \return True if the index is less than the maximum number of peers allowed and the system is active. False otherwise. + bool GetStatistics( const int index, RakNetStatistics *rns ); + + /// \Returns how many messages are waiting when you call Receive() + virtual unsigned int GetReceiveBufferSize(void); + + // --------------------------------------------------------------------------------------------EVERYTHING AFTER THIS COMMENT IS FOR INTERNAL USE ONLY-------------------------------------------------------------------------------------------- + + /// \internal + bool SendOutOfBand(const char *host, unsigned short remotePort, const char *data, BitSize_t dataLength, unsigned connectionSocketIndex=0 ); + + // static Packet *AllocPacket(unsigned dataSize, const char *file, unsigned int line); + + /// \internal + /// \brief Holds the clock differences between systems, along with the ping + struct PingAndClockDifferential + { + unsigned short pingTime; + RakNet::Time clockDifferential; + }; + + /// \internal + /// \brief All the information representing a connected system + struct RemoteSystemStruct + { + bool isActive; // Is this structure in use? + SystemAddress systemAddress; /// Their external IP on the internet + SystemAddress myExternalSystemAddress; /// Your external IP on the internet, from their perspective + SystemAddress theirInternalSystemAddress[MAXIMUM_NUMBER_OF_INTERNAL_IDS]; /// Their internal IP, behind the LAN + ReliabilityLayer reliabilityLayer; /// The reliability layer associated with this player + bool weInitiatedTheConnection; /// True if we started this connection via Connect. False if someone else connected to us. + PingAndClockDifferential pingAndClockDifferential[ PING_TIMES_ARRAY_SIZE ]; /// last x ping times and calculated clock differentials with it + RakNet::Time pingAndClockDifferentialWriteIndex; /// The index we are writing into the pingAndClockDifferential circular buffer + unsigned short lowestPing; ///The lowest ping value encountered + RakNet::Time nextPingTime; /// When to next ping this player + RakNet::Time lastReliableSend; /// When did the last reliable send occur. Reliable sends must occur at least once every timeoutTime/2 units to notice disconnects + RakNet::Time connectionTime; /// connection time, if active. +// int connectionSocketIndex; // index into connectionSockets to send back on. + RakNetGUID guid; + int MTUSize; + // Reference counted socket to send back on + RakNetSmartPtr rakNetSocket; + SystemIndex remoteSystemIndex; + +#if LIBCAT_SECURITY==1 + // Cached answer used internally by RakPeer to prevent DoS attacks based on the connexion handshake + char answer[cat::EasyHandshake::ANSWER_BYTES]; + + // If the server has bRequireClientKey = true, then this is set to the validated public key of the connected client + // Valid after connectMode reaches HANDLING_CONNECTION_REQUEST + char client_public_key[cat::EasyHandshake::PUBLIC_KEY_BYTES]; +#endif + + enum ConnectMode {NO_ACTION, DISCONNECT_ASAP, DISCONNECT_ASAP_SILENTLY, DISCONNECT_ON_NO_ACK, REQUESTED_CONNECTION, HANDLING_CONNECTION_REQUEST, UNVERIFIED_SENDER, CONNECTED} connectMode; + }; + +protected: + + friend RAK_THREAD_DECLARATION(UpdateNetworkLoop); + friend RAK_THREAD_DECLARATION(RecvFromLoop); + friend RAK_THREAD_DECLARATION(UDTConnect); + + friend bool ProcessOfflineNetworkPacket( SystemAddress systemAddress, const char *data, const int length, RakPeer *rakPeer, RakNetSmartPtr rakNetSocket, bool *isOfflineMessage, RakNet::TimeUS timeRead ); + friend void ProcessNetworkPacket( const SystemAddress systemAddress, const char *data, const int length, RakPeer *rakPeer, RakNet::TimeUS timeRead, BitStream &updateBitStream ); + friend void ProcessNetworkPacket( const SystemAddress systemAddress, const char *data, const int length, RakPeer *rakPeer, RakNetSmartPtr rakNetSocket, RakNet::TimeUS timeRead, BitStream &updateBitStream ); + + int GetIndexFromSystemAddress( const SystemAddress systemAddress, bool calledFromNetworkThread ) const; + int GetIndexFromGuid( const RakNetGUID guid ); + + //void RemoveFromRequestedConnectionsList( const SystemAddress systemAddress ); + // Two versions needed because some buggy compilers strip the last parameter if unused, and crashes + ConnectionAttemptResult SendConnectionRequest( const char* host, unsigned short remotePort, const char *passwordData, int passwordDataLength, PublicKey *publicKey, unsigned connectionSocketIndex, unsigned int extraData, unsigned sendConnectionAttemptCount, unsigned timeBetweenSendConnectionAttemptsMS, RakNet::TimeMS timeoutTime, RakNetSmartPtr socket ); + ConnectionAttemptResult SendConnectionRequest( const char* host, unsigned short remotePort, const char *passwordData, int passwordDataLength, PublicKey *publicKey, unsigned connectionSocketIndex, unsigned int extraData, unsigned sendConnectionAttemptCount, unsigned timeBetweenSendConnectionAttemptsMS, RakNet::TimeMS timeoutTime ); + ///Get the reliability layer associated with a systemAddress. + /// \param[in] systemAddress The player identifier + /// \return 0 if none + RemoteSystemStruct *GetRemoteSystemFromSystemAddress( const SystemAddress systemAddress, bool calledFromNetworkThread, bool onlyActive ) const; + RakPeer::RemoteSystemStruct *GetRemoteSystem( const AddressOrGUID systemIdentifier, bool calledFromNetworkThread, bool onlyActive ) const; + void ValidateRemoteSystemLookup(void) const; + RemoteSystemStruct *GetRemoteSystemFromGUID( const RakNetGUID guid, bool onlyActive ) const; + ///Parse out a connection request packet + void ParseConnectionRequestPacket( RakPeer::RemoteSystemStruct *remoteSystem, const SystemAddress &systemAddress, const char *data, int byteSize); + void OnConnectionRequest( RakPeer::RemoteSystemStruct *remoteSystem, RakNet::Time incomingTimestamp ); + ///Send a reliable disconnect packet to this player and disconnect them when it is delivered + void NotifyAndFlagForShutdown( const SystemAddress systemAddress, bool performImmediate, unsigned char orderingChannel, PacketPriority disconnectionNotificationPriority ); + ///Returns how many remote systems initiated a connection to us + unsigned short GetNumberOfRemoteInitiatedConnections( void ) const; + /// \brief Get a free remote system from the list and assign our systemAddress to it. + /// \note Should only be called from the update thread - not the user thread. + /// \param[in] systemAddress systemAddress to be assigned + /// \param[in] connectionMode connection mode of the RemoteSystem. + /// \param[in] rakNetSocket + /// \param[in] thisIPConnectedRecently Is this IP connected recently? set to False; + /// \param[in] bindingAddress Address to be binded with the remote system + /// \param[in] incomingMTU MTU for the remote system + RemoteSystemStruct * AssignSystemAddressToRemoteSystemList( const SystemAddress systemAddress, RemoteSystemStruct::ConnectMode connectionMode, RakNetSmartPtr incomingRakNetSocket, bool *thisIPConnectedRecently, SystemAddress bindingAddress, int incomingMTU, RakNetGUID guid, bool useSecurity ); + /// \brief Adjust the timestamp of the incoming packet to be relative to this system. + /// \param[in] data Data in the incoming packet. + /// \param[in] systemAddress Sender of the incoming packet. + void ShiftIncomingTimestamp( unsigned char *data, const SystemAddress &systemAddress ) const; + /// Get the most accurate clock differential for a certain player. + /// \param[in] systemAddress The player with whose clock the time difference is calculated. + /// \returns The clock differential for a certain player. + RakNet::Time GetBestClockDifferential( const SystemAddress systemAddress ) const; + + bool IsLoopbackAddress(const AddressOrGUID &systemIdentifier, bool matchPort) const; + SystemAddress GetLoopbackAddress(void) const; + + ///Set this to true to terminate the Peer thread execution + volatile bool endThreads; + ///true if the peer thread is active. + volatile bool isMainLoopThreadActive; + + RakNet::LocklessUint32_t isRecvFromLoopThreadActive; + + + bool occasionalPing; /// Do we occasionally ping the other systems?*/ + ///Store the maximum number of peers allowed to connect + unsigned short maximumNumberOfPeers; + //05/02/06 Just using maximumNumberOfPeers instead + ///Store the maximum number of peers able to connect, including reserved connection slots for pings, etc. + //unsigned short remoteSystemListSize; + ///Store the maximum incoming connection allowed + unsigned short maximumIncomingConnections; + RakNet::BitStream offlinePingResponse; + ///Local Player ID + // SystemAddress mySystemAddress[MAXIMUM_NUMBER_OF_INTERNAL_IDS]; + char incomingPassword[256]; + unsigned char incomingPasswordLength; + + /// This is an array of pointers to RemoteSystemStruct + /// This allows us to preallocate the list when starting, so we don't have to allocate or delete at runtime. + /// Another benefit is that is lets us add and remove active players simply by setting systemAddress + /// and moving elements in the list by copying pointers variables without affecting running threads, even if they are in the reliability layer + RemoteSystemStruct* remoteSystemList; + /// activeSystemList holds a list of pointers and is preallocated to be the same size as remoteSystemList. It is updated only by the network thread, but read by both threads + /// When the isActive member of RemoteSystemStruct is set to true or false, that system is added to this list of pointers + /// Threadsafe because RemoteSystemStruct is preallocated, and the list is only added to, not removed from + RemoteSystemStruct** activeSystemList; + unsigned int activeSystemListSize; + + // Use a hash, with binaryAddress plus port mod length as the index + RemoteSystemIndex **remoteSystemLookup; + unsigned int RemoteSystemLookupHashIndex(const SystemAddress &sa) const; + void ReferenceRemoteSystem(const SystemAddress &sa, unsigned int remoteSystemListIndex); + void DereferenceRemoteSystem(const SystemAddress &sa); + RemoteSystemStruct* GetRemoteSystem(const SystemAddress &sa) const; + unsigned int GetRemoteSystemIndex(const SystemAddress &sa) const; + void ClearRemoteSystemLookup(void); + DataStructures::MemoryPool remoteSystemIndexPool; + + void AddToActiveSystemList(unsigned int remoteSystemListIndex); + void RemoveFromActiveSystemList(const SystemAddress &sa); + +// unsigned int LookupIndexUsingHashIndex(const SystemAddress &sa) const; +// unsigned int RemoteSystemListIndexUsingHashIndex(const SystemAddress &sa) const; +// unsigned int FirstFreeRemoteSystemLookupIndex(const SystemAddress &sa) const; + + enum + { + // Only put these mutexes in user thread functions! + requestedConnectionList_Mutex, + offlinePingResponse_Mutex, + NUMBER_OF_RAKPEER_MUTEXES + }; + SimpleMutex rakPeerMutexes[ NUMBER_OF_RAKPEER_MUTEXES ]; + ///RunUpdateCycle is not thread safe but we don't need to mutex calls. Just skip calls if it is running already + + bool updateCycleIsRunning; + ///The list of people we have tried to connect to recently + + //DataStructures::Queue requestedConnectionsList; + ///Data that both the client and the server needs + + unsigned int bytesSentPerSecond, bytesReceivedPerSecond; + // bool isSocketLayerBlocking; + // bool continualPing,isRecvfromThreadActive,isMainLoopThreadActive, endThreads, isSocketLayerBlocking; + unsigned int validationInteger; + SimpleMutex incomingQueueMutex, banListMutex; //,synchronizedMemoryQueueMutex, automaticVariableSynchronizationMutex; + //DataStructures::Queue incomingpacketSingleProducerConsumer; //, synchronizedMemorypacketSingleProducerConsumer; + // BitStream enumerationData; + + struct BanStruct + { + char *IP; + RakNet::TimeMS timeout; // 0 for none + }; + + struct RequestedConnectionStruct + { + SystemAddress systemAddress; + RakNet::Time nextRequestTime; + unsigned char requestsMade; + char *data; + unsigned short dataLength; + char outgoingPassword[256]; + unsigned char outgoingPasswordLength; + unsigned socketIndex; + unsigned int extraData; + unsigned sendConnectionAttemptCount; + unsigned timeBetweenSendConnectionAttemptsMS; + RakNet::TimeMS timeoutTime; + PublicKeyMode publicKeyMode; + RakNetSmartPtr socket; + enum {CONNECT=1, /*PING=2, PING_OPEN_CONNECTIONS=4,*/ /*ADVERTISE_SYSTEM=2*/} actionToTake; + +#if LIBCAT_SECURITY==1 + char handshakeChallenge[cat::EasyHandshake::CHALLENGE_BYTES]; + cat::ClientEasyHandshake *client_handshake; + char remote_public_key[cat::EasyHandshake::PUBLIC_KEY_BYTES]; +// char remote_challenge[cat::EasyHandshake::CHALLENGE_BYTES]; + // char random[16]; +#endif + }; +#if LIBCAT_SECURITY==1 + bool GenerateConnectionRequestChallenge(RequestedConnectionStruct *rcs,PublicKey *publicKey); +#endif + + //DataStructures::List* > automaticVariableSynchronizationList; + DataStructures::List banList; + // Threadsafe, and not thread safe + DataStructures::List pluginListTS, pluginListNTS; + + DataStructures::Queue requestedConnectionQueue; + SimpleMutex requestedConnectionQueueMutex; + + bool RunUpdateCycle( RakNet::TimeUS timeNS, RakNet::Time timeMS, BitStream &updateBitStream ); + // void RunMutexedUpdateCycle(void); + + struct BufferedCommandStruct + { + BitSize_t numberOfBitsToSend; + PacketPriority priority; + PacketReliability reliability; + char orderingChannel; + AddressOrGUID systemIdentifier; + bool broadcast; + RemoteSystemStruct::ConnectMode connectionMode; + NetworkID networkID; + bool blockingCommand; // Only used for RPC + char *data; + bool haveRakNetCloseSocket; + unsigned connectionSocketIndex; + unsigned short remotePortRakNetWasStartedOn_PS3; + unsigned int extraSocketOptions; + SOCKET socket; + unsigned short port; + uint32_t receipt; + enum {BCS_SEND, BCS_CLOSE_CONNECTION, BCS_GET_SOCKET, BCS_CHANGE_SYSTEM_ADDRESS,/* BCS_USE_USER_SOCKET, BCS_REBIND_SOCKET_ADDRESS, BCS_RPC, BCS_RPC_SHIFT,*/ BCS_DO_NOTHING} command; + }; + + // Single producer single consumer queue using a linked list + //BufferedCommandStruct* bufferedCommandReadIndex, bufferedCommandWriteIndex; + + DataStructures::ThreadsafeAllocatingQueue bufferedCommands; + + + // Constructor not called! + struct RecvFromStruct + { + + + + char data[MAXIMUM_MTU_SIZE]; + + int bytesRead; + SystemAddress systemAddress; + RakNet::TimeUS timeRead; + SOCKET s; + unsigned short remotePortRakNetWasStartedOn_PS3; + unsigned int extraSocketOptions; + }; + + + DataStructures::ThreadsafeAllocatingQueue bufferedPackets; + + + struct SocketQueryOutput + { + SocketQueryOutput() {} + ~SocketQueryOutput() {} + DataStructures::List > sockets; + }; + + DataStructures::ThreadsafeAllocatingQueue socketQueryOutput; + + + bool AllowIncomingConnections(void) const; + + void PingInternal( const SystemAddress target, bool performImmediate, PacketReliability reliability ); + // This stores the user send calls to be handled by the update thread. This way we don't have thread contention over systemAddresss + void CloseConnectionInternal( const AddressOrGUID& systemIdentifier, bool sendDisconnectionNotification, bool performImmediate, unsigned char orderingChannel, PacketPriority disconnectionNotificationPriority ); + void SendBuffered( const char *data, BitSize_t numberOfBitsToSend, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast, RemoteSystemStruct::ConnectMode connectionMode, uint32_t receipt ); + void SendBufferedList( const char **data, const int *lengths, const int numParameters, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast, RemoteSystemStruct::ConnectMode connectionMode, uint32_t receipt ); + bool SendImmediate( char *data, BitSize_t numberOfBitsToSend, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast, bool useCallerDataAllocation, RakNet::TimeUS currentTime, uint32_t receipt ); + //bool HandleBufferedRPC(BufferedCommandStruct *bcs, RakNet::TimeMS time); + void ClearBufferedCommands(void); + void ClearBufferedPackets(void); + void ClearSocketQueryOutput(void); + void ClearRequestedConnectionList(void); + void AddPacketToProducer(RakNet::Packet *p); + unsigned int GenerateSeedFromGuid(void); + SimpleMutex securityExceptionMutex; + + //DataStructures::AVLBalancedBinarySearchTree rpcTree; + int defaultMTUSize; + bool trackFrequencyTable; + + // Smart pointer so I can return the object to the user + DataStructures::List > socketList; + void DerefAllSockets(void); + unsigned int GetRakNetSocketFromUserConnectionSocketIndex(unsigned int userIndex) const; + // Used for RPC replies + RakNet::BitStream *replyFromTargetBS; + SystemAddress replyFromTargetPlayer; + bool replyFromTargetBroadcast; + + RakNet::TimeMS defaultTimeoutTime; + + // Generate and store a unique GUID + void GenerateGUID(void); + unsigned int GetSystemIndexFromGuid( const RakNetGUID input ) const; + RakNetGUID myGuid; + + unsigned maxOutgoingBPS; + + // Nobody would use the internet simulator in a final build. +#ifdef _DEBUG + double _packetloss; + unsigned short _minExtraPing, _extraPingVariance; +#endif + + ///How long it has been since things were updated by a call to receiveUpdate thread uses this to determine how long to sleep for + //unsigned int lastUserUpdateCycle; + /// True to allow connection accepted packets from anyone. False to only allow these packets from servers we requested a connection to. + bool allowConnectionResponseIPMigration; + + SystemAddress firstExternalID; + int splitMessageProgressInterval; + RakNet::TimeMS unreliableTimeout; + + // Systems in this list will not go through the secure connection process, even when secure connections are turned on. Wildcards are accepted. + DataStructures::List securityExceptionList; + + SystemAddress ipList[ MAXIMUM_NUMBER_OF_INTERNAL_IDS ]; + + bool allowInternalRouting; + + void (*userUpdateThreadPtr)(RakPeerInterface *, void *); + void *userUpdateThreadData; + + + SignaledEvent quitAndDataEvents; + bool limitConnectionFrequencyFromTheSameIP; + + SimpleMutex packetAllocationPoolMutex; + DataStructures::MemoryPool packetAllocationPool; + + SimpleMutex packetReturnMutex; + DataStructures::Queue packetReturnQueue; + Packet *AllocPacket(unsigned dataSize, const char *file, unsigned int line); + Packet *AllocPacket(unsigned dataSize, unsigned char *data, const char *file, unsigned int line); + + /// This is used to return a number to the user when they call Send identifying the message + /// This number will be returned back with ID_SND_RECEIPT_ACKED or ID_SND_RECEIPT_LOSS and is only returned + /// with the reliability types that contain RECEIPT in the name + SimpleMutex sendReceiptSerialMutex; + uint32_t sendReceiptSerial; + void ResetSendReceipt(void); + void OnConnectedPong(RakNet::Time sendPingTime, RakNet::Time sendPongTime, RemoteSystemStruct *remoteSystem); + void CallPluginCallbacks(DataStructures::List &pluginList, Packet *packet); + +#if LIBCAT_SECURITY==1 + // Encryption and security + bool _using_security, _require_client_public_key; + char my_public_key[cat::EasyHandshake::PUBLIC_KEY_BYTES]; + cat::ServerEasyHandshake *_server_handshake; + cat::CookieJar *_cookie_jar; + bool InitializeClientSecurity(RequestedConnectionStruct *rcs, const char *public_key); +#endif + + + + + +} +// #if defined(SN_TARGET_PSP2) +// __attribute__((aligned(8))) +// #endif +; + +} // namespace RakNet + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakPeerInterface.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakPeerInterface.h new file mode 100644 index 0000000..5eed507 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakPeerInterface.h @@ -0,0 +1,571 @@ +/// \file +/// \brief An interface for RakPeer. Simply contains all user functions as pure virtuals. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __RAK_PEER_INTERFACE_H +#define __RAK_PEER_INTERFACE_H + +#include "PacketPriority.h" +#include "RakNetTypes.h" +#include "RakMemoryOverride.h" +#include "Export.h" +#include "DS_List.h" +#include "RakNetSmartPtr.h" +#include "RakNetSocket.h" + +namespace RakNet +{ +// Forward declarations +class BitStream; +class PluginInterface2; +struct RPCMap; +struct RakNetStatistics; +struct RakNetBandwidth; +class RouterInterface; +class NetworkIDManager; + +/// The primary interface for RakNet, RakPeer contains all major functions for the library. +/// See the individual functions for what the class can do. +/// \brief The main interface for network communications +class RAK_DLL_EXPORT RakPeerInterface +{ +public: + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(RakPeerInterface) + + ///Destructor + virtual ~RakPeerInterface() {} + + // --------------------------------------------------------------------------------------------Major Low Level Functions - Functions needed by most users-------------------------------------------------------------------------------------------- + /// \brief Starts the network threads, opens the listen port. + /// \details You must call this before calling Connect(). + /// \pre On the PS3, call Startup() after Client_Login() + /// \pre On Android, add the necessary permission to your application's androidmanifest.xml: + /// Multiple calls while already active are ignored. To call this function again with different settings, you must first call Shutdown(). + /// \note Call SetMaximumIncomingConnections if you want to accept incoming connections + /// \param[in] maxConnections The maximum number of connections between this instance of RakPeer and another instance of RakPeer. Required so the network can preallocate and for thread safety. A pure client would set this to 1. A pure server would set it to the number of allowed clients.- A hybrid would set it to the sum of both types of connections + /// \param[in] localPort The port to listen for connections on. On linux the system may be set up so thast ports under 1024 are restricted for everything but the root user. Use a higher port for maximum compatibility. + /// \param[in] socketDescriptors An array of SocketDescriptor structures to force RakNet to listen on a particular IP address or port (or both). Each SocketDescriptor will represent one unique socket. Do not pass redundant structures. To listen on a specific port, you can pass SocketDescriptor(myPort,0); such as for a server. For a client, it is usually OK to just pass SocketDescriptor(); However, on the XBOX be sure to use IPPROTO_VDP + /// \param[in] socketDescriptorCount The size of the \a socketDescriptors array. Pass 1 if you are not sure what to pass. + /// \param[in] threadPriority Passed to the thread creation routine. Use THREAD_PRIORITY_NORMAL for Windows. For Linux based systems, you MUST pass something reasonable based on the thread priorities for your application. + /// \return RAKNET_STARTED on success, otherwise appropriate failure enumeration. + virtual StartupResult Startup( unsigned short maxConnections, SocketDescriptor *socketDescriptors, unsigned socketDescriptorCount, int threadPriority=-99999 )=0; + + /// If you accept connections, you must call this or else security will not be enabled for incoming connections. + /// This feature requires more round trips, bandwidth, and CPU time for the connection handshake + /// x64 builds require under 25% of the CPU time of other builds + /// See the Encryption sample for example usage + /// \pre Must be called while offline + /// \pre LIBCAT_SECURITY must be defined to 1 in NativeFeatureIncludes.h for this function to have any effect + /// \param[in] publicKey A pointer to the public key for accepting new connections + /// \param[in] privateKey A pointer to the private key for accepting new connections + /// \param[in] bRequireClientKey: Should be set to false for most servers. Allows the server to accept a public key from connecting clients as a proof of identity but eats twice as much CPU time as a normal connection + virtual bool InitializeSecurity( const char *publicKey, const char *privateKey, bool bRequireClientKey = false )=0; + + /// Disables security for incoming connections. + /// \note Must be called while offline + virtual void DisableSecurity( void )=0; + + /// If secure connections are on, do not use secure connections for a specific IP address. + /// This is useful if you have a fixed-address internal server behind a LAN. + /// \note Secure connections are determined by the recipient of an incoming connection. This has no effect if called on the system attempting to connect. + /// \param[in] ip IP address to add. * wildcards are supported. + virtual void AddToSecurityExceptionList(const char *ip)=0; + + /// Remove a specific connection previously added via AddToSecurityExceptionList + /// \param[in] ip IP address to remove. Pass 0 to remove all IP addresses. * wildcards are supported. + virtual void RemoveFromSecurityExceptionList(const char *ip)=0; + + /// Checks to see if a given IP is in the security exception list + /// \param[in] IP address to check. + virtual bool IsInSecurityExceptionList(const char *ip)=0; + + /// Sets how many incoming connections are allowed. If this is less than the number of players currently connected, + /// no more players will be allowed to connect. If this is greater than the maximum number of peers allowed, + /// it will be reduced to the maximum number of peers allowed. + /// Defaults to 0, meaning by default, nobody can connect to you + /// \param[in] numberAllowed Maximum number of incoming connections allowed. + virtual void SetMaximumIncomingConnections( unsigned short numberAllowed )=0; + + /// Returns the value passed to SetMaximumIncomingConnections() + /// \return the maximum number of incoming connections, which is always <= maxConnections + virtual unsigned short GetMaximumIncomingConnections( void ) const=0; + + /// Returns how many open connections there are at this time + /// \return the number of open connections + virtual unsigned short NumberOfConnections(void) const=0; + + /// Sets the password incoming connections must match in the call to Connect (defaults to none). Pass 0 to passwordData to specify no password + /// This is a way to set a low level password for all incoming connections. To selectively reject connections, implement your own scheme using CloseConnection() to remove unwanted connections + /// \param[in] passwordData A data block that incoming connections must match. This can be just a password, or can be a stream of data. Specify 0 for no password data + /// \param[in] passwordDataLength The length in bytes of passwordData + virtual void SetIncomingPassword( const char* passwordData, int passwordDataLength )=0; + + /// Gets the password passed to SetIncomingPassword + /// \param[out] passwordData Should point to a block large enough to hold the password data you passed to SetIncomingPassword() + /// \param[in,out] passwordDataLength Maximum size of the array passwordData. Modified to hold the number of bytes actually written + virtual void GetIncomingPassword( char* passwordData, int *passwordDataLength )=0; + + /// \brief Connect to the specified host (ip or domain name) and server port. + /// Calling Connect and not calling SetMaximumIncomingConnections acts as a dedicated client. + /// Calling both acts as a true peer. This is a non-blocking connection. + /// You know the connection is successful when GetConnectionState() returns IS_CONNECTED or Receive() gets a message with the type identifier ID_CONNECTION_REQUEST_ACCEPTED. + /// If the connection is not successful, such as a rejected connection or no response then neither of these things will happen. + /// \pre Requires that you first call Initialize + /// \param[in] host Either a dotted IP address or a domain name + /// \param[in] remotePort Which port to connect to on the remote machine. + /// \param[in] passwordData A data block that must match the data block on the server passed to SetIncomingPassword. This can be a string or can be a stream of data. Use 0 for no password. + /// \param[in] passwordDataLength The length in bytes of passwordData + /// \param[in] publicKey The public key the server is using. If 0, the server is not using security. If non-zero, the publicKeyMode member determines how to connect + /// \param[in] connectionSocketIndex Index into the array of socket descriptors passed to socketDescriptors in RakPeer::Startup() to send on. + /// \param[in] sendConnectionAttemptCount How many datagrams to send to the other system to try to connect. + /// \param[in] timeBetweenSendConnectionAttemptsMS Time to elapse before a datagram is sent to the other system to try to connect. After sendConnectionAttemptCount number of attempts, ID_CONNECTION_ATTEMPT_FAILED is returned. Under low bandwidth conditions with multiple simultaneous outgoing connections, this value should be raised to 1000 or higher, or else the MTU detection can overrun the available bandwidth. + /// \param[in] timeoutTime How long to keep the connection alive before dropping it on unable to send a reliable message. 0 to use the default from SetTimeoutTime(UNASSIGNED_SYSTEM_ADDRESS); + /// \return CONNECTION_ATTEMPT_STARTED on successful initiation. Otherwise, an appropriate enumeration indicating failure. + /// \note CONNECTION_ATTEMPT_STARTED does not mean you are already connected! + /// \note It is possible to immediately get back ID_CONNECTION_ATTEMPT_FAILED if you exceed the maxConnections parameter passed to Startup(). This could happen if you call CloseConnection() with sendDisconnectionNotificaiton true, then immediately call Connect() before the connection has closed. + virtual ConnectionAttemptResult Connect( const char* host, unsigned short remotePort, const char *passwordData, int passwordDataLength, PublicKey *publicKey=0, unsigned connectionSocketIndex=0, unsigned sendConnectionAttemptCount=12, unsigned timeBetweenSendConnectionAttemptsMS=500, RakNet::TimeMS timeoutTime=0 )=0; + + /// \brief Connect to the specified host (ip or domain name) and server port, using a shared socket from another instance of RakNet + /// \param[in] host Either a dotted IP address or a domain name + /// \param[in] remotePort Which port to connect to on the remote machine. + /// \param[in] passwordData A data block that must match the data block on the server passed to SetIncomingPassword. This can be a string or can be a stream of data. Use 0 for no password. + /// \param[in] passwordDataLength The length in bytes of passwordData + /// \param[in] socket A bound socket returned by another instance of RakPeerInterface + /// \param[in] sendConnectionAttemptCount How many datagrams to send to the other system to try to connect. + /// \param[in] timeBetweenSendConnectionAttemptsMS Time to elapse before a datagram is sent to the other system to try to connect. After sendConnectionAttemptCount number of attempts, ID_CONNECTION_ATTEMPT_FAILED is returned. Under low bandwidth conditions with multiple simultaneous outgoing connections, this value should be raised to 1000 or higher, or else the MTU detection can overrun the available bandwidth. + /// \param[in] timeoutTime How long to keep the connection alive before dropping it on unable to send a reliable message. 0 to use the default from SetTimeoutTime(UNASSIGNED_SYSTEM_ADDRESS); + /// \return CONNECTION_ATTEMPT_STARTED on successful initiation. Otherwise, an appropriate enumeration indicating failure. + /// \note CONNECTION_ATTEMPT_STARTED does not mean you are already connected! + virtual ConnectionAttemptResult ConnectWithSocket(const char* host, unsigned short remotePort, const char *passwordData, int passwordDataLength, RakNetSmartPtr socket, PublicKey *publicKey=0, unsigned sendConnectionAttemptCount=12, unsigned timeBetweenSendConnectionAttemptsMS=500, RakNet::TimeMS timeoutTime=0)=0; + + /// \brief Connect to the specified network ID (Platform specific console function) + /// \details Does built-in NAt traversal + /// \param[in] passwordData A data block that must match the data block on the server passed to SetIncomingPassword. This can be a string or can be a stream of data. Use 0 for no password. + /// \param[in] passwordDataLength The length in bytes of passwordData + //virtual bool Console2LobbyConnect( void *networkServiceId, const char *passwordData, int passwordDataLength )=0; + + /// \brief Stops the network threads and closes all connections. + /// \param[in] blockDuration How long, in milliseconds, you should wait for all remaining messages to go out, including ID_DISCONNECTION_NOTIFICATION. If 0, it doesn't wait at all. + /// \param[in] orderingChannel If blockDuration > 0, ID_DISCONNECTION_NOTIFICATION will be sent on this channel + /// \param[in] disconnectionNotificationPriority Priority to send ID_DISCONNECTION_NOTIFICATION on. + /// If you set it to 0 then the disconnection notification won't be sent + virtual void Shutdown( unsigned int blockDuration, unsigned char orderingChannel=0, PacketPriority disconnectionNotificationPriority=LOW_PRIORITY )=0; + + /// Returns if the network thread is running + /// \return true if the network thread is running, false otherwise + virtual bool IsActive( void ) const=0; + + /// Fills the array remoteSystems with the SystemAddress of all the systems we are connected to + /// \param[out] remoteSystems An array of SystemAddress structures to be filled with the SystemAddresss of the systems we are connected to. Pass 0 to remoteSystems to only get the number of systems we are connected to + /// \param[in, out] numberOfSystems As input, the size of remoteSystems array. As output, the number of elements put into the array + virtual bool GetConnectionList( SystemAddress *remoteSystems, unsigned short *numberOfSystems ) const=0; + + /// Returns the next uint32_t that Send() will return + /// \note If using RakPeer from multiple threads, this may not be accurate for your thread. Use IncrementNextSendReceipt() in that case. + /// \return The next uint32_t that Send() or SendList will return + virtual uint32_t GetNextSendReceipt(void)=0; + + /// Returns the next uint32_t that Send() will return, and increments the value by one + /// \note If using RakPeer from multiple threads, pass this to forceReceipt in the send function + /// \return The next uint32_t that Send() or SendList will return + virtual uint32_t IncrementNextSendReceipt(void)=0; + + /// Sends a block of data to the specified system that you are connected to. + /// This function only works while the connected + /// The first byte should be a message identifier starting at ID_USER_PACKET_ENUM + /// \param[in] data The block of data to send + /// \param[in] length The size in bytes of the data to send + /// \param[in] priority What priority level to send on. See PacketPriority.h + /// \param[in] reliability How reliability to send this data. See PacketPriority.h + /// \param[in] orderingChannel When using ordered or sequenced messages, what channel to order these on. Messages are only ordered relative to other messages on the same stream + /// \param[in] systemIdentifier Who to send this packet to, or in the case of broadcasting who not to send it to. Pass either a SystemAddress structure or a RakNetGUID structure. Use UNASSIGNED_SYSTEM_ADDRESS or to specify none + /// \param[in] broadcast True to send this packet to all connected systems. If true, then systemAddress specifies who not to send the packet to. + /// \param[in] forceReceipt If 0, will automatically determine the receipt number to return. If non-zero, will return what you give it. + /// \return 0 on bad input. Otherwise a number that identifies this message. If \a reliability is a type that returns a receipt, on a later call to Receive() you will get ID_SND_RECEIPT_ACKED or ID_SND_RECEIPT_LOSS with bytes 1-4 inclusive containing this number + virtual uint32_t Send( const char *data, const int length, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast, uint32_t forceReceiptNumber=0 )=0; + + /// "Send" to yourself rather than a remote system. The message will be processed through the plugins and returned to the game as usual + /// This function works anytime + /// The first byte should be a message identifier starting at ID_USER_PACKET_ENUM + /// \param[in] data The block of data to send + /// \param[in] length The size in bytes of the data to send + virtual void SendLoopback( const char *data, const int length )=0; + + /// Sends a block of data to the specified system that you are connected to. Same as the above version, but takes a BitStream as input. + /// \param[in] bitStream The bitstream to send + /// \param[in] priority What priority level to send on. See PacketPriority.h + /// \param[in] reliability How reliability to send this data. See PacketPriority.h + /// \param[in] orderingChannel When using ordered or sequenced messages, what channel to order these on. Messages are only ordered relative to other messages on the same stream + /// \param[in] systemIdentifier Who to send this packet to, or in the case of broadcasting who not to send it to. Pass either a SystemAddress structure or a RakNetGUID structure. Use UNASSIGNED_SYSTEM_ADDRESS or to specify none + /// \param[in] broadcast True to send this packet to all connected systems. If true, then systemAddress specifies who not to send the packet to. + /// \param[in] forceReceipt If 0, will automatically determine the receipt number to return. If non-zero, will return what you give it. + /// \return 0 on bad input. Otherwise a number that identifies this message. If \a reliability is a type that returns a receipt, on a later call to Receive() you will get ID_SND_RECEIPT_ACKED or ID_SND_RECEIPT_LOSS with bytes 1-4 inclusive containing this number + /// \note COMMON MISTAKE: When writing the first byte, bitStream->Write((unsigned char) ID_MY_TYPE) be sure it is casted to a byte, and you are not writing a 4 byte enumeration. + virtual uint32_t Send( const RakNet::BitStream * bitStream, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast, uint32_t forceReceiptNumber=0 )=0; + + /// Sends multiple blocks of data, concatenating them automatically. + /// + /// This is equivalent to: + /// RakNet::BitStream bs; + /// bs.WriteAlignedBytes(block1, blockLength1); + /// bs.WriteAlignedBytes(block2, blockLength2); + /// bs.WriteAlignedBytes(block3, blockLength3); + /// Send(&bs, ...) + /// + /// This function only works while the connected + /// \param[in] data An array of pointers to blocks of data + /// \param[in] lengths An array of integers indicating the length of each block of data + /// \param[in] numParameters Length of the arrays data and lengths + /// \param[in] priority What priority level to send on. See PacketPriority.h + /// \param[in] reliability How reliability to send this data. See PacketPriority.h + /// \param[in] orderingChannel When using ordered or sequenced messages, what channel to order these on. Messages are only ordered relative to other messages on the same stream + /// \param[in] systemIdentifier Who to send this packet to, or in the case of broadcasting who not to send it to. Pass either a SystemAddress structure or a RakNetGUID structure. Use UNASSIGNED_SYSTEM_ADDRESS or to specify none + /// \param[in] broadcast True to send this packet to all connected systems. If true, then systemAddress specifies who not to send the packet to. + /// \param[in] forceReceipt If 0, will automatically determine the receipt number to return. If non-zero, will return what you give it. + /// \return 0 on bad input. Otherwise a number that identifies this message. If \a reliability is a type that returns a receipt, on a later call to Receive() you will get ID_SND_RECEIPT_ACKED or ID_SND_RECEIPT_LOSS with bytes 1-4 inclusive containing this number + virtual uint32_t SendList( const char **data, const int *lengths, const int numParameters, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast, uint32_t forceReceiptNumber=0 )=0; + + /// Gets a message from the incoming message queue. + /// Use DeallocatePacket() to deallocate the message after you are done with it. + /// User-thread functions, such as RPC calls and the plugin function PluginInterface::Update occur here. + /// \return 0 if no packets are waiting to be handled, otherwise a pointer to a packet. + /// \note COMMON MISTAKE: Be sure to call this in a loop, once per game tick, until it returns 0. If you only process one packet per game tick they will buffer up. + /// sa RakNetTypes.h contains struct Packet + virtual Packet* Receive( void )=0; + + /// Call this to deallocate a message returned by Receive() when you are done handling it. + /// \param[in] packet The message to deallocate. + virtual void DeallocatePacket( Packet *packet )=0; + + /// Return the total number of connections we are allowed + virtual unsigned short GetMaximumNumberOfPeers( void ) const=0; + + // -------------------------------------------------------------------------------------------- Connection Management Functions-------------------------------------------------------------------------------------------- + /// Close the connection to another host (if we initiated the connection it will disconnect, if they did it will kick them out). + /// \param[in] target Which system to close the connection to. + /// \param[in] sendDisconnectionNotification True to send ID_DISCONNECTION_NOTIFICATION to the recipient. False to close it silently. + /// \param[in] channel Which ordering channel to send the disconnection notification on, if any + /// \param[in] disconnectionNotificationPriority Priority to send ID_DISCONNECTION_NOTIFICATION on. + virtual void CloseConnection( const AddressOrGUID target, bool sendDisconnectionNotification, unsigned char orderingChannel=0, PacketPriority disconnectionNotificationPriority=LOW_PRIORITY )=0; + + /// Returns if a system is connected, disconnected, connecting in progress, or various other states + /// \param[in] systemIdentifier The system we are referring to + /// \note This locks a mutex, do not call too frequently during connection attempts or the attempt will take longer and possibly even timeout + /// \return What state the remote system is in + virtual ConnectionState GetConnectionState(const AddressOrGUID systemIdentifier)=0; + + /// Cancel a pending connection attempt + /// If we are already connected, the connection stays open + /// \param[in] target Which system to cancel + virtual void CancelConnectionAttempt( const SystemAddress target )=0; + + /// Given a systemAddress, returns an index from 0 to the maximum number of players allowed - 1. + /// \param[in] systemAddress The SystemAddress we are referring to + /// \return The index of this SystemAddress or -1 on system not found. + virtual int GetIndexFromSystemAddress( const SystemAddress systemAddress ) const=0; + + /// This function is only useful for looping through all systems + /// Given an index, will return a SystemAddress. + /// \param[in] index Index should range between 0 and the maximum number of players allowed - 1. + /// \return The SystemAddress + virtual SystemAddress GetSystemAddressFromIndex( int index )=0; + + /// Same as GetSystemAddressFromIndex but returns RakNetGUID + /// \param[in] index Index should range between 0 and the maximum number of players allowed - 1. + /// \return The RakNetGUID + virtual RakNetGUID GetGUIDFromIndex( int index )=0; + + /// Same as calling GetSystemAddressFromIndex and GetGUIDFromIndex for all systems, but more efficient + /// Indices match each other, so \a addresses[0] and \a guids[0] refer to the same system + /// \param[out] addresses All system addresses. Size of the list is the number of connections. Size of the list will match the size of the \a guids list. + /// \param[out] guids All guids. Size of the list is the number of connections. Size of the list will match the size of the \a addresses list. + virtual void GetSystemList(DataStructures::List &addresses, DataStructures::List &guids) const=0; + + /// Bans an IP from connecting. Banned IPs persist between connections but are not saved on shutdown nor loaded on startup. + /// param[in] IP Dotted IP address. Can use * as a wildcard, such as 128.0.0.* will ban all IP addresses starting with 128.0.0 + /// \param[in] milliseconds how many ms for a temporary ban. Use 0 for a permanent ban + virtual void AddToBanList( const char *IP, RakNet::TimeMS milliseconds=0 )=0; + + /// Allows a previously banned IP to connect. + /// param[in] Dotted IP address. Can use * as a wildcard, such as 128.0.0.* will banAll IP addresses starting with 128.0.0 + virtual void RemoveFromBanList( const char *IP )=0; + + /// Allows all previously banned IPs to connect. + virtual void ClearBanList( void )=0; + + /// Returns true or false indicating if a particular IP is banned. + /// \param[in] IP - Dotted IP address. + /// \return true if IP matches any IPs in the ban list, accounting for any wildcards. False otherwise. + virtual bool IsBanned( const char *IP )=0; + + /// Enable or disable allowing frequent connections from the same IP adderss + /// This is a security measure which is disabled by default, but can be set to true to prevent attackers from using up all connection slots + /// \param[in] b True to limit connections from the same ip to at most 1 per 100 milliseconds. + virtual void SetLimitIPConnectionFrequency(bool b)=0; + + // --------------------------------------------------------------------------------------------Pinging Functions - Functions dealing with the automatic ping mechanism-------------------------------------------------------------------------------------------- + /// Send a ping to the specified connected system. + /// \pre The sender and recipient must already be started via a successful call to Startup() + /// \param[in] target Which system to ping + virtual void Ping( const SystemAddress target )=0; + + /// Send a ping to the specified unconnected system. The remote system, if it is Initialized, will respond with ID_PONG followed by sizeof(RakNet::TimeMS) containing the system time the ping was sent.(Default is 4 bytes - See __GET_TIME_64BIT in RakNetTypes.h + /// System should reply with ID_PONG if it is active + /// \param[in] host Either a dotted IP address or a domain name. Can be 255.255.255.255 for LAN broadcast. + /// \param[in] remotePort Which port to connect to on the remote machine. + /// \param[in] onlyReplyOnAcceptingConnections Only request a reply if the remote system is accepting connections + /// \param[in] connectionSocketIndex Index into the array of socket descriptors passed to socketDescriptors in RakPeer::Startup() to send on. + /// \return true on success, false on failure (unknown hostname) + virtual bool Ping( const char* host, unsigned short remotePort, bool onlyReplyOnAcceptingConnections, unsigned connectionSocketIndex=0 )=0; + + /// Returns the average of all ping times read for the specific system or -1 if none read yet + /// \param[in] systemAddress Which system we are referring to + /// \return The ping time for this system, or -1 + virtual int GetAveragePing( const AddressOrGUID systemIdentifier )=0; + + /// Returns the last ping time read for the specific system or -1 if none read yet + /// \param[in] systemAddress Which system we are referring to + /// \return The last ping time for this system, or -1 + virtual int GetLastPing( const AddressOrGUID systemIdentifier ) const=0; + + /// Returns the lowest ping time read or -1 if none read yet + /// \param[in] systemAddress Which system we are referring to + /// \return The lowest ping time for this system, or -1 + virtual int GetLowestPing( const AddressOrGUID systemIdentifier ) const=0; + + /// Ping the remote systems every so often, or not. Can be called anytime. + /// By default this is true. Recommended to leave on, because congestion control uses it to determine how often to resend lost packets. + /// It would be true by default to prevent timestamp drift, since in the event of a clock spike, the timestamp deltas would no longer be accurate + /// \param[in] doPing True to start occasional pings. False to stop them. + virtual void SetOccasionalPing( bool doPing )=0; + + // --------------------------------------------------------------------------------------------Static Data Functions - Functions dealing with API defined synchronized memory-------------------------------------------------------------------------------------------- + /// Sets the data to send along with a LAN server discovery or offline ping reply. + /// \a length should be under 400 bytes, as a security measure against flood attacks + /// \param[in] data a block of data to store, or 0 for none + /// \param[in] length The length of data in bytes, or 0 for none + /// \sa Ping.cpp + virtual void SetOfflinePingResponse( const char *data, const unsigned int length )=0; + + /// Returns pointers to a copy of the data passed to SetOfflinePingResponse + /// \param[out] data A pointer to a copy of the data passed to \a SetOfflinePingResponse() + /// \param[out] length A pointer filled in with the length parameter passed to SetOfflinePingResponse() + /// \sa SetOfflinePingResponse + virtual void GetOfflinePingResponse( char **data, unsigned int *length )=0; + + //--------------------------------------------------------------------------------------------Network Functions - Functions dealing with the network in general-------------------------------------------------------------------------------------------- + /// Return the unique address identifier that represents you or another system on the the network and is based on your local IP / port. + /// \note Not supported by the XBOX + /// \param[in] systemAddress Use UNASSIGNED_SYSTEM_ADDRESS to get your behind-LAN address. Use a connected system to get their behind-LAN address + /// \param[in] index When you have multiple internal IDs, which index to return? Currently limited to MAXIMUM_NUMBER_OF_INTERNAL_IDS (so the maximum value of this variable is MAXIMUM_NUMBER_OF_INTERNAL_IDS-1) + /// \return the identifier of your system internally, which may not be how other systems see if you if you are behind a NAT or proxy + virtual SystemAddress GetInternalID( const SystemAddress systemAddress=UNASSIGNED_SYSTEM_ADDRESS, const int index=0 ) const=0; + + /// Return the unique address identifier that represents you on the the network and is based on your externalIP / port + /// (the IP / port the specified player uses to communicate with you) + /// \param[in] target Which remote system you are referring to for your external ID. Usually the same for all systems, unless you have two or more network cards. + virtual SystemAddress GetExternalID( const SystemAddress target ) const=0; + + /// Return my own GUID + virtual const RakNetGUID GetMyGUID(void) const=0; + + /// Return the address bound to a socket at the specified index + virtual SystemAddress GetMyBoundAddress(const int socketIndex=0)=0; + + /// Get a random number (to generate a GUID) + static uint64_t Get64BitUniqueRandomNumber(void); + + /// Given a connected system, give us the unique GUID representing that instance of RakPeer. + /// This will be the same on all systems connected to that instance of RakPeer, even if the external system addresses are different + /// Currently O(log(n)), but this may be improved in the future. If you use this frequently, you may want to cache the value as it won't change. + /// Returns UNASSIGNED_RAKNET_GUID if system address can't be found. + /// If \a input is UNASSIGNED_SYSTEM_ADDRESS, will return your own GUID + /// \pre Call Startup() first, or the function will return UNASSIGNED_RAKNET_GUID + /// \param[in] input The system address of the system we are connected to + virtual const RakNetGUID& GetGuidFromSystemAddress( const SystemAddress input ) const=0; + + /// Given the GUID of a connected system, give us the system address of that system. + /// The GUID will be the same on all systems connected to that instance of RakPeer, even if the external system addresses are different + /// Currently O(log(n)), but this may be improved in the future. If you use this frequently, you may want to cache the value as it won't change. + /// If \a input is UNASSIGNED_RAKNET_GUID, will return UNASSIGNED_SYSTEM_ADDRESS + /// \param[in] input The RakNetGUID of the system we are checking to see if we are connected to + virtual SystemAddress GetSystemAddressFromGuid( const RakNetGUID input ) const=0; + + /// Given the SystemAddress of a connected system, get the public key they provided as an identity + /// Returns false if system address was not found or client public key is not known + /// \param[in] input The RakNetGUID of the system + /// \param[in] client_public_key The connected client's public key is copied to this address. Buffer must be cat::EasyHandshake::PUBLIC_KEY_BYTES bytes in length. + virtual bool GetClientPublicKeyFromSystemAddress( const SystemAddress input, char *client_public_key ) const=0; + + /// Set the time, in MS, to use before considering ourselves disconnected after not being able to deliver a reliable message. + /// Default time is 10,000 or 10 seconds in release and 30,000 or 30 seconds in debug. + /// Do not set different values for different computers that are connected to each other, or you won't be able to reconnect after ID_CONNECTION_LOST + /// \param[in] timeMS Time, in MS + /// \param[in] target Which system to do this for. Pass UNASSIGNED_SYSTEM_ADDRESS for all systems. + virtual void SetTimeoutTime( RakNet::TimeMS timeMS, const SystemAddress target )=0; + + /// \param[in] target Which system to do this for. Pass UNASSIGNED_SYSTEM_ADDRESS to get the default value + /// \return timeoutTime for a given system. + virtual RakNet::TimeMS GetTimeoutTime( const SystemAddress target )=0; + + /// Returns the current MTU size + /// \param[in] target Which system to get this for. UNASSIGNED_SYSTEM_ADDRESS to get the default + /// \return The current MTU size + virtual int GetMTUSize( const SystemAddress target ) const=0; + + /// Returns the number of IP addresses this system has internally. Get the actual addresses from GetLocalIP() + virtual unsigned GetNumberOfAddresses( void )=0; + + /// Returns an IP address at index 0 to GetNumberOfAddresses-1 + /// \param[in] index index into the list of IP addresses + /// \return The local IP address at this index + virtual const char* GetLocalIP( unsigned int index )=0; + + /// Is this a local IP? + /// \param[in] An IP address to check, excluding the port + /// \return True if this is one of the IP addresses returned by GetLocalIP + virtual bool IsLocalIP( const char *ip )=0; + + /// Allow or disallow connection responses from any IP. Normally this should be false, but may be necessary + /// when connecting to servers with multiple IP addresses. + /// \param[in] allow - True to allow this behavior, false to not allow. Defaults to false. Value persists between connections + virtual void AllowConnectionResponseIPMigration( bool allow )=0; + + /// Sends a one byte message ID_ADVERTISE_SYSTEM to the remote unconnected system. + /// This will tell the remote system our external IP outside the LAN along with some user data. + /// \pre The sender and recipient must already be started via a successful call to Initialize + /// \param[in] host Either a dotted IP address or a domain name + /// \param[in] remotePort Which port to connect to on the remote machine. + /// \param[in] data Optional data to append to the packet. + /// \param[in] dataLength length of data in bytes. Use 0 if no data. + /// \param[in] connectionSocketIndex Index into the array of socket descriptors passed to socketDescriptors in RakPeer::Startup() to send on. + /// \return false if IsActive()==false or the host is unresolvable. True otherwise + virtual bool AdvertiseSystem( const char *host, unsigned short remotePort, const char *data, int dataLength, unsigned connectionSocketIndex=0 )=0; + + /// Controls how often to return ID_DOWNLOAD_PROGRESS for large message downloads. + /// ID_DOWNLOAD_PROGRESS is returned to indicate a new partial message chunk, roughly the MTU size, has arrived + /// As it can be slow or cumbersome to get this notification for every chunk, you can set the interval at which it is returned. + /// Defaults to 0 (never return this notification) + /// \param[in] interval How many messages to use as an interval + virtual void SetSplitMessageProgressInterval(int interval)=0; + + /// Returns what was passed to SetSplitMessageProgressInterval() + /// \return What was passed to SetSplitMessageProgressInterval(). Default to 0. + virtual int GetSplitMessageProgressInterval(void) const=0; + + /// Set how long to wait before giving up on sending an unreliable message + /// Useful if the network is clogged up. + /// Set to 0 or less to never timeout. Defaults to 0. + /// \param[in] timeoutMS How many ms to wait before simply not sending an unreliable message. + virtual void SetUnreliableTimeout(RakNet::TimeMS timeoutMS)=0; + + /// Send a message to host, with the IP socket option TTL set to 3 + /// This message will not reach the host, but will open the router. + /// Used for NAT-Punchthrough + virtual void SendTTL( const char* host, unsigned short remotePort, int ttl, unsigned connectionSocketIndex=0 )=0; + + // -------------------------------------------------------------------------------------------- Plugin Functions-------------------------------------------------------------------------------------------- + /// \brief Attaches a Plugin interface to an instance of the base class (RakPeer or PacketizedTCP) to run code automatically on message receipt in the Receive call. + /// If the plugin returns false from PluginInterface::UsesReliabilityLayer(), which is the case for all plugins except PacketLogger, you can call AttachPlugin() and DetachPlugin() for this plugin while RakPeer is active. + /// \param[in] messageHandler Pointer to the plugin to attach. + virtual void AttachPlugin( PluginInterface2 *plugin )=0; + + /// \brief Detaches a Plugin interface from the instance of the base class (RakPeer or PacketizedTCP) it is attached to. + /// \details This method disables the plugin code from running automatically on base class's updates or message receipt. + /// If the plugin returns false from PluginInterface::UsesReliabilityLayer(), which is the case for all plugins except PacketLogger, you can call AttachPlugin() and DetachPlugin() for this plugin while RakPeer is active. + /// \param[in] messageHandler Pointer to a plugin to detach. + virtual void DetachPlugin( PluginInterface2 *messageHandler )=0; + + // --------------------------------------------------------------------------------------------Miscellaneous Functions-------------------------------------------------------------------------------------------- + /// Put a message back at the end of the receive queue in case you don't want to deal with it immediately + /// \param[in] packet The packet you want to push back. + /// \param[in] pushAtHead True to push the packet so that the next receive call returns it. False to push it at the end of the queue (obviously pushing it at the end makes the packets out of order) + virtual void PushBackPacket( Packet *packet, bool pushAtHead )=0; + + /// \internal + /// \brief For a given system identified by \a guid, change the SystemAddress to send to. + /// \param[in] guid The connection we are referring to + /// \param[in] systemAddress The new address to send to + virtual void ChangeSystemAddress(RakNetGUID guid, const SystemAddress &systemAddress)=0; + + /// \returns a packet for you to write to if you want to create a Packet for some reason. + /// You can add it to the receive buffer with PushBackPacket + /// \param[in] dataSize How many bytes to allocate for the buffer + /// \return A packet you can write to + virtual Packet* AllocatePacket(unsigned dataSize)=0; + + /// Get the socket used with a particular active connection + /// The smart pointer reference counts the RakNetSocket object, so the socket will remain active as long as the smart pointer does, even if RakNet were to shutdown or close the connection. + /// \note This sends a query to the thread and blocks on the return value for up to one second. In practice it should only take a millisecond or so. + /// \param[in] target Which system + /// \return A smart pointer object containing the socket information about the socket. Be sure to check IsNull() which is returned if the update thread is unresponsive, shutting down, or if this system is not connected + virtual RakNetSmartPtr GetSocket( const SystemAddress target )=0; + + /// Get all sockets in use + /// \note This sends a query to the thread and blocks on the return value for up to one second. In practice it should only take a millisecond or so. + /// \param[out] sockets List of RakNetSocket structures in use. Sockets will not be closed until \a sockets goes out of scope + virtual void GetSockets( DataStructures::List > &sockets )=0; + virtual void ReleaseSockets( DataStructures::List > &sockets )=0; + + virtual void WriteOutOfBandHeader(RakNet::BitStream *bitStream)=0; + + /// If you need code to run in the same thread as RakNet's update thread, this function can be used for that + /// \param[in] _userUpdateThreadPtr C callback function + /// \param[in] _userUpdateThreadData Passed to C callback function + virtual void SetUserUpdateThread(void (*_userUpdateThreadPtr)(RakPeerInterface *, void *), void *_userUpdateThreadData)=0; + + // --------------------------------------------------------------------------------------------Network Simulator Functions-------------------------------------------------------------------------------------------- + /// Adds simulated ping and packet loss to the outgoing data flow. + /// To simulate bi-directional ping and packet loss, you should call this on both the sender and the recipient, with half the total ping and packetloss value on each. + /// You can exclude network simulator code with the _RELEASE #define to decrease code size + /// \deprecated Use http://www.jenkinssoftware.com/forum/index.php?topic=1671.0 instead. + /// \note Doesn't work past version 3.6201 + /// \param[in] packetloss Chance to lose a packet. Ranges from 0 to 1. + /// \param[in] minExtraPing The minimum time to delay sends. + /// \param[in] extraPingVariance The additional random time to delay sends. + virtual void ApplyNetworkSimulator( float packetloss, unsigned short minExtraPing, unsigned short extraPingVariance)=0; + + /// Limits how much outgoing bandwidth can be sent per-connection. + /// This limit does not apply to the sum of all connections! + /// Exceeding the limit queues up outgoing traffic + /// \param[in] maxBitsPerSecond Maximum bits per second to send. Use 0 for unlimited (default). Once set, it takes effect immedately and persists until called again. + virtual void SetPerConnectionOutgoingBandwidthLimit( unsigned maxBitsPerSecond )=0; + + /// Returns if you previously called ApplyNetworkSimulator + /// \return If you previously called ApplyNetworkSimulator + virtual bool IsNetworkSimulatorActive( void )=0; + + // --------------------------------------------------------------------------------------------Statistical Functions - Functions dealing with API performance-------------------------------------------------------------------------------------------- + + /// Returns a structure containing a large set of network statistics for the specified system. + /// You can map this data to a string using the C style StatisticsToString() function + /// \param[in] systemAddress: Which connected system to get statistics for + /// \param[in] rns If you supply this structure, it will be written to it. Otherwise it will use a static struct, which is not threadsafe + /// \return 0 on can't find the specified system. A pointer to a set of data otherwise. + /// \sa RakNetStatistics.h + virtual RakNetStatistics * GetStatistics( const SystemAddress systemAddress, RakNetStatistics *rns=0 )=0; + virtual bool GetStatistics( const int index, RakNetStatistics *rns )=0; + + /// \Returns how many messages are waiting when you call Receive() + virtual unsigned int GetReceiveBufferSize(void)=0; + + // --------------------------------------------------------------------------------------------EVERYTHING AFTER THIS COMMENT IS FOR INTERNAL USE ONLY-------------------------------------------------------------------------------------------- + + /// \internal + virtual bool SendOutOfBand(const char *host, unsigned short remotePort, const char *data, BitSize_t dataLength, unsigned connectionSocketIndex=0 )=0; + + int errorState; +} +// #if defined(SN_TARGET_PSP2) +// __attribute__((aligned(8))) +// #endif +; + +} // namespace RakNet + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakSleep.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakSleep.cpp new file mode 100644 index 0000000..cf43a4d --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakSleep.cpp @@ -0,0 +1,53 @@ + + +#if defined(_WIN32) +#include "WindowsIncludes.h" // Sleep + + + + + +#else +#include +#include +#include +#endif + +#include "RakSleep.h" + +void RakSleep(unsigned int ms) +{ +#ifdef _WIN32 + Sleep(ms); + + + + + +#else + //Single thread sleep code thanks to Furquan Shaikh, http://somethingswhichidintknow.blogspot.com/2009/09/sleep-in-pthread.html + //Modified slightly from the original + pthread_mutex_t fakeMutex = PTHREAD_MUTEX_INITIALIZER; + pthread_cond_t fakeCond = PTHREAD_COND_INITIALIZER; + struct timespec timeToWait; + struct timeval now; + int rt; + + gettimeofday(&now,NULL); + + long seconds = ms/1000; + long nanoseconds = (ms - seconds * 1000) * 1000000; + timeToWait.tv_sec = now.tv_sec + seconds; + timeToWait.tv_nsec = now.tv_usec*1000 + nanoseconds; + + if (timeToWait.tv_nsec >= 1000000000) + { + timeToWait.tv_nsec -= 1000000000; + timeToWait.tv_sec++; + } + + pthread_mutex_lock(&fakeMutex); + rt = pthread_cond_timedwait(&fakeCond, &fakeMutex, &timeToWait); + pthread_mutex_unlock(&fakeMutex); +#endif +} diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakSleep.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakSleep.h new file mode 100644 index 0000000..27936bf --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakSleep.h @@ -0,0 +1,8 @@ +#ifndef __RAK_SLEEP_H +#define __RAK_SLEEP_H + +#include "Export.h" + +void RAK_DLL_EXPORT RakSleep(unsigned int ms); + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakString.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakString.cpp new file mode 100644 index 0000000..9c54eca --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakString.cpp @@ -0,0 +1,1422 @@ +#include "RakString.h" +#include "RakAssert.h" +#include "RakMemoryOverride.h" +#include "BitStream.h" +#include +#include +#include "LinuxStrings.h" +#include "StringCompressor.h" +#include "SimpleMutex.h" + +using namespace RakNet; + +//DataStructures::MemoryPool RakString::pool; +RakString::SharedString RakString::emptyString={0,0,0,(char*) "",(char*) ""}; +//RakString::SharedString *RakString::sharedStringFreeList=0; +//unsigned int RakString::sharedStringFreeListAllocationCount=0; +DataStructures::List RakString::freeList; + +class RakStringCleanup +{ +public: + ~RakStringCleanup() + { + RakNet::RakString::FreeMemoryNoMutex(); + } +}; + +static RakStringCleanup cleanup; + +SimpleMutex& GetPoolMutex(void) +{ + static SimpleMutex poolMutex; + return poolMutex; +} + +int RakNet::RakString::RakStringComp( RakString const &key, RakString const &data ) +{ + return key.StrCmp(data); +} + +RakString::RakString() +{ + sharedString=&emptyString; +} +RakString::RakString( RakString::SharedString *_sharedString ) +{ + sharedString=_sharedString; +} +RakString::RakString(char input) +{ + char str[2]; + str[0]=input; + str[1]=0; + Assign(str); +} +RakString::RakString(unsigned char input) +{ + char str[2]; + str[0]=(char) input; + str[1]=0; + Assign(str); +} +RakString::RakString(const unsigned char *format, ...){ + va_list ap; + va_start(ap, format); + Assign((const char*) format,ap); +} +RakString::RakString(const char *format, ...){ + va_list ap; + va_start(ap, format); + Assign(format,ap); +} +RakString::RakString( const RakString & rhs) +{ + if (rhs.sharedString==&emptyString) + { + sharedString=&emptyString; + return; + } + + rhs.sharedString->refCountMutex->Lock(); + if (rhs.sharedString->refCount==0) + { + sharedString=&emptyString; + } + else + { + rhs.sharedString->refCount++; + sharedString=rhs.sharedString; + } + rhs.sharedString->refCountMutex->Unlock(); +} +RakString::~RakString() +{ + Free(); +} +RakString& RakString::operator = ( const RakString& rhs ) +{ + Free(); + if (rhs.sharedString==&emptyString) + return *this; + + rhs.sharedString->refCountMutex->Lock(); + if (rhs.sharedString->refCount==0) + { + sharedString=&emptyString; + } + else + { + sharedString=rhs.sharedString; + sharedString->refCount++; + } + rhs.sharedString->refCountMutex->Unlock(); + return *this; +} +RakString& RakString::operator = ( const char *str ) +{ + Free(); + Assign(str); + return *this; +} +RakString& RakString::operator = ( char *str ) +{ + return operator = ((const char*)str); +} +RakString& RakString::operator = ( const unsigned char *str ) +{ + return operator = ((const char*)str); +} +RakString& RakString::operator = ( char unsigned *str ) +{ + return operator = ((const char*)str); +} +RakString& RakString::operator = ( const char c ) +{ + char buff[2]; + buff[0]=c; + buff[1]=0; + return operator = ((const char*)buff); +} +void RakString::Realloc(SharedString *sharedString, size_t bytes) +{ + if (bytes<=sharedString->bytesUsed) + return; + RakAssert(bytes>0); + size_t oldBytes = sharedString->bytesUsed; + size_t newBytes; + const size_t smallStringSize = 128-sizeof(unsigned int)-sizeof(size_t)-sizeof(char*)*2; + newBytes = GetSizeToAllocate(bytes); + if (oldBytes <=(size_t) smallStringSize && newBytes > (size_t) smallStringSize) + { + sharedString->bigString=(char*) rakMalloc_Ex(newBytes, _FILE_AND_LINE_); + strcpy(sharedString->bigString, sharedString->smallString); + sharedString->c_str=sharedString->bigString; + } + else if (oldBytes > smallStringSize) + { + sharedString->bigString=(char*) rakRealloc_Ex(sharedString->bigString,newBytes, _FILE_AND_LINE_); + sharedString->c_str=sharedString->bigString; + } + sharedString->bytesUsed=newBytes; +} +RakString& RakString::operator +=( const RakString& rhs) +{ + if (rhs.IsEmpty()) + return *this; + + if (IsEmpty()) + { + return operator=(rhs); + } + else + { + Clone(); + size_t strLen=rhs.GetLength()+GetLength()+1; + Realloc(sharedString, strLen+GetLength()); + strcat(sharedString->c_str,rhs.C_String()); + } + return *this; +} +RakString& RakString::operator +=( const char *str ) +{ + if (str==0 || str[0]==0) + return *this; + + if (IsEmpty()) + { + Assign(str); + } + else + { + Clone(); + size_t strLen=strlen(str)+GetLength()+1; + Realloc(sharedString, strLen); + strcat(sharedString->c_str,str); + } + return *this; +} +RakString& RakString::operator +=( char *str ) +{ + return operator += ((const char*)str); +} +RakString& RakString::operator +=( const unsigned char *str ) +{ + return operator += ((const char*)str); +} +RakString& RakString::operator +=( unsigned char *str ) +{ + return operator += ((const char*)str); +} +RakString& RakString::operator +=( const char c ) +{ + char buff[2]; + buff[0]=c; + buff[1]=0; + return operator += ((const char*)buff); +} +unsigned char RakString::operator[] ( const unsigned int position ) const +{ + RakAssert(positionc_str[position]; +} +bool RakString::operator==(const RakString &rhs) const +{ + return strcmp(sharedString->c_str,rhs.sharedString->c_str)==0; +} +bool RakString::operator==(const char *str) const +{ + return strcmp(sharedString->c_str,str)==0; +} +bool RakString::operator==(char *str) const +{ + return strcmp(sharedString->c_str,str)==0; +} +bool RakString::operator < ( const RakString& right ) const +{ + return strcmp(sharedString->c_str,right.C_String()) < 0; +} +bool RakString::operator <= ( const RakString& right ) const +{ + return strcmp(sharedString->c_str,right.C_String()) <= 0; +} +bool RakString::operator > ( const RakString& right ) const +{ + return strcmp(sharedString->c_str,right.C_String()) > 0; +} +bool RakString::operator >= ( const RakString& right ) const +{ + return strcmp(sharedString->c_str,right.C_String()) >= 0; +} +bool RakString::operator!=(const RakString &rhs) const +{ + return strcmp(sharedString->c_str,rhs.sharedString->c_str)!=0; +} +bool RakString::operator!=(const char *str) const +{ + return strcmp(sharedString->c_str,str)!=0; +} +bool RakString::operator!=(char *str) const +{ + return strcmp(sharedString->c_str,str)!=0; +} +const RakNet::RakString operator+(const RakNet::RakString &lhs, const RakNet::RakString &rhs) +{ + if (lhs.IsEmpty() && rhs.IsEmpty()) + { + return RakString(&RakString::emptyString); + } + if (lhs.IsEmpty()) + { + rhs.sharedString->refCountMutex->Lock(); + if (rhs.sharedString->refCount==0) + { + rhs.sharedString->refCountMutex->Unlock(); + lhs.sharedString->refCountMutex->Lock(); + lhs.sharedString->refCount++; + lhs.sharedString->refCountMutex->Unlock(); + return RakString(lhs.sharedString); + } + else + { + rhs.sharedString->refCount++; + rhs.sharedString->refCountMutex->Unlock(); + return RakString(rhs.sharedString); + } + // rhs.sharedString->refCountMutex->Unlock(); + } + if (rhs.IsEmpty()) + { + lhs.sharedString->refCountMutex->Lock(); + lhs.sharedString->refCount++; + lhs.sharedString->refCountMutex->Unlock(); + return RakString(lhs.sharedString); + } + + size_t len1 = lhs.GetLength(); + size_t len2 = rhs.GetLength(); + size_t allocatedBytes = len1 + len2 + 1; + allocatedBytes = RakString::GetSizeToAllocate(allocatedBytes); + RakString::SharedString *sharedString; + + RakString::LockMutex(); + // sharedString = RakString::pool.Allocate( _FILE_AND_LINE_ ); + if (RakString::freeList.Size()==0) + { + //RakString::sharedStringFreeList=(RakString::SharedString*) rakRealloc_Ex(RakString::sharedStringFreeList,(RakString::sharedStringFreeListAllocationCount+1024)*sizeof(RakString::SharedString), _FILE_AND_LINE_); + unsigned i; + for (i=0; i < 128; i++) + { + // RakString::freeList.Insert(RakString::sharedStringFreeList+i+RakString::sharedStringFreeListAllocationCount); + RakString::SharedString *ss; + ss = (RakString::SharedString*) rakMalloc_Ex(sizeof(RakString::SharedString), _FILE_AND_LINE_); + ss->refCountMutex=RakNet::OP_NEW(_FILE_AND_LINE_); + RakString::freeList.Insert(ss, _FILE_AND_LINE_); + + } + //RakString::sharedStringFreeListAllocationCount+=1024; + } + sharedString = RakString::freeList[RakString::freeList.Size()-1]; + RakString::freeList.RemoveAtIndex(RakString::freeList.Size()-1); + RakString::UnlockMutex(); + + const int smallStringSize = 128-sizeof(unsigned int)-sizeof(size_t)-sizeof(char*)*2; + sharedString->bytesUsed=allocatedBytes; + sharedString->refCount=1; + if (allocatedBytes <= (size_t) smallStringSize) + { + sharedString->c_str=sharedString->smallString; + } + else + { + sharedString->bigString=(char*)rakMalloc_Ex(sharedString->bytesUsed, _FILE_AND_LINE_); + sharedString->c_str=sharedString->bigString; + } + + strcpy(sharedString->c_str, lhs); + strcat(sharedString->c_str, rhs); + + return RakString(sharedString); +} +const char * RakString::ToLower(void) +{ + Clone(); + + size_t strLen = strlen(sharedString->c_str); + unsigned i; + for (i=0; i < strLen; i++) + sharedString->c_str[i]=ToLower(sharedString->c_str[i]); + return sharedString->c_str; +} +const char * RakString::ToUpper(void) +{ + Clone(); + + size_t strLen = strlen(sharedString->c_str); + unsigned i; + for (i=0; i < strLen; i++) + sharedString->c_str[i]=ToUpper(sharedString->c_str[i]); + return sharedString->c_str; +} +void RakString::Set(const char *format, ...) +{ + va_list ap; + va_start(ap, format); + Clear(); + Assign(format,ap); +} +bool RakString::IsEmpty(void) const +{ + return sharedString==&emptyString; +} +size_t RakString::GetLength(void) const +{ + return strlen(sharedString->c_str); +} +// http://porg.es/blog/counting-characters-in-utf-8-strings-is-faster +int porges_strlen2(char *s) +{ + int i = 0; + int iBefore = 0; + int count = 0; + + while (s[i] > 0) +ascii: i++; + + count += i-iBefore; + while (s[i]) + { + if (s[i] > 0) + { + iBefore = i; + goto ascii; + } + else + switch (0xF0 & s[i]) + { + case 0xE0: i += 3; break; + case 0xF0: i += 4; break; + default: i += 2; break; + } + ++count; + } + return count; +} +size_t RakString::GetLengthUTF8(void) const +{ + return porges_strlen2(sharedString->c_str); +} +void RakString::Replace(unsigned index, unsigned count, unsigned char c) +{ + RakAssert(index+count < GetLength()); + Clone(); + unsigned countIndex=0; + while (countIndexc_str[index]=c; + index++; + countIndex++; + } +} +void RakString::SetChar( unsigned index, unsigned char c ) +{ + RakAssert(index < GetLength()); + Clone(); + sharedString->c_str[index]=c; +} +void RakString::SetChar( unsigned index, RakNet::RakString s ) +{ + RakAssert(index < GetLength()); + Clone(); + RakNet::RakString firstHalf = SubStr(0, index); + RakNet::RakString secondHalf = SubStr(index+1, (unsigned int)-1); + *this = firstHalf; + *this += s; + *this += secondHalf; +} + +#ifdef _WIN32 +WCHAR * RakString::ToWideChar(void) +{ + // + // Special case of NULL or empty input string + // + if ( (sharedString->c_str == NULL) || (*sharedString->c_str == '\0') ) + { + // Return empty string + return L""; + } + + // + // Get size of destination UTF-16 buffer, in WCHAR's + // + int cchUTF16 = ::MultiByteToWideChar( + CP_UTF8, // convert from UTF-8 + 0, // Flags + sharedString->c_str, // source UTF-8 string + GetLength()+1, // total length of source UTF-8 string, + // in CHAR's (= bytes), including end-of-string \0 + NULL, // unused - no conversion done in this step + 0 // request size of destination buffer, in WCHAR's + ); + + if ( cchUTF16 == 0 ) + { + RakAssert("RakString::ToWideChar exception from cchUTF16==0" && 0); + return 0; + } + + // + // Allocate destination buffer to store UTF-16 string + // + WCHAR * pszUTF16 = RakNet::OP_NEW_ARRAY(cchUTF16,__FILE__,__LINE__); + + // + // Do the conversion from UTF-8 to UTF-16 + // + int result = ::MultiByteToWideChar( + CP_UTF8, // convert from UTF-8 + 0, // Buffer + sharedString->c_str, // source UTF-8 string + GetLength()+1, // total length of source UTF-8 string, + // in CHAR's (= bytes), including end-of-string \0 + pszUTF16, // destination buffer + cchUTF16 // size of destination buffer, in WCHAR's + ); + + if ( result == 0 ) + { + RakAssert("RakString::ToWideChar exception from MultiByteToWideChar" && 0); + return 0; + } + + return pszUTF16; +} +void RakString::DeallocWideChar(WCHAR * w) +{ + RakNet::OP_DELETE_ARRAY(w,__FILE__,__LINE__); +} +#endif + +size_t RakString::Find(const char *stringToFind,size_t pos) +{ + size_t len=GetLength(); + if (pos>=len || stringToFind==0 || stringToFind[0]==0) + { + return (size_t) -1; + } + size_t matchLen= strlen(stringToFind); + size_t matchPos=0; + size_t iStart=0; + + for (size_t i=pos;ic_str[i]) + { + if(matchPos==0) + { + iStart=i; + } + matchPos++; + } + else + { + matchPos=0; + } + + if (matchPos>=matchLen) + { + return iStart; + } + } + + return (size_t) -1; +} + +void RakString::TruncateUTF8(unsigned int length) +{ + int i = 0; + unsigned int count = 0; + + while (sharedString->c_str[i]!=0) + { + if (count==length) + { + sharedString->c_str[i]=0; + return; + } + else if (sharedString->c_str[i]>0) + { + i++; + } + else + { + switch (0xF0 & sharedString->c_str[i]) + { + case 0xE0: i += 3; break; + case 0xF0: i += 4; break; + default: i += 2; break; + } + } + + count++; + } +} + +void RakString::Truncate(unsigned int length) +{ + if (length < GetLength()) + { + SetChar(length, 0); + } +} + +RakString RakString::SubStr(unsigned int index, unsigned int count) const +{ + size_t length = GetLength(); + if (index >= length || count==0) + return RakString(); + RakString copy; + size_t numBytes = length-index; + if (count < numBytes) + numBytes=count; + copy.Allocate(numBytes+1); + size_t i; + for (i=0; i < numBytes; i++) + copy.sharedString->c_str[i]=sharedString->c_str[index+i]; + copy.sharedString->c_str[i]=0; + return copy; +} +void RakString::Erase(unsigned int index, unsigned int count) +{ + size_t len = GetLength(); + RakAssert(index+count <= len); + + Clone(); + unsigned i; + for (i=index; i < len-count; i++) + { + sharedString->c_str[i]=sharedString->c_str[i+count]; + } + sharedString->c_str[i]=0; +} +void RakString::TerminateAtLastCharacter(char c) +{ + int i, len=(int) GetLength(); + for (i=len-1; i >= 0; i--) + { + if (sharedString->c_str[i]==c) + { + Clone(); + sharedString->c_str[i]=0; + return; + } + } +} +void RakString::TerminateAtFirstCharacter(char c) +{ + unsigned int i, len=(unsigned int) GetLength(); + for (i=0; i < len; i++) + { + if (sharedString->c_str[i]==c) + { + Clone(); + sharedString->c_str[i]=0; + return; + } + } +} +void RakString::RemoveCharacter(char c) +{ + if (c==0) + return; + + unsigned int readIndex, writeIndex=0; + for (readIndex=0; sharedString->c_str[readIndex]; readIndex++) + { + if (sharedString->c_str[readIndex]!=c) + sharedString->c_str[writeIndex++]=sharedString->c_str[readIndex]; + else + Clone(); + } + sharedString->c_str[writeIndex]=0; +} +int RakString::StrCmp(const RakString &rhs) const +{ + return strcmp(sharedString->c_str, rhs); +} +int RakString::StrICmp(const RakString &rhs) const +{ + return _stricmp(sharedString->c_str, rhs); +} +void RakString::Printf(void) +{ + RAKNET_DEBUG_PRINTF("%s", sharedString->c_str); +} +void RakString::FPrintf(FILE *fp) +{ + fprintf(fp,"%s", sharedString->c_str); +} +bool RakString::IPAddressMatch(const char *IP) +{ + unsigned characterIndex; + + if ( IP == 0 || IP[ 0 ] == 0 || strlen( IP ) > 15 ) + return false; + + characterIndex = 0; + +#ifdef _MSC_VER +#pragma warning( disable : 4127 ) // warning C4127: conditional expression is constant +#endif + while ( true ) + { + if (sharedString->c_str[ characterIndex ] == IP[ characterIndex ] ) + { + // Equal characters + if ( IP[ characterIndex ] == 0 ) + { + // End of the string and the strings match + + return true; + } + + characterIndex++; + } + + else + { + if ( sharedString->c_str[ characterIndex ] == 0 || IP[ characterIndex ] == 0 ) + { + // End of one of the strings + break; + } + + // Characters do not match + if ( sharedString->c_str[ characterIndex ] == '*' ) + { + // Domain is banned. + return true; + } + + // Characters do not match and it is not a * + break; + } + } + + + // No match found. + return false; +} +bool RakString::ContainsNonprintableExceptSpaces(void) const +{ + size_t strLen = strlen(sharedString->c_str); + unsigned i; + for (i=0; i < strLen; i++) + { + if (sharedString->c_str[i] < ' ' || sharedString->c_str[i] >126) + return true; + } + return false; +} +bool RakString::IsEmailAddress(void) const +{ + if (IsEmpty()) + return false; + size_t strLen = strlen(sharedString->c_str); + if (strLen < 6) // a@b.de + return false; + if (sharedString->c_str[strLen-4]!='.' && sharedString->c_str[strLen-3]!='.') // .com, .net., .org, .de + return false; + unsigned i; + // Has non-printable? + for (i=0; i < strLen; i++) + { + if (sharedString->c_str[i] <= ' ' || sharedString->c_str[i] >126) + return false; + } + int atCount=0; + for (i=0; i < strLen; i++) + { + if (sharedString->c_str[i]=='@') + { + atCount++; + } + } + if (atCount!=1) + return false; + int dotCount=0; + for (i=0; i < strLen; i++) + { + if (sharedString->c_str[i]=='.') + { + dotCount++; + } + } + if (dotCount==0) + return false; + + // There's more I could check, but this is good enough + return true; +} +RakNet::RakString& RakString::URLEncode(void) +{ + RakString result; + size_t strLen = strlen(sharedString->c_str); + result.Allocate(strLen*3); + char *output=result.sharedString->c_str; + unsigned int outputIndex=0; + unsigned i; + char c; + for (i=0; i < strLen; i++) + { + c=sharedString->c_str[i]; + if ( + (c<=47) || + (c>=58 && c<=64) || + (c>=91 && c<=96) || + (c>=123) + ) + { + RakNet::RakString tmp("%2X", c); + output[outputIndex++]='%'; + output[outputIndex++]=tmp.sharedString->c_str[0]; + output[outputIndex++]=tmp.sharedString->c_str[1]; + } + else + { + output[outputIndex++]=c; + } + } + + output[outputIndex]=0; + + *this = result; + return *this; +} +RakNet::RakString& RakString::URLDecode(void) +{ + RakString result; + size_t strLen = strlen(sharedString->c_str); + result.Allocate(strLen); + char *output=result.sharedString->c_str; + unsigned int outputIndex=0; + char c; + char hexDigits[2]; + char hexValues[2]; + unsigned int i; + for (i=0; i < strLen; i++) + { + c=sharedString->c_str[i]; + if (c=='%') + { + hexDigits[0]=sharedString->c_str[++i]; + hexDigits[1]=sharedString->c_str[++i]; + if (hexDigits[0]==' ') + hexValues[0]=0; + else if (hexDigits[0]>='A') + hexValues[0]=hexDigits[0]-'A'+10; + else + hexValues[0]=hexDigits[0]-'0'; + if (hexDigits[1]>='A') + hexValues[1]=hexDigits[1]-'A'+10; + else + hexValues[1]=hexDigits[1]-'0'; + output[outputIndex++]=hexValues[0]*16+hexValues[1]; + } + else + { + output[outputIndex++]=c; + } + } + + output[outputIndex]=0; + + *this = result; + return *this; +} +void RakString::SplitURI(RakNet::RakString &header, RakNet::RakString &domain, RakNet::RakString &path) +{ + header.Clear(); + domain.Clear(); + path.Clear(); + + size_t strLen = strlen(sharedString->c_str); + + char c; + unsigned int i=0; + if (strncmp(sharedString->c_str, "http://", 7)==0) + i+=(unsigned int) strlen("http://"); + else if (strncmp(sharedString->c_str, "https://", 8)==0) + i+=(unsigned int) strlen("https://"); + + if (strncmp(sharedString->c_str, "www.", 4)==0) + i+=(unsigned int) strlen("www."); + + if (i!=0) + { + header.Allocate(i+1); + strncpy(header.sharedString->c_str, sharedString->c_str, i); + header.sharedString->c_str[i]=0; + } + + + domain.Allocate(strLen-i+1); + char *domainOutput=domain.sharedString->c_str; + unsigned int outputIndex=0; + for (; i < strLen; i++) + { + c=sharedString->c_str[i]; + if (c=='/') + { + break; + } + else + { + domainOutput[outputIndex++]=sharedString->c_str[i]; + } + } + + domainOutput[outputIndex]=0; + + path.Allocate(strLen-header.GetLength()-outputIndex+1); + outputIndex=0; + char *pathOutput=path.sharedString->c_str; + for (; i < strLen; i++) + { + pathOutput[outputIndex++]=sharedString->c_str[i]; + } + pathOutput[outputIndex]=0; +} +RakNet::RakString& RakString::SQLEscape(void) +{ + int strLen=(int)GetLength(); + int escapedCharacterCount=0; + int index; + for (index=0; index < strLen; index++) + { + if (sharedString->c_str[index]=='\'' || + sharedString->c_str[index]=='"' || + sharedString->c_str[index]=='\\') + escapedCharacterCount++; + } + if (escapedCharacterCount==0) + return *this; + + Clone(); + Realloc(sharedString, strLen+escapedCharacterCount); + int writeIndex, readIndex; + writeIndex = strLen+escapedCharacterCount; + readIndex=strLen; + while (readIndex>=0) + { + if (sharedString->c_str[readIndex]=='\'' || + sharedString->c_str[readIndex]=='"' || + sharedString->c_str[readIndex]=='\\') + { + sharedString->c_str[writeIndex--]=sharedString->c_str[readIndex--]; + sharedString->c_str[writeIndex--]='\\'; + } + else + { + sharedString->c_str[writeIndex--]=sharedString->c_str[readIndex--]; + } + } + return *this; +} +RakNet::RakString& RakString::MakeFilePath(void) +{ + if (IsEmpty()) + return *this; + + RakNet::RakString fixedString = *this; + fixedString.Clone(); + for (int i=0; fixedString.sharedString->c_str[i]; i++) + { +#ifdef _WIN32 + if (fixedString.sharedString->c_str[i]=='/') + fixedString.sharedString->c_str[i]='\\'; +#else + if (fixedString.sharedString->c_str[i]=='\\') + fixedString.sharedString->c_str[i]='/'; +#endif + } + +#ifdef _WIN32 + if (fixedString.sharedString->c_str[strlen(fixedString.sharedString->c_str)-1]!='\\') + { + fixedString+='\\'; + } +#else + if (fixedString.sharedString->c_str[strlen(fixedString.sharedString->c_str)-1]!='/') + { + fixedString+='/'; + } +#endif + + if (fixedString!=*this) + *this = fixedString; + return *this; +} +void RakString::FreeMemory(void) +{ + LockMutex(); + FreeMemoryNoMutex(); + UnlockMutex(); +} +void RakString::FreeMemoryNoMutex(void) +{ + for (unsigned int i=0; i < freeList.Size(); i++) + { + RakNet::OP_DELETE(freeList[i]->refCountMutex,_FILE_AND_LINE_); + rakFree_Ex(freeList[i], _FILE_AND_LINE_ ); + } + freeList.Clear(false, _FILE_AND_LINE_); +} +void RakString::Serialize(BitStream *bs) const +{ + Serialize(sharedString->c_str, bs); +} +void RakString::Serialize(const char *str, BitStream *bs) +{ + unsigned short l = (unsigned short) strlen(str); + bs->Write(l); + bs->WriteAlignedBytes((const unsigned char*) str, (const unsigned int) l); +} +void RakString::SerializeCompressed(BitStream *bs, uint8_t languageId, bool writeLanguageId) const +{ + SerializeCompressed(C_String(), bs, languageId, writeLanguageId); +} +void RakString::SerializeCompressed(const char *str, BitStream *bs, uint8_t languageId, bool writeLanguageId) +{ + if (writeLanguageId) + bs->WriteCompressed(languageId); + StringCompressor::Instance()->EncodeString(str,0xFFFF,bs,languageId); +} +bool RakString::Deserialize(BitStream *bs) +{ + Clear(); + + bool b; + unsigned short l; + b=bs->Read(l); + if (l>0) + { + Allocate(((unsigned int) l)+1); + b=bs->ReadAlignedBytes((unsigned char*) sharedString->c_str, l); + if (b) + sharedString->c_str[l]=0; + else + Clear(); + } + else + bs->AlignReadToByteBoundary(); + return b; +} +bool RakString::Deserialize(char *str, BitStream *bs) +{ + bool b; + unsigned short l; + b=bs->Read(l); + if (b && l>0) + b=bs->ReadAlignedBytes((unsigned char*) str, l); + + if (b==false) + str[0]=0; + + str[l]=0; + return b; +} +bool RakString::DeserializeCompressed(BitStream *bs, bool readLanguageId) +{ + uint8_t languageId; + if (readLanguageId) + bs->ReadCompressed(languageId); + else + languageId=0; + return StringCompressor::Instance()->DecodeString(this,0xFFFF,bs,languageId); +} +bool RakString::DeserializeCompressed(char *str, BitStream *bs, bool readLanguageId) +{ + uint8_t languageId; + if (readLanguageId) + bs->ReadCompressed(languageId); + else + languageId=0; + return StringCompressor::Instance()->DecodeString(str,0xFFFF,bs,languageId); +} +const char *RakString::ToString(int64_t i) +{ + static int index=0; + static char buff[64][64]; +#if defined(_WIN32) + sprintf(buff[index], "%I64d", i); +#else + sprintf(buff[index], "%lld", (long long unsigned int) i); +#endif + int lastIndex=index; + if (++index==64) + index=0; + return buff[lastIndex]; +} +const char *RakString::ToString(uint64_t i) +{ + static int index=0; + static char buff[64][64]; +#if defined(_WIN32) + sprintf(buff[index], "%I64u", i); +#else + sprintf(buff[index], "%llu", (long long unsigned int) i); +#endif + int lastIndex=index; + if (++index==64) + index=0; + return buff[lastIndex]; +} +void RakString::Clear(void) +{ + Free(); +} +void RakString::Allocate(size_t len) +{ + RakString::LockMutex(); + // sharedString = RakString::pool.Allocate( _FILE_AND_LINE_ ); + if (RakString::freeList.Size()==0) + { + //RakString::sharedStringFreeList=(RakString::SharedString*) rakRealloc_Ex(RakString::sharedStringFreeList,(RakString::sharedStringFreeListAllocationCount+1024)*sizeof(RakString::SharedString), _FILE_AND_LINE_); + unsigned i; + for (i=0; i < 128; i++) + { + // RakString::freeList.Insert(RakString::sharedStringFreeList+i+RakString::sharedStringFreeListAllocationCount); + // RakString::freeList.Insert((RakString::SharedString*)rakMalloc_Ex(sizeof(RakString::SharedString), _FILE_AND_LINE_), _FILE_AND_LINE_); + + RakString::SharedString *ss; + ss = (RakString::SharedString*) rakMalloc_Ex(sizeof(RakString::SharedString), _FILE_AND_LINE_); + ss->refCountMutex=RakNet::OP_NEW(_FILE_AND_LINE_); + RakString::freeList.Insert(ss, _FILE_AND_LINE_); + } + //RakString::sharedStringFreeListAllocationCount+=1024; + } + sharedString = RakString::freeList[RakString::freeList.Size()-1]; + RakString::freeList.RemoveAtIndex(RakString::freeList.Size()-1); + RakString::UnlockMutex(); + + const size_t smallStringSize = 128-sizeof(unsigned int)-sizeof(size_t)-sizeof(char*)*2; + sharedString->refCount=1; + if (len <= smallStringSize) + { + sharedString->bytesUsed=smallStringSize; + sharedString->c_str=sharedString->smallString; + } + else + { + sharedString->bytesUsed=len<<1; + sharedString->bigString=(char*)rakMalloc_Ex(sharedString->bytesUsed, _FILE_AND_LINE_); + sharedString->c_str=sharedString->bigString; + } +} +void RakString::Assign(const char *str) +{ + if (str==0 || str[0]==0) + { + sharedString=&emptyString; + return; + } + + size_t len = strlen(str)+1; + Allocate(len); + memcpy(sharedString->c_str, str, len); +} +void RakString::Assign(const char *str, va_list ap) +{ + char stackBuff[512]; + if (_vsnprintf(stackBuff, 512, str, ap)!=-1 +#ifndef _WIN32 + // Here Windows will return -1 if the string is too long; Linux just truncates the string. + && strlen(str) <511 +#endif + ) + { + Assign(stackBuff); + return; + } + char *buff=0, *newBuff; + size_t buffSize=8096; + while (1) + { + newBuff = (char*) rakRealloc_Ex(buff, buffSize,__FILE__,__LINE__); + if (newBuff==0) + { + notifyOutOfMemory(_FILE_AND_LINE_); + if (buff!=0) + { + Assign(buff); + rakFree_Ex(buff,__FILE__,__LINE__); + } + else + { + Assign(stackBuff); + } + return; + } + buff=newBuff; + if (_vsnprintf(buff, buffSize, str, ap)!=-1) + { + Assign(buff); + rakFree_Ex(buff,__FILE__,__LINE__); + return; + } + buffSize*=2; + } +} +RakNet::RakString RakString::Assign(const char *str,size_t pos, size_t n ) +{ + size_t incomingLen=strlen(str); + + Clone(); + + if (str==0 || str[0]==0||pos>=incomingLen) + { + sharedString=&emptyString; + return (*this); + } + + if (pos+n>=incomingLen) + { + n=incomingLen-pos; + + } + const char * tmpStr=&(str[pos]); + + size_t len = n+1; + Allocate(len); + memcpy(sharedString->c_str, tmpStr, len); + sharedString->c_str[n]=0; + + return (*this); +} + +RakNet::RakString RakString::NonVariadic(const char *str) +{ + RakNet::RakString rs; + rs=str; + return rs; +} +unsigned long RakString::ToInteger(const char *str) +{ + unsigned long hash = 0; + int c; + + while ((c = *str++)) + hash = c + (hash << 6) + (hash << 16) - hash; + + return hash; +} +unsigned long RakString::ToInteger(const RakString &rs) +{ + return RakString::ToInteger(rs.C_String()); +} +void RakString::AppendBytes(const char *bytes, unsigned int count) +{ + Clone(); + Realloc(sharedString, count); + unsigned int length=(unsigned int) GetLength(); + memcpy(sharedString->c_str+length, bytes, count); + sharedString->c_str[length+count]=0; +} +void RakString::Clone(void) +{ + if (sharedString==&emptyString) + { + return; + } + + // Empty or solo then no point to cloning + sharedString->refCountMutex->Lock(); + if (sharedString->refCount==1) + { + sharedString->refCountMutex->Unlock(); + return; + } + + sharedString->refCount--; + sharedString->refCountMutex->Unlock(); + Assign(sharedString->c_str); +} +void RakString::Free(void) +{ + if (sharedString==&emptyString) + return; + sharedString->refCountMutex->Lock(); + sharedString->refCount--; + if (sharedString->refCount==0) + { + sharedString->refCountMutex->Unlock(); + const size_t smallStringSize = 128-sizeof(unsigned int)-sizeof(size_t)-sizeof(char*)*2; + if (sharedString->bytesUsed>smallStringSize) + rakFree_Ex(sharedString->bigString, _FILE_AND_LINE_ ); + /* + poolMutex->Lock(); + pool.Release(sharedString); + poolMutex->Unlock(); + */ + + RakString::LockMutex(); + RakString::freeList.Insert(sharedString, _FILE_AND_LINE_); + RakString::UnlockMutex(); + + sharedString=&emptyString; + } + else + { + sharedString->refCountMutex->Unlock(); + } + sharedString=&emptyString; +} +unsigned char RakString::ToLower(unsigned char c) +{ + if (c >= 'A' && c <= 'Z') + return c-'A'+'a'; + return c; +} +unsigned char RakString::ToUpper(unsigned char c) +{ + if (c >= 'a' && c <= 'z') + return c-'a'+'A'; + return c; +} +void RakString::LockMutex(void) +{ + GetPoolMutex().Lock(); +} +void RakString::UnlockMutex(void) +{ + GetPoolMutex().Unlock(); +} + +/* +#include "RakString.h" +#include +#include "GetTime.h" + +using namespace RakNet; + +int main(void) +{ + RakString s3("Hello world"); + RakString s5=s3; + + RakString s1; + RakString s2('a'); + + RakString s4("%i %f", 5, 6.0); + + RakString s6=s3; + RakString s7=s6; + RakString s8=s6; + RakString s9; + s9=s9; + RakString s10(s3); + RakString s11=s10 + s4 + s9 + s2; + s11+=RakString("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); + RakString s12("Test"); + s12+=s11; + bool b1 = s12==s12; + s11=s5; + s12.ToUpper(); + s12.ToLower(); + RakString s13; + bool b3 = s13.IsEmpty(); + s13.Set("blah %s", s12.C_String()); + bool b4 = s13.IsEmpty(); + size_t i1=s13.GetLength(); + s3.Clear(_FILE_AND_LINE_); + s4.Clear(_FILE_AND_LINE_); + s5.Clear(_FILE_AND_LINE_); + s5.Clear(_FILE_AND_LINE_); + s6.Printf(); + s7.Printf(); + RAKNET_DEBUG_PRINTF("\n"); + + static const int repeatCount=750; + DataStructures::List rakStringList; + DataStructures::List stdStringList; + DataStructures::List referenceStringList; + char *c; + unsigned i; + RakNet::TimeMS beforeReferenceList, beforeRakString, beforeStdString, afterStdString; + + unsigned loop; + for (loop=0; loop<2; loop++) + { + beforeReferenceList=RakNet::GetTimeMS(); + for (i=0; i < repeatCount; i++) + { + c = RakNet::OP_NEW_ARRAY(56,_FILE_AND_LINE_ ); + strcpy(c, "Aalsdkj alsdjf laksdjf ;lasdfj ;lasjfd"); + referenceStringList.Insert(c); + } + beforeRakString=RakNet::GetTimeMS(); + for (i=0; i < repeatCount; i++) + rakStringList.Insert("Aalsdkj alsdjf laksdjf ;lasdfj ;lasjfd"); + beforeStdString=RakNet::GetTimeMS(); + + for (i=0; i < repeatCount; i++) + stdStringList.Insert("Aalsdkj alsdjf laksdjf ;lasdfj ;lasjfd"); + afterStdString=RakNet::GetTimeMS(); + RAKNET_DEBUG_PRINTF("Insertion 1 Ref=%i Rak=%i, Std=%i\n", beforeRakString-beforeReferenceList, beforeStdString-beforeRakString, afterStdString-beforeStdString); + + beforeReferenceList=RakNet::GetTimeMS(); + for (i=0; i < repeatCount; i++) + { + RakNet::OP_DELETE_ARRAY(referenceStringList[0], _FILE_AND_LINE_); + referenceStringList.RemoveAtIndex(0); + } + beforeRakString=RakNet::GetTimeMS(); + for (i=0; i < repeatCount; i++) + rakStringList.RemoveAtIndex(0); + beforeStdString=RakNet::GetTimeMS(); + for (i=0; i < repeatCount; i++) + stdStringList.RemoveAtIndex(0); + afterStdString=RakNet::GetTimeMS(); + RAKNET_DEBUG_PRINTF("RemoveHead Ref=%i Rak=%i, Std=%i\n", beforeRakString-beforeReferenceList, beforeStdString-beforeRakString, afterStdString-beforeStdString); + + beforeReferenceList=RakNet::GetTimeMS(); + for (i=0; i < repeatCount; i++) + { + c = RakNet::OP_NEW_ARRAY(56, _FILE_AND_LINE_ ); + strcpy(c, "Aalsdkj alsdjf laksdjf ;lasdfj ;lasjfd"); + referenceStringList.Insert(0); + } + beforeRakString=RakNet::GetTimeMS(); + for (i=0; i < repeatCount; i++) + rakStringList.Insert("Aalsdkj alsdjf laksdjf ;lasdfj ;lasjfd"); + beforeStdString=RakNet::GetTimeMS(); + for (i=0; i < repeatCount; i++) + stdStringList.Insert("Aalsdkj alsdjf laksdjf ;lasdfj ;lasjfd"); + afterStdString=RakNet::GetTimeMS(); + RAKNET_DEBUG_PRINTF("Insertion 2 Ref=%i Rak=%i, Std=%i\n", beforeRakString-beforeReferenceList, beforeStdString-beforeRakString, afterStdString-beforeStdString); + + beforeReferenceList=RakNet::GetTimeMS(); + for (i=0; i < repeatCount; i++) + { + RakNet::OP_DELETE_ARRAY(referenceStringList[referenceStringList.Size()-1], _FILE_AND_LINE_); + referenceStringList.RemoveAtIndex(referenceStringList.Size()-1); + } + beforeRakString=RakNet::GetTimeMS(); + for (i=0; i < repeatCount; i++) + rakStringList.RemoveAtIndex(rakStringList.Size()-1); + beforeStdString=RakNet::GetTimeMS(); + for (i=0; i < repeatCount; i++) + stdStringList.RemoveAtIndex(stdStringList.Size()-1); + afterStdString=RakNet::GetTimeMS(); + RAKNET_DEBUG_PRINTF("RemoveTail Ref=%i Rak=%i, Std=%i\n", beforeRakString-beforeReferenceList, beforeStdString-beforeRakString, afterStdString-beforeStdString); + + } + + printf("Done."); + char str[128]; + Gets(str, sizeof(str)); + return 1; +} +*/ diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakString.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakString.h new file mode 100644 index 0000000..49ac882 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakString.h @@ -0,0 +1,307 @@ +#ifndef __RAK_STRING_H +#define __RAK_STRING_H + +#include "Export.h" +#include "DS_List.h" +#include "RakNetTypes.h" // int64_t +#include +#include "stdarg.h" + + +#ifdef _WIN32 + + + +#include "WindowsIncludes.h" +#endif + +namespace RakNet +{ +/// Forward declarations +class SimpleMutex; +class BitStream; + +/// \brief String class +/// \details Has the following improvements over std::string +/// -Reference counting: Suitable to store in lists +/// -Variadic assignment operator +/// -Doesn't cause linker errors +class RAK_DLL_EXPORT RakString +{ +public: + // Constructors + RakString(); + RakString(char input); + RakString(unsigned char input); + RakString(const unsigned char *format, ...); + RakString(const char *format, ...); + ~RakString(); + RakString( const RakString & rhs); + + /// Implicit return of const char* + operator const char* () const {return sharedString->c_str;} + + /// Same as std::string::c_str + const char *C_String(void) const {return sharedString->c_str;} + + // Lets you modify the string. Do not make the string longer - however, you can make it shorter, or change the contents. + // Pointer is only valid in the scope of RakString itself + char *C_StringUnsafe(void) {Clone(); return sharedString->c_str;} + + /// Assigment operators + RakString& operator = ( const RakString& rhs ); + RakString& operator = ( const char *str ); + RakString& operator = ( char *str ); + RakString& operator = ( const unsigned char *str ); + RakString& operator = ( char unsigned *str ); + RakString& operator = ( const char c ); + + /// Concatenation + RakString& operator +=( const RakString& rhs); + RakString& operator += ( const char *str ); + RakString& operator += ( char *str ); + RakString& operator += ( const unsigned char *str ); + RakString& operator += ( char unsigned *str ); + RakString& operator += ( const char c ); + + /// Character index. Do not use to change the string however. + unsigned char operator[] ( const unsigned int position ) const; + +#ifdef _WIN32 + // Return as Wide char + // Deallocate with DeallocWideChar + WCHAR * ToWideChar(void); + void DeallocWideChar(WCHAR * w); +#endif + + ///String class find replacement + ///Searches the string for the content specified in stringToFind and returns the position of the first occurrence in the string. + ///Search only includes characters on or after position pos, ignoring any possible occurrences in previous locations. + /// \param[in] stringToFind The string to find inside of this object's string + /// \param[in] pos The position in the string to start the search + /// \return Returns the position of the first occurrence in the string. + size_t Find(const char *stringToFind,size_t pos = 0 ); + + /// Equality + bool operator==(const RakString &rhs) const; + bool operator==(const char *str) const; + bool operator==(char *str) const; + + // Comparison + bool operator < ( const RakString& right ) const; + bool operator <= ( const RakString& right ) const; + bool operator > ( const RakString& right ) const; + bool operator >= ( const RakString& right ) const; + + /// Inequality + bool operator!=(const RakString &rhs) const; + bool operator!=(const char *str) const; + bool operator!=(char *str) const; + + /// Change all characters to lowercase + const char * ToLower(void); + + /// Change all characters to uppercase + const char * ToUpper(void); + + /// Set the value of the string + void Set(const char *format, ...); + + /// Sets a copy of a substring of str as the new content. The substring is the portion of str + /// that begins at the character position pos and takes up to n characters + /// (it takes less than n if the end of str is reached before). + /// \param[in] str The string to copy in + /// \param[in] pos The position on str to start the copy + /// \param[in] n How many chars to copy + /// \return Returns the string, note that the current string is set to that value as well + RakString Assign(const char *str,size_t pos, size_t n ); + + /// Returns if the string is empty. Also, C_String() would return "" + bool IsEmpty(void) const; + + /// Returns the length of the string + size_t GetLength(void) const; + size_t GetLengthUTF8(void) const; + + /// Replace character(s) in starting at index, for count, with c + void Replace(unsigned index, unsigned count, unsigned char c); + + /// Replace character at index with c + void SetChar( unsigned index, unsigned char c ); + + /// Replace character at index with string s + void SetChar( unsigned index, RakNet::RakString s ); + + /// Make sure string is no longer than \a length + void Truncate(unsigned int length); + void TruncateUTF8(unsigned int length); + + // Gets the substring starting at index for count characters + RakString SubStr(unsigned int index, unsigned int count) const; + + /// Erase characters out of the string at index for count + void Erase(unsigned int index, unsigned int count); + + /// Set the first instance of c with a NULL terminator + void TerminateAtFirstCharacter(char c); + /// Set the last instance of c with a NULL terminator + void TerminateAtLastCharacter(char c); + + /// Remove all instances of c + void RemoveCharacter(char c); + + /// Create a RakString with a value, without doing printf style parsing + /// Equivalent to assignment operator + static RakNet::RakString NonVariadic(const char *str); + + /// Has the string into an unsigned int + static unsigned long ToInteger(const char *str); + static unsigned long ToInteger(const RakString &rs); + + // Like strncat, but for a fixed length + void AppendBytes(const char *bytes, unsigned int count); + + /// Compare strings (case sensitive) + int StrCmp(const RakString &rhs) const; + + /// Compare strings (not case sensitive) + int StrICmp(const RakString &rhs) const; + + /// Clear the string + void Clear(void); + + /// Print the string to the screen + void Printf(void); + + /// Print the string to a file + void FPrintf(FILE *fp); + + /// Does the given IP address match the IP address encoded into this string, accounting for wildcards? + bool IPAddressMatch(const char *IP); + + /// Does the string contain non-printable characters other than spaces? + bool ContainsNonprintableExceptSpaces(void) const; + + /// Is this a valid email address? + bool IsEmailAddress(void) const; + + /// URL Encode the string. See http://www.codeguru.com/cpp/cpp/cpp_mfc/article.php/c4029/ + RakNet::RakString& URLEncode(void); + + /// URL decode the string + RakNet::RakString& URLDecode(void); + + /// https://servers.api.rackspacecloud.com/v1.0 to https://, servers.api.rackspacecloud.com, /v1.0 + void SplitURI(RakNet::RakString &header, RakNet::RakString &domain, RakNet::RakString &path); + + /// Scan for quote, double quote, and backslash and prepend with backslash + RakNet::RakString& SQLEscape(void); + + /// Fix to be a file path, ending with / + RakNet::RakString& MakeFilePath(void); + + /// RakString uses a freeList of old no-longer used strings + /// Call this function to clear this memory on shutdown + static void FreeMemory(void); + /// \internal + static void FreeMemoryNoMutex(void); + + /// Serialize to a bitstream, uncompressed (slightly faster) + /// \param[out] bs Bitstream to serialize to + void Serialize(BitStream *bs) const; + + /// Static version of the Serialize function + static void Serialize(const char *str, BitStream *bs); + + /// Serialize to a bitstream, compressed (better bandwidth usage) + /// \param[out] bs Bitstream to serialize to + /// \param[in] languageId languageId to pass to the StringCompressor class + /// \param[in] writeLanguageId encode the languageId variable in the stream. If false, 0 is assumed, and DeserializeCompressed will not look for this variable in the stream (saves bandwidth) + /// \pre StringCompressor::AddReference must have been called to instantiate the class (Happens automatically from RakPeer::Startup()) + void SerializeCompressed(BitStream *bs, uint8_t languageId=0, bool writeLanguageId=false) const; + + /// Static version of the SerializeCompressed function + static void SerializeCompressed(const char *str, BitStream *bs, uint8_t languageId=0, bool writeLanguageId=false); + + /// Deserialize what was written by Serialize + /// \param[in] bs Bitstream to serialize from + /// \return true if the deserialization was successful + bool Deserialize(BitStream *bs); + + /// Static version of the Deserialize() function + static bool Deserialize(char *str, BitStream *bs); + + /// Deserialize compressed string, written by SerializeCompressed + /// \param[in] bs Bitstream to serialize from + /// \param[in] readLanguageId If true, looks for the variable langaugeId in the data stream. Must match what was passed to SerializeCompressed + /// \return true if the deserialization was successful + /// \pre StringCompressor::AddReference must have been called to instantiate the class (Happens automatically from RakPeer::Startup()) + bool DeserializeCompressed(BitStream *bs, bool readLanguageId=false); + + /// Static version of the DeserializeCompressed() function + static bool DeserializeCompressed(char *str, BitStream *bs, bool readLanguageId=false); + + static const char *ToString(int64_t i); + static const char *ToString(uint64_t i); + + /// \internal + static size_t GetSizeToAllocate(size_t bytes) + { + const size_t smallStringSize = 128-sizeof(unsigned int)-sizeof(size_t)-sizeof(char*)*2; + if (bytes<=smallStringSize) + return smallStringSize; + else + return bytes*2; + } + + /// \internal + struct SharedString + { + SimpleMutex *refCountMutex; + unsigned int refCount; + size_t bytesUsed; + char *bigString; + char *c_str; + char smallString[128-sizeof(unsigned int)-sizeof(size_t)-sizeof(char*)*2]; + }; + + /// \internal + RakString( SharedString *_sharedString ); + + /// \internal + SharedString *sharedString; + +// static SimpleMutex poolMutex; +// static DataStructures::MemoryPool pool; + /// \internal + static SharedString emptyString; + + //static SharedString *sharedStringFreeList; + //static unsigned int sharedStringFreeListAllocationCount; + /// \internal + /// List of free objects to reduce memory reallocations + static DataStructures::List freeList; + + static int RakStringComp( RakString const &key, RakString const &data ); + + static void LockMutex(void); + static void UnlockMutex(void); + +protected: + void Allocate(size_t len); + void Assign(const char *str); + void Assign(const char *str, va_list ap); + + void Clone(void); + void Free(void); + unsigned char ToLower(unsigned char c); + unsigned char ToUpper(unsigned char c); + void Realloc(SharedString *sharedString, size_t bytes); +}; + +} + +const RakNet::RakString RAK_DLL_EXPORT operator+(const RakNet::RakString &lhs, const RakNet::RakString &rhs); + + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakThread.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakThread.cpp new file mode 100644 index 0000000..fefe388 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakThread.cpp @@ -0,0 +1,163 @@ +#include "RakThread.h" +#include "RakAssert.h" +#include "RakNetDefines.h" +#include "RakSleep.h" +#include "RakMemoryOverride.h" + +using namespace RakNet; + + + + +#if defined(_WIN32) +#include "WindowsIncludes.h" +#include + #if !defined(_WIN32_WCE) + #include + #endif + + + + +#else +#include +#endif + + +#if defined(_WIN32_WCE) +int RakThread::Create( LPTHREAD_START_ROUTINE start_address, void *arglist, int priority) +#elif defined(_WIN32) +int RakThread::Create( unsigned __stdcall start_address( void* ), void *arglist, int priority) + + + +#else +int RakThread::Create( void* start_address( void* ), void *arglist, int priority) +#endif +{ +#ifdef _WIN32 + HANDLE threadHandle; + unsigned threadID = 0; + + +#if defined (_WIN32_WCE) + threadHandle = CreateThread(NULL,MAX_ALLOCA_STACK_ALLOCATION*2,start_address,arglist,0,(DWORD*)&threadID); + SetThreadPriority(threadHandle, priority); +#else + threadHandle = (HANDLE) _beginthreadex( NULL, MAX_ALLOCA_STACK_ALLOCATION*2, start_address, arglist, 0, &threadID ); +#endif + SetThreadPriority(threadHandle, priority); + + if (threadHandle==0) + { + return 1; + } + else + { + CloseHandle( threadHandle ); + return 0; + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#else + pthread_t threadHandle; + // Create thread linux + pthread_attr_t attr; + sched_param param; + param.sched_priority=priority; + pthread_attr_init( &attr ); + pthread_attr_setschedparam(&attr, ¶m); + + + + + + pthread_attr_setstacksize(&attr, MAX_ALLOCA_STACK_ALLOCATION*2); + + pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_DETACHED ); + int res = pthread_create( &threadHandle, &attr, start_address, arglist ); + RakAssert(res==0 && "pthread_create in RakThread.cpp failed.") + return res; +#endif +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakThread.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakThread.h new file mode 100644 index 0000000..6cacd83 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakThread.h @@ -0,0 +1,88 @@ +#ifndef __RAK_THREAD_H +#define __RAK_THREAD_H + +#if defined(_WIN32_WCE) +#include "WindowsIncludes.h" +#endif + +#include "Export.h" + + + + + + +namespace RakNet +{ + +/// To define a thread, use RAK_THREAD_DECLARATION(functionName); +#if defined(_WIN32_WCE) +#define RAK_THREAD_DECLARATION(functionName) DWORD WINAPI functionName(LPVOID arguments) + + +#elif defined(_WIN32) +#define RAK_THREAD_DECLARATION(functionName) unsigned __stdcall functionName( void* arguments ) + + +#else +#define RAK_THREAD_DECLARATION(functionName) void* functionName( void* arguments ) +#endif + +class RAK_DLL_EXPORT RakThread +{ +public: + + + + + /// Create a thread, simplified to be cross platform without all the extra junk + /// To then start that thread, call RakCreateThread(functionName, arguments); + /// \param[in] start_address Function you want to call + /// \param[in] arglist Arguments to pass to the function + /// \return 0=success. >0 = error code + + /* + nice value Win32 Priority + -20 to -16 THREAD_PRIORITY_HIGHEST + -15 to -6 THREAD_PRIORITY_ABOVE_NORMAL + -5 to +4 THREAD_PRIORITY_NORMAL + +5 to +14 THREAD_PRIORITY_BELOW_NORMAL + +15 to +19 THREAD_PRIORITY_LOWEST + */ +#if defined(_WIN32_WCE) + static int Create( LPTHREAD_START_ROUTINE start_address, void *arglist, int priority=0); + + +#elif defined(_WIN32) + static int Create( unsigned __stdcall start_address( void* ), void *arglist, int priority=0); + + + +#else + static int Create( void* start_address( void* ), void *arglist, int priority=0); +#endif + + + + + + + + + + + + + + + + + + + + +}; + +} + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakWString.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakWString.cpp new file mode 100644 index 0000000..56e2a31 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakWString.cpp @@ -0,0 +1,345 @@ +#include "RakWString.h" +#include "BitStream.h" +#include +#include +#include + +using namespace RakNet; + +// From http://www.joelonsoftware.com/articles/Unicode.html +// Only code points 128 and above are stored using 2, 3, in fact, up to 6 bytes. +//#define MAX_BYTES_PER_UNICODE_CHAR 6 +#define MAX_BYTES_PER_UNICODE_CHAR 2 + +RakWString::RakWString() +{ + c_str=0; + c_strCharLength=0; +} +RakWString::RakWString( const RakString &right ) +{ + c_str=0; + c_strCharLength=0; + *this=right; +} +RakWString::RakWString( const char *input ) +{ + c_str=0; + c_strCharLength=0; + *this = input; +} +RakWString::RakWString( const wchar_t *input ) +{ + c_str=0; + c_strCharLength=0; + *this = input; +} +RakWString::RakWString( const RakWString & right) +{ + c_str=0; + c_strCharLength=0; + *this = right; +} +RakWString::~RakWString() +{ + rakFree_Ex(c_str,_FILE_AND_LINE_); +} +RakWString& RakWString::operator = ( const RakWString& right ) +{ + Clear(); + if (right.IsEmpty()) + return *this; + c_str = (wchar_t *) rakMalloc_Ex( (right.GetLength() + 1) * MAX_BYTES_PER_UNICODE_CHAR, _FILE_AND_LINE_); + if (!c_str) + { + c_strCharLength=0; + notifyOutOfMemory(_FILE_AND_LINE_); + return *this; + } + c_strCharLength = right.GetLength(); + memcpy(c_str,right.C_String(),(right.GetLength() + 1) * MAX_BYTES_PER_UNICODE_CHAR); + + return *this; +} +RakWString& RakWString::operator = ( const RakString& right ) +{ + return *this = right.C_String(); +} +RakWString& RakWString::operator = ( const wchar_t * const str ) +{ + Clear(); + if (str==0) + return *this; + c_strCharLength = wcslen(str); + if (c_strCharLength==0) + return *this; + c_str = (wchar_t *) rakMalloc_Ex( (c_strCharLength + 1) * MAX_BYTES_PER_UNICODE_CHAR, _FILE_AND_LINE_); + if (!c_str) + { + c_strCharLength=0; + notifyOutOfMemory(_FILE_AND_LINE_); + return *this; + } + wcscpy(c_str,str); + + return *this; +} +RakWString& RakWString::operator = ( wchar_t *str ) +{ + *this = ( const wchar_t * const) str; + return *this; +} +RakWString& RakWString::operator = ( const char * const str ) +{ + Clear(); + +// Not supported on android +#if !defined(ANDROID) + if (str==0) + return *this; + if (str[0]==0) + return *this; + + c_strCharLength = mbstowcs(NULL, str, 0); + c_str = (wchar_t *) rakMalloc_Ex( (c_strCharLength + 1) * MAX_BYTES_PER_UNICODE_CHAR, _FILE_AND_LINE_); + if (!c_str) + { + c_strCharLength=0; + notifyOutOfMemory(_FILE_AND_LINE_); + return *this; + } + + c_strCharLength = mbstowcs(c_str, str, c_strCharLength+1); + if (c_strCharLength == (size_t) (-1)) + { + RAKNET_DEBUG_PRINTF("Couldn't convert string--invalid multibyte character.\n"); + Clear(); + return *this; + } +#else + // mbstowcs not supported on android + RakAssert("mbstowcs not supported on Android" && 0); +#endif // defined(ANDROID) + + return *this; +} +RakWString& RakWString::operator = ( char *str ) +{ + *this = ( const char * const) str; + return *this; +} +RakWString& RakWString::operator +=( const RakWString& right) +{ + if (right.IsEmpty()) + return *this; + size_t newCharLength = c_strCharLength + right.GetLength(); + wchar_t *newCStr; + bool isEmpty = IsEmpty(); + if (isEmpty) + newCStr = (wchar_t *) rakMalloc_Ex( (newCharLength + 1) * MAX_BYTES_PER_UNICODE_CHAR, _FILE_AND_LINE_); + else + newCStr = (wchar_t *) rakRealloc_Ex( c_str, (newCharLength + 1) * MAX_BYTES_PER_UNICODE_CHAR, _FILE_AND_LINE_); + if (!newCStr) + { + notifyOutOfMemory(_FILE_AND_LINE_); + return *this; + } + c_str = newCStr; + c_strCharLength = newCharLength; + if (isEmpty) + { + memcpy(newCStr,right.C_String(),(right.GetLength() + 1) * MAX_BYTES_PER_UNICODE_CHAR); + } + else + { + wcscat(c_str, right.C_String()); + } + + return *this; +} +RakWString& RakWString::operator += ( const wchar_t * const right ) +{ + if (right==0) + return *this; + size_t rightLength = wcslen(right); + size_t newCharLength = c_strCharLength + rightLength; + wchar_t *newCStr; + bool isEmpty = IsEmpty(); + if (isEmpty) + newCStr = (wchar_t *) rakMalloc_Ex( (newCharLength + 1) * MAX_BYTES_PER_UNICODE_CHAR, _FILE_AND_LINE_); + else + newCStr = (wchar_t *) rakRealloc_Ex( c_str, (newCharLength + 1) * MAX_BYTES_PER_UNICODE_CHAR, _FILE_AND_LINE_); + if (!newCStr) + { + notifyOutOfMemory(_FILE_AND_LINE_); + return *this; + } + c_str = newCStr; + c_strCharLength = newCharLength; + if (isEmpty) + { + memcpy(newCStr,right,(rightLength + 1) * MAX_BYTES_PER_UNICODE_CHAR); + } + else + { + wcscat(c_str, right); + } + + return *this; +} +RakWString& RakWString::operator += ( wchar_t *right ) +{ + return *this += (const wchar_t * const) right; +} +bool RakWString::operator==(const RakWString &right) const +{ + if (GetLength()!=right.GetLength()) + return false; + return wcscmp(c_str,right.C_String())==0; +} +bool RakWString::operator < ( const RakWString& right ) const +{ + return wcscmp(c_str,right.C_String())<0; +} +bool RakWString::operator <= ( const RakWString& right ) const +{ + return wcscmp(c_str,right.C_String())<=0; +} +bool RakWString::operator > ( const RakWString& right ) const +{ + return wcscmp(c_str,right.C_String())>0; +} +bool RakWString::operator >= ( const RakWString& right ) const +{ + return wcscmp(c_str,right.C_String())>=0; +} +bool RakWString::operator!=(const RakWString &right) const +{ + if (GetLength()!=right.GetLength()) + return true; + return wcscmp(c_str,right.C_String())!=0; +} +void RakWString::Set( wchar_t *str ) +{ + *this = str; +} +bool RakWString::IsEmpty(void) const +{ + return GetLength()==0; +} +size_t RakWString::GetLength(void) const +{ + return c_strCharLength; +} +unsigned long RakWString::ToInteger(const RakWString &rs) +{ + unsigned long hash = 0; + int c; + + const char *str = (const char *)rs.C_String(); + size_t i; + for (i=0; i < rs.GetLength()*MAX_BYTES_PER_UNICODE_CHAR*sizeof(wchar_t); i++) + { + c = *str++; + hash = c + (hash << 6) + (hash << 16) - hash; + } + + return hash; +} +int RakWString::StrCmp(const RakWString &right) const +{ + return wcscmp(C_String(), right.C_String()); +} +int RakWString::StrICmp(const RakWString &right) const +{ +#ifdef _WIN32 + return wcsicmp(C_String(), right.C_String()); +#else + // Not supported + return wcscmp(C_String(), right.C_String()); +#endif +} +void RakWString::Clear(void) +{ + rakFree_Ex(c_str,_FILE_AND_LINE_); + c_str=0; + c_strCharLength=0; +} +void RakWString::Printf(void) +{ + printf("%ls", C_String()); +} +void RakWString::FPrintf(FILE *fp) +{ + fprintf(fp,"%ls", C_String()); +} +void RakWString::Serialize(BitStream *bs) const +{ + bs->WriteCasted(c_strCharLength); + bs->WriteAlignedBytes((const unsigned char*) c_str,(const unsigned int) (c_strCharLength+1)*MAX_BYTES_PER_UNICODE_CHAR); +} +void RakWString::Serialize(const wchar_t * const str, BitStream *bs) +{ + size_t length = wcslen(str); + bs->WriteCasted(length); + bs->WriteAlignedBytes((const unsigned char*) str,(const unsigned int) length*MAX_BYTES_PER_UNICODE_CHAR); +} +bool RakWString::Deserialize(BitStream *bs) +{ + Clear(); + size_t length; + bs->ReadCasted(length); + if (length>0) + { + c_str = (wchar_t *) rakMalloc_Ex( (length + 1) * MAX_BYTES_PER_UNICODE_CHAR, _FILE_AND_LINE_); + if (!c_str) + { + notifyOutOfMemory(_FILE_AND_LINE_); + return false; + } + c_strCharLength = (size_t) length; + return bs->ReadAlignedBytes((unsigned char*) c_str,(const unsigned int) (c_strCharLength+1)*MAX_BYTES_PER_UNICODE_CHAR); + } + else + { + return true; + } +} +bool RakWString::Deserialize(wchar_t *str, BitStream *bs) +{ + size_t length; + bs->ReadCasted(length); + if (length>0) + { + return bs->ReadAlignedBytes((unsigned char*) str,(const unsigned int) (length+1)*MAX_BYTES_PER_UNICODE_CHAR); + } + else + { + wcscpy(str,L""); + } + return true; +} + +/* +RakNet::BitStream bsTest; +RakNet::RakWString testString("cat"), testString2; +testString = "Hllo"; +testString = L"Hello"; +testString += L" world"; +testString2 += testString2; +RakNet::RakWString ts3(L" from here"); +testString2+=ts3; +RakNet::RakWString ts4(L" 222"); +testString2=ts4; +RakNet::RakString rs("rakstring"); +testString2+=rs; +testString2=rs; +bsTest.Write(L"one"); +bsTest.Write(testString2); +bsTest.SetReadOffset(0); +RakNet::RakWString ts5, ts6; +wchar_t buff[99]; +wchar_t *wptr = (wchar_t*)buff; +bsTest.Read(wptr); +bsTest.Read(ts5); +*/ diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakWString.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakWString.h new file mode 100644 index 0000000..f633596 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RakWString.h @@ -0,0 +1,113 @@ +#ifndef __RAK_W_STRING_H +#define __RAK_W_STRING_H + +#include "Export.h" +#include "RakNetTypes.h" // int64_t +#include "RakString.h" + +#ifdef _WIN32 + + + +#include "WindowsIncludes.h" +#endif + +namespace RakNet +{ + /// \brief String class for Unicode + class RAK_DLL_EXPORT RakWString + { + public: + // Constructors + RakWString(); + RakWString( const RakString &right ); + RakWString( const wchar_t *input ); + RakWString( const RakWString & right); + RakWString( const char *input ); + ~RakWString(); + + /// Implicit return of wchar_t* + operator wchar_t* () const {if (c_str) return c_str; return (wchar_t*) L"";} + + /// Same as std::string::c_str + const wchar_t* C_String(void) const {if (c_str) return c_str; return (const wchar_t*) L"";} + + /// Assignment operators + RakWString& operator = ( const RakWString& right ); + RakWString& operator = ( const RakString& right ); + RakWString& operator = ( const wchar_t * const str ); + RakWString& operator = ( wchar_t *str ); + RakWString& operator = ( const char * const str ); + RakWString& operator = ( char *str ); + + /// Concatenation + RakWString& operator +=( const RakWString& right); + RakWString& operator += ( const wchar_t * const right ); + RakWString& operator += ( wchar_t *right ); + + /// Equality + bool operator==(const RakWString &right) const; + + // Comparison + bool operator < ( const RakWString& right ) const; + bool operator <= ( const RakWString& right ) const; + bool operator > ( const RakWString& right ) const; + bool operator >= ( const RakWString& right ) const; + + /// Inequality + bool operator!=(const RakWString &right) const; + + /// Set the value of the string + void Set( wchar_t *str ); + + /// Returns if the string is empty. Also, C_String() would return "" + bool IsEmpty(void) const; + + /// Returns the length of the string + size_t GetLength(void) const; + + /// Has the string into an unsigned int + static unsigned long ToInteger(const RakWString &rs); + + /// Compare strings (case sensitive) + int StrCmp(const RakWString &right) const; + + /// Compare strings (not case sensitive) + int StrICmp(const RakWString &right) const; + + /// Clear the string + void Clear(void); + + /// Print the string to the screen + void Printf(void); + + /// Print the string to a file + void FPrintf(FILE *fp); + + /// Serialize to a bitstream, uncompressed (slightly faster) + /// \param[out] bs Bitstream to serialize to + void Serialize(BitStream *bs) const; + + /// Static version of the Serialize function + static void Serialize(const wchar_t * const str, BitStream *bs); + + /// Deserialize what was written by Serialize + /// \param[in] bs Bitstream to serialize from + /// \return true if the deserialization was successful + bool Deserialize(BitStream *bs); + + /// Static version of the Deserialize() function + static bool Deserialize(wchar_t *str, BitStream *bs); + + + protected: + wchar_t* c_str; + size_t c_strCharLength; + }; + +} + +const RakNet::RakWString RAK_DLL_EXPORT operator+(const RakNet::RakWString &lhs, const RakNet::RakWString &rhs); + + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Rand.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Rand.cpp new file mode 100644 index 0000000..79fc25f --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Rand.cpp @@ -0,0 +1,274 @@ +/** +* +* Grabbed by Kevin from http://www.math.keio.ac.jp/~matumoto/cokus.c +* This is the ``Mersenne Twister'' random number generator MT19937, which +* generates pseudorandom integers uniformly distributed in 0..(2^32 - 1) +* starting from any odd seed in 0..(2^32 - 1). This version is a recode +* by Shawn Cokus (Cokus@math.washington.edu) on March 8, 1998 of a version by +* Takuji Nishimura (who had suggestions from Topher Cooper and Marc Rieffel in +* July-August 1997). +* +* Effectiveness of the recoding (on Goedel2.math.washington.edu, a DEC Alpha +* running OSF/1) using GCC -O3 as a compiler: before recoding: 51.6 sec. to +* generate 300 million random numbers; after recoding: 24.0 sec. for the same +* (i.e., 46.5% of original time), so speed is now about 12.5 million random +* number generations per second on this machine. +* +* According to the URL +* (and paraphrasing a bit in places), the Mersenne Twister is ``designed +* with consideration of the flaws of various existing generators,'' has +* a period of 2^19937 - 1, gives a sequence that is 623-dimensionally +* equidistributed, and ``has passed many stringent tests, including the +* die-hard test of G. Marsaglia and the load test of P. Hellekalek and +* S. Wegenkittl.'' It is efficient in memory usage (typically using 2506 +* to 5012 bytes of static data, depending on data type sizes, and the code +* is quite short as well). It generates random numbers in batches of 624 +* at a time, so the caching and pipelining of modern systems is exploited. +* It is also divide- and mod-free. +* +* Licensing is free http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/elicense.html +* +* The code as Shawn received it included the following notice: +* +* Copyright (C) 1997 Makoto Matsumoto and Takuji Nishimura. When +* you use this, send an e-mail to with +* an appropriate reference to your work. +* +* It would be nice to CC: when you write. +*/ + +#include +#include +#include +#include "Rand.h" + +// +// uint32 must be an unsigned integer type capable of holding at least 32 +// bits; exactly 32 should be fastest, but 64 is better on an Alpha with +// GCC at -O3 optimization so try your options and see what's best for you +// + +//typedef unsigned int uint32; + +#define N (624) // length of state vector +#define M (397) // a period parameter +#define K (0x9908B0DFU) // a magic constant +#define hiBit(u) ((u) & 0x80000000U) // mask all but highest bit of u +#define loBit(u) ((u) & 0x00000001U) // mask all but lowest bit of u +#define loBits(u) ((u) & 0x7FFFFFFFU) // mask the highest bit of u +#define mixBits(u, v) (hiBit(u)|loBits(v)) // move hi bit of u to hi bit of v + +static unsigned int _state[ N + 1 ]; // state vector + 1 extra to not violate ANSI C +static unsigned int *_next; // next random value is computed from here +static int _left = -1; // can *next++ this many times before reloading + +using namespace RakNet; + +void seedMT( unsigned int seed, unsigned int *state, unsigned int *&next, int &left ); +unsigned int reloadMT( unsigned int *state, unsigned int *&next, int &left ); +unsigned int randomMT( unsigned int *state, unsigned int *&next, int &left ); +void fillBufferMT( void *buffer, unsigned int bytes, unsigned int *state, unsigned int *&next, int &left ); +float frandomMT( unsigned int *state, unsigned int *&next, int &left ); + +// Uses global vars +void seedMT( unsigned int seed ) +{ + seedMT(seed, _state, _next, _left); +} +unsigned int reloadMT( void ) +{ + return reloadMT(_state, _next, _left); +} +unsigned int randomMT( void ) +{ + return randomMT(_state, _next, _left); +} +float frandomMT( void ) +{ + return frandomMT(_state, _next, _left); +} +void fillBufferMT( void *buffer, unsigned int bytes ) +{ + fillBufferMT(buffer, bytes, _state, _next, _left); +} + +void seedMT( unsigned int seed, unsigned int *state, unsigned int *&next, int &left ) // Defined in cokus_c.c +{ + (void) next; + + // + // We initialize state[0..(N-1)] via the generator + // + // x_new = (69069 * x_old) mod 2^32 + // + // from Line 15 of Table 1, p. 106, Sec. 3.3.4 of Knuth's + // _The Art of Computer Programming_, Volume 2, 3rd ed. + // + // Notes (SJC): I do not know what the initial state requirements + // of the Mersenne Twister are, but it seems this seeding generator + // could be better. It achieves the maximum period for its modulus + // (2^30) iff x_initial is odd (p. 20-21, Sec. 3.2.1.2, Knuth); if + // x_initial can be even, you have sequences like 0, 0, 0, ...; + // 2^31, 2^31, 2^31, ...; 2^30, 2^30, 2^30, ...; 2^29, 2^29 + 2^31, + // 2^29, 2^29 + 2^31, ..., etc. so I force seed to be odd below. + // + // Even if x_initial is odd, if x_initial is 1 mod 4 then + // + // the lowest bit of x is always 1, + // the next-to-lowest bit of x is always 0, + // the 2nd-from-lowest bit of x alternates ... 0 1 0 1 0 1 0 1 ... , + // the 3rd-from-lowest bit of x 4-cycles ... 0 1 1 0 0 1 1 0 ... , + // the 4th-from-lowest bit of x has the 8-cycle ... 0 0 0 1 1 1 1 0 ... , + // ... + // + // and if x_initial is 3 mod 4 then + // + // the lowest bit of x is always 1, + // the next-to-lowest bit of x is always 1, + // the 2nd-from-lowest bit of x alternates ... 0 1 0 1 0 1 0 1 ... , + // the 3rd-from-lowest bit of x 4-cycles ... 0 0 1 1 0 0 1 1 ... , + // the 4th-from-lowest bit of x has the 8-cycle ... 0 0 1 1 1 1 0 0 ... , + // ... + // + // The generator's potency (min. s>=0 with (69069-1)^s = 0 mod 2^32) is + // 16, which seems to be alright by p. 25, Sec. 3.2.1.3 of Knuth. It + // also does well in the dimension 2..5 spectral tests, but it could be + // better in dimension 6 (Line 15, Table 1, p. 106, Sec. 3.3.4, Knuth). + // + // Note that the random number user does not see the values generated + // here directly since reloadMT() will always munge them first, so maybe + // none of all of this matters. In fact, the seed values made here could + // even be extra-special desirable if the Mersenne Twister theory says + // so-- that's why the only change I made is to restrict to odd seeds. + // + + register unsigned int x = ( seed | 1U ) & 0xFFFFFFFFU, *s = state; + register int j; + + for ( left = 0, *s++ = x, j = N; --j; + *s++ = ( x *= 69069U ) & 0xFFFFFFFFU ) + + ; +} + + +unsigned int reloadMT( unsigned int *state, unsigned int *&next, int &left ) +{ + register unsigned int * p0 = state, *p2 = state + 2, *pM = state + M, s0, s1; + register int j; + + if ( left < -1 ) + seedMT( 4357U ); + + left = N - 1, next = state + 1; + + for ( s0 = state[ 0 ], s1 = state[ 1 ], j = N - M + 1; --j; s0 = s1, s1 = *p2++ ) + * p0++ = *pM++ ^ ( mixBits( s0, s1 ) >> 1 ) ^ ( loBit( s1 ) ? K : 0U ); + + for ( pM = state, j = M; --j; s0 = s1, s1 = *p2++ ) + * p0++ = *pM++ ^ ( mixBits( s0, s1 ) >> 1 ) ^ ( loBit( s1 ) ? K : 0U ); + + s1 = state[ 0 ], *p0 = *pM ^ ( mixBits( s0, s1 ) >> 1 ) ^ ( loBit( s1 ) ? K : 0U ); + + s1 ^= ( s1 >> 11 ); + + s1 ^= ( s1 << 7 ) & 0x9D2C5680U; + + s1 ^= ( s1 << 15 ) & 0xEFC60000U; + + return ( s1 ^ ( s1 >> 18 ) ); +} + + +unsigned int randomMT( unsigned int *state, unsigned int *&next, int &left ) +{ + unsigned int y; + + if ( --left < 0 ) + return ( reloadMT(state, next, left) ); + + y = *next++; + + y ^= ( y >> 11 ); + + y ^= ( y << 7 ) & 0x9D2C5680U; + + y ^= ( y << 15 ) & 0xEFC60000U; + + return ( y ^ ( y >> 18 ) ); + + // This change made so the value returned is in the same range as what rand() returns + // return(y ^ (y >> 18)) % 32767; +} + +void fillBufferMT( void *buffer, unsigned int bytes, unsigned int *state, unsigned int *&next, int &left ) +{ + unsigned int offset=0; + unsigned int r; + while (bytes-offset>=sizeof(r)) + { + r = randomMT(state, next, left); + memcpy((char*)buffer+offset, &r, sizeof(r)); + offset+=sizeof(r); + } + + r = randomMT(state, next, left); + memcpy((char*)buffer+offset, &r, bytes-offset); +} + +float frandomMT( unsigned int *state, unsigned int *&next, int &left ) +{ + return ( float ) ( ( double ) randomMT(state, next, left) / 4294967296.0 ); +} +RakNetRandom::RakNetRandom() +{ + left=-1; +} +RakNetRandom::~RakNetRandom() +{ +} +void RakNetRandom::SeedMT( unsigned int seed ) +{ + printf("%i\n",seed); + seedMT(seed, state, next, left); +} + +unsigned int RakNetRandom::ReloadMT( void ) +{ + return reloadMT(state, next, left); +} + +unsigned int RakNetRandom::RandomMT( void ) +{ + return randomMT(state, next, left); +} + +float RakNetRandom::FrandomMT( void ) +{ + return frandomMT(state, next, left); +} + +void RakNetRandom::FillBufferMT( void *buffer, unsigned int bytes ) +{ + fillBufferMT(buffer, bytes, state, next, left); +} + +/* +int main(void) +{ +int j; + +// you can seed with any uint32, but the best are odds in 0..(2^32 - 1) + +seedMT(4357U); + +// print the first 2,002 random numbers seven to a line as an example + +for(j=0; j<2002; j++) +RAKNET_DEBUG_PRINTF(" %10lu%s", (unsigned int) randomMT(), (j%7)==6 ? "\n" : ""); + +return(EXIT_SUCCESS); +} + +*/ + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Rand.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Rand.h new file mode 100644 index 0000000..508e11a --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Rand.h @@ -0,0 +1,60 @@ +/// \file +/// \brief \b [Internal] Random number generator +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + + +#ifndef __RAND_H +#define __RAND_H + +#include "Export.h" + +/// Initialise seed for Random Generator +/// \note not threadSafe, use an instance of RakNetRandom if necessary per thread +/// \param[in] seed The seed value for the random number generator. +extern void RAK_DLL_EXPORT seedMT( unsigned int seed ); + +/// \internal +/// \note not threadSafe, use an instance of RakNetRandom if necessary per thread +extern unsigned int RAK_DLL_EXPORT reloadMT( void ); + +/// Gets a random unsigned int +/// \note not threadSafe, use an instance of RakNetRandom if necessary per thread +/// \return an integer random value. +extern unsigned int RAK_DLL_EXPORT randomMT( void ); + +/// Gets a random float +/// \note not threadSafe, use an instance of RakNetRandom if necessary per thread +/// \return 0 to 1.0f, inclusive +extern float RAK_DLL_EXPORT frandomMT( void ); + +/// Randomizes a buffer +/// \note not threadSafe, use an instance of RakNetRandom if necessary per thread +extern void RAK_DLL_EXPORT fillBufferMT( void *buffer, unsigned int bytes ); + +namespace RakNet { + +// Same thing as above functions, but not global +class RAK_DLL_EXPORT RakNetRandom +{ +public: + RakNetRandom(); + ~RakNetRandom(); + void SeedMT( unsigned int seed ); + unsigned int ReloadMT( void ); + unsigned int RandomMT( void ); + float FrandomMT( void ); + void FillBufferMT( void *buffer, unsigned int bytes ); + +protected: + unsigned int state[ 624 + 1 ]; + unsigned int *next; + int left; +}; + +} // namespace RakNet + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ReadyEvent.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ReadyEvent.cpp new file mode 100644 index 0000000..8e58542 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ReadyEvent.cpp @@ -0,0 +1,564 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_ReadyEvent==1 + +#include "ReadyEvent.h" +#include "RakPeerInterface.h" +#include "BitStream.h" +#include "MessageIdentifiers.h" +#include "RakAssert.h" + +#ifdef _MSC_VER +#pragma warning( push ) +#endif + +using namespace RakNet; + +int RakNet::ReadyEvent::RemoteSystemCompBySystemAddress( const SystemAddress &key, const RemoteSystem &data ) +{ + if (key < data.systemAddress) + return -1; + else if (key==data.systemAddress) + return 0; + else + return 1; +} + +int RakNet::ReadyEvent::ReadyEventNodeComp( const int &key, ReadyEvent::ReadyEventNode * const &data ) +{ + if (key < data->eventId) + return -1; + else if (key==data->eventId) + return 0; + else + return 1; +} + +STATIC_FACTORY_DEFINITIONS(ReadyEvent,ReadyEvent); + +ReadyEvent::ReadyEvent() +{ + channel=0; +} + +ReadyEvent::~ReadyEvent() +{ + Clear(); +} + + +bool ReadyEvent::SetEvent(int eventId, bool isReady) +{ + bool objectExists; + unsigned eventIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists); + if (objectExists==false) + { + // Totally new event + CreateNewEvent(eventId, isReady); + } + else + { + return SetEventByIndex(eventIndex, isReady); + } + return true; +} +bool ReadyEvent::ForceCompletion(int eventId) +{ + bool objectExists; + unsigned eventIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists); + if (objectExists==false) + { + // Totally new event + CreateNewEvent(eventId, true); + eventIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists); + } + + ReadyEventNode *ren = readyEventNodeList[eventIndex]; + ren->eventStatus=ID_READY_EVENT_FORCE_ALL_SET; + UpdateReadyStatus(eventIndex); + + return true; +} +bool ReadyEvent::DeleteEvent(int eventId) +{ + bool objectExists; + unsigned eventIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists); + if (objectExists) + { + RakNet::OP_DELETE(readyEventNodeList[eventIndex], _FILE_AND_LINE_); + readyEventNodeList.RemoveAtIndex(eventIndex); + return true; + } + return false; +} +bool ReadyEvent::IsEventSet(int eventId) +{ + bool objectExists; + unsigned eventIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists); + if (objectExists) + { + return readyEventNodeList[eventIndex]->eventStatus==ID_READY_EVENT_SET || readyEventNodeList[eventIndex]->eventStatus==ID_READY_EVENT_ALL_SET; + } + return false; +} +bool ReadyEvent::IsEventCompletionProcessing(int eventId) const +{ + bool objectExists; + unsigned eventIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists); + if (objectExists) + { + bool anyAllReady=false; + bool allAllReady=true; + ReadyEventNode *ren = readyEventNodeList[eventIndex]; + if (ren->eventStatus==ID_READY_EVENT_FORCE_ALL_SET) + return false; + for (unsigned i=0; i < ren->systemList.Size(); i++) + { + if (ren->systemList[i].lastReceivedStatus==ID_READY_EVENT_ALL_SET) + anyAllReady=true; + else + allAllReady=false; + } + return anyAllReady==true && allAllReady==false; + } + return false; +} +bool ReadyEvent::IsEventCompleted(int eventId) const +{ + bool objectExists; + unsigned eventIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists); + if (objectExists) + { + return IsEventCompletedByIndex(eventIndex); + } + return false; +} + +bool ReadyEvent::HasEvent(int eventId) +{ + return readyEventNodeList.HasData(eventId); +} + +unsigned ReadyEvent::GetEventListSize(void) const +{ + return readyEventNodeList.Size(); +} + +int ReadyEvent::GetEventAtIndex(unsigned index) const +{ + return readyEventNodeList[index]->eventId; +} + +bool ReadyEvent::AddToWaitList(int eventId, SystemAddress address) +{ + bool eventExists; + unsigned eventIndex = readyEventNodeList.GetIndexFromKey(eventId, &eventExists); + if (eventExists==false) + eventIndex=CreateNewEvent(eventId, false); + + // Don't do this, otherwise if we are trying to start a 3 player game, it will not allow the 3rd player to hit ready if the first two players have already done so + //if (IsLocked(eventIndex)) + // return false; // Not in the list, but event is already completed, or is starting to complete, and adding more waiters would fail this. + + unsigned i; + unsigned numAdded=0; + if (address==UNASSIGNED_SYSTEM_ADDRESS) + { + for (i=0; i < rakPeerInterface->GetMaximumNumberOfPeers(); i++) + { + SystemAddress internalAddress = rakPeerInterface->GetSystemAddressFromIndex(i); + if (internalAddress!=UNASSIGNED_SYSTEM_ADDRESS) + { + numAdded+=AddToWaitListInternal(eventIndex, internalAddress); + } + } + } + else + { + numAdded=AddToWaitListInternal(eventIndex, address); + } + + if (numAdded>0) + UpdateReadyStatus(eventIndex); + return numAdded>0; +} +bool ReadyEvent::RemoveFromWaitList(int eventId, SystemAddress address) +{ + bool eventExists; + unsigned eventIndex = readyEventNodeList.GetIndexFromKey(eventId, &eventExists); + if (eventExists) + { + if (address==UNASSIGNED_SYSTEM_ADDRESS) + { + // Remove all waiters + readyEventNodeList[eventIndex]->systemList.Clear(false, _FILE_AND_LINE_); + UpdateReadyStatus(eventIndex); + } + else + { + bool systemExists; + unsigned systemIndex = readyEventNodeList[eventIndex]->systemList.GetIndexFromKey(address, &systemExists); + if (systemExists) + { + bool isCompleted = IsEventCompletedByIndex(eventIndex); + readyEventNodeList[eventIndex]->systemList.RemoveAtIndex(systemIndex); + + if (isCompleted==false && IsEventCompletedByIndex(eventIndex)) + PushCompletionPacket(readyEventNodeList[eventIndex]->eventId); + + UpdateReadyStatus(eventIndex); + + return true; + } + } + } + + return false; +} +bool ReadyEvent::IsInWaitList(int eventId, SystemAddress address) +{ + bool objectExists; + unsigned readyIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists); + if (objectExists) + { + return readyEventNodeList[readyIndex]->systemList.HasData(address); + } + return false; +} + +unsigned ReadyEvent::GetRemoteWaitListSize(int eventId) const +{ + bool objectExists; + unsigned readyIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists); + if (objectExists) + { + return readyEventNodeList[readyIndex]->systemList.Size(); + } + return 0; +} + +SystemAddress ReadyEvent::GetFromWaitListAtIndex(int eventId, unsigned index) const +{ + bool objectExists; + unsigned readyIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists); + if (objectExists) + { + return readyEventNodeList[readyIndex]->systemList[index].systemAddress; + } + return UNASSIGNED_SYSTEM_ADDRESS; +} +ReadyEventSystemStatus ReadyEvent::GetReadyStatus(int eventId, SystemAddress address) +{ + bool objectExists; + unsigned readyIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists); + if (objectExists) + { + ReadyEventNode *ren = readyEventNodeList[readyIndex]; + unsigned systemIndex = ren->systemList.GetIndexFromKey(address, &objectExists); + if (objectExists==false) + return RES_NOT_WAITING; + if (ren->systemList[systemIndex].lastReceivedStatus==ID_READY_EVENT_SET) + return RES_READY; + if (ren->systemList[systemIndex].lastReceivedStatus==ID_READY_EVENT_UNSET) + return RES_WAITING; + if (ren->systemList[systemIndex].lastReceivedStatus==ID_READY_EVENT_ALL_SET) + return RES_ALL_READY; + } + + return RES_UNKNOWN_EVENT; +} +void ReadyEvent::SetSendChannel(unsigned char newChannel) +{ + channel=newChannel; +} +PluginReceiveResult ReadyEvent::OnReceive(Packet *packet) +{ + unsigned char packetIdentifier; + packetIdentifier = ( unsigned char ) packet->data[ 0 ]; + +// bool doPrint = packet->systemAddress.GetPort()==60002 || rakPeerInterface->GetInternalID(UNASSIGNED_SYSTEM_ADDRESS).GetPort()==60002; + + switch (packetIdentifier) + { + case ID_READY_EVENT_UNSET: + case ID_READY_EVENT_SET: + case ID_READY_EVENT_ALL_SET: +// if (doPrint) {if (packet->systemAddress.GetPort()==60002) RAKNET_DEBUG_PRINTF("FROM 60002: "); else if (rakPeerInterface->GetInternalID(UNASSIGNED_SYSTEM_ADDRESS).port==60002) RAKNET_DEBUG_PRINTF("TO 60002: "); RAKNET_DEBUG_PRINTF("ID_READY_EVENT_SET\n");} + OnReadyEventPacketUpdate(packet); + return RR_CONTINUE_PROCESSING; + case ID_READY_EVENT_FORCE_ALL_SET: + OnReadyEventForceAllSet(packet); + return RR_CONTINUE_PROCESSING; + case ID_READY_EVENT_QUERY: +// if (doPrint) {if (packet->systemAddress.GetPort()==60002) RAKNET_DEBUG_PRINTF("FROM 60002: "); else if (rakPeerInterface->GetInternalID(UNASSIGNED_SYSTEM_ADDRESS).port==60002) RAKNET_DEBUG_PRINTF("TO 60002: "); RAKNET_DEBUG_PRINTF("ID_READY_EVENT_QUERY\n");} + OnReadyEventQuery(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + + return RR_CONTINUE_PROCESSING; +} +bool ReadyEvent::AddToWaitListInternal(unsigned eventIndex, SystemAddress address) +{ + ReadyEventNode *ren = readyEventNodeList[eventIndex]; + bool objectExists; + unsigned systemIndex = ren->systemList.GetIndexFromKey(address, &objectExists); + if (objectExists==false) + { + RemoteSystem rs; + rs.lastReceivedStatus=ID_READY_EVENT_UNSET; + rs.lastSentStatus=ID_READY_EVENT_UNSET; + rs.systemAddress=address; + ren->systemList.InsertAtIndex(rs,systemIndex, _FILE_AND_LINE_); + + SendReadyStateQuery(ren->eventId, address); + return true; + } + return false; +} +void ReadyEvent::OnReadyEventForceAllSet(Packet *packet) +{ + RakNet::BitStream incomingBitStream(packet->data, packet->length, false); + incomingBitStream.IgnoreBits(8); + int eventId; + incomingBitStream.Read(eventId); + bool objectExists; + unsigned readyIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists); + if (objectExists) + { + ReadyEventNode *ren = readyEventNodeList[readyIndex]; + if (ren->eventStatus!=ID_READY_EVENT_FORCE_ALL_SET) + { + ren->eventStatus=ID_READY_EVENT_FORCE_ALL_SET; + PushCompletionPacket(ren->eventId); + } + } +} +void ReadyEvent::OnReadyEventPacketUpdate(Packet *packet) +{ + RakNet::BitStream incomingBitStream(packet->data, packet->length, false); + incomingBitStream.IgnoreBits(8); + int eventId; + incomingBitStream.Read(eventId); + bool objectExists; + unsigned readyIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists); + if (objectExists) + { + ReadyEventNode *ren = readyEventNodeList[readyIndex]; + bool systemExists; + unsigned systemIndex = ren->systemList.GetIndexFromKey(packet->systemAddress, &systemExists); + if (systemExists) + { + // Just return if no change + if (ren->systemList[systemIndex].lastReceivedStatus==packet->data[0]) + return; + + bool wasCompleted = IsEventCompletedByIndex(readyIndex); + ren->systemList[systemIndex].lastReceivedStatus=packet->data[0]; + // If forced all set, doesn't matter what the new packet is + if (ren->eventStatus==ID_READY_EVENT_FORCE_ALL_SET) + return; + UpdateReadyStatus(readyIndex); + if (wasCompleted==false && IsEventCompletedByIndex(readyIndex)) + PushCompletionPacket(readyIndex); + } + } +} +void ReadyEvent::OnReadyEventQuery(Packet *packet) +{ + RakNet::BitStream incomingBitStream(packet->data, packet->length, false); + incomingBitStream.IgnoreBits(8); + int eventId; + incomingBitStream.Read(eventId); + bool objectExists; + unsigned readyIndex = readyEventNodeList.GetIndexFromKey(eventId, &objectExists); + if (objectExists) + { + unsigned systemIndex = readyEventNodeList[readyIndex]->systemList.GetIndexFromKey(packet->systemAddress,&objectExists); + // Force the non-default send, because our initial send may have arrived at a system that didn't yet create the ready event + if (objectExists) + SendReadyUpdate(readyIndex, systemIndex, true); + } +} +void ReadyEvent::OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ) +{ + (void) systemAddress; + (void) rakNetGUID; + (void) lostConnectionReason; + + RemoveFromAllLists(systemAddress); +} +void ReadyEvent::OnRakPeerShutdown(void) +{ + Clear(); +} + +bool ReadyEvent::SetEventByIndex(int eventIndex, bool isReady) +{ + ReadyEventNode *ren = readyEventNodeList[eventIndex]; + if ((ren->eventStatus==ID_READY_EVENT_ALL_SET || ren->eventStatus==ID_READY_EVENT_SET) && isReady==true) + return true; // Success - no change + if (ren->eventStatus==ID_READY_EVENT_UNSET && isReady==false) + return true; // Success - no change + if (ren->eventStatus==ID_READY_EVENT_FORCE_ALL_SET) + return true; // Can't change + + if (isReady) + ren->eventStatus=ID_READY_EVENT_SET; + else + ren->eventStatus=ID_READY_EVENT_UNSET; + + UpdateReadyStatus(eventIndex); + + // Check if now completed, and if so, tell the user about it + if (IsEventCompletedByIndex(eventIndex)) + { + PushCompletionPacket(ren->eventId); + } + + return true; +} + +bool ReadyEvent::IsEventCompletedByIndex(unsigned eventIndex) const +{ + ReadyEventNode *ren = readyEventNodeList[eventIndex]; + unsigned i; + if (ren->eventStatus==ID_READY_EVENT_FORCE_ALL_SET) + return true; + if (ren->eventStatus!=ID_READY_EVENT_ALL_SET) + return false; + for (i=0; i < ren->systemList.Size(); i++) + if (ren->systemList[i].lastReceivedStatus!=ID_READY_EVENT_ALL_SET) + return false; + return true; +} + +void ReadyEvent::Clear(void) +{ + unsigned i; + for (i=0; i < readyEventNodeList.Size(); i++) + { + RakNet::OP_DELETE(readyEventNodeList[i], _FILE_AND_LINE_); + } + readyEventNodeList.Clear(false, _FILE_AND_LINE_); +} + +unsigned ReadyEvent::CreateNewEvent(int eventId, bool isReady) +{ + ReadyEventNode *ren = RakNet::OP_NEW( _FILE_AND_LINE_ ); + ren->eventId=eventId; + if (isReady==false) + ren->eventStatus=ID_READY_EVENT_UNSET; + else + ren->eventStatus=ID_READY_EVENT_SET; + return readyEventNodeList.Insert(eventId, ren, true, _FILE_AND_LINE_); +} +void ReadyEvent::UpdateReadyStatus(unsigned eventIndex) +{ + ReadyEventNode *ren = readyEventNodeList[eventIndex]; + bool anyUnset; + unsigned i; + if (ren->eventStatus==ID_READY_EVENT_SET) + { + // If you are set, and no other systems are ID_READY_EVENT_UNSET, then change your status to ID_READY_EVENT_ALL_SET + anyUnset=false; + for (i=0; i < ren->systemList.Size(); i++) + { + if (ren->systemList[i].lastReceivedStatus==ID_READY_EVENT_UNSET) + { + anyUnset=true; + break; + } + } + if (anyUnset==false) + { + ren->eventStatus=ID_READY_EVENT_ALL_SET; + } + } + else if (ren->eventStatus==ID_READY_EVENT_ALL_SET) + { + // If you are all set, and any systems are ID_READY_EVENT_UNSET, then change your status to ID_READY_EVENT_SET + anyUnset=false; + for (i=0; i < ren->systemList.Size(); i++) + { + if (ren->systemList[i].lastReceivedStatus==ID_READY_EVENT_UNSET) + { + anyUnset=true; + break; + } + } + if (anyUnset==true) + { + ren->eventStatus=ID_READY_EVENT_SET; + } + } + BroadcastReadyUpdate(eventIndex, false); +} +void ReadyEvent::SendReadyUpdate(unsigned eventIndex, unsigned systemIndex, bool forceIfNotDefault) +{ + ReadyEventNode *ren = readyEventNodeList[eventIndex]; + RakNet::BitStream bs; + // I do this rather than write true or false, so users that do not use BitStreams can still read the data + if ((ren->eventStatus!=ren->systemList[systemIndex].lastSentStatus) || + (forceIfNotDefault && ren->eventStatus!=ID_READY_EVENT_UNSET)) + { + bs.Write(ren->eventStatus); + bs.Write(ren->eventId); + SendUnified(&bs, HIGH_PRIORITY, RELIABLE_ORDERED, channel, ren->systemList[systemIndex].systemAddress, false); + + ren->systemList[systemIndex].lastSentStatus=ren->eventStatus; + } + +} +void ReadyEvent::BroadcastReadyUpdate(unsigned eventIndex, bool forceIfNotDefault) +{ + ReadyEventNode *ren = readyEventNodeList[eventIndex]; + unsigned systemIndex; + for (systemIndex=0; systemIndex < ren->systemList.Size(); systemIndex++) + { + SendReadyUpdate(eventIndex, systemIndex, forceIfNotDefault); + } +} +void ReadyEvent::SendReadyStateQuery(unsigned eventId, SystemAddress address) +{ + RakNet::BitStream bs; + bs.Write((MessageID)ID_READY_EVENT_QUERY); + bs.Write(eventId); + SendUnified(&bs, HIGH_PRIORITY, RELIABLE_ORDERED, channel, address, false); +} +void ReadyEvent::RemoveFromAllLists(SystemAddress address) +{ + unsigned eventIndex; + for (eventIndex=0; eventIndex < readyEventNodeList.Size(); eventIndex++) + { + bool isCompleted = IsEventCompletedByIndex(eventIndex); + bool systemExists; + unsigned systemIndex; + + systemIndex = readyEventNodeList[eventIndex]->systemList.GetIndexFromKey(address, &systemExists); + if (systemExists) + readyEventNodeList[eventIndex]->systemList.RemoveAtIndex(systemIndex); + + UpdateReadyStatus(eventIndex); + + if (isCompleted==false && IsEventCompletedByIndex(eventIndex)) + PushCompletionPacket(readyEventNodeList[eventIndex]->eventId); + } +} +void ReadyEvent::PushCompletionPacket(unsigned eventId) +{ + (void) eventId; + // Not necessary + /* + // Pass a packet to the user that we are now completed, as setting ourselves to signaled was the last thing being waited on + Packet *p = AllocatePacketUnified(sizeof(MessageID)+sizeof(int)); + RakNet::BitStream bs(p->data, sizeof(MessageID)+sizeof(int), false); + bs.SetWriteOffset(0); + bs.Write((MessageID)ID_READY_EVENT_ALL_SET); + bs.Write(eventId); + rakPeerInterface->PushBackPacket(p, false); + */ +} +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ReadyEvent.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ReadyEvent.h new file mode 100644 index 0000000..3b08dfc --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ReadyEvent.h @@ -0,0 +1,234 @@ +/// \file +/// \brief Ready event plugin. This enables a set of systems to create a signal event, set this signal as ready or unready, and to trigger the event when all systems are ready +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_ReadyEvent==1 + +#ifndef __READY_EVENT_H +#define __READY_EVENT_H + +#include "PluginInterface2.h" +#include "DS_OrderedList.h" + +namespace RakNet { + +class RakPeerInterface; + +/// \defgroup READY_EVENT_GROUP ReadyEvent +/// \brief Peer to peer synchronized ready and unready events +/// \details +/// \ingroup PLUGINS_GROUP + +/// \ingroup READY_EVENT_GROUP +/// Returns the status of a remote system when querying with ReadyEvent::GetReadyStatus +enum ReadyEventSystemStatus +{ + /// ----------- Normal states --------------- + /// The remote system is not in the wait list, and we have never gotten a ready or complete message from it. + /// This is the default state for valid events + RES_NOT_WAITING, + /// We are waiting for this remote system to call SetEvent(thisEvent,true). + RES_WAITING, + /// The remote system called SetEvent(thisEvent,true), but it still waiting for other systems before completing the ReadyEvent. + RES_READY, + /// The remote system called SetEvent(thisEvent,true), and is no longer waiting for any other systems. + /// This remote system has completed the ReadyEvent + RES_ALL_READY, + + /// Error code, we couldn't look up the system because the event was unknown + RES_UNKNOWN_EVENT, +}; + +/// \brief Peer to peer synchronized ready and unready events +/// \details For peer to peer networks in a fully connected mesh.
+/// Solves the problem of how to tell if all peers, relative to all other peers, are in a certain ready state.
+/// For example, if A is connected to B and C, A may see that B and C are ready, but does not know if B is ready to C, or vice-versa.
+/// This plugin uses two stages to solve that problem, first, everyone I know about is ready. Second, everyone I know about is ready to everyone they know about.
+/// The user will get ID_READY_EVENT_SET and ID_READY_EVENT_UNSET as the signal flag is set or unset
+/// The user will get ID_READY_EVENT_ALL_SET when all systems are done waiting for all other systems, in which case the event is considered complete, and no longer tracked.
+/// \sa FullyConnectedMesh2 +/// \ingroup READY_EVENT_GROUP +class ReadyEvent : public PluginInterface2 +{ +public: + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(ReadyEvent) + + // Constructor + ReadyEvent(); + + // Destructor + virtual ~ReadyEvent(); + + // -------------------------------------------------------------------------------------------- + // User functions + // -------------------------------------------------------------------------------------------- + /// Sets or updates the initial ready state for our local system. + /// If eventId is an unknown event the event is created. + /// If eventId was previously used and you want to reuse it, call DeleteEvent first, or else you will keep the same event signals from before + /// Systems previously or later added through AddToWaitList() with the same \a eventId when isReady=true will get ID_READY_EVENT_SET + /// Systems previously added through AddToWaitList with the same \a eventId will get ID_READY_EVENT_UNSET + /// For both ID_READY_EVENT_SET and ID_READY_EVENT_UNSET, eventId is encoded in bytes 1 through 1+sizeof(int) + /// \param[in] eventId A user-defined identifier to wait on. This can be a sequence counter, an event identifier, or anything else you want. + /// \param[in] isReady True to signal we are ready to proceed with this event, false to unsignal + /// \return True on success. False (failure) on unknown eventId + bool SetEvent(int eventId, bool isReady); + + /// When systems can call SetEvent() with isReady==false, it is possible for one system to return true from IsEventCompleted() while the other systems return false + /// This can occur if a system SetEvent() with isReady==false while the completion message is still being transmitted. + /// If your game has the situation where some action should be taken on all systems when IsEventCompleted() is true for any system, then call ForceCompletion() when the action begins. + /// This will force all systems to return true from IsEventCompleted(). + /// \param[in] eventId A user-defined identifier to immediately set as completed + bool ForceCompletion(int eventId); + + /// Deletes an event. We will no longer wait for this event, and any systems that we know have set the event will be forgotten. + /// Call this to clear memory when events are completed and you know you will never need them again. + /// \param[in] eventId A user-defined identifier + /// \return True on success. False (failure) on unknown eventId + bool DeleteEvent(int eventId); + + /// Returns what was passed to SetEvent() + /// \return The value of isReady passed to SetEvent(). Also returns false on unknown event. + bool IsEventSet(int eventId); + + /// Returns if the event is about to be ready and we are negotiating the final packets. + /// This will usually only be true for a very short time, after which IsEventCompleted should return true. + /// While this is true you cannot add to the wait list, or SetEvent() isReady to false anymore. + /// \param[in] eventId A user-defined identifier + /// \return True if any other system has completed processing. Will always be true if IsEventCompleted() is true + bool IsEventCompletionProcessing(int eventId) const; + + /// Returns if the wait list is a subset of the completion list. + /// Call this after all systems you want to wait for have been added with AddToWaitList + /// If you are waiting for a specific number of systems (such as players later connecting), also check GetRemoteWaitListSize(eventId) to be equal to 1 less than the total number of participants. + /// \param[in] eventId A user-defined identifier + /// \return True on completion. False (failure) on unknown eventId, or the set is not completed. + bool IsEventCompleted(int eventId) const; + + /// Returns if this is a known event. + /// Events may be known even if we never ourselves referenced them with SetEvent, because other systems created them via ID_READY_EVENT_SET. + /// \param[in] eventId A user-defined identifier + /// \return true if we have this event, false otherwise + bool HasEvent(int eventId); + + /// Returns the total number of events stored in the system. + /// \return The total number of events stored in the system. + unsigned GetEventListSize(void) const; + + /// Returns the event ID stored at a particular index. EventIDs are stored sorted from least to greatest. + /// \param[in] index Index into the array, from 0 to GetEventListSize() + /// \return The event ID stored at a particular index + int GetEventAtIndex(unsigned index) const; + + /// Adds a system to wait for to signal an event before considering the event complete and returning ID_READY_EVENT_ALL_SET. + /// As we add systems, if this event was previously set to true with SetEvent, these systems will get ID_READY_EVENT_SET. + /// As these systems disconnect (directly or indirectly through the router) they are removed. + /// \note If the event completion process has already started, you cannot add more systems, as this would cause the completion process to fail + /// \param[in] eventId A user-defined number previously passed to SetEvent that has not yet completed + /// \param[in] addressArray An address to wait for event replies from. Pass UNASSIGNED_SYSTEM_ADDRESS for all currently connected systems. Until all systems in this list have called SetEvent with this ID and true, and have this system in the list, we won't get ID_READY_EVENT_COMPLETE + /// \return True on success, false on unknown eventId (this should be considered an error), or if the completion process has already started. + bool AddToWaitList(int eventId, SystemAddress address); + + /// Removes systems from the wait list, which should have been previously added with AddToWaitList + /// \note Systems that directly or indirectly disconnect from us are automatically removed from the wait list + /// \param[in] address The system to remove from the wait list. Pass UNASSIGNED_SYSTEM_ADDRESS for all currently connected systems. + /// \return True on success, false on unknown eventId (this should be considered an error) + bool RemoveFromWaitList(int eventId, SystemAddress address); + + /// Returns if a particular system is waiting on a particular event. + /// \param[in] eventId A user-defined identifier + /// \param[in] The address of the system we are checking up on + /// \return True if this system is waiting on this event, false otherwise. + bool IsInWaitList(int eventId, SystemAddress address); + + /// Returns the total number of systems we are waiting on for this event. + /// Does not include yourself + /// \param[in] eventId A user-defined identifier + /// \return The total number of systems we are waiting on for this event. + unsigned GetRemoteWaitListSize(int eventId) const; + + /// Returns the system address of a system at a particular index, for this event. + /// \param[in] eventId A user-defined identifier + /// \param[in] index Index into the array, from 0 to GetWaitListSize() + /// \return The system address of a system at a particular index, for this event. + SystemAddress GetFromWaitListAtIndex(int eventId, unsigned index) const; + + /// For a remote system, find out what their ready status is (waiting, signaled, complete). + /// \param[in] eventId A user-defined identifier + /// \param[in] address Which system we are checking up on + /// \return The status of this system, for this particular event. \sa ReadyEventSystemStatus + ReadyEventSystemStatus GetReadyStatus(int eventId, SystemAddress address); + + /// This channel will be used for all RakPeer::Send calls + /// \param[in] newChannel The channel to use for internal RakPeer::Send calls from this system. Defaults to 0. + void SetSendChannel(unsigned char newChannel); + + // ---------------------------- ALL INTERNAL AFTER HERE ---------------------------- + /// \internal + /// Status of a remote system + struct RemoteSystem + { + MessageID lastSentStatus, lastReceivedStatus; + SystemAddress systemAddress; + }; + static int RemoteSystemCompBySystemAddress( const SystemAddress &key, const RemoteSystem &data ); + /// \internal + /// An event, with a set of systems we are waiting for, a set of systems that are signaled, and a set of systems with completed events + struct ReadyEventNode + { + int eventId; // Sorted on this + MessageID eventStatus; + DataStructures::OrderedList systemList; + }; + static int ReadyEventNodeComp( const int &key, ReadyEvent::ReadyEventNode * const &data ); + + +protected: + // -------------------------------------------------------------------------------------------- + // Packet handling functions + // -------------------------------------------------------------------------------------------- + virtual PluginReceiveResult OnReceive(Packet *packet); + virtual void OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ); + virtual void OnRakPeerShutdown(void); + + void Clear(void); + /* + bool AnyWaitersCompleted(unsigned eventIndex) const; + bool AllWaitersCompleted(unsigned eventIndex) const; + bool AllWaitersReady(unsigned eventIndex) const; + void SendAllReady(unsigned eventId, SystemAddress address); + void BroadcastAllReady(unsigned eventIndex); + void SendReadyStateQuery(unsigned eventId, SystemAddress address); + void BroadcastReadyUpdate(unsigned eventIndex); + bool AddToWaitListInternal(unsigned eventIndex, SystemAddress address); + bool IsLocked(unsigned eventIndex) const; + bool IsAllReadyByIndex(unsigned eventIndex) const; + */ + + void SendReadyStateQuery(unsigned eventId, SystemAddress address); + void SendReadyUpdate(unsigned eventIndex, unsigned systemIndex, bool forceIfNotDefault); + void BroadcastReadyUpdate(unsigned eventIndex, bool forceIfNotDefault); + void RemoveFromAllLists(SystemAddress address); + void OnReadyEventQuery(Packet *packet); + void PushCompletionPacket(unsigned eventId); + bool AddToWaitListInternal(unsigned eventIndex, SystemAddress address); + void OnReadyEventForceAllSet(Packet *packet); + void OnReadyEventPacketUpdate(Packet *packet); + void UpdateReadyStatus(unsigned eventIndex); + bool IsEventCompletedByIndex(unsigned eventIndex) const; + unsigned CreateNewEvent(int eventId, bool isReady); + bool SetEventByIndex(int eventIndex, bool isReady); + + DataStructures::OrderedList readyEventNodeList; + unsigned char channel; +}; + +} // namespace RakNet + +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RefCountedObj.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RefCountedObj.h new file mode 100644 index 0000000..f0064f9 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/RefCountedObj.h @@ -0,0 +1,25 @@ +/// \file +/// \brief \b Reference counted object. Very simple class for quick and dirty uses. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __REF_COUNTED_OBJ_H +#define __REF_COUNTED_OBJ_H + +#include "RakMemoryOverride.h" + +/// World's simplest class :) +class RefCountedObj +{ + public: + RefCountedObj() {refCount=1;} + virtual ~RefCountedObj() {} + void AddRef(void) {refCount++;} + void Deref(void) {if (--refCount==0) RakNet::OP_DELETE(this, _FILE_AND_LINE_);} + int refCount; +}; + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ReliabilityLayer.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ReliabilityLayer.cpp new file mode 100644 index 0000000..854acb1 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ReliabilityLayer.cpp @@ -0,0 +1,3827 @@ +/// \file +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#include "ReliabilityLayer.h" +#include "GetTime.h" +#include "SocketLayer.h" +#include "PluginInterface2.h" +#include "RakAssert.h" +#include "Rand.h" +#include "MessageIdentifiers.h" +#ifdef USE_THREADED_SEND +#include "SendToThread.h" +#endif +#include + +using namespace RakNet; + +// Can't figure out which library has this function on the PS3 +double Ceil(double d) {if (((double)((int)d))==d) return d; return (int) (d+1.0);} + +// #if defined(new) +// #pragma push_macro("new") +// #undef new +// #define RELIABILITY_LAYER_NEW_UNDEF_ALLOCATING_QUEUE +// #endif + + +//#define _DEBUG_LOGGER + +#if CC_TIME_TYPE_BYTES==4 +static const CCTimeType MAX_TIME_BETWEEN_PACKETS= 350; // 350 milliseconds +static const CCTimeType HISTOGRAM_RESTART_CYCLE=10000; // Every 10 seconds reset the histogram +#else +static const CCTimeType MAX_TIME_BETWEEN_PACKETS= 350000; // 350 milliseconds +//static const CCTimeType HISTOGRAM_RESTART_CYCLE=10000000; // Every 10 seconds reset the histogram +#endif +static const int DEFAULT_HAS_RECEIVED_PACKET_QUEUE_SIZE=512; +static const CCTimeType STARTING_TIME_BETWEEN_PACKETS=MAX_TIME_BETWEEN_PACKETS; +//static const long double TIME_BETWEEN_PACKETS_INCREASE_MULTIPLIER_DEFAULT=.02; +//static const long double TIME_BETWEEN_PACKETS_DECREASE_MULTIPLIER_DEFAULT=1.0 / 9.0; + +typedef uint32_t BitstreamLengthEncoding; + +#ifdef _MSC_VER +#pragma warning( push ) +#endif + +//#define PRINT_TO_FILE_ROT +#ifdef PRINT_TO_FILE_ROT +static FILE *fp=0; +#endif + +BPSTracker::TimeAndValue2::TimeAndValue2() {} +BPSTracker::TimeAndValue2::~TimeAndValue2() {} +BPSTracker::TimeAndValue2::TimeAndValue2(RakNet::TimeUS t, uint64_t v1) : value1(v1), time(t) {} +//BPSTracker::TimeAndValue2::TimeAndValue2(RakNet::TimeUS t, uint64_t v1, uint64_t v2) : time(t), value1(v1), value2(v2) {} +BPSTracker::BPSTracker() {Reset(_FILE_AND_LINE_);} +BPSTracker::~BPSTracker() {} +//void BPSTracker::Reset(const char *file, unsigned int line) {total1=total2=lastSec1=lastSec2=0; dataQueue.Clear(file,line);} +void BPSTracker::Reset(const char *file, unsigned int line) {total1=lastSec1=0; dataQueue.Clear(file,line);} +//void BPSTracker::Push2(RakNetTimeUS time, uint64_t value1, uint64_t value2) {dataQueue.Push(TimeAndValue2(time,value1,value2),_FILE_AND_LINE_); total1+=value1; lastSec1+=value1; total2+=value2; lastSec2+=value2;} +//uint64_t BPSTracker::GetBPS2(RakNetTimeUS time) {ClearExpired2(time); return lastSec2;} +//void BPSTracker::GetBPS1And2(RakNetTimeUS time, uint64_t &out1, uint64_t &out2) {ClearExpired2(time); out1=lastSec1; out2=lastSec2;} +uint64_t BPSTracker::GetTotal1(void) const {return total1;} +//uint64_t BPSTracker::GetTotal2(void) const {return total2;} + +// void BPSTracker::ClearExpired2(RakNet::TimeUS time) { +// RakNet::TimeUS threshold=time; +// if (threshold < 1000000) +// return; +// threshold-=1000000; +// while (dataQueue.IsEmpty()==false && dataQueue.Peek().time < threshold) +// { +// lastSec1-=dataQueue.Peek().value1; +// lastSec2-=dataQueue.Peek().value2; +// dataQueue.Pop(); +// } +// } +void BPSTracker::ClearExpired1(RakNet::TimeUS time) +{ + while (dataQueue.IsEmpty()==false && +#if CC_TIME_TYPE_BYTES==8 + dataQueue.Peek().time+1000000 < time +#else + dataQueue.Peek().time+1000 < time +#endif + ) + { + lastSec1-=dataQueue.Peek().value1; + dataQueue.Pop(); + } +} + +struct DatagramHeaderFormat +{ +#if INCLUDE_TIMESTAMP_WITH_DATAGRAMS==1 + CCTimeType sourceSystemTime; +#endif + DatagramSequenceNumberType datagramNumber; + + // Use floats to save bandwidth + // float B; // Link capacity + float AS; // Data arrival rate + bool isACK; + bool isNAK; + bool isPacketPair; + bool hasBAndAS; + bool isContinuousSend; + bool needsBAndAs; + bool isValid; // To differentiate between what I serialized, and offline data + + static BitSize_t GetDataHeaderBitLength() + { + return BYTES_TO_BITS(GetDataHeaderByteLength()); + } + + static unsigned int GetDataHeaderByteLength() + { + //return 2 + 3 + sizeof(RakNet::TimeMS) + sizeof(float)*2; + return 2 + 3 + +#if INCLUDE_TIMESTAMP_WITH_DATAGRAMS==1 + sizeof(RakNetTimeMS) + +#endif + sizeof(float)*1; + } + + void Serialize(RakNet::BitStream *b) + { + // Not endian safe + // RakAssert(GetDataHeaderByteLength()==sizeof(DatagramHeaderFormat)); + // b->WriteAlignedBytes((const unsigned char*) this, sizeof(DatagramHeaderFormat)); + // return; + + b->Write(true); // IsValid + if (isACK) + { + b->Write(true); + b->Write(hasBAndAS); + b->AlignWriteToByteBoundary(); +#if INCLUDE_TIMESTAMP_WITH_DATAGRAMS==1 + RakNet::TimeMS timeMSLow=(RakNet::TimeMS) sourceSystemTime&0xFFFFFFFF; b->Write(timeMSLow); +#endif + if (hasBAndAS) + { + // b->Write(B); + b->Write(AS); + } + } + else if (isNAK) + { + b->Write(false); + b->Write(true); + } + else + { + b->Write(false); + b->Write(false); + b->Write(isPacketPair); + b->Write(isContinuousSend); + b->Write(needsBAndAs); + b->AlignWriteToByteBoundary(); +#if INCLUDE_TIMESTAMP_WITH_DATAGRAMS==1 + RakNet::TimeMS timeMSLow=(RakNet::TimeMS) sourceSystemTime&0xFFFFFFFF; b->Write(timeMSLow); +#endif + b->Write(datagramNumber); + } + } + void Deserialize(RakNet::BitStream *b) + { + // Not endian safe + // b->ReadAlignedBytes((unsigned char*) this, sizeof(DatagramHeaderFormat)); + // return; + + b->Read(isValid); + b->Read(isACK); + if (isACK) + { + isNAK=false; + isPacketPair=false; + b->Read(hasBAndAS); + b->AlignReadToByteBoundary(); +#if INCLUDE_TIMESTAMP_WITH_DATAGRAMS==1 + RakNet::TimeMS timeMS; b->Read(timeMS); sourceSystemTime=(CCTimeType) timeMS; +#endif + if (hasBAndAS) + { + // b->Read(B); + b->Read(AS); + } + } + else + { + b->Read(isNAK); + if (isNAK) + { + isPacketPair=false; + } + else + { + b->Read(isPacketPair); + b->Read(isContinuousSend); + b->Read(needsBAndAs); + b->AlignReadToByteBoundary(); +#if INCLUDE_TIMESTAMP_WITH_DATAGRAMS==1 + RakNet::TimeMS timeMS; b->Read(timeMS); sourceSystemTime=(CCTimeType) timeMS; +#endif + b->Read(datagramNumber); + } + } + } +}; + +#if !defined(__GNUC__) && !defined(__ARMCC) +#pragma warning(disable:4702) // unreachable code +#endif + +#ifdef _WIN32 +//#define _DEBUG_LOGGER +#ifdef _DEBUG_LOGGER +#include "WindowsIncludes.h" +#endif +#endif + +//#define DEBUG_SPLIT_PACKET_PROBLEMS +#if defined (DEBUG_SPLIT_PACKET_PROBLEMS) +static int waitFlag=-1; +#endif + +using namespace RakNet; + +int RakNet::SplitPacketChannelComp( SplitPacketIdType const &key, SplitPacketChannel* const &data ) +{ +#if PREALLOCATE_LARGE_MESSAGES==1 + if (key < data->returnedPacket->splitPacketId) + return -1; + if (key == data->returnedPacket->splitPacketId) + return 0; +#else + if (key < data->splitPacketList[0]->splitPacketId) + return -1; + if (key == data->splitPacketList[0]->splitPacketId) + return 0; +#endif + return 1; +} + +// DEFINE_MULTILIST_PTR_TO_MEMBER_COMPARISONS( InternalPacket, SplitPacketIndexType, splitPacketIndex ) +/* +bool operator<( const DataStructures::MLKeyRef &inputKey, const InternalPacket *cls ) +{ + return inputKey.Get() < cls->splitPacketIndex; +} +bool operator>( const DataStructures::MLKeyRef &inputKey, const InternalPacket *cls ) +{ + return inputKey.Get() > cls->splitPacketIndex; +} +bool operator==( const DataStructures::MLKeyRef &inputKey, const InternalPacket *cls ) +{ + return inputKey.Get() == cls->splitPacketIndex; +} +/// Semi-hack: This is necessary to call Sort() +bool operator<( const DataStructures::MLKeyRef &inputKey, const InternalPacket *cls ) +{ + return inputKey.Get()->splitPacketIndex < cls->splitPacketIndex; +} +bool operator>( const DataStructures::MLKeyRef &inputKey, const InternalPacket *cls ) +{ + return inputKey.Get()->splitPacketIndex > cls->splitPacketIndex; +} +bool operator==( const DataStructures::MLKeyRef &inputKey, const InternalPacket *cls ) +{ + return inputKey.Get()->splitPacketIndex == cls->splitPacketIndex; +} +*/ + +int SplitPacketIndexComp( SplitPacketIndexType const &key, InternalPacket* const &data ) +{ +if (key < data->splitPacketIndex) +return -1; +if (key == data->splitPacketIndex) +return 0; +return 1; +} + +//------------------------------------------------------------------------------------------------------- +// Constructor +//------------------------------------------------------------------------------------------------------- +// Add 21 to the default MTU so if we encrypt it can hold potentially 21 more bytes of extra data + padding. +ReliabilityLayer::ReliabilityLayer() +{ + +#ifdef _DEBUG + // Wait longer to disconnect in debug so I don't get disconnected while tracing + timeoutTime=30000; +#else + timeoutTime=10000; +#endif + +#ifdef _DEBUG + minExtraPing=extraPingVariance=0; + packetloss=(double) minExtraPing; +#endif + + +#ifdef PRINT_TO_FILE_ROT + if (fp==0 && 0) + { + fp = fopen("reliableorderedoutput.txt", "wt"); + } +#endif + + InitializeVariables(); +//int i = sizeof(InternalPacket); + datagramHistoryMessagePool.SetPageSize(sizeof(MessageNumberNode)*128); + internalPacketPool.SetPageSize(sizeof(InternalPacket)*INTERNAL_PACKET_PAGE_SIZE); + refCountedDataPool.SetPageSize(sizeof(InternalPacketRefCountedData)*32); +} + +//------------------------------------------------------------------------------------------------------- +// Destructor +//------------------------------------------------------------------------------------------------------- +ReliabilityLayer::~ReliabilityLayer() +{ + FreeMemory( true ); // Free all memory immediately +} +//------------------------------------------------------------------------------------------------------- +// Resets the layer for reuse +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::Reset( bool resetVariables, int MTUSize, bool _useSecurity ) +{ + + FreeMemory( true ); // true because making a memory reset pending in the update cycle causes resets after reconnects. Instead, just call Reset from a single thread + if (resetVariables) + { + InitializeVariables(); + +#if LIBCAT_SECURITY==1 + useSecurity = _useSecurity; + + if (_useSecurity) + MTUSize -= cat::AuthenticatedEncryption::OVERHEAD_BYTES; +#else + (void) _useSecurity; +#endif // LIBCAT_SECURITY + congestionManager.Init(RakNet::GetTimeUS(), MTUSize - UDP_HEADER_SIZE); + } +} + +//------------------------------------------------------------------------------------------------------- +// Set the time, in MS, to use before considering ourselves disconnected after not being able to deliver a reliable packet +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::SetTimeoutTime( RakNet::TimeMS time ) +{ + timeoutTime=time; +} + +//------------------------------------------------------------------------------------------------------- +// Returns the value passed to SetTimeoutTime. or the default if it was never called +//------------------------------------------------------------------------------------------------------- +RakNet::TimeMS ReliabilityLayer::GetTimeoutTime(void) +{ + return timeoutTime; +} + +//------------------------------------------------------------------------------------------------------- +// Initialize the variables +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::InitializeVariables( void ) +{ + memset( orderedWriteIndex, 0, NUMBER_OF_ORDERED_STREAMS * sizeof(OrderingIndexType)); + memset( sequencedWriteIndex, 0, NUMBER_OF_ORDERED_STREAMS * sizeof(OrderingIndexType) ); + memset( orderedReadIndex, 0, NUMBER_OF_ORDERED_STREAMS * sizeof(OrderingIndexType) ); + memset( highestSequencedReadIndex, 0, NUMBER_OF_ORDERED_STREAMS * sizeof(OrderingIndexType) ); + memset( &statistics, 0, sizeof( statistics ) ); + memset( &heapIndexOffsets, 0, sizeof( heapIndexOffsets ) ); + + statistics.connectionStartTime = RakNet::GetTimeUS(); + splitPacketId = 0; + elapsedTimeSinceLastUpdate=0; + throughputCapCountdown=0; + sendReliableMessageNumberIndex = 0; + internalOrderIndex=0; + timeToNextUnreliableCull=0; + unreliableLinkedListHead=0; + lastUpdateTime= RakNet::GetTimeUS(); + bandwidthExceededStatistic=false; + remoteSystemTime=0; + unreliableTimeout=0; + lastBpsClear=0; + + // Disable packet pairs + countdownToNextPacketPair=15; + + nextAllowedThroughputSample=0; + deadConnection = cheater = false; + timeOfLastContinualSend=0; + + // timeResendQueueNonEmpty = 0; + timeLastDatagramArrived=RakNet::GetTimeMS(); + // packetlossThisSample=false; + // backoffThisSample=0; + // packetlossThisSampleResendCount=0; + // lastPacketlossTime=0; + statistics.messagesInResendBuffer=0; + statistics.bytesInResendBuffer=0; + + receivedPacketsBaseIndex=0; + resetReceivedPackets=true; + receivePacketCount=0; + + // SetPing( 1000 ); + + timeBetweenPackets=STARTING_TIME_BETWEEN_PACKETS; + + ackPingIndex=0; + ackPingSum=(CCTimeType)0; + + nextSendTime=lastUpdateTime; + //nextLowestPingReset=(CCTimeType)0; + // continuousSend=false; + + // histogramStart=(CCTimeType)0; + // histogramBitsSent=0; + unacknowledgedBytes=0; + resendLinkedListHead=0; + totalUserDataBytesAcked=0; + + datagramHistoryPopCount=0; + + InitHeapWeights(); + for (int i=0; i < NUMBER_OF_PRIORITIES; i++) + { + statistics.messageInSendBuffer[i]=0; + statistics.bytesInSendBuffer[i]=0.0; + } + + for (int i=0; i < RNS_PER_SECOND_METRICS_COUNT; i++) + { + bpsMetrics[i].Reset(_FILE_AND_LINE_); + } +} + +//------------------------------------------------------------------------------------------------------- +// Frees all allocated memory +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::FreeMemory( bool freeAllImmediately ) +{ + (void) freeAllImmediately; + FreeThreadSafeMemory(); +} + +void ReliabilityLayer::FreeThreadSafeMemory( void ) +{ + unsigned i,j; + InternalPacket *internalPacket; + + ClearPacketsAndDatagrams(); + + for (i=0; i < splitPacketChannelList.Size(); i++) + { + for (j=0; j < splitPacketChannelList[i]->splitPacketList.Size(); j++) + { + FreeInternalPacketData(splitPacketChannelList[i]->splitPacketList[j], _FILE_AND_LINE_ ); + ReleaseToInternalPacketPool( splitPacketChannelList[i]->splitPacketList[j] ); + } +#if PREALLOCATE_LARGE_MESSAGES==1 + if (splitPacketChannelList[i]->returnedPacket) + { + FreeInternalPacketData(splitPacketChannelList[i]->returnedPacket, __FILE__, __LINE__ ); + ReleaseToInternalPacketPool( splitPacketChannelList[i]->returnedPacket ); + } +#endif + RakNet::OP_DELETE(splitPacketChannelList[i], __FILE__, __LINE__); + } + splitPacketChannelList.Clear(false, _FILE_AND_LINE_); + + while ( outputQueue.Size() > 0 ) + { + internalPacket = outputQueue.Pop(); + FreeInternalPacketData(internalPacket, _FILE_AND_LINE_ ); + ReleaseToInternalPacketPool( internalPacket ); + } + + outputQueue.ClearAndForceAllocation( 32, _FILE_AND_LINE_ ); + + /* + for ( i = 0; i < orderingList.Size(); i++ ) + { + if ( orderingList[ i ] ) + { + DataStructures::LinkedList* theList = orderingList[ i ]; + + if ( theList ) + { + while ( theList->Size() ) + { + internalPacket = orderingList[ i ]->Pop(); + FreeInternalPacketData(internalPacket, _FILE_AND_LINE_ ); + ReleaseToInternalPacketPool( internalPacket ); + } + + RakNet::OP_DELETE(theList, _FILE_AND_LINE_); + } + } + } + + orderingList.Clear(false, _FILE_AND_LINE_); + */ + + for (i=0; i < NUMBER_OF_ORDERED_STREAMS; i++) + { + for (j=0; j < orderingHeaps[i].Size(); j++) + { + FreeInternalPacketData(orderingHeaps[i][j], _FILE_AND_LINE_ ); + ReleaseToInternalPacketPool( orderingHeaps[i][j] ); + } + orderingHeaps[i].Clear(true, _FILE_AND_LINE_); + } + + //resendList.ForEachData(DeleteInternalPacket); + // resendTree.Clear(_FILE_AND_LINE_); + memset(resendBuffer, 0, sizeof(resendBuffer)); + statistics.messagesInResendBuffer=0; + statistics.bytesInResendBuffer=0; + + if (resendLinkedListHead) + { + InternalPacket *prev; + InternalPacket *iter = resendLinkedListHead; + while (1) + { + if (iter->data) + FreeInternalPacketData(iter, _FILE_AND_LINE_ ); + prev=iter; + iter=iter->resendNext; + if (iter==resendLinkedListHead) + { + ReleaseToInternalPacketPool(prev); + break; + } + ReleaseToInternalPacketPool(prev); + } + resendLinkedListHead=0; + } + unacknowledgedBytes=0; + + // acknowlegements.Clear(_FILE_AND_LINE_); + + for ( j=0 ; j < outgoingPacketBuffer.Size(); j++ ) + { + if ( outgoingPacketBuffer[ j ]->data) + FreeInternalPacketData( outgoingPacketBuffer[ j ], _FILE_AND_LINE_ ); + ReleaseToInternalPacketPool( outgoingPacketBuffer[ j ] ); + } + + outgoingPacketBuffer.Clear(true, _FILE_AND_LINE_); + +#ifdef _DEBUG + for (unsigned i = 0; i < delayList.Size(); i++ ) + RakNet::OP_DELETE(delayList[ i ], __FILE__, __LINE__); + delayList.Clear(__FILE__, __LINE__); +#endif + + unreliableWithAckReceiptHistory.Clear(false, _FILE_AND_LINE_); + + packetsToSendThisUpdate.Clear(false, _FILE_AND_LINE_); + packetsToSendThisUpdate.Preallocate(512, _FILE_AND_LINE_); + packetsToDeallocThisUpdate.Clear(false, _FILE_AND_LINE_); + packetsToDeallocThisUpdate.Preallocate(512, _FILE_AND_LINE_); + packetsToSendThisUpdateDatagramBoundaries.Clear(false, _FILE_AND_LINE_); + packetsToSendThisUpdateDatagramBoundaries.Preallocate(128, _FILE_AND_LINE_); + datagramSizesInBytes.Clear(false, _FILE_AND_LINE_); + datagramSizesInBytes.Preallocate(128, _FILE_AND_LINE_); + + internalPacketPool.Clear(_FILE_AND_LINE_); + + refCountedDataPool.Clear(_FILE_AND_LINE_); + + /* + DataStructures::Page *cur = datagramMessageIDTree.GetListHead(); + while (cur) + { + int treeIndex; + for (treeIndex=0; treeIndex < cur->size; treeIndex++) + ReleaseToDatagramMessageIDPool(cur->data[treeIndex]); + cur=cur->resendNext; + } + datagramMessageIDTree.Clear(_FILE_AND_LINE_); + datagramMessageIDPool.Clear(_FILE_AND_LINE_); + */ + + while (datagramHistory.Size()) + { + RemoveFromDatagramHistory(datagramHistoryPopCount); + datagramHistory.Pop(); + datagramHistoryPopCount++; + } + datagramHistoryMessagePool.Clear(_FILE_AND_LINE_); + datagramHistoryPopCount=0; + + acknowlegements.Clear(); + NAKs.Clear(); + + unreliableLinkedListHead=0; +} + +//------------------------------------------------------------------------------------------------------- +// Packets are read directly from the socket layer and skip the reliability +//layer because unconnected players do not use the reliability layer +// This function takes packet data after a player has been confirmed as +//connected. The game should not use that data directly +// because some data is used internally, such as packet acknowledgment and +//split packets +//------------------------------------------------------------------------------------------------------- +bool ReliabilityLayer::HandleSocketReceiveFromConnectedPlayer( + const char *buffer, unsigned int length, SystemAddress &systemAddress, DataStructures::List &messageHandlerList, int MTUSize, + SOCKET s, RakNetRandom *rnr, unsigned short remotePortRakNetWasStartedOn_PS3, unsigned int extraSocketOptions, CCTimeType timeRead, + BitStream &updateBitStream) +{ +#ifdef _DEBUG + RakAssert( !( buffer == 0 ) ); +#endif + +#if CC_TIME_TYPE_BYTES==4 + timeRead/=1000; +#endif + + + bpsMetrics[(int) ACTUAL_BYTES_RECEIVED].Push1(timeRead,length); + + (void) MTUSize; + + if ( length <= 2 || buffer == 0 ) // Length of 1 is a connection request resend that we just ignore + { + for (unsigned int messageHandlerIndex=0; messageHandlerIndex < messageHandlerList.Size(); messageHandlerIndex++) + messageHandlerList[messageHandlerIndex]->OnReliabilityLayerPacketError("length <= 2 || buffer == 0", BYTES_TO_BITS(length), systemAddress); + return true; + } + + timeLastDatagramArrived=RakNet::GetTimeMS(); + + // CCTimeType time; +// bool indexFound; +// int count, size; + DatagramSequenceNumberType holeCount; + unsigned i; + +#if LIBCAT_SECURITY==1 + if (useSecurity) + { + unsigned int received = length; + + if (!auth_enc.Decrypt((cat::u8*)buffer, received)) + return false; + + length = received; + } +#endif + + RakNet::BitStream socketData( (unsigned char*) buffer, length, false ); // Convert the incoming data to a bitstream for easy parsing + // time = RakNet::GetTimeUS(); + + // Set to the current time if it is not zero, and we get incoming data + // if (timeResendQueueNonEmpty!=0) + // timeResendQueueNonEmpty=timeRead; + + DatagramHeaderFormat dhf; + dhf.Deserialize(&socketData); + if (dhf.isValid==false) + { + for (unsigned int messageHandlerIndex=0; messageHandlerIndex < messageHandlerList.Size(); messageHandlerIndex++) + messageHandlerList[messageHandlerIndex]->OnReliabilityLayerPacketError("dhf.isValid==false", BYTES_TO_BITS(length), systemAddress); + + return true; + } + if (dhf.isACK) + { + DatagramSequenceNumberType datagramNumber; + // datagramNumber=dhf.datagramNumber; + +#if INCLUDE_TIMESTAMP_WITH_DATAGRAMS==1 + RakNet::TimeMS timeMSLow=(RakNet::TimeMS) timeRead&0xFFFFFFFF; + CCTimeType rtt = timeMSLow-dhf.sourceSystemTime; +#if CC_TIME_TYPE_BYTES==4 + if (rtt > 10000) +#else + if (rtt > 10000000) +#endif + { + // Sanity check. This could happen due to type overflow, especially since I only send the low 4 bytes to reduce bandwidth + rtt=(CCTimeType) congestionManager.GetRTT(); + } + // RakAssert(rtt < 500000); + // printf("%i ", (RakNet::TimeMS)(rtt/1000)); + ackPing=rtt; +#endif + +#ifdef _DEBUG + if (dhf.hasBAndAS==false) + { + // dhf.B=0; + dhf.AS=0; + } +#endif + // congestionManager.OnAck(timeRead, rtt, dhf.hasBAndAS, dhf.B, dhf.AS, totalUserDataBytesAcked ); + + + incomingAcks.Clear(); + if (incomingAcks.Deserialize(&socketData)==false) + { + for (unsigned int messageHandlerIndex=0; messageHandlerIndex < messageHandlerList.Size(); messageHandlerIndex++) + messageHandlerList[messageHandlerIndex]->OnReliabilityLayerPacketError("incomingAcks.Deserialize failed", BYTES_TO_BITS(length), systemAddress); + + return false; + } + for (i=0; iincomingAcks.ranges[i].maxIndex) + { + RakAssert(incomingAcks.ranges[i].minIndex<=incomingAcks.ranges[i].maxIndex); + + for (unsigned int messageHandlerIndex=0; messageHandlerIndex < messageHandlerList.Size(); messageHandlerIndex++) + messageHandlerList[messageHandlerIndex]->OnReliabilityLayerPacketError("incomingAcks minIndex > maxIndex", BYTES_TO_BITS(length), systemAddress); + return false; + } + for (datagramNumber=incomingAcks.ranges[i].minIndex; datagramNumber >= incomingAcks.ranges[i].minIndex && datagramNumber <= incomingAcks.ranges[i].maxIndex; datagramNumber++) + { + CCTimeType whenSent; + + if (unreliableWithAckReceiptHistory.Size()>0) + { + unsigned int k=0; + while (k < unreliableWithAckReceiptHistory.Size()) + { + if (unreliableWithAckReceiptHistory[k].datagramNumber == datagramNumber) + { + InternalPacket *ackReceipt = AllocateFromInternalPacketPool(); + AllocInternalPacketData(ackReceipt, 5, false, _FILE_AND_LINE_ ); + ackReceipt->dataBitLength=BYTES_TO_BITS(5); + ackReceipt->data[0]=(MessageID)ID_SND_RECEIPT_ACKED; + memcpy(ackReceipt->data+sizeof(MessageID), &unreliableWithAckReceiptHistory[k].sendReceiptSerial, sizeof(uint32_t)); + outputQueue.Push(ackReceipt, _FILE_AND_LINE_ ); + + // Remove, swap with last + unreliableWithAckReceiptHistory.RemoveAtIndex(k); + } + else + k++; + } + } + + MessageNumberNode *messageNumberNode = GetMessageNumberNodeByDatagramIndex(datagramNumber, &whenSent); + if (messageNumberNode) + { + // printf("%p Got ack for %i\n", this, datagramNumber.val); +#if INCLUDE_TIMESTAMP_WITH_DATAGRAMS==1 + congestionManager.OnAck(timeRead, rtt, dhf.hasBAndAS, 0, dhf.AS, totalUserDataBytesAcked, bandwidthExceededStatistic, datagramNumber ); +#else + CCTimeType ping; + if (timeRead>whenSent) + ping=timeRead-whenSent; + else + ping=0; + congestionManager.OnAck(timeRead, ping, dhf.hasBAndAS, 0, dhf.AS, totalUserDataBytesAcked, bandwidthExceededStatistic, datagramNumber ); +#endif + while (messageNumberNode) + { + // TESTING1 +// printf("Remove %i on ack for datagramNumber=%i.\n", messageNumberNode->messageNumber.val, datagramNumber.val); + + RemovePacketFromResendListAndDeleteOlderReliableSequenced( messageNumberNode->messageNumber, timeRead, messageHandlerList, systemAddress ); + messageNumberNode=messageNumberNode->next; + } + + RemoveFromDatagramHistory(datagramNumber); + } +// else if (isReliable) +// { +// // Previously used slot, rather than empty unreliable slot +// printf("%p Ack %i is duplicate\n", this, datagramNumber.val); +// +// congestionManager.OnDuplicateAck(timeRead, datagramNumber); +// } + } + } + } + else if (dhf.isNAK) + { + DatagramSequenceNumberType messageNumber; + DataStructures::RangeList incomingNAKs; + if (incomingNAKs.Deserialize(&socketData)==false) + { + for (unsigned int messageHandlerIndex=0; messageHandlerIndex < messageHandlerList.Size(); messageHandlerIndex++) + messageHandlerList[messageHandlerIndex]->OnReliabilityLayerPacketError("incomingNAKs.Deserialize failed", BYTES_TO_BITS(length), systemAddress); + + return false; + } + for (i=0; iincomingNAKs.ranges[i].maxIndex) + { + RakAssert(incomingNAKs.ranges[i].minIndex<=incomingNAKs.ranges[i].maxIndex); + + for (unsigned int messageHandlerIndex=0; messageHandlerIndex < messageHandlerList.Size(); messageHandlerIndex++) + messageHandlerList[messageHandlerIndex]->OnReliabilityLayerPacketError("incomingNAKs minIndex>maxIndex", BYTES_TO_BITS(length), systemAddress); + + return false; + } + // Sanity check + RakAssert(incomingNAKs.ranges[i].maxIndex.val-incomingNAKs.ranges[i].minIndex.val<1000); + for (messageNumber=incomingNAKs.ranges[i].minIndex; messageNumber >= incomingNAKs.ranges[i].minIndex && messageNumber <= incomingNAKs.ranges[i].maxIndex; messageNumber++) + { + congestionManager.OnNAK(timeRead, messageNumber); + + // REMOVEME + // printf("%p NAK %i\n", this, dhf.datagramNumber.val); + + + CCTimeType timeSent; + MessageNumberNode *messageNumberNode = GetMessageNumberNodeByDatagramIndex(messageNumber, &timeSent); + while (messageNumberNode) + { + // Update timers so resends occur immediately + InternalPacket *internalPacket = resendBuffer[messageNumberNode->messageNumber & (uint32_t) RESEND_BUFFER_ARRAY_MASK]; + if (internalPacket) + { + if (internalPacket->nextActionTime!=0) + { + internalPacket->nextActionTime=timeRead; + } + } + + messageNumberNode=messageNumberNode->next; + } + } + } + } + else + { + uint32_t skippedMessageCount; + if (!congestionManager.OnGotPacket(dhf.datagramNumber, dhf.isContinuousSend, timeRead, length, &skippedMessageCount)) + { + for (unsigned int messageHandlerIndex=0; messageHandlerIndex < messageHandlerList.Size(); messageHandlerIndex++) + messageHandlerList[messageHandlerIndex]->OnReliabilityLayerPacketError("congestionManager.OnGotPacket failed", BYTES_TO_BITS(length), systemAddress); + + return true; + } + if (dhf.isPacketPair) + congestionManager.OnGotPacketPair(dhf.datagramNumber, length, timeRead); + + DatagramHeaderFormat dhfNAK; + dhfNAK.isNAK=true; + uint32_t skippedMessageOffset; + for (skippedMessageOffset=skippedMessageCount; skippedMessageOffset > 0; skippedMessageOffset--) + { + NAKs.Insert(dhf.datagramNumber-skippedMessageOffset); + } + remoteSystemNeedsBAndAS=dhf.needsBAndAs; + + // Ack dhf.datagramNumber + // Ack even unreliable messages for congestion control, just don't resend them on no ack +#if INCLUDE_TIMESTAMP_WITH_DATAGRAMS==1 + SendAcknowledgementPacket( dhf.datagramNumber, dhf.sourceSystemTime); +#else + SendAcknowledgementPacket( dhf.datagramNumber, 0); +#endif + + InternalPacket* internalPacket = CreateInternalPacketFromBitStream( &socketData, timeRead ); + if (internalPacket==0) + { + for (unsigned int messageHandlerIndex=0; messageHandlerIndex < messageHandlerList.Size(); messageHandlerIndex++) + messageHandlerList[messageHandlerIndex]->OnReliabilityLayerPacketError("CreateInternalPacketFromBitStream failed", BYTES_TO_BITS(length), systemAddress); + + return true; + } + + while ( internalPacket ) + { + for (unsigned int messageHandlerIndex=0; messageHandlerIndex < messageHandlerList.Size(); messageHandlerIndex++) + { +#if CC_TIME_TYPE_BYTES==4 + messageHandlerList[messageHandlerIndex]->OnInternalPacket(internalPacket, receivePacketCount, systemAddress, timeRead, false); +#else + messageHandlerList[messageHandlerIndex]->OnInternalPacket(internalPacket, receivePacketCount, systemAddress, (RakNet::TimeMS)(timeRead/(CCTimeType)1000), false); +#endif + } + + { + + // resetReceivedPackets is set from a non-threadsafe function. + // We do the actual reset in this function so the data is not modified by multiple threads + if (resetReceivedPackets) + { + hasReceivedPacketQueue.ClearAndForceAllocation(DEFAULT_HAS_RECEIVED_PACKET_QUEUE_SIZE, _FILE_AND_LINE_); + receivedPacketsBaseIndex=0; + resetReceivedPackets=false; + } + + // Check for corrupt orderingChannel + if ( + internalPacket->reliability == RELIABLE_SEQUENCED || + internalPacket->reliability == UNRELIABLE_SEQUENCED || + internalPacket->reliability == RELIABLE_ORDERED + ) + { + if ( internalPacket->orderingChannel >= NUMBER_OF_ORDERED_STREAMS ) + { + for (unsigned int messageHandlerIndex=0; messageHandlerIndex < messageHandlerList.Size(); messageHandlerIndex++) + messageHandlerList[messageHandlerIndex]->OnReliabilityLayerPacketError("internalPacket->orderingChannel >= NUMBER_OF_ORDERED_STREAMS", BYTES_TO_BITS(length), systemAddress); + + bpsMetrics[(int) USER_MESSAGE_BYTES_RECEIVED_IGNORED].Push1(timeRead,BITS_TO_BYTES(internalPacket->dataBitLength)); + + FreeInternalPacketData(internalPacket, _FILE_AND_LINE_ ); + ReleaseToInternalPacketPool( internalPacket ); + goto CONTINUE_SOCKET_DATA_PARSE_LOOP; + } + } + + // 8/12/09 was previously not checking if the message was reliable. However, on packetloss this would mean you'd eventually exceed the + // hole count because unreliable messages were never resent, and you'd stop getting messages + if (internalPacket->reliability == RELIABLE || internalPacket->reliability == RELIABLE_SEQUENCED || internalPacket->reliability == RELIABLE_ORDERED ) + { + // If the following conditional is true then this either a duplicate packet + // or an older out of order packet + // The subtraction unsigned overflow is intentional + holeCount = (DatagramSequenceNumberType)(internalPacket->reliableMessageNumber-receivedPacketsBaseIndex); + const DatagramSequenceNumberType typeRange = (DatagramSequenceNumberType)(const uint32_t)-1; + + // TESTING1 +// printf("waiting on reliableMessageNumber=%i holeCount=%i datagramNumber=%i\n", receivedPacketsBaseIndex.val, holeCount.val, dhf.datagramNumber.val); + + if (holeCount==(DatagramSequenceNumberType) 0) + { + // Got what we were expecting + if (hasReceivedPacketQueue.Size()) + hasReceivedPacketQueue.Pop(); + ++receivedPacketsBaseIndex; + } + else if (holeCount > typeRange/(DatagramSequenceNumberType) 2) + { + bpsMetrics[(int) USER_MESSAGE_BYTES_RECEIVED_IGNORED].Push1(timeRead,BITS_TO_BYTES(internalPacket->dataBitLength)); + + // Duplicate packet + FreeInternalPacketData(internalPacket, _FILE_AND_LINE_ ); + ReleaseToInternalPacketPool( internalPacket ); + + goto CONTINUE_SOCKET_DATA_PARSE_LOOP; + } + else if ((unsigned int) holeCountdataBitLength)); + + // Duplicate packet + FreeInternalPacketData(internalPacket, _FILE_AND_LINE_ ); + ReleaseToInternalPacketPool( internalPacket ); + + goto CONTINUE_SOCKET_DATA_PARSE_LOOP; + } + } + else // holeCount>=receivedPackets.Size() + { + if (holeCount > (DatagramSequenceNumberType) 1000000) + { + RakAssert("Hole count too high. See ReliabilityLayer.h" && 0); + + for (unsigned int messageHandlerIndex=0; messageHandlerIndex < messageHandlerList.Size(); messageHandlerIndex++) + messageHandlerList[messageHandlerIndex]->OnReliabilityLayerPacketError("holeCount > 1000000", BYTES_TO_BITS(length), systemAddress); + + bpsMetrics[(int) USER_MESSAGE_BYTES_RECEIVED_IGNORED].Push1(timeRead,BITS_TO_BYTES(internalPacket->dataBitLength)); + + // Would crash due to out of memory! + FreeInternalPacketData(internalPacket, _FILE_AND_LINE_ ); + ReleaseToInternalPacketPool( internalPacket ); + + goto CONTINUE_SOCKET_DATA_PARSE_LOOP; + } + + + // Fix - sending on a higher priority gives us a very very high received packets base index if we formerly had pre-split a lot of messages and + // used that as the message number. Because of this, a lot of time is spent in this linear loop and the timeout time expires because not + // all of the message is sent in time. + // Fixed by late assigning message IDs on the sender + + // Add 0 times to the queue until (reliableMessageNumber - baseIndex) < queue size. + while ((unsigned int)(holeCount) > hasReceivedPacketQueue.Size()) + hasReceivedPacketQueue.Push(true, _FILE_AND_LINE_ ); // time+(CCTimeType)60 * (CCTimeType)1000 * (CCTimeType)1000); // Didn't get this packet - set the time to give up waiting + hasReceivedPacketQueue.Push(false, _FILE_AND_LINE_ ); // Got the packet +#ifdef _DEBUG + // If this assert hits then DatagramSequenceNumberType has overflowed + RakAssert(hasReceivedPacketQueue.Size() < (unsigned int)((DatagramSequenceNumberType)(const uint32_t)(-1))); +#endif + } + + while ( hasReceivedPacketQueue.Size()>0 && hasReceivedPacketQueue.Peek()==false ) + { + hasReceivedPacketQueue.Pop(); + ++receivedPacketsBaseIndex; + } + } + + // If the allocated buffer is > DEFAULT_HAS_RECEIVED_PACKET_QUEUE_SIZE and it is 3x greater than the number of elements actually being used + if (hasReceivedPacketQueue.AllocationSize() > (unsigned int) DEFAULT_HAS_RECEIVED_PACKET_QUEUE_SIZE && hasReceivedPacketQueue.AllocationSize() > hasReceivedPacketQueue.Size() * 3) + hasReceivedPacketQueue.Compress(_FILE_AND_LINE_); + + + /* + if ( internalPacket->reliability == RELIABLE_SEQUENCED || internalPacket->reliability == UNRELIABLE_SEQUENCED ) + { +#ifdef _DEBUG + RakAssert( internalPacket->orderingChannel < NUMBER_OF_ORDERED_STREAMS ); +#endif + + if ( internalPacket->orderingChannel >= NUMBER_OF_ORDERED_STREAMS ) + { + + FreeInternalPacketData(internalPacket, _FILE_AND_LINE_ ); + ReleaseToInternalPacketPool( internalPacket ); + + for (unsigned int messageHandlerIndex=0; messageHandlerIndex < messageHandlerList.Size(); messageHandlerIndex++) + messageHandlerList[messageHandlerIndex]->OnReliabilityLayerPacketError("internalPacket->orderingChannel >= NUMBER_OF_ORDERED_STREAMS", BYTES_TO_BITS(length), systemAddress); + + bpsMetrics[(int) USER_MESSAGE_BYTES_RECEIVED_IGNORED].Push1(timeRead,BITS_TO_BYTES(internalPacket->dataBitLength)); + + goto CONTINUE_SOCKET_DATA_PARSE_LOOP; + } + + if ( IsOlderOrderedPacket( internalPacket->orderingIndex, waitingForSequencedPacketReadIndex[ internalPacket->orderingChannel ] ) == false ) + { + // Is this a split packet? + if ( internalPacket->splitPacketCount > 0 ) + { + // Generate the split + // Verify some parameters to make sure we don't get junk data + + + // Check for a rebuilt packet + InsertIntoSplitPacketList( internalPacket, timeRead ); + bpsMetrics[(int) USER_MESSAGE_BYTES_RECEIVED_PROCESSED].Push1(timeRead,BITS_TO_BYTES(internalPacket->dataBitLength)); + + // Sequenced + internalPacket = BuildPacketFromSplitPacketList( internalPacket->splitPacketId, timeRead, + s, systemAddress, rnr, remotePortRakNetWasStartedOn_PS3, extraSocketOptions); + + if ( internalPacket ) + { + // Update our index to the newest packet + waitingForSequencedPacketReadIndex[ internalPacket->orderingChannel ] = internalPacket->orderingIndex + (OrderingIndexType)1; + + // If there is a rebuilt packet, add it to the output queue + outputQueue.Push( internalPacket, _FILE_AND_LINE_ ); + internalPacket = 0; + } + + // else don't have all the parts yet + } + else + { + // Update our index to the newest packet + waitingForSequencedPacketReadIndex[ internalPacket->orderingChannel ] = internalPacket->orderingIndex + (OrderingIndexType)1; + + // Not a split packet. Add the packet to the output queue + bpsMetrics[(int) USER_MESSAGE_BYTES_RECEIVED_PROCESSED].Push1(timeRead,BITS_TO_BYTES(internalPacket->dataBitLength)); + outputQueue.Push( internalPacket, _FILE_AND_LINE_ ); + internalPacket = 0; + } + } + else + { + // Older sequenced packet. Discard it + FreeInternalPacketData(internalPacket, _FILE_AND_LINE_ ); + ReleaseToInternalPacketPool( internalPacket ); + + bpsMetrics[(int) USER_MESSAGE_BYTES_RECEIVED_IGNORED].Push1(timeRead,BITS_TO_BYTES(internalPacket->dataBitLength)); + + } + + goto CONTINUE_SOCKET_DATA_PARSE_LOOP; + } + + // Is this an unsequenced split packet? + if ( internalPacket->splitPacketCount > 0 ) + { + // Check for a rebuilt packet + if ( internalPacket->reliability != RELIABLE_ORDERED ) + internalPacket->orderingChannel = 255; // Use 255 to designate not sequenced and not ordered + + InsertIntoSplitPacketList( internalPacket, timeRead ); + + internalPacket = BuildPacketFromSplitPacketList( internalPacket->splitPacketId, timeRead, + s, systemAddress, rnr, remotePortRakNetWasStartedOn_PS3, extraSocketOptions); + + if ( internalPacket == 0 ) + { + + // Don't have all the parts yet + goto CONTINUE_SOCKET_DATA_PARSE_LOOP; + } + } + */ + + /* + if ( internalPacket->reliability == RELIABLE_ORDERED ) + { +#ifdef _DEBUG + RakAssert( internalPacket->orderingChannel < NUMBER_OF_ORDERED_STREAMS ); +#endif + + if ( internalPacket->orderingChannel >= NUMBER_OF_ORDERED_STREAMS ) + { + // Invalid packet + FreeInternalPacketData(internalPacket, _FILE_AND_LINE_ ); + ReleaseToInternalPacketPool( internalPacket ); + + bpsMetrics[(int) USER_MESSAGE_BYTES_RECEIVED_IGNORED].Push1(timeRead,BITS_TO_BYTES(internalPacket->dataBitLength)); + + goto CONTINUE_SOCKET_DATA_PARSE_LOOP; + } + + bpsMetrics[(int) USER_MESSAGE_BYTES_RECEIVED_PROCESSED].Push1(timeRead,BITS_TO_BYTES(internalPacket->dataBitLength)); + + if ( waitingForOrderedPacketReadIndex[ internalPacket->orderingChannel ] == internalPacket->orderingIndex ) + { + // Get the list to hold ordered packets for this stream + DataStructures::LinkedList *orderingListAtOrderingStream; + unsigned char orderingChannelCopy = internalPacket->orderingChannel; + + // Push the packet for the user to read + outputQueue.Push( internalPacket, _FILE_AND_LINE_ ); + internalPacket = 0; // Don't reference this any longer since other threads access it + + // Wait for the resendNext ordered packet in sequence + waitingForOrderedPacketReadIndex[ orderingChannelCopy ] ++; // This wraps + + orderingListAtOrderingStream = GetOrderingListAtOrderingStream( orderingChannelCopy ); + + if ( orderingListAtOrderingStream != 0) + { + while ( orderingListAtOrderingStream->Size() > 0 ) + { + // Cycle through the list until nothing is found + orderingListAtOrderingStream->Beginning(); + indexFound=false; + size=orderingListAtOrderingStream->Size(); + count=0; + + while (count++ < size) + { + if ( orderingListAtOrderingStream->Peek()->orderingIndex == waitingForOrderedPacketReadIndex[ orderingChannelCopy ] ) + { + outputQueue.Push( orderingListAtOrderingStream->Pop(), _FILE_AND_LINE_ ); + waitingForOrderedPacketReadIndex[ orderingChannelCopy ]++; + indexFound=true; + } + else + (*orderingListAtOrderingStream)++; + } + + if (indexFound==false) + break; + } + } + internalPacket = 0; + } + else + { + // This is a newer ordered packet than we are waiting for. Store it for future use + AddToOrderingList( internalPacket ); + } + + + goto CONTINUE_SOCKET_DATA_PARSE_LOOP; + } + */ + + // Is this a split packet? If so then reassemble + if ( internalPacket->splitPacketCount > 0 ) + { + // Check for a rebuilt packet + if ( internalPacket->reliability != RELIABLE_ORDERED && internalPacket->reliability!=RELIABLE_SEQUENCED && internalPacket->reliability!=UNRELIABLE_SEQUENCED) + internalPacket->orderingChannel = 255; // Use 255 to designate not sequenced and not ordered + + InsertIntoSplitPacketList( internalPacket, timeRead ); + + internalPacket = BuildPacketFromSplitPacketList( internalPacket->splitPacketId, timeRead, + s, systemAddress, rnr, remotePortRakNetWasStartedOn_PS3, extraSocketOptions, updateBitStream); + + if ( internalPacket == 0 ) + { + // Don't have all the parts yet + goto CONTINUE_SOCKET_DATA_PARSE_LOOP; + } + } + + if (internalPacket->reliability == RELIABLE_SEQUENCED || + internalPacket->reliability == UNRELIABLE_SEQUENCED || + internalPacket->reliability == RELIABLE_ORDERED) + { +#ifdef PRINT_TO_FILE_ROT + // ___________________ + BitStream bitStream(internalPacket->data, BITS_TO_BYTES(internalPacket->dataBitLength), false); + unsigned int receivedPacketNumber; + RakNet::Time receivedTime; + unsigned char streamNumber; + PacketReliability reliability; + // ___________________ + + + bitStream.IgnoreBits(8); // Ignore ID_TIMESTAMP + bitStream.Read(receivedTime); + bitStream.IgnoreBits(8); // Ignore ID_USER_ENUM+1 + bitStream.Read(receivedPacketNumber); + bitStream.Read(streamNumber); + bitStream.Read(reliability); + char *type="UNDEFINED"; + if (reliability==UNRELIABLE_SEQUENCED) + type="UNRELIABLE_SEQUENCED"; + else if (reliability==RELIABLE_ORDERED) + type="RELIABLE_ORDERED"; + // ___________________ +#endif + + + if (internalPacket->orderingIndex==orderedReadIndex[internalPacket->orderingChannel]) + { + // Has current ordering index + if (internalPacket->reliability == RELIABLE_SEQUENCED || + internalPacket->reliability == UNRELIABLE_SEQUENCED) + { + // Is sequenced + if (IsOlderOrderedPacket(internalPacket->sequencingIndex,highestSequencedReadIndex[internalPacket->orderingChannel])==false) + { + // Expected or highest known value + + // Update highest sequence + highestSequencedReadIndex[internalPacket->orderingChannel] = internalPacket->sequencingIndex; + +#ifdef PRINT_TO_FILE_ROT + if (fp) + { + fprintf(fp, "Returning %i, %s by fallthrough. OI=%i. SI=%i.\n", receivedPacketNumber, type, internalPacket->orderingIndex.val, internalPacket->sequencingIndex); + fflush(fp); + } +#endif + + // Fallthrough, returned to user below + } + else + { +#ifdef PRINT_TO_FILE_ROT + if (fp) + { + fprintf(fp, "Discarding %i, %s late sequenced. OI=%i. SI=%i.\n", receivedPacketNumber, type, internalPacket->orderingIndex.val, internalPacket->sequencingIndex); + fflush(fp); + } +#endif + + // Lower than highest known value + FreeInternalPacketData(internalPacket, _FILE_AND_LINE_ ); + ReleaseToInternalPacketPool( internalPacket ); + + goto CONTINUE_SOCKET_DATA_PARSE_LOOP; + } + } + else + { + // Push to output buffer immediately + bpsMetrics[(int) USER_MESSAGE_BYTES_RECEIVED_PROCESSED].Push1(timeRead,BITS_TO_BYTES(internalPacket->dataBitLength)); + outputQueue.Push( internalPacket, _FILE_AND_LINE_ ); + +#ifdef PRINT_TO_FILE_ROT + if (fp) + { + fprintf(fp, "outputting immediate %i, %s. OI=%i. SI=%i.", receivedPacketNumber, type, internalPacket->orderingIndex.val, internalPacket->sequencingIndex); + if (orderingHeaps[internalPacket->orderingChannel].Size()==0) + fprintf(fp, "heap empty\n"); + else + fprintf(fp, "heap head=%i\n", orderingHeaps[internalPacket->orderingChannel].Peek()->orderingIndex.val); + fflush(fp); + } +#endif + + orderedReadIndex[internalPacket->orderingChannel]++; + highestSequencedReadIndex[internalPacket->orderingChannel] = 0; + + // Return off heap until order lost + while (orderingHeaps[internalPacket->orderingChannel].Size()>0 && + orderingHeaps[internalPacket->orderingChannel].Peek()->orderingIndex==orderedReadIndex[internalPacket->orderingChannel]) + { + internalPacket = orderingHeaps[internalPacket->orderingChannel].Pop(0); + +#ifdef PRINT_TO_FILE_ROT + BitStream bitStream2(internalPacket->data, BITS_TO_BYTES(internalPacket->dataBitLength), false); + bitStream2.IgnoreBits(8); // Ignore ID_TIMESTAMP + bitStream2.Read(receivedTime); + bitStream2.IgnoreBits(8); // Ignore ID_USER_ENUM+1 + bitStream2.Read(receivedPacketNumber); + bitStream2.Read(streamNumber); + bitStream2.Read(reliability); + char *type="UNDEFINED"; + if (reliability==UNRELIABLE_SEQUENCED) + type="UNRELIABLE_SEQUENCED"; + else if (reliability==RELIABLE_ORDERED) + type="RELIABLE_ORDERED"; + + if (fp) + { + fprintf(fp, "Heap pop %i, %s. OI=%i. SI=%i.\n", receivedPacketNumber, type, internalPacket->orderingIndex.val, internalPacket->sequencingIndex); + fflush(fp); + } +#endif + + bpsMetrics[(int) USER_MESSAGE_BYTES_RECEIVED_PROCESSED].Push1(timeRead,BITS_TO_BYTES(internalPacket->dataBitLength)); + outputQueue.Push( internalPacket, _FILE_AND_LINE_ ); + + if (internalPacket->reliability == RELIABLE_ORDERED) + { + orderedReadIndex[internalPacket->orderingChannel]++; + } + else + { + highestSequencedReadIndex[internalPacket->orderingChannel] = internalPacket->sequencingIndex; + } + } + + // Done + goto CONTINUE_SOCKET_DATA_PARSE_LOOP; + } + } + else if (IsOlderOrderedPacket(internalPacket->orderingIndex,orderedReadIndex[internalPacket->orderingChannel])==false) + { + // internalPacket->_orderingIndex is greater + // If a message has a greater ordering index, and is sequenced or ordered, buffer it + // Sequenced has a lower heap weight, ordered has max sequenced weight + + // Keep orderedHoleCount count small + if (orderingHeaps[internalPacket->orderingChannel].Size()==0) + heapIndexOffsets[internalPacket->orderingChannel]=orderedReadIndex[internalPacket->orderingChannel]; + + reliabilityHeapWeightType orderedHoleCount = internalPacket->orderingIndex-heapIndexOffsets[internalPacket->orderingChannel]; + reliabilityHeapWeightType weight = orderedHoleCount*1048576; + if (internalPacket->reliability == RELIABLE_SEQUENCED || + internalPacket->reliability == UNRELIABLE_SEQUENCED) + weight+=internalPacket->sequencingIndex; + else + weight+=(1048576-1); + orderingHeaps[internalPacket->orderingChannel].Push(weight, internalPacket, _FILE_AND_LINE_); + +#ifdef PRINT_TO_FILE_ROT + if (fp) + { + fprintf(fp, "Heap push %i, %s, weight=%"PRINTF_64_BIT_MODIFIER"u. OI=%i. waiting on %i. SI=%i.\n", receivedPacketNumber, type, weight, internalPacket->orderingIndex.val, orderedReadIndex[internalPacket->orderingChannel].val, internalPacket->sequencingIndex); + fflush(fp); + } +#endif + + // Buffered, nothing to do + goto CONTINUE_SOCKET_DATA_PARSE_LOOP; + } + else + { + // Out of order + FreeInternalPacketData(internalPacket, _FILE_AND_LINE_ ); + ReleaseToInternalPacketPool( internalPacket ); + + // Ignored, nothing to do + goto CONTINUE_SOCKET_DATA_PARSE_LOOP; + } + + } + + bpsMetrics[(int) USER_MESSAGE_BYTES_RECEIVED_PROCESSED].Push1(timeRead,BITS_TO_BYTES(internalPacket->dataBitLength)); + + // Nothing special about this packet. Add it to the output queue + outputQueue.Push( internalPacket, _FILE_AND_LINE_ ); + + internalPacket = 0; + } + + // Used for a goto to jump to the resendNext packet immediately + +CONTINUE_SOCKET_DATA_PARSE_LOOP: + // Parse the bitstream to create an internal packet + internalPacket = CreateInternalPacketFromBitStream( &socketData, timeRead ); + } + + } + + + receivePacketCount++; + + return true; +} + +//------------------------------------------------------------------------------------------------------- +// This gets an end-user packet already parsed out. Returns number of BITS put into the buffer +//------------------------------------------------------------------------------------------------------- +BitSize_t ReliabilityLayer::Receive( unsigned char **data ) +{ + InternalPacket * internalPacket; + + if ( outputQueue.Size() > 0 ) + { + // #ifdef _DEBUG + // RakAssert(bitStream->GetNumberOfBitsUsed()==0); + // #endif + internalPacket = outputQueue.Pop(); + + BitSize_t bitLength; + *data = internalPacket->data; + bitLength = internalPacket->dataBitLength; + ReleaseToInternalPacketPool( internalPacket ); + return bitLength; + } + + else + { + return 0; + } + +} + +//------------------------------------------------------------------------------------------------------- +// Puts data on the send queue +// bitStream contains the data to send +// priority is what priority to send the data at +// reliability is what reliability to use +// ordering channel is from 0 to 255 and specifies what stream to use +//------------------------------------------------------------------------------------------------------- +bool ReliabilityLayer::Send( char *data, BitSize_t numberOfBitsToSend, PacketPriority priority, PacketReliability reliability, unsigned char orderingChannel, bool makeDataCopy, int MTUSize, CCTimeType currentTime, uint32_t receipt ) +{ +#ifdef _DEBUG + RakAssert( !( reliability >= NUMBER_OF_RELIABILITIES || reliability < 0 ) ); + RakAssert( !( priority > NUMBER_OF_PRIORITIES || priority < 0 ) ); + RakAssert( !( orderingChannel >= NUMBER_OF_ORDERED_STREAMS ) ); + RakAssert( numberOfBitsToSend > 0 ); +#endif + +#if CC_TIME_TYPE_BYTES==4 + currentTime/=1000; +#endif + + (void) MTUSize; + + // int a = BITS_TO_BYTES(numberOfBitsToSend); + + // Fix any bad parameters + if ( reliability > RELIABLE_ORDERED_WITH_ACK_RECEIPT || reliability < 0 ) + reliability = RELIABLE; + + if ( priority > NUMBER_OF_PRIORITIES || priority < 0 ) + priority = HIGH_PRIORITY; + + if ( orderingChannel >= NUMBER_OF_ORDERED_STREAMS ) + orderingChannel = 0; + + unsigned int numberOfBytesToSend=(unsigned int) BITS_TO_BYTES(numberOfBitsToSend); + if ( numberOfBitsToSend == 0 ) + { + return false; + } + InternalPacket * internalPacket = AllocateFromInternalPacketPool(); + if (internalPacket==0) + { + notifyOutOfMemory(_FILE_AND_LINE_); + return false; // Out of memory + } + + bpsMetrics[(int) USER_MESSAGE_BYTES_PUSHED].Push1(currentTime,numberOfBytesToSend); + + internalPacket->creationTime = currentTime; + + if ( makeDataCopy ) + { + AllocInternalPacketData(internalPacket, numberOfBytesToSend, true, _FILE_AND_LINE_ ); + //internalPacket->data = (unsigned char*) rakMalloc_Ex( numberOfBytesToSend, _FILE_AND_LINE_ ); + memcpy( internalPacket->data, data, numberOfBytesToSend ); + } + else + { + // Allocated the data elsewhere, delete it in here + //internalPacket->data = ( unsigned char* ) data; + AllocInternalPacketData(internalPacket, (unsigned char*) data ); + } + + internalPacket->dataBitLength = numberOfBitsToSend; + internalPacket->messageInternalOrder = internalOrderIndex++; + internalPacket->priority = priority; + internalPacket->reliability = reliability; + internalPacket->sendReceiptSerial=receipt; + + // Calculate if I need to split the packet + // int headerLength = BITS_TO_BYTES( GetMessageHeaderLengthBits( internalPacket, true ) ); + + unsigned int maxDataSizeBytes = GetMaxDatagramSizeExcludingMessageHeaderBytes() - BITS_TO_BYTES(GetMaxMessageHeaderLengthBits()); + + bool splitPacket = numberOfBytesToSend > maxDataSizeBytes; + + // If a split packet, we might have to upgrade the reliability + if ( splitPacket ) + { + // Split packets cannot be unreliable, in case that one part doesn't arrive and the whole cannot be reassembled. + // One part could not arrive either due to packetloss or due to unreliable discard + if (internalPacket->reliability==UNRELIABLE) + internalPacket->reliability=RELIABLE; + else if (internalPacket->reliability==UNRELIABLE_WITH_ACK_RECEIPT) + internalPacket->reliability=RELIABLE_WITH_ACK_RECEIPT; + else if (internalPacket->reliability==UNRELIABLE_SEQUENCED) + internalPacket->reliability=RELIABLE_SEQUENCED; +// else if (internalPacket->reliability==UNRELIABLE_SEQUENCED_WITH_ACK_RECEIPT) +// internalPacket->reliability=RELIABLE_SEQUENCED_WITH_ACK_RECEIPT; + } + + // ++sendMessageNumberIndex; + + if ( internalPacket->reliability == RELIABLE_SEQUENCED || + internalPacket->reliability == UNRELIABLE_SEQUENCED +// || +// internalPacket->reliability == RELIABLE_SEQUENCED_WITH_ACK_RECEIPT || +// internalPacket->reliability == UNRELIABLE_SEQUENCED_WITH_ACK_RECEIPT + ) + { + // Assign the sequence stream and index + internalPacket->orderingChannel = orderingChannel; + internalPacket->orderingIndex = orderedWriteIndex[ orderingChannel ]; + internalPacket->sequencingIndex = sequencedWriteIndex[ orderingChannel ]++; + + // This packet supersedes all other sequenced packets on the same ordering channel + // Delete all packets in all send lists that are sequenced and on the same ordering channel + // UPDATE: + // Disabled. We don't have enough info to consistently do this. Sometimes newer data does supercede + // older data such as with constantly declining health, but not in all cases. + // For example, with sequenced unreliable sound packets just because you send a newer one doesn't mean you + // don't need the older ones because the odds are they will still arrive in order + /* + for (int i=0; i < NUMBER_OF_PRIORITIES; i++) + { + DeleteSequencedPacketsInList(orderingChannel, sendQueue[i]); + } + */ + } + else if ( internalPacket->reliability == RELIABLE_ORDERED || internalPacket->reliability == RELIABLE_ORDERED_WITH_ACK_RECEIPT ) + { + // Assign the ordering channel and index + internalPacket->orderingChannel = orderingChannel; + internalPacket->orderingIndex = orderedWriteIndex[ orderingChannel ] ++; + sequencedWriteIndex[ orderingChannel ]=0; + } + + if ( splitPacket ) // If it uses a secure header it will be generated here + { + // Must split the packet. This will also generate the SHA1 if it is required. It also adds it to the send list. + //InternalPacket packetCopy; + //memcpy(&packetCopy, internalPacket, sizeof(InternalPacket)); + //sendPacketSet[priority].CancelWriteLock(internalPacket); + //SplitPacket( &packetCopy, MTUSize ); + SplitPacket( internalPacket ); + //RakNet::OP_DELETE_ARRAY(packetCopy.data, _FILE_AND_LINE_); + return true; + } + + RakAssert(internalPacket->dataBitLengthdataBitLengthmessageNumberAssigned==false); + outgoingPacketBuffer.Push( GetNextWeight(internalPacket->priority), internalPacket, _FILE_AND_LINE_ ); + RakAssert(outgoingPacketBuffer.Size()==0 || outgoingPacketBuffer.Peek()->dataBitLengthpriority]++; + statistics.bytesInSendBuffer[(int)internalPacket->priority]+=(double) BITS_TO_BYTES(internalPacket->dataBitLength); + + // sendPacketSet[priority].WriteUnlock(); + return true; +} +//------------------------------------------------------------------------------------------------------- +// Run this once per game cycle. Handles internal lists and actually does the send +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::Update( SOCKET s, SystemAddress &systemAddress, int MTUSize, CCTimeType time, + unsigned bitsPerSecondLimit, + DataStructures::List &messageHandlerList, + RakNetRandom *rnr, unsigned short remotePortRakNetWasStartedOn_PS3, unsigned int extraSocketOptions, + BitStream &updateBitStream) + +{ + (void) MTUSize; + + RakNet::TimeMS timeMs; +#if CC_TIME_TYPE_BYTES==4 + time/=1000; + timeMs=time; +#else + timeMs=(RakNet::TimeMS) (time/(CCTimeType)1000); +#endif + +#ifdef _DEBUG + while (delayList.Size()) + { + if (delayList.Peek()->sendTime <= timeMs) + { + DataAndTime *dat = delayList.Pop(); + SocketLayer::SendTo( dat->s, dat->data, dat->length, systemAddress, dat->remotePortRakNetWasStartedOn_PS3, dat->extraSocketOptions, __FILE__, __LINE__ ); + RakNet::OP_DELETE(dat,__FILE__,__LINE__); + } + break; + } +#endif + + // This line is necessary because the timer isn't accurate + if (time <= lastUpdateTime) + { + // Always set the last time in case of overflow + lastUpdateTime=time; + return; + } + + CCTimeType timeSinceLastTick = time - lastUpdateTime; + lastUpdateTime=time; +#if CC_TIME_TYPE_BYTES==4 + if (timeSinceLastTick>100) + timeSinceLastTick=100; +#else + if (timeSinceLastTick>100000) + timeSinceLastTick=100000; +#endif + + if (unreliableTimeout>0) + { + if (timeSinceLastTick>=timeToNextUnreliableCull) + { + if (unreliableLinkedListHead) + { + // Cull out all unreliable messages that have exceeded the timeout + InternalPacket *cur = unreliableLinkedListHead; + InternalPacket *end = unreliableLinkedListHead->unreliablePrev; + while (1) + { + if (time > cur->creationTime+(CCTimeType)unreliableTimeout) + { + // Flag invalid, and clear the memory. Still needs to be removed from the sendPacketSet later + // This fixes a problem where a remote system disconnects, but we don't know it yet, and memory consumption increases to a huge value + FreeInternalPacketData(cur, _FILE_AND_LINE_ ); + cur->data=0; + InternalPacket *next = cur->unreliableNext; + RemoveFromUnreliableLinkedList(cur); + + if (cur==end) + break; + + cur=next; + } + else + { + // if (cur==end) + // break; + // + // cur=cur->unreliableNext; + + // They should be inserted in-order, so no need to iterate past the first failure + break; + } + } + } + + timeToNextUnreliableCull=unreliableTimeout/(CCTimeType)2; + } + else + { + timeToNextUnreliableCull-=timeSinceLastTick; + } + } + + + // Due to thread vagarities and the way I store the time to avoid slow calls to RakNet::GetTime + // time may be less than lastAck +#if CC_TIME_TYPE_BYTES==4 + if ( statistics.messagesInResendBuffer!=0 && AckTimeout(time) ) +#else + if ( statistics.messagesInResendBuffer!=0 && AckTimeout(RakNet::TimeMS(time/(CCTimeType)1000)) ) +#endif + { + // SHOW - dead connection + // We've waited a very long time for a reliable packet to get an ack and it never has + deadConnection = true; + return; + } + + if (congestionManager.ShouldSendACKs(time,timeSinceLastTick)) + { + SendACKs(s, systemAddress, time, rnr, remotePortRakNetWasStartedOn_PS3, extraSocketOptions, updateBitStream); + } + + if (NAKs.Size()>0) + { + updateBitStream.Reset(); + DatagramHeaderFormat dhfNAK; + dhfNAK.isNAK=true; + dhfNAK.isACK=false; + dhfNAK.isPacketPair=false; + dhfNAK.Serialize(&updateBitStream); + NAKs.Serialize(&updateBitStream, GetMaxDatagramSizeExcludingMessageHeaderBits(), true); + SendBitStream( s, systemAddress, &updateBitStream, rnr, remotePortRakNetWasStartedOn_PS3, extraSocketOptions, time ); + } + + DatagramHeaderFormat dhf; + dhf.needsBAndAs=congestionManager.GetIsInSlowStart(); + dhf.isContinuousSend=bandwidthExceededStatistic; + // bandwidthExceededStatistic=sendPacketSet[0].IsEmpty()==false || + // sendPacketSet[1].IsEmpty()==false || + // sendPacketSet[2].IsEmpty()==false || + // sendPacketSet[3].IsEmpty()==false; + bandwidthExceededStatistic=outgoingPacketBuffer.Size()>0; + + const bool hasDataToSendOrResend = IsResendQueueEmpty()==false || bandwidthExceededStatistic; + RakAssert(NUMBER_OF_PRIORITIES==4); + congestionManager.Update(time, hasDataToSendOrResend); + + statistics.BPSLimitByOutgoingBandwidthLimit = BITS_TO_BYTES(bitsPerSecondLimit); + statistics.BPSLimitByCongestionControl = congestionManager.GetBytesPerSecondLimitByCongestionControl(); + + unsigned int i; + if (time > lastBpsClear+ +#if CC_TIME_TYPE_BYTES==4 + 100 +#else + 100000 +#endif + ) + { + for (i=0; i < RNS_PER_SECOND_METRICS_COUNT; i++) + { + bpsMetrics[i].ClearExpired1(time); + } + + lastBpsClear=time; + } + + if (unreliableWithAckReceiptHistory.Size()>0) + { + i=0; + while (i < unreliableWithAckReceiptHistory.Size()) + { + if (unreliableWithAckReceiptHistory[i].nextActionTime < time) + { + InternalPacket *ackReceipt = AllocateFromInternalPacketPool(); + AllocInternalPacketData(ackReceipt, 5, false, _FILE_AND_LINE_ ); + ackReceipt->dataBitLength=BYTES_TO_BITS(5); + ackReceipt->data[0]=(MessageID)ID_SND_RECEIPT_LOSS; + memcpy(ackReceipt->data+sizeof(MessageID), &unreliableWithAckReceiptHistory[i].sendReceiptSerial, sizeof(uint32_t)); + outputQueue.Push(ackReceipt, _FILE_AND_LINE_ ); + + // Remove, swap with last + unreliableWithAckReceiptHistory.RemoveAtIndex(i); + } + else + i++; + } + } + + if (hasDataToSendOrResend==true) + { + InternalPacket *internalPacket; + // bool forceSend=false; + bool pushedAnything; + BitSize_t nextPacketBitLength; + dhf.isACK=false; + dhf.isNAK=false; + dhf.hasBAndAS=false; + ResetPacketsAndDatagrams(); + + int transmissionBandwidth = congestionManager.GetTransmissionBandwidth(time, timeSinceLastTick, unacknowledgedBytes,dhf.isContinuousSend); + int retransmissionBandwidth = congestionManager.GetRetransmissionBandwidth(time, timeSinceLastTick, unacknowledgedBytes,dhf.isContinuousSend); + if (retransmissionBandwidth>0 || transmissionBandwidth>0) + { + statistics.isLimitedByCongestionControl=false; + + allDatagramSizesSoFar=0; + + // Keep filling datagrams until we exceed retransmission bandwidth + while ((int)BITS_TO_BYTES(allDatagramSizesSoFar)messageNumberAssigned==true); + + if ( internalPacket->nextActionTime < time ) + { + nextPacketBitLength = internalPacket->headerLength + internalPacket->dataBitLength; + if ( datagramSizeSoFar + nextPacketBitLength > GetMaxDatagramSizeExcludingMessageHeaderBits() ) + { + // Gathers all PushPackets() + PushDatagram(); + break; + } + + PopListHead(false); + + CC_DEBUG_PRINTF_2("Rs %i ", internalPacket->reliableMessageNumber.val); + + bpsMetrics[(int) USER_MESSAGE_BYTES_RESENT].Push1(time,BITS_TO_BYTES(internalPacket->dataBitLength)); + + // Testing1 +// if (internalPacket->reliability==RELIABLE_ORDERED || internalPacket->reliability==RELIABLE_ORDERED_WITH_ACK_RECEIPT) +// printf("RESEND reliableMessageNumber %i with datagram %i\n", internalPacket->reliableMessageNumber.val, congestionManager.GetNextDatagramSequenceNumber().val); + + PushPacket(time,internalPacket,true); // Affects GetNewTransmissionBandwidth() +// internalPacket->timesSent++; + internalPacket->nextActionTime = congestionManager.GetRTOForRetransmission()+time; +#if CC_TIME_TYPE_BYTES==4 + if (internalPacket->nextActionTime-time > 10000) +#else + if (internalPacket->nextActionTime-time > 10000000) +#endif + { + // int a=5; + RakAssert(0); + } + + congestionManager.OnResend(time); + + pushedAnything=true; + + for (unsigned int messageHandlerIndex=0; messageHandlerIndex < messageHandlerList.Size(); messageHandlerIndex++) + { +#if CC_TIME_TYPE_BYTES==4 + messageHandlerList[messageHandlerIndex]->OnInternalPacket(internalPacket, packetsToSendThisUpdateDatagramBoundaries.Size()+congestionManager.GetNextDatagramSequenceNumber(), systemAddress, (RakNet::TimeMS) time, true); +#else + messageHandlerList[messageHandlerIndex]->OnInternalPacket(internalPacket, packetsToSendThisUpdateDatagramBoundaries.Size()+congestionManager.GetNextDatagramSequenceNumber(), systemAddress, (RakNet::TimeMS)(time/(CCTimeType)1000), true); +#endif + } + + // Put the packet back into the resend list at the correct spot + // Don't make a copy since I'm reinserting an allocated struct + InsertPacketIntoResendList( internalPacket, time, false, false ); + + // Removeme + // printf("Resend:%i ", internalPacket->reliableMessageNumber); + } + else + { + // Filled one datagram. + // If the 2nd and it's time to send a datagram pair, will be marked as a pair + PushDatagram(); + break; + } + } + + if (pushedAnything==false) + break; + } + } + else + { + statistics.isLimitedByCongestionControl=true; + } + + if ((int)BITS_TO_BYTES(allDatagramSizesSoFar)messageNumberAssigned==false); + RakAssert(outgoingPacketBuffer.Size()==0 || outgoingPacketBuffer.Peek()->dataBitLengthdata==0) + { + //sendPacketSet[ i ].Pop(); + outgoingPacketBuffer.Pop(0); + RakAssert(outgoingPacketBuffer.Size()==0 || outgoingPacketBuffer.Peek()->dataBitLengthpriority]--; + statistics.bytesInSendBuffer[(int)internalPacket->priority]-=(double) BITS_TO_BYTES(internalPacket->dataBitLength); + ReleaseToInternalPacketPool( internalPacket ); + continue; + } + + internalPacket->headerLength=GetMessageHeaderLengthBits(internalPacket); + nextPacketBitLength = internalPacket->headerLength + internalPacket->dataBitLength; + if ( datagramSizeSoFar + nextPacketBitLength > GetMaxDatagramSizeExcludingMessageHeaderBits() ) + { + // Hit MTU. May still push packets if smaller ones exist at a lower priority + RakAssert(datagramSizeSoFar!=0); + RakAssert(internalPacket->dataBitLengthreliability == RELIABLE || + internalPacket->reliability == RELIABLE_SEQUENCED || + internalPacket->reliability == RELIABLE_ORDERED || + internalPacket->reliability == RELIABLE_WITH_ACK_RECEIPT || +// internalPacket->reliability == RELIABLE_SEQUENCED_WITH_ACK_RECEIPT || + internalPacket->reliability == RELIABLE_ORDERED_WITH_ACK_RECEIPT + ) + isReliable = true; + else + isReliable = false; + + //sendPacketSet[ i ].Pop(); + outgoingPacketBuffer.Pop(0); + RakAssert(outgoingPacketBuffer.Size()==0 || outgoingPacketBuffer.Peek()->dataBitLengthmessageNumberAssigned==false); + statistics.messageInSendBuffer[(int)internalPacket->priority]--; + statistics.bytesInSendBuffer[(int)internalPacket->priority]-=(double) BITS_TO_BYTES(internalPacket->dataBitLength); + if (isReliable + /* + I thought about this and agree that UNRELIABLE_SEQUENCED_WITH_ACK_RECEIPT and RELIABLE_SEQUENCED_WITH_ACK_RECEIPT is not useful unless you also know if the message was discarded. + + The problem is that internally, message numbers are only assigned to reliable messages, because message numbers are only used to discard duplicate message receipt and only reliable messages get sent more than once. However, without message numbers getting assigned and transmitted, there is no way to tell the sender about which messages were discarded. In fact, in looking this over I realized that UNRELIABLE_SEQUENCED_WITH_ACK_RECEIPT introduced a bug, because the remote system assumes all message numbers are used (no holes). With that send type, on packetloss, a permanent hole would have been created which eventually would cause the system to discard all further packets. + + So I have two options. Either do not support ack receipts when sending sequenced, or write complex and major new systems. UNRELIABLE_SEQUENCED_WITH_ACK_RECEIPT would need to send the message ID number on a special channel which allows for non-delivery. And both of them would need to have a special range list to indicate which message numbers were not delivered, so when acks are sent that can be indicated as well. A further problem is that the ack itself can be lost - it is possible that the message can arrive but be discarded, yet the ack is lost. On resend, the resent message would be ignored as duplicate, and you'd never get the discard message either (unless I made a special buffer for that case too). +*/ +// || + // If needs an ack receipt, keep the internal packet around in the list +// internalPacket->reliability == UNRELIABLE_WITH_ACK_RECEIPT || +// internalPacket->reliability == UNRELIABLE_SEQUENCED_WITH_ACK_RECEIPT + ) + { + internalPacket->messageNumberAssigned=true; + internalPacket->reliableMessageNumber=sendReliableMessageNumberIndex; + internalPacket->nextActionTime = congestionManager.GetRTOForRetransmission()+time; +#if CC_TIME_TYPE_BYTES==4 + const CCTimeType threshhold = 10000; +#else + const CCTimeType threshhold = 10000000; +#endif + if (internalPacket->nextActionTime-time > threshhold) + { + // int a=5; + RakAssert(time-internalPacket->nextActionTime < threshhold); + } + //resendTree.Insert( internalPacket->reliableMessageNumber, internalPacket); + if (resendBuffer[internalPacket->reliableMessageNumber & (uint32_t) RESEND_BUFFER_ARRAY_MASK]!=0) + { + // bool overflow = ResendBufferOverflow(); + RakAssert(0); + } + resendBuffer[internalPacket->reliableMessageNumber & (uint32_t) RESEND_BUFFER_ARRAY_MASK] = internalPacket; + statistics.messagesInResendBuffer++; + statistics.bytesInResendBuffer+=BITS_TO_BYTES(internalPacket->dataBitLength); + + // printf("pre:%i ", unacknowledgedBytes); + + InsertPacketIntoResendList( internalPacket, time, true, isReliable); + + + // printf("post:%i ", unacknowledgedBytes); + sendReliableMessageNumberIndex++; + } + else if (internalPacket->reliability == UNRELIABLE_WITH_ACK_RECEIPT) + { + unreliableWithAckReceiptHistory.Push(UnreliableWithAckReceiptNode( + congestionManager.GetNextDatagramSequenceNumber() + packetsToSendThisUpdateDatagramBoundaries.Size(), + internalPacket->sendReceiptSerial, + congestionManager.GetRTOForRetransmission()+time + ), _FILE_AND_LINE_); + } + +// internalPacket->timesSent=1; + // If isReliable is false, the packet and its contents will be added to a list to be freed in ClearPacketsAndDatagrams + // However, the internalPacket structure will remain allocated and be in the resendBuffer list if it requires a receipt + bpsMetrics[(int) USER_MESSAGE_BYTES_SENT].Push1(time,BITS_TO_BYTES(internalPacket->dataBitLength)); + + // Testing1 +// if (internalPacket->reliability==RELIABLE_ORDERED || internalPacket->reliability==RELIABLE_ORDERED_WITH_ACK_RECEIPT) +// printf("SEND reliableMessageNumber %i in datagram %i\n", internalPacket->reliableMessageNumber.val, congestionManager.GetNextDatagramSequenceNumber().val); + + PushPacket(time,internalPacket, isReliable); + + for (unsigned int messageHandlerIndex=0; messageHandlerIndex < messageHandlerList.Size(); messageHandlerIndex++) + { +#if CC_TIME_TYPE_BYTES==4 + messageHandlerList[messageHandlerIndex]->OnInternalPacket(internalPacket, packetsToSendThisUpdateDatagramBoundaries.Size()+congestionManager.GetNextDatagramSequenceNumber(), systemAddress, (RakNet::TimeMS)time, true); +#else + messageHandlerList[messageHandlerIndex]->OnInternalPacket(internalPacket, packetsToSendThisUpdateDatagramBoundaries.Size()+congestionManager.GetNextDatagramSequenceNumber(), systemAddress, (RakNet::TimeMS)(time/(CCTimeType)1000), true); +#endif + } + pushedAnything=true; + + if (ResendBufferOverflow()) + break; + } + // if (ResendBufferOverflow()) + // break; + // }z + + // No datagrams pushed? + if (datagramSizeSoFar==0) + break; + + // Filled one datagram. + // If the 2nd and it's time to send a datagram pair, will be marked as a pair + PushDatagram(); + } + } + + + for (unsigned int datagramIndex=0; datagramIndex < packetsToSendThisUpdateDatagramBoundaries.Size(); datagramIndex++) + { + if (datagramIndex>0) + dhf.isContinuousSend=true; + MessageNumberNode* messageNumberNode = 0; + dhf.datagramNumber=congestionManager.GetAndIncrementNextDatagramSequenceNumber(); + dhf.isPacketPair=datagramsToSendThisUpdateIsPair[datagramIndex]; + + //printf("%p pushing datagram %i\n", this, dhf.datagramNumber.val); + + bool isSecondOfPacketPair=dhf.isPacketPair && datagramIndex>0 && datagramsToSendThisUpdateIsPair[datagramIndex-1]; + unsigned int msgIndex, msgTerm; + if (datagramIndex==0) + { + msgIndex=0; + msgTerm=packetsToSendThisUpdateDatagramBoundaries[0]; + } + else + { + msgIndex=packetsToSendThisUpdateDatagramBoundaries[datagramIndex-1]; + msgTerm=packetsToSendThisUpdateDatagramBoundaries[datagramIndex]; + } + + // More accurate time to reset here +#if INCLUDE_TIMESTAMP_WITH_DATAGRAMS==1 + dhf.sourceSystemTime=RakNet::GetTimeUS(); +#endif + updateBitStream.Reset(); + dhf.Serialize(&updateBitStream); + CC_DEBUG_PRINTF_2("S%i ",dhf.datagramNumber.val); + + while (msgIndex < msgTerm) + { + // If reliable or needs receipt + if ( packetsToSendThisUpdate[msgIndex]->reliability != UNRELIABLE && + packetsToSendThisUpdate[msgIndex]->reliability != UNRELIABLE_SEQUENCED + ) + { + if (messageNumberNode==0) + { + messageNumberNode = AddFirstToDatagramHistory(dhf.datagramNumber, packetsToSendThisUpdate[msgIndex]->reliableMessageNumber, time); + } + else + { + messageNumberNode = AddSubsequentToDatagramHistory(messageNumberNode, packetsToSendThisUpdate[msgIndex]->reliableMessageNumber); + } + } + + RakAssert(updateBitStream.GetNumberOfBytesUsed()<=MAXIMUM_MTU_SIZE-UDP_HEADER_SIZE); + WriteToBitStreamFromInternalPacket( &updateBitStream, packetsToSendThisUpdate[msgIndex], time ); + RakAssert(updateBitStream.GetNumberOfBytesUsed()<=MAXIMUM_MTU_SIZE-UDP_HEADER_SIZE); + msgIndex++; + } + + if (isSecondOfPacketPair) + { + // Pad to size of first datagram + RakAssert(updateBitStream.GetNumberOfBytesUsed()<=MAXIMUM_MTU_SIZE-UDP_HEADER_SIZE); + updateBitStream.PadWithZeroToByteLength(datagramSizesInBytes[datagramIndex-1]); + RakAssert(updateBitStream.GetNumberOfBytesUsed()<=MAXIMUM_MTU_SIZE-UDP_HEADER_SIZE); + } + + if (messageNumberNode==0) + { + // Unreliable, add dummy node + AddFirstToDatagramHistory(dhf.datagramNumber, time); + } + + // Store what message ids were sent with this datagram + // datagramMessageIDTree.Insert(dhf.datagramNumber,idList); + + congestionManager.OnSendBytes(time,UDP_HEADER_SIZE+DatagramHeaderFormat::GetDataHeaderByteLength()); + + SendBitStream( s, systemAddress, &updateBitStream, rnr, remotePortRakNetWasStartedOn_PS3, extraSocketOptions, time ); + + bandwidthExceededStatistic=outgoingPacketBuffer.Size()>0; + // bandwidthExceededStatistic=sendPacketSet[0].IsEmpty()==false || + // sendPacketSet[1].IsEmpty()==false || + // sendPacketSet[2].IsEmpty()==false || + // sendPacketSet[3].IsEmpty()==false; + + + + if (bandwidthExceededStatistic==true) + timeOfLastContinualSend=time; + else + timeOfLastContinualSend=0; + } + + ClearPacketsAndDatagrams(); + + // Any data waiting to send after attempting to send, then bandwidth is exceeded + bandwidthExceededStatistic=outgoingPacketBuffer.Size()>0; + // bandwidthExceededStatistic=sendPacketSet[0].IsEmpty()==false || + // sendPacketSet[1].IsEmpty()==false || + // sendPacketSet[2].IsEmpty()==false || + // sendPacketSet[3].IsEmpty()==false; + } + + + // Keep on top of deleting old unreliable split packets so they don't clog the list. + //DeleteOldUnreliableSplitPackets( time ); +} + +//------------------------------------------------------------------------------------------------------- +// Writes a bitstream to the socket +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::SendBitStream( SOCKET s, SystemAddress &systemAddress, RakNet::BitStream *bitStream, RakNetRandom *rnr, unsigned short remotePortRakNetWasStartedOn_PS3, unsigned int extraSocketOptions, CCTimeType currentTime) +{ + (void) systemAddress; + (void) rnr; + + unsigned int length; + + length = (unsigned int) bitStream->GetNumberOfBytesUsed(); + + +#ifdef _DEBUG + if (packetloss > 0.0) + { + if (frandomMT() < packetloss) + return; + } + + if (minExtraPing > 0 || extraPingVariance > 0) + { + RakNet::TimeMS delay = minExtraPing; + if (extraPingVariance>0) + delay += (randomMT() % extraPingVariance); + if (delay > 0) + { + DataAndTime *dat = RakNet::OP_NEW(__FILE__,__LINE__); + memcpy(dat->data, ( char* ) bitStream->GetData(), length ); + dat->s=s; + dat->length=length; + dat->sendTime = RakNet::GetTimeMS() + delay; + dat->remotePortRakNetWasStartedOn_PS3=remotePortRakNetWasStartedOn_PS3; + dat->extraSocketOptions=extraSocketOptions; + for (unsigned int i=0; i < delayList.Size(); i++) + { + if (dat->sendTime < delayList[i]->sendTime) + { + delayList.PushAtHead(dat, i, __FILE__, __LINE__); + dat=0; + break; + } + } + if (dat!=0) + delayList.Push(dat,__FILE__,__LINE__); + return; + } + } +#endif + +#if LIBCAT_SECURITY==1 + if (useSecurity) + { + unsigned char *buffer = reinterpret_cast( bitStream->GetData() ); + + int buffer_size = bitStream->GetNumberOfBitsAllocated() / 8; + + // Verify there is enough room for encrypted output and encrypt + // Encrypt() will increase length + bool success = auth_enc.Encrypt(buffer, buffer_size, length); + RakAssert(success); + } +#endif + + bpsMetrics[(int) ACTUAL_BYTES_SENT].Push1(currentTime,length); + + RakAssert(length <= congestionManager.GetMTU()); + +#ifdef USE_THREADED_SEND + SendToThread::SendToThreadBlock *block = SendToThread::AllocateBlock(); + memcpy(block->data, bitStream->GetData(), length); + block->dataWriteOffset=length; + block->extraSocketOptions=extraSocketOptions; + block->remotePortRakNetWasStartedOn_PS3=remotePortRakNetWasStartedOn_PS3; + block->s=s; + block->systemAddress=systemAddress; + SendToThread::ProcessBlock(block); +#else + SocketLayer::SendTo( s, ( char* ) bitStream->GetData(), length, systemAddress, remotePortRakNetWasStartedOn_PS3, extraSocketOptions, __FILE__, __LINE__ ); +#endif +} + +//------------------------------------------------------------------------------------------------------- +// Are we waiting for any data to be sent out or be processed by the player? +//------------------------------------------------------------------------------------------------------- +bool ReliabilityLayer::IsOutgoingDataWaiting(void) +{ + if (outgoingPacketBuffer.Size()>0) + return true; + + // unsigned i; + // for ( i = 0; i < NUMBER_OF_PRIORITIES; i++ ) + // { + // if (sendPacketSet[ i ].Size() > 0) + // return true; + // } + + return + //acknowlegements.Size() > 0 || + //resendTree.IsEmpty()==false;// || outputQueue.Size() > 0 || orderingList.Size() > 0 || splitPacketChannelList.Size() > 0; + statistics.messagesInResendBuffer!=0; +} +bool ReliabilityLayer::AreAcksWaiting(void) +{ + return acknowlegements.Size() > 0; +} +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::ApplyNetworkSimulator( double _packetloss, RakNet::TimeMS _minExtraPing, RakNet::TimeMS _extraPingVariance ) +{ +#ifdef _DEBUG + packetloss=_packetloss; + minExtraPing=_minExtraPing; + extraPingVariance=_extraPingVariance; + // if (ping < (unsigned int)(minExtraPing+extraPingVariance)*2) + // ping=(minExtraPing+extraPingVariance)*2; +#endif +} +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::SetSplitMessageProgressInterval(int interval) +{ + splitMessageProgressInterval=interval; +} +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::SetUnreliableTimeout(RakNet::TimeMS timeoutMS) +{ +#if CC_TIME_TYPE_BYTES==4 + unreliableTimeout=timeoutMS; +#else + unreliableTimeout=(CCTimeType)timeoutMS*(CCTimeType)1000; +#endif +} + +//------------------------------------------------------------------------------------------------------- +// This will return true if we should not send at this time +//------------------------------------------------------------------------------------------------------- +bool ReliabilityLayer::IsSendThrottled( int MTUSize ) +{ + (void) MTUSize; + + return false; + // return resendList.Size() > windowSize; + + // Disabling this, because it can get stuck here forever + /* + unsigned packetsWaiting; + unsigned resendListDataSize=0; + unsigned i; + for (i=0; i < resendList.Size(); i++) + { + if (resendList[i]) + resendListDataSize+=resendList[i]->dataBitLength; + } + packetsWaiting = 1 + ((BITS_TO_BYTES(resendListDataSize)) / (MTUSize - UDP_HEADER_SIZE - 10)); // 10 to roughly estimate the raknet header + + return packetsWaiting >= windowSize; + */ +} + +//------------------------------------------------------------------------------------------------------- +// We lost a packet +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::UpdateWindowFromPacketloss( CCTimeType time ) +{ + (void) time; +} + +//------------------------------------------------------------------------------------------------------- +// Increase the window size +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::UpdateWindowFromAck( CCTimeType time ) +{ + (void) time; +} + +//------------------------------------------------------------------------------------------------------- +// Does what the function name says +//------------------------------------------------------------------------------------------------------- +unsigned ReliabilityLayer::RemovePacketFromResendListAndDeleteOlderReliableSequenced( const MessageNumberType messageNumber, CCTimeType time, DataStructures::List &messageHandlerList, const SystemAddress &systemAddress ) +{ + (void) time; + (void) messageNumber; + InternalPacket * internalPacket; + //InternalPacket *temp; +// PacketReliability reliability; // What type of reliability algorithm to use with this packet +// unsigned char orderingChannel; // What ordering channel this packet is on, if the reliability type uses ordering channels +// OrderingIndexType orderingIndex; // The ID used as identification for ordering channels + // unsigned j; + + for (unsigned int messageHandlerIndex=0; messageHandlerIndex < messageHandlerList.Size(); messageHandlerIndex++) + { +#if CC_TIME_TYPE_BYTES==4 + messageHandlerList[messageHandlerIndex]->OnAck(messageNumber, systemAddress, time); +#else + messageHandlerList[messageHandlerIndex]->OnAck(messageNumber, systemAddress, (RakNet::TimeMS)(time/(CCTimeType)1000)); +#endif + } + + // Testing1 +// if (resendLinkedListHead) +// { +// InternalPacket *internalPacket = resendLinkedListHead; +// do +// { +// internalPacket=internalPacket->resendNext; +// printf("%i ", internalPacket->reliableMessageNumber.val); +// } while (internalPacket!=resendLinkedListHead); +// printf("\n"); +// } + + // bool deleted; + // deleted=resendTree.Delete(messageNumber, internalPacket); + internalPacket = resendBuffer[messageNumber & RESEND_BUFFER_ARRAY_MASK]; + // May ask to remove twice, for example resend twice, then second ack + if (internalPacket && internalPacket->reliableMessageNumber==messageNumber) + { + // ValidateResendList(); + resendBuffer[messageNumber & RESEND_BUFFER_ARRAY_MASK]=0; + CC_DEBUG_PRINTF_2("AckRcv %i ", messageNumber); + + statistics.messagesInResendBuffer--; + statistics.bytesInResendBuffer-=BITS_TO_BYTES(internalPacket->dataBitLength); + +// orderingIndex = internalPacket->orderingIndex; + totalUserDataBytesAcked+=(double) BITS_TO_BYTES(internalPacket->headerLength+internalPacket->dataBitLength); + + // Return receipt if asked for + if (internalPacket->reliability>=RELIABLE_WITH_ACK_RECEIPT && + (internalPacket->splitPacketCount==0 || internalPacket->splitPacketIndex+1==internalPacket->splitPacketCount) + ) + { + InternalPacket *ackReceipt = AllocateFromInternalPacketPool(); + AllocInternalPacketData(ackReceipt, 5, false, _FILE_AND_LINE_ ); + ackReceipt->dataBitLength=BYTES_TO_BITS(5); + ackReceipt->data[0]=(MessageID)ID_SND_RECEIPT_ACKED; + memcpy(ackReceipt->data+sizeof(MessageID), &internalPacket->sendReceiptSerial, sizeof(internalPacket->sendReceiptSerial)); + outputQueue.Push(ackReceipt, _FILE_AND_LINE_ ); + } + + bool isReliable; + if ( internalPacket->reliability == RELIABLE || + internalPacket->reliability == RELIABLE_SEQUENCED || + internalPacket->reliability == RELIABLE_ORDERED || + internalPacket->reliability == RELIABLE_WITH_ACK_RECEIPT || +// internalPacket->reliability == RELIABLE_SEQUENCED_WITH_ACK_RECEIPT || + internalPacket->reliability == RELIABLE_ORDERED_WITH_ACK_RECEIPT + ) + isReliable = true; + else + isReliable = false; + + RemoveFromList(internalPacket, isReliable); + FreeInternalPacketData(internalPacket, _FILE_AND_LINE_ ); + ReleaseToInternalPacketPool( internalPacket ); + + + return 0; + } + else + { + + } + + return (unsigned)-1; +} + +//------------------------------------------------------------------------------------------------------- +// Acknowledge receipt of the packet with the specified messageNumber +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::SendAcknowledgementPacket( const DatagramSequenceNumberType messageNumber, CCTimeType time ) +{ + + // REMOVEME + // printf("%p Send ack %i\n", this, messageNumber.val); + + nextAckTimeToSend=time; + acknowlegements.Insert(messageNumber); + + //printf("ACK_DG:%i ", messageNumber.val); + + CC_DEBUG_PRINTF_2("AckPush %i ", messageNumber); + +} + +//------------------------------------------------------------------------------------------------------- +// Parse an internalPacket and figure out how many header bits would be +// written. Returns that number +//------------------------------------------------------------------------------------------------------- +BitSize_t ReliabilityLayer::GetMaxMessageHeaderLengthBits( void ) +{ + InternalPacket ip; + ip.reliability=RELIABLE_SEQUENCED; + ip.splitPacketCount=1; + return GetMessageHeaderLengthBits(&ip); +} +//------------------------------------------------------------------------------------------------------- +BitSize_t ReliabilityLayer::GetMessageHeaderLengthBits( const InternalPacket *const internalPacket ) +{ + BitSize_t bitLength; + + // bitStream->AlignWriteToByteBoundary(); // Potentially unaligned + // tempChar=(unsigned char)internalPacket->reliability; bitStream->WriteBits( (const unsigned char *)&tempChar, 3, true ); // 3 bits to write reliability. + // bool hasSplitPacket = internalPacket->splitPacketCount>0; bitStream->Write(hasSplitPacket); // Write 1 bit to indicate if splitPacketCount>0 + bitLength = 8*1; + + // bitStream->AlignWriteToByteBoundary(); + // RakAssert(internalPacket->dataBitLength < 65535); + // unsigned short s; s = (unsigned short) internalPacket->dataBitLength; bitStream->WriteAlignedVar16((const char*)& s); + bitLength += 8*2; + + if ( internalPacket->reliability == RELIABLE || + internalPacket->reliability == RELIABLE_SEQUENCED || + internalPacket->reliability == RELIABLE_ORDERED || + internalPacket->reliability == RELIABLE_WITH_ACK_RECEIPT || +// internalPacket->reliability == RELIABLE_SEQUENCED_WITH_ACK_RECEIPT || + internalPacket->reliability == RELIABLE_ORDERED_WITH_ACK_RECEIPT + ) + bitLength += 8*3; // bitStream->Write(internalPacket->reliableMessageNumber); // Message sequence number + // bitStream->AlignWriteToByteBoundary(); // Potentially nothing else to write + + + + if ( internalPacket->reliability == UNRELIABLE_SEQUENCED || + internalPacket->reliability == RELIABLE_SEQUENCED + ) + { + bitLength += 8*3;; // bitStream->Write(internalPacket->_sequencingIndex); // Used for UNRELIABLE_SEQUENCED, RELIABLE_SEQUENCED, RELIABLE_ORDERED. + } + + if ( internalPacket->reliability == UNRELIABLE_SEQUENCED || + internalPacket->reliability == RELIABLE_SEQUENCED || + internalPacket->reliability == RELIABLE_ORDERED || + internalPacket->reliability == RELIABLE_ORDERED_WITH_ACK_RECEIPT + ) + { + bitLength += 8*3; // bitStream->Write(internalPacket->orderingIndex); // Used for UNRELIABLE_SEQUENCED, RELIABLE_SEQUENCED, RELIABLE_ORDERED. + bitLength += 8*1; // tempChar=internalPacket->orderingChannel; bitStream->WriteAlignedVar8((const char*)& tempChar); // Used for UNRELIABLE_SEQUENCED, RELIABLE_SEQUENCED, RELIABLE_ORDERED. 5 bits needed, write one byte + } + if (internalPacket->splitPacketCount>0) + { + bitLength += 8*4; // bitStream->WriteAlignedVar32((const char*)& internalPacket->splitPacketCount); RakAssert(sizeof(SplitPacketIndexType)==4); // Only needed if splitPacketCount>0. 4 bytes + bitLength += 8*sizeof(SplitPacketIdType); // bitStream->WriteAlignedVar16((const char*)& internalPacket->splitPacketId); RakAssert(sizeof(SplitPacketIdType)==2); // Only needed if splitPacketCount>0. + bitLength += 8*4; // bitStream->WriteAlignedVar32((const char*)& internalPacket->splitPacketIndex); // Only needed if splitPacketCount>0. 4 bytes + } + + return bitLength; +} + +//------------------------------------------------------------------------------------------------------- +// Parse an internalPacket and create a bitstream to represent this data +//------------------------------------------------------------------------------------------------------- +BitSize_t ReliabilityLayer::WriteToBitStreamFromInternalPacket( RakNet::BitStream *bitStream, const InternalPacket *const internalPacket, CCTimeType curTime ) +{ + (void) curTime; + + BitSize_t start = bitStream->GetNumberOfBitsUsed(); + unsigned char tempChar; + + // (Incoming data may be all zeros due to padding) + bitStream->AlignWriteToByteBoundary(); // Potentially unaligned + if (internalPacket->reliability==UNRELIABLE_WITH_ACK_RECEIPT) + tempChar=UNRELIABLE; + else if (internalPacket->reliability==RELIABLE_WITH_ACK_RECEIPT) + tempChar=RELIABLE; + else if (internalPacket->reliability==RELIABLE_ORDERED_WITH_ACK_RECEIPT) + tempChar=RELIABLE_ORDERED; + else + tempChar=(unsigned char)internalPacket->reliability; + + bitStream->WriteBits( (const unsigned char *)&tempChar, 3, true ); // 3 bits to write reliability. + + bool hasSplitPacket = internalPacket->splitPacketCount>0; bitStream->Write(hasSplitPacket); // Write 1 bit to indicate if splitPacketCount>0 + bitStream->AlignWriteToByteBoundary(); + RakAssert(internalPacket->dataBitLength < 65535); + unsigned short s; s = (unsigned short) internalPacket->dataBitLength; bitStream->WriteAlignedVar16((const char*)& s); + if ( internalPacket->reliability == RELIABLE || + internalPacket->reliability == RELIABLE_SEQUENCED || + internalPacket->reliability == RELIABLE_ORDERED || + internalPacket->reliability == RELIABLE_WITH_ACK_RECEIPT || + internalPacket->reliability == RELIABLE_ORDERED_WITH_ACK_RECEIPT + ) + bitStream->Write(internalPacket->reliableMessageNumber); // Used for all reliable types + bitStream->AlignWriteToByteBoundary(); // Potentially nothing else to write + + if ( internalPacket->reliability == UNRELIABLE_SEQUENCED || + internalPacket->reliability == RELIABLE_SEQUENCED + ) + { + bitStream->Write(internalPacket->sequencingIndex); // Used for UNRELIABLE_SEQUENCED, RELIABLE_SEQUENCED, RELIABLE_ORDERED. + } + + if ( internalPacket->reliability == UNRELIABLE_SEQUENCED || + internalPacket->reliability == RELIABLE_SEQUENCED || + internalPacket->reliability == RELIABLE_ORDERED || + internalPacket->reliability == RELIABLE_ORDERED_WITH_ACK_RECEIPT + ) + { + bitStream->Write(internalPacket->orderingIndex); // Used for UNRELIABLE_SEQUENCED, RELIABLE_SEQUENCED, RELIABLE_ORDERED. + tempChar=internalPacket->orderingChannel; bitStream->WriteAlignedVar8((const char*)& tempChar); // Used for UNRELIABLE_SEQUENCED, RELIABLE_SEQUENCED, RELIABLE_ORDERED. 5 bits needed, write one byte + } + + if (internalPacket->splitPacketCount>0) + { + // printf("Write before\n"); + // bitStream->PrintBits(); + + bitStream->WriteAlignedVar32((const char*)& internalPacket->splitPacketCount); RakAssert(sizeof(SplitPacketIndexType)==4); // Only needed if splitPacketCount>0. 4 bytes + bitStream->WriteAlignedVar16((const char*)& internalPacket->splitPacketId); RakAssert(sizeof(SplitPacketIdType)==2); // Only needed if splitPacketCount>0. + bitStream->WriteAlignedVar32((const char*)& internalPacket->splitPacketIndex); // Only needed if splitPacketCount>0. 4 bytes + + // printf("Write after\n"); + // bitStream->PrintBits(); + } + + // Write the actual data. + bitStream->WriteAlignedBytes( ( unsigned char* ) internalPacket->data, BITS_TO_BYTES( internalPacket->dataBitLength ) ); + + return bitStream->GetNumberOfBitsUsed() - start; +} + +//------------------------------------------------------------------------------------------------------- +// Parse a bitstream and create an internal packet to represent this data +//------------------------------------------------------------------------------------------------------- +InternalPacket* ReliabilityLayer::CreateInternalPacketFromBitStream( RakNet::BitStream *bitStream, CCTimeType time ) +{ + bool bitStreamSucceeded; + InternalPacket* internalPacket; + unsigned char tempChar; + bool hasSplitPacket=false; + bool readSuccess; + + if ( bitStream->GetNumberOfUnreadBits() < (int) sizeof( internalPacket->reliableMessageNumber ) * 8 ) + return 0; // leftover bits + + internalPacket = AllocateFromInternalPacketPool(); + if (internalPacket==0) + { + // Out of memory + RakAssert(0); + return 0; + } + internalPacket->creationTime = time; + + // (Incoming data may be all zeros due to padding) + bitStream->AlignReadToByteBoundary(); // Potentially unaligned + bitStream->ReadBits( ( unsigned char* ) ( &( tempChar ) ), 3 ); + internalPacket->reliability = ( const PacketReliability ) tempChar; + readSuccess=bitStream->Read(hasSplitPacket); // Read 1 bit to indicate if splitPacketCount>0 + bitStream->AlignReadToByteBoundary(); + unsigned short s; bitStream->ReadAlignedVar16((char*)&s); internalPacket->dataBitLength=s; // Length of message (2 bytes) + if ( internalPacket->reliability == RELIABLE || + internalPacket->reliability == RELIABLE_SEQUENCED || + internalPacket->reliability == RELIABLE_ORDERED + // I don't write ACK_RECEIPT to the remote system +// || +// internalPacket->reliability == RELIABLE_WITH_ACK_RECEIPT || +// internalPacket->reliability == RELIABLE_SEQUENCED_WITH_ACK_RECEIPT || +// internalPacket->reliability == RELIABLE_ORDERED_WITH_ACK_RECEIPT + ) + bitStream->Read(internalPacket->reliableMessageNumber); // Message sequence number + else + internalPacket->reliableMessageNumber=(MessageNumberType)(const uint32_t)-1; + bitStream->AlignReadToByteBoundary(); // Potentially nothing else to Read + + if ( internalPacket->reliability == UNRELIABLE_SEQUENCED || + internalPacket->reliability == RELIABLE_SEQUENCED + ) + { + bitStream->Read(internalPacket->sequencingIndex); // Used for UNRELIABLE_SEQUENCED, RELIABLE_SEQUENCED, RELIABLE_ORDERED. + } + + if ( internalPacket->reliability == UNRELIABLE_SEQUENCED || + internalPacket->reliability == RELIABLE_SEQUENCED || + internalPacket->reliability == RELIABLE_ORDERED || + internalPacket->reliability == RELIABLE_ORDERED_WITH_ACK_RECEIPT + ) + { + bitStream->Read(internalPacket->orderingIndex); // Used for UNRELIABLE_SEQUENCED, RELIABLE_SEQUENCED, RELIABLE_ORDERED. 4 bytes. + readSuccess=bitStream->ReadAlignedVar8((char*)& internalPacket->orderingChannel); // Used for UNRELIABLE_SEQUENCED, RELIABLE_SEQUENCED, RELIABLE_ORDERED. 5 bits needed, Read one byte + } + else + internalPacket->orderingChannel=0; + + if (hasSplitPacket) + { +// printf("Read before\n"); +// bitStream->PrintBits(); + + bitStream->ReadAlignedVar32((char*)& internalPacket->splitPacketCount); // Only needed if splitPacketCount>0. 4 bytes + bitStream->ReadAlignedVar16((char*)& internalPacket->splitPacketId); // Only needed if splitPacketCount>0. + readSuccess=bitStream->ReadAlignedVar32((char*)& internalPacket->splitPacketIndex); // Only needed if splitPacketCount>0. 4 bytes + RakAssert(readSuccess); + +// printf("Read after\n"); +// bitStream->PrintBits(); + } + else + { + internalPacket->splitPacketCount=0; + } + + if (readSuccess==false || + internalPacket->dataBitLength==0 || + internalPacket->reliability>=NUMBER_OF_RELIABILITIES || + internalPacket->orderingChannel>=32 || + (hasSplitPacket && (internalPacket->splitPacketIndex >= internalPacket->splitPacketCount))) + { + // If this assert hits, encoding is garbage + RakAssert("Encoding is garbage" && 0); + ReleaseToInternalPacketPool( internalPacket ); + return 0; + } + + // Allocate memory to hold our data + AllocInternalPacketData(internalPacket, BITS_TO_BYTES( internalPacket->dataBitLength ), false, _FILE_AND_LINE_ ); + RakAssert(BITS_TO_BYTES( internalPacket->dataBitLength )data == 0) + { + RakAssert("Out of memory in ReliabilityLayer::CreateInternalPacketFromBitStream" && 0); + notifyOutOfMemory(_FILE_AND_LINE_); + ReleaseToInternalPacketPool( internalPacket ); + return 0; + } + + // Set the last byte to 0 so if ReadBits does not read a multiple of 8 the last bits are 0'ed out + internalPacket->data[ BITS_TO_BYTES( internalPacket->dataBitLength ) - 1 ] = 0; + + // Read the data the packet holds + bitStreamSucceeded = bitStream->ReadAlignedBytes( ( unsigned char* ) internalPacket->data, BITS_TO_BYTES( internalPacket->dataBitLength ) ); + + if ( bitStreamSucceeded == false ) + { + // If this hits, most likely the variable buff is too small in RunUpdateCycle in RakPeer.cpp + RakAssert("Couldn't read all the data" && 0); + + FreeInternalPacketData(internalPacket, _FILE_AND_LINE_ ); + ReleaseToInternalPacketPool( internalPacket ); + return 0; + } + + return internalPacket; +} + + +//------------------------------------------------------------------------------------------------------- +// Get the SHA1 code +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::GetSHA1( unsigned char * const buffer, unsigned int + nbytes, char code[ SHA1_LENGTH ] ) +{ + CSHA1 sha1; + + sha1.Reset(); + sha1.Update( ( unsigned char* ) buffer, nbytes ); + sha1.Final(); + memcpy( code, sha1.GetHash(), SHA1_LENGTH ); +} + +//------------------------------------------------------------------------------------------------------- +// Check the SHA1 code +//------------------------------------------------------------------------------------------------------- +bool ReliabilityLayer::CheckSHA1( char code[ SHA1_LENGTH ], unsigned char * + const buffer, unsigned int nbytes ) +{ + char code2[ SHA1_LENGTH ]; + GetSHA1( buffer, nbytes, code2 ); + + for ( int i = 0; i < SHA1_LENGTH; i++ ) + if ( code[ i ] != code2[ i ] ) + return false; + + return true; +} + +//------------------------------------------------------------------------------------------------------- +// Search the specified list for sequenced packets on the specified ordering +// stream, optionally skipping those with splitPacketId, and delete them +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::DeleteSequencedPacketsInList( unsigned char orderingChannel, DataStructures::List&theList, int splitPacketId ) +{ + unsigned i = 0; + + while ( i < theList.Size() ) + { + if ( ( + theList[ i ]->reliability == RELIABLE_SEQUENCED || + theList[ i ]->reliability == UNRELIABLE_SEQUENCED +// || +// theList[ i ]->reliability == RELIABLE_SEQUENCED_WITH_ACK_RECEIPT || +// theList[ i ]->reliability == UNRELIABLE_SEQUENCED_WITH_ACK_RECEIPT + ) && + theList[ i ]->orderingChannel == orderingChannel && ( splitPacketId == -1 || theList[ i ]->splitPacketId != (unsigned int) splitPacketId ) ) + { + InternalPacket * internalPacket = theList[ i ]; + theList.RemoveAtIndex( i ); + FreeInternalPacketData(internalPacket, _FILE_AND_LINE_ ); + ReleaseToInternalPacketPool( internalPacket ); + } + + else + i++; + } +} + +//------------------------------------------------------------------------------------------------------- +// Search the specified list for sequenced packets with a value less than orderingIndex and delete them +// Note - I added functionality so you can use the Queue as a list (in this case for searching) but it is less efficient to do so than a regular list +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::DeleteSequencedPacketsInList( unsigned char orderingChannel, DataStructures::Queue&theList ) +{ + InternalPacket * internalPacket; + int listSize = theList.Size(); + int i = 0; + + while ( i < listSize ) + { + if ( ( + theList[ i ]->reliability == RELIABLE_SEQUENCED || + theList[ i ]->reliability == UNRELIABLE_SEQUENCED +// || +// theList[ i ]->reliability == RELIABLE_SEQUENCED_WITH_ACK_RECEIPT || +// theList[ i ]->reliability == UNRELIABLE_SEQUENCED_WITH_ACK_RECEIPT + ) && theList[ i ]->orderingChannel == orderingChannel ) + { + internalPacket = theList[ i ]; + theList.RemoveAtIndex( i ); + FreeInternalPacketData(internalPacket, _FILE_AND_LINE_ ); + ReleaseToInternalPacketPool( internalPacket ); + listSize--; + } + + else + i++; + } +} + +//------------------------------------------------------------------------------------------------------- +// Returns true if newPacketOrderingIndex is older than the waitingForPacketOrderingIndex +//------------------------------------------------------------------------------------------------------- +bool ReliabilityLayer::IsOlderOrderedPacket( OrderingIndexType newPacketOrderingIndex, OrderingIndexType waitingForPacketOrderingIndex ) +{ + OrderingIndexType maxRange = (OrderingIndexType) (const uint32_t)-1; + + if ( waitingForPacketOrderingIndex > maxRange/(OrderingIndexType)2 ) + { + if ( newPacketOrderingIndex >= waitingForPacketOrderingIndex - maxRange/(OrderingIndexType)2+(OrderingIndexType)1 && newPacketOrderingIndex < waitingForPacketOrderingIndex ) + { + return true; + } + } + + else + if ( newPacketOrderingIndex >= ( OrderingIndexType ) ( waitingForPacketOrderingIndex - (( OrderingIndexType ) maxRange/(OrderingIndexType)2+(OrderingIndexType)1) ) || + newPacketOrderingIndex < waitingForPacketOrderingIndex ) + { + return true; + } + + // Old packet + return false; +} + +//------------------------------------------------------------------------------------------------------- +// Split the passed packet into chunks under MTU_SIZEbytes (including headers) and save those new chunks +// Optimized version +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::SplitPacket( InternalPacket *internalPacket ) +{ + // Doing all sizes in bytes in this function so I don't write partial bytes with split packets + internalPacket->splitPacketCount = 1; // This causes GetMessageHeaderLengthBits to account for the split packet header + unsigned int headerLength = (unsigned int) BITS_TO_BYTES( GetMessageHeaderLengthBits( internalPacket ) ); + unsigned int dataByteLength = (unsigned int) BITS_TO_BYTES( internalPacket->dataBitLength ); + int maximumSendBlockBytes, byteOffset, bytesToSend; + SplitPacketIndexType splitPacketIndex; + int i; + InternalPacket **internalPacketArray; + + maximumSendBlockBytes = GetMaxDatagramSizeExcludingMessageHeaderBytes() - BITS_TO_BYTES(GetMaxMessageHeaderLengthBits()); + + // Calculate how many packets we need to create + internalPacket->splitPacketCount = ( ( dataByteLength - 1 ) / ( maximumSendBlockBytes ) + 1 ); + + // Optimization + // internalPacketArray = RakNet::OP_NEW(internalPacket->splitPacketCount, _FILE_AND_LINE_ ); + bool usedAlloca=false; + + if (sizeof( InternalPacket* ) * internalPacket->splitPacketCount < MAX_ALLOCA_STACK_ALLOCATION) + { + internalPacketArray = ( InternalPacket** ) alloca( sizeof( InternalPacket* ) * internalPacket->splitPacketCount ); + usedAlloca=true; + } + else + + internalPacketArray = (InternalPacket**) rakMalloc_Ex( sizeof(InternalPacket*) * internalPacket->splitPacketCount, _FILE_AND_LINE_ ); + + for ( i = 0; i < ( int ) internalPacket->splitPacketCount; i++ ) + { + internalPacketArray[ i ] = AllocateFromInternalPacketPool(); + + //internalPacketArray[ i ] = (InternalPacket*) alloca( sizeof( InternalPacket ) ); + // internalPacketArray[ i ] = sendPacketSet[internalPacket->priority].WriteLock(); + *internalPacketArray[ i ]=*internalPacket; + internalPacketArray[ i ]->messageNumberAssigned=false; + + if (i!=0) + internalPacket->messageInternalOrder = internalOrderIndex++; + } + + // This identifies which packet this is in the set + splitPacketIndex = 0; + + InternalPacketRefCountedData *refCounter=0; + + // Do a loop to send out all the packets + do + { + byteOffset = splitPacketIndex * maximumSendBlockBytes; + bytesToSend = dataByteLength - byteOffset; + + if ( bytesToSend > maximumSendBlockBytes ) + bytesToSend = maximumSendBlockBytes; + + // Copy over our chunk of data + + AllocInternalPacketData(internalPacketArray[ splitPacketIndex ], &refCounter, internalPacket->data, internalPacket->data + byteOffset); + // internalPacketArray[ splitPacketIndex ]->data = (unsigned char*) rakMalloc_Ex( bytesToSend, _FILE_AND_LINE_ ); + // memcpy( internalPacketArray[ splitPacketIndex ]->data, internalPacket->data + byteOffset, bytesToSend ); + + if ( bytesToSend != maximumSendBlockBytes ) + internalPacketArray[ splitPacketIndex ]->dataBitLength = internalPacket->dataBitLength - splitPacketIndex * ( maximumSendBlockBytes << 3 ); + else + internalPacketArray[ splitPacketIndex ]->dataBitLength = bytesToSend << 3; + + internalPacketArray[ splitPacketIndex ]->splitPacketIndex = splitPacketIndex; + internalPacketArray[ splitPacketIndex ]->splitPacketId = splitPacketId; + internalPacketArray[ splitPacketIndex ]->splitPacketCount = internalPacket->splitPacketCount; + RakAssert(internalPacketArray[ splitPacketIndex ]->dataBitLengthsplitPacketCount ); + + splitPacketId++; // It's ok if this wraps to 0 + + // InternalPacket *workingPacket; + + // Tell the heap we are going to push a list of elements where each element in the list follows the heap order + RakAssert(outgoingPacketBuffer.Size()==0 || outgoingPacketBuffer.Peek()->dataBitLengthsplitPacketCount; i++ ) + { + internalPacketArray[ i ]->headerLength=headerLength; + RakAssert(internalPacketArray[ i ]->dataBitLengthpriority ].Push( internalPacketArray[ i ], _FILE_AND_LINE_ ); + RakAssert(internalPacketArray[ i ]->dataBitLengthmessageNumberAssigned==false); + outgoingPacketBuffer.PushSeries(GetNextWeight(internalPacketArray[ i ]->priority), internalPacketArray[ i ], _FILE_AND_LINE_); + RakAssert(outgoingPacketBuffer.Size()==0 || outgoingPacketBuffer.Peek()->dataBitLengthpriority]++; + statistics.bytesInSendBuffer[(int)(int)internalPacketArray[ i ]->priority]+=(double) BITS_TO_BYTES(internalPacketArray[ i ]->dataBitLength); + // workingPacket=sendPacketSet[internalPacket->priority].WriteLock(); + // memcpy(workingPacket, internalPacketArray[ i ], sizeof(InternalPacket)); + // sendPacketSet[internalPacket->priority].WriteUnlock(); + } + + // Do not delete, original is referenced by all split packets to avoid numerous allocations. See AllocInternalPacketData above + // FreeInternalPacketData(internalPacket, _FILE_AND_LINE_ ); + ReleaseToInternalPacketPool( internalPacket ); + + if (usedAlloca==false) + rakFree_Ex(internalPacketArray, _FILE_AND_LINE_ ); +} + +//------------------------------------------------------------------------------------------------------- +// Insert a packet into the split packet list +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::InsertIntoSplitPacketList( InternalPacket * internalPacket, CCTimeType time ) +{ + bool objectExists; + unsigned index; + index=splitPacketChannelList.GetIndexFromKey(internalPacket->splitPacketId, &objectExists); + if (objectExists==false) + { + SplitPacketChannel *newChannel = RakNet::OP_NEW( __FILE__, __LINE__ ); +#if PREALLOCATE_LARGE_MESSAGES==1 + index=splitPacketChannelList.Insert(internalPacket->splitPacketId, newChannel, true, __FILE__,__LINE__); + newChannel->returnedPacket=CreateInternalPacketCopy( internalPacket, 0, 0, time ); + newChannel->gotFirstPacket=false; + newChannel->splitPacketsArrived=0; + AllocInternalPacketData(newChannel->returnedPacket, BITS_TO_BYTES( internalPacket->dataBitLength*internalPacket->splitPacketCount ), false, __FILE__, __LINE__ ); + RakAssert(newChannel->returnedPacket->data); +#else + newChannel->firstPacket=0; + index=splitPacketChannelList.Insert(internalPacket->splitPacketId, newChannel, true, __FILE__,__LINE__); + // Preallocate to the final size, to avoid runtime copies + newChannel->splitPacketList.Preallocate(internalPacket->splitPacketCount, __FILE__,__LINE__); + +#endif + } + +#if PREALLOCATE_LARGE_MESSAGES==1 + splitPacketChannelList[index]->lastUpdateTime=time; + splitPacketChannelList[index]->splitPacketsArrived++; + splitPacketChannelList[index]->returnedPacket->dataBitLength+=internalPacket->dataBitLength; + + bool dealloc; + if (internalPacket->splitPacketIndex==0) + { + splitPacketChannelList[index]->gotFirstPacket=true; + splitPacketChannelList[index]->stride=BITS_TO_BYTES(internalPacket->dataBitLength); + + for (unsigned int j=0; j < splitPacketChannelList[index]->splitPacketList.Size(); j++) + { + memcpy(splitPacketChannelList[index]->returnedPacket->data+internalPacket->splitPacketIndex*splitPacketChannelList[index]->stride, internalPacket->data, (size_t) BITS_TO_BYTES(internalPacket->dataBitLength)); + FreeInternalPacketData(splitPacketChannelList[index]->splitPacketList[j], __FILE__, __LINE__ ); + ReleaseToInternalPacketPool(splitPacketChannelList[index]->splitPacketList[j]); + } + + memcpy(splitPacketChannelList[index]->returnedPacket->data, internalPacket->data, (size_t) BITS_TO_BYTES(internalPacket->dataBitLength)); + splitPacketChannelList[index]->splitPacketList.Clear(true,__FILE__,__LINE__); + dealloc=true; + } + else + { + if (splitPacketChannelList[index]->gotFirstPacket==true) + { + memcpy(splitPacketChannelList[index]->returnedPacket->data+internalPacket->splitPacketIndex*splitPacketChannelList[index]->stride, internalPacket->data, (size_t) BITS_TO_BYTES(internalPacket->dataBitLength)); + dealloc=true; + } + else + { + splitPacketChannelList[index]->splitPacketList.Push(internalPacket,__FILE__,__LINE__); + dealloc=false; + } + } + + if (splitPacketChannelList[index]->gotFirstPacket==true && + splitMessageProgressInterval && + // splitPacketChannelList[index]->firstPacket && + // splitPacketChannelList[index]->splitPacketList.Size()!=splitPacketChannelList[index]->firstPacket->splitPacketCount && + // (splitPacketChannelList[index]->splitPacketList.Size()%splitMessageProgressInterval)==0 + splitPacketChannelList[index]->gotFirstPacket && + splitPacketChannelList[index]->splitPacketsArrived!=splitPacketChannelList[index]->returnedPacket->splitPacketCount && + (splitPacketChannelList[index]->splitPacketsArrived%splitMessageProgressInterval)==0 + ) + { + // Return ID_DOWNLOAD_PROGRESS + // Write splitPacketIndex (SplitPacketIndexType) + // Write splitPacketCount (SplitPacketIndexType) + // Write byteLength (4) + // Write data, splitPacketChannelList[index]->splitPacketList[0]->data + InternalPacket *progressIndicator = AllocateFromInternalPacketPool(); + // unsigned int len = sizeof(MessageID) + sizeof(unsigned int)*2 + sizeof(unsigned int) + (unsigned int) BITS_TO_BYTES(splitPacketChannelList[index]->firstPacket->dataBitLength); + unsigned int l = (unsigned int) splitPacketChannelList[index]->stride; + const unsigned int len = sizeof(MessageID) + sizeof(unsigned int)*2 + sizeof(unsigned int) + l; + AllocInternalPacketData(progressIndicator, len, false, __FILE__, __LINE__ ); + progressIndicator->dataBitLength=BYTES_TO_BITS(len); + progressIndicator->data[0]=(MessageID)ID_DOWNLOAD_PROGRESS; + unsigned int temp; + // temp=splitPacketChannelList[index]->splitPacketList.Size(); + temp=splitPacketChannelList[index]->splitPacketsArrived; + memcpy(progressIndicator->data+sizeof(MessageID), &temp, sizeof(unsigned int)); + temp=(unsigned int)internalPacket->splitPacketCount; + memcpy(progressIndicator->data+sizeof(MessageID)+sizeof(unsigned int)*1, &temp, sizeof(unsigned int)); + // temp=(unsigned int) BITS_TO_BYTES(splitPacketChannelList[index]->firstPacket->dataBitLength); + temp=(unsigned int) BITS_TO_BYTES(l); + memcpy(progressIndicator->data+sizeof(MessageID)+sizeof(unsigned int)*2, &temp, sizeof(unsigned int)); + //memcpy(progressIndicator->data+sizeof(MessageID)+sizeof(unsigned int)*3, splitPacketChannelList[index]->firstPacket->data, (size_t) BITS_TO_BYTES(splitPacketChannelList[index]->firstPacket->dataBitLength)); + memcpy(progressIndicator->data+sizeof(MessageID)+sizeof(unsigned int)*3, splitPacketChannelList[index]->returnedPacket->data, (size_t) BITS_TO_BYTES(l)); + } + + if (dealloc) + { + FreeInternalPacketData(internalPacket, __FILE__, __LINE__ ); + ReleaseToInternalPacketPool(internalPacket); + } +#else + splitPacketChannelList[index]->splitPacketList.Insert(internalPacket, __FILE__, __LINE__ ); + splitPacketChannelList[index]->lastUpdateTime=time; + + if (internalPacket->splitPacketIndex==0) + splitPacketChannelList[index]->firstPacket=internalPacket; + + if (splitMessageProgressInterval && + splitPacketChannelList[index]->firstPacket && + splitPacketChannelList[index]->splitPacketList.Size()!=splitPacketChannelList[index]->firstPacket->splitPacketCount && + (splitPacketChannelList[index]->splitPacketList.Size()%splitMessageProgressInterval)==0) + { + // Return ID_DOWNLOAD_PROGRESS + // Write splitPacketIndex (SplitPacketIndexType) + // Write splitPacketCount (SplitPacketIndexType) + // Write byteLength (4) + // Write data, splitPacketChannelList[index]->splitPacketList[0]->data + InternalPacket *progressIndicator = AllocateFromInternalPacketPool(); + unsigned int length = sizeof(MessageID) + sizeof(unsigned int)*2 + sizeof(unsigned int) + (unsigned int) BITS_TO_BYTES(splitPacketChannelList[index]->firstPacket->dataBitLength); + AllocInternalPacketData(progressIndicator, length, false, __FILE__, __LINE__ ); + progressIndicator->dataBitLength=BYTES_TO_BITS(length); + progressIndicator->data[0]=(MessageID)ID_DOWNLOAD_PROGRESS; + unsigned int temp; + temp=splitPacketChannelList[index]->splitPacketList.Size(); + memcpy(progressIndicator->data+sizeof(MessageID), &temp, sizeof(unsigned int)); + temp=(unsigned int)internalPacket->splitPacketCount; + memcpy(progressIndicator->data+sizeof(MessageID)+sizeof(unsigned int)*1, &temp, sizeof(unsigned int)); + temp=(unsigned int) BITS_TO_BYTES(splitPacketChannelList[index]->firstPacket->dataBitLength); + memcpy(progressIndicator->data+sizeof(MessageID)+sizeof(unsigned int)*2, &temp, sizeof(unsigned int)); + + memcpy(progressIndicator->data+sizeof(MessageID)+sizeof(unsigned int)*3, splitPacketChannelList[index]->firstPacket->data, (size_t) BITS_TO_BYTES(splitPacketChannelList[index]->firstPacket->dataBitLength)); + outputQueue.Push(progressIndicator, __FILE__, __LINE__ ); + } + +#endif +} + +//------------------------------------------------------------------------------------------------------- +// Take all split chunks with the specified splitPacketId and try to +//reconstruct a packet. If we can, allocate and return it. Otherwise return 0 +// Optimized version +//------------------------------------------------------------------------------------------------------- +InternalPacket * ReliabilityLayer::BuildPacketFromSplitPacketList( SplitPacketChannel *splitPacketChannel, CCTimeType time ) +{ +#if PREALLOCATE_LARGE_MESSAGES==1 + InternalPacket *returnedPacket=splitPacketChannel->returnedPacket; + RakNet::OP_DELETE(splitPacketChannel, __FILE__, __LINE__); + (void) time; + return returnedPacket; +#else + unsigned int j; + InternalPacket * internalPacket, *splitPacket; + int splitPacketPartLength; + + // Reconstruct + internalPacket = CreateInternalPacketCopy( splitPacketChannel->splitPacketList[0], 0, 0, time ); + internalPacket->dataBitLength=0; + for (j=0; j < splitPacketChannel->splitPacketList.Size(); j++) + internalPacket->dataBitLength+=splitPacketChannel->splitPacketList[j]->dataBitLength; + splitPacketPartLength=BITS_TO_BYTES(splitPacketChannel->firstPacket->dataBitLength); + + internalPacket->data = (unsigned char*) rakMalloc_Ex( (size_t) BITS_TO_BYTES( internalPacket->dataBitLength ), _FILE_AND_LINE_ ); + internalPacket->allocationScheme=InternalPacket::NORMAL; + + for (j=0; j < splitPacketChannel->splitPacketList.Size(); j++) + { + splitPacket=splitPacketChannel->splitPacketList[j]; + memcpy(internalPacket->data+splitPacket->splitPacketIndex*splitPacketPartLength, splitPacket->data, (size_t) BITS_TO_BYTES(splitPacketChannel->splitPacketList[j]->dataBitLength)); + } + + for (j=0; j < splitPacketChannel->splitPacketList.Size(); j++) + { + FreeInternalPacketData(splitPacketChannel->splitPacketList[j], _FILE_AND_LINE_ ); + ReleaseToInternalPacketPool(splitPacketChannel->splitPacketList[j]); + } + RakNet::OP_DELETE(splitPacketChannel, __FILE__, __LINE__); + + return internalPacket; +#endif +} +//------------------------------------------------------------------------------------------------------- +InternalPacket * ReliabilityLayer::BuildPacketFromSplitPacketList( SplitPacketIdType splitPacketId, CCTimeType time, + SOCKET s, SystemAddress &systemAddress, RakNetRandom *rnr, unsigned short remotePortRakNetWasStartedOn_PS3, unsigned int extraSocketOptions, + BitStream &updateBitStream) +{ + unsigned int i; + bool objectExists; + SplitPacketChannel *splitPacketChannel; + InternalPacket * internalPacket; + + i=splitPacketChannelList.GetIndexFromKey(splitPacketId, &objectExists); + splitPacketChannel=splitPacketChannelList[i]; + +#if PREALLOCATE_LARGE_MESSAGES==1 + if (splitPacketChannel->splitPacketsArrived==splitPacketChannel->returnedPacket->splitPacketCount) +#else + if (splitPacketChannel->splitPacketList.Size()==splitPacketChannel->splitPacketList[0]->splitPacketCount) +#endif + { + // Ack immediately, because for large files this can take a long time + SendACKs(s, systemAddress, time, rnr, remotePortRakNetWasStartedOn_PS3, extraSocketOptions, updateBitStream); + internalPacket=BuildPacketFromSplitPacketList(splitPacketChannel,time); + splitPacketChannelList.RemoveAtIndex(i); + return internalPacket; + } + else + { + return 0; + } +} +/* +//------------------------------------------------------------------------------------------------------- +// Delete any unreliable split packets that have long since expired +void ReliabilityLayer::DeleteOldUnreliableSplitPackets( CCTimeType time ) +{ +unsigned i,j; +i=0; +while (i < splitPacketChannelList.Size()) +{ +#if CC_TIME_TYPE_BYTES==4 +if (time > splitPacketChannelList[i]->lastUpdateTime + timeoutTime && +#else +if (time > splitPacketChannelList[i]->lastUpdateTime + (CCTimeType)timeoutTime*(CCTimeType)1000 && +#endif +(splitPacketChannelList[i]->splitPacketList[0]->reliability==UNRELIABLE || splitPacketChannelList[i]->splitPacketList[0]->reliability==UNRELIABLE_SEQUENCED)) +{ +for (j=0; j < splitPacketChannelList[i]->splitPacketList.Size(); j++) +{ +RakNet::OP_DELETE_ARRAY(splitPacketChannelList[i]->splitPacketList[j]->data, _FILE_AND_LINE_); +ReleaseToInternalPacketPool(splitPacketChannelList[i]->splitPacketList[j]); +} +RakNet::OP_DELETE(splitPacketChannelList[i], _FILE_AND_LINE_); +splitPacketChannelList.RemoveAtIndex(i); +} +else +i++; +} +} +*/ + +//------------------------------------------------------------------------------------------------------- +// Creates a copy of the specified internal packet with data copied from the original starting at dataByteOffset for dataByteLength bytes. +// Does not copy any split data parameters as that information is always generated does not have any reason to be copied +//------------------------------------------------------------------------------------------------------- +InternalPacket * ReliabilityLayer::CreateInternalPacketCopy( InternalPacket *original, int dataByteOffset, int dataByteLength, CCTimeType time ) +{ + InternalPacket * copy = AllocateFromInternalPacketPool(); +#ifdef _DEBUG + // Remove accessing undefined memory error + memset( copy, 255, sizeof( InternalPacket ) ); +#endif + // Copy over our chunk of data + + if ( dataByteLength > 0 ) + { + AllocInternalPacketData(copy, BITS_TO_BYTES(dataByteLength ), false, _FILE_AND_LINE_ ); + memcpy( copy->data, original->data + dataByteOffset, dataByteLength ); + } + else + copy->data = 0; + + copy->dataBitLength = dataByteLength << 3; + copy->creationTime = time; + copy->nextActionTime = 0; + copy->orderingIndex = original->orderingIndex; + copy->sequencingIndex = original->sequencingIndex; + copy->orderingChannel = original->orderingChannel; + copy->reliableMessageNumber = original->reliableMessageNumber; + copy->priority = original->priority; + copy->reliability = original->reliability; +#if PREALLOCATE_LARGE_MESSAGES==1 + copy->splitPacketCount = original->splitPacketCount; + copy->splitPacketId = original->splitPacketId; + copy->splitPacketIndex = original->splitPacketIndex; +#endif + + return copy; +} + +//------------------------------------------------------------------------------------------------------- +// Get the specified ordering list +//------------------------------------------------------------------------------------------------------- +/* +DataStructures::LinkedList *ReliabilityLayer::GetOrderingListAtOrderingStream( unsigned char orderingChannel ) +{ + if ( orderingChannel >= orderingList.Size() ) + return 0; + + return orderingList[ orderingChannel ]; +} + +//------------------------------------------------------------------------------------------------------- +// Add the internal packet to the ordering list in order based on order index +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::AddToOrderingList( InternalPacket * internalPacket ) +{ + } +*/ + +//------------------------------------------------------------------------------------------------------- +// Inserts a packet into the resend list in order +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::InsertPacketIntoResendList( InternalPacket *internalPacket, CCTimeType time, bool firstResend, bool modifyUnacknowledgedBytes ) +{ + (void) firstResend; + (void) time; + (void) internalPacket; + + AddToListTail(internalPacket, modifyUnacknowledgedBytes); + RakAssert(internalPacket->nextActionTime!=0); + +} + +//------------------------------------------------------------------------------------------------------- +// Were you ever unable to deliver a packet despite retries? +//------------------------------------------------------------------------------------------------------- +bool ReliabilityLayer::IsDeadConnection( void ) const +{ + return deadConnection; +} + +//------------------------------------------------------------------------------------------------------- +// Causes IsDeadConnection to return true +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::KillConnection( void ) +{ + deadConnection=true; +} + + +//------------------------------------------------------------------------------------------------------- +// Statistics +//------------------------------------------------------------------------------------------------------- +RakNetStatistics * ReliabilityLayer::GetStatistics( RakNetStatistics *rns ) +{ + unsigned i; + RakNet::TimeUS time = RakNet::GetTimeUS(); + uint64_t uint64Denominator; + double doubleDenominator; + + for (i=0; i < RNS_PER_SECOND_METRICS_COUNT; i++) + { + statistics.valueOverLastSecond[i]=bpsMetrics[i].GetBPS1Threadsafe(time); + statistics.runningTotal[i]=bpsMetrics[i].GetTotal1(); + } + + memcpy(rns, &statistics, sizeof(statistics)); + + if (rns->valueOverLastSecond[USER_MESSAGE_BYTES_SENT]+rns->valueOverLastSecond[USER_MESSAGE_BYTES_RESENT]>0) + rns->packetlossLastSecond=(float)((double) rns->valueOverLastSecond[USER_MESSAGE_BYTES_RESENT]/((double) rns->valueOverLastSecond[USER_MESSAGE_BYTES_SENT]+(double) rns->valueOverLastSecond[USER_MESSAGE_BYTES_RESENT])); + else + rns->packetlossLastSecond=0.0f; + + rns->packetlossTotal=0.0f; + uint64Denominator=(rns->runningTotal[USER_MESSAGE_BYTES_SENT]+rns->runningTotal[USER_MESSAGE_BYTES_RESENT]); + if (uint64Denominator!=0&&rns->runningTotal[USER_MESSAGE_BYTES_SENT]/uint64Denominator>0) + { + doubleDenominator=((double) rns->runningTotal[USER_MESSAGE_BYTES_SENT]+(double) rns->runningTotal[USER_MESSAGE_BYTES_RESENT]); + if(doubleDenominator!=0) + { + rns->packetlossTotal=(float)((double) rns->runningTotal[USER_MESSAGE_BYTES_RESENT]/doubleDenominator); + } + } + + rns->isLimitedByCongestionControl=statistics.isLimitedByCongestionControl; + rns->BPSLimitByCongestionControl=statistics.BPSLimitByCongestionControl; + rns->isLimitedByOutgoingBandwidthLimit=statistics.isLimitedByOutgoingBandwidthLimit; + rns->BPSLimitByOutgoingBandwidthLimit=statistics.BPSLimitByOutgoingBandwidthLimit; + + return rns; +} + +//------------------------------------------------------------------------------------------------------- +// Returns the number of packets in the resend queue, not counting holes +//------------------------------------------------------------------------------------------------------- +unsigned int ReliabilityLayer::GetResendListDataSize(void) const +{ + // Not accurate but thread-safe. The commented version might crash if the queue is cleared while we loop through it + // return resendTree.Size(); + return statistics.messagesInResendBuffer; +} + +//------------------------------------------------------------------------------------------------------- +bool ReliabilityLayer::AckTimeout(RakNet::Time curTime) +{ + // I check timeLastDatagramArrived-curTime because with threading it is possible that timeLastDatagramArrived is + // slightly greater than curTime, in which case this is NOT an ack timeout + return (timeLastDatagramArrived-curTime)>10000 && curTime-timeLastDatagramArrived>timeoutTime; +} +//------------------------------------------------------------------------------------------------------- +CCTimeType ReliabilityLayer::GetNextSendTime(void) const +{ + return nextSendTime; +} +//------------------------------------------------------------------------------------------------------- +CCTimeType ReliabilityLayer::GetTimeBetweenPackets(void) const +{ + return timeBetweenPackets; +} +//------------------------------------------------------------------------------------------------------- +#if INCLUDE_TIMESTAMP_WITH_DATAGRAMS==1 +CCTimeType ReliabilityLayer::GetAckPing(void) const +{ + return ackPing; +} +#endif +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::ResetPacketsAndDatagrams(void) +{ + packetsToSendThisUpdate.Clear(true, _FILE_AND_LINE_); + packetsToDeallocThisUpdate.Clear(true, _FILE_AND_LINE_); + packetsToSendThisUpdateDatagramBoundaries.Clear(true, _FILE_AND_LINE_); + datagramsToSendThisUpdateIsPair.Clear(true, _FILE_AND_LINE_); + datagramSizesInBytes.Clear(true, _FILE_AND_LINE_); + datagramSizeSoFar=0; +} +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::PushPacket(CCTimeType time, InternalPacket *internalPacket, bool isReliable) +{ + BitSize_t bitsForThisPacket=BYTES_TO_BITS(BITS_TO_BYTES(internalPacket->dataBitLength)+BITS_TO_BYTES(internalPacket->headerLength)); + datagramSizeSoFar+=bitsForThisPacket; + RakAssert(BITS_TO_BYTES(datagramSizeSoFar)headerLength==GetMessageHeaderLengthBits(internalPacket)); + +// This code tells me how much time elapses between when you send, and when the message actually goes out +// if (internalPacket->data[0]==0) +// { +// RakNet::TimeMS t; +// RakNet::BitStream bs(internalPacket->data+1,sizeof(t),false); +// bs.Read(t); +// RakNet::TimeMS curTime=RakNet::GetTimeMS(); +// RakNet::TimeMS diff = curTime-t; +// } + + congestionManager.OnSendBytes(time, BITS_TO_BYTES(internalPacket->dataBitLength)+BITS_TO_BYTES(internalPacket->headerLength)); +} +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::PushDatagram(void) +{ + if (datagramSizeSoFar>0) + { + packetsToSendThisUpdateDatagramBoundaries.Push(packetsToSendThisUpdate.Size(), _FILE_AND_LINE_ ); + datagramsToSendThisUpdateIsPair.Push(false, _FILE_AND_LINE_ ); + RakAssert(BITS_TO_BYTES(datagramSizeSoFar)=2) + { + datagramsToSendThisUpdateIsPair[datagramsToSendThisUpdateIsPair.Size()-2]=true; + datagramsToSendThisUpdateIsPair[datagramsToSendThisUpdateIsPair.Size()-1]=true; + return true; + } + return false; +} +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::ClearPacketsAndDatagrams(void) +{ + unsigned int i; + for (i=0; i < packetsToDeallocThisUpdate.Size(); i++) + { + // packetsToDeallocThisUpdate holds a boolean indicating if packetsToSendThisUpdate at this index should be freed + if (packetsToDeallocThisUpdate[i]) + { + RemoveFromUnreliableLinkedList(packetsToSendThisUpdate[i]); + FreeInternalPacketData(packetsToSendThisUpdate[i], _FILE_AND_LINE_ ); + // if (keepInternalPacketIfNeedsAck==false || packetsToSendThisUpdate[i]->reliabilityresendNext=internalPacket; + internalPacket->resendPrev=internalPacket; + resendLinkedListHead=internalPacket; + return; + } + internalPacket->resendPrev->resendNext = internalPacket->resendNext; + internalPacket->resendNext->resendPrev = internalPacket->resendPrev; + internalPacket->resendNext=resendLinkedListHead; + internalPacket->resendPrev=resendLinkedListHead->resendPrev; + internalPacket->resendPrev->resendNext=internalPacket; + resendLinkedListHead->resendPrev=internalPacket; + resendLinkedListHead=internalPacket; + RakAssert(internalPacket->headerLength+internalPacket->dataBitLength>0); + + //ValidateResendList(); +} +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::RemoveFromList(InternalPacket *internalPacket, bool modifyUnacknowledgedBytes) +{ + InternalPacket *newPosition; + internalPacket->resendPrev->resendNext = internalPacket->resendNext; + internalPacket->resendNext->resendPrev = internalPacket->resendPrev; + newPosition = internalPacket->resendNext; + if ( internalPacket == resendLinkedListHead ) + resendLinkedListHead = newPosition; + if (resendLinkedListHead==internalPacket) + resendLinkedListHead=0; + + if (modifyUnacknowledgedBytes) + { + RakAssert(unacknowledgedBytes>=BITS_TO_BYTES(internalPacket->headerLength+internalPacket->dataBitLength)); + unacknowledgedBytes-=BITS_TO_BYTES(internalPacket->headerLength+internalPacket->dataBitLength); + // printf("-unacknowledgedBytes:%i ", unacknowledgedBytes); + + +// ValidateResendList(); + } +} +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::AddToListTail(InternalPacket *internalPacket, bool modifyUnacknowledgedBytes) +{ + if (modifyUnacknowledgedBytes) + { + unacknowledgedBytes+=BITS_TO_BYTES(internalPacket->headerLength+internalPacket->dataBitLength); + // printf("+unacknowledgedBytes:%i ", unacknowledgedBytes); + } + + if (resendLinkedListHead==0) + { + internalPacket->resendNext=internalPacket; + internalPacket->resendPrev=internalPacket; + resendLinkedListHead=internalPacket; + return; + } + internalPacket->resendNext=resendLinkedListHead; + internalPacket->resendPrev=resendLinkedListHead->resendPrev; + internalPacket->resendPrev->resendNext=internalPacket; + resendLinkedListHead->resendPrev=internalPacket; + +// ValidateResendList(); + +} +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::PopListHead(bool modifyUnacknowledgedBytes) +{ + RakAssert(resendLinkedListHead!=0); + RemoveFromList(resendLinkedListHead, modifyUnacknowledgedBytes); +} +//------------------------------------------------------------------------------------------------------- +bool ReliabilityLayer::IsResendQueueEmpty(void) const +{ + return resendLinkedListHead==0; +} +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::SendACKs(SOCKET s, SystemAddress &systemAddress, CCTimeType time, RakNetRandom *rnr, unsigned short remotePortRakNetWasStartedOn_PS3, unsigned int extraSocketOptions, BitStream &updateBitStream) +{ + BitSize_t maxDatagramPayload = GetMaxDatagramSizeExcludingMessageHeaderBits(); + + while (acknowlegements.Size()>0) + { + // Send acks + updateBitStream.Reset(); + DatagramHeaderFormat dhf; + dhf.isACK=true; + dhf.isNAK=false; + dhf.isPacketPair=false; +#if INCLUDE_TIMESTAMP_WITH_DATAGRAMS==1 + dhf.sourceSystemTime=time; +#endif + double B; + double AS; + bool hasBAndAS; + if (remoteSystemNeedsBAndAS) + { + congestionManager.OnSendAckGetBAndAS(time, &hasBAndAS,&B,&AS); + dhf.AS=(float)AS; + dhf.hasBAndAS=hasBAndAS; + } + else + dhf.hasBAndAS=false; +#if INCLUDE_TIMESTAMP_WITH_DATAGRAMS==1 + dhf.sourceSystemTime=nextAckTimeToSend; +#endif + // dhf.B=(float)B; + updateBitStream.Reset(); + dhf.Serialize(&updateBitStream); + CC_DEBUG_PRINTF_1("AckSnd "); + acknowlegements.Serialize(&updateBitStream, maxDatagramPayload, true); + SendBitStream( s, systemAddress, &updateBitStream, rnr, remotePortRakNetWasStartedOn_PS3, extraSocketOptions, time ); + congestionManager.OnSendAck(time,updateBitStream.GetNumberOfBytesUsed()); + + // I think this is causing a bug where if the estimated bandwidth is very low for the recipient, only acks ever get sent + // congestionManager.OnSendBytes(time,UDP_HEADER_SIZE+updateBitStream.GetNumberOfBytesUsed()); + } +} +/* +//------------------------------------------------------------------------------------------------------- +ReliabilityLayer::DatagramMessageIDList* ReliabilityLayer::AllocateFromDatagramMessageIDPool(void) +{ +DatagramMessageIDList*s; +s=datagramMessageIDPool.Allocate( _FILE_AND_LINE_ ); +// Call new operator, memoryPool doesn't do this +s = new ((void*)s) DatagramMessageIDList; +return s; +} +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::ReleaseToDatagramMessageIDPool(DatagramMessageIDList* d) +{ +d->~DatagramMessageIDList(); +datagramMessageIDPool.Release(d); +} +*/ +//------------------------------------------------------------------------------------------------------- +InternalPacket* ReliabilityLayer::AllocateFromInternalPacketPool(void) +{ + InternalPacket *ip = internalPacketPool.Allocate( _FILE_AND_LINE_ ); + ip->reliableMessageNumber = (MessageNumberType) (const uint32_t)-1; + ip->messageNumberAssigned=false; + ip->nextActionTime = 0; + ip->splitPacketCount = 0; + ip->allocationScheme=InternalPacket::NORMAL; + ip->data=0; + return ip; +} +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::ReleaseToInternalPacketPool(InternalPacket *ip) +{ + internalPacketPool.Release(ip, _FILE_AND_LINE_); +} +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::RemoveFromUnreliableLinkedList(InternalPacket *internalPacket) +{ + if (internalPacket->reliability==UNRELIABLE || + internalPacket->reliability==UNRELIABLE_SEQUENCED || + internalPacket->reliability==UNRELIABLE_WITH_ACK_RECEIPT +// || +// internalPacket->reliability==UNRELIABLE_SEQUENCED_WITH_ACK_RECEIPT + ) + { + InternalPacket *newPosition; + internalPacket->unreliablePrev->unreliableNext = internalPacket->unreliableNext; + internalPacket->unreliableNext->unreliablePrev = internalPacket->unreliablePrev; + newPosition = internalPacket->unreliableNext; + if ( internalPacket == unreliableLinkedListHead ) + unreliableLinkedListHead = newPosition; + if (unreliableLinkedListHead==internalPacket) + unreliableLinkedListHead=0; + } +} +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::AddToUnreliableLinkedList(InternalPacket *internalPacket) +{ + if (internalPacket->reliability==UNRELIABLE || + internalPacket->reliability==UNRELIABLE_SEQUENCED || + internalPacket->reliability==UNRELIABLE_WITH_ACK_RECEIPT +// || +// internalPacket->reliability==UNRELIABLE_SEQUENCED_WITH_ACK_RECEIPT + ) + { + if (unreliableLinkedListHead==0) + { + internalPacket->unreliableNext=internalPacket; + internalPacket->unreliablePrev=internalPacket; + unreliableLinkedListHead=internalPacket; + return; + } + internalPacket->unreliableNext=unreliableLinkedListHead; + internalPacket->unreliablePrev=unreliableLinkedListHead->unreliablePrev; + internalPacket->unreliablePrev->unreliableNext=internalPacket; + unreliableLinkedListHead->unreliablePrev=internalPacket; + } +} +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::ValidateResendList(void) const +{ +// unsigned int count1=0, count2=0; +// for (unsigned int i=0; i < RESEND_BUFFER_ARRAY_LENGTH; i++) +// if (resendBuffer[i]) +// count1++; +// +// if (resendLinkedListHead) +// { +// InternalPacket *internalPacket = resendLinkedListHead; +// do +// { +// count2++; +// internalPacket=internalPacket->resendNext; +// } while (internalPacket!=resendLinkedListHead); +// } +// RakAssert(count1==count2); +// RakAssert(count2<=RESEND_BUFFER_ARRAY_LENGTH); +} +//------------------------------------------------------------------------------------------------------- +bool ReliabilityLayer::ResendBufferOverflow(void) const +{ + int index1 = sendReliableMessageNumberIndex & (uint32_t) RESEND_BUFFER_ARRAY_MASK; + // int index2 = (sendReliableMessageNumberIndex+(uint32_t)1) & (uint32_t) RESEND_BUFFER_ARRAY_MASK; + RakAssert(index1= datagramHistory.Size()) + return 0; + + *timeSent=datagramHistory[offsetIntoList].timeSent; + return datagramHistory[offsetIntoList].head; +} +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::RemoveFromDatagramHistory(DatagramSequenceNumberType index) +{ + DatagramSequenceNumberType offsetIntoList = index - datagramHistoryPopCount; + MessageNumberNode *mnm = datagramHistory[offsetIntoList].head; + MessageNumberNode *next; + while (mnm) + { + next=mnm->next; + datagramHistoryMessagePool.Release(mnm, _FILE_AND_LINE_); + mnm=next; + } + datagramHistory[offsetIntoList].head=0; +} +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::AddFirstToDatagramHistory(DatagramSequenceNumberType datagramNumber, CCTimeType timeSent) +{ + (void) datagramNumber; + if (datagramHistory.Size()>DATAGRAM_MESSAGE_ID_ARRAY_LENGTH) + { + RemoveFromDatagramHistory(datagramHistoryPopCount); + datagramHistory.Pop(); + datagramHistoryPopCount++; + } + + datagramHistory.Push(DatagramHistoryNode(0, timeSent), _FILE_AND_LINE_); + // printf("%p Pushed empty DatagramHistoryNode to datagram history at index %i\n", this, datagramHistory.Size()-1); +} +//------------------------------------------------------------------------------------------------------- +ReliabilityLayer::MessageNumberNode* ReliabilityLayer::AddFirstToDatagramHistory(DatagramSequenceNumberType datagramNumber, DatagramSequenceNumberType messageNumber, CCTimeType timeSent) +{ + (void) datagramNumber; +// RakAssert(datagramHistoryPopCount+(unsigned int) datagramHistory.Size()==datagramNumber); + if (datagramHistory.Size()>DATAGRAM_MESSAGE_ID_ARRAY_LENGTH) + { + RemoveFromDatagramHistory(datagramHistoryPopCount); + datagramHistory.Pop(); + datagramHistoryPopCount++; + } + + MessageNumberNode *mnm = datagramHistoryMessagePool.Allocate(_FILE_AND_LINE_); + mnm->next=0; + mnm->messageNumber=messageNumber; + datagramHistory.Push(DatagramHistoryNode(mnm, timeSent), _FILE_AND_LINE_); + // printf("%p Pushed message %i to DatagramHistoryNode to datagram history at index %i\n", this, messageNumber.val, datagramHistory.Size()-1); + return mnm; +} +//------------------------------------------------------------------------------------------------------- +ReliabilityLayer::MessageNumberNode* ReliabilityLayer::AddSubsequentToDatagramHistory(MessageNumberNode *messageNumberNode, DatagramSequenceNumberType messageNumber) +{ + messageNumberNode->next=datagramHistoryMessagePool.Allocate(_FILE_AND_LINE_); + messageNumberNode->next->messageNumber=messageNumber; + messageNumberNode->next->next=0; + return messageNumberNode->next; +} +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::AllocInternalPacketData(InternalPacket *internalPacket, InternalPacketRefCountedData **refCounter, unsigned char *externallyAllocatedPtr, unsigned char *ourOffset) +{ + internalPacket->allocationScheme=InternalPacket::REF_COUNTED; + internalPacket->data=ourOffset; + if (*refCounter==0) + { + *refCounter = refCountedDataPool.Allocate(_FILE_AND_LINE_); + // *refCounter = RakNet::OP_NEW(_FILE_AND_LINE_); + (*refCounter)->refCount=1; + (*refCounter)->sharedDataBlock=externallyAllocatedPtr; + } + else + (*refCounter)->refCount++; + internalPacket->refCountedData=(*refCounter); +} +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::AllocInternalPacketData(InternalPacket *internalPacket, unsigned char *externallyAllocatedPtr) +{ + internalPacket->allocationScheme=InternalPacket::NORMAL; + internalPacket->data=externallyAllocatedPtr; +} +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::AllocInternalPacketData(InternalPacket *internalPacket, unsigned int numBytes, bool allowStack, const char *file, unsigned int line) +{ + if (allowStack && numBytes <= sizeof(internalPacket->stackData)) + { + internalPacket->allocationScheme=InternalPacket::STACK; + internalPacket->data=internalPacket->stackData; + } + else + { + internalPacket->allocationScheme=InternalPacket::NORMAL; + internalPacket->data=(unsigned char*) rakMalloc_Ex(numBytes,file,line); + } +} +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::FreeInternalPacketData(InternalPacket *internalPacket, const char *file, unsigned int line) +{ + if (internalPacket==0) + return; + + if (internalPacket->allocationScheme==InternalPacket::REF_COUNTED) + { + if (internalPacket->refCountedData==0) + return; + + internalPacket->refCountedData->refCount--; + if (internalPacket->refCountedData->refCount==0) + { + rakFree_Ex(internalPacket->refCountedData->sharedDataBlock, file, line ); + internalPacket->refCountedData->sharedDataBlock=0; + // RakNet::OP_DELETE(internalPacket->refCountedData,file, line); + refCountedDataPool.Release(internalPacket->refCountedData,file, line); + internalPacket->refCountedData=0; + } + } + else if (internalPacket->allocationScheme==InternalPacket::NORMAL) + { + if (internalPacket->data==0) + return; + + rakFree_Ex(internalPacket->data, file, line ); + internalPacket->data=0; + } + else + { + // Data was on stack + internalPacket->data=0; + } +} +//------------------------------------------------------------------------------------------------------- +unsigned int ReliabilityLayer::GetMaxDatagramSizeExcludingMessageHeaderBytes(void) +{ + unsigned int val = congestionManager.GetMTU() - DatagramHeaderFormat::GetDataHeaderByteLength(); + +#if LIBCAT_SECURITY==1 + if (useSecurity) + val -= cat::AuthenticatedEncryption::OVERHEAD_BYTES; +#endif + + return val; +} +//------------------------------------------------------------------------------------------------------- +BitSize_t ReliabilityLayer::GetMaxDatagramSizeExcludingMessageHeaderBits(void) +{ + return BYTES_TO_BITS(GetMaxDatagramSizeExcludingMessageHeaderBytes()); +} +//------------------------------------------------------------------------------------------------------- +void ReliabilityLayer::InitHeapWeights(void) +{ + for (int priorityLevel=0; priorityLevel < NUMBER_OF_PRIORITIES; priorityLevel++) + outgoingPacketBufferNextWeights[priorityLevel]=(1<0) + { + int peekPL = outgoingPacketBuffer.Peek()->priority; + reliabilityHeapWeightType weight = outgoingPacketBuffer.PeekWeight(); + reliabilityHeapWeightType min = weight - (1< +{ + CCTimeType lastUpdateTime; + + DataStructures::List splitPacketList; + +#if PREALLOCATE_LARGE_MESSAGES==1 + InternalPacket *returnedPacket; + bool gotFirstPacket; + unsigned int stride; + unsigned int splitPacketsArrived; +#else + // This is here for progress notifications, since progress notifications return the first packet data, if available + InternalPacket *firstPacket; +#endif + +}; +int RAK_DLL_EXPORT SplitPacketChannelComp( SplitPacketIdType const &key, SplitPacketChannel* const &data ); + +// Helper class +struct BPSTracker +{ + BPSTracker(); + ~BPSTracker(); + void Reset(const char *file, unsigned int line); + inline void Push1(CCTimeType time, uint64_t value1) {dataQueue.Push(TimeAndValue2(time,value1),_FILE_AND_LINE_); total1+=value1; lastSec1+=value1;} +// void Push2(RakNet::TimeUS time, uint64_t value1, uint64_t value2); + inline uint64_t GetBPS1(CCTimeType time) {(void) time; return lastSec1;} + inline uint64_t GetBPS1Threadsafe(CCTimeType time) {(void) time; return lastSec1;} +// uint64_t GetBPS2(RakNetTimeUS time); +// void GetBPS1And2(RakNetTimeUS time, uint64_t &out1, uint64_t &out2); + uint64_t GetTotal1(void) const; +// uint64_t GetTotal2(void) const; + + struct TimeAndValue2 + { + TimeAndValue2(); + ~TimeAndValue2(); + TimeAndValue2(CCTimeType t, uint64_t v1); + // TimeAndValue2(RakNet::TimeUS t, uint64_t v1, uint64_t v2); + // uint64_t value1, value2; + uint64_t value1; + CCTimeType time; + }; + + uint64_t total1, lastSec1; +// uint64_t total2, lastSec2; + DataStructures::Queue dataQueue; + void ClearExpired1(CCTimeType time); +// void ClearExpired2(RakNet::TimeUS time); +}; + +/// Datagram reliable, ordered, unordered and sequenced sends. Flow control. Message splitting, reassembly, and coalescence. +class ReliabilityLayer// +{ +public: + + // Constructor + ReliabilityLayer(); + + // Destructor + ~ReliabilityLayer(); + + /// Resets the layer for reuse + void Reset( bool resetVariables, int MTUSize, bool _useSecurity ); + + /// Set the time, in MS, to use before considering ourselves disconnected after not being able to deliver a reliable packet + /// Default time is 10,000 or 10 seconds in release and 30,000 or 30 seconds in debug. + /// \param[in] time Time, in MS + void SetTimeoutTime( RakNet::TimeMS time ); + + /// Returns the value passed to SetTimeoutTime. or the default if it was never called + /// \param[out] the value passed to SetTimeoutTime + RakNet::TimeMS GetTimeoutTime(void); + + /// Packets are read directly from the socket layer and skip the reliability layer because unconnected players do not use the reliability layer + /// This function takes packet data after a player has been confirmed as connected. + /// \param[in] buffer The socket data + /// \param[in] length The length of the socket data + /// \param[in] systemAddress The player that this data is from + /// \param[in] messageHandlerList A list of registered plugins + /// \param[in] MTUSize maximum datagram size + /// \retval true Success + /// \retval false Modified packet + bool HandleSocketReceiveFromConnectedPlayer( + const char *buffer, unsigned int length, SystemAddress &systemAddress, DataStructures::List &messageHandlerList, int MTUSize, + SOCKET s, RakNetRandom *rnr, unsigned short remotePortRakNetWasStartedOn_PS3, unsigned int extraSocketOptions, CCTimeType timeRead, BitStream &updateBitStream); + + /// This allocates bytes and writes a user-level message to those bytes. + /// \param[out] data The message + /// \return Returns number of BITS put into the buffer + BitSize_t Receive( unsigned char**data ); + + /// Puts data on the send queue + /// \param[in] data The data to send + /// \param[in] numberOfBitsToSend The length of \a data in bits + /// \param[in] priority The priority level for the send + /// \param[in] reliability The reliability type for the send + /// \param[in] orderingChannel 0 to 31. Specifies what channel to use, for relational ordering and sequencing of packets. + /// \param[in] makeDataCopy If true \a data will be copied. Otherwise, only a pointer will be stored. + /// \param[in] MTUSize maximum datagram size + /// \param[in] currentTime Current time, as per RakNet::GetTimeMS() + /// \param[in] receipt This number will be returned back with ID_SND_RECEIPT_ACKED or ID_SND_RECEIPT_LOSS and is only returned with the reliability types that contain RECEIPT in the name + /// \return True or false for success or failure. + bool Send( char *data, BitSize_t numberOfBitsToSend, PacketPriority priority, PacketReliability reliability, unsigned char orderingChannel, bool makeDataCopy, int MTUSize, CCTimeType currentTime, uint32_t receipt ); + + /// Call once per game cycle. Handles internal lists and actually does the send. + /// \param[in] s the communication end point + /// \param[in] systemAddress The Unique Player Identifier who shouldhave sent some packets + /// \param[in] MTUSize maximum datagram size + /// \param[in] time current system time + /// \param[in] maxBitsPerSecond if non-zero, enforces that outgoing bandwidth does not exceed this amount + /// \param[in] messageHandlerList A list of registered plugins + void Update( SOCKET s, SystemAddress &systemAddress, int MTUSize, CCTimeType time, + unsigned bitsPerSecondLimit, + DataStructures::List &messageHandlerList, + RakNetRandom *rnr, unsigned short remotePortRakNetWasStartedOn_PS3, unsigned int extraSocketOptions, BitStream &updateBitStream); + + /// Were you ever unable to deliver a packet despite retries? + /// \return true means the connection has been lost. Otherwise not. + bool IsDeadConnection( void ) const; + + /// Causes IsDeadConnection to return true + void KillConnection(void); + + /// Get Statistics + /// \return A pointer to a static struct, filled out with current statistical information. + RakNetStatistics * GetStatistics( RakNetStatistics *rns ); + + ///Are we waiting for any data to be sent out or be processed by the player? + bool IsOutgoingDataWaiting(void); + bool AreAcksWaiting(void); + + // Set outgoing lag and packet loss properties + void ApplyNetworkSimulator( double _maxSendBPS, RakNet::TimeMS _minExtraPing, RakNet::TimeMS _extraPingVariance ); + + /// Returns if you previously called ApplyNetworkSimulator + /// \return If you previously called ApplyNetworkSimulator + bool IsNetworkSimulatorActive( void ); + + void SetSplitMessageProgressInterval(int interval); + void SetUnreliableTimeout(RakNet::TimeMS timeoutMS); + /// Has a lot of time passed since the last ack + bool AckTimeout(RakNet::Time curTime); + CCTimeType GetNextSendTime(void) const; + CCTimeType GetTimeBetweenPackets(void) const; + + + + RakNet::TimeMS GetTimeLastDatagramArrived(void) const {return timeLastDatagramArrived;} + + // If true, will update time between packets quickly based on ping calculations + //void SetDoFastThroughputReactions(bool fast); + + // Encoded as numMessages[unsigned int], message1BitLength[unsigned int], message1Data (aligned), ... + //void GetUndeliveredMessages(RakNet::BitStream *messages, int MTUSize); + +private: + /// Send the contents of a bitstream to the socket + /// \param[in] s The socket used for sending data + /// \param[in] systemAddress The address and port to send to + /// \param[in] bitStream The data to send. + void SendBitStream( SOCKET s, SystemAddress &systemAddress, RakNet::BitStream *bitStream, RakNetRandom *rnr, unsigned short remotePortRakNetWasStartedOn_PS3, unsigned int extraSocketOptions, CCTimeType currentTime); + + ///Parse an internalPacket and create a bitstream to represent this data + /// \return Returns number of bits used + BitSize_t WriteToBitStreamFromInternalPacket( RakNet::BitStream *bitStream, const InternalPacket *const internalPacket, CCTimeType curTime ); + + + /// Parse a bitstream and create an internal packet to represent this data + InternalPacket* CreateInternalPacketFromBitStream( RakNet::BitStream *bitStream, CCTimeType time ); + + /// Does what the function name says + unsigned RemovePacketFromResendListAndDeleteOlderReliableSequenced( const MessageNumberType messageNumber, CCTimeType time, DataStructures::List &messageHandlerList, const SystemAddress &systemAddress ); + + /// Acknowledge receipt of the packet with the specified messageNumber + void SendAcknowledgementPacket( const DatagramSequenceNumberType messageNumber, CCTimeType time); + + /// This will return true if we should not send at this time + bool IsSendThrottled( int MTUSize ); + + /// We lost a packet + void UpdateWindowFromPacketloss( CCTimeType time ); + + /// Increase the window size + void UpdateWindowFromAck( CCTimeType time ); + + /// Parse an internalPacket and figure out how many header bits would be written. Returns that number + BitSize_t GetMaxMessageHeaderLengthBits( void ); + BitSize_t GetMessageHeaderLengthBits( const InternalPacket *const internalPacket ); + + /// Get the SHA1 code + void GetSHA1( unsigned char * const buffer, unsigned int nbytes, char code[ SHA1_LENGTH ] ); + + /// Check the SHA1 code + bool CheckSHA1( char code[ SHA1_LENGTH ], unsigned char * const buffer, unsigned int nbytes ); + + /// Search the specified list for sequenced packets on the specified ordering channel, optionally skipping those with splitPacketId, and delete them + void DeleteSequencedPacketsInList( unsigned char orderingChannel, DataStructures::List&theList, int splitPacketId = -1 ); + + /// Search the specified list for sequenced packets with a value less than orderingIndex and delete them + void DeleteSequencedPacketsInList( unsigned char orderingChannel, DataStructures::Queue&theList ); + + /// Returns true if newPacketOrderingIndex is older than the waitingForPacketOrderingIndex + bool IsOlderOrderedPacket( OrderingIndexType newPacketOrderingIndex, OrderingIndexType waitingForPacketOrderingIndex ); + + /// Split the passed packet into chunks under MTU_SIZE bytes (including headers) and save those new chunks + void SplitPacket( InternalPacket *internalPacket ); + + /// Insert a packet into the split packet list + void InsertIntoSplitPacketList( InternalPacket * internalPacket, CCTimeType time ); + + /// Take all split chunks with the specified splitPacketId and try to reconstruct a packet. If we can, allocate and return it. Otherwise return 0 + InternalPacket * BuildPacketFromSplitPacketList( SplitPacketIdType splitPacketId, CCTimeType time, + SOCKET s, SystemAddress &systemAddress, RakNetRandom *rnr, unsigned short remotePortRakNetWasStartedOn_PS3, unsigned int extraSocketOptions, BitStream &updateBitStream); + InternalPacket * BuildPacketFromSplitPacketList( SplitPacketChannel *splitPacketChannel, CCTimeType time ); + + /// Delete any unreliable split packets that have long since expired + //void DeleteOldUnreliableSplitPackets( CCTimeType time ); + + /// Creates a copy of the specified internal packet with data copied from the original starting at dataByteOffset for dataByteLength bytes. + /// Does not copy any split data parameters as that information is always generated does not have any reason to be copied + InternalPacket * CreateInternalPacketCopy( InternalPacket *original, int dataByteOffset, int dataByteLength, CCTimeType time ); + + /// Get the specified ordering list + // DataStructures::LinkedList *GetOrderingListAtOrderingStream( unsigned char orderingChannel ); + + /// Add the internal packet to the ordering list in order based on order index + // void AddToOrderingList( InternalPacket * internalPacket ); + + /// Inserts a packet into the resend list in order + void InsertPacketIntoResendList( InternalPacket *internalPacket, CCTimeType time, bool firstResend, bool modifyUnacknowledgedBytes ); + + /// Memory handling + void FreeMemory( bool freeAllImmediately ); + + /// Memory handling + void FreeThreadSafeMemory( void ); + + // Initialize the variables + void InitializeVariables( void ); + + /// Given the current time, is this time so old that we should consider it a timeout? + bool IsExpiredTime(unsigned int input, CCTimeType currentTime) const; + + // Make it so we don't do resends within a minimum threshold of time + void UpdateNextActionTime(void); + + + /// Does this packet number represent a packet that was skipped (out of order?) + //unsigned int IsReceivedPacketHole(unsigned int input, RakNet::TimeMS currentTime) const; + + /// Skip an element in the received packets list + //unsigned int MakeReceivedPacketHole(unsigned int input) const; + + /// How many elements are waiting to be resent? + unsigned int GetResendListDataSize(void) const; + + /// Update all memory which is not threadsafe + void UpdateThreadedMemory(void); + + void CalculateHistogramAckSize(void); + + // Used ONLY for RELIABLE_ORDERED + // RELIABLE_SEQUENCED just returns the newest one + // DataStructures::List*> orderingList; + DataStructures::Queue outputQueue; + int splitMessageProgressInterval; + CCTimeType unreliableTimeout; + + struct MessageNumberNode + { + DatagramSequenceNumberType messageNumber; + MessageNumberNode *next; + }; + struct DatagramHistoryNode + { + DatagramHistoryNode() {} + DatagramHistoryNode(MessageNumberNode *_head, CCTimeType ts + ) : + head(_head), timeSent(ts) + {} + MessageNumberNode *head; + CCTimeType timeSent; + }; + // Queue length is programmatically restricted to DATAGRAM_MESSAGE_ID_ARRAY_LENGTH + // This is essentially an O(1) lookup to get a DatagramHistoryNode given an index + // datagramHistory holds a linked list of MessageNumberNode. Each MessageNumberNode refers to one element in resendList which can be cleared on an ack. + DataStructures::Queue datagramHistory; + DataStructures::MemoryPool datagramHistoryMessagePool; + + struct UnreliableWithAckReceiptNode + { + UnreliableWithAckReceiptNode() {} + UnreliableWithAckReceiptNode(DatagramSequenceNumberType _datagramNumber, uint32_t _sendReceiptSerial, RakNet::TimeUS _nextActionTime) : + datagramNumber(_datagramNumber), sendReceiptSerial(_sendReceiptSerial), nextActionTime(_nextActionTime) + {} + DatagramSequenceNumberType datagramNumber; + uint32_t sendReceiptSerial; + RakNet::TimeUS nextActionTime; + }; + DataStructures::List unreliableWithAckReceiptHistory; + + void RemoveFromDatagramHistory(DatagramSequenceNumberType index); + MessageNumberNode* GetMessageNumberNodeByDatagramIndex(DatagramSequenceNumberType index, CCTimeType *timeSent); + void AddFirstToDatagramHistory(DatagramSequenceNumberType datagramNumber, CCTimeType timeSent); + MessageNumberNode* AddFirstToDatagramHistory(DatagramSequenceNumberType datagramNumber, DatagramSequenceNumberType messageNumber, CCTimeType timeSent); + MessageNumberNode* AddSubsequentToDatagramHistory(MessageNumberNode *messageNumberNode, DatagramSequenceNumberType messageNumber); + DatagramSequenceNumberType datagramHistoryPopCount; + + DataStructures::MemoryPool internalPacketPool; + // DataStructures::BPlusTree resendTree; + InternalPacket *resendBuffer[RESEND_BUFFER_ARRAY_LENGTH]; + InternalPacket *resendLinkedListHead; + InternalPacket *unreliableLinkedListHead; + void RemoveFromUnreliableLinkedList(InternalPacket *internalPacket); + void AddToUnreliableLinkedList(InternalPacket *internalPacket); +// unsigned int numPacketsOnResendBuffer; + //unsigned int blockWindowIncreaseUntilTime; + // DataStructures::RangeList acknowlegements; + // Resend list is a tree of packets we need to resend + + // Set to the current time when the resend queue is no longer empty + // Set to zero when it becomes empty + // Set to the current time if it is not zero, and we get incoming data + // If the current time - timeResendQueueNonEmpty is greater than a threshold, we are disconnected +// CCTimeType timeResendQueueNonEmpty; + RakNet::TimeMS timeLastDatagramArrived; + + + // If we backoff due to packetloss, don't remeasure until all waiting resends have gone out or else we overcount +// bool packetlossThisSample; +// int backoffThisSample; +// unsigned packetlossThisSampleResendCount; +// CCTimeType lastPacketlossTime; + + //DataStructures::Queue sendPacketSet[ NUMBER_OF_PRIORITIES ]; + DataStructures::Heap outgoingPacketBuffer; + reliabilityHeapWeightType outgoingPacketBufferNextWeights[NUMBER_OF_PRIORITIES]; + void InitHeapWeights(void); + reliabilityHeapWeightType GetNextWeight(int priorityLevel); +// unsigned int messageInSendBuffer[NUMBER_OF_PRIORITIES]; +// double bytesInSendBuffer[NUMBER_OF_PRIORITIES]; + + + DataStructures::OrderedList splitPacketChannelList; + + MessageNumberType sendReliableMessageNumberIndex; + MessageNumberType internalOrderIndex; + //unsigned int windowSize; + //RakNet::BitStream updateBitStream; + bool deadConnection, cheater; + SplitPacketIdType splitPacketId; + RakNet::TimeMS timeoutTime; // How long to wait in MS before timing someone out + //int MAX_AVERAGE_PACKETS_PER_SECOND; // Name says it all +// int RECEIVED_PACKET_LOG_LENGTH, requestedReceivedPacketLogLength; // How big the receivedPackets array is +// unsigned int *receivedPackets; + RakNetStatistics statistics; + + // Algorithm for blending ordered and sequenced on the same channel: + // 1. Each ordered message transmits OrderingIndexType orderedWriteIndex. There are NUMBER_OF_ORDERED_STREAMS independent values of these. The value + // starts at 0. Every time an ordered message is sent, the value increments by 1 + // 2. Each sequenced message contains the current value of orderedWriteIndex for that channel, and additionally OrderingIndexType sequencedWriteIndex. + // sequencedWriteIndex resets to 0 every time orderedWriteIndex increments. It increments by 1 every time a sequenced message is sent. + // 3. The receiver maintains the next expected value for the orderedWriteIndex, stored in orderedReadIndex. + // 4. As messages arrive: + // If a message has the current ordering index, and is sequenced, and is < the current highest sequence value, discard + // If a message has the current ordering index, and is sequenced, and is >= the current highest sequence value, return immediately + // If a message has a greater ordering index, and is sequenced or ordered, buffer it + // If a message has the current ordering index, and is ordered, buffer, then push off messages from buffer + // 5. Pushing off messages from buffer: + // Messages in buffer are put in a minheap. The value of each node is calculated such that messages are returned: + // A. (lowest ordering index, lowest sequence index) + // B. (lowest ordering index, no sequence index) + // Messages are pushed off until the heap is empty, or the next message to be returned does not preserve the ordered index + // For an empty heap, the heap weight should start at the lowest value based on the next expected ordering index, to avoid variable overflow + + // Sender increments this by 1 for every ordered message sent + OrderingIndexType orderedWriteIndex[NUMBER_OF_ORDERED_STREAMS]; + // Sender increments by 1 for every sequenced message sent. Resets to 0 when an ordered message is sent + OrderingIndexType sequencedWriteIndex[NUMBER_OF_ORDERED_STREAMS]; + // Next expected index for ordered messages. + OrderingIndexType orderedReadIndex[NUMBER_OF_ORDERED_STREAMS]; + // Highest value received for sequencedWriteIndex for the current value of orderedReadIndex on the same channel. + OrderingIndexType highestSequencedReadIndex[NUMBER_OF_ORDERED_STREAMS]; + DataStructures::Heap orderingHeaps[NUMBER_OF_ORDERED_STREAMS]; + OrderingIndexType heapIndexOffsets[NUMBER_OF_ORDERED_STREAMS]; + + + + + + + +// CCTimeType histogramStart; +// unsigned histogramBitsSent; + + + /// Memory-efficient receivedPackets algorithm: + /// receivedPacketsBaseIndex is the packet number we are expecting + /// Everything under receivedPacketsBaseIndex is a packet we already got + /// Everything over receivedPacketsBaseIndex is stored in hasReceivedPacketQueue + /// It stores the time to stop waiting for a particular packet number, where the packet number is receivedPacketsBaseIndex + the index into the queue + /// If 0, we got got that packet. Otherwise, the time to give up waiting for that packet. + /// If we get a packet number where (receivedPacketsBaseIndex-packetNumber) is less than half the range of receivedPacketsBaseIndex then it is a duplicate + /// Otherwise, it is a duplicate packet (and ignore it). + // DataStructures::Queue hasReceivedPacketQueue; + DataStructures::Queue hasReceivedPacketQueue; + DatagramSequenceNumberType receivedPacketsBaseIndex; + bool resetReceivedPackets; + + CCTimeType lastUpdateTime; + CCTimeType timeBetweenPackets, nextSendTime; + + + +// CCTimeType ackPingSamples[ACK_PING_SAMPLES_SIZE]; // Must be range of unsigned char to wrap ackPingIndex properly + CCTimeType ackPingSum; + unsigned char ackPingIndex; + //CCTimeType nextLowestPingReset; + RemoteSystemTimeType remoteSystemTime; +// bool continuousSend; +// CCTimeType lastTimeBetweenPacketsIncrease,lastTimeBetweenPacketsDecrease; + // Limit changes in throughput to once per ping - otherwise even if lag starts we don't know about it + // In the meantime the connection is flooded and overrun. + CCTimeType nextAllowedThroughputSample; + bool bandwidthExceededStatistic; + + // If Update::maxBitsPerSecond > 0, then throughputCapCountdown is used as a timer to prevent sends for some amount of time after each send, depending on + // the amount of data sent + long long throughputCapCountdown; + + unsigned receivePacketCount; + +#ifdef _DEBUG + struct DataAndTime// + { + SOCKET s; + char data[ MAXIMUM_MTU_SIZE ]; + unsigned int length; + RakNet::TimeMS sendTime; + // SystemAddress systemAddress; + unsigned short remotePortRakNetWasStartedOn_PS3; + unsigned int extraSocketOptions; + }; + DataStructures::Queue delayList; + + // Internet simulator + double packetloss; + RakNet::TimeMS minExtraPing, extraPingVariance; +#endif + + CCTimeType elapsedTimeSinceLastUpdate; + + CCTimeType nextAckTimeToSend; + + +#if USE_SLIDING_WINDOW_CONGESTION_CONTROL==1 + RakNet::CCRakNetSlidingWindow congestionManager; +#else + RakNet::CCRakNetUDT congestionManager; +#endif + + + uint32_t unacknowledgedBytes; + + bool ResendBufferOverflow(void) const; + void ValidateResendList(void) const; + void ResetPacketsAndDatagrams(void); + void PushPacket(CCTimeType time, InternalPacket *internalPacket, bool isReliable); + void PushDatagram(void); + bool TagMostRecentPushAsSecondOfPacketPair(void); + void ClearPacketsAndDatagrams(void); + void MoveToListHead(InternalPacket *internalPacket); + void RemoveFromList(InternalPacket *internalPacket, bool modifyUnacknowledgedBytes); + void AddToListTail(InternalPacket *internalPacket, bool modifyUnacknowledgedBytes); + void PopListHead(bool modifyUnacknowledgedBytes); + bool IsResendQueueEmpty(void) const; + void SortSplitPacketList(DataStructures::List &data, unsigned int leftEdge, unsigned int rightEdge) const; + void SendACKs(SOCKET s, SystemAddress &systemAddress, CCTimeType time, RakNetRandom *rnr, unsigned short remotePortRakNetWasStartedOn_PS3, unsigned int extraSocketOptions, BitStream &updateBitStream); + + DataStructures::List packetsToSendThisUpdate; + DataStructures::List packetsToDeallocThisUpdate; + // boundary is in packetsToSendThisUpdate, inclusive + DataStructures::List packetsToSendThisUpdateDatagramBoundaries; + DataStructures::List datagramsToSendThisUpdateIsPair; + DataStructures::List datagramSizesInBytes; + BitSize_t datagramSizeSoFar; + BitSize_t allDatagramSizesSoFar; + double totalUserDataBytesAcked; + CCTimeType timeOfLastContinualSend; + CCTimeType timeToNextUnreliableCull; + + // This doesn't need to be a member, but I do it to avoid reallocations + DataStructures::RangeList incomingAcks; + + // Every 16 datagrams, we make sure the 17th datagram goes out the same update tick, and is the same size as the 16th + int countdownToNextPacketPair; + InternalPacket* AllocateFromInternalPacketPool(void); + void ReleaseToInternalPacketPool(InternalPacket *ip); + + DataStructures::RangeList acknowlegements; + DataStructures::RangeList NAKs; + bool remoteSystemNeedsBAndAS; + + unsigned int GetMaxDatagramSizeExcludingMessageHeaderBytes(void); + BitSize_t GetMaxDatagramSizeExcludingMessageHeaderBits(void); + + // ourOffset refers to a section within externallyAllocatedPtr. Do not deallocate externallyAllocatedPtr until all references are lost + void AllocInternalPacketData(InternalPacket *internalPacket, InternalPacketRefCountedData **refCounter, unsigned char *externallyAllocatedPtr, unsigned char *ourOffset); + // Set the data pointer to externallyAllocatedPtr, do not allocate + void AllocInternalPacketData(InternalPacket *internalPacket, unsigned char *externallyAllocatedPtr); + // Allocate new + void AllocInternalPacketData(InternalPacket *internalPacket, unsigned int numBytes, bool allowStack, const char *file, unsigned int line); + void FreeInternalPacketData(InternalPacket *internalPacket, const char *file, unsigned int line); + DataStructures::MemoryPool refCountedDataPool; + + BPSTracker bpsMetrics[RNS_PER_SECOND_METRICS_COUNT]; + CCTimeType lastBpsClear; + +#if LIBCAT_SECURITY==1 +public: + cat::AuthenticatedEncryption* GetAuthenticatedEncryption(void) { return &auth_enc; } + +protected: + cat::AuthenticatedEncryption auth_enc; + bool useSecurity; +#endif // LIBCAT_SECURITY +}; + +} // namespace RakNet + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ReplicaEnums.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ReplicaEnums.h new file mode 100644 index 0000000..7b0b4a0 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ReplicaEnums.h @@ -0,0 +1,43 @@ +/// \file +/// \brief Contains enumerations used by the ReplicaManager system. This file is a lightweight header, so you can include it without worrying about linking in lots of other crap +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __REPLICA_ENUMS_H +#define __REPLICA_ENUMS_H + +/// Replica interface flags, used to enable and disable function calls on the Replica object +/// Passed to ReplicaManager::EnableReplicaInterfaces and ReplicaManager::DisableReplicaInterfaces +enum +{ + REPLICA_RECEIVE_DESTRUCTION=1<<0, + REPLICA_RECEIVE_SERIALIZE=1<<1, + REPLICA_RECEIVE_SCOPE_CHANGE=1<<2, + REPLICA_SEND_CONSTRUCTION=1<<3, + REPLICA_SEND_DESTRUCTION=1<<4, + REPLICA_SEND_SCOPE_CHANGE=1<<5, + REPLICA_SEND_SERIALIZE=1<<6, + REPLICA_SET_ALL = 0xFF // Allow all of the above +}; + +enum ReplicaReturnResult +{ + /// This means call the function again later, with the same parameters + REPLICA_PROCESS_LATER, + /// This means we are done processing (the normal result to return) + REPLICA_PROCESSING_DONE, + /// This means cancel the processing - don't send any network messages and don't change the current state. + REPLICA_CANCEL_PROCESS, + /// Same as REPLICA_PROCESSING_DONE, where a message is sent, but does not clear the send bit. + /// Useful for multi-part sends with different reliability levels. + /// Only currently used by Replica::Serialize + REPLICA_PROCESS_AGAIN, + /// Only returned from the Replica::SendConstruction interface, means act as if the other system had this object but don't actually + /// Send a construction packet. This way you will still send scope and serialize packets to that system + REPLICA_PROCESS_IMPLICIT +}; + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ReplicaManager3.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ReplicaManager3.cpp new file mode 100644 index 0000000..41d40c7 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ReplicaManager3.cpp @@ -0,0 +1,2250 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_ReplicaManager3==1 + +#include "ReplicaManager3.h" +#include "GetTime.h" +#include "MessageIdentifiers.h" +#include "RakPeerInterface.h" +#include "NetworkIDManager.h" + +using namespace RakNet; + +// DEFINE_MULTILIST_PTR_TO_MEMBER_COMPARISONS(LastSerializationResult,Replica3*,replica); + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +bool PRO::operator==( const PRO& right ) const +{ + return priority == right.priority && reliability == right.reliability && orderingChannel == right.orderingChannel && sendReceipt == right.sendReceipt; +} + +bool PRO::operator!=( const PRO& right ) const +{ + return priority != right.priority || reliability != right.reliability || orderingChannel != right.orderingChannel || sendReceipt != right.sendReceipt; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +int Connection_RM3::Replica3LSRComp( Replica3 * const &replica3, LastSerializationResult * const &data ) +{ + if (replica3->GetNetworkID() < data->replica->GetNetworkID()) + return -1; + if (replica3->GetNetworkID() > data->replica->GetNetworkID()) + return 1; + return 0; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +LastSerializationResult::LastSerializationResult() +{ + replica=0; + lastSerializationResultBS=0; +} +LastSerializationResult::~LastSerializationResult() +{ + if (lastSerializationResultBS) + RakNet::OP_DELETE(lastSerializationResultBS,_FILE_AND_LINE_); +} +void LastSerializationResult::AllocBS(void) +{ + if (lastSerializationResultBS==0) + { + lastSerializationResultBS=RakNet::OP_NEW(_FILE_AND_LINE_); + } +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +ReplicaManager3::ReplicaManager3() +{ + defaultSendParameters.orderingChannel=0; + defaultSendParameters.priority=HIGH_PRIORITY; + defaultSendParameters.reliability=RELIABLE_ORDERED; + defaultSendParameters.sendReceipt=0; + autoSerializeInterval=30; + lastAutoSerializeOccurance=0; + worldId=0; + autoCreateConnections=true; + autoDestroyConnections=true; + networkIDManager=0; + currentlyDeallocatingReplica=0; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +ReplicaManager3::~ReplicaManager3() +{ + if (autoDestroyConnections) + { + // Clear() calls DeallocConnection(), which is pure virtual and cannot be called from the destructor + RakAssert(connectionList.Size()==0); + } + Clear(); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void ReplicaManager3::SetAutoManageConnections(bool autoCreate, bool autoDestroy) +{ + autoCreateConnections=autoCreate; + autoDestroyConnections=autoDestroy; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +bool ReplicaManager3::PushConnection(RakNet::Connection_RM3 *newConnection) +{ + if (newConnection==0) + return false; + if (GetConnectionByGUID(newConnection->GetRakNetGUID())) + return false; + unsigned int index = connectionList.GetIndexOf(newConnection); + if (index==(unsigned int)-1) + { + connectionList.Push(newConnection,_FILE_AND_LINE_); + + // Send message to validate the connection + newConnection->SendValidation(rakPeerInterface, worldId); + + Connection_RM3::ConstructionMode constructionMode = newConnection->QueryConstructionMode(); + if (constructionMode==Connection_RM3::QUERY_REPLICA_FOR_CONSTRUCTION || constructionMode==Connection_RM3::QUERY_REPLICA_FOR_CONSTRUCTION_AND_DESTRUCTION) + { + unsigned int pushIdx; + for (pushIdx=0; pushIdx < userReplicaList.Size(); pushIdx++) + newConnection->OnLocalReference(userReplicaList[pushIdx], this); + } + } + return true; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void ReplicaManager3::DeallocReplicaNoBroadcastDestruction(RakNet::Connection_RM3 *connection, RakNet::Replica3 *replica3) +{ + currentlyDeallocatingReplica=replica3; + replica3->DeallocReplica(connection); + currentlyDeallocatingReplica=0; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +RakNet::Connection_RM3 * ReplicaManager3::PopConnection(unsigned int index) +{ + DataStructures::List replicaList; + DataStructures::List destructionList; + DataStructures::List broadcastList; + RakNet::Connection_RM3 *connection; + unsigned int index2; + RM3ActionOnPopConnection action; + + connection=connectionList[index]; + + // Clear out downloadGroup + connection->ClearDownloadGroup(rakPeerInterface); + + RakNetGUID guid = connection->GetRakNetGUID(); + // This might be wrong, I am relying on the variable creatingSystemGuid which is transmitted + // automatically from the first system to reference the object. However, if an object changes + // owners then it is not going to be returned here, and therefore QueryActionOnPopConnection() + // will not be called for the new owner. + GetReplicasCreatedByGuid(guid, replicaList); + + for (index2=0; index2 < replicaList.Size(); index2++) + { + action = replicaList[index2]->QueryActionOnPopConnection(connection); + replicaList[index2]->OnPoppedConnection(connection); + if (action==RM3AOPC_DELETE_REPLICA) + { + destructionList.Push( replicaList[index2], _FILE_AND_LINE_ ); + } + else if (action==RM3AOPC_DELETE_REPLICA_AND_BROADCAST_DESTRUCTION) + { + destructionList.Push( replicaList[index2], _FILE_AND_LINE_ ); + + broadcastList.Push( replicaList[index2], _FILE_AND_LINE_ ); + } + } + + BroadcastDestructionList(broadcastList, connection->GetSystemAddress()); + for (index2=0; index2 < destructionList.Size(); index2++) + { + destructionList[index2]->PreDestruction(connection); + destructionList[index2]->DeallocReplica(connection); + } + + connectionList.RemoveAtIndex(index); + return connection; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +RakNet::Connection_RM3 * ReplicaManager3::PopConnection(RakNetGUID guid) +{ + unsigned int index; + + for (index=0; index < connectionList.Size(); index++) + { + if (connectionList[index]->GetRakNetGUID()==guid) + { + return PopConnection(index); + } + } + return 0; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void ReplicaManager3::Reference(RakNet::Replica3 *replica3) +{ + unsigned int index = ReferenceInternal(replica3); + + if (index!=(unsigned int)-1) + { + unsigned int pushIdx; + for (pushIdx=0; pushIdx < connectionList.Size(); pushIdx++) + { + Connection_RM3::ConstructionMode constructionMode = connectionList[pushIdx]->QueryConstructionMode(); + if (constructionMode==Connection_RM3::QUERY_REPLICA_FOR_CONSTRUCTION || constructionMode==Connection_RM3::QUERY_REPLICA_FOR_CONSTRUCTION_AND_DESTRUCTION) + { + connectionList[pushIdx]->OnLocalReference(replica3, this); + } + } + } +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +unsigned int ReplicaManager3::ReferenceInternal(RakNet::Replica3 *replica3) +{ + unsigned int index; + index = userReplicaList.GetIndexOf(replica3); + if (index==(unsigned int)-1) + { + RakAssert(networkIDManager); + replica3->SetNetworkIDManager(networkIDManager); + if (replica3->creatingSystemGUID==UNASSIGNED_RAKNET_GUID) + replica3->creatingSystemGUID=rakPeerInterface->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS); + replica3->replicaManager=this; + userReplicaList.Push(replica3,_FILE_AND_LINE_); + index=userReplicaList.Size()-1; + } + return index; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void ReplicaManager3::Dereference(RakNet::Replica3 *replica3) +{ + unsigned int index, index2; + for (index=0; index < userReplicaList.Size(); index++) + { + if (userReplicaList[index]==replica3) + { + userReplicaList.RemoveAtIndex(index); + break; + } + } + + // Remove from all connections + for (index2=0; index2 < connectionList.Size(); index2++) + { + connectionList[index2]->OnDereference(replica3, this); + } +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void ReplicaManager3::DereferenceList(DataStructures::List &replicaListIn) +{ + unsigned int index; + for (index=0; index < replicaListIn.Size(); index++) + Dereference(replicaListIn[index]); +} + + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void ReplicaManager3::GetReplicasCreatedByMe(DataStructures::List &replicaListOut) +{ + RakNetGUID myGuid = rakPeerInterface->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS); + GetReplicasCreatedByGuid(rakPeerInterface->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS), replicaListOut); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void ReplicaManager3::GetReferencedReplicaList(DataStructures::List &replicaListOut) +{ + replicaListOut=userReplicaList; +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void ReplicaManager3::GetReplicasCreatedByGuid(RakNetGUID guid, DataStructures::List &replicaListOut) +{ + replicaListOut.Clear(false,_FILE_AND_LINE_); + unsigned int index; + for (index=0; index < userReplicaList.Size(); index++) + { + if (userReplicaList[index]->creatingSystemGUID==guid) + replicaListOut.Push(userReplicaList[index],_FILE_AND_LINE_); + } +} + + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +unsigned ReplicaManager3::GetReplicaCount(void) const +{ + return userReplicaList.Size(); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Replica3 *ReplicaManager3::GetReplicaAtIndex(unsigned index) +{ + return userReplicaList[index]; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +unsigned int ReplicaManager3::GetConnectionCount(void) const +{ + return connectionList.Size(); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Connection_RM3* ReplicaManager3::GetConnectionAtIndex(unsigned index) const +{ + return connectionList[index]; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Connection_RM3* ReplicaManager3::GetConnectionBySystemAddress(const SystemAddress &sa) const +{ + unsigned int index; + for (index=0; index < connectionList.Size(); index++) + { + if (connectionList[index]->GetSystemAddress()==sa) + { + return connectionList[index]; + } + } + return 0; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Connection_RM3* ReplicaManager3::GetConnectionByGUID(RakNetGUID guid) const +{ + unsigned int index; + for (index=0; index < connectionList.Size(); index++) + { + if (connectionList[index]->GetRakNetGUID()==guid) + { + return connectionList[index]; + } + } + return 0; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void ReplicaManager3::SetDefaultOrderingChannel(char def) +{ + defaultSendParameters.orderingChannel=def; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void ReplicaManager3::SetDefaultPacketPriority(PacketPriority def) +{ + defaultSendParameters.priority=def; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void ReplicaManager3::SetDefaultPacketReliability(PacketReliability def) +{ + defaultSendParameters.reliability=def; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void ReplicaManager3::SetAutoSerializeInterval(RakNet::Time intervalMS) +{ + autoSerializeInterval=intervalMS; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void ReplicaManager3::GetConnectionsThatHaveReplicaConstructed(Replica3 *replica, DataStructures::List &connectionsThatHaveConstructedThisReplica) +{ + connectionsThatHaveConstructedThisReplica.Clear(false,_FILE_AND_LINE_); + unsigned int index; + for (index=0; index < connectionList.Size(); index++) + { + if (connectionList[index]->HasReplicaConstructed(replica)) + connectionsThatHaveConstructedThisReplica.Push(connectionList[index],_FILE_AND_LINE_); + } +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void ReplicaManager3::Clear(void) +{ + if (autoDestroyConnections) + { + for (unsigned int i=0; i < connectionList.Size(); i++) + DeallocConnection(connectionList[i]); + } + else + { + // Clear out downloadGroup even if not auto destroying the connection, since the packets need to go back to RakPeer + for (unsigned int i=0; i < connectionList.Size(); i++) + connectionList[i]->ClearDownloadGroup(rakPeerInterface); + } + + + + connectionList.Clear(true,_FILE_AND_LINE_); + userReplicaList.Clear(true,_FILE_AND_LINE_); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +PRO ReplicaManager3::GetDefaultSendParameters(void) const +{ + return defaultSendParameters; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void ReplicaManager3::SetWorldID(unsigned char id) +{ + worldId=id; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +unsigned char ReplicaManager3::GetWorldID(void) const +{ + return worldId; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +NetworkIDManager *ReplicaManager3::GetNetworkIDManager(void) const +{ + return networkIDManager; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void ReplicaManager3::SetNetworkIDManager(NetworkIDManager *_networkIDManager) +{ + networkIDManager=_networkIDManager; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +PluginReceiveResult ReplicaManager3::OnReceive(Packet *packet) +{ + if (packet->length<2) + return RR_CONTINUE_PROCESSING; + + unsigned char incomingWorldId; + + RakNet::Time timestamp=0; + unsigned char packetIdentifier, packetDataOffset; + if ( ( unsigned char ) packet->data[ 0 ] == ID_TIMESTAMP ) + { + if ( packet->length > sizeof( unsigned char ) + sizeof( RakNet::Time ) ) + { + packetIdentifier = ( unsigned char ) packet->data[ sizeof( unsigned char ) + sizeof( RakNet::Time ) ]; + // Required for proper endian swapping + RakNet::BitStream tsBs(packet->data+sizeof(MessageID),packet->length-1,false); + tsBs.Read(timestamp); + incomingWorldId=packet->data[sizeof( unsigned char )*2 + sizeof( RakNet::Time )]; + packetDataOffset=sizeof( unsigned char )*3 + sizeof( RakNet::Time ); + } + else + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + else + { + packetIdentifier = ( unsigned char ) packet->data[ 0 ]; + incomingWorldId=packet->data[sizeof( unsigned char )]; + packetDataOffset=sizeof( unsigned char )*2; + } + + switch (packetIdentifier) + { + case ID_REPLICA_MANAGER_CONSTRUCTION: + if (incomingWorldId!=worldId) + return RR_CONTINUE_PROCESSING; + return OnConstruction(packet, packet->data, packet->length, packet->guid, packetDataOffset); + case ID_REPLICA_MANAGER_SERIALIZE: + if (incomingWorldId!=worldId) + return RR_CONTINUE_PROCESSING; + return OnSerialize(packet, packet->data, packet->length, packet->guid, timestamp, packetDataOffset); + case ID_REPLICA_MANAGER_DOWNLOAD_STARTED: + if (packet->wasGeneratedLocally==false) + { + if (incomingWorldId!=worldId) + return RR_CONTINUE_PROCESSING; + return OnDownloadStarted(packet, packet->data, packet->length, packet->guid, packetDataOffset); + } + else + break; + case ID_REPLICA_MANAGER_DOWNLOAD_COMPLETE: + if (packet->wasGeneratedLocally==false) + { + if (incomingWorldId!=worldId) + return RR_CONTINUE_PROCESSING; + return OnDownloadComplete(packet, packet->data, packet->length, packet->guid, packetDataOffset); + } + else + break; + case ID_REPLICA_MANAGER_SCOPE_CHANGE: + { + if (incomingWorldId!=worldId) + return RR_CONTINUE_PROCESSING; + + Connection_RM3 *connection = GetConnectionByGUID(packet->guid); + if (connection && connection->isValidated==false) + { + // This connection is now confirmed bidirectional + connection->isValidated=true; + // Reply back on validation + connection->SendValidation(rakPeerInterface,worldId); + } + } + } + + return RR_CONTINUE_PROCESSING; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void Connection_RM3::AutoConstructByQuery(ReplicaManager3 *replicaManager3) +{ + ValidateLists(replicaManager3); + + ConstructionMode constructionMode = QueryConstructionMode(); + + unsigned int index; + RM3ConstructionState constructionState; + LastSerializationResult *lsr; + index=0; + + constructedReplicasCulled.Clear(false,_FILE_AND_LINE_); + destroyedReplicasCulled.Clear(false,_FILE_AND_LINE_); + + if (constructionMode==QUERY_REPLICA_FOR_CONSTRUCTION || constructionMode==QUERY_REPLICA_FOR_CONSTRUCTION_AND_DESTRUCTION) + { + while (index < queryToConstructReplicaList.Size()) + { + lsr=queryToConstructReplicaList[index]; + constructionState=lsr->replica->QueryConstruction(this, replicaManager3); + if (constructionState==RM3CS_ALREADY_EXISTS_REMOTELY || constructionState==RM3CS_ALREADY_EXISTS_REMOTELY_DO_NOT_CONSTRUCT) + { + OnReplicaAlreadyExists(index, replicaManager3); + if (constructionState==RM3CS_ALREADY_EXISTS_REMOTELY) + constructedReplicasCulled.Push(lsr->replica,_FILE_AND_LINE_); + + /* + if (constructionState==RM3CS_ALREADY_EXISTS_REMOTELY) + { + // Serialize construction data to this connection + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_REPLICA_MANAGER_3_SERIALIZE_CONSTRUCTION_EXISTING); + bsOut.Write(replicaManager3->GetWorldID()); + NetworkID networkId; + networkId=lsr->replica->GetNetworkID(); + bsOut.Write(networkId); + BitSize_t bitsWritten = bsOut.GetNumberOfBitsUsed(); + lsr->replica->SerializeConstructionExisting(&bsOut, this); + if (bsOut.GetNumberOfBitsUsed()!=bitsWritten) + replicaManager3->SendUnified(&bsOut,HIGH_PRIORITY,RELIABLE_ORDERED,0,GetSystemAddress(), false); + } + + // Serialize first serialization to this connection. + // This is done here, as it isn't done in PushConstruction + SerializeParameters sp; + RakNet::BitStream emptyBs; + for (index=0; index < (unsigned int) RM3_NUM_OUTPUT_BITSTREAM_CHANNELS; index++) + { + sp.lastSentBitstream[index]=&emptyBs; + sp.pro[index]=replicaManager3->GetDefaultSendParameters(); + } + sp.bitsWrittenSoFar=0; + sp.destinationConnection=this; + sp.messageTimestamp=0; + sp.whenLastSerialized=0; + + RakNet::Replica3 *replica = lsr->replica; + + RM3SerializationResult res = replica->Serialize(&sp); + if (res!=RM3SR_NEVER_SERIALIZE_FOR_THIS_CONNECTION && + res!=RM3SR_DO_NOT_SERIALIZE && + res!=RM3SR_SERIALIZED_UNIQUELY) + { + bool allIndices[RM3_NUM_OUTPUT_BITSTREAM_CHANNELS]; + for (int z=0; z < RM3_NUM_OUTPUT_BITSTREAM_CHANNELS; z++) + { + sp.bitsWrittenSoFar+=sp.outputBitstream[z].GetNumberOfBitsUsed(); + allIndices[z]=true; + } + if (SendSerialize(replica, allIndices, sp.outputBitstream, sp.messageTimestamp, sp.pro, replicaManager3->GetRakPeerInterface(), replicaManager3->GetWorldID())==SSICR_SENT_DATA) + lsr->replica->whenLastSerialized=RakNet::GetTimeMS(); + } + */ + } + else if (constructionState==RM3CS_SEND_CONSTRUCTION) + { + OnConstructToThisConnection(index, replicaManager3); + constructedReplicasCulled.Push(lsr->replica,_FILE_AND_LINE_); + } + else if (constructionState==RM3CS_NEVER_CONSTRUCT) + { + OnNeverConstruct(index, replicaManager3); + } + else// if (constructionState==RM3CS_NO_ACTION) + { + // Do nothing + index++; + } + } + + if (constructionMode==QUERY_REPLICA_FOR_CONSTRUCTION_AND_DESTRUCTION) + { + RM3DestructionState destructionState; + index=0; + while (index < queryToDestructReplicaList.Size()) + { + lsr=queryToDestructReplicaList[index]; + destructionState=lsr->replica->QueryDestruction(this, replicaManager3); + if (destructionState==RM3DS_SEND_DESTRUCTION) + { + OnSendDestructionFromQuery(index, replicaManager3); + destroyedReplicasCulled.Push(lsr->replica,_FILE_AND_LINE_); + } + else if (destructionState==RM3DS_DO_NOT_QUERY_DESTRUCTION) + { + OnDoNotQueryDestruction(index, replicaManager3); + } + else// if (destructionState==RM3CS_NO_ACTION) + { + // Do nothing + index++; + } + } + } + } + else if (constructionMode==QUERY_CONNECTION_FOR_REPLICA_LIST) + { + QueryReplicaList(constructedReplicasCulled,destroyedReplicasCulled); + + unsigned int idx1, idx2; + + // Create new + for (idx2=0; idx2 < constructedReplicasCulled.Size(); idx2++) + OnConstructToThisConnection(constructedReplicasCulled[idx2], replicaManager3); + + bool exists; + for (idx2=0; idx2 < destroyedReplicasCulled.Size(); idx2++) + { + exists=false; + bool objectExists; + idx1=constructedReplicaList.GetIndexFromKey(destroyedReplicasCulled[idx2], &objectExists); + RakAssert(objectExists); + if (objectExists) + { + OnSendDestructionFromQuery(idx1,replicaManager3); + } + + // If this assert hits, the user tried to destroy a replica that doesn't exist on the remote system + RakAssert(exists); + } + } + + SendConstruction(constructedReplicasCulled,destroyedReplicasCulled,replicaManager3->defaultSendParameters,replicaManager3->rakPeerInterface,replicaManager3->worldId,replicaManager3); +} +void ReplicaManager3::Update(void) +{ + unsigned int index,index2; + + for (index=0; index < connectionList.Size(); index++) + { + if (connectionList[index]->isValidated==false) + continue; + connectionList[index]->AutoConstructByQuery(this); + } + + RakNet::Time time = RakNet::GetTimeMS(); + + if (time - lastAutoSerializeOccurance >= autoSerializeInterval) + { + for (index=0; index < userReplicaList.Size(); index++) + { + userReplicaList[index]->forceSendUntilNextUpdate=false; + userReplicaList[index]->OnUserReplicaPreSerializeTick(); + } + + + unsigned int index; + SerializeParameters sp; + sp.curTime=time; + Connection_RM3 *connection; + SendSerializeIfChangedResult ssicr; + sp.messageTimestamp=0; + for (int i=0; i < RM3_NUM_OUTPUT_BITSTREAM_CHANNELS; i++) + sp.pro[i]=defaultSendParameters; + index2=0; + for (index=0; index < connectionList.Size(); index++) + { + connection = connectionList[index]; + sp.bitsWrittenSoFar=0; + index2=0; + while (index2 < connection->queryToSerializeReplicaList.Size()) + { + sp.destinationConnection=connection; + sp.whenLastSerialized=connection->queryToSerializeReplicaList[index2]->replica->whenLastSerialized; + ssicr=connection->SendSerializeIfChanged(index2, &sp, GetRakPeerInterface(), GetWorldID(), this); + if (ssicr==SSICR_SENT_DATA) + { + connection->queryToSerializeReplicaList[index2]->replica->whenLastSerialized=time; + index2++; + } + else if (ssicr==SSICR_NEVER_SERIALIZE) + { + // Removed from the middle of the list + } + else + index2++; + } + } + + lastAutoSerializeOccurance=time; + } +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void ReplicaManager3::OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ) +{ + (void) lostConnectionReason; + (void) systemAddress; + if (autoDestroyConnections) + { + Connection_RM3 *connection = PopConnection(rakNetGUID); + if (connection) + DeallocConnection(connection); + } +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void ReplicaManager3::OnNewConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, bool isIncoming) +{ + (void) isIncoming; + if (autoCreateConnections) + { + Connection_RM3 *connection = AllocConnection(systemAddress, rakNetGUID); + if (connection) + PushConnection(connection); + } +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void ReplicaManager3::OnRakPeerShutdown(void) +{ + if (autoDestroyConnections) + { + while (connectionList.Size()) + { + Connection_RM3 *connection = PopConnection(connectionList.Size()-1); + if (connection) + DeallocConnection(connection); + } + } + + Clear(); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void ReplicaManager3::OnDetach(void) +{ + OnRakPeerShutdown(); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +PluginReceiveResult ReplicaManager3::OnConstruction(Packet *packet, unsigned char *packetData, int packetDataLength, RakNetGUID senderGuid, unsigned char packetDataOffset) +{ + Connection_RM3 *connection = GetConnectionByGUID(senderGuid); + if (connection==0) + { + // Almost certainly a bug + RakAssert("Got OnConstruction but no connection yet" && 0); + return RR_CONTINUE_PROCESSING; + } + if (connection->groupConstructionAndSerialize) + { + connection->downloadGroup.Push(packet, __FILE__, __LINE__); + return RR_STOP_PROCESSING; + } + + RakNet::BitStream bsIn(packetData,packetDataLength,false); + bsIn.IgnoreBytes(packetDataOffset); + uint16_t constructionObjectListSize, destructionObjectListSize, index, index2; + BitSize_t streamEnd, writeAllocationIDEnd; + Replica3 *replica; + NetworkID networkId; + RakNetGUID creatingSystemGuid; + bool actuallyCreateObject=false; + + DataStructures::List actuallyCreateObjectList; + DataStructures::List constructionTickStack; + + RakAssert(networkIDManager); + + bsIn.Read(constructionObjectListSize); + for (index=0; index < constructionObjectListSize; index++) + { + bsIn.Read(streamEnd); + bsIn.Read(networkId); + Replica3* existingReplica = networkIDManager->GET_OBJECT_FROM_ID(networkId); + bsIn.Read(actuallyCreateObject); + actuallyCreateObjectList.Push(actuallyCreateObject, _FILE_AND_LINE_); + bsIn.AlignReadToByteBoundary(); + + if (actuallyCreateObject) + { + bsIn.Read(creatingSystemGuid); + bsIn.Read(writeAllocationIDEnd); + + //printf("OnConstruction: %i\n",networkId.guid.g); // Removeme + if (existingReplica) + { + existingReplica->replicaManager=this; + + // Network ID already in use + connection->OnDownloadExisting(existingReplica, this); + + constructionTickStack.Push(0, _FILE_AND_LINE_); + bsIn.SetReadOffset(streamEnd); + continue; + } + + bsIn.AlignReadToByteBoundary(); + replica = connection->AllocReplica(&bsIn, this); + if (replica==0) + { + constructionTickStack.Push(0, _FILE_AND_LINE_); + bsIn.SetReadOffset(streamEnd); + continue; + } + + // Go past the bitStream written to with WriteAllocationID(). Necessary in case the user didn't read out the bitStream the same way it was written + // bitOffset2 is already aligned + bsIn.SetReadOffset(writeAllocationIDEnd); + + replica->SetNetworkIDManager(networkIDManager); + replica->SetNetworkID(networkId); + + replica->replicaManager=this; + replica->creatingSystemGUID=creatingSystemGuid; + + if (!replica->QueryRemoteConstruction(connection) || + !replica->DeserializeConstruction(&bsIn, connection)) + { + DeallocReplicaNoBroadcastDestruction(connection, replica); + bsIn.SetReadOffset(streamEnd); + constructionTickStack.Push(0, _FILE_AND_LINE_); + continue; + } + + constructionTickStack.Push(replica, _FILE_AND_LINE_); + + // Register the replica + ReferenceInternal(replica); + } + else + { + if (existingReplica) + { + existingReplica->DeserializeConstructionExisting(&bsIn, connection); + constructionTickStack.Push(existingReplica, _FILE_AND_LINE_); + } + else + { + constructionTickStack.Push(0, _FILE_AND_LINE_); + } + } + + + bsIn.SetReadOffset(streamEnd); + bsIn.AlignReadToByteBoundary(); + } + + RakAssert(constructionTickStack.Size()==constructionObjectListSize); + RakAssert(actuallyCreateObjectList.Size()==constructionObjectListSize); + + RakNet::BitStream empty; + for (index=0; index < constructionObjectListSize; index++) + { + bool pdcWritten=false; + bsIn.Read(pdcWritten); + if (pdcWritten) + { + bsIn.AlignReadToByteBoundary(); + bsIn.Read(streamEnd); + bsIn.Read(networkId); + if (constructionTickStack[index]!=0) + { + bsIn.AlignReadToByteBoundary(); + if (actuallyCreateObjectList[index]) + constructionTickStack[index]->PostDeserializeConstruction(&bsIn, connection); + else + constructionTickStack[index]->PostDeserializeConstructionExisting(&bsIn, connection); + } + bsIn.SetReadOffset(streamEnd); + } + else + { + if (constructionTickStack[index]!=0) + constructionTickStack[index]->PostDeserializeConstruction(&empty, connection); + } + } + + for (index=0; index < constructionObjectListSize; index++) + { + if (constructionTickStack[index]!=0) + { + if (actuallyCreateObjectList[index]) + { + // Tell the connection(s) that this object exists since they just sent it to us + connection->OnDownloadFromThisSystem(constructionTickStack[index], this); + + for (index2=0; index2 < connectionList.Size(); index2++) + { + if (connectionList[index2]!=connection) + connectionList[index2]->OnDownloadFromOtherSystem(constructionTickStack[index], this); + } + } + } + } + + // Destructions + bool b = bsIn.Read(destructionObjectListSize); + (void) b; + RakAssert(b); + for (index=0; index < destructionObjectListSize; index++) + { + bsIn.Read(networkId); + bsIn.Read(streamEnd); + replica = networkIDManager->GET_OBJECT_FROM_ID(networkId); + if (replica==0) + { + // Unknown object + bsIn.SetReadOffset(streamEnd); + continue; + } + bsIn.Read(replica->deletingSystemGUID); + if (replica->DeserializeDestruction(&bsIn,connection)) + { + // Make sure it wasn't deleted in DeserializeDestruction + if (networkIDManager->GET_OBJECT_FROM_ID(networkId)) + { + replica->PreDestruction(connection); + + // Forward deletion by remote system + if (replica->QueryRelayDestruction(connection)) + BroadcastDestruction(replica,connection->GetSystemAddress()); + Dereference(replica); + DeallocReplicaNoBroadcastDestruction(connection, replica); + } + } + else + { + replica->PreDestruction(connection); + connection->OnDereference(replica, this); + } + + bsIn.AlignReadToByteBoundary(); + } + return RR_CONTINUE_PROCESSING; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +PluginReceiveResult ReplicaManager3::OnSerialize(Packet *packet, unsigned char *packetData, int packetDataLength, RakNetGUID senderGuid, RakNet::Time timestamp, unsigned char packetDataOffset) +{ + Connection_RM3 *connection = GetConnectionByGUID(senderGuid); + if (connection==0) + return RR_CONTINUE_PROCESSING; + if (connection->groupConstructionAndSerialize) + { + connection->downloadGroup.Push(packet, __FILE__, __LINE__); + return RR_STOP_PROCESSING; + } + RakAssert(networkIDManager); + RakNet::BitStream bsIn(packetData,packetDataLength,false); + bsIn.IgnoreBytes(packetDataOffset); + + struct DeserializeParameters ds; + ds.timeStamp=timestamp; + ds.sourceConnection=connection; + + Replica3 *replica; + NetworkID networkId; + BitSize_t bitsUsed; + bsIn.Read(networkId); + //printf("OnSerialize: %i\n",networkId.guid.g); // Removeme + replica = networkIDManager->GET_OBJECT_FROM_ID(networkId); + if (replica) + { + for (int z=0; z < RM3_NUM_OUTPUT_BITSTREAM_CHANNELS; z++) + { + bsIn.Read(ds.bitstreamWrittenTo[z]); + if (ds.bitstreamWrittenTo[z]) + { + bsIn.ReadCompressed(bitsUsed); + bsIn.AlignReadToByteBoundary(); + bsIn.Read(ds.serializationBitstream[z], bitsUsed); + } + } + replica->Deserialize(&ds); + } + return RR_CONTINUE_PROCESSING; +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +PluginReceiveResult ReplicaManager3::OnDownloadStarted(Packet *packet, unsigned char *packetData, int packetDataLength, RakNetGUID senderGuid, unsigned char packetDataOffset) +{ + Connection_RM3 *connection = GetConnectionByGUID(senderGuid); + if (connection==0) + return RR_CONTINUE_PROCESSING; + if (connection->QueryGroupDownloadMessages() && + // ID_DOWNLOAD_STARTED will be processed twice, being processed the second time once ID_DOWNLOAD_COMPLETE arrives. + // However, the second time groupConstructionAndSerialize will be set to true so it won't be processed a third time + connection->groupConstructionAndSerialize==false + ) + { + // These messages will be held by the plugin and returned when the download is complete + connection->groupConstructionAndSerialize=true; + RakAssert(connection->downloadGroup.Size()==0); + connection->downloadGroup.Push(packet, __FILE__, __LINE__); + return RR_STOP_PROCESSING; + } + + connection->groupConstructionAndSerialize=false; + RakNet::BitStream bsIn(packetData,packetDataLength,false); + bsIn.IgnoreBytes(packetDataOffset); + connection->DeserializeOnDownloadStarted(&bsIn); + return RR_CONTINUE_PROCESSING; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +PluginReceiveResult ReplicaManager3::OnDownloadComplete(Packet *packet, unsigned char *packetData, int packetDataLength, RakNetGUID senderGuid, unsigned char packetDataOffset) +{ + Connection_RM3 *connection = GetConnectionByGUID(senderGuid); + if (connection==0) + return RR_CONTINUE_PROCESSING; + + if (connection->groupConstructionAndSerialize==true && connection->downloadGroup.Size()>0) + { + // Push back buffered packets in front of this one + unsigned int i; + for (i=0; i < connection->downloadGroup.Size(); i++) + rakPeerInterface->PushBackPacket(connection->downloadGroup[i],false); + + // Push this one to be last too. It will be processed again, but the second time + // groupConstructionAndSerialize will be false and downloadGroup will be empty, so it will go past this block + connection->downloadGroup.Clear(__FILE__,__LINE__); + rakPeerInterface->PushBackPacket(packet,false); + + return RR_STOP_PROCESSING; + } + + RakNet::BitStream bsIn(packetData,packetDataLength,false); + bsIn.IgnoreBytes(packetDataOffset); + connection->DeserializeOnDownloadComplete(&bsIn); + return RR_CONTINUE_PROCESSING; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Replica3* ReplicaManager3::GetReplicaByNetworkID(NetworkID networkId) +{ + unsigned int i; + for (i=0; i < userReplicaList.Size(); i++) + { + if (userReplicaList[i]->GetNetworkID()==networkId) + return userReplicaList[i]; + } + return 0; +} + + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + + +void ReplicaManager3::BroadcastDestructionList(DataStructures::List &replicaListSource, const SystemAddress &exclusionAddress) +{ + RakNet::BitStream bsOut; + unsigned int i,j; + + DataStructures::List replicaList; + + for (i=0; i < replicaListSource.Size(); i++) + { + if (replicaListSource[i]==currentlyDeallocatingReplica) + continue; + replicaList.Push(replicaListSource[i], __FILE__, __LINE__); + } + + if (replicaList.Size()==0) + return; + + for (i=0; i < replicaList.Size(); i++) + { + if (replicaList[i]->deletingSystemGUID==UNASSIGNED_RAKNET_GUID) + replicaList[i]->deletingSystemGUID=GetRakPeerInterface()->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS); + } + + for (j=0; j < connectionList.Size(); j++) + { + if (connectionList[j]->GetSystemAddress()==exclusionAddress) + continue; + + bsOut.Reset(); + bsOut.Write((MessageID)ID_REPLICA_MANAGER_CONSTRUCTION); + bsOut.Write(worldId); + uint16_t cnt=0; + bsOut.Write(cnt); // No construction + cnt=(uint16_t) replicaList.Size(); + BitSize_t cntOffset=bsOut.GetWriteOffset();; + bsOut.Write(cnt); // Overwritten at send call + cnt=0; + + for (i=0; i < replicaList.Size(); i++) + { + if (connectionList[j]->HasReplicaConstructed(replicaList[i])==false) + continue; + cnt++; + + NetworkID networkId; + networkId=replicaList[i]->GetNetworkID(); + bsOut.Write(networkId); + BitSize_t offsetStart, offsetEnd; + offsetStart=bsOut.GetWriteOffset(); + bsOut.Write(offsetStart); + bsOut.Write(replicaList[i]->deletingSystemGUID); + replicaList[i]->SerializeDestruction(&bsOut, connectionList[j]); + bsOut.AlignWriteToByteBoundary(); + offsetEnd=bsOut.GetWriteOffset(); + bsOut.SetWriteOffset(offsetStart); + bsOut.Write(offsetEnd); + bsOut.SetWriteOffset(offsetEnd); + } + + if (cnt>0) + { + BitSize_t curOffset=bsOut.GetWriteOffset(); + bsOut.SetWriteOffset(cntOffset); + bsOut.Write(cnt); + bsOut.SetWriteOffset(curOffset); + rakPeerInterface->Send(&bsOut,defaultSendParameters.priority,defaultSendParameters.reliability,defaultSendParameters.orderingChannel,connectionList[j]->GetSystemAddress(),false, defaultSendParameters.sendReceipt); + } + } +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + + +void ReplicaManager3::BroadcastDestruction(Replica3 *replica, const SystemAddress &exclusionAddress) +{ + DataStructures::List replicaList; + replicaList.Push(replica, _FILE_AND_LINE_ ); + BroadcastDestructionList(replicaList,exclusionAddress); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Connection_RM3::Connection_RM3(const SystemAddress &_systemAddress, RakNetGUID _guid) +: systemAddress(_systemAddress), guid(_guid) +{ + isValidated=false; + isFirstConstruction=true; + groupConstructionAndSerialize=false; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Connection_RM3::~Connection_RM3() +{ + unsigned int i; + for (i=0; i < constructedReplicaList.Size(); i++) + RakNet::OP_DELETE(constructedReplicaList[i], _FILE_AND_LINE_); + for (i=0; i < queryToConstructReplicaList.Size(); i++) + RakNet::OP_DELETE(queryToConstructReplicaList[i], _FILE_AND_LINE_); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void Connection_RM3::GetConstructedReplicas(DataStructures::List &objectsTheyDoHave) +{ + objectsTheyDoHave.Clear(true,_FILE_AND_LINE_); + for (unsigned int idx=0; idx < constructedReplicaList.Size(); idx++) + { + objectsTheyDoHave.Push(constructedReplicaList[idx]->replica, _FILE_AND_LINE_ ); + } +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +bool Connection_RM3::HasReplicaConstructed(RakNet::Replica3 *replica) +{ + bool objectExists; + constructedReplicaList.GetIndexFromKey(replica, &objectExists); + return objectExists; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void Connection_RM3::SendSerializeHeader(RakNet::Replica3 *replica, RakNet::Time timestamp, RakNet::BitStream *bs, unsigned char worldId) +{ + bs->Reset(); + + if (timestamp!=0) + { + bs->Write((MessageID)ID_TIMESTAMP); + bs->Write(timestamp); + } + bs->Write((MessageID)ID_REPLICA_MANAGER_SERIALIZE); + bs->Write(worldId); + bs->Write(replica->GetNetworkID()); +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void Connection_RM3::ClearDownloadGroup(RakPeerInterface *rakPeerInterface) +{ + unsigned int i; + for (i=0; i < downloadGroup.Size(); i++) + rakPeerInterface->DeallocatePacket(downloadGroup[i]); + downloadGroup.Clear(__FILE__,__LINE__); +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +SendSerializeIfChangedResult Connection_RM3::SendSerialize(RakNet::Replica3 *replica, bool indicesToSend[RM3_NUM_OUTPUT_BITSTREAM_CHANNELS], RakNet::BitStream serializationData[RM3_NUM_OUTPUT_BITSTREAM_CHANNELS], RakNet::Time timestamp, PRO sendParameters[RM3_NUM_OUTPUT_BITSTREAM_CHANNELS], RakPeerInterface *rakPeer, unsigned char worldId) +{ + bool channelHasData; + BitSize_t sum=0; + for (int z=0; z < RM3_NUM_OUTPUT_BITSTREAM_CHANNELS; z++) + { + if (indicesToSend[z]) + sum+=serializationData[z].GetNumberOfBitsUsed(); + } + if (sum==0) + return SSICR_DID_NOT_SEND_DATA; + + RakAssert(replica->GetNetworkID()!=UNASSIGNED_NETWORK_ID); + + RakNet::BitStream out; + BitSize_t bitsUsed; + + int channelIndex; + PRO lastPro=sendParameters[0]; + + for (channelIndex=0; channelIndex < RM3_NUM_OUTPUT_BITSTREAM_CHANNELS; channelIndex++) + { + if (channelIndex==0) + { + SendSerializeHeader(replica, timestamp, &out, worldId); + } + else if (lastPro!=sendParameters[channelIndex]) + { + // Write out remainder + for (int channelIndex2=channelIndex; channelIndex2 < RM3_NUM_OUTPUT_BITSTREAM_CHANNELS; channelIndex2++) + out.Write(false); + + // Send remainder + replica->OnSerializeTransmission(&out, systemAddress); + rakPeer->Send(&out,lastPro.priority,lastPro.reliability,lastPro.orderingChannel,systemAddress,false,lastPro.sendReceipt); + + // If no data left to send, quit out + bool anyData=false; + for (int channelIndex2=channelIndex; channelIndex2 < RM3_NUM_OUTPUT_BITSTREAM_CHANNELS; channelIndex2++) + { + if (serializationData[channelIndex2].GetNumberOfBitsUsed()>0) + { + anyData=true; + break; + } + } + if (anyData==false) + return SSICR_SENT_DATA; + + // Restart stream + SendSerializeHeader(replica, timestamp, &out, worldId); + + for (int channelIndex2=0; channelIndex2 < channelIndex; channelIndex2++) + out.Write(false); + lastPro=sendParameters[channelIndex]; + } + + bitsUsed=serializationData[channelIndex].GetNumberOfBitsUsed(); + channelHasData = indicesToSend[channelIndex]==true && bitsUsed>0; + out.Write(channelHasData); + if (channelHasData) + { + out.WriteCompressed(bitsUsed); + out.AlignWriteToByteBoundary(); + out.Write(serializationData[channelIndex]); + // Crap, forgot this line, was a huge bug in that I'd only send to the first 3 systems + serializationData[channelIndex].ResetReadPointer(); + } + } + replica->OnSerializeTransmission(&out, systemAddress); + rakPeer->Send(&out,lastPro.priority,lastPro.reliability,lastPro.orderingChannel,systemAddress,false,lastPro.sendReceipt); + return SSICR_SENT_DATA; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +SendSerializeIfChangedResult Connection_RM3::SendSerializeIfChanged(unsigned int queryToSerializeIndex, SerializeParameters *sp, RakNet::RakPeerInterface *rakPeer, unsigned char worldId, ReplicaManager3 *replicaManager) +{ + RakNet::Replica3 *replica = queryToSerializeReplicaList[queryToSerializeIndex]->replica; + + if (replica->GetNetworkID()==UNASSIGNED_NETWORK_ID) + return SSICR_DID_NOT_SEND_DATA; + + RM3QuerySerializationResult rm3qsr = replica->QuerySerialization(this); + if (rm3qsr==RM3QSR_NEVER_CALL_SERIALIZE) + { + // Never again for this connection and replica pair + OnNeverSerialize(queryToSerializeIndex, replicaManager); + return SSICR_NEVER_SERIALIZE; + } + + if (rm3qsr==RM3QSR_DO_NOT_CALL_SERIALIZE) + return SSICR_DID_NOT_SEND_DATA; + + if (replica->forceSendUntilNextUpdate) + { + for (int z=0; z < RM3_NUM_OUTPUT_BITSTREAM_CHANNELS; z++) + { + if (replica->lastSentSerialization.indicesToSend[z]) + sp->bitsWrittenSoFar+=replica->lastSentSerialization.bitStream[z].GetNumberOfBitsUsed(); + } + return SendSerialize(replica, replica->lastSentSerialization.indicesToSend, replica->lastSentSerialization.bitStream, sp->messageTimestamp, sp->pro, rakPeer, worldId); + } + + for (int i=0; i < RM3_NUM_OUTPUT_BITSTREAM_CHANNELS; i++) + { + sp->outputBitstream[i].Reset(); + if (queryToSerializeReplicaList[queryToSerializeIndex]->lastSerializationResultBS) + sp->lastSentBitstream[i]=&queryToSerializeReplicaList[queryToSerializeIndex]->lastSerializationResultBS->bitStream[i]; + else + sp->lastSentBitstream[i]=&replica->lastSentSerialization.bitStream[i]; + } + + RM3SerializationResult serializationResult = replica->Serialize(sp); + + if (serializationResult==RM3SR_NEVER_SERIALIZE_FOR_THIS_CONNECTION) + { + // Never again for this connection and replica pair + OnNeverSerialize(queryToSerializeIndex, replicaManager); + return SSICR_NEVER_SERIALIZE; + } + + if (serializationResult==RM3SR_DO_NOT_SERIALIZE) + { + // Don't serialize this tick only + return SSICR_DID_NOT_SEND_DATA; + } + + // This is necessary in case the user in the Serialize() function for some reason read the bitstream they also wrote + // WIthout this code, the Write calls to another bitstream would not write the entire bitstream + BitSize_t sum=0; + for (int z=0; z < RM3_NUM_OUTPUT_BITSTREAM_CHANNELS; z++) + { + sp->outputBitstream[z].ResetReadPointer(); + sum+=sp->outputBitstream[z].GetNumberOfBitsUsed(); + } + + if (sum==0) + { + // Don't serialize this tick only + return SSICR_DID_NOT_SEND_DATA; + } + + if (serializationResult==RM3SR_SERIALIZED_ALWAYS) + { + bool allIndices[RM3_NUM_OUTPUT_BITSTREAM_CHANNELS]; + for (int z=0; z < RM3_NUM_OUTPUT_BITSTREAM_CHANNELS; z++) + { + sp->bitsWrittenSoFar+=sp->outputBitstream[z].GetNumberOfBitsUsed(); + allIndices[z]=true; + + queryToSerializeReplicaList[queryToSerializeIndex]->AllocBS(); + queryToSerializeReplicaList[queryToSerializeIndex]->lastSerializationResultBS->bitStream[z].Reset(); + queryToSerializeReplicaList[queryToSerializeIndex]->lastSerializationResultBS->bitStream[z].Write(&sp->outputBitstream[z]); + sp->outputBitstream[z].ResetReadPointer(); + } + return SendSerialize(replica, allIndices, sp->outputBitstream, sp->messageTimestamp, sp->pro, rakPeer, worldId); + } + + if (serializationResult==RM3SR_SERIALIZED_ALWAYS_IDENTICALLY) + { + for (int z=0; z < RM3_NUM_OUTPUT_BITSTREAM_CHANNELS; z++) + { + replica->lastSentSerialization.indicesToSend[z]=sp->outputBitstream[z].GetNumberOfBitsUsed()>0; + sp->bitsWrittenSoFar+=sp->outputBitstream[z].GetNumberOfBitsUsed(); + replica->lastSentSerialization.bitStream[z].Reset(); + replica->lastSentSerialization.bitStream[z].Write(&sp->outputBitstream[z]); + sp->outputBitstream[z].ResetReadPointer(); + replica->forceSendUntilNextUpdate=true; + } + return SendSerialize(replica, replica->lastSentSerialization.indicesToSend, sp->outputBitstream, sp->messageTimestamp, sp->pro, rakPeer, worldId); + } + + bool indicesToSend[RM3_NUM_OUTPUT_BITSTREAM_CHANNELS]; + if (serializationResult==RM3SR_BROADCAST_IDENTICALLY || serializationResult==RM3SR_BROADCAST_IDENTICALLY_FORCE_SERIALIZATION) + { + for (int z=0; z < RM3_NUM_OUTPUT_BITSTREAM_CHANNELS; z++) + { + if (sp->outputBitstream[z].GetNumberOfBitsUsed() > 0 && + (serializationResult==RM3SR_BROADCAST_IDENTICALLY_FORCE_SERIALIZATION || + ((sp->outputBitstream[z].GetNumberOfBitsUsed()!=replica->lastSentSerialization.bitStream[z].GetNumberOfBitsUsed() || + memcmp(sp->outputBitstream[z].GetData(), replica->lastSentSerialization.bitStream[z].GetData(), sp->outputBitstream[z].GetNumberOfBytesUsed())!=0)))) + { + indicesToSend[z]=true; + replica->lastSentSerialization.indicesToSend[z]=true; + sp->bitsWrittenSoFar+=sp->outputBitstream[z].GetNumberOfBitsUsed(); + replica->lastSentSerialization.bitStream[z].Reset(); + replica->lastSentSerialization.bitStream[z].Write(&sp->outputBitstream[z]); + sp->outputBitstream[z].ResetReadPointer(); + replica->forceSendUntilNextUpdate=true; + } + else + { + indicesToSend[z]=false; + replica->lastSentSerialization.indicesToSend[z]=false; + } + } + } + else + { + queryToSerializeReplicaList[queryToSerializeIndex]->AllocBS(); + + // RM3SR_SERIALIZED_UNIQUELY + for (int z=0; z < RM3_NUM_OUTPUT_BITSTREAM_CHANNELS; z++) + { + if (sp->outputBitstream[z].GetNumberOfBitsUsed() > 0 && + (sp->outputBitstream[z].GetNumberOfBitsUsed()!=queryToSerializeReplicaList[queryToSerializeIndex]->lastSerializationResultBS->bitStream[z].GetNumberOfBitsUsed() || + memcmp(sp->outputBitstream[z].GetData(), queryToSerializeReplicaList[queryToSerializeIndex]->lastSerializationResultBS->bitStream[z].GetData(), sp->outputBitstream[z].GetNumberOfBytesUsed())!=0) + ) + { + indicesToSend[z]=true; + sp->bitsWrittenSoFar+=sp->outputBitstream[z].GetNumberOfBitsUsed(); + queryToSerializeReplicaList[queryToSerializeIndex]->lastSerializationResultBS->bitStream[z].Reset(); + queryToSerializeReplicaList[queryToSerializeIndex]->lastSerializationResultBS->bitStream[z].Write(&sp->outputBitstream[z]); + sp->outputBitstream[z].ResetReadPointer(); + } + else + { + indicesToSend[z]=false; + } + } + } + + + if (serializationResult==RM3SR_BROADCAST_IDENTICALLY || serializationResult==RM3SR_BROADCAST_IDENTICALLY_FORCE_SERIALIZATION) + replica->forceSendUntilNextUpdate=true; + + // Send out the data + return SendSerialize(replica, indicesToSend, sp->outputBitstream, sp->messageTimestamp, sp->pro, rakPeer, worldId); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +void Connection_RM3::OnLocalReference(Replica3* replica3, ReplicaManager3 *replicaManager) +{ + ConstructionMode constructionMode = QueryConstructionMode(); + RakAssert(constructionMode==QUERY_REPLICA_FOR_CONSTRUCTION || constructionMode==QUERY_REPLICA_FOR_CONSTRUCTION_AND_DESTRUCTION); + (void) replicaManager; + (void) constructionMode; + + LastSerializationResult* lsr=RakNet::OP_NEW(_FILE_AND_LINE_); + lsr->replica=replica3; + queryToConstructReplicaList.Push(lsr,_FILE_AND_LINE_); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void Connection_RM3::OnDereference(Replica3* replica3, ReplicaManager3 *replicaManager) +{ + ValidateLists(replicaManager); + + LastSerializationResult* lsr=0; + unsigned int idx; + + bool objectExists; + idx=constructedReplicaList.GetIndexFromKey(replica3, &objectExists); + if (objectExists) + { + lsr=constructedReplicaList[idx]; + constructedReplicaList.RemoveAtIndex(idx); + } + + for (idx=0; idx < queryToConstructReplicaList.Size(); idx++) + { + if (queryToConstructReplicaList[idx]->replica==replica3) + { + lsr=queryToConstructReplicaList[idx]; + queryToConstructReplicaList.RemoveAtIndex(idx); + break; + } + } + + for (idx=0; idx < queryToSerializeReplicaList.Size(); idx++) + { + if (queryToSerializeReplicaList[idx]->replica==replica3) + { + lsr=queryToSerializeReplicaList[idx]; + queryToSerializeReplicaList.RemoveAtIndex(idx); + break; + } + } + + for (idx=0; idx < queryToDestructReplicaList.Size(); idx++) + { + if (queryToDestructReplicaList[idx]->replica==replica3) + { + lsr=queryToDestructReplicaList[idx]; + queryToDestructReplicaList.RemoveAtIndex(idx); + break; + } + } + + ValidateLists(replicaManager); + + if (lsr) + RakNet::OP_DELETE(lsr,_FILE_AND_LINE_); + + ValidateLists(replicaManager); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void Connection_RM3::OnDownloadFromThisSystem(Replica3* replica3, ReplicaManager3 *replicaManager) +{ + ValidateLists(replicaManager); + LastSerializationResult* lsr=RakNet::OP_NEW(_FILE_AND_LINE_); + lsr->replica=replica3; + + ConstructionMode constructionMode = QueryConstructionMode(); + if (constructionMode==QUERY_REPLICA_FOR_CONSTRUCTION || constructionMode==QUERY_REPLICA_FOR_CONSTRUCTION_AND_DESTRUCTION) + { + unsigned int j; + for (j=0; j < queryToConstructReplicaList.Size(); j++) + { + if (queryToConstructReplicaList[j]->replica->GetNetworkID()==replica3->GetNetworkID() ) + { + queryToConstructReplicaList.RemoveAtIndex(j); + break; + } + } + + queryToDestructReplicaList.Push(lsr,_FILE_AND_LINE_); + } + + constructedReplicaList.Insert(lsr->replica, lsr, true, _FILE_AND_LINE_); + //assert(queryToSerializeReplicaList.GetIndexOf(replica3)==(unsigned int)-1); + queryToSerializeReplicaList.Push(lsr,_FILE_AND_LINE_); + + ValidateLists(replicaManager); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void Connection_RM3::OnDownloadFromOtherSystem(Replica3* replica3, ReplicaManager3 *replicaManager) +{ + ConstructionMode constructionMode = QueryConstructionMode(); + if (constructionMode==QUERY_REPLICA_FOR_CONSTRUCTION || constructionMode==QUERY_REPLICA_FOR_CONSTRUCTION_AND_DESTRUCTION) + { + unsigned int j; + for (j=0; j < queryToConstructReplicaList.Size(); j++) + { + if (queryToConstructReplicaList[j]->replica->GetNetworkID()==replica3->GetNetworkID() ) + { + return; + } + } + + OnLocalReference(replica3, replicaManager); + } +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void Connection_RM3::OnNeverConstruct(unsigned int queryToConstructIdx, ReplicaManager3 *replicaManager) +{ + ConstructionMode constructionMode = QueryConstructionMode(); + RakAssert(constructionMode==QUERY_REPLICA_FOR_CONSTRUCTION || constructionMode==QUERY_REPLICA_FOR_CONSTRUCTION_AND_DESTRUCTION); + (void) constructionMode; + + ValidateLists(replicaManager); + LastSerializationResult* lsr = queryToConstructReplicaList[queryToConstructIdx]; + queryToConstructReplicaList.RemoveAtIndex(queryToConstructIdx); + RakNet::OP_DELETE(lsr,_FILE_AND_LINE_); + ValidateLists(replicaManager); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void Connection_RM3::OnConstructToThisConnection(unsigned int queryToConstructIdx, ReplicaManager3 *replicaManager) +{ + ConstructionMode constructionMode = QueryConstructionMode(); + RakAssert(constructionMode==QUERY_REPLICA_FOR_CONSTRUCTION || constructionMode==QUERY_REPLICA_FOR_CONSTRUCTION_AND_DESTRUCTION); + (void) constructionMode; + + ValidateLists(replicaManager); + LastSerializationResult* lsr = queryToConstructReplicaList[queryToConstructIdx]; + queryToConstructReplicaList.RemoveAtIndex(queryToConstructIdx); + //assert(constructedReplicaList.GetIndexOf(lsr->replica)==(unsigned int)-1); + constructedReplicaList.Insert(lsr->replica,lsr,true,_FILE_AND_LINE_); + //assert(queryToDestructReplicaList.GetIndexOf(lsr->replica)==(unsigned int)-1); + queryToDestructReplicaList.Push(lsr,_FILE_AND_LINE_); + //assert(queryToSerializeReplicaList.GetIndexOf(lsr->replica)==(unsigned int)-1); + queryToSerializeReplicaList.Push(lsr,_FILE_AND_LINE_); + ValidateLists(replicaManager); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void Connection_RM3::OnConstructToThisConnection(Replica3 *replica, ReplicaManager3 *replicaManager) +{ + RakAssert(QueryConstructionMode()==QUERY_CONNECTION_FOR_REPLICA_LIST); + (void) replicaManager; + + LastSerializationResult* lsr=RakNet::OP_NEW(_FILE_AND_LINE_); + lsr->replica=replica; + constructedReplicaList.Insert(replica,lsr,true,_FILE_AND_LINE_); + queryToSerializeReplicaList.Push(lsr,_FILE_AND_LINE_); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void Connection_RM3::OnNeverSerialize(unsigned int queryToSerializeIndex, ReplicaManager3 *replicaManager) +{ + ValidateLists(replicaManager); + queryToSerializeReplicaList.RemoveAtIndex(queryToSerializeIndex); + ValidateLists(replicaManager); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void Connection_RM3::OnReplicaAlreadyExists(unsigned int queryToConstructIdx, ReplicaManager3 *replicaManager) +{ + ConstructionMode constructionMode = QueryConstructionMode(); + RakAssert(constructionMode==QUERY_REPLICA_FOR_CONSTRUCTION || constructionMode==QUERY_REPLICA_FOR_CONSTRUCTION_AND_DESTRUCTION); + (void) constructionMode; + + ValidateLists(replicaManager); + LastSerializationResult* lsr = queryToConstructReplicaList[queryToConstructIdx]; + queryToConstructReplicaList.RemoveAtIndex(queryToConstructIdx); + //assert(constructedReplicaList.GetIndexOf(lsr->replica)==(unsigned int)-1); + constructedReplicaList.Insert(lsr->replica,lsr,true,_FILE_AND_LINE_); + //assert(queryToDestructReplicaList.GetIndexOf(lsr->replica)==(unsigned int)-1); + queryToDestructReplicaList.Push(lsr,_FILE_AND_LINE_); + //assert(queryToSerializeReplicaList.GetIndexOf(lsr->replica)==(unsigned int)-1); + queryToSerializeReplicaList.Push(lsr,_FILE_AND_LINE_); + ValidateLists(replicaManager); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void Connection_RM3::OnDownloadExisting(Replica3* replica3, ReplicaManager3 *replicaManager) +{ + ValidateLists(replicaManager); + + ConstructionMode constructionMode = QueryConstructionMode(); + if (constructionMode==QUERY_REPLICA_FOR_CONSTRUCTION || constructionMode==QUERY_REPLICA_FOR_CONSTRUCTION_AND_DESTRUCTION) + { + unsigned int idx; + for (idx=0; idx < queryToConstructReplicaList.Size(); idx++) + { + if (queryToConstructReplicaList[idx]->replica==replica3) + { + OnConstructToThisConnection(idx, replicaManager); + return; + } + } + } + else + { + OnConstructToThisConnection(replica3, replicaManager); + } +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void Connection_RM3::OnSendDestructionFromQuery(unsigned int queryToDestructIdx, ReplicaManager3 *replicaManager) +{ + ConstructionMode constructionMode = QueryConstructionMode(); + RakAssert(constructionMode==QUERY_REPLICA_FOR_CONSTRUCTION || constructionMode==QUERY_REPLICA_FOR_CONSTRUCTION_AND_DESTRUCTION); + (void) constructionMode; + + ValidateLists(replicaManager); + LastSerializationResult* lsr = queryToDestructReplicaList[queryToDestructIdx]; + queryToDestructReplicaList.RemoveAtIndex(queryToDestructIdx); + unsigned int j; + for (j=0; j < queryToSerializeReplicaList.Size(); j++) + { + if (queryToSerializeReplicaList[j]->replica->GetNetworkID()==lsr->replica->GetNetworkID() ) + { + queryToSerializeReplicaList.RemoveAtIndex(j); + break; + } + } + for (j=0; j < constructedReplicaList.Size(); j++) + { + if (constructedReplicaList[j]->replica->GetNetworkID()==lsr->replica->GetNetworkID() ) + { + constructedReplicaList.RemoveAtIndex(j); + break; + } + } + //assert(queryToConstructReplicaList.GetIndexOf(lsr->replica)==(unsigned int)-1); + queryToConstructReplicaList.Push(lsr,_FILE_AND_LINE_); + ValidateLists(replicaManager); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void Connection_RM3::OnDoNotQueryDestruction(unsigned int queryToDestructIdx, ReplicaManager3 *replicaManager) +{ + ValidateLists(replicaManager); + queryToDestructReplicaList.RemoveAtIndex(queryToDestructIdx); + ValidateLists(replicaManager); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void Connection_RM3::ValidateLists(ReplicaManager3 *replicaManager) const +{ + (void) replicaManager; + /* +#ifdef _DEBUG + // Each object should exist only once in either constructedReplicaList or queryToConstructReplicaList + // replicaPointer from LastSerializationResult should be same among all lists + unsigned int idx, idx2; + for (idx=0; idx < constructedReplicaList.Size(); idx++) + { + idx2=queryToConstructReplicaList.GetIndexOf(constructedReplicaList[idx]->replica); + if (idx2!=(unsigned int)-1) + { + int a=5; + assert(a==0); + int *b=0; + *b=5; + } + } + + for (idx=0; idx < queryToConstructReplicaList.Size(); idx++) + { + idx2=constructedReplicaList.GetIndexOf(queryToConstructReplicaList[idx]->replica); + if (idx2!=(unsigned int)-1) + { + int a=5; + assert(a==0); + int *b=0; + *b=5; + } + } + + LastSerializationResult *lsr, *lsr2; + for (idx=0; idx < constructedReplicaList.Size(); idx++) + { + lsr=constructedReplicaList[idx]; + + idx2=queryToSerializeReplicaList.GetIndexOf(lsr->replica); + if (idx2!=(unsigned int)-1) + { + lsr2=queryToSerializeReplicaList[idx2]; + if (lsr2!=lsr) + { + int a=5; + assert(a==0); + int *b=0; + *b=5; + } + } + + idx2=queryToDestructReplicaList.GetIndexOf(lsr->replica); + if (idx2!=(unsigned int)-1) + { + lsr2=queryToDestructReplicaList[idx2]; + if (lsr2!=lsr) + { + int a=5; + assert(a==0); + int *b=0; + *b=5; + } + } + } + for (idx=0; idx < queryToConstructReplicaList.Size(); idx++) + { + lsr=queryToConstructReplicaList[idx]; + + idx2=queryToSerializeReplicaList.GetIndexOf(lsr->replica); + if (idx2!=(unsigned int)-1) + { + lsr2=queryToSerializeReplicaList[idx2]; + if (lsr2!=lsr) + { + int a=5; + assert(a==0); + int *b=0; + *b=5; + } + } + + idx2=queryToDestructReplicaList.GetIndexOf(lsr->replica); + if (idx2!=(unsigned int)-1) + { + lsr2=queryToDestructReplicaList[idx2]; + if (lsr2!=lsr) + { + int a=5; + assert(a==0); + int *b=0; + *b=5; + } + } + } + + // Verify pointer integrity + for (idx=0; idx < constructedReplicaList.Size(); idx++) + { + if (constructedReplicaList[idx]->replica->replicaManager!=replicaManager) + { + int a=5; + assert(a==0); + int *b=0; + *b=5; + } + } + + // Verify pointer integrity + for (idx=0; idx < queryToConstructReplicaList.Size(); idx++) + { + if (queryToConstructReplicaList[idx]->replica->replicaManager!=replicaManager) + { + int a=5; + assert(a==0); + int *b=0; + *b=5; + } + } +#endif + */ +} +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void Connection_RM3::SendConstruction(DataStructures::List &newObjects, DataStructures::List &deletedObjects, PRO sendParameters, RakNet::RakPeerInterface *rakPeer, unsigned char worldId, ReplicaManager3 *replicaManager3) +{ + if (newObjects.Size()==0 && deletedObjects.Size()==0) + return; + + // All construction and destruction takes place in the same network message + // Otherwise, if objects rely on each other being created the same tick to be valid, this won't always be true + // DataStructures::List serializedObjects; + BitSize_t offsetStart, offsetStart2, offsetEnd; + unsigned int newListIndex, oldListIndex; + RakNet::BitStream bsOut; + NetworkID networkId; + if (isFirstConstruction) + { + bsOut.Write((MessageID)ID_REPLICA_MANAGER_DOWNLOAD_STARTED); + bsOut.Write(worldId); + SerializeOnDownloadStarted(&bsOut); + rakPeer->Send(&bsOut,sendParameters.priority,RELIABLE_ORDERED,sendParameters.orderingChannel,systemAddress,false,sendParameters.sendReceipt); + } + + // LastSerializationResult* lsr; + bsOut.Reset(); + bsOut.Write((MessageID)ID_REPLICA_MANAGER_CONSTRUCTION); + bsOut.Write(worldId); + uint16_t objectSize = (uint16_t) newObjects.Size(); + bsOut.Write(objectSize); + + // Construction + for (newListIndex=0; newListIndex < newObjects.Size(); newListIndex++) + { + offsetStart=bsOut.GetWriteOffset(); + bsOut.Write(offsetStart); // overwritten to point to the end of the stream + networkId=newObjects[newListIndex]->GetNetworkID(); + bsOut.Write(networkId); + + RM3ConstructionState cs = newObjects[newListIndex]->QueryConstruction(this, replicaManager3); + bool actuallyCreateObject = cs==RM3CS_SEND_CONSTRUCTION; + bsOut.Write(actuallyCreateObject); + bsOut.AlignWriteToByteBoundary(); + + if (actuallyCreateObject) + { + // Actually create the object + bsOut.Write(newObjects[newListIndex]->creatingSystemGUID); + offsetStart2=bsOut.GetWriteOffset(); + bsOut.Write(offsetStart2); // overwritten to point to after the call to WriteAllocationID + bsOut.AlignWriteToByteBoundary(); // Give the user an aligned bitStream in case they use memcpy + newObjects[newListIndex]->WriteAllocationID(this, &bsOut); + bsOut.AlignWriteToByteBoundary(); // Give the user an aligned bitStream in case they use memcpy + offsetEnd=bsOut.GetWriteOffset(); + bsOut.SetWriteOffset(offsetStart2); + bsOut.Write(offsetEnd); + bsOut.SetWriteOffset(offsetEnd); + newObjects[newListIndex]->SerializeConstruction(&bsOut, this); + } + else + { + newObjects[newListIndex]->SerializeConstructionExisting(&bsOut, this); + } + + bsOut.AlignWriteToByteBoundary(); + offsetEnd=bsOut.GetWriteOffset(); + bsOut.SetWriteOffset(offsetStart); + bsOut.Write(offsetEnd); + bsOut.SetWriteOffset(offsetEnd); + } + + RakNet::BitStream bsOut2; + for (newListIndex=0; newListIndex < newObjects.Size(); newListIndex++) + { + bsOut2.Reset(); + RM3ConstructionState cs = newObjects[newListIndex]->QueryConstruction(this, replicaManager3); + if (cs==RM3CS_SEND_CONSTRUCTION) + { + newObjects[newListIndex]->PostSerializeConstruction(&bsOut2, this); + } + else + { + RakAssert(cs==RM3CS_ALREADY_EXISTS_REMOTELY); + newObjects[newListIndex]->PostSerializeConstructionExisting(&bsOut2, this); + } + if (bsOut2.GetNumberOfBitsUsed()>0) + { + bsOut.Write(true); + bsOut.AlignWriteToByteBoundary(); + offsetStart=bsOut.GetWriteOffset(); + bsOut.Write(offsetStart); // overwritten to point to the end of the stream + networkId=newObjects[newListIndex]->GetNetworkID(); + bsOut.Write(networkId); + bsOut.AlignWriteToByteBoundary(); // Give the user an aligned bitStream in case they use memcpy + bsOut.Write(&bsOut2); + bsOut.AlignWriteToByteBoundary(); // Give the user an aligned bitStream in case they use memcpy + offsetEnd=bsOut.GetWriteOffset(); + bsOut.SetWriteOffset(offsetStart); + bsOut.Write(offsetEnd); + bsOut.SetWriteOffset(offsetEnd); + } + else + bsOut.Write(false); + } + bsOut.AlignWriteToByteBoundary(); + + // Destruction + objectSize = (uint16_t) deletedObjects.Size(); + bsOut.Write(objectSize); + for (oldListIndex=0; oldListIndex < deletedObjects.Size(); oldListIndex++) + { + networkId=deletedObjects[oldListIndex]->GetNetworkID(); + bsOut.Write(networkId); + offsetStart=bsOut.GetWriteOffset(); + bsOut.Write(offsetStart); + deletedObjects[oldListIndex]->deletingSystemGUID=rakPeer->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS); + bsOut.Write(deletedObjects[oldListIndex]->deletingSystemGUID); + deletedObjects[oldListIndex]->SerializeDestruction(&bsOut, this); + bsOut.AlignWriteToByteBoundary(); + offsetEnd=bsOut.GetWriteOffset(); + bsOut.SetWriteOffset(offsetStart); + bsOut.Write(offsetEnd); + bsOut.SetWriteOffset(offsetEnd); + } + rakPeer->Send(&bsOut,sendParameters.priority,RELIABLE_ORDERED,sendParameters.orderingChannel,systemAddress,false,sendParameters.sendReceipt); + + // TODO - shouldn't this be part of construction? + + // Initial Download serialize to a new system + // Immediately send serialize after construction if the replica object already has saved data + // If the object was serialized identically, and does not change later on, then the new connection never gets the data + SerializeParameters sp; + sp.whenLastSerialized=0; + RakNet::BitStream emptyBs; + for (int index=0; index < RM3_NUM_OUTPUT_BITSTREAM_CHANNELS; index++) + { + sp.lastSentBitstream[index]=&emptyBs; + sp.pro[index]=sendParameters; + sp.pro[index].reliability=RELIABLE_ORDERED; + } + + sp.bitsWrittenSoFar=0; + RakNet::Time t = RakNet::GetTimeMS(); + for (newListIndex=0; newListIndex < newObjects.Size(); newListIndex++) + { + sp.destinationConnection=this; + sp.messageTimestamp=0; + RakNet::Replica3 *replica = newObjects[newListIndex]; + // 8/22/09 Forgot ResetWritePointer + for (int z=0; z < RM3_NUM_OUTPUT_BITSTREAM_CHANNELS; z++) + { + sp.outputBitstream[z].ResetWritePointer(); + } + + RM3SerializationResult res = replica->Serialize(&sp); + if (res!=RM3SR_NEVER_SERIALIZE_FOR_THIS_CONNECTION && + res!=RM3SR_DO_NOT_SERIALIZE && + res!=RM3SR_SERIALIZED_UNIQUELY) + { + bool allIndices[RM3_NUM_OUTPUT_BITSTREAM_CHANNELS]; + for (int z=0; z < RM3_NUM_OUTPUT_BITSTREAM_CHANNELS; z++) + { + sp.bitsWrittenSoFar+=sp.outputBitstream[z].GetNumberOfBitsUsed(); + allIndices[z]=true; + } + SendSerialize(replica, allIndices, sp.outputBitstream, sp.messageTimestamp, sp.pro, rakPeer, worldId); + newObjects[newListIndex]->whenLastSerialized=t; + + } + // else wait for construction request accepted before serializing + } + + if (isFirstConstruction) + { + bsOut.Reset(); + bsOut.Write((MessageID)ID_REPLICA_MANAGER_DOWNLOAD_COMPLETE); + bsOut.Write(worldId); + SerializeOnDownloadComplete(&bsOut); + rakPeer->Send(&bsOut,sendParameters.priority,RELIABLE_ORDERED,sendParameters.orderingChannel,systemAddress,false,sendParameters.sendReceipt); + } + + isFirstConstruction=false; + +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void Connection_RM3::SendValidation(RakNet::RakPeerInterface *rakPeer, unsigned char worldId) +{ + // Hijack to mean sendValidation + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_REPLICA_MANAGER_SCOPE_CHANGE); + bsOut.Write(worldId); + rakPeer->Send(&bsOut,HIGH_PRIORITY,RELIABLE_ORDERED,0,systemAddress,false); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Replica3::Replica3() +{ + creatingSystemGUID=UNASSIGNED_RAKNET_GUID; + deletingSystemGUID=UNASSIGNED_RAKNET_GUID; + replicaManager=0; + forceSendUntilNextUpdate=false; + whenLastSerialized=0; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Replica3::~Replica3() +{ + if (replicaManager) + { + replicaManager->Dereference(this); + } +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +void Replica3::BroadcastDestruction(void) +{ + replicaManager->BroadcastDestruction(this,UNASSIGNED_SYSTEM_ADDRESS); +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +RakNetGUID Replica3::GetCreatingSystemGUID(void) const +{ + return creatingSystemGUID; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +RM3ConstructionState Replica3::QueryConstruction_ClientConstruction(RakNet::Connection_RM3 *destinationConnection, bool isThisTheServer) +{ + (void) destinationConnection; + if (creatingSystemGUID==replicaManager->GetRakPeerInterface()->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS)) + return RM3CS_SEND_CONSTRUCTION; + // Send back to the owner client too, because they couldn't assign the network ID + if (isThisTheServer) + return RM3CS_SEND_CONSTRUCTION; + return RM3CS_NEVER_CONSTRUCT; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +bool Replica3::QueryRemoteConstruction_ClientConstruction(RakNet::Connection_RM3 *sourceConnection, bool isThisTheServer) +{ + (void) sourceConnection; + (void) isThisTheServer; + + // OK to create + return true; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +RM3ConstructionState Replica3::QueryConstruction_ServerConstruction(RakNet::Connection_RM3 *destinationConnection, bool isThisTheServer) +{ + (void) destinationConnection; + + if (isThisTheServer) + return RM3CS_SEND_CONSTRUCTION; + return RM3CS_NEVER_CONSTRUCT; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +bool Replica3::QueryRemoteConstruction_ServerConstruction(RakNet::Connection_RM3 *sourceConnection, bool isThisTheServer) +{ + (void) sourceConnection; + if (isThisTheServer) + return false; + return true; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +RM3ConstructionState Replica3::QueryConstruction_PeerToPeer(RakNet::Connection_RM3 *destinationConnection, Replica3P2PMode p2pMode) +{ + (void) destinationConnection; + + if (p2pMode==R3P2PM_SINGLE_OWNER) + { + // We send to all, others do nothing + if (creatingSystemGUID==replicaManager->GetRakPeerInterface()->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS)) + return RM3CS_SEND_CONSTRUCTION; + + // RM3CS_NEVER_CONSTRUCT will not send the object, and will not Serialize() it + return RM3CS_NEVER_CONSTRUCT; + } + else if (p2pMode==R3P2PM_MULTI_OWNER_CURRENTLY_AUTHORITATIVE) + { + return RM3CS_SEND_CONSTRUCTION; + } + else + { + RakAssert(p2pMode==R3P2PM_MULTI_OWNER_NOT_CURRENTLY_AUTHORITATIVE); + + // RM3CS_ALREADY_EXISTS_REMOTELY will not send the object, but WILL call QuerySerialization() and Serialize() on it. + return RM3CS_ALREADY_EXISTS_REMOTELY; + } +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +bool Replica3::QueryRemoteConstruction_PeerToPeer(RakNet::Connection_RM3 *sourceConnection) +{ + (void) sourceConnection; + + return true; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +RM3QuerySerializationResult Replica3::QuerySerialization_ClientSerializable(RakNet::Connection_RM3 *destinationConnection, bool isThisTheServer) +{ + // Owner client sends to all + if (creatingSystemGUID==replicaManager->GetRakPeerInterface()->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS)) + return RM3QSR_CALL_SERIALIZE; + // Server sends to all but owner client + if (isThisTheServer && destinationConnection->GetRakNetGUID()!=creatingSystemGUID) + return RM3QSR_CALL_SERIALIZE; + // Remote clients do not send + return RM3QSR_NEVER_CALL_SERIALIZE; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +RM3QuerySerializationResult Replica3::QuerySerialization_ServerSerializable(RakNet::Connection_RM3 *destinationConnection, bool isThisTheServer) +{ + (void) destinationConnection; + // Server sends to all + if (isThisTheServer) + return RM3QSR_CALL_SERIALIZE; + + // Clients do not send + return RM3QSR_NEVER_CALL_SERIALIZE; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +RM3QuerySerializationResult Replica3::QuerySerialization_PeerToPeer(RakNet::Connection_RM3 *destinationConnection, Replica3P2PMode p2pMode) +{ + (void) destinationConnection; + + if (p2pMode==R3P2PM_SINGLE_OWNER) + { + // Owner peer sends to all + if (creatingSystemGUID==replicaManager->GetRakPeerInterface()->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS)) + return RM3QSR_CALL_SERIALIZE; + + // Remote peers do not send + return RM3QSR_NEVER_CALL_SERIALIZE; + } + else if (p2pMode==R3P2PM_MULTI_OWNER_CURRENTLY_AUTHORITATIVE) + { + return RM3QSR_CALL_SERIALIZE; + } + else + { + RakAssert(p2pMode==R3P2PM_MULTI_OWNER_NOT_CURRENTLY_AUTHORITATIVE); + return RM3QSR_DO_NOT_CALL_SERIALIZE; + } +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +RM3ActionOnPopConnection Replica3::QueryActionOnPopConnection_Client(RakNet::Connection_RM3 *droppedConnection) const +{ + (void) droppedConnection; + return RM3AOPC_DELETE_REPLICA; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +RM3ActionOnPopConnection Replica3::QueryActionOnPopConnection_Server(RakNet::Connection_RM3 *droppedConnection) const +{ + (void) droppedConnection; + return RM3AOPC_DELETE_REPLICA_AND_BROADCAST_DESTRUCTION; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +RM3ActionOnPopConnection Replica3::QueryActionOnPopConnection_PeerToPeer(RakNet::Connection_RM3 *droppedConnection) const +{ + (void) droppedConnection; + return RM3AOPC_DELETE_REPLICA; +} + +// -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ReplicaManager3.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ReplicaManager3.h new file mode 100644 index 0000000..527b8eb --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ReplicaManager3.h @@ -0,0 +1,1040 @@ +/// \file +/// \brief Contains the third iteration of the ReplicaManager class. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_ReplicaManager3==1 + +#ifndef __REPLICA_MANAGER_3 +#define __REPLICA_MANAGER_3 + +#include "RakNetTypes.h" +#include "RakNetTime.h" +#include "BitStream.h" +#include "PacketPriority.h" +#include "PluginInterface2.h" +#include "NetworkIDObject.h" +#include "DS_OrderedList.h" +#include "DS_Queue.h" + +/// \defgroup REPLICA_MANAGER_GROUP3 ReplicaManager3 +/// \brief Third implementation of object replication +/// \details +/// \ingroup REPLICA_MANAGER_GROUP + +namespace RakNet +{ +class Connection_RM3; +class Replica3; + + +/// \internal +/// \ingroup REPLICA_MANAGER_GROUP3 +struct PRO +{ + /// Passed to RakPeerInterface::Send(). Defaults to ReplicaManager3::SetDefaultPacketPriority(). + PacketPriority priority; + + /// Passed to RakPeerInterface::Send(). Defaults to ReplicaManager3::SetDefaultPacketReliability(). + PacketReliability reliability; + + /// Passed to RakPeerInterface::Send(). Defaults to ReplicaManager3::SetDefaultOrderingChannel(). + char orderingChannel; + + /// Passed to RakPeerInterface::Send(). Defaults to 0. + uint32_t sendReceipt; + + bool operator==( const PRO& right ) const; + bool operator!=( const PRO& right ) const; +}; + + +/// \brief System to help automate game object construction, destruction, and serialization +/// \details ReplicaManager3 tracks your game objects and automates the networking for replicating them across the network
+/// As objects are created, destroyed, or serialized differently, those changes are pushed out to other systems.
+/// To use:
+///
    +///
  1. Derive from Connection_RM3 and implement Connection_RM3::AllocReplica(). This is a factory function where given a user-supplied identifier for a class (such as name) return an instance of that class. Should be able to return any networked object in your game. +///
  2. Derive from ReplicaManager3 and implement AllocConnection() and DeallocConnection() to return the class you created in step 1. +///
  3. Derive your networked game objects from Replica3. All pure virtuals have to be implemented, however defaults are provided for Replica3::QueryConstruction(), Replica3::QueryRemoteConstruction(), and Replica3::QuerySerialization() depending on your network architecture. +///
  4. When a new game object is created on the local system, pass it to ReplicaManager3::Reference(). +///
  5. When a game object is destroyed on the local system, and you want other systems to know about it, call Replica3::BroadcastDestruction() +///
+///
+/// At this point, all new connections will automatically download, get construction messages, get destruction messages, and update serialization automatically. +/// \ingroup REPLICA_MANAGER_GROUP3 +class RAK_DLL_EXPORT ReplicaManager3 : public PluginInterface2 +{ +public: + ReplicaManager3(); + virtual ~ReplicaManager3(); + + /// \brief Implement to return a game specific derivation of Connection_RM3 + /// \details The connection object represents a remote system connected to you that is using the ReplicaManager3 system.
+ /// It has functions to perform operations per-connection.
+ /// AllocConnection() and DeallocConnection() are factory functions to create and destroy instances of the connection object.
+ /// It is used if autoCreate is true via SetAutoManageConnections() (true by default). Otherwise, the function is not called, and you will have to call PushConnection() manually
+ /// \note If you do not want a new network connection to immediately download game objects, SetAutoManageConnections() and PushConnection() are how you do this. + /// \sa SetAutoManageConnections() + /// \param[in] systemAddress Address of the system you are adding + /// \param[in] rakNetGUID GUID of the system you are adding. See Packet::rakNetGUID or RakPeerInterface::GetGUIDFromSystemAddress() + /// \return The new connection instance. + virtual Connection_RM3* AllocConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID) const=0; + + /// \brief Implement to destroy a class instanced returned by AllocConnection() + /// \details Most likely just implement as {delete connection;}
+ /// It is used if autoDestroy is true via SetAutoManageConnections() (true by default). Otherwise, the function is not called and you would then be responsible for deleting your own connection objects. + /// \param[in] connection The pointer instance to delete + virtual void DeallocConnection(Connection_RM3 *connection) const=0; + + /// \brief Enable or disable automatically assigning connections to new instances of Connection_RM3 + /// \details ReplicaManager3 can automatically create and/or destroy Connection_RM3 as systems connect or disconnect from RakPeerInterface.
+ /// By default this is on, to make the system easier to learn and setup.
+ /// If you don't want all connections to take part in the game, or you want to delay when a connection downloads the game, set \a autoCreate to false.
+ /// If you want to delay deleting a connection that has dropped, set \a autoDestroy to false. If you do this, then you must call PopConnection() to remove that connection from being internally tracked. You'll also have to delete the connection instance on your own.
+ /// \param[in] autoCreate Automatically call ReplicaManager3::AllocConnection() for each new connection. Defaults to true. + /// \param[in] autoDestroy Automatically call ReplicaManager3::DeallocConnection() for each dropped connection. Defaults to true. + void SetAutoManageConnections(bool autoCreate, bool autoDestroy); + + /// \brief Track a new Connection_RM3 instance + /// \details If \a autoCreate is false for SetAutoManageConnections(), then you need this function to add new instances of Connection_RM3 yourself.
+ /// You don't need to track this pointer yourself, you can get it with GetConnectionAtIndex(), GetConnectionByGUID(), or GetConnectionBySystemAddress().
+ /// \param[in] newConnection The new connection instance to track. + bool PushConnection(RakNet::Connection_RM3 *newConnection); + + /// \brief Stop tracking a connection + /// \details On call, for each replica returned by GetReplicasCreatedByGuid(), QueryActionOnPopConnection() will be called. Depending on the return value, this may delete the corresponding replica.
+ /// If autoDestroy is true in the call to SetAutoManageConnections() (true by default) then this is called automatically when the connection is lost. In that case, the returned connection instance is deleted.
+ /// \param[in] guid of the connection to get. Passed to ReplicaManager3::AllocConnection() originally. + RakNet::Connection_RM3 * PopConnection(RakNetGUID guid); + + /// \brief Adds a replicated object to the system. + /// \details Anytime you create a new object that derives from Replica3, and you want ReplicaManager3 to use it, pass it to Reference().
+ /// Remote systems already connected will potentially download this object the next time ReplicaManager3::Update() is called, which happens every time you call RakPeerInterface::Receive().
+ /// You can also call ReplicaManager3::Update() manually to send referenced objects right away + /// \param[in] replica3 The object to start tracking + void Reference(RakNet::Replica3 *replica3); + + /// \brief Removes a replicated object from the system. + /// \details The object is not deallocated, it is up to the caller to do so.
+ /// This is called automatically from the destructor of Replica3, so you don't need to call it manually unless you want to stop tracking an object before it is destroyed. + /// \param[in] replica3 The object to stop tracking + void Dereference(RakNet::Replica3 *replica3); + + /// \brief Removes multiple replicated objects from the system. + /// \details Same as Dereference(), but for a list of objects.
+ /// Useful with the lists returned by GetReplicasCreatedByGuid(), GetReplicasCreatedByMe(), or GetReferencedReplicaList().
+ /// \param[in] replicaListIn List of objects + void DereferenceList(DataStructures::List &replicaListIn); + + /// \brief Returns all objects originally created by a particular system + /// \details Originally created is defined as the value of Replica3::creatingSystemGUID, which is automatically assigned in ReplicaManager3::Reference().
+ /// You do not have to be directly connected to that system to get the objects originally created by that system.
+ /// \param[in] guid GUID of the system we are referring to. Originally passed as the \a guid parameter to ReplicaManager3::AllocConnection() + /// \param[out] List of Replica3 instances to be returned + void GetReplicasCreatedByGuid(RakNetGUID guid, DataStructures::List &replicaListOut); + + /// \brief Returns all objects originally created by your system + /// \details Calls GetReplicasCreatedByGuid() for your own system guid. + /// \param[out] List of Replica3 instances to be returned + void GetReplicasCreatedByMe(DataStructures::List &replicaListOut); + + /// \brief Returns the entire list of Replicas that we know about. + /// \details This is all Replica3 instances passed to Reference, as well as instances we downloaded and created via Connection_RM3::AllocReference() + /// \param[out] List of Replica3 instances to be returned + void GetReferencedReplicaList(DataStructures::List &replicaListOut); + + /// \brief Returns the number of replicas known about + /// \details Returns the size of the list that would be returned by GetReferencedReplicaList() + /// \return How many replica objects are in the list of replica objects + unsigned GetReplicaCount(void) const; + + /// \brief Returns a replica by index + /// \details Returns one of the items in the list that would be returned by GetReferencedReplicaList() + /// \param[in] index An index, from 0 to GetReplicaCount()-1. + /// \return A Replica3 instance + Replica3 *GetReplicaAtIndex(unsigned index); + + /// \brief Returns the number of connections + /// \details Returns the number of connections added with ReplicaManager3::PushConnection(), minus the number removed with ReplicaManager3::PopConnection() + /// \return The number of registered connections + unsigned int GetConnectionCount(void) const; + + /// \brief Returns a connection pointer previously added with PushConnection() + /// \param[in] index An index, from 0 to GetConnectionCount()-1. + /// \return A Connection_RM3 pointer + Connection_RM3* GetConnectionAtIndex(unsigned index) const; + + /// \brief Returns a connection pointer previously added with PushConnection() + /// \param[in] sa The system address of the connection to return + /// \return A Connection_RM3 pointer, or 0 if not found + Connection_RM3* GetConnectionBySystemAddress(const SystemAddress &sa) const; + + /// \brief Returns a connection pointer previously added with PushConnection.() + /// \param[in] guid The guid of the connection to return + /// \return A Connection_RM3 pointer, or 0 if not found + Connection_RM3* GetConnectionByGUID(RakNetGUID guid) const; + + /// \param[in] Default ordering channel to use for object creation, destruction, and serializations + void SetDefaultOrderingChannel(char def); + + /// \param[in] Default packet priority to use for object creation, destruction, and serializations + void SetDefaultPacketPriority(PacketPriority def); + + /// \param[in] Default packet reliability to use for object creation, destruction, and serializations + void SetDefaultPacketReliability(PacketReliability def); + + /// \details Every \a intervalMS milliseconds, Connection_RM3::OnAutoserializeInterval() will be called.
+ /// Defaults to 30.
+ /// Pass with <0 to disable. Pass 0 to Serialize() every time RakPeer::Recieve() is called
+ /// If you want to control the update interval with more granularity, use the return values from Replica3::Serialize().
+ /// \param[in] intervalMS How frequently to autoserialize all objects. This controls the maximum number of game object updates per second. + void SetAutoSerializeInterval(RakNet::Time intervalMS); + + /// \brief Return the connections that we think have an instance of the specified Replica3 instance + /// \details This can be wrong, for example if that system locally deleted the outside the scope of ReplicaManager3, if QueryRemoteConstruction() returned false, or if DeserializeConstruction() returned false. + /// \param[in] replica The replica to check against. + /// \param[out] connectionsThatHaveConstructedThisReplica Populated with connection instances that we believe have \a replica allocated + void GetConnectionsThatHaveReplicaConstructed(Replica3 *replica, DataStructures::List &connectionsThatHaveConstructedThisReplica); + + /// \brief Defines the unique instance of ReplicaManager3 if multiple instances are on the same instance of RakPeerInterface + /// \details ReplicaManager3 supports multiple instances of itself attached to the same instance of rakPeer, in case your game has multiple worlds.
+ /// Call SetWorldID with a different number for each instance.
+ /// The default worldID is 0.
+ /// To use multiple worlds, you will also need to call ReplicaManager3::SetNetworkIDManager() to have a different NetworkIDManager instance per world + void SetWorldID(unsigned char id); + + /// \return Whatever was passed to SetWorldID(), or 0 if it was never called. + unsigned char GetWorldID(void) const; + + /// \details Sets the networkIDManager instance that this plugin relys upon.
+ /// Uses whatever instance is attached to RakPeerInterface if unset.
+ /// To support multiple worlds, you should set it to a different manager for each instance of the plugin + /// \param[in] _networkIDManager The externally allocated NetworkIDManager instance for this plugin to use. + void SetNetworkIDManager(NetworkIDManager *_networkIDManager); + + /// Returns what was passed to SetNetworkIDManager(), or the instance on RakPeerInterface if unset. + NetworkIDManager *GetNetworkIDManager(void) const; + + /// \details Send a network command to destroy one or more Replica3 instances + /// Usually you won't need this, but use Replica3::BroadcastDestruction() instead. + /// The objects are unaffected locally + /// \param[in] replicaList List of Replica3 objects to tell other systems to destroy. + /// \param[in] exclusionAddress Which system to not send to. UNASSIGNED_SYSTEM_ADDRESS to send to all. + void BroadcastDestructionList(DataStructures::List &replicaListSource, const SystemAddress &exclusionAddress); + + /// \internal + /// \details Tell other systems that have this replica to destroy this replica.
+ /// You shouldn't need to call this, as it happens in the Replica3 destructor + void BroadcastDestruction(Replica3 *replica, const SystemAddress &exclusionAddress); + + /// \internal + /// \details Frees internal lists.
+ /// Externally allocated pointers are not deallocated + void Clear(void); + + /// \internal + PRO GetDefaultSendParameters(void) const; + + /// Call interfaces, send data + virtual void Update(void); +protected: + virtual PluginReceiveResult OnReceive(Packet *packet); + virtual void OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ); + virtual void OnNewConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, bool isIncoming); + virtual void OnRakPeerShutdown(void); + virtual void OnDetach(void); + + PluginReceiveResult OnConstruction(Packet *packet, unsigned char *packetData, int packetDataLength, RakNetGUID senderGuid, unsigned char packetDataOffset); + PluginReceiveResult OnSerialize(Packet *packet, unsigned char *packetData, int packetDataLength, RakNetGUID senderGuid, RakNet::Time timestamp, unsigned char packetDataOffset); + PluginReceiveResult OnDownloadStarted(Packet *packet, unsigned char *packetData, int packetDataLength, RakNetGUID senderGuid, unsigned char packetDataOffset); + PluginReceiveResult OnDownloadComplete(Packet *packet, unsigned char *packetData, int packetDataLength, RakNetGUID senderGuid, unsigned char packetDataOffset); + + void DeallocReplicaNoBroadcastDestruction(RakNet::Connection_RM3 *connection, RakNet::Replica3 *replica3); + RakNet::Connection_RM3 * PopConnection(unsigned int index); + Replica3* GetReplicaByNetworkID(NetworkID networkId); + unsigned int ReferenceInternal(RakNet::Replica3 *replica3); + + DataStructures::List connectionList; + DataStructures::List userReplicaList; + + PRO defaultSendParameters; + RakNet::Time autoSerializeInterval; + RakNet::Time lastAutoSerializeOccurance; + unsigned char worldId; + NetworkIDManager *networkIDManager; + bool autoCreateConnections, autoDestroyConnections; + Replica3 *currentlyDeallocatingReplica; + + friend class Connection_RM3; +}; + +static const int RM3_NUM_OUTPUT_BITSTREAM_CHANNELS=16; + +/// \ingroup REPLICA_MANAGER_GROUP3 +struct LastSerializationResultBS +{ + RakNet::BitStream bitStream[RM3_NUM_OUTPUT_BITSTREAM_CHANNELS]; + bool indicesToSend[RM3_NUM_OUTPUT_BITSTREAM_CHANNELS]; +}; + +/// Represents the serialized data for an object the last time it was sent. Used by Connection_RM3::OnAutoserializeInterval() and Connection_RM3::SendSerializeIfChanged() +/// \ingroup REPLICA_MANAGER_GROUP3 +struct LastSerializationResult +{ + LastSerializationResult(); + ~LastSerializationResult(); + + /// The replica instance we serialized + RakNet::Replica3 *replica; + //bool neverSerialize; +// bool isConstructed; + + void AllocBS(void); + LastSerializationResultBS* lastSerializationResultBS; +}; + +/// Parameters passed to Replica3::Serialize() +/// \ingroup REPLICA_MANAGER_GROUP3 +struct SerializeParameters +{ + /// Write your output for serialization here + /// If nothing is written, the serialization will not occur + /// Write to any or all of the NUM_OUTPUT_BITSTREAM_CHANNELS channels available. Channels can hold independent data + RakNet::BitStream outputBitstream[RM3_NUM_OUTPUT_BITSTREAM_CHANNELS]; + + /// Last bitstream we sent for this replica to this system. + /// Read, but DO NOT MODIFY + RakNet::BitStream* lastSentBitstream[RM3_NUM_OUTPUT_BITSTREAM_CHANNELS]; + + /// Set to non-zero to transmit a timestamp with this message. + /// Defaults to 0 + /// Use RakNet::GetTime() for this + RakNet::Time messageTimestamp; + + /// Passed to RakPeerInterface::Send(). Defaults to ReplicaManager3::SetDefaultPacketPriority(). + /// Passed to RakPeerInterface::Send(). Defaults to ReplicaManager3::SetDefaultPacketReliability(). + /// Passed to RakPeerInterface::Send(). Defaults to ReplicaManager3::SetDefaultOrderingChannel(). + PRO pro[RM3_NUM_OUTPUT_BITSTREAM_CHANNELS]; + + /// Passed to RakPeerInterface::Send(). + RakNet::Connection_RM3 *destinationConnection; + + /// For prior serializations this tick, for the same connection, how many bits have we written so far? + /// Use this to limit how many objects you send to update per-tick if desired + BitSize_t bitsWrittenSoFar; + + /// When this object was last serialized to the connection + /// 0 means never + RakNet::Time whenLastSerialized; + + /// Current time, in milliseconds. + /// curTime - whenLastSerialized is how long it has been since this object was last sent + RakNet::Time curTime; +}; + +/// \ingroup REPLICA_MANAGER_GROUP3 +struct DeserializeParameters +{ + RakNet::BitStream serializationBitstream[RM3_NUM_OUTPUT_BITSTREAM_CHANNELS]; + bool bitstreamWrittenTo[RM3_NUM_OUTPUT_BITSTREAM_CHANNELS]; + RakNet::Time timeStamp; + RakNet::Connection_RM3 *sourceConnection; +}; + +/// \ingroup REPLICA_MANAGER_GROUP3 +enum SendSerializeIfChangedResult +{ + SSICR_SENT_DATA, + SSICR_DID_NOT_SEND_DATA, + SSICR_NEVER_SERIALIZE, +}; + +/// \brief Each remote system is represented by Connection_RM3. Used to allocate Replica3 and track which instances have been allocated +/// \details Important function: AllocReplica() - must be overridden to create an object given an identifier for that object, which you define for all objects in your game +/// \ingroup REPLICA_MANAGER_GROUP3 +class RAK_DLL_EXPORT Connection_RM3 +{ +public: + + Connection_RM3(const SystemAddress &_systemAddress, RakNetGUID _guid); + virtual ~Connection_RM3(); + + /// \brief Class factory to create a Replica3 instance, given a user-defined identifier + /// \details Identifier is returned by Replica3::WriteAllocationID() for what type of class to create.
+ /// This is called when you download a replica from another system.
+ /// See Replica3::Dealloc for the corresponding destruction message.
+ /// Return 0 if unable to create the intended object. Note, in that case the other system will still think we have the object and will try to serialize object updates to us. Generally, you should not send objects the other system cannot create.
+ /// \sa Replica3::WriteAllocationID(). + /// Sample implementation:
+ /// {RakNet::RakString typeName; allocationIdBitstream->Read(typeName); if (typeName=="Soldier") return new Soldier; return 0;}
+ /// \param[in] allocationIdBitstream user-defined bitstream uniquely identifying a game object type + /// \param[in] replicaManager3 Instance of ReplicaManager3 that controls this connection + /// \return The new replica instance + virtual Replica3 *AllocReplica(RakNet::BitStream *allocationIdBitstream, ReplicaManager3 *replicaManager3)=0; + + /// \brief Get list of all replicas that are constructed for this connection + /// \param[out] objectsTheyDoHave Destination list. Returned in sorted ascending order, sorted on the value of the Replica3 pointer. + virtual void GetConstructedReplicas(DataStructures::List &objectsTheyDoHave); + + /// Returns true if we think this remote connection has this replica constructed + /// \param[in] replica3 Which replica we are querying + /// \return True if constructed, false othewise + bool HasReplicaConstructed(RakNet::Replica3 *replica); + + /// When a new connection connects, before sending any objects, SerializeOnDownloadStarted() is called + /// \param[out] bitStream Passed to DeserializeOnDownloadStarted() + virtual void SerializeOnDownloadStarted(RakNet::BitStream *bitStream) {(void) bitStream;} + + /// Receives whatever was written in SerializeOnDownloadStarted() + /// \param[in] bitStream Written in SerializeOnDownloadStarted() + virtual void DeserializeOnDownloadStarted(RakNet::BitStream *bitStream) {(void) bitStream;} + + /// When a new connection connects, after constructing and serialization all objects, SerializeOnDownloadComplete() is called + /// \param[out] bitStream Passed to DeserializeOnDownloadComplete() + virtual void SerializeOnDownloadComplete(RakNet::BitStream *bitStream) {(void) bitStream;} + + /// Receives whatever was written in DeserializeOnDownloadComplete() + /// \param[in] bitStream Written in SerializeOnDownloadComplete() + virtual void DeserializeOnDownloadComplete(RakNet::BitStream *bitStream) {(void) bitStream;} + + /// \return The system address passed to the constructor of this object + SystemAddress GetSystemAddress(void) const {return systemAddress;} + + /// \return Returns the RakNetGUID passed to the constructor of this object + RakNetGUID GetRakNetGUID(void) const {return guid;} + + /// List of enumerations for how to get the list of valid objects for other systems + enum ConstructionMode + { + /// For every object that does not exist on the remote system, call Replica3::QueryConstruction() every tick. + /// Do not call Replica3::QueryDestruction() + /// Do not call Connection_RM3::QueryReplicaList() + QUERY_REPLICA_FOR_CONSTRUCTION, + + /// For every object that does not exist on the remote system, call Replica3::QueryConstruction() every tick. Based on the call, the object may be sent to the other system. + /// For every object that does exist on the remote system, call Replica3::QueryDestruction() every tick. Based on the call, the object may be deleted on the other system. + /// Do not call Connection_RM3::QueryReplicaList() + QUERY_REPLICA_FOR_CONSTRUCTION_AND_DESTRUCTION, + + /// Do not call Replica3::QueryConstruction() or Replica3::QueryDestruction() + /// Call Connection_RM3::QueryReplicaList() to determine which objects exist on remote systems + /// This can be faster than QUERY_REPLICA_FOR_CONSTRUCTION and QUERY_REPLICA_FOR_CONSTRUCTION_AND_DESTRUCTION for large worlds + /// See GridSectorizer.h under /Source for code that can help with this + QUERY_CONNECTION_FOR_REPLICA_LIST + }; + + /// \brief Return whether or not downloads to our system should all be processed the same tick (call to RakPeer::Receive() ) + /// \details Normally the system will send ID_REPLICA_MANAGER_DOWNLOAD_STARTED, ID_REPLICA_MANAGER_CONSTRUCTION for all downloaded objects, + /// ID_REPLICA_MANAGER_SERIALIZE for each downloaded object, and lastly ID_REPLICA_MANAGER_DOWNLOAD_COMPLETE. + /// This enables the application to show a downloading splash screen on ID_REPLICA_MANAGER_DOWNLOAD_STARTED, a progress bar, and to close the splash screen and activate all objects on ID_REPLICA_MANAGER_DOWNLOAD_COMPLETE + /// However, if the application was not set up for this then it would result in incomplete objects spread out over time, and cause problems + /// If you return true from QueryGroupDownloadMessages(), then these messages will be returned all in one tick, returned only when the download is complete + /// \note ID_REPLICA_MANAGER_DOWNLOAD_STARTED calls the callback DeserializeOnDownloadStarted() + /// \note ID_REPLICA_MANAGER_DOWNLOAD_COMPLETE calls the callback DeserializeOnDownloadComplete() + virtual bool QueryGroupDownloadMessages(void) const {return false;} + + /// \brief Queries how to get the list of objects that exist on remote systems + /// \details The default of calling QueryConstruction for every known object is easy to use, but not efficient, especially for large worlds where many objects are outside of the player's circle of influence.
+ /// QueryDestruction is also not necessarily useful or efficient, as object destruction tends to happen in known cases, and can be accomplished by calling Replica3::BroadcastDestruction() + /// QueryConstructionMode() allows you to specify more efficient algorithms than the default when overriden. + /// \return How to get the list of objects that exist on the remote system. You should always return the same value for a given connection + virtual ConstructionMode QueryConstructionMode(void) const {return QUERY_REPLICA_FOR_CONSTRUCTION_AND_DESTRUCTION;} + + /// \brief Callback used when QueryConstructionMode() returns QUERY_CONNECTION_FOR_REPLICA_LIST + /// \details This advantage of this callback is if that there are many objects that a particular connection does not have, then we do not have to iterate through those + /// objects calling QueryConstruction() for each of them.
+ ///
+ /// The following code uses a sorted merge sort to quickly find new and deleted objects, given a list of objects we know should exist.
+ ///
+ /// DataStructures::List objectsTheyShouldHave; // You have to fill in this list
+ /// DataStructures::List objectsTheyCurrentlyHave,objectsTheyStillHave,existingReplicasToDestro,newReplicasToCreatey;
+ /// GetConstructedReplicas(objectsTheyCurrentlyHave);
+ /// DataStructures::Multilist::FindIntersection(objectsTheyCurrentlyHave, objectsTheyShouldHave, objectsTheyStillHave, existingReplicasToDestroy, newReplicasToCreate);
+ ///
+ /// See GridSectorizer in the Source directory as a method to find all objects within a certain radius in a fast way.
+ ///
+ /// \param[out] newReplicasToCreate Anything in this list will be created on the remote system + /// \param[out] existingReplicasToDestroy Anything in this list will be destroyed on the remote system + virtual void QueryReplicaList( + DataStructures::List newReplicasToCreate, + DataStructures::List existingReplicasToDestroy) {} + + /// \internal This is used internally - however, you can also call it manually to send a data update for a remote replica.
+ /// \brief Sends over a serialization update for \a replica.
+ /// NetworkID::GetNetworkID() is written automatically, serializationData is the object data.
+ /// \param[in] replica Which replica to serialize + /// \param[in] serializationData Serialized object data + /// \param[in] timestamp 0 means no timestamp. Otherwise message is prepended with ID_TIMESTAMP + /// \param[in] sendParameters Parameters on how to send + /// \param[in] rakPeer Instance of RakPeerInterface to send on + /// \param[in] worldId Which world, see ReplicaManager3::SetWorldID() + virtual SendSerializeIfChangedResult SendSerialize(RakNet::Replica3 *replica, bool indicesToSend[RM3_NUM_OUTPUT_BITSTREAM_CHANNELS], RakNet::BitStream serializationData[RM3_NUM_OUTPUT_BITSTREAM_CHANNELS], RakNet::Time timestamp, PRO sendParameters[RM3_NUM_OUTPUT_BITSTREAM_CHANNELS], RakNet::RakPeerInterface *rakPeer, unsigned char worldId); + + /// \internal + /// \details Calls Connection_RM3::SendSerialize() if Replica3::Serialize() returns a different result than what is contained in \a lastSerializationResult.
+ /// Used by autoserialization in Connection_RM3::OnAutoserializeInterval() + /// \param[in] queryToSerializeIndex Index into queryToSerializeReplicaList for whichever replica this is + /// \param[in] sp Controlling parameters over the serialization + /// \param[in] rakPeer Instance of RakPeerInterface to send on + /// \param[in] worldId Which world, see ReplicaManager3::SetWorldID() + virtual SendSerializeIfChangedResult SendSerializeIfChanged(unsigned int queryToSerializeIndex, SerializeParameters *sp, RakNet::RakPeerInterface *rakPeer, unsigned char worldId, ReplicaManager3 *replicaManager); + + /// \internal + /// \brief Given a list of objects that were created and destroyed, serialize and send them to another system. + /// \param[in] newObjects Objects to serialize construction + /// \param[in] deletedObjects Objects to serialize destruction + /// \param[in] sendParameters Controlling parameters over the serialization + /// \param[in] rakPeer Instance of RakPeerInterface to send on + /// \param[in] worldId Which world, see ReplicaManager3::SetWorldID() + /// \param[in] replicaManager3 ReplicaManager3 instance + virtual void SendConstruction(DataStructures::List &newObjects, DataStructures::List &deletedObjects, PRO sendParameters, RakNet::RakPeerInterface *rakPeer, unsigned char worldId, ReplicaManager3 *replicaManager3); + + /// \internal + /// Remove from \a newObjectsIn objects that already exist and save to \a newObjectsOut + /// Remove from \a deletedObjectsIn objects that do not exist, and save to \a deletedObjectsOut + void CullUniqueNewAndDeletedObjects(DataStructures::List &newObjectsIn, + DataStructures::List &deletedObjectsIn, + DataStructures::List &newObjectsOut, + DataStructures::List &deletedObjectsOut); + + /// \internal + void SendValidation(RakNet::RakPeerInterface *rakPeer, unsigned char worldId); + + /// \internal + void AutoConstructByQuery(ReplicaManager3 *replicaManager3); + + + // Internal - does the other system have this connection too? Validated means we can now use it + bool isValidated; + // Internal - Used to see if we should send download started + bool isFirstConstruction; + + static int Replica3LSRComp( Replica3 * const &replica3, LastSerializationResult * const &data ); + +protected: + + SystemAddress systemAddress; + RakNetGUID guid; + + /* + Operations: + + Locally reference a new replica: + Add to queryToConstructReplicaList for all objects + + Add all objects to queryToConstructReplicaList + + Download: + Add to constructedReplicaList for connection that send the object to us + Add to queryToSerializeReplicaList for connection that send the object to us + Add to queryToConstructReplicaList for all other connections + + Never construct for this connection: + Remove from queryToConstructReplicaList + + Construct to this connection + Remove from queryToConstructReplicaList + Add to constructedReplicaList for this connection + Add to queryToSerializeReplicaList for this connection + + Serialize: + Iterate through queryToSerializeReplicaList + + Never serialize for this connection + Remove from queryToSerializeReplicaList + + Reference (this system has this object already) + Remove from queryToConstructReplicaList + Add to constructedReplicaList for this connection + Add to queryToSerializeReplicaList for this connection + + Downloaded an existing object + if replica is in queryToConstructReplicaList, OnConstructToThisConnection() + else ignore + + Send destruction from query + Remove from queryToDestructReplicaList + Remove from queryToSerializeReplicaList + Remove from constructedReplicaList + Add to queryToConstructReplicaList + + Do not query destruction again + Remove from queryToDestructReplicaList + */ + void OnLocalReference(Replica3* replica3, ReplicaManager3 *replicaManager); + void OnDereference(Replica3* replica3, ReplicaManager3 *replicaManager); + void OnDownloadFromThisSystem(Replica3* replica3, ReplicaManager3 *replicaManager); + void OnDownloadFromOtherSystem(Replica3* replica3, ReplicaManager3 *replicaManager); + void OnNeverConstruct(unsigned int queryToConstructIdx, ReplicaManager3 *replicaManager); + void OnConstructToThisConnection(unsigned int queryToConstructIdx, ReplicaManager3 *replicaManager); + void OnConstructToThisConnection(Replica3 *replica, ReplicaManager3 *replicaManager); + void OnNeverSerialize(unsigned int queryToSerializeIndex, ReplicaManager3 *replicaManager); + void OnReplicaAlreadyExists(unsigned int queryToConstructIdx, ReplicaManager3 *replicaManager); + void OnDownloadExisting(Replica3* replica3, ReplicaManager3 *replicaManager); + void OnSendDestructionFromQuery(unsigned int queryToDestructIdx, ReplicaManager3 *replicaManager); + void OnDoNotQueryDestruction(unsigned int queryToDestructIdx, ReplicaManager3 *replicaManager); + void ValidateLists(ReplicaManager3 *replicaManager) const; + void SendSerializeHeader(RakNet::Replica3 *replica, RakNet::Time timestamp, RakNet::BitStream *bs, unsigned char worldId); + + // The list of objects that our local system and this remote system both have + // Either we sent this object to them, or they sent this object to us + // A given Replica can be either in queryToConstructReplicaList or constructedReplicaList but not both at the same time + DataStructures::OrderedList constructedReplicaList; + + // Objects that we have, but this system does not, and we will query each tick to see if it should be sent to them + // If we do send it to them, the replica is moved to constructedReplicaList + // A given Replica can be either in queryToConstructReplicaList or constructedReplicaList but not both at the same time + DataStructures::List queryToConstructReplicaList; + + // Objects that this system has constructed are added at the same time to queryToSerializeReplicaList + // This list is used to serialize all objects that this system has to this connection + DataStructures::List queryToSerializeReplicaList; + + // Objects that are constructed on this system are also queried if they should be destroyed to this system + DataStructures::List queryToDestructReplicaList; + + // Working lists + DataStructures::List constructedReplicasCulled, destroyedReplicasCulled; + + // This is used if QueryGroupDownloadMessages() returns true when ID_REPLICA_MANAGER_DOWNLOAD_STARTED arrives + // Packets will be gathered and not returned until ID_REPLICA_MANAGER_DOWNLOAD_COMPLETE arrives + bool groupConstructionAndSerialize; + DataStructures::Queue downloadGroup; + void ClearDownloadGroup(RakPeerInterface *rakPeerInterface); + + friend class ReplicaManager3; +private: + Connection_RM3() {}; + + ConstructionMode constructionMode; +}; + +/// \brief Return codes for Connection_RM3::GetConstructionState() and Replica3::QueryConstruction() +/// \details Indicates what state the object should be in for the remote system +/// \ingroup REPLICA_MANAGER_GROUP3 +enum RM3ConstructionState +{ + /// This object should exist on the remote system. Send a construction message if necessary + /// If the NetworkID is already in use, it will not do anything + /// If it is not in use, it will create the object, and then call DeserializeConstruction + RM3CS_SEND_CONSTRUCTION, + + /// This object should exist on the remote system. + /// The other system already has the object, and the object will never be deleted. + /// This is true of objects that are loaded with the level, for example. + /// Treat it as if it existed, without sending a construction message. + /// Will call Serialize() and SerializeConstructionExisting() to the object on the remote system + RM3CS_ALREADY_EXISTS_REMOTELY, + + /// Same as RM3CS_ALREADY_EXISTS_REMOTELY but does not call SerializeConstructionExisting() + RM3CS_ALREADY_EXISTS_REMOTELY_DO_NOT_CONSTRUCT, + + /// This object will never be sent to the target system + /// This object will never be serialized from this system to the target system + RM3CS_NEVER_CONSTRUCT, + + /// Don't do anything this tick. Will query again next tick + RM3CS_NO_ACTION, + + /// Max enum + RM3CS_MAX, +}; + +/// If this object already exists for this system, should it be removed? +/// \ingroup REPLICA_MANAGER_GROUP3 +enum RM3DestructionState +{ + /// This object should not exist on the remote system. Send a destruction message if necessary. + RM3DS_SEND_DESTRUCTION, + + /// This object will never be destroyed by a per-tick query. Don't call again + RM3DS_DO_NOT_QUERY_DESTRUCTION, + + /// Don't do anything this tick. Will query again next tick + RM3DS_NO_ACTION, + + /// Max enum + RM3DS_MAX, +}; + +/// Return codes when constructing an object +/// \ingroup REPLICA_MANAGER_GROUP3 +enum RM3SerializationResult +{ + /// This object serializes identically no matter who we send to + /// We also send it to every connection (broadcast). + /// Efficient for memory, speed, and bandwidth but only if the object is always broadcast identically. + RM3SR_BROADCAST_IDENTICALLY, + + /// Same as RM3SR_BROADCAST_IDENTICALLY, but assume the object needs to be serialized, do not check with a memcmp + /// Assume the object changed, and serialize it + /// Use this if you know exactly when your object needs to change. Can be faster than RM3SR_BROADCAST_IDENTICALLY. + /// An example of this is if every member variable has an accessor, changing a member sets a flag, and you check that flag in Replica3::QuerySerialization() + /// The opposite of this is RM3SR_DO_NOT_SERIALIZE, in case the object did not change + RM3SR_BROADCAST_IDENTICALLY_FORCE_SERIALIZATION, + + /// Either this object serializes differently depending on who we send to or we send it to some systems and not others. + /// Inefficient for memory and speed, but efficient for bandwidth + /// However, if you don't know what to return, return this + RM3SR_SERIALIZED_UNIQUELY, + + /// Do not compare against last sent value. Just send even if the data is the same as the last tick + /// If the data is always changing anyway, or you want to send unreliably, this is a good method of serialization + /// Can send unique data per connection if desired. If same data is sent to all connections, use RM3SR_SERIALIZED_ALWAYS_IDENTICALLY for even better performance + /// Efficient for memory and speed, but not necessarily bandwidth + RM3SR_SERIALIZED_ALWAYS, + + /// Even faster than RM3SR_SERIALIZED_ALWAYS + /// Serialize() will only be called for the first system. The remaining systems will get the same data as the first system. + RM3SR_SERIALIZED_ALWAYS_IDENTICALLY, + + /// Do not serialize this object this tick, for this connection. Will query again next autoserialize timer + RM3SR_DO_NOT_SERIALIZE, + + /// Never serialize this object for this connection + /// Useful for objects that are downloaded, and never change again + /// Efficient + RM3SR_NEVER_SERIALIZE_FOR_THIS_CONNECTION, + + /// Max enum + RM3SR_MAX, +}; + +/// First pass at topology to see if an object should be serialized +/// \ingroup REPLICA_MANAGER_GROUP3 +enum RM3QuerySerializationResult +{ + /// Call Serialize() to see if this object should be serializable for this connection + RM3QSR_CALL_SERIALIZE, + /// Do not call Serialize() this tick to see if this object should be serializable for this connection + RM3QSR_DO_NOT_CALL_SERIALIZE, + /// Never call Serialize() for this object and connection. This system will not serialize this object for this topology + RM3QSR_NEVER_CALL_SERIALIZE, + /// Max enum + RM3QSR_MAX, +}; + +/// \ingroup REPLICA_MANAGER_GROUP3 +enum RM3ActionOnPopConnection +{ + RM3AOPC_DO_NOTHING, + RM3AOPC_DELETE_REPLICA, + RM3AOPC_DELETE_REPLICA_AND_BROADCAST_DESTRUCTION, + RM3AOPC_MAX, +}; + +/// \ingroup REPLICA_MANAGER_GROUP3 +/// Used for Replica3::QueryConstruction_PeerToPeer() and Replica3::QuerySerialization_PeerToPeer() to describe how the object replicates between hosts +enum Replica3P2PMode +{ + /// The Replica3 instance is constructed and serialized by one system only. + /// Example: Your avatar. No other player serializes or can create your avatar. + R3P2PM_SINGLE_OWNER, + /// The Replica3 instance is constructed and/or serialized by different systems + /// This system is currently in charge of construction and/or serialization + /// Example: A pickup. When an avatar holds it, that avatar controls it. When it is on the ground, the host controls it. + R3P2PM_MULTI_OWNER_CURRENTLY_AUTHORITATIVE, + /// The Replica3 instance is constructed and/or serialized by different systems + /// Another system is in charge of construction and/or serialization, but this system may be in charge at a later time + /// Example: A pickup held by another player. That player sends creation of that object to new connections, and serializes it until it is dropped. + R3P2PM_MULTI_OWNER_NOT_CURRENTLY_AUTHORITATIVE, +}; + +/// \brief Base class for your replicated objects for the ReplicaManager3 system. +/// \details To use, derive your class, or a member of your class, from Replica3.
+/// \ingroup REPLICA_MANAGER_GROUP3 +class RAK_DLL_EXPORT Replica3 : public NetworkIDObject +{ +public: + Replica3(); + + /// Before deleting a local instance of Replica3, call Replica3::BroadcastDestruction() for the deletion notification to go out on the network. + /// It is not necessary to call ReplicaManager3::Dereference(), as this happens automatically in the destructor + virtual ~Replica3(); + + /// \brief Write a unique identifer that can be read on a remote system to create an object of this same class. + /// \details The value written to \a allocationIdBitstream will be passed to Connection_RM3::AllocReplica().
+ /// Sample implementation:
+ /// {allocationIdBitstream->Write(RakNet::RakString("Soldier");}
+ /// \param[out] allocationIdBitstream Bitstream for the user to write to, to identify this class + virtual void WriteAllocationID(RakNet::Connection_RM3 *destinationConnection, RakNet::BitStream *allocationIdBitstream) const=0; + + /// \brief Ask if this object, which does not exist on \a destinationConnection should (now) be sent to that system. + /// \details If ReplicaManager3::QueryConstructionMode() returns QUERY_CONNECTION_FOR_REPLICA_LIST or QUERY_REPLICA_FOR_CONSTRUCTION_AND_DESTRUCTION (default), + /// then QueyrConstruction() is called once per tick from ReplicaManager3::Update() to determine if an object should exist on a given system.
+ /// Based on the return value, a network message may be sent to the other system to create the object.
+ /// If QueryConstructionMode() is overriden to return QUERY_CONNECTION_FOR_REPLICA_LIST, this function is unused.
+ /// \note Defaults are provided: QueryConstruction_PeerToPeer(), QueryConstruction_ServerConstruction(), QueryConstruction_ClientConstruction(). Return one of these functions for a working default for the relevant topology. + /// \param[in] destinationConnection Which system we will send to + /// \param[in] replicaManager3 Plugin instance for this Replica3 + /// \return What action to take + virtual RM3ConstructionState QueryConstruction(RakNet::Connection_RM3 *destinationConnection, ReplicaManager3 *replicaManager3)=0; + + /// \brief Ask if this object, which does exist on \a destinationConnection should be removed from the remote system + /// \details If ReplicaManager3::QueryConstructionMode() returns QUERY_REPLICA_FOR_CONSTRUCTION_AND_DESTRUCTION (default), + /// then QueryDestruction() is called once per tick from ReplicaManager3::Update() to determine if an object that exists on a remote system should be destroyed for a given system.
+ /// Based on the return value, a network message may be sent to the other system to destroy the object.
+ /// Note that you can also destroy objects with BroadcastDestruction(), so this function is not useful unless you plan to delete objects for only a particular connection.
+ /// If QueryConstructionMode() is overriden to return QUERY_CONNECTION_FOR_REPLICA_LIST, this function is unused.
+ /// \param[in] destinationConnection Which system we will send to + /// \param[in] replicaManager3 Plugin instance for this Replica3 + /// \return What action to take. Only RM3CS_SEND_DESTRUCTION does anything at this time. + virtual RM3DestructionState QueryDestruction(RakNet::Connection_RM3 *destinationConnection, ReplicaManager3 *replicaManager3) {(void) destinationConnection; (void) replicaManager3; return RM3DS_DO_NOT_QUERY_DESTRUCTION;} + + /// \brief We're about to call DeserializeConstruction() on this Replica3. If QueryRemoteConstruction() returns false, this object is deleted instead. + /// \details By default, QueryRemoteConstruction_ServerConstruction() does not allow clients to create objects. The client will get Replica3::DeserializeConstructionRequestRejected().
+ /// If you want the client to be able to potentially create objects for client/server, override accordingly.
+ /// Other variants of QueryRemoteConstruction_* just return true. + /// \note Defaults are provided: QueryRemoteConstruction_PeerToPeer(), QueryRemoteConstruction_ServerConstruction(), QueryRemoteConstruction_ClientConstruction(). Return one of these functions for a working default for the relevant topology. + /// \param[in] sourceConnection Which system sent us the object creation request message. + /// \return True to allow the object to pass onto DeserializeConstruction() (where it may also be rejected), false to immediately reject the remote construction request + virtual bool QueryRemoteConstruction(RakNet::Connection_RM3 *sourceConnection)=0; + + /// \brief We got a message from a connection to destroy this replica + /// Return true to automatically relay the destruction message to all our other connections + /// For a client in client/server, it does not matter what this funtion returns + /// For a server in client/server, this should normally return true + /// For a peer in peer to peer, you can normally return false since the original destroying peer would have told all other peers about the destruction + /// If a system gets a destruction command for an object that was already destroyed, the destruction message is ignored + virtual bool QueryRelayDestruction(Connection_RM3 *sourceConnection) const {(void) sourceConnection; return true;} + + /// \brief Write data to be sent only when the object is constructed on a remote system. + /// \details SerializeConstruction is used to write out data that you need to create this object in the context of your game, such as health, score, name. Use it for data you only need to send when the object is created.
+ /// After SerializeConstruction() is called, Serialize() will be called immediately thereafter. However, they are sent in different messages, so Serialize() may arrive a later frame than SerializeConstruction() + /// For that reason, the object should be valid after a call to DeserializeConstruction() for at least a short time.
+ /// \note The object's NetworkID and allocation id are handled by the system automatically, you do not need to write these values to \a constructionBitstream + /// \param[out] constructionBitstream Destination bitstream to write your data to + /// \param[in] destinationConnection System that will receive this network message. + virtual void SerializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection)=0; + + /// \brief Read data written by Replica3::SerializeConstruction() + /// \details Reads whatever data was written to \a constructionBitstream in Replica3::SerializeConstruction() + /// \param[out] constructionBitstream Bitstream written to in Replica3::SerializeConstruction() + /// \param[in] sourceConnection System that sent us this network message. + /// \return true to accept construction of the object. false to reject, in which case the object will be deleted via Replica3::DeallocReplica() + virtual bool DeserializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection)=0; + + /// Same as SerializeConstruction(), but for an object that already exists on the remote system. + /// Used if you return RM3CS_ALREADY_EXISTS_REMOTELY from QueryConstruction + virtual void SerializeConstructionExisting(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection) {(void) constructionBitstream; (void) destinationConnection;}; + + /// Same as DeserializeConstruction(), but for an object that already exists on the remote system. + /// Used if you return RM3CS_ALREADY_EXISTS_REMOTELY from QueryConstruction + virtual void DeserializeConstructionExisting(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) {(void) constructionBitstream; (void) sourceConnection;}; + + /// \brief Write extra data to send with the object deletion event, if desired + /// \details Replica3::SerializeDestruction() will be called to write any object destruction specific data you want to send with this event. + /// \a destructionBitstream can be read in DeserializeDestruction() + /// \param[out] destructionBitstream Bitstream for you to write to + /// \param[in] destinationConnection System that will receive this network message. + virtual void SerializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *destinationConnection)=0; + + /// \brief Read data written by Replica3::SerializeDestruction() + /// \details Return true to delete the object. BroadcastDestruction() will be called automatically, followed by ReplicaManager3::Dereference.
+ /// Return false to not delete it. If you delete it at a later point, you are responsible for calling BroadcastDestruction() yourself. + virtual bool DeserializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *sourceConnection)=0; + + /// \brief The system is asking what to do with this replica when the connection is dropped + /// \details Return QueryActionOnPopConnection_Client, QueryActionOnPopConnection_Server, or QueryActionOnPopConnection_PeerToPeer + virtual RakNet::RM3ActionOnPopConnection QueryActionOnPopConnection(RakNet::Connection_RM3 *droppedConnection) const=0; + + /// Notification called for each of our replicas when a connection is popped + virtual void OnPoppedConnection(RakNet::Connection_RM3 *droppedConnection) {(void) droppedConnection;} + + /// \brief Override with {delete this;} + /// \details + ///
    + ///
  1. Got a remote message to delete this object which passed DeserializeDestruction(), OR + ///
  2. ReplicaManager3::SetAutoManageConnections() was called autoDestroy true (which is the default setting), and a remote system that owns this object disconnected) OR + /// <\OL> + ///
    + /// Override with {delete this;} to actually delete the object (and any other processing you wish).
    + /// If you don't want to delete the object, just do nothing, however, the system will not know this so you are responsible for deleting it yoruself later.
    + /// destructionBitstream may be 0 if the object was deleted locally + virtual void DeallocReplica(RakNet::Connection_RM3 *sourceConnection)=0; + + /// \brief Implement with QuerySerialization_ClientSerializable(), QuerySerialization_ServerSerializable(), or QuerySerialization_PeerToPeer() + /// \details QuerySerialization() is a first pass query to check if a given object should serializable to a given system. The intent is that the user implements with one of the defaults for client, server, or peer to peer.
    + /// Without this function, a careless implementation would serialize an object anytime it changed to all systems. This would give you feedback loops as the sender gets the same message back from the recipient it just sent to.
    + /// If more than one system can serialize the same object then you will need to override to return true, and control the serialization result from Replica3::Serialize(). Be careful not to send back the same data to the system that just sent to you! + /// \return True to allow calling Replica3::Serialize() for this connection, false to not call. + virtual RakNet::RM3QuerySerializationResult QuerySerialization(RakNet::Connection_RM3 *destinationConnection)=0; + + /// \brief Called for each replica owned by the user, once per Serialization tick, before Serialize() is called. + /// If you want to do some kind of operation on the Replica objects that you own, just before Serialization(), then overload this function + virtual void OnUserReplicaPreSerializeTick(void) {} + + /// \brief Serialize our class to a bitstream + /// \details User should implement this function to write the contents of this class to SerializationParamters::serializationBitstream.
    + /// If data only needs to be written once, you can write it to SerializeConstruction() instead for efficiency.
    + /// Transmitted over the network if it changed from the last time we called Serialize().
    + /// Called every time the time interval to ReplicaManager3::SetAutoSerializeInterval() elapses and ReplicaManager3::Update is subsequently called. + /// \param[in/out] serializeParameters Parameters controlling the serialization, including destination bitstream to write to + /// \return Whether to serialize, and if so, how to optimize the results + virtual RM3SerializationResult Serialize(RakNet::SerializeParameters *serializeParameters)=0; + + /// \brief Called when the class is actually transmitted via Serialize() + /// \details Use to track how much bandwidth this class it taking + virtual void OnSerializeTransmission(RakNet::BitStream *bitStream, const SystemAddress &systemAddress) {(void) bitStream; (void) systemAddress; } + + /// \brief Read what was written in Serialize() + /// \details Reads the contents of the class from SerializationParamters::serializationBitstream.
    + /// Called whenever Serialize() is called with different data from the last send. + /// \param[in] serializationBitstream Bitstream passed to Serialize() + /// \param[in] timeStamp 0 if unused, else contains the time the message originated on the remote system + /// \param[in] sourceConnection Which system sent to us + virtual void Deserialize(RakNet::DeserializeParameters *deserializeParameters)=0; + + /// \brief Called after SerializeConstruction completes for all objects in a given update tick.
    + /// Writes to PostDeserializeConstruction(), which is called after all objects are created for a given Construction tick(). + /// Override to send data to PostDeserializeConstruction(), such as the NetworkID of other objects to resolve pointers to + virtual void PostSerializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection) {(void) constructionBitstream; (void) destinationConnection;} + + /// Called after DeserializeConstruction completes for all objects in a given update tick.
    + /// This is used to resolve dependency chains, where two objects would refer to each other in DeserializeConstruction, yet one had not been constructed yet + /// In PostDeserializeConstruction(), you know that all objects have already been created, so can resolve NetworkIDs to pointers safely. + /// You can also use it to trigger some sort of event when you know the object has completed deserialization. + /// \param[in] constructionBitstream BitStream written in PostSerializeConstruction() + /// \param[in] sourceConnection System that sent us this network message. + virtual void PostDeserializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) {(void) constructionBitstream; (void) sourceConnection;} + + /// Same as PostSerializeConstruction(), but for objects that returned RM3CS_ALREADY_EXISTS_REMOTELY from QueryConstruction + virtual void PostSerializeConstructionExisting(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection) {(void) constructionBitstream; (void) destinationConnection;} + + /// Same as PostDeserializeConstruction(), but for objects that returned RM3CS_ALREADY_EXISTS_REMOTELY from QueryConstruction + virtual void PostDeserializeConstructionExisting(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) {(void) constructionBitstream; (void) sourceConnection;} + + /// Called after DeserializeDestruction completes for the object successfully, but obviously before the object is deleted.
    + /// Override to trigger some sort of event when you know the object has completed destruction. + /// \param[in] sourceConnection System that sent us this network message. + virtual void PreDestruction(RakNet::Connection_RM3 *sourceConnection) {(void) sourceConnection;} + + /// \brief Default call for QueryConstruction(). + /// \details Both the client and the server is allowed to create this object. The network topology is client/server + /// \param[in] destinationConnection destinationConnection parameter passed to QueryConstruction() + /// \param[in] isThisTheServer True if this system is the server, false if not. + virtual RM3ConstructionState QueryConstruction_ClientConstruction(RakNet::Connection_RM3 *destinationConnection, bool isThisTheServer); + /// Default call for QueryRemoteConstruction(). + /// \details Both the client and the server is allowed to create this object. The network topology is client/server + /// \param[in] sourceConnection destinationConnection parameter passed to QueryConstruction() + /// \param[in] isThisTheServer True if this system is the server, false if not. + virtual bool QueryRemoteConstruction_ClientConstruction(RakNet::Connection_RM3 *sourceConnection, bool isThisTheServer); + + /// \brief Default call for QueryConstruction(). + /// \details Only the server is allowed to create this object. The network topology is client/server + /// \param[in] destinationConnection destinationConnection parameter passed to QueryConstruction() + /// \param[in] isThisTheServer True if this system is the server, false if not. + virtual RM3ConstructionState QueryConstruction_ServerConstruction(RakNet::Connection_RM3 *destinationConnection, bool isThisTheServer); + /// \brief Default call for QueryRemoteConstruction(). Allow the server to create this object, but not the client. + /// \details Only the server is allowed to create this object. The network topology is client/server + /// \param[in] sourceConnection destinationConnection parameter passed to QueryConstruction() + /// \param[in] isThisTheServer True if this system is the server, false if not. + virtual bool QueryRemoteConstruction_ServerConstruction(RakNet::Connection_RM3 *sourceConnection, bool isThisTheServer); + + /// \brief Default call for QueryConstruction(). + /// \details All clients are allowed to create all objects. The object is not relayed when remotely created + /// \param[in] destinationConnection destinationConnection parameter passed to QueryConstruction() + /// \param[in] p2pMode If controlled only by this system ever, pass R3P2PM_SINGLE_OWNER. Otherwise pass R3P2PM_MULTI_OWNER_CURRENTLY_AUTHORITATIVE or R3P2PM_MULTI_OWNER_NOT_CURRENTLY_AUTHORITATIVE + virtual RM3ConstructionState QueryConstruction_PeerToPeer(RakNet::Connection_RM3 *destinationConnection, Replica3P2PMode p2pMode=R3P2PM_SINGLE_OWNER); + /// \brief Default call for QueryRemoteConstruction(). + /// \details All clients are allowed to create all objects. The object is not relayed when remotely created + /// \param[in] sourceConnection destinationConnection parameter passed to QueryConstruction() + virtual bool QueryRemoteConstruction_PeerToPeer(RakNet::Connection_RM3 *sourceConnection); + + /// \brief Default call for QuerySerialization(). + /// \details Use if the values you are serializing are generated by the client that owns the object. The serialization will be relayed through the server to the other clients. + /// \param[in] destinationConnection destinationConnection parameter passed to QueryConstruction() + /// \param[in] isThisTheServer True if this system is the server, false if not. + virtual RakNet::RM3QuerySerializationResult QuerySerialization_ClientSerializable(RakNet::Connection_RM3 *destinationConnection, bool isThisTheServer); + /// \brief Default call for QuerySerialization(). + /// \details Use if the values you are serializing are generated only by the server. The serialization will be sent to all clients, but the clients will not send back to the server. + /// \param[in] destinationConnection destinationConnection parameter passed to QueryConstruction() + /// \param[in] isThisTheServer True if this system is the server, false if not. + virtual RakNet::RM3QuerySerializationResult QuerySerialization_ServerSerializable(RakNet::Connection_RM3 *destinationConnection, bool isThisTheServer); + /// \brief Default call for QuerySerialization(). + /// \details Use if the values you are serializing are on a peer to peer network. The peer that owns the object will send to all. Remote peers will not send. + /// \param[in] destinationConnection destinationConnection parameter passed to QueryConstruction() + /// \param[in] p2pMode If controlled only by this system ever, pass R3P2PM_SINGLE_OWNER. Otherwise pass R3P2PM_MULTI_OWNER_CURRENTLY_AUTHORITATIVE or R3P2PM_MULTI_OWNER_NOT_CURRENTLY_AUTHORITATIVE + virtual RakNet::RM3QuerySerializationResult QuerySerialization_PeerToPeer(RakNet::Connection_RM3 *destinationConnection, Replica3P2PMode p2pMode=R3P2PM_SINGLE_OWNER); + + /// Default: If we are a client, and the connection is lost, delete the server's objects + virtual RM3ActionOnPopConnection QueryActionOnPopConnection_Client(RakNet::Connection_RM3 *droppedConnection) const; + /// Default: If we are a client, and the connection is lost, delete the client's objects and broadcast the destruction + virtual RM3ActionOnPopConnection QueryActionOnPopConnection_Server(RakNet::Connection_RM3 *droppedConnection) const; + /// Default: If we are a peer, and the connection is lost, delete the peer's objects + virtual RM3ActionOnPopConnection QueryActionOnPopConnection_PeerToPeer(RakNet::Connection_RM3 *droppedConnection) const; + + /// Call to send a network message to delete this object on other systems.
    + /// Call it before deleting the object + virtual void BroadcastDestruction(void); + + /// creatingSystemGUID is set the first time Reference() is called, or if we get the object from another system + /// \return System that originally created this object + RakNetGUID GetCreatingSystemGUID(void) const; + + /// \return If ReplicaManager3::Reference() was called on this object. + bool WasReferenced(void) const {return replicaManager!=0;} + + /// GUID of the system that first called Reference() on this object. + /// Transmitted automatically when the object is constructed + RakNetGUID creatingSystemGUID; + /// GUID of the system that caused the item to send a deletion command over the network + RakNetGUID deletingSystemGUID; + + /// \internal + /// ReplicaManager3 plugin associated with this object + ReplicaManager3 *replicaManager; + + LastSerializationResultBS lastSentSerialization; + RakNet::Time whenLastSerialized; + bool forceSendUntilNextUpdate; +}; + +/// \brief Use Replica3 through composition instead of inheritance by containing an instance of this templated class +/// Calls to parent class for all functions +/// Parent class must still define and functions though! +/// \pre Parent class must call SetParent() on this object +template +class RAK_DLL_EXPORT Replica3Composite : public Replica3 +{ +protected: + parent_type *r3CompositeOwner; +public: + void SetCompositeOwner(parent_type *p) {r3CompositeOwner=p;} + parent_type* GetCompositeOwner(void) const {return r3CompositeOwner;}; + virtual void WriteAllocationID(RakNet::Connection_RM3 *destinationConnection, RakNet::BitStream *allocationIdBitstream) const {r3CompositeOwner->WriteAllocationID(destinationConnection, allocationIdBitstream);} + virtual RM3ConstructionState QueryConstruction(RakNet::Connection_RM3 *destinationConnection, ReplicaManager3 *replicaManager3) {return r3CompositeOwner->QueryConstruction(destinationConnection, replicaManager3);} + virtual RM3DestructionState QueryDestruction(RakNet::Connection_RM3 *destinationConnection, ReplicaManager3 *replicaManager3) {return r3CompositeOwner->QueryDestruction(destinationConnection, replicaManager3);} + virtual bool QueryRemoteConstruction(RakNet::Connection_RM3 *sourceConnection) {return r3CompositeOwner->QueryRemoteConstruction(sourceConnection);} + virtual bool QueryRelayDestruction(Connection_RM3 *sourceConnection) const {return r3CompositeOwner->QueryRelayDestruction(sourceConnection);} + virtual void SerializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection) {r3CompositeOwner->SerializeConstruction(constructionBitstream, destinationConnection);} + virtual bool DeserializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) {return r3CompositeOwner->DeserializeConstruction(constructionBitstream, sourceConnection);} + virtual void SerializeConstructionExisting(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection) {r3CompositeOwner->SerializeConstructionExisting(constructionBitstream, destinationConnection);} + virtual void DeserializeConstructionExisting(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) {r3CompositeOwner->DeserializeConstructionExisting(constructionBitstream, sourceConnection);} + virtual void SerializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *destinationConnection) {r3CompositeOwner->SerializeDestruction(destructionBitstream, destinationConnection);} + virtual bool DeserializeDestruction(RakNet::BitStream *destructionBitstream, RakNet::Connection_RM3 *sourceConnection) {return r3CompositeOwner->DeserializeDestruction(destructionBitstream, sourceConnection);} + virtual RakNet::RM3ActionOnPopConnection QueryActionOnPopConnection(RakNet::Connection_RM3 *droppedConnection) const {return r3CompositeOwner->QueryActionOnPopConnection(droppedConnection);} + virtual void OnPoppedConnection(RakNet::Connection_RM3 *droppedConnection) {r3CompositeOwner->OnPoppedConnection(droppedConnection);} + virtual void DeallocReplica(RakNet::Connection_RM3 *sourceConnection) {r3CompositeOwner->DeallocReplica(sourceConnection);} + virtual RakNet::RM3QuerySerializationResult QuerySerialization(RakNet::Connection_RM3 *destinationConnection) {return r3CompositeOwner->QuerySerialization(destinationConnection);} + virtual void OnUserReplicaPreSerializeTick(void) {r3CompositeOwner->OnUserReplicaPreSerializeTick();} + virtual RM3SerializationResult Serialize(RakNet::SerializeParameters *serializeParameters) {return r3CompositeOwner->Serialize(serializeParameters);} + virtual void OnSerializeTransmission(RakNet::BitStream *bitStream, const SystemAddress &systemAddress) {r3CompositeOwner->OnSerializeTransmission(bitStream, systemAddress);} + virtual void Deserialize(RakNet::DeserializeParameters *deserializeParameters) {r3CompositeOwner->Deserialize(deserializeParameters);} + virtual void PostSerializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection) {r3CompositeOwner->PostSerializeConstruction(constructionBitstream, destinationConnection);} + virtual void PostDeserializeConstruction(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) {r3CompositeOwner->PostDeserializeConstruction(constructionBitstream, sourceConnection);} + virtual void PostSerializeConstructionExisting(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *destinationConnection) {r3CompositeOwner->PostSerializeConstructionExisting(constructionBitstream, destinationConnection);} + virtual void PostDeserializeConstructionExisting(RakNet::BitStream *constructionBitstream, RakNet::Connection_RM3 *sourceConnection) {r3CompositeOwner->PostDeserializeConstructionExisting(constructionBitstream, sourceConnection);} + virtual void PreDestruction(RakNet::Connection_RM3 *sourceConnection) {r3CompositeOwner->PreDestruction(sourceConnection);} +}; + +} // namespace RakNet + + +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Router2.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Router2.cpp new file mode 100644 index 0000000..1f06638 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Router2.cpp @@ -0,0 +1,1329 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_Router2==1 && _RAKNET_SUPPORT_UDPForwarder==1 + +#include "Router2.h" +#include "RakPeerInterface.h" +#include "BitStream.h" +#include "RakNetTime.h" +#include "GetTime.h" +#include "DS_OrderedList.h" +#include "SocketLayer.h" +#include "FormatString.h" + +using namespace RakNet; + +/* +Algorithm: + +1. Sender calls ConnectInternal(). A ConnnectRequest structure is allocated and stored in the connectionRequests list, containing a list of every system we are connected to. ID_ROUTER_2_QUERY_FORWARDING is sent to all connected systems. + +2. Upon the router getting ID_ROUTER_2_QUERY_FORWARDING, ID_ROUTER_2_REPLY_FORWARDING is sent to the sender indicating if that router is connected to the endpoint, along with the ping from the router to the endpoint. + +3. Upon the sender getting ID_ROUTER_2_REPLY_FORWARDING, the connection request structure is looked up in Router2::UpdateForwarding. The ping is stored in that structure. Once all systems have replied, the system continues to the next state. If every system in step 1 has been exhausted, and routing has occured at least once, then ID_CONNECTION_LOST is returned. If every system in step 1 has been exhausted and routing has never occured, then ID_ROUTER_2_FORWARDING_NO_PATH is returned. Otherwise, the router with the lowest ping is chosen, and RequestForwarding() is called with that system, which sends ID_ROUTER_2_REQUEST_FORWARDING to the router. + +4. When the router gets ID_ROUTER_2_REQUEST_FORWARDING, a MiniPunchRequest structure is allocated and stored in the miniPunchesInProgress list. The function SendOOBMessages() sends ID_ROUTER_2_REPLY_TO_SENDER_PORT from the routing sockets to both the sender and endpoint. It also sends ID_ROUTER_2_REPLY_TO_SPECIFIED_PORT through the regular RakNet connection. + +5. The sender and endpoint should get ID_ROUTER_2_REPLY_TO_SENDER_PORT and/or ID_ROUTER_2_REPLY_TO_SPECIFIED_PORT depending on what type of router they have. If ID_ROUTER_2_REPLY_TO_SENDER_PORT arrives, then this will reply back to the routing socket directly. If ID_ROUTER_2_REPLY_TO_SPECIFIED_PORT arrives, then the reply port is modified to be the port specified by the router system. In both cases, ID_ROUTER_2_MINI_PUNCH_REPLY is sent. As the router has already setup the forwarding, ID_ROUTER_2_MINI_PUNCH_REPLY will actually arrive to the endpoint from the sender, and from the sender to the endpoint. + +6. When ID_ROUTER_2_MINI_PUNCH_REPLY arrives, ID_ROUTER_2_MINI_PUNCH_REPLY_BOUNCE will be sent to the router. This is to tell the router that the forwarding has succeeded. + +7. When ID_ROUTER_2_MINI_PUNCH_REPLY_BOUNCE arrives on the router, the router will find the two systems in the miniPunchesInProgress list, which was added in step 4 (See OnMiniPunchReplyBounce()). gotReplyFromSource or gotReplyFromEndpoint will be set to true, depending on the sender. When both gotReplyFromSource and gotReplyFromEndpoint have replied, then ID_ROUTER_2_REROUTE is sent to the endpoint, and ID_ROUTER_2_FORWARDING_ESTABLISHED is sent to the sender. + +8. When the endpoint gets ID_ROUTER_2_REROUTE, the system address is updated for the guid of the sender using RakPeer::ChangeSystemAddress(). This happens in OnRerouted(). + +9. When the sender gets ID_ROUTER_2_FORWARDING_ESTABLISHED, then in OnForwardingSuccess() the endpoint is removed from the connectionRequest list and moved to the forwardedConnectionList. + +10. In OnClosedConnection(), for the sender, if the closed connection is the endpoint, then the endpoint is removed from the forwardedConnectionList (this is a graceful disconnect). If the connection was instead lost to the router, then ConnectInternal() gets called, which goes back to step 1. If instead this was a connection requset in progress, then UpdateForwarding() gets called, which goes back to step 3. + +11. When the user connects the endpoint and sender, then the sender will get ID_CONNECTION_REQUEST_ACCEPTED. The sender will look up the endpoint in the forwardedConnectionList, and send ID_ROUTER_2_INCREASE_TIMEOUT to the endpoint. This message will call SetTimeoutTime() on the endpoint, so that if the router disconnects, enough time is available for the reroute to complete. +*/ + +#define MIN_MINIPUNCH_TIMEOUT 5000 + + + + +void Router2DebugInterface::ShowFailure(const char *message) +{ + printf("%s", message); +} +void Router2DebugInterface::ShowDiagnostic(const char *message) +{ + printf("%s", message); +} + +enum Router2MessageIdentifiers +{ + ID_ROUTER_2_QUERY_FORWARDING, + ID_ROUTER_2_REPLY_FORWARDING, + ID_ROUTER_2_REQUEST_FORWARDING, + ID_ROUTER_2_INCREASE_TIMEOUT, +}; +Router2::ConnnectRequest::ConnnectRequest() +{ + +} +Router2::ConnnectRequest::~ConnnectRequest() +{ + +} + +STATIC_FACTORY_DEFINITIONS(Router2,Router2); + +Router2::Router2() +{ + udpForwarder=0; + maximumForwardingRequests=0; + debugInterface=0; + socketFamily=AF_INET; +} +Router2::~Router2() +{ + ClearAll(); + + if (udpForwarder) + { + udpForwarder->Shutdown(); + RakNet::OP_DELETE(udpForwarder,_FILE_AND_LINE_); + } +} +void Router2::ClearMinipunches(void) +{ + miniPunchesInProgressMutex.Lock(); + miniPunchesInProgress.Clear(false,_FILE_AND_LINE_); + miniPunchesInProgressMutex.Unlock(); +} +void Router2::ClearConnectionRequests(void) +{ + connectionRequestsMutex.Lock(); + for (unsigned int i=0; i < connectionRequests.Size(); i++) + { + RakNet::OP_DELETE(connectionRequests[i],_FILE_AND_LINE_); + } + connectionRequests.Clear(false,_FILE_AND_LINE_); + connectionRequestsMutex.Unlock(); +} +bool Router2::ConnectInternal(RakNetGUID endpointGuid, bool returnConnectionLostOnFailure) +{ + int largestPing = GetLargestPingAmongConnectedSystems(); + if (largestPing<0) + { + char buff[512]; + if (debugInterface) debugInterface->ShowFailure(FormatStringTS(buff,"Router2: ConnectInternal(%I64d) failed at %s:%i\n", endpointGuid.g, __FILE__, __LINE__)); + + // Not connected to anyone + return false; + } + + // ALready in progress? + connectionRequestsMutex.Lock(); + if (GetConnectionRequestIndex(endpointGuid)!=(unsigned int)-1) + { + connectionRequestsMutex.Unlock(); + char buff[512]; + if (debugInterface) debugInterface->ShowFailure(FormatStringTS(buff,"Router2: ConnectInternal(%I64d) failed at %s:%i\n", endpointGuid.g, __FILE__, __LINE__)); + + return false; + } + connectionRequestsMutex.Unlock(); + + // StoreRequest(endpointGuid, Largest(ping*2), systemsSentTo). Set state REQUEST_STATE_QUERY_FORWARDING + Router2::ConnnectRequest *cr = RakNet::OP_NEW(_FILE_AND_LINE_); + DataStructures::List addresses; + DataStructures::List guids; + rakPeerInterface->GetSystemList(addresses, guids); + if (guids.Size()==0) + { + char buff[512]; + if (debugInterface) debugInterface->ShowFailure(FormatStringTS(buff,"Router2 failed at %s:%i\n", _FILE_AND_LINE_)); + + return false; + } + cr->requestState=R2RS_REQUEST_STATE_QUERY_FORWARDING; + cr->pingTimeout=RakNet::GetTimeMS()+largestPing*2+1000; + cr->endpointGuid=endpointGuid; + cr->returnConnectionLostOnFailure=returnConnectionLostOnFailure; + for (unsigned int i=0; i < guids.Size(); i++) + { + ConnectionRequestSystem crs; + if (guids[i]!=endpointGuid) + { + crs.guid=guids[i]; + crs.pingToEndpoint=-1; + cr->connectionRequestSystemsMutex.Lock(); + cr->connectionRequestSystems.Push(crs,_FILE_AND_LINE_); + cr->connectionRequestSystemsMutex.Unlock(); + + // Broadcast(ID_ROUTER_2_QUERY_FORWARDING, endpointGuid); + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_ROUTER_2_INTERNAL); + bsOut.Write((unsigned char) ID_ROUTER_2_QUERY_FORWARDING); + bsOut.Write(endpointGuid); + uint32_t pack_id = rakPeerInterface->Send(&bsOut,MEDIUM_PRIORITY,RELIABLE_ORDERED,0,crs.guid,false); + + if (debugInterface) + { + char buff[512]; + debugInterface->ShowDiagnostic(FormatStringTS(buff,"Router2::ConnectInternal: at %s:%i, pack_id = %d", __FILE__, __LINE__,pack_id)); + } + + } + else + { + if (debugInterface) + { + char buff[512]; + debugInterface->ShowDiagnostic(FormatStringTS(buff,"Router2::ConnectInternal: at %s:%i [else ..].: %I64d==%I64d", __FILE__, __LINE__, + guids[i].g,endpointGuid.g)); + } + } + } + connectionRequestsMutex.Lock(); + connectionRequests.Push(cr,_FILE_AND_LINE_); + connectionRequestsMutex.Unlock(); + + if (debugInterface) + { + char buff[512]; + debugInterface->ShowDiagnostic(FormatStringTS(buff,"Broadcasting ID_ROUTER_2_QUERY_FORWARDING to %I64d at %s:%i\n", endpointGuid.g , __FILE__, __LINE__)); + } + + return true; +} +void Router2::SetSocketFamily(unsigned short _socketFamily) +{ + socketFamily=_socketFamily; +} +void Router2::EstablishRouting(RakNetGUID endpointGuid) +{ + ConnectionState cs = rakPeerInterface->GetConnectionState(endpointGuid); + if (cs!=IS_DISCONNECTED && cs!=IS_NOT_CONNECTED) + { + char buff[512]; + if (debugInterface) debugInterface->ShowFailure(FormatStringTS(buff,"Router2 failed at %s:%i " + "(already connected to the %I64d)\n", __FILE__, __LINE__, endpointGuid.g )); + return; + } + + ConnectInternal(endpointGuid,false); +} +void Router2::SetMaximumForwardingRequests(int max) +{ + if (max>0 && maximumForwardingRequests<=0) + { + udpForwarder = RakNet::OP_NEW(_FILE_AND_LINE_); + udpForwarder->Startup(); + } + else if (max<=0 && maximumForwardingRequests>0) + { + udpForwarder->Shutdown(); + RakNet::OP_DELETE(udpForwarder,_FILE_AND_LINE_); + udpForwarder=0; + } + + maximumForwardingRequests=max; +} +PluginReceiveResult Router2::OnReceive(Packet *packet) +{ + SystemAddress sa; + RakNet::BitStream bs(packet->data,packet->length,false); + if (packet->data[0]==ID_ROUTER_2_INTERNAL) + { + switch (packet->data[1]) + { + case ID_ROUTER_2_QUERY_FORWARDING: + { + OnQueryForwarding(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + case ID_ROUTER_2_REPLY_FORWARDING: + { + OnQueryForwardingReply(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + case ID_ROUTER_2_REQUEST_FORWARDING: + { + + if (debugInterface) + { + char buff[512]; + char buff2[32]; + packet->systemAddress.ToString(true,buff2); + debugInterface->ShowDiagnostic(FormatStringTS(buff,"Got ID_ROUTER_2_REQUEST_FORWARDING on ip %s from %I64d, ", + buff2,packet->guid.g)); + } + + OnRequestForwarding(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + case ID_ROUTER_2_INCREASE_TIMEOUT: + { + /// The routed system wants more time to stay alive on no communication, in case the router drops or crashes + rakPeerInterface->SetTimeoutTime(rakPeerInterface->GetTimeoutTime(packet->systemAddress)+10000, packet->systemAddress); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + } + } + else if (packet->data[0]==ID_OUT_OF_BAND_INTERNAL && packet->length>=2) + { + switch (packet->data[1]) + { + case ID_ROUTER_2_REPLY_TO_SENDER_PORT: + { + RakNet::BitStream bsOut; + bsOut.Write(packet->guid); + SendOOBFromRakNetPort(ID_ROUTER_2_MINI_PUNCH_REPLY, &bsOut, packet->systemAddress); + + if (debugInterface) + { + char buff[512]; + char buff2[32]; + sa.ToString(false,buff2); + debugInterface->ShowDiagnostic(FormatStringTS(buff,"Got ID_ROUTER_2_REPLY_TO_SENDER_PORT %i on address %s, replying with ID_ROUTER_2_MINI_PUNCH_REPLY at %s:%i\n", sa.GetPort(), buff2, _FILE_AND_LINE_)); + +// packet->systemAddress.ToString(true,buff2); +// debugInterface->ShowDiagnostic(FormatStringTS(buff,"Got ID_ROUTER_2_REPLY_TO_SENDER_PORT on address %s (%I64d), " +// "replying with ID_ROUTER_2_MINI_PUNCH_REPLY at %s:%i\n", buff2,packet->guid.g, __FILE__, __LINE__)); + } + + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + case ID_ROUTER_2_REPLY_TO_SPECIFIED_PORT: + { + RakNet::BitStream bsOut; + bsOut.Write(packet->guid); + bs.IgnoreBytes(2); + sa=packet->systemAddress; + unsigned short port; + bs.Read(port); + sa.SetPort(port); + RakAssert(sa.GetPort()!=0); + SendOOBFromRakNetPort(ID_ROUTER_2_MINI_PUNCH_REPLY, &bsOut, sa); + + if (debugInterface) + { + char buff[512]; + char buff2[32]; + sa.ToString(false,buff2); + debugInterface->ShowDiagnostic(FormatStringTS(buff,"Got ID_ROUTER_2_REPLY_TO_SPECIFIED_PORT %i on address %s, " + "replying with ID_ROUTER_2_MINI_PUNCH_REPLY at %s:%i\n", sa.GetPort(), buff2, __FILE__, __LINE__)); + } + + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + case ID_ROUTER_2_MINI_PUNCH_REPLY: + OnMiniPunchReply(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + case ID_ROUTER_2_MINI_PUNCH_REPLY_BOUNCE: + OnMiniPunchReplyBounce(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + } + else if (packet->data[0]==ID_ROUTER_2_FORWARDING_ESTABLISHED) + { +// printf("Got ID_ROUTER_2_FORWARDING_ESTABLISHED\n"); + if (OnForwardingSuccess(packet)==false) + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + else if (packet->data[0]==ID_ROUTER_2_REROUTED) + { + OnRerouted(packet); + } + else if (packet->data[0]==ID_CONNECTION_REQUEST_ACCEPTED) + { + unsigned int forwardingIndex; + forwardedConnectionListMutex.Lock(); + for (forwardingIndex=0; forwardingIndex < forwardedConnectionList.Size(); forwardingIndex++) + { + if (forwardedConnectionList[forwardingIndex].endpointGuid==packet->guid && forwardedConnectionList[forwardingIndex].weInitiatedForwarding) + break; + } + + if (forwardingIndexSend(&bsOut,HIGH_PRIORITY,RELIABLE,0,packet->guid,false); + + if (debugInterface) + { + char buff[512]; + debugInterface->ShowDiagnostic(FormatStringTS(buff,"Got ID_CONNECTION_REQUEST_ACCEPTED, " + "sending ID_ROUTER_2_INCREASE_TIMEOUT to the %I64d at %s:%i\n", packet->guid.g, __FILE__, __LINE__)); + } + + // Also take longer ourselves + rakPeerInterface->SetTimeoutTime(rakPeerInterface->GetTimeoutTime(packet->systemAddress)+10000, packet->systemAddress); + } + else { + // ~Gwynn: Fix for Receive hanging up problem on Windows XP + // See http://blog.delphi-jedi.net/2008/04/23/the-case-of-the-unexplained-dead-lock-in-a-single-thread/ for details + forwardedConnectionListMutex.Unlock(); + } + } + else if (packet->data[0]==ID_ROUTER_2_FORWARDING_NO_PATH) + { + if (packet->wasGeneratedLocally==false) + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + + return RR_CONTINUE_PROCESSING; +} +void Router2::Update(void) +{ + RakNet::TimeMS curTime = RakNet::GetTimeMS(); + unsigned int connectionRequestIndex=0; + connectionRequestsMutex.Lock(); + while (connectionRequestIndex < connectionRequests.Size()) + { + ConnnectRequest* connectionRequest = connectionRequests[connectionRequestIndex]; + + // pingTimeout is only used with R2RS_REQUEST_STATE_QUERY_FORWARDING + if (connectionRequest->requestState==R2RS_REQUEST_STATE_QUERY_FORWARDING && + connectionRequest->pingTimeout < curTime) + { + bool anyRemoved=false; + unsigned int connectionRequestGuidIndex=0; + connectionRequest->connectionRequestSystemsMutex.Lock(); + while (connectionRequestGuidIndex < connectionRequest->connectionRequestSystems.Size()) + { + if (connectionRequest->connectionRequestSystems[connectionRequestGuidIndex].pingToEndpoint<0) + { + anyRemoved=true; + connectionRequest->connectionRequestSystems.RemoveAtIndexFast(connectionRequestGuidIndex); + } + else + { + connectionRequestGuidIndex++; + } + } + connectionRequest->connectionRequestSystemsMutex.Unlock(); + + if (anyRemoved) + { + if (connectionRequestIndex!=(unsigned int)-1) + { + // connectionRequestsMutex should be locked before calling this function + if (UpdateForwarding(connectionRequest)==false) + { + RemoveConnectionRequest(connectionRequestIndex); + } + else + { + connectionRequestIndex++; + } + } + else + { + connectionRequestIndex++; + } + } + else + { + connectionRequestIndex++; + } + } + else + { + connectionRequestIndex++; + } + } + connectionRequestsMutex.Unlock(); + + unsigned int i=0; + miniPunchesInProgressMutex.Lock(); + while (i < miniPunchesInProgress.Size()) + { + if (miniPunchesInProgress[i].timeoutminiPunchesInProgress[i].nextAction) + { + miniPunchesInProgress[i].nextAction=curTime+100; + SendOOBMessages(&miniPunchesInProgress[i]); + } + else + i++; + } + miniPunchesInProgressMutex.Unlock(); + +} +void Router2::OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ) +{ + (void) lostConnectionReason; + (void) systemAddress; + + + unsigned int forwardedConnectionIndex=0; + forwardedConnectionListMutex.Lock(); + while (forwardedConnectionIndexShowDiagnostic(FormatStringTS(buff,"Closed connection to the %I64d, removing forwarding from list at %s:%i\n", rakNetGUID.g, __FILE__, __LINE__)); + } + + // No longer need forwarding + forwardedConnectionList.RemoveAtIndexFast(forwardedConnectionIndex); + } + else if (forwardedConnectionList[forwardedConnectionIndex].intermediaryGuid==rakNetGUID && forwardedConnectionList[forwardedConnectionIndex].weInitiatedForwarding) + { + // Lost connection to intermediary. Restart process to connect to endpoint. If failed, push ID_CONNECTION_LOST. Also remove connection request if it already is in the list, to restart it + connectionRequestsMutex.Lock(); + unsigned int pos = GetConnectionRequestIndex(forwardedConnectionList[forwardedConnectionIndex].endpointGuid); + if((unsigned int)-1 != pos) {RakNet::OP_DELETE(connectionRequests[pos], __FILE__, __LINE__); connectionRequests.RemoveAtIndexFast(pos);} + connectionRequestsMutex.Unlock(); + + ConnectInternal(forwardedConnectionList[forwardedConnectionIndex].endpointGuid, true); + + forwardedConnectionIndex++; + + if (debugInterface) + { + char buff[512]; + debugInterface->ShowDiagnostic(FormatStringTS(buff,"Closed connection %I64d, restarting forwarding at %s:%i\n",rakNetGUID.g, __FILE__, __LINE__)); + } + + // This should not be removed - the connection is still forwarded, but perhaps through another system +// forwardedConnectionList.RemoveAtIndexFast(forwardedConnectionIndex); + } + else + forwardedConnectionIndex++; + } + forwardedConnectionListMutex.Unlock(); + + unsigned int connectionRequestIndex=0; + connectionRequestsMutex.Lock(); + while (connectionRequestIndex < connectionRequests.Size()) + { + ConnnectRequest *cr = connectionRequests[connectionRequestIndex]; + cr->connectionRequestSystemsMutex.Lock(); + unsigned int connectionRequestGuidIndex = cr->GetGuidIndex(rakNetGUID); + if (connectionRequestGuidIndex!=(unsigned int)-1) + { + cr->connectionRequestSystems.RemoveAtIndexFast(connectionRequestGuidIndex); + cr->connectionRequestSystemsMutex.Unlock(); + if (UpdateForwarding(cr)==false) // If returns false, no connection request systems left + { + if (debugInterface) + { + char buff[512]; + debugInterface->ShowDiagnostic(FormatStringTS(buff,"Aborted connection to the %I64d, aborted forwarding at %s:%i\n", rakNetGUID.g, __FILE__, __LINE__)); + } + + RemoveConnectionRequest(connectionRequestIndex); + } + else // Else a system in the connection request list dropped. If cr->requestState==R2RS_REQUEST_STATE_QUERY_FORWARDING then we are still waiting for other systems to respond. + { + if (debugInterface) + { + char buff[512]; + debugInterface->ShowDiagnostic(FormatStringTS(buff,"Aborted connection attempt to %I64d, restarting forwarding to %I64d at %s:%i\n", rakNetGUID.g,cr->endpointGuid.g,__FILE__, __LINE__)); + } +// if(volatile bool is_my_fix_a_truth = true) { // A system in the list of potential systems to try routing to dropped. There is no need to restart the whole process. +// connectionRequestsMutex.Lock(); +// connectionRequests.RemoveAtIndexFast(connectionRequestIndex); +// connectionRequestsMutex.Unlock(); +// +// if(false == ConnectInternal(cr->endpointGuid,cr->returnConnectionLostOnFailure)) +// if (debugInterface) +// { +// char buff[512]; +// debugInterface->ShowDiagnostic(FormatStringTS(buff,"ConnectInternal(cr->endpointGuid,cr->returnConnectionLostOnFailure) is false. at %s:%i\n", __FILE__, __LINE__)); +// } +// } + + connectionRequestIndex++; + } + } + else + { + cr->connectionRequestSystemsMutex.Unlock(); + connectionRequestIndex++; + } + } + connectionRequestsMutex.Unlock(); + + + unsigned int i=0; + miniPunchesInProgressMutex.Lock(); + while (i < miniPunchesInProgress.Size()) + { + if (miniPunchesInProgress[i].sourceGuid==rakNetGUID || miniPunchesInProgress[i].endpointGuid==rakNetGUID) + { + if (miniPunchesInProgress[i].sourceGuid!=rakNetGUID) + { + SendFailureOnCannotForward(miniPunchesInProgress[i].sourceGuid, miniPunchesInProgress[i].endpointGuid); + } + miniPunchesInProgress.RemoveAtIndexFast(i); + } + else + i++; + } + miniPunchesInProgressMutex.Unlock(); +} +void Router2::OnFailedConnectionAttempt(Packet *packet, PI2_FailedConnectionAttemptReason failedConnectionAttemptReason) +{ + (void) failedConnectionAttemptReason; + (void) packet; + + unsigned int forwardedConnectionIndex=0; + forwardedConnectionListMutex.Lock(); + while (forwardedConnectionIndexsystemAddress) + { + if (debugInterface) + { + char buff[512]; + debugInterface->ShowDiagnostic(FormatStringTS(buff,"Failed connection attempt to forwarded system (%I64d : %s) at %s:%i\n", + forwardedConnectionList[forwardedConnectionIndex].endpointGuid.g, packet->systemAddress.ToString(true), __FILE__, __LINE__)); + } + + packet->guid=forwardedConnectionList[forwardedConnectionIndex].endpointGuid; + forwardedConnectionList.RemoveAtIndexFast(forwardedConnectionIndex); + } + else + forwardedConnectionIndex++; + } + forwardedConnectionListMutex.Unlock(); +} +void Router2::OnRakPeerShutdown(void) +{ + ClearAll(); +} +// connectionRequestsMutex should already be locked +bool Router2::UpdateForwarding(ConnnectRequest* connectionRequest) +{ + connectionRequest->connectionRequestSystemsMutex.Lock(); + + // RAKNET_DEBUG_PRINTF(__FUNCTION__": connectionRequest->connectionRequestSystems.Size = %d", connectionRequest->connectionRequestSystems.Size()); + + if (connectionRequest->connectionRequestSystems.Size()==0) + { + connectionRequest->connectionRequestSystemsMutex.Unlock(); + + // printf("Router2 failed at %s:%i\n", __FILE__, __LINE__); + if (connectionRequest->returnConnectionLostOnFailure) { + ReturnToUser(ID_CONNECTION_LOST, connectionRequest->endpointGuid, UNASSIGNED_SYSTEM_ADDRESS, true); // This is a connection which was previously established. Rerouting is not possible. +// bool sendDisconnectionNotification = false; +// rakPeerInterface->CloseConnection(rakPeerInterface->GetSystemAddressFromGuid(connectionRequest->endpointGuid), sendDisconnectionNotification); +// RAKNET_DEBUG_PRINTF(__FUNCTION__": call rakPeerInterface->CloseConnection(%I64d)" , connectionRequest->endpointGuid.g); + } + else + ReturnToUser(ID_ROUTER_2_FORWARDING_NO_PATH, connectionRequest->endpointGuid, UNASSIGNED_SYSTEM_ADDRESS, false); + + if (debugInterface) + { + char buff[512]; + debugInterface->ShowDiagnostic(FormatStringTS(buff,"Forwarding failed, no remaining systems at %s:%i\n", _FILE_AND_LINE_)); + } + + forwardedConnectionListMutex.Lock(); + + for (unsigned int forwardedConnectionIndex=0; forwardedConnectionIndex < forwardedConnectionList.Size(); forwardedConnectionIndex++) + { + if (forwardedConnectionList[forwardedConnectionIndex].endpointGuid==connectionRequest->endpointGuid && forwardedConnectionList[forwardedConnectionIndex].weInitiatedForwarding) + { + forwardedConnectionList.RemoveAtIndexFast(forwardedConnectionIndex); + break; + } + } + forwardedConnectionListMutex.Unlock(); + + return false; + } + connectionRequest->connectionRequestSystemsMutex.Unlock(); + + if (connectionRequest->requestState==R2RS_REQUEST_STATE_QUERY_FORWARDING) + { + connectionRequest->connectionRequestSystemsMutex.Lock(); + + for (unsigned int i=0; i < connectionRequest->connectionRequestSystems.Size(); i++) + { + if (connectionRequest->connectionRequestSystems[i].pingToEndpoint<0) + { + connectionRequest->connectionRequestSystemsMutex.Unlock(); + return true; // Forward query still in progress, just return + } + } + connectionRequest->connectionRequestSystemsMutex.Unlock(); + + RequestForwarding(connectionRequest); + } +// else if (connectionRequest->requestState==REQUEST_STATE_REQUEST_FORWARDING) +// { +// RequestForwarding(connectionRequestIndex); +// } + + return true; +} +// connectionRequestsMutex should already be locked +void Router2::RemoveConnectionRequest(unsigned int connectionRequestIndex) +{ + RakNet::OP_DELETE(connectionRequests[connectionRequestIndex],_FILE_AND_LINE_); + connectionRequests.RemoveAtIndexFast(connectionRequestIndex); +} +int ConnectionRequestSystemComp( const Router2::ConnectionRequestSystem & key, const Router2::ConnectionRequestSystem &data ) +{ + if (key.pingToEndpoint * (key.usedForwardingEntries+1) < data.pingToEndpoint * (data.usedForwardingEntries+1)) + return -1; + if (key.pingToEndpoint * (key.usedForwardingEntries+1) == data.pingToEndpoint * (data.usedForwardingEntries+1)) + return 1; + if (key.guid < data.guid) + return -1; + if (key.guid > data.guid) + return -1; + return 0; +} +// connectionRequestsMutex should already be locked +void Router2::RequestForwarding(ConnnectRequest* connectionRequest) +{ + RakAssert(connectionRequest->requestState==R2RS_REQUEST_STATE_QUERY_FORWARDING); + connectionRequest->requestState=REQUEST_STATE_REQUEST_FORWARDING; + + if (connectionRequest->GetGuidIndex(connectionRequest->lastRequestedForwardingSystem)!=(unsigned int)-1) + { + char buff[512]; + if (debugInterface) debugInterface->ShowFailure(FormatStringTS(buff,"Router2 failed at %s:%i\n", _FILE_AND_LINE_)); + return; + } + + // Prioritize systems to request forwarding + DataStructures::OrderedList commandList; + unsigned int connectionRequestGuidIndex; + connectionRequest->connectionRequestSystemsMutex.Lock(); + for (connectionRequestGuidIndex=0; connectionRequestGuidIndex < connectionRequest->connectionRequestSystems.Size(); connectionRequestGuidIndex++) + { + RakAssert(connectionRequest->connectionRequestSystems[connectionRequestGuidIndex].pingToEndpoint>=0); + commandList.Insert(connectionRequest->connectionRequestSystems[connectionRequestGuidIndex], + connectionRequest->connectionRequestSystems[connectionRequestGuidIndex], + true, + _FILE_AND_LINE_); + } + connectionRequest->connectionRequestSystemsMutex.Unlock(); + + connectionRequest->lastRequestedForwardingSystem=commandList[0].guid; + + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_ROUTER_2_INTERNAL); + bsOut.Write((unsigned char) ID_ROUTER_2_REQUEST_FORWARDING); + bsOut.Write(connectionRequest->endpointGuid); + rakPeerInterface->Send(&bsOut,MEDIUM_PRIORITY,RELIABLE_ORDERED,0,connectionRequest->lastRequestedForwardingSystem,false); + + if (debugInterface) + { + char buff[512]; + debugInterface->ShowDiagnostic(FormatStringTS(buff,"Sending ID_ROUTER_2_REQUEST_FORWARDING " + "(connectionRequest->lastRequestedForwardingSystem = %I64d, connectionRequest->endpointGuid = %I64d) at %s:%i\n", + connectionRequest->lastRequestedForwardingSystem.g,connectionRequest->endpointGuid.g, __FILE__, __LINE__)); + } +} +void Router2::SendFailureOnCannotForward(RakNetGUID sourceGuid, RakNetGUID endpointGuid) +{ + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_ROUTER_2_INTERNAL); + bsOut.Write((unsigned char) ID_ROUTER_2_REPLY_FORWARDING); + bsOut.Write(endpointGuid); + bsOut.Write(false); + rakPeerInterface->Send(&bsOut,MEDIUM_PRIORITY,RELIABLE_ORDERED,0,sourceGuid,false); +} +int Router2::ReturnFailureOnCannotForward(RakNetGUID sourceGuid, RakNetGUID endpointGuid) +{ + // If the number of systems we are currently forwarding>=maxForwarding, return ID_ROUTER_2_REPLY_FORWARDING,endpointGuid,false + if (udpForwarder==0 || udpForwarder->GetUsedForwardEntries()/2>maximumForwardingRequests) + { + char buff[512]; + if (debugInterface) debugInterface->ShowFailure(FormatStringTS(buff,"Router2 failed (%I64d -> %I64d) at %s:%i\n", + sourceGuid.g, endpointGuid.g,__FILE__, __LINE__)); + SendFailureOnCannotForward(sourceGuid,endpointGuid); + return -1; + } + + // We cannot forward connections which are themselves forwarded. Return fail in that case + forwardedConnectionListMutex.Lock(); + for (unsigned int i=0; i < forwardedConnectionList.Size(); i++) + { + if ((forwardedConnectionList[i].endpointGuid==endpointGuid) + || (forwardedConnectionList[i].endpointGuid==sourceGuid)) // sourceGuid is here so you do not respond to routing requests from systems you are already routing through. + { + forwardedConnectionListMutex.Unlock(); + + char buff[512]; + if (debugInterface) debugInterface->ShowFailure(FormatStringTS(buff,"Router2 failed at %s:%i\n", __FILE__, __LINE__)); + SendFailureOnCannotForward(sourceGuid,endpointGuid); + return -1; + } + } + forwardedConnectionListMutex.Unlock(); + + int pingToEndpoint; + pingToEndpoint = rakPeerInterface->GetAveragePing(endpointGuid); + if (pingToEndpoint==-1) + { + char buff[512]; + if (debugInterface) debugInterface->ShowFailure(FormatStringTS(buff,"Router2 failed (%I64d -> %I64d) at %s:%i\n", + sourceGuid.g, endpointGuid.g,__FILE__, __LINE__)); + + SendFailureOnCannotForward(sourceGuid,endpointGuid); + return -1; + } + return pingToEndpoint; +} +void Router2::OnQueryForwarding(Packet *packet) +{ + RakNet::BitStream bs(packet->data, packet->length, false); + bs.IgnoreBytes(sizeof(MessageID) + sizeof(unsigned char)); + RakNetGUID endpointGuid; + // Read endpointGuid + bs.Read(endpointGuid); + + int pingToEndpoint = ReturnFailureOnCannotForward(packet->guid, endpointGuid); + if (pingToEndpoint==-1) + { + char buff[512]; + if (debugInterface) debugInterface->ShowFailure(FormatStringTS(buff,"Router2 failed (%I64d) at %s:%i\n", packet->guid.g, __FILE__, __LINE__)); + return; + } + + // If we are connected to endpointGuid, reply ID_ROUTER_2_REPLY_FORWARDING,endpointGuid,true,ping,numCurrentlyForwarding + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_ROUTER_2_INTERNAL); + bsOut.Write((unsigned char) ID_ROUTER_2_REPLY_FORWARDING); + bsOut.Write(endpointGuid); + bsOut.Write(true); + bsOut.Write((unsigned short) pingToEndpoint); + bsOut.Write((unsigned short) udpForwarder->GetUsedForwardEntries()/2); + rakPeerInterface->Send(&bsOut,MEDIUM_PRIORITY,RELIABLE_ORDERED,0,packet->guid,false); + + if (debugInterface) + { + char buff[512]; + debugInterface->ShowDiagnostic(FormatStringTS(buff,"Sending ID_ROUTER_2_REPLY_FORWARDING to the %I64d at %s:%i\n", packet->guid.g, __FILE__, __LINE__)); + } +} +void Router2::OnQueryForwardingReply(Packet *packet) +{ + RakNet::BitStream bs(packet->data, packet->length, false); + bs.IgnoreBytes(sizeof(MessageID) + sizeof(unsigned char)); + RakNetGUID endpointGuid; + bs.Read(endpointGuid); + // Find endpointGuid among stored requests + bool canForward=false; + bs.Read(canForward); + + + connectionRequestsMutex.Lock(); + unsigned int connectionRequestIndex = GetConnectionRequestIndex(endpointGuid); + if (connectionRequestIndex==(unsigned int)-1) + { + connectionRequestsMutex.Unlock(); + char buff[512]; + if (debugInterface) debugInterface->ShowFailure(FormatStringTS(buff,"Router2 failed (%I64d) at %s:%i\n", endpointGuid.g, __FILE__, __LINE__)); + return; + } + + connectionRequests[connectionRequestIndex]->connectionRequestSystemsMutex.Lock(); + unsigned int connectionRequestGuidIndex = connectionRequests[connectionRequestIndex]->GetGuidIndex(packet->guid); + if (connectionRequestGuidIndex==(unsigned int)-1) + { + connectionRequests[connectionRequestIndex]->connectionRequestSystemsMutex.Unlock(); + connectionRequestsMutex.Unlock(); + char buff[512]; + if (debugInterface) debugInterface->ShowFailure(FormatStringTS(buff,"Router2 failed (%I64d) at %s:%i\n", endpointGuid.g, __FILE__, __LINE__)); + return; + } + + if (debugInterface) + { + char buff[512]; + char buff2[512]; + packet->systemAddress.ToString(true,buff2); + debugInterface->ShowDiagnostic(FormatStringTS(buff,"Got ID_ROUTER_2_REPLY_FORWARDING on address %s(%I64d -> %I64d) canForward=%i at %s:%i\n", + buff2, packet->guid.g, endpointGuid.g, canForward, __FILE__, __LINE__)); + } + + if (canForward) + { + unsigned short pingToEndpoint; + unsigned short usedEntries; + bs.Read(pingToEndpoint); + bs.Read(usedEntries); + connectionRequests[connectionRequestIndex]->connectionRequestSystems[connectionRequestGuidIndex].usedForwardingEntries=usedEntries; + connectionRequests[connectionRequestIndex]->connectionRequestSystems[connectionRequestGuidIndex].pingToEndpoint=rakPeerInterface->GetAveragePing(packet->guid)+pingToEndpoint; + } + else + { + connectionRequests[connectionRequestIndex]->connectionRequestSystems.RemoveAtIndex(connectionRequestGuidIndex); + } + connectionRequests[connectionRequestIndex]->connectionRequestSystemsMutex.Unlock(); + + if (UpdateForwarding(connectionRequests[connectionRequestIndex])==false) + { + RemoveConnectionRequest(connectionRequestIndex); + } + connectionRequestsMutex.Unlock(); +} +void Router2::SendForwardingSuccess(MessageID messageId, RakNetGUID sourceGuid, RakNetGUID endpointGuid, unsigned short sourceToDstPort) +{ + RakNet::BitStream bsOut; + bsOut.Write(messageId); + bsOut.Write(endpointGuid); + bsOut.Write(sourceToDstPort); + rakPeerInterface->Send(&bsOut,MEDIUM_PRIORITY,RELIABLE_ORDERED,0,sourceGuid,false); + + if (debugInterface) + { + char buff[512]; + if (messageId==ID_ROUTER_2_FORWARDING_ESTABLISHED) + debugInterface->ShowDiagnostic(FormatStringTS(buff,"Sending ID_ROUTER_2_FORWARDING_ESTABLISHED at %s:%i\n", _FILE_AND_LINE_ )); + else + debugInterface->ShowDiagnostic(FormatStringTS(buff,"Sending ID_ROUTER_2_REROUTED at %s:%i\n", _FILE_AND_LINE_ )); + } +} +void Router2::SendOOBFromRakNetPort(OutOfBandIdentifiers oob, BitStream *extraData, SystemAddress sa) +{ + RakNet::BitStream oobBs; + oobBs.Write((unsigned char)oob); + if (extraData) + { + extraData->ResetReadPointer(); + oobBs.Write(*extraData); + } + char ipAddressString[32]; + sa.ToString(false, ipAddressString); + rakPeerInterface->SendOutOfBand((const char*) ipAddressString,sa.GetPort(),(const char*) oobBs.GetData(),oobBs.GetNumberOfBytesUsed()); +} +void Router2::SendOOBFromSpecifiedSocket(OutOfBandIdentifiers oob, SystemAddress sa, SOCKET socket) +{ + RakNet::BitStream bs; + rakPeerInterface->WriteOutOfBandHeader(&bs); + bs.Write((unsigned char) oob); + SocketLayer::SendTo_PC( socket, (const char*) bs.GetData(), bs.GetNumberOfBytesUsed(), sa, __FILE__, __LINE__ ); +} +void Router2::SendOOBMessages(Router2::MiniPunchRequest *mpr) +{ + // Mini NAT punch + // Send from srcToDestPort to packet->systemAddress (source). If the message arrives, the remote system should reply. + SendOOBFromSpecifiedSocket(ID_ROUTER_2_REPLY_TO_SENDER_PORT, mpr->sourceAddress, mpr->forwardingSocket); + + // Send from destToSourcePort to endpointSystemAddress (destination). If the message arrives, the remote system should reply. + SendOOBFromSpecifiedSocket(ID_ROUTER_2_REPLY_TO_SENDER_PORT, mpr->endpointAddress, mpr->forwardingSocket); + + + if (debugInterface) { + char buff [512]; + + char buff2[128]; + + mpr->sourceAddress .ToString(true,buff2); + + debugInterface->ShowDiagnostic(FormatStringTS(buff,"call SendOOBFromSpecifiedSocket(...,%s,...)", buff2)); + + mpr->endpointAddress .ToString(true,buff2); + + debugInterface->ShowDiagnostic(FormatStringTS(buff,"call SendOOBFromSpecifiedSocket(...,%s,...)", buff2)); + } + + // Tell source to send to forwardingPort + RakNet::BitStream extraData; + extraData.Write(mpr->forwardingPort); + RakAssert(mpr->forwardingPort!=0); + SendOOBFromRakNetPort(ID_ROUTER_2_REPLY_TO_SPECIFIED_PORT, &extraData, mpr->sourceAddress); + + // Tell destination to send to forwardingPort + extraData.Reset(); + extraData.Write(mpr->forwardingPort); + RakAssert(mpr->forwardingPort); + SendOOBFromRakNetPort(ID_ROUTER_2_REPLY_TO_SPECIFIED_PORT, &extraData, mpr->endpointAddress); +} +void Router2::OnRequestForwarding(Packet *packet) +{ + RakNet::BitStream bs(packet->data, packet->length, false); + bs.IgnoreBytes(sizeof(MessageID) + sizeof(unsigned char)); + RakNetGUID endpointGuid; + bs.Read(endpointGuid); + + int pingToEndpoint = ReturnFailureOnCannotForward(packet->guid, endpointGuid); + if (pingToEndpoint==-1) + { + char buff[512]; + if (debugInterface) debugInterface->ShowFailure(FormatStringTS(buff,"Router2 failed (packet->guid =%I64d, endpointGuid = %I64d) at %s:%i\n", + packet->guid.g, endpointGuid.g, __FILE__, __LINE__)); + return; + } + + unsigned short forwardingPort=0; + SOCKET forwardingSocket=0; + SystemAddress endpointSystemAddress = rakPeerInterface->GetSystemAddressFromGuid(endpointGuid); + UDPForwarderResult result = udpForwarder->StartForwarding( + packet->systemAddress, endpointSystemAddress, 30000, 0, socketFamily, + &forwardingPort, &forwardingSocket); + + if (result==UDPFORWARDER_FORWARDING_ALREADY_EXISTS) + { + if (debugInterface) + { + char buff[512]; + debugInterface->ShowDiagnostic(FormatStringTS(buff,"Got ID_ROUTER_2_REQUEST_FORWARDING, result=UDPFORWARDER_FORWARDING_ALREADY_EXISTS " + "(packet->guid =%I64d, endpointGuid = %I64d) at %s:%i\n", + packet->guid.g, endpointGuid.g,__FILE__, __LINE__)); + } + + SendForwardingSuccess(ID_ROUTER_2_FORWARDING_ESTABLISHED, packet->guid, endpointGuid, forwardingPort); + } + else if (result==UDPFORWARDER_NO_SOCKETS) + { + char buff[512]; + char buff2[64]; + char buff3[64]; + packet->systemAddress.ToString(true,buff2); + endpointSystemAddress.ToString(true,buff3); + if (debugInterface) + debugInterface->ShowFailure(FormatStringTS(buff,"Router2 failed at %s:%i with UDPFORWARDER_NO_SOCKETS, packet->systemAddress=%s, endpointSystemAddress=%s, forwardingPort=%i, forwardingSocket=%i\n", + __FILE__, __LINE__, buff2, buff3, forwardingPort, forwardingSocket)); + SendFailureOnCannotForward(packet->guid, endpointGuid); + } + else if (result==UDPFORWARDER_INVALID_PARAMETERS) + { + char buff[512]; + char buff2[64]; + char buff3[64]; + packet->systemAddress.ToString(true,buff2); + endpointSystemAddress.ToString(true,buff3); + if (debugInterface) + debugInterface->ShowFailure(FormatStringTS(buff,"Router2 failed at %s:%i with UDPFORWARDER_INVALID_PARAMETERS, packet->systemAddress=%s, endpointSystemAddress=%s, forwardingPort=%i, forwardingSocket=%i\n", + __FILE__, __LINE__, buff2, buff3, forwardingPort, forwardingSocket)); + SendFailureOnCannotForward(packet->guid, endpointGuid); + } + else if (result==UDPFORWARDER_BIND_FAILED) + { + char buff[512]; + char buff2[64]; + char buff3[64]; + packet->systemAddress.ToString(true,buff2); + endpointSystemAddress.ToString(true,buff3); + if (debugInterface) + debugInterface->ShowFailure(FormatStringTS(buff,"Router2 failed at %s:%i with UDPFORWARDER_BIND_FAILED, packet->systemAddress=%s, endpointSystemAddress=%s, forwardingPort=%i, forwardingSocket=%i\n", + __FILE__, __LINE__, buff2, buff3, forwardingPort, forwardingSocket)); + SendFailureOnCannotForward(packet->guid, endpointGuid); + } + else + { + if (debugInterface) + { + char buff2[32]; + char buff3[32]; + endpointSystemAddress.ToString(true,buff2); + packet->systemAddress.ToString(true,buff3); + char buff[512]; + debugInterface->ShowDiagnostic(FormatStringTS(buff,"Got ID_ROUTER_2_REQUEST_FORWARDING.\n" + "endpointAddress=%s\nsourceAddress=%s\nforwardingPort=%i\n " + "calling SendOOBMessages at %s:%i\n", buff2,buff3,forwardingPort,_FILE_AND_LINE_)); + } + + // Store the punch request + MiniPunchRequest miniPunchRequest; + miniPunchRequest.endpointAddress=endpointSystemAddress; + miniPunchRequest.endpointGuid=endpointGuid; + miniPunchRequest.gotReplyFromEndpoint=false; + miniPunchRequest.gotReplyFromSource=false; + miniPunchRequest.sourceGuid=packet->guid; + miniPunchRequest.sourceAddress=packet->systemAddress; + miniPunchRequest.forwardingPort=forwardingPort; + miniPunchRequest.forwardingSocket=forwardingSocket; + int ping1 = rakPeerInterface->GetAveragePing(packet->guid); + int ping2 = rakPeerInterface->GetAveragePing(endpointGuid); + if (ping1>ping2) + miniPunchRequest.timeout=RakNet::GetTimeMS() + ping1*8+300; + else + miniPunchRequest.timeout=RakNet::GetTimeMS() + ping2*8+300; + miniPunchRequest.nextAction=RakNet::GetTimeMS()+100; + SendOOBMessages(&miniPunchRequest); + miniPunchesInProgressMutex.Lock(); + miniPunchesInProgress.Push(miniPunchRequest,_FILE_AND_LINE_); + miniPunchesInProgressMutex.Unlock(); + } +} +void Router2::OnMiniPunchReplyBounce(Packet *packet) +{ + // Find stored punch request + unsigned int i=0; + + if (debugInterface) + { + char buff[512]; + debugInterface->ShowDiagnostic(FormatStringTS(buff,"Got ID_ROUTER_2_MINI_PUNCH_REPLY_BOUNCE from guid=%I64d (miniPunchesInProgress.Size() = %d)", + packet->guid.g, miniPunchesInProgress.Size())); + } + + miniPunchesInProgressMutex.Lock(); + while (i < miniPunchesInProgress.Size()) + { + if (miniPunchesInProgress[i].sourceGuid==packet->guid || miniPunchesInProgress[i].endpointGuid==packet->guid) + { + if (miniPunchesInProgress[i].sourceGuid==packet->guid) + miniPunchesInProgress[i].gotReplyFromSource=true; + if (miniPunchesInProgress[i].endpointGuid==packet->guid) + miniPunchesInProgress[i].gotReplyFromEndpoint=true; + + if (debugInterface) + { + char buff[512]; + debugInterface->ShowDiagnostic(FormatStringTS(buff,"Processing ID_ROUTER_2_MINI_PUNCH_REPLY_BOUNCE, gotReplyFromSource=%i gotReplyFromEndpoint=%i at %s:%i\n", miniPunchesInProgress[i].gotReplyFromSource, miniPunchesInProgress[i].gotReplyFromEndpoint, __FILE__, __LINE__)); + } + + if (miniPunchesInProgress[i].gotReplyFromEndpoint==true && + miniPunchesInProgress[i].gotReplyFromSource==true) + { + SendForwardingSuccess(ID_ROUTER_2_REROUTED, miniPunchesInProgress[i].endpointGuid, miniPunchesInProgress[i].sourceGuid, miniPunchesInProgress[i].forwardingPort); + SendForwardingSuccess(ID_ROUTER_2_FORWARDING_ESTABLISHED, miniPunchesInProgress[i].sourceGuid, miniPunchesInProgress[i].endpointGuid, miniPunchesInProgress[i].forwardingPort); + miniPunchesInProgress.RemoveAtIndexFast(i); + } + else + { + i++; + } + } + else + i++; + } + miniPunchesInProgressMutex.Unlock(); +} +void Router2::OnMiniPunchReply(Packet *packet) +{ + RakNet::BitStream bs(packet->data, packet->length, false); + bs.IgnoreBytes(sizeof(MessageID) + sizeof(unsigned char)); + RakNetGUID routerGuid; + bs.Read(routerGuid); + SendOOBFromRakNetPort(ID_ROUTER_2_MINI_PUNCH_REPLY_BOUNCE, 0, rakPeerInterface->GetSystemAddressFromGuid(routerGuid)); + + if (debugInterface) + { + char buff[512]; + + char buff2[512]; + + rakPeerInterface->GetSystemAddressFromGuid(routerGuid).ToString(true,buff2); + + debugInterface->ShowDiagnostic(FormatStringTS(buff,"Sending ID_ROUTER_2_MINI_PUNCH_REPLY_BOUNCE (%s) at %s:%i\n", buff2, __FILE__, __LINE__)); + } +} +void Router2::OnRerouted(Packet *packet) +{ + RakNet::BitStream bs(packet->data, packet->length, false); + bs.IgnoreBytes(sizeof(MessageID)); + RakNetGUID endpointGuid; + bs.Read(endpointGuid); + unsigned short sourceToDestPort; + bs.Read(sourceToDestPort); + + // Return rerouted notice + SystemAddress intermediaryAddress=packet->systemAddress; + intermediaryAddress.SetPort(sourceToDestPort); + rakPeerInterface->ChangeSystemAddress(endpointGuid, intermediaryAddress); + + unsigned int forwardingIndex; + forwardedConnectionListMutex.Lock(); + for (forwardingIndex=0; forwardingIndex < forwardedConnectionList.Size(); forwardingIndex++) + { + if (forwardedConnectionList[forwardingIndex].endpointGuid==endpointGuid) + break; + } + + if (forwardingIndexsystemAddress; + ref_fc.intermediaryAddress.SetPort(sourceToDestPort); + ref_fc.intermediaryGuid = packet->guid; + + rakPeerInterface->ChangeSystemAddress(endpointGuid, intermediaryAddress); + + if (debugInterface) + { + char buff[512]; + debugInterface->ShowDiagnostic(FormatStringTS(buff,"FIX: Got ID_ROUTER_2_REROUTE, returning ID_ROUTER_2_REROUTED," + " Calling RakPeer::ChangeSystemAddress(%I64d, %s) at %s:%i\n",endpointGuid.g, intermediaryAddress.ToString(true), __FILE__, __LINE__)); + } + } + else + { + ForwardedConnection fc; + fc.endpointGuid=endpointGuid; + fc.intermediaryAddress=packet->systemAddress; + fc.intermediaryAddress.SetPort(sourceToDestPort); + fc.intermediaryGuid=packet->guid; + fc.weInitiatedForwarding=false; + // add to forwarding list. This is only here to avoid reporting direct connections in Router2::ReturnFailureOnCannotForward + forwardedConnectionList.Push (fc,__FILE__, __LINE__); + forwardedConnectionListMutex.Unlock(); + + rakPeerInterface->ChangeSystemAddress(endpointGuid, intermediaryAddress); + + if (debugInterface) + { + char buff[512]; + debugInterface->ShowDiagnostic(FormatStringTS(buff,"Got ID_ROUTER_2_REROUTE, returning ID_ROUTER_2_REROUTED, Calling RakPeer::ChangeSystemAddress at %s:%i\n", __FILE__, __LINE__)); + } + } + +} +bool Router2::OnForwardingSuccess(Packet *packet) +{ + RakNet::BitStream bs(packet->data, packet->length, false); + bs.IgnoreBytes(sizeof(MessageID)); + RakNetGUID endpointGuid; + bs.Read(endpointGuid); + unsigned short sourceToDestPort; + bs.Read(sourceToDestPort); + + unsigned int forwardingIndex; + forwardedConnectionListMutex.Lock(); + for (forwardingIndex=0; forwardingIndex < forwardedConnectionList.Size(); forwardingIndex++) + { + if (forwardedConnectionList[forwardingIndex].endpointGuid==endpointGuid) + break; + } + + if (forwardingIndexsystemAddress; + intermediaryAddress.SetPort(sourceToDestPort); + rakPeerInterface->ChangeSystemAddress(endpointGuid, intermediaryAddress); + + //////////////////////////////////////////////////////////////////////////// + ForwardedConnection& ref_fc = forwardedConnectionList[forwardingIndex]; + ref_fc.intermediaryAddress = packet->systemAddress; + ref_fc.intermediaryAddress.SetPort(sourceToDestPort); + ref_fc.intermediaryGuid = packet->guid; + //////////////////////////////////////////////////////////////////////////// + + if (debugInterface) + { + char buff[512]; + debugInterface->ShowDiagnostic(FormatStringTS(buff,"Got ID_ROUTER_2_FORWARDING_ESTABLISHED, returning ID_ROUTER_2_REROUTED, Calling RakPeer::ChangeSystemAddress at %s:%i\n", _FILE_AND_LINE_)); + } + + packet->data[0]=ID_ROUTER_2_REROUTED; + + forwardedConnectionListMutex.Unlock(); + return true; // Return packet to user + } + else + { + forwardedConnectionListMutex.Unlock(); + + // removeFrom connectionRequests; + ForwardedConnection fc; + connectionRequestsMutex.Lock(); + unsigned int connectionRequestIndex = GetConnectionRequestIndex(endpointGuid); + fc.returnConnectionLostOnFailure=connectionRequests[connectionRequestIndex]->returnConnectionLostOnFailure; + connectionRequests.RemoveAtIndexFast(connectionRequestIndex); + connectionRequestsMutex.Unlock(); + fc.endpointGuid=endpointGuid; + fc.intermediaryAddress=packet->systemAddress; + fc.intermediaryAddress.SetPort(sourceToDestPort); + fc.intermediaryGuid=packet->guid; + fc.weInitiatedForwarding=true; + + // add to forwarding list + forwardedConnectionListMutex.Lock(); + forwardedConnectionList.Push (fc,_FILE_AND_LINE_); + forwardedConnectionListMutex.Unlock(); + + if (debugInterface) + { + char buff[512]; + debugInterface->ShowDiagnostic(FormatStringTS(buff,"Got and returning to user ID_ROUTER_2_FORWARDING_ESTABLISHED at %s:%i\n", _FILE_AND_LINE_)); + } + + } + return true; // Return packet to user +} +int Router2::GetLargestPingAmongConnectedSystems(void) const +{ + int avePing; + int largestPing=-1; + unsigned short maxPeers = rakPeerInterface->GetMaximumNumberOfPeers(); + if (maxPeers==0) + return 9999; + unsigned short index; + for (index=0; index < rakPeerInterface->GetMaximumNumberOfPeers(); index++) + { + RakNetGUID g = rakPeerInterface->GetGUIDFromIndex(index); + if (g!=UNASSIGNED_RAKNET_GUID) + { + avePing=rakPeerInterface->GetAveragePing(rakPeerInterface->GetGUIDFromIndex(index)); + if (avePing>largestPing) + largestPing=avePing; + } + } + return largestPing; +} + +unsigned int Router2::GetConnectionRequestIndex(RakNetGUID endpointGuid) +{ + unsigned int i; + for (i=0; i < connectionRequests.Size(); i++) + { + if (connectionRequests[i]->endpointGuid==endpointGuid) + return i; + } + return (unsigned int) -1; +} +unsigned int Router2::ConnnectRequest::GetGuidIndex(RakNetGUID guid) +{ + unsigned int i; + for (i=0; i < connectionRequestSystems.Size(); i++) + { + if (connectionRequestSystems[i].guid==guid) + return i; + } + return (unsigned int) -1; +} +void Router2::ReturnToUser(MessageID messageId, RakNetGUID endpointGuid, const SystemAddress &systemAddress, bool wasGeneratedLocally) +{ + Packet *p = AllocatePacketUnified(sizeof(MessageID)+sizeof(unsigned char)); + p->data[0]=messageId; + p->systemAddress=systemAddress; + p->systemAddress.systemIndex=(SystemIndex)-1; + p->guid=endpointGuid; + p->wasGeneratedLocally=wasGeneratedLocally; + rakPeerInterface->PushBackPacket(p, true); +} +void Router2::ClearForwardedConnections(void) +{ + forwardedConnectionListMutex.Lock(); + forwardedConnectionList.Clear(false,_FILE_AND_LINE_); + forwardedConnectionListMutex.Unlock(); +} +void Router2::ClearAll(void) +{ + ClearConnectionRequests(); + ClearMinipunches(); + ClearForwardedConnections(); +} +void Router2::SetDebugInterface(Router2DebugInterface *_debugInterface) +{ + debugInterface=_debugInterface; +} +Router2DebugInterface *Router2::GetDebugInterface(void) const +{ + return debugInterface; +} + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Router2.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Router2.h new file mode 100644 index 0000000..7912da5 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/Router2.h @@ -0,0 +1,195 @@ +/// \file +/// \brief Router2 plugin. Allows you to connect to a system by routing packets through another system that is connected to both you and the destination. Useful for getting around NATs. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_Router2==1 && _RAKNET_SUPPORT_UDPForwarder==1 + +#ifndef __ROUTER_2_PLUGIN_H +#define __ROUTER_2_PLUGIN_H + +#include "RakNetTypes.h" +#include "PluginInterface2.h" +#include "PacketPriority.h" +#include "Export.h" +#include "UDPForwarder.h" +#include "MessageIdentifiers.h" +#include "DS_List.h" +#include "SimpleMutex.h" + +namespace RakNet +{ +/// Forward declarations +class RakPeerInterface; + +struct Router2DebugInterface +{ + Router2DebugInterface() {} + virtual ~Router2DebugInterface() {} + virtual void ShowFailure(const char *message); + virtual void ShowDiagnostic(const char *message); +}; + +/// \defgroup ROUTER_2_GROUP Router2 +/// \brief Part of the NAT punchthrough solution, allowing you to connect to systems by routing through a shared connection. +/// \details Router2 routes datagrams between two systems that are not directly connected by using the bandwidth of a third system, to which the other two systems were connected +/// It is of benefit when a fully connected mesh topology is desired, but could not be completely established due to routers and/or firewalls +/// As the system address of a remote system will be the system address of the intermediary, it is necessary to use the RakNetGUID object to refer to systems, including with other plugins +/// \ingroup PLUGINS_GROUP + +/// \ingroup ROUTER_2_GROUP +/// \brief Class interface for the Router2 system +/// \details +class RAK_DLL_EXPORT Router2 : public PluginInterface2 +{ +public: + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(Router2) + + Router2(); + virtual ~Router2(); + + /// Sets the socket family to use, either IPV4 or IPV6 + /// \param[in] socketFamily For IPV4, use AF_INET (default). For IPV6, use AF_INET6. To autoselect, use AF_UNSPEC. + void SetSocketFamily(unsigned short _socketFamily); + + /// \brief Query all connected systems to connect through them to a third system. + /// System will return ID_ROUTER_2_FORWARDING_NO_PATH if unable to connect. + /// Else you will get ID_ROUTER_2_FORWARDING_ESTABLISHED + /// + /// On ID_ROUTER_2_FORWARDING_ESTABLISHED, EstablishRouting as follows: + /// + /// RakNet::BitStream bs(packet->data, packet->length, false); + /// bs.IgnoreBytes(sizeof(MessageID)); + /// RakNetGUID endpointGuid; + /// bs.Read(endpointGuid); + /// unsigned short sourceToDestPort; + /// bs.Read(sourceToDestPort); + /// char ipAddressString[32]; + /// packet->systemAddress.ToString(false, ipAddressString); + /// rakPeerInterface->EstablishRouting(ipAddressString, sourceToDestPort, 0,0); + /// + /// \note The SystemAddress for a connection should not be used - always use RakNetGuid as the address can change at any time. + /// When the address changes, you will get ID_ROUTER_2_REROUTED + void EstablishRouting(RakNetGUID endpointGuid); + + /// Set the maximum number of bidirectional connections this system will support + /// Defaults to 0 + void SetMaximumForwardingRequests(int max); + + /// For testing and debugging + void SetDebugInterface(Router2DebugInterface *_debugInterface); + + /// Get the pointer passed to SetDebugInterface() + Router2DebugInterface *GetDebugInterface(void) const; + + // -------------------------------------------------------------------------------------------- + // Packet handling functions + // -------------------------------------------------------------------------------------------- + virtual PluginReceiveResult OnReceive(Packet *packet); + virtual void Update(void); + virtual void OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ); + virtual void OnFailedConnectionAttempt(Packet *packet, PI2_FailedConnectionAttemptReason failedConnectionAttemptReason); + virtual void OnRakPeerShutdown(void); + + + enum Router2RequestStates + { + R2RS_REQUEST_STATE_QUERY_FORWARDING, + REQUEST_STATE_REQUEST_FORWARDING, + }; + + struct ConnectionRequestSystem + { + RakNetGUID guid; + int pingToEndpoint; + unsigned short usedForwardingEntries; + }; + + struct ConnnectRequest + { + ConnnectRequest(); + ~ConnnectRequest(); + + DataStructures::List connectionRequestSystems; + SimpleMutex connectionRequestSystemsMutex; + Router2RequestStates requestState; + RakNet::TimeMS pingTimeout; + RakNetGUID endpointGuid; + RakNetGUID lastRequestedForwardingSystem; + bool returnConnectionLostOnFailure; + unsigned int GetGuidIndex(RakNetGUID guid); + }; + + unsigned int GetConnectionRequestIndex(RakNetGUID endpointGuid); + + struct MiniPunchRequest + { + RakNetGUID endpointGuid; + SystemAddress endpointAddress; + bool gotReplyFromEndpoint; + RakNetGUID sourceGuid; + SystemAddress sourceAddress; + bool gotReplyFromSource; + RakNet::TimeMS timeout; + RakNet::TimeMS nextAction; + unsigned short forwardingPort; + SOCKET forwardingSocket; + }; + + struct ForwardedConnection + { + RakNetGUID endpointGuid; + RakNetGUID intermediaryGuid; + SystemAddress intermediaryAddress; + bool returnConnectionLostOnFailure; + bool weInitiatedForwarding; + }; + +protected: + + bool UpdateForwarding(ConnnectRequest* connectionRequest); + void RemoveConnectionRequest(unsigned int connectionRequestIndex); + void RequestForwarding(ConnnectRequest* connectionRequest); + void OnQueryForwarding(Packet *packet); + void OnQueryForwardingReply(Packet *packet); + void OnRequestForwarding(Packet *packet); + void OnRerouted(Packet *packet); + void OnMiniPunchReply(Packet *packet); + void OnMiniPunchReplyBounce(Packet *packet); + bool OnForwardingSuccess(Packet *packet); + int GetLargestPingAmongConnectedSystems(void) const; + void ReturnToUser(MessageID messageId, RakNetGUID endpointGuid, const SystemAddress &systemAddress, bool wasGeneratedLocally); + bool ConnectInternal(RakNetGUID endpointGuid, bool returnConnectionLostOnFailure); + + UDPForwarder *udpForwarder; + int maximumForwardingRequests; + SimpleMutex connectionRequestsMutex, miniPunchesInProgressMutex, forwardedConnectionListMutex; + DataStructures::List connectionRequests; + DataStructures::List miniPunchesInProgress; + // Forwarding we have initiated + DataStructures::List forwardedConnectionList; + + void ClearConnectionRequests(void); + void ClearMinipunches(void); + void ClearForwardedConnections(void); + void ClearAll(void); + int ReturnFailureOnCannotForward(RakNetGUID sourceGuid, RakNetGUID endpointGuid); + void SendFailureOnCannotForward(RakNetGUID sourceGuid, RakNetGUID endpointGuid); + void SendForwardingSuccess(MessageID messageId, RakNetGUID sourceGuid, RakNetGUID endpointGuid, unsigned short sourceToDstPort); + void SendOOBFromRakNetPort(OutOfBandIdentifiers oob, BitStream *extraData, SystemAddress sa); + void SendOOBFromSpecifiedSocket(OutOfBandIdentifiers oob, SystemAddress sa, SOCKET socket); + void SendOOBMessages(MiniPunchRequest *mpr); + + Router2DebugInterface *debugInterface; + unsigned short socketFamily; +}; + +} + +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SHA1.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SHA1.cpp new file mode 100644 index 0000000..fbfe7d0 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SHA1.cpp @@ -0,0 +1,326 @@ +/** +* @brief SHA-1 Hash key computation +* +* 100% free public domain implementation of the SHA-1 +* algorithm by Dominik Reichl +* +* +* === Test Vectors (from FIPS PUB 180-1) === +* +* "abc" +* A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D +* +* "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" +* 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 +* +* A million repetitions of "a" +* 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F +*/ + + +#include "SHA1.h" +#include + + +CSHA1::CSHA1() +{ + Reset(); +} + +CSHA1::~CSHA1() +{ + Reset(); +} + + +void CSHA1::Reset() +{ + // SHA1 initialization constants + m_state[ 0 ] = 0x67452301; + m_state[ 1 ] = 0xEFCDAB89; + m_state[ 2 ] = 0x98BADCFE; + m_state[ 3 ] = 0x10325476; + m_state[ 4 ] = 0xC3D2E1F0; + + m_count[ 0 ] = 0; + m_count[ 1 ] = 0; +} + +void CSHA1::Transform( unsigned int state[ 5 ], unsigned char buffer[ 64 ] ) +{ + unsigned int a = 0, b = 0, c = 0, d = 0, e = 0; + + SHA1_WORKSPACE_BLOCK* block; + // static unsigned char workspace[64]; + block = ( SHA1_WORKSPACE_BLOCK * ) workspace; + memcpy( block, buffer, 64 ); + + // Copy state[] to working vars + a = state[ 0 ]; + b = state[ 1 ]; + c = state[ 2 ]; + d = state[ 3 ]; + e = state[ 4 ]; + + // 4 rounds of 20 operations each. Loop unrolled. + R0( a, b, c, d, e, 0 ); + R0( e, a, b, c, d, 1 ); + R0( d, e, a, b, c, 2 ); + R0( c, d, e, a, b, 3 ); + R0( b, c, d, e, a, 4 ); + R0( a, b, c, d, e, 5 ); + R0( e, a, b, c, d, 6 ); + R0( d, e, a, b, c, 7 ); + R0( c, d, e, a, b, 8 ); + R0( b, c, d, e, a, 9 ); + R0( a, b, c, d, e, 10 ); + R0( e, a, b, c, d, 11 ); + R0( d, e, a, b, c, 12 ); + R0( c, d, e, a, b, 13 ); + R0( b, c, d, e, a, 14 ); + R0( a, b, c, d, e, 15 ); + R1( e, a, b, c, d, 16 ); + R1( d, e, a, b, c, 17 ); + R1( c, d, e, a, b, 18 ); + R1( b, c, d, e, a, 19 ); + R2( a, b, c, d, e, 20 ); + R2( e, a, b, c, d, 21 ); + R2( d, e, a, b, c, 22 ); + R2( c, d, e, a, b, 23 ); + R2( b, c, d, e, a, 24 ); + R2( a, b, c, d, e, 25 ); + R2( e, a, b, c, d, 26 ); + R2( d, e, a, b, c, 27 ); + R2( c, d, e, a, b, 28 ); + R2( b, c, d, e, a, 29 ); + R2( a, b, c, d, e, 30 ); + R2( e, a, b, c, d, 31 ); + R2( d, e, a, b, c, 32 ); + R2( c, d, e, a, b, 33 ); + R2( b, c, d, e, a, 34 ); + R2( a, b, c, d, e, 35 ); + R2( e, a, b, c, d, 36 ); + R2( d, e, a, b, c, 37 ); + R2( c, d, e, a, b, 38 ); + R2( b, c, d, e, a, 39 ); + R3( a, b, c, d, e, 40 ); + R3( e, a, b, c, d, 41 ); + R3( d, e, a, b, c, 42 ); + R3( c, d, e, a, b, 43 ); + R3( b, c, d, e, a, 44 ); + R3( a, b, c, d, e, 45 ); + R3( e, a, b, c, d, 46 ); + R3( d, e, a, b, c, 47 ); + R3( c, d, e, a, b, 48 ); + R3( b, c, d, e, a, 49 ); + R3( a, b, c, d, e, 50 ); + R3( e, a, b, c, d, 51 ); + R3( d, e, a, b, c, 52 ); + R3( c, d, e, a, b, 53 ); + R3( b, c, d, e, a, 54 ); + R3( a, b, c, d, e, 55 ); + R3( e, a, b, c, d, 56 ); + R3( d, e, a, b, c, 57 ); + R3( c, d, e, a, b, 58 ); + R3( b, c, d, e, a, 59 ); + R4( a, b, c, d, e, 60 ); + R4( e, a, b, c, d, 61 ); + R4( d, e, a, b, c, 62 ); + R4( c, d, e, a, b, 63 ); + R4( b, c, d, e, a, 64 ); + R4( a, b, c, d, e, 65 ); + R4( e, a, b, c, d, 66 ); + R4( d, e, a, b, c, 67 ); + R4( c, d, e, a, b, 68 ); + R4( b, c, d, e, a, 69 ); + R4( a, b, c, d, e, 70 ); + R4( e, a, b, c, d, 71 ); + R4( d, e, a, b, c, 72 ); + R4( c, d, e, a, b, 73 ); + R4( b, c, d, e, a, 74 ); + R4( a, b, c, d, e, 75 ); + R4( e, a, b, c, d, 76 ); + R4( d, e, a, b, c, 77 ); + R4( c, d, e, a, b, 78 ); + R4( b, c, d, e, a, 79 ); + + // Add the working vars back into state[] + state[ 0 ] += a; + state[ 1 ] += b; + state[ 2 ] += c; + state[ 3 ] += d; + state[ 4 ] += e; + + // Wipe variables + a = 0; + b = 0; + c = 0; + d = 0; + e = 0; +} + +// Use this function to hash in binary data and strings +void CSHA1::Update( unsigned char* data, unsigned int len ) +{ + unsigned int i = 0, j = 0; + + j = ( m_count[ 0 ] >> 3 ) & 63; + + if ( ( m_count[ 0 ] += len << 3 ) < ( len << 3 ) ) + m_count[ 1 ] ++; + + m_count[ 1 ] += ( len >> 29 ); + + if ( ( j + len ) > 63 ) + { + memcpy( &m_buffer[ j ], data, ( i = 64 - j ) ); + Transform( m_state, m_buffer ); + + for ( ; i + 63 < len; i += 64 ) + { + Transform( m_state, &data[ i ] ); + } + + j = 0; + } + + else + i = 0; + + memcpy( &m_buffer[ j ], &data[ i ], len - i ); +} + +// Hash in file contents +bool CSHA1::HashFile( char *szFileName ) +{ + unsigned long ulFileSize = 0, ulRest = 0, ulBlocks = 0; + unsigned long i = 0; + unsigned char uData[ MAX_FILE_READ_BUFFER ]; + FILE *fIn = NULL; + + if ( ( fIn = fopen( szFileName, "rb" ) ) == NULL ) + return ( false ); + + fseek( fIn, 0, SEEK_END ); + + ulFileSize = ftell( fIn ); + + fseek( fIn, 0, SEEK_SET ); + + // This is faster + div_t temp; + + temp = div( ulFileSize, MAX_FILE_READ_BUFFER ); + + ulRest = temp.rem; + + ulBlocks = temp.quot; + + // ulRest = ulFileSize % MAX_FILE_READ_BUFFER; + // ulBlocks = ulFileSize / MAX_FILE_READ_BUFFER; + + for ( i = 0; i < ulBlocks; i++ ) + { + fread( uData, 1, MAX_FILE_READ_BUFFER, fIn ); + Update( uData, MAX_FILE_READ_BUFFER ); + } + + if ( ulRest != 0 ) + { + fread( uData, 1, ulRest, fIn ); + Update( uData, ulRest ); + } + + fclose( fIn ); + fIn = NULL; + + return ( true ); +} + +void CSHA1::Final() +{ + unsigned int i = 0; + unsigned char finalcount[ 8 ] = + { + 0, 0, 0, 0, 0, 0, 0, 0 + }; + + for ( i = 0; i < 8; i++ ) + finalcount[ i ] = (unsigned char) ( ( m_count[ ( i >= 4 ? 0 : 1 ) ] + >> ( ( 3 - ( i & 3 ) ) * 8 ) ) & 255 ); // Endian independent + + Update( ( unsigned char * ) "\200", 1 ); + + while ( ( m_count[ 0 ] & 504 ) != 448 ) + Update( ( unsigned char * ) "\0", 1 ); + + Update( finalcount, 8 ); // Cause a SHA1Transform() + + for ( i = 0; i < 20; i++ ) + { + m_digest[ i ] = (unsigned char) ( ( m_state[ i >> 2 ] >> ( ( 3 - ( i & 3 ) ) * 8 ) ) & 255 ); + } + + // Wipe variables for security reasons + i = 0; + +// j = 0; + + memset( m_buffer, 0, 64 ); + + memset( m_state, 0, 20 ); + + memset( m_count, 0, 8 ); + + memset( finalcount, 0, 8 ); + + Transform( m_state, m_buffer ); +} + +// Get the final hash as a pre-formatted string +void CSHA1::ReportHash( char *szReport, unsigned char uReportType ) +{ + unsigned char i = 0; + char szTemp[ 4 ]; + + if ( uReportType == REPORT_HEX ) + { + sprintf( szTemp, "%02X", m_digest[ 0 ] ); + strcat( szReport, szTemp ); + + for ( i = 1; i < 20; i++ ) + { + sprintf( szTemp, " %02X", m_digest[ i ] ); + strcat( szReport, szTemp ); + } + } + + else + if ( uReportType == REPORT_DIGIT ) + { + sprintf( szTemp, "%u", m_digest[ 0 ] ); + strcat( szReport, szTemp ); + + for ( i = 1; i < 20; i++ ) + { + sprintf( szTemp, " %u", m_digest[ i ] ); + strcat( szReport, szTemp ); + } + } + + else + strcpy( szReport, "Error: Unknown report type!" ); +} + +// Get the raw message digest +void CSHA1::GetHash( unsigned char *uDest ) +{ + memcpy( uDest, m_digest, 20 ); +} + +// Get the raw message digest +// Added by Kevin to be quicker +unsigned char * CSHA1::GetHash( void ) const +{ + return ( unsigned char * ) m_digest; +} diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SHA1.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SHA1.h new file mode 100644 index 0000000..bac7e70 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SHA1.h @@ -0,0 +1,87 @@ +/// \brief \b [Internal] SHA-1 computation class +/// +/// 100% free public domain implementation of the SHA-1 +/// algorithm by Dominik Reichl +/// +/// +/// === Test Vectors (from FIPS PUB 180-1) === +/// +/// "abc" +/// A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D +/// +/// "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" +/// 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 +/// +/// A million repetitions of "a" +/// 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F + +#ifndef ___SHA1_H___ +#define ___SHA1_H___ + +#include "RakMemoryOverride.h" +#include // Needed for file access + +#include // Needed for memset and memcpy + +#include // Needed for strcat and strcpy +#include "Export.h" + +#define MAX_FILE_READ_BUFFER 8000 + +#define SHA1_LENGTH 20 + +class RAK_DLL_EXPORT CSHA1 +{ + +public: + // Rotate x bits to the left + #define ROL32(value, bits) (((value)<<(bits))|((value)>>(32-(bits)))) + +#ifdef LITTLE_ENDIAN +#define SHABLK0(i) (block->l[i] = (ROL32(block->l[i],24) & 0xFF00FF00) \ + | (ROL32(block->l[i],8) & 0x00FF00FF)) +#else +#define SHABLK0(i) (block->l[i]) +#endif + +#define SHABLK(i) (block->l[i&15] = ROL32(block->l[(i+13)&15] ^ block->l[(i+8)&15] \ + ^ block->l[(i+2)&15] ^ block->l[i&15],1)) + + // SHA-1 rounds +#define R0(v,w,x,y,z,i) { z+=((w&(x^y))^y)+SHABLK0(i)+0x5A827999+ROL32(v,5); w=ROL32(w,30); } +#define R1(v,w,x,y,z,i) { z+=((w&(x^y))^y)+SHABLK(i)+0x5A827999+ROL32(v,5); w=ROL32(w,30); } +#define R2(v,w,x,y,z,i) { z+=(w^x^y)+SHABLK(i)+0x6ED9EBA1+ROL32(v,5); w=ROL32(w,30); } +#define R3(v,w,x,y,z,i) { z+=(((w|x)&y)|(w&x))+SHABLK(i)+0x8F1BBCDC+ROL32(v,5); w=ROL32(w,30); } +#define R4(v,w,x,y,z,i) { z+=(w^x^y)+SHABLK(i)+0xCA62C1D6+ROL32(v,5); w=ROL32(w,30); } + + typedef union { + unsigned char c[ 64 ]; + unsigned int l[ 16 ]; + } SHA1_WORKSPACE_BLOCK; + /* Two different formats for ReportHash(...) + */ + enum { REPORT_HEX = 0, + REPORT_DIGIT = 1}; + + CSHA1(); + virtual ~CSHA1(); + + unsigned int m_state[ 5 ]; + unsigned int m_count[ 2 ]; + unsigned char m_buffer[ 64 ]; + unsigned char m_digest[ 20 ]; + void Reset(); + void Update( unsigned char* data, unsigned int len ); + bool HashFile( char *szFileName ); + void Final(); + void ReportHash( char *szReport, unsigned char uReportType = REPORT_HEX ); + void GetHash( unsigned char *uDest ); + unsigned char * GetHash( void ) const; + +private: + void Transform( unsigned int state[ 5 ], unsigned char buffer[ 64 ] ); + unsigned char workspace[ 64 ]; +}; + +#endif // ___SHA1_H___ + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SecureHandshake.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SecureHandshake.cpp new file mode 100644 index 0000000..2c44168 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SecureHandshake.cpp @@ -0,0 +1,54 @@ +/// \file +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" + +#if LIBCAT_SECURITY==1 + +// If building a RakNet DLL, be sure to tweak the CAT_EXPORT macro meaning +#if !defined(_RAKNET_LIB) && defined(_RAKNET_DLL) +# define CAT_BUILD_DLL +#else +# define CAT_NEUTER_EXPORT +#endif + +#include "cat/src/port/EndianNeutral.cpp" +#include "cat/src/port/AlignedAlloc.cpp" +#include "cat/src/time/Clock.cpp" +#include "cat/src/threads/Mutex.cpp" +#include "cat/src/threads/Thread.cpp" +#include "cat/src/threads/WaitableFlag.cpp" +#include "cat/src/hash/MurmurHash2.cpp" +#include "cat/src/lang/Strings.cpp" + +#include "cat/src/math/BigRTL.cpp" +#include "cat/src/math/BigPseudoMersenne.cpp" +#include "cat/src/math/BigTwistedEdwards.cpp" + +#include "cat/src/crypt/SecureCompare.cpp" +#include "cat/src/crypt/cookie/CookieJar.cpp" +#include "cat/src/crypt/hash/HMAC_MD5.cpp" +#include "cat/src/crypt/privatekey/ChaCha.cpp" +#include "cat/src/crypt/hash/Skein.cpp" +#include "cat/src/crypt/hash/Skein256.cpp" +#include "cat/src/crypt/hash/Skein512.cpp" +#include "cat/src/crypt/pass/Passwords.cpp" + +#include "cat/src/crypt/rand/EntropyWindows.cpp" +#include "cat/src/crypt/rand/EntropyLinux.cpp" +#include "cat/src/crypt/rand/EntropyWindowsCE.cpp" +#include "cat/src/crypt/rand/EntropyGeneric.cpp" +#include "cat/src/crypt/rand/Fortuna.cpp" + +#include "cat/src/crypt/tunnel/KeyAgreement.cpp" +#include "cat/src/crypt/tunnel/AuthenticatedEncryption.cpp" +#include "cat/src/crypt/tunnel/KeyAgreementInitiator.cpp" +#include "cat/src/crypt/tunnel/KeyAgreementResponder.cpp" +#include "cat/src/crypt/tunnel/KeyMaker.cpp" + +#include "cat/src/crypt/tunnel/EasyHandshake.cpp" + +#endif // LIBCAT_SECURITY diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SecureHandshake.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SecureHandshake.h new file mode 100644 index 0000000..ce1ffe6 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SecureHandshake.h @@ -0,0 +1,25 @@ +/// \file +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#ifndef SECURE_HANDSHAKE_H +#define SECURE_HANDSHAKE_H + +#include "NativeFeatureIncludes.h" + +#if LIBCAT_SECURITY==1 + +// If building a RakNet DLL, be sure to tweak the CAT_EXPORT macro meaning +#if !defined(_RAKNET_LIB) && defined(_RAKNET_DLL) +# define CAT_BUILD_DLL +#else +# define CAT_NEUTER_EXPORT +#endif + +#include "cat/AllTunnel.hpp" + +#endif // LIBCAT_SECURITY + +#endif // SECURE_HANDSHAKE_H diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SendToThread.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SendToThread.cpp new file mode 100644 index 0000000..127c7b8 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SendToThread.cpp @@ -0,0 +1,77 @@ +#include "SendToThread.h" +#ifdef USE_THREADED_SEND +#include "RakThread.h" +#include "InternalPacket.h" +#include "GetTime.h" + +#if USE_SLIDING_WINDOW_CONGESTION_CONTROL!=1 +#include "CCRakNetUDT.h" +#else +#include "CCRakNetSlidingWindow.h" +#endif + +using namespace RakNet; + +int SendToThread::refCount=0; +DataStructures::ThreadsafeAllocatingQueue SendToThread::objectQueue; +ThreadPool SendToThread::threadPool; + +SendToThread::SendToThreadBlock* SendToWorkerThread(SendToThread::SendToThreadBlock* input, bool *returnOutput, void* perThreadData) +{ + (void) perThreadData; + *returnOutput=false; +// RakNet::TimeUS *mostRecentTime=(RakNet::TimeUS *)input->data; +// *mostRecentTime=RakNet::GetTimeUS(); + SocketLayer::SendTo(input->s, input->data, input->dataWriteOffset, input->systemAddress, input->remotePortRakNetWasStartedOn_PS3, input->extraSocketOptions, _FILE_AND_LINE_); + SendToThread::objectQueue.Push(input); + return 0; +} +SendToThread::SendToThread() +{ +} +SendToThread::~SendToThread() +{ + +} +void SendToThread::AddRef(void) +{ + if (++refCount==1) + { + threadPool.StartThreads(1,0); + } +} +void SendToThread::Deref(void) +{ + if (refCount>0) + { + if (--refCount==0) + { + threadPool.StopThreads(); + RakAssert(threadPool.NumThreadsWorking()==0); + + unsigned i; + SendToThreadBlock* info; + for (i=0; i < threadPool.InputSize(); i++) + { + info = threadPool.GetInputAtIndex(i); + objectQueue.Push(info); + } + threadPool.ClearInput(); + objectQueue.Clear(_FILE_AND_LINE_); + } + } +} +SendToThread::SendToThreadBlock* SendToThread::AllocateBlock(void) +{ + SendToThread::SendToThreadBlock *b; + b=objectQueue.Pop(); + if (b==0) + b=objectQueue.Allocate(_FILE_AND_LINE_); + return b; +} +void SendToThread::ProcessBlock(SendToThread::SendToThreadBlock* threadedSend) +{ + RakAssert(threadedSend->dataWriteOffset>0 && threadedSend->dataWriteOffset<=MAXIMUM_MTU_SIZE-UDP_HEADER_SIZE); + threadPool.AddInput(SendToWorkerThread,threadedSend); +} +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SendToThread.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SendToThread.h new file mode 100644 index 0000000..df1bb51 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SendToThread.h @@ -0,0 +1,47 @@ +#ifndef __SENDTO_THREAD +#define __SENDTO_THREAD + +#include "RakNetDefines.h" + +#ifdef USE_THREADED_SEND + +#include "InternalPacket.h" +#include "SocketLayer.h" +#include "DS_ThreadsafeAllocatingQueue.h" +#include "ThreadPool.h" + +namespace RakNet +{ +class SendToThread +{ +public: + SendToThread(); + ~SendToThread(); + + struct SendToThreadBlock + { + SOCKET s; + SystemAddress systemAddress; + unsigned short remotePortRakNetWasStartedOn_PS3; + unsigned int extraSocketOptions; + char data[MAXIMUM_MTU_SIZE]; + unsigned short dataWriteOffset; + }; + + static SendToThreadBlock* AllocateBlock(void); + static void ProcessBlock(SendToThreadBlock* threadedSend); + + static void AddRef(void); + static void Deref(void); + static DataStructures::ThreadsafeAllocatingQueue objectQueue; +protected: + static int refCount; + static ThreadPool threadPool; + +}; +} + + +#endif + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SignaledEvent.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SignaledEvent.cpp new file mode 100644 index 0000000..b22599f --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SignaledEvent.cpp @@ -0,0 +1,245 @@ +#include "SignaledEvent.h" +#include "RakAssert.h" +#include "RakSleep.h" + +#if defined(__GNUC__) +#include +#include +#endif + +using namespace RakNet; + + + + + +SignaledEvent::SignaledEvent() +{ +#ifdef _WIN32 + eventList=INVALID_HANDLE_VALUE; + + +#else + isSignaled=false; +#endif +} +SignaledEvent::~SignaledEvent() +{ + // Intentionally do not close event, so it doesn't close twice on linux +} + +void SignaledEvent::InitEvent(void) +{ +#ifdef _WIN32 + eventList=CreateEvent(0, false, false, 0); + + + + + + + + + +#else + +#if !defined(ANDROID) + pthread_condattr_init( &condAttr ); + pthread_cond_init(&eventList, &condAttr); +#else + pthread_cond_init(&eventList, 0); +#endif + pthread_mutexattr_init( &mutexAttr ); + pthread_mutex_init(&hMutex, &mutexAttr); +#endif +} + +void SignaledEvent::CloseEvent(void) +{ +#ifdef _WIN32 + if (eventList!=INVALID_HANDLE_VALUE) + { + CloseHandle(eventList); + eventList=INVALID_HANDLE_VALUE; + } + + + + + + + + + +#else + pthread_cond_destroy(&eventList); + pthread_mutex_destroy(&hMutex); +#if !defined(ANDROID) + pthread_condattr_destroy( &condAttr ); +#endif + pthread_mutexattr_destroy( &mutexAttr ); +#endif +} + +void SignaledEvent::SetEvent(void) +{ +#ifdef _WIN32 + ::SetEvent(eventList); + + + + + + + + + + +#else + // Different from SetEvent which stays signaled. + // We have to record manually that the event was signaled + isSignaledMutex.Lock(); + isSignaled=true; + isSignaledMutex.Unlock(); + + // Unblock waiting threads + pthread_cond_broadcast(&eventList); +#endif +} + +void SignaledEvent::WaitOnEvent(int timeoutMs) +{ +#ifdef _WIN32 +// WaitForMultipleObjects( +// 2, +// eventList, +// false, +// timeoutMs); + WaitForSingleObject(eventList,timeoutMs); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#else + + // If was previously set signaled, just unset and return + isSignaledMutex.Lock(); + if (isSignaled==true) + { + isSignaled=false; + isSignaledMutex.Unlock(); + return; + } + isSignaledMutex.Unlock(); + + + struct timespec ts; + + // Else wait for SetEvent to be called + + + + + + + + + + + + + + + int rc; + struct timeval tp; + rc = gettimeofday(&tp, NULL); + ts.tv_sec = tp.tv_sec; + ts.tv_nsec = tp.tv_usec * 1000; + + + while (timeoutMs > 30) + { + // Wait 30 milliseconds for the signal, then check again. + // This is in case we missed the signal between the top of this function and pthread_cond_timedwait, or after the end of the loop and pthread_cond_timedwait + ts.tv_nsec += 30*1000000; + if (ts.tv_nsec >= 1000000000) + { + ts.tv_nsec -= 1000000000; + ts.tv_sec++; + } + + // [SBC] added mutex lock/unlock around cond_timedwait. + // this prevents airplay from generating a whole much of errors. + // not sure how this works on other platforms since according to + // the docs you are suppost to hold the lock before you wait + // on the cond. + pthread_mutex_lock(&hMutex); + pthread_cond_timedwait(&eventList, &hMutex, &ts); + pthread_mutex_unlock(&hMutex); + + timeoutMs-=30; + + isSignaledMutex.Lock(); + if (isSignaled==true) + { + isSignaled=false; + isSignaledMutex.Unlock(); + return; + } + isSignaledMutex.Unlock(); + } + + // Wait the remaining time, and turn off the signal in case it was set + ts.tv_nsec += timeoutMs*1000000; + if (ts.tv_nsec >= 1000000000) + { + ts.tv_nsec -= 1000000000; + ts.tv_sec++; + } + + pthread_mutex_lock(&hMutex); + pthread_cond_timedwait(&eventList, &hMutex, &ts); + pthread_mutex_unlock(&hMutex); + + isSignaledMutex.Lock(); + isSignaled=false; + isSignaledMutex.Unlock(); +#endif +} diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SignaledEvent.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SignaledEvent.h new file mode 100644 index 0000000..3d36948 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SignaledEvent.h @@ -0,0 +1,59 @@ +#ifndef __SIGNALED_EVENT_H +#define __SIGNALED_EVENT_H + + + +#if defined(_WIN32) +#include + + + +#else + #include + #include + #include "SimpleMutex.h" + + + + +#endif + +#include "Export.h" + +namespace RakNet +{ + +class RAK_DLL_EXPORT SignaledEvent +{ +public: + SignaledEvent(); + ~SignaledEvent(); + + void InitEvent(void); + void CloseEvent(void); + void SetEvent(void); + void WaitOnEvent(int timeoutMs); + +protected: +#ifdef _WIN32 + HANDLE eventList; + + + + + +#else + SimpleMutex isSignaledMutex; + bool isSignaled; +#if !defined(ANDROID) + pthread_condattr_t condAttr; +#endif + pthread_cond_t eventList; + pthread_mutex_t hMutex; + pthread_mutexattr_t mutexAttr; +#endif +}; + +} // namespace RakNet + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SimpleMutex.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SimpleMutex.cpp new file mode 100644 index 0000000..26e90b5 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SimpleMutex.cpp @@ -0,0 +1,181 @@ +/// \file +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#include "SimpleMutex.h" +#include "RakAssert.h" + +using namespace RakNet; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +SimpleMutex::SimpleMutex() //: isInitialized(false) +{ + + + + + + + + // Prior implementation of Initializing in Lock() was not threadsafe + Init(); +} + +SimpleMutex::~SimpleMutex() +{ +// if (isInitialized==false) +// return; +#ifdef _WIN32 + // CloseHandle(hMutex); + DeleteCriticalSection(&criticalSection); + + + + + + +#else + pthread_mutex_destroy(&hMutex); +#endif + + + + + + + +} + +#ifdef _WIN32 +#ifdef _DEBUG +#include +#endif +#endif + +void SimpleMutex::Lock(void) +{ +// if (isInitialized==false) +// Init(); + +#ifdef _WIN32 + /* + DWORD d = WaitForSingleObject(hMutex, INFINITE); + #ifdef _DEBUG + if (d==WAIT_FAILED) + { + LPVOID messageBuffer; + FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (LPTSTR) &messageBuffer, + 0, + NULL + ); + // Process any inserts in messageBuffer. + // ... + // Display the string. + //MessageBox( NULL, (LPCTSTR)messageBuffer, "Error", MB_OK | MB_ICONINFORMATION ); + RAKNET_DEBUG_PRINTF("SimpleMutex error: %s", messageBuffer); + // Free the buffer. + LocalFree( messageBuffer ); + + } + + RakAssert(d==WAIT_OBJECT_0); + */ + EnterCriticalSection(&criticalSection); + + + + + + +#else + int error = pthread_mutex_lock(&hMutex); + (void) error; + RakAssert(error==0); +#endif +} + +void SimpleMutex::Unlock(void) +{ +// if (isInitialized==false) +// return; +#ifdef _WIN32 + // ReleaseMutex(hMutex); + LeaveCriticalSection(&criticalSection); + + + + + + +#else + int error = pthread_mutex_unlock(&hMutex); + (void) error; + RakAssert(error==0); +#endif +} + +void SimpleMutex::Init(void) +{ +#ifdef _WIN32 + // hMutex = CreateMutex(NULL, FALSE, 0); + // RakAssert(hMutex); + InitializeCriticalSection(&criticalSection); + + + + + + + + +#else + int error = pthread_mutex_init(&hMutex, 0); + (void) error; + RakAssert(error==0); +#endif +// isInitialized=true; +} diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SimpleMutex.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SimpleMutex.h new file mode 100644 index 0000000..8868851 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SimpleMutex.h @@ -0,0 +1,70 @@ +/// \file +/// \brief \b [Internal] Encapsulates a mutex +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __SIMPLE_MUTEX_H +#define __SIMPLE_MUTEX_H + +#include "RakMemoryOverride.h" + + +#if defined(_WIN32) +#include "WindowsIncludes.h" + + +#else +#include +#include +#endif +#include "Export.h" + +namespace RakNet +{ + +/// \brief An easy to use mutex. +/// +/// I wrote this because the version that comes with Windows is too complicated and requires too much code to use. +/// @remark Previously I used this everywhere, and in fact for a year or two RakNet was totally threadsafe. While doing profiling, I saw that this function was incredibly slow compared to the blazing performance of everything else, so switched to single producer / consumer everywhere. Now the user thread of RakNet is not threadsafe, but it's 100X faster than before. +class RAK_DLL_EXPORT SimpleMutex +{ +public: + + // Constructor + SimpleMutex(); + + // Destructor + ~SimpleMutex(); + + // Locks the mutex. Slow! + void Lock(void); + + // Unlocks the mutex. + void Unlock(void); + + + + + + + +private: + void Init(void); +#ifdef _WIN32 + CRITICAL_SECTION criticalSection; /// Docs say this is faster than a mutex for single process access + + +#else + pthread_mutex_t hMutex; +#endif + // Not threadsafe + // bool isInitialized; +}; + +} // namespace RakNet + +#endif + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SimpleTCPServer.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SimpleTCPServer.h new file mode 100644 index 0000000..1181cd0 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SimpleTCPServer.h @@ -0,0 +1 @@ +// Eraseme \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SingleProducerConsumer.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SingleProducerConsumer.h new file mode 100644 index 0000000..7bffbfc --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SingleProducerConsumer.h @@ -0,0 +1,259 @@ +/// \file +/// \brief \b [Internal] Passes queued data between threads using a circular buffer with read and write pointers +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __SINGLE_PRODUCER_CONSUMER_H +#define __SINGLE_PRODUCER_CONSUMER_H + +#include "RakAssert.h" + +static const int MINIMUM_LIST_SIZE=8; + +#include "RakMemoryOverride.h" +#include "Export.h" + +/// The namespace DataStructures was only added to avoid compiler errors for commonly named data structures +/// As these data structures are stand-alone, you can use them outside of RakNet for your own projects if you wish. +namespace DataStructures +{ + /// \brief A single producer consumer implementation without critical sections. + template + class RAK_DLL_EXPORT SingleProducerConsumer + { + public: + // Constructor + SingleProducerConsumer(); + + // Destructor + ~SingleProducerConsumer(); + + /// WriteLock must be immediately followed by WriteUnlock. These two functions must be called in the same thread. + /// \return A pointer to a block of data you can write to. + SingleProducerConsumerType* WriteLock(void); + + /// Call if you don't want to write to a block of data from WriteLock() after all. + /// Cancelling locks cancels all locks back up to the data passed. So if you lock twice and cancel using the first lock, the second lock is ignored + /// \param[in] cancelToLocation Which WriteLock() to cancel. + void CancelWriteLock(SingleProducerConsumerType* cancelToLocation); + + /// Call when you are done writing to a block of memory returned by WriteLock() + void WriteUnlock(void); + + /// ReadLock must be immediately followed by ReadUnlock. These two functions must be called in the same thread. + /// \retval 0 No data is availble to read + /// \retval Non-zero The data previously written to, in another thread, by WriteLock followed by WriteUnlock. + SingleProducerConsumerType* ReadLock(void); + + // Cancelling locks cancels all locks back up to the data passed. So if you lock twice and cancel using the first lock, the second lock is ignored + /// param[in] Which ReadLock() to cancel. + void CancelReadLock(SingleProducerConsumerType* cancelToLocation); + + /// Signals that we are done reading the the data from the least recent call of ReadLock. + /// At this point that pointer is no longer valid, and should no longer be read. + void ReadUnlock(void); + + /// Clear is not thread-safe and none of the lock or unlock functions should be called while it is running. + void Clear(void); + + /// This function will estimate how many elements are waiting to be read. It's threadsafe enough that the value returned is stable, but not threadsafe enough to give accurate results. + /// \return An ESTIMATE of how many data elements are waiting to be read + int Size(void) const; + + /// Make sure that the pointer we done reading for the call to ReadUnlock is the right pointer. + /// param[in] A previous pointer returned by ReadLock() + bool CheckReadUnlockOrder(const SingleProducerConsumerType* data) const; + + /// Returns if ReadUnlock was called before ReadLock + /// \return If the read is locked + bool ReadIsLocked(void) const; + + private: + struct DataPlusPtr + { + DataPlusPtr () {readyToRead=false;} + SingleProducerConsumerType object; + + // Ready to read is so we can use an equality boolean comparison, in case the writePointer var is trashed while context switching. + volatile bool readyToRead; + volatile DataPlusPtr *next; + }; + volatile DataPlusPtr *readAheadPointer; + volatile DataPlusPtr *writeAheadPointer; + volatile DataPlusPtr *readPointer; + volatile DataPlusPtr *writePointer; + unsigned readCount, writeCount; + }; + + template + SingleProducerConsumer::SingleProducerConsumer() + { + // Preallocate + readPointer = RakNet::OP_NEW( _FILE_AND_LINE_ ); + writePointer=readPointer; + readPointer->next = RakNet::OP_NEW( _FILE_AND_LINE_ ); + int listSize; +#ifdef _DEBUG + RakAssert(MINIMUM_LIST_SIZE>=3); +#endif + for (listSize=2; listSize < MINIMUM_LIST_SIZE; listSize++) + { + readPointer=readPointer->next; + readPointer->next = RakNet::OP_NEW( _FILE_AND_LINE_ ); + } + readPointer->next->next=writePointer; // last to next = start + readPointer=writePointer; + readAheadPointer=readPointer; + writeAheadPointer=writePointer; + readCount=writeCount=0; + } + + template + SingleProducerConsumer::~SingleProducerConsumer() + { + volatile DataPlusPtr *next; + readPointer=writeAheadPointer->next; + while (readPointer!=writeAheadPointer) + { + next=readPointer->next; + RakNet::OP_DELETE((char*) readPointer, _FILE_AND_LINE_); + readPointer=next; + } + RakNet::OP_DELETE((char*) readPointer, _FILE_AND_LINE_); + } + + template + SingleProducerConsumerType* SingleProducerConsumer::WriteLock( void ) + { + if (writeAheadPointer->next==readPointer || + writeAheadPointer->next->readyToRead==true) + { + volatile DataPlusPtr *originalNext=writeAheadPointer->next; + writeAheadPointer->next=RakNet::OP_NEW(_FILE_AND_LINE_); + RakAssert(writeAheadPointer->next); + writeAheadPointer->next->next=originalNext; + } + + volatile DataPlusPtr *last; + last=writeAheadPointer; + writeAheadPointer=writeAheadPointer->next; + + return (SingleProducerConsumerType*) last; + } + + template + void SingleProducerConsumer::CancelWriteLock( SingleProducerConsumerType* cancelToLocation ) + { + writeAheadPointer=(DataPlusPtr *)cancelToLocation; + } + + template + void SingleProducerConsumer::WriteUnlock( void ) + { + // DataPlusPtr *dataContainer = (DataPlusPtr *)structure; + +#ifdef _DEBUG + RakAssert(writePointer->next!=readPointer); + RakAssert(writePointer!=writeAheadPointer); +#endif + + writeCount++; + // User is done with the data, allow send by updating the write pointer + writePointer->readyToRead=true; + writePointer=writePointer->next; + } + + template + SingleProducerConsumerType* SingleProducerConsumer::ReadLock( void ) + { + if (readAheadPointer==writePointer || + readAheadPointer->readyToRead==false) + { + return 0; + } + + volatile DataPlusPtr *last; + last=readAheadPointer; + readAheadPointer=readAheadPointer->next; + return (SingleProducerConsumerType*)last; + } + + template + void SingleProducerConsumer::CancelReadLock( SingleProducerConsumerType* cancelToLocation ) + { +#ifdef _DEBUG + RakAssert(readPointer!=writePointer); +#endif + readAheadPointer=(DataPlusPtr *)cancelToLocation; + } + + template + void SingleProducerConsumer::ReadUnlock( void ) + { +#ifdef _DEBUG + RakAssert(readAheadPointer!=readPointer); // If hits, then called ReadUnlock before ReadLock + RakAssert(readPointer!=writePointer); // If hits, then called ReadUnlock when Read returns 0 +#endif + readCount++; + + // Allow writes to this memory block + readPointer->readyToRead=false; + readPointer=readPointer->next; + } + + template + void SingleProducerConsumer::Clear( void ) + { + // Shrink the list down to MINIMUM_LIST_SIZE elements + volatile DataPlusPtr *next; + writePointer=readPointer->next; + + int listSize=1; + next=readPointer->next; + while (next!=readPointer) + { + listSize++; + next=next->next; + } + + while (listSize-- > MINIMUM_LIST_SIZE) + { + next=writePointer->next; +#ifdef _DEBUG + RakAssert(writePointer!=readPointer); +#endif + RakNet::OP_DELETE((char*) writePointer, _FILE_AND_LINE_); + writePointer=next; + } + + readPointer->next=writePointer; + writePointer=readPointer; + readAheadPointer=readPointer; + writeAheadPointer=writePointer; + readCount=writeCount=0; + } + + template + int SingleProducerConsumer::Size( void ) const + { + return writeCount-readCount; + } + + template + bool SingleProducerConsumer::CheckReadUnlockOrder(const SingleProducerConsumerType* data) const + { + return const_cast(&readPointer->object) == data; + } + + + template + bool SingleProducerConsumer::ReadIsLocked(void) const + { + return readAheadPointer!=readPointer; + } +} + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SocketDefines.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SocketDefines.h new file mode 100644 index 0000000..248cf2d --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SocketDefines.h @@ -0,0 +1,69 @@ +#ifndef __SOCKET_DEFINES_H +#define __SOCKET_DEFINES_H + +/// Internal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #if defined(_WIN32) + #define closesocket__ closesocket + #define select__ select + #else + #define closesocket__ close + #define select__ select + #endif +#define accept__ accept +#define connect__ connect +#define socket__ socket +#define bind__ bind +#define getsockname__ getsockname +#define getsockopt__ getsockopt +#define inet_addr__ inet_addr +#define ioctlsocket__ ioctlsocket +#define listen__ listen +#define recv__ recv +#define recvfrom__ recvfrom +#define sendto__ sendto +#define send__ send +#define setsockopt__ setsockopt +#define shutdown__ shutdown +#define WSASendTo__ WSASendTo + + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SocketIncludes.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SocketIncludes.h new file mode 100644 index 0000000..418e074 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SocketIncludes.h @@ -0,0 +1,31 @@ +// All this crap just to include type SOCKET + + + + + + + + + + +#if defined(_WIN32) +typedef int socklen_t; +// IP_DONTFRAGMENT is different between winsock 1 and winsock 2. Therefore, Winsock2.h must be linked againt Ws2_32.lib +// winsock.h must be linked against WSock32.lib. If these two are mixed up the flag won't work correctly +#include +#else +#define closesocket close +#include +#include +#include +#include +#include +#include +#include +#include +#define INVALID_SOCKET -1 +//#include "RakMemoryOverride.h" +/// Unix/Linux uses ints for sockets +typedef int SOCKET; +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SocketLayer.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SocketLayer.cpp new file mode 100644 index 0000000..5eecbd3 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SocketLayer.cpp @@ -0,0 +1,1851 @@ +/// \file +/// \brief SocketLayer class implementation +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#include "SocketLayer.h" +#include "RakAssert.h" +#include "RakNetTypes.h" +#include "GetTime.h" +#include "LinuxStrings.h" +#include "SocketDefines.h" + +using namespace RakNet; + +#if USE_SLIDING_WINDOW_CONGESTION_CONTROL!=1 +#include "CCRakNetUDT.h" +#else +#include "CCRakNetSlidingWindow.h" +#endif + +SocketLayerOverride *SocketLayer::slo=0; + +#ifdef _WIN32 +#else +#include // memcpy +#include +#include +#include +#include // error numbers +#include // RAKNET_DEBUG_PRINTF +#if !defined(ANDROID) +#include +#endif +#include +#include +#include +#include +#include + +#endif + + + + + + + + + + + + + +#if defined(_WIN32) +#include "WSAStartupSingleton.h" +#include // 'IP_DONTFRAGMENT' 'IP_TTL' +#elif defined SN_TARGET_PSP2 +#else +#include +#endif + +#include "RakSleep.h" +#include +#include "Itoa.h" + +#ifdef _MSC_VER +#pragma warning( push ) +#endif + +namespace RakNet +{ + extern void ProcessNetworkPacket( const SystemAddress systemAddress, const char *data, const int length, RakPeer *rakPeer, RakNet::TimeUS timeRead ); + extern void ProcessNetworkPacket( const SystemAddress systemAddress, const char *data, const int length, RakPeer *rakPeer, RakNetSmartPtr rakNetSocket, RakNet::TimeUS timeRead ); +} + +#ifdef _DEBUG +#include +#endif + +// http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html#ip4to6 +// http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html#getaddrinfo + +#if RAKNET_SUPPORT_IPV6==1 +void PrepareAddrInfoHints(addrinfo *hints) +{ + memset(hints, 0, sizeof (addrinfo)); // make sure the struct is empty + hints->ai_socktype = SOCK_DGRAM; // UDP sockets + hints->ai_flags = AI_PASSIVE; // fill in my IP for me +} +#endif + +// Frogwares: Define this +// #define DEBUG_SENDTO_SPIKES + +bool SocketLayer::IsPortInUse_Old(unsigned short port, const char *hostAddress) +{ + SOCKET listenSocket; + sockaddr_in listenerSocketAddress; + memset(&listenerSocketAddress,0,sizeof(sockaddr_in)); + // Listen on our designated Port# + listenerSocketAddress.sin_port = htons( port ); + listenSocket = socket__( AF_INET, SOCK_DGRAM, 0 ); + if ( listenSocket == (SOCKET) -1 ) + return true; + // bind our name to the socket + // Fill in the rest of the address structure + listenerSocketAddress.sin_family = AF_INET; + + if ( hostAddress && hostAddress[0] ) + { + + + + listenerSocketAddress.sin_addr.s_addr = inet_addr__( hostAddress ); + + } + else + listenerSocketAddress.sin_addr.s_addr = INADDR_ANY; + + + + + + + + int ret = bind__( listenSocket, ( struct sockaddr * ) & listenerSocketAddress, sizeof( listenerSocketAddress ) ); + closesocket__(listenSocket); + + + + + // #if defined(_DEBUG) + // if (ret == -1) + // perror("Failed to bind to address:"); + // #endif + return ret <= -1; + +} +bool SocketLayer::IsSocketFamilySupported(const char *hostAddress, unsigned short socketFamily) +{ + (void) hostAddress; + (void) socketFamily; + +#if RAKNET_SUPPORT_IPV6!=1 + return socketFamily==AF_INET; +#else + struct addrinfo hints; +#if RAKNET_SUPPORT_IPV6==1 + PrepareAddrInfoHints(&hints); +#endif + hints.ai_family = socketFamily; + struct addrinfo *servinfo=0; + int error; + // On Ubuntu, "" returns "No address associated with hostname" while 0 works. + if (hostAddress && + (_stricmp(hostAddress,"UNASSIGNED_SYSTEM_ADDRESS")==0 || hostAddress[0]==0)) + { + getaddrinfo(0, "0", &hints, &servinfo); + } + else + { + getaddrinfo(hostAddress, "0", &hints, &servinfo); + } + + + (void) error; + if (servinfo) + { + freeaddrinfo(servinfo); + return true; + } + else + { +#if (defined(__GNUC__) || defined(__GCCXML__)) && !defined(_WIN32) + printf("IsSocketFamilySupported failed. hostAddress=%s. %s\n", hostAddress, gai_strerror(error)); +#endif + } + return false; +#endif +} +bool SocketLayer::IsPortInUse(unsigned short port, const char *hostAddress, unsigned short socketFamily) +{ +#if RAKNET_SUPPORT_IPV6!=1 + (void) socketFamily; + return IsPortInUse_Old(port, hostAddress); +#else + SOCKET listenSocket; + struct addrinfo hints; + struct addrinfo *servinfo=0, *aip; // will point to the results + PrepareAddrInfoHints(&hints); + hints.ai_family = socketFamily; + char portStr[32]; + Itoa(port,portStr,10); + + // On Ubuntu, "" returns "No address associated with hostname" while 0 works. + if (hostAddress && + (_stricmp(hostAddress,"UNASSIGNED_SYSTEM_ADDRESS")==0 || hostAddress[0]==0)) + { + getaddrinfo(0, portStr, &hints, &servinfo); + } + else + { + getaddrinfo(hostAddress, portStr, &hints, &servinfo); + } + + // Try all returned addresses until one works + for (aip = servinfo; aip != NULL; aip = aip->ai_next) + { + // Open socket. The address type depends on what + // getaddrinfo() gave us. + listenSocket = socket__(aip->ai_family, aip->ai_socktype, aip->ai_protocol); + if (listenSocket != -1) + { + int ret = bind__( listenSocket, aip->ai_addr, (int) aip->ai_addrlen ); + closesocket__(listenSocket); + if (ret>=0) + { + freeaddrinfo(servinfo); // free the linked-list + return false; + } + } + + // If the user didn't specify which host address, then only apply the first + if (hostAddress==0 || hostAddress[0]==0) + break; + } + + freeaddrinfo(servinfo); // free the linked-list + return true; +#endif // #if RAKNET_SUPPORT_IPV6!=1 +} +void SocketLayer::SetDoNotFragment( SOCKET listenSocket, int opt, int IPPROTO ) +{ +#if defined(IP_DONTFRAGMENT ) + +#if defined(_WIN32) && defined(_DEBUG) + // If this assert hit you improperly linked against WSock32.h + RakAssert(IP_DONTFRAGMENT==14); +#endif + + if ( setsockopt__( listenSocket, IPPROTO, IP_DONTFRAGMENT, ( char * ) & opt, sizeof ( opt ) ) == -1 ) + { +#if defined(_WIN32) && defined(_DEBUG) + DWORD dwIOError = GetLastError(); + LPVOID messageBuffer; + FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, dwIOError, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), // Default language + ( LPTSTR ) & messageBuffer, 0, NULL ); + // I see this hit on XP with IPV6 for some reason + RAKNET_DEBUG_PRINTF( "Warning: setsockopt__(IP_DONTFRAGMENT) failed:Error code - %d\n%s", dwIOError, messageBuffer ); + LocalFree( messageBuffer ); +#endif + } +#endif +} + +void SocketLayer::SetNonBlocking( SOCKET listenSocket) +{ +#ifdef _WIN32 + unsigned long nonBlocking = 1; + ioctlsocket__( listenSocket, FIONBIO, &nonBlocking ); + + + +#else + int flags = fcntl(listenSocket, F_GETFL, 0); + fcntl(listenSocket, F_SETFL, flags | O_NONBLOCK); +#endif +} + +void SocketLayer::SetSocketOptions( SOCKET listenSocket) +{ + int sock_opt = 1; + // // On Vista, can get WSAEACCESS (10013) + /* + if ( setsockopt__( listenSocket, SOL_SOCKET, SO_REUSEADDR, ( char * ) & sock_opt, sizeof ( sock_opt ) ) == -1 ) + { + #if defined(_WIN32) && !defined(_XBOX) && defined(_DEBUG) && !defined(X360) + DWORD dwIOError = GetLastError(); + LPVOID messageBuffer; + FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, dwIOError, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), // Default language + ( LPTSTR ) & messageBuffer, 0, NULL ); + // something has gone wrong here... + RAKNET_DEBUG_PRINTF( "setsockopt__(SO_REUSEADDR) failed:Error code - %d\n%s", dwIOError, messageBuffer ); + //Free the buffer. + LocalFree( messageBuffer ); + #endif + } + */ + + // This doubles the max throughput rate + sock_opt=1024*256; + setsockopt__(listenSocket, SOL_SOCKET, SO_RCVBUF, ( char * ) & sock_opt, sizeof ( sock_opt ) ); + + // Immediate hard close. Don't linger the socket, or recreating the socket quickly on Vista fails. + // Fail with voice and xbox + + sock_opt=0; + setsockopt__(listenSocket, SOL_SOCKET, SO_LINGER, ( char * ) & sock_opt, sizeof ( sock_opt ) ); + + + + // This doesn't make much difference: 10% maybe + // Not supported on console 2 + sock_opt=1024*16; + setsockopt__(listenSocket, SOL_SOCKET, SO_SNDBUF, ( char * ) & sock_opt, sizeof ( sock_opt ) ); + +#ifdef __APPLE__ + // Preventing SEGPIPE on "broken" socket + int set = 1; + setsockopt__(listenSocket, SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, sizeof(int)); +#endif + + /* + #ifdef _WIN32 + unsigned long nonblocking = 1; + ioctlsocket__( listenSocket, FIONBIO, &nonblocking ); + #elif defined(_PS3) || defined(__PS3__) || defined(SN_TARGET_PS3) || defined(SN_TARGET_PSP2) + sock_opt=1; + setsockopt__(listenSocket, SOL_SOCKET, SO_NBIO, ( char * ) & sock_opt, sizeof ( sock_opt ) ); + #else + fcntl( listenSocket, F_SETFL, O_NONBLOCK ); + #endif + */ + + // TODO - teston ipv6 + + // Note: Fails with VDP but not xbox + // Set broadcast capable + sock_opt=1; + if ( setsockopt__( listenSocket, SOL_SOCKET, SO_BROADCAST, ( char * ) & sock_opt, sizeof( sock_opt ) ) == -1 ) + { +#if defined(_WIN32) && defined(_DEBUG) + + DWORD dwIOError = GetLastError(); + // On Vista, can get WSAEACCESS (10013) + // See http://support.microsoft.com/kb/819124 + // http://blogs.msdn.com/wndp/archive/2007/03/19/winsock-so-exclusiveaddruse-on-vista.aspx + // http://msdn.microsoft.com/en-us/library/ms740621(VS.85).aspx + LPVOID messageBuffer; + FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, dwIOError, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), // Default language + ( LPTSTR ) & messageBuffer, 0, NULL ); + // something has gone wrong here... + RAKNET_DEBUG_PRINTF( "setsockopt__(SO_BROADCAST) failed:Error code - %d\n%s", dwIOError, messageBuffer ); + //Free the buffer. + LocalFree( messageBuffer ); + +#endif + + } +} +SOCKET SocketLayer::CreateBoundSocket_PS3Lobby( unsigned short port, bool blockingSocket, const char *forceHostAddress, unsigned short socketFamily ) +{ + (void) port; + (void) blockingSocket; + (void) forceHostAddress; + (void) socketFamily; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + return 0; + +} +SOCKET SocketLayer::CreateBoundSocket_PSP2( unsigned short port, bool blockingSocket, const char *forceHostAddress, unsigned short socketFamily ) +{ + (void) port; + (void) blockingSocket; + (void) forceHostAddress; + (void) socketFamily; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + return 0; + +} +SOCKET SocketLayer::CreateBoundSocket_Old( unsigned short port, bool blockingSocket, const char *forceHostAddress, unsigned int sleepOn10048, unsigned int extraSocketOptions ) +{ + (void) blockingSocket; + + int ret; + SOCKET listenSocket; + sockaddr_in listenerSocketAddress; + memset(&listenerSocketAddress,0,sizeof(sockaddr_in)); + // Listen on our designated Port# + listenerSocketAddress.sin_port = htons( port ); + + listenSocket = socket__( AF_INET, SOCK_DGRAM, extraSocketOptions ); + + if ( listenSocket == (SOCKET) -1 ) + { +#if defined(_WIN32) && defined(_DEBUG) + DWORD dwIOError = GetLastError(); + LPVOID messageBuffer; + FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, dwIOError, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), // Default language + ( LPTSTR ) & messageBuffer, 0, NULL ); + // something has gone wrong here... + RAKNET_DEBUG_PRINTF( "socket__(...) failed:Error code - %d\n%s", dwIOError, messageBuffer ); + char str[512]; + strcpy(str,(const char*) messageBuffer); + //Free the buffer. + LocalFree( messageBuffer ); +#endif + + return (SOCKET) -1; + } + + SetSocketOptions(listenSocket); + + // Fill in the rest of the address structure + listenerSocketAddress.sin_family = AF_INET; + + if (forceHostAddress && forceHostAddress[0]) + { + // RAKNET_DEBUG_PRINTF("Force binding %s:%i\n", forceHostAddress, port); + + + + listenerSocketAddress.sin_addr.s_addr = inet_addr__( forceHostAddress ); + + } + else + { + // RAKNET_DEBUG_PRINTF("Binding any on port %i\n", port); + listenerSocketAddress.sin_addr.s_addr = INADDR_ANY; + } + + + + + + + + + // bind our name to the socket + ret = bind__( listenSocket, ( struct sockaddr * ) & listenerSocketAddress, sizeof( listenerSocketAddress ) ); + + if ( ret <= -1 ) + { + + + + + + + +#if defined(_WIN32) + DWORD dwIOError = GetLastError(); + if (dwIOError==10048) + { + if (sleepOn10048==0) + return (SOCKET) -1; + // Vista has a bug where it returns WSAEADDRINUSE (10048) if you create, shutdown, then rebind the socket port unless you wait a while first. + // Wait, then rebind + RakSleep(100); + + closesocket__(listenSocket); + listenerSocketAddress.sin_port = htons( port ); + listenSocket = socket__( AF_INET, SOCK_DGRAM, 0 ); + if ( listenSocket == (SOCKET) -1 ) + return false; + SetSocketOptions(listenSocket); + + // Fill in the rest of the address structure + listenerSocketAddress.sin_family = AF_INET; + if (forceHostAddress && forceHostAddress[0]) + { + + + + listenerSocketAddress.sin_addr.s_addr = inet_addr__( forceHostAddress ); + + } + else + listenerSocketAddress.sin_addr.s_addr = INADDR_ANY; + + // bind our name to the socket + ret = bind__( listenSocket, ( struct sockaddr * ) & listenerSocketAddress, sizeof( listenerSocketAddress ) ); + + if ( ret >= 0 ) + return listenSocket; + } + dwIOError = GetLastError(); + LPVOID messageBuffer; + FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, dwIOError, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), // Default language + ( LPTSTR ) & messageBuffer, 0, NULL ); + // something has gone wrong here... + RAKNET_DEBUG_PRINTF( "bind__(...) failed:Error code - %d\n%s", (unsigned int) dwIOError, (char*) messageBuffer ); + //Free the buffer. + LocalFree( messageBuffer ); +#elif (defined(__GNUC__) || defined(__GCCXML__) ) && !defined(_WIN32) + switch (ret) + { + case EBADF: + RAKNET_DEBUG_PRINTF("bind__(): sockfd is not a valid descriptor.\n"); break; + + case ENOTSOCK: + RAKNET_DEBUG_PRINTF("bind__(): Argument is a descriptor for a file, not a socket.\n"); break; + + case EINVAL: + RAKNET_DEBUG_PRINTF("bind__(): The addrlen is wrong, or the socket was not in the AF_UNIX family.\n"); break; + case EROFS: + RAKNET_DEBUG_PRINTF("bind__(): The socket inode would reside on a read-only file system.\n"); break; + case EFAULT: + RAKNET_DEBUG_PRINTF("bind__(): my_addr points outside the user's accessible address space.\n"); break; + case ENAMETOOLONG: + RAKNET_DEBUG_PRINTF("bind__(): my_addr is too long.\n"); break; + case ENOENT: + RAKNET_DEBUG_PRINTF("bind__(): The file does not exist.\n"); break; + case ENOMEM: + RAKNET_DEBUG_PRINTF("bind__(): Insufficient kernel memory was available.\n"); break; + case ENOTDIR: + RAKNET_DEBUG_PRINTF("bind__(): A component of the path prefix is not a directory.\n"); break; + case EACCES: + RAKNET_DEBUG_PRINTF("bind__(): Search permission is denied on a component of the path prefix.\n"); break; + + case ELOOP: + RAKNET_DEBUG_PRINTF("bind__(): Too many symbolic links were encountered in resolving my_addr.\n"); break; + + default: + RAKNET_DEBUG_PRINTF("Unknown bind__() error %i.\n", ret); break; + } +#endif + + return (SOCKET) -1; + } + + return listenSocket; +} +SOCKET SocketLayer::CreateBoundSocket( unsigned short port, bool blockingSocket, const char *forceHostAddress, unsigned int sleepOn10048, unsigned int extraSocketOptions, unsigned short socketFamily ) +{ + (void) blockingSocket; + (void) extraSocketOptions; + (void) socketFamily; + +#if RAKNET_SUPPORT_IPV6!=1 + return CreateBoundSocket_Old(port,blockingSocket,forceHostAddress,sleepOn10048,extraSocketOptions); +#else + +#ifdef _WIN32 + // Vista has a bug where it returns WSAEADDRINUSE (10048) if you create, shutdown, then rebind the socket port unless you wait a while first. + if (sleepOn10048==0) + RakSleep(100); +#endif + + int ret=0; + SOCKET listenSocket; + struct addrinfo hints; + struct addrinfo *servinfo=0, *aip; // will point to the results + PrepareAddrInfoHints(&hints); + hints.ai_family=socketFamily; + char portStr[32]; + Itoa(port,portStr,10); + + // On Ubuntu, "" returns "No address associated with hostname" while 0 works. + if (forceHostAddress && + (_stricmp(forceHostAddress,"UNASSIGNED_SYSTEM_ADDRESS")==0 || forceHostAddress[0]==0)) + { + getaddrinfo(0, portStr, &hints, &servinfo); + } + else + { + getaddrinfo(forceHostAddress, portStr, &hints, &servinfo); + } + + // Try all returned addresses until one works + for (aip = servinfo; aip != NULL; aip = aip->ai_next) + { + // Open socket. The address type depends on what + // getaddrinfo() gave us. + listenSocket = socket__(aip->ai_family, aip->ai_socktype, aip->ai_protocol); + if (listenSocket != -1) + { + ret = bind__( listenSocket, aip->ai_addr, (int) aip->ai_addrlen ); + if (ret>=0) + { + // Is this valid? + sockaddr_in6 addr6; + memcpy(&addr6, aip->ai_addr, sizeof(addr6)); + + freeaddrinfo(servinfo); // free the linked-list + + SetSocketOptions(listenSocket); + return listenSocket; + } + } + } + +#if defined(_WIN32) + DWORD dwIOError = GetLastError(); + LPVOID messageBuffer; + FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, dwIOError, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), // Default language + ( LPTSTR ) & messageBuffer, 0, NULL ); + // something has gone wrong here... + + RAKNET_DEBUG_PRINTF( "bind__(...) failed:Error code - %d\n%s", (unsigned int) dwIOError, (char*) messageBuffer ); + //Free the buffer. + LocalFree( messageBuffer ); +#elif defined(__GNUC__) || defined(__GCCXML__) && !defined(_WIN32) + switch (ret) + { + case EBADF: + RAKNET_DEBUG_PRINTF("bind__(): sockfd is not a valid descriptor.\n"); break; + + case ENOTSOCK: + RAKNET_DEBUG_PRINTF("bind__(): Argument is a descriptor for a file, not a socket.\n"); break; + + case EINVAL: + RAKNET_DEBUG_PRINTF("bind__(): The addrlen is wrong, or the socket was not in the AF_UNIX family.\n"); break; + case EROFS: + RAKNET_DEBUG_PRINTF("bind__(): The socket inode would reside on a read-only file system.\n"); break; + case EFAULT: + RAKNET_DEBUG_PRINTF("bind__(): my_addr points outside the user's accessible address space.\n"); break; + case ENAMETOOLONG: + RAKNET_DEBUG_PRINTF("bind__(): my_addr is too long.\n"); break; + case ENOENT: + RAKNET_DEBUG_PRINTF("bind__(): The file does not exist.\n"); break; + case ENOMEM: + RAKNET_DEBUG_PRINTF("bind__(): Insufficient kernel memory was available.\n"); break; + case ENOTDIR: + RAKNET_DEBUG_PRINTF("bind__(): A component of the path prefix is not a directory.\n"); break; + case EACCES: + RAKNET_DEBUG_PRINTF("bind__(): Search permission is denied on a component of the path prefix.\n"); break; + + case ELOOP: + RAKNET_DEBUG_PRINTF("bind__(): Too many symbolic links were encountered in resolving my_addr.\n"); break; + + default: + RAKNET_DEBUG_PRINTF("Unknown bind__() error %i.\n", ret); break; + } +#endif + + +#endif + + return (SOCKET) -1; +} +const char* SocketLayer::DomainNameToIP_Old( const char *domainName ) +{ + struct in_addr addr; + memset(&addr,0,sizeof(in_addr)); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + // Use inet_addr instead? What is the difference? + struct hostent * phe = gethostbyname( domainName ); + + if ( phe == 0 || phe->h_addr_list[ 0 ] == 0 ) + { + //cerr << "Yow! Bad host lookup." << endl; + return 0; + } + + if (phe->h_addr_list[ 0 ]==0) + return 0; + + memcpy( &addr, phe->h_addr_list[ 0 ], sizeof( struct in_addr ) ); + return inet_ntoa( addr ); + + + return ""; +} +const char* SocketLayer::DomainNameToIP( const char *domainName ) +{ +#if RAKNET_SUPPORT_IPV6!=1 + return DomainNameToIP_Old(domainName); +#else + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + struct addrinfo hints, *res, *p; + int status; + static char ipstr[INET6_ADDRSTRLEN]; + memset(&hints, 0, sizeof hints); + hints.ai_family = AF_UNSPEC; // AF_INET or AF_INET6 to force version + hints.ai_socktype = SOCK_DGRAM; + + if ((status = getaddrinfo(domainName, NULL, &hints, &res)) != 0) { + return 0; + } + + p=res; +// for(p = res;p != NULL; p = p->ai_next) { + void *addr; +// char *ipver; + + // get the pointer to the address itself, + // different fields in IPv4 and IPv6: + if (p->ai_family == AF_INET) + { + struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr; + addr = &(ipv4->sin_addr); + strcpy(ipstr, inet_ntoa( ipv4->sin_addr )); + } + else + { + // TODO - test + struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr; + addr = &(ipv6->sin6_addr); + // inet_ntop function does not exist on windows + // http://www.mail-archive.com/users@ipv6.org/msg02107.html + getnameinfo((struct sockaddr *)ipv6, sizeof(struct sockaddr_in6), ipstr, 1, NULL, 0, NI_NUMERICHOST); + } + freeaddrinfo(res); // free the linked list + return ipstr; +// } + + + + return ""; + +#endif // #if RAKNET_SUPPORT_IPV6!=1 +} + + +void SocketLayer::Write( const SOCKET writeSocket, const char* data, const int length ) +{ +#ifdef _DEBUG + RakAssert( writeSocket != (SOCKET) -1 ); +#endif + + send__( writeSocket, data, length, 0 ); +} +void SocketLayer::RecvFromBlocking_Old( const SOCKET s, RakPeer *rakPeer, unsigned short remotePortRakNetWasStartedOn_PS3, unsigned int extraSocketOptions, char *dataOut, int *bytesReadOut, SystemAddress *systemAddressOut, RakNet::TimeUS *timeRead ) +{ + (void) rakPeer; + + sockaddr* sockAddrPtr; + socklen_t sockLen; + socklen_t* socketlenPtr=(socklen_t*) &sockLen; + sockaddr_in sa; + memset(&sa,0,sizeof(sockaddr_in)); + int dataOutSize; + const int flag=0; + + (void) remotePortRakNetWasStartedOn_PS3; + (void) extraSocketOptions; + + + + + + + + + + + + + + + + + + + + + { + sockLen=sizeof(sa); + sa.sin_family = AF_INET; + sa.sin_port=0; + sockAddrPtr=(sockaddr*) &sa; + } + + + + + dataOutSize=MAXIMUM_MTU_SIZE; + + + *bytesReadOut = recvfrom__( s, dataOut, dataOutSize, flag, sockAddrPtr, socketlenPtr ); + + + + + + + + + + if (*bytesReadOut<=0) + return; + *timeRead=RakNet::GetTimeUS(); + + + + + + + + + + { + systemAddressOut->SetPortNetworkOrder( sa.sin_port ); + systemAddressOut->address.addr4.sin_addr.s_addr=sa.sin_addr.s_addr; + } +} + +void SocketLayer::RecvFromBlocking( const SOCKET s, RakPeer *rakPeer, unsigned short remotePortRakNetWasStartedOn_PS3, unsigned int extraSocketOptions, char *dataOut, int *bytesReadOut, SystemAddress *systemAddressOut, RakNet::TimeUS *timeRead ) +{ +#if RAKNET_SUPPORT_IPV6!=1 + RecvFromBlocking_Old(s,rakPeer,remotePortRakNetWasStartedOn_PS3,extraSocketOptions,dataOut,bytesReadOut,systemAddressOut,timeRead); +#else + (void) rakPeer; + sockaddr_storage their_addr; + sockaddr* sockAddrPtr; + socklen_t sockLen; + socklen_t* socketlenPtr=(socklen_t*) &sockLen; + memset(&their_addr,0,sizeof(their_addr)); + int dataOutSize; + const int flag=0; + + (void) remotePortRakNetWasStartedOn_PS3; + (void) extraSocketOptions; + + + + + + + + + + + + { + sockLen=sizeof(their_addr); + sockAddrPtr=(sockaddr*) &their_addr; + } + + + + + dataOutSize=MAXIMUM_MTU_SIZE; + + + *bytesReadOut = recvfrom__( s, dataOut, dataOutSize, flag, sockAddrPtr, socketlenPtr ); + + + + + + + + + + if (*bytesReadOut<=0) + return; + *timeRead=RakNet::GetTimeUS(); + + + + + + + + + + { + if (their_addr.ss_family==AF_INET) + { + memcpy(&systemAddressOut->address.addr4,(sockaddr_in *)&their_addr,sizeof(sockaddr_in)); + systemAddressOut->debugPort=ntohs(systemAddressOut->address.addr4.sin_port); + // systemAddressOut->address.addr4.sin_port=ntohs( systemAddressOut->address.addr4.sin_port ); + } + else + { + memcpy(&systemAddressOut->address.addr6,(sockaddr_in6 *)&their_addr,sizeof(sockaddr_in6)); + systemAddressOut->debugPort=ntohs(systemAddressOut->address.addr6.sin6_port); + // systemAddressOut->address.addr6.sin6_port=ntohs( systemAddressOut->address.addr6.sin6_port ); + } + } + +#endif // defined(_PS3) || defined(__PS3__) || defined(SN_TARGET_PS3) || defined(SN_TARGET_PSP2) +} + +int SocketLayer::SendTo_PS3Lobby( SOCKET s, const char *data, int length, const SystemAddress &systemAddress, unsigned short remotePortRakNetWasStartedOn_PS3 ) +{ + (void) s; + (void) data; + (void) length; + (void) remotePortRakNetWasStartedOn_PS3; + (void) systemAddress; + + int len=0; + + + + + + + + + + + + + + + return len; +} +int SocketLayer::SendTo_PSP2( SOCKET s, const char *data, int length, const SystemAddress &systemAddress, unsigned short remotePortRakNetWasStartedOn_PS3 ) +{ + (void) s; + (void) data; + (void) length; + (void) remotePortRakNetWasStartedOn_PS3; + (void) systemAddress; + + int len=0; + + + + + + + + + + + + + + return len; +} +int SocketLayer::SendTo_360( SOCKET s, const char *data, int length, const char *voiceData, int voiceLength, const SystemAddress &systemAddress, unsigned int extraSocketOptions ) +{ + (void) s; + (void) data; + (void) length; + (void) voiceData; + (void) voiceLength; + (void) extraSocketOptions; + (void) systemAddress; + + int len=0; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + return len; +} +int SocketLayer::SendTo_PC( SOCKET s, const char *data, int length, const SystemAddress &systemAddress, const char *file, const long line ) +{ + // TODO + // http://www.linuxquestions.org/questions/linux-software-2/ipv6-linux-sendto-problems-519485/ + +// #if RAKNET_SUPPORT_IPV6==1 +// RakAssert( +// systemAddress.address.addr4.sin_family!=AF_MAX && +// (systemAddress.address.addr4.sin_family==AF_INET || (systemAddress.address.addr6.sin6_scope_id!=0)) +// ); +// #endif + + /* + sockaddr_in sa; + memset(&sa,0,sizeof(sockaddr_in)); + sa.sin_port = htons( port ); // User port + sa.sin_addr.s_addr = binaryAddress; + sa.sin_family = socketFamily; + */ + + int len=0; + do + { +#ifdef DEBUG_SENDTO_SPIKES + RakNetTime start = RakNet::GetTime(); +#else + (void) file; + (void) line; +#endif + if (systemAddress.address.addr4.sin_family==AF_INET) + { + //systemAddress.address.addr4.sin_port=htons(systemAddress.address.addr4.sin_port); + len = sendto__( s, data, length, 0, ( const sockaddr* ) & systemAddress.address.addr4, sizeof( sockaddr_in ) ); + //systemAddress.address.addr4.sin_port=ntohs(systemAddress.address.addr4.sin_port); + } + else + { +#if RAKNET_SUPPORT_IPV6==1 + // systemAddress.address.addr6.sin6_port=htons(systemAddress.address.addr6.sin6_port); + len = sendto__( s, data, length, 0, ( const sockaddr* ) & systemAddress.address.addr6, sizeof( sockaddr_in6 ) ); + //systemAddress.address.addr6.sin6_port=ntohs(systemAddress.address.addr6.sin6_port); +#endif + } + +#ifdef DEBUG_SENDTO_SPIKES + RakNetTime end = RakNet::GetTime(); + static unsigned int callCount=1; + RAKNET_DEBUG_PRINTF("%i. SendTo_PC, time=%"PRINTF_64_BIT_MODIFIER"u, elapsed=%"PRINTF_64_BIT_MODIFIER"u, length=%i, returned=%i, binaryAddress=%i, port=%i, file=%s, line=%i\n", callCount++, end, end-start, length, len, binaryAddress, port, file, line); +#endif + if (len<0) + { + RAKNET_DEBUG_PRINTF("sendto failed with code %i for char %i and length %i.\n", len, data[0], length); + } + } + while ( len == 0 ); + return len; +} + +#ifdef _MSC_VER +#pragma warning( disable : 4702 ) // warning C4702: unreachable code +#endif +int SocketLayer::SendTo( SOCKET s, const char *data, int length, SystemAddress &systemAddress, unsigned short remotePortRakNetWasStartedOn_PS3, unsigned int extraSocketOptions, const char *file, const long line ) +{ + (void) extraSocketOptions; + + int len=0; + RakAssert(length<=MAXIMUM_MTU_SIZE-UDP_HEADER_SIZE); +#if !defined(__S3E__) + RakAssert(systemAddress.address.addr4.sin_family!=AF_MAX); +#endif + + if (slo) + { + len = slo->RakNetSendTo(s,data,length,systemAddress); + if ( len != -1 ) + return 0; + return 1; + } + + if ( s == (SOCKET) -1 ) + { + return -1; + } + + + if (remotePortRakNetWasStartedOn_PS3!=0) + { + + + + + + } + else + { + + + + + + + len = SendTo_PC(s,data,length,systemAddress,file,line); + + } + + if ( len != -1 ) + return 0; + +#if defined(_WIN32) && !defined(_WIN32_WCE) + + DWORD dwIOError = WSAGetLastError(); + + if ( dwIOError == WSAECONNRESET ) + { +#if defined(_DEBUG) + RAKNET_DEBUG_PRINTF( "A previous send operation resulted in an ICMP Port Unreachable message.\n" ); +#endif + + } + else if ( dwIOError != WSAEWOULDBLOCK && dwIOError != WSAEADDRNOTAVAIL) + { +#if defined(_WIN32) && defined(_DEBUG) + LPVOID messageBuffer; + FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, dwIOError, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), // Default language + ( LPTSTR ) & messageBuffer, 0, NULL ); + // something has gone wrong here... + RAKNET_DEBUG_PRINTF( "sendto failed:Error code - %d\n%s", dwIOError, messageBuffer ); + + //Free the buffer. + LocalFree( messageBuffer ); +#endif + + } + + return dwIOError; +#endif + + return 1; // error +} +// Not enough info for IPV6 +// int SocketLayer::SendTo( SOCKET s, const char *data, int length, const char ip[ 16 ], unsigned short port, unsigned short remotePortRakNetWasStartedOn_PS3, unsigned int extraSocketOptions, const char *file, const long line ) +// { +// SystemAddress systemAddress; +// systemAddress.FromStringAndPort(ip,port); +// return SendTo( s, data, length, systemAddress,remotePortRakNetWasStartedOn_PS3, extraSocketOptions, file, line ); +// } +int SocketLayer::SendToTTL( SOCKET s, const char *data, int length, SystemAddress &systemAddress, int ttl ) +{ + if (slo) + return slo->RakNetSendTo(s,data,length,systemAddress); + + + int oldTTL; + socklen_t opLen=sizeof(oldTTL); + // Get the current TTL + if (getsockopt__(s, systemAddress.GetIPPROTO(), IP_TTL, ( char * ) & oldTTL, &opLen ) == -1) + { +#if defined(_WIN32) && defined(_DEBUG) + DWORD dwIOError = GetLastError(); + LPVOID messageBuffer; + FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, dwIOError, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), // Default language + ( LPTSTR ) & messageBuffer, 0, NULL ); + // something has gone wrong here... + RAKNET_DEBUG_PRINTF( "getsockopt__(IPPROTO_IP,IP_TTL) failed:Error code - %d\n%s", dwIOError, messageBuffer ); + //Free the buffer. + LocalFree( messageBuffer ); +#endif + } + + // Set to TTL + int newTTL=ttl; + if (setsockopt__(s, systemAddress.GetIPPROTO(), IP_TTL, ( char * ) & newTTL, sizeof ( newTTL ) ) == -1) + { + +#if defined(_WIN32) && defined(_DEBUG) + DWORD dwIOError = GetLastError(); + LPVOID messageBuffer; + FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, dwIOError, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), // Default language + ( LPTSTR ) & messageBuffer, 0, NULL ); + // something has gone wrong here... + RAKNET_DEBUG_PRINTF( "setsockopt__(IPPROTO_IP,IP_TTL) failed:Error code - %d\n%s", dwIOError, messageBuffer ); + //Free the buffer. + LocalFree( messageBuffer ); +#endif + } + + // Send + int res = SendTo(s,data,length,systemAddress,0,0, __FILE__, __LINE__ ); + + // Restore the old TTL + setsockopt__(s, systemAddress.GetIPPROTO(), IP_TTL, ( char * ) & oldTTL, opLen ); + + return res; + + + +} + + +RakNet::RakString SocketLayer::GetSubNetForSocketAndIp(SOCKET inSock, RakNet::RakString inIpString) +{ + RakNet::RakString netMaskString; + RakNet::RakString ipString; + + + + + +#if defined(_WIN32) + INTERFACE_INFO InterfaceList[20]; + unsigned long nBytesReturned; + if (WSAIoctl(inSock, SIO_GET_INTERFACE_LIST, 0, 0, &InterfaceList, + sizeof(InterfaceList), &nBytesReturned, 0, 0) == SOCKET_ERROR) { + return ""; + } + + int nNumInterfaces = nBytesReturned / sizeof(INTERFACE_INFO); + + for (int i = 0; i < nNumInterfaces; ++i) + { + sockaddr_in *pAddress; + pAddress = (sockaddr_in *) & (InterfaceList[i].iiAddress); + ipString=inet_ntoa(pAddress->sin_addr); + + if (inIpString==ipString) + { + pAddress = (sockaddr_in *) & (InterfaceList[i].iiNetmask); + netMaskString=inet_ntoa(pAddress->sin_addr); + return netMaskString; + } + } + return ""; +#else + + int fd,fd2; + fd2 = socket__(AF_INET, SOCK_DGRAM, 0); + + if(fd2 < 0) + { + return ""; + } + + struct ifconf ifc; + char buf[1999]; + ifc.ifc_len = sizeof(buf); + ifc.ifc_buf = buf; + if(ioctl(fd2, SIOCGIFCONF, &ifc) < 0) + { + return ""; + } + + struct ifreq *ifr; + ifr = ifc.ifc_req; + int intNum = ifc.ifc_len / sizeof(struct ifreq); + for(int i = 0; i < intNum; i++) + { + ipString=inet_ntoa(((struct sockaddr_in *)&ifr[i].ifr_addr)->sin_addr); + + if (inIpString==ipString) + { + struct ifreq ifr2; + fd = socket__(AF_INET, SOCK_DGRAM, 0); + if(fd < 0) + { + return ""; + } + ifr2.ifr_addr.sa_family = AF_INET; + + strncpy(ifr2.ifr_name, ifr[i].ifr_name, IFNAMSIZ-1); + + ioctl(fd, SIOCGIFNETMASK, &ifr2); + + close(fd); + close(fd2); + netMaskString=inet_ntoa(((struct sockaddr_in *)&ifr2.ifr_addr)->sin_addr); + + return netMaskString; + } + } + + close(fd2); + return ""; + +#endif + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +void GetMyIP_Win32( SystemAddress addresses[MAXIMUM_NUMBER_OF_INTERNAL_IDS] ) +{ + char ac[ 80 ]; + if ( gethostname( ac, sizeof( ac ) ) == -1 ) + { + #if defined(_WIN32) + DWORD dwIOError = GetLastError(); + LPVOID messageBuffer; + FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, dwIOError, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), // Default language + ( LPTSTR ) & messageBuffer, 0, NULL ); + // something has gone wrong here... + RAKNET_DEBUG_PRINTF( "gethostname failed:Error code - %d\n%s", dwIOError, messageBuffer ); + //Free the buffer. + LocalFree( messageBuffer ); + #endif + return ; + } + + +#if RAKNET_SUPPORT_IPV6==1 + struct addrinfo hints; + struct addrinfo *servinfo=0, *aip; // will point to the results + PrepareAddrInfoHints(&hints); + getaddrinfo(ac, "", &hints, &servinfo); + + int idx; + for (idx=0, aip = servinfo; aip != NULL && idx < MAXIMUM_NUMBER_OF_INTERNAL_IDS; aip = aip->ai_next, idx++) + { + if (aip->ai_family == AF_INET) + { + struct sockaddr_in *ipv4 = (struct sockaddr_in *)aip->ai_addr; + memcpy(&addresses[idx].address.addr4,ipv4,sizeof(sockaddr_in)); + } + else + { + struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)aip->ai_addr; + memcpy(&addresses[idx].address.addr4,ipv6,sizeof(sockaddr_in6)); + } + + } + + freeaddrinfo(servinfo); // free the linked-list +#else + struct hostent *phe = gethostbyname( ac ); + + if ( phe == 0 ) + { + #ifdef _WIN32 + DWORD dwIOError = GetLastError(); + LPVOID messageBuffer; + FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, dwIOError, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), // Default language + ( LPTSTR ) & messageBuffer, 0, NULL ); + // something has gone wrong here... + RAKNET_DEBUG_PRINTF( "gethostbyname failed:Error code - %d\n%s", dwIOError, messageBuffer ); + + //Free the buffer. + LocalFree( messageBuffer ); + #endif + return ; + } + int idx; + for ( idx = 0; idx < MAXIMUM_NUMBER_OF_INTERNAL_IDS; ++idx ) + { + if (phe->h_addr_list[ idx ] == 0) + break; + + memcpy(&addresses[idx].address.addr4.sin_addr,phe->h_addr_list[ idx ],sizeof(struct in_addr)); + + } +#endif + + + while (idx < MAXIMUM_NUMBER_OF_INTERNAL_IDS) + { + addresses[idx]=UNASSIGNED_SYSTEM_ADDRESS; + idx++; + } +} +// #else +/* +void GetMyIP_Linux( SystemAddress addresses[MAXIMUM_NUMBER_OF_INTERNAL_IDS] ) +{ + struct ifaddrs *ifaddr, *ifa; + int family, s; + char host[NI_MAXHOST]; + struct in_addr linux_in_addr; + + if (getifaddrs(&ifaddr) == -1) { + printf( "Error getting interface list\n"); + } + + int idx = 0; + for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { + if (!ifa->ifa_addr) continue; + family = ifa->ifa_addr->sa_family; + + if (family == AF_INET) { + s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); + if (s != 0) { + // printf ("getnameinfo() failed: %s\n", gai_strerror(s)); + } + else if (strcmp(host,"127.0.0.1")!=0) + { + if (inet_aton(host, &addresses[idx].address.addr4.sin_addr)!=0) + idx++; + } + } +#if RAKNET_SUPPORT_IPV6==1 + else + { + s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in6), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); + if (s != 0) { + // printf ("getnameinfo() failed: %s\n", gai_strerror(s)); + } + else if (strcmp(host,"::1")!=0) + { + if (inet_pton(family, host, &addresses[idx].address.addr6.sin6_addr)!=0) + idx++; + } + } +#endif + } + + for ( ; idx < MAXIMUM_NUMBER_OF_INTERNAL_IDS; ++idx ) + { + addresses[idx]=UNASSIGNED_SYSTEM_ADDRESS; + } + + freeifaddrs(ifaddr); +} +*/ + + + +void SocketLayer::GetMyIP( SystemAddress addresses[MAXIMUM_NUMBER_OF_INTERNAL_IDS] ) +{ + + + + +#if defined(_WIN32) + GetMyIP_Win32(addresses); +#else +// GetMyIP_Linux(addresses); + GetMyIP_Win32(addresses); +#endif +} + + +unsigned short SocketLayer::GetLocalPort(SOCKET s) +{ + SystemAddress sa; + GetSystemAddress(s,&sa); + return sa.GetPort(); +} +void SocketLayer::GetSystemAddress_Old ( SOCKET s, SystemAddress *systemAddressOut ) +{ + sockaddr_in sa; + memset(&sa,0,sizeof(sockaddr_in)); + socklen_t len = sizeof(sa); + if (getsockname__(s, (sockaddr*)&sa, &len)!=0) + { +#if defined(_WIN32) && defined(_DEBUG) + DWORD dwIOError = GetLastError(); + LPVOID messageBuffer; + FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, dwIOError, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), // Default language + ( LPTSTR ) & messageBuffer, 0, NULL ); + // something has gone wrong here... + RAKNET_DEBUG_PRINTF( "getsockname failed:Error code - %d\n%s", dwIOError, messageBuffer ); + + //Free the buffer. + LocalFree( messageBuffer ); +#endif + *systemAddressOut = UNASSIGNED_SYSTEM_ADDRESS; + return; + } + + systemAddressOut->SetPortNetworkOrder(sa.sin_port); + systemAddressOut->address.addr4.sin_addr.s_addr=sa.sin_addr.s_addr; +} +void SocketLayer::GetSystemAddress ( SOCKET s, SystemAddress *systemAddressOut ) +{ +#if RAKNET_SUPPORT_IPV6!=1 + GetSystemAddress_Old(s,systemAddressOut); +#else + socklen_t slen; + sockaddr_storage ss; + slen = sizeof(ss); + + if (getsockname__(s, (struct sockaddr *)&ss, &slen)!=0) + { +#if defined(_WIN32) && defined(_DEBUG) + DWORD dwIOError = GetLastError(); + LPVOID messageBuffer; + FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, dwIOError, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), // Default language + ( LPTSTR ) & messageBuffer, 0, NULL ); + // something has gone wrong here... + RAKNET_DEBUG_PRINTF( "getsockname failed:Error code - %d\n%s", dwIOError, messageBuffer ); + + //Free the buffer. + LocalFree( messageBuffer ); +#endif + systemAddressOut->FromString(0); + return; + } + + if (ss.ss_family==AF_INET) + { + memcpy(&systemAddressOut->address.addr4,(sockaddr_in *)&ss,sizeof(sockaddr_in)); + systemAddressOut->debugPort=ntohs(systemAddressOut->address.addr4.sin_port); + + uint32_t zero = 0; + if (memcmp(&systemAddressOut->address.addr4.sin_addr.s_addr, &zero, sizeof(zero))==0) + systemAddressOut->SetToLoopback(4); + // systemAddressOut->address.addr4.sin_port=ntohs(systemAddressOut->address.addr4.sin_port); + } + else + { + memcpy(&systemAddressOut->address.addr6,(sockaddr_in6 *)&ss,sizeof(sockaddr_in6)); + systemAddressOut->debugPort=ntohs(systemAddressOut->address.addr6.sin6_port); + + char zero[16]; + memset(zero,0,sizeof(zero)); + if (memcmp(&systemAddressOut->address.addr4.sin_addr.s_addr, &zero, sizeof(zero))==0) + systemAddressOut->SetToLoopback(6); + + // systemAddressOut->address.addr6.sin6_port=ntohs(systemAddressOut->address.addr6.sin6_port); + } +#endif // #if RAKNET_SUPPORT_IPV6!=1 +} + +void SocketLayer::SetSocketLayerOverride(SocketLayerOverride *_slo) +{ + slo=_slo; +} + +bool SocketLayer::GetFirstBindableIP(char firstBindable[128], int ipProto) +{ + SystemAddress ipList[ MAXIMUM_NUMBER_OF_INTERNAL_IDS ]; + SocketLayer::GetMyIP( ipList ); + + + if (ipProto==AF_UNSPEC) + + { + ipList[0].ToString(false,firstBindable); + return true; + } + + // Find the first valid host address + unsigned int l; + for (l=0; l < MAXIMUM_NUMBER_OF_INTERNAL_IDS; l++) + { + if (ipList[l]==UNASSIGNED_SYSTEM_ADDRESS) + break; + if (ipList[l].GetIPVersion()==4 && ipProto==AF_INET) + break; + if (ipList[l].GetIPVersion()==6 && ipProto==AF_INET6) + break; + } + + if (ipList[l]==UNASSIGNED_SYSTEM_ADDRESS || l==MAXIMUM_NUMBER_OF_INTERNAL_IDS) + return false; +// RAKNET_DEBUG_PRINTF("%i %i %i %i\n", +// ((char*)(&ipList[l].address.addr4.sin_addr.s_addr))[0], +// ((char*)(&ipList[l].address.addr4.sin_addr.s_addr))[1], +// ((char*)(&ipList[l].address.addr4.sin_addr.s_addr))[2], +// ((char*)(&ipList[l].address.addr4.sin_addr.s_addr))[3] +// ); + ipList[l].ToString(false,firstBindable); + return true; + +} + + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SocketLayer.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SocketLayer.h new file mode 100644 index 0000000..ba089fa --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SocketLayer.h @@ -0,0 +1,164 @@ +/// \file +/// \brief SocketLayer class implementation +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + + +#ifndef __SOCKET_LAYER_H +#define __SOCKET_LAYER_H + +#include "RakMemoryOverride.h" +#include "SocketIncludes.h" +#include "RakNetTypes.h" +#include "RakNetSmartPtr.h" +#include "RakNetSocket.h" +#include "Export.h" +#include "MTUSize.h" +#include "RakString.h" + +//#include "ClientContextStruct.h" + +namespace RakNet +{ +/// Forward declarations +class RakPeer; + +class RAK_DLL_EXPORT SocketLayerOverride +{ +public: + SocketLayerOverride() {} + virtual ~SocketLayerOverride() {} + + /// Called when SendTo would otherwise occur. + virtual int RakNetSendTo( SOCKET s, const char *data, int length, const SystemAddress &systemAddress )=0; + + /// Called when RecvFrom would otherwise occur. Return number of bytes read. Write data into dataOut + // Return -1 to use RakNet's normal recvfrom, 0 to abort RakNet's normal recvfrom, and positive to return data + virtual int RakNetRecvFrom( const SOCKET sIn, RakPeer *rakPeerIn, char dataOut[ MAXIMUM_MTU_SIZE ], SystemAddress *senderOut, bool calledFromMainThread )=0; +}; + + +// A platform independent implementation of Berkeley sockets, with settings used by RakNet +class RAK_DLL_EXPORT SocketLayer +{ + +public: + + /// Default Constructor + SocketLayer(); + + // Destructor + ~SocketLayer(); + + /// Creates a bound socket to listen for incoming connections on the specified port + /// \param[in] port the port number + /// \param[in] blockingSocket + /// \return A new socket used for accepting clients + static SOCKET CreateBoundSocket( unsigned short port, bool blockingSocket, const char *forceHostAddress, unsigned int sleepOn10048, unsigned int extraSocketOptions, unsigned short socketFamily ); + static SOCKET CreateBoundSocket_Old( unsigned short port, bool blockingSocket, const char *forceHostAddress, unsigned int sleepOn10048, unsigned int extraSocketOptions ); + static SOCKET CreateBoundSocket_PS3Lobby( unsigned short port, bool blockingSocket, const char *forceHostAddress, unsigned short socketFamily ); + static SOCKET CreateBoundSocket_PSP2( unsigned short port, bool blockingSocket, const char *forceHostAddress, unsigned short socketFamily ); + + /// Returns if this specified port is in use, for UDP + /// \param[in] port the port number + /// \return If this port is already in use + static bool IsPortInUse_Old(unsigned short port, const char *hostAddress); + static bool IsPortInUse(unsigned short port, const char *hostAddress, unsigned short socketFamily ); + static bool IsSocketFamilySupported(const char *hostAddress, unsigned short socketFamily); + + static const char* DomainNameToIP_Old( const char *domainName ); + static const char* DomainNameToIP( const char *domainName ); + + /// Write \a data of length \a length to \a writeSocket + /// \param[in] writeSocket The socket to write to + /// \param[in] data The data to write + /// \param[in] length The length of \a data + static void Write( const SOCKET writeSocket, const char* data, const int length ); + + /// Read data from a socket + /// \param[in] s the socket + /// \param[in] rakPeer The instance of rakPeer containing the recvFrom C callback + /// \param[in] errorCode An error code if an error occured . + /// \param[in] connectionSocketIndex Which of the sockets in RakPeer we are using + /// \return Returns true if you successfully read data, false on error. + static void RecvFromBlocking_Old( const SOCKET s, RakPeer *rakPeer, unsigned short remotePortRakNetWasStartedOn_PS3, unsigned int extraSocketOptions, char *dataOut, int *bytesReadOut, SystemAddress *systemAddressOut, RakNet::TimeUS *timeRead ); + static void RecvFromBlocking( const SOCKET s, RakPeer *rakPeer, unsigned short remotePortRakNetWasStartedOn_PS3, unsigned int extraSocketOptions, char *dataOut, int *bytesReadOut, SystemAddress *systemAddressOut, RakNet::TimeUS *timeRead ); + + /// Given a socket and IP, retrieves the subnet mask, on linux the socket is unused + /// \param[in] inSock the socket + /// \param[in] inIpString The ip of the interface you wish to retrieve the subnet mask from + /// \return Returns the ip dotted subnet mask if successful, otherwise returns empty string ("") + static RakNet::RakString GetSubNetForSocketAndIp(SOCKET inSock, RakNet::RakString inIpString); + + + /// Sets the socket flags to nonblocking + /// \param[in] listenSocket the socket to set + static void SetNonBlocking( SOCKET listenSocket); + + + /// Retrieve all local IP address in a string format. + /// \param[in] s The socket whose port we are referring to + /// \param[in] ipList An array of ip address in dotted notation. + static void GetMyIP( SystemAddress addresses[MAXIMUM_NUMBER_OF_INTERNAL_IDS] ); + + + /// Call sendto (UDP obviously) + /// \param[in] s the socket + /// \param[in] data The byte buffer to send + /// \param[in] length The length of the \a data in bytes + /// \param[in] ip The address of the remote host in dotted notation. + /// \param[in] port The port number to send to. + /// \return 0 on success, nonzero on failure. +// static int SendTo( SOCKET s, const char *data, int length, const char ip[ 16 ], unsigned short port, unsigned short remotePortRakNetWasStartedOn_PS3, unsigned int extraSocketOptions, const char *file, const long line ); + + /// Call sendto (UDP obviously) + /// It won't reach the recipient, except on a LAN + /// However, this is good for opening routers / firewalls + /// \param[in] s the socket + /// \param[in] data The byte buffer to send + /// \param[in] length The length of the \a data in bytes + /// \param[in] ip The address of the remote host in dotted notation. + /// \param[in] port The port number to send to. + /// \param[in] ttl Max hops of datagram + /// \return 0 on success, nonzero on failure. + static int SendToTTL( SOCKET s, const char *data, int length, SystemAddress &systemAddress, int ttl ); + + /// Call sendto (UDP obviously) + /// \param[in] s the socket + /// \param[in] data The byte buffer to send + /// \param[in] length The length of the \a data in bytes + /// \param[in] binaryAddress The address of the remote host in binary format. + /// \param[in] port The port number to send to. + /// \return 0 on success, nonzero on failure. + static int SendTo( SOCKET s, const char *data, int length, SystemAddress &systemAddress, unsigned short remotePortRakNetWasStartedOn_PS3, unsigned int extraSocketOptions, const char *file, const long line ); + + static unsigned short GetLocalPort(SOCKET s); + static void GetSystemAddress_Old ( SOCKET s, SystemAddress *systemAddressOut ); + static void GetSystemAddress ( SOCKET s, SystemAddress *systemAddressOut ); + + static void SetSocketLayerOverride(SocketLayerOverride *_slo); + static SocketLayerOverride* GetSocketLayerOverride(void) {return slo;} + + static int SendTo_PS3Lobby( SOCKET s, const char *data, int length, const SystemAddress &systemAddress, unsigned short remotePortRakNetWasStartedOn_PS3 ); + static int SendTo_PSP2( SOCKET s, const char *data, int length, const SystemAddress &systemAddress, unsigned short remotePortRakNetWasStartedOn_PS3 ); + static int SendTo_360( SOCKET s, const char *data, int length, const char *voiceData, int voiceLength, const SystemAddress &systemAddress, unsigned int extraSocketOptions ); + static int SendTo_PC( SOCKET s, const char *data, int length, const SystemAddress &systemAddress, const char *file, const long line ); + + static void SetDoNotFragment( SOCKET listenSocket, int opt, int IPPROTO ); + + + // AF_INET (default). For IPV6, use AF_INET6. To autoselect, use AF_UNSPEC. + static bool GetFirstBindableIP(char firstBindable[128], int ipProto); + +private: + + static void SetSocketOptions( SOCKET listenSocket); + static SocketLayerOverride *slo; +}; + +} // namespace RakNet + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/StringCompressor.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/StringCompressor.cpp new file mode 100644 index 0000000..dd63f84 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/StringCompressor.cpp @@ -0,0 +1,499 @@ +/// \file +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#include "StringCompressor.h" +#include "DS_HuffmanEncodingTree.h" +#include "BitStream.h" +#include "RakString.h" +#include "RakAssert.h" +#include + +#include + + + + + +using namespace RakNet; + +StringCompressor* StringCompressor::instance=0; +int StringCompressor::referenceCount=0; + +void StringCompressor::AddReference(void) +{ + if (++referenceCount==1) + { + instance = RakNet::OP_NEW( _FILE_AND_LINE_ ); + } +} +void StringCompressor::RemoveReference(void) +{ + RakAssert(referenceCount > 0); + + if (referenceCount > 0) + { + if (--referenceCount==0) + { + RakNet::OP_DELETE(instance, _FILE_AND_LINE_); + instance=0; + } + } +} + +StringCompressor* StringCompressor::Instance(void) +{ + return instance; +} + +unsigned int englishCharacterFrequencies[ 256 ] = +{ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 722, + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 11084, + 58, + 63, + 1, + 0, + 31, + 0, + 317, + 64, + 64, + 44, + 0, + 695, + 62, + 980, + 266, + 69, + 67, + 56, + 7, + 73, + 3, + 14, + 2, + 69, + 1, + 167, + 9, + 1, + 2, + 25, + 94, + 0, + 195, + 139, + 34, + 96, + 48, + 103, + 56, + 125, + 653, + 21, + 5, + 23, + 64, + 85, + 44, + 34, + 7, + 92, + 76, + 147, + 12, + 14, + 57, + 15, + 39, + 15, + 1, + 1, + 1, + 2, + 3, + 0, + 3611, + 845, + 1077, + 1884, + 5870, + 841, + 1057, + 2501, + 3212, + 164, + 531, + 2019, + 1330, + 3056, + 4037, + 848, + 47, + 2586, + 2919, + 4771, + 1707, + 535, + 1106, + 152, + 1243, + 100, + 0, + 2, + 0, + 10, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 +}; + +StringCompressor::StringCompressor() +{ + DataStructures::Map::IMPLEMENT_DEFAULT_COMPARISON(); + + // Make a default tree immediately, since this is used for RPC possibly from multiple threads at the same time + HuffmanEncodingTree *huffmanEncodingTree = RakNet::OP_NEW( _FILE_AND_LINE_ ); + huffmanEncodingTree->GenerateFromFrequencyTable( englishCharacterFrequencies ); + + huffmanEncodingTrees.Set(0, huffmanEncodingTree); +} +void StringCompressor::GenerateTreeFromStrings( unsigned char *input, unsigned inputLength, uint8_t languageId ) +{ + HuffmanEncodingTree *huffmanEncodingTree; + if (huffmanEncodingTrees.Has(languageId)) + { + huffmanEncodingTree = huffmanEncodingTrees.Get(languageId); + RakNet::OP_DELETE(huffmanEncodingTree, _FILE_AND_LINE_); + } + + unsigned index; + unsigned int frequencyTable[ 256 ]; + + if ( inputLength == 0 ) + return ; + + // Zero out the frequency table + memset( frequencyTable, 0, sizeof( frequencyTable ) ); + + // Generate the frequency table from the strings + for ( index = 0; index < inputLength; index++ ) + frequencyTable[ input[ index ] ] ++; + + // Build the tree + huffmanEncodingTree = RakNet::OP_NEW( _FILE_AND_LINE_ ); + huffmanEncodingTree->GenerateFromFrequencyTable( frequencyTable ); + huffmanEncodingTrees.Set(languageId, huffmanEncodingTree); +} + +StringCompressor::~StringCompressor() +{ + for (unsigned i=0; i < huffmanEncodingTrees.Size(); i++) + RakNet::OP_DELETE(huffmanEncodingTrees[i], _FILE_AND_LINE_); +} + +void StringCompressor::EncodeString( const char *input, int maxCharsToWrite, RakNet::BitStream *output, uint8_t languageId ) +{ + HuffmanEncodingTree *huffmanEncodingTree; + if (huffmanEncodingTrees.Has(languageId)==false) + return; + huffmanEncodingTree=huffmanEncodingTrees.Get(languageId); + + if ( input == 0 ) + { + output->WriteCompressed( (uint32_t) 0 ); + return ; + } + + RakNet::BitStream encodedBitStream; + + uint32_t stringBitLength; + + int charsToWrite; + + if ( maxCharsToWrite<=0 || ( int ) strlen( input ) < maxCharsToWrite ) + charsToWrite = ( int ) strlen( input ); + else + charsToWrite = maxCharsToWrite - 1; + + huffmanEncodingTree->EncodeArray( ( unsigned char* ) input, charsToWrite, &encodedBitStream ); + + stringBitLength = (uint32_t) encodedBitStream.GetNumberOfBitsUsed(); + + output->WriteCompressed( stringBitLength ); + + output->WriteBits( encodedBitStream.GetData(), stringBitLength ); +} + +bool StringCompressor::DecodeString( char *output, int maxCharsToWrite, RakNet::BitStream *input, uint8_t languageId ) +{ + HuffmanEncodingTree *huffmanEncodingTree; + if (huffmanEncodingTrees.Has(languageId)==false) + return false; + if (maxCharsToWrite<=0) + return false; + huffmanEncodingTree=huffmanEncodingTrees.Get(languageId); + + uint32_t stringBitLength; + int bytesInStream; + + output[ 0 ] = 0; + + if ( input->ReadCompressed( stringBitLength ) == false ) + return false; + + if ( (unsigned) input->GetNumberOfUnreadBits() < stringBitLength ) + return false; + + bytesInStream = huffmanEncodingTree->DecodeArray( input, stringBitLength, maxCharsToWrite, ( unsigned char* ) output ); + + if ( bytesInStream < maxCharsToWrite ) + output[ bytesInStream ] = 0; + else + output[ maxCharsToWrite - 1 ] = 0; + + return true; +} +#ifdef _CSTRING_COMPRESSOR +void StringCompressor::EncodeString( const CString &input, int maxCharsToWrite, RakNet::BitStream *output ) +{ + LPTSTR p = input; + EncodeString(p, maxCharsToWrite*sizeof(TCHAR), output, languageID); +} +bool StringCompressor::DecodeString( CString &output, int maxCharsToWrite, RakNet::BitStream *input, uint8_t languageId ) +{ + LPSTR p = output.GetBuffer(maxCharsToWrite*sizeof(TCHAR)); + DecodeString(p,maxCharsToWrite*sizeof(TCHAR), input, languageID); + output.ReleaseBuffer(0) + +} +#endif +#ifdef _STD_STRING_COMPRESSOR +void StringCompressor::EncodeString( const std::string &input, int maxCharsToWrite, RakNet::BitStream *output, uint8_t languageId ) +{ + EncodeString(input.c_str(), maxCharsToWrite, output, languageID); +} +bool StringCompressor::DecodeString( std::string *output, int maxCharsToWrite, RakNet::BitStream *input, uint8_t languageId ) +{ + if (maxCharsToWrite <= 0) + { + output->clear(); + return true; + } + + char *destinationBlock; + bool out; + + + if (maxCharsToWrite < MAX_ALLOCA_STACK_ALLOCATION) + { + destinationBlock = (char*) alloca(maxCharsToWrite); + out=DecodeString(destinationBlock, maxCharsToWrite, input, languageID); + *output=destinationBlock; + } + else + + { + destinationBlock = (char*) rakMalloc_Ex( maxCharsToWrite, _FILE_AND_LINE_ ); + out=DecodeString(destinationBlock, maxCharsToWrite, input, languageId); + *output=destinationBlock; + rakFree_Ex(destinationBlock, _FILE_AND_LINE_ ); + } + + return out; +} +#endif +void StringCompressor::EncodeString( const RakString *input, int maxCharsToWrite, RakNet::BitStream *output, uint8_t languageId ) +{ + EncodeString(input->C_String(), maxCharsToWrite, output, languageId); +} +bool StringCompressor::DecodeString( RakString *output, int maxCharsToWrite, RakNet::BitStream *input, uint8_t languageId ) +{ + if (maxCharsToWrite <= 0) + { + output->Clear(); + return true; + } + + char *destinationBlock; + bool out; + + + if (maxCharsToWrite < MAX_ALLOCA_STACK_ALLOCATION) + { + destinationBlock = (char*) alloca(maxCharsToWrite); + out=DecodeString(destinationBlock, maxCharsToWrite, input, languageId); + *output=destinationBlock; + } + else + + { + destinationBlock = (char*) rakMalloc_Ex( maxCharsToWrite, _FILE_AND_LINE_ ); + out=DecodeString(destinationBlock, maxCharsToWrite, input, languageId); + *output=destinationBlock; + rakFree_Ex(destinationBlock, _FILE_AND_LINE_ ); + } + + return out; +} diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/StringCompressor.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/StringCompressor.h new file mode 100644 index 0000000..ddb2405 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/StringCompressor.h @@ -0,0 +1,105 @@ +/// \file +/// \brief \b Compresses/Decompresses ASCII strings and writes/reads them to BitStream class instances. You can use this to easily serialize and deserialize your own strings. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __STRING_COMPRESSOR_H +#define __STRING_COMPRESSOR_H + +#include "Export.h" +#include "DS_Map.h" +#include "RakMemoryOverride.h" +#include "NativeTypes.h" + +#ifdef _STD_STRING_COMPRESSOR +#include +#endif + +/// Forward declaration +namespace RakNet +{ + class BitStream; + class RakString; +}; + + +namespace RakNet +{ +/// Forward declarations +class HuffmanEncodingTree; + +/// \brief Writes and reads strings to and from bitstreams. +/// +/// Only works with ASCII strings. The default compression is for English. +/// You can call GenerateTreeFromStrings to compress and decompress other languages efficiently as well. +class RAK_DLL_EXPORT StringCompressor +{ +public: + + // Destructor + ~StringCompressor(); + + /// static function because only static functions can access static members + /// The RakPeer constructor adds a reference to this class, so don't call this until an instance of RakPeer exists, or unless you call AddReference yourself. + /// \return the unique instance of the StringCompressor + static StringCompressor* Instance(void); + + /// Given an array of strings, such as a chat log, generate the optimal encoding tree for it. + /// This function is optional and if it is not called a default tree will be used instead. + /// \param[in] input An array of bytes which should point to text. + /// \param[in] inputLength Length of \a input + /// \param[in] languageID An identifier for the language / string table to generate the tree for. English is automatically created with ID 0 in the constructor. + void GenerateTreeFromStrings( unsigned char *input, unsigned inputLength, uint8_t languageId ); + + /// Writes input to output, compressed. Takes care of the null terminator for you. + /// \param[in] input Pointer to an ASCII string + /// \param[in] maxCharsToWrite The max number of bytes to write of \a input. Use 0 to mean no limit. + /// \param[out] output The bitstream to write the compressed string to + /// \param[in] languageID Which language to use + void EncodeString( const char *input, int maxCharsToWrite, RakNet::BitStream *output, uint8_t languageId=0 ); + + /// Writes input to output, uncompressed. Takes care of the null terminator for you. + /// \param[out] output A block of bytes to receive the output + /// \param[in] maxCharsToWrite Size, in bytes, of \a output . A NULL terminator will always be appended to the output string. If the maxCharsToWrite is not large enough, the string will be truncated. + /// \param[in] input The bitstream containing the compressed string + /// \param[in] languageID Which language to use + bool DecodeString( char *output, int maxCharsToWrite, RakNet::BitStream *input, uint8_t languageId=0 ); + +#ifdef _CSTRING_COMPRESSOR + void EncodeString( const CString &input, int maxCharsToWrite, RakNet::BitStream *output, uint8_t languageId=0 ); + bool DecodeString( CString &output, int maxCharsToWrite, RakNet::BitStream *input, uint8_t languageId=0 ); +#endif + +#ifdef _STD_STRING_COMPRESSOR + void EncodeString( const std::string &input, int maxCharsToWrite, RakNet::BitStream *output, uint8_t languageId=0 ); + bool DecodeString( std::string *output, int maxCharsToWrite, RakNet::BitStream *input, uint8_t languageId=0 ); +#endif + + void EncodeString( const RakNet::RakString *input, int maxCharsToWrite, RakNet::BitStream *output, uint8_t languageId=0 ); + bool DecodeString( RakNet::RakString *output, int maxCharsToWrite, RakNet::BitStream *input, uint8_t languageId=0 ); + + /// Used so I can allocate and deallocate this singleton at runtime + static void AddReference(void); + + /// Used so I can allocate and deallocate this singleton at runtime + static void RemoveReference(void); + + StringCompressor(); + +private: + + /// Singleton instance + static StringCompressor *instance; + + /// Pointer to the huffman encoding trees. + DataStructures::Map huffmanEncodingTrees; + + static int referenceCount; +}; + +} // namespace RakNet + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/StringTable.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/StringTable.cpp new file mode 100644 index 0000000..41a18c4 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/StringTable.cpp @@ -0,0 +1,140 @@ +#include "StringTable.h" +#include +#include "RakAssert.h" +#include +#include "BitStream.h" +#include "StringCompressor.h" +using namespace RakNet; + +StringTable* StringTable::instance=0; +int StringTable::referenceCount=0; + + +int RakNet::StrAndBoolComp( char *const &key, const StrAndBool &data ) +{ + return strcmp(key,(const char*)data.str); +} + +StringTable::StringTable() +{ + +} + +StringTable::~StringTable() +{ + unsigned i; + for (i=0; i < orderedStringList.Size(); i++) + { + if (orderedStringList[i].b) + rakFree_Ex(orderedStringList[i].str, _FILE_AND_LINE_ ); + } +} + +void StringTable::AddReference(void) +{ + if (++referenceCount==1) + { + instance = RakNet::OP_NEW( _FILE_AND_LINE_ ); + } +} +void StringTable::RemoveReference(void) +{ + RakAssert(referenceCount > 0); + + if (referenceCount > 0) + { + if (--referenceCount==0) + { + RakNet::OP_DELETE(instance, _FILE_AND_LINE_); + instance=0; + } + } +} + +StringTable* StringTable::Instance(void) +{ + return instance; +} + +void StringTable::AddString(const char *str, bool copyString) +{ + StrAndBool sab; + sab.b=copyString; + if (copyString) + { + sab.str = (char*) rakMalloc_Ex( strlen(str)+1, _FILE_AND_LINE_ ); + strcpy(sab.str, str); + } + else + { + sab.str=(char*)str; + } + + // If it asserts inside here you are adding duplicate strings. + orderedStringList.Insert(sab.str,sab, true, _FILE_AND_LINE_); + + // If this assert hits you need to increase the range of StringTableType + RakAssert(orderedStringList.Size() < (StringTableType)-1); + +} +void StringTable::EncodeString( const char *input, int maxCharsToWrite, RakNet::BitStream *output ) +{ + unsigned index; + bool objectExists; + // This is fast because the list is kept ordered. + index=orderedStringList.GetIndexFromKey((char*)input, &objectExists); + if (objectExists) + { + output->Write(true); + output->Write((StringTableType)index); + } + else + { + LogStringNotFound(input); + output->Write(false); + StringCompressor::Instance()->EncodeString(input, maxCharsToWrite, output); + } +} + +bool StringTable::DecodeString( char *output, int maxCharsToWrite, RakNet::BitStream *input ) +{ + bool hasIndex=false; + RakAssert(maxCharsToWrite>0); + + if (maxCharsToWrite==0) + return false; + if (!input->Read(hasIndex)) + return false; + if (hasIndex==false) + { + StringCompressor::Instance()->DecodeString(output, maxCharsToWrite, input); + } + else + { + StringTableType index; + if (!input->Read(index)) + return false; + if (index >= orderedStringList.Size()) + { +#ifdef _DEBUG + // Critical error - got a string index out of range, which means AddString was called more times on the remote system than on this system. + // All systems must call AddString the same number of types, with the same strings in the same order. + RakAssert(0); +#endif + return false; + } + + strncpy(output, orderedStringList[index].str, maxCharsToWrite); + output[maxCharsToWrite-1]=0; + } + + return true; +} +void StringTable::LogStringNotFound(const char *strName) +{ + (void) strName; + +#ifdef _DEBUG + RAKNET_DEBUG_PRINTF("Efficiency Warning! Unregistered String %s sent to StringTable.\n", strName); +#endif +} diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/StringTable.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/StringTable.h new file mode 100644 index 0000000..8e7b3b9 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/StringTable.h @@ -0,0 +1,96 @@ +/// \file +/// \brief A simple class to encode and decode known strings based on a lookup table. Similar to the StringCompressor class. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __STRING_TABLE_H +#define __STRING_TABLE_H + +#include "DS_OrderedList.h" +#include "Export.h" +#include "RakMemoryOverride.h" + +/// Forward declaration +namespace RakNet +{ + class BitStream; +}; + +/// StringTableType should be the smallest type possible, or else it defeats the purpose of the StringTable class, which is to save bandwidth. +typedef unsigned char StringTableType; + +/// The string plus a bool telling us if this string was copied or not. +struct StrAndBool +{ + char *str; + bool b; +}; + +namespace RakNet +{ + int RAK_DLL_EXPORT StrAndBoolComp( char *const &key, const StrAndBool &data ); + + /// \details This is an even more efficient alternative to StringCompressor in that it writes a single byte from a lookup table and only does compression.
    + /// if the string does not already exist in the table.
    + /// All string tables must match on all systems - hence you must add all the strings in the same order on all systems.
    + /// Furthermore, this must be done before sending packets that use this class, since the strings are ordered for fast lookup. Adding after that time would mess up all the indices so don't do it.
    + /// Don't use this class to write strings which were not previously registered with AddString, since you just waste bandwidth then. Use StringCompressor instead. + /// \brief Writes a string index, instead of the whole string + class RAK_DLL_EXPORT StringTable + { + public: + + // Destructor + ~StringTable(); + + /// static function because only static functions can access static members + /// The RakPeer constructor adds a reference to this class, so don't call this until an instance of RakPeer exists, or unless you call AddReference yourself. + /// \return the unique instance of the StringTable + static StringTable* Instance(void); + + /// Add a string to the string table. + /// \param[in] str The string to add to the string table + /// \param[in] copyString true to make a copy of the passed string (takes more memory), false to not do so (if your string is in static memory). + void AddString(const char *str, bool copyString); + + /// Writes input to output, compressed. Takes care of the null terminator for you. + /// Relies on the StringCompressor class, which is automatically reference counted in the constructor and destructor in RakPeer. You can call the reference counting functions yourself if you wish too. + /// \param[in] input Pointer to an ASCII string + /// \param[in] maxCharsToWrite The size of \a input + /// \param[out] output The bitstream to write the compressed string to + void EncodeString( const char *input, int maxCharsToWrite, RakNet::BitStream *output ); + + /// Writes input to output, uncompressed. Takes care of the null terminator for you. + /// Relies on the StringCompressor class, which is automatically reference counted in the constructor and destructor in RakPeer. You can call the reference counting functions yourself if you wish too. + /// \param[out] output A block of bytes to receive the output + /// \param[in] maxCharsToWrite Size, in bytes, of \a output . A NULL terminator will always be appended to the output string. If the maxCharsToWrite is not large enough, the string will be truncated. + /// \param[in] input The bitstream containing the compressed string + bool DecodeString( char *output, int maxCharsToWrite, RakNet::BitStream *input ); + + /// Used so I can allocate and deallocate this singleton at runtime + static void AddReference(void); + + /// Used so I can allocate and deallocate this singleton at runtime + static void RemoveReference(void); + + /// Private Constructor + StringTable(); + + protected: + /// Called when you mess up and send a string using this class that was not registered with AddString + /// \param[in] maxCharsToWrite Size, in bytes, of \a output . A NULL terminator will always be appended to the output string. If the maxCharsToWrite is not large enough, the string will be truncated. + void LogStringNotFound(const char *strName); + + /// Singleton instance + static StringTable *instance; + static int referenceCount; + + DataStructures::OrderedList orderedStringList; + }; +} + + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SuperFastHash.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SuperFastHash.cpp new file mode 100644 index 0000000..f9c22b6 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SuperFastHash.cpp @@ -0,0 +1,119 @@ +#include "SuperFastHash.h" +#include "NativeTypes.h" +#include + +#if !defined(_WIN32) +#include +#endif + +#undef get16bits + +#if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \ + || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__) +#define get16bits(d) (*((const uint16_t *) (d))) +#else +#define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\ + +(uint32_t)(((const uint8_t *)(d))[0]) ) +#endif + +static const int INCREMENTAL_READ_BLOCK=65536; + +uint32_t SuperFastHash (const char * data, int length) +{ + // All this is necessary or the hash does not match SuperFastHashIncremental + int bytesRemaining=length; + unsigned int lastHash = length; + int offset=0; + while (bytesRemaining>=INCREMENTAL_READ_BLOCK) + { + lastHash=SuperFastHashIncremental (data+offset, INCREMENTAL_READ_BLOCK, lastHash ); + bytesRemaining-=INCREMENTAL_READ_BLOCK; + offset+=INCREMENTAL_READ_BLOCK; + } + if (bytesRemaining>0) + { + lastHash=SuperFastHashIncremental (data+offset, bytesRemaining, lastHash ); + } + return lastHash; + +// return SuperFastHashIncremental(data,len,len); +} +uint32_t SuperFastHashIncremental (const char * data, int len, unsigned int lastHash ) +{ + uint32_t hash = (uint32_t) lastHash; + uint32_t tmp; + int rem; + + if (len <= 0 || data == NULL) return 0; + + rem = len & 3; + len >>= 2; + + /* Main loop */ + for (;len > 0; len--) { + hash += get16bits (data); + tmp = (get16bits (data+2) << 11) ^ hash; + hash = (hash << 16) ^ tmp; + data += 2*sizeof (uint16_t); + hash += hash >> 11; + } + + /* Handle end cases */ + switch (rem) { + case 3: hash += get16bits (data); + hash ^= hash << 16; + hash ^= data[sizeof (uint16_t)] << 18; + hash += hash >> 11; + break; + case 2: hash += get16bits (data); + hash ^= hash << 11; + hash += hash >> 17; + break; + case 1: hash += *data; + hash ^= hash << 10; + hash += hash >> 1; + } + + /* Force "avalanching" of final 127 bits */ + hash ^= hash << 3; + hash += hash >> 5; + hash ^= hash << 4; + hash += hash >> 17; + hash ^= hash << 25; + hash += hash >> 6; + + return (uint32_t) hash; + +} + +uint32_t SuperFastHashFile (const char * filename) +{ + FILE *fp = fopen(filename, "rb"); + if (fp==0) + return 0; + uint32_t hash = SuperFastHashFilePtr(fp); + fclose(fp); + return hash; +} + +uint32_t SuperFastHashFilePtr (FILE *fp) +{ + fseek(fp, 0, SEEK_END); + int length = ftell(fp); + fseek(fp, 0, SEEK_SET); + int bytesRemaining=length; + unsigned int lastHash = length; + char readBlock[INCREMENTAL_READ_BLOCK]; + while (bytesRemaining>=(int) sizeof(readBlock)) + { + fread(readBlock, sizeof(readBlock), 1, fp); + lastHash=SuperFastHashIncremental (readBlock, (int) sizeof(readBlock), lastHash ); + bytesRemaining-=(int) sizeof(readBlock); + } + if (bytesRemaining>0) + { + fread(readBlock, bytesRemaining, 1, fp); + lastHash=SuperFastHashIncremental (readBlock, bytesRemaining, lastHash ); + } + return lastHash; +} diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SuperFastHash.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SuperFastHash.h new file mode 100644 index 0000000..acf91c4 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/SuperFastHash.h @@ -0,0 +1,17 @@ +#ifndef __SUPER_FAST_HASH_H +#define __SUPER_FAST_HASH_H + +#include +#include "NativeTypes.h" + +// From http://www.azillionmonkeys.com/qed/hash.html +// Author of main code is Paul Hsieh +// I just added some convenience functions +// Also note http://burtleburtle.net/bob/hash/doobs.html, which shows that this is 20% faster than the one on that page but has more collisions + +uint32_t SuperFastHash (const char * data, int length); +uint32_t SuperFastHashIncremental (const char * data, int len, unsigned int lastHash ); +uint32_t SuperFastHashFile (const char * filename); +uint32_t SuperFastHashFilePtr (FILE *fp); + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TCPInterface.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TCPInterface.cpp new file mode 100644 index 0000000..bb4a847 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TCPInterface.cpp @@ -0,0 +1,1218 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_TCPInterface==1 + +/// \file +/// \brief A simple TCP based server allowing sends and receives. Can be connected to by a telnet client. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#include "TCPInterface.h" +#ifdef _WIN32 +typedef int socklen_t; + + +#else +#include +#include +#include +#endif +#include +#include "RakAssert.h" +#include +#include "RakAssert.h" +#include "RakSleep.h" +#include "StringCompressor.h" +#include "StringTable.h" +#include "Itoa.h" +#include "SocketLayer.h" +#include "SocketDefines.h" + +#ifdef _DO_PRINTF +#endif + +#ifdef _WIN32 +#include "WSAStartupSingleton.h" +#endif +namespace RakNet +{ +RAK_THREAD_DECLARATION(UpdateTCPInterfaceLoop); +RAK_THREAD_DECLARATION(ConnectionAttemptLoop); +} +#ifdef _MSC_VER +#pragma warning( push ) +#endif + +using namespace RakNet; + +STATIC_FACTORY_DEFINITIONS(TCPInterface,TCPInterface); + +TCPInterface::TCPInterface() +{ + isStarted=false; + threadRunning=false; + listenSocket=(SOCKET) -1; + remoteClients=0; + remoteClientsLength=0; + + StringCompressor::AddReference(); + RakNet::StringTable::AddReference(); + +#if OPEN_SSL_CLIENT_SUPPORT==1 + ctx=0; + meth=0; +#endif + +#ifdef _WIN32 + WSAStartupSingleton::AddRef(); +#endif +} +TCPInterface::~TCPInterface() +{ + Stop(); +#ifdef _WIN32 + WSAStartupSingleton::Deref(); +#endif + + RakNet::OP_DELETE_ARRAY(remoteClients,_FILE_AND_LINE_); + + StringCompressor::RemoveReference(); + RakNet::StringTable::RemoveReference(); +} +bool TCPInterface::Start(unsigned short port, unsigned short maxIncomingConnections, unsigned short maxConnections, int _threadPriority, unsigned short socketFamily) +{ + (void) socketFamily; + + if (isStarted) + return false; + + threadPriority=_threadPriority; + + if (threadPriority==-99999) + { + + +#if defined(_WIN32) + threadPriority=0; + + +#else + threadPriority=1000; +#endif + } + + isStarted=true; + if (maxConnections==0) + maxConnections=maxIncomingConnections; + if (maxConnections==0) + maxConnections=1; + remoteClientsLength=maxConnections; + remoteClients=RakNet::OP_NEW_ARRAY(maxConnections,_FILE_AND_LINE_); + + +#if RAKNET_SUPPORT_IPV6!=1 + if (maxIncomingConnections>0) + { + listenSocket = socket__(AF_INET, SOCK_STREAM, 0); + if ((int)listenSocket ==-1) + return false; + + struct sockaddr_in serverAddress; + memset(&serverAddress,0,sizeof(sockaddr_in)); + serverAddress.sin_family = AF_INET; + + serverAddress.sin_addr.s_addr = htonl(INADDR_ANY); + + serverAddress.sin_port = htons(port); + + if (bind__(listenSocket,(struct sockaddr *) &serverAddress,sizeof(serverAddress)) < 0) + return false; + + listen__(listenSocket, maxIncomingConnections); + } +#else + listenSocket=INVALID_SOCKET; + if (maxIncomingConnections>0) + { + struct addrinfo hints; + memset(&hints, 0, sizeof (addrinfo)); // make sure the struct is empty + hints.ai_family = socketFamily; // don't care IPv4 or IPv6 + hints.ai_socktype = SOCK_STREAM; // TCP sockets + hints.ai_flags = AI_PASSIVE; // fill in my IP for me + struct addrinfo *servinfo=0, *aip; // will point to the results + char portStr[32]; + Itoa(port,portStr,10); + + getaddrinfo(0, portStr, &hints, &servinfo); + for (aip = servinfo; aip != NULL; aip = aip->ai_next) + { + // Open socket. The address type depends on what + // getaddrinfo() gave us. + listenSocket = socket__(aip->ai_family, aip->ai_socktype, aip->ai_protocol); + if (listenSocket != INVALID_SOCKET) + { + int ret = bind__( listenSocket, aip->ai_addr, (int) aip->ai_addrlen ); + if (ret>=0) + { + break; + } + else + { + closesocket__(listenSocket); + listenSocket=INVALID_SOCKET; + } + } + } + + if (listenSocket==INVALID_SOCKET) + return false; + + listen__(listenSocket, maxIncomingConnections); + } +#endif // #if RAKNET_SUPPORT_IPV6!=1 + + + // Start the update thread + int errorCode; + + + + + + errorCode = RakNet::RakThread::Create(UpdateTCPInterfaceLoop, this, threadPriority); + + + if (errorCode!=0) + return false; + + while (threadRunning==false) + RakSleep(0); + + return true; +} +void TCPInterface::Stop(void) +{ + if (isStarted==false) + return; + + unsigned i; +#if OPEN_SSL_CLIENT_SUPPORT==1 + for (i=0; i < remoteClientsLength; i++) + remoteClients[i].DisconnectSSL(); +#endif + + isStarted=false; + + if (listenSocket!=(SOCKET) -1) + { +#ifdef _WIN32 + shutdown__(listenSocket, SD_BOTH); + +#else + shutdown__(listenSocket, SHUT_RDWR); +#endif + closesocket__(listenSocket); + listenSocket=(SOCKET) -1; + } + + // Abort waiting connect calls + blockingSocketListMutex.Lock(); + for (i=0; i < blockingSocketList.Size(); i++) + { + closesocket__(blockingSocketList[i]); + } + blockingSocketListMutex.Unlock(); + + // Wait for the thread to stop + while ( threadRunning ) + RakSleep(15); + + RakSleep(100); + + // Stuff from here on to the end of the function is not threadsafe + for (i=0; i < (unsigned int) remoteClientsLength; i++) + { + closesocket__(remoteClients[i].socket); +#if OPEN_SSL_CLIENT_SUPPORT==1 + remoteClients[i].FreeSSL(); +#endif + } + remoteClientsLength=0; + RakNet::OP_DELETE_ARRAY(remoteClients,_FILE_AND_LINE_); + remoteClients=0; + + incomingMessages.Clear(_FILE_AND_LINE_); + newIncomingConnections.Clear(_FILE_AND_LINE_); + newRemoteClients.Clear(_FILE_AND_LINE_); + lostConnections.Clear(_FILE_AND_LINE_); + requestedCloseConnections.Clear(_FILE_AND_LINE_); + failedConnectionAttempts.Clear(_FILE_AND_LINE_); + completedConnectionAttempts.Clear(_FILE_AND_LINE_); + failedConnectionAttempts.Clear(_FILE_AND_LINE_); + for (i=0; i < headPush.Size(); i++) + DeallocatePacket(headPush[i]); + headPush.Clear(_FILE_AND_LINE_); + for (i=0; i < tailPush.Size(); i++) + DeallocatePacket(tailPush[i]); + tailPush.Clear(_FILE_AND_LINE_); + +#if OPEN_SSL_CLIENT_SUPPORT==1 + SSL_CTX_free (ctx); + startSSL.Clear(_FILE_AND_LINE_); + activeSSLConnections.Clear(false, _FILE_AND_LINE_); +#endif + + + + + +} +SystemAddress TCPInterface::Connect(const char* host, unsigned short remotePort, bool block, unsigned short socketFamily) +{ + if (threadRunning==false) + return UNASSIGNED_SYSTEM_ADDRESS; + + int newRemoteClientIndex=-1; + for (newRemoteClientIndex=0; newRemoteClientIndex < remoteClientsLength; newRemoteClientIndex++) + { + remoteClients[newRemoteClientIndex].isActiveMutex.Lock(); + if (remoteClients[newRemoteClientIndex].isActive==false) + { + remoteClients[newRemoteClientIndex].SetActive(true); + remoteClients[newRemoteClientIndex].isActiveMutex.Unlock(); + break; + } + remoteClients[newRemoteClientIndex].isActiveMutex.Unlock(); + } + if (newRemoteClientIndex==-1) + return UNASSIGNED_SYSTEM_ADDRESS; + + if (block) + { + SystemAddress systemAddress; + systemAddress.FromString(host); + systemAddress.SetPort(remotePort); + systemAddress.systemIndex=(SystemIndex) newRemoteClientIndex; + char buffout[128]; + systemAddress.ToString(false,buffout); + + SOCKET sockfd = SocketConnect(buffout, remotePort, socketFamily); + if (sockfd==(SOCKET)-1) + { + remoteClients[newRemoteClientIndex].isActiveMutex.Lock(); + remoteClients[newRemoteClientIndex].SetActive(false); + remoteClients[newRemoteClientIndex].isActiveMutex.Unlock(); + + failedConnectionAttemptMutex.Lock(); + failedConnectionAttempts.Push(systemAddress, _FILE_AND_LINE_ ); + failedConnectionAttemptMutex.Unlock(); + + return UNASSIGNED_SYSTEM_ADDRESS; + } + + remoteClients[newRemoteClientIndex].socket=sockfd; + remoteClients[newRemoteClientIndex].systemAddress=systemAddress; + + completedConnectionAttemptMutex.Lock(); + completedConnectionAttempts.Push(remoteClients[newRemoteClientIndex].systemAddress, _FILE_AND_LINE_ ); + completedConnectionAttemptMutex.Unlock(); + + return remoteClients[newRemoteClientIndex].systemAddress; + } + else + { + ThisPtrPlusSysAddr *s = RakNet::OP_NEW( _FILE_AND_LINE_ ); + s->systemAddress.FromStringExplicitPort(host,remotePort); + s->systemAddress.systemIndex=(SystemIndex) newRemoteClientIndex; + s->tcpInterface=this; + s->socketFamily=socketFamily; + + // Start the connection thread + int errorCode; + + + + + errorCode = RakNet::RakThread::Create(ConnectionAttemptLoop, s, threadPriority); + + if (errorCode!=0) + { + RakNet::OP_DELETE(s, _FILE_AND_LINE_); + failedConnectionAttempts.Push(s->systemAddress, _FILE_AND_LINE_ ); + } + return UNASSIGNED_SYSTEM_ADDRESS; + } +} +#if OPEN_SSL_CLIENT_SUPPORT==1 +void TCPInterface::StartSSLClient(SystemAddress systemAddress) +{ + if (ctx==0) + { + sharedSslMutex.Lock(); + SSLeay_add_ssl_algorithms(); + meth = (SSL_METHOD*) SSLv2_client_method(); + SSL_load_error_strings(); + ctx = SSL_CTX_new (meth); + RakAssert(ctx!=0); + sharedSslMutex.Unlock(); + } + + SystemAddress *id = startSSL.Allocate( _FILE_AND_LINE_ ); + *id=systemAddress; + startSSL.Push(id); + unsigned index = activeSSLConnections.GetIndexOf(systemAddress); + if (index==(unsigned)-1) + activeSSLConnections.Insert(systemAddress,_FILE_AND_LINE_); +} +bool TCPInterface::IsSSLActive(SystemAddress systemAddress) +{ + return activeSSLConnections.GetIndexOf(systemAddress)!=-1; +} +#endif +void TCPInterface::Send( const char *data, unsigned length, const SystemAddress &systemAddress, bool broadcast ) +{ + SendList( &data, &length, 1, systemAddress,broadcast ); +} +bool TCPInterface::SendList( const char **data, const unsigned int *lengths, const int numParameters, const SystemAddress &systemAddress, bool broadcast ) +{ + if (isStarted==false) + return false; + if (data==0) + return false; + if (systemAddress==UNASSIGNED_SYSTEM_ADDRESS && broadcast==false) + return false; + unsigned int totalLength=0; + int i; + for (i=0; i < numParameters; i++) + { + if (lengths[i]>0) + totalLength+=lengths[i]; + } + if (totalLength==0) + return false; + + if (broadcast) + { + // Send to all, possible exception system + for (i=0; i < remoteClientsLength; i++) + { + if (remoteClients[i].systemAddress!=systemAddress) + { + remoteClients[i].SendOrBuffer(data, lengths, numParameters); + } + } + } + else + { + // Send to this player + if (systemAddress.systemIndexdeleteData) + { + rakFree_Ex(packet->data, _FILE_AND_LINE_ ); + incomingMessages.Deallocate(packet, _FILE_AND_LINE_); + } + else + { + // Came from userspace AllocatePacket + rakFree_Ex(packet->data, _FILE_AND_LINE_ ); + RakNet::OP_DELETE(packet, _FILE_AND_LINE_); + } +} +Packet* TCPInterface::AllocatePacket(unsigned dataSize) +{ + Packet*p = RakNet::OP_NEW(_FILE_AND_LINE_); + p->data=(unsigned char*) rakMalloc_Ex(dataSize,_FILE_AND_LINE_); + p->length=dataSize; + p->bitSize=BYTES_TO_BITS(dataSize); + p->deleteData=false; + p->guid=UNASSIGNED_RAKNET_GUID; + p->systemAddress=UNASSIGNED_SYSTEM_ADDRESS; + p->systemAddress.systemIndex=(SystemIndex)-1; + return p; +} +void TCPInterface::PushBackPacket( Packet *packet, bool pushAtHead ) +{ + if (pushAtHead) + headPush.Push(packet, _FILE_AND_LINE_ ); + else + tailPush.Push(packet, _FILE_AND_LINE_ ); +} +bool TCPInterface::WasStarted(void) const +{ + return threadRunning==true; +} +int TCPInterface::Base64Encoding(const char *inputData, int dataLength, char *outputData) +{ + // http://en.wikipedia.org/wiki/Base64 + + int outputOffset, charCount; + int write3Count; + outputOffset=0; + charCount=0; + int j; + + write3Count=dataLength/3; + for (j=0; j < write3Count; j++) + { + // 6 leftmost bits from first byte, shifted to bits 7,8 are 0 + outputData[outputOffset++]=Base64Map()[inputData[j*3+0] >> 2]; + if ((++charCount % 76)==0) {outputData[outputOffset++]='\r'; outputData[outputOffset++]='\n'; charCount=0;} + + // Remaining 2 bits from first byte, placed in position, and 4 high bits from the second byte, masked to ignore bits 7,8 + outputData[outputOffset++]=Base64Map()[((inputData[j*3+0] << 4) | (inputData[j*3+1] >> 4)) & 63]; + if ((++charCount % 76)==0) {outputData[outputOffset++]='\r'; outputData[outputOffset++]='\n'; charCount=0;} + + // 4 low bits from the second byte and the two high bits from the third byte, masked to ignore bits 7,8 + outputData[outputOffset++]=Base64Map()[((inputData[j*3+1] << 2) | (inputData[j*3+2] >> 6)) & 63]; // Third 6 bits + if ((++charCount % 76)==0) {outputData[outputOffset++]='\r'; outputData[outputOffset++]='\n'; charCount=0;} + + // Last 6 bits from the third byte, masked to ignore bits 7,8 + outputData[outputOffset++]=Base64Map()[inputData[j*3+2] & 63]; + if ((++charCount % 76)==0) {outputData[outputOffset++]='\r'; outputData[outputOffset++]='\n'; charCount=0;} + } + + if (dataLength % 3==1) + { + // One input byte remaining + outputData[outputOffset++]=Base64Map()[inputData[j*3+0] >> 2]; + if ((++charCount % 76)==0) {outputData[outputOffset++]='\r'; outputData[outputOffset++]='\n'; charCount=0;} + + // Remaining 2 bits from first byte, placed in position, and 4 high bits from the second byte, masked to ignore bits 7,8 + outputData[outputOffset++]=Base64Map()[((inputData[j*3+0] << 4) | (inputData[j*3+1] >> 4)) & 63]; + if ((++charCount % 76)==0) {outputData[outputOffset++]='\r'; outputData[outputOffset++]='\n'; charCount=0;} + + // Pad with two equals + outputData[outputOffset++]='='; + outputData[outputOffset++]='='; + } + else if (dataLength % 3==2) + { + // Two input bytes remaining + + // 6 leftmost bits from first byte, shifted to bits 7,8 are 0 + outputData[outputOffset++]=Base64Map()[inputData[j*3+0] >> 2]; + if ((++charCount % 76)==0) {outputData[outputOffset++]='\r'; outputData[outputOffset++]='\n'; charCount=0;} + + // Remaining 2 bits from first byte, placed in position, and 4 high bits from the second byte, masked to ignore bits 7,8 + outputData[outputOffset++]=Base64Map()[((inputData[j*3+0] << 4) | (inputData[j*3+1] >> 4)) & 63]; + if ((++charCount % 76)==0) {outputData[outputOffset++]='\r'; outputData[outputOffset++]='\n'; charCount=0;} + + // 4 low bits from the second byte, followed by 00 + outputData[outputOffset++]=Base64Map()[(inputData[j*3+1] << 2) & 63]; // Third 6 bits + if ((++charCount % 76)==0) {outputData[outputOffset++]='\r'; outputData[outputOffset++]='\n'; charCount=0;} + + // Pad with one equal + outputData[outputOffset++]='='; + //outputData[outputOffset++]='='; + } + + // Append \r\n + outputData[outputOffset++]='\r'; + outputData[outputOffset++]='\n'; + outputData[outputOffset]=0; + + return outputOffset; +} +SystemAddress TCPInterface::HasCompletedConnectionAttempt(void) +{ + SystemAddress sysAddr=UNASSIGNED_SYSTEM_ADDRESS; + completedConnectionAttemptMutex.Lock(); + if (completedConnectionAttempts.IsEmpty()==false) + sysAddr=completedConnectionAttempts.Pop(); + completedConnectionAttemptMutex.Unlock(); + return sysAddr; +} +SystemAddress TCPInterface::HasFailedConnectionAttempt(void) +{ + SystemAddress sysAddr=UNASSIGNED_SYSTEM_ADDRESS; + failedConnectionAttemptMutex.Lock(); + if (failedConnectionAttempts.IsEmpty()==false) + sysAddr=failedConnectionAttempts.Pop(); + failedConnectionAttemptMutex.Unlock(); + return sysAddr; +} +SystemAddress TCPInterface::HasNewIncomingConnection(void) +{ + SystemAddress *out, out2; + out = newIncomingConnections.PopInaccurate(); + if (out) + { + out2=*out; + newIncomingConnections.Deallocate(out, _FILE_AND_LINE_); + return *out; + } + else + { + return UNASSIGNED_SYSTEM_ADDRESS; + } +} +SystemAddress TCPInterface::HasLostConnection(void) +{ + SystemAddress *out, out2; + out = lostConnections.PopInaccurate(); + if (out) + { + out2=*out; + lostConnections.Deallocate(out, _FILE_AND_LINE_); + return *out; + } + else + { + return UNASSIGNED_SYSTEM_ADDRESS; + } +} +void TCPInterface::GetConnectionList( SystemAddress *remoteSystems, unsigned short *numberOfSystems ) const +{ + unsigned short systemCount=0; + unsigned short maxToWrite=*numberOfSystems; + for (int i=0; i < remoteClientsLength; i++) + { + if (remoteClients[i].isActive) + { + if (systemCount < maxToWrite) + remoteSystems[systemCount]=remoteClients[i].systemAddress; + systemCount++; + } + } + *numberOfSystems=systemCount; +} +unsigned short TCPInterface::GetConnectionCount(void) const +{ + unsigned short systemCount=0; + for (int i=0; i < remoteClientsLength; i++) + { + if (remoteClients[i].isActive) + systemCount++; + } + return systemCount; +} + +unsigned int TCPInterface::GetOutgoingDataBufferSize(SystemAddress systemAddress) const +{ + unsigned bytesWritten=0; + if (systemAddress.systemIndexh_addr, server->h_length); + + + + + + + blockingSocketListMutex.Lock(); + blockingSocketList.Insert(sockfd, _FILE_AND_LINE_); + blockingSocketListMutex.Unlock(); + + // This is blocking + connectResult = connect__( sockfd, ( struct sockaddr * ) &serverAddress, sizeof( struct sockaddr ) ); + +#else + + + struct addrinfo hints, *res; + int sockfd; + memset(&hints, 0, sizeof hints); + hints.ai_family = socketFamily; + hints.ai_socktype = SOCK_STREAM; + char portStr[32]; + Itoa(remotePort,portStr,10); + getaddrinfo(host, portStr, &hints, &res); + sockfd = socket__(res->ai_family, res->ai_socktype, res->ai_protocol); + blockingSocketListMutex.Lock(); + blockingSocketList.Insert(sockfd, _FILE_AND_LINE_); + blockingSocketListMutex.Unlock(); + connectResult=connect__(sockfd, res->ai_addr, res->ai_addrlen); + freeaddrinfo(res); // free the linked-list + +#endif // #if RAKNET_SUPPORT_IPV6!=1 + + if (connectResult==-1) + { + unsigned sockfdIndex; + blockingSocketListMutex.Lock(); + sockfdIndex=blockingSocketList.GetIndexOf(sockfd); + if (sockfdIndex!=(unsigned)-1) + blockingSocketList.RemoveAtIndexFast(sockfdIndex); + blockingSocketListMutex.Unlock(); + + closesocket__(sockfd); + return (SOCKET) -1; + } + + return sockfd; +} + +RAK_THREAD_DECLARATION(RakNet::ConnectionAttemptLoop) +{ + + + + TCPInterface::ThisPtrPlusSysAddr *s = (TCPInterface::ThisPtrPlusSysAddr *) arguments; + + + + SystemAddress systemAddress = s->systemAddress; + TCPInterface *tcpInterface = s->tcpInterface; + int newRemoteClientIndex=systemAddress.systemIndex; + unsigned short socketFamily = s->socketFamily; + RakNet::OP_DELETE(s, _FILE_AND_LINE_); + + char str1[64]; + systemAddress.ToString(false, str1); + SOCKET sockfd = tcpInterface->SocketConnect(str1, systemAddress.GetPort(), socketFamily); + if (sockfd==(SOCKET)-1) + { + tcpInterface->remoteClients[newRemoteClientIndex].isActiveMutex.Lock(); + tcpInterface->remoteClients[newRemoteClientIndex].SetActive(false); + tcpInterface->remoteClients[newRemoteClientIndex].isActiveMutex.Unlock(); + + tcpInterface->failedConnectionAttemptMutex.Lock(); + tcpInterface->failedConnectionAttempts.Push(systemAddress, _FILE_AND_LINE_ ); + tcpInterface->failedConnectionAttemptMutex.Unlock(); + return 0; + } + + tcpInterface->remoteClients[newRemoteClientIndex].socket=sockfd; + tcpInterface->remoteClients[newRemoteClientIndex].systemAddress=systemAddress; + + // Notify user that the connection attempt has completed. + if (tcpInterface->threadRunning) + { + tcpInterface->completedConnectionAttemptMutex.Lock(); + tcpInterface->completedConnectionAttempts.Push(systemAddress, _FILE_AND_LINE_ ); + tcpInterface->completedConnectionAttemptMutex.Unlock(); + } + + + + + return 0; + +} + +RAK_THREAD_DECLARATION(RakNet::UpdateTCPInterfaceLoop) +{ + + + + TCPInterface * sts = ( TCPInterface * ) arguments; + + +// const int BUFF_SIZE=8096; + const unsigned int BUFF_SIZE=1048576; + //char data[ BUFF_SIZE ]; + char * data = (char*) rakMalloc_Ex(BUFF_SIZE,_FILE_AND_LINE_); + Packet *incomingMessage; + fd_set readFD, exceptionFD, writeFD; + sts->threadRunning=true; + +#if RAKNET_SUPPORT_IPV6!=1 + sockaddr_in sockAddr; + int sockAddrSize = sizeof(sockAddr); +#else + struct sockaddr_storage sockAddr; + socklen_t sockAddrSize = sizeof(sockAddr); +#endif + + int len; + SOCKET newSock; + int selectResult; + + + timeval tv; + tv.tv_sec=0; + tv.tv_usec=30000; + + + while (sts->isStarted) + { +#if OPEN_SSL_CLIENT_SUPPORT==1 + SystemAddress *sslSystemAddress; + sslSystemAddress = sts->startSSL.PopInaccurate(); + if (sslSystemAddress) + { + if (sslSystemAddress->systemIndex>=0 && + sslSystemAddress->systemIndexremoteClientsLength && + sts->remoteClients[sslSystemAddress->systemIndex].systemAddress==*sslSystemAddress) + { + sts->remoteClients[sslSystemAddress->systemIndex].InitSSL(sts->ctx,sts->meth); + } + else + { + for (int i=0; i < sts->remoteClientsLength; i++) + { + sts->remoteClients[i].isActiveMutex.Lock(); + if (sts->remoteClients[i].isActive && sts->remoteClients[i].systemAddress==*sslSystemAddress) + { + if (sts->remoteClients[i].ssl==0) + sts->remoteClients[i].InitSSL(sts->ctx,sts->meth); + } + sts->remoteClients[i].isActiveMutex.Unlock(); + } + } + sts->startSSL.Deallocate(sslSystemAddress,_FILE_AND_LINE_); + } +#endif + + + SOCKET largestDescriptor=0; // see select__()'s first parameter's documentation under linux + + + // Linux' select__() implementation changes the timeout + + tv.tv_sec=0; + tv.tv_usec=30000; + + + while (1) + { + // Reset readFD, writeFD, and exceptionFD since select seems to clear it + FD_ZERO(&readFD); + FD_ZERO(&exceptionFD); + FD_ZERO(&writeFD); +#ifdef _MSC_VER +#pragma warning( disable : 4127 ) // warning C4127: conditional expression is constant +#endif + largestDescriptor=0; + if (sts->listenSocket!=(SOCKET) -1) + { + FD_SET(sts->listenSocket, &readFD); + FD_SET(sts->listenSocket, &exceptionFD); + largestDescriptor = sts->listenSocket; // @see largestDescriptor def + } + + unsigned i; + for (i=0; i < (unsigned int) sts->remoteClientsLength; i++) + { + sts->remoteClients[i].isActiveMutex.Lock(); + if (sts->remoteClients[i].isActive && sts->remoteClients[i].socket!=INVALID_SOCKET) + { + FD_SET(sts->remoteClients[i].socket, &readFD); + FD_SET(sts->remoteClients[i].socket, &exceptionFD); + if (sts->remoteClients[i].outgoingData.GetBytesWritten()>0) + FD_SET(sts->remoteClients[i].socket, &writeFD); + if(sts->remoteClients[i].socket > largestDescriptor) // @see largestDescriptorDef + largestDescriptor = sts->remoteClients[i].socket; + } + sts->remoteClients[i].isActiveMutex.Unlock(); + } + +#ifdef _MSC_VER +#pragma warning( disable : 4244 ) // warning C4127: conditional expression is constant +#endif + + + selectResult=(int) select__(largestDescriptor+1, &readFD, &writeFD, &exceptionFD, &tv); + + + + + if (selectResult<=0) + break; + + if (sts->listenSocket!=(SOCKET) -1 && FD_ISSET(sts->listenSocket, &readFD)) + { + newSock = accept__(sts->listenSocket, (sockaddr*)&sockAddr, (socklen_t*)&sockAddrSize); + + if (newSock != (SOCKET) -1) + { + int newRemoteClientIndex=-1; + for (newRemoteClientIndex=0; newRemoteClientIndex < sts->remoteClientsLength; newRemoteClientIndex++) + { + sts->remoteClients[newRemoteClientIndex].isActiveMutex.Lock(); + if (sts->remoteClients[newRemoteClientIndex].isActive==false) + { + sts->remoteClients[newRemoteClientIndex].socket=newSock; + +#if RAKNET_SUPPORT_IPV6!=1 + sts->remoteClients[newRemoteClientIndex].systemAddress.address.addr4.sin_addr.s_addr=sockAddr.sin_addr.s_addr; + sts->remoteClients[newRemoteClientIndex].systemAddress.SetPortNetworkOrder( sockAddr.sin_port); + sts->remoteClients[newRemoteClientIndex].systemAddress.systemIndex=newRemoteClientIndex; +#else + if (sockAddr.ss_family==AF_INET) + { + memcpy(&sts->remoteClients[newRemoteClientIndex].systemAddress.address.addr4,(sockaddr_in *)&sockAddr,sizeof(sockaddr_in)); + // sts->remoteClients[newRemoteClientIndex].systemAddress.address.addr4.sin_port=ntohs( sts->remoteClients[newRemoteClientIndex].systemAddress.address.addr4.sin_port ); + } + else + { + memcpy(&sts->remoteClients[newRemoteClientIndex].systemAddress.address.addr6,(sockaddr_in6 *)&sockAddr,sizeof(sockaddr_in6)); + // sts->remoteClients[newRemoteClientIndex].systemAddress.address.addr6.sin6_port=ntohs( sts->remoteClients[newRemoteClientIndex].systemAddress.address.addr6.sin6_port ); + } + +#endif // #if RAKNET_SUPPORT_IPV6!=1 + sts->remoteClients[newRemoteClientIndex].SetActive(true); + sts->remoteClients[newRemoteClientIndex].isActiveMutex.Unlock(); + + + SystemAddress *newConnectionSystemAddress=sts->newIncomingConnections.Allocate( _FILE_AND_LINE_ ); + *newConnectionSystemAddress=sts->remoteClients[newRemoteClientIndex].systemAddress; + sts->newIncomingConnections.Push(newConnectionSystemAddress); + + break; + } + sts->remoteClients[newRemoteClientIndex].isActiveMutex.Unlock(); + } + if (newRemoteClientIndex==-1) + { + closesocket__(sts->listenSocket); + } + } + else + { +#ifdef _DO_PRINTF + RAKNET_DEBUG_PRINTF("Error: connection failed\n"); +#endif + } + } + else if (sts->listenSocket!=(SOCKET) -1 && FD_ISSET(sts->listenSocket, &exceptionFD)) + { +#ifdef _DO_PRINTF + int err; + int errlen = sizeof(err); + getsockopt__(sts->listenSocket, SOL_SOCKET, SO_ERROR,(char*)&err, &errlen); + RAKNET_DEBUG_PRINTF("Socket error %s on listening socket\n", err); +#endif + } + + { + i=0; + while (i < (unsigned int) sts->remoteClientsLength) + { + if (sts->remoteClients[i].isActive==false) + { + i++; + continue; + } + + if (FD_ISSET(sts->remoteClients[i].socket, &exceptionFD)) + { +// #ifdef _DO_PRINTF +// if (sts->listenSocket!=-1) +// { +// int err; +// int errlen = sizeof(err); +// getsockopt__(sts->listenSocket, SOL_SOCKET, SO_ERROR,(char*)&err, &errlen); +// in_addr in; +// in.s_addr = sts->remoteClients[i].systemAddress.binaryAddress; +// RAKNET_DEBUG_PRINTF("Socket error %i on %s:%i\n", err,inet_ntoa( in ), sts->remoteClients[i].systemAddress.GetPort() ); +// } +// +// #endif + // Connection lost abruptly + SystemAddress *lostConnectionSystemAddress=sts->lostConnections.Allocate( _FILE_AND_LINE_ ); + *lostConnectionSystemAddress=sts->remoteClients[i].systemAddress; + sts->lostConnections.Push(lostConnectionSystemAddress); + sts->remoteClients[i].isActiveMutex.Lock(); + sts->remoteClients[i].SetActive(false); + sts->remoteClients[i].isActiveMutex.Unlock(); + } + else + { + if (FD_ISSET(sts->remoteClients[i].socket, &readFD)) + { + // if recv returns 0 this was a graceful close + len = sts->remoteClients[i].Recv(data,BUFF_SIZE); + + + // removeme +// data[len]=0; +// printf(data); + + if (len>0) + { + incomingMessage=sts->incomingMessages.Allocate( _FILE_AND_LINE_ ); + incomingMessage->data = (unsigned char*) rakMalloc_Ex( len+1, _FILE_AND_LINE_ ); + memcpy(incomingMessage->data, data, len); + incomingMessage->data[len]=0; // Null terminate this so we can print it out as regular strings. This is different from RakNet which does not do this. +// printf("RECV: %s\n",incomingMessage->data); + incomingMessage->length=len; + incomingMessage->deleteData=true; // actually means came from SPSC, rather than AllocatePacket + incomingMessage->systemAddress=sts->remoteClients[i].systemAddress; + sts->incomingMessages.Push(incomingMessage); + } + else + { + // Connection lost gracefully + SystemAddress *lostConnectionSystemAddress=sts->lostConnections.Allocate( _FILE_AND_LINE_ ); + *lostConnectionSystemAddress=sts->remoteClients[i].systemAddress; + sts->lostConnections.Push(lostConnectionSystemAddress); + sts->remoteClients[i].isActiveMutex.Lock(); + sts->remoteClients[i].SetActive(false); + sts->remoteClients[i].isActiveMutex.Unlock(); + continue; + } + } + if (FD_ISSET(sts->remoteClients[i].socket, &writeFD)) + { + RemoteClient *rc = &sts->remoteClients[i]; + unsigned int bytesInBuffer; + int bytesAvailable; + int bytesSent; + rc->outgoingDataMutex.Lock(); + bytesInBuffer=rc->outgoingData.GetBytesWritten(); + if (bytesInBuffer>0) + { + unsigned int contiguousLength; + char* contiguousBytesPointer = rc->outgoingData.PeekContiguousBytes(&contiguousLength); + if (contiguousLength < (unsigned int) BUFF_SIZE && contiguousLength BUFF_SIZE) + bytesAvailable=BUFF_SIZE; + else + bytesAvailable=bytesInBuffer; + rc->outgoingData.ReadBytes(data,bytesAvailable,true); + bytesSent=rc->Send(data,bytesAvailable); + } + else + { + bytesSent=rc->Send(contiguousBytesPointer,contiguousLength); + } + + rc->outgoingData.IncrementReadOffset(bytesSent); + bytesInBuffer=rc->outgoingData.GetBytesWritten(); + } + rc->outgoingDataMutex.Unlock(); + } + + i++; // Nothing deleted so increment the index + } + } + } + } + + // Sleep 0 on Linux monopolizes the CPU + RakSleep(30); + } + sts->threadRunning=false; + + rakFree_Ex(data,_FILE_AND_LINE_); + + + + + return 0; + +} + +void RemoteClient::SetActive(bool a) +{ + if (isActive != a) + { + isActive=a; + Reset(); + if (isActive==false && socket!=INVALID_SOCKET) + { + closesocket__(socket); + socket=INVALID_SOCKET; + } + } +} +void RemoteClient::SendOrBuffer(const char **data, const unsigned int *lengths, const int numParameters) +{ + // True can save memory and buffer copies, but gives worse performance overall + // Do not use true for the XBOX, as it just locks up + const bool ALLOW_SEND_FROM_USER_THREAD=false; + + int parameterIndex; + if (isActive==false) + return; + parameterIndex=0; + for (; parameterIndex < numParameters; parameterIndex++) + { + outgoingDataMutex.Lock(); + if (ALLOW_SEND_FROM_USER_THREAD && outgoingData.GetBytesWritten()==0) + { + outgoingDataMutex.Unlock(); + int bytesSent = Send(data[parameterIndex],lengths[parameterIndex]); + if (bytesSent<(int) lengths[parameterIndex]) + { + // Push remainder + outgoingDataMutex.Lock(); + outgoingData.WriteBytes(data[parameterIndex]+bytesSent,lengths[parameterIndex]-bytesSent,_FILE_AND_LINE_); + outgoingDataMutex.Unlock(); + } + } + else + { + outgoingData.WriteBytes(data[parameterIndex],lengths[parameterIndex],_FILE_AND_LINE_); + outgoingDataMutex.Unlock(); + } + } +} +#if OPEN_SSL_CLIENT_SUPPORT==1 +void RemoteClient::InitSSL(SSL_CTX* ctx, SSL_METHOD *meth) +{ + (void) meth; + + ssl = SSL_new (ctx); + RakAssert(ssl); + SSL_set_fd (ssl, socket); + SSL_connect (ssl); +} +void RemoteClient::DisconnectSSL(void) +{ + if (ssl) + SSL_shutdown (ssl); /* send SSL/TLS close_notify */ +} +void RemoteClient::FreeSSL(void) +{ + if (ssl) + SSL_free (ssl); +} +int RemoteClient::Send(const char *data, unsigned int length) +{ + int err; + if (ssl) + { + return SSL_write (ssl, data, length); + } + else + return send__(socket, data, length, 0); +} +int RemoteClient::Recv(char *data, const int dataSize) +{ + if (ssl) + return SSL_read (ssl, data, dataSize); + else + return recv__(socket, data, dataSize, 0); +} +#else +int RemoteClient::Send(const char *data, unsigned int length) +{ + return send__(socket, data, length, 0); +} +int RemoteClient::Recv(char *data, const int dataSize) +{ + return recv__(socket, data, dataSize, 0); +} +#endif + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TCPInterface.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TCPInterface.h new file mode 100644 index 0000000..3d76d51 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TCPInterface.h @@ -0,0 +1,240 @@ +/// \file +/// \brief A simple TCP based server allowing sends and receives. Can be connected by any TCP client, including telnet. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_TCPInterface==1 + +#ifndef __SIMPLE_TCP_SERVER +#define __SIMPLE_TCP_SERVER + +#include "RakMemoryOverride.h" +#include "DS_List.h" +#include "RakNetTypes.h" +#include "Export.h" +#include "RakThread.h" +#include "DS_Queue.h" +#include "SimpleMutex.h" +#include "RakNetDefines.h" +#include "SocketIncludes.h" +#include "DS_ByteQueue.h" +#include "DS_ThreadsafeAllocatingQueue.h" + +#if OPEN_SSL_CLIENT_SUPPORT==1 +#include +#include +#include +#include +#include +#endif + +namespace RakNet +{ +/// Forward declarations +struct RemoteClient; + +/// \internal +/// \brief As the name says, a simple multithreaded TCP server. Used by TelnetTransport +class RAK_DLL_EXPORT TCPInterface +{ +public: + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(TCPInterface) + + TCPInterface(); + virtual ~TCPInterface(); + + /// Starts the TCP server on the indicated port + /// \param[in] port Which port to listen on. + /// \param[in] maxIncomingConnections Max incoming connections we will accept + /// \param[in] maxConnections Max total connections, which should be >= maxIncomingConnections + /// \param[in] threadPriority Passed to the thread creation routine. Use THREAD_PRIORITY_NORMAL for Windows. For Linux based systems, you MUST pass something reasonable based on the thread priorities for your application. + /// \param[in] socketFamily IP version: For IPV4, use AF_INET (default). For IPV6, use AF_INET6. To autoselect, use AF_UNSPEC. + bool Start(unsigned short port, unsigned short maxIncomingConnections, unsigned short maxConnections=0, int _threadPriority=-99999, unsigned short socketFamily=AF_INET); + + /// Stops the TCP server + void Stop(void); + + /// Connect to the specified host on the specified port + SystemAddress Connect(const char* host, unsigned short remotePort, bool block=true, unsigned short socketFamily=AF_INET); + +#if OPEN_SSL_CLIENT_SUPPORT==1 + /// Start SSL on an existing connection, notified with HasCompletedConnectionAttempt + void StartSSLClient(SystemAddress systemAddress); + + /// Was SSL started on this socket? + bool IsSSLActive(SystemAddress systemAddress); +#endif + + /// Sends a byte stream + void Send( const char *data, unsigned int length, const SystemAddress &systemAddress, bool broadcast ); + + // Sends a concatenated list of byte streams + bool SendList( const char **data, const unsigned int *lengths, const int numParameters, const SystemAddress &systemAddress, bool broadcast ); + + // Get how many bytes are waiting to be sent. If too many, you may want to skip sending + unsigned int GetOutgoingDataBufferSize(SystemAddress systemAddress) const; + + /// Returns if Receive() will return data + bool ReceiveHasPackets( void ); + + /// Returns data received + Packet* Receive( void ); + + /// Disconnects a player/address + void CloseConnection( SystemAddress systemAddress ); + + /// Deallocates a packet returned by Receive + void DeallocatePacket( Packet *packet ); + + /// Fills the array remoteSystems with the SystemAddress of all the systems we are connected to + /// \param[out] remoteSystems An array of SystemAddress structures to be filled with the SystemAddresss of the systems we are connected to. Pass 0 to remoteSystems to only get the number of systems we are connected to + /// \param[in, out] numberOfSystems As input, the size of remoteSystems array. As output, the number of elements put into the array + void GetConnectionList( SystemAddress *remoteSystems, unsigned short *numberOfSystems ) const; + + /// Returns just the number of connections we have + unsigned short GetConnectionCount(void) const; + + /// Has a previous call to connect succeeded? + /// \return UNASSIGNED_SYSTEM_ADDRESS = no. Anything else means yes. + SystemAddress HasCompletedConnectionAttempt(void); + + /// Has a previous call to connect failed? + /// \return UNASSIGNED_SYSTEM_ADDRESS = no. Anything else means yes. + SystemAddress HasFailedConnectionAttempt(void); + + /// Queued events of new incoming connections + SystemAddress HasNewIncomingConnection(void); + + /// Queued events of lost connections + SystemAddress HasLostConnection(void); + + /// Return an allocated but empty packet, for custom use + Packet* AllocatePacket(unsigned dataSize); + + // Push a packet back to the queue + virtual void PushBackPacket( Packet *packet, bool pushAtHead ); + + static const char *Base64Map(void) {return "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";} + + /// \brief Returns how many bytes were written. + static int Base64Encoding(const char *inputData, int dataLength, char *outputData); + + /// Returns if Start() was called successfully + bool WasStarted(void) const; + +protected: + + bool isStarted, threadRunning; + SOCKET listenSocket; + + DataStructures::Queue headPush, tailPush; + RemoteClient* remoteClients; + int remoteClientsLength; + + // Assuming remoteClients is only used by one thread! + // DataStructures::List remoteClients; + // Use this thread-safe queue to add to remoteClients + // DataStructures::Queue remoteClientsInsertionQueue; + // SimpleMutex remoteClientsInsertionQueueMutex; + + /* + struct OutgoingMessage + { + unsigned char* data; + SystemAddress systemAddress; + bool broadcast; + unsigned int length; + }; + */ +// DataStructures::SingleProducerConsumer outgoingMessages; +// DataStructures::SingleProducerConsumer incomingMessages; +// DataStructures::SingleProducerConsumer newIncomingConnections, lostConnections, requestedCloseConnections; +// DataStructures::SingleProducerConsumer newRemoteClients; +// DataStructures::ThreadsafeAllocatingQueue outgoingMessages; + DataStructures::ThreadsafeAllocatingQueue incomingMessages; + DataStructures::ThreadsafeAllocatingQueue newIncomingConnections, lostConnections, requestedCloseConnections; + DataStructures::ThreadsafeAllocatingQueue newRemoteClients; + SimpleMutex completedConnectionAttemptMutex, failedConnectionAttemptMutex; + DataStructures::Queue completedConnectionAttempts, failedConnectionAttempts; + + int threadPriority; + + DataStructures::List blockingSocketList; + SimpleMutex blockingSocketListMutex; + + + + + + friend RAK_THREAD_DECLARATION(UpdateTCPInterfaceLoop); + friend RAK_THREAD_DECLARATION(ConnectionAttemptLoop); + +// void DeleteRemoteClient(RemoteClient *remoteClient, fd_set *exceptionFD); +// void InsertRemoteClient(RemoteClient* remoteClient); + SOCKET SocketConnect(const char* host, unsigned short remotePort, unsigned short socketFamily); + + struct ThisPtrPlusSysAddr + { + TCPInterface *tcpInterface; + SystemAddress systemAddress; + bool useSSL; + unsigned short socketFamily; + }; + +#if OPEN_SSL_CLIENT_SUPPORT==1 + SSL_CTX* ctx; + SSL_METHOD *meth; + DataStructures::ThreadsafeAllocatingQueue startSSL; + DataStructures::List activeSSLConnections; + SimpleMutex sharedSslMutex; +#endif +}; + +/// Stores information about a remote client. +struct RemoteClient +{ + RemoteClient() { +#if OPEN_SSL_CLIENT_SUPPORT==1 + ssl=0; +#endif + isActive=false; + socket=INVALID_SOCKET; + } + SOCKET socket; + SystemAddress systemAddress; + DataStructures::ByteQueue outgoingData; + bool isActive; + SimpleMutex outgoingDataMutex; + SimpleMutex isActiveMutex; + +#if OPEN_SSL_CLIENT_SUPPORT==1 + SSL* ssl; + void InitSSL(SSL_CTX* ctx, SSL_METHOD *meth); + void DisconnectSSL(void); + void FreeSSL(void); + int Send(const char *data, unsigned int length); + int Recv(char *data, const int dataSize); +#else + int Send(const char *data, unsigned int length); + int Recv(char *data, const int dataSize); +#endif + void Reset(void) + { + outgoingDataMutex.Lock(); + outgoingData.Clear(_FILE_AND_LINE_); + outgoingDataMutex.Unlock(); + } + void SetActive(bool a); + void SendOrBuffer(const char **data, const unsigned int *lengths, const int numParameters); +}; + +} // namespace RakNet + +#endif + +#endif // _RAKNET_SUPPORT_* + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TableSerializer.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TableSerializer.cpp new file mode 100644 index 0000000..d639607 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TableSerializer.cpp @@ -0,0 +1,320 @@ +#include "TableSerializer.h" +#include "DS_Table.h" +#include "BitStream.h" +#include "StringCompressor.h" +#include "RakAssert.h" + +using namespace RakNet; + +void TableSerializer::SerializeTable(DataStructures::Table *in, RakNet::BitStream *out) +{ + DataStructures::Page *cur = in->GetRows().GetListHead(); + const DataStructures::List &columns=in->GetColumns(); + SerializeColumns(in, out); + out->Write((unsigned)in->GetRows().Size()); + unsigned rowIndex; + while (cur) + { + for (rowIndex=0; rowIndex < (unsigned)cur->size; rowIndex++) + { + SerializeRow(cur->data[rowIndex], cur->keys[rowIndex], columns, out); + } + cur=cur->next; + } +} +void TableSerializer::SerializeColumns(DataStructures::Table *in, RakNet::BitStream *out) +{ + const DataStructures::List &columns=in->GetColumns(); + out->Write((unsigned)columns.Size()); + unsigned i; + for (i=0; iEncodeString(columns[i].columnName, _TABLE_MAX_COLUMN_NAME_LENGTH, out); + out->Write((unsigned char)columns[i].columnType); + } +} +void TableSerializer::SerializeColumns(DataStructures::Table *in, RakNet::BitStream *out, DataStructures::List &skipColumnIndices) +{ + const DataStructures::List &columns=in->GetColumns(); + out->Write((unsigned)columns.Size()-skipColumnIndices.Size()); + unsigned i; + for (i=0; iEncodeString(columns[i].columnName, _TABLE_MAX_COLUMN_NAME_LENGTH, out); + out->Write((unsigned char)columns[i].columnType); + } + } +} +bool TableSerializer::DeserializeTable(unsigned char *serializedTable, unsigned int dataLength, DataStructures::Table *out) +{ + RakNet::BitStream in((unsigned char*) serializedTable, dataLength, false); + return DeserializeTable(&in, out); +} +bool TableSerializer::DeserializeTable(RakNet::BitStream *in, DataStructures::Table *out) +{ + unsigned rowSize; + DeserializeColumns(in,out); + if (in->Read(rowSize)==false || rowSize>100000) + { + RakAssert(0); + return false; // Hacker crash prevention + } + + unsigned rowIndex; + for (rowIndex=0; rowIndex < rowSize; rowIndex++) + { + if (DeserializeRow(in, out)==false) + return false; + } + return true; +} +bool TableSerializer::DeserializeColumns(RakNet::BitStream *in, DataStructures::Table *out) +{ + unsigned columnSize; + unsigned char columnType; + char columnName[_TABLE_MAX_COLUMN_NAME_LENGTH]; + if (in->Read(columnSize)==false || columnSize > 10000) + return false; // Hacker crash prevention + + out->Clear(); + unsigned i; + for (i=0; iDecodeString(columnName, 32, in); + in->Read(columnType); + out->AddColumn(columnName, (DataStructures::Table::ColumnType)columnType); + } + return true; +} +void TableSerializer::SerializeRow(DataStructures::Table::Row *in, unsigned keyIn, const DataStructures::List &columns, RakNet::BitStream *out) +{ + unsigned cellIndex; + out->Write(keyIn); + unsigned int columnsSize = columns.Size(); + out->Write(columnsSize); + for (cellIndex=0; cellIndexWrite(cellIndex); + SerializeCell(out, in->cells[cellIndex], columns[cellIndex].columnType); + } +} +void TableSerializer::SerializeRow(DataStructures::Table::Row *in, unsigned keyIn, const DataStructures::List &columns, RakNet::BitStream *out, DataStructures::List &skipColumnIndices) +{ + unsigned cellIndex; + out->Write(keyIn); + unsigned int numEntries=0; + for (cellIndex=0; cellIndexWrite(numEntries); + + for (cellIndex=0; cellIndexWrite(cellIndex); + SerializeCell(out, in->cells[cellIndex], columns[cellIndex].columnType); + } + } +} +bool TableSerializer::DeserializeRow(RakNet::BitStream *in, DataStructures::Table *out) +{ + const DataStructures::List &columns=out->GetColumns(); + unsigned numEntries; + DataStructures::Table::Row *row; + unsigned key; + if (in->Read(key)==false) + return false; + row=out->AddRow(key); + unsigned int cnt; + in->Read(numEntries); + for (cnt=0; cntRead(cellIndex); + if (DeserializeCell(in, row->cells[cellIndex], columns[cellIndex].columnType)==false) + { + out->RemoveRow(key); + return false; + } + } + return true; +} +void TableSerializer::SerializeCell(RakNet::BitStream *out, DataStructures::Table::Cell *cell, DataStructures::Table::ColumnType columnType) +{ + out->Write(cell->isEmpty); + if (cell->isEmpty==false) + { + if (columnType==DataStructures::Table::NUMERIC) + { + out->Write(cell->i); + } + else if (columnType==DataStructures::Table::STRING) + { + StringCompressor::Instance()->EncodeString(cell->c, 65535, out); + } + else if (columnType==DataStructures::Table::POINTER) + { + out->Write(cell->ptr); + } + else + { + // Binary + RakAssert(columnType==DataStructures::Table::BINARY); + RakAssert(cell->i>0); + unsigned binaryLength; + binaryLength=(unsigned)cell->i; + out->Write(binaryLength); + out->WriteAlignedBytes((const unsigned char*) cell->c, (const unsigned int) cell->i); + } + } +} +bool TableSerializer::DeserializeCell(RakNet::BitStream *in, DataStructures::Table::Cell *cell, DataStructures::Table::ColumnType columnType) +{ + bool isEmpty=false; + double value; + void *ptr; + char tempString[65535]; + cell->Clear(); + + if (in->Read(isEmpty)==false) + return false; + if (isEmpty==false) + { + if (columnType==DataStructures::Table::NUMERIC) + { + if (in->Read(value)==false) + return false; + cell->Set(value); + } + else if (columnType==DataStructures::Table::STRING) + { + if (StringCompressor::Instance()->DecodeString(tempString, 65535, in)==false) + return false; + cell->Set(tempString); + } + else if (columnType==DataStructures::Table::POINTER) + { + if (in->Read(ptr)==false) + return false; + cell->SetPtr(ptr); + } + else + { + unsigned binaryLength; + // Binary + RakAssert(columnType==DataStructures::Table::BINARY); + if (in->Read(binaryLength)==false || binaryLength > 10000000) + return false; // Sanity check to max binary cell of 10 megabytes + in->AlignReadToByteBoundary(); + if (BITS_TO_BYTES(in->GetNumberOfUnreadBits())<(BitSize_t)binaryLength) + return false; + cell->Set((char*) in->GetData()+BITS_TO_BYTES(in->GetReadOffset()), (int) binaryLength); + in->IgnoreBits(BYTES_TO_BITS((int) binaryLength)); + } + } + return true; +} +void TableSerializer::SerializeFilterQuery(RakNet::BitStream *in, DataStructures::Table::FilterQuery *query) +{ + StringCompressor::Instance()->EncodeString(query->columnName,_TABLE_MAX_COLUMN_NAME_LENGTH,in,0); + in->WriteCompressed(query->columnIndex); + in->Write((unsigned char) query->operation); + in->Write(query->cellValue->isEmpty); + if (query->cellValue->isEmpty==false) + { + in->Write(query->cellValue->i); + in->WriteAlignedBytesSafe((const char*)query->cellValue->c,(const unsigned int)query->cellValue->i,10000000); // Sanity check to max binary cell of 10 megabytes + in->Write(query->cellValue->ptr); + + } +} +bool TableSerializer::DeserializeFilterQuery(RakNet::BitStream *out, DataStructures::Table::FilterQuery *query) +{ + bool b; + RakAssert(query->cellValue); + StringCompressor::Instance()->DecodeString(query->columnName,_TABLE_MAX_COLUMN_NAME_LENGTH,out,0); + out->ReadCompressed(query->columnIndex); + unsigned char op; + out->Read(op); + query->operation=(DataStructures::Table::FilterQueryType) op; + query->cellValue->Clear(); + b=out->Read(query->cellValue->isEmpty); + if (query->cellValue->isEmpty==false) + { + // HACK - cellValue->i is used for integer, character, and binary data. However, for character and binary c will be 0. So use that to determine if the data was integer or not. + out->Read(query->cellValue->i); + unsigned int inputLength; + out->ReadAlignedBytesSafeAlloc(&query->cellValue->c,inputLength,10000000); // Sanity check to max binary cell of 10 megabytes + if (query->cellValue->c) + query->cellValue->i=inputLength; + b=out->Read(query->cellValue->ptr); + } + return b; +} +void TableSerializer::SerializeFilterQueryList(RakNet::BitStream *in, DataStructures::Table::FilterQuery *query, unsigned int numQueries, unsigned int maxQueries) +{ + (void) maxQueries; + in->Write((bool)(query && numQueries>0)); + if (query==0 || numQueries<=0) + return; + + RakAssert(numQueries<=maxQueries); + in->WriteCompressed(numQueries); + unsigned i; + for (i=0; i < numQueries; i++) + { + SerializeFilterQuery(in, query); + } +} +bool TableSerializer::DeserializeFilterQueryList(RakNet::BitStream *out, DataStructures::Table::FilterQuery **query, unsigned int *numQueries, unsigned int maxQueries, int allocateExtraQueries) +{ + bool b, anyQueries=false; + out->Read(anyQueries); + if (anyQueries==false) + { + if (allocateExtraQueries<=0) + *query=0; + else + *query=new DataStructures::Table::FilterQuery[allocateExtraQueries]; + + *numQueries=0; + return true; + } + b=out->ReadCompressed(*numQueries); + if (*numQueries>maxQueries) + { + RakAssert(0); + *numQueries=maxQueries; + } + if (*numQueries==0) + return b; + + *query=new DataStructures::Table::FilterQuery[*numQueries+allocateExtraQueries]; + DataStructures::Table::FilterQuery *queryPtr = *query; + + unsigned i; + for (i=0; i < *numQueries; i++) + { + queryPtr[i].cellValue=new DataStructures::Table::Cell; + b=DeserializeFilterQuery(out, queryPtr+i); + } + + return b; +} +void TableSerializer::DeallocateQueryList(DataStructures::Table::FilterQuery *query, unsigned int numQueries) +{ + if (query==0 || numQueries==0) + return; + + unsigned i; + for (i=0; i < numQueries; i++) + RakNet::OP_DELETE(query[i].cellValue, _FILE_AND_LINE_); + RakNet::OP_DELETE_ARRAY(query, _FILE_AND_LINE_); +} diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TableSerializer.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TableSerializer.h new file mode 100644 index 0000000..77ca30b --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TableSerializer.h @@ -0,0 +1,208 @@ +#ifndef __TABLE_SERIALIZER_H +#define __TABLE_SERIALIZER_H + +#include "RakMemoryOverride.h" +#include "DS_Table.h" +#include "Export.h" + +namespace RakNet +{ + class BitStream; +} + +namespace RakNet +{ + +class RAK_DLL_EXPORT TableSerializer +{ +public: + static void SerializeTable(DataStructures::Table *in, RakNet::BitStream *out); + static bool DeserializeTable(unsigned char *serializedTable, unsigned int dataLength, DataStructures::Table *out); + static bool DeserializeTable(RakNet::BitStream *in, DataStructures::Table *out); + static void SerializeColumns(DataStructures::Table *in, RakNet::BitStream *out); + static void SerializeColumns(DataStructures::Table *in, RakNet::BitStream *out, DataStructures::List &skipColumnIndices); + static bool DeserializeColumns(RakNet::BitStream *in, DataStructures::Table *out); + static void SerializeRow(DataStructures::Table::Row *in, unsigned keyIn, const DataStructures::List &columns, RakNet::BitStream *out); + static void SerializeRow(DataStructures::Table::Row *in, unsigned keyIn, const DataStructures::List &columns, RakNet::BitStream *out, DataStructures::List &skipColumnIndices); + static bool DeserializeRow(RakNet::BitStream *in, DataStructures::Table *out); + static void SerializeCell(RakNet::BitStream *out, DataStructures::Table::Cell *cell, DataStructures::Table::ColumnType columnType); + static bool DeserializeCell(RakNet::BitStream *in, DataStructures::Table::Cell *cell, DataStructures::Table::ColumnType columnType); + static void SerializeFilterQuery(RakNet::BitStream *in, DataStructures::Table::FilterQuery *query); + // Note that this allocates query->cell->c! + static bool DeserializeFilterQuery(RakNet::BitStream *out, DataStructures::Table::FilterQuery *query); + static void SerializeFilterQueryList(RakNet::BitStream *in, DataStructures::Table::FilterQuery *query, unsigned int numQueries, unsigned int maxQueries); + // Note that this allocates queries, cells, and query->cell->c!. Use DeallocateQueryList to free. + static bool DeserializeFilterQueryList(RakNet::BitStream *out, DataStructures::Table::FilterQuery **query, unsigned int *numQueries, unsigned int maxQueries, int allocateExtraQueries=0); + static void DeallocateQueryList(DataStructures::Table::FilterQuery *query, unsigned int numQueries); +}; + +} // namespace RakNet + +#endif + +// Test code for the table +/* +#include "LightweightDatabaseServer.h" +#include "LightweightDatabaseClient.h" +#include "TableSerializer.h" +#include "BitStream.h" +#include "StringCompressor.h" +#include "DS_Table.h" +void main(void) +{ + DataStructures::Table table; + DataStructures::Table::Row *row; + unsigned int dummydata=12345; + + // Add columns Name (string), IP (binary), score (int), and players (int). + table.AddColumn("Name", DataStructures::Table::STRING); + table.AddColumn("IP", DataStructures::Table::BINARY); + table.AddColumn("Score", DataStructures::Table::NUMERIC); + table.AddColumn("Players", DataStructures::Table::NUMERIC); + table.AddColumn("Empty Test Column", DataStructures::Table::STRING); + RakAssert(table.GetColumnCount()==5); + row=table.AddRow(0); + RakAssert(row); + row->UpdateCell(0,"Kevin Jenkins"); + row->UpdateCell(1,sizeof(dummydata), (char*)&dummydata); + row->UpdateCell(2,5); + row->UpdateCell(3,10); + //row->UpdateCell(4,"should be unique"); + + row=table.AddRow(1); + row->UpdateCell(0,"Kevin Jenkins"); + row->UpdateCell(1,sizeof(dummydata), (char*)&dummydata); + row->UpdateCell(2,5); + row->UpdateCell(3,15); + + row=table.AddRow(2); + row->UpdateCell(0,"Kevin Jenkins"); + row->UpdateCell(1,sizeof(dummydata), (char*)&dummydata); + row->UpdateCell(2,5); + row->UpdateCell(3,20); + + row=table.AddRow(3); + RakAssert(row); + row->UpdateCell(0,"Kevin Jenkins"); + row->UpdateCell(1,sizeof(dummydata), (char*)&dummydata); + row->UpdateCell(2,15); + row->UpdateCell(3,5); + row->UpdateCell(4,"col index 4"); + + row=table.AddRow(4); + RakAssert(row); + row->UpdateCell(0,"Kevin Jenkins"); + row->UpdateCell(1,sizeof(dummydata), (char*)&dummydata); + //row->UpdateCell(2,25); + row->UpdateCell(3,30); + //row->UpdateCell(4,"should be unique"); + + row=table.AddRow(5); + RakAssert(row); + row->UpdateCell(0,"Kevin Jenkins"); + row->UpdateCell(1,sizeof(dummydata), (char*)&dummydata); + //row->UpdateCell(2,25); + row->UpdateCell(3,5); + //row->UpdateCell(4,"should be unique"); + + row=table.AddRow(6); + RakAssert(row); + row->UpdateCell(0,"Kevin Jenkins"); + row->UpdateCell(1,sizeof(dummydata), (char*)&dummydata); + row->UpdateCell(2,35); + //row->UpdateCell(3,40); + //row->UpdateCell(4,"should be unique"); + + row=table.AddRow(7); + RakAssert(row); + row->UpdateCell(0,"Bob Jenkins"); + + row=table.AddRow(8); + RakAssert(row); + row->UpdateCell(0,"Zack Jenkins"); + + // Test multi-column sorting + DataStructures::Table::Row *rows[30]; + DataStructures::Table::SortQuery queries[4]; + queries[0].columnIndex=0; + queries[0].operation=DataStructures::Table::QS_INCREASING_ORDER; + queries[1].columnIndex=1; + queries[1].operation=DataStructures::Table::QS_INCREASING_ORDER; + queries[2].columnIndex=2; + queries[2].operation=DataStructures::Table::QS_INCREASING_ORDER; + queries[3].columnIndex=3; + queries[3].operation=DataStructures::Table::QS_DECREASING_ORDER; + table.SortTable(queries, 4, rows); + unsigned i; + char out[256]; + RAKNET_DEBUG_PRINTF("Sort: Ascending except for column index 3\n"); + for (i=0; i < table.GetRowCount(); i++) + { + table.PrintRow(out,256,',',true, rows[i]); + RAKNET_DEBUG_PRINTF("%s\n", out); + } + + // Test query: + // Don't return column 3, and swap columns 0 and 2 + unsigned columnsToReturn[4]; + columnsToReturn[0]=2; + columnsToReturn[1]=1; + columnsToReturn[2]=0; + columnsToReturn[3]=4; + DataStructures::Table resultsTable; + table.QueryTable(columnsToReturn,4,0,0,&resultsTable); + RAKNET_DEBUG_PRINTF("Query: Don't return column 3, and swap columns 0 and 2:\n"); + for (i=0; i < resultsTable.GetRowCount(); i++) + { + resultsTable.PrintRow(out,256,',',true, resultsTable.GetRowByIndex(i)); + RAKNET_DEBUG_PRINTF("%s\n", out); + } + + // Test filter: + // Only return rows with column index 4 empty + DataStructures::Table::FilterQuery inclusionFilters[3]; + inclusionFilters[0].columnIndex=4; + inclusionFilters[0].operation=DataStructures::Table::QF_IS_EMPTY; + // inclusionFilters[0].cellValue; // Unused for IS_EMPTY + table.QueryTable(0,0,inclusionFilters,1,&resultsTable); + RAKNET_DEBUG_PRINTF("Filter: Only return rows with column index 4 empty:\n"); + for (i=0; i < resultsTable.GetRowCount(); i++) + { + resultsTable.PrintRow(out,256,',',true, resultsTable.GetRowByIndex(i)); + RAKNET_DEBUG_PRINTF("%s\n", out); + } + + // Column 5 empty and column 0 == Kevin Jenkins + inclusionFilters[0].columnIndex=4; + inclusionFilters[0].operation=DataStructures::Table::QF_IS_EMPTY; + inclusionFilters[1].columnIndex=0; + inclusionFilters[1].operation=DataStructures::Table::QF_EQUAL; + inclusionFilters[1].cellValue.Set("Kevin Jenkins"); + table.QueryTable(0,0,inclusionFilters,2,&resultsTable); + RAKNET_DEBUG_PRINTF("Filter: Column 5 empty and column 0 == Kevin Jenkins:\n"); + for (i=0; i < resultsTable.GetRowCount(); i++) + { + resultsTable.PrintRow(out,256,',',true, resultsTable.GetRowByIndex(i)); + RAKNET_DEBUG_PRINTF("%s\n", out); + } + + RakNet::BitStream bs; + RAKNET_DEBUG_PRINTF("PreSerialize:\n"); + for (i=0; i < table.GetRowCount(); i++) + { + table.PrintRow(out,256,',',true, table.GetRowByIndex(i)); + RAKNET_DEBUG_PRINTF("%s\n", out); + } + StringCompressor::AddReference(); + TableSerializer::Serialize(&table, &bs); + TableSerializer::Deserialize(&bs, &table); + StringCompressor::RemoveReference(); + RAKNET_DEBUG_PRINTF("PostDeserialize:\n"); + for (i=0; i < table.GetRowCount(); i++) + { + table.PrintRow(out,256,',',true, table.GetRowByIndex(i)); + RAKNET_DEBUG_PRINTF("%s\n", out); + } + int a=5; +} +*/ diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TeamBalancer.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TeamBalancer.cpp new file mode 100644 index 0000000..90cc9e0 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TeamBalancer.cpp @@ -0,0 +1,874 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_TeamBalancer==1 + +#include "TeamBalancer.h" +#include "BitStream.h" +#include "MessageIdentifiers.h" +#include "RakPeerInterface.h" +#include "Rand.h" + +using namespace RakNet; + +enum TeamBalancerOperations +{ + ID_STATUS_UPDATE_TO_NEW_HOST, + ID_CANCEL_TEAM_REQUEST, + ID_REQUEST_ANY_TEAM, + ID_REQUEST_SPECIFIC_TEAM +}; + +STATIC_FACTORY_DEFINITIONS(TeamBalancer,TeamBalancer); + +TeamBalancer::TeamBalancer() +{ + defaultAssigmentAlgorithm=SMALLEST_TEAM; + forceTeamsToBeEven=false; + lockTeams=false; + hostGuid=UNASSIGNED_RAKNET_GUID; +} +TeamBalancer::~TeamBalancer() +{ + +} +void TeamBalancer::SetTeamSizeLimit(TeamId team, unsigned short limit) +{ + teamLimits.Replace(limit,0,team,_FILE_AND_LINE_); + if (teamLimits.Size() > teamMemberCounts.Size()) + teamMemberCounts.Replace(0,0,teamLimits.Size()-1,_FILE_AND_LINE_); +} +void TeamBalancer::SetDefaultAssignmentAlgorithm(DefaultAssigmentAlgorithm daa) +{ + // Just update the default. Currently active teams are not affected. + defaultAssigmentAlgorithm=daa; +} +void TeamBalancer::SetForceEvenTeams(bool force) +{ + // Set flag to indicate that teams should be even. + forceTeamsToBeEven=force; + + // If teams are locked, just return. + if (lockTeams==true) + return; + + if (forceTeamsToBeEven==true) + { + // Run the even team algorithm + EvenTeams(); + } +} +void TeamBalancer::SetLockTeams(bool lock) +{ + if (lock==lockTeams) + return; + + // Set flag to indicate that teams can no longer be changed. + lockTeams=lock; + + // If lock is false, and teams were set to be forced as even, then run through the even team algorithm + if (lockTeams==false) + { + // Process even swaps + TeamId i,j; + for (i=0; i < teamMembers.Size(); i++) + { + if (teamMembers[i].requestedTeam!=UNASSIGNED_TEAM_ID) + { + for (j=i+1; j < teamMembers.Size(); j++) + { + if (teamMembers[j].requestedTeam==teamMembers[i].currentTeam && + teamMembers[i].requestedTeam==teamMembers[j].currentTeam) + { + SwapTeamMembersByRequest(i,j); + NotifyTeamAssigment(i); + NotifyTeamAssigment(j); + } + } + } + } + + if (forceTeamsToBeEven==true) + { + EvenTeams(); + } + else + { + // Process requested team changes + // Process movement while not full + for (i=0; i < teamMembers.Size(); i++) + { + TeamId requestedTeam = teamMembers[i].requestedTeam; + if (requestedTeam!=UNASSIGNED_TEAM_ID) + { + if (teamMemberCounts[requestedTeam]Send(&bsOut,HIGH_PRIORITY,RELIABLE_ORDERED,0,hostGuid,false); +} +void TeamBalancer::CancelRequestSpecificTeam(NetworkID memberId) +{ + for (unsigned int i=0; i < myTeamMembers.Size(); i++) + { + if (myTeamMembers[i].memberId==memberId) + { + myTeamMembers[i].requestedTeam=UNASSIGNED_TEAM_ID; + + // Send packet to the host to remove our request flag. + BitStream bsOut; + bsOut.Write((MessageID)ID_TEAM_BALANCER_INTERNAL); + bsOut.Write((MessageID)ID_CANCEL_TEAM_REQUEST); + bsOut.Write(memberId); + rakPeerInterface->Send(&bsOut,HIGH_PRIORITY,RELIABLE_ORDERED,0,hostGuid,false); + + return; + } + } +} +void TeamBalancer::RequestAnyTeam(NetworkID memberId) +{ + bool foundMatch=false; + + for (unsigned int i=0; i < myTeamMembers.Size(); i++) + { + if (myTeamMembers[i].memberId==memberId) + { + foundMatch=true; + if (myTeamMembers[i].currentTeam!=UNASSIGNED_TEAM_ID) + return; + else + myTeamMembers[i].requestedTeam=UNASSIGNED_TEAM_ID; + break; + } + } + + if (foundMatch==false) + { + MyTeamMembers mtm; + mtm.currentTeam=UNASSIGNED_TEAM_ID; + mtm.memberId=memberId; + mtm.requestedTeam=UNASSIGNED_TEAM_ID; + myTeamMembers.Push(mtm, _FILE_AND_LINE_); + } + + // Else send to the current host that we need a team. + BitStream bsOut; + bsOut.Write((MessageID)ID_TEAM_BALANCER_INTERNAL); + bsOut.Write((MessageID)ID_REQUEST_ANY_TEAM); + bsOut.Write(memberId); + rakPeerInterface->Send(&bsOut,HIGH_PRIORITY,RELIABLE_ORDERED,0,hostGuid,false); +} +TeamId TeamBalancer::GetMyTeam(NetworkID memberId) const +{ + // Return team returned by last ID_TEAM_BALANCER_TEAM_ASSIGNED packet + for (unsigned int i=0; i < myTeamMembers.Size(); i++) + { + if (myTeamMembers[i].memberId==memberId) + { + return myTeamMembers[i].currentTeam; + } + } + + return UNASSIGNED_TEAM_ID; +} +void TeamBalancer::DeleteMember(NetworkID memberId) +{ + for (unsigned int i=0; i < myTeamMembers.Size(); i++) + { + if (myTeamMembers[i].memberId==memberId) + { + myTeamMembers.RemoveAtIndexFast(i); + break; + } + } + + for (unsigned int i=0; i < teamMembers.Size(); i++) + { + if (teamMembers[i].memberId==memberId) + { + RemoveTeamMember(i); + break; + } + } +} +PluginReceiveResult TeamBalancer::OnReceive(Packet *packet) +{ + switch (packet->data[0]) + { + case ID_FCM2_NEW_HOST: + { + hostGuid=packet->guid; + + if (myTeamMembers.Size()>0) + { + BitStream bsOut; + bsOut.Write((MessageID)ID_TEAM_BALANCER_INTERNAL); + bsOut.Write((MessageID)ID_STATUS_UPDATE_TO_NEW_HOST); + + bsOut.WriteCasted(myTeamMembers.Size()); + for (unsigned int i=0; i < myTeamMembers.Size(); i++) + { + bsOut.Write(myTeamMembers[i].memberId); + bsOut.Write(myTeamMembers[i].currentTeam); + bsOut.Write(myTeamMembers[i].requestedTeam); + } + rakPeerInterface->Send(&bsOut,HIGH_PRIORITY,RELIABLE_ORDERED,0,hostGuid,false); + } + } + break; + case ID_TEAM_BALANCER_INTERNAL: + { + if (packet->length>=2) + { + switch (packet->data[1]) + { + case ID_STATUS_UPDATE_TO_NEW_HOST: + OnStatusUpdateToNewHost(packet); + break; + case ID_CANCEL_TEAM_REQUEST: + OnCancelTeamRequest(packet); + break; + case ID_REQUEST_ANY_TEAM: + OnRequestAnyTeam(packet); + break; + case ID_REQUEST_SPECIFIC_TEAM: + OnRequestSpecificTeam(packet); + break; + } + } + } + return RR_STOP_PROCESSING_AND_DEALLOCATE; + + case ID_TEAM_BALANCER_TEAM_ASSIGNED: + { + return OnTeamAssigned(packet); + } + + case ID_TEAM_BALANCER_REQUESTED_TEAM_CHANGE_PENDING: + { + return OnRequestedTeamChangePending(packet); + } + + case ID_TEAM_BALANCER_TEAMS_LOCKED: + { + return OnTeamsLocked(packet); + } + } + + // Got RequestSpecificTeam + // If teams are locked + // - If this user already has a team, return ID_TEAM_BALANCER_TEAMS_LOCKED + // - This user does not already have a team. Assign a team as if the user called RequestAnyTeam(), with a preference for the requested team. Return ID_TEAM_BALANCER_TEAM_ASSIGNED once the team has been assigned. + // If teams are not locked + // - If even team balancing is on, only assign this user if this would not cause teams to be unbalanced. If teams WOULD be unbalanced, then flag this user as wanting to join this team. Return ID_TEAM_BALANCER_REQUESTED_TEAM_CHANGE_PENDING + // - If the destination team is full, flag this user as wanting to join this team. Return ID_TEAM_BALANCER_REQUESTED_TEAM_CHANGE_PENDING + // - Else, join this team. Return ID_TEAM_BALANCER_TEAM_ASSIGNED + + // Got RequestAnyTeam + // Put user on a team following the algorithm. No team is set as preferred. + + return RR_CONTINUE_PROCESSING; +} +void TeamBalancer::OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ) +{ + (void) systemAddress; + (void) lostConnectionReason; + + RemoveByGuid(rakNetGUID); +} +void TeamBalancer::OnAttach(void) +{ + hostGuid = rakPeerInterface->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS); +} +void TeamBalancer::RemoveByGuid(RakNetGUID rakNetGUID) +{ + // If we are the host, and the closed connection has a team, and teams are not locked: + if (WeAreHost()) + { + unsigned int droppedMemberIndex=0; + while (droppedMemberIndex < teamMembers.Size()) + { + if (teamMembers[droppedMemberIndex].memberGuid==rakNetGUID) + { + TeamId droppedTeam = teamMembers[droppedMemberIndex].currentTeam; + RemoveTeamMember(droppedMemberIndex); + if (lockTeams==false) + { + if (forceTeamsToBeEven) + { + // - teams were forced to be even, then run the even team algorithm + EvenTeams(); + } + else + { + // - teams were NOT forced to be even, and the team the dropped player on was full, then move users wanting to join that team (if any) + if (teamMemberCounts[ droppedTeam ]==teamLimits[ droppedTeam ]-1) + { + MoveMemberThatWantsToJoinTeam(droppedTeam); + } + } + } + } + else + { + droppedMemberIndex++; + } + } + } +} +void TeamBalancer::OnStatusUpdateToNewHost(Packet *packet) +{ + if (WeAreHost()==false) + return; + + BitStream bsIn(packet->data,packet->length,false); + bsIn.IgnoreBytes(2); + uint8_t requestedTeamChangeListSize; + bsIn.Read(requestedTeamChangeListSize); + TeamMember tm; + tm.memberGuid=packet->guid; + for (uint8_t i=0; i < requestedTeamChangeListSize; i++) + { + bsIn.Read(tm.memberId); + bsIn.Read(tm.currentTeam); + bsIn.Read(tm.requestedTeam); + + if (tm.currentTeam!=UNASSIGNED_TEAM_ID && tm.currentTeam>teamLimits.Size()) + { + RakAssert("Current team out of range in TeamBalancer::OnStatusUpdateToNewHost" && 0); + return; + } + + if (tm.requestedTeam!=UNASSIGNED_TEAM_ID && tm.requestedTeam>teamLimits.Size()) + { + RakAssert("Requested team out of range in TeamBalancer::OnStatusUpdateToNewHost" && 0); + return; + } + + if (tm.currentTeam==UNASSIGNED_TEAM_ID && tm.requestedTeam==UNASSIGNED_TEAM_ID) + return; + + unsigned int memberIndex = GetMemberIndex(tm.memberId, packet->guid); + if (memberIndex==(unsigned int) -1) + { + // Add this system (by GUID) to the list of members if he is not already there + // Also update his requested team flag. + // Do not process balancing on requested teams, since we don't necessarily have all data from all systems yet and hopefully the state during the host migration was stable. + if (tm.currentTeam==UNASSIGNED_TEAM_ID) + { + // Assign a default team, then add team member + if (tm.requestedTeam==UNASSIGNED_TEAM_ID) + { + // Assign a default team + tm.currentTeam=GetNextDefaultTeam(); + } + else + { + // Assign to requested team if possible. Otherwise, assign to a default team + if (TeamWouldBeOverpopulatedOnAddition(tm.requestedTeam, teamMembers.Size())==false) + { + tm.currentTeam=tm.requestedTeam; + } + else + { + tm.currentTeam=GetNextDefaultTeam(); + } + } + } + + if (tm.currentTeam==UNASSIGNED_TEAM_ID) + { + RakAssert("Too many members asking for teams!" && 0); + return; + } + NotifyTeamAssigment(AddTeamMember(tm)); + } + } +} +void TeamBalancer::OnCancelTeamRequest(Packet *packet) +{ + if (WeAreHost()==false) + return; + + BitStream bsIn(packet->data,packet->length,false); + bsIn.IgnoreBytes(2); + NetworkID memberId; + bsIn.Read(memberId); + + unsigned int memberIndex = GetMemberIndex(memberId, packet->guid); + if (memberIndex!=(unsigned int)-1) + teamMembers[memberIndex].requestedTeam=UNASSIGNED_TEAM_ID; +} +void TeamBalancer::OnRequestAnyTeam(Packet *packet) +{ + if (WeAreHost()==false) + return; + + BitStream bsIn(packet->data,packet->length,false); + bsIn.IgnoreBytes(2); + NetworkID memberId; + bsIn.Read(memberId); + + unsigned int memberIndex = GetMemberIndex(memberId, packet->guid); + if (memberIndex==(unsigned int)-1) + { + TeamMember tm; + tm.currentTeam=GetNextDefaultTeam(); + tm.requestedTeam=UNASSIGNED_TEAM_ID; + tm.memberGuid=packet->guid; + tm.memberId=memberId; + if (tm.currentTeam==UNASSIGNED_TEAM_ID) + { + RakAssert("Too many members asking for teams!" && 0); + return; + } + NotifyTeamAssigment(AddTeamMember(tm)); + } +} +void TeamBalancer::OnRequestSpecificTeam(Packet *packet) +{ + if (WeAreHost()==false) + return; + + BitStream bsIn(packet->data,packet->length,false); + bsIn.IgnoreBytes(2); + TeamMember tm; + bsIn.Read(tm.memberId); + bsIn.Read(tm.requestedTeam); + + unsigned int memberIndex = GetMemberIndex(tm.memberId, packet->guid); + if (tm.requestedTeam==UNASSIGNED_TEAM_ID) + { + NotifyNoTeam(tm.memberId, packet->guid); + RemoveTeamMember(memberIndex); + return; + } + + if (tm.requestedTeam>teamLimits.Size()) + { + RakAssert("Requested team out of range in TeamBalancer::OnRequestSpecificTeam" && 0); + return; + } + if (memberIndex==(unsigned int) -1) + { + tm.memberGuid=packet->guid; + + // Assign to requested team if possible. Otherwise, assign to a default team + if (TeamWouldBeOverpopulatedOnAddition(tm.requestedTeam, teamMembers.Size())==false) + { + tm.currentTeam=tm.requestedTeam; + tm.requestedTeam=UNASSIGNED_TEAM_ID; + } + else + { + tm.currentTeam=GetNextDefaultTeam(); + } + if (tm.currentTeam==UNASSIGNED_TEAM_ID) + { + RakAssert("Too many members asking for teams!" && 0); + return; + } + NotifyTeamAssigment(AddTeamMember(tm)); + } + else + { + teamMembers[memberIndex].requestedTeam=tm.requestedTeam; + TeamId oldTeamThisUserWasOn = teamMembers[memberIndex].currentTeam; + + if (lockTeams) + { + NotifyTeamsLocked(packet->guid, tm.requestedTeam); + return; + } + + // Assign to requested team if possible. Otherwise, assign to a default team + if (TeamsWouldBeEvenOnSwitch(tm.requestedTeam,oldTeamThisUserWasOn)==true) + { + SwitchMemberTeam(memberIndex,tm.requestedTeam); + NotifyTeamAssigment(memberIndex); + } + else + { + // If someone wants to join this user's old team, and we want to join their team, they can swap + unsigned int swappableMemberIndex; + for (swappableMemberIndex=0; swappableMemberIndex < teamMembers.Size(); swappableMemberIndex++) + { + if (teamMembers[swappableMemberIndex].currentTeam==tm.requestedTeam && teamMembers[swappableMemberIndex].requestedTeam==oldTeamThisUserWasOn) + break; + } + + if (swappableMemberIndex!=teamMembers.Size()) + { + SwapTeamMembersByRequest(memberIndex,swappableMemberIndex); + NotifyTeamAssigment(memberIndex); + NotifyTeamAssigment(swappableMemberIndex); + } + else + { + // Full or would not be even + NotifyTeamSwitchPending(packet->guid, tm.requestedTeam, tm.memberId); + } + } + } +} +unsigned int TeamBalancer::GetMemberIndex(NetworkID memberId, RakNetGUID guid) const +{ + for (unsigned int i=0; i < teamMembers.Size(); i++) + { + if (teamMembers[i].memberGuid==guid && teamMembers[i].memberId==memberId) + return i; + } + return (unsigned int) -1; +} +unsigned int TeamBalancer::AddTeamMember(const TeamMember &tm) +{ + if (tm.currentTeam>teamLimits.Size()) + { + RakAssert("TeamBalancer::AddTeamMember team index out of bounds" && 0); + return (unsigned int) -1; + } + + RakAssert(tm.currentTeam!=UNASSIGNED_TEAM_ID); + + teamMembers.Push(tm,_FILE_AND_LINE_); + if (teamMemberCounts.Size() overpopulatedTeams; + TeamId teamMemberCountsIndex; + unsigned int memberIndexToSwitch; + for (teamMemberCountsIndex=0; teamMemberCountsIndex0); + memberIndexToSwitch=GetMemberIndexToSwitchTeams(overpopulatedTeams,teamMemberCountsIndex); + RakAssert(memberIndexToSwitch!=(unsigned int)-1); + SwitchMemberTeam(memberIndexToSwitch,teamMemberCountsIndex); + // Tell this member he switched teams + NotifyTeamAssigment(memberIndexToSwitch); + } + } +} +unsigned int TeamBalancer::GetMemberIndexToSwitchTeams(const DataStructures::List &sourceTeamNumbers, TeamId targetTeamNumber) +{ + DataStructures::List preferredSwapIndices; + DataStructures::List potentialSwapIndices; + unsigned int i,j; + for (j=0; j < sourceTeamNumbers.Size(); j++) + { + RakAssert(sourceTeamNumbers[j]!=targetTeamNumber); + for (i=0; i < teamMembers.Size(); i++) + { + if (teamMembers[i].currentTeam==sourceTeamNumbers[j]) + { + if (teamMembers[i].requestedTeam==targetTeamNumber) + preferredSwapIndices.Push(i,_FILE_AND_LINE_); + else + potentialSwapIndices.Push(i,_FILE_AND_LINE_); + } + } + } + + if (preferredSwapIndices.Size()>0) + { + return preferredSwapIndices[ randomMT() % preferredSwapIndices.Size() ]; + } + else if (potentialSwapIndices.Size()>0) + { + return potentialSwapIndices[ randomMT() % potentialSwapIndices.Size() ]; + } + else + { + return (unsigned int) -1; + } +} +void TeamBalancer::SwitchMemberTeam(unsigned int teamMemberIndex, TeamId destinationTeam) +{ + teamMemberCounts[ teamMembers[teamMemberIndex].currentTeam ]=teamMemberCounts[ teamMembers[teamMemberIndex].currentTeam ]-1; + teamMemberCounts[ destinationTeam ]=teamMemberCounts[ destinationTeam ]+1; + teamMembers[teamMemberIndex].currentTeam=destinationTeam; + if (teamMembers[teamMemberIndex].requestedTeam==destinationTeam) + teamMembers[teamMemberIndex].requestedTeam=UNASSIGNED_TEAM_ID; +} +void TeamBalancer::GetOverpopulatedTeams(DataStructures::List &overpopulatedTeams, int maxTeamSize) +{ + overpopulatedTeams.Clear(true,_FILE_AND_LINE_); + for (TeamId i=0; i < teamMemberCounts.Size(); i++) + { + if (teamMemberCounts[i]>=maxTeamSize) + overpopulatedTeams.Push(i,_FILE_AND_LINE_); + } +} +void TeamBalancer::NotifyTeamAssigment(unsigned int teamMemberIndex) +{ + RakAssert(teamMemberIndex < teamMembers.Size()); + if (teamMemberIndex>=teamMembers.Size()) + return; + + BitStream bsOut; + bsOut.Write((MessageID)ID_TEAM_BALANCER_TEAM_ASSIGNED); + bsOut.Write(teamMembers[teamMemberIndex].currentTeam); + bsOut.Write(teamMembers[teamMemberIndex].memberId); + rakPeerInterface->Send(&bsOut,HIGH_PRIORITY,RELIABLE_ORDERED,0,teamMembers[teamMemberIndex].memberGuid,false); +} +bool TeamBalancer::WeAreHost(void) const +{ + return hostGuid==rakPeerInterface->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS); +} +PluginReceiveResult TeamBalancer::OnTeamAssigned(Packet *packet) +{ + if (packet->guid!=hostGuid) + return RR_STOP_PROCESSING_AND_DEALLOCATE; + + BitStream bsIn(packet->data,packet->length,false); + bsIn.IgnoreBytes(1); + + MyTeamMembers mtm; + bsIn.Read(mtm.currentTeam); + bsIn.Read(mtm.memberId); + mtm.requestedTeam=UNASSIGNED_TEAM_ID; + + bool foundMatch=false; + for (unsigned int i=0; i < myTeamMembers.Size(); i++) + { + if (myTeamMembers[i].memberId==mtm.memberId) + { + foundMatch=true; + if (myTeamMembers[i].requestedTeam==mtm.currentTeam) + myTeamMembers[i].requestedTeam=UNASSIGNED_TEAM_ID; + myTeamMembers[i].currentTeam=mtm.currentTeam; + break; + } + } + + if (foundMatch==false) + { + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + + return RR_CONTINUE_PROCESSING; +} +PluginReceiveResult TeamBalancer::OnRequestedTeamChangePending(Packet *packet) +{ + if (packet->guid!=hostGuid) + return RR_STOP_PROCESSING_AND_DEALLOCATE; + + return RR_CONTINUE_PROCESSING; +} +PluginReceiveResult TeamBalancer::OnTeamsLocked(Packet *packet) +{ + if (packet->guid!=hostGuid) + return RR_STOP_PROCESSING_AND_DEALLOCATE; + + return RR_CONTINUE_PROCESSING; +} +TeamId TeamBalancer::GetNextDefaultTeam(void) +{ + // Accounting for team balancing and team limits, get the team a player should be placed on + switch (defaultAssigmentAlgorithm) + { + case SMALLEST_TEAM: + { + return GetSmallestNonFullTeam(); + } + + case FILL_IN_ORDER: + { + return GetFirstNonFullTeam(); + } + + default: + { + RakAssert("TeamBalancer::GetNextDefaultTeam unknown algorithm enumeration" && 0); + return UNASSIGNED_TEAM_ID; + } + } +} +bool TeamBalancer::TeamWouldBeOverpopulatedOnAddition(TeamId teamId, unsigned int teamMemberSize) +{ + // Accounting for team balancing and team limits, would this team be overpopulated if a member was added to it? + if (teamMemberCounts[teamId]>=teamLimits[teamId]) + { + return true; + } + + if (forceTeamsToBeEven) + { + int allowedLimit = teamMemberSize/teamLimits.Size() + 1; + return teamMemberCounts[teamId]>=allowedLimit; + } + + return false; +} +bool TeamBalancer::TeamWouldBeUnderpopulatedOnLeave(TeamId teamId, unsigned int teamMemberSize) +{ + if (forceTeamsToBeEven) + { + unsigned int minMembersOnASingleTeam = (teamMemberSize-1)/teamLimits.Size(); + return teamMemberCounts[teamId]<=minMembersOnASingleTeam; + } + return false; +} +TeamId TeamBalancer::GetSmallestNonFullTeam(void) const +{ + TeamId idx; + unsigned long smallestTeamCount=MAX_UNSIGNED_LONG; + TeamId smallestTeamIndex = UNASSIGNED_TEAM_ID; + for (idx=0; idx < teamMemberCounts.Size(); idx++) + { + if (teamMemberCounts[idx] membersThatWantToJoinTheTeam; + for (TeamId i=0; i < teamMembers.Size(); i++) + { + if (teamMembers[i].requestedTeam==teamId) + membersThatWantToJoinTheTeam.Push(i,_FILE_AND_LINE_); + } + + if (membersThatWantToJoinTheTeam.Size()>0) + { + TeamId oldTeam; + unsigned int swappedMemberIndex = membersThatWantToJoinTheTeam[ randomMT() % membersThatWantToJoinTheTeam.Size() ]; + oldTeam=teamMembers[swappedMemberIndex].currentTeam; + SwitchMemberTeam(swappedMemberIndex,teamId); + NotifyTeamAssigment(swappedMemberIndex); + return oldTeam; + } + return UNASSIGNED_TEAM_ID; +} +void TeamBalancer::NotifyTeamsLocked(RakNetGUID target, TeamId requestedTeam) +{ + BitStream bsOut; + bsOut.Write((MessageID)ID_TEAM_BALANCER_TEAMS_LOCKED); + bsOut.Write(requestedTeam); + rakPeerInterface->Send(&bsOut,HIGH_PRIORITY,RELIABLE_ORDERED,0,target,false); +} +void TeamBalancer::NotifyTeamSwitchPending(RakNetGUID target, TeamId requestedTeam, NetworkID memberId) +{ + BitStream bsOut; + bsOut.Write((MessageID)ID_TEAM_BALANCER_REQUESTED_TEAM_CHANGE_PENDING); + bsOut.Write(requestedTeam); + bsOut.Write(memberId); + rakPeerInterface->Send(&bsOut,HIGH_PRIORITY,RELIABLE_ORDERED,0,target,false); +} +void TeamBalancer::SwapTeamMembersByRequest(unsigned int memberIndex1, unsigned int memberIndex2) +{ + TeamId index1Team = teamMembers[memberIndex1].currentTeam; + teamMembers[memberIndex1].currentTeam=teamMembers[memberIndex2].currentTeam; + teamMembers[memberIndex2].currentTeam=index1Team; + teamMembers[memberIndex1].requestedTeam=UNASSIGNED_TEAM_ID; + teamMembers[memberIndex2].requestedTeam=UNASSIGNED_TEAM_ID; +} +void TeamBalancer::NotifyNoTeam(NetworkID memberId, RakNetGUID target) +{ + BitStream bsOut; + bsOut.Write((MessageID)ID_TEAM_BALANCER_TEAM_ASSIGNED); + bsOut.Write((unsigned char)UNASSIGNED_TEAM_ID); + bsOut.Write(memberId); + rakPeerInterface->Send(&bsOut,HIGH_PRIORITY,RELIABLE_ORDERED,0,target,false); +} +bool TeamBalancer::TeamsWouldBeEvenOnSwitch(TeamId t1, TeamId t2) +{ + RakAssert(teamMembers.Size()!=0); + return TeamWouldBeOverpopulatedOnAddition(t1, teamMembers.Size()-1)==false && + TeamWouldBeUnderpopulatedOnLeave(t2, teamMembers.Size()-1)==false; +} + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TeamBalancer.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TeamBalancer.h new file mode 100644 index 0000000..502cb35 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TeamBalancer.h @@ -0,0 +1,194 @@ +/// \file TeamBalancer.h +/// \brief Set and network team selection (supports peer to peer or client/server) +/// \details Automatically handles transmission and resolution of team selection, including team switching and balancing +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_TeamBalancer==1 + +#ifndef __TEAM_BALANCER_H +#define __TEAM_BALANCER_H + +#include "PluginInterface2.h" +#include "RakMemoryOverride.h" +#include "NativeTypes.h" +#include "DS_List.h" +#include "RakString.h" + +namespace RakNet +{ +/// Forward declarations +class RakPeerInterface; + +/// \defgroup TEAM_BALANCER_GROUP TeamBalancer +/// \brief Set and network team selection (supports peer to peer or client/server) +/// \details Automatically handles transmission and resolution of team selection, including team switching and balancing +/// \ingroup PLUGINS_GROUP + +/// 0...254 for your team number identifiers. 255 is reserved as undefined. +/// \ingroup TEAM_BALANCER_GROUP +typedef unsigned char TeamId; + +#define UNASSIGNED_TEAM_ID 255 + +/// \brief Set and network team selection (supports peer to peer or client/server) +/// \details Automatically handles transmission and resolution of team selection, including team switching and balancing.
    +/// Usage: TODO +/// \ingroup TEAM_BALANCER_GROUP +class RAK_DLL_EXPORT TeamBalancer : public PluginInterface2 +{ +public: + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(TeamBalancer) + + TeamBalancer(); + virtual ~TeamBalancer(); + + /// \brief Set the limit to the number of players on the specified team + /// \details SetTeamSizeLimit() must be called on the host, so the host can enforce the maximum number of players on each team. + /// SetTeamSizeLimit() can be called on all systems if desired - for example, in a P2P environment you may wish to call it on all systems in advanced in case you become host. + /// \param[in] team Which team to set the limit for + /// \param[in] limit The maximum number of people on this team + void SetTeamSizeLimit(TeamId team, unsigned short limit); + + enum DefaultAssigmentAlgorithm + { + /// Among all the teams, join the team with the smallest number of players + SMALLEST_TEAM, + /// Join the team with the lowest index that has open slots. + FILL_IN_ORDER + }; + /// \brief Determine how players' teams will be set when they call RequestAnyTeam() + /// \details Based on the specified enumeration, a player will join a team automatically + /// Defaults to SMALLEST_TEAM + /// This function is only used by the host + /// \param[in] daa Enumeration describing the algorithm to use + void SetDefaultAssignmentAlgorithm(DefaultAssigmentAlgorithm daa); + + /// \brief By default, teams can be unbalanced up to the team size limit defined by SetTeamSizeLimits() + /// \details If SetForceEvenTeams(true) is called on the host, then teams cannot be unbalanced by more than 1 player + /// If teams are uneven at the time that SetForceEvenTeams(true) is called, players at randomly will be switched, and will be notified of ID_TEAM_BALANCER_TEAM_ASSIGNED + /// If players disconnect from the host such that teams would not be even, and teams are not locked, then a player from the largest team is randomly moved to even the teams. + /// Defaults to false + /// \note SetLockTeams(true) takes priority over SetForceEvenTeams(), so if teams are currently locked, this function will have no effect until teams become unlocked. + /// \param[in] force True to force even teams. False to allow teams to not be evenly matched + void SetForceEvenTeams(bool force); + + /// \brief If set, calls to RequestSpecificTeam() and RequestAnyTeam() will return the team you are currently on. + /// \details However, if those functions are called and you do not have a team, then you will be assigned to a default team according to SetDefaultAssignmentAlgorithm() and possibly SetForceEvenTeams(true) + /// If \a lock is false, and SetForceEvenTeams() was called with \a force as true, and teams are currently uneven, they will be made even, and those players randomly moved will get ID_TEAM_BALANCER_TEAM_ASSIGNED + /// Defaults to false + /// \param[in] lock True to lock teams, false to unlock + void SetLockTeams(bool lock); + + /// Set your requested team. UNASSIGNED_TEAM_ID means no team. + /// After enough time for network communication, ID_TEAM_BALANCER_SET_TEAM will be returned with your current team, or + /// If team switch is not possible, ID_TEAM_BALANCER_REQUESTED_TEAM_CHANGE_PENDING or ID_TEAM_BALANCER_TEAMS_LOCKED will be returned. + /// In the case of ID_TEAM_BALANCER_REQUESTED_TEAM_CHANGE_PENDING the request will stay in memory. ID_TEAM_BALANCER_SET_TEAM will be returned when someone on the desired team leaves or wants to switch to your team. + /// If SetLockTeams(true) is called while you have a request pending, you will get ID_TEAM_BALANCER_TEAMS_LOCKED + /// \pre Call SetTeamSizeLimits() on the host and call SetHostGuid() on this system. If the host is not running the TeamBalancer plugin or did not have SetTeamSizeLimits() called, then you will not get any response. + /// \param[in] memberId If there is more than one player per computer, this number identifies that player. Use any consistent value, such as UNASSINGED_NETWORK_ID if there is only one player. + /// \param[in] desiredTeam An index representing your team number. The index should range from 0 to one less than the size of the list passed to SetTeamSizeLimits() on the host. You can also pass UNASSIGNED_TEAM_ID to not be on any team (such as if spectating) + void RequestSpecificTeam(NetworkID memberId, TeamId desiredTeam); + + /// If ID_TEAM_BALANCER_REQUESTED_TEAM_CHANGE_PENDING is returned after a call to RequestSpecificTeam(), the request will stay in memory on the host and execute when available, or until the teams become locked. + /// You can cancel the request by calling CancelRequestSpecificTeam(), in which case you will stay on your existing team. + /// \note Due to latency, even after calling CancelRequestSpecificTeam() you may still get ID_TEAM_BALANCER_SET_TEAM if the packet was already in transmission. + /// \param[in] memberId If there is more than one player per computer, this number identifies that player. Use any consistent value, such as UNASSINGED_NETWORK_ID if there is only one player. + void CancelRequestSpecificTeam(NetworkID memberId); + + /// Allow host to pick your team, based on whatever algorithm it uses for default team assignments. + /// This only has an effect if you are not currently on a team (GetMyTeam() returns UNASSIGNED_TEAM_ID) + /// \pre Call SetTeamSizeLimits() on the host and call SetHostGuid() on this system + /// \param[in] memberId If there is more than one player per computer, this number identifies that player. Use any consistent value, such as UNASSINGED_NETWORK_ID if there is only one player. + void RequestAnyTeam(NetworkID memberId); + + /// Returns your team. + /// As your team changes, you are notified through the ID_TEAM_BALANCER_TEAM_ASSIGNED packet in byte 1. + /// Returns UNASSIGNED_TEAM_ID initially + /// \pre For this to return anything other than UNASSIGNED_TEAM_ID, connect to a properly initialized host and RequestSpecificTeam() or RequestAnyTeam() first + /// \param[in] memberId If there is more than one player per computer, this number identifies that player. Use any consistent value, such as UNASSINGED_NETWORK_ID if there is only one player. + /// \return UNASSIGNED_TEAM_ID for no team. Otherwise, the index should range from 0 to one less than the size of the list passed to SetTeamSizeLimits() on the host + TeamId GetMyTeam(NetworkID memberId) const; + + /// If you called RequestSpecificTeam() or RequestAnyTeam() with a value for \a memberId that + /// Has since been deleted, call DeleteMember(). to notify this plugin of that event. + /// Not necessary with only one team member per system + /// \param[in] memberId If there is more than one player per computer, this number identifies that player. Use any consistent value, such as UNASSINGED_NETWORK_ID if there is only one player. + void DeleteMember(NetworkID memberId); + + struct TeamMember + { + RakNetGUID memberGuid; + NetworkID memberId; + TeamId currentTeam; + TeamId requestedTeam; + }; + struct MyTeamMembers + { + NetworkID memberId; + TeamId currentTeam; + TeamId requestedTeam; + }; + +protected: + + /// \internal + virtual PluginReceiveResult OnReceive(Packet *packet); + /// \internal + virtual void OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ); + /// \internal + void OnAttach(void); + + void OnStatusUpdateToNewHost(Packet *packet); + void OnCancelTeamRequest(Packet *packet); + void OnRequestAnyTeam(Packet *packet); + void OnRequestSpecificTeam(Packet *packet); + + RakNetGUID hostGuid; + DefaultAssigmentAlgorithm defaultAssigmentAlgorithm; + bool forceTeamsToBeEven; + bool lockTeams; + // So if we lose the connection while processing, we request the same info of the new host + DataStructures::List myTeamMembers; + + DataStructures::List teamLimits; + DataStructures::List teamMemberCounts; + DataStructures::List teamMembers; + unsigned int GetMemberIndex(NetworkID memberId, RakNetGUID guid) const; + unsigned int AddTeamMember(const TeamMember &tm); // Returns index of new member + void RemoveTeamMember(unsigned int index); + void EvenTeams(void); + unsigned int GetMemberIndexToSwitchTeams(const DataStructures::List &sourceTeamNumbers, TeamId targetTeamNumber); + void GetOverpopulatedTeams(DataStructures::List &overpopulatedTeams, int maxTeamSize); + void SwitchMemberTeam(unsigned int teamMemberIndex, TeamId destinationTeam); + void NotifyTeamAssigment(unsigned int teamMemberIndex); + bool WeAreHost(void) const; + PluginReceiveResult OnTeamAssigned(Packet *packet); + PluginReceiveResult OnRequestedTeamChangePending(Packet *packet); + PluginReceiveResult OnTeamsLocked(Packet *packet); + void GetMinMaxTeamMembers(int &minMembersOnASingleTeam, int &maxMembersOnASingleTeam); + TeamId GetNextDefaultTeam(void); // Accounting for team balancing and team limits, get the team a player should be placed on + bool TeamWouldBeOverpopulatedOnAddition(TeamId teamId, unsigned int teamMemberSize); // Accounting for team balancing and team limits, would this team be overpopulated if a member was added to it? + bool TeamWouldBeUnderpopulatedOnLeave(TeamId teamId, unsigned int teamMemberSize); + TeamId GetSmallestNonFullTeam(void) const; + TeamId GetFirstNonFullTeam(void) const; + void MoveMemberThatWantsToJoinTeam(TeamId teamId); + TeamId MoveMemberThatWantsToJoinTeamInternal(TeamId teamId); + void NotifyTeamsLocked(RakNetGUID target, TeamId requestedTeam); + void NotifyTeamSwitchPending(RakNetGUID target, TeamId requestedTeam, NetworkID memberId); + void NotifyNoTeam(NetworkID memberId, RakNetGUID target); + void SwapTeamMembersByRequest(unsigned int memberIndex1, unsigned int memberIndex2); + void RemoveByGuid(RakNetGUID rakNetGUID); + bool TeamsWouldBeEvenOnSwitch(TeamId t1, TeamId t2); + +}; + +} // namespace RakNet + +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TelnetTransport.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TelnetTransport.cpp new file mode 100644 index 0000000..cf77463 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TelnetTransport.cpp @@ -0,0 +1,364 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_TelnetTransport==1 && _RAKNET_SUPPORT_TCPInterface==1 + +#include "TelnetTransport.h" +#include "TCPInterface.h" +#include +#include +#include +#include "LinuxStrings.h" + +// #define _PRINTF_DEBUG + +#define ECHO_INPUT + +#ifdef _MSC_VER +#pragma warning( push ) +#endif + +using namespace RakNet; + +STATIC_FACTORY_DEFINITIONS(TelnetTransport,TelnetTransport); + +TelnetTransport::TelnetTransport() +{ + tcpInterface=0; + sendSuffix=0; + sendPrefix=0; +} +TelnetTransport::~TelnetTransport() +{ + Stop(); + if (sendSuffix) + rakFree_Ex(sendSuffix, _FILE_AND_LINE_ ); + if (sendPrefix) + rakFree_Ex(sendPrefix, _FILE_AND_LINE_ ); +} +bool TelnetTransport::Start(unsigned short port, bool serverMode) +{ + (void) serverMode; + AutoAllocate(); + RakAssert(serverMode); + return tcpInterface->Start(port, 64); +} +void TelnetTransport::Stop(void) +{ + if (tcpInterface==0) return; + tcpInterface->Stop(); + unsigned i; + for (i=0; i < remoteClients.Size(); i++) + RakNet::OP_DELETE(remoteClients[i], _FILE_AND_LINE_); + remoteClients.Clear(false, _FILE_AND_LINE_); + RakNet::OP_DELETE(tcpInterface, _FILE_AND_LINE_); + tcpInterface=0; +} +void TelnetTransport::Send( SystemAddress systemAddress, const char *data,... ) +{ + if (tcpInterface==0) return; + + if (data==0 || data[0]==0) + return; + + char text[REMOTE_MAX_TEXT_INPUT]; + size_t prefixLength; + if (sendPrefix) + { + strcpy(text, sendPrefix); + prefixLength = strlen(sendPrefix); + } + else + { + text[0]=0; + prefixLength=0; + } + va_list ap; + va_start(ap, data); + _vsnprintf(text+prefixLength, REMOTE_MAX_TEXT_INPUT-prefixLength, data, ap); + va_end(ap); + text[REMOTE_MAX_TEXT_INPUT-1]=0; + + if (sendSuffix) + { + size_t length = strlen(text); + size_t availableChars = REMOTE_MAX_TEXT_INPUT-length-1; + strncat(text, sendSuffix, availableChars); + } + + tcpInterface->Send(text, (unsigned int) strlen(text), systemAddress, false); +} +void TelnetTransport::CloseConnection( SystemAddress systemAddress ) +{ + tcpInterface->CloseConnection(systemAddress); +} +Packet* TelnetTransport::Receive( void ) +{ + if (tcpInterface==0) return 0; + Packet *p = tcpInterface->Receive(); + if (p==0) + return 0; + + /* + if (p->data[0]==255) + { + unsigned i; + for (i=0; i < p->length; i++) + { + RAKNET_DEBUG_PRINTF("%i ", p->data[i]); + } + RAKNET_DEBUG_PRINTF("\n"); + tcpInterface->DeallocatePacket(p); + return 0; + } + */ + + // Get this guy's cursor buffer. This is real bullcrap that I have to do this. + unsigned i; + TelnetClient *remoteClient=0; + for (i=0; i < remoteClients.Size(); i++) + { + if (remoteClients[i]->systemAddress==p->systemAddress) + remoteClient=remoteClients[i]; + } + //RakAssert(remoteClient); + if (remoteClient==0) + { + tcpInterface->DeallocatePacket(p); + return 0; + } + + + if (p->length==3 && p->data[0]==27 && p->data[1]==91 && p->data[2]==65) + { + if (remoteClient->lastSentTextInput[0]) + { + // Up arrow, return last string + for (int i=0; remoteClient->textInput[i]; i++) + remoteClient->textInput[i]=8; + strcat(remoteClient->textInput, remoteClient->lastSentTextInput); + tcpInterface->Send((const char *)remoteClient->textInput, (unsigned int) strlen(remoteClient->textInput), p->systemAddress, false); + strcpy(remoteClient->textInput,remoteClient->lastSentTextInput); + remoteClient->cursorPosition=(unsigned int) strlen(remoteClient->textInput); + } + + return 0; + } + + + // 127 is delete - ignore that + // 9 is tab + // 27 is escape + if (p->data[0]>=127 || p->data[0]==9 || p->data[0]==27) + { + tcpInterface->DeallocatePacket(p); + return 0; + } + + // Hack - I don't know what the hell this is about but cursor keys send 3 characters at a time. I can block these + //Up=27,91,65 + //Down=27,91,66 + //Right=27,91,67 + //Left=27,91,68 + if (p->length==3 && p->data[0]==27 && p->data[1]==91 && p->data[2]>=65 && p->data[2]<=68) + { + tcpInterface->DeallocatePacket(p); + return 0; + } + + + + // Echo + + tcpInterface->Send((const char *)p->data, p->length, p->systemAddress, false); + + + bool gotLine; + // Process each character in turn + for (i=0; i < p->length; i++) + { + + + if (p->data[i]==8) + { + char spaceThenBack[2]; + spaceThenBack[0]=' '; + spaceThenBack[1]=8; + tcpInterface->Send((const char *)spaceThenBack, 2, p->systemAddress, false); + } + + + gotLine=ReassembleLine(remoteClient, p->data[i]); + if (gotLine && remoteClient->textInput[0]) + { + + Packet *reassembledLine = (Packet*) rakMalloc_Ex(sizeof(Packet), _FILE_AND_LINE_); + reassembledLine->length=(unsigned int) strlen(remoteClient->textInput); + memcpy(remoteClient->lastSentTextInput, remoteClient->textInput, reassembledLine->length+1); + RakAssert(reassembledLine->length < REMOTE_MAX_TEXT_INPUT); + reassembledLine->data= (unsigned char*) rakMalloc_Ex( reassembledLine->length+1, _FILE_AND_LINE_ ); + memcpy(reassembledLine->data, remoteClient->textInput, reassembledLine->length); +#ifdef _PRINTF_DEBUG + memset(remoteClient->textInput, 0, REMOTE_MAX_TEXT_INPUT); +#endif + reassembledLine->data[reassembledLine->length]=0; + reassembledLine->systemAddress=p->systemAddress; + tcpInterface->DeallocatePacket(p); + return reassembledLine; + } + } + + tcpInterface->DeallocatePacket(p); + return 0; +} +void TelnetTransport::DeallocatePacket( Packet *packet ) +{ + if (tcpInterface==0) return; + rakFree_Ex(packet->data, _FILE_AND_LINE_ ); + rakFree_Ex(packet, _FILE_AND_LINE_ ); +} +SystemAddress TelnetTransport::HasNewIncomingConnection(void) +{ + unsigned i; + SystemAddress newConnection; + newConnection = tcpInterface->HasNewIncomingConnection(); + // 03/16/06 Can't force the stupid windows telnet to use line mode or local echo so now I have to track all the remote players and their + // input buffer + if (newConnection != UNASSIGNED_SYSTEM_ADDRESS) + { + unsigned char command[10]; + // http://www.pcmicro.com/netfoss/RFC857.html + // IAC WON'T ECHO + command[0]=255; // IAC + //command[1]=253; // WON'T + command[1]=251; // WILL + command[2]=1; // ECHO + tcpInterface->Send((const char*)command, 3, newConnection, false); + + /* + // Tell the other side to use line mode + // http://www.faqs.org/rfcs/rfc1184.html + // IAC DO LINEMODE + // command[0]=255; // IAC + // command[1]=252; // DO + // command[2]=34; // LINEMODE + // tcpInterface->Send((const char*)command, 3, newConnection); + + */ + + TelnetClient *remoteClient=0; + for (i=0; i < remoteClients.Size(); i++) + { + if (remoteClients[i]->systemAddress==newConnection) + { + remoteClient=remoteClients[i]; + remoteClient->cursorPosition=0; + } + } + + if (remoteClient==0) + { + remoteClient=new TelnetClient; + remoteClient->lastSentTextInput[0]=0; + remoteClient->cursorPosition=0; + remoteClient->systemAddress=newConnection; +#ifdef _PRINTF_DEBUG + memset(remoteClient->textInput, 0, REMOTE_MAX_TEXT_INPUT); +#endif + } + + remoteClients.Insert(remoteClient, _FILE_AND_LINE_); + } + return newConnection; +} +SystemAddress TelnetTransport::HasLostConnection(void) +{ + SystemAddress systemAddress; + unsigned i; + systemAddress=tcpInterface->HasLostConnection(); + if (systemAddress!=UNASSIGNED_SYSTEM_ADDRESS) + { + for (i=0; i < remoteClients.Size(); i++) + { + if (remoteClients[i]->systemAddress==systemAddress) + { + RakNet::OP_DELETE(remoteClients[i], _FILE_AND_LINE_); + remoteClients[i]=remoteClients[remoteClients.Size()-1]; + remoteClients.RemoveFromEnd(); + } + } + } + return systemAddress; +} +CommandParserInterface* TelnetTransport::GetCommandParser(void) +{ + return 0; +} +void TelnetTransport::SetSendSuffix(const char *suffix) +{ + if (sendSuffix) + { + rakFree_Ex(sendSuffix, _FILE_AND_LINE_ ); + sendSuffix=0; + } + if (suffix) + { + sendSuffix = (char*) rakMalloc_Ex(strlen(suffix)+1, _FILE_AND_LINE_); + strcpy(sendSuffix, suffix); + } +} +void TelnetTransport::SetSendPrefix(const char *prefix) +{ + if (sendPrefix) + { + rakFree_Ex(sendPrefix, _FILE_AND_LINE_ ); + sendPrefix=0; + } + if (prefix) + { + sendPrefix = (char*) rakMalloc_Ex(strlen(prefix)+1, _FILE_AND_LINE_); + strcpy(sendPrefix, prefix); + } +} +void TelnetTransport::AutoAllocate(void) +{ + if (tcpInterface==0) + tcpInterface=new TCPInterface; +} +bool TelnetTransport::ReassembleLine(TelnetTransport::TelnetClient* remoteClient, unsigned char c) +{ + if (c=='\n') + { + remoteClient->textInput[remoteClient->cursorPosition]=0; + remoteClient->cursorPosition=0; +#ifdef _PRINTF_DEBUG + RAKNET_DEBUG_PRINTF("[Done] %s\n", remoteClient->textInput); +#endif + return true; + } + else if (c==8) // backspace + { + if (remoteClient->cursorPosition>0) + { + remoteClient->textInput[--remoteClient->cursorPosition]=0; +#ifdef _PRINTF_DEBUG + RAKNET_DEBUG_PRINTF("[Back] %s\n", remoteClient->textInput); +#endif + } + } + else if (c>=32 && c <127) + { + if (remoteClient->cursorPosition < REMOTE_MAX_TEXT_INPUT) + { + remoteClient->textInput[remoteClient->cursorPosition++]=c; +#ifdef _PRINTF_DEBUG + RAKNET_DEBUG_PRINTF("[Norm] %s\n", remoteClient->textInput); +#endif + } + } + return false; +} + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TelnetTransport.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TelnetTransport.h new file mode 100644 index 0000000..ed2836f --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TelnetTransport.h @@ -0,0 +1,72 @@ +/// \file +/// \brief Contains TelnetTransport , used to supports the telnet transport protocol. Insecure +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_TelnetTransport==1 && _RAKNET_SUPPORT_TCPInterface==1 + +#ifndef __TELNET_TRANSPORT +#define __TELNET_TRANSPORT + +#include "TransportInterface.h" +#include "DS_List.h" +#include "Export.h" + +namespace RakNet +{ +/// Forward declarations +class TCPInterface; +struct TelnetClient; + +/// \brief Use TelnetTransport to easily allow windows telnet to connect to your ConsoleServer +/// \details To run Windows telnet, go to your start menu, click run, and in the edit box type "telnet " where is the ip address.
    +/// of your ConsoleServer (most likely the same IP as your game).
    +/// This implementation always echos commands. +class RAK_DLL_EXPORT TelnetTransport : public TransportInterface +{ +public: + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(TelnetTransport) + + TelnetTransport(); + virtual ~TelnetTransport(); + bool Start(unsigned short port, bool serverMode); + void Stop(void); + void Send( SystemAddress systemAddress, const char *data, ... ); + void CloseConnection( SystemAddress systemAddress ); + Packet* Receive( void ); + void DeallocatePacket( Packet *packet ); + SystemAddress HasNewIncomingConnection(void); + SystemAddress HasLostConnection(void); + CommandParserInterface* GetCommandParser(void); + void SetSendSuffix(const char *suffix); + void SetSendPrefix(const char *prefix); +protected: + + struct TelnetClient + { + SystemAddress systemAddress; + char textInput[REMOTE_MAX_TEXT_INPUT]; + char lastSentTextInput[REMOTE_MAX_TEXT_INPUT]; + unsigned cursorPosition; + }; + + TCPInterface *tcpInterface; + void AutoAllocate(void); + bool ReassembleLine(TelnetTransport::TelnetClient* telnetClient, unsigned char c); + + // Crap this sucks but because windows telnet won't send line at a time, I have to reconstruct the lines at the server per player + DataStructures::List remoteClients; + + char *sendSuffix, *sendPrefix; + +}; + +} // namespace RakNet + +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ThreadPool.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ThreadPool.h new file mode 100644 index 0000000..29eb8e8 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ThreadPool.h @@ -0,0 +1,620 @@ +#ifndef __THREAD_POOL_H +#define __THREAD_POOL_H + +#include "RakMemoryOverride.h" +#include "DS_Queue.h" +#include "SimpleMutex.h" +#include "Export.h" +#include "RakThread.h" +#include "SignaledEvent.h" + +#ifdef _MSC_VER +#pragma warning( push ) +#endif + +class ThreadDataInterface +{ +public: + ThreadDataInterface() {} + virtual ~ThreadDataInterface() {} + + virtual void* PerThreadFactory(void *context)=0; + virtual void PerThreadDestructor(void* factoryResult, void *context)=0; +}; +/// A simple class to create worker threads that processes a queue of functions with data. +/// This class does not allocate or deallocate memory. It is up to the user to handle memory management. +/// InputType and OutputType are stored directly in a queue. For large structures, if you plan to delete from the middle of the queue, +/// you might wish to store pointers rather than the structures themselves so the array can shift efficiently. +template +struct RAK_DLL_EXPORT ThreadPool +{ + ThreadPool(); + ~ThreadPool(); + + /// Start the specified number of threads. + /// \param[in] numThreads The number of threads to start + /// \param[in] stackSize 0 for default (except on consoles). + /// \param[in] _perThreadInit User callback to return data stored per thread. Pass 0 if not needed. + /// \param[in] _perThreadDeinit User callback to destroy data stored per thread, created by _perThreadInit. Pass 0 if not needed. + /// \return True on success, false on failure. + bool StartThreads(int numThreads, int stackSize, void* (*_perThreadInit)()=0, void (*_perThreadDeinit)(void*)=0); + + // Alternate form of _perThreadDataFactory, _perThreadDataDestructor + void SetThreadDataInterface(ThreadDataInterface *tdi, void *context); + + /// Stops all threads + void StopThreads(void); + + /// Adds a function to a queue with data to pass to that function. This function will be called from the thread + /// Memory management is your responsibility! This class does not allocate or deallocate memory. + /// The best way to deallocate \a inputData is in userCallback. If you call EndThreads such that callbacks were not called, you + /// can iterate through the inputQueue and deallocate all pending input data there + /// The best way to deallocate output is as it is returned to you from GetOutput. Similarly, if you end the threads such that + /// not all output was returned, you can iterate through outputQueue and deallocate it there. + /// \param[in] workerThreadCallback The function to call from the thread + /// \param[in] inputData The parameter to pass to \a userCallback + void AddInput(OutputType (*workerThreadCallback)(InputType, bool *returnOutput, void* perThreadData), InputType inputData); + + /// Adds to the output queue + /// Use it if you want to inject output into the same queue that the system uses. Normally you would not use this. Consider it a convenience function. + /// \param[in] outputData The output to inject + void AddOutput(OutputType outputData); + + /// Returns true if output from GetOutput is waiting. + /// \return true if output is waiting, false otherwise + bool HasOutput(void); + + /// Inaccurate but fast version of HasOutput. If this returns true, you should still check HasOutput for the real value. + /// \return true if output is probably waiting, false otherwise + bool HasOutputFast(void); + + /// Returns true if input from GetInput is waiting. + /// \return true if input is waiting, false otherwise + bool HasInput(void); + + /// Inaccurate but fast version of HasInput. If this returns true, you should still check HasInput for the real value. + /// \return true if input is probably waiting, false otherwise + bool HasInputFast(void); + + /// Gets the output of a call to \a userCallback + /// HasOutput must return true before you call this function. Otherwise it will assert. + /// \return The output of \a userCallback. If you have different output signatures, it is up to you to encode the data to indicate this + OutputType GetOutput(void); + + /// Clears internal buffers + void Clear(void); + + /// Lock the input buffer before calling the functions InputSize, InputAtIndex, and RemoveInputAtIndex + /// It is only necessary to lock the input or output while the threads are running + void LockInput(void); + + /// Unlock the input buffer after you are done with the functions InputSize, GetInputAtIndex, and RemoveInputAtIndex + void UnlockInput(void); + + /// Length of the input queue + unsigned InputSize(void); + + /// Get the input at a specified index + InputType GetInputAtIndex(unsigned index); + + /// Remove input from a specific index. This does NOT do memory deallocation - it only removes the item from the queue + void RemoveInputAtIndex(unsigned index); + + /// Lock the output buffer before calling the functions OutputSize, OutputAtIndex, and RemoveOutputAtIndex + /// It is only necessary to lock the input or output while the threads are running + void LockOutput(void); + + /// Unlock the output buffer after you are done with the functions OutputSize, GetOutputAtIndex, and RemoveOutputAtIndex + void UnlockOutput(void); + + /// Length of the output queue + unsigned OutputSize(void); + + /// Get the output at a specified index + OutputType GetOutputAtIndex(unsigned index); + + /// Remove output from a specific index. This does NOT do memory deallocation - it only removes the item from the queue + void RemoveOutputAtIndex(unsigned index); + + /// Removes all items from the input queue + void ClearInput(void); + + /// Removes all items from the output queue + void ClearOutput(void); + + /// Are any of the threads working, or is input or output available? + bool IsWorking(void); + + /// The number of currently active threads. + int NumThreadsWorking(void); + + /// Did we call Start? + bool WasStarted(void); + + // Block until all threads are stopped. + bool Pause(void); + + // Continue running + void Resume(void); + +protected: + // It is valid to cancel input before it is processed. To do so, lock the inputQueue with inputQueueMutex, + // Scan the list, and remove the item you don't want. + RakNet::SimpleMutex inputQueueMutex, outputQueueMutex, workingThreadCountMutex, runThreadsMutex; + + void* (*perThreadDataFactory)(); + void (*perThreadDataDestructor)(void*); + + // inputFunctionQueue & inputQueue are paired arrays so if you delete from one at a particular index you must delete from the other + // at the same index + DataStructures::Queue inputFunctionQueue; + DataStructures::Queue inputQueue; + DataStructures::Queue outputQueue; + + ThreadDataInterface *threadDataInterface; + void *tdiContext; + + + template + friend RAK_THREAD_DECLARATION(WorkerThread); + + /* +#ifdef _WIN32 + friend unsigned __stdcall WorkerThread( LPVOID arguments ); +#else + friend void* WorkerThread( void* arguments ); +#endif + */ + + /// \internal + bool runThreads; + /// \internal + int numThreadsRunning; + /// \internal + int numThreadsWorking; + /// \internal + RakNet::SimpleMutex numThreadsRunningMutex; + + RakNet::SignaledEvent quitAndIncomingDataEvents; + +// #if defined(SN_TARGET_PSP2) +// RakNet::RakThread::UltUlThreadRuntime *runtime; +// #endif +}; + +#include "ThreadPool.h" +#include "RakSleep.h" +#ifdef _WIN32 + +#else +#include +#endif + +#ifdef _MSC_VER +#pragma warning(disable:4127) +#pragma warning( disable : 4701 ) // potentially uninitialized local variable 'inputData' used +#endif + +template +RAK_THREAD_DECLARATION(WorkerThread) +/* +#ifdef _WIN32 +unsigned __stdcall WorkerThread( LPVOID arguments ) +#else +void* WorkerThread( void* arguments ) +#endif +*/ +{ + + + + ThreadPool *threadPool = (ThreadPool*) arguments; + + + bool returnOutput; + ThreadOutputType (*userCallback)(ThreadInputType, bool *, void*); + ThreadInputType inputData; + ThreadOutputType callbackOutput; + + userCallback=0; + + void *perThreadData; + if (threadPool->perThreadDataFactory) + perThreadData=threadPool->perThreadDataFactory(); + else if (threadPool->threadDataInterface) + perThreadData=threadPool->threadDataInterface->PerThreadFactory(threadPool->tdiContext); + else + perThreadData=0; + + // Increase numThreadsRunning + threadPool->numThreadsRunningMutex.Lock(); + ++threadPool->numThreadsRunning; + threadPool->numThreadsRunningMutex.Unlock(); + + while (1) + { +#ifdef _WIN32 + if (userCallback==0) + { + threadPool->quitAndIncomingDataEvents.WaitOnEvent(INFINITE); + } +#endif + + threadPool->runThreadsMutex.Lock(); + if (threadPool->runThreads==false) + { + threadPool->runThreadsMutex.Unlock(); + break; + } + threadPool->runThreadsMutex.Unlock(); + + threadPool->workingThreadCountMutex.Lock(); + ++threadPool->numThreadsWorking; + threadPool->workingThreadCountMutex.Unlock(); + + // Read input data + userCallback=0; + threadPool->inputQueueMutex.Lock(); + if (threadPool->inputFunctionQueue.Size()) + { + userCallback=threadPool->inputFunctionQueue.Pop(); + inputData=threadPool->inputQueue.Pop(); + } + threadPool->inputQueueMutex.Unlock(); + + if (userCallback) + { + callbackOutput=userCallback(inputData, &returnOutput,perThreadData); + if (returnOutput) + { + threadPool->outputQueueMutex.Lock(); + threadPool->outputQueue.Push(callbackOutput, _FILE_AND_LINE_ ); + threadPool->outputQueueMutex.Unlock(); + } + } + + threadPool->workingThreadCountMutex.Lock(); + --threadPool->numThreadsWorking; + threadPool->workingThreadCountMutex.Unlock(); + } + + // Decrease numThreadsRunning + threadPool->numThreadsRunningMutex.Lock(); + --threadPool->numThreadsRunning; + threadPool->numThreadsRunningMutex.Unlock(); + + if (threadPool->perThreadDataDestructor) + threadPool->perThreadDataDestructor(perThreadData); + else if (threadPool->threadDataInterface) + threadPool->threadDataInterface->PerThreadDestructor(perThreadData, threadPool->tdiContext); + + + + + return 0; + +} +template +ThreadPool::ThreadPool() +{ + runThreads=false; + numThreadsRunning=0; + threadDataInterface=0; + tdiContext=0; + numThreadsWorking=0; + +} +template +ThreadPool::~ThreadPool() +{ + StopThreads(); + Clear(); +} +template +bool ThreadPool::StartThreads(int numThreads, int stackSize, void* (*_perThreadDataFactory)(), void (*_perThreadDataDestructor)(void *)) +{ + (void) stackSize; + +// #if defined(SN_TARGET_PSP2) +// runtime = RakNet::RakThread::AllocRuntime(numThreads); +// #endif + + runThreadsMutex.Lock(); + if (runThreads==true) + { + // Already running + runThreadsMutex.Unlock(); + return false; + } + runThreadsMutex.Unlock(); + + quitAndIncomingDataEvents.InitEvent(); + + perThreadDataFactory=_perThreadDataFactory; + perThreadDataDestructor=_perThreadDataDestructor; + + runThreadsMutex.Lock(); + runThreads=true; + runThreadsMutex.Unlock(); + + numThreadsWorking=0; + unsigned threadId = 0; + (void) threadId; + int i; + for (i=0; i < numThreads; i++) + { + int errorCode; + + + + + errorCode = RakNet::RakThread::Create(WorkerThread, this); + + if (errorCode!=0) + { + StopThreads(); + return false; + } + } + // Wait for number of threads running to increase to numThreads + bool done=false; + while (done==false) + { + RakSleep(50); + numThreadsRunningMutex.Lock(); + if (numThreadsRunning==numThreads) + done=true; + numThreadsRunningMutex.Unlock(); + } + + return true; +} +template +void ThreadPool::SetThreadDataInterface(ThreadDataInterface *tdi, void *context) +{ + threadDataInterface=tdi; + tdiContext=context; +} +template +void ThreadPool::StopThreads(void) +{ + runThreadsMutex.Lock(); + if (runThreads==false) + { + runThreadsMutex.Unlock(); + return; + } + + runThreads=false; + runThreadsMutex.Unlock(); + + // Wait for number of threads running to decrease to 0 + bool done=false; + while (done==false) + { + quitAndIncomingDataEvents.SetEvent(); + + RakSleep(50); + numThreadsRunningMutex.Lock(); + if (numThreadsRunning==0) + done=true; + numThreadsRunningMutex.Unlock(); + } + + quitAndIncomingDataEvents.CloseEvent(); + +// #if defined(SN_TARGET_PSP2) +// RakNet::RakThread::DeallocRuntime(runtime); +// runtime=0; +// #endif + +} +template +void ThreadPool::AddInput(OutputType (*workerThreadCallback)(InputType, bool *returnOutput, void* perThreadData), InputType inputData) +{ + inputQueueMutex.Lock(); + inputQueue.Push(inputData, _FILE_AND_LINE_ ); + inputFunctionQueue.Push(workerThreadCallback, _FILE_AND_LINE_ ); + inputQueueMutex.Unlock(); + + quitAndIncomingDataEvents.SetEvent(); +} +template +void ThreadPool::AddOutput(OutputType outputData) +{ + outputQueueMutex.Lock(); + outputQueue.Push(outputData, _FILE_AND_LINE_ ); + outputQueueMutex.Unlock(); +} +template +bool ThreadPool::HasOutputFast(void) +{ + return outputQueue.IsEmpty()==false; +} +template +bool ThreadPool::HasOutput(void) +{ + bool res; + outputQueueMutex.Lock(); + res=outputQueue.IsEmpty()==false; + outputQueueMutex.Unlock(); + return res; +} +template +bool ThreadPool::HasInputFast(void) +{ + return inputQueue.IsEmpty()==false; +} +template +bool ThreadPool::HasInput(void) +{ + bool res; + inputQueueMutex.Lock(); + res=inputQueue.IsEmpty()==false; + inputQueueMutex.Unlock(); + return res; +} +template +OutputType ThreadPool::GetOutput(void) +{ + // Real output check + OutputType output; + outputQueueMutex.Lock(); + output=outputQueue.Pop(); + outputQueueMutex.Unlock(); + return output; +} +template +void ThreadPool::Clear(void) +{ + runThreadsMutex.Lock(); + if (runThreads) + { + runThreadsMutex.Unlock(); + inputQueueMutex.Lock(); + inputFunctionQueue.Clear(_FILE_AND_LINE_); + inputQueue.Clear(_FILE_AND_LINE_); + inputQueueMutex.Unlock(); + + outputQueueMutex.Lock(); + outputQueue.Clear(_FILE_AND_LINE_); + outputQueueMutex.Unlock(); + } + else + { + inputFunctionQueue.Clear(_FILE_AND_LINE_); + inputQueue.Clear(_FILE_AND_LINE_); + outputQueue.Clear(_FILE_AND_LINE_); + } +} +template +void ThreadPool::LockInput(void) +{ + inputQueueMutex.Lock(); +} +template +void ThreadPool::UnlockInput(void) +{ + inputQueueMutex.Unlock(); +} +template +unsigned ThreadPool::InputSize(void) +{ + return inputQueue.Size(); +} +template +InputType ThreadPool::GetInputAtIndex(unsigned index) +{ + return inputQueue[index]; +} +template +void ThreadPool::RemoveInputAtIndex(unsigned index) +{ + inputQueue.RemoveAtIndex(index); + inputFunctionQueue.RemoveAtIndex(index); +} +template +void ThreadPool::LockOutput(void) +{ + outputQueueMutex.Lock(); +} +template +void ThreadPool::UnlockOutput(void) +{ + outputQueueMutex.Unlock(); +} +template +unsigned ThreadPool::OutputSize(void) +{ + return outputQueue.Size(); +} +template +OutputType ThreadPool::GetOutputAtIndex(unsigned index) +{ + return outputQueue[index]; +} +template +void ThreadPool::RemoveOutputAtIndex(unsigned index) +{ + outputQueue.RemoveAtIndex(index); +} +template +void ThreadPool::ClearInput(void) +{ + inputQueue.Clear(_FILE_AND_LINE_); + inputFunctionQueue.Clear(_FILE_AND_LINE_); +} + +template +void ThreadPool::ClearOutput(void) +{ + outputQueue.Clear(_FILE_AND_LINE_); +} +template +bool ThreadPool::IsWorking(void) +{ + bool isWorking; +// workingThreadCountMutex.Lock(); +// isWorking=numThreadsWorking!=0; +// workingThreadCountMutex.Unlock(); + +// if (isWorking) +// return true; + + // Bug fix: Originally the order of these two was reversed. + // It's possible with the thread timing that working could have been false, then it picks up the data in the other thread, then it checks + // here and sees there is no data. So it thinks the thread is not working when it was. + if (HasOutputFast() && HasOutput()) + return true; + + if (HasInputFast() && HasInput()) + return true; + + // Need to check is working again, in case the thread was between the first and second checks + workingThreadCountMutex.Lock(); + isWorking=numThreadsWorking!=0; + workingThreadCountMutex.Unlock(); + + return isWorking; +} + +template +int ThreadPool::NumThreadsWorking(void) +{ + return numThreadsWorking; +} + +template +bool ThreadPool::WasStarted(void) +{ + bool b; + runThreadsMutex.Lock(); + b = runThreads; + runThreadsMutex.Unlock(); + return b; +} +template +bool ThreadPool::Pause(void) +{ + if (WasStarted()==false) + return false; + + workingThreadCountMutex.Lock(); + while (numThreadsWorking>0) + { + RakSleep(30); + } + return true; +} +template +void ThreadPool::Resume(void) +{ + workingThreadCountMutex.Unlock(); +} + +#ifdef _MSC_VER +#pragma warning( pop ) +#endif + +#endif + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ThreadsafePacketLogger.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ThreadsafePacketLogger.cpp new file mode 100644 index 0000000..cb50fef --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ThreadsafePacketLogger.cpp @@ -0,0 +1,38 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_PacketLogger==1 + +#include "ThreadsafePacketLogger.h" +#include + +using namespace RakNet; + +ThreadsafePacketLogger::ThreadsafePacketLogger() +{ + +} +ThreadsafePacketLogger::~ThreadsafePacketLogger() +{ + char **msg; + while ((msg = logMessages.ReadLock()) != 0) + { + rakFree_Ex((*msg), _FILE_AND_LINE_ ); + } +} +void ThreadsafePacketLogger::Update(void) +{ + char **msg; + while ((msg = logMessages.ReadLock()) != 0) + { + WriteLog(*msg); + rakFree_Ex((*msg), _FILE_AND_LINE_ ); + } +} +void ThreadsafePacketLogger::AddToLog(const char *str) +{ + char **msg = logMessages.WriteLock(); + *msg = (char*) rakMalloc_Ex( strlen(str)+1, _FILE_AND_LINE_ ); + strcpy(*msg, str); + logMessages.WriteUnlock(); +} + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ThreadsafePacketLogger.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ThreadsafePacketLogger.h new file mode 100644 index 0000000..542e0cc --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/ThreadsafePacketLogger.h @@ -0,0 +1,40 @@ +/// \file +/// \brief Derivation of the packet logger to defer the call to WriteLog until the user thread. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_PacketLogger==1 + +#ifndef __THREADSAFE_PACKET_LOGGER_H +#define __THREADSAFE_PACKET_LOGGER_H + +#include "PacketLogger.h" +#include "SingleProducerConsumer.h" + +namespace RakNet +{ + +/// \ingroup PACKETLOGGER_GROUP +/// \brief Same as PacketLogger, but writes output in the user thread. +class RAK_DLL_EXPORT ThreadsafePacketLogger : public PacketLogger +{ +public: + ThreadsafePacketLogger(); + virtual ~ThreadsafePacketLogger(); + + virtual void Update(void); + +protected: + virtual void AddToLog(const char *str); + + DataStructures::SingleProducerConsumer logMessages; +}; + +} // namespace RakNet + +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TransportInterface.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TransportInterface.h new file mode 100644 index 0000000..fa073ee --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TransportInterface.h @@ -0,0 +1,83 @@ +/// \file +/// \brief Contains TransportInterface from which you can derive custom transport providers for ConsoleServer. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#ifndef __TRANSPORT_INTERFACE_H +#define __TRANSPORT_INTERFACE_H + +#include "RakNetTypes.h" +#include "Export.h" +#include "RakMemoryOverride.h" + +#define REMOTE_MAX_TEXT_INPUT 2048 + +namespace RakNet +{ + +class CommandParserInterface; + + +/// \brief Defines an interface that is used to send and receive null-terminated strings. +/// \details In practice this is only used by the CommandParser system for for servers. +class RAK_DLL_EXPORT TransportInterface +{ +public: + TransportInterface() {} + virtual ~TransportInterface() {} + + /// Start the transport provider on the indicated port. + /// \param[in] port The port to start the transport provider on + /// \param[in] serverMode If true, you should allow incoming connections (I don't actually use this anywhere) + /// \return Return true on success, false on failure. + virtual bool Start(unsigned short port, bool serverMode)=0; + + /// Stop the transport provider. You can clear memory and shutdown threads here. + virtual void Stop(void)=0; + + /// Send a null-terminated string to \a systemAddress + /// If your transport method requires particular formatting of the outgoing data (e.g. you don't just send strings) you can do it here + /// and parse it out in Receive(). + /// \param[in] systemAddress The player to send the string to + /// \param[in] data format specifier - same as RAKNET_DEBUG_PRINTF + /// \param[in] ... format specification arguments - same as RAKNET_DEBUG_PRINTF + virtual void Send( SystemAddress systemAddress, const char *data, ... )=0; + + /// Disconnect \a systemAddress . The binary address and port defines the SystemAddress structure. + /// \param[in] systemAddress The player/address to disconnect + virtual void CloseConnection( SystemAddress systemAddress )=0; + + /// Return a string. The string should be allocated and written to Packet::data . + /// The byte length should be written to Packet::length . The player/address should be written to Packet::systemAddress + /// If your transport protocol adds special formatting to the data stream you should parse it out before returning it in the packet + /// and thus only return a string in Packet::data + /// \return The packet structure containing the result of Receive, or 0 if no data is available + virtual Packet* Receive( void )=0; + + /// Deallocate the Packet structure returned by Receive + /// \param[in] The packet to deallocate + virtual void DeallocatePacket( Packet *packet )=0; + + /// If a new system connects to you, you should queue that event and return the systemAddress/address of that player in this function. + /// \return The SystemAddress/address of the system + virtual SystemAddress HasNewIncomingConnection(void)=0; + + /// If a system loses the connection, you should queue that event and return the systemAddress/address of that player in this function. + /// \return The SystemAddress/address of the system + virtual SystemAddress HasLostConnection(void)=0; + + /// Your transport provider can itself have command parsers if the transport layer has user-modifiable features + /// For example, your transport layer may have a password which you want remote users to be able to set or you may want + /// to allow remote users to turn on or off command echo + /// \return 0 if you do not need a command parser - otherwise the desired derivation of CommandParserInterface + virtual CommandParserInterface* GetCommandParser(void)=0; +protected: +}; + +} // namespace RakNet + +#endif + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TwoWayAuthentication.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TwoWayAuthentication.cpp new file mode 100644 index 0000000..95435ab --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TwoWayAuthentication.cpp @@ -0,0 +1,431 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_TwoWayAuthentication==1 + +#include "TwoWayAuthentication.h" +#include "Rand.h" +#include "GetTime.h" +#include "MessageIdentifiers.h" +#include "BitStream.h" +#include "RakPeerInterface.h" + +#if LIBCAT_SECURITY==1 +static const int HASH_BITS = 256; +static const int HASH_BYTES = HASH_BITS / 8; +static const int STRENGTHENING_FACTOR = 256; +#include +#endif + +using namespace RakNet; + +enum NegotiationIdentifiers +{ + ID_NONCE_REQUEST, + ID_NONCE_REPLY, + ID_HASHED_NONCE_AND_PASSWORD, +}; + +TwoWayAuthentication::NonceGenerator::NonceGenerator() {nextRequestId=0;} +TwoWayAuthentication::NonceGenerator::~NonceGenerator() +{ + Clear(); +} +void TwoWayAuthentication::NonceGenerator::GetNonce(char nonce[TWO_WAY_AUTHENTICATION_NONCE_LENGTH], unsigned short *requestId, RakNet::AddressOrGUID remoteSystem) +{ + TwoWayAuthentication::NonceAndRemoteSystemRequest *narsr = RakNet::OP_NEW(_FILE_AND_LINE_); + narsr->remoteSystem=remoteSystem; + GenerateNonce(narsr->nonce); + narsr->requestId=nextRequestId++; + *requestId=narsr->requestId; + memcpy(nonce,narsr->nonce,TWO_WAY_AUTHENTICATION_NONCE_LENGTH); + narsr->whenGenerated=RakNet::GetTime(); + generatedNonces.Push(narsr,_FILE_AND_LINE_); +} +void TwoWayAuthentication::NonceGenerator::GenerateNonce(char nonce[TWO_WAY_AUTHENTICATION_NONCE_LENGTH]) +{ + fillBufferMT(nonce,TWO_WAY_AUTHENTICATION_NONCE_LENGTH); +} +bool TwoWayAuthentication::NonceGenerator::GetNonceById(char nonce[TWO_WAY_AUTHENTICATION_NONCE_LENGTH], unsigned short requestId, RakNet::AddressOrGUID remoteSystem, bool popIfFound) +{ + unsigned int i; + for (i=0; i < generatedNonces.Size(); i++) + { + if (generatedNonces[i]->requestId==requestId) + { + if (remoteSystem==generatedNonces[i]->remoteSystem) + { + memcpy(nonce,generatedNonces[i]->nonce,TWO_WAY_AUTHENTICATION_NONCE_LENGTH); + if (popIfFound) + { + RakNet::OP_DELETE(generatedNonces[i],_FILE_AND_LINE_); + generatedNonces.RemoveAtIndex(i); + } + return true; + } + else + { + return false; + } + } + } + return false; +} +void TwoWayAuthentication::NonceGenerator::Clear(void) +{ + unsigned int i; + for (i=0; i < generatedNonces.Size(); i++) + RakNet::OP_DELETE(generatedNonces[i],_FILE_AND_LINE_); + generatedNonces.Clear(true,_FILE_AND_LINE_); +} +void TwoWayAuthentication::NonceGenerator::ClearByAddress(RakNet::AddressOrGUID remoteSystem) +{ + unsigned int i=0; + while (i < generatedNonces.Size()) + { + if (generatedNonces[i]->remoteSystem==remoteSystem) + { + RakNet::OP_DELETE(generatedNonces[i],_FILE_AND_LINE_); + generatedNonces.RemoveAtIndex(i); + } + else + { + i++; + } + } +} +void TwoWayAuthentication::NonceGenerator::Update(RakNet::Time curTime) +{ + if (generatedNonces.Size()>0 && GreaterThan(curTime-5000, generatedNonces[0]->whenGenerated)) + { + RakNet::OP_DELETE(generatedNonces[0], _FILE_AND_LINE_); + generatedNonces.RemoveAtIndex(0); + } +} +TwoWayAuthentication::TwoWayAuthentication() +{ + whenLastTimeoutCheck=RakNet::GetTime(); + seedMT(RakNet::GetTimeMS()); +} +TwoWayAuthentication::~TwoWayAuthentication() +{ + Clear(); +} +bool TwoWayAuthentication::AddPassword(RakNet::RakString identifier, RakNet::RakString password) +{ + if (password.IsEmpty()) + return false; + + if (identifier.IsEmpty()) + return false; + + if (password==identifier) + return false; // Insecure + + if (passwords.GetIndexOf(identifier.C_String()).IsInvalid()==false) + return false; // This identifier already in use + + passwords.Push(identifier, password,_FILE_AND_LINE_); + return true; +} +bool TwoWayAuthentication::Challenge(RakNet::RakString identifier, AddressOrGUID remoteSystem) +{ + DataStructures::HashIndex skhi = passwords.GetIndexOf(identifier.C_String()); + if (skhi.IsInvalid()) + return false; + + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_TWO_WAY_AUTHENTICATION_NEGOTIATION); + bsOut.Write((MessageID)ID_NONCE_REQUEST); + SendUnified(&bsOut,HIGH_PRIORITY,RELIABLE_ORDERED,0,remoteSystem,false); + + PendingChallenge pc; + pc.identifier=identifier; + pc.remoteSystem=remoteSystem; + pc.time=RakNet::GetTime(); + pc.sentHash=false; + outgoingChallenges.Push(pc,_FILE_AND_LINE_); + + return true; +} +void TwoWayAuthentication::Update(void) +{ + RakNet::Time curTime = RakNet::GetTime(); + nonceGenerator.Update(curTime); + if (GreaterThan(curTime - CHALLENGE_MINIMUM_TIMEOUT, whenLastTimeoutCheck)) + { + while (outgoingChallenges.Size() && GreaterThan(curTime - CHALLENGE_MINIMUM_TIMEOUT, outgoingChallenges.Peek().time)) + { + PendingChallenge pc = outgoingChallenges.Pop(); + + // Tell the user about the timeout + PushToUser(ID_TWO_WAY_AUTHENTICATION_OUTGOING_CHALLENGE_TIMEOUT, pc.identifier, pc.remoteSystem); + } + + whenLastTimeoutCheck=curTime+CHALLENGE_MINIMUM_TIMEOUT; + } +} +PluginReceiveResult TwoWayAuthentication::OnReceive(Packet *packet) +{ + switch (packet->data[0]) + { + case ID_TWO_WAY_AUTHENTICATION_NEGOTIATION: + { + if (packet->length>=sizeof(MessageID)*2) + { + switch (packet->data[sizeof(MessageID)]) + { + case ID_NONCE_REQUEST: + { + OnNonceRequest(packet); + } + break; + case ID_NONCE_REPLY: + { + OnNonceReply(packet); + } + break; + case ID_HASHED_NONCE_AND_PASSWORD: + { + return OnHashedNonceAndPassword(packet); + } + break; + } + } + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + case ID_TWO_WAY_AUTHENTICATION_OUTGOING_CHALLENGE_FAILURE: + case ID_TWO_WAY_AUTHENTICATION_OUTGOING_CHALLENGE_SUCCESS: + { + if (packet->wasGeneratedLocally==false) + { + OnPasswordResult(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + else + break; + } + break; + // These should only be generated locally + case ID_TWO_WAY_AUTHENTICATION_INCOMING_CHALLENGE_SUCCESS: + case ID_TWO_WAY_AUTHENTICATION_INCOMING_CHALLENGE_FAILURE: + case ID_TWO_WAY_AUTHENTICATION_OUTGOING_CHALLENGE_TIMEOUT: + if (packet->wasGeneratedLocally==false) + return RR_STOP_PROCESSING_AND_DEALLOCATE; + break; + } + + return RR_CONTINUE_PROCESSING; +} +void TwoWayAuthentication::OnRakPeerShutdown(void) +{ + Clear(); +} +void TwoWayAuthentication::OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ) +{ + (void) lostConnectionReason; + + // Remove from pending challenges + unsigned int i=0; + while (i < outgoingChallenges.Size()) + { + if ((rakNetGUID!=UNASSIGNED_RAKNET_GUID && outgoingChallenges[i].remoteSystem.rakNetGuid==rakNetGUID) || + (systemAddress!=UNASSIGNED_SYSTEM_ADDRESS && outgoingChallenges[i].remoteSystem.systemAddress==systemAddress)) + { + outgoingChallenges.RemoveAtIndex(i); + } + else + { + i++; + } + } + + if (rakNetGUID!=UNASSIGNED_RAKNET_GUID) + nonceGenerator.ClearByAddress(rakNetGUID); + else + nonceGenerator.ClearByAddress(systemAddress); +} +void TwoWayAuthentication::Clear(void) +{ + outgoingChallenges.Clear(_FILE_AND_LINE_); + passwords.Clear(_FILE_AND_LINE_); + nonceGenerator.Clear(); +} +void TwoWayAuthentication::PushToUser(MessageID messageId, RakNet::RakString password, RakNet::AddressOrGUID remoteSystem) +{ + RakNet::BitStream output; + output.Write(messageId); + if (password.IsEmpty()==false) + output.Write(password); + Packet *p = AllocatePacketUnified(output.GetNumberOfBytesUsed()); + p->systemAddress=remoteSystem.systemAddress; + p->systemAddress.systemIndex=(SystemIndex)-1; + p->guid=remoteSystem.rakNetGuid; + p->wasGeneratedLocally=true; + memcpy(p->data, output.GetData(), output.GetNumberOfBytesUsed()); + rakPeerInterface->PushBackPacket(p, true); +} +void TwoWayAuthentication::OnNonceRequest(Packet *packet) +{ + RakNet::BitStream bsIn(packet->data, packet->length, false); + bsIn.IgnoreBytes(sizeof(MessageID)*2); + + char nonce[TWO_WAY_AUTHENTICATION_NONCE_LENGTH]; + unsigned short requestId; + nonceGenerator.GetNonce(nonce,&requestId,packet); + + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_TWO_WAY_AUTHENTICATION_NEGOTIATION); + bsOut.Write((MessageID)ID_NONCE_REPLY); + bsOut.Write(requestId); + bsOut.WriteAlignedBytes((const unsigned char*) nonce,TWO_WAY_AUTHENTICATION_NONCE_LENGTH); + SendUnified(&bsOut,HIGH_PRIORITY,RELIABLE_ORDERED,0,packet,false); +} +void TwoWayAuthentication::OnNonceReply(Packet *packet) +{ + RakNet::BitStream bsIn(packet->data, packet->length, false); + bsIn.IgnoreBytes(sizeof(MessageID)*2); + + char thierNonce[TWO_WAY_AUTHENTICATION_NONCE_LENGTH]; + unsigned short requestId; + bsIn.Read(requestId); + bsIn.ReadAlignedBytes((unsigned char *) thierNonce,TWO_WAY_AUTHENTICATION_NONCE_LENGTH); + + // Lookup one of the negotiations for this guid/system address + AddressOrGUID aog(packet); + unsigned int i; + for (i=0; i < outgoingChallenges.Size(); i++) + { + if (outgoingChallenges[i].remoteSystem==aog && outgoingChallenges[i].sentHash==false) + { + outgoingChallenges[i].sentHash=true; + + // Get the password for this identifier + DataStructures::HashIndex skhi = passwords.GetIndexOf(outgoingChallenges[i].identifier.C_String()); + if (skhi.IsInvalid()==false) + { + RakNet::RakString password = passwords.ItemAtIndex(skhi); + + // Hash their nonce with password and reply + char hashedNonceAndPw[HASHED_NONCE_AND_PW_LENGTH]; + Hash(thierNonce, password, hashedNonceAndPw); + + // Send + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_TWO_WAY_AUTHENTICATION_NEGOTIATION); + bsOut.Write((MessageID)ID_HASHED_NONCE_AND_PASSWORD); + bsOut.Write(requestId); + bsOut.Write(outgoingChallenges[i].identifier); // Identifier helps the other system lookup the password quickly. + bsOut.WriteAlignedBytes((const unsigned char*) hashedNonceAndPw,HASHED_NONCE_AND_PW_LENGTH); + SendUnified(&bsOut,HIGH_PRIORITY,RELIABLE_ORDERED,0,packet,false); + } + + return; + } + } +} +PluginReceiveResult TwoWayAuthentication::OnHashedNonceAndPassword(Packet *packet) +{ + RakNet::BitStream bsIn(packet->data, packet->length, false); + bsIn.IgnoreBytes(sizeof(MessageID)*2); + + char remoteHashedNonceAndPw[HASHED_NONCE_AND_PW_LENGTH]; + unsigned short requestId; + bsIn.Read(requestId); + RakNet::RakString passwordIdentifier; + bsIn.Read(passwordIdentifier); + bsIn.ReadAlignedBytes((unsigned char *) remoteHashedNonceAndPw,HASHED_NONCE_AND_PW_LENGTH); + + // Look up used nonce from requestId + char usedNonce[TWO_WAY_AUTHENTICATION_NONCE_LENGTH]; + if (nonceGenerator.GetNonceById(usedNonce, requestId, packet, true)==false) + return RR_STOP_PROCESSING_AND_DEALLOCATE; + + DataStructures::HashIndex skhi = passwords.GetIndexOf(passwordIdentifier.C_String()); + if (skhi.IsInvalid()==false) + { + char hashedThisNonceAndPw[HASHED_NONCE_AND_PW_LENGTH]; + Hash(usedNonce, passwords.ItemAtIndex(skhi), hashedThisNonceAndPw); + if (memcmp(hashedThisNonceAndPw, remoteHashedNonceAndPw,HASHED_NONCE_AND_PW_LENGTH)==0) + { + // Pass + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_TWO_WAY_AUTHENTICATION_OUTGOING_CHALLENGE_SUCCESS); + bsOut.WriteAlignedBytes((const unsigned char*) usedNonce,TWO_WAY_AUTHENTICATION_NONCE_LENGTH); + bsOut.WriteAlignedBytes((const unsigned char*) remoteHashedNonceAndPw,HASHED_NONCE_AND_PW_LENGTH); + bsOut.Write(passwordIdentifier); + SendUnified(&bsOut,HIGH_PRIORITY,RELIABLE_ORDERED,0,packet,false); + + // Incoming success, modify packet header to tell user + PushToUser(ID_TWO_WAY_AUTHENTICATION_INCOMING_CHALLENGE_SUCCESS, passwordIdentifier, packet); + + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + } + + // Incoming failure, modify arrived packet header to tell user + packet->data[0]=(MessageID) ID_TWO_WAY_AUTHENTICATION_INCOMING_CHALLENGE_FAILURE; + + RakNet::BitStream bsOut; + bsOut.Write((MessageID)ID_TWO_WAY_AUTHENTICATION_OUTGOING_CHALLENGE_FAILURE); + bsOut.WriteAlignedBytes((const unsigned char*) usedNonce,TWO_WAY_AUTHENTICATION_NONCE_LENGTH); + bsOut.WriteAlignedBytes((const unsigned char*) remoteHashedNonceAndPw,HASHED_NONCE_AND_PW_LENGTH); + bsOut.Write(passwordIdentifier); + SendUnified(&bsOut,HIGH_PRIORITY,RELIABLE_ORDERED,0,packet,false); + + return RR_CONTINUE_PROCESSING; +} +void TwoWayAuthentication::OnPasswordResult(Packet *packet) +{ + RakNet::BitStream bsIn(packet->data, packet->length, false); + bsIn.IgnoreBytes(sizeof(MessageID)*1); + char usedNonce[TWO_WAY_AUTHENTICATION_NONCE_LENGTH]; + bsIn.ReadAlignedBytes((unsigned char *)usedNonce,TWO_WAY_AUTHENTICATION_NONCE_LENGTH); + char hashedNonceAndPw[HASHED_NONCE_AND_PW_LENGTH]; + bsIn.ReadAlignedBytes((unsigned char *)hashedNonceAndPw,HASHED_NONCE_AND_PW_LENGTH); + RakNet::RakString passwordIdentifier; + bsIn.Read(passwordIdentifier); + + DataStructures::HashIndex skhi = passwords.GetIndexOf(passwordIdentifier.C_String()); + if (skhi.IsInvalid()==false) + { + RakNet::RakString password = passwords.ItemAtIndex(skhi); + char testHash[HASHED_NONCE_AND_PW_LENGTH]; + Hash(usedNonce, password, testHash); + if (memcmp(testHash,hashedNonceAndPw,HASHED_NONCE_AND_PW_LENGTH)==0) + { + // Lookup the outgoing challenge and remove it from the list + unsigned int i; + AddressOrGUID aog(packet); + for (i=0; i < outgoingChallenges.Size(); i++) + { + if (outgoingChallenges[i].identifier==passwordIdentifier && + outgoingChallenges[i].remoteSystem==aog && + outgoingChallenges[i].sentHash==true) + { + outgoingChallenges.RemoveAtIndex(i); + + PushToUser(packet->data[0], passwordIdentifier, packet); + return; + } + } + } + } +} +void TwoWayAuthentication::Hash(char thierNonce[TWO_WAY_AUTHENTICATION_NONCE_LENGTH], RakNet::RakString password, char out[HASHED_NONCE_AND_PW_LENGTH]) +{ +#if LIBCAT_SECURITY==1 + cat::Skein hash; + if (!hash.BeginKey(HASH_BITS)) return; + hash.Crunch(thierNonce, TWO_WAY_AUTHENTICATION_NONCE_LENGTH); + hash.Crunch(password.C_String(), (int) password.GetLength()); + hash.End(); + hash.Generate(out, HASH_BYTES, STRENGTHENING_FACTOR); +#else + CSHA1 sha1; + sha1.Update((unsigned char *) thierNonce, TWO_WAY_AUTHENTICATION_NONCE_LENGTH); + sha1.Update((unsigned char *) password.C_String(), (unsigned int) password.GetLength()); + sha1.Final(); + sha1.GetHash((unsigned char *) out); +#endif +} + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TwoWayAuthentication.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TwoWayAuthentication.h new file mode 100644 index 0000000..3a3b850 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/TwoWayAuthentication.h @@ -0,0 +1,146 @@ +/// \file TwoWayAuthentication.h +/// \brief Implements two way authentication +/// \details Given two systems, each of whom known a common password, verify the password without transmitting it +/// This can be used to determine what permissions are should be allowed to the other system +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_TwoWayAuthentication==1 + +#ifndef __TWO_WAY_AUTHENTICATION_H +#define __TWO_WAY_AUTHENTICATION_H + +// How often to change the nonce. +#define NONCE_TIMEOUT_MS 10000 +// How often to check for ID_TWO_WAY_AUTHENTICATION_OUTGOING_CHALLENGE_TIMEOUT, and the minimum timeout time. Maximum is double this value. +#define CHALLENGE_MINIMUM_TIMEOUT 3000 + +#if LIBCAT_SECURITY==1 +// From CPP FILE: +// static const int HASH_BITS = 256; +// static const int HASH_BYTES = HASH_BITS / 8; +// static const int STRENGTHENING_FACTOR = 1000; +#define TWO_WAY_AUTHENTICATION_NONCE_LENGTH 32 +#define HASHED_NONCE_AND_PW_LENGTH 32 +#else +#include "SHA1.h" +#define TWO_WAY_AUTHENTICATION_NONCE_LENGTH 20 +#define HASHED_NONCE_AND_PW_LENGTH SHA1_LENGTH +#endif + +#include "PluginInterface2.h" +#include "RakMemoryOverride.h" +#include "NativeTypes.h" +#include "RakString.h" +#include "DS_Hash.h" +#include "DS_Queue.h" + +typedef int64_t FCM2Guid; + +namespace RakNet +{ +/// Forward declarations +class RakPeerInterface; + +/// \brief Implements two way authentication +/// \details Given two systems, each of whom known a common password / identifier pair, verify the password without transmitting it +/// This can be used to determine what permissions are should be allowed to the other system +/// If the other system should not send any data until authentication passes, you can use the MessageFilter plugin for this. Call MessageFilter::SetAllowMessageID() including ID_TWO_WAY_AUTHENTICATION_NEGOTIATION when doing so. Also attach MessageFilter first in the list of plugins +/// \note If other systems challenges us, and fails, you will get ID_TWO_WAY_AUTHENTICATION_INCOMING_CHALLENGE_FAILED. +/// \ingroup PLUGINS_GROUP +class RAK_DLL_EXPORT TwoWayAuthentication : public PluginInterface2 +{ +public: + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(TwoWayAuthentication) + + TwoWayAuthentication(); + virtual ~TwoWayAuthentication(); + + /// \brief Adds a password to the list of passwords the system will accept + /// \details Each password, which is secret and not transmitted, is identified by \a identifier. + /// \a identifier is transmitted in plaintext with the request. It is only needed because the system supports multiple password. + /// It is used to only hash against once password on the remote system, rather than having to hash against every known password. + /// \param[in] identifier A unique identifier representing this password. This is transmitted in plaintext and should be considered insecure + /// \param[in] password The password to add + /// \return True on success, false on identifier==password, either identifier or password is blank, or identifier is already in use + bool AddPassword(RakNet::RakString identifier, RakNet::RakString password); + + /// \brief Challenge another system for the specified identifier + /// \details After calling Challenge, you will get back ID_TWO_WAY_AUTHENTICATION_SUCCESS, ID_TWO_WAY_AUTHENTICATION_OUTGOING_CHALLENGE_TIMEOUT, or ID_TWO_WAY_AUTHENTICATION_OUTGOING_CHALLENGE_FAILED + /// ID_TWO_WAY_AUTHENTICATION_SUCCESS will be returned if and only if the other system has called AddPassword() with the same identifier\password pair as this system. + /// \param[in] identifier A unique identifier representing this password. This is transmitted in plaintext and should be considered insecure + /// \return True on success, false on remote system not connected, or identifier not previously added with AddPassword() + bool Challenge(RakNet::RakString identifier, AddressOrGUID remoteSystem); + + /// \brief Free all memory + void Clear(void); + + /// \internal + virtual void Update(void); + /// \internal + virtual PluginReceiveResult OnReceive(Packet *packet); + /// \internal + virtual void OnRakPeerShutdown(void); + /// \internal + virtual void OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ); + + /// \internal + struct PendingChallenge + { + RakNet::RakString identifier; + AddressOrGUID remoteSystem; + RakNet::Time time; + bool sentHash; + }; + + DataStructures::Queue outgoingChallenges; + + /// \internal + struct NonceAndRemoteSystemRequest + { + char nonce[TWO_WAY_AUTHENTICATION_NONCE_LENGTH]; + RakNet::AddressOrGUID remoteSystem; + unsigned short requestId; + RakNet::Time whenGenerated; + }; + /// \internal + struct RAK_DLL_EXPORT NonceGenerator + { + NonceGenerator(); + ~NonceGenerator(); + void GetNonce(char nonce[TWO_WAY_AUTHENTICATION_NONCE_LENGTH], unsigned short *requestId, RakNet::AddressOrGUID remoteSystem); + void GenerateNonce(char nonce[TWO_WAY_AUTHENTICATION_NONCE_LENGTH]); + bool GetNonceById(char nonce[TWO_WAY_AUTHENTICATION_NONCE_LENGTH], unsigned short requestId, RakNet::AddressOrGUID remoteSystem, bool popIfFound); + void Clear(void); + void ClearByAddress(RakNet::AddressOrGUID remoteSystem); + void Update(RakNet::Time curTime); + + DataStructures::List generatedNonces; + unsigned short nextRequestId; + }; + +protected: + void PushToUser(MessageID messageId, RakNet::RakString password, RakNet::AddressOrGUID remoteSystem); + // Key is identifier, data is password + DataStructures::Hash passwords; + + RakNet::Time whenLastTimeoutCheck; + + NonceGenerator nonceGenerator; + + void OnNonceRequest(Packet *packet); + void OnNonceReply(Packet *packet); + PluginReceiveResult OnHashedNonceAndPassword(Packet *packet); + void OnPasswordResult(Packet *packet); + void Hash(char thierNonce[TWO_WAY_AUTHENTICATION_NONCE_LENGTH], RakNet::RakString password, char out[HASHED_NONCE_AND_PW_LENGTH]); +}; + +} // namespace RakNet + +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/UDPForwarder.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/UDPForwarder.cpp new file mode 100644 index 0000000..e1038c5 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/UDPForwarder.cpp @@ -0,0 +1,816 @@ +#include "UDPForwarder.h" + +#if _RAKNET_SUPPORT_UDPForwarder==1 + +#include "GetTime.h" +#include "MTUSize.h" +#include "SocketLayer.h" +#include "WSAStartupSingleton.h" +#include "RakSleep.h" +#include "DS_OrderedList.h" +#include "LinuxStrings.h" +#include "SocketDefines.h" +#include "VitaIncludes.h" + +using namespace RakNet; +static const unsigned short DEFAULT_MAX_FORWARD_ENTRIES=64; + +#ifdef UDP_FORWARDER_EXECUTE_THREADED +namespace RakNet +{ + RAK_THREAD_DECLARATION(UpdateUDPForwarder); +} +#endif + +int UDPForwarder::SrcAndDestForwardEntryComp( const UDPForwarder::SrcAndDest &inputKey, UDPForwarder::ForwardEntry * const &cls ) +{ + if (inputKey.source < cls->srcAndDest.source) + return -1; + + if (inputKey.source > cls->srcAndDest.source) + return 1; + + if (inputKey.dest < cls->srcAndDest.dest) + return -1; + + if (inputKey.dest > cls->srcAndDest.dest) + return 1; + + return 0; +} +/* +bool operator<( const DataStructures::MLKeyRef &inputKey, const UDPForwarder::ForwardEntry *cls ) +{ + return inputKey.Get().source < cls->srcAndDest.source || + (inputKey.Get().source == cls->srcAndDest.source && inputKey.Get().dest < cls->srcAndDest.dest); +} +bool operator>( const DataStructures::MLKeyRef &inputKey, const UDPForwarder::ForwardEntry *cls ) +{ + return inputKey.Get().source > cls->srcAndDest.source || + (inputKey.Get().source == cls->srcAndDest.source && inputKey.Get().dest > cls->srcAndDest.dest); +} +bool operator==( const DataStructures::MLKeyRef &inputKey, const UDPForwarder::ForwardEntry *cls ) +{ + return inputKey.Get().source == cls->srcAndDest.source && inputKey.Get().dest == cls->srcAndDest.dest; +} +*/ + + +UDPForwarder::ForwardEntry::ForwardEntry() {socket=INVALID_SOCKET; timeLastDatagramForwarded=RakNet::GetTimeMS(); updatedSourcePort=false; updatedDestPort=false;} +UDPForwarder::ForwardEntry::~ForwardEntry() { + if (socket!=INVALID_SOCKET) + closesocket__(socket); +} + +UDPForwarder::UDPForwarder() +{ +#ifdef _WIN32 + WSAStartupSingleton::AddRef(); +#endif + + maxForwardEntries=DEFAULT_MAX_FORWARD_ENTRIES; + isRunning=false; + threadRunning=false; + + + + +} +UDPForwarder::~UDPForwarder() +{ + Shutdown(); + +#ifdef _WIN32 + WSAStartupSingleton::Deref(); +#endif +} +void UDPForwarder::Startup(void) +{ + if (isRunning==true) + return; + + isRunning=true; + threadRunning=false; + +#ifdef UDP_FORWARDER_EXECUTE_THREADED + + + + + + int errorCode; + + + + + errorCode = RakNet::RakThread::Create(UpdateUDPForwarder, this); + + if ( errorCode != 0 ) + { + RakAssert(0); + return; + } + + while (threadRunning==false) + RakSleep(30); +#endif +} +void UDPForwarder::Shutdown(void) +{ + if (isRunning==false) + return; + + isRunning=false; + +#ifdef UDP_FORWARDER_EXECUTE_THREADED + while (threadRunning==true) + RakSleep(30); +#endif + + unsigned int j; + for (j=0; j < forwardList.Size(); j++) + RakNet::OP_DELETE(forwardList[j],_FILE_AND_LINE_); + forwardList.Clear(false, _FILE_AND_LINE_); + + + + + + +} +void UDPForwarder::Update(void) +{ +#ifndef UDP_FORWARDER_EXECUTE_THREADED + #if RAKNET_SUPPORT_IPV6!=1 + UpdateThreaded_Old(); + #else + UpdateThreaded(); + #endif +#endif +} +void UDPForwarder::UpdateThreaded_Old(void) +{ + fd_set readFD; + //fd_set exceptionFD; + FD_ZERO(&readFD); + // FD_ZERO(&exceptionFD); + int selectResult; + + + timeval tv; + tv.tv_sec=0; + tv.tv_usec=0; + + + RakNet::TimeMS curTime = RakNet::GetTimeMS(); + + SOCKET largestDescriptor=0; + unsigned int i; + + // Remove unused entries + i=0; + while (i < forwardList.Size()) + { + if (curTime > forwardList[i]->timeLastDatagramForwarded && // Account for timestamp wrap + curTime > forwardList[i]->timeLastDatagramForwarded+forwardList[i]->timeoutOnNoDataMS) + { + RakNet::OP_DELETE(forwardList[i],_FILE_AND_LINE_); + forwardList.RemoveAtIndex(i); + } + else + i++; + } + + if (forwardList.Size()==0) + return; + + for (i=0; i < forwardList.Size(); i++) + { +#ifdef _MSC_VER +#pragma warning( disable : 4127 ) // warning C4127: conditional expression is constant +#endif + FD_SET(forwardList[i]->socket, &readFD); + // FD_SET(forwardList[i]->readSocket, &exceptionFD); + + if (forwardList[i]->socket > largestDescriptor) + largestDescriptor = forwardList[i]->socket; + } + + + selectResult=(int) select__((int) largestDescriptor+1, &readFD, 0, 0, &tv); + + + + + char data[ MAXIMUM_MTU_SIZE ]; + sockaddr_in sa; + socklen_t len2; + + if (selectResult > 0) + { + DataStructures::Queue entriesToRead; + ForwardEntry *forwardEntry; + + for (i=0; i < forwardList.Size(); i++) + { + forwardEntry = forwardList[i]; + // I do this because I'm updating the forwardList, and don't want to lose FD_ISSET as the list is no longer in order + if (FD_ISSET(forwardEntry->socket, &readFD)) + entriesToRead.Push(forwardEntry,_FILE_AND_LINE_); + } + + while (entriesToRead.IsEmpty()==false) + { + forwardEntry=entriesToRead.Pop(); + + const int flag=0; + int receivedDataLen, len=0; + unsigned short portnum=0; + len2 = sizeof( sa ); + sa.sin_family = AF_INET; + receivedDataLen = recvfrom__( forwardEntry->socket, data, MAXIMUM_MTU_SIZE, flag, ( sockaddr* ) & sa, ( socklen_t* ) & len2 ); + + if (receivedDataLen<0) + { +#if defined(_WIN32) && defined(_DEBUG) + DWORD dwIOError = WSAGetLastError(); + + if (dwIOError!=WSAECONNRESET && dwIOError!=WSAEINTR && dwIOError!=WSAETIMEDOUT) + { + LPVOID messageBuffer; + FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, dwIOError, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), // Default language + ( LPTSTR ) & messageBuffer, 0, NULL ); + // something has gone wrong here... + RAKNET_DEBUG_PRINTF( "recvfrom failed:Error code - %d\n%s", dwIOError, messageBuffer ); + + //Free the buffer. + LocalFree( messageBuffer ); + } +#endif + continue; + } + + portnum = ntohs( sa.sin_port ); + if (forwardEntry->srcAndDest.source.address.addr4.sin_addr.s_addr==sa.sin_addr.s_addr && forwardEntry->updatedSourcePort==false && forwardEntry->srcAndDest.dest.GetPort()!=portnum) + { + forwardEntry->updatedSourcePort=true; + + if (forwardEntry->srcAndDest.source.GetPort()!=portnum) + { + unsigned int index; + SrcAndDest srcAndDest(forwardEntry->srcAndDest.dest, forwardEntry->srcAndDest.source); + bool objectExists; + index = forwardList.GetIndexFromKey(srcAndDest, &objectExists); + if (objectExists) + { + forwardList.RemoveAtIndex(index); + } + forwardEntry->srcAndDest.source.SetPort(portnum); + forwardList.Insert(forwardEntry->srcAndDest,forwardEntry,true,_FILE_AND_LINE_); + } + } + + if (forwardEntry->srcAndDest.source.address.addr4.sin_addr.s_addr==sa.sin_addr.s_addr && forwardEntry->srcAndDest.source.GetPort()==portnum) + { + // Forward to dest + len=0; + sockaddr_in saOut; + saOut.sin_port = forwardEntry->srcAndDest.dest.GetPortNetworkOrder(); // User port + saOut.sin_addr.s_addr = forwardEntry->srcAndDest.dest.address.addr4.sin_addr.s_addr; + saOut.sin_family = AF_INET; + do + { + len = sendto__( forwardEntry->socket, data, receivedDataLen, 0, ( const sockaddr* ) & saOut, sizeof( saOut ) ); + } + while ( len == 0 ); + + // printf("1. Forwarding after %i ms\n", curTime-forwardEntry->timeLastDatagramForwarded); + + forwardEntry->timeLastDatagramForwarded=curTime; + } + + if (forwardEntry->srcAndDest.dest.address.addr4.sin_addr.s_addr==sa.sin_addr.s_addr && forwardEntry->updatedDestPort==false && forwardEntry->srcAndDest.source.GetPort()!=portnum) + { + forwardEntry->updatedDestPort=true; + + if (forwardEntry->srcAndDest.dest.GetPort()!=portnum) + { + unsigned int index; + SrcAndDest srcAndDest(forwardEntry->srcAndDest.source, forwardEntry->srcAndDest.dest); + bool objectExists; + index = forwardList.GetIndexFromKey(srcAndDest, &objectExists); + if (objectExists) + { + forwardList.RemoveAtIndex(index); + } + forwardEntry->srcAndDest.dest.SetPort(portnum); + forwardList.Insert(forwardEntry->srcAndDest,forwardEntry,true,_FILE_AND_LINE_); + } + } + + if (forwardEntry->srcAndDest.dest.address.addr4.sin_addr.s_addr==sa.sin_addr.s_addr && forwardEntry->srcAndDest.dest.GetPort()==portnum) + { + // Forward to source + len=0; + sockaddr_in saOut; + saOut.sin_port = forwardEntry->srcAndDest.source.GetPortNetworkOrder(); // User port + saOut.sin_addr.s_addr = forwardEntry->srcAndDest.source.address.addr4.sin_addr.s_addr; + saOut.sin_family = AF_INET; + do + { + len = sendto__( forwardEntry->socket, data, receivedDataLen, 0, ( const sockaddr* ) & saOut, sizeof( saOut ) ); + } + while ( len == 0 ); + + // printf("2. Forwarding after %i ms\n", curTime-forwardEntry->timeLastDatagramForwarded); + + forwardEntry->timeLastDatagramForwarded=curTime; + } + } + } +} +#if RAKNET_SUPPORT_IPV6==1 +void UDPForwarder::UpdateThreaded(void) +{ + fd_set readFD; + //fd_set exceptionFD; + FD_ZERO(&readFD); +// FD_ZERO(&exceptionFD); + timeval tv; + int selectResult; + tv.tv_sec=0; + tv.tv_usec=0; + + RakNet::TimeMS curTime = RakNet::GetTimeMS(); + + SOCKET largestDescriptor=0; + unsigned int i; + + // Remove unused entries + i=0; + while (i < forwardList.Size()) + { + if (curTime > forwardList[i]->timeLastDatagramForwarded && // Account for timestamp wrap + curTime > forwardList[i]->timeLastDatagramForwarded+forwardList[i]->timeoutOnNoDataMS) + { + RakNet::OP_DELETE(forwardList[i],_FILE_AND_LINE_); + forwardList.RemoveAtIndex(i); + } + else + i++; + } + + if (forwardList.Size()==0) + return; + + for (i=0; i < forwardList.Size(); i++) + { +#ifdef _MSC_VER +#pragma warning( disable : 4127 ) // warning C4127: conditional expression is constant +#endif + FD_SET(forwardList[i]->socket, &readFD); +// FD_SET(forwardList[i]->readSocket, &exceptionFD); + + if (forwardList[i]->socket > largestDescriptor) + largestDescriptor = forwardList[i]->socket; + } + + selectResult=(int) select__((int) largestDescriptor+1, &readFD, 0, 0, &tv); + + char data[ MAXIMUM_MTU_SIZE ]; + sockaddr_storage their_addr; + sockaddr* sockAddrPtr; + socklen_t sockLen; + socklen_t* socketlenPtr=(socklen_t*) &sockLen; + sockaddr_in *sockAddrIn; + sockaddr_in6 *sockAddrIn6; + SystemAddress receivedAddr; + sockLen=sizeof(their_addr); + sockAddrPtr=(sockaddr*) &their_addr; + + if (selectResult > 0) + { + DataStructures::Queue entriesToRead; + ForwardEntry *forwardEntry; + + for (i=0; i < forwardList.Size(); i++) + { + forwardEntry = forwardList[i]; + // I do this because I'm updating the forwardList, and don't want to lose FD_ISSET as the list is no longer in order + if (FD_ISSET(forwardEntry->socket, &readFD)) + entriesToRead.Push(forwardEntry,_FILE_AND_LINE_); + } + + while (entriesToRead.IsEmpty()==false) + { + forwardEntry=entriesToRead.Pop(); + + const int flag=0; + int receivedDataLen, len=0; + receivedDataLen = recvfrom__( forwardEntry->socket, data, MAXIMUM_MTU_SIZE, flag, sockAddrPtr, socketlenPtr ); + + if (receivedDataLen<0) + { +#if defined(_WIN32) && defined(_DEBUG) + DWORD dwIOError = WSAGetLastError(); + + if (dwIOError!=WSAECONNRESET && dwIOError!=WSAEINTR && dwIOError!=WSAETIMEDOUT) + { + LPVOID messageBuffer; + FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, dwIOError, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), // Default language + ( LPTSTR ) & messageBuffer, 0, NULL ); + // something has gone wrong here... + RAKNET_DEBUG_PRINTF( "recvfrom failed:Error code - %d\n%s", dwIOError, messageBuffer ); + + //Free the buffer. + LocalFree( messageBuffer ); + } +#endif + continue; + } + + if (their_addr.ss_family==AF_INET) + { + sockAddrIn=(sockaddr_in *)&their_addr; + sockAddrIn6=0; + memcpy(&receivedAddr.address.addr4,sockAddrIn,sizeof(sockaddr_in)); + // receivedAddr.address.addr4.sin_port=ntohs( sockAddrIn->sin_port ); + } + else + { + sockAddrIn=0; + sockAddrIn6=(sockaddr_in6 *)&their_addr; + memcpy(&receivedAddr.address.addr6,sockAddrIn6,sizeof(sockaddr_in6)); + // receivedAddr.address.addr6.sin6_port=ntohs( sockAddrIn6->sin6_port ); + } + + if (forwardEntry->srcAndDest.source.EqualsExcludingPort(receivedAddr) && forwardEntry->updatedSourcePort==false && forwardEntry->srcAndDest.dest.GetPort()!=receivedAddr.GetPort()) + { + forwardEntry->updatedSourcePort=true; + + if (forwardEntry->srcAndDest.source.GetPort()!=receivedAddr.GetPort()) + { + unsigned int index; + SrcAndDest srcAndDest(forwardEntry->srcAndDest.dest, forwardEntry->srcAndDest.source); + bool objectExists; + index=forwardList.GetIndexFromKey(srcAndDest, &objectExists); + forwardList.RemoveAtIndex(index); + forwardEntry->srcAndDest.source.SetPort(receivedAddr.GetPort()); + forwardList.Push(forwardEntry,forwardEntry->srcAndDest,_FILE_AND_LINE_); + } + } + + if (forwardEntry->srcAndDest.source.EqualsExcludingPort(receivedAddr) && forwardEntry->srcAndDest.source.GetPort()==receivedAddr.GetPort()) + { + // Forward to dest + len=0; + + if (forwardEntry->srcAndDest.dest.address.addr4.sin_family==AF_INET) + { + do + { + len = sendto__( forwardEntry->socket, data, receivedDataLen, 0, ( const sockaddr* ) & forwardEntry->srcAndDest.dest.address.addr4, sizeof( sockaddr_in ) ); + } + while ( len == 0 ); + } + else + { + do + { + len = sendto__( forwardEntry->socket, data, receivedDataLen, 0, ( const sockaddr* ) & forwardEntry->srcAndDest.dest.address.addr6, sizeof( sockaddr_in ) ); + } + while ( len == 0 ); + } + + + // printf("1. Forwarding after %i ms\n", curTime-forwardEntry->timeLastDatagramForwarded); + + forwardEntry->timeLastDatagramForwarded=curTime; + } + + if (forwardEntry->srcAndDest.dest.EqualsExcludingPort(receivedAddr) && forwardEntry->updatedDestPort==false && forwardEntry->srcAndDest.source.GetPort()!=receivedAddr.GetPort()) + { + forwardEntry->updatedDestPort=true; + + if (forwardEntry->srcAndDest.dest.GetPort()!=receivedAddr.GetPort()) + { + unsigned int index; + SrcAndDest srcAndDest(forwardEntry->srcAndDest.source, forwardEntry->srcAndDest.dest); + index=forwardList.GetIndexOf(srcAndDest); + forwardList.RemoveAtIndex(index); + forwardEntry->srcAndDest.dest.SetPort(receivedAddr.GetPort()); + forwardList.Push(forwardEntry,forwardEntry->srcAndDest,_FILE_AND_LINE_); + } + } + + if (forwardEntry->srcAndDest.dest.EqualsExcludingPort(receivedAddr) && forwardEntry->srcAndDest.dest.GetPort()==receivedAddr.GetPort()) + { + // Forward to source + len=0; + if (forwardEntry->srcAndDest.source.address.addr4.sin_family==AF_INET) + { + do + { + len = sendto__( forwardEntry->socket, data, receivedDataLen, 0, ( const sockaddr* ) & forwardEntry->srcAndDest.source.address.addr4, sizeof( sockaddr_in ) ); + } + while ( len == 0 ); + } + else + { + do + { + len = sendto__( forwardEntry->socket, data, receivedDataLen, 0, ( const sockaddr* ) & forwardEntry->srcAndDest.source.address.addr6, sizeof( sockaddr_in ) ); + } + while ( len == 0 ); + } + + // printf("2. Forwarding after %i ms\n", curTime-forwardEntry->timeLastDatagramForwarded); + + forwardEntry->timeLastDatagramForwarded=curTime; + } + } + } +} +#endif // #if RAKNET_SUPPORT_IPV6!=1 +void UDPForwarder::SetMaxForwardEntries(unsigned short maxEntries) +{ + RakAssert(maxEntries>0 && maxEntries<65535/2); + maxForwardEntries=maxEntries; +} +int UDPForwarder::GetMaxForwardEntries(void) const +{ + return maxForwardEntries; +} +int UDPForwarder::GetUsedForwardEntries(void) const +{ + return (int) forwardList.Size(); +} +UDPForwarderResult UDPForwarder::AddForwardingEntry(SrcAndDest srcAndDest, RakNet::TimeMS timeoutOnNoDataMS, unsigned short *port, const char *forceHostAddress, short socketFamily) +{ + (void) socketFamily; + + unsigned int insertionIndex; + bool objectExists; + insertionIndex = forwardList.GetIndexFromKey(srcAndDest, &objectExists); + if (objectExists==false) + { +#if RAKNET_SUPPORT_IPV6!=1 + int sock_opt; + sockaddr_in listenerSocketAddress; + listenerSocketAddress.sin_port = 0; + ForwardEntry *fe = RakNet::OP_NEW(_FILE_AND_LINE_); + fe->srcAndDest=srcAndDest; + fe->timeoutOnNoDataMS=timeoutOnNoDataMS; + fe->socket = socket__( AF_INET, SOCK_DGRAM, 0 ); + + //printf("Made socket %i\n", fe->readSocket); + + // This doubles the max throughput rate + sock_opt=1024*256; + setsockopt__(fe->socket, SOL_SOCKET, SO_RCVBUF, ( char * ) & sock_opt, sizeof ( sock_opt ) ); + + // Immediate hard close. Don't linger the readSocket, or recreating the readSocket quickly on Vista fails. + sock_opt=0; + setsockopt__(fe->socket, SOL_SOCKET, SO_LINGER, ( char * ) & sock_opt, sizeof ( sock_opt ) ); + + listenerSocketAddress.sin_family = AF_INET; + + if (forceHostAddress && forceHostAddress[0]) + { + + + + listenerSocketAddress.sin_addr.s_addr = inet_addr__( forceHostAddress ); + + } + else + { + listenerSocketAddress.sin_addr.s_addr = INADDR_ANY; + } + + int ret = bind__( fe->socket, ( struct sockaddr * ) & listenerSocketAddress, sizeof( listenerSocketAddress ) ); + if (ret==-1) + { + RakNet::OP_DELETE(fe,_FILE_AND_LINE_); + return UDPFORWARDER_BIND_FAILED; + } +#else + ForwardEntry *fe = RakNet::OP_NEW(_FILE_AND_LINE_); + fe->srcAndDest=srcAndDest; + fe->timeoutOnNoDataMS=timeoutOnNoDataMS; + fe->socket=INVALID_SOCKET; + + struct addrinfo hints; + memset(&hints, 0, sizeof (addrinfo)); // make sure the struct is empty + hints.ai_family = socketFamily; + hints.ai_socktype = SOCK_DGRAM; // UDP sockets + hints.ai_flags = AI_PASSIVE; // fill in my IP for me + struct addrinfo *servinfo=0, *aip; // will point to the results + + + RakAssert(forceHostAddress==0 || forceHostAddress[0]!=0); + if (_stricmp(forceHostAddress,"UNASSIGNED_SYSTEM_ADDRESS")==0) + { + getaddrinfo(0, "0", &hints, &servinfo); + } + else + { + getaddrinfo(forceHostAddress, "0", &hints, &servinfo); + } + + for (aip = servinfo; aip != NULL; aip = aip->ai_next) + { + // Open socket. The address type depends on what + // getaddrinfo() gave us. + fe->socket = socket__(aip->ai_family, aip->ai_socktype, aip->ai_protocol); + if (fe->socket != INVALID_SOCKET) + { + int ret = bind__( fe->socket, aip->ai_addr, (int) aip->ai_addrlen ); + if (ret>=0) + { + break; + } + else + { + closesocket__(fe->socket); + fe->socket=INVALID_SOCKET; + } + } + } + + if (fe->socket==INVALID_SOCKET) + return UDPFORWARDER_BIND_FAILED; + + //printf("Made socket %i\n", fe->readSocket); + + // This doubles the max throughput rate + int sock_opt; + sock_opt=1024*256; + setsockopt__(fe->socket, SOL_SOCKET, SO_RCVBUF, ( char * ) & sock_opt, sizeof ( sock_opt ) ); + + // Immediate hard close. Don't linger the readSocket, or recreating the readSocket quickly on Vista fails. + sock_opt=0; + setsockopt__(fe->socket, SOL_SOCKET, SO_LINGER, ( char * ) & sock_opt, sizeof ( sock_opt ) ); +#endif // #if RAKNET_SUPPORT_IPV6!=1 + +// unsigned int oldSize = forwardList.Size(); + forwardList.InsertAtIndex(fe,insertionIndex,_FILE_AND_LINE_); + // RakAssert(forwardList.GetIndexOf(fe->srcAndDest)!=(unsigned int) -1); + *port = SocketLayer::GetLocalPort ( fe->socket ); + return UDPFORWARDER_SUCCESS; + } + + return UDPFORWARDER_FORWARDING_ALREADY_EXISTS; +} +UDPForwarderResult UDPForwarder::StartForwarding(SystemAddress source, SystemAddress destination, RakNet::TimeMS timeoutOnNoDataMS, const char *forceHostAddress, unsigned short socketFamily, + unsigned short *forwardingPort, SOCKET *forwardingSocket) +{ + // Invalid parameters? + if (timeoutOnNoDataMS == 0 || timeoutOnNoDataMS > UDP_FORWARDER_MAXIMUM_TIMEOUT || source==UNASSIGNED_SYSTEM_ADDRESS || destination==UNASSIGNED_SYSTEM_ADDRESS) + return UDPFORWARDER_INVALID_PARAMETERS; + +#ifdef UDP_FORWARDER_EXECUTE_THREADED + ThreadOperation threadOperation; + threadOperation.source=source; + threadOperation.destination=destination; + threadOperation.timeoutOnNoDataMS=timeoutOnNoDataMS; + threadOperation.forceHostAddress=forceHostAddress; + threadOperation.socketFamily=socketFamily; + threadOperation.operation=ThreadOperation::TO_START_FORWARDING; + threadOperationIncomingMutex.Lock(); + threadOperationIncomingQueue.Push(threadOperation, _FILE_AND_LINE_ ); + threadOperationIncomingMutex.Unlock(); + + while (1) + { + RakSleep(0); + threadOperationOutgoingMutex.Lock(); + if (threadOperationOutgoingQueue.Size()!=0) + { + threadOperation=threadOperationOutgoingQueue.Pop(); + threadOperationOutgoingMutex.Unlock(); + if (forwardingPort) + *forwardingPort=threadOperation.forwardingPort; + if (forwardingSocket) + *forwardingSocket=threadOperation.forwardingSocket; + return threadOperation.result; + } + threadOperationOutgoingMutex.Unlock(); + + } +#else + return StartForwardingThreaded(source, destination, timeoutOnNoDataMS, forceHostAddress, socketFamily, srcToDestPort, destToSourcePort, srcToDestSocket, destToSourceSocket); +#endif + +} +UDPForwarderResult UDPForwarder::StartForwardingThreaded(SystemAddress source, SystemAddress destination, RakNet::TimeMS timeoutOnNoDataMS, const char *forceHostAddress, unsigned short socketFamily, + unsigned short *forwardingPort, SOCKET *forwardingSocket) +{ + SrcAndDest srcAndDest(source, destination); + + UDPForwarderResult result = AddForwardingEntry(srcAndDest, timeoutOnNoDataMS, forwardingPort, forceHostAddress, socketFamily); + + if (result!=UDPFORWARDER_SUCCESS) + return result; + + if (*forwardingSocket) + { + unsigned int idx; + bool objectExists; + idx = forwardList.GetIndexFromKey(srcAndDest, &objectExists); + RakAssert(objectExists); + *forwardingSocket=forwardList[idx]->socket; + } + + return UDPFORWARDER_SUCCESS; +} +void UDPForwarder::StopForwarding(SystemAddress source, SystemAddress destination) +{ +#ifdef UDP_FORWARDER_EXECUTE_THREADED + ThreadOperation threadOperation; + threadOperation.source=source; + threadOperation.destination=destination; + threadOperation.operation=ThreadOperation::TO_STOP_FORWARDING; + threadOperationIncomingMutex.Lock(); + threadOperationIncomingQueue.Push(threadOperation, _FILE_AND_LINE_ ); + threadOperationIncomingMutex.Unlock(); +#else + StopForwardingThreaded(source, destination); +#endif +} +void UDPForwarder::StopForwardingThreaded(SystemAddress source, SystemAddress destination) +{ + SrcAndDest srcAndDest(destination,source); + + bool objectExists; + unsigned int idx = forwardList.GetIndexFromKey(srcAndDest, &objectExists); + if (objectExists) + { + RakNet::OP_DELETE(forwardList[idx],_FILE_AND_LINE_); + forwardList.RemoveAtIndex(idx); + } +} +namespace RakNet { +#ifdef UDP_FORWARDER_EXECUTE_THREADED +RAK_THREAD_DECLARATION(UpdateUDPForwarder) +{ + + + + UDPForwarder * udpForwarder = ( UDPForwarder * ) arguments; + + + udpForwarder->threadRunning=true; + UDPForwarder::ThreadOperation threadOperation; + while (udpForwarder->isRunning) + { + udpForwarder->threadOperationIncomingMutex.Lock(); + while (udpForwarder->threadOperationIncomingQueue.Size()) + { + threadOperation=udpForwarder->threadOperationIncomingQueue.Pop(); + udpForwarder->threadOperationIncomingMutex.Unlock(); + if (threadOperation.operation==UDPForwarder::ThreadOperation::TO_START_FORWARDING) + { + threadOperation.result=udpForwarder->StartForwardingThreaded(threadOperation.source, threadOperation.destination, threadOperation.timeoutOnNoDataMS, + threadOperation.forceHostAddress, threadOperation.socketFamily, &threadOperation.forwardingPort, &threadOperation.forwardingSocket); + udpForwarder->threadOperationOutgoingMutex.Lock(); + udpForwarder->threadOperationOutgoingQueue.Push(threadOperation, _FILE_AND_LINE_ ); + udpForwarder->threadOperationOutgoingMutex.Unlock(); + } + else + { + udpForwarder->StopForwardingThreaded(threadOperation.source, threadOperation.destination); + } + + + udpForwarder->threadOperationIncomingMutex.Lock(); + } + udpForwarder->threadOperationIncomingMutex.Unlock(); + +#if RAKNET_SUPPORT_IPV6!=1 + udpForwarder->UpdateThreaded_Old(); +#else + udpForwarder->UpdateThreaded(); +#endif + + + // 12/1/2010 Do not change from 0 + // See http://www.jenkinssoftware.com/forum/index.php?topic=4033.0;topicseen + // Avoid 100% reported CPU usage + RakSleep(0); + } + udpForwarder->threadRunning=false; + + + + + return 0; + + +} +} // namespace RakNet +#endif + +#endif // #if _RAKNET_SUPPORT_FileOperations==1 diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/UDPForwarder.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/UDPForwarder.h new file mode 100644 index 0000000..2b22373 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/UDPForwarder.h @@ -0,0 +1,177 @@ +/// \file +/// \brief Forwards UDP datagrams. Independent of RakNet's protocol. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. + + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_UDPForwarder==1 + +#ifndef __UDP_FORWARDER_H +#define __UDP_FORWARDER_H + +#include "Export.h" +#include "RakNetTypes.h" +#include "SocketIncludes.h" +#include "UDPProxyCommon.h" +#include "SimpleMutex.h" +#include "RakString.h" +#include "RakThread.h" +#include "DS_Queue.h" +#include "DS_OrderedList.h" + +#define UDP_FORWARDER_EXECUTE_THREADED + +namespace RakNet +{ + +enum UDPForwarderResult +{ + UDPFORWARDER_FORWARDING_ALREADY_EXISTS, + UDPFORWARDER_NO_SOCKETS, + UDPFORWARDER_BIND_FAILED, + UDPFORWARDER_INVALID_PARAMETERS, + UDPFORWARDER_SUCCESS, + +}; + +/// \brief Forwards UDP datagrams. Independent of RakNet's protocol. +/// \ingroup NAT_PUNCHTHROUGH_GROUP +class RAK_DLL_EXPORT UDPForwarder +{ +public: + UDPForwarder(); + ~UDPForwarder(); + + /// Starts the system. + /// Required to call before StartForwarding + void Startup(void); + + /// Stops the system, and frees all sockets + void Shutdown(void); + + /// Call on a regular basis, unless using UDP_FORWARDER_EXECUTE_THREADED. + /// Will call select__() on all sockets and forward messages. + void Update(void); + + /// Sets the maximum number of forwarding entries allowed + /// Set according to your available bandwidth and the estimated average bandwidth per forwarded address. + /// A single connection requires 2 entries, as connections are bi-directional. + /// \param[in] maxEntries The maximum number of simultaneous forwarding entries. Defaults to 64 (32 connections) + void SetMaxForwardEntries(unsigned short maxEntries); + + /// \return The \a maxEntries parameter passed to SetMaxForwardEntries(), or the default if it was never called + int GetMaxForwardEntries(void) const; + + /// \note Each call to StartForwarding uses up two forwarding entries, since communications are bidirectional + /// \return How many entries have been used + int GetUsedForwardEntries(void) const; + + /// Forwards datagrams from source to destination, and vice-versa + /// Does nothing if this forward entry already exists via a previous call + /// \pre Call Startup() + /// \note RakNet's protocol will ensure a message is sent at least every 15 seconds, so if routing RakNet messages, it is a reasonable value for timeoutOnNoDataMS, plus an some extra seconds for latency + /// \param[in] source The source IP and port + /// \param[in] destination Where to forward to (and vice-versa) + /// \param[in] timeoutOnNoDataMS If no messages are forwarded for this many MS, then automatically remove this entry. Currently hardcoded to UDP_FORWARDER_MAXIMUM_TIMEOUT (else the call fails) + /// \param[in] forceHostAddress Force binding on a particular address. 0 to use any. + /// \param[in] socketFamily IP version: For IPV4, use AF_INET (default). For IPV6, use AF_INET6. To autoselect, use AF_UNSPEC. + short socketFamily; + /// \param[out] forwardingPort New opened port for forwarding + /// \param[out] forwardingSocket New opened socket for forwarding + /// \return UDPForwarderResult + UDPForwarderResult StartForwarding(SystemAddress source, SystemAddress destination, RakNet::TimeMS timeoutOnNoDataMS, const char *forceHostAddress, unsigned short socketFamily, + unsigned short *forwardingPort, SOCKET *forwardingSocket); + + /// No longer forward datagrams from source to destination + /// \param[in] source The source IP and port + /// \param[in] destination Where to forward to + void StopForwarding(SystemAddress source, SystemAddress destination); + + struct SrcAndDest + { + SrcAndDest() {} + SrcAndDest(SystemAddress sa1, SystemAddress sa2) + { + if (sa1 < sa2) + { + source=sa1; + dest=sa2; + } + else + { + source=sa2; + dest=sa1; + } + } + SystemAddress source; + SystemAddress dest; + }; + + struct ForwardEntry + { + ForwardEntry(); + ~ForwardEntry(); + SrcAndDest srcAndDest; + RakNet::TimeMS timeLastDatagramForwarded; + SOCKET socket; + RakNet::TimeMS timeoutOnNoDataMS; + bool updatedSourcePort, updatedDestPort; + short socketFamily; + }; + + +protected: + + static int SrcAndDestForwardEntryComp( const SrcAndDest &inputKey, ForwardEntry * const &cls ); + + + friend RAK_THREAD_DECLARATION(UpdateUDPForwarder); + struct ThreadOperation + { + enum { + TO_NONE, + TO_START_FORWARDING, + TO_STOP_FORWARDING, + } operation; + + SystemAddress source; + SystemAddress destination; + RakNet::TimeMS timeoutOnNoDataMS; + RakNet::RakString forceHostAddress; + unsigned short forwardingPort; + SOCKET forwardingSocket; + UDPForwarderResult result; + unsigned short socketFamily; + }; + SimpleMutex threadOperationIncomingMutex,threadOperationOutgoingMutex; + DataStructures::Queue threadOperationIncomingQueue; + DataStructures::Queue threadOperationOutgoingQueue; + +#if RAKNET_SUPPORT_IPV6==1 + void UpdateThreaded(void); +#endif + void UpdateThreaded_Old(void); + UDPForwarderResult StartForwardingThreaded(SystemAddress source, SystemAddress destination, RakNet::TimeMS timeoutOnNoDataMS, const char *forceHostAddress, unsigned short socketFamily, + unsigned short *forwardingPort, SOCKET *forwardingSocket); + void StopForwardingThreaded(SystemAddress source, SystemAddress destination); + + DataStructures::OrderedList forwardList; + unsigned short maxForwardEntries; + + UDPForwarderResult AddForwardingEntry(SrcAndDest srcAndDest, RakNet::TimeMS timeoutOnNoDataMS, unsigned short *port, const char *forceHostAddress, short socketFamily); + + + bool isRunning, threadRunning; + + + +}; + +} // End namespace + +#endif + +#endif // #if _RAKNET_SUPPORT_UDPForwarder==1 diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/UDPProxyClient.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/UDPProxyClient.cpp new file mode 100644 index 0000000..bbe5bb9 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/UDPProxyClient.cpp @@ -0,0 +1,301 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_UDPProxyClient==1 + +#include "UDPProxyClient.h" +#include "BitStream.h" +#include "UDPProxyCommon.h" +#include "RakPeerInterface.h" +#include "MessageIdentifiers.h" +#include "GetTime.h" + +using namespace RakNet; +static const int DEFAULT_UNRESPONSIVE_PING_TIME=1000; + +// bool operator<( const DataStructures::MLKeyRef &inputKey, const UDPProxyClient::ServerWithPing &cls ) {return inputKey.Get().serverAddress < cls.serverAddress;} +// bool operator>( const DataStructures::MLKeyRef &inputKey, const UDPProxyClient::ServerWithPing &cls ) {return inputKey.Get().serverAddress > cls.serverAddress;} +// bool operator==( const DataStructures::MLKeyRef &inputKey, const UDPProxyClient::ServerWithPing &cls ) {return inputKey.Get().serverAddress == cls.serverAddress;} + +STATIC_FACTORY_DEFINITIONS(UDPProxyClient,UDPProxyClient); + +UDPProxyClient::UDPProxyClient() +{ + resultHandler=0; +} +UDPProxyClient::~UDPProxyClient() +{ + Clear(); +} +void UDPProxyClient::SetResultHandler(UDPProxyClientResultHandler *rh) +{ + resultHandler=rh; +} +bool UDPProxyClient::RequestForwarding(SystemAddress proxyCoordinator, SystemAddress sourceAddress, RakNetGUID targetGuid, RakNet::TimeMS timeoutOnNoDataMS, RakNet::BitStream *serverSelectionBitstream) +{ + // Return false if not connected + ConnectionState cs = rakPeerInterface->GetConnectionState(proxyCoordinator); + if (cs!=IS_CONNECTED) + return false; + + // Pretty much a bug not to set the result handler, as otherwise you won't know if the operation succeeed or not + RakAssert(resultHandler!=0); + if (resultHandler==0) + return false; + + BitStream outgoingBs; + outgoingBs.Write((MessageID)ID_UDP_PROXY_GENERAL); + outgoingBs.Write((MessageID)ID_UDP_PROXY_FORWARDING_REQUEST_FROM_CLIENT_TO_COORDINATOR); + outgoingBs.Write(sourceAddress); + outgoingBs.Write(false); + outgoingBs.Write(targetGuid); + outgoingBs.Write(timeoutOnNoDataMS); + if (serverSelectionBitstream && serverSelectionBitstream->GetNumberOfBitsUsed()>0) + { + outgoingBs.Write(true); + outgoingBs.Write(serverSelectionBitstream); + } + else + { + outgoingBs.Write(false); + } + rakPeerInterface->Send(&outgoingBs, MEDIUM_PRIORITY, RELIABLE_ORDERED, 0, proxyCoordinator, false); + + return true; +} +bool UDPProxyClient::RequestForwarding(SystemAddress proxyCoordinator, SystemAddress sourceAddress, SystemAddress targetAddressAsSeenFromCoordinator, RakNet::TimeMS timeoutOnNoDataMS, RakNet::BitStream *serverSelectionBitstream) +{ + // Return false if not connected + ConnectionState cs = rakPeerInterface->GetConnectionState(proxyCoordinator); + if (cs!=IS_CONNECTED) + return false; + + // Pretty much a bug not to set the result handler, as otherwise you won't know if the operation succeeed or not + RakAssert(resultHandler!=0); + if (resultHandler==0) + return false; + + BitStream outgoingBs; + outgoingBs.Write((MessageID)ID_UDP_PROXY_GENERAL); + outgoingBs.Write((MessageID)ID_UDP_PROXY_FORWARDING_REQUEST_FROM_CLIENT_TO_COORDINATOR); + outgoingBs.Write(sourceAddress); + outgoingBs.Write(true); + outgoingBs.Write(targetAddressAsSeenFromCoordinator); + outgoingBs.Write(timeoutOnNoDataMS); + if (serverSelectionBitstream && serverSelectionBitstream->GetNumberOfBitsUsed()>0) + { + outgoingBs.Write(true); + outgoingBs.Write(serverSelectionBitstream); + } + else + { + outgoingBs.Write(false); + } + rakPeerInterface->Send(&outgoingBs, MEDIUM_PRIORITY, RELIABLE_ORDERED, 0, proxyCoordinator, false); + + return true; +} +void UDPProxyClient::Update(void) +{ + unsigned int idx1=0; + while (idx1 < pingServerGroups.Size()) + { + PingServerGroup *psg = pingServerGroups[idx1]; + + if (psg->serversToPing.Size() > 0 && + RakNet::GetTimeMS() > psg->startPingTime+DEFAULT_UNRESPONSIVE_PING_TIME) + { + // If they didn't reply within DEFAULT_UNRESPONSIVE_PING_TIME, just give up on them + psg->SendPingedServersToCoordinator(rakPeerInterface); + + RakNet::OP_DELETE(psg,_FILE_AND_LINE_); + pingServerGroups.RemoveAtIndex(idx1); + } + else + idx1++; + } + +} +PluginReceiveResult UDPProxyClient::OnReceive(Packet *packet) +{ + if (packet->data[0]==ID_UNCONNECTED_PONG) + { + unsigned int idx1, idx2; + PingServerGroup *psg; + for (idx1=0; idx1 < pingServerGroups.Size(); idx1++) + { + psg = pingServerGroups[idx1]; + for (idx2=0; idx2 < psg->serversToPing.Size(); idx2++) + { + if (psg->serversToPing[idx2].serverAddress==packet->systemAddress) + { + RakNet::BitStream bsIn(packet->data,packet->length,false); + bsIn.IgnoreBytes(sizeof(MessageID)); + RakNet::TimeMS sentTime; + bsIn.Read(sentTime); + RakNet::TimeMS curTime=RakNet::GetTimeMS(); + int ping; + if (curTime>sentTime) + ping=(int) (curTime-sentTime); + else + ping=0; + psg->serversToPing[idx2].ping=(unsigned short) ping; + + // If all servers to ping are now pinged, reply to coordinator + if (psg->AreAllServersPinged()) + { + psg->SendPingedServersToCoordinator(rakPeerInterface); + RakNet::OP_DELETE(psg,_FILE_AND_LINE_); + pingServerGroups.RemoveAtIndex(idx1); + } + + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + } + + } + } + else if (packet->data[0]==ID_UDP_PROXY_GENERAL && packet->length>1) + { + switch (packet->data[1]) + { + case ID_UDP_PROXY_PING_SERVERS_FROM_COORDINATOR_TO_CLIENT: + { + OnPingServers(packet); + } + break; + case ID_UDP_PROXY_FORWARDING_SUCCEEDED: + case ID_UDP_PROXY_ALL_SERVERS_BUSY: + case ID_UDP_PROXY_IN_PROGRESS: + case ID_UDP_PROXY_NO_SERVERS_ONLINE: + case ID_UDP_PROXY_RECIPIENT_GUID_NOT_CONNECTED_TO_COORDINATOR: + case ID_UDP_PROXY_FORWARDING_NOTIFICATION: + { + RakNetGUID targetGuid; + SystemAddress senderAddress, targetAddress; + RakNet::BitStream incomingBs(packet->data, packet->length, false); + incomingBs.IgnoreBytes(sizeof(MessageID)*2); + incomingBs.Read(senderAddress); + incomingBs.Read(targetAddress); + incomingBs.Read(targetGuid); + + switch (packet->data[1]) + { + case ID_UDP_PROXY_FORWARDING_NOTIFICATION: + case ID_UDP_PROXY_FORWARDING_SUCCEEDED: + { + unsigned short forwardingPort; + RakNet::RakString serverIP; + incomingBs.Read(serverIP); + incomingBs.Read(forwardingPort); + if (packet->data[1]==ID_UDP_PROXY_FORWARDING_SUCCEEDED) + { + if (resultHandler) + resultHandler->OnForwardingSuccess(serverIP.C_String(), forwardingPort, packet->systemAddress, senderAddress, targetAddress, targetGuid, this); + } + else + { + // Send a datagram to the proxy, so if we are behind a router, that router adds an entry to the routing table. + // Otherwise the router would block the incoming datagrams from source + // It doesn't matter if the message actually arrives as long as it goes through the router + rakPeerInterface->Ping(serverIP.C_String(), forwardingPort, false); + + if (resultHandler) + resultHandler->OnForwardingNotification(serverIP.C_String(), forwardingPort, packet->systemAddress, senderAddress, targetAddress, targetGuid, this); + } + } + break; + case ID_UDP_PROXY_ALL_SERVERS_BUSY: + if (resultHandler) + resultHandler->OnAllServersBusy(packet->systemAddress, senderAddress, targetAddress, targetGuid, this); + break; + case ID_UDP_PROXY_IN_PROGRESS: + if (resultHandler) + resultHandler->OnForwardingInProgress(packet->systemAddress, senderAddress, targetAddress, targetGuid, this); + break; + case ID_UDP_PROXY_NO_SERVERS_ONLINE: + if (resultHandler) + resultHandler->OnNoServersOnline(packet->systemAddress, senderAddress, targetAddress, targetGuid, this); + break; + case ID_UDP_PROXY_RECIPIENT_GUID_NOT_CONNECTED_TO_COORDINATOR: + { + if (resultHandler) + resultHandler->OnRecipientNotConnected(packet->systemAddress, senderAddress, targetAddress, targetGuid, this); + break; + } + } + + } + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + } + return RR_CONTINUE_PROCESSING; +} +void UDPProxyClient::OnRakPeerShutdown(void) +{ + Clear(); +} +void UDPProxyClient::OnPingServers(Packet *packet) +{ + RakNet::BitStream incomingBs(packet->data, packet->length, false); + incomingBs.IgnoreBytes(2); + + PingServerGroup *psg = RakNet::OP_NEW(_FILE_AND_LINE_); + + ServerWithPing swp; + incomingBs.Read(psg->sata.senderClientAddress); + incomingBs.Read(psg->sata.targetClientAddress); + psg->startPingTime=RakNet::GetTimeMS(); + psg->coordinatorAddressForPings=packet->systemAddress; + unsigned short serverListSize; + incomingBs.Read(serverListSize); + SystemAddress serverAddress; + unsigned short serverListIndex; + char ipStr[64]; + for (serverListIndex=0; serverListIndexserversToPing.Push(swp, _FILE_AND_LINE_ ); + swp.serverAddress.ToString(false,ipStr); + rakPeerInterface->Ping(ipStr,swp.serverAddress.GetPort(),false,0); + } + pingServerGroups.Push(psg,_FILE_AND_LINE_); +} + +bool UDPProxyClient::PingServerGroup::AreAllServersPinged(void) const +{ + unsigned int serversToPingIndex; + for (serversToPingIndex=0; serversToPingIndex < serversToPing.Size(); serversToPingIndex++) + { + if (serversToPing[serversToPingIndex].ping==DEFAULT_UNRESPONSIVE_PING_TIME) + return false; + } + return true; +} + +void UDPProxyClient::PingServerGroup::SendPingedServersToCoordinator(RakPeerInterface *rakPeerInterface) +{ + BitStream outgoingBs; + outgoingBs.Write((MessageID)ID_UDP_PROXY_GENERAL); + outgoingBs.Write((MessageID)ID_UDP_PROXY_PING_SERVERS_REPLY_FROM_CLIENT_TO_COORDINATOR); + outgoingBs.Write(sata.senderClientAddress); + outgoingBs.Write(sata.targetClientAddress); + unsigned short serversToPingSize = (unsigned short) serversToPing.Size(); + outgoingBs.Write(serversToPingSize); + unsigned int serversToPingIndex; + for (serversToPingIndex=0; serversToPingIndex < serversToPingSize; serversToPingIndex++) + { + outgoingBs.Write(serversToPing[serversToPingIndex].serverAddress); + outgoingBs.Write(serversToPing[serversToPingIndex].ping); + } + rakPeerInterface->Send(&outgoingBs, MEDIUM_PRIORITY, RELIABLE_ORDERED, 0, coordinatorAddressForPings, false); +} +void UDPProxyClient::Clear(void) +{ + for (unsigned int i=0; i < pingServerGroups.Size(); i++) + RakNet::OP_DELETE(pingServerGroups[i],_FILE_AND_LINE_); + pingServerGroups.Clear(false, _FILE_AND_LINE_); +} + + +#endif // _RAKNET_SUPPORT_* + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/UDPProxyClient.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/UDPProxyClient.h new file mode 100644 index 0000000..eb3fb68 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/UDPProxyClient.h @@ -0,0 +1,178 @@ +/// \file +/// \brief A RakNet plugin performing networking to communicate with UDPProxyCoordinator. Ultimately used to tell UDPProxyServer to forward UDP packets. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. +/// Creative Commons Licensees are subject to the +/// license found at +/// http://creativecommons.org/licenses/by-nc/2.5/ +/// Single application licensees are subject to the license found at +/// http://www.jenkinssoftware.com/SingleApplicationLicense.html +/// Custom license users are subject to the terms therein. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_UDPProxyClient==1 + +#ifndef __UDP_PROXY_CLIENT_H +#define __UDP_PROXY_CLIENT_H + +#include "Export.h" +#include "RakNetTypes.h" +#include "PluginInterface2.h" +#include "DS_List.h" + +/// \defgroup UDP_PROXY_GROUP UDPProxy +/// \brief Forwards UDP datagrams from one system to another. Protocol independent +/// \details Used when NatPunchthroughClient fails +/// \ingroup PLUGINS_GROUP + +namespace RakNet +{ +class UDPProxyClient; + +/// Callback to handle results of calling UDPProxyClient::RequestForwarding() +/// \ingroup UDP_PROXY_GROUP +struct UDPProxyClientResultHandler +{ + UDPProxyClientResultHandler() {} + virtual ~UDPProxyClientResultHandler() {} + + /// Called when our forwarding request was completed. We can now connect to \a targetAddress by using \a proxyAddress instead + /// \param[out] proxyIPAddress IP Address of the proxy server, which will forward messages to targetAddress + /// \param[out] proxyPort Remote port to use on the proxy server, which will forward messages to targetAddress + /// \param[out] proxyCoordinator \a proxyCoordinator parameter originally passed to UDPProxyClient::RequestForwarding + /// \param[out] sourceAddress \a sourceAddress parameter passed to UDPProxyClient::RequestForwarding. If it was UNASSIGNED_SYSTEM_ADDRESS, it is now our external IP address. + /// \param[out] targetAddress \a targetAddress parameter originally passed to UDPProxyClient::RequestForwarding + /// \param[out] targetGuid \a targetGuid parameter originally passed to UDPProxyClient::RequestForwarding + /// \param[out] proxyClient The plugin that is calling this callback + virtual void OnForwardingSuccess(const char *proxyIPAddress, unsigned short proxyPort, + SystemAddress proxyCoordinator, SystemAddress sourceAddress, SystemAddress targetAddress, RakNetGUID targetGuid, RakNet::UDPProxyClient *proxyClientPlugin)=0; + + /// Called when another system has setup forwarding, with our system as the target address. + /// Plugin automatically sends a datagram to proxyIPAddress before this callback, to open our router if necessary. + /// \param[out] proxyIPAddress IP Address of the proxy server, which will forward messages to targetAddress + /// \param[out] proxyPort Remote port to use on the proxy server, which will forward messages to targetAddress + /// \param[out] proxyCoordinator \a proxyCoordinator parameter originally passed to UDPProxyClient::RequestForwarding + /// \param[out] sourceAddress \a sourceAddress parameter passed to UDPProxyClient::RequestForwarding. This is originating source IP address of the remote system that will be sending to us. + /// \param[out] targetAddress \a targetAddress parameter originally passed to UDPProxyClient::RequestForwarding. This is our external IP address. + /// \param[out] targetGuid \a targetGuid parameter originally passed to UDPProxyClient::RequestForwarding + /// \param[out] proxyClient The plugin that is calling this callback + virtual void OnForwardingNotification(const char *proxyIPAddress, unsigned short proxyPort, + SystemAddress proxyCoordinator, SystemAddress sourceAddress, SystemAddress targetAddress, RakNetGUID targetGuid, RakNet::UDPProxyClient *proxyClientPlugin)=0; + + /// Called when our forwarding request failed, because no UDPProxyServers are connected to UDPProxyCoordinator + /// \param[out] proxyCoordinator \a proxyCoordinator parameter originally passed to UDPProxyClient::RequestForwarding + /// \param[out] sourceAddress \a sourceAddress parameter passed to UDPProxyClient::RequestForwarding. If it was UNASSIGNED_SYSTEM_ADDRESS, it is now our external IP address. + /// \param[out] targetAddress \a targetAddress parameter originally passed to UDPProxyClient::RequestForwarding + /// \param[out] targetGuid \a targetGuid parameter originally passed to UDPProxyClient::RequestForwarding + /// \param[out] proxyClient The plugin that is calling this callback + virtual void OnNoServersOnline(SystemAddress proxyCoordinator, SystemAddress sourceAddress, SystemAddress targetAddress, RakNetGUID targetGuid, RakNet::UDPProxyClient *proxyClientPlugin)=0; + + /// Called when our forwarding request failed, because no UDPProxyServers are connected to UDPProxyCoordinator + /// \param[out] proxyCoordinator \a proxyCoordinator parameter originally passed to UDPProxyClient::RequestForwarding + /// \param[out] sourceAddress \a sourceAddress parameter passed to UDPProxyClient::RequestForwarding. If it was UNASSIGNED_SYSTEM_ADDRESS, it is now our external IP address. + /// \param[out] targetAddress \a targetAddress parameter originally passed to UDPProxyClient::RequestForwarding + /// \param[out] targetGuid \a targetGuid parameter originally passed to UDPProxyClient::RequestForwarding + /// \param[out] proxyClient The plugin that is calling this callback + virtual void OnRecipientNotConnected(SystemAddress proxyCoordinator, SystemAddress sourceAddress, SystemAddress targetAddress, RakNetGUID targetGuid, RakNet::UDPProxyClient *proxyClientPlugin)=0; + + /// Called when our forwarding request failed, because all UDPProxyServers that are connected to UDPProxyCoordinator are at their capacity + /// Either add more servers, or increase capacity via UDPForwarder::SetMaxForwardEntries() + /// \param[out] proxyCoordinator \a proxyCoordinator parameter originally passed to UDPProxyClient::RequestForwarding + /// \param[out] sourceAddress \a sourceAddress parameter passed to UDPProxyClient::RequestForwarding. If it was UNASSIGNED_SYSTEM_ADDRESS, it is now our external IP address. + /// \param[out] targetAddress \a targetAddress parameter originally passed to UDPProxyClient::RequestForwarding + /// \param[out] targetGuid \a targetGuid parameter originally passed to UDPProxyClient::RequestForwarding + /// \param[out] proxyClient The plugin that is calling this callback + virtual void OnAllServersBusy(SystemAddress proxyCoordinator, SystemAddress sourceAddress, SystemAddress targetAddress, RakNetGUID targetGuid, RakNet::UDPProxyClient *proxyClientPlugin)=0; + + /// Called when our forwarding request is already in progress on the \a proxyCoordinator. + /// This can be ignored, but indicates an unneeded second request + /// \param[out] proxyCoordinator \a proxyCoordinator parameter originally passed to UDPProxyClient::RequestForwarding + /// \param[out] sourceAddress \a sourceAddress parameter passed to UDPProxyClient::RequestForwarding. If it was UNASSIGNED_SYSTEM_ADDRESS, it is now our external IP address. + /// \param[out] targetAddress \a targetAddress parameter originally passed to UDPProxyClient::RequestForwarding + /// \param[out] targetGuid \a targetGuid parameter originally passed to UDPProxyClient::RequestForwarding + /// \param[out] proxyClient The plugin that is calling this callback + virtual void OnForwardingInProgress(SystemAddress proxyCoordinator, SystemAddress sourceAddress, SystemAddress targetAddress, RakNetGUID targetGuid, RakNet::UDPProxyClient *proxyClientPlugin)=0; +}; + + +/// \brief Communicates with UDPProxyCoordinator, in order to find a UDPProxyServer to forward our datagrams. +/// \details When NAT Punchthrough fails, it is possible to use a non-NAT system to forward messages from us to the recipient, and vice-versa.
    +/// The class to forward messages is UDPForwarder, and it is triggered over the network via the UDPProxyServer plugin.
    +/// The UDPProxyClient connects to UDPProxyCoordinator to get a list of servers running UDPProxyServer, and the coordinator will relay our forwarding request +/// \sa NatPunchthroughServer +/// \sa NatPunchthroughClient +/// \ingroup UDP_PROXY_GROUP +class RAK_DLL_EXPORT UDPProxyClient : public PluginInterface2 +{ +public: + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(UDPProxyClient) + + UDPProxyClient(); + ~UDPProxyClient(); + + /// Receives the results of calling RequestForwarding() + /// Set before calling RequestForwarding or you won't know what happened + /// \param[in] resultHandler + void SetResultHandler(UDPProxyClientResultHandler *rh); + + /// Sends a request to proxyCoordinator to find a server and have that server setup UDPForwarder::StartForwarding() on our address to \a targetAddressAsSeenFromCoordinator + /// The forwarded datagrams can be from any UDP source, not just RakNet + /// \pre Must be connected to \a proxyCoordinator + /// \pre Systems running UDPProxyServer must be connected to \a proxyCoordinator and logged in via UDPProxyCoordinator::LoginServer() or UDPProxyServer::LoginToCoordinator() + /// \note May still fail, if all proxy servers have no open connections. + /// \note RakNet's protocol will ensure a message is sent at least every 5 seconds, so if routing RakNet messages, it is a reasonable value for timeoutOnNoDataMS, plus an extra few seconds for latency. + /// \param[in] proxyCoordinator System we are connected to that is running the UDPProxyCoordinator plugin + /// \param[in] sourceAddress External IP address of the system we want to forward messages from. This does not have to be our own system. To specify our own system, you can pass UNASSIGNED_SYSTEM_ADDRESS which the coordinator will treat as our external IP address. + /// \param[in] targetAddressAsSeenFromCoordinator External IP address of the system we want to forward messages to. If this system is connected to UDPProxyCoordinator at this address using RakNet, that system will ping the server and thus open the router for incoming communication. In any other case, you are responsible for doing your own network communication to have that system ping the server. See also targetGuid in the other version of RequestForwarding(), to avoid the need to know the IP address to the coordinator of the destination. + /// \param[in] timeoutOnNoData If no data is sent by the forwarded systems, how long before removing the forward entry from UDPForwarder? UDP_FORWARDER_MAXIMUM_TIMEOUT is the maximum value. Recommended high enough to not drop valid connections, but low enough to not waste forwarding slots on the proxy server. + /// \param[in] serverSelectionBitstream If you want to send data to UDPProxyCoordinator::GetBestServer(), write it here + /// \return true if the request was sent, false if we are not connected to proxyCoordinator + bool RequestForwarding(SystemAddress proxyCoordinator, SystemAddress sourceAddress, SystemAddress targetAddressAsSeenFromCoordinator, RakNet::TimeMS timeoutOnNoDataMS, RakNet::BitStream *serverSelectionBitstream=0); + + /// Same as above, but specify the target with a GUID, in case you don't know what its address is to the coordinator + /// If requesting forwarding to a RakNet enabled system, then it is easier to use targetGuid instead of targetAddressAsSeenFromCoordinator + bool RequestForwarding(SystemAddress proxyCoordinator, SystemAddress sourceAddress, RakNetGUID targetGuid, RakNet::TimeMS timeoutOnNoDataMS, RakNet::BitStream *serverSelectionBitstream=0); + + /// \internal + virtual void Update(void); + virtual PluginReceiveResult OnReceive(Packet *packet); + virtual void OnRakPeerShutdown(void); + + struct ServerWithPing + { + unsigned short ping; + SystemAddress serverAddress; + }; + struct SenderAndTargetAddress + { + SystemAddress senderClientAddress; + SystemAddress targetClientAddress; + }; + struct PingServerGroup + { + SenderAndTargetAddress sata; + RakNet::TimeMS startPingTime; + SystemAddress coordinatorAddressForPings; + //DataStructures::Multilist serversToPing; + DataStructures::List serversToPing; + bool AreAllServersPinged(void) const; + void SendPingedServersToCoordinator(RakPeerInterface *rakPeerInterface); + }; + //DataStructures::Multilist pingServerGroups; + DataStructures::List pingServerGroups; +protected: + + void OnPingServers(Packet *packet); + void Clear(void); + UDPProxyClientResultHandler *resultHandler; + +}; + +} // End namespace + +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/UDPProxyCommon.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/UDPProxyCommon.h new file mode 100644 index 0000000..14593e3 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/UDPProxyCommon.h @@ -0,0 +1,57 @@ +#ifndef __UDP_PROXY_COMMON_H +#define __UDP_PROXY_COMMON_H + +// System flow: +/* +UDPProxyClient: End user +UDPProxyServer: open server, to route messages from end users that can't connect to each other using UDPForwarder class. +UDPProxyCoordinator: Server somewhere, connected to by RakNet, to maintain a list of UDPProxyServer + +UDPProxyServer + On startup, log into UDPProxyCoordinator and register self + +UDPProxyClient + Wish to open route to X + Send message to UDPProxyCoordinator containing X, desired timeout + Wait for success or failure + +UDPProxyCoordinator: +* Get openRouteRequest + If no servers registered, return failure + Add entry to memory + chooseBestUDPProxyServer() (overridable, chooses at random by default) + Query this server to StartForwarding(). Return success or failure + If failure, choose another server from the remaining list. If none remaining, return failure. Else return success. +* Disconnect: + If disconnected system is pending client on openRouteRequest, delete that request + If disconnected system is UDPProxyServer, remove from list. For each pending client for this server, choose from remaining servers. +* Login: + Add to UDPProxyServer list, validating password if set +*/ + +// Stored in the second byte after ID_UDP_PROXY_GENERAL +// Otherwise MessageIdentifiers.h is too cluttered and will hit the limit on enumerations in a single byte +enum UDPProxyMessages +{ + ID_UDP_PROXY_FORWARDING_SUCCEEDED, + ID_UDP_PROXY_FORWARDING_NOTIFICATION, + ID_UDP_PROXY_NO_SERVERS_ONLINE, + ID_UDP_PROXY_RECIPIENT_GUID_NOT_CONNECTED_TO_COORDINATOR, + ID_UDP_PROXY_ALL_SERVERS_BUSY, + ID_UDP_PROXY_IN_PROGRESS, + ID_UDP_PROXY_FORWARDING_REQUEST_FROM_CLIENT_TO_COORDINATOR, + ID_UDP_PROXY_PING_SERVERS_FROM_COORDINATOR_TO_CLIENT, + ID_UDP_PROXY_PING_SERVERS_REPLY_FROM_CLIENT_TO_COORDINATOR, + ID_UDP_PROXY_FORWARDING_REQUEST_FROM_COORDINATOR_TO_SERVER, + ID_UDP_PROXY_FORWARDING_REPLY_FROM_SERVER_TO_COORDINATOR, + ID_UDP_PROXY_LOGIN_REQUEST_FROM_SERVER_TO_COORDINATOR, + ID_UDP_PROXY_LOGIN_SUCCESS_FROM_COORDINATOR_TO_SERVER, + ID_UDP_PROXY_ALREADY_LOGGED_IN_FROM_COORDINATOR_TO_SERVER, + ID_UDP_PROXY_NO_PASSWORD_SET_FROM_COORDINATOR_TO_SERVER, + ID_UDP_PROXY_WRONG_PASSWORD_FROM_COORDINATOR_TO_SERVER +}; + + +#define UDP_FORWARDER_MAXIMUM_TIMEOUT (60000 * 10) + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/UDPProxyCoordinator.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/UDPProxyCoordinator.cpp new file mode 100644 index 0000000..f2ff1a0 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/UDPProxyCoordinator.cpp @@ -0,0 +1,543 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_UDPProxyCoordinator==1 && _RAKNET_SUPPORT_UDPForwarder==1 + +#include "UDPProxyCoordinator.h" +#include "BitStream.h" +#include "UDPProxyCommon.h" +#include "RakPeerInterface.h" +#include "MessageIdentifiers.h" +#include "Rand.h" +#include "GetTime.h" +#include "UDPForwarder.h" + +// Larger than the client version +static const int DEFAULT_CLIENT_UNRESPONSIVE_PING_TIME=2000; +static const int DEFAULT_UNRESPONSIVE_PING_TIME=DEFAULT_CLIENT_UNRESPONSIVE_PING_TIME+1000; + +using namespace RakNet; + +// bool operator<( const DataStructures::MLKeyRef &inputKey, const UDPProxyCoordinator::ServerWithPing &cls ) {return inputKey.Get() < cls.ping;} +// bool operator>( const DataStructures::MLKeyRef &inputKey, const UDPProxyCoordinator::ServerWithPing &cls ) {return inputKey.Get() > cls.ping;} +// bool operator==( const DataStructures::MLKeyRef &inputKey, const UDPProxyCoordinator::ServerWithPing &cls ) {return inputKey.Get() == cls.ping;} + +int UDPProxyCoordinator::ServerWithPingComp( const unsigned short &key, const UDPProxyCoordinator::ServerWithPing &data ) +{ + if (key < data.ping) + return -1; + if (key > data.ping) + return 1; + return 0; +} + +int UDPProxyCoordinator::ForwardingRequestComp( const SenderAndTargetAddress &key, ForwardingRequest* const &data) +{ + if (key.senderClientAddress < data->sata.senderClientAddress ) + return -1; + if (key.senderClientAddress > data->sata.senderClientAddress ) + return -1; + if (key.targetClientAddress < data->sata.targetClientAddress ) + return -1; + if (key.targetClientAddress > data->sata.targetClientAddress ) + return 1; + return 0; +} +// +// bool operator<( const DataStructures::MLKeyRef &inputKey, const UDPProxyCoordinator::ForwardingRequest *cls ) +// { +// return inputKey.Get().senderClientAddress < cls->sata.senderClientAddress || +// (inputKey.Get().senderClientAddress == cls->sata.senderClientAddress && inputKey.Get().targetClientAddress < cls->sata.targetClientAddress); +// } +// bool operator>( const DataStructures::MLKeyRef &inputKey, const UDPProxyCoordinator::ForwardingRequest *cls ) +// { +// return inputKey.Get().senderClientAddress > cls->sata.senderClientAddress || +// (inputKey.Get().senderClientAddress == cls->sata.senderClientAddress && inputKey.Get().targetClientAddress > cls->sata.targetClientAddress); +// } +// bool operator==( const DataStructures::MLKeyRef &inputKey, const UDPProxyCoordinator::ForwardingRequest *cls ) +// { +// return inputKey.Get().senderClientAddress == cls->sata.senderClientAddress && inputKey.Get().targetClientAddress == cls->sata.targetClientAddress; +// } + +STATIC_FACTORY_DEFINITIONS(UDPProxyCoordinator,UDPProxyCoordinator); + +UDPProxyCoordinator::UDPProxyCoordinator() +{ + +} +UDPProxyCoordinator::~UDPProxyCoordinator() +{ + Clear(); +} +void UDPProxyCoordinator::SetRemoteLoginPassword(RakNet::RakString password) +{ + remoteLoginPassword=password; +} +void UDPProxyCoordinator::Update(void) +{ + unsigned int idx; + RakNet::TimeMS curTime = RakNet::GetTimeMS(); + ForwardingRequest *fw; + idx=0; + while (idx < forwardingRequestList.Size()) + { + fw=forwardingRequestList[idx]; + if (fw->timeRequestedPings!=0 && + curTime > fw->timeRequestedPings + DEFAULT_UNRESPONSIVE_PING_TIME) + { + fw->OrderRemainingServersToTry(); + fw->timeRequestedPings=0; + TryNextServer(fw->sata, fw); + idx++; + } + else if (fw->timeoutAfterSuccess!=0 && + curTime > fw->timeoutAfterSuccess) + { + // Forwarding request succeeded, we waited a bit to prevent duplicates. Can forget about the entry now. + RakNet::OP_DELETE(fw,_FILE_AND_LINE_); + forwardingRequestList.RemoveAtIndex(idx); + } + else + idx++; + } +} +PluginReceiveResult UDPProxyCoordinator::OnReceive(Packet *packet) +{ + if (packet->data[0]==ID_UDP_PROXY_GENERAL && packet->length>1) + { + switch (packet->data[1]) + { + case ID_UDP_PROXY_FORWARDING_REQUEST_FROM_CLIENT_TO_COORDINATOR: + OnForwardingRequestFromClientToCoordinator(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + case ID_UDP_PROXY_LOGIN_REQUEST_FROM_SERVER_TO_COORDINATOR: + OnLoginRequestFromServerToCoordinator(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + case ID_UDP_PROXY_FORWARDING_REPLY_FROM_SERVER_TO_COORDINATOR: + OnForwardingReplyFromServerToCoordinator(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + case ID_UDP_PROXY_PING_SERVERS_REPLY_FROM_CLIENT_TO_COORDINATOR: + OnPingServersReplyFromClientToCoordinator(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + } + return RR_CONTINUE_PROCESSING; +} +void UDPProxyCoordinator::OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ) +{ + (void) lostConnectionReason; + (void) rakNetGUID; + + unsigned int idx, idx2; + + idx=0; + while (idx < forwardingRequestList.Size()) + { + if (forwardingRequestList[idx]->requestingAddress==systemAddress) + { + // Guy disconnected before the attempt completed + RakNet::OP_DELETE(forwardingRequestList[idx], _FILE_AND_LINE_); + forwardingRequestList.RemoveAtIndex(idx ); + } + else + idx++; + } + + idx = serverList.GetIndexOf(systemAddress); + if (idx!=(unsigned int)-1) + { + ForwardingRequest *fw; + // For each pending client for this server, choose from remaining servers. + for (idx2=0; idx2 < forwardingRequestList.Size(); idx2++) + { + fw = forwardingRequestList[idx2]; + if (fw->currentlyAttemptedServerAddress==systemAddress) + { + // Try the next server + TryNextServer(fw->sata, fw); + } + } + + // Remove dead server + serverList.RemoveAtIndexFast(idx); + } +} +void UDPProxyCoordinator::OnForwardingRequestFromClientToCoordinator(Packet *packet) +{ + RakNet::BitStream incomingBs(packet->data, packet->length, false); + incomingBs.IgnoreBytes(2); + SystemAddress sourceAddress; + incomingBs.Read(sourceAddress); + if (sourceAddress==UNASSIGNED_SYSTEM_ADDRESS) + sourceAddress=packet->systemAddress; + SystemAddress targetAddress; + RakNetGUID targetGuid; + bool usesAddress=false; + incomingBs.Read(usesAddress); + if (usesAddress) + { + incomingBs.Read(targetAddress); + targetGuid=rakPeerInterface->GetGuidFromSystemAddress(targetAddress); + } + else + { + incomingBs.Read(targetGuid); + targetAddress=rakPeerInterface->GetSystemAddressFromGuid(targetGuid); + } + ForwardingRequest *fw = RakNet::OP_NEW(_FILE_AND_LINE_); + fw->timeoutAfterSuccess=0; + incomingBs.Read(fw->timeoutOnNoDataMS); + bool hasServerSelectionBitstream=false; + incomingBs.Read(hasServerSelectionBitstream); + if (hasServerSelectionBitstream) + incomingBs.Read(&(fw->serverSelectionBitstream)); + + RakNet::BitStream outgoingBs; + SenderAndTargetAddress sata; + sata.senderClientAddress=sourceAddress; + sata.targetClientAddress=targetAddress; + sata.targetClientGuid=targetGuid; + sata.senderClientGuid=rakPeerInterface->GetGuidFromSystemAddress(sourceAddress); + SenderAndTargetAddress sataReversed; + sataReversed.senderClientAddress=targetAddress; + sataReversed.targetClientAddress=sourceAddress; + sataReversed.senderClientGuid=sata.targetClientGuid; + sataReversed.targetClientGuid=sata.senderClientGuid; + + unsigned int insertionIndex; + bool objectExists1, objectExists2; + insertionIndex=forwardingRequestList.GetIndexFromKey(sata, &objectExists1); + forwardingRequestList.GetIndexFromKey(sataReversed, &objectExists2); + + if (objectExists1 || objectExists2) + { + outgoingBs.Write((MessageID)ID_UDP_PROXY_GENERAL); + outgoingBs.Write((MessageID)ID_UDP_PROXY_IN_PROGRESS); + outgoingBs.Write(sata.senderClientAddress); + outgoingBs.Write(targetAddress); + outgoingBs.Write(targetGuid); + rakPeerInterface->Send(&outgoingBs, MEDIUM_PRIORITY, RELIABLE_ORDERED, 0, packet->systemAddress, false); + RakNet::OP_DELETE(fw, _FILE_AND_LINE_); + return; + } + + if (serverList.Size()==0) + { + outgoingBs.Write((MessageID)ID_UDP_PROXY_GENERAL); + outgoingBs.Write((MessageID)ID_UDP_PROXY_NO_SERVERS_ONLINE); + outgoingBs.Write(sata.senderClientAddress); + outgoingBs.Write(targetAddress); + outgoingBs.Write(targetGuid); + rakPeerInterface->Send(&outgoingBs, MEDIUM_PRIORITY, RELIABLE_ORDERED, 0, packet->systemAddress, false); + RakNet::OP_DELETE(fw, _FILE_AND_LINE_); + return; + } + + if (rakPeerInterface->GetConnectionState(targetAddress)!=IS_CONNECTED && usesAddress==false) + { + outgoingBs.Write((MessageID)ID_UDP_PROXY_GENERAL); + outgoingBs.Write((MessageID)ID_UDP_PROXY_RECIPIENT_GUID_NOT_CONNECTED_TO_COORDINATOR); + outgoingBs.Write(sata.senderClientAddress); + outgoingBs.Write(targetAddress); + outgoingBs.Write(targetGuid); + rakPeerInterface->Send(&outgoingBs, MEDIUM_PRIORITY, RELIABLE_ORDERED, 0, packet->systemAddress, false); + RakNet::OP_DELETE(fw, _FILE_AND_LINE_); + return; + } + + fw->sata=sata; + fw->requestingAddress=packet->systemAddress; + + if (serverList.Size()>1) + { + outgoingBs.Write((MessageID)ID_UDP_PROXY_GENERAL); + outgoingBs.Write((MessageID)ID_UDP_PROXY_PING_SERVERS_FROM_COORDINATOR_TO_CLIENT); + outgoingBs.Write(sourceAddress); + outgoingBs.Write(targetAddress); + outgoingBs.Write(targetGuid); + unsigned short serverListSize = (unsigned short) serverList.Size(); + outgoingBs.Write(serverListSize); + unsigned int idx; + for (idx=0; idx < serverList.Size(); idx++) + outgoingBs.Write(serverList[idx]); + rakPeerInterface->Send(&outgoingBs, MEDIUM_PRIORITY, RELIABLE_ORDERED, 0, sourceAddress, false); + rakPeerInterface->Send(&outgoingBs, MEDIUM_PRIORITY, RELIABLE_ORDERED, 0, targetAddress, false); + fw->timeRequestedPings=RakNet::GetTimeMS(); + unsigned int copyIndex; + for (copyIndex=0; copyIndex < serverList.Size(); copyIndex++) + fw->remainingServersToTry.Push(serverList[copyIndex], _FILE_AND_LINE_ ); + forwardingRequestList.InsertAtIndex(fw, insertionIndex, _FILE_AND_LINE_ ); + } + else + { + fw->timeRequestedPings=0; + fw->currentlyAttemptedServerAddress=serverList[0]; + forwardingRequestList.InsertAtIndex(fw, insertionIndex, _FILE_AND_LINE_ ); + SendForwardingRequest(sourceAddress, targetAddress, fw->currentlyAttemptedServerAddress, fw->timeoutOnNoDataMS); + } +} + +void UDPProxyCoordinator::SendForwardingRequest(SystemAddress sourceAddress, SystemAddress targetAddress, SystemAddress serverAddress, RakNet::TimeMS timeoutOnNoDataMS) +{ + RakNet::BitStream outgoingBs; + // Send request to desired server + outgoingBs.Write((MessageID)ID_UDP_PROXY_GENERAL); + outgoingBs.Write((MessageID)ID_UDP_PROXY_FORWARDING_REQUEST_FROM_COORDINATOR_TO_SERVER); + outgoingBs.Write(sourceAddress); + outgoingBs.Write(targetAddress); + outgoingBs.Write(timeoutOnNoDataMS); + rakPeerInterface->Send(&outgoingBs, MEDIUM_PRIORITY, RELIABLE_ORDERED, 0, serverAddress, false); +} +void UDPProxyCoordinator::OnLoginRequestFromServerToCoordinator(Packet *packet) +{ + RakNet::BitStream incomingBs(packet->data, packet->length, false); + incomingBs.IgnoreBytes(2); + RakNet::RakString password; + incomingBs.Read(password); + RakNet::BitStream outgoingBs; + + if (remoteLoginPassword.IsEmpty()) + { + outgoingBs.Write((MessageID)ID_UDP_PROXY_GENERAL); + outgoingBs.Write((MessageID)ID_UDP_PROXY_NO_PASSWORD_SET_FROM_COORDINATOR_TO_SERVER); + outgoingBs.Write(password); + rakPeerInterface->Send(&outgoingBs, MEDIUM_PRIORITY, RELIABLE_ORDERED, 0, packet->systemAddress, false); + return; + } + + if (remoteLoginPassword!=password) + { + outgoingBs.Write((MessageID)ID_UDP_PROXY_GENERAL); + outgoingBs.Write((MessageID)ID_UDP_PROXY_WRONG_PASSWORD_FROM_COORDINATOR_TO_SERVER); + outgoingBs.Write(password); + rakPeerInterface->Send(&outgoingBs, MEDIUM_PRIORITY, RELIABLE_ORDERED, 0, packet->systemAddress, false); + return; + } + + unsigned int insertionIndex; + insertionIndex=serverList.GetIndexOf(packet->systemAddress); + if (insertionIndex!=(unsigned int)-1) + { + outgoingBs.Write((MessageID)ID_UDP_PROXY_GENERAL); + outgoingBs.Write((MessageID)ID_UDP_PROXY_ALREADY_LOGGED_IN_FROM_COORDINATOR_TO_SERVER); + outgoingBs.Write(password); + rakPeerInterface->Send(&outgoingBs, MEDIUM_PRIORITY, RELIABLE_ORDERED, 0, packet->systemAddress, false); + return; + } + serverList.Push(packet->systemAddress, _FILE_AND_LINE_ ); + outgoingBs.Write((MessageID)ID_UDP_PROXY_GENERAL); + outgoingBs.Write((MessageID)ID_UDP_PROXY_LOGIN_SUCCESS_FROM_COORDINATOR_TO_SERVER); + outgoingBs.Write(password); + rakPeerInterface->Send(&outgoingBs, MEDIUM_PRIORITY, RELIABLE_ORDERED, 0, packet->systemAddress, false); +} +void UDPProxyCoordinator::OnForwardingReplyFromServerToCoordinator(Packet *packet) +{ + RakNet::BitStream incomingBs(packet->data, packet->length, false); + incomingBs.IgnoreBytes(2); + SenderAndTargetAddress sata; + incomingBs.Read(sata.senderClientAddress); + incomingBs.Read(sata.targetClientAddress); + bool objectExists; + unsigned int index = forwardingRequestList.GetIndexFromKey(sata, &objectExists); + if (objectExists==false) + { + // The guy disconnected before the request finished + return; + } + ForwardingRequest *fw = forwardingRequestList[index]; + sata.senderClientGuid = fw->sata.senderClientGuid; + sata.targetClientGuid = fw->sata.targetClientGuid; + + UDPForwarderResult success; + unsigned char c; + incomingBs.Read(c); + success=(UDPForwarderResult)c; + + RakNet::BitStream outgoingBs; + if (success==UDPFORWARDER_SUCCESS) + { + char serverIP[64]; + packet->systemAddress.ToString(false,serverIP); + unsigned short forwardingPort; + incomingBs.Read(forwardingPort); + + outgoingBs.Write((MessageID)ID_UDP_PROXY_GENERAL); + outgoingBs.Write((MessageID)ID_UDP_PROXY_FORWARDING_SUCCEEDED); + outgoingBs.Write(sata.senderClientAddress); + outgoingBs.Write(sata.targetClientAddress); + outgoingBs.Write(sata.targetClientGuid); + outgoingBs.Write(RakNet::RakString(serverIP)); + outgoingBs.Write(forwardingPort); + rakPeerInterface->Send(&outgoingBs, MEDIUM_PRIORITY, RELIABLE_ORDERED, 0, fw->requestingAddress, false); + + outgoingBs.Reset(); + outgoingBs.Write((MessageID)ID_UDP_PROXY_GENERAL); + outgoingBs.Write((MessageID)ID_UDP_PROXY_FORWARDING_NOTIFICATION); + outgoingBs.Write(sata.senderClientAddress); + outgoingBs.Write(sata.targetClientAddress); + outgoingBs.Write(sata.targetClientGuid); + outgoingBs.Write(RakNet::RakString(serverIP)); + outgoingBs.Write(forwardingPort); + rakPeerInterface->Send(&outgoingBs, MEDIUM_PRIORITY, RELIABLE_ORDERED, 0, sata.targetClientAddress, false); + + // 05/18/09 Keep the entry around for some time after success, so duplicates are reported if attempting forwarding from the target system before notification of success + fw->timeoutAfterSuccess=RakNet::GetTimeMS()+fw->timeoutOnNoDataMS; + // forwardingRequestList.RemoveAtIndex(index); + // RakNet::OP_DELETE(fw,_FILE_AND_LINE_); + + return; + } + else if (success==UDPFORWARDER_NO_SOCKETS) + { + // Try next server + TryNextServer(sata, fw); + } + else + { + RakAssert(success==UDPFORWARDER_FORWARDING_ALREADY_EXISTS); + + // Return in progress + outgoingBs.Write((MessageID)ID_UDP_PROXY_GENERAL); + outgoingBs.Write((MessageID)ID_UDP_PROXY_IN_PROGRESS); + outgoingBs.Write(sata.senderClientAddress); + outgoingBs.Write(sata.targetClientAddress); + outgoingBs.Write(sata.targetClientGuid); + rakPeerInterface->Send(&outgoingBs, MEDIUM_PRIORITY, RELIABLE_ORDERED, 0, fw->requestingAddress, false); + forwardingRequestList.RemoveAtIndex(index); + RakNet::OP_DELETE(fw,_FILE_AND_LINE_); + } +} +void UDPProxyCoordinator::OnPingServersReplyFromClientToCoordinator(Packet *packet) +{ + RakNet::BitStream incomingBs(packet->data, packet->length, false); + incomingBs.IgnoreBytes(2); + unsigned short serversToPingSize; + SystemAddress serverAddress; + SenderAndTargetAddress sata; + incomingBs.Read(sata.senderClientAddress); + incomingBs.Read(sata.targetClientAddress); + bool objectExists; + unsigned int index = forwardingRequestList.GetIndexFromKey(sata, &objectExists); + if (objectExists==false) + return; + unsigned short idx; + ServerWithPing swp; + ForwardingRequest *fw = forwardingRequestList[index]; + if (fw->timeRequestedPings==0) + return; + + incomingBs.Read(serversToPingSize); + if (packet->systemAddress==sata.senderClientAddress) + { + for (idx=0; idx < serversToPingSize; idx++) + { + incomingBs.Read(swp.serverAddress); + incomingBs.Read(swp.ping); + unsigned int index2; + for (index2=0; index2 < fw->sourceServerPings.Size(); index2++) + { + if (fw->sourceServerPings[index2].ping >= swp.ping ) + break; + } + fw->sourceServerPings.Insert(swp, index2, _FILE_AND_LINE_); + } + } + else + { + for (idx=0; idx < serversToPingSize; idx++) + { + incomingBs.Read(swp.serverAddress); + incomingBs.Read(swp.ping); + + unsigned int index2; + for (index2=0; index2 < fw->targetServerPings.Size(); index2++) + { + if (fw->targetServerPings[index2].ping >= swp.ping ) + break; + } + fw->sourceServerPings.Insert(swp, index2, _FILE_AND_LINE_); + } + } + + // Both systems have to give us pings to progress here. Otherwise will timeout in Update() + if (fw->sourceServerPings.Size()>0 && + fw->targetServerPings.Size()>0) + { + fw->OrderRemainingServersToTry(); + fw->timeRequestedPings=0; + TryNextServer(fw->sata, fw); + } +} +void UDPProxyCoordinator::TryNextServer(SenderAndTargetAddress sata, ForwardingRequest *fw) +{ + bool pickedGoodServer=false; + while(fw->remainingServersToTry.Size()>0) + { + fw->currentlyAttemptedServerAddress=fw->remainingServersToTry.Pop(); + if (serverList.GetIndexOf(fw->currentlyAttemptedServerAddress)!=(unsigned int)-1) + { + pickedGoodServer=true; + break; + } + } + + if (pickedGoodServer==false) + { + SendAllBusy(sata.senderClientAddress, sata.targetClientAddress, sata.targetClientGuid, fw->requestingAddress); + forwardingRequestList.Remove(sata); + RakNet::OP_DELETE(fw,_FILE_AND_LINE_); + return; + } + + SendForwardingRequest(sata.senderClientAddress, sata.targetClientAddress, fw->currentlyAttemptedServerAddress, fw->timeoutOnNoDataMS); +} +void UDPProxyCoordinator::SendAllBusy(SystemAddress senderClientAddress, SystemAddress targetClientAddress, RakNetGUID targetClientGuid, SystemAddress requestingAddress) +{ + RakNet::BitStream outgoingBs; + outgoingBs.Write((MessageID)ID_UDP_PROXY_GENERAL); + outgoingBs.Write((MessageID)ID_UDP_PROXY_ALL_SERVERS_BUSY); + outgoingBs.Write(senderClientAddress); + outgoingBs.Write(targetClientAddress); + outgoingBs.Write(targetClientGuid); + rakPeerInterface->Send(&outgoingBs, MEDIUM_PRIORITY, RELIABLE_ORDERED, 0, requestingAddress, false); +} +void UDPProxyCoordinator::Clear(void) +{ + serverList.Clear(true, _FILE_AND_LINE_); + for (unsigned int i=0; i < forwardingRequestList.Size(); i++) + { + RakNet::OP_DELETE(forwardingRequestList[i],_FILE_AND_LINE_); + } + forwardingRequestList.Clear(false, _FILE_AND_LINE_); +} +void UDPProxyCoordinator::ForwardingRequest::OrderRemainingServersToTry(void) +{ + //DataStructures::Multilist swpList; + DataStructures::OrderedList swpList; + // swpList.SetSortOrder(true); + + if (sourceServerPings.Size()==0 && targetServerPings.Size()==0) + return; + + unsigned int idx; + UDPProxyCoordinator::ServerWithPing swp; + for (idx=0; idx < remainingServersToTry.Size(); idx++) + { + swp.serverAddress=remainingServersToTry[idx]; + swp.ping=0; + if (sourceServerPings.Size()) + swp.ping+=(unsigned short) (sourceServerPings[idx].ping); + else + swp.ping+=(unsigned short) (DEFAULT_CLIENT_UNRESPONSIVE_PING_TIME); + if (targetServerPings.Size()) + swp.ping+=(unsigned short) (targetServerPings[idx].ping); + else + swp.ping+=(unsigned short) (DEFAULT_CLIENT_UNRESPONSIVE_PING_TIME); + swpList.Insert(swp.ping, swp, false, _FILE_AND_LINE_); + } + remainingServersToTry.Clear(_FILE_AND_LINE_ ); + for (idx=0; idx < swpList.Size(); idx++) + { + remainingServersToTry.Push(swpList[idx].serverAddress, _FILE_AND_LINE_ ); + } +} + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/UDPProxyCoordinator.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/UDPProxyCoordinator.h new file mode 100644 index 0000000..0107346 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/UDPProxyCoordinator.h @@ -0,0 +1,115 @@ +/// \file +/// \brief Essentially maintains a list of servers running UDPProxyServer, and some state management for UDPProxyClient to find a free server to forward datagrams +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. +/// Creative Commons Licensees are subject to the +/// license found at +/// http://creativecommons.org/licenses/by-nc/2.5/ +/// Single application licensees are subject to the license found at +/// http://www.jenkinssoftware.com/SingleApplicationLicense.html +/// Custom license users are subject to the terms therein. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_UDPProxyCoordinator==1 && _RAKNET_SUPPORT_UDPForwarder==1 + +#ifndef __UDP_PROXY_COORDINATOR_H +#define __UDP_PROXY_COORDINATOR_H + +#include "Export.h" +#include "RakNetTypes.h" +#include "PluginInterface2.h" +#include "RakString.h" +#include "BitStream.h" +#include "DS_Queue.h" +#include "DS_OrderedList.h" + +namespace RakNet +{ + /// When NAT Punchthrough fails, it is possible to use a non-NAT system to forward messages from us to the recipient, and vice-versa + /// The class to forward messages is UDPForwarder, and it is triggered over the network via the UDPProxyServer plugin. + /// The UDPProxyClient connects to UDPProxyCoordinator to get a list of servers running UDPProxyServer, and the coordinator will relay our forwarding request + /// \brief Middleman between UDPProxyServer and UDPProxyClient, maintaining a list of UDPProxyServer, and managing state for clients to find an available forwarding server. + /// \ingroup NAT_PUNCHTHROUGH_GROUP + class RAK_DLL_EXPORT UDPProxyCoordinator : public PluginInterface2 + { + public: + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(UDPProxyCoordinator) + + UDPProxyCoordinator(); + virtual ~UDPProxyCoordinator(); + + /// For UDPProxyServers logging in remotely, they must pass a password to UDPProxyServer::LoginToCoordinator(). It must match the password set here. + /// If no password is set, they cannot login remotely. + /// By default, no password is set + void SetRemoteLoginPassword(RakNet::RakString password); + + /// \internal + virtual void Update(void); + virtual PluginReceiveResult OnReceive(Packet *packet); + virtual void OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ); + + struct SenderAndTargetAddress + { + SystemAddress senderClientAddress; + RakNetGUID senderClientGuid; + SystemAddress targetClientAddress; + RakNetGUID targetClientGuid; + }; + + struct ServerWithPing + { + unsigned short ping; + SystemAddress serverAddress; + }; + + struct ForwardingRequest + { + RakNet::TimeMS timeoutOnNoDataMS; + RakNet::TimeMS timeoutAfterSuccess; + SenderAndTargetAddress sata; + SystemAddress requestingAddress; // Which system originally sent the network message to start forwarding + SystemAddress currentlyAttemptedServerAddress; + DataStructures::Queue remainingServersToTry; + RakNet::BitStream serverSelectionBitstream; + + DataStructures::List sourceServerPings, targetServerPings; + RakNet::TimeMS timeRequestedPings; + // Order based on sourceServerPings and targetServerPings + void OrderRemainingServersToTry(void); + + }; + protected: + + static int ServerWithPingComp( const unsigned short &key, const UDPProxyCoordinator::ServerWithPing &data ); + static int ForwardingRequestComp( const SenderAndTargetAddress &key, ForwardingRequest* const &data); + + void OnForwardingRequestFromClientToCoordinator(Packet *packet); + void OnLoginRequestFromServerToCoordinator(Packet *packet); + void OnForwardingReplyFromServerToCoordinator(Packet *packet); + void OnPingServersReplyFromClientToCoordinator(Packet *packet); + void TryNextServer(SenderAndTargetAddress sata, ForwardingRequest *fw); + void SendAllBusy(SystemAddress senderClientAddress, SystemAddress targetClientAddress, RakNetGUID targetClientGuid, SystemAddress requestingAddress); + void Clear(void); + + void SendForwardingRequest(SystemAddress sourceAddress, SystemAddress targetAddress, SystemAddress serverAddress, RakNet::TimeMS timeoutOnNoDataMS); + + // Logged in servers + //DataStructures::Multilist serverList; + DataStructures::List serverList; + + // Forwarding requests in progress + //DataStructures::Multilist forwardingRequestList; + DataStructures::OrderedList forwardingRequestList; + + RakNet::RakString remoteLoginPassword; + + }; + +} // End namespace + +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/UDPProxyServer.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/UDPProxyServer.cpp new file mode 100644 index 0000000..ce65db9 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/UDPProxyServer.cpp @@ -0,0 +1,167 @@ +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_UDPProxyServer==1 && _RAKNET_SUPPORT_UDPForwarder==1 + +#include "UDPProxyServer.h" +#include "BitStream.h" +#include "UDPProxyCommon.h" +#include "RakPeerInterface.h" +#include "MessageIdentifiers.h" + +using namespace RakNet; + +STATIC_FACTORY_DEFINITIONS(UDPProxyServer,UDPProxyServer); + +UDPProxyServer::UDPProxyServer() +{ + resultHandler=0; + socketFamily=AF_INET; +} +UDPProxyServer::~UDPProxyServer() +{ + +} +void UDPProxyServer::SetSocketFamily(unsigned short _socketFamily) +{ + socketFamily=_socketFamily; +} +void UDPProxyServer::SetResultHandler(UDPProxyServerResultHandler *rh) +{ + resultHandler=rh; +} +bool UDPProxyServer::LoginToCoordinator(RakNet::RakString password, SystemAddress coordinatorAddress) +{ + unsigned int insertionIndex; + bool objectExists; + insertionIndex=loggingInCoordinators.GetIndexFromKey(coordinatorAddress,&objectExists); + if (objectExists==true) + return false; + loggedInCoordinators.GetIndexFromKey(coordinatorAddress,&objectExists); + if (objectExists==true) + return false; + RakNet::BitStream outgoingBs; + outgoingBs.Write((MessageID)ID_UDP_PROXY_GENERAL); + outgoingBs.Write((MessageID)ID_UDP_PROXY_LOGIN_REQUEST_FROM_SERVER_TO_COORDINATOR); + outgoingBs.Write(password); + rakPeerInterface->Send(&outgoingBs, MEDIUM_PRIORITY, RELIABLE_ORDERED, 0, coordinatorAddress, false); + loggingInCoordinators.InsertAtIndex(coordinatorAddress, insertionIndex, _FILE_AND_LINE_ ); + return true; +} +void UDPProxyServer::Update(void) +{ + udpForwarder.Update(); +} +PluginReceiveResult UDPProxyServer::OnReceive(Packet *packet) +{ + // Make sure incoming messages from from UDPProxyCoordinator + + if (packet->data[0]==ID_UDP_PROXY_GENERAL && packet->length>1) + { + bool objectExists; + + switch (packet->data[1]) + { + case ID_UDP_PROXY_FORWARDING_REQUEST_FROM_COORDINATOR_TO_SERVER: + if (loggedInCoordinators.GetIndexFromKey(packet->systemAddress, &objectExists)!=(unsigned int)-1) + { + OnForwardingRequestFromCoordinatorToServer(packet); + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + break; + case ID_UDP_PROXY_NO_PASSWORD_SET_FROM_COORDINATOR_TO_SERVER: + case ID_UDP_PROXY_WRONG_PASSWORD_FROM_COORDINATOR_TO_SERVER: + case ID_UDP_PROXY_ALREADY_LOGGED_IN_FROM_COORDINATOR_TO_SERVER: + case ID_UDP_PROXY_LOGIN_SUCCESS_FROM_COORDINATOR_TO_SERVER: + { + unsigned int removalIndex = loggingInCoordinators.GetIndexFromKey(packet->systemAddress, &objectExists); + if (objectExists) + { + loggingInCoordinators.RemoveAtIndex(removalIndex); + + RakNet::BitStream incomingBs(packet->data, packet->length, false); + incomingBs.IgnoreBytes(2); + RakNet::RakString password; + incomingBs.Read(password); + switch (packet->data[1]) + { + case ID_UDP_PROXY_NO_PASSWORD_SET_FROM_COORDINATOR_TO_SERVER: + if (resultHandler) + resultHandler->OnNoPasswordSet(password, this); + break; + case ID_UDP_PROXY_WRONG_PASSWORD_FROM_COORDINATOR_TO_SERVER: + if (resultHandler) + resultHandler->OnWrongPassword(password, this); + break; + case ID_UDP_PROXY_ALREADY_LOGGED_IN_FROM_COORDINATOR_TO_SERVER: + if (resultHandler) + resultHandler->OnAlreadyLoggedIn(password, this); + break; + case ID_UDP_PROXY_LOGIN_SUCCESS_FROM_COORDINATOR_TO_SERVER: + // RakAssert(loggedInCoordinators.GetIndexOf(packet->systemAddress)==(unsigned int)-1); + loggedInCoordinators.Insert(packet->systemAddress, packet->systemAddress, true, _FILE_AND_LINE_); + if (resultHandler) + resultHandler->OnLoginSuccess(password, this); + break; + } + } + + + return RR_STOP_PROCESSING_AND_DEALLOCATE; + } + } + } + return RR_CONTINUE_PROCESSING; +} +void UDPProxyServer::OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ) +{ + (void) lostConnectionReason; + (void) rakNetGUID; + + loggingInCoordinators.RemoveIfExists(systemAddress); + loggedInCoordinators.RemoveIfExists(systemAddress); +} +void UDPProxyServer::OnRakPeerStartup(void) +{ + udpForwarder.Startup(); +} +void UDPProxyServer::OnRakPeerShutdown(void) +{ + udpForwarder.Shutdown(); + loggingInCoordinators.Clear(true,_FILE_AND_LINE_); + loggedInCoordinators.Clear(true,_FILE_AND_LINE_); +} +void UDPProxyServer::OnAttach(void) +{ + if (rakPeerInterface->IsActive()) + OnRakPeerStartup(); +} +void UDPProxyServer::OnDetach(void) +{ + OnRakPeerShutdown(); +} +void UDPProxyServer::OnForwardingRequestFromCoordinatorToServer(Packet *packet) +{ + SystemAddress sourceAddress, targetAddress; + RakNet::BitStream incomingBs(packet->data, packet->length, false); + incomingBs.IgnoreBytes(2); + incomingBs.Read(sourceAddress); + incomingBs.Read(targetAddress); + RakNet::TimeMS timeoutOnNoDataMS; + incomingBs.Read(timeoutOnNoDataMS); + RakAssert(timeoutOnNoDataMS > 0 && timeoutOnNoDataMS <= UDP_FORWARDER_MAXIMUM_TIMEOUT); + + unsigned short forwardingPort; + UDPForwarderResult success = udpForwarder.StartForwarding(sourceAddress, targetAddress, timeoutOnNoDataMS, 0, socketFamily, &forwardingPort, 0); + RakNet::BitStream outgoingBs; + outgoingBs.Write((MessageID)ID_UDP_PROXY_GENERAL); + outgoingBs.Write((MessageID)ID_UDP_PROXY_FORWARDING_REPLY_FROM_SERVER_TO_COORDINATOR); + outgoingBs.Write(sourceAddress); + outgoingBs.Write(targetAddress); + outgoingBs.Write((unsigned char) success); + if (success==UDPFORWARDER_SUCCESS) + { + outgoingBs.Write(forwardingPort); + } + rakPeerInterface->Send(&outgoingBs, MEDIUM_PRIORITY, RELIABLE_ORDERED, 0, packet->systemAddress, false); +} + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/UDPProxyServer.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/UDPProxyServer.h new file mode 100644 index 0000000..1678e6c --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/UDPProxyServer.h @@ -0,0 +1,118 @@ +/// \file +/// \brief A RakNet plugin performing networking to communicate with UDPProxyServer. It allows UDPProxyServer to control our instance of UDPForwarder. +/// +/// This file is part of RakNet Copyright 2003 Jenkins Software LLC +/// +/// Usage of RakNet is subject to the appropriate license agreement. +/// Creative Commons Licensees are subject to the +/// license found at +/// http://creativecommons.org/licenses/by-nc/2.5/ +/// Single application licensees are subject to the license found at +/// http://www.jenkinssoftware.com/SingleApplicationLicense.html +/// Custom license users are subject to the terms therein. + +#include "NativeFeatureIncludes.h" +#if _RAKNET_SUPPORT_UDPProxyServer==1 && _RAKNET_SUPPORT_UDPForwarder==1 + +#ifndef __UDP_PROXY_SERVER_H +#define __UDP_PROXY_SERVER_H + +#include "Export.h" +#include "RakNetTypes.h" +#include "PluginInterface2.h" +#include "UDPForwarder.h" +#include "RakString.h" + +namespace RakNet +{ +class UDPProxyServer; + +/// Callback to handle results of calling UDPProxyServer::LoginToCoordinator() +/// \ingroup UDP_PROXY_GROUP +struct UDPProxyServerResultHandler +{ + UDPProxyServerResultHandler() {} + virtual ~UDPProxyServerResultHandler() {} + + /// Called when our login succeeds + /// \param[out] usedPassword The password we passed to UDPProxyServer::LoginToCoordinator() + /// \param[out] proxyServer The plugin calling this callback + virtual void OnLoginSuccess(RakNet::RakString usedPassword, RakNet::UDPProxyServer *proxyServerPlugin)=0; + + /// We are already logged in. + /// This login failed, but the system is operational as if it succeeded + /// \param[out] usedPassword The password we passed to UDPProxyServer::LoginToCoordinator() + /// \param[out] proxyServer The plugin calling this callback + virtual void OnAlreadyLoggedIn(RakNet::RakString usedPassword, RakNet::UDPProxyServer *proxyServerPlugin)=0; + + /// The coordinator operator forgot to call UDPProxyCoordinator::SetRemoteLoginPassword() + /// \param[out] usedPassword The password we passed to UDPProxyServer::LoginToCoordinator() + /// \param[out] proxyServer The plugin calling this callback + virtual void OnNoPasswordSet(RakNet::RakString usedPassword, RakNet::UDPProxyServer *proxyServerPlugin)=0; + + /// The coordinator operator set a different password in UDPProxyCoordinator::SetRemoteLoginPassword() than what we passed + /// \param[out] usedPassword The password we passed to UDPProxyServer::LoginToCoordinator() + /// \param[out] proxyServer The plugin calling this callback + virtual void OnWrongPassword(RakNet::RakString usedPassword, RakNet::UDPProxyServer *proxyServerPlugin)=0; +}; + +/// \brief UDPProxyServer to control our instance of UDPForwarder +/// \details When NAT Punchthrough fails, it is possible to use a non-NAT system to forward messages from us to the recipient, and vice-versa.
    +/// The class to forward messages is UDPForwarder, and it is triggered over the network via the UDPProxyServer plugin.
    +/// The UDPProxyServer connects to UDPProxyServer to get a list of servers running UDPProxyServer, and the coordinator will relay our forwarding request. +/// \ingroup UDP_PROXY_GROUP +class RAK_DLL_EXPORT UDPProxyServer : public PluginInterface2 +{ +public: + // GetInstance() and DestroyInstance(instance*) + STATIC_FACTORY_DECLARATIONS(UDPProxyServer) + + UDPProxyServer(); + ~UDPProxyServer(); + + /// Sets the socket family to use, either IPV4 or IPV6 + /// \param[in] socketFamily For IPV4, use AF_INET (default). For IPV6, use AF_INET6. To autoselect, use AF_UNSPEC. + void SetSocketFamily(unsigned short _socketFamily); + + /// Receives the results of calling LoginToCoordinator() + /// Set before calling LoginToCoordinator or you won't know what happened + /// \param[in] resultHandler + void SetResultHandler(UDPProxyServerResultHandler *rh); + + /// Before the coordinator will register the UDPProxyServer, you must login + /// \pre Must be connected to the coordinator + /// \pre Coordinator must have set a password with UDPProxyCoordinator::SetRemoteLoginPassword() + /// \returns false if already logged in, or logging in. Returns true otherwise + bool LoginToCoordinator(RakNet::RakString password, SystemAddress coordinatorAddress); + + /// Operative class that performs the forwarding + /// Exposed so you can call UDPForwarder::SetMaxForwardEntries() if you want to change away from the default + /// UDPForwarder::Startup(), UDPForwarder::Shutdown(), and UDPForwarder::Update() are called automatically by the plugin + UDPForwarder udpForwarder; + + virtual void OnAttach(void); + virtual void OnDetach(void); + + /// \internal + virtual void Update(void); + virtual PluginReceiveResult OnReceive(Packet *packet); + virtual void OnClosedConnection(const SystemAddress &systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ); + virtual void OnRakPeerStartup(void); + virtual void OnRakPeerShutdown(void); + +protected: + void OnForwardingRequestFromCoordinatorToServer(Packet *packet); + + DataStructures::OrderedList loggingInCoordinators; + DataStructures::OrderedList loggedInCoordinators; + + UDPProxyServerResultHandler *resultHandler; + unsigned short socketFamily; + +}; + +} // End namespace + +#endif + +#endif // _RAKNET_SUPPORT_* diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/VariableDeltaSerializer.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/VariableDeltaSerializer.cpp new file mode 100644 index 0000000..044819f --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/VariableDeltaSerializer.cpp @@ -0,0 +1,275 @@ +#include "VariableDeltaSerializer.h" + +using namespace RakNet; + +VariableDeltaSerializer::VariableDeltaSerializer() {didComparisonThisTick=false;} +VariableDeltaSerializer::~VariableDeltaSerializer() {RemoveRemoteSystemVariableHistory();} + +VariableDeltaSerializer::SerializationContext::SerializationContext() {variableHistoryIdentical=0; variableHistoryUnique=0;} +VariableDeltaSerializer::SerializationContext::~SerializationContext() {} + +void VariableDeltaSerializer::OnMessageReceipt(RakNetGUID guid, uint32_t receiptId, bool messageArrived) +{ + // Module? + if (messageArrived) + FreeVarsAssociatedWithReceipt(guid, receiptId); + else + DirtyAndFreeVarsAssociatedWithReceipt(guid, receiptId); + +} + +void VariableDeltaSerializer::BeginUnreliableAckedSerialize(SerializationContext *context, RakNetGUID _guid, BitStream *_bitStream, uint32_t _sendReceipt) +{ + RakAssert(_guid!=UNASSIGNED_RAKNET_GUID); + context->anyVariablesWritten=false; + context->guid=_guid; + context->bitStream=_bitStream; + if (context->variableHistoryUnique==0) + context->variableHistoryUnique=StartVariableHistoryWrite(_guid); + context->variableHistory=context->variableHistoryUnique; + context->sendReceipt=_sendReceipt; + context->changedVariables = AllocChangedVariablesList(); + context->newSystemSend=false; + context->serializationMode=UNRELIABLE_WITH_ACK_RECEIPT; +} + +void VariableDeltaSerializer::BeginUniqueSerialize(SerializationContext *context, RakNetGUID _guid, BitStream *_bitStream) +{ + RakAssert(_guid!=UNASSIGNED_RAKNET_GUID); + context->anyVariablesWritten=false; + context->guid=_guid; + context->bitStream=_bitStream; + if (context->variableHistoryUnique==0) + context->variableHistoryUnique=StartVariableHistoryWrite(_guid); + context->variableHistory=context->variableHistoryUnique; + context->newSystemSend=false; + + context->serializationMode=RELIABLE; +} + + +void VariableDeltaSerializer::BeginIdenticalSerialize(SerializationContext *context, bool _isFirstSendToRemoteSystem, BitStream *_bitStream) +{ + context->anyVariablesWritten=false; + context->guid=UNASSIGNED_RAKNET_GUID; + context->bitStream=_bitStream; + context->serializationMode=RELIABLE; + if (context->variableHistoryIdentical==0) + context->variableHistoryIdentical=StartVariableHistoryWrite(UNASSIGNED_RAKNET_GUID); + context->variableHistory=context->variableHistoryIdentical; + context->newSystemSend=_isFirstSendToRemoteSystem; +} + +void VariableDeltaSerializer::EndSerialize(SerializationContext *context) +{ + if (context->serializationMode==UNRELIABLE_WITH_ACK_RECEIPT) + { + if (context->anyVariablesWritten==false) + { + context->bitStream->Reset(); + FreeChangedVariablesList(context->changedVariables); + return; + } + + StoreChangedVariablesList(context->variableHistory, context->changedVariables, context->sendReceipt); + } + else + { + if (context->variableHistoryIdentical) + { + if (didComparisonThisTick==false) + { + didComparisonThisTick=true; + identicalSerializationBs.Reset(); + + if (context->anyVariablesWritten==false) + { + context->bitStream->Reset(); + return; + } + + identicalSerializationBs.Write(context->bitStream); + context->bitStream->ResetReadPointer(); + } + else + { + context->bitStream->Write(&identicalSerializationBs); + identicalSerializationBs.ResetReadPointer(); + } + } + else if (context->anyVariablesWritten==false) + { + context->bitStream->Reset(); + return; + } + } +} + +void VariableDeltaSerializer::BeginDeserialize(DeserializationContext *context, BitStream *_bitStream) +{ + context->bitStream=_bitStream; +} + +void VariableDeltaSerializer::EndDeserialize(DeserializationContext *context) +{ + (void) context; +} + +void VariableDeltaSerializer::AddRemoteSystemVariableHistory(RakNetGUID guid) +{ + (void) guid; +} + +void VariableDeltaSerializer::RemoveRemoteSystemVariableHistory(RakNetGUID guid) +{ + unsigned int idx,idx2; + idx = GetVarsWrittenPerRemoteSystemListIndex(guid); + if (idx==(unsigned int)-1) + return; + + if (remoteSystemVariableHistoryList[idx]->guid==guid) + { + // Memory pool doesn't call destructor + for (idx2=0; idx2 < remoteSystemVariableHistoryList[idx]->updatedVariablesHistory.Size(); idx2++) + { + FreeChangedVariablesList(remoteSystemVariableHistoryList[idx]->updatedVariablesHistory[idx2]); + } + + delete remoteSystemVariableHistoryList[idx]; + remoteSystemVariableHistoryList.RemoveAtIndexFast(idx); + return; + } +} + +int RakNet::VariableDeltaSerializer::UpdatedVariablesListPtrComp( const uint32_t &key, ChangedVariablesList* const &data ) +{ + if (keysendReceipt) + return -1; + if (key==data->sendReceipt) + return 0; + return 1; +} + +void VariableDeltaSerializer::FreeVarsAssociatedWithReceipt(RakNetGUID guid, uint32_t receiptId) +{ + unsigned int idx, idx2; + idx = GetVarsWrittenPerRemoteSystemListIndex(guid); + if (idx==(unsigned int)-1) + return; + + RemoteSystemVariableHistory* vprs = remoteSystemVariableHistoryList[idx]; + bool objectExists; + idx2=vprs->updatedVariablesHistory.GetIndexFromKey(receiptId,&objectExists); + if (objectExists) + { + // Free this history node + FreeChangedVariablesList(vprs->updatedVariablesHistory[idx2]); + vprs->updatedVariablesHistory.RemoveAtIndex(idx2); + } +} + +void VariableDeltaSerializer::DirtyAndFreeVarsAssociatedWithReceipt(RakNetGUID guid, uint32_t receiptId) +{ + unsigned int idx, idx2; + idx = GetVarsWrittenPerRemoteSystemListIndex(guid); + if (idx==(unsigned int)-1) + return; + + RemoteSystemVariableHistory* vprs = remoteSystemVariableHistoryList[idx]; + bool objectExists; + idx2=vprs->updatedVariablesHistory.GetIndexFromKey(receiptId,&objectExists); + if (objectExists) + { + // 'Dirty' all variables sent this update, meaning they will be resent the next time Serialize() is called + vprs->variableListDeltaTracker.FlagDirtyFromBitArray(vprs->updatedVariablesHistory[idx2]->bitField); + + // Free this history node + FreeChangedVariablesList(vprs->updatedVariablesHistory[idx2]); + vprs->updatedVariablesHistory.RemoveAtIndex(idx2); + } +} +unsigned int VariableDeltaSerializer::GetVarsWrittenPerRemoteSystemListIndex(RakNetGUID guid) +{ + unsigned int idx; + for (idx=0; idx < remoteSystemVariableHistoryList.Size(); idx++) + { + if (remoteSystemVariableHistoryList[idx]->guid==guid) + return idx; + } + return (unsigned int) -1; +} +void VariableDeltaSerializer::RemoveRemoteSystemVariableHistory(void) +{ + unsigned int idx,idx2; + for (idx=0; idx < remoteSystemVariableHistoryList.Size(); idx++) + { + for (idx2=0; idx2 < remoteSystemVariableHistoryList[idx]->updatedVariablesHistory.Size(); idx2++) + { + FreeChangedVariablesList(remoteSystemVariableHistoryList[idx]->updatedVariablesHistory[idx2]); + } + + delete remoteSystemVariableHistoryList[idx]; + } + remoteSystemVariableHistoryList.Clear(false,_FILE_AND_LINE_); +} + +VariableDeltaSerializer::RemoteSystemVariableHistory* VariableDeltaSerializer::GetRemoteSystemVariableHistory(RakNetGUID guid) +{ + unsigned int rshli = GetRemoteSystemHistoryListIndex(guid); + return remoteSystemVariableHistoryList[rshli]; +} + +VariableDeltaSerializer::ChangedVariablesList *VariableDeltaSerializer::AllocChangedVariablesList(void) +{ + VariableDeltaSerializer::ChangedVariablesList *p = updatedVariablesMemoryPool.Allocate(_FILE_AND_LINE_); + p->bitWriteIndex=0; + p->bitField[0]=0; + return p; +} +void VariableDeltaSerializer::FreeChangedVariablesList(ChangedVariablesList *changedVariables) +{ + updatedVariablesMemoryPool.Release(changedVariables, _FILE_AND_LINE_); +} +void VariableDeltaSerializer::StoreChangedVariablesList(RemoteSystemVariableHistory *variableHistory, ChangedVariablesList *changedVariables, uint32_t sendReceipt) +{ + changedVariables->sendReceipt=sendReceipt; + variableHistory->updatedVariablesHistory.Insert(changedVariables->sendReceipt,changedVariables,true,_FILE_AND_LINE_); +} + +VariableDeltaSerializer::RemoteSystemVariableHistory *VariableDeltaSerializer::StartVariableHistoryWrite(RakNetGUID guid) +{ + RemoteSystemVariableHistory *variableHistory; + + unsigned int rshli = GetRemoteSystemHistoryListIndex(guid); + if (rshli==(unsigned int) -1) + { + variableHistory = new RemoteSystemVariableHistory; + variableHistory->guid=guid; + remoteSystemVariableHistoryList.Push(variableHistory,_FILE_AND_LINE_); + } + else + { + variableHistory=remoteSystemVariableHistoryList[rshli]; + } + + variableHistory->variableListDeltaTracker.StartWrite(); + return variableHistory; +} +unsigned int VariableDeltaSerializer::GetRemoteSystemHistoryListIndex(RakNetGUID guid) +{ + // Find the variable tracker for the target system + unsigned int idx; + for (idx=0; idx < remoteSystemVariableHistoryList.Size(); idx++) + { + if (remoteSystemVariableHistoryList[idx]->guid==guid) + { + return idx; + } + } + return (unsigned int) -1; +} + +void VariableDeltaSerializer::OnPreSerializeTick(void) +{ + didComparisonThisTick=false; +} diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/VariableDeltaSerializer.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/VariableDeltaSerializer.h new file mode 100644 index 0000000..a05653a --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/VariableDeltaSerializer.h @@ -0,0 +1,257 @@ +#ifndef __VARIABLE_DELTA_SERIALIZER_H +#define __VARIABLE_DELTA_SERIALIZER_H + +#include "VariableListDeltaTracker.h" +#include "DS_MemoryPool.h" +#include "NativeTypes.h" +#include "BitStream.h" +#include "PacketPriority.h" +#include "DS_OrderedList.h" + +namespace RakNet +{ + +/// \brief Class to compare memory values of variables in a current state to a prior state +/// Results of the comparisons will be written to a bitStream, such that only changed variables get written
    +/// Can be used with ReplicaManager3 to Serialize a Replica3 per-variable, rather than comparing the entire object against itself
    +/// Usage:
    +///
    +/// 1. Call BeginUnreliableAckedSerialize(), BeginUniqueSerialize(), or BeginIdenticalSerialize(). In the case of Replica3, this would be in the Serialize() call
    +/// 2. For each variable of the type in step 1, call Serialize(). The same variables must be serialized every tick()
    +/// 3. Call EndSerialize()
    +/// 4. Repeat step 1 for each of the other categories of how to send varaibles +/// +/// On the receiver: +/// +/// 1. Call BeginDeserialize(). In the case of Replica3, this would be in the Deserialize() call +/// 2. Call DeserializeVariable() for each variable, in the same order as was Serialized() +/// 3. Call EndSerialize() +/// \sa The ReplicaManager3 sample +class VariableDeltaSerializer +{ +protected: + struct RemoteSystemVariableHistory; + struct ChangedVariablesList; + +public: + VariableDeltaSerializer(); + ~VariableDeltaSerializer(); + + struct SerializationContext + { + SerializationContext(); + ~SerializationContext(); + + RakNetGUID guid; + BitStream *bitStream; + uint32_t rakPeerSendReceipt; + RemoteSystemVariableHistory *variableHistory; + RemoteSystemVariableHistory *variableHistoryIdentical; + RemoteSystemVariableHistory *variableHistoryUnique; + ChangedVariablesList *changedVariables; + uint32_t sendReceipt; + PacketReliability serializationMode; + bool anyVariablesWritten; + bool newSystemSend; // Force send all, do not record + }; + + struct DeserializationContext + { + BitStream *bitStream; + }; + + /// \brief Call before doing one or more SerializeVariable calls when the data will be sent UNRELIABLE_WITH_ACK_RECEIPT + /// The last value of each variable will be saved per remote system. Additionally, a history of \a _sendReceipts is stored to determine what to resend on packetloss. + /// When variables are lost, they will be flagged dirty and always resent to the system that lost it + /// Disadvantages: Every variable for every remote system is copied internally, in addition to a history list of what variables changed for which \a _sendReceipt. Very memory and CPU intensive for multiple connections. + /// Advantages: When data needs to be resent by RakNet, RakNet can only resend the value it currently has. This allows the application to control the resend, sending the most recent value of the variable. The end result is that bandwidth is used more efficiently because old data is never sent. + /// \pre Upon getting ID_SND_RECEIPT_LOSS or ID_SND_RECEIPT_ACKED call OnMessageReceipt() + /// \pre AddRemoteSystemVariableHistory() and RemoveRemoteSystemVariableHistory() must be called for new and lost connections + /// \param[in] context Holds the context of this group of serialize calls. This can be a stack object just passed to the function. + /// \param[in] _guid Which system we are sending to + /// \param[in] _bitSteam Which bitStream to write to + /// \param[in] _sendReceipt Returned from RakPeer::IncrementNextSendReceipt() and passed to the Send() or SendLists() function. Identifies this update for ID_SND_RECEIPT_LOSS and ID_SND_RECEIPT_ACKED + void BeginUnreliableAckedSerialize(SerializationContext *context, RakNetGUID _guid, BitStream *_bitStream, uint32_t _sendReceipt); + + /// \brief Call before doing one or more SerializeVariable calls for data that may be sent differently to every remote system (such as an invisibility flag that only teammates can see) + /// The last value of each variable will be saved per remote system. + /// Unlike BeginUnreliableAckedSerialize(), send receipts are not necessary + /// Disadvantages: Every variable for every remote system is copied internally. Very memory and CPU intensive for multiple connections. + /// Advantages: When data is sent differently depending on the recipient, this system can make things easier to use and is as efficient as it can be. + /// \pre AddRemoteSystemVariableHistory() and RemoveRemoteSystemVariableHistory() must be called for new and lost connections + /// \param[in] context Holds the context of this group of serialize calls. This can be a stack object just passed to the function. + /// \param[in] _guid Which system we are sending to + /// \param[in] _bitSteam Which bitStream to write to + void BeginUniqueSerialize(SerializationContext *context, RakNetGUID _guid, BitStream *_bitStream); + + /// \brief Call before doing one or more SerializeVariable calls for data that is sent with the same value to every remote system (such as health, position, etc.) + /// This is the most common type of serialization, and also the most efficient + /// Disadvantages: A copy of every variable still needs to be held, although only once + /// Advantages: After the first serialization, the last serialized bitStream will be used for subsequent sends + /// \pre Call OnPreSerializeTick() before doing any calls to BeginIdenticalSerialize() for each of your objects, once per game tick + /// \param[in] context Holds the context of this group of serialize calls. This can be a stack object just passed to the function. + /// \param[in] _isFirstSerializeToThisSystem Pass true if this is the first time ever serializing to this system (the initial download). This way all variables will be written, rather than checking against prior sent values. + /// \param[in] _bitSteam Which bitStream to write to + void BeginIdenticalSerialize(SerializationContext *context, bool _isFirstSerializeToThisSystem, BitStream *_bitStream); + + /// \brief Call after BeginUnreliableAckedSerialize(), BeginUniqueSerialize(), or BeginIdenticalSerialize(), then after calling SerializeVariable() one or more times + /// \param[in] context Same context pointer passed to BeginUnreliableAckedSerialize(), BeginUniqueSerialize(), or BeginIdenticalSerialize() + void EndSerialize(SerializationContext *context); + + /// \brief Call when you receive the BitStream written by SerializeVariable(), before calling DeserializeVariable() + /// \param[in] context Holds the context of this group of deserialize calls. This can be a stack object just passed to the function. + /// \param[in] _bitStream Pass the bitStream originally passed to and written to by serialize calls + void BeginDeserialize(DeserializationContext *context, BitStream *_bitStream); + + /// \param[in] context Same context pointer passed to BeginDeserialize() + void EndDeserialize(DeserializationContext *context); + + /// BeginUnreliableAckedSerialize() and BeginUniqueSerialize() require knowledge of when connections are added and dropped + /// Call AddRemoteSystemVariableHistory() and RemoveRemoteSystemVariableHistory() to notify the system of these events + /// \param[in] _guid Which system we are sending to + void AddRemoteSystemVariableHistory(RakNetGUID guid); + + /// BeginUnreliableAckedSerialize() and BeginUniqueSerialize() require knowledge of when connections are added and dropped + /// Call AddRemoteSystemVariableHistory() and RemoveRemoteSystemVariableHistory() to notify the system of these events + /// \param[in] _guid Which system we are sending to + void RemoveRemoteSystemVariableHistory(RakNetGUID guid); + + /// BeginIdenticalSerialize() requires knowledge of when serialization has started for an object across multiple systems + /// This way it can setup the flag to do new comparisons against the last sent values, rather than just resending the last sent bitStream + /// For Replica3, overload and call this from Replica3::OnUserReplicaPreSerializeTick() + void OnPreSerializeTick(void); + + /// Call when getting ID_SND_RECEIPT_LOSS or ID_SND_RECEIPT_ACKED for a particular system + /// Example: + /// + /// uint32_t msgNumber; + /// memcpy(&msgNumber, packet->data+1, 4); + /// DataStructures::List replicaListOut; + /// replicaManager.GetReplicasCreatedByMe(replicaListOut); + /// unsigned int idx; + /// for (idx=0; idx < replicaListOut.GetSize(); idx++) + /// { + /// ((SampleReplica*)replicaListOut[idx])->NotifyReplicaOfMessageDeliveryStatus(packet->guid,msgNumber, packet->data[0]==ID_SND_RECEIPT_ACKED); + /// } + /// + /// \param[in] guid Which system we are sending to + /// \param[in] receiptId Encoded in bytes 1-4 inclusive of ID_SND_RECEIPT_LOSS and ID_SND_RECEIPT_ACKED + /// \param[in] messageArrived True for ID_SND_RECEIPT_ACKED, false otherwise + void OnMessageReceipt(RakNetGUID guid, uint32_t receiptId, bool messageArrived); + + /// Call to Serialize a variable + /// Will write to the bitSteam passed to \a context true, variableValue if the variable has changed or has never been written. Otherwise will write false. + /// \pre You have called BeginUnreliableAckedSerialize(), BeginUniqueSerialize(), or BeginIdenticalSerialize() + /// \pre Will also require calling OnPreSerializeTick() if using BeginIdenticalSerialize() + /// \note Be sure to call EndSerialize() after finishing all serializations + /// \param[in] context Same context pointer passed to BeginUnreliableAckedSerialize(), BeginUniqueSerialize(), or BeginIdenticalSerialize() + /// \param[in] variable A variable to write to the bitStream passed to \a context + template + void SerializeVariable(SerializationContext *context, const VarType &variable) + { + if (context->newSystemSend) + { + if (context->variableHistory->variableListDeltaTracker.IsPastEndOfList()==false) + { + // previously sent data to another system + context->bitStream->Write(true); + context->bitStream->Write(variable); + context->anyVariablesWritten=true; + } + else + { + // never sent data to another system + context->variableHistory->variableListDeltaTracker.WriteVarToBitstream(variable, context->bitStream); + context->anyVariablesWritten=true; + } + } + else if (context->serializationMode==UNRELIABLE_WITH_ACK_RECEIPT) + { + context->anyVariablesWritten|= + context->variableHistory->variableListDeltaTracker.WriteVarToBitstream(variable, context->bitStream, context->changedVariables->bitField, context->changedVariables->bitWriteIndex++); + } + else + { + if (context->variableHistoryIdentical) + { + // Identical serialization to a number of systems + if (didComparisonThisTick==false) + context->anyVariablesWritten|= + context->variableHistory->variableListDeltaTracker.WriteVarToBitstream(variable, context->bitStream); + // Else bitstream is written to at the end + } + else + { + // Per-system serialization + context->anyVariablesWritten|= + context->variableHistory->variableListDeltaTracker.WriteVarToBitstream(variable, context->bitStream); + } + } + } + + /// Call to deserialize into a variable + /// \pre You have called BeginDeserialize() + /// \note Be sure to call EndDeserialize() after finishing all deserializations + /// \param[in] context Same context pointer passed to BeginDeserialize() + /// \param[in] variable A variable to write to the bitStream passed to \a context + template + bool DeserializeVariable(DeserializationContext *context, VarType &variable) + { + return VariableListDeltaTracker::ReadVarFromBitstream(variable, context->bitStream); + } + + + +protected: + + // For a given send receipt from RakPeer::Send() track which variables we updated + // That way if that send does not arrive (ID_SND_RECEIPT_LOSS) we can mark those variables as dirty to resend them with current values + struct ChangedVariablesList + { + uint32_t sendReceipt; + unsigned short bitWriteIndex; + unsigned char bitField[56]; + }; + + // static int Replica2ObjectComp( const uint32_t &key, ChangedVariablesList* const &data ); + + static int UpdatedVariablesListPtrComp( const uint32_t &key, ChangedVariablesList* const &data ); + + // For each remote system, track the last values of variables we sent to them, and the history of what values changed per call to Send() + // Every serialize if a variable changes from its last value, send it out again + // Also if a send does not arrive (ID_SND_RECEIPT_LOSS) we use updatedVariablesHistory to mark those variables as dirty, to resend them unreliably with the current values + struct RemoteSystemVariableHistory + { + RakNetGUID guid; + VariableListDeltaTracker variableListDeltaTracker; + DataStructures::OrderedList updatedVariablesHistory; + }; + /// A list of RemoteSystemVariableHistory indexed by guid, one per connection that we serialize to + /// List is added to when SerializeConstruction is called, and removed from when SerializeDestruction is called, or when a given connection is dropped + DataStructures::List remoteSystemVariableHistoryList; + + // Because the ChangedVariablesList is created every serialize and destroyed every receipt I use a pool to avoid fragmentation + DataStructures::MemoryPool updatedVariablesMemoryPool; + + bool didComparisonThisTick; + RakNet::BitStream identicalSerializationBs; + + void FreeVarsAssociatedWithReceipt(RakNetGUID guid, uint32_t receiptId); + void DirtyAndFreeVarsAssociatedWithReceipt(RakNetGUID guid, uint32_t receiptId); + unsigned int GetVarsWrittenPerRemoteSystemListIndex(RakNetGUID guid); + void RemoveRemoteSystemVariableHistory(void); + + RemoteSystemVariableHistory* GetRemoteSystemVariableHistory(RakNetGUID guid); + + ChangedVariablesList *AllocChangedVariablesList(void); + void FreeChangedVariablesList(ChangedVariablesList *changedVariables); + void StoreChangedVariablesList(RemoteSystemVariableHistory *variableHistory, ChangedVariablesList *changedVariables, uint32_t sendReceipt); + + RemoteSystemVariableHistory *StartVariableHistoryWrite(RakNetGUID guid); + unsigned int GetRemoteSystemHistoryListIndex(RakNetGUID guid); + +}; + +} + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/VariableListDeltaTracker.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/VariableListDeltaTracker.cpp new file mode 100644 index 0000000..cbbcb2f --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/VariableListDeltaTracker.cpp @@ -0,0 +1,40 @@ +#include "VariableListDeltaTracker.h" + +using namespace RakNet; + +VariableListDeltaTracker::VariableListDeltaTracker() {nextWriteIndex=0;} +VariableListDeltaTracker::~VariableListDeltaTracker() +{ + unsigned int i; + for (i=0; i < variableList.Size(); i++) + rakFree_Ex(variableList[i].lastData,_FILE_AND_LINE_); +} + +// Call before using a series of WriteVar +void VariableListDeltaTracker::StartWrite(void) {nextWriteIndex=0;} + +void VariableListDeltaTracker::FlagDirtyFromBitArray(unsigned char *bArray) +{ + unsigned short readOffset=0; + for (readOffset=0; readOffset < variableList.Size(); readOffset++) + { + bool result = ( bArray[ readOffset >> 3 ] & ( 0x80 >> ( readOffset & 7 ) ) ) !=0; + + if (result==true) + variableList[readOffset].isDirty=true; + } +} +VariableListDeltaTracker::VariableLastValueNode::VariableLastValueNode() +{ + lastData=0; +} +VariableListDeltaTracker::VariableLastValueNode::VariableLastValueNode(const unsigned char *data, int _byteLength) +{ + lastData=(char*) rakMalloc_Ex(_byteLength,_FILE_AND_LINE_); + memcpy(lastData,data,_byteLength); + byteLength=_byteLength; + isDirty=false; +} +VariableListDeltaTracker::VariableLastValueNode::~VariableLastValueNode() +{ +} diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/VariableListDeltaTracker.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/VariableListDeltaTracker.h new file mode 100644 index 0000000..e449cd7 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/VariableListDeltaTracker.h @@ -0,0 +1,131 @@ +#include "NativeTypes.h" +#include "DS_List.h" +#include "RakMemoryOverride.h" +#include "BitStream.h" + +namespace RakNet +{ +/// Class to write a series of variables, copy the contents to memory, and return if the newly written value is different than what was last written +/// Can also encode the reads, writes, and results directly to/from a bitstream +class VariableListDeltaTracker +{ +public: + VariableListDeltaTracker(); + ~VariableListDeltaTracker(); + + // Call before using a series of WriteVar + void StartWrite(void); + + bool IsPastEndOfList(void) const {return nextWriteIndex>=variableList.Size();} + + /// Records the passed value of the variable to memory, and returns true if the value is different from the write before that (or if it is the first write) + /// \pre Call StartWrite() before doing the first of a series of calls to WriteVar or other functions that call WriteVar + /// \note Variables must be of the same type, written in the same order, each time + template + bool WriteVar(const VarType &varData) + { + RakNet::BitStream temp; + temp.Write(varData); + if (nextWriteIndex>=variableList.Size()) + { + variableList.Push(VariableLastValueNode(temp.GetData(),temp.GetNumberOfBytesUsed()),_FILE_AND_LINE_); + nextWriteIndex++; + return true; // Different because it's new + } + + if (temp.GetNumberOfBytesUsed()!=variableList[nextWriteIndex].byteLength) + { + variableList[nextWriteIndex].lastData=(char*) rakRealloc_Ex(variableList[nextWriteIndex].lastData, temp.GetNumberOfBytesUsed(),_FILE_AND_LINE_); + variableList[nextWriteIndex].byteLength=temp.GetNumberOfBytesUsed(); + memcpy(variableList[nextWriteIndex].lastData,temp.GetData(),temp.GetNumberOfBytesUsed()); + nextWriteIndex++; + variableList[nextWriteIndex].isDirty=false; + return true; // Different because the serialized size is different + } + if (variableList[nextWriteIndex].isDirty==false && memcmp(temp.GetData(),variableList[nextWriteIndex].lastData, variableList[nextWriteIndex].byteLength)==0) + { + nextWriteIndex++; + return false; // Same because not dirty and memcmp is the same + } + + variableList[nextWriteIndex].isDirty=false; + memcpy(variableList[nextWriteIndex].lastData,temp.GetData(),temp.GetNumberOfBytesUsed()); + nextWriteIndex++; + return true; // Different because dirty or memcmp was different + } + /// Calls WriteVar. If the variable has changed, writes true, and writes the variable. Otherwise writes false. + template + bool WriteVarToBitstream(const VarType &varData, RakNet::BitStream *bitStream) + { + bool wasDifferent = WriteVar(varData); + bitStream->Write(wasDifferent); + if (wasDifferent) + { + bitStream->Write(varData); + return true; + } + return false; + } + /// Calls WriteVarToBitstream(). Additionally, adds the boolean result of WriteVar() to boolean bit array + template + bool WriteVarToBitstream(const VarType &varData, RakNet::BitStream *bitStream, unsigned char *bArray, unsigned short writeOffset) + { + if (WriteVarToBitstream(varData,bitStream)==true) + { + BitSize_t numberOfBitsMod8 = writeOffset & 7; + + if ( numberOfBitsMod8 == 0 ) + bArray[ writeOffset >> 3 ] = 0x80; + else + bArray[ writeOffset >> 3 ] |= 0x80 >> ( numberOfBitsMod8 ); // Set the bit to 1 + + return true; + } + else + { + if ( ( writeOffset & 7 ) == 0 ) + bArray[ writeOffset >> 3 ] = 0; + + return false; + } + } + + /// Paired with a call to WriteVarToBitstream(), will read a variable if it had changed. Otherwise the values remains the same. + template + static bool ReadVarFromBitstream(const VarType &varData, RakNet::BitStream *bitStream) + { + bool wasWritten; + if (bitStream->Read(wasWritten)==false) + return false; + if (wasWritten) + { + if (bitStream->Read(varData)==false) + return false; + } + return wasWritten; + } + + /// Variables flagged dirty will cause WriteVar() to return true, even if the variable had not otherwise changed + /// This updates all the variables in the list, where in each index \a varsWritten is true, so will the variable at the corresponding index be flagged dirty + void FlagDirtyFromBitArray(unsigned char *bArray); + + /// \internal + struct VariableLastValueNode + { + VariableLastValueNode(); + VariableLastValueNode(const unsigned char *data, int _byteLength); + ~VariableLastValueNode(); + char *lastData; + unsigned int byteLength; + bool isDirty; + }; + +protected: + /// \internal + DataStructures::List variableList; + /// \internal + unsigned int nextWriteIndex; +}; + + +} diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/VariadicSQLParser.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/VariadicSQLParser.cpp new file mode 100644 index 0000000..c0b9204 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/VariadicSQLParser.cpp @@ -0,0 +1,150 @@ +#include "VariadicSQLParser.h" +#include "BitStream.h" +#include + +using namespace VariadicSQLParser; + +struct TypeMapping +{ + char inputType; + const char *type; +}; +const int NUM_TYPE_MAPPINGS=7; +TypeMapping typeMappings[NUM_TYPE_MAPPINGS] = +{ + {'i', "int"}, + {'d', "int"}, + {'s', "text"}, + {'b', "bool"}, + {'f', "numeric"}, + {'g', "double precision"}, + {'a', "bytea"}, +}; +unsigned int GetTypeMappingIndex(char c) +{ + unsigned int i; + for (i=0; i < (unsigned int) NUM_TYPE_MAPPINGS; i++ ) + if (typeMappings[i].inputType==c) + return i; + return (unsigned int)-1; +} +const char* VariadicSQLParser::GetTypeMappingAtIndex(int i) +{ + return typeMappings[i].type; +} +void VariadicSQLParser::GetTypeMappingIndices( const char *format, DataStructures::List &indices ) +{ + bool previousCharWasPercentSign; + unsigned int i; + unsigned int typeMappingIndex; + indices.Clear(false, _FILE_AND_LINE_); + unsigned int len = (unsigned int) strlen(format); + previousCharWasPercentSign=false; + for (i=0; i < len; i++) + { + if (previousCharWasPercentSign==true ) + { + typeMappingIndex = GetTypeMappingIndex(format[i]); + if (typeMappingIndex!=(unsigned int) -1) + { + IndexAndType iat; + iat.strIndex=i-1; + iat.typeMappingIndex=typeMappingIndex; + indices.Insert(iat, _FILE_AND_LINE_ ); + } + } + + previousCharWasPercentSign=format[i]=='%'; + } +} +void VariadicSQLParser::ExtractArguments( va_list argptr, const DataStructures::List &indices, char ***argumentBinary, int **argumentLengths ) +{ + if (indices.Size()==0) + return; + + unsigned int i; + *argumentBinary=RakNet::OP_NEW_ARRAY(indices.Size(), _FILE_AND_LINE_); + *argumentLengths=RakNet::OP_NEW_ARRAY(indices.Size(), _FILE_AND_LINE_); + + char **paramData=*argumentBinary; + int *paramLength=*argumentLengths; + + int variadicArgIndex; + for (variadicArgIndex=0, i=0; i < indices.Size(); i++, variadicArgIndex++) + { + switch (typeMappings[indices[i].typeMappingIndex].inputType) + { + case 'i': + case 'd': + { + int val = va_arg( argptr, int ); + paramLength[i]=sizeof(val); + paramData[i]=(char*) rakMalloc_Ex(paramLength[i], _FILE_AND_LINE_); + memcpy(paramData[i], &val, paramLength[i]); + if (RakNet::BitStream::IsNetworkOrder()==false) RakNet::BitStream::ReverseBytesInPlace((unsigned char*) paramData[i], paramLength[i]); + } + break; + case 's': + { + char* val = va_arg( argptr, char* ); + paramLength[i]=(int) strlen(val); + paramData[i]=(char*) rakMalloc_Ex(paramLength[i]+1, _FILE_AND_LINE_); + memcpy(paramData[i], val, paramLength[i]+1); + } + break; + case 'b': + { + bool val = (va_arg( argptr, int )!=0); + paramLength[i]=sizeof(val); + paramData[i]=(char*) rakMalloc_Ex(paramLength[i], _FILE_AND_LINE_); + memcpy(paramData[i], &val, paramLength[i]); + if (RakNet::BitStream::IsNetworkOrder()==false) RakNet::BitStream::ReverseBytesInPlace((unsigned char*) paramData[i], paramLength[i]); + } + break; + /* + case 'f': + { + // On MSVC at least, this only works with double as the 2nd param + float val = (float) va_arg( argptr, double ); + //float val = va_arg( argptr, float ); + paramLength[i]=sizeof(val); + paramData[i]=(char*) rakMalloc_Ex(paramLength[i], _FILE_AND_LINE_); + memcpy(paramData[i], &val, paramLength[i]); + if (RakNet::BitStream::IsNetworkOrder()==false) RakNet::BitStream::ReverseBytesInPlace((unsigned char*) paramData[i], paramLength[i]); + } + break; + */ + // On MSVC at least, this only works with double as the 2nd param + case 'f': + case 'g': + { + double val = va_arg( argptr, double ); + paramLength[i]=sizeof(val); + paramData[i]=(char*) rakMalloc_Ex(paramLength[i], _FILE_AND_LINE_); + memcpy(paramData[i], &val, paramLength[i]); + if (RakNet::BitStream::IsNetworkOrder()==false) RakNet::BitStream::ReverseBytesInPlace((unsigned char*) paramData[i], paramLength[i]); + } + break; + case 'a': + { + char* val = va_arg( argptr, char* ); + paramLength[i]=va_arg( argptr, unsigned int ); + paramData[i]=(char*) rakMalloc_Ex(paramLength[i], _FILE_AND_LINE_); + memcpy(paramData[i], val, paramLength[i]); + } + break; + } + } + +} +void VariadicSQLParser::FreeArguments(const DataStructures::List &indices, char **argumentBinary, int *argumentLengths) +{ + if (indices.Size()==0) + return; + + unsigned int i; + for (i=0; i < indices.Size(); i++) + rakFree_Ex(argumentBinary[i],_FILE_AND_LINE_); + RakNet::OP_DELETE_ARRAY(argumentBinary,_FILE_AND_LINE_); + RakNet::OP_DELETE_ARRAY(argumentLengths,_FILE_AND_LINE_); +} diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/VariadicSQLParser.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/VariadicSQLParser.h new file mode 100644 index 0000000..96b1c36 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/VariadicSQLParser.h @@ -0,0 +1,24 @@ +#ifndef __VARIADIC_SQL_PARSER_H +#define __VARIADIC_SQL_PARSER_H + +#include "DS_List.h" + +#include + +namespace VariadicSQLParser +{ + struct IndexAndType + { + unsigned int strIndex; + unsigned int typeMappingIndex; + }; + const char* GetTypeMappingAtIndex(int i); + void GetTypeMappingIndices( const char *format, DataStructures::List &indices ); + // Given an SQL string with variadic arguments, allocate argumentBinary and argumentLengths, and hold the parameters in binary format + // Last 2 parameters are out parameters + void ExtractArguments( va_list argptr, const DataStructures::List &indices, char ***argumentBinary, int **argumentLengths ); + void FreeArguments(const DataStructures::List &indices, char **argumentBinary, int *argumentLengths); +} + + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/VitaIncludes.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/VitaIncludes.cpp new file mode 100644 index 0000000..5e567bf --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/VitaIncludes.cpp @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/VitaIncludes.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/VitaIncludes.h new file mode 100644 index 0000000..bd70cd1 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/VitaIncludes.h @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/WSAStartupSingleton.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/WSAStartupSingleton.cpp new file mode 100644 index 0000000..f808214 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/WSAStartupSingleton.cpp @@ -0,0 +1,75 @@ +#include "WSAStartupSingleton.h" + + + + + +#if defined(_WIN32) +#include +#include + + + + + +#endif +#include "RakNetDefines.h" +#include + +int WSAStartupSingleton::refCount=0; + +WSAStartupSingleton::WSAStartupSingleton() {} +WSAStartupSingleton::~WSAStartupSingleton() {} +void WSAStartupSingleton::AddRef(void) +{ +#ifdef _WIN32 + + refCount++; + + if (refCount!=1) + return; + + + + + + WSADATA winsockInfo; + if ( WSAStartup( MAKEWORD( 2, 2 ), &winsockInfo ) != 0 ) + { +#if defined(_DEBUG) + DWORD dwIOError = GetLastError(); + LPVOID messageBuffer; + FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, dwIOError, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), // Default language + ( LPTSTR ) & messageBuffer, 0, NULL ); + // something has gone wrong here... + RAKNET_DEBUG_PRINTF( "WSAStartup failed:Error code - %d\n%s", dwIOError, messageBuffer ); + //Free the buffer. + LocalFree( messageBuffer ); +#endif + } + +#endif +} +void WSAStartupSingleton::Deref(void) +{ +#ifdef _WIN32 + if (refCount==0) + return; + + if (refCount>1) + { + refCount--; + return; + } + + WSACleanup(); + + + + + + + refCount=0; +#endif +} diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/WSAStartupSingleton.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/WSAStartupSingleton.h new file mode 100644 index 0000000..2ac9042 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/WSAStartupSingleton.h @@ -0,0 +1,16 @@ +#ifndef __WSA_STARTUP_SINGLETON_H +#define __WSA_STARTUP_SINGLETON_H + +class WSAStartupSingleton +{ +public: + WSAStartupSingleton(); + ~WSAStartupSingleton(); + static void AddRef(void); + static void Deref(void); + +protected: + static int refCount; +}; + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/WindowsIncludes.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/WindowsIncludes.h new file mode 100644 index 0000000..9396379 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/WindowsIncludes.h @@ -0,0 +1,17 @@ +#if defined(X360__) +#elif defined (_WIN32) +#include +#include +#include + +// Must always include Winsock2.h before windows.h +// or else: +// winsock2.h(99) : error C2011: 'fd_set' : 'struct' type redefinition +// winsock2.h(134) : warning C4005: 'FD_SET' : macro redefinition +// winsock.h(83) : see previous definition of 'FD_SET' +// winsock2.h(143) : error C2011: 'timeval' : 'struct' type redefinition +// winsock2.h(199) : error C2011: 'hostent' : 'struct' type redefinition +// winsock2.h(212) : error C2011: 'netent' : 'struct' type redefinition +// winsock2.h(219) : error C2011: 'servent' : 'struct' type redefinition + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/XBox360Includes.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/XBox360Includes.h new file mode 100644 index 0000000..ad3f39d --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/XBox360Includes.h @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/_FindFirst.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/_FindFirst.cpp new file mode 100644 index 0000000..8a697c1 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/_FindFirst.cpp @@ -0,0 +1,159 @@ +/** +* Original file by the_viking, fixed by R√¥mulo Fernandes, fixed by Emmanuel Nars +* Should emulate windows finddata structure +*/ +#if (defined(__GNUC__) || defined(__GCCXML__)) && !defined(_WIN32) +#include "_FindFirst.h" +#include "DS_List.h" + +#include + +#include + + +static DataStructures::List< _findinfo_t* > fileInfo; + +#include "RakMemoryOverride.h" +#include "RakAssert.h" + +/** +* _findfirst - equivalent +*/ +long _findfirst(const char *name, _finddata_t *f) +{ + RakNet::RakString nameCopy = name; + RakNet::RakString filter; + + // This is linux only, so don't bother with '\' + const char* lastSep = strrchr(name,'/'); + if(!lastSep) + { + // filter pattern only is given, search current directory. + filter = nameCopy; + nameCopy = "."; + } else + { + // strip filter pattern from directory name, leave + // trailing '/' intact. + filter = lastSep+1; + unsigned sepIndex = lastSep - name; + nameCopy.Erase(sepIndex+1, nameCopy.GetLength() - sepIndex-1); + } + + DIR* dir = opendir(nameCopy); + + if(!dir) return -1; + + _findinfo_t* fi = RakNet::OP_NEW<_findinfo_t>( _FILE_AND_LINE_ ); + fi->filter = filter; + fi->dirName = nameCopy; // we need to remember this for stat() + fi->openedDir = dir; + fileInfo.Insert(fi, _FILE_AND_LINE_); + + long ret = fileInfo.Size()-1; + + // Retrieve the first file. We cannot rely on the first item + // being '.' + if (_findnext(ret, f) == -1) return -1; + else return ret; +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +int _findnext(long h, _finddata_t *f) +{ + RakAssert(h >= 0 && h < (long)fileInfo.Size()); + if (h < 0 || h >= (long)fileInfo.Size()) return -1; + + _findinfo_t* fi = fileInfo[h]; + + while(true) + { + dirent* entry = readdir(fi->openedDir); + if(entry == 0) return -1; + + // Only report stuff matching our filter + if (fnmatch(fi->filter, entry->d_name, FNM_PATHNAME) != 0) continue; + + // To reliably determine the entry's type, we must do + // a stat... don't rely on entry->d_type, as this + // might be unavailable! + struct stat filestat; + RakNet::RakString fullPath = fi->dirName + entry->d_name; + if (stat(fullPath, &filestat) != 0) + { + RAKNET_DEBUG_PRINTF("Cannot stat %s\n", fullPath.C_String()); + continue; + } + + if (S_ISREG(filestat.st_mode)) + { + f->attrib = _A_NORMAL; + } else if (S_ISDIR(filestat.st_mode)) + { + f->attrib = _A_SUBDIR; + } else continue; // We are interested in files and + // directories only. Links currently + // are not supported. + + f->size = filestat.st_size; + strncpy(f->name, entry->d_name, STRING_BUFFER_SIZE); + + return 0; + } + + return -1; +} + + + + + +/** + * _findclose - equivalent + */ +int _findclose(long h) +{ + if (h==-1) return 0; + + if (h < 0 || h >= (long)fileInfo.Size()) + { + RakAssert(false); + return -1; + } + + _findinfo_t* fi = fileInfo[h]; + closedir(fi->openedDir); + fileInfo.RemoveAtIndex(h); + RakNet::OP_DELETE(fi, _FILE_AND_LINE_); + return 0; +} +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/_FindFirst.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/_FindFirst.h new file mode 100644 index 0000000..6305af7 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/_FindFirst.h @@ -0,0 +1,56 @@ +/// +/// Original file by the_viking, fixed by Rômulo Fernandes +/// Should emulate windows finddata structure +/// + +#ifndef GCC_FINDFIRST_H +#define GCC_FINDFIRST_H + +#if (defined(__GNUC__) || defined(__ARMCC_VERSION) || defined(__GCCXML__) || defined(__S3E__) ) && !defined(__WIN32) + +#include + +#include "RakString.h" + +#define _A_NORMAL 0x00 // Normal file +#define _A_RDONLY 0x01 // Read-only file +#define _A_HIDDEN 0x02 // Hidden file +#define _A_SYSTEM 0x04 // System file +#define _A_VOLID 0x08 // Volume ID +#define _A_SUBDIR 0x10 // Subdirectory +#define _A_ARCH 0x20 // File changed since last archive +#define FA_NORMAL 0x00 // Synonym of _A_NORMAL +#define FA_RDONLY 0x01 // Synonym of _A_RDONLY +#define FA_HIDDEN 0x02 // Synonym of _A_HIDDEN +#define FA_SYSTEM 0x04 // Synonym of _A_SYSTEM +#define FA_LABEL 0x08 // Synonym of _A_VOLID +#define FA_DIREC 0x10 // Synonym of _A_SUBDIR +#define FA_ARCH 0x20 // Synonym of _A_ARCH + + +const unsigned STRING_BUFFER_SIZE = 512; + +typedef struct _finddata_t +{ + char name[STRING_BUFFER_SIZE]; + int attrib; + unsigned long size; +} _finddata; + +/** + * Hold information about the current search + */ +typedef struct _findinfo_t +{ + DIR* openedDir; + RakNet::RakString filter; + RakNet::RakString dirName; +} _findinfo; + +long _findfirst(const char *name, _finddata_t *f); +int _findnext(long h, _finddata_t *f); +int _findclose(long h); + +#endif +#endif + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/gettimeofday.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/gettimeofday.cpp new file mode 100644 index 0000000..917330a --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/gettimeofday.cpp @@ -0,0 +1,55 @@ + + + + +#if defined(_WIN32) && !defined(__GNUC__) &&!defined(__GCCXML__) + +#include "gettimeofday.h" + +// From http://www.openasthra.com/c-tidbits/gettimeofday-function-for-windows/ + +#include "WindowsIncludes.h" + +#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS) + #define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64 +#else + #define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL +#endif + +int gettimeofday(struct timeval *tv, struct timezone *tz) +{ + FILETIME ft; + unsigned __int64 tmpres = 0; + static int tzflag; + + if (NULL != tv) + { + GetSystemTimeAsFileTime(&ft); + + tmpres |= ft.dwHighDateTime; + tmpres <<= 32; + tmpres |= ft.dwLowDateTime; + + /*converting file time to unix epoch*/ + tmpres /= 10; /*convert into microseconds*/ + tmpres -= DELTA_EPOCH_IN_MICROSECS; + tv->tv_sec = (long)(tmpres / 1000000UL); + tv->tv_usec = (long)(tmpres % 1000000UL); + } + + if (NULL != tz) + { + if (!tzflag) + { + _tzset(); + tzflag++; + } + tz->tz_minuteswest = _timezone / 60; + tz->tz_dsttime = _daylight; + } + + return 0; +} + +#endif + diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/gettimeofday.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/gettimeofday.h new file mode 100644 index 0000000..5e3b639 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/gettimeofday.h @@ -0,0 +1,56 @@ +#ifndef __GET_TIME_OF_DAY_H +#define __GET_TIME_OF_DAY_H + +#if defined(_WIN32) && !defined(__GNUC__) &&!defined(__GCCXML__) +#include < time.h > +struct timezone +{ + int tz_minuteswest; /* minutes W of Greenwich */ + int tz_dsttime; /* type of dst correction */ +}; +int gettimeofday(struct timeval *tv, struct timezone *tz); + + +#else + + + + +#include + +#include + +// Uncomment this if you need to +/* +// http://www.halcode.com/archives/2008/08/26/retrieving-system-time-gettimeofday/ +struct timezone +{ + int tz_minuteswest; + int tz_dsttime; +}; + +#ifdef __cplusplus + +void GetSystemTimeAsFileTime(FILETIME*); + +inline int gettimeofday(struct timeval* p, void* tz ) +{ + union { + long long ns100; // time since 1 Jan 1601 in 100ns units + FILETIME ft; + } now; + + GetSystemTimeAsFileTime( &(now.ft) ); + p->tv_usec=(long)((now.ns100 / 10LL) % 1000000LL ); + p->tv_sec= (long)((now.ns100-(116444736000000000LL))/10000000LL); + return 0; +} + +#else + int gettimeofday(struct timeval* p, void* tz ); +#endif +*/ + +#endif + +#endif diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/rdlmalloc-options.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/rdlmalloc-options.h new file mode 100644 index 0000000..9f2e091 --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/rdlmalloc-options.h @@ -0,0 +1,28 @@ +#ifdef _RAKNET_SUPPORT_DL_MALLOC + +#ifndef __DLMALLOC_OPTIONS_H +#define __DLMALLOC_OPTIONS_H + +#include "NativeTypes.h" +#include "Export.h" +#include +#include + +#define MSPACES 1 +#define ONLY_MSPACES 1 +#define USE_DL_PREFIX 1 +#define NO_MALLINFO 1 +// Make it threadsafe +#define USE_LOCKS 1 + +extern RAK_DLL_EXPORT void * (*dlMallocMMap) (size_t size); +extern RAK_DLL_EXPORT void * (*dlMallocDirectMMap) (size_t size); +extern RAK_DLL_EXPORT int (*dlMallocMUnmap) (void* ptr, size_t size); + +#define MMAP(s) dlMallocMMap(s) +#define MUNMAP(a, s) dlMallocMUnmap((a), (s)) +#define DIRECT_MMAP(s) dlMallocDirectMMap(s) + +#endif + +#endif // _RAKNET_SUPPORT_DL_MALLOC \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/rdlmalloc.cpp b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/rdlmalloc.cpp new file mode 100644 index 0000000..420ba6f --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/rdlmalloc.cpp @@ -0,0 +1,4161 @@ +#ifdef _RAKNET_SUPPORT_DL_MALLOC + +#include "rdlmalloc.h" + +/* --------------------------- Lock preliminaries ------------------------ */ + +/* +When locks are defined, there is one global lock, plus +one per-mspace lock. + +The global lock_ensures that mparams.magic and other unique +mparams values are initialized only once. It also protects +sequences of calls to MORECORE. In many cases sys_alloc requires +two calls, that should not be interleaved with calls by other +threads. This does not protect against direct calls to MORECORE +by other threads not using this lock, so there is still code to +cope the best we can on interference. + +Per-mspace locks surround calls to malloc, free, etc. To enable use +in layered extensions, per-mspace locks are reentrant. + +Because lock-protected regions generally have bounded times, it is +OK to use the supplied simple spinlocks in the custom versions for +x86. Spinlocks are likely to improve performance for lightly +contended applications, but worsen performance under heavy +contention. + +If USE_LOCKS is > 1, the definitions of lock routines here are +bypassed, in which case you will need to define the type MLOCK_T, +and at least INITIAL_LOCK, ACQUIRE_LOCK, RELEASE_LOCK and possibly +TRY_LOCK (which is not used in this malloc, but commonly needed in +extensions.) You must also declare a +static MLOCK_T malloc_global_mutex = { initialization values };. + +*/ + +#if USE_LOCKS == 1 + +#if USE_SPIN_LOCKS && SPIN_LOCKS_AVAILABLE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#if !defined(DL_PLATFORM_WIN32) + +/* Custom pthread-style spin locks on x86 and x64 for gcc */ +struct pthread_mlock_t { + volatile unsigned int l; + unsigned int c; + pthread_t threadid; +}; +#define MLOCK_T struct pthread_mlock_t +#define CURRENT_THREAD pthread_self() +#define INITIAL_LOCK(sl) ((sl)->threadid = 0, (sl)->l = (sl)->c = 0, 0) +#define ACQUIRE_LOCK(sl) pthread_acquire_lock(sl) +#define RELEASE_LOCK(sl) pthread_release_lock(sl) +#define TRY_LOCK(sl) pthread_try_lock(sl) +#define SPINS_PER_YIELD 63 + +static MLOCK_T malloc_global_mutex = { 0, 0, 0}; + +static FORCEINLINE int pthread_acquire_lock (MLOCK_T *sl) { + int spins = 0; + volatile unsigned int* lp = &sl->l; + for (;;) { + if (*lp != 0) { + if (sl->threadid == CURRENT_THREAD) { + ++sl->c; + return 0; + } + } + else { + /* place args to cmpxchgl in locals to evade oddities in some gccs */ + int cmp = 0; + int val = 1; + int ret; + __asm__ __volatile__ ("lock; cmpxchgl %1, %2" + : "=a" (ret) + : "r" (val), "m" (*(lp)), "0"(cmp) + : "memory", "cc"); + if (!ret) { + assert(!sl->threadid); + sl->threadid = CURRENT_THREAD; + sl->c = 1; + return 0; + } + } + if ((++spins & SPINS_PER_YIELD) == 0) { +#if defined (__SVR4) && defined (__sun) /* solaris */ + thr_yield(); +#else +#if defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__) + sched_yield(); +#else /* no-op yield on unknown systems */ + ; +#endif /* __linux__ || __FreeBSD__ || __APPLE__ */ +#endif /* solaris */ + } + } +} + +static FORCEINLINE void pthread_release_lock (MLOCK_T *sl) { + volatile unsigned int* lp = &sl->l; + assert(*lp != 0); + assert(sl->threadid == CURRENT_THREAD); + if (--sl->c == 0) { + sl->threadid = 0; + int prev = 0; + int ret; + __asm__ __volatile__ ("lock; xchgl %0, %1" + : "=r" (ret) + : "m" (*(lp)), "0"(prev) + : "memory"); + } +} + +static FORCEINLINE int pthread_try_lock (MLOCK_T *sl) { + volatile unsigned int* lp = &sl->l; + if (*lp != 0) { + if (sl->threadid == CURRENT_THREAD) { + ++sl->c; + return 1; + } + } + else { + int cmp = 0; + int val = 1; + int ret; + __asm__ __volatile__ ("lock; cmpxchgl %1, %2" + : "=a" (ret) + : "r" (val), "m" (*(lp)), "0"(cmp) + : "memory", "cc"); + if (!ret) { + assert(!sl->threadid); + sl->threadid = CURRENT_THREAD; + sl->c = 1; + return 1; + } + } + return 0; +} + + +#else /* DL_PLATFORM_WIN32 */ +/* Custom win32-style spin locks on x86 and x64 for MSC */ +struct win32_mlock_t { + volatile long l; + unsigned int c; + long threadid; +}; + +#define MLOCK_T struct win32_mlock_t +#define CURRENT_THREAD GetCurrentThreadId() +#define INITIAL_LOCK(sl) ((sl)->threadid = 0, (sl)->l = (sl)->c = 0, 0) +#define ACQUIRE_LOCK(sl) win32_acquire_lock(sl) +#define RELEASE_LOCK(sl) win32_release_lock(sl) +#define TRY_LOCK(sl) win32_try_lock(sl) +#define SPINS_PER_YIELD 63 + +static MLOCK_T malloc_global_mutex = { 0, 0, 0}; + +static FORCEINLINE int win32_acquire_lock (MLOCK_T *sl) { + int spins = 0; + for (;;) { + if (sl->l != 0) { + if (sl->threadid == CURRENT_THREAD) { + ++sl->c; + return 0; + } + } + else { + if (!interlockedexchange(&sl->l, 1)) { + assert(!sl->threadid); + sl->threadid = CURRENT_THREAD; + sl->c = 1; + return 0; + } + } + if ((++spins & SPINS_PER_YIELD) == 0) + SleepEx(0, FALSE); + } +} + +static FORCEINLINE void win32_release_lock (MLOCK_T *sl) { + assert(sl->threadid == CURRENT_THREAD); + assert(sl->l != 0); + if (--sl->c == 0) { + sl->threadid = 0; + interlockedexchange (&sl->l, 0); + } +} + +static FORCEINLINE int win32_try_lock (MLOCK_T *sl) { + if (sl->l != 0) { + if (sl->threadid == CURRENT_THREAD) { + ++sl->c; + return 1; + } + } + else { + if (!interlockedexchange(&sl->l, 1)){ + assert(!sl->threadid); + sl->threadid = CURRENT_THREAD; + sl->c = 1; + return 1; + } + } + return 0; +} + +#endif /* DL_PLATFORM_WIN32 */ +#else /* USE_SPIN_LOCKS */ + +#ifndef DL_PLATFORM_WIN32 +/* pthreads-based locks */ + +#define MLOCK_T pthread_mutex_t +#define CURRENT_THREAD pthread_self() +#define INITIAL_LOCK(sl) pthread_init_lock(sl) +#define ACQUIRE_LOCK(sl) pthread_mutex_lock(sl) +#define RELEASE_LOCK(sl) pthread_mutex_unlock(sl) +#define TRY_LOCK(sl) (!pthread_mutex_trylock(sl)) + +static MLOCK_T malloc_global_mutex = PTHREAD_MUTEX_INITIALIZER; + +/* Cope with old-style linux recursive lock initialization by adding */ +/* skipped internal declaration from pthread.h */ +#ifdef linux +#ifndef PTHREAD_MUTEX_RECURSIVE +extern int pthread_mutexattr_setkind_np __P ((pthread_mutexattr_t *__attr, + int __kind)); +#define PTHREAD_MUTEX_RECURSIVE PTHREAD_MUTEX_RECURSIVE_NP +#define pthread_mutexattr_settype(x,y) pthread_mutexattr_setkind_np(x,y) +#endif +#endif + +static int pthread_init_lock (MLOCK_T *sl) { + pthread_mutexattr_t attr; + if (pthread_mutexattr_init(&attr)) return 1; + if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE)) return 1; + if (pthread_mutex_init(sl, &attr)) return 1; + if (pthread_mutexattr_destroy(&attr)) return 1; + return 0; +} + +#else /* DL_PLATFORM_WIN32 */ +/* Win32 critical sections */ +#define MLOCK_T CRITICAL_SECTION +#define CURRENT_THREAD GetCurrentThreadId() +#define INITIAL_LOCK(s) (!InitializeCriticalSectionAndSpinCount((s), 0x80000000|4000)) +#define ACQUIRE_LOCK(s) (EnterCriticalSection(sl), 0) +#define RELEASE_LOCK(s) LeaveCriticalSection(sl) +#define TRY_LOCK(s) TryEnterCriticalSection(sl) +#define NEED_GLOBAL_LOCK_INIT + +static MLOCK_T malloc_global_mutex; +static volatile long malloc_global_mutex_status; + +/* Use spin loop to initialize global lock */ +static void init_malloc_global_mutex() { + for (;;) { + long stat = malloc_global_mutex_status; + if (stat > 0) + return; + /* transition to < 0 while initializing, then to > 0) */ + if (stat == 0 && + interlockedcompareexchange(&malloc_global_mutex_status, -1, 0) == 0) { + InitializeCriticalSection(&malloc_global_mutex); + interlockedexchange(&malloc_global_mutex_status,1); + return; + } + SleepEx(0, FALSE); + } +} + +#endif /* DL_PLATFORM_WIN32 */ +#endif /* USE_SPIN_LOCKS */ +#endif /* USE_LOCKS == 1 */ + +/* ----------------------- User-defined locks ------------------------ */ + +#if USE_LOCKS > 1 +/* Define your own lock implementation here */ +/* #define INITIAL_LOCK(sl) ... */ +/* #define ACQUIRE_LOCK(sl) ... */ +/* #define RELEASE_LOCK(sl) ... */ +/* #define TRY_LOCK(sl) ... */ +/* static MLOCK_T malloc_global_mutex = ... */ +#endif /* USE_LOCKS > 1 */ + +/* ----------------------- Lock-based state ------------------------ */ + +#if USE_LOCKS +#define USE_LOCK_BIT (2U) +#else /* USE_LOCKS */ +#define USE_LOCK_BIT (0U) +#define INITIAL_LOCK(l) +#endif /* USE_LOCKS */ + +#if USE_LOCKS +#ifndef ACQUIRE_MALLOC_GLOBAL_LOCK +#define ACQUIRE_MALLOC_GLOBAL_LOCK() ACQUIRE_LOCK(&malloc_global_mutex); +#endif +#ifndef RELEASE_MALLOC_GLOBAL_LOCK +#define RELEASE_MALLOC_GLOBAL_LOCK() RELEASE_LOCK(&malloc_global_mutex); +#endif +#else /* USE_LOCKS */ +#define ACQUIRE_MALLOC_GLOBAL_LOCK() +#define RELEASE_MALLOC_GLOBAL_LOCK() +#endif /* USE_LOCKS */ + + +/* ----------------------- Chunk representations ------------------------ */ + +/* +(The following includes lightly edited explanations by Colin Plumb.) + +The malloc_chunk declaration below is misleading (but accurate and +necessary). It declares a "view" into memory allowing access to +necessary fields at known offsets from a given base. + +Chunks of memory are maintained using a `boundary tag' method as +originally described by Knuth. (See the paper by Paul Wilson +ftp://ftp.cs.utexas.edu/pub/garbage/allocsrv.ps for a survey of such +techniques.) Sizes of free chunks are stored both in the front of +each chunk and at the end. This makes consolidating fragmented +chunks into bigger chunks fast. The head fields also hold bits +representing whether chunks are free or in use. + +Here are some pictures to make it clearer. They are "exploded" to +show that the state of a chunk can be thought of as extending from +the high 31 bits of the head field of its header through the +prev_foot and PINUSE_BIT bit of the following chunk header. + +A chunk that's in use looks like: + +chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Size of previous chunk (if P = 0) | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P| +| Size of this chunk 1| +-+ +mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| | ++- -+ +| | ++- -+ +| : ++- size - sizeof(size_t) available payload bytes -+ +: | +chunk-> +- -+ +| | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |1| +| Size of next chunk (may or may not be in use) | +-+ +mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +And if it's free, it looks like this: + +chunk-> +- -+ +| User payload (must be in use, or we would have merged!) | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P| +| Size of this chunk 0| +-+ +mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Next pointer | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Prev pointer | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| : ++- size - sizeof(struct chunk) unused bytes -+ +: | +chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Size of this chunk | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |0| +| Size of next chunk (must be in use, or we would have merged)| +-+ +mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| : ++- User payload -+ +: | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +|0| ++-+ +Note that since we always merge adjacent free chunks, the chunks +adjacent to a free chunk must be in use. + +Given a pointer to a chunk (which can be derived trivially from the +payload pointer) we can, in O(1) time, find out whether the adjacent +chunks are free, and if so, unlink them from the lists that they +are on and merge them with the current chunk. + +Chunks always begin on even word boundaries, so the mem portion +(which is returned to the user) is also on an even word boundary, and +thus at least double-word aligned. + +The P (PINUSE_BIT) bit, stored in the unused low-order bit of the +chunk size (which is always a multiple of two words), is an in-use +bit for the *previous* chunk. If that bit is *clear*, then the +word before the current chunk size contains the previous chunk +size, and can be used to find the front of the previous chunk. +The very first chunk allocated always has this bit set, preventing +access to non-existent (or non-owned) memory. If pinuse is set for +any given chunk, then you CANNOT determine the size of the +previous chunk, and might even get a memory addressing fault when +trying to do so. + +The C (CINUSE_BIT) bit, stored in the unused second-lowest bit of +the chunk size redundantly records whether the current chunk is +inuse (unless the chunk is mmapped). This redundancy enables usage +checks within free and realloc, and reduces indirection when freeing +and consolidating chunks. + +Each freshly allocated chunk must have both cinuse and pinuse set. +That is, each allocated chunk borders either a previously allocated +and still in-use chunk, or the base of its memory arena. This is +ensured by making all allocations from the the `lowest' part of any +found chunk. Further, no free chunk physically borders another one, +so each free chunk is known to be preceded and followed by either +inuse chunks or the ends of memory. + +Note that the `foot' of the current chunk is actually represented +as the prev_foot of the NEXT chunk. This makes it easier to +deal with alignments etc but can be very confusing when trying +to extend or adapt this code. + +The exceptions to all this are + +1. The special chunk `top' is the top-most available chunk (i.e., +the one bordering the end of available memory). It is treated +specially. Top is never included in any bin, is used only if +no other chunk is available, and is released back to the +system if it is very large (see M_TRIM_THRESHOLD). In effect, +the top chunk is treated as larger (and thus less well +fitting) than any other available chunk. The top chunk +doesn't update its trailing size field since there is no next +contiguous chunk that would have to index off it. However, +space is still allocated for it (TOP_FOOT_SIZE) to enable +separation or merging when space is extended. + +3. Chunks allocated via mmap, have both cinuse and pinuse bits +cleared in their head fields. Because they are allocated +one-by-one, each must carry its own prev_foot field, which is +also used to hold the offset this chunk has within its mmapped +region, which is needed to preserve alignment. Each mmapped +chunk is trailed by the first two fields of a fake next-chunk +for sake of usage checks. + +*/ + +struct malloc_chunk { + size_t prev_foot; /* Size of previous chunk (if free). */ + size_t head; /* Size and inuse bits. */ + struct malloc_chunk* fd; /* double links -- used only if free. */ + struct malloc_chunk* bk; +}; + +typedef struct malloc_chunk mchunk; +typedef struct malloc_chunk* mchunkptr; +typedef struct malloc_chunk* sbinptr; /* The type of bins of chunks */ +typedef unsigned int bindex_t; /* Described below */ +typedef unsigned int binmap_t; /* Described below */ +typedef unsigned int flag_t; /* The type of various bit flag sets */ + +/* ------------------- Chunks sizes and alignments ----------------------- */ + +#define MCHUNK_SIZE (sizeof(mchunk)) + +#if FOOTERS +#define CHUNK_OVERHEAD (TWO_SIZE_T_SIZES) +#else /* FOOTERS */ +#define CHUNK_OVERHEAD (SIZE_T_SIZE) +#endif /* FOOTERS */ + +/* MMapped chunks need a second word of overhead ... */ +#define MMAP_CHUNK_OVERHEAD (TWO_SIZE_T_SIZES) +/* ... and additional padding for fake next-chunk at foot */ +#define MMAP_FOOT_PAD (FOUR_SIZE_T_SIZES) + +/* The smallest size we can malloc is an aligned minimal chunk */ +#define MIN_CHUNK_SIZE\ + ((MCHUNK_SIZE + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK) + +/* conversion from malloc headers to user pointers, and back */ +#define chunk2mem(p) ((void*)((char*)(p) + TWO_SIZE_T_SIZES)) +#define mem2chunk(mem) ((mchunkptr)((char*)(mem) - TWO_SIZE_T_SIZES)) +/* chunk associated with aligned address A */ +#define align_as_chunk(A) (mchunkptr)((A) + align_offset(chunk2mem(A))) + +/* Bounds on request (not chunk) sizes. */ +#define MAX_REQUEST ((-MIN_CHUNK_SIZE) << 2) +#define MIN_REQUEST (MIN_CHUNK_SIZE - CHUNK_OVERHEAD - SIZE_T_ONE) + +/* pad request bytes into a usable size */ +#define pad_request(req) \ + (((req) + CHUNK_OVERHEAD + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK) + +/* pad request, checking for minimum (but not maximum) */ +#define request2size(req) \ + (((req) < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(req)) + + +/* ------------------ Operations on head and foot fields ----------------- */ + +/* +The head field of a chunk is or'ed with PINUSE_BIT when previous +adjacent chunk in use, and or'ed with CINUSE_BIT if this chunk is in +use, unless mmapped, in which case both bits are cleared. + +FLAG4_BIT is not used by this malloc, but might be useful in extensions. +*/ + +#define PINUSE_BIT (SIZE_T_ONE) +#define CINUSE_BIT (SIZE_T_TWO) +#define FLAG4_BIT (SIZE_T_FOUR) +#define INUSE_BITS (PINUSE_BIT|CINUSE_BIT) +#define FLAG_BITS (PINUSE_BIT|CINUSE_BIT|FLAG4_BIT) + +/* Head value for fenceposts */ +#define FENCEPOST_HEAD (INUSE_BITS|SIZE_T_SIZE) + +/* extraction of fields from head words */ +#define cinuse(p) ((p)->head & CINUSE_BIT) +#define pinuse(p) ((p)->head & PINUSE_BIT) +#define is_inuse(p) (((p)->head & INUSE_BITS) != PINUSE_BIT) +#define is_mmapped(p) (((p)->head & INUSE_BITS) == 0) + +#define chunksize(p) ((p)->head & ~(FLAG_BITS)) + +#define clear_pinuse(p) ((p)->head &= ~PINUSE_BIT) + +/* Treat space at ptr +/- offset as a chunk */ +#define chunk_plus_offset(p, s) ((mchunkptr)(((char*)(p)) + (s))) +#define chunk_minus_offset(p, s) ((mchunkptr)(((char*)(p)) - (s))) + +/* Ptr to next or previous physical malloc_chunk. */ +#define next_chunk(p) ((mchunkptr)( ((char*)(p)) + ((p)->head & ~FLAG_BITS))) +#define prev_chunk(p) ((mchunkptr)( ((char*)(p)) - ((p)->prev_foot) )) + +/* extract next chunk's pinuse bit */ +#define next_pinuse(p) ((next_chunk(p)->head) & PINUSE_BIT) + +/* Get/set size at footer */ +#define get_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_foot) +#define set_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_foot = (s)) + +/* Set size, pinuse bit, and foot */ +#define set_size_and_pinuse_of_free_chunk(p, s)\ + ((p)->head = (s|PINUSE_BIT), set_foot(p, s)) + +/* Set size, pinuse bit, foot, and clear next pinuse */ +#define set_free_with_pinuse(p, s, n)\ + (clear_pinuse(n), set_size_and_pinuse_of_free_chunk(p, s)) + +/* Get the internal overhead associated with chunk p */ +#define overhead_for(p)\ + (is_mmapped(p)? MMAP_CHUNK_OVERHEAD : CHUNK_OVERHEAD) + +/* Return true if malloced space is not necessarily cleared */ +#if MMAP_CLEARS +#define calloc_must_clear(p) (!is_mmapped(p)) +#else /* MMAP_CLEARS */ +#define calloc_must_clear(p) (1) +#endif /* MMAP_CLEARS */ + +/* ---------------------- Overlaid data structures ----------------------- */ + +/* +When chunks are not in use, they are treated as nodes of either +lists or trees. + +"Small" chunks are stored in circular doubly-linked lists, and look +like this: + +chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Size of previous chunk | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +`head:' | Size of chunk, in bytes |P| +mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Forward pointer to next chunk in list | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Back pointer to previous chunk in list | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Unused space (may be 0 bytes long) . +. . +. | +nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +`foot:' | Size of chunk, in bytes | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +Larger chunks are kept in a form of bitwise digital trees (aka +tries) keyed on chunksizes. Because malloc_tree_chunks are only for +free chunks greater than 256 bytes, their size doesn't impose any +constraints on user chunk sizes. Each node looks like: + +chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Size of previous chunk | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +`head:' | Size of chunk, in bytes |P| +mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Forward pointer to next chunk of same size | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Back pointer to previous chunk of same size | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Pointer to left child (child[0]) | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Pointer to right child (child[1]) | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Pointer to parent | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| bin index of this chunk | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Unused space . +. | +nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +`foot:' | Size of chunk, in bytes | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +Each tree holding treenodes is a tree of unique chunk sizes. Chunks +of the same size are arranged in a circularly-linked list, with only +the oldest chunk (the next to be used, in our FIFO ordering) +actually in the tree. (Tree members are distinguished by a non-null +parent pointer.) If a chunk with the same size an an existing node +is inserted, it is linked off the existing node using pointers that +work in the same way as fd/bk pointers of small chunks. + +Each tree contains a power of 2 sized range of chunk sizes (the +smallest is 0x100 <= x < 0x180), which is is divided in half at each +tree level, with the chunks in the smaller half of the range (0x100 +<= x < 0x140 for the top nose) in the left subtree and the larger +half (0x140 <= x < 0x180) in the right subtree. This is, of course, +done by inspecting individual bits. + +Using these rules, each node's left subtree contains all smaller +sizes than its right subtree. However, the node at the root of each +subtree has no particular ordering relationship to either. (The +dividing line between the subtree sizes is based on trie relation.) +If we remove the last chunk of a given size from the interior of the +tree, we need to replace it with a leaf node. The tree ordering +rules permit a node to be replaced by any leaf below it. + +The smallest chunk in a tree (a common operation in a best-fit +allocator) can be found by walking a path to the leftmost leaf in +the tree. Unlike a usual binary tree, where we follow left child +pointers until we reach a null, here we follow the right child +pointer any time the left one is null, until we reach a leaf with +both child pointers null. The smallest chunk in the tree will be +somewhere along that path. + +The worst case number of steps to add, find, or remove a node is +bounded by the number of bits differentiating chunks within +bins. Under current bin calculations, this ranges from 6 up to 21 +(for 32 bit sizes) or up to 53 (for 64 bit sizes). The typical case +is of course much better. +*/ + +struct malloc_tree_chunk { + /* The first four fields must be compatible with malloc_chunk */ + size_t prev_foot; + size_t head; + struct malloc_tree_chunk* fd; + struct malloc_tree_chunk* bk; + + struct malloc_tree_chunk* child[2]; + struct malloc_tree_chunk* parent; + bindex_t index; +}; + +typedef struct malloc_tree_chunk tchunk; +typedef struct malloc_tree_chunk* tchunkptr; +typedef struct malloc_tree_chunk* tbinptr; /* The type of bins of trees */ + +/* A little helper macro for trees */ +#define leftmost_child(t) ((t)->child[0] != 0? (t)->child[0] : (t)->child[1]) + +/* ----------------------------- Segments -------------------------------- */ + +/* +Each malloc space may include non-contiguous segments, held in a +list headed by an embedded malloc_segment record representing the +top-most space. Segments also include flags holding properties of +the space. Large chunks that are directly allocated by mmap are not +included in this list. They are instead independently created and +destroyed without otherwise keeping track of them. + +Segment management mainly comes into play for spaces allocated by +MMAP. Any call to MMAP might or might not return memory that is +adjacent to an existing segment. MORECORE normally contiguously +extends the current space, so this space is almost always adjacent, +which is simpler and faster to deal with. (This is why MORECORE is +used preferentially to MMAP when both are available -- see +sys_alloc.) When allocating using MMAP, we don't use any of the +hinting mechanisms (inconsistently) supported in various +implementations of unix mmap, or distinguish reserving from +committing memory. Instead, we just ask for space, and exploit +contiguity when we get it. It is probably possible to do +better than this on some systems, but no general scheme seems +to be significantly better. + +Management entails a simpler variant of the consolidation scheme +used for chunks to reduce fragmentation -- new adjacent memory is +normally prepended or appended to an existing segment. However, +there are limitations compared to chunk consolidation that mostly +reflect the fact that segment processing is relatively infrequent +(occurring only when getting memory from system) and that we +don't expect to have huge numbers of segments: + +* Segments are not indexed, so traversal requires linear scans. (It +would be possible to index these, but is not worth the extra +overhead and complexity for most programs on most platforms.) +* New segments are only appended to old ones when holding top-most +memory; if they cannot be prepended to others, they are held in +different segments. + +Except for the top-most segment of an mstate, each segment record +is kept at the tail of its segment. Segments are added by pushing +segment records onto the list headed by &mstate.seg for the +containing mstate. + +Segment flags control allocation/merge/deallocation policies: +* If EXTERN_BIT set, then we did not allocate this segment, +and so should not try to deallocate or merge with others. +(This currently holds only for the initial segment passed +into rak_create_mspace_with_base.) +* If USE_MMAP_BIT set, the segment may be merged with +other surrounding mmapped segments and trimmed/de-allocated +using munmap. +* If neither bit is set, then the segment was obtained using +MORECORE so can be merged with surrounding MORECORE'd segments +and deallocated/trimmed using MORECORE with negative arguments. +*/ + +struct malloc_segment { + char* base; /* base address */ + size_t size; /* allocated size */ + struct malloc_segment* next; /* ptr to next segment */ + flag_t sflags; /* mmap and extern flag */ +}; + +#define is_mmapped_segment(S) ((S)->sflags & USE_MMAP_BIT) +#define is_extern_segment(S) ((S)->sflags & EXTERN_BIT) + +typedef struct malloc_segment msegment; +typedef struct malloc_segment* msegmentptr; + +/* ---------------------------- malloc_state ----------------------------- */ + +/* +A malloc_state holds all of the bookkeeping for a space. +The main fields are: + +Top +The topmost chunk of the currently active segment. Its size is +cached in topsize. The actual size of topmost space is +topsize+TOP_FOOT_SIZE, which includes space reserved for adding +fenceposts and segment records if necessary when getting more +space from the system. The size at which to autotrim top is +cached from mparams in trim_check, except that it is disabled if +an autotrim fails. + +Designated victim (dv) +This is the preferred chunk for servicing small requests that +don't have exact fits. It is normally the chunk split off most +recently to service another small request. Its size is cached in +dvsize. The link fields of this chunk are not maintained since it +is not kept in a bin. + +SmallBins +An array of bin headers for free chunks. These bins hold chunks +with sizes less than MIN_LARGE_SIZE bytes. Each bin contains +chunks of all the same size, spaced 8 bytes apart. To simplify +use in double-linked lists, each bin header acts as a malloc_chunk +pointing to the real first node, if it exists (else pointing to +itself). This avoids special-casing for headers. But to avoid +waste, we allocate only the fd/bk pointers of bins, and then use +repositioning tricks to treat these as the fields of a chunk. + +TreeBins +Treebins are pointers to the roots of trees holding a range of +sizes. There are 2 equally spaced treebins for each power of two +from TREE_SHIFT to TREE_SHIFT+16. The last bin holds anything +larger. + +Bin maps +There is one bit map for small bins ("smallmap") and one for +treebins ("treemap). Each bin sets its bit when non-empty, and +clears the bit when empty. Bit operations are then used to avoid +bin-by-bin searching -- nearly all "search" is done without ever +looking at bins that won't be selected. The bit maps +conservatively use 32 bits per map word, even if on 64bit system. +For a good description of some of the bit-based techniques used +here, see Henry S. Warren Jr's book "Hacker's Delight" (and +supplement at http://hackersdelight.org/). Many of these are +intended to reduce the branchiness of paths through malloc etc, as +well as to reduce the number of memory locations read or written. + +Segments +A list of segments headed by an embedded malloc_segment record +representing the initial space. + +Address check support +The least_addr field is the least address ever obtained from +MORECORE or MMAP. Attempted frees and reallocs of any address less +than this are trapped (unless INSECURE is defined). + +Magic tag +A cross-check field that should always hold same value as mparams.magic. + +Flags +Bits recording whether to use MMAP, locks, or contiguous MORECORE + +Statistics +Each space keeps track of current and maximum system memory +obtained via MORECORE or MMAP. + +Trim support +Fields holding the amount of unused topmost memory that should trigger +timming, and a counter to force periodic scanning to release unused +non-topmost segments. + +Locking +If USE_LOCKS is defined, the "mutex" lock is acquired and released +around every public call using this mspace. + +Extension support +A void* pointer and a size_t field that can be used to help implement +extensions to this malloc. +*/ + +/* Bin types, widths and sizes */ +#define NSMALLBINS (32U) +#define NTREEBINS (32U) +#define SMALLBIN_SHIFT (3U) +#define SMALLBIN_WIDTH (SIZE_T_ONE << SMALLBIN_SHIFT) +#define TREEBIN_SHIFT (8U) +#define MIN_LARGE_SIZE (SIZE_T_ONE << TREEBIN_SHIFT) +#define MAX_SMALL_SIZE (MIN_LARGE_SIZE - SIZE_T_ONE) +#define MAX_SMALL_REQUEST (MAX_SMALL_SIZE - CHUNK_ALIGN_MASK - CHUNK_OVERHEAD) + +struct malloc_state { + binmap_t smallmap; + binmap_t treemap; + size_t dvsize; + size_t topsize; + char* least_addr; + mchunkptr dv; + mchunkptr top; + size_t trim_check; + size_t release_checks; + size_t magic; + mchunkptr smallbins[(NSMALLBINS+1)*2]; + tbinptr treebins[NTREEBINS]; + size_t footprint; + size_t max_footprint; + flag_t mflags; +#if USE_LOCKS + MLOCK_T mutex; /* locate lock among fields that rarely change */ +#endif /* USE_LOCKS */ + msegment seg; + void* extp; /* Unused but available for extensions */ + size_t exts; +}; + +typedef struct malloc_state* mstate; + +/* ------------- Global malloc_state and malloc_params ------------------- */ + +/* +malloc_params holds global properties, including those that can be +dynamically set using mallopt. There is a single instance, mparams, +initialized in init_mparams. Note that the non-zeroness of "magic" +also serves as an initialization flag. +*/ + +struct malloc_params { + volatile size_t magic; + size_t page_size; + size_t granularity; + size_t mmap_threshold; + size_t trim_threshold; + flag_t default_mflags; +}; + +static struct malloc_params mparams; + +/* Ensure mparams initialized */ +#define ensure_initialization() (void)(mparams.magic != 0 || init_mparams()) + +#if !ONLY_MSPACES + +/* The global malloc_state used for all non-"mspace" calls */ +static struct malloc_state _gm_; +#define gm (&_gm_) +#define is_global(M) ((M) == &_gm_) + +#endif /* !ONLY_MSPACES */ + +#define is_initialized(M) ((M)->top != 0) + +/* -------------------------- system alloc setup ------------------------- */ + +/* Operations on mflags */ + +#define use_lock(M) ((M)->mflags & USE_LOCK_BIT) +#define enable_lock(M) ((M)->mflags |= USE_LOCK_BIT) +#define disable_lock(M) ((M)->mflags &= ~USE_LOCK_BIT) + +#define use_mmap(M) ((M)->mflags & USE_MMAP_BIT) +#define enable_mmap(M) ((M)->mflags |= USE_MMAP_BIT) +#define disable_mmap(M) ((M)->mflags &= ~USE_MMAP_BIT) + +#define use_noncontiguous(M) ((M)->mflags & USE_NONCONTIGUOUS_BIT) +#define disable_contiguous(M) ((M)->mflags |= USE_NONCONTIGUOUS_BIT) + +#define set_lock(M,L)\ + ((M)->mflags = (L)?\ + ((M)->mflags | USE_LOCK_BIT) :\ + ((M)->mflags & ~USE_LOCK_BIT)) + +/* page-align a size */ +#define page_align(S)\ + (((S) + (mparams.page_size - SIZE_T_ONE)) & ~(mparams.page_size - SIZE_T_ONE)) + +/* granularity-align a size */ +#define granularity_align(S)\ + (((S) + (mparams.granularity - SIZE_T_ONE))\ + & ~(mparams.granularity - SIZE_T_ONE)) + + +/* For mmap, use granularity alignment on windows, else page-align */ +#ifdef DL_PLATFORM_WIN32 +#define mmap_align(S) granularity_align(S) +#else +#define mmap_align(S) page_align(S) +#endif + +/* For sys_alloc, enough padding to ensure can malloc request on success */ +#define SYS_ALLOC_PADDING (TOP_FOOT_SIZE + MALLOC_ALIGNMENT) + +#define is_page_aligned(S)\ + (((size_t)(S) & (mparams.page_size - SIZE_T_ONE)) == 0) +#define is_granularity_aligned(S)\ + (((size_t)(S) & (mparams.granularity - SIZE_T_ONE)) == 0) + +/* True if segment S holds address A */ +#define segment_holds(S, A)\ + ((char*)(A) >= S->base && (char*)(A) < S->base + S->size) + +/* Return segment holding given address */ +static msegmentptr segment_holding(mstate m, char* addr) { + msegmentptr sp = &m->seg; + for (;;) { + if (addr >= sp->base && addr < sp->base + sp->size) + return sp; + if ((sp = sp->next) == 0) + return 0; + } +} + +/* Return true if segment contains a segment link */ +static int has_segment_link(mstate m, msegmentptr ss) { + msegmentptr sp = &m->seg; + for (;;) { + if ((char*)sp >= ss->base && (char*)sp < ss->base + ss->size) + return 1; + if ((sp = sp->next) == 0) + return 0; + } +} + +#ifndef MORECORE_CANNOT_TRIM +#define should_trim(M,s) ((s) > (M)->trim_check) +#else /* MORECORE_CANNOT_TRIM */ +#define should_trim(M,s) (0) +#endif /* MORECORE_CANNOT_TRIM */ + +/* +TOP_FOOT_SIZE is padding at the end of a segment, including space +that may be needed to place segment records and fenceposts when new +noncontiguous segments are added. +*/ +#define TOP_FOOT_SIZE\ + (align_offset(chunk2mem(0))+pad_request(sizeof(struct malloc_segment))+MIN_CHUNK_SIZE) + + +/* ------------------------------- Hooks -------------------------------- */ + +/* +PREACTION should be defined to return 0 on success, and nonzero on +failure. If you are not using locking, you can redefine these to do +anything you like. +*/ + +#if USE_LOCKS + +#define PREACTION(M) ((use_lock(M))? ACQUIRE_LOCK(&(M)->mutex) : 0) +#define POSTACTION(M) { if (use_lock(M)) RELEASE_LOCK(&(M)->mutex); } +#else /* USE_LOCKS */ + +#ifndef PREACTION +#define PREACTION(M) (0) +#endif /* PREACTION */ + +#ifndef POSTACTION +#define POSTACTION(M) +#endif /* POSTACTION */ + +#endif /* USE_LOCKS */ + +/* +CORRUPTION_ERROR_ACTION is triggered upon detected bad addresses. +USAGE_ERROR_ACTION is triggered on detected bad frees and +reallocs. The argument p is an address that might have triggered the +fault. It is ignored by the two predefined actions, but might be +useful in custom actions that try to help diagnose errors. +*/ + +#if PROCEED_ON_ERROR + +/* A count of the number of corruption errors causing resets */ +int malloc_corruption_error_count; + +/* default corruption action */ +static void reset_on_error(mstate m); + +#define CORRUPTION_ERROR_ACTION(m) reset_on_error(m) +#define USAGE_ERROR_ACTION(m, p) + +#else /* PROCEED_ON_ERROR */ + +#ifndef CORRUPTION_ERROR_ACTION +#define CORRUPTION_ERROR_ACTION(m) ABORT +#endif /* CORRUPTION_ERROR_ACTION */ + +#ifndef USAGE_ERROR_ACTION +#define USAGE_ERROR_ACTION(m,p) ABORT +#endif /* USAGE_ERROR_ACTION */ + +#endif /* PROCEED_ON_ERROR */ + +/* -------------------------- Debugging setup ---------------------------- */ + +#if ! DEBUG + +#define check_free_chunk(M,P) +#define check_inuse_chunk(M,P) +#define check_malloced_chunk(M,P,N) +#define check_mmapped_chunk(M,P) +#define check_malloc_state(M) +#define check_top_chunk(M,P) + +#else /* DEBUG */ +#define check_free_chunk(M,P) do_check_free_chunk(M,P) +#define check_inuse_chunk(M,P) do_check_inuse_chunk(M,P) +#define check_top_chunk(M,P) do_check_top_chunk(M,P) +#define check_malloced_chunk(M,P,N) do_check_malloced_chunk(M,P,N) +#define check_mmapped_chunk(M,P) do_check_mmapped_chunk(M,P) +#define check_malloc_state(M) do_check_malloc_state(M) + +static void do_check_any_chunk(mstate m, mchunkptr p); +static void do_check_top_chunk(mstate m, mchunkptr p); +static void do_check_mmapped_chunk(mstate m, mchunkptr p); +static void do_check_inuse_chunk(mstate m, mchunkptr p); +static void do_check_free_chunk(mstate m, mchunkptr p); +static void do_check_malloced_chunk(mstate m, void* mem, size_t s); +static void do_check_tree(mstate m, tchunkptr t); +static void do_check_treebin(mstate m, bindex_t i); +static void do_check_smallbin(mstate m, bindex_t i); +static void do_check_malloc_state(mstate m); +static int bin_find(mstate m, mchunkptr x); +static size_t traverse_and_check(mstate m); +#endif /* DEBUG */ + +/* ---------------------------- Indexing Bins ---------------------------- */ + +#define is_small(s) (((s) >> SMALLBIN_SHIFT) < NSMALLBINS) +#define small_index(s) ((s) >> SMALLBIN_SHIFT) +#define small_index2size(i) ((i) << SMALLBIN_SHIFT) +#define MIN_SMALL_INDEX (small_index(MIN_CHUNK_SIZE)) + +/* addressing by index. See above about smallbin repositioning */ +#define smallbin_at(M, i) ((sbinptr)((char*)&((M)->smallbins[(i)<<1]))) +#define treebin_at(M,i) (&((M)->treebins[i])) + +/* assign tree index for size S to variable I. Use x86 asm if possible */ +#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) +#define compute_tree_index(S, I)\ +{\ + unsigned int X = S >> TREEBIN_SHIFT;\ + if (X == 0)\ + I = 0;\ + else if (X > 0xFFFF)\ + I = NTREEBINS-1;\ + else {\ + unsigned int K;\ + __asm__("bsrl\t%1, %0\n\t" : "=r" (K) : "g" (X));\ + I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\ +}\ +} + +#elif defined (__INTEL_COMPILER) +#define compute_tree_index(S, I)\ +{\ + size_t X = S >> TREEBIN_SHIFT;\ + if (X == 0)\ + I = 0;\ + else if (X > 0xFFFF)\ + I = NTREEBINS-1;\ + else {\ + unsigned int K = _bit_scan_reverse (X); \ + I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\ +}\ +} + +#elif defined(_MSC_VER) && _MSC_VER>=1300 && defined(DL_PLATFORM_WIN32) +#define compute_tree_index(S, I)\ +{\ + size_t X = S >> TREEBIN_SHIFT;\ + if (X == 0)\ + I = 0;\ + else if (X > 0xFFFF)\ + I = NTREEBINS-1;\ + else {\ + unsigned int K;\ + _BitScanReverse((DWORD *) &K, X);\ + I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\ +}\ +} + +#else /* GNUC */ +#define compute_tree_index(S, I)\ +{\ + size_t X = S >> TREEBIN_SHIFT;\ + if (X == 0)\ + I = 0;\ + else if (X > 0xFFFF)\ + I = NTREEBINS-1;\ + else {\ + unsigned int Y = (unsigned int)X;\ + unsigned int N = ((Y - 0x100) >> 16) & 8;\ + unsigned int K = (((Y <<= N) - 0x1000) >> 16) & 4;\ + N += K;\ + N += K = (((Y <<= K) - 0x4000) >> 16) & 2;\ + K = 14 - N + ((Y <<= K) >> 15);\ + I = (K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1));\ +}\ +} +#endif /* GNUC */ + +/* Bit representing maximum resolved size in a treebin at i */ +#define bit_for_tree_index(i) \ + (i == NTREEBINS-1)? (SIZE_T_BITSIZE-1) : (((i) >> 1) + TREEBIN_SHIFT - 2) + +/* Shift placing maximum resolved bit in a treebin at i as sign bit */ +#define leftshift_for_tree_index(i) \ + ((i == NTREEBINS-1)? 0 : \ + ((SIZE_T_BITSIZE-SIZE_T_ONE) - (((i) >> 1) + TREEBIN_SHIFT - 2))) + +/* The size of the smallest chunk held in bin with index i */ +#define minsize_for_tree_index(i) \ + ((SIZE_T_ONE << (((i) >> 1) + TREEBIN_SHIFT)) | \ + (((size_t)((i) & SIZE_T_ONE)) << (((i) >> 1) + TREEBIN_SHIFT - 1))) + + +/* ------------------------ Operations on bin maps ----------------------- */ + +/* bit corresponding to given index */ +#define idx2bit(i) ((binmap_t)(1) << (i)) + +/* Mark/Clear bits with given index */ +#define mark_smallmap(M,i) ((M)->smallmap |= idx2bit(i)) +#define clear_smallmap(M,i) ((M)->smallmap &= ~idx2bit(i)) +#define smallmap_is_marked(M,i) ((M)->smallmap & idx2bit(i)) + +#define mark_treemap(M,i) ((M)->treemap |= idx2bit(i)) +#define clear_treemap(M,i) ((M)->treemap &= ~idx2bit(i)) +#define treemap_is_marked(M,i) ((M)->treemap & idx2bit(i)) + +/* isolate the least set bit of a bitmap */ +#define least_bit(x) ((x) & -(x)) + +/* mask with all bits to left of least bit of x on */ +#define left_bits(x) ((x<<1) | -(x<<1)) + +/* mask with all bits to left of or equal to least bit of x on */ +#define same_or_left_bits(x) ((x) | -(x)) + +/* index corresponding to given bit. Use x86 asm if possible */ + +#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) +#define compute_bit2idx(X, I)\ +{\ + unsigned int J;\ + __asm__("bsfl\t%1, %0\n\t" : "=r" (J) : "g" (X));\ + I = (bindex_t)J;\ +} + +#elif defined (__INTEL_COMPILER) +#define compute_bit2idx(X, I)\ +{\ + unsigned int J;\ + J = _bit_scan_forward (X); \ + I = (bindex_t)J;\ +} + +#elif defined(_MSC_VER) && _MSC_VER>=1300 && defined(DL_PLATFORM_WIN32) +#define compute_bit2idx(X, I)\ +{\ + unsigned int J;\ + _BitScanForward((DWORD *) &J, X);\ + I = (bindex_t)J;\ +} + +#elif USE_BUILTIN_FFS +#define compute_bit2idx(X, I) I = ffs(X)-1 + +#else +#define compute_bit2idx(X, I)\ +{\ + unsigned int Y = X - 1;\ + unsigned int K = Y >> (16-4) & 16;\ + unsigned int N = K; Y >>= K;\ + N += K = Y >> (8-3) & 8; Y >>= K;\ + N += K = Y >> (4-2) & 4; Y >>= K;\ + N += K = Y >> (2-1) & 2; Y >>= K;\ + N += K = Y >> (1-0) & 1; Y >>= K;\ + I = (bindex_t)(N + Y);\ +} +#endif /* GNUC */ + + +/* ----------------------- Runtime Check Support ------------------------- */ + +/* +For security, the main invariant is that malloc/free/etc never +writes to a static address other than malloc_state, unless static +malloc_state itself has been corrupted, which cannot occur via +malloc (because of these checks). In essence this means that we +believe all pointers, sizes, maps etc held in malloc_state, but +check all of those linked or offsetted from other embedded data +structures. These checks are interspersed with main code in a way +that tends to minimize their run-time cost. + +When FOOTERS is defined, in addition to range checking, we also +verify footer fields of inuse chunks, which can be used guarantee +that the mstate controlling malloc/free is intact. This is a +streamlined version of the approach described by William Robertson +et al in "Run-time Detection of Heap-based Overflows" LISA'03 +http://www.usenix.org/events/lisa03/tech/robertson.html The footer +of an inuse chunk holds the xor of its mstate and a random seed, +that is checked upon calls to free() and realloc(). This is +(probablistically) unguessable from outside the program, but can be +computed by any code successfully malloc'ing any chunk, so does not +itself provide protection against code that has already broken +security through some other means. Unlike Robertson et al, we +always dynamically check addresses of all offset chunks (previous, +next, etc). This turns out to be cheaper than relying on hashes. +*/ + +#if !INSECURE +/* Check if address a is at least as high as any from MORECORE or MMAP */ +#define ok_address(M, a) ((char*)(a) >= (M)->least_addr) +/* Check if address of next chunk n is higher than base chunk p */ +#define ok_next(p, n) ((char*)(p) < (char*)(n)) +/* Check if p has inuse status */ +#define ok_inuse(p) is_inuse(p) +/* Check if p has its pinuse bit on */ +#define ok_pinuse(p) pinuse(p) + +#else /* !INSECURE */ +#define ok_address(M, a) (1) +#define ok_next(b, n) (1) +#define ok_inuse(p) (1) +#define ok_pinuse(p) (1) +#endif /* !INSECURE */ + +#if (FOOTERS && !INSECURE) +/* Check if (alleged) mstate m has expected magic field */ +#define ok_magic(M) ((M)->magic == mparams.magic) +#else /* (FOOTERS && !INSECURE) */ +#define ok_magic(M) (1) +#endif /* (FOOTERS && !INSECURE) */ + + +/* In gcc, use __builtin_expect to minimize impact of checks */ +#if !INSECURE +#if defined(__GNUC__) && __GNUC__ >= 3 +#define RTCHECK(e) __builtin_expect(e, 1) +#else /* GNUC */ +#define RTCHECK(e) (e) +#endif /* GNUC */ +#else /* !INSECURE */ +#define RTCHECK(e) (1) +#endif /* !INSECURE */ + +/* macros to set up inuse chunks with or without footers */ + +#if !FOOTERS + +#define mark_inuse_foot(M,p,s) + +/* Macros for setting head/foot of non-mmapped chunks */ + +/* Set cinuse bit and pinuse bit of next chunk */ +#define set_inuse(M,p,s)\ + ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\ + ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT) + +/* Set cinuse and pinuse of this chunk and pinuse of next chunk */ +#define set_inuse_and_pinuse(M,p,s)\ + ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ + ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT) + +/* Set size, cinuse and pinuse bit of this chunk */ +#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\ + ((p)->head = (s|PINUSE_BIT|CINUSE_BIT)) + +#else /* FOOTERS */ + +/* Set foot of inuse chunk to be xor of mstate and seed */ +#define mark_inuse_foot(M,p,s)\ + (((mchunkptr)((char*)(p) + (s)))->prev_foot = ((size_t)(M) ^ mparams.magic)) + +#define get_mstate_for(p)\ + ((mstate)(((mchunkptr)((char*)(p) +\ + (chunksize(p))))->prev_foot ^ mparams.magic)) + +#define set_inuse(M,p,s)\ + ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\ + (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT), \ + mark_inuse_foot(M,p,s)) + +#define set_inuse_and_pinuse(M,p,s)\ + ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ + (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT),\ + mark_inuse_foot(M,p,s)) + +#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\ + ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ + mark_inuse_foot(M, p, s)) + +#endif /* !FOOTERS */ + +/* ---------------------------- setting mparams -------------------------- */ + +/* Initialize mparams */ +static int init_mparams(void) { + + if (malloc_global_mutex_status <= 0) + init_malloc_global_mutex(); + + + ACQUIRE_MALLOC_GLOBAL_LOCK(); + if (mparams.magic == 0) { + size_t magic; + size_t psize; + size_t gsize; + +#ifndef DL_PLATFORM_WIN32 + psize = malloc_getpagesize; + gsize = ((DEFAULT_GRANULARITY != 0)? DEFAULT_GRANULARITY : psize); +#else /* DL_PLATFORM_WIN32 */ + { + SYSTEM_INFO system_info; + GetSystemInfo(&system_info); + psize = system_info.dwPageSize; + gsize = ((DEFAULT_GRANULARITY != 0)? +DEFAULT_GRANULARITY : system_info.dwAllocationGranularity); + } +#endif /* DL_PLATFORM_WIN32 */ + + /* Sanity-check configuration: + size_t must be unsigned and as wide as pointer type. + ints must be at least 4 bytes. + alignment must be at least 8. + Alignment, min chunk size, and page size must all be powers of 2. + */ + if ((sizeof(size_t) != sizeof(char*)) || + (MAX_SIZE_T < MIN_CHUNK_SIZE) || + (sizeof(int) < 4) || + (MALLOC_ALIGNMENT < (size_t)8U) || + ((MALLOC_ALIGNMENT & (MALLOC_ALIGNMENT-SIZE_T_ONE)) != 0) || + ((MCHUNK_SIZE & (MCHUNK_SIZE-SIZE_T_ONE)) != 0) || + ((gsize & (gsize-SIZE_T_ONE)) != 0) || + ((psize & (psize-SIZE_T_ONE)) != 0)) + ABORT; + + mparams.granularity = gsize; + mparams.page_size = psize; + mparams.mmap_threshold = DEFAULT_MMAP_THRESHOLD; + mparams.trim_threshold = DEFAULT_TRIM_THRESHOLD; +#if MORECORE_CONTIGUOUS + mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT; +#else /* MORECORE_CONTIGUOUS */ + mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT|USE_NONCONTIGUOUS_BIT; +#endif /* MORECORE_CONTIGUOUS */ + +#if !ONLY_MSPACES + /* Set up lock for main malloc area */ + gm->mflags = mparams.default_mflags; + INITIAL_LOCK(&gm->mutex); +#endif + + { +#if USE_DEV_RANDOM + int fd; + unsigned char buf[sizeof(size_t)]; + /* Try to use /dev/urandom, else fall back on using time */ + if ((fd = open("/dev/urandom", O_RDONLY)) >= 0 && + read(fd, buf, sizeof(buf)) == sizeof(buf)) { + magic = *((size_t *) buf); + close(fd); + } + else +#endif /* USE_DEV_RANDOM */ + + + +#if defined(DL_PLATFORM_WIN32) + magic = (size_t)(GetTickCount() ^ (size_t)0x55555555U); +#else + magic = (size_t)(time(0) ^ (size_t)0x55555555U); +#endif + magic |= (size_t)8U; /* ensure nonzero */ + magic &= ~(size_t)7U; /* improve chances of fault for bad values */ + mparams.magic = magic; + } + } + + RELEASE_MALLOC_GLOBAL_LOCK(); + return 1; +} + +/* support for mallopt */ +static int change_mparam(int param_number, int value) { + size_t val; + ensure_initialization(); + val = (value == -1)? MAX_SIZE_T : (size_t)value; + switch(param_number) { + case M_TRIM_THRESHOLD: + mparams.trim_threshold = val; + return 1; + case M_GRANULARITY: + if (val >= mparams.page_size && ((val & (val-1)) == 0)) { + mparams.granularity = val; + return 1; + } + else + return 0; + case M_MMAP_THRESHOLD: + mparams.mmap_threshold = val; + return 1; + default: + return 0; + } +} + +#if DEBUG +/* ------------------------- Debugging Support --------------------------- */ + +/* Check properties of any chunk, whether free, inuse, mmapped etc */ +static void do_check_any_chunk(mstate m, mchunkptr p) { + assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); + assert(ok_address(m, p)); +} + +/* Check properties of top chunk */ +static void do_check_top_chunk(mstate m, mchunkptr p) { + msegmentptr sp = segment_holding(m, (char*)p); + size_t sz = p->head & ~INUSE_BITS; /* third-lowest bit can be set! */ + assert(sp != 0); + assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); + assert(ok_address(m, p)); + assert(sz == m->topsize); + assert(sz > 0); + assert(sz == ((sp->base + sp->size) - (char*)p) - TOP_FOOT_SIZE); + assert(pinuse(p)); + assert(!pinuse(chunk_plus_offset(p, sz))); +} + +/* Check properties of (inuse) mmapped chunks */ +static void do_check_mmapped_chunk(mstate m, mchunkptr p) { + size_t sz = chunksize(p); + size_t len = (sz + (p->prev_foot) + MMAP_FOOT_PAD); + assert(is_mmapped(p)); + assert(use_mmap(m)); + assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); + assert(ok_address(m, p)); + assert(!is_small(sz)); + assert((len & (mparams.page_size-SIZE_T_ONE)) == 0); + assert(chunk_plus_offset(p, sz)->head == FENCEPOST_HEAD); + assert(chunk_plus_offset(p, sz+SIZE_T_SIZE)->head == 0); +} + +/* Check properties of inuse chunks */ +static void do_check_inuse_chunk(mstate m, mchunkptr p) { + do_check_any_chunk(m, p); + assert(is_inuse(p)); + assert(next_pinuse(p)); + /* If not pinuse and not mmapped, previous chunk has OK offset */ + assert(is_mmapped(p) || pinuse(p) || next_chunk(prev_chunk(p)) == p); + if (is_mmapped(p)) + do_check_mmapped_chunk(m, p); +} + +/* Check properties of free chunks */ +static void do_check_free_chunk(mstate m, mchunkptr p) { + size_t sz = chunksize(p); + mchunkptr next = chunk_plus_offset(p, sz); + do_check_any_chunk(m, p); + assert(!is_inuse(p)); + assert(!next_pinuse(p)); + assert (!is_mmapped(p)); + if (p != m->dv && p != m->top) { + if (sz >= MIN_CHUNK_SIZE) { + assert((sz & CHUNK_ALIGN_MASK) == 0); + assert(is_aligned(chunk2mem(p))); + assert(next->prev_foot == sz); + assert(pinuse(p)); + assert (next == m->top || is_inuse(next)); + assert(p->fd->bk == p); + assert(p->bk->fd == p); + } + else /* markers are always of size SIZE_T_SIZE */ + assert(sz == SIZE_T_SIZE); + } +} + +/* Check properties of malloced chunks at the point they are malloced */ +static void do_check_malloced_chunk(mstate m, void* mem, size_t s) { + if (mem != 0) { + mchunkptr p = mem2chunk(mem); + size_t sz = p->head & ~INUSE_BITS; + do_check_inuse_chunk(m, p); + assert((sz & CHUNK_ALIGN_MASK) == 0); + assert(sz >= MIN_CHUNK_SIZE); + assert(sz >= s); + /* unless mmapped, size is less than MIN_CHUNK_SIZE more than request */ + assert(is_mmapped(p) || sz < (s + MIN_CHUNK_SIZE)); + } +} + +/* Check a tree and its subtrees. */ +static void do_check_tree(mstate m, tchunkptr t) { + tchunkptr head = 0; + tchunkptr u = t; + bindex_t tindex = t->index; + size_t tsize = chunksize(t); + bindex_t idx; + compute_tree_index(tsize, idx); + assert(tindex == idx); + assert(tsize >= MIN_LARGE_SIZE); + assert(tsize >= minsize_for_tree_index(idx)); + assert((idx == NTREEBINS-1) || (tsize < minsize_for_tree_index((idx+1)))); + + do { /* traverse through chain of same-sized nodes */ + do_check_any_chunk(m, ((mchunkptr)u)); + assert(u->index == tindex); + assert(chunksize(u) == tsize); + assert(!is_inuse(u)); + assert(!next_pinuse(u)); + assert(u->fd->bk == u); + assert(u->bk->fd == u); + if (u->parent == 0) { + assert(u->child[0] == 0); + assert(u->child[1] == 0); + } + else { + assert(head == 0); /* only one node on chain has parent */ + head = u; + assert(u->parent != u); + assert (u->parent->child[0] == u || + u->parent->child[1] == u || + *((tbinptr*)(u->parent)) == u); + if (u->child[0] != 0) { + assert(u->child[0]->parent == u); + assert(u->child[0] != u); + do_check_tree(m, u->child[0]); + } + if (u->child[1] != 0) { + assert(u->child[1]->parent == u); + assert(u->child[1] != u); + do_check_tree(m, u->child[1]); + } + if (u->child[0] != 0 && u->child[1] != 0) { + assert(chunksize(u->child[0]) < chunksize(u->child[1])); + } + } + u = u->fd; + } while (u != t); + assert(head != 0); +} + +/* Check all the chunks in a treebin. */ +static void do_check_treebin(mstate m, bindex_t i) { + tbinptr* tb = treebin_at(m, i); + tchunkptr t = *tb; + int empty = (m->treemap & (1U << i)) == 0; + if (t == 0) + assert(empty); + if (!empty) + do_check_tree(m, t); +} + +/* Check all the chunks in a smallbin. */ +static void do_check_smallbin(mstate m, bindex_t i) { + sbinptr b = smallbin_at(m, i); + mchunkptr p = b->bk; + unsigned int empty = (m->smallmap & (1U << i)) == 0; + if (p == b) + assert(empty); + if (!empty) { + for (; p != b; p = p->bk) { + size_t size = chunksize(p); + mchunkptr q; + /* each chunk claims to be free */ + do_check_free_chunk(m, p); + /* chunk belongs in bin */ + assert(small_index(size) == i); + assert(p->bk == b || chunksize(p->bk) == chunksize(p)); + /* chunk is followed by an inuse chunk */ + q = next_chunk(p); + if (q->head != FENCEPOST_HEAD) + do_check_inuse_chunk(m, q); + } + } +} + +/* Find x in a bin. Used in other check functions. */ +static int bin_find(mstate m, mchunkptr x) { + size_t size = chunksize(x); + if (is_small(size)) { + bindex_t sidx = small_index(size); + sbinptr b = smallbin_at(m, sidx); + if (smallmap_is_marked(m, sidx)) { + mchunkptr p = b; + do { + if (p == x) + return 1; + } while ((p = p->fd) != b); + } + } + else { + bindex_t tidx; + compute_tree_index(size, tidx); + if (treemap_is_marked(m, tidx)) { + tchunkptr t = *treebin_at(m, tidx); + size_t sizebits = size << leftshift_for_tree_index(tidx); + while (t != 0 && chunksize(t) != size) { + t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]; + sizebits <<= 1; + } + if (t != 0) { + tchunkptr u = t; + do { + if (u == (tchunkptr)x) + return 1; + } while ((u = u->fd) != t); + } + } + } + return 0; +} + +/* Traverse each chunk and check it; return total */ +static size_t traverse_and_check(mstate m) { + size_t sum = 0; + if (is_initialized(m)) { + msegmentptr s = &m->seg; + sum += m->topsize + TOP_FOOT_SIZE; + while (s != 0) { + mchunkptr q = align_as_chunk(s->base); + mchunkptr lastq = 0; + assert(pinuse(q)); + while (segment_holds(s, q) && + q != m->top && q->head != FENCEPOST_HEAD) { + sum += chunksize(q); + if (is_inuse(q)) { + assert(!bin_find(m, q)); + do_check_inuse_chunk(m, q); + } + else { + assert(q == m->dv || bin_find(m, q)); + assert(lastq == 0 || is_inuse(lastq)); /* Not 2 consecutive free */ + do_check_free_chunk(m, q); + } + lastq = q; + q = next_chunk(q); + } + s = s->next; + } + } + return sum; +} + +/* Check all properties of malloc_state. */ +static void do_check_malloc_state(mstate m) { + bindex_t i; + size_t total; + /* check bins */ + for (i = 0; i < NSMALLBINS; ++i) + do_check_smallbin(m, i); + for (i = 0; i < NTREEBINS; ++i) + do_check_treebin(m, i); + + if (m->dvsize != 0) { /* check dv chunk */ + do_check_any_chunk(m, m->dv); + assert(m->dvsize == chunksize(m->dv)); + assert(m->dvsize >= MIN_CHUNK_SIZE); + assert(bin_find(m, m->dv) == 0); + } + + if (m->top != 0) { /* check top chunk */ + do_check_top_chunk(m, m->top); + /*assert(m->topsize == chunksize(m->top)); redundant */ + assert(m->topsize > 0); + assert(bin_find(m, m->top) == 0); + } + + total = traverse_and_check(m); + assert(total <= m->footprint); + assert(m->footprint <= m->max_footprint); +} +#endif /* DEBUG */ + +/* ----------------------------- statistics ------------------------------ */ + +#if !NO_MALLINFO +static struct mallinfo internal_mallinfo(mstate m) { + struct mallinfo nm = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + ensure_initialization(); + if (!PREACTION(m)) { + check_malloc_state(m); + if (is_initialized(m)) { + size_t nfree = SIZE_T_ONE; /* top always free */ + size_t mfree = m->topsize + TOP_FOOT_SIZE; + size_t sum = mfree; + msegmentptr s = &m->seg; + while (s != 0) { + mchunkptr q = align_as_chunk(s->base); + while (segment_holds(s, q) && + q != m->top && q->head != FENCEPOST_HEAD) { + size_t sz = chunksize(q); + sum += sz; + if (!is_inuse(q)) { + mfree += sz; + ++nfree; + } + q = next_chunk(q); + } + s = s->next; + } + + nm.arena = sum; + nm.ordblks = nfree; + nm.hblkhd = m->footprint - sum; + nm.usmblks = m->max_footprint; + nm.uordblks = m->footprint - mfree; + nm.fordblks = mfree; + nm.keepcost = m->topsize; + } + + POSTACTION(m); + } + return nm; +} +#endif /* !NO_MALLINFO */ + +static void internal_malloc_stats(mstate m) { + ensure_initialization(); + if (!PREACTION(m)) { + size_t maxfp = 0; + size_t fp = 0; + size_t used = 0; + check_malloc_state(m); + if (is_initialized(m)) { + msegmentptr s = &m->seg; + maxfp = m->max_footprint; + fp = m->footprint; + used = fp - (m->topsize + TOP_FOOT_SIZE); + + while (s != 0) { + mchunkptr q = align_as_chunk(s->base); + while (segment_holds(s, q) && + q != m->top && q->head != FENCEPOST_HEAD) { + if (!is_inuse(q)) + used -= chunksize(q); + q = next_chunk(q); + } + s = s->next; + } + } + + fprintf(stderr, "max system bytes = %10lu\n", (unsigned long)(maxfp)); + fprintf(stderr, "system bytes = %10lu\n", (unsigned long)(fp)); + fprintf(stderr, "in use bytes = %10lu\n", (unsigned long)(used)); + + POSTACTION(m); + } +} + +/* ----------------------- Operations on smallbins ----------------------- */ + +/* +Various forms of linking and unlinking are defined as macros. Even +the ones for trees, which are very long but have very short typical +paths. This is ugly but reduces reliance on inlining support of +compilers. +*/ + +/* Link a free chunk into a smallbin */ +#define insert_small_chunk(M, P, S) {\ + bindex_t I = small_index(S);\ + mchunkptr B = smallbin_at(M, I);\ + mchunkptr F = B;\ + assert(S >= MIN_CHUNK_SIZE);\ + if (!smallmap_is_marked(M, I))\ + mark_smallmap(M, I);\ + else if (RTCHECK(ok_address(M, B->fd)))\ + F = B->fd;\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ +}\ + B->fd = P;\ + F->bk = P;\ + P->fd = F;\ + P->bk = B;\ +} + +/* Unlink a chunk from a smallbin */ +#define unlink_small_chunk(M, P, S) {\ + mchunkptr F = P->fd;\ + mchunkptr B = P->bk;\ + bindex_t I = small_index(S);\ + assert(P != B);\ + assert(P != F);\ + assert(chunksize(P) == small_index2size(I));\ + if (F == B)\ + clear_smallmap(M, I);\ + else if (RTCHECK((F == smallbin_at(M,I) || ok_address(M, F)) &&\ + (B == smallbin_at(M,I) || ok_address(M, B)))) {\ + F->bk = B;\ + B->fd = F;\ +}\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ +}\ +} + +/* Unlink the first chunk from a smallbin */ +#define unlink_first_small_chunk(M, B, P, I) {\ + mchunkptr F = P->fd;\ + assert(P != B);\ + assert(P != F);\ + assert(chunksize(P) == small_index2size(I));\ + if (B == F)\ + clear_smallmap(M, I);\ + else if (RTCHECK(ok_address(M, F))) {\ + B->fd = F;\ + F->bk = B;\ +}\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ +}\ +} + + + +/* Replace dv node, binning the old one */ +/* Used only when dvsize known to be small */ +#define replace_dv(M, P, S) {\ + size_t DVS = M->dvsize;\ + if (DVS != 0) {\ + mchunkptr DV = M->dv;\ + assert(is_small(DVS));\ + insert_small_chunk(M, DV, DVS);\ + }\ + M->dvsize = S;\ + M->dv = P;\ +} + +/* ------------------------- Operations on trees ------------------------- */ + +/* Insert chunk into tree */ +#define insert_large_chunk(M, X, S) {\ + tbinptr* H;\ + bindex_t I;\ + compute_tree_index(S, I);\ + H = treebin_at(M, I);\ + X->index = I;\ + X->child[0] = X->child[1] = 0;\ + if (!treemap_is_marked(M, I)) {\ + mark_treemap(M, I);\ + *H = X;\ + X->parent = (tchunkptr)H;\ + X->fd = X->bk = X;\ + }\ + else {\ + tchunkptr T = *H;\ + size_t K = S << leftshift_for_tree_index(I);\ + for (;;) {\ + if (chunksize(T) != S) {\ + tchunkptr* C = &(T->child[(K >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]);\ + K <<= 1;\ + if (*C != 0)\ + T = *C;\ + else if (RTCHECK(ok_address(M, C))) {\ + *C = X;\ + X->parent = T;\ + X->fd = X->bk = X;\ + break;\ +}\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ + break;\ +}\ + }\ + else {\ + tchunkptr F = T->fd;\ + if (RTCHECK(ok_address(M, T) && ok_address(M, F))) {\ + T->fd = F->bk = X;\ + X->fd = F;\ + X->bk = T;\ + X->parent = 0;\ + break;\ + }\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ + break;\ +}\ +}\ + }\ +}\ +} + +/* +Unlink steps: + +1. If x is a chained node, unlink it from its same-sized fd/bk links +and choose its bk node as its replacement. +2. If x was the last node of its size, but not a leaf node, it must +be replaced with a leaf node (not merely one with an open left or +right), to make sure that lefts and rights of descendents +correspond properly to bit masks. We use the rightmost descendent +of x. We could use any other leaf, but this is easy to locate and +tends to counteract removal of leftmosts elsewhere, and so keeps +paths shorter than minimally guaranteed. This doesn't loop much +because on average a node in a tree is near the bottom. +3. If x is the base of a chain (i.e., has parent links) relink +x's parent and children to x's replacement (or null if none). +*/ + +#define unlink_large_chunk(M, X) {\ + tchunkptr XP = X->parent;\ + tchunkptr R;\ + if (X->bk != X) {\ + tchunkptr F = X->fd;\ + R = X->bk;\ + if (RTCHECK(ok_address(M, F))) {\ + F->bk = R;\ + R->fd = F;\ + }\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ +}\ + }\ + else {\ + tchunkptr* RP;\ + if (((R = *(RP = &(X->child[1]))) != 0) ||\ + ((R = *(RP = &(X->child[0]))) != 0)) {\ + tchunkptr* CP;\ + while ((*(CP = &(R->child[1])) != 0) ||\ + (*(CP = &(R->child[0])) != 0)) {\ + R = *(RP = CP);\ +}\ + if (RTCHECK(ok_address(M, RP)))\ + *RP = 0;\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ +}\ +}\ +}\ + if (XP != 0) {\ + tbinptr* H = treebin_at(M, X->index);\ + if (X == *H) {\ + if ((*H = R) == 0) \ + clear_treemap(M, X->index);\ + }\ + else if (RTCHECK(ok_address(M, XP))) {\ + if (XP->child[0] == X) \ + XP->child[0] = R;\ + else \ + XP->child[1] = R;\ +}\ + else\ + CORRUPTION_ERROR_ACTION(M);\ + if (R != 0) {\ + if (RTCHECK(ok_address(M, R))) {\ + tchunkptr C0, C1;\ + R->parent = XP;\ + if ((C0 = X->child[0]) != 0) {\ + if (RTCHECK(ok_address(M, C0))) {\ + R->child[0] = C0;\ + C0->parent = R;\ + }\ + else\ + CORRUPTION_ERROR_ACTION(M);\ + }\ + if ((C1 = X->child[1]) != 0) {\ + if (RTCHECK(ok_address(M, C1))) {\ + R->child[1] = C1;\ + C1->parent = R;\ + }\ + else\ + CORRUPTION_ERROR_ACTION(M);\ + }\ + }\ + else\ + CORRUPTION_ERROR_ACTION(M);\ + }\ + }\ +} + +/* Relays to large vs small bin operations */ + +#define insert_chunk(M, P, S)\ + if (is_small(S)) insert_small_chunk(M, P, S)\ + else { tchunkptr TP = (tchunkptr)(P); insert_large_chunk(M, TP, S); } + +#define unlink_chunk(M, P, S)\ + if (is_small(S)) unlink_small_chunk(M, P, S)\ + else { tchunkptr TP = (tchunkptr)(P); unlink_large_chunk(M, TP); } + + +/* Relays to internal calls to malloc/free from realloc, memalign etc */ + +#if ONLY_MSPACES +#define internal_malloc(m, b) rak_mspace_malloc(m, b) +#define internal_free(m, mem) rak_mspace_free(m,mem); +#else /* ONLY_MSPACES */ +#if MSPACES +#define internal_malloc(m, b)\ + (m == gm)? rdlmalloc(b) : rak_mspace_malloc(m, b) +#define internal_free(m, mem)\ + if (m == gm) rdlfree(mem); else rak_mspace_free(m,mem); +#else /* MSPACES */ +#define internal_malloc(m, b) rdlmalloc(b) +#define internal_free(m, mem) rdlfree(mem) +#endif /* MSPACES */ +#endif /* ONLY_MSPACES */ + +/* ----------------------- Direct-mmapping chunks ----------------------- */ + +/* +Directly mmapped chunks are set up with an offset to the start of +the mmapped region stored in the prev_foot field of the chunk. This +allows reconstruction of the required argument to MUNMAP when freed, +and also allows adjustment of the returned chunk to meet alignment +requirements (especially in memalign). +*/ + +/* Malloc using mmap */ +static void* mmap_alloc(mstate m, size_t nb) { + size_t mmsize = mmap_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK); + if (mmsize > nb) { /* Check for wrap around 0 */ + char* mm = (char*)(CALL_DIRECT_MMAP(mmsize)); + if (mm != CMFAIL) { + size_t offset = align_offset(chunk2mem(mm)); + size_t psize = mmsize - offset - MMAP_FOOT_PAD; + mchunkptr p = (mchunkptr)(mm + offset); + p->prev_foot = offset; + p->head = psize; + mark_inuse_foot(m, p, psize); + chunk_plus_offset(p, psize)->head = FENCEPOST_HEAD; + chunk_plus_offset(p, psize+SIZE_T_SIZE)->head = 0; + + if (m->least_addr == 0 || mm < m->least_addr) + m->least_addr = mm; + if ((m->footprint += mmsize) > m->max_footprint) + m->max_footprint = m->footprint; + assert(is_aligned(chunk2mem(p))); + check_mmapped_chunk(m, p); + return chunk2mem(p); + } + } + return 0; +} + +/* Realloc using mmap */ +static mchunkptr mmap_resize(mstate m, mchunkptr oldp, size_t nb) { + size_t oldsize = chunksize(oldp); + if (is_small(nb)) /* Can't shrink mmap regions below small size */ + return 0; + /* Keep old chunk if big enough but not too big */ + if (oldsize >= nb + SIZE_T_SIZE && + (oldsize - nb) <= (mparams.granularity << 1)) + return oldp; + else { + size_t offset = oldp->prev_foot; + size_t oldmmsize = oldsize + offset + MMAP_FOOT_PAD; + size_t newmmsize = mmap_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK); + char* cp = (char*)CALL_MREMAP((char*)oldp - offset, + oldmmsize, newmmsize, 1); + if (cp != CMFAIL) { + mchunkptr newp = (mchunkptr)(cp + offset); + size_t psize = newmmsize - offset - MMAP_FOOT_PAD; + newp->head = psize; + mark_inuse_foot(m, newp, psize); + chunk_plus_offset(newp, psize)->head = FENCEPOST_HEAD; + chunk_plus_offset(newp, psize+SIZE_T_SIZE)->head = 0; + + if (cp < m->least_addr) + m->least_addr = cp; + if ((m->footprint += newmmsize - oldmmsize) > m->max_footprint) + m->max_footprint = m->footprint; + check_mmapped_chunk(m, newp); + return newp; + } + } + return 0; +} + +/* -------------------------- mspace management -------------------------- */ + +/* Initialize top chunk and its size */ +static void init_top(mstate m, mchunkptr p, size_t psize) { + /* Ensure alignment */ + size_t offset = align_offset(chunk2mem(p)); + p = (mchunkptr)((char*)p + offset); + psize -= offset; + + m->top = p; + m->topsize = psize; + p->head = psize | PINUSE_BIT; + /* set size of fake trailing chunk holding overhead space only once */ + chunk_plus_offset(p, psize)->head = TOP_FOOT_SIZE; + m->trim_check = mparams.trim_threshold; /* reset on each update */ +} + +/* Initialize bins for a new mstate that is otherwise zeroed out */ +static void init_bins(mstate m) { + /* Establish circular links for smallbins */ + bindex_t i; + for (i = 0; i < NSMALLBINS; ++i) { + sbinptr bin = smallbin_at(m,i); + bin->fd = bin->bk = bin; + } +} + +#if PROCEED_ON_ERROR + +/* default corruption action */ +static void reset_on_error(mstate m) { + int i; + ++malloc_corruption_error_count; + /* Reinitialize fields to forget about all memory */ + m->smallbins = m->treebins = 0; + m->dvsize = m->topsize = 0; + m->seg.base = 0; + m->seg.size = 0; + m->seg.next = 0; + m->top = m->dv = 0; + for (i = 0; i < NTREEBINS; ++i) + *treebin_at(m, i) = 0; + init_bins(m); +} +#endif /* PROCEED_ON_ERROR */ + +/* Allocate chunk and prepend remainder with chunk in successor base. */ +static void* prepend_alloc(mstate m, char* newbase, char* oldbase, + size_t nb) { + mchunkptr p = align_as_chunk(newbase); + mchunkptr oldfirst = align_as_chunk(oldbase); + size_t psize = (char*)oldfirst - (char*)p; + mchunkptr q = chunk_plus_offset(p, nb); + size_t qsize = psize - nb; + set_size_and_pinuse_of_inuse_chunk(m, p, nb); + + assert((char*)oldfirst > (char*)q); + assert(pinuse(oldfirst)); + assert(qsize >= MIN_CHUNK_SIZE); + + /* consolidate remainder with first chunk of old base */ + if (oldfirst == m->top) { + size_t tsize = m->topsize += qsize; + m->top = q; + q->head = tsize | PINUSE_BIT; + check_top_chunk(m, q); + } + else if (oldfirst == m->dv) { + size_t dsize = m->dvsize += qsize; + m->dv = q; + set_size_and_pinuse_of_free_chunk(q, dsize); + } + else { + if (!is_inuse(oldfirst)) { + size_t nsize = chunksize(oldfirst); + unlink_chunk(m, oldfirst, nsize); + oldfirst = chunk_plus_offset(oldfirst, nsize); + qsize += nsize; + } + set_free_with_pinuse(q, qsize, oldfirst); + insert_chunk(m, q, qsize); + check_free_chunk(m, q); + } + + check_malloced_chunk(m, chunk2mem(p), nb); + return chunk2mem(p); +} + +/* Add a segment to hold a new noncontiguous region */ +static void add_segment(mstate m, char* tbase, size_t tsize, flag_t mmapped) { + /* Determine locations and sizes of segment, fenceposts, old top */ + char* old_top = (char*)m->top; + msegmentptr oldsp = segment_holding(m, old_top); + char* old_end = oldsp->base + oldsp->size; + size_t ssize = pad_request(sizeof(struct malloc_segment)); + char* rawsp = old_end - (ssize + FOUR_SIZE_T_SIZES + CHUNK_ALIGN_MASK); + size_t offset = align_offset(chunk2mem(rawsp)); + char* asp = rawsp + offset; + char* csp = (asp < (old_top + MIN_CHUNK_SIZE))? old_top : asp; + mchunkptr sp = (mchunkptr)csp; + msegmentptr ss = (msegmentptr)(chunk2mem(sp)); + mchunkptr tnext = chunk_plus_offset(sp, ssize); + mchunkptr p = tnext; + int nfences = 0; + + /* reset top to new space */ + init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE); + + /* Set up segment record */ + assert(is_aligned(ss)); + set_size_and_pinuse_of_inuse_chunk(m, sp, ssize); + *ss = m->seg; /* Push current record */ + m->seg.base = tbase; + m->seg.size = tsize; + m->seg.sflags = mmapped; + m->seg.next = ss; + + /* Insert trailing fenceposts */ + for (;;) { + mchunkptr nextp = chunk_plus_offset(p, SIZE_T_SIZE); + p->head = FENCEPOST_HEAD; + ++nfences; + if ((char*)(&(nextp->head)) < old_end) + p = nextp; + else + break; + } + assert(nfences >= 2); + + /* Insert the rest of old top into a bin as an ordinary free chunk */ + if (csp != old_top) { + mchunkptr q = (mchunkptr)old_top; + size_t psize = csp - old_top; + mchunkptr tn = chunk_plus_offset(q, psize); + set_free_with_pinuse(q, psize, tn); + insert_chunk(m, q, psize); + } + + check_top_chunk(m, m->top); +} + +/* -------------------------- System allocation -------------------------- */ + +/* Get memory from system using MORECORE or MMAP */ +static void* sys_alloc(mstate m, size_t nb) { + char* tbase = CMFAIL; + size_t tsize = 0; + flag_t mmap_flag = 0; + + ensure_initialization(); + + /* Directly map large chunks, but only if already initialized */ + if (use_mmap(m) && nb >= mparams.mmap_threshold && m->topsize != 0) { + void* mem = mmap_alloc(m, nb); + if (mem != 0) + return mem; + } + + /* + Try getting memory in any of three ways (in most-preferred to + least-preferred order): + 1. A call to MORECORE that can normally contiguously extend memory. + (disabled if not MORECORE_CONTIGUOUS or not HAVE_MORECORE or + or main space is mmapped or a previous contiguous call failed) + 2. A call to MMAP new space (disabled if not HAVE_MMAP). + Note that under the default settings, if MORECORE is unable to + fulfill a request, and HAVE_MMAP is true, then mmap is + used as a noncontiguous system allocator. This is a useful backup + strategy for systems with holes in address spaces -- in this case + sbrk cannot contiguously expand the heap, but mmap may be able to + find space. + 3. A call to MORECORE that cannot usually contiguously extend memory. + (disabled if not HAVE_MORECORE) + + In all cases, we need to request enough bytes from system to ensure + we can malloc nb bytes upon success, so pad with enough space for + top_foot, plus alignment-pad to make sure we don't lose bytes if + not on boundary, and round this up to a granularity unit. + */ + + if (MORECORE_CONTIGUOUS && !use_noncontiguous(m)) { + char* br = CMFAIL; + msegmentptr ss = (m->top == 0)? 0 : segment_holding(m, (char*)m->top); + size_t asize = 0; + ACQUIRE_MALLOC_GLOBAL_LOCK(); + + if (ss == 0) { /* First time through or recovery */ + char* base = (char*)CALL_MORECORE(0); + if (base != CMFAIL) { + asize = granularity_align(nb + SYS_ALLOC_PADDING); + /* Adjust to end on a page boundary */ + if (!is_page_aligned(base)) + asize += (page_align((size_t)base) - (size_t)base); + /* Can't call MORECORE if size is negative when treated as signed */ + if (asize < HALF_MAX_SIZE_T && + (br = (char*)(CALL_MORECORE(asize))) == base) { + tbase = base; + tsize = asize; + } + } + } + else { + /* Subtract out existing available top space from MORECORE request. */ + asize = granularity_align(nb - m->topsize + SYS_ALLOC_PADDING); + /* Use mem here only if it did continuously extend old space */ + if (asize < HALF_MAX_SIZE_T && + (br = (char*)(CALL_MORECORE(asize))) == ss->base+ss->size) { + tbase = br; + tsize = asize; + } + } + + if (tbase == CMFAIL) { /* Cope with partial failure */ + if (br != CMFAIL) { /* Try to use/extend the space we did get */ + if (asize < HALF_MAX_SIZE_T && + asize < nb + SYS_ALLOC_PADDING) { + size_t esize = granularity_align(nb + SYS_ALLOC_PADDING - asize); + if (esize < HALF_MAX_SIZE_T) { + char* end = (char*)CALL_MORECORE(esize); + if (end != CMFAIL) + asize += esize; + else { /* Can't use; try to release */ + (void) CALL_MORECORE(-asize); + br = CMFAIL; + } + } + } + } + if (br != CMFAIL) { /* Use the space we did get */ + tbase = br; + tsize = asize; + } + else + disable_contiguous(m); /* Don't try contiguous path in the future */ + } + + RELEASE_MALLOC_GLOBAL_LOCK(); + } + + if (HAVE_MMAP && tbase == CMFAIL) { /* Try MMAP */ + size_t rsize = granularity_align(nb + SYS_ALLOC_PADDING); + if (rsize > nb) { /* Fail if wraps around zero */ + char* mp = (char*)(CALL_MMAP(rsize)); + if (mp != CMFAIL) { + tbase = mp; + tsize = rsize; + mmap_flag = USE_MMAP_BIT; + } + } + } + + if (HAVE_MORECORE && tbase == CMFAIL) { /* Try noncontiguous MORECORE */ + size_t asize = granularity_align(nb + SYS_ALLOC_PADDING); + if (asize < HALF_MAX_SIZE_T) { + char* br = CMFAIL; + char* end = CMFAIL; + ACQUIRE_MALLOC_GLOBAL_LOCK(); + br = (char*)(CALL_MORECORE(asize)); + end = (char*)(CALL_MORECORE(0)); + RELEASE_MALLOC_GLOBAL_LOCK(); + if (br != CMFAIL && end != CMFAIL && br < end) { + size_t ssize = end - br; + if (ssize > nb + TOP_FOOT_SIZE) { + tbase = br; + tsize = ssize; + } + } + } + } + + if (tbase != CMFAIL) { + + if ((m->footprint += tsize) > m->max_footprint) + m->max_footprint = m->footprint; + + if (!is_initialized(m)) { /* first-time initialization */ + if (m->least_addr == 0 || tbase < m->least_addr) + m->least_addr = tbase; + m->seg.base = tbase; + m->seg.size = tsize; + m->seg.sflags = mmap_flag; + m->magic = mparams.magic; + m->release_checks = MAX_RELEASE_CHECK_RATE; + init_bins(m); +#if !ONLY_MSPACES + if (is_global(m)) + init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE); + else +#endif + { + /* Offset top by embedded malloc_state */ + mchunkptr mn = next_chunk(mem2chunk(m)); + init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) -TOP_FOOT_SIZE); + } + } + + else { + /* Try to merge with an existing segment */ + msegmentptr sp = &m->seg; + /* Only consider most recent segment if traversal suppressed */ + while (sp != 0 && tbase != sp->base + sp->size) + sp = (NO_SEGMENT_TRAVERSAL) ? 0 : sp->next; + if (sp != 0 && + !is_extern_segment(sp) && + (sp->sflags & USE_MMAP_BIT) == mmap_flag && + segment_holds(sp, m->top)) { /* append */ + sp->size += tsize; + init_top(m, m->top, m->topsize + tsize); + } + else { + if (tbase < m->least_addr) + m->least_addr = tbase; + sp = &m->seg; + while (sp != 0 && sp->base != tbase + tsize) + sp = (NO_SEGMENT_TRAVERSAL) ? 0 : sp->next; + if (sp != 0 && + !is_extern_segment(sp) && + (sp->sflags & USE_MMAP_BIT) == mmap_flag) { + char* oldbase = sp->base; + sp->base = tbase; + sp->size += tsize; + return prepend_alloc(m, tbase, oldbase, nb); + } + else + add_segment(m, tbase, tsize, mmap_flag); + } + } + + if (nb < m->topsize) { /* Allocate from new or extended top space */ + size_t rsize = m->topsize -= nb; + mchunkptr p = m->top; + mchunkptr r = m->top = chunk_plus_offset(p, nb); + r->head = rsize | PINUSE_BIT; + set_size_and_pinuse_of_inuse_chunk(m, p, nb); + check_top_chunk(m, m->top); + check_malloced_chunk(m, chunk2mem(p), nb); + return chunk2mem(p); + } + } + + MALLOC_FAILURE_ACTION; + return 0; +} + +/* ----------------------- system deallocation -------------------------- */ + +/* Unmap and unlink any mmapped segments that don't contain used chunks */ +static size_t release_unused_segments(mstate m) { + size_t released = 0; + int nsegs = 0; + msegmentptr pred = &m->seg; + msegmentptr sp = pred->next; + while (sp != 0) { + char* base = sp->base; + size_t size = sp->size; + msegmentptr next = sp->next; + ++nsegs; + if (is_mmapped_segment(sp) && !is_extern_segment(sp)) { + mchunkptr p = align_as_chunk(base); + size_t psize = chunksize(p); + /* Can unmap if first chunk holds entire segment and not pinned */ + if (!is_inuse(p) && (char*)p + psize >= base + size - TOP_FOOT_SIZE) { + tchunkptr tp = (tchunkptr)p; + assert(segment_holds(sp, (char*)sp)); + if (p == m->dv) { + m->dv = 0; + m->dvsize = 0; + } + else { + unlink_large_chunk(m, tp); + } + if (CALL_MUNMAP(base, size) == 0) { + released += size; + m->footprint -= size; + /* unlink obsoleted record */ + sp = pred; + sp->next = next; + } + else { /* back out if cannot unmap */ + insert_large_chunk(m, tp, psize); + } + } + } + if (NO_SEGMENT_TRAVERSAL) /* scan only first segment */ + break; + pred = sp; + sp = next; + } + /* Reset check counter */ + m->release_checks = ((nsegs > MAX_RELEASE_CHECK_RATE)? +nsegs : MAX_RELEASE_CHECK_RATE); + return released; +} + +static int sys_trim(mstate m, size_t pad) { + size_t released = 0; + ensure_initialization(); + if (pad < MAX_REQUEST && is_initialized(m)) { + pad += TOP_FOOT_SIZE; /* ensure enough room for segment overhead */ + + if (m->topsize > pad) { + /* Shrink top space in granularity-size units, keeping at least one */ + size_t unit = mparams.granularity; + size_t extra = ((m->topsize - pad + (unit - SIZE_T_ONE)) / unit - + SIZE_T_ONE) * unit; + msegmentptr sp = segment_holding(m, (char*)m->top); + + if (!is_extern_segment(sp)) { + if (is_mmapped_segment(sp)) { + if (HAVE_MMAP && + sp->size >= extra && + !has_segment_link(m, sp)) { /* can't shrink if pinned */ + size_t newsize = sp->size - extra; + /* Prefer mremap, fall back to munmap */ + if ((CALL_MREMAP(sp->base, sp->size, newsize, 0) != MFAIL) || + (CALL_MUNMAP(sp->base + newsize, extra) == 0)) { + released = extra; + } + } + } + else if (HAVE_MORECORE) { + if (extra >= HALF_MAX_SIZE_T) /* Avoid wrapping negative */ + extra = (HALF_MAX_SIZE_T) + SIZE_T_ONE - unit; + ACQUIRE_MALLOC_GLOBAL_LOCK(); + { + /* Make sure end of memory is where we last set it. */ + char* old_br = (char*)(CALL_MORECORE(0)); + if (old_br == sp->base + sp->size) { + char* rel_br = (char*)(CALL_MORECORE(-extra)); + char* new_br = (char*)(CALL_MORECORE(0)); + if (rel_br != CMFAIL && new_br < old_br) + released = old_br - new_br; + } + } + RELEASE_MALLOC_GLOBAL_LOCK(); + } + } + + if (released != 0) { + sp->size -= released; + m->footprint -= released; + init_top(m, m->top, m->topsize - released); + check_top_chunk(m, m->top); + } + } + + /* Unmap any unused mmapped segments */ + if (HAVE_MMAP) + released += release_unused_segments(m); + + /* On failure, disable autotrim to avoid repeated failed future calls */ + if (released == 0 && m->topsize > m->trim_check) + m->trim_check = MAX_SIZE_T; + } + + return (released != 0)? 1 : 0; +} + + +/* ---------------------------- malloc support --------------------------- */ + +/* allocate a large request from the best fitting chunk in a treebin */ +static void* tmalloc_large(mstate m, size_t nb) { + tchunkptr v = 0; + size_t rsize = -nb; /* Unsigned negation */ + tchunkptr t; + bindex_t idx; + compute_tree_index(nb, idx); + if ((t = *treebin_at(m, idx)) != 0) { + /* Traverse tree for this bin looking for node with size == nb */ + size_t sizebits = nb << leftshift_for_tree_index(idx); + tchunkptr rst = 0; /* The deepest untaken right subtree */ + for (;;) { + tchunkptr rt; + size_t trem = chunksize(t) - nb; + if (trem < rsize) { + v = t; + if ((rsize = trem) == 0) + break; + } + rt = t->child[1]; + t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]; + if (rt != 0 && rt != t) + rst = rt; + if (t == 0) { + t = rst; /* set t to least subtree holding sizes > nb */ + break; + } + sizebits <<= 1; + } + } + if (t == 0 && v == 0) { /* set t to root of next non-empty treebin */ + binmap_t leftbits = left_bits(idx2bit(idx)) & m->treemap; + if (leftbits != 0) { + bindex_t i; + binmap_t leastbit = least_bit(leftbits); + compute_bit2idx(leastbit, i); + t = *treebin_at(m, i); + } + } + + while (t != 0) { /* find smallest of tree or subtree */ + size_t trem = chunksize(t) - nb; + if (trem < rsize) { + rsize = trem; + v = t; + } + t = leftmost_child(t); + } + + /* If dv is a better fit, return 0 so malloc will use it */ + if (v != 0 && rsize < (size_t)(m->dvsize - nb)) { + if (RTCHECK(ok_address(m, v))) { /* split */ + mchunkptr r = chunk_plus_offset(v, nb); + assert(chunksize(v) == rsize + nb); + if (RTCHECK(ok_next(v, r))) { + unlink_large_chunk(m, v); + if (rsize < MIN_CHUNK_SIZE) + set_inuse_and_pinuse(m, v, (rsize + nb)); + else { + set_size_and_pinuse_of_inuse_chunk(m, v, nb); + set_size_and_pinuse_of_free_chunk(r, rsize); + insert_chunk(m, r, rsize); + } + return chunk2mem(v); + } + } + CORRUPTION_ERROR_ACTION(m); + } + return 0; +} + +/* allocate a small request from the best fitting chunk in a treebin */ +static void* tmalloc_small(mstate m, size_t nb) { + tchunkptr t, v; + size_t rsize; + bindex_t i; + binmap_t leastbit = least_bit(m->treemap); + compute_bit2idx(leastbit, i); + v = t = *treebin_at(m, i); + rsize = chunksize(t) - nb; + + while ((t = leftmost_child(t)) != 0) { + size_t trem = chunksize(t) - nb; + if (trem < rsize) { + rsize = trem; + v = t; + } + } + + if (RTCHECK(ok_address(m, v))) { + mchunkptr r = chunk_plus_offset(v, nb); + assert(chunksize(v) == rsize + nb); + if (RTCHECK(ok_next(v, r))) { + unlink_large_chunk(m, v); + if (rsize < MIN_CHUNK_SIZE) + set_inuse_and_pinuse(m, v, (rsize + nb)); + else { + set_size_and_pinuse_of_inuse_chunk(m, v, nb); + set_size_and_pinuse_of_free_chunk(r, rsize); + replace_dv(m, r, rsize); + } + return chunk2mem(v); + } + } + + CORRUPTION_ERROR_ACTION(m); + return 0; +} + +/* --------------------------- realloc support --------------------------- */ + +static void* internal_realloc(mstate m, void* oldmem, size_t bytes) { + if (bytes >= MAX_REQUEST) { + MALLOC_FAILURE_ACTION; + return 0; + } + if (!PREACTION(m)) { + mchunkptr oldp = mem2chunk(oldmem); + size_t oldsize = chunksize(oldp); + mchunkptr next = chunk_plus_offset(oldp, oldsize); + mchunkptr newp = 0; + void* extra = 0; + + /* Try to either shrink or extend into top. Else malloc-copy-free */ + + if (RTCHECK(ok_address(m, oldp) && ok_inuse(oldp) && + ok_next(oldp, next) && ok_pinuse(next))) { + size_t nb = request2size(bytes); + if (is_mmapped(oldp)) + newp = mmap_resize(m, oldp, nb); + else if (oldsize >= nb) { /* already big enough */ + size_t rsize = oldsize - nb; + newp = oldp; + if (rsize >= MIN_CHUNK_SIZE) { + mchunkptr remainder = chunk_plus_offset(newp, nb); + set_inuse(m, newp, nb); + set_inuse_and_pinuse(m, remainder, rsize); + extra = chunk2mem(remainder); + } + } + else if (next == m->top && oldsize + m->topsize > nb) { + /* Expand into top */ + size_t newsize = oldsize + m->topsize; + size_t newtopsize = newsize - nb; + mchunkptr newtop = chunk_plus_offset(oldp, nb); + set_inuse(m, oldp, nb); + newtop->head = newtopsize |PINUSE_BIT; + m->top = newtop; + m->topsize = newtopsize; + newp = oldp; + } + } + else { + USAGE_ERROR_ACTION(m, oldmem); + POSTACTION(m); + return 0; + } +#if DEBUG + if (newp != 0) { + check_inuse_chunk(m, newp); /* Check requires lock */ + } +#endif + + POSTACTION(m); + + if (newp != 0) { + if (extra != 0) { + internal_free(m, extra); + } + return chunk2mem(newp); + } + else { + void* newmem = internal_malloc(m, bytes); + if (newmem != 0) { + size_t oc = oldsize - overhead_for(oldp); + memcpy(newmem, oldmem, (oc < bytes)? oc : bytes); + internal_free(m, oldmem); + } + return newmem; + } + } + return 0; +} + +/* --------------------------- memalign support -------------------------- */ + +static void* internal_memalign(mstate m, size_t alignment, size_t bytes) { + if (alignment <= MALLOC_ALIGNMENT) /* Can just use malloc */ + return internal_malloc(m, bytes); + if (alignment < MIN_CHUNK_SIZE) /* must be at least a minimum chunk size */ + alignment = MIN_CHUNK_SIZE; + if ((alignment & (alignment-SIZE_T_ONE)) != 0) {/* Ensure a power of 2 */ + size_t a = MALLOC_ALIGNMENT << 1; + while (a < alignment) a <<= 1; + alignment = a; + } + + if (bytes >= MAX_REQUEST - alignment) { + if (m != 0) { /* Test isn't needed but avoids compiler warning */ + MALLOC_FAILURE_ACTION; + } + } + else { + size_t nb = request2size(bytes); + size_t req = nb + alignment + MIN_CHUNK_SIZE - CHUNK_OVERHEAD; + char* mem = (char*)internal_malloc(m, req); + if (mem != 0) { + void* leader = 0; + void* trailer = 0; + mchunkptr p = mem2chunk(mem); + + if (PREACTION(m)) return 0; + if ((((size_t)(mem)) % alignment) != 0) { /* misaligned */ + /* + Find an aligned spot inside chunk. Since we need to give + back leading space in a chunk of at least MIN_CHUNK_SIZE, if + the first calculation places us at a spot with less than + MIN_CHUNK_SIZE leader, we can move to the next aligned spot. + We've allocated enough total room so that this is always + possible. + */ + char* br = (char*)mem2chunk((size_t)(((size_t)(mem + + alignment - + SIZE_T_ONE)) & + -alignment)); + char* pos = ((size_t)(br - (char*)(p)) >= MIN_CHUNK_SIZE)? +br : br+alignment; + mchunkptr newp = (mchunkptr)pos; + size_t leadsize = pos - (char*)(p); + size_t newsize = chunksize(p) - leadsize; + + if (is_mmapped(p)) { /* For mmapped chunks, just adjust offset */ + newp->prev_foot = p->prev_foot + leadsize; + newp->head = newsize; + } + else { /* Otherwise, give back leader, use the rest */ + set_inuse(m, newp, newsize); + set_inuse(m, p, leadsize); + leader = chunk2mem(p); + } + p = newp; + } + + /* Give back spare room at the end */ + if (!is_mmapped(p)) { + size_t size = chunksize(p); + if (size > nb + MIN_CHUNK_SIZE) { + size_t remainder_size = size - nb; + mchunkptr remainder = chunk_plus_offset(p, nb); + set_inuse(m, p, nb); + set_inuse(m, remainder, remainder_size); + trailer = chunk2mem(remainder); + } + } + + assert (chunksize(p) >= nb); + assert((((size_t)(chunk2mem(p))) % alignment) == 0); + check_inuse_chunk(m, p); + POSTACTION(m); + if (leader != 0) { + internal_free(m, leader); + } + if (trailer != 0) { + internal_free(m, trailer); + } + return chunk2mem(p); + } + } + return 0; +} + +/* ------------------------ comalloc/coalloc support --------------------- */ + +static void** ialloc(mstate m, + size_t n_elements, + size_t* sizes, + int opts, + void* chunks[]) { + /* + This provides common support for independent_X routines, handling + all of the combinations that can result. + + The opts arg has: + bit 0 set if all elements are same size (using sizes[0]) + bit 1 set if elements should be zeroed + */ + + size_t element_size; /* chunksize of each element, if all same */ + size_t contents_size; /* total size of elements */ + size_t array_size; /* request size of pointer array */ + void* mem; /* malloced aggregate space */ + mchunkptr p; /* corresponding chunk */ + size_t remainder_size; /* remaining bytes while splitting */ + void** marray; /* either "chunks" or malloced ptr array */ + mchunkptr array_chunk; /* chunk for malloced ptr array */ + flag_t was_enabled; /* to disable mmap */ + size_t size; + size_t i; + + ensure_initialization(); + /* compute array length, if needed */ + if (chunks != 0) { + if (n_elements == 0) + return chunks; /* nothing to do */ + marray = chunks; + array_size = 0; + } + else { + /* if empty req, must still return chunk representing empty array */ + if (n_elements == 0) + return (void**)internal_malloc(m, 0); + marray = 0; + array_size = request2size(n_elements * (sizeof(void*))); + } + + /* compute total element size */ + if (opts & 0x1) { /* all-same-size */ + element_size = request2size(*sizes); + contents_size = n_elements * element_size; + } + else { /* add up all the sizes */ + element_size = 0; + contents_size = 0; + for (i = 0; i != n_elements; ++i) + contents_size += request2size(sizes[i]); + } + + size = contents_size + array_size; + + /* + Allocate the aggregate chunk. First disable direct-mmapping so + malloc won't use it, since we would not be able to later + free/realloc space internal to a segregated mmap region. + */ + was_enabled = use_mmap(m); + disable_mmap(m); + mem = internal_malloc(m, size - CHUNK_OVERHEAD); + if (was_enabled) + enable_mmap(m); + if (mem == 0) + return 0; + + if (PREACTION(m)) return 0; + p = mem2chunk(mem); + remainder_size = chunksize(p); + + assert(!is_mmapped(p)); + + if (opts & 0x2) { /* optionally clear the elements */ + memset((size_t*)mem, 0, remainder_size - SIZE_T_SIZE - array_size); + } + + /* If not provided, allocate the pointer array as final part of chunk */ + if (marray == 0) { + size_t array_chunk_size; + array_chunk = chunk_plus_offset(p, contents_size); + array_chunk_size = remainder_size - contents_size; + marray = (void**) (chunk2mem(array_chunk)); + set_size_and_pinuse_of_inuse_chunk(m, array_chunk, array_chunk_size); + remainder_size = contents_size; + } + + /* split out elements */ + for (i = 0; ; ++i) { + marray[i] = chunk2mem(p); + if (i != n_elements-1) { + if (element_size != 0) + size = element_size; + else + size = request2size(sizes[i]); + remainder_size -= size; + set_size_and_pinuse_of_inuse_chunk(m, p, size); + p = chunk_plus_offset(p, size); + } + else { /* the final element absorbs any overallocation slop */ + set_size_and_pinuse_of_inuse_chunk(m, p, remainder_size); + break; + } + } + +#if DEBUG + if (marray != chunks) { + /* final element must have exactly exhausted chunk */ + if (element_size != 0) { + assert(remainder_size == element_size); + } + else { + assert(remainder_size == request2size(sizes[i])); + } + check_inuse_chunk(m, mem2chunk(marray)); + } + for (i = 0; i != n_elements; ++i) + check_inuse_chunk(m, mem2chunk(marray[i])); + +#endif /* DEBUG */ + + POSTACTION(m); + return marray; +} + + +/* -------------------------- public routines ---------------------------- */ + +#if !ONLY_MSPACES + +void* rdlmalloc(size_t bytes) { + /* + Basic algorithm: + If a small request (< 256 bytes minus per-chunk overhead): + 1. If one exists, use a remainderless chunk in associated smallbin. + (Remainderless means that there are too few excess bytes to + represent as a chunk.) + 2. If it is big enough, use the dv chunk, which is normally the + chunk adjacent to the one used for the most recent small request. + 3. If one exists, split the smallest available chunk in a bin, + saving remainder in dv. + 4. If it is big enough, use the top chunk. + 5. If available, get memory from system and use it + Otherwise, for a large request: + 1. Find the smallest available binned chunk that fits, and use it + if it is better fitting than dv chunk, splitting if necessary. + 2. If better fitting than any binned chunk, use the dv chunk. + 3. If it is big enough, use the top chunk. + 4. If request size >= mmap threshold, try to directly mmap this chunk. + 5. If available, get memory from system and use it + + The ugly goto's here ensure that postaction occurs along all paths. + */ + +#if USE_LOCKS + ensure_initialization(); /* initialize in sys_alloc if not using locks */ +#endif + + if (!PREACTION(gm)) { + void* mem; + size_t nb; + if (bytes <= MAX_SMALL_REQUEST) { + bindex_t idx; + binmap_t smallbits; + nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes); + idx = small_index(nb); + smallbits = gm->smallmap >> idx; + + if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */ + mchunkptr b, p; + idx += ~smallbits & 1; /* Uses next bin if idx empty */ + b = smallbin_at(gm, idx); + p = b->fd; + assert(chunksize(p) == small_index2size(idx)); + unlink_first_small_chunk(gm, b, p, idx); + set_inuse_and_pinuse(gm, p, small_index2size(idx)); + mem = chunk2mem(p); + check_malloced_chunk(gm, mem, nb); + goto postaction; + } + + else if (nb > gm->dvsize) { + if (smallbits != 0) { /* Use chunk in next nonempty smallbin */ + mchunkptr b, p, r; + size_t rsize; + bindex_t i; + binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx)); + binmap_t leastbit = least_bit(leftbits); + compute_bit2idx(leastbit, i); + b = smallbin_at(gm, i); + p = b->fd; + assert(chunksize(p) == small_index2size(i)); + unlink_first_small_chunk(gm, b, p, i); + rsize = small_index2size(i) - nb; + /* Fit here cannot be remainderless if 4byte sizes */ + if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE) + set_inuse_and_pinuse(gm, p, small_index2size(i)); + else { + set_size_and_pinuse_of_inuse_chunk(gm, p, nb); + r = chunk_plus_offset(p, nb); + set_size_and_pinuse_of_free_chunk(r, rsize); + replace_dv(gm, r, rsize); + } + mem = chunk2mem(p); + check_malloced_chunk(gm, mem, nb); + goto postaction; + } + + else if (gm->treemap != 0 && (mem = tmalloc_small(gm, nb)) != 0) { + check_malloced_chunk(gm, mem, nb); + goto postaction; + } + } + } + else if (bytes >= MAX_REQUEST) + nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */ + else { + nb = pad_request(bytes); + if (gm->treemap != 0 && (mem = tmalloc_large(gm, nb)) != 0) { + check_malloced_chunk(gm, mem, nb); + goto postaction; + } + } + + if (nb <= gm->dvsize) { + size_t rsize = gm->dvsize - nb; + mchunkptr p = gm->dv; + if (rsize >= MIN_CHUNK_SIZE) { /* split dv */ + mchunkptr r = gm->dv = chunk_plus_offset(p, nb); + gm->dvsize = rsize; + set_size_and_pinuse_of_free_chunk(r, rsize); + set_size_and_pinuse_of_inuse_chunk(gm, p, nb); + } + else { /* exhaust dv */ + size_t dvs = gm->dvsize; + gm->dvsize = 0; + gm->dv = 0; + set_inuse_and_pinuse(gm, p, dvs); + } + mem = chunk2mem(p); + check_malloced_chunk(gm, mem, nb); + goto postaction; + } + + else if (nb < gm->topsize) { /* Split top */ + size_t rsize = gm->topsize -= nb; + mchunkptr p = gm->top; + mchunkptr r = gm->top = chunk_plus_offset(p, nb); + r->head = rsize | PINUSE_BIT; + set_size_and_pinuse_of_inuse_chunk(gm, p, nb); + mem = chunk2mem(p); + check_top_chunk(gm, gm->top); + check_malloced_chunk(gm, mem, nb); + goto postaction; + } + + mem = sys_alloc(gm, nb); + +postaction: + POSTACTION(gm); + return mem; + } + + return 0; +} + +void rdlfree(void* mem) { + /* + Consolidate freed chunks with preceeding or succeeding bordering + free chunks, if they exist, and then place in a bin. Intermixed + with special cases for top, dv, mmapped chunks, and usage errors. + */ + + if (mem != 0) { + mchunkptr p = mem2chunk(mem); +#if FOOTERS + mstate fm = get_mstate_for(p); + if (!ok_magic(fm)) { + USAGE_ERROR_ACTION(fm, p); + return; + } +#else /* FOOTERS */ +#define fm gm +#endif /* FOOTERS */ + if (!PREACTION(fm)) { + check_inuse_chunk(fm, p); + if (RTCHECK(ok_address(fm, p) && ok_inuse(p))) { + size_t psize = chunksize(p); + mchunkptr next = chunk_plus_offset(p, psize); + if (!pinuse(p)) { + size_t prevsize = p->prev_foot; + if (is_mmapped(p)) { + psize += prevsize + MMAP_FOOT_PAD; + if (CALL_MUNMAP((char*)p - prevsize, psize) == 0) + fm->footprint -= psize; + goto postaction; + } + else { + mchunkptr prev = chunk_minus_offset(p, prevsize); + psize += prevsize; + p = prev; + if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */ + if (p != fm->dv) { + unlink_chunk(fm, p, prevsize); + } + else if ((next->head & INUSE_BITS) == INUSE_BITS) { + fm->dvsize = psize; + set_free_with_pinuse(p, psize, next); + goto postaction; + } + } + else + goto erroraction; + } + } + + if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) { + if (!cinuse(next)) { /* consolidate forward */ + if (next == fm->top) { + size_t tsize = fm->topsize += psize; + fm->top = p; + p->head = tsize | PINUSE_BIT; + if (p == fm->dv) { + fm->dv = 0; + fm->dvsize = 0; + } + if (should_trim(fm, tsize)) + sys_trim(fm, 0); + goto postaction; + } + else if (next == fm->dv) { + size_t dsize = fm->dvsize += psize; + fm->dv = p; + set_size_and_pinuse_of_free_chunk(p, dsize); + goto postaction; + } + else { + size_t nsize = chunksize(next); + psize += nsize; + unlink_chunk(fm, next, nsize); + set_size_and_pinuse_of_free_chunk(p, psize); + if (p == fm->dv) { + fm->dvsize = psize; + goto postaction; + } + } + } + else + set_free_with_pinuse(p, psize, next); + + if (is_small(psize)) { + insert_small_chunk(fm, p, psize); + check_free_chunk(fm, p); + } + else { + tchunkptr tp = (tchunkptr)p; + insert_large_chunk(fm, tp, psize); + check_free_chunk(fm, p); + if (--fm->release_checks == 0) + release_unused_segments(fm); + } + goto postaction; + } + } +erroraction: + USAGE_ERROR_ACTION(fm, p); +postaction: + POSTACTION(fm); + } + } +#if !FOOTERS +#undef fm +#endif /* FOOTERS */ +} + +void* rdlcalloc(size_t n_elements, size_t elem_size) { + void* mem; + size_t req = 0; + if (n_elements != 0) { + req = n_elements * elem_size; + if (((n_elements | elem_size) & ~(size_t)0xffff) && + (req / n_elements != elem_size)) + req = MAX_SIZE_T; /* force downstream failure on overflow */ + } + mem = rdlmalloc(req); + if (mem != 0 && calloc_must_clear(mem2chunk(mem))) + memset(mem, 0, req); + return mem; +} + +void* rdlrealloc(void* oldmem, size_t bytes) { + if (oldmem == 0) + return rdlmalloc(bytes); +#ifdef REALLOC_ZERO_BYTES_FREES + if (bytes == 0) { + rdlfree(oldmem); + return 0; + } +#endif /* REALLOC_ZERO_BYTES_FREES */ + else { +#if ! FOOTERS + mstate m = gm; +#else /* FOOTERS */ + mstate m = get_mstate_for(mem2chunk(oldmem)); + if (!ok_magic(m)) { + USAGE_ERROR_ACTION(m, oldmem); + return 0; + } +#endif /* FOOTERS */ + return internal_realloc(m, oldmem, bytes); + } +} + +void* rdlmemalign(size_t alignment, size_t bytes) { + return internal_memalign(gm, alignment, bytes); +} + +void** rdlindependent_calloc(size_t n_elements, size_t elem_size, + void* chunks[]) { + size_t sz = elem_size; /* serves as 1-element array */ + return ialloc(gm, n_elements, &sz, 3, chunks); +} + +void** rdlindependent_comalloc(size_t n_elements, size_t sizes[], + void* chunks[]) { + return ialloc(gm, n_elements, sizes, 0, chunks); +} + +void* rdlvalloc(size_t bytes) { + size_t pagesz; + ensure_initialization(); + pagesz = mparams.page_size; + return rdlmemalign(pagesz, bytes); +} + +void* rdlpvalloc(size_t bytes) { + size_t pagesz; + ensure_initialization(); + pagesz = mparams.page_size; + return rdlmemalign(pagesz, (bytes + pagesz - SIZE_T_ONE) & ~(pagesz - SIZE_T_ONE)); +} + +int rdlmalloc_trim(size_t pad) { + int result = 0; + ensure_initialization(); + if (!PREACTION(gm)) { + result = sys_trim(gm, pad); + POSTACTION(gm); + } + return result; +} + +size_t rdlmalloc_footprint(void) { + return gm->footprint; +} + +size_t dlmalloc_max_footprint(void) { + return gm->max_footprint; +} + +#if !NO_MALLINFO +struct mallinfo rdlmallinfo(void) { + return internal_mallinfo(gm); +} +#endif /* NO_MALLINFO */ + +void rdlmalloc_stats() { + internal_malloc_stats(gm); +} + +int rdlmallopt(int param_number, int value) { + return change_mparam(param_number, value); +} + +#endif /* !ONLY_MSPACES */ + +size_t rdlmalloc_usable_size(void* mem) { + if (mem != 0) { + mchunkptr p = mem2chunk(mem); + if (is_inuse(p)) + return chunksize(p) - overhead_for(p); + } + return 0; +} + +/* ----------------------------- user mspaces ---------------------------- */ + +#if MSPACES + +static mstate init_user_mstate(char* tbase, size_t tsize) { + size_t msize = pad_request(sizeof(struct malloc_state)); + mchunkptr mn; + mchunkptr msp = align_as_chunk(tbase); + mstate m = (mstate)(chunk2mem(msp)); + memset(m, 0, msize); + INITIAL_LOCK(&m->mutex); + msp->head = (msize|INUSE_BITS); + m->seg.base = m->least_addr = tbase; + m->seg.size = m->footprint = m->max_footprint = tsize; + m->magic = mparams.magic; + m->release_checks = MAX_RELEASE_CHECK_RATE; + m->mflags = mparams.default_mflags; + m->extp = 0; + m->exts = 0; + disable_contiguous(m); + init_bins(m); + mn = next_chunk(mem2chunk(m)); + init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) - TOP_FOOT_SIZE); + check_top_chunk(m, m->top); + return m; +} + +mspace rak_create_mspace(size_t capacity, int locked) { + mstate m = 0; + size_t msize; + ensure_initialization(); + msize = pad_request(sizeof(struct malloc_state)); + if (capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) { + size_t rs = ((capacity == 0)? mparams.granularity : + (capacity + TOP_FOOT_SIZE + msize)); + size_t tsize = granularity_align(rs); + char* tbase = (char*)(CALL_MMAP(tsize)); + if (tbase != CMFAIL) { + m = init_user_mstate(tbase, tsize); + m->seg.sflags = USE_MMAP_BIT; + set_lock(m, locked); + } + } + return (mspace)m; +} + +mspace rak_create_mspace_with_base(void* base, size_t capacity, int locked) { + mstate m = 0; + size_t msize; + ensure_initialization(); + msize = pad_request(sizeof(struct malloc_state)); + if (capacity > msize + TOP_FOOT_SIZE && + capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) { + m = init_user_mstate((char*)base, capacity); + m->seg.sflags = EXTERN_BIT; + set_lock(m, locked); + } + return (mspace)m; +} + +int rak_mspace_track_large_chunks(mspace msp, int enable) { + int ret = 0; + mstate ms = (mstate)msp; + if (!PREACTION(ms)) { + if (!use_mmap(ms)) + ret = 1; + if (!enable) + enable_mmap(ms); + else + disable_mmap(ms); + POSTACTION(ms); + } + return ret; +} + +size_t rak_destroy_mspace(mspace msp) { + size_t freed = 0; + mstate ms = (mstate)msp; + if (ok_magic(ms)) { + msegmentptr sp = &ms->seg; + while (sp != 0) { + char* base = sp->base; + size_t size = sp->size; + flag_t flag = sp->sflags; + sp = sp->next; + if ((flag & USE_MMAP_BIT) && !(flag & EXTERN_BIT) && + CALL_MUNMAP(base, size) == 0) + freed += size; + } + } + else { + USAGE_ERROR_ACTION(ms,ms); + } + return freed; +} + +/* +mspace versions of routines are near-clones of the global +versions. This is not so nice but better than the alternatives. +*/ + + +void* rak_mspace_malloc(mspace msp, size_t bytes) { + mstate ms = (mstate)msp; + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + return 0; + } + if (!PREACTION(ms)) { + void* mem; + size_t nb; + if (bytes <= MAX_SMALL_REQUEST) { + bindex_t idx; + binmap_t smallbits; + nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes); + idx = small_index(nb); + smallbits = ms->smallmap >> idx; + + if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */ + mchunkptr b, p; + idx += ~smallbits & 1; /* Uses next bin if idx empty */ + b = smallbin_at(ms, idx); + p = b->fd; + assert(chunksize(p) == small_index2size(idx)); + unlink_first_small_chunk(ms, b, p, idx); + set_inuse_and_pinuse(ms, p, small_index2size(idx)); + mem = chunk2mem(p); + check_malloced_chunk(ms, mem, nb); + goto postaction; + } + + else if (nb > ms->dvsize) { + if (smallbits != 0) { /* Use chunk in next nonempty smallbin */ + mchunkptr b, p, r; + size_t rsize; + bindex_t i; + binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx)); + binmap_t leastbit = least_bit(leftbits); + compute_bit2idx(leastbit, i); + b = smallbin_at(ms, i); + p = b->fd; + assert(chunksize(p) == small_index2size(i)); + unlink_first_small_chunk(ms, b, p, i); + rsize = small_index2size(i) - nb; + /* Fit here cannot be remainderless if 4byte sizes */ + if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE) + set_inuse_and_pinuse(ms, p, small_index2size(i)); + else { + set_size_and_pinuse_of_inuse_chunk(ms, p, nb); + r = chunk_plus_offset(p, nb); + set_size_and_pinuse_of_free_chunk(r, rsize); + replace_dv(ms, r, rsize); + } + mem = chunk2mem(p); + check_malloced_chunk(ms, mem, nb); + goto postaction; + } + + else if (ms->treemap != 0 && (mem = tmalloc_small(ms, nb)) != 0) { + check_malloced_chunk(ms, mem, nb); + goto postaction; + } + } + } + else if (bytes >= MAX_REQUEST) + nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */ + else { + nb = pad_request(bytes); + if (ms->treemap != 0 && (mem = tmalloc_large(ms, nb)) != 0) { + check_malloced_chunk(ms, mem, nb); + goto postaction; + } + } + + if (nb <= ms->dvsize) { + size_t rsize = ms->dvsize - nb; + mchunkptr p = ms->dv; + if (rsize >= MIN_CHUNK_SIZE) { /* split dv */ + mchunkptr r = ms->dv = chunk_plus_offset(p, nb); + ms->dvsize = rsize; + set_size_and_pinuse_of_free_chunk(r, rsize); + set_size_and_pinuse_of_inuse_chunk(ms, p, nb); + } + else { /* exhaust dv */ + size_t dvs = ms->dvsize; + ms->dvsize = 0; + ms->dv = 0; + set_inuse_and_pinuse(ms, p, dvs); + } + mem = chunk2mem(p); + check_malloced_chunk(ms, mem, nb); + goto postaction; + } + + else if (nb < ms->topsize) { /* Split top */ + size_t rsize = ms->topsize -= nb; + mchunkptr p = ms->top; + mchunkptr r = ms->top = chunk_plus_offset(p, nb); + r->head = rsize | PINUSE_BIT; + set_size_and_pinuse_of_inuse_chunk(ms, p, nb); + mem = chunk2mem(p); + check_top_chunk(ms, ms->top); + check_malloced_chunk(ms, mem, nb); + goto postaction; + } + + mem = sys_alloc(ms, nb); + +postaction: + POSTACTION(ms); + return mem; + } + + return 0; +} + +void rak_mspace_free(mspace msp, void* mem) { + if (mem != 0) { + mchunkptr p = mem2chunk(mem); +#if FOOTERS + mstate fm = get_mstate_for(p); + msp = msp; /* placate people compiling -Wunused */ +#else /* FOOTERS */ + mstate fm = (mstate)msp; +#endif /* FOOTERS */ + if (!ok_magic(fm)) { + USAGE_ERROR_ACTION(fm, p); + return; + } + if (!PREACTION(fm)) { + check_inuse_chunk(fm, p); + if (RTCHECK(ok_address(fm, p) && ok_inuse(p))) { + size_t psize = chunksize(p); + mchunkptr next = chunk_plus_offset(p, psize); + if (!pinuse(p)) { + size_t prevsize = p->prev_foot; + if (is_mmapped(p)) { + psize += prevsize + MMAP_FOOT_PAD; + if (CALL_MUNMAP((char*)p - prevsize, psize) == 0) + fm->footprint -= psize; + goto postaction; + } + else { + mchunkptr prev = chunk_minus_offset(p, prevsize); + psize += prevsize; + p = prev; + if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */ + if (p != fm->dv) { + unlink_chunk(fm, p, prevsize); + } + else if ((next->head & INUSE_BITS) == INUSE_BITS) { + fm->dvsize = psize; + set_free_with_pinuse(p, psize, next); + goto postaction; + } + } + else + goto erroraction; + } + } + + if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) { + if (!cinuse(next)) { /* consolidate forward */ + if (next == fm->top) { + size_t tsize = fm->topsize += psize; + fm->top = p; + p->head = tsize | PINUSE_BIT; + if (p == fm->dv) { + fm->dv = 0; + fm->dvsize = 0; + } + if (should_trim(fm, tsize)) + sys_trim(fm, 0); + goto postaction; + } + else if (next == fm->dv) { + size_t dsize = fm->dvsize += psize; + fm->dv = p; + set_size_and_pinuse_of_free_chunk(p, dsize); + goto postaction; + } + else { + size_t nsize = chunksize(next); + psize += nsize; + unlink_chunk(fm, next, nsize); + set_size_and_pinuse_of_free_chunk(p, psize); + if (p == fm->dv) { + fm->dvsize = psize; + goto postaction; + } + } + } + else + set_free_with_pinuse(p, psize, next); + + if (is_small(psize)) { + insert_small_chunk(fm, p, psize); + check_free_chunk(fm, p); + } + else { + tchunkptr tp = (tchunkptr)p; + insert_large_chunk(fm, tp, psize); + check_free_chunk(fm, p); + if (--fm->release_checks == 0) + release_unused_segments(fm); + } + goto postaction; + } + } +erroraction: + USAGE_ERROR_ACTION(fm, p); +postaction: + POSTACTION(fm); + } + } +} + +void* rak_mspace_calloc(mspace msp, size_t n_elements, size_t elem_size) { + void* mem; + size_t req = 0; + mstate ms = (mstate)msp; + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + return 0; + } + if (n_elements != 0) { + req = n_elements * elem_size; + if (((n_elements | elem_size) & ~(size_t)0xffff) && + (req / n_elements != elem_size)) + req = MAX_SIZE_T; /* force downstream failure on overflow */ + } + mem = internal_malloc(ms, req); + if (mem != 0 && calloc_must_clear(mem2chunk(mem))) + memset(mem, 0, req); + return mem; +} + +void* rak_mspace_realloc(mspace msp, void* oldmem, size_t bytes) { + if (oldmem == 0) + return rak_mspace_malloc(msp, bytes); +#ifdef REALLOC_ZERO_BYTES_FREES + if (bytes == 0) { + rak_mspace_free(msp, oldmem); + return 0; + } +#endif /* REALLOC_ZERO_BYTES_FREES */ + else { +#if FOOTERS + mchunkptr p = mem2chunk(oldmem); + mstate ms = get_mstate_for(p); +#else /* FOOTERS */ + mstate ms = (mstate)msp; +#endif /* FOOTERS */ + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + return 0; + } + return internal_realloc(ms, oldmem, bytes); + } +} + +void* rak_mspace_memalign(mspace msp, size_t alignment, size_t bytes) { + mstate ms = (mstate)msp; + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + return 0; + } + return internal_memalign(ms, alignment, bytes); +} + +void** rak_mspace_independent_calloc(mspace msp, size_t n_elements, + size_t elem_size, void* chunks[]) { + size_t sz = elem_size; /* serves as 1-element array */ + mstate ms = (mstate)msp; + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + return 0; + } + return ialloc(ms, n_elements, &sz, 3, chunks); +} + +void** rak_mspace_independent_comalloc(mspace msp, size_t n_elements, + size_t sizes[], void* chunks[]) { + mstate ms = (mstate)msp; + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + return 0; + } + return ialloc(ms, n_elements, sizes, 0, chunks); +} + +int rak_mspace_trim(mspace msp, size_t pad) { + int result = 0; + mstate ms = (mstate)msp; + if (ok_magic(ms)) { + if (!PREACTION(ms)) { + result = sys_trim(ms, pad); + POSTACTION(ms); + } + } + else { + USAGE_ERROR_ACTION(ms,ms); + } + return result; +} + +void rak_mspace_malloc_stats(mspace msp) { + mstate ms = (mstate)msp; + if (ok_magic(ms)) { + internal_malloc_stats(ms); + } + else { + USAGE_ERROR_ACTION(ms,ms); + } +} + +size_t rak_mspace_footprint(mspace msp) { + size_t result = 0; + mstate ms = (mstate)msp; + if (ok_magic(ms)) { + result = ms->footprint; + } + else { + USAGE_ERROR_ACTION(ms,ms); + } + return result; +} + + +size_t mspace_max_footprint(mspace msp) { + size_t result = 0; + mstate ms = (mstate)msp; + if (ok_magic(ms)) { + result = ms->max_footprint; + } + else { + USAGE_ERROR_ACTION(ms,ms); + } + return result; +} + + +#if !NO_MALLINFO +struct mallinfo rak_mspace_mallinfo(mspace msp) { + mstate ms = (mstate)msp; + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + } + return internal_mallinfo(ms); +} +#endif /* NO_MALLINFO */ + +size_t rak_mspace_usable_size(void* mem) { + if (mem != 0) { + mchunkptr p = mem2chunk(mem); + if (is_inuse(p)) + return chunksize(p) - overhead_for(p); + } + return 0; +} + +int rak_mspace_mallopt(int param_number, int value) { + return change_mparam(param_number, value); +} + +#endif /* MSPACES */ + + +/* -------------------- Alternative MORECORE functions ------------------- */ + +/* +Guidelines for creating a custom version of MORECORE: + +* For best performance, MORECORE should allocate in multiples of pagesize. +* MORECORE may allocate more memory than requested. (Or even less, +but this will usually result in a malloc failure.) +* MORECORE must not allocate memory when given argument zero, but +instead return one past the end address of memory from previous +nonzero call. +* For best performance, consecutive calls to MORECORE with positive +arguments should return increasing addresses, indicating that +space has been contiguously extended. +* Even though consecutive calls to MORECORE need not return contiguous +addresses, it must be OK for malloc'ed chunks to span multiple +regions in those cases where they do happen to be contiguous. +* MORECORE need not handle negative arguments -- it may instead +just return MFAIL when given negative arguments. +Negative arguments are always multiples of pagesize. MORECORE +must not misinterpret negative args as large positive unsigned +args. You can suppress all such calls from even occurring by defining +MORECORE_CANNOT_TRIM, + +As an example alternative MORECORE, here is a custom allocator +kindly contributed for pre-OSX macOS. It uses virtually but not +necessarily physically contiguous non-paged memory (locked in, +present and won't get swapped out). You can use it by uncommenting +this section, adding some #includes, and setting up the appropriate +defines above: + +#define MORECORE osMoreCore + +There is also a shutdown routine that should somehow be called for +cleanup upon program exit. + +#define MAX_POOL_ENTRIES 100 +#define MINIMUM_MORECORE_SIZE (64 * 1024U) +static int next_os_pool; +void *our_os_pools[MAX_POOL_ENTRIES]; + +void *osMoreCore(int size) +{ +void *ptr = 0; +static void *sbrk_top = 0; + +if (size > 0) +{ +if (size < MINIMUM_MORECORE_SIZE) +size = MINIMUM_MORECORE_SIZE; +if (CurrentExecutionLevel() == kTaskLevel) +ptr = PoolAllocateResident(size + RM_PAGE_SIZE, 0); +if (ptr == 0) +{ +return (void *) MFAIL; +} +// save ptrs so they can be freed during cleanup +our_os_pools[next_os_pool] = ptr; +next_os_pool++; +ptr = (void *) ((((size_t) ptr) + RM_PAGE_MASK) & ~RM_PAGE_MASK); +sbrk_top = (char *) ptr + size; +return ptr; +} +else if (size < 0) +{ +// we don't currently support shrink behavior +return (void *) MFAIL; +} +else +{ +return sbrk_top; +} +} + +// cleanup any allocated memory pools +// called as last thing before shutting down driver + +void osCleanupMem(void) +{ +void **ptr; + +for (ptr = our_os_pools; ptr < &our_os_pools[MAX_POOL_ENTRIES]; ptr++) +if (*ptr) +{ +PoolDeallocate(*ptr); +*ptr = 0; +} +} + +*/ + + +/* ----------------------------------------------------------------------- +History: +V2.8.4 Wed May 27 09:56:23 2009 Doug Lea (dl at gee) +* Use zeros instead of prev foot for is_mmapped +* Add rak_mspace_track_large_chunks; thanks to Jean Brouwers +* Fix set_inuse in internal_realloc; thanks to Jean Brouwers +* Fix insufficient sys_alloc padding when using 16byte alignment +* Fix bad error check in rak_mspace_footprint +* Adaptations for ptmalloc; thanks to Wolfram Gloger. +* Reentrant spin locks; thanks to Earl Chew and others +* Win32 improvements; thanks to Niall Douglas and Earl Chew +* Add NO_SEGMENT_TRAVERSAL and MAX_RELEASE_CHECK_RATE options +* Extension hook in malloc_state +* Various small adjustments to reduce warnings on some compilers +* Various configuration extensions/changes for more platforms. Thanks +to all who contributed these. + +V2.8.3 Thu Sep 22 11:16:32 2005 Doug Lea (dl at gee) +* Add max_footprint functions +* Ensure all appropriate literals are size_t +* Fix conditional compilation problem for some #define settings +* Avoid concatenating segments with the one provided +in rak_create_mspace_with_base +* Rename some variables to avoid compiler shadowing warnings +* Use explicit lock initialization. +* Better handling of sbrk interference. +* Simplify and fix segment insertion, trimming and mspace_destroy +* Reinstate REALLOC_ZERO_BYTES_FREES option from 2.7.x +* Thanks especially to Dennis Flanagan for help on these. + +V2.8.2 Sun Jun 12 16:01:10 2005 Doug Lea (dl at gee) +* Fix memalign brace error. + +V2.8.1 Wed Jun 8 16:11:46 2005 Doug Lea (dl at gee) +* Fix improper #endif nesting in C++ +* Add explicit casts needed for C++ + +V2.8.0 Mon May 30 14:09:02 2005 Doug Lea (dl at gee) +* Use trees for large bins +* Support mspaces +* Use segments to unify sbrk-based and mmap-based system allocation, +removing need for emulation on most platforms without sbrk. +* Default safety checks +* Optional footer checks. Thanks to William Robertson for the idea. +* Internal code refactoring +* Incorporate suggestions and platform-specific changes. +Thanks to Dennis Flanagan, Colin Plumb, Niall Douglas, +Aaron Bachmann, Emery Berger, and others. +* Speed up non-fastbin processing enough to remove fastbins. +* Remove useless cfree() to avoid conflicts with other apps. +* Remove internal memcpy, memset. Compilers handle builtins better. +* Remove some options that no one ever used and rename others. + +V2.7.2 Sat Aug 17 09:07:30 2002 Doug Lea (dl at gee) +* Fix malloc_state bitmap array misdeclaration + +V2.7.1 Thu Jul 25 10:58:03 2002 Doug Lea (dl at gee) +* Allow tuning of FIRST_SORTED_BIN_SIZE +* Use PTR_UINT as type for all ptr->int casts. Thanks to John Belmonte. +* Better detection and support for non-contiguousness of MORECORE. +Thanks to Andreas Mueller, Conal Walsh, and Wolfram Gloger +* Bypass most of malloc if no frees. Thanks To Emery Berger. +* Fix freeing of old top non-contiguous chunk im sysmalloc. +* Raised default trim and map thresholds to 256K. +* Fix mmap-related #defines. Thanks to Lubos Lunak. +* Fix copy macros; added LACKS_FCNTL_H. Thanks to Neal Walfield. +* Branch-free bin calculation +* Default trim and mmap thresholds now 256K. + +V2.7.0 Sun Mar 11 14:14:06 2001 Doug Lea (dl at gee) +* Introduce independent_comalloc and independent_calloc. +Thanks to Michael Pachos for motivation and help. +* Make optional .h file available +* Allow > 2GB requests on 32bit systems. +* new DL_PLATFORM_WIN32 sbrk, mmap, munmap, lock code from . +Thanks also to Andreas Mueller , +and Anonymous. +* Allow override of MALLOC_ALIGNMENT (Thanks to Ruud Waij for +helping test this.) +* memalign: check alignment arg +* realloc: don't try to shift chunks backwards, since this +leads to more fragmentation in some programs and doesn't +seem to help in any others. +* Collect all cases in malloc requiring system memory into sysmalloc +* Use mmap as backup to sbrk +* Place all internal state in malloc_state +* Introduce fastbins (although similar to 2.5.1) +* Many minor tunings and cosmetic improvements +* Introduce USE_PUBLIC_MALLOC_WRAPPERS, USE_MALLOC_LOCK +* Introduce MALLOC_FAILURE_ACTION, MORECORE_CONTIGUOUS +Thanks to Tony E. Bennett and others. +* Include errno.h to support default failure action. + +V2.6.6 Sun Dec 5 07:42:19 1999 Doug Lea (dl at gee) +* return null for negative arguments +* Added Several DL_PLATFORM_WIN32 cleanups from Martin C. Fong +* Add 'LACKS_SYS_PARAM_H' for those systems without 'sys/param.h' +(e.g. DL_PLATFORM_WIN32 platforms) +* Cleanup header file inclusion for DL_PLATFORM_WIN32 platforms +* Cleanup code to avoid Microsoft Visual C++ compiler complaints +* Add 'USE_DL_PREFIX' to quickly allow co-existence with existing +memory allocation routines +* Set 'malloc_getpagesize' for DL_PLATFORM_WIN32 platforms (needs more work) +* Use 'assert' rather than 'ASSERT' in DL_PLATFORM_WIN32 code to conform to +usage of 'assert' in non-DL_PLATFORM_WIN32 code +* Improve DL_PLATFORM_WIN32 'sbrk()' emulation's 'findRegion()' routine to +avoid infinite loop +* Always call 'fREe()' rather than 'free()' + +V2.6.5 Wed Jun 17 15:57:31 1998 Doug Lea (dl at gee) +* Fixed ordering problem with boundary-stamping + +V2.6.3 Sun May 19 08:17:58 1996 Doug Lea (dl at gee) +* Added pvalloc, as recommended by H.J. Liu +* Added 64bit pointer support mainly from Wolfram Gloger +* Added anonymously donated DL_PLATFORM_WIN32 sbrk emulation +* Malloc, calloc, getpagesize: add optimizations from Raymond Nijssen +* malloc_extend_top: fix mask error that caused wastage after +foreign sbrks +* Add linux mremap support code from HJ Liu + +V2.6.2 Tue Dec 5 06:52:55 1995 Doug Lea (dl at gee) +* Integrated most documentation with the code. +* Add support for mmap, with help from +Wolfram Gloger (Gloger@lrz.uni-muenchen.de). +* Use last_remainder in more cases. +* Pack bins using idea from colin@nyx10.cs.du.edu +* Use ordered bins instead of best-fit threshhold +* Eliminate block-local decls to simplify tracing and debugging. +* Support another case of realloc via move into top +* Fix error occuring when initial sbrk_base not word-aligned. +* Rely on page size for units instead of SBRK_UNIT to +avoid surprises about sbrk alignment conventions. +* Add mallinfo, mallopt. Thanks to Raymond Nijssen +(raymond@es.ele.tue.nl) for the suggestion. +* Add `pad' argument to malloc_trim and top_pad mallopt parameter. +* More precautions for cases where other routines call sbrk, +courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de). +* Added macros etc., allowing use in linux libc from +H.J. Lu (hjl@gnu.ai.mit.edu) +* Inverted this history list + +V2.6.1 Sat Dec 2 14:10:57 1995 Doug Lea (dl at gee) +* Re-tuned and fixed to behave more nicely with V2.6.0 changes. +* Removed all preallocation code since under current scheme +the work required to undo bad preallocations exceeds +the work saved in good cases for most test programs. +* No longer use return list or unconsolidated bins since +no scheme using them consistently outperforms those that don't +given above changes. +* Use best fit for very large chunks to prevent some worst-cases. +* Added some support for debugging + +V2.6.0 Sat Nov 4 07:05:23 1995 Doug Lea (dl at gee) +* Removed footers when chunks are in use. Thanks to +Paul Wilson (wilson@cs.texas.edu) for the suggestion. + +V2.5.4 Wed Nov 1 07:54:51 1995 Doug Lea (dl at gee) +* Added malloc_trim, with help from Wolfram Gloger +(wmglo@Dent.MED.Uni-Muenchen.DE). + +V2.5.3 Tue Apr 26 10:16:01 1994 Doug Lea (dl at g) + +V2.5.2 Tue Apr 5 16:20:40 1994 Doug Lea (dl at g) +* realloc: try to expand in both directions +* malloc: swap order of clean-bin strategy; +* realloc: only conditionally expand backwards +* Try not to scavenge used bins +* Use bin counts as a guide to preallocation +* Occasionally bin return list chunks in first scan +* Add a few optimizations from colin@nyx10.cs.du.edu + +V2.5.1 Sat Aug 14 15:40:43 1993 Doug Lea (dl at g) +* faster bin computation & slightly different binning +* merged all consolidations to one part of malloc proper +(eliminating old malloc_find_space & malloc_clean_bin) +* Scan 2 returns chunks (not just 1) +* Propagate failure in realloc if malloc returns 0 +* Add stuff to allow compilation on non-ANSI compilers +from kpv@research.att.com + +V2.5 Sat Aug 7 07:41:59 1993 Doug Lea (dl at g.oswego.edu) +* removed potential for odd address access in prev_chunk +* removed dependency on getpagesize.h +* misc cosmetics and a bit more internal documentation +* anticosmetics: mangled names in macros to evade debugger strangeness +* tested on sparc, hp-700, dec-mips, rs6000 +with gcc & native cc (hp, dec only) allowing +Detlefs & Zorn comparison study (in SIGPLAN Notices.) + +Trial version Fri Aug 28 13:14:29 1992 Doug Lea (dl at g.oswego.edu) +* Based loosely on libg++-1.2X malloc. (It retains some of the overall +structure of old version, but most details differ.) + +*/ + +#endif // _RAKNET_SUPPORT_DL_MALLOC diff --git a/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/rdlmalloc.h b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/rdlmalloc.h new file mode 100644 index 0000000..28c67ec --- /dev/null +++ b/minecraftcpp-master/handheld/project/lib_projects/raknet/jni/RaknetSources/rdlmalloc.h @@ -0,0 +1,2261 @@ +#ifdef _RAKNET_SUPPORT_DL_MALLOC + +/* +Default header file for malloc-2.8.x, written by Doug Lea +and released to the public domain, as explained at +http://creativecommons.org/licenses/publicdomain. + +last update: Wed May 27 14:25:17 2009 Doug Lea (dl at gee) + +This header is for ANSI C/C++ only. You can set any of +the following #defines before including: + +* If USE_DL_PREFIX is defined, it is assumed that malloc.c +was also compiled with this option, so all routines +have names starting with "dl". + +* If HAVE_USR_INCLUDE_MALLOC_H is defined, it is assumed that this +file will be #included AFTER . This is needed only if +your system defines a struct mallinfo that is incompatible with the +standard one declared here. Otherwise, you can include this file +INSTEAD of your system system . At least on ANSI, all +declarations should be compatible with system versions + +* If MSPACES is defined, declarations for mspace versions are included. +*/ + +#ifndef MALLOC_280_H +#define MALLOC_280_H + +#include "rdlmalloc-options.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#include /* for size_t */ + +#ifndef ONLY_MSPACES +#define ONLY_MSPACES 0 /* define to a value */ +#endif /* ONLY_MSPACES */ +#ifndef NO_MALLINFO +#define NO_MALLINFO 0 +#endif /* NO_MALLINFO */ + + +#if !ONLY_MSPACES + +#ifndef USE_DL_PREFIX +#define rdlcalloc calloc +#define rdlfree free +#define rdlmalloc malloc +#define rdlmemalign memalign +#define rdlrealloc realloc +#define rdlvalloc valloc +#define rdlpvalloc pvalloc +#define rdlmallinfo mallinfo +#define rdlmallopt mallopt +#define rdlmalloc_trim malloc_trim +#define rdlmalloc_stats malloc_stats +#define rdlmalloc_usable_size malloc_usable_size +#define rdlmalloc_footprint malloc_footprint +#define rdlindependent_calloc independent_calloc +#define rdlindependent_comalloc independent_comalloc +#endif /* USE_DL_PREFIX */ +#if !NO_MALLINFO +#ifndef HAVE_USR_INCLUDE_MALLOC_H +#ifndef _MALLOC_H +#ifndef MALLINFO_FIELD_TYPE +#define MALLINFO_FIELD_TYPE size_t +#endif /* MALLINFO_FIELD_TYPE */ +#ifndef STRUCT_MALLINFO_DECLARED +#define STRUCT_MALLINFO_DECLARED 1 + struct mallinfo { + MALLINFO_FIELD_TYPE arena; /* non-mmapped space allocated from system */ + MALLINFO_FIELD_TYPE ordblks; /* number of free chunks */ + MALLINFO_FIELD_TYPE smblks; /* always 0 */ + MALLINFO_FIELD_TYPE hblks; /* always 0 */ + MALLINFO_FIELD_TYPE hblkhd; /* space in mmapped regions */ + MALLINFO_FIELD_TYPE usmblks; /* maximum total allocated space */ + MALLINFO_FIELD_TYPE fsmblks; /* always 0 */ + MALLINFO_FIELD_TYPE uordblks; /* total allocated space */ + MALLINFO_FIELD_TYPE fordblks; /* total free space */ + MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */ + }; +#endif /* STRUCT_MALLINFO_DECLARED */ +#endif /* _MALLOC_H */ +#endif /* HAVE_USR_INCLUDE_MALLOC_H */ +#endif /* !NO_MALLINFO */ + + /* + malloc(size_t n) + Returns a pointer to a newly allocated chunk of at least n bytes, or + null if no space is available, in which case errno is set to ENOMEM + on ANSI C systems. + + If n is zero, malloc returns a minimum-sized chunk. (The minimum + size is 16 bytes on most 32bit systems, and 32 bytes on 64bit + systems.) Note that size_t is an unsigned type, so calls with + arguments that would be negative if signed are interpreted as + requests for huge amounts of space, which will often fail. The + maximum supported value of n differs across systems, but is in all + cases less than the maximum representable value of a size_t. + */ + void* rdlmalloc(size_t); + + /* + free(void* p) + Releases the chunk of memory pointed to by p, that had been previously + allocated using malloc or a related routine such as realloc. + It has no effect if p is null. If p was not malloced or already + freed, free(p) will by default cuase the current program to abort. + */ + void rdlfree(void*); + + /* + calloc(size_t n_elements, size_t element_size); + Returns a pointer to n_elements * element_size bytes, with all locations + set to zero. + */ + void* rdlcalloc(size_t, size_t); + + /* + realloc(void* p, size_t n) + Returns a pointer to a chunk of size n that contains the same data + as does chunk p up to the minimum of (n, p's size) bytes, or null + if no space is available. + + The returned pointer may or may not be the same as p. The algorithm + prefers extending p in most cases when possible, otherwise it + employs the equivalent of a malloc-copy-free sequence. + + If p is null, realloc is equivalent to malloc. + + If space is not available, realloc returns null, errno is set (if on + ANSI) and p is NOT freed. + + if n is for fewer bytes than already held by p, the newly unused + space is lopped off and freed if possible. realloc with a size + argument of zero (re)allocates a minimum-sized chunk. + + The old unix realloc convention of allowing the last-free'd chunk + to be used as an argument to realloc is not supported. + */ + + void* rdlrealloc(void*, size_t); + + /* + memalign(size_t alignment, size_t n); + Returns a pointer to a newly allocated chunk of n bytes, aligned + in accord with the alignment argument. + + The alignment argument should be a power of two. If the argument is + not a power of two, the nearest greater power is used. + 8-byte alignment is guaranteed by normal malloc calls, so don't + bother calling memalign with an argument of 8 or less. + + Overreliance on memalign is a sure way to fragment space. + */ + void* rdlmemalign(size_t, size_t); + + /* + valloc(size_t n); + Equivalent to memalign(pagesize, n), where pagesize is the page + size of the system. If the pagesize is unknown, 4096 is used. + */ + void* rdlvalloc(size_t); + + /* + mallopt(int parameter_number, int parameter_value) + Sets tunable parameters The format is to provide a + (parameter-number, parameter-value) pair. mallopt then sets the + corresponding parameter to the argument value if it can (i.e., so + long as the value is meaningful), and returns 1 if successful else + 0. SVID/XPG/ANSI defines four standard param numbers for mallopt, + normally defined in malloc.h. None of these are use in this malloc, + so setting them has no effect. But this malloc also supports other + options in mallopt: + + Symbol param # default allowed param values + M_TRIM_THRESHOLD -1 2*1024*1024 any (-1U disables trimming) + M_GRANULARITY -2 page size any power of 2 >= page size + M_MMAP_THRESHOLD -3 256*1024 any (or 0 if no MMAP support) + */ + int rdlmallopt(int, int); + +#define M_TRIM_THRESHOLD (-1) +#define M_GRANULARITY (-2) +#define M_MMAP_THRESHOLD (-3) + + + /* + malloc_footprint(); + Returns the number of bytes obtained from the system. The total + number of bytes allocated by malloc, realloc etc., is less than this + value. Unlike mallinfo, this function returns only a precomputed + result, so can be called frequently to monitor memory consumption. + Even if locks are otherwise defined, this function does not use them, + so results might not be up to date. + */ + size_t rdlmalloc_footprint(); + +#if !NO_MALLINFO + /* + mallinfo() + Returns (by copy) a struct containing various summary statistics: + + arena: current total non-mmapped bytes allocated from system + ordblks: the number of free chunks + smblks: always zero. + hblks: current number of mmapped regions + hblkhd: total bytes held in mmapped regions + usmblks: the maximum total allocated space. This will be greater + than current total if trimming has occurred. + fsmblks: always zero + uordblks: current total allocated space (normal or mmapped) + fordblks: total free space + keepcost: the maximum number of bytes that could ideally be released + back to system via malloc_trim. ("ideally" means that + it ignores page restrictions etc.) + + Because these fields are ints, but internal bookkeeping may + be kept as longs, the reported values may wrap around zero and + thus be inaccurate. + */ + + struct mallinfo rdlmallinfo(void); +#endif /* NO_MALLINFO */ + + /* + independent_calloc(size_t n_elements, size_t element_size, void* chunks[]); + + independent_calloc is similar to calloc, but instead of returning a + single cleared space, it returns an array of pointers to n_elements + independent elements that can hold contents of size elem_size, each + of which starts out cleared, and can be independently freed, + realloc'ed etc. The elements are guaranteed to be adjacently + allocated (this is not guaranteed to occur with multiple callocs or + mallocs), which may also improve cache locality in some + applications. + + The "chunks" argument is optional (i.e., may be null, which is + probably the most typical usage). If it is null, the returned array + is itself dynamically allocated and should also be freed when it is + no longer needed. Otherwise, the chunks array must be of at least + n_elements in length. It is filled in with the pointers to the + chunks. + + In either case, independent_calloc returns this pointer array, or + null if the allocation failed. If n_elements is zero and "chunks" + is null, it returns a chunk representing an array with zero elements + (which should be freed if not wanted). + + Each element must be individually freed when it is no longer + needed. If you'd like to instead be able to free all at once, you + should instead use regular calloc and assign pointers into this + space to represent elements. (In this case though, you cannot + independently free elements.) + + independent_calloc simplifies and speeds up implementations of many + kinds of pools. It may also be useful when constructing large data + structures that initially have a fixed number of fixed-sized nodes, + but the number is not known at compile time, and some of the nodes + may later need to be freed. For example: + + struct Node { int item; struct Node* next; }; + + struct Node* build_list() { + struct Node** pool; + int n = read_number_of_nodes_needed(); + if (n <= 0) return 0; + pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0); + if (pool == 0) die(); + // organize into a linked list... + struct Node* first = pool[0]; + for (i = 0; i < n-1; ++i) + pool[i]->next = pool[i+1]; + free(pool); // Can now free the array (or not, if it is needed later) + return first; + } + */ + void** rdlindependent_calloc(size_t, size_t, void**); + + /* + independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]); + + independent_comalloc allocates, all at once, a set of n_elements + chunks with sizes indicated in the "sizes" array. It returns + an array of pointers to these elements, each of which can be + independently freed, realloc'ed etc. The elements are guaranteed to + be adjacently allocated (this is not guaranteed to occur with + multiple callocs or mallocs), which may also improve cache locality + in some applications. + + The "chunks" argument is optional (i.e., may be null). If it is null + the returned array is itself dynamically allocated and should also + be freed when it is no longer needed. Otherwise, the chunks array + must be of at least n_elements in length. It is filled in with the + pointers to the chunks. + + In either case, independent_comalloc returns this pointer array, or + null if the allocation failed. If n_elements is zero and chunks is + null, it returns a chunk representing an array with zero elements + (which should be freed if not wanted). + + Each element must be individually freed when it is no longer + needed. If you'd like to instead be able to free all at once, you + should instead use a single regular malloc, and assign pointers at + particular offsets in the aggregate space. (In this case though, you + cannot independently free elements.) + + independent_comallac differs from independent_calloc in that each + element may have a different size, and also that it does not + automatically clear elements. + + independent_comalloc can be used to speed up allocation in cases + where several structs or objects must always be allocated at the + same time. For example: + + struct Head { ... } + struct Foot { ... } + + void send_message(char* msg) { + int msglen = strlen(msg); + size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) }; + void* chunks[3]; + if (independent_comalloc(3, sizes, chunks) == 0) + die(); + struct Head* head = (struct Head*)(chunks[0]); + char* body = (char*)(chunks[1]); + struct Foot* foot = (struct Foot*)(chunks[2]); + // ... + } + + In general though, independent_comalloc is worth using only for + larger values of n_elements. For small values, you probably won't + detect enough difference from series of malloc calls to bother. + + Overuse of independent_comalloc can increase overall memory usage, + since it cannot reuse existing noncontiguous small chunks that + might be available for some of the elements. + */ + void** rdlindependent_comalloc(size_t, size_t*, void**); + + + /* + pvalloc(size_t n); + Equivalent to valloc(minimum-page-that-holds(n)), that is, + round up n to nearest pagesize. + */ + void* rdlpvalloc(size_t); + + /* + malloc_trim(size_t pad); + + If possible, gives memory back to the system (via negative arguments + to sbrk) if there is unused memory at the `high' end of the malloc + pool or in unused MMAP segments. You can call this after freeing + large blocks of memory to potentially reduce the system-level memory + requirements of a program. However, it cannot guarantee to reduce + memory. Under some allocation patterns, some large free blocks of + memory will be locked between two used chunks, so they cannot be + given back to the system. + + The `pad' argument to malloc_trim represents the amount of free + trailing space to leave untrimmed. If this argument is zero, only + the minimum amount of memory to maintain internal data structures + will be left. Non-zero arguments can be supplied to maintain enough + trailing space to service future expected allocations without having + to re-obtain memory from the system. + + Malloc_trim returns 1 if it actually released any memory, else 0. + */ + int rdlmalloc_trim(size_t); + + /* + malloc_stats(); + Prints on stderr the amount of space obtained from the system (both + via sbrk and mmap), the maximum amount (which may be more than + current if malloc_trim and/or munmap got called), and the current + number of bytes allocated via malloc (or realloc, etc) but not yet + freed. Note that this is the number of bytes allocated, not the + number requested. It will be larger than the number requested + because of alignment and bookkeeping overhead. Because it includes + alignment wastage as being in use, this figure may be greater than + zero even when no user-level chunks are allocated. + + The reported current and maximum system memory can be inaccurate if + a program makes other calls to system memory allocation functions + (normally sbrk) outside of malloc. + + malloc_stats prints only the most commonly interesting statistics. + More information can be obtained by calling mallinfo. + */ + void rdlmalloc_stats(); + +#endif /* !ONLY_MSPACES */ + + /* + malloc_usable_size(void* p); + + Returns the number of bytes you can actually use in + an allocated chunk, which may be more than you requested (although + often not) due to alignment and minimum size constraints. + You can use this many bytes without worrying about + overwriting other allocated objects. This is not a particularly great + programming practice. malloc_usable_size can be more useful in + debugging and assertions, for example: + + p = malloc(n); + assert(malloc_usable_size(p) >= 256); + */ + size_t rdlmalloc_usable_size(void*); + + +#if MSPACES + + /* + mspace is an opaque type representing an independent + region of space that supports rak_mspace_malloc, etc. + */ + typedef void* mspace; + + /* + rak_create_mspace creates and returns a new independent space with the + given initial capacity, or, if 0, the default granularity size. It + returns null if there is no system memory available to create the + space. If argument locked is non-zero, the space uses a separate + lock to control access. The capacity of the space will grow + dynamically as needed to service rak_mspace_malloc requests. You can + control the sizes of incremental increases of this space by + compiling with a different DEFAULT_GRANULARITY or dynamically + setting with mallopt(M_GRANULARITY, value). + */ + mspace rak_create_mspace(size_t capacity, int locked); + + /* + rak_destroy_mspace destroys the given space, and attempts to return all + of its memory back to the system, returning the total number of + bytes freed. After destruction, the results of access to all memory + used by the space become undefined. + */ + size_t rak_destroy_mspace(mspace msp); + + /* + rak_create_mspace_with_base uses the memory supplied as the initial base + of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this + space is used for bookkeeping, so the capacity must be at least this + large. (Otherwise 0 is returned.) When this initial space is + exhausted, additional memory will be obtained from the system. + Destroying this space will deallocate all additionally allocated + space (if possible) but not the initial base. + */ + mspace rak_create_mspace_with_base(void* base, size_t capacity, int locked); + + /* + rak_mspace_track_large_chunks controls whether requests for large chunks + are allocated in their own untracked mmapped regions, separate from + others in this mspace. By default large chunks are not tracked, + which reduces fragmentation. However, such chunks are not + necessarily released to the system upon rak_destroy_mspace. Enabling + tracking by setting to true may increase fragmentation, but avoids + leakage when relying on rak_destroy_mspace to release all memory + allocated using this space. The function returns the previous + setting. + */ + int rak_mspace_track_large_chunks(mspace msp, int enable); + + /* + rak_mspace_malloc behaves as malloc, but operates within + the given space. + */ + void* rak_mspace_malloc(mspace msp, size_t bytes); + + /* + rak_mspace_free behaves as free, but operates within + the given space. + + If compiled with FOOTERS==1, rak_mspace_free is not actually needed. + free may be called instead of rak_mspace_free because freed chunks from + any space are handled by their originating spaces. + */ + void rak_mspace_free(mspace msp, void* mem); + + /* + rak_mspace_realloc behaves as realloc, but operates within + the given space. + + If compiled with FOOTERS==1, rak_mspace_realloc is not actually + needed. realloc may be called instead of rak_mspace_realloc because + realloced chunks from any space are handled by their originating + spaces. + */ + void* rak_mspace_realloc(mspace msp, void* mem, size_t newsize); + + /* + rak_mspace_calloc behaves as calloc, but operates within + the given space. + */ + void* rak_mspace_calloc(mspace msp, size_t n_elements, size_t elem_size); + + /* + rak_mspace_memalign behaves as memalign, but operates within + the given space. + */ + void* rak_mspace_memalign(mspace msp, size_t alignment, size_t bytes); + + /* + rak_mspace_independent_calloc behaves as independent_calloc, but + operates within the given space. + */ + void** rak_mspace_independent_calloc(mspace msp, size_t n_elements, + size_t elem_size, void* chunks[]); + + /* + rak_mspace_independent_comalloc behaves as independent_comalloc, but + operates within the given space. + */ + void** rak_mspace_independent_comalloc(mspace msp, size_t n_elements, + size_t sizes[], void* chunks[]); + + /* + rak_mspace_footprint() returns the number of bytes obtained from the + system for this space. + */ + size_t rak_mspace_footprint(mspace msp); + + +#if !NO_MALLINFO + /* + rak_mspace_mallinfo behaves as mallinfo, but reports properties of + the given space. + */ + struct mallinfo rak_mspace_mallinfo(mspace msp); +#endif /* NO_MALLINFO */ + + /* + malloc_usable_size(void* p) behaves the same as malloc_usable_size; + */ + size_t rak_mspace_usable_size(void* mem); + + /* + rak_mspace_malloc_stats behaves as malloc_stats, but reports + properties of the given space. + */ + void rak_mspace_malloc_stats(mspace msp); + + /* + rak_mspace_trim behaves as malloc_trim, but + operates within the given space. + */ + int rak_mspace_trim(mspace msp, size_t pad); + + /* + An alias for mallopt. + */ + int rak_mspace_mallopt(int, int); + +#endif /* MSPACES */ + +#ifdef __cplusplus +}; /* end of extern "C" */ +#endif + +/* +This is a version (aka rdlmalloc) of malloc/free/realloc written by +Doug Lea and released to the public domain, as explained at +http://creativecommons.org/licenses/publicdomain. Send questions, +comments, complaints, performance data, etc to dl@cs.oswego.edu + +* Version 2.8.4 Wed May 27 09:56:23 2009 Doug Lea (dl at gee) + +Note: There may be an updated version of this malloc obtainable at +ftp://gee.cs.oswego.edu/pub/misc/malloc.c +Check before installing! + +* Quickstart + +This library is all in one file to simplify the most common usage: +ftp it, compile it (-O3), and link it into another program. All of +the compile-time options default to reasonable values for use on +most platforms. You might later want to step through various +compile-time and dynamic tuning options. + +For convenience, an include file for code using this malloc is at: +ftp://gee.cs.oswego.edu/pub/misc/malloc-2.8.4.h +You don't really need this .h file unless you call functions not +defined in your system include files. The .h file contains only the +excerpts from this file needed for using this malloc on ANSI C/C++ +systems, so long as you haven't changed compile-time options about +naming and tuning parameters. If you do, then you can create your +own malloc.h that does include all settings by cutting at the point +indicated below. Note that you may already by default be using a C +library containing a malloc that is based on some version of this +malloc (for example in linux). You might still want to use the one +in this file to customize settings or to avoid overheads associated +with library versions. + +* Vital statistics: + +Supported pointer/size_t representation: 4 or 8 bytes +size_t MUST be an unsigned type of the same width as +pointers. (If you are using an ancient system that declares +size_t as a signed type, or need it to be a different width +than pointers, you can use a previous release of this malloc +(e.g. 2.7.2) supporting these.) + +Alignment: 8 bytes (default) +This suffices for nearly all current machines and C compilers. +However, you can define MALLOC_ALIGNMENT to be wider than this +if necessary (up to 128bytes), at the expense of using more space. + +Minimum overhead per allocated chunk: 4 or 8 bytes (if 4byte sizes) +8 or 16 bytes (if 8byte sizes) +Each malloced chunk has a hidden word of overhead holding size +and status information, and additional cross-check word +if FOOTERS is defined. + +Minimum allocated size: 4-byte ptrs: 16 bytes (including overhead) +8-byte ptrs: 32 bytes (including overhead) + +Even a request for zero bytes (i.e., malloc(0)) returns a +pointer to something of the minimum allocatable size. +The maximum overhead wastage (i.e., number of extra bytes +allocated than were requested in malloc) is less than or equal +to the minimum size, except for requests >= mmap_threshold that +are serviced via mmap(), where the worst case wastage is about +32 bytes plus the remainder from a system page (the minimal +mmap unit); typically 4096 or 8192 bytes. + +Security: static-safe; optionally more or less +The "security" of malloc refers to the ability of malicious +code to accentuate the effects of errors (for example, freeing +space that is not currently malloc'ed or overwriting past the +ends of chunks) in code that calls malloc. This malloc +guarantees not to modify any memory locations below the base of +heap, i.e., static variables, even in the presence of usage +errors. The routines additionally detect most improper frees +and reallocs. All this holds as long as the static bookkeeping +for malloc itself is not corrupted by some other means. This +is only one aspect of security -- these checks do not, and +cannot, detect all possible programming errors. + +If FOOTERS is defined nonzero, then each allocated chunk +carries an additional check word to verify that it was malloced +from its space. These check words are the same within each +execution of a program using malloc, but differ across +executions, so externally crafted fake chunks cannot be +freed. This improves security by rejecting frees/reallocs that +could corrupt heap memory, in addition to the checks preventing +writes to statics that are always on. This may further improve +security at the expense of time and space overhead. (Note that +FOOTERS may also be worth using with MSPACES.) + +By default detected errors cause the program to abort (calling +"abort()"). You can override this to instead proceed past +errors by defining PROCEED_ON_ERROR. In this case, a bad free +has no effect, and a malloc that encounters a bad address +caused by user overwrites will ignore the bad address by +dropping pointers and indices to all known memory. This may +be appropriate for programs that should continue if at all +possible in the face of programming errors, although they may +run out of memory because dropped memory is never reclaimed. + +If you don't like either of these options, you can define +CORRUPTION_ERROR_ACTION and USAGE_ERROR_ACTION to do anything +else. And if if you are sure that your program using malloc has +no errors or vulnerabilities, you can define INSECURE to 1, +which might (or might not) provide a small performance improvement. + +Thread-safety: NOT thread-safe unless USE_LOCKS defined +When USE_LOCKS is defined, each public call to malloc, free, +etc is surrounded with either a pthread mutex or a win32 +spinlock (depending on DL_PLATFORM_WIN32). This is not especially fast, and +can be a major bottleneck. It is designed only to provide +minimal protection in concurrent environments, and to provide a +basis for extensions. If you are using malloc in a concurrent +program, consider instead using nedmalloc +(http://www.nedprod.com/programs/portable/nedmalloc/) or +ptmalloc (See http://www.malloc.de), which are derived +from versions of this malloc. + +System requirements: Any combination of MORECORE and/or MMAP/MUNMAP +This malloc can use unix sbrk or any emulation (invoked using +the CALL_MORECORE macro) and/or mmap/munmap or any emulation +(invoked using CALL_MMAP/CALL_MUNMAP) to get and release system +memory. On most unix systems, it tends to work best if both +MORECORE and MMAP are enabled. On Win32, it uses emulations +based on VirtualAlloc. It also uses common C library functions +like memset. + +Compliance: I believe it is compliant with the Single Unix Specification +(See http://www.unix.org). Also SVID/XPG, ANSI C, and probably +others as well. + +* Overview of algorithms + +This is not the fastest, most space-conserving, most portable, or +most tunable malloc ever written. However it is among the fastest +while also being among the most space-conserving, portable and +tunable. Consistent balance across these factors results in a good +general-purpose allocator for malloc-intensive programs. + +In most ways, this malloc is a best-fit allocator. Generally, it +chooses the best-fitting existing chunk for a request, with ties +broken in approximately least-recently-used order. (This strategy +normally maintains low fragmentation.) However, for requests less +than 256bytes, it deviates from best-fit when there is not an +exactly fitting available chunk by preferring to use space adjacent +to that used for the previous small request, as well as by breaking +ties in approximately most-recently-used order. (These enhance +locality of series of small allocations.) And for very large requests +(>= 256Kb by default), it relies on system memory mapping +facilities, if supported. (This helps avoid carrying around and +possibly fragmenting memory used only for large chunks.) + +All operations (except malloc_stats and mallinfo) have execution +times that are bounded by a constant factor of the number of bits in +a size_t, not counting any clearing in calloc or copying in realloc, +or actions surrounding MORECORE and MMAP that have times +proportional to the number of non-contiguous regions returned by +system allocation routines, which is often just 1. In real-time +applications, you can optionally suppress segment traversals using +NO_SEGMENT_TRAVERSAL, which assures bounded execution even when +system allocators return non-contiguous spaces, at the typical +expense of carrying around more memory and increased fragmentation. + +The implementation is not very modular and seriously overuses +macros. Perhaps someday all C compilers will do as good a job +inlining modular code as can now be done by brute-force expansion, +but now, enough of them seem not to. + +Some compilers issue a lot of warnings about code that is +dead/unreachable only on some platforms, and also about intentional +uses of negation on unsigned types. All known cases of each can be +ignored. + +For a longer but out of date high-level description, see +http://gee.cs.oswego.edu/dl/html/malloc.html + +* MSPACES +If MSPACES is defined, then in addition to malloc, free, etc., +this file also defines rak_mspace_malloc, rak_mspace_free, etc. These +are versions of malloc routines that take an "mspace" argument +obtained using rak_create_mspace, to control all internal bookkeeping. +If ONLY_MSPACES is defined, only these versions are compiled. +So if you would like to use this allocator for only some allocations, +and your system malloc for others, you can compile with +ONLY_MSPACES and then do something like... +static mspace mymspace = rak_create_mspace(0,0); // for example +#define mymalloc(bytes) rak_mspace_malloc(mymspace, bytes) + +(Note: If you only need one instance of an mspace, you can instead +use "USE_DL_PREFIX" to relabel the global malloc.) + +You can similarly create thread-local allocators by storing +mspaces as thread-locals. For example: +static __thread mspace tlms = 0; +void* tlmalloc(size_t bytes) { +if (tlms == 0) tlms = rak_create_mspace(0, 0); +return rak_mspace_malloc(tlms, bytes); +} +void tlfree(void* mem) { rak_mspace_free(tlms, mem); } + +Unless FOOTERS is defined, each mspace is completely independent. +You cannot allocate from one and free to another (although +conformance is only weakly checked, so usage errors are not always +caught). If FOOTERS is defined, then each chunk carries around a tag +indicating its originating mspace, and frees are directed to their +originating spaces. + +------------------------- Compile-time options --------------------------- + +Be careful in setting #define values for numerical constants of type +size_t. On some systems, literal values are not automatically extended +to size_t precision unless they are explicitly casted. You can also +use the symbolic values MAX_SIZE_T, SIZE_T_ONE, etc below. + +DL_PLATFORM_WIN32 default: defined if _WIN32 defined +Defining DL_PLATFORM_WIN32 sets up defaults for MS environment and compilers. +Otherwise defaults are for unix. Beware that there seem to be some +cases where this malloc might not be a pure drop-in replacement for +Win32 malloc: Random-looking failures from Win32 GDI API's (eg; +SetDIBits()) may be due to bugs in some video driver implementations +when pixel buffers are malloc()ed, and the region spans more than +one VirtualAlloc()ed region. Because rdlmalloc uses a small (64Kb) +default granularity, pixel buffers may straddle virtual allocation +regions more often than when using the Microsoft allocator. You can +avoid this by using VirtualAlloc() and VirtualFree() for all pixel +buffers rather than using malloc(). If this is not possible, +recompile this malloc with a larger DEFAULT_GRANULARITY. + +MALLOC_ALIGNMENT default: (size_t)8 +Controls the minimum alignment for malloc'ed chunks. It must be a +power of two and at least 8, even on machines for which smaller +alignments would suffice. It may be defined as larger than this +though. Note however that code and data structures are optimized for +the case of 8-byte alignment. + +MSPACES default: 0 (false) +If true, compile in support for independent allocation spaces. +This is only supported if HAVE_MMAP is true. + +ONLY_MSPACES default: 0 (false) +If true, only compile in mspace versions, not regular versions. + +USE_LOCKS default: 0 (false) +Causes each call to each public routine to be surrounded with +pthread or DL_PLATFORM_WIN32 mutex lock/unlock. (If set true, this can be +overridden on a per-mspace basis for mspace versions.) If set to a +non-zero value other than 1, locks are used, but their +implementation is left out, so lock functions must be supplied manually, +as described below. + +USE_SPIN_LOCKS default: 1 iff USE_LOCKS and on x86 using gcc or MSC +If true, uses custom spin locks for locking. This is currently +supported only for x86 platforms using gcc or recent MS compilers. +Otherwise, posix locks or win32 critical sections are used. + +FOOTERS default: 0 +If true, provide extra checking and dispatching by placing +information in the footers of allocated chunks. This adds +space and time overhead. + +INSECURE default: 0 +If true, omit checks for usage errors and heap space overwrites. + +USE_DL_PREFIX default: NOT defined +Causes compiler to prefix all public routines with the string 'dl'. +This can be useful when you only want to use this malloc in one part +of a program, using your regular system malloc elsewhere. + +ABORT default: defined as abort() +Defines how to abort on failed checks. On most systems, a failed +check cannot die with an "assert" or even print an informative +message, because the underlying print routines in turn call malloc, +which will fail again. Generally, the best policy is to simply call +abort(). It's not very useful to do more than this because many +errors due to overwriting will show up as address faults (null, odd +addresses etc) rather than malloc-triggered checks, so will also +abort. Also, most compilers know that abort() does not return, so +can better optimize code conditionally calling it. + +PROCEED_ON_ERROR default: defined as 0 (false) +Controls whether detected bad addresses cause them to bypassed +rather than aborting. If set, detected bad arguments to free and +realloc are ignored. And all bookkeeping information is zeroed out +upon a detected overwrite of freed heap space, thus losing the +ability to ever return it from malloc again, but enabling the +application to proceed. If PROCEED_ON_ERROR is defined, the +static variable malloc_corruption_error_count is compiled in +and can be examined to see if errors have occurred. This option +generates slower code than the default abort policy. + +DEBUG default: NOT defined +The DEBUG setting is mainly intended for people trying to modify +this code or diagnose problems when porting to new platforms. +However, it may also be able to better isolate user errors than just +using runtime checks. The assertions in the check routines spell +out in more detail the assumptions and invariants underlying the +algorithms. The checking is fairly extensive, and will slow down +execution noticeably. Calling malloc_stats or mallinfo with DEBUG +set will attempt to check every non-mmapped allocated and free chunk +in the course of computing the summaries. + +ABORT_ON_ASSERT_FAILURE default: defined as 1 (true) +Debugging assertion failures can be nearly impossible if your +version of the assert macro causes malloc to be called, which will +lead to a cascade of further failures, blowing the runtime stack. +ABORT_ON_ASSERT_FAILURE cause assertions failures to call abort(), +which will usually make debugging easier. + +MALLOC_FAILURE_ACTION default: sets errno to ENOMEM, or no-op on win32 +The action to take before "return 0" when malloc fails to be able to +return memory because there is none available. + +HAVE_MORECORE default: 1 (true) unless win32 or ONLY_MSPACES +True if this system supports sbrk or an emulation of it. + +MORECORE default: sbrk +The name of the sbrk-style system routine to call to obtain more +memory. See below for guidance on writing custom MORECORE +functions. The type of the argument to sbrk/MORECORE varies across +systems. It cannot be size_t, because it supports negative +arguments, so it is normally the signed type of the same width as +size_t (sometimes declared as "intptr_t"). It doesn't much matter +though. Internally, we only call it with arguments less than half +the max value of a size_t, which should work across all reasonable +possibilities, although sometimes generating compiler warnings. + +MORECORE_CONTIGUOUS default: 1 (true) if HAVE_MORECORE +If true, take advantage of fact that consecutive calls to MORECORE +with positive arguments always return contiguous increasing +addresses. This is true of unix sbrk. It does not hurt too much to +set it true anyway, since malloc copes with non-contiguities. +Setting it false when definitely non-contiguous saves time +and possibly wasted space it would take to discover this though. + +MORECORE_CANNOT_TRIM default: NOT defined +True if MORECORE cannot release space back to the system when given +negative arguments. This is generally necessary only if you are +using a hand-crafted MORECORE function that cannot handle negative +arguments. + +NO_SEGMENT_TRAVERSAL default: 0 +If non-zero, suppresses traversals of memory segments +returned by either MORECORE or CALL_MMAP. This disables +merging of segments that are contiguous, and selectively +releasing them to the OS if unused, but bounds execution times. + +HAVE_MMAP default: 1 (true) +True if this system supports mmap or an emulation of it. If so, and +HAVE_MORECORE is not true, MMAP is used for all system +allocation. If set and HAVE_MORECORE is true as well, MMAP is +primarily used to directly allocate very large blocks. It is also +used as a backup strategy in cases where MORECORE fails to provide +space from system. Note: A single call to MUNMAP is assumed to be +able to unmap memory that may have be allocated using multiple calls +to MMAP, so long as they are adjacent. + +HAVE_MREMAP default: 1 on linux, else 0 +If true realloc() uses mremap() to re-allocate large blocks and +extend or shrink allocation spaces. + +MMAP_CLEARS default: 1 except on WINCE. +True if mmap clears memory so calloc doesn't need to. This is true +for standard unix mmap using /dev/zero and on DL_PLATFORM_WIN32 except for WINCE. + +USE_BUILTIN_FFS default: 0 (i.e., not used) +Causes malloc to use the builtin ffs() function to compute indices. +Some compilers may recognize and intrinsify ffs to be faster than the +supplied C version. Also, the case of x86 using gcc is special-cased +to an asm instruction, so is already as fast as it can be, and so +this setting has no effect. Similarly for Win32 under recent MS compilers. +(On most x86s, the asm version is only slightly faster than the C version.) + +malloc_getpagesize default: derive from system includes, or 4096. +The system page size. To the extent possible, this malloc manages +memory from the system in page-size units. This may be (and +usually is) a function rather than a constant. This is ignored +if DL_PLATFORM_WIN32, where page size is determined using getSystemInfo during +initialization. + +USE_DEV_RANDOM default: 0 (i.e., not used) +Causes malloc to use /dev/random to initialize secure magic seed for +stamping footers. Otherwise, the current time is used. + +NO_MALLINFO default: 0 +If defined, don't compile "mallinfo". This can be a simple way +of dealing with mismatches between system declarations and +those in this file. + +MALLINFO_FIELD_TYPE default: size_t +The type of the fields in the mallinfo struct. This was originally +defined as "int" in SVID etc, but is more usefully defined as +size_t. The value is used only if HAVE_USR_INCLUDE_MALLOC_H is not set + +REALLOC_ZERO_BYTES_FREES default: not defined +This should be set if a call to realloc with zero bytes should +be the same as a call to free. Some people think it should. Otherwise, +since this malloc returns a unique pointer for malloc(0), so does +realloc(p, 0). + +LACKS_UNISTD_H, LACKS_FCNTL_H, LACKS_SYS_PARAM_H, LACKS_SYS_MMAN_H +LACKS_STRINGS_H, LACKS_STRING_H, LACKS_SYS_TYPES_H, LACKS_ERRNO_H +LACKS_STDLIB_H default: NOT defined unless on DL_PLATFORM_WIN32 +Define these if your system does not have these header files. +You might need to manually insert some of the declarations they provide. + +DEFAULT_GRANULARITY default: page size if MORECORE_CONTIGUOUS, +system_info.dwAllocationGranularity in DL_PLATFORM_WIN32, +otherwise 64K. +Also settable using mallopt(M_GRANULARITY, x) +The unit for allocating and deallocating memory from the system. On +most systems with contiguous MORECORE, there is no reason to +make this more than a page. However, systems with MMAP tend to +either require or encourage larger granularities. You can increase +this value to prevent system allocation functions to be called so +often, especially if they are slow. The value must be at least one +page and must be a power of two. Setting to 0 causes initialization +to either page size or win32 region size. (Note: In previous +versions of malloc, the equivalent of this option was called +"TOP_PAD") + +DEFAULT_TRIM_THRESHOLD default: 2MB +Also settable using mallopt(M_TRIM_THRESHOLD, x) +The maximum amount of unused top-most memory to keep before +releasing via malloc_trim in free(). Automatic trimming is mainly +useful in long-lived programs using contiguous MORECORE. Because +trimming via sbrk can be slow on some systems, and can sometimes be +wasteful (in cases where programs immediately afterward allocate +more large chunks) the value should be high enough so that your +overall system performance would improve by releasing this much +memory. As a rough guide, you might set to a value close to the +average size of a process (program) running on your system. +Releasing this much memory would allow such a process to run in +memory. Generally, it is worth tuning trim thresholds when a +program undergoes phases where several large chunks are allocated +and released in ways that can reuse each other's storage, perhaps +mixed with phases where there are no such chunks at all. The trim +value must be greater than page size to have any useful effect. To +disable trimming completely, you can set to MAX_SIZE_T. Note that the trick +some people use of mallocing a huge space and then freeing it at +program startup, in an attempt to reserve system memory, doesn't +have the intended effect under automatic trimming, since that memory +will immediately be returned to the system. + +DEFAULT_MMAP_THRESHOLD default: 256K +Also settable using mallopt(M_MMAP_THRESHOLD, x) +The request size threshold for using MMAP to directly service a +request. Requests of at least this size that cannot be allocated +using already-existing space will be serviced via mmap. (If enough +normal freed space already exists it is used instead.) Using mmap +segregates relatively large chunks of memory so that they can be +individually obtained and released from the host system. A request +serviced through mmap is never reused by any other request (at least +not directly; the system may just so happen to remap successive +requests to the same locations). Segregating space in this way has +the benefits that: Mmapped space can always be individually released +back to the system, which helps keep the system level memory demands +of a long-lived program low. Also, mapped memory doesn't become +`locked' between other chunks, as can happen with normally allocated +chunks, which means that even trimming via malloc_trim would not +release them. However, it has the disadvantage that the space +cannot be reclaimed, consolidated, and then used to service later +requests, as happens with normal chunks. The advantages of mmap +nearly always outweigh disadvantages for "large" chunks, but the +value of "large" may vary across systems. The default is an +empirically derived value that works well in most systems. You can +disable mmap by setting to MAX_SIZE_T. + +MAX_RELEASE_CHECK_RATE default: 4095 unless not HAVE_MMAP +The number of consolidated frees between checks to release +unused segments when freeing. When using non-contiguous segments, +especially with multiple mspaces, checking only for topmost space +doesn't always suffice to trigger trimming. To compensate for this, +free() will, with a period of MAX_RELEASE_CHECK_RATE (or the +current number of segments, if greater) try to release unused +segments to the OS when freeing chunks that result in +consolidation. The best value for this parameter is a compromise +between slowing down frees with relatively costly checks that +rarely trigger versus holding on to unused memory. To effectively +disable, set to MAX_SIZE_T. This may lead to a very slight speed +improvement at the expense of carrying around more memory. +*/ + +/* Version identifier to allow people to support multiple versions */ +#ifndef DLMALLOC_VERSION +#define DLMALLOC_VERSION 20804 +#endif /* DLMALLOC_VERSION */ + +#include "rdlmalloc-options.h" + +#ifndef WIN32 +#if defined(_XBOX) || defined(X360) +#else +#if defined(_WIN32) +#define DL_PLATFORM_WIN32 1 +#endif /* _WIN32 */ +#ifdef _WIN32_WCE +#define LACKS_FCNTL_H +#define DL_PLATFORM_WIN32 1 +#endif /* _WIN32_WCE */ +#endif +#else +#define DL_PLATFORM_WIN32 1 +#endif /* DL_PLATFORM_WIN32 */ + +#if defined(_XBOX) || defined(X360) +#define HAVE_MMAP 1 +#define HAVE_MORECORE 0 +#define LACKS_UNISTD_H +#define LACKS_SYS_PARAM_H +#define LACKS_SYS_MMAN_H +#define LACKS_STRING_H +#define LACKS_STRINGS_H +#define LACKS_SYS_TYPES_H +#define LACKS_ERRNO_H +#ifndef MALLOC_FAILURE_ACTION +#define MALLOC_FAILURE_ACTION +#endif +#define MMAP_CLEARS 1 +#endif + +#if defined(_PS3) || defined(__PS3__) || defined(SN_TARGET_PS3) || defined(SN_TARGET_PSP2) +#define LACKS_SYS_PARAM_H +#include "sysutil\sysutil_sysparam.h" +#define LACKS_SYS_MMAN_H +#endif + + +#ifdef DL_PLATFORM_WIN32 +#define WIN32_LEAN_AND_MEAN +#include +#define HAVE_MMAP 1 +#define HAVE_MORECORE 0 +#define LACKS_UNISTD_H +#define LACKS_SYS_PARAM_H +#define LACKS_SYS_MMAN_H +#define LACKS_STRING_H +#define LACKS_STRINGS_H +#define LACKS_SYS_TYPES_H +#define LACKS_ERRNO_H +#ifndef MALLOC_FAILURE_ACTION +#define MALLOC_FAILURE_ACTION +#endif /* MALLOC_FAILURE_ACTION */ +#ifdef _WIN32_WCE /* WINCE reportedly does not clear */ +#define MMAP_CLEARS 0 +#else +#define MMAP_CLEARS 1 +#endif /* _WIN32_WCE */ +#endif /* DL_PLATFORM_WIN32 */ + +#if defined(DARWIN) || defined(_DARWIN) +/* Mac OSX docs advise not to use sbrk; it seems better to use mmap */ +#ifndef HAVE_MORECORE +#define HAVE_MORECORE 0 +#define HAVE_MMAP 1 +/* OSX allocators provide 16 byte alignment */ +#ifndef MALLOC_ALIGNMENT +#define MALLOC_ALIGNMENT ((size_t)16U) +#endif +#endif /* HAVE_MORECORE */ +#endif /* DARWIN */ + +#ifndef LACKS_SYS_TYPES_H +#include /* For size_t */ +#endif /* LACKS_SYS_TYPES_H */ + +#if (defined(__GNUC__) && ((defined(__i386__) || defined(__x86_64__)))) || (defined(_MSC_VER) && _MSC_VER>=1310) +#define SPIN_LOCKS_AVAILABLE 1 +#else +#define SPIN_LOCKS_AVAILABLE 0 +#endif + +/* The maximum possible size_t value has all bits set */ +#define MAX_SIZE_T (~(size_t)0) + +#ifndef ONLY_MSPACES +#define ONLY_MSPACES 0 /* define to a value */ +#else +#define ONLY_MSPACES 1 +#endif /* ONLY_MSPACES */ +#ifndef MSPACES +#if ONLY_MSPACES +#define MSPACES 1 +#else /* ONLY_MSPACES */ +#define MSPACES 0 +#endif /* ONLY_MSPACES */ +#endif /* MSPACES */ +#ifndef MALLOC_ALIGNMENT +#define MALLOC_ALIGNMENT ((size_t)8U) +#endif /* MALLOC_ALIGNMENT */ +#ifndef FOOTERS +#define FOOTERS 0 +#endif /* FOOTERS */ +#ifndef ABORT +#define ABORT abort() +#endif /* ABORT */ +#ifndef ABORT_ON_ASSERT_FAILURE +#define ABORT_ON_ASSERT_FAILURE 1 +#endif /* ABORT_ON_ASSERT_FAILURE */ +#ifndef PROCEED_ON_ERROR +#define PROCEED_ON_ERROR 0 +#endif /* PROCEED_ON_ERROR */ +#ifndef USE_LOCKS +#define USE_LOCKS 0 +#endif /* USE_LOCKS */ +#ifndef USE_SPIN_LOCKS +#if USE_LOCKS && SPIN_LOCKS_AVAILABLE +#define USE_SPIN_LOCKS 1 +#else +#define USE_SPIN_LOCKS 0 +#endif /* USE_LOCKS && SPIN_LOCKS_AVAILABLE. */ +#endif /* USE_SPIN_LOCKS */ +#ifndef INSECURE +#define INSECURE 0 +#endif /* INSECURE */ +#ifndef HAVE_MMAP +#define HAVE_MMAP 1 +#endif /* HAVE_MMAP */ +#ifndef MMAP_CLEARS +#define MMAP_CLEARS 1 +#endif /* MMAP_CLEARS */ +#ifndef HAVE_MREMAP +#ifdef linux +#define HAVE_MREMAP 1 +#else /* linux */ +#define HAVE_MREMAP 0 +#endif /* linux */ +#endif /* HAVE_MREMAP */ +#ifndef MALLOC_FAILURE_ACTION +#define MALLOC_FAILURE_ACTION errno = ENOMEM; +#endif /* MALLOC_FAILURE_ACTION */ +#ifndef HAVE_MORECORE +#if ONLY_MSPACES +#define HAVE_MORECORE 0 +#else /* ONLY_MSPACES */ +#define HAVE_MORECORE 1 +#endif /* ONLY_MSPACES */ +#endif /* HAVE_MORECORE */ +#if !HAVE_MORECORE +#define MORECORE_CONTIGUOUS 0 +#else /* !HAVE_MORECORE */ +#define MORECORE_DEFAULT sbrk +#ifndef MORECORE_CONTIGUOUS +#define MORECORE_CONTIGUOUS 1 +#endif /* MORECORE_CONTIGUOUS */ +#endif /* HAVE_MORECORE */ +#ifndef DEFAULT_GRANULARITY +#if (MORECORE_CONTIGUOUS || defined(DL_PLATFORM_WIN32)) +#define DEFAULT_GRANULARITY (0) /* 0 means to compute in init_mparams */ +#else /* MORECORE_CONTIGUOUS */ +#define DEFAULT_GRANULARITY ((size_t)64U * (size_t)1024U) +#endif /* MORECORE_CONTIGUOUS */ +#endif /* DEFAULT_GRANULARITY */ +#ifndef DEFAULT_TRIM_THRESHOLD +#ifndef MORECORE_CANNOT_TRIM +#define DEFAULT_TRIM_THRESHOLD ((size_t)2U * (size_t)1024U * (size_t)1024U) +#else /* MORECORE_CANNOT_TRIM */ +#define DEFAULT_TRIM_THRESHOLD MAX_SIZE_T +#endif /* MORECORE_CANNOT_TRIM */ +#endif /* DEFAULT_TRIM_THRESHOLD */ +#ifndef DEFAULT_MMAP_THRESHOLD +#if HAVE_MMAP +#define DEFAULT_MMAP_THRESHOLD ((size_t)256U * (size_t)1024U) +#else /* HAVE_MMAP */ +#define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T +#endif /* HAVE_MMAP */ +#endif /* DEFAULT_MMAP_THRESHOLD */ +#ifndef MAX_RELEASE_CHECK_RATE +#if HAVE_MMAP +#define MAX_RELEASE_CHECK_RATE 4095 +#else +#define MAX_RELEASE_CHECK_RATE MAX_SIZE_T +#endif /* HAVE_MMAP */ +#endif /* MAX_RELEASE_CHECK_RATE */ +#ifndef USE_BUILTIN_FFS +#define USE_BUILTIN_FFS 0 +#endif /* USE_BUILTIN_FFS */ +#ifndef USE_DEV_RANDOM +#define USE_DEV_RANDOM 0 +#endif /* USE_DEV_RANDOM */ +#ifndef NO_MALLINFO +#define NO_MALLINFO 0 +#endif /* NO_MALLINFO */ +#ifndef MALLINFO_FIELD_TYPE +#define MALLINFO_FIELD_TYPE size_t +#endif /* MALLINFO_FIELD_TYPE */ +#ifndef NO_SEGMENT_TRAVERSAL +#define NO_SEGMENT_TRAVERSAL 0 +#endif /* NO_SEGMENT_TRAVERSAL */ + +/* +mallopt tuning options. SVID/XPG defines four standard parameter +numbers for mallopt, normally defined in malloc.h. None of these +are used in this malloc, so setting them has no effect. But this +malloc does support the following options. +*/ + +#define M_TRIM_THRESHOLD (-1) +#define M_GRANULARITY (-2) +#define M_MMAP_THRESHOLD (-3) + +/* ------------------------ Mallinfo declarations ------------------------ */ + +#if !NO_MALLINFO +/* +This version of malloc supports the standard SVID/XPG mallinfo +routine that returns a struct containing usage properties and +statistics. It should work on any system that has a +/usr/include/malloc.h defining struct mallinfo. The main +declaration needed is the mallinfo struct that is returned (by-copy) +by mallinfo(). The malloinfo struct contains a bunch of fields that +are not even meaningful in this version of malloc. These fields are +are instead filled by mallinfo() with other numbers that might be of +interest. + +HAVE_USR_INCLUDE_MALLOC_H should be set if you have a +/usr/include/malloc.h file that includes a declaration of struct +mallinfo. If so, it is included; else a compliant version is +declared below. These must be precisely the same for mallinfo() to +work. The original SVID version of this struct, defined on most +systems with mallinfo, declares all fields as ints. But some others +define as unsigned long. If your system defines the fields using a +type of different width than listed here, you MUST #include your +system version and #define HAVE_USR_INCLUDE_MALLOC_H. +*/ + +/* #define HAVE_USR_INCLUDE_MALLOC_H */ + +#ifdef HAVE_USR_INCLUDE_MALLOC_H +#include "/usr/include/malloc.h" +#else /* HAVE_USR_INCLUDE_MALLOC_H */ +#ifndef STRUCT_MALLINFO_DECLARED +#define STRUCT_MALLINFO_DECLARED 1 +struct mallinfo { + MALLINFO_FIELD_TYPE arena; /* non-mmapped space allocated from system */ + MALLINFO_FIELD_TYPE ordblks; /* number of free chunks */ + MALLINFO_FIELD_TYPE smblks; /* always 0 */ + MALLINFO_FIELD_TYPE hblks; /* always 0 */ + MALLINFO_FIELD_TYPE hblkhd; /* space in mmapped regions */ + MALLINFO_FIELD_TYPE usmblks; /* maximum total allocated space */ + MALLINFO_FIELD_TYPE fsmblks; /* always 0 */ + MALLINFO_FIELD_TYPE uordblks; /* total allocated space */ + MALLINFO_FIELD_TYPE fordblks; /* total free space */ + MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */ +}; +#endif /* STRUCT_MALLINFO_DECLARED */ +#endif /* HAVE_USR_INCLUDE_MALLOC_H */ +#endif /* NO_MALLINFO */ + +/* +Try to persuade compilers to inline. The most critical functions for +inlining are defined as macros, so these aren't used for them. +*/ + +#ifndef FORCEINLINE +#if defined(__GNUC__) +#define FORCEINLINE __inline __attribute__ ((always_inline)) +#elif defined(_MSC_VER) +#define FORCEINLINE __forceinline +#endif +#endif +#ifndef NOINLINE +#if defined(__GNUC__) +#define NOINLINE __attribute__ ((noinline)) +#elif defined(_MSC_VER) +#define NOINLINE __declspec(noinline) +#else +#define NOINLINE +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#ifndef FORCEINLINE +#define FORCEINLINE inline +#endif +#endif /* __cplusplus */ +#ifndef FORCEINLINE +#define FORCEINLINE +#endif + +#if !ONLY_MSPACES + + /* ------------------- Declarations of public routines ------------------- */ + +#ifndef USE_DL_PREFIX +#define rdlcalloc calloc +#define rdlfree free +#define rdlmalloc malloc +#define rdlmemalign memalign +#define rdlrealloc realloc +#define rdlvalloc valloc +#define rdlpvalloc pvalloc +#define rdlmallinfo mallinfo +#define rdlmallopt mallopt +#define rdlmalloc_trim malloc_trim +#define rdlmalloc_stats malloc_stats +#define rdlmalloc_usable_size malloc_usable_size +#define rdlmalloc_footprint malloc_footprint +#define dlmalloc_max_footprint malloc_max_footprint +#define rdlindependent_calloc independent_calloc +#define rdlindependent_comalloc independent_comalloc +#endif /* USE_DL_PREFIX */ + + + /* + malloc(size_t n) + Returns a pointer to a newly allocated chunk of at least n bytes, or + null if no space is available, in which case errno is set to ENOMEM + on ANSI C systems. + + If n is zero, malloc returns a minimum-sized chunk. (The minimum + size is 16 bytes on most 32bit systems, and 32 bytes on 64bit + systems.) Note that size_t is an unsigned type, so calls with + arguments that would be negative if signed are interpreted as + requests for huge amounts of space, which will often fail. The + maximum supported value of n differs across systems, but is in all + cases less than the maximum representable value of a size_t. + */ + void* rdlmalloc(size_t); + + /* + free(void* p) + Releases the chunk of memory pointed to by p, that had been previously + allocated using malloc or a related routine such as realloc. + It has no effect if p is null. If p was not malloced or already + freed, free(p) will by default cause the current program to abort. + */ + void rdlfree(void*); + + /* + calloc(size_t n_elements, size_t element_size); + Returns a pointer to n_elements * element_size bytes, with all locations + set to zero. + */ + void* rdlcalloc(size_t, size_t); + + /* + realloc(void* p, size_t n) + Returns a pointer to a chunk of size n that contains the same data + as does chunk p up to the minimum of (n, p's size) bytes, or null + if no space is available. + + The returned pointer may or may not be the same as p. The algorithm + prefers extending p in most cases when possible, otherwise it + employs the equivalent of a malloc-copy-free sequence. + + If p is null, realloc is equivalent to malloc. + + If space is not available, realloc returns null, errno is set (if on + ANSI) and p is NOT freed. + + if n is for fewer bytes than already held by p, the newly unused + space is lopped off and freed if possible. realloc with a size + argument of zero (re)allocates a minimum-sized chunk. + + The old unix realloc convention of allowing the last-free'd chunk + to be used as an argument to realloc is not supported. + */ + + void* rdlrealloc(void*, size_t); + + /* + memalign(size_t alignment, size_t n); + Returns a pointer to a newly allocated chunk of n bytes, aligned + in accord with the alignment argument. + + The alignment argument should be a power of two. If the argument is + not a power of two, the nearest greater power is used. + 8-byte alignment is guaranteed by normal malloc calls, so don't + bother calling memalign with an argument of 8 or less. + + Overreliance on memalign is a sure way to fragment space. + */ + void* rdlmemalign(size_t, size_t); + + /* + valloc(size_t n); + Equivalent to memalign(pagesize, n), where pagesize is the page + size of the system. If the pagesize is unknown, 4096 is used. + */ + void* rdlvalloc(size_t); + + /* + mallopt(int parameter_number, int parameter_value) + Sets tunable parameters The format is to provide a + (parameter-number, parameter-value) pair. mallopt then sets the + corresponding parameter to the argument value if it can (i.e., so + long as the value is meaningful), and returns 1 if successful else + 0. To workaround the fact that mallopt is specified to use int, + not size_t parameters, the value -1 is specially treated as the + maximum unsigned size_t value. + + SVID/XPG/ANSI defines four standard param numbers for mallopt, + normally defined in malloc.h. None of these are use in this malloc, + so setting them has no effect. But this malloc also supports other + options in mallopt. See below for details. Briefly, supported + parameters are as follows (listed defaults are for "typical" + configurations). + + Symbol param # default allowed param values + M_TRIM_THRESHOLD -1 2*1024*1024 any (-1 disables) + M_GRANULARITY -2 page size any power of 2 >= page size + M_MMAP_THRESHOLD -3 256*1024 any (or 0 if no MMAP support) + */ + int rdlmallopt(int, int); + + /* + malloc_footprint(); + Returns the number of bytes obtained from the system. The total + number of bytes allocated by malloc, realloc etc., is less than this + value. Unlike mallinfo, this function returns only a precomputed + result, so can be called frequently to monitor memory consumption. + Even if locks are otherwise defined, this function does not use them, + so results might not be up to date. + */ + size_t rdlmalloc_footprint(void); + + /* + malloc_max_footprint(); + Returns the maximum number of bytes obtained from the system. This + value will be greater than current footprint if deallocated space + has been reclaimed by the system. The peak number of bytes allocated + by malloc, realloc etc., is less than this value. Unlike mallinfo, + this function returns only a precomputed result, so can be called + frequently to monitor memory consumption. Even if locks are + otherwise defined, this function does not use them, so results might + not be up to date. + */ + size_t dlmalloc_max_footprint(void); + +#if !NO_MALLINFO + /* + mallinfo() + Returns (by copy) a struct containing various summary statistics: + + arena: current total non-mmapped bytes allocated from system + ordblks: the number of free chunks + smblks: always zero. + hblks: current number of mmapped regions + hblkhd: total bytes held in mmapped regions + usmblks: the maximum total allocated space. This will be greater + than current total if trimming has occurred. + fsmblks: always zero + uordblks: current total allocated space (normal or mmapped) + fordblks: total free space + keepcost: the maximum number of bytes that could ideally be released + back to system via malloc_trim. ("ideally" means that + it ignores page restrictions etc.) + + Because these fields are ints, but internal bookkeeping may + be kept as longs, the reported values may wrap around zero and + thus be inaccurate. + */ + struct mallinfo rdlmallinfo(void); +#endif /* NO_MALLINFO */ + + /* + independent_calloc(size_t n_elements, size_t element_size, void* chunks[]); + + independent_calloc is similar to calloc, but instead of returning a + single cleared space, it returns an array of pointers to n_elements + independent elements that can hold contents of size elem_size, each + of which starts out cleared, and can be independently freed, + realloc'ed etc. The elements are guaranteed to be adjacently + allocated (this is not guaranteed to occur with multiple callocs or + mallocs), which may also improve cache locality in some + applications. + + The "chunks" argument is optional (i.e., may be null, which is + probably the most typical usage). If it is null, the returned array + is itself dynamically allocated and should also be freed when it is + no longer needed. Otherwise, the chunks array must be of at least + n_elements in length. It is filled in with the pointers to the + chunks. + + In either case, independent_calloc returns this pointer array, or + null if the allocation failed. If n_elements is zero and "chunks" + is null, it returns a chunk representing an array with zero elements + (which should be freed if not wanted). + + Each element must be individually freed when it is no longer + needed. If you'd like to instead be able to free all at once, you + should instead use regular calloc and assign pointers into this + space to represent elements. (In this case though, you cannot + independently free elements.) + + independent_calloc simplifies and speeds up implementations of many + kinds of pools. It may also be useful when constructing large data + structures that initially have a fixed number of fixed-sized nodes, + but the number is not known at compile time, and some of the nodes + may later need to be freed. For example: + + struct Node { int item; struct Node* next; }; + + struct Node* build_list() { + struct Node** pool; + int n = read_number_of_nodes_needed(); + if (n <= 0) return 0; + pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0); + if (pool == 0) die(); + // organize into a linked list... + struct Node* first = pool[0]; + for (i = 0; i < n-1; ++i) + pool[i]->next = pool[i+1]; + free(pool); // Can now free the array (or not, if it is needed later) + return first; + } + */ + void** rdlindependent_calloc(size_t, size_t, void**); + + /* + independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]); + + independent_comalloc allocates, all at once, a set of n_elements + chunks with sizes indicated in the "sizes" array. It returns + an array of pointers to these elements, each of which can be + independently freed, realloc'ed etc. The elements are guaranteed to + be adjacently allocated (this is not guaranteed to occur with + multiple callocs or mallocs), which may also improve cache locality + in some applications. + + The "chunks" argument is optional (i.e., may be null). If it is null + the returned array is itself dynamically allocated and should also + be freed when it is no longer needed. Otherwise, the chunks array + must be of at least n_elements in length. It is filled in with the + pointers to the chunks. + + In either case, independent_comalloc returns this pointer array, or + null if the allocation failed. If n_elements is zero and chunks is + null, it returns a chunk representing an array with zero elements + (which should be freed if not wanted). + + Each element must be individually freed when it is no longer + needed. If you'd like to instead be able to free all at once, you + should instead use a single regular malloc, and assign pointers at + particular offsets in the aggregate space. (In this case though, you + cannot independently free elements.) + + independent_comallac differs from independent_calloc in that each + element may have a different size, and also that it does not + automatically clear elements. + + independent_comalloc can be used to speed up allocation in cases + where several structs or objects must always be allocated at the + same time. For example: + + struct Head { ... } + struct Foot { ... } + + void send_message(char* msg) { + int msglen = strlen(msg); + size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) }; + void* chunks[3]; + if (independent_comalloc(3, sizes, chunks) == 0) + die(); + struct Head* head = (struct Head*)(chunks[0]); + char* body = (char*)(chunks[1]); + struct Foot* foot = (struct Foot*)(chunks[2]); + // ... + } + + In general though, independent_comalloc is worth using only for + larger values of n_elements. For small values, you probably won't + detect enough difference from series of malloc calls to bother. + + Overuse of independent_comalloc can increase overall memory usage, + since it cannot reuse existing noncontiguous small chunks that + might be available for some of the elements. + */ + void** rdlindependent_comalloc(size_t, size_t*, void**); + + + /* + pvalloc(size_t n); + Equivalent to valloc(minimum-page-that-holds(n)), that is, + round up n to nearest pagesize. + */ + void* rdlpvalloc(size_t); + + /* + malloc_trim(size_t pad); + + If possible, gives memory back to the system (via negative arguments + to sbrk) if there is unused memory at the `high' end of the malloc + pool or in unused MMAP segments. You can call this after freeing + large blocks of memory to potentially reduce the system-level memory + requirements of a program. However, it cannot guarantee to reduce + memory. Under some allocation patterns, some large free blocks of + memory will be locked between two used chunks, so they cannot be + given back to the system. + + The `pad' argument to malloc_trim represents the amount of free + trailing space to leave untrimmed. If this argument is zero, only + the minimum amount of memory to maintain internal data structures + will be left. Non-zero arguments can be supplied to maintain enough + trailing space to service future expected allocations without having + to re-obtain memory from the system. + + Malloc_trim returns 1 if it actually released any memory, else 0. + */ + int rdlmalloc_trim(size_t); + + /* + malloc_stats(); + Prints on stderr the amount of space obtained from the system (both + via sbrk and mmap), the maximum amount (which may be more than + current if malloc_trim and/or munmap got called), and the current + number of bytes allocated via malloc (or realloc, etc) but not yet + freed. Note that this is the number of bytes allocated, not the + number requested. It will be larger than the number requested + because of alignment and bookkeeping overhead. Because it includes + alignment wastage as being in use, this figure may be greater than + zero even when no user-level chunks are allocated. + + The reported current and maximum system memory can be inaccurate if + a program makes other calls to system memory allocation functions + (normally sbrk) outside of malloc. + + malloc_stats prints only the most commonly interesting statistics. + More information can be obtained by calling mallinfo. + */ + void rdlmalloc_stats(void); + +#endif /* ONLY_MSPACES */ + + /* + malloc_usable_size(void* p); + + Returns the number of bytes you can actually use in + an allocated chunk, which may be more than you requested (although + often not) due to alignment and minimum size constraints. + You can use this many bytes without worrying about + overwriting other allocated objects. This is not a particularly great + programming practice. malloc_usable_size can be more useful in + debugging and assertions, for example: + + p = malloc(n); + assert(malloc_usable_size(p) >= 256); + */ + size_t rdlmalloc_usable_size(void*); + + +#if MSPACES + + /* + mspace is an opaque type representing an independent + region of space that supports rak_mspace_malloc, etc. + */ + typedef void* mspace; + + /* + rak_create_mspace creates and returns a new independent space with the + given initial capacity, or, if 0, the default granularity size. It + returns null if there is no system memory available to create the + space. If argument locked is non-zero, the space uses a separate + lock to control access. The capacity of the space will grow + dynamically as needed to service rak_mspace_malloc requests. You can + control the sizes of incremental increases of this space by + compiling with a different DEFAULT_GRANULARITY or dynamically + setting with mallopt(M_GRANULARITY, value). + */ + mspace rak_create_mspace(size_t capacity, int locked); + + /* + rak_destroy_mspace destroys the given space, and attempts to return all + of its memory back to the system, returning the total number of + bytes freed. After destruction, the results of access to all memory + used by the space become undefined. + */ + size_t rak_destroy_mspace(mspace msp); + + /* + rak_create_mspace_with_base uses the memory supplied as the initial base + of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this + space is used for bookkeeping, so the capacity must be at least this + large. (Otherwise 0 is returned.) When this initial space is + exhausted, additional memory will be obtained from the system. + Destroying this space will deallocate all additionally allocated + space (if possible) but not the initial base. + */ + mspace rak_create_mspace_with_base(void* base, size_t capacity, int locked); + + /* + rak_mspace_track_large_chunks controls whether requests for large chunks + are allocated in their own untracked mmapped regions, separate from + others in this mspace. By default large chunks are not tracked, + which reduces fragmentation. However, such chunks are not + necessarily released to the system upon rak_destroy_mspace. Enabling + tracking by setting to true may increase fragmentation, but avoids + leakage when relying on rak_destroy_mspace to release all memory + allocated using this space. The function returns the previous + setting. + */ + int rak_mspace_track_large_chunks(mspace msp, int enable); + + + /* + rak_mspace_malloc behaves as malloc, but operates within + the given space. + */ + void* rak_mspace_malloc(mspace msp, size_t bytes); + + /* + rak_mspace_free behaves as free, but operates within + the given space. + + If compiled with FOOTERS==1, rak_mspace_free is not actually needed. + free may be called instead of rak_mspace_free because freed chunks from + any space are handled by their originating spaces. + */ + void rak_mspace_free(mspace msp, void* mem); + + /* + rak_mspace_realloc behaves as realloc, but operates within + the given space. + + If compiled with FOOTERS==1, rak_mspace_realloc is not actually + needed. realloc may be called instead of rak_mspace_realloc because + realloced chunks from any space are handled by their originating + spaces. + */ + void* rak_mspace_realloc(mspace msp, void* mem, size_t newsize); + + /* + rak_mspace_calloc behaves as calloc, but operates within + the given space. + */ + void* rak_mspace_calloc(mspace msp, size_t n_elements, size_t elem_size); + + /* + rak_mspace_memalign behaves as memalign, but operates within + the given space. + */ + void* rak_mspace_memalign(mspace msp, size_t alignment, size_t bytes); + + /* + rak_mspace_independent_calloc behaves as independent_calloc, but + operates within the given space. + */ + void** rak_mspace_independent_calloc(mspace msp, size_t n_elements, + size_t elem_size, void* chunks[]); + + /* + rak_mspace_independent_comalloc behaves as independent_comalloc, but + operates within the given space. + */ + void** rak_mspace_independent_comalloc(mspace msp, size_t n_elements, + size_t sizes[], void* chunks[]); + + /* + rak_mspace_footprint() returns the number of bytes obtained from the + system for this space. + */ + size_t rak_mspace_footprint(mspace msp); + + /* + mspace_max_footprint() returns the peak number of bytes obtained from the + system for this space. + */ + size_t mspace_max_footprint(mspace msp); + + +#if !NO_MALLINFO + /* + rak_mspace_mallinfo behaves as mallinfo, but reports properties of + the given space. + */ + struct mallinfo rak_mspace_mallinfo(mspace msp); +#endif /* NO_MALLINFO */ + + /* + malloc_usable_size(void* p) behaves the same as malloc_usable_size; + */ + size_t rak_mspace_usable_size(void* mem); + + /* + rak_mspace_malloc_stats behaves as malloc_stats, but reports + properties of the given space. + */ + void rak_mspace_malloc_stats(mspace msp); + + /* + rak_mspace_trim behaves as malloc_trim, but + operates within the given space. + */ + int rak_mspace_trim(mspace msp, size_t pad); + + /* + An alias for mallopt. + */ + int rak_mspace_mallopt(int, int); + +#endif /* MSPACES */ + +#ifdef __cplusplus +}; /* end of extern "C" */ +#endif /* __cplusplus */ + +/* +======================================================================== +To make a fully customizable malloc.h header file, cut everything +above this line, put into file malloc.h, edit to suit, and #include it +on the next line, as well as in programs that use this malloc. +======================================================================== +*/ + +/* #include "malloc.h" */ + +/*------------------------------ internal #includes ---------------------- */ + +#ifdef DL_PLATFORM_WIN32 +#pragma warning( disable : 4146 ) /* no "unsigned" warnings */ +#endif /* DL_PLATFORM_WIN32 */ + +#include /* for printing in malloc_stats */ + +#ifndef LACKS_ERRNO_H +#include /* for MALLOC_FAILURE_ACTION */ +#endif /* LACKS_ERRNO_H */ + +#if FOOTERS || DEBUG +#include /* for magic initialization */ +#endif /* FOOTERS */ + +#ifndef LACKS_STDLIB_H +#include /* for abort() */ +#endif /* LACKS_STDLIB_H */ + +#ifdef DEBUG +#if ABORT_ON_ASSERT_FAILURE +#undef assert +#define assert(x) if(!(x)) ABORT +#else /* ABORT_ON_ASSERT_FAILURE */ +#include +#endif /* ABORT_ON_ASSERT_FAILURE */ +#else /* DEBUG */ +#ifndef assert +#define assert(x) +#endif +#define DEBUG 0 +#endif /* DEBUG */ + +#ifndef LACKS_STRING_H +#include /* for memset etc */ +#endif /* LACKS_STRING_H */ + +#if USE_BUILTIN_FFS +#ifndef LACKS_STRINGS_H +#include /* for ffs */ +#endif /* LACKS_STRINGS_H */ +#endif /* USE_BUILTIN_FFS */ + +#if HAVE_MMAP +#ifndef LACKS_SYS_MMAN_H +/* On some versions of linux, mremap decl in mman.h needs __USE_GNU set */ +#if (defined(linux) && !defined(__USE_GNU)) +#define __USE_GNU 1 +#include /* for mmap */ +#undef __USE_GNU +#else +#include /* for mmap */ +#endif /* linux */ +#endif /* LACKS_SYS_MMAN_H */ +#ifndef LACKS_FCNTL_H +#include +#endif /* LACKS_FCNTL_H */ +#endif /* HAVE_MMAP */ + +#ifndef LACKS_UNISTD_H +#include /* for sbrk, sysconf */ +#else /* LACKS_UNISTD_H */ +#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__) +extern void* sbrk(ptrdiff_t); +#endif /* FreeBSD etc */ +#endif /* LACKS_UNISTD_H */ + +/* Declarations for locking */ +#if USE_LOCKS +#if defined(_XBOX) || defined(X360) +#pragma intrinsic (_InterlockedCompareExchange) +#pragma intrinsic (_InterlockedExchange) +#define interlockedcompareexchange _InterlockedCompareExchange +#define interlockedexchange _InterlockedExchange +#elif !defined(DL_PLATFORM_WIN32) +#include +#if defined (__SVR4) && defined (__sun) /* solaris */ +#include +#endif /* solaris */ +#else +#ifndef _M_AMD64 +/* These are already defined on AMD64 builds */ +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + LONG __cdecl _InterlockedCompareExchange(LONG volatile *Dest, LONG Exchange, LONG Comp); + LONG __cdecl _InterlockedExchange(LONG volatile *Target, LONG Value); +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* _M_AMD64 */ +#pragma intrinsic (_InterlockedCompareExchange) +#pragma intrinsic (_InterlockedExchange) +#define interlockedcompareexchange _InterlockedCompareExchange +#define interlockedexchange _InterlockedExchange +#endif /* Win32 */ +#endif /* USE_LOCKS */ + +/* Declarations for bit scanning on win32 */ +#if defined(_MSC_VER) && _MSC_VER>=1300 && defined(DL_PLATFORM_WIN32) +#ifndef BitScanForward /* Try to avoid pulling in WinNT.h */ +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + unsigned char _BitScanForward(unsigned long *index, unsigned long mask); + unsigned char _BitScanReverse(unsigned long *index, unsigned long mask); +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#define BitScanForward _BitScanForward +#define BitScanReverse _BitScanReverse +#pragma intrinsic(_BitScanForward) +#pragma intrinsic(_BitScanReverse) +#endif /* BitScanForward */ +#endif /* defined(_MSC_VER) && _MSC_VER>=1300 */ + +#ifndef DL_PLATFORM_WIN32 +#ifndef malloc_getpagesize +# ifdef _SC_PAGESIZE /* some SVR4 systems omit an underscore */ +# ifndef _SC_PAGE_SIZE +# define _SC_PAGE_SIZE _SC_PAGESIZE +# endif +# endif +# ifdef _SC_PAGE_SIZE +# define malloc_getpagesize sysconf(_SC_PAGE_SIZE) +# else +# if defined(BSD) || defined(DGUX) || defined(HAVE_GETPAGESIZE) +extern size_t getpagesize(); +# define malloc_getpagesize getpagesize() +# else +# ifdef DL_PLATFORM_WIN32 /* use supplied emulation of getpagesize */ +# define malloc_getpagesize getpagesize() +# else +# ifndef LACKS_SYS_PARAM_H +# include +# endif +# ifdef EXEC_PAGESIZE +# define malloc_getpagesize EXEC_PAGESIZE +# else +# ifdef NBPG +# ifndef CLSIZE +# define malloc_getpagesize NBPG +# else +# define malloc_getpagesize (NBPG * CLSIZE) +# endif +# else +# ifdef NBPC +# define malloc_getpagesize NBPC +# else +# ifdef PAGESIZE +# define malloc_getpagesize PAGESIZE +# else /* just guess */ +# define malloc_getpagesize ((size_t)4096U) +# endif +# endif +# endif +# endif +# endif +# endif +# endif +#endif +#endif + + + +/* ------------------- size_t and alignment properties -------------------- */ + +/* The byte and bit size of a size_t */ +#define SIZE_T_SIZE (sizeof(size_t)) +#define SIZE_T_BITSIZE (sizeof(size_t) << 3) + +/* Some constants coerced to size_t */ +/* Annoying but necessary to avoid errors on some platforms */ +#define SIZE_T_ZERO ((size_t)0) +#define SIZE_T_ONE ((size_t)1) +#define SIZE_T_TWO ((size_t)2) +#define SIZE_T_FOUR ((size_t)4) +#define TWO_SIZE_T_SIZES (SIZE_T_SIZE<<1) +#define FOUR_SIZE_T_SIZES (SIZE_T_SIZE<<2) +#define SIX_SIZE_T_SIZES (FOUR_SIZE_T_SIZES+TWO_SIZE_T_SIZES) +#define HALF_MAX_SIZE_T (MAX_SIZE_T / 2U) + +/* The bit mask value corresponding to MALLOC_ALIGNMENT */ +#define CHUNK_ALIGN_MASK (MALLOC_ALIGNMENT - SIZE_T_ONE) + +/* True if address a has acceptable alignment */ +#define is_aligned(A) (((size_t)((A)) & (CHUNK_ALIGN_MASK)) == 0) + +/* the number of bytes to offset an address to align it */ +#define align_offset(A)\ + ((((size_t)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\ + ((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_MASK)) + +/* -------------------------- MMAP preliminaries ------------------------- */ + +/* +If HAVE_MORECORE or HAVE_MMAP are false, we just define calls and +checks to fail so compiler optimizer can delete code rather than +using so many "#if"s. +*/ + + +/* MORECORE and MMAP must return MFAIL on failure */ +#define MFAIL ((void*)(MAX_SIZE_T)) +#define CMFAIL ((char*)(MFAIL)) /* defined for convenience */ + +#if HAVE_MMAP + +#if defined(_XBOX) || defined(X360) + /* Win32 MMAP via VirtualAlloc */ + static void* win32mmap(size_t size) { + void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE); + return (ptr != 0)? ptr: MFAIL; + } + + /* For direct MMAP, use MEM_TOP_DOWN to minimize interference */ + static void* win32direct_mmap(size_t size) { + void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, + PAGE_READWRITE); + return (ptr != 0)? ptr: MFAIL; + } + + /* This function supports releasing coalesed segments */ + static int win32munmap(void* ptr, size_t size) { + MEMORY_BASIC_INFORMATION minfo; + char* cptr = (char*)ptr; + while (size) { + if (VirtualQuery(cptr, &minfo, sizeof(minfo)) == 0) + return -1; + if (minfo.BaseAddress != cptr || minfo.AllocationBase != cptr || + minfo.State != MEM_COMMIT || minfo.RegionSize > size) + return -1; + if (VirtualFree(cptr, 0, MEM_RELEASE) == 0) + return -1; + cptr += minfo.RegionSize; + size -= minfo.RegionSize; + } + return 0; + } + + #define RAK_MMAP_DEFAULT(s) win32mmap(s) + #define RAK_MUNMAP_DEFAULT(a, s) win32munmap((a), (s)) + #define RAK_DIRECT_MMAP_DEFAULT(s) win32direct_mmap(s) +#elif defined(_PS3) || defined(__PS3__) || defined(SN_TARGET_PS3) || defined(SN_TARGET_PSP2) + +inline int ___freeit_dlmalloc_default__(void* s) {free(s); return 0;} +#define RAK_MMAP_DEFAULT(s) malloc(s); +#define RAK_MUNMAP_DEFAULT(a, s) ___freeit_dlmalloc_default__(a); +#define RAK_DIRECT_MMAP_DEFAULT(s) malloc(s); + +#elif !defined(DL_PLATFORM_WIN32) + #define RAK_MUNMAP_DEFAULT(a, s) munmap((a), (s)) + #define MMAP_PROT (PROT_READ|PROT_WRITE) + #if !defined(MAP_ANONYMOUS) && defined(MAP_ANON) + #define MAP_ANONYMOUS MAP_ANON + #endif /* MAP_ANON */ + #ifdef MAP_ANONYMOUS + #define MMAP_FLAGS (MAP_PRIVATE|MAP_ANONYMOUS) + #define RAK_MMAP_DEFAULT(s) mmap(0, (s), MMAP_PROT, MMAP_FLAGS, -1, 0) + #else /* MAP_ANONYMOUS */ + /* + Nearly all versions of mmap support MAP_ANONYMOUS, so the following + is unlikely to be needed, but is supplied just in case. + */ + #define MMAP_FLAGS (MAP_PRIVATE) + static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */ + #define RAK_MMAP_DEFAULT(s) ((dev_zero_fd < 0) ? \ + (dev_zero_fd = open("/dev/zero", O_RDWR), \ + mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) : \ + mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) + #endif /* MAP_ANONYMOUS */ + + #define RAK_DIRECT_MMAP_DEFAULT(s) RAK_MMAP_DEFAULT(s) + +#else /* DL_PLATFORM_WIN32 */ + + /* Win32 MMAP via VirtualAlloc */ + static FORCEINLINE void* win32mmap(size_t size) { + void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE); + return (ptr != 0)? ptr: MFAIL; + } + + /* For direct MMAP, use MEM_TOP_DOWN to minimize interference */ + static FORCEINLINE void* win32direct_mmap(size_t size) { + void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, + PAGE_READWRITE); + return (ptr != 0)? ptr: MFAIL; + } + + /* This function supports releasing coalesed segments */ + static FORCEINLINE int win32munmap(void* ptr, size_t size) { + MEMORY_BASIC_INFORMATION minfo; + char* cptr = (char*)ptr; + while (size) { + if (VirtualQuery(cptr, &minfo, sizeof(minfo)) == 0) + return -1; + if (minfo.BaseAddress != cptr || minfo.AllocationBase != cptr || + minfo.State != MEM_COMMIT || minfo.RegionSize > size) + return -1; + if (VirtualFree(cptr, 0, MEM_RELEASE) == 0) + return -1; + cptr += minfo.RegionSize; + size -= minfo.RegionSize; + } + return 0; + } + + #define RAK_MMAP_DEFAULT(s) win32mmap(s) + #define RAK_MUNMAP_DEFAULT(a, s) win32munmap((a), (s)) + #define RAK_DIRECT_MMAP_DEFAULT(s) win32direct_mmap(s) +#endif /* DL_PLATFORM_WIN32 */ +#endif /* HAVE_MMAP */ + +#if HAVE_MREMAP +#ifndef DL_PLATFORM_WIN32 +#define MREMAP_DEFAULT(addr, osz, nsz, mv) mremap((addr), (osz), (nsz), (mv)) +#endif /* DL_PLATFORM_WIN32 */ +#endif /* HAVE_MREMAP */ + + +/** +* Define CALL_MORECORE +*/ +#if HAVE_MORECORE +#ifdef MORECORE +#define CALL_MORECORE(S) MORECORE(S) +#else /* MORECORE */ +#define CALL_MORECORE(S) MORECORE_DEFAULT(S) +#endif /* MORECORE */ +#else /* HAVE_MORECORE */ +#define CALL_MORECORE(S) MFAIL +#endif /* HAVE_MORECORE */ + +/** +* Define CALL_MMAP/CALL_MUNMAP/CALL_DIRECT_MMAP +*/ +#if HAVE_MMAP +#define USE_MMAP_BIT (SIZE_T_ONE) + +#ifdef MMAP +#define CALL_MMAP(s) MMAP(s) +#else /* MMAP */ +#define CALL_MMAP(s) RAK_MMAP_DEFAULT(s) +#endif /* MMAP */ +#ifdef MUNMAP +#define CALL_MUNMAP(a, s) MUNMAP((a), (s)) +#else /* MUNMAP */ +#define CALL_MUNMAP(a, s) RAK_MUNMAP_DEFAULT((a), (s)) +#endif /* MUNMAP */ +#ifdef DIRECT_MMAP +#define CALL_DIRECT_MMAP(s) DIRECT_MMAP(s) +#else /* DIRECT_MMAP */ +#define CALL_DIRECT_MMAP(s) RAK_DIRECT_MMAP_DEFAULT(s) +#endif /* DIRECT_MMAP */ +#else /* HAVE_MMAP */ +#define USE_MMAP_BIT (SIZE_T_ZERO) + +#define MMAP(s) MFAIL +#define MUNMAP(a, s) (-1) +#define DIRECT_MMAP(s) MFAIL +#define CALL_DIRECT_MMAP(s) DIRECT_MMAP(s) +#define CALL_MMAP(s) MMAP(s) +#define CALL_MUNMAP(a, s) MUNMAP((a), (s)) +#endif /* HAVE_MMAP */ + +/** +* Define CALL_MREMAP +*/ +#if HAVE_MMAP && HAVE_MREMAP +#ifdef MREMAP +#define CALL_MREMAP(addr, osz, nsz, mv) MREMAP((addr), (osz), (nsz), (mv)) +#else /* MREMAP */ +#define CALL_MREMAP(addr, osz, nsz, mv) MREMAP_DEFAULT((addr), (osz), (nsz), (mv)) +#endif /* MREMAP */ +#else /* HAVE_MMAP && HAVE_MREMAP */ +#define CALL_MREMAP(addr, osz, nsz, mv) MFAIL +#endif /* HAVE_MMAP && HAVE_MREMAP */ + +/* mstate bit set if continguous morecore disabled or failed */ +#define USE_NONCONTIGUOUS_BIT (4U) + +/* segment bit set in rak_create_mspace_with_base */ +#define EXTERN_BIT (8U) + + +#endif /* MALLOC_280_H */ + +#endif // _RAKNET_SUPPORT_DL_MALLOC \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/raspberry/Makefile b/minecraftcpp-master/handheld/project/raspberry/Makefile new file mode 100644 index 0000000..a501aa9 --- /dev/null +++ b/minecraftcpp-master/handheld/project/raspberry/Makefile @@ -0,0 +1,309 @@ +MODULE := minecraftpi +SOURCES := ../../src/main.cpp \ +../../src/main_rpi.cpp \ +../../src/platform/input/Controller.cpp \ +../../src/platform/input/Keyboard.cpp \ +../../src/platform/input/Mouse.cpp \ +../../src/platform/input/Multitouch.cpp \ +../../src/platform/time.cpp \ +../../src/platform/CThread.cpp \ +../../src/NinecraftApp.cpp \ +../../src/Performance.cpp \ +../../src/SharedConstants.cpp \ +../../src/client/IConfigListener.cpp \ +../../src/client/Minecraft.cpp \ +../../src/client/Options.cpp \ +../../src/client/OptionStrings.cpp \ +../../src/client/OptionsFile.cpp \ +../../src/client/MouseHandler.cpp \ +../../src/client/gamemode/CreatorMode.cpp \ +../../src/client/gamemode/GameMode.cpp \ +../../src/client/gamemode/CreativeMode.cpp \ +../../src/client/gamemode/SurvivalMode.cpp \ +../../src/client/gui/components/Button.cpp \ +../../src/client/gui/components/ImageButton.cpp \ +../../src/client/gui/components/GuiElement.cpp \ +../../src/client/gui/components/GuiElementContainer.cpp \ +../../src/client/gui/components/ItemPane.cpp \ +../../src/client/gui/components/InventoryPane.cpp \ +../../src/client/gui/components/LargeImageButton.cpp \ +../../src/client/gui/components/NinePatch.cpp \ +../../src/client/gui/components/RolledSelectionListH.cpp \ +../../src/client/gui/components/RolledSelectionListV.cpp \ +../../src/client/gui/components/ScrolledSelectionList.cpp \ +../../src/client/gui/components/ScrollingPane.cpp \ +../../src/client/gui/components/SmallButton.cpp \ +../../src/client/gui/components/Slider.cpp \ +../../src/client/gui/components/OptionsItem.cpp \ +../../src/client/gui/components/OptionsGroup.cpp \ +../../src/client/gui/components/OptionsPane.cpp \ +../../src/client/gui/Font.cpp \ +../../src/client/gui/Gui.cpp \ +../../src/client/gui/GuiComponent.cpp \ +../../src/client/gui/Screen.cpp \ +../../src/client/gui/screens/ScreenChooser.cpp \ +../../src/client/gui/screens/ArmorScreen.cpp \ +../../src/client/gui/screens/ChatScreen.cpp \ +../../src/client/gui/screens/ConfirmScreen.cpp \ +../../src/client/gui/screens/ChestScreen.cpp \ +../../src/client/gui/screens/crafting/PaneCraftingScreen.cpp \ +../../src/client/gui/screens/crafting/StonecutterScreen.cpp \ +../../src/client/gui/screens/crafting/WorkbenchScreen.cpp \ +../../src/client/gui/screens/crafting/CraftingFilters.cpp \ +../../src/client/gui/screens/DeathScreen.cpp \ +../../src/client/gui/screens/ChooseLevelScreen.cpp \ +../../src/client/gui/screens/SimpleChooseLevelScreen.cpp \ +../../src/client/gui/screens/FurnaceScreen.cpp \ +../../src/client/gui/screens/InBedScreen.cpp \ +../../src/client/gui/screens/IngameBlockSelectionScreen.cpp \ +../../src/client/gui/screens/JoinGameScreen.cpp \ +../../src/client/gui/screens/MouseUnlockedScreen.cpp \ +../../src/client/gui/screens/OptionsScreen.cpp \ +../../src/client/gui/screens/PauseScreen.cpp \ +../../src/client/gui/screens/ProgressScreen.cpp \ +../../src/client/gui/screens/RenameMPLevelScreen.cpp \ +../../src/client/gui/screens/SelectWorldScreen.cpp \ +../../src/client/gui/screens/StartMenuScreen.cpp \ +../../src/client/gui/screens/TextEditScreen.cpp \ +../../src/client/gui/screens/touch/TouchIngameBlockSelectionScreen.cpp \ +../../src/client/gui/screens/touch/TouchJoinGameScreen.cpp \ +../../src/client/gui/screens/touch/TouchSelectWorldScreen.cpp \ +../../src/client/gui/screens/touch/TouchStartMenuScreen.cpp \ +../../src/client/gui/screens/UploadPhotoScreen.cpp \ +../../src/client/model/ChickenModel.cpp \ +../../src/client/model/CowModel.cpp \ +../../src/client/model/HumanoidModel.cpp \ +../../src/client/model/PigModel.cpp \ +../../src/client/model/QuadrupedModel.cpp \ +../../src/client/model/SheepModel.cpp \ +../../src/client/model/SheepFurModel.cpp \ +../../src/client/model/geom/Cube.cpp \ +../../src/client/model/geom/ModelPart.cpp \ +../../src/client/model/geom/Polygon.cpp \ +../../src/client/particle/Particle.cpp \ +../../src/client/particle/ParticleEngine.cpp \ +../../src/client/player/LocalPlayer.cpp \ +../../src/client/player/RemotePlayer.cpp \ +../../src/client/player/input/KeyboardInput.cpp \ +../../src/client/player/input/touchscreen/TouchscreenInput.cpp \ +../../src/client/renderer/Chunk.cpp \ +../../src/client/renderer/EntityTileRenderer.cpp \ +../../src/client/renderer/GameRenderer.cpp \ +../../src/client/renderer/ItemInHandRenderer.cpp \ +../../src/client/renderer/LevelRenderer.cpp \ +../../src/client/renderer/RenderChunk.cpp \ +../../src/client/renderer/RenderList.cpp \ +../../src/client/renderer/Tesselator.cpp \ +../../src/client/renderer/Textures.cpp \ +../../src/client/renderer/TileRenderer.cpp \ +../../src/client/renderer/gles.cpp \ +../../src/client/renderer/culling/Frustum.cpp \ +../../src/client/renderer/entity/ArrowRenderer.cpp \ +../../src/client/renderer/entity/ChickenRenderer.cpp \ +../../src/client/renderer/entity/EntityRenderDispatcher.cpp \ +../../src/client/renderer/entity/EntityRenderer.cpp \ +../../src/client/renderer/entity/FallingTileRenderer.cpp \ +../../src/client/renderer/entity/HumanoidMobRenderer.cpp \ +../../src/client/renderer/entity/ItemRenderer.cpp \ +../../src/client/renderer/entity/ItemSpriteRenderer.cpp \ +../../src/client/renderer/entity/MobRenderer.cpp \ +../../src/client/renderer/entity/PaintingRenderer.cpp \ +../../src/client/renderer/entity/PlayerRenderer.cpp \ +../../src/client/renderer/entity/SheepRenderer.cpp \ +../../src/client/renderer/entity/TntRenderer.cpp \ +../../src/client/renderer/entity/TripodCameraRenderer.cpp \ +../../src/client/renderer/ptexture/DynamicTexture.cpp \ +../../src/client/renderer/tileentity/ChestRenderer.cpp \ +../../src/client/renderer/tileentity/SignRenderer.cpp \ +../../src/client/renderer/tileentity/TileEntityRenderDispatcher.cpp \ +../../src/client/renderer/tileentity/TileEntityRenderer.cpp \ +../../src/client/sound/Sound.cpp \ +../../src/client/sound/SoundEngine.cpp \ +../../src/locale/I18n.cpp \ +../../src/nbt/Tag.cpp \ +../../src/network/command/CommandServer.cpp \ +../../src/network/ClientSideNetworkHandler.cpp \ +../../src/network/NetEventCallback.cpp \ +../../src/network/Packet.cpp \ +../../src/network/RakNetInstance.cpp \ +../../src/network/ServerSideNetworkHandler.cpp \ +../../src/server/CreatorLevel.cpp \ +../../src/server/ServerLevel.cpp \ +../../src/server/ServerPlayer.cpp \ +../../src/util/DataIO.cpp \ +../../src/util/Mth.cpp \ +../../src/util/StringUtils.cpp \ +../../src/util/PerfTimer.cpp \ +../../src/util/PerfRenderer.cpp \ +../../src/world/Direction.cpp \ +../../src/world/entity/AgableMob.cpp \ +../../src/world/entity/Entity.cpp \ +../../src/world/entity/EntityFactory.cpp \ +../../src/world/entity/FlyingMob.cpp \ +../../src/world/entity/HangingEntity.cpp \ +../../src/world/entity/Mob.cpp \ +../../src/world/entity/MobCategory.cpp \ +../../src/world/entity/Motive.cpp \ +../../src/world/entity/Painting.cpp \ +../../src/world/entity/PathfinderMob.cpp \ +../../src/world/entity/SynchedEntityData.cpp \ +../../src/world/entity/ai/control/MoveControl.cpp \ +../../src/world/entity/animal/Animal.cpp \ +../../src/world/entity/animal/Chicken.cpp \ +../../src/world/entity/animal/Cow.cpp \ +../../src/world/entity/animal/Pig.cpp \ +../../src/world/entity/animal/Sheep.cpp \ +../../src/world/entity/animal/WaterAnimal.cpp \ +../../src/world/entity/item/FallingTile.cpp \ +../../src/world/entity/item/ItemEntity.cpp \ +../../src/world/entity/item/PrimedTnt.cpp \ +../../src/world/entity/item/TripodCamera.cpp \ +../../src/world/entity/monster/Creeper.cpp \ +../../src/world/entity/monster/Monster.cpp \ +../../src/world/entity/monster/PigZombie.cpp \ +../../src/world/entity/monster/Skeleton.cpp \ +../../src/world/entity/monster/Spider.cpp \ +../../src/world/entity/monster/Zombie.cpp \ +../../src/world/entity/projectile/Arrow.cpp \ +../../src/world/entity/projectile/Throwable.cpp \ +../../src/world/entity/player/Inventory.cpp \ +../../src/world/entity/player/Player.cpp \ +../../src/world/food/SimpleFoodData.cpp \ +../../src/world/inventory/BaseContainerMenu.cpp \ +../../src/world/inventory/ContainerMenu.cpp \ +../../src/world/inventory/FillingContainer.cpp \ +../../src/world/inventory/FurnaceMenu.cpp \ +../../src/world/item/ArmorItem.cpp \ +../../src/world/item/BedItem.cpp \ +../../src/world/item/DyePowderItem.cpp \ +../../src/world/item/Item.cpp \ +../../src/world/item/ItemInstance.cpp \ +../../src/world/item/HangingEntityItem.cpp \ +../../src/world/item/HatchetItem.cpp \ +../../src/world/item/HoeItem.cpp \ +../../src/world/item/PickaxeItem.cpp \ +../../src/world/item/ShovelItem.cpp \ +../../src/world/item/crafting/Recipe.cpp \ +../../src/world/item/crafting/ArmorRecipes.cpp \ +../../src/world/item/crafting/Recipes.cpp \ +../../src/world/item/crafting/FurnaceRecipes.cpp \ +../../src/world/item/crafting/OreRecipes.cpp \ +../../src/world/item/crafting/StructureRecipes.cpp \ +../../src/world/item/crafting/ToolRecipes.cpp \ +../../src/world/item/crafting/WeaponRecipes.cpp \ +../../src/world/level/Explosion.cpp \ +../../src/world/level/Level.cpp \ +../../src/world/level/LightLayer.cpp \ +../../src/world/level/LightUpdate.cpp \ +../../src/world/level/MobSpawner.cpp \ +../../src/world/level/Region.cpp \ +../../src/world/level/TickNextTickData.cpp \ +../../src/world/level/biome/Biome.cpp \ +../../src/world/level/biome/BiomeSource.cpp \ +../../src/world/level/chunk/LevelChunk.cpp \ +../../src/world/level/dimension/Dimension.cpp \ +../../src/world/level/levelgen/CanyonFeature.cpp \ +../../src/world/level/levelgen/DungeonFeature.cpp \ +../../src/world/level/levelgen/LargeCaveFeature.cpp \ +../../src/world/level/levelgen/LargeFeature.cpp \ +../../src/world/level/levelgen/RandomLevelSource.cpp \ +../../src/world/level/levelgen/feature/Feature.cpp \ +../../src/world/level/levelgen/synth/ImprovedNoise.cpp \ +../../src/world/level/levelgen/synth/PerlinNoise.cpp \ +../../src/world/level/levelgen/synth/Synth.cpp \ +../../src/world/level/material/Material.cpp \ +../../src/world/level/pathfinder/Path.cpp \ +../../src/world/level/storage/ExternalFileLevelStorage.cpp \ +../../src/world/level/storage/ExternalFileLevelStorageSource.cpp \ +../../src/world/level/storage/FolderMethods.cpp \ +../../src/world/level/storage/LevelData.cpp \ +../../src/world/level/storage/LevelStorageSource.cpp \ +../../src/world/level/storage/RegionFile.cpp \ +../../src/world/level/tile/BedTile.cpp \ +../../src/world/level/tile/ChestTile.cpp \ +../../src/world/level/tile/CropTile.cpp \ +../../src/world/level/tile/DoorTile.cpp \ +../../src/world/level/tile/EntityTile.cpp \ +../../src/world/level/tile/FurnaceTile.cpp \ +../../src/world/level/tile/GrassTile.cpp \ +../../src/world/level/tile/HeavyTile.cpp \ +../../src/world/level/tile/LightGemTile.cpp \ +../../src/world/level/tile/MelonTile.cpp \ +../../src/world/level/tile/Mushroom.cpp \ +../../src/world/level/tile/NetherReactor.cpp \ +../../src/world/level/tile/NetherReactorPattern.cpp \ +../../src/world/level/tile/StairTile.cpp \ +../../src/world/level/tile/StemTile.cpp \ +../../src/world/level/tile/StoneSlabTile.cpp \ +../../src/world/level/tile/TallGrass.cpp \ +../../src/world/level/tile/Tile.cpp \ +../../src/world/level/tile/TrapDoorTile.cpp \ +../../src/world/level/tile/entity/ChestTileEntity.cpp \ +../../src/world/level/tile/entity/NetherReactorTileEntity.cpp \ +../../src/world/level/tile/entity/SignTileEntity.cpp \ +../../src/world/level/tile/entity/TileEntity.cpp \ +../../src/world/level/tile/entity/FurnaceTileEntity.cpp \ +../../src/world/phys/HitResult.cpp + +# +# Build environment +# +CC:=g++ +SHELL:=/bin/bash + +# +# Setup default vars and paths +# +CFLAGS:=-mfloat-abi=hard -march=armv6j -mfpu=vfp -DRPI -DPOSIX -DGFX_SMALLER_CHUNKS -I/opt/vc/include/ -I/opt/vc/include/interface/vcos/pthreads + +OBJECTS:=$(SOURCES:%.cpp=%.o) +DEPS:=$(SOURCES:%.cpp=%.d) + +OBJDIR=. +SRCDIR=. + +# +# Build mode specifics +# +ifeq ($(BUILD),release) + CFLAGS+=-Os -g -DNDEBUG -DPUBLISH + OBJDIR=obj/release/d1/d2 + OBJECTS:=$(patsubst %,$(OBJDIR)/%,$(OBJECTS)) +else + CFLAGS+=-O0 -g + OBJDIR=obj/debug/d1/d2 + OBJECTS:=$(patsubst %,$(OBJDIR)/%,$(OBJECTS)) +endif + +# +# +# +LDFLAGS:=-L/opt/vc/lib/ -lGLESv1_CM -lEGL -lbcm_host -lpng -lSDL -L. libRakNet_static_O1.a + + +# +# Targets +# +all: $(MODULE) + +-include $(DEPS) + +release: + make "BUILD=release" + +#$(CC) -MM $(CFLAGS) $*.cpp > $*.d + +$(OBJDIR)/%.o: $(SRCDIR)/%.cpp + @mkdir -p $(@D) + $(CC) -c $(CFLAGS) $< -o $@ + $(CC) -MM -MT $*.o $(CFLAGS) $*.cpp > $*.d + @cp -f $*.d $*.d.tmp + @rm -f $*.d.tmp + +#@sed -e 's/.*://' -e 's/\$$//' < $*.d.tmp | fmt -1 | sed -e 's/^ *//' -e 's/$$/:/' >> $*.d + +$(MODULE): $(OBJECTS) + $(CC) $(OBJECTS) $(LDFLAGS) -o $@ + +clean: + rm -f $(OBJECTS) $(DEPS) $(MODULE) diff --git a/minecraftcpp-master/handheld/project/raspberry/libRakNet.so b/minecraftcpp-master/handheld/project/raspberry/libRakNet.so new file mode 100644 index 0000000..3db609a Binary files /dev/null and b/minecraftcpp-master/handheld/project/raspberry/libRakNet.so differ diff --git a/minecraftcpp-master/handheld/project/raspberry/libRakNet_static.a b/minecraftcpp-master/handheld/project/raspberry/libRakNet_static.a new file mode 100644 index 0000000..4c2ae84 Binary files /dev/null and b/minecraftcpp-master/handheld/project/raspberry/libRakNet_static.a differ diff --git a/minecraftcpp-master/handheld/project/raspberry/minecraftpi b/minecraftcpp-master/handheld/project/raspberry/minecraftpi new file mode 100644 index 0000000..dee4ad7 Binary files /dev/null and b/minecraftcpp-master/handheld/project/raspberry/minecraftpi differ diff --git a/minecraftcpp-master/handheld/project/raspberry/py/api.py b/minecraftcpp-master/handheld/project/raspberry/py/api.py new file mode 100644 index 0000000..095b740 --- /dev/null +++ b/minecraftcpp-master/handheld/project/raspberry/py/api.py @@ -0,0 +1,100 @@ +import socket, select +import apiutil +from vec3 import Vec3 +from event import TileEvent + +comm = None +def connect(address, port=4711): + global comm + comm = socket.socket(socket.AF_INET,socket.SOCK_STREAM) + comm.connect((address, 4711)) + +connect("localhost") + +def drainSocket(s): + while True: + read, w, x = select.select([s], [], [], 0.0) + if len(read) == 0: break + s.recv(1500) + +def generateFunc(name, unpack=None): + def _inner(*l): + s = apiutil.call(name,*l) + drainSocket(comm) + comm.send(s) + if not unpack: return + + r = comm.recv(1024) + if r != "Fail\n": + return unpack(r) + return _inner + +def unpackArrayTo(func, f=lambda x:x): + """Calling func with unpacked array element arguments""" + def _inner(s): return [func(*map(f, e.split(","))) for e in s.split("|") if e.strip()] + return _inner + +def unpackTo(func, f=lambda x:x): + """Calling func with unpacked arguments""" + def _inner(s): return func(*map(f, s.split(","))) + return _inner + +def postMessageLoop(): + n = 0 + while 1: + postMessage(n) + n += 1 + +def Print(s): + print(s) + +def readV3(s): return unpackTo(Vec3, float)(s) +def readV3ints(s): return unpackTo(Vec3, lambda x:int(float(x)))(s) + +class Holder: + pass + +# Block, world +world = Holder() +world.setBlock = generateFunc("world.setBlock") +world.getBlock = generateFunc("world.getBlock", int) +world.setBlocks = generateFunc("world.setBlocks") +world.getHeight = generateFunc("world.getHeight", int) +world.getPlayerIds = generateFunc("world.getPlayerIds", unpackArrayTo(int)) +world.setting = generateFunc("world.setting") + +# Checkpoint +world.checkpoint = Holder() +world.checkpoint.save = generateFunc("world.checkpoint.save") +world.checkpoint.restore= generateFunc("world.checkpoint.restore") +# = generateFunc("entity.getType + +# Player +player = Holder() +player.setTile = generateFunc("player.setTile") +player.getTile = generateFunc("player.getTile", readV3ints) +player.setPos = generateFunc("player.setPos") +player.getPos = generateFunc("player.getPos", readV3) +player.setting = generateFunc("player.setting") + +# Camera +camera = Holder() +camera.setNormal = generateFunc("camera.mode.setNormal") +#camera.setThirdPerson = generateFunc("camera.mode.setThirdPerson") +camera.setFixed = generateFunc("camera.mode.setFixed") +camera.setFollow = generateFunc("camera.mode.setFollow") +camera.setPos = generateFunc("camera.setPos") +#setCameraFollow1 = generateFunc("camera.mode.setFollowWithPosition") +#setCameraFollow2 = generateFunc("camera.mode.setFollowWithRotation") + +# Events +events = Holder() +events.block = Holder() +events.block.hits = generateFunc("events.block.hits", unpackArrayTo(TileEvent.Hit, int)) +#pollChat = generateFunc("events.chat", unpackArrayTo(TileEvent.Hit, int)) +# Chat +chat = Holder() +chat.post = generateFunc("chat.post") + +from functools import partial +setAutojump = partial(player.setting, "autojump") \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/raspberry/py/apiutil.py b/minecraftcpp-master/handheld/project/raspberry/py/apiutil.py new file mode 100644 index 0000000..836b9c0 --- /dev/null +++ b/minecraftcpp-master/handheld/project/raspberry/py/apiutil.py @@ -0,0 +1,13 @@ +import collections + +def flatten(l): + for e in l: + if isinstance(e, collections.Iterable) and not isinstance(e, basestring): + for ee in flatten(e): yield ee + else: yield e + +def toParameters(l): + return ",".join(map(str, flatten(l))) + +def call(name, *l): + return "%s(%s)\n"%(name, toParameters(l)) diff --git a/minecraftcpp-master/handheld/project/raspberry/py/event.py b/minecraftcpp-master/handheld/project/raspberry/py/event.py new file mode 100644 index 0000000..1a0a2c4 --- /dev/null +++ b/minecraftcpp-master/handheld/project/raspberry/py/event.py @@ -0,0 +1,19 @@ +from vec3 import Vec3 + +class TileEvent: + HIT = 0 + + def __init__(self, type, x, y, z, face, entityId): + self.type = type + self.pos = Vec3(x, y, z) + self.face = face + self.entityId = entityId + + def __str__(self): + types = {TileEvent.HIT: "Hit"} + return "TileEvent(%s @ %s:%d by %d)"%(types.get(self.type, 0), + self.pos, self.face, self.entityId); + + @staticmethod + def Hit(x, y, z, face, entityId): + return TileEvent(TileEvent.HIT, x, y, z, face, entityId) diff --git a/minecraftcpp-master/handheld/project/raspberry/py/game_snake.py b/minecraftcpp-master/handheld/project/raspberry/py/game_snake.py new file mode 100644 index 0000000..3918728 --- /dev/null +++ b/minecraftcpp-master/handheld/project/raspberry/py/game_snake.py @@ -0,0 +1,199 @@ +import time, random +import api, kbhelp +from vec3 import Vec3 + +class BlockType: + AIR = 0 + ROCK = 1 + DIRT = 3 + SANDSTONE = 24 + CLOTH = 35 + CACTUS = 81 + +class ClothColor: + WHITE = 0 + RED = 14 + + @staticmethod + def dark(x): return x + 8 if x < 8 else x + def bright(x): return x - 8 if x >= 8 else x + +class Level: + Wall = BlockType.DIRT + Food = BlockType.SANDSTONE + + def __init__(self, w, h, pos=Vec3(0,0,0)): + self.w = w + self.h = h + self.pos = pos + self.m = [0] * (w * h) + + def setup(self, numApples): + size = Vec3(self.w-1, 0, self.h-1) + margin = Vec3(1, 0, 1) + api.world.setBlocks(self.pos - margin + Vec3.down(3), self.pos + size + margin, BlockType.ROCK) + api.world.setBlocks(self.pos, self.pos + size + Vec3.up(8), BlockType.AIR) + + for i in random.sample(range(self.w * self.h), numApples): + xx = i % self.w + yy = i / self.w + self.m[i] = Level.Food + api.world.setBlock(xx, self.pos.y, yy, Level.Food) + + def getTile(self, x, y): + return self.m[y * self.w + x] if self.inRange(x, y) else None + + def clearTile(self, x, y): + if self.inRange(x, y): self.m[y * self.w + x] = 0 + + def isFood(self, x, y): + return self.inRange(x, y) and Level.Food == self.getTile(x, y) + + def isWall(self, x, y): + return (not self.inRange(x, y)) or Level.Wall == self.getTile(x, y) + + def inRange(self, x, y): + return x >= 0 and y >= 0 and x < self.w and y < self.h + + def countApples(self): + return self.m.count(Level.Food) + +class Snake: + def __init__(self, pos=Vec3(0,0,0), length=5): + self.dir = Vec3(1, 0, 0) + self.seg = [pos] + self.dead = False + self.growTicks = 0 + + for i in range(length-1): + self._add() + + def left(self): self.dir.rotateLeft() + def right(self): self.dir.rotateRight() + + def next(self): + return self.head() + self.dir + + def head(self): + return self.seg[-1] + + def tick(self): + self._add() + if self.growTicks == 0: self._remove() + if self.growTicks > 0: self.growTicks -= 1 + + def _add(self): + n = self.next() + if n in self.seg: + self.kill() + return + self.seg.append( n ) + api.world.setBlock(n.x, n.y, n.z, 45) + + def _remove(self): + h, self.seg = self.seg[0], self.seg[1:] + api.world.setBlock(h.x, h.y, h.z, 0) + + def grow(self, ticks): + self.growTicks = ticks + + def kill(self): + for p in self.seg: + api.world.setBlock(p.x, p.y, p.z, BlockType.CLOTH, 14) + self.dead = True + +class SnakeGame: + def __init__(self, numSnakes): + self.numSnakes = numSnakes + self.snakes = [] + self.level = None + self.noActionTicks = 10 + + def startLevel(self, level, numApples=8): + self.level = level + self.level.setup(numApples) + self.snakes = [Snake(Vec3(3, 0, 3)) for x in range(self.numSnakes)] + self.noActionTicks = 10 + for s in self.snakes: + for t in s.seg: self.level.clearTile(t.x, t.z) + api.camera.setFixed() + api.camera.setPos(Vec3((level.w-1)/2.0, 10, level.h/2.0 - 1)) + + def tick(self): + if self.noActionTicks > 0: + self.noActionTicks -= 1 + return + + for s in self.snakes: + self.tickSnake(s) + + def tickSnake(self, snake): + if snake.dead: return + self.onTile(snake, snake.next()) + if not snake.dead: snake.tick() + + def isFinished(self): + return self.isWon() or self.allSnakesDead() + + def isWon(self): + #print self.level.countApples() + return self.level.countApples() == 0 + + def allSnakesDead(self): + for s in self.snakes: + if not s.dead: return False + return True + + def onTile(self, snake, pos): + x, y = pos.x, pos.z + if self.level.isWall(x, y): snake.kill() + if self.level.isFood(x, y): snake.grow(2) + self.level.clearTile(x, y) + +def run(): + kb = kbhelp.KeyboardInput() + keys = (('a', 'd'), + ('4', '6')) + + numSnakes = 1 + + def play(level, numApples, tickDelay): + g = SnakeGame(numSnakes) + g.startLevel(Level(16, 12), numApples) + api.chat.post("Snake - level %d"%level) + + while 1: + # Update input + if kb.hasChar(): + key = kb.readChar() + for i in range(min(len(g.snakes), len(keys))): + LeftKey, RightKey = keys[i] + s = g.snakes[i] + if key == LeftKey: s.left() + if key == RightKey: s.right() + # Update game + g.tick() + time.sleep(tickDelay) + + if g.isFinished(): + return g.isWon() + + delay = 0.15 + level = 0 + apples = 5 + + while 1: + level += 1 + apples += 1 + won = play(level, apples, delay) + if not won: + api.chat.post("Snake - Game over! [ level %d ]!"%level) + return + + delay -= 0.01 + if delay < 0.04: + return + + +if __name__ == "__main__": + run() diff --git a/minecraftcpp-master/handheld/project/raspberry/py/image.py b/minecraftcpp-master/handheld/project/raspberry/py/image.py new file mode 100644 index 0000000..7dadeab --- /dev/null +++ b/minecraftcpp-master/handheld/project/raspberry/py/image.py @@ -0,0 +1,38 @@ +import Image +import apiutil + +def hexToRgb(hex): + return (hex >> 16) & 255, (hex >> 8) & 255, hex & 255 + +cgaColors = map(hexToRgb, ( + 0x000000, + 0x0000A8, + 0x00A800, + 0x00A8A8, + 0xFF0000, + 0xA800A8, + 0xA85400, + 0xA8A8A8, + 0x545454, + 0x5454FE, + 0x54FE54, + 0x54FEFE, + 0xFE5454, + 0xFE54FE, + 0xFEFE54, + 0xFEFEFE)) + +cgaPalette = apiutil.flatten(cgaColors) + +def _padPalette(values, count): + v = tuple(values) + return v + (0, 0, 0) * (count - len(v)) + +def imageToCga(im): + p = Image.new("P", (1,1)) + p.putpalette(_padPalette(cgaPalette, 256)) + return im.convert("RGB").quantize(palette=p, kmeans=255) + +def imageToWool(im, (w, h)): + cga = imageToCga(im.resize((w, h))) + diff --git a/minecraftcpp-master/handheld/project/raspberry/py/kbhelp.py b/minecraftcpp-master/handheld/project/raspberry/py/kbhelp.py new file mode 100644 index 0000000..0c72ca9 --- /dev/null +++ b/minecraftcpp-master/handheld/project/raspberry/py/kbhelp.py @@ -0,0 +1,60 @@ +try: + import msvcrt + + """Win32 implementation of a keyboard input reader""" + class KeyboardInput_win32: + def __init__(self): + self.setBlocking(True) + + def clear(self): + while 1: + if self.readChar_nonblocking() is None: + break + + def setBlocking(self, block): + self.readChar = self.readChar_blocking if block else \ + self.readChar_nonblocking + + def hasChar(self): + return msvcrt.kbhit() + + def readChar_blocking(self): + return msvcrt.getch() + + def readChar_nonblocking(self): + if not msvcrt.kbhit(): return None + return msvcrt.getch() + + KeyboardInput = KeyboardInput_win32 + +except: + try: + class KeyboardInput_unix: + def hasChar(self): + import sys, tty, termios + from select import select + fd = sys.stdin.fileno() + old_settings = termios.tcgetattr(fd) + try: + tty.setraw(sys.stdin.fileno()) + [i, o, e] = select([sys.stdin.fileno()], [], [], 5) + if i: ch = True + else: ch = False + finally: + termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) + return ch + + def readChar(self): + import sys, tty, termios + from select import select + fd = sys.stdin.fileno() + old_settings = termios.tcgetattr(fd) + try: + tty.setraw(sys.stdin.fileno()) + ch = sys.stdin.read(1) + finally: + termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) + return ch + + KeyboardInput = KeyboardInput_unix + except: pass diff --git a/minecraftcpp-master/handheld/project/raspberry/py/mojang_cga.png b/minecraftcpp-master/handheld/project/raspberry/py/mojang_cga.png new file mode 100644 index 0000000..83549ce Binary files /dev/null and b/minecraftcpp-master/handheld/project/raspberry/py/mojang_cga.png differ diff --git a/minecraftcpp-master/handheld/project/raspberry/py/vec3.py b/minecraftcpp-master/handheld/project/raspberry/py/vec3.py new file mode 100644 index 0000000..45ed368 --- /dev/null +++ b/minecraftcpp-master/handheld/project/raspberry/py/vec3.py @@ -0,0 +1,80 @@ +class Vec3: + def __init__(self, x=0, y=0, z=0): + self.x = x + self.y = y + self.z = z + + def __add__(self, rhs): + c = self.clone() + c += rhs + return c + + def __iadd__(self, rhs): + self.x += rhs.x + self.y += rhs.y + self.z += rhs.z + return self + + def clone(self): + return Vec3(self.x, self.y, self.z) + + def __neg__(self): + return Vec3(-self.x, -self.y, -self.z) + + def __sub__(self, rhs): + return self.__add__(-rhs) + + def __isub__(self, rhs): + return self.__iadd__(-rhs) + + def __repr__(self): + return "Vec3(%s,%s,%s)"%(self.x,self.y,self.z) + + def __iter__(self): + return iter((self.x, self.y, self.z)) + + def _map(self, func): + self.x = func(self.x) + self.y = func(self.y) + self.z = func(self.z) + + def __cmp__(self, rhs): + dx = self.x - rhs.x + if dx != 0: return dx + dy = self.y - rhs.y + if dy != 0: return dy + dz = self.z - rhs.z + if dz != 0: return dz + return 0 + + def iround(self): self._map(lambda v:int(v+0.5)) + def ifloor(self): self._map(int) + + def rotateLeft(self): self.x, self.z = self.z, -self.x + def rotateRight(self): self.x, self.z = -self.z, self.x + + @staticmethod + def y(n=1): return Vec3(0, n, 0) + @staticmethod + def up(n=1): return Vec3.y(n) + @staticmethod + def down(n=1): return Vec3.y(-n) + +def testVec3(): + # Note: It's not testing everything + + # 1.1 Test initialization + it = Vec3(1, -2, 3) + assert it.x == 1 + assert it.y == -2 + assert it.z == 3 + + # 2.1 Test cloning and equality + clone = it.clone() + assert it == clone + it.x += 1 + assert it != clone + + # Test repr + e = eval(repr(it)) + assert e == it diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/187DE8AD52EBC841816C6DE591979E5C/15D9F362714D5B59B782D05FE2939D10 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/187DE8AD52EBC841816C6DE591979E5C/15D9F362714D5B59B782D05FE2939D10 new file mode 100644 index 0000000..872695a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/187DE8AD52EBC841816C6DE591979E5C/15D9F362714D5B59B782D05FE2939D10 @@ -0,0 +1,137 @@ +#ifndef KEYBOARD_H__ +#define KEYBOARD_H__ + +#include + +/** A keyboard action; key-down or key-up */ +class KeyboardAction +{ +public: + static const int KEYUP = 0; + static const int KEYDOWN = 1; + + KeyboardAction(unsigned char keyCode, int state) { + this->key = keyCode; + this->state = state; + } + + int state; + unsigned char key; +}; + +/* Iterators */ +typedef std::vector KeyboardActionVec; +typedef KeyboardActionVec::iterator KeyboardActionIt; +typedef KeyboardActionVec::const_iterator KeyboardActionCIt; + +/** A static keyboard class, written to resemble the one in lwjgl somewhat */ +class Keyboard +{ +public: + static const int KEY_A = 65; + static const int KEY_B = 66; + static const int KEY_C = 67; + static const int KEY_D = 68; + static const int KEY_E = 69; + static const int KEY_F = 70; + static const int KEY_G = 71; + static const int KEY_H = 72; + static const int KEY_I = 73; + static const int KEY_J = 74; + static const int KEY_K = 75; + static const int KEY_L = 76; + static const int KEY_M = 77; + static const int KEY_N = 78; + static const int KEY_O = 79; + static const int KEY_P = 80; + static const int KEY_Q = 81; + static const int KEY_R = 82; + static const int KEY_S = 83; + static const int KEY_T = 84; + static const int KEY_U = 85; + static const int KEY_V = 86; + static const int KEY_W = 87; + static const int KEY_X = 88; + static const int KEY_Y = 89; + static const int KEY_Z = 90; + + static const int KEY_BACKSPACE = 8; + static const int KEY_RETURN = 13; + + static const int KEY_F1 = 112; + static const int KEY_F2 = 113; + static const int KEY_F3 = 114; + static const int KEY_F4 = 115; + static const int KEY_F5 = 116; + static const int KEY_F6 = 117; + static const int KEY_F7 = 118; + static const int KEY_F8 = 119; + static const int KEY_F9 = 120; + static const int KEY_F10 = 121; + static const int KEY_F11 = 122; + static const int KEY_F12 = 123; + + static const int KEY_ESCAPE = 27; + static const int KEY_SPACE = 32; + static const int KEY_LSHIFT = 10; + + static bool isKeyDown(int keyCode) { + return _states[keyCode] == KeyboardAction::KEYDOWN; + } + + static void reset() { + _inputs.clear(); + _inputText.clear(); + _index = -1; + _textIndex = -1; + } + + static void feed(unsigned char keyCode, int state) { + _inputs.push_back(KeyboardAction(keyCode, state)); + + _states[keyCode] = state; + } + static void feedText(char character) { + _inputText.push_back(character); + } + + static bool next() { + if (_index + 1 >= (int)_inputs.size()) + return false; + + ++_index; + return true; + } + + static bool nextTextChar() { + if(_textIndex + 1 >= (int)_inputText.size()) + return false; + ++_textIndex; + return true; + } + + static void rewind() { + _index = -1; + _textIndex = -1; + } + + static int getEventKey() { + return _inputs[_index].key; + } + + static int getEventKeyState() { + return _inputs[_index].state; + } + static char getChar() { + return _inputText[_textIndex]; + } +private: + static int _index; + static int _textIndex; + static int _states[256]; + static std::vector _inputs; + static std::vector _inputText; + static bool _inited; +}; + +#endif//KEYBOARD_H__ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/187DE8AD52EBC841816C6DE591979E5C/1CC65E0062271217494E8E6A4C0A58CE b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/187DE8AD52EBC841816C6DE591979E5C/1CC65E0062271217494E8E6A4C0A58CE new file mode 100644 index 0000000..bfd810c --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/187DE8AD52EBC841816C6DE591979E5C/1CC65E0062271217494E8E6A4C0A58CE @@ -0,0 +1,34 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ +#define NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ + +//package net.minecraft.client.gui; + +#include +#include "../GuiComponent.h" +#include "../../Options.h" + +class Font; +class Minecraft; + +class TextBox: public GuiComponent +{ +public: + TextBox(int id, const std::string& msg); + TextBox(int id, int x, int y, const std::string& msg); + TextBox(int id, int x, int y, int w, int h, const std::string& msg); + + virtual void setFocus(Minecraft* minecraft); + virtual bool loseFocus(Minecraft* minecraft); + + virtual void render(Minecraft* minecraft, int xm, int ym); + +public: + int w, h; + int x, y; + + std::string text; + int id; + bool focused; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/187DE8AD52EBC841816C6DE591979E5C/1D11F3CE27B0B595836AB483CC9A0B43 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/187DE8AD52EBC841816C6DE591979E5C/1D11F3CE27B0B595836AB483CC9A0B43 new file mode 100644 index 0000000..4adf7ad --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/187DE8AD52EBC841816C6DE591979E5C/1D11F3CE27B0B595836AB483CC9A0B43 @@ -0,0 +1,77 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(id), w(0), h(0), x(0), y(0), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg), focused(false) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->showKeyboard(); + focused = true; + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->hideKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + // Slightly translucent dark background + fill(x, y, x + w, y + h,0x80000000); + // Border - use different colors when focused + if (focused) { + fill(x, y, x + w, y +1,0xffa0c0ff); + fill(x, y + h -1, x + w, y + h,0xff4060a0); + fill(x, y, x +1, y + h,0xffa0c0ff); + fill(x + w -1, y, x + w, y + h,0xff4060a0); + } else { + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + } + + // Draw text. If textbox contains the placeholder (no focus and text equals initial msg), draw dim color + int color =0xe0e0e0; + // If not focused and text is empty or equals default placeholder, draw dimmed + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + // measure available width approximated by character count + int calc = (w -8) /6; // approx6 px per char + int maxChars =1; + if (calc > maxChars) maxChars = calc; + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/187DE8AD52EBC841816C6DE591979E5C/430CC357A15D4BE1A70387A7C3462A3C b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/187DE8AD52EBC841816C6DE591979E5C/430CC357A15D4BE1A70387A7C3462A3C new file mode 100644 index 0000000..dec4b79 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/187DE8AD52EBC841816C6DE591979E5C/430CC357A15D4BE1A70387A7C3462A3C @@ -0,0 +1,294 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 to avoid off-by-one in GUI mapping + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} + +// Forward typed character directly to focused textbox to avoid duplicate definitions +void Screen::keyboardTextEvent() +{ + char c = Keyboard::getChar(); + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (c >=32) tb->text.push_back(c); + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Handle backspace for focused textbox + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + if (!tb->text.empty()) tb->text.erase(tb->text.size() -1,1); + } + if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height; // removed -1 +} + +// Default implementation for character input (virtual) +void Screen::keyboardNewChar(char inputChar) { + // default: forward to focused textbox is handled in keyboardTextEvent; keep empty here + (void)inputChar; +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/187DE8AD52EBC841816C6DE591979E5C/572513C3D8D309B3634C045C3C8FAC54 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/187DE8AD52EBC841816C6DE591979E5C/572513C3D8D309B3634C045C3C8FAC54 new file mode 100644 index 0000000..872695a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/187DE8AD52EBC841816C6DE591979E5C/572513C3D8D309B3634C045C3C8FAC54 @@ -0,0 +1,137 @@ +#ifndef KEYBOARD_H__ +#define KEYBOARD_H__ + +#include + +/** A keyboard action; key-down or key-up */ +class KeyboardAction +{ +public: + static const int KEYUP = 0; + static const int KEYDOWN = 1; + + KeyboardAction(unsigned char keyCode, int state) { + this->key = keyCode; + this->state = state; + } + + int state; + unsigned char key; +}; + +/* Iterators */ +typedef std::vector KeyboardActionVec; +typedef KeyboardActionVec::iterator KeyboardActionIt; +typedef KeyboardActionVec::const_iterator KeyboardActionCIt; + +/** A static keyboard class, written to resemble the one in lwjgl somewhat */ +class Keyboard +{ +public: + static const int KEY_A = 65; + static const int KEY_B = 66; + static const int KEY_C = 67; + static const int KEY_D = 68; + static const int KEY_E = 69; + static const int KEY_F = 70; + static const int KEY_G = 71; + static const int KEY_H = 72; + static const int KEY_I = 73; + static const int KEY_J = 74; + static const int KEY_K = 75; + static const int KEY_L = 76; + static const int KEY_M = 77; + static const int KEY_N = 78; + static const int KEY_O = 79; + static const int KEY_P = 80; + static const int KEY_Q = 81; + static const int KEY_R = 82; + static const int KEY_S = 83; + static const int KEY_T = 84; + static const int KEY_U = 85; + static const int KEY_V = 86; + static const int KEY_W = 87; + static const int KEY_X = 88; + static const int KEY_Y = 89; + static const int KEY_Z = 90; + + static const int KEY_BACKSPACE = 8; + static const int KEY_RETURN = 13; + + static const int KEY_F1 = 112; + static const int KEY_F2 = 113; + static const int KEY_F3 = 114; + static const int KEY_F4 = 115; + static const int KEY_F5 = 116; + static const int KEY_F6 = 117; + static const int KEY_F7 = 118; + static const int KEY_F8 = 119; + static const int KEY_F9 = 120; + static const int KEY_F10 = 121; + static const int KEY_F11 = 122; + static const int KEY_F12 = 123; + + static const int KEY_ESCAPE = 27; + static const int KEY_SPACE = 32; + static const int KEY_LSHIFT = 10; + + static bool isKeyDown(int keyCode) { + return _states[keyCode] == KeyboardAction::KEYDOWN; + } + + static void reset() { + _inputs.clear(); + _inputText.clear(); + _index = -1; + _textIndex = -1; + } + + static void feed(unsigned char keyCode, int state) { + _inputs.push_back(KeyboardAction(keyCode, state)); + + _states[keyCode] = state; + } + static void feedText(char character) { + _inputText.push_back(character); + } + + static bool next() { + if (_index + 1 >= (int)_inputs.size()) + return false; + + ++_index; + return true; + } + + static bool nextTextChar() { + if(_textIndex + 1 >= (int)_inputText.size()) + return false; + ++_textIndex; + return true; + } + + static void rewind() { + _index = -1; + _textIndex = -1; + } + + static int getEventKey() { + return _inputs[_index].key; + } + + static int getEventKeyState() { + return _inputs[_index].state; + } + static char getChar() { + return _inputText[_textIndex]; + } +private: + static int _index; + static int _textIndex; + static int _states[256]; + static std::vector _inputs; + static std::vector _inputText; + static bool _inited; +}; + +#endif//KEYBOARD_H__ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/187DE8AD52EBC841816C6DE591979E5C/598BF874CBB16DC7814BF6B0B71365D7 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/187DE8AD52EBC841816C6DE591979E5C/598BF874CBB16DC7814BF6B0B71365D7 new file mode 100644 index 0000000..dec4b79 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/187DE8AD52EBC841816C6DE591979E5C/598BF874CBB16DC7814BF6B0B71365D7 @@ -0,0 +1,294 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 to avoid off-by-one in GUI mapping + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} + +// Forward typed character directly to focused textbox to avoid duplicate definitions +void Screen::keyboardTextEvent() +{ + char c = Keyboard::getChar(); + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (c >=32) tb->text.push_back(c); + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Handle backspace for focused textbox + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + if (!tb->text.empty()) tb->text.erase(tb->text.size() -1,1); + } + if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height; // removed -1 +} + +// Default implementation for character input (virtual) +void Screen::keyboardNewChar(char inputChar) { + // default: forward to focused textbox is handled in keyboardTextEvent; keep empty here + (void)inputChar; +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/187DE8AD52EBC841816C6DE591979E5C/60105998BF65C51125A33A4B785A887C b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/187DE8AD52EBC841816C6DE591979E5C/60105998BF65C51125A33A4B785A887C new file mode 100644 index 0000000..81e0443 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/187DE8AD52EBC841816C6DE591979E5C/60105998BF65C51125A33A4B785A887C @@ -0,0 +1,295 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 to avoid off-by-one in GUI mapping + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} + +// Forward typed character directly to focused textbox to avoid duplicate definitions +void Screen::keyboardTextEvent() +{ + char c = Keyboard::getChar(); + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (c >=32) tb->text.push_back(c); + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Handle backspace for focused textbox + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE || eventKey == Keyboard::KEY_DELETE) { + if (!tb->text.empty()) tb->text.erase(tb->text.size() -1,1); + } + // Enter/Return will defocus the textbox + if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height; // removed -1 +} + +// Default implementation for character input (virtual) +void Screen::keyboardNewChar(char inputChar) { + // default: forward to focused textbox is handled in keyboardTextEvent; keep empty here + (void)inputChar; +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/187DE8AD52EBC841816C6DE591979E5C/83105CECE6AA00603D9DA1057156A4A0 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/187DE8AD52EBC841816C6DE591979E5C/83105CECE6AA00603D9DA1057156A4A0 new file mode 100644 index 0000000..55155fc --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/187DE8AD52EBC841816C6DE591979E5C/83105CECE6AA00603D9DA1057156A4A0 @@ -0,0 +1,146 @@ +#include "TextEditScreen.h" +#include "../../../world/level/tile/entity/SignTileEntity.h" +#include "../../../AppPlatform.h" +#include "../../Minecraft.h" +#include "../../renderer/tileentity/TileEntityRenderDispatcher.h" +#include "../../renderer/Tesselator.h" +#include "../../renderer/Textures.h" +#include "../../renderer/GameRenderer.h" +#include "../components/Button.h" +#include "../../../network/Packet.h" +#include "../../../network/RakNetInstance.h" +TextEditScreen::TextEditScreen( SignTileEntity* signEntity ) + : sign(signEntity), isShowingKeyboard(false), frame(0), line(0), btnClose(1, "") { + +} +TextEditScreen::~TextEditScreen() { + +} +void TextEditScreen::init() { + super::init(); + minecraft->platform()->showKeyboard(); + isShowingKeyboard = true; + ImageDef def; + def.name = "gui/spritesheet.png"; + def.x = 0; + def.y = 1; + def.width = def.height = 18; + def.setSrc(IntRectangle(60, 0, 18, 18)); + btnClose.setImageDef(def, true); + btnClose.scaleWhenPressed = false; + buttons.push_back(&btnClose); +} + +void TextEditScreen::setupPositions() { + btnClose.width = btnClose.height = 19; + btnClose.x = width - btnClose.width; + btnClose.y = 0; +} + + +bool TextEditScreen::handleBackEvent( bool isDown ) { + sign->setChanged(); + Packet* signUpdatePacket = sign->getUpdatePacket(); + minecraft->raknetInstance->send(signUpdatePacket); + minecraft->platform()->hideKeyboard(); + minecraft->setScreen(NULL); + return true; +} + +void TextEditScreen::render( int xm, int ym, float a ) { + glDepthMask(GL_FALSE); + renderBackground(); + glPushMatrix(); + glDepthMask(GL_TRUE); + glDisable(GL_CULL_FACE); + glLoadIdentity(); + Tesselator& t = Tesselator::instance; + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrthof(0.0f, (float)minecraft->width, (float)minecraft->height, 0, -1, 1); + glMatrixMode(GL_MODELVIEW); + + minecraft->textures->loadAndBindTexture("item/sign.png"); + glColor4f2(1, 1, 1, 1); + + static float minUV[] = {0.03126f, 0.06249f}; + static float maxUV[] = {0.39063f, 0.4374f}; + float scale = ((minecraft->height / 2) / 32) * 0.9f; + + glTranslatef(minecraft->width / 2.0f, 5.0f, 0.0f); + glScalef2(scale,scale,1); + t.begin(GL_QUADS); + t.vertexUV(-32, 0, 0.0f,minUV[0],minUV[1]); + t.vertexUV(32, 0, 0.0f, maxUV[0], minUV[1]); + t.vertexUV(32, 0 + 32, 0.0f, maxUV[0], maxUV[1]); + t.vertexUV(-32, 0 + 32, 0.0f, minUV[0], maxUV[1]); + t.draw(); + + sign->selectedLine = line; + float textScale = 8.0f / 11.0f; + + glTranslatef(0, 2 ,0); + glScalef2(textScale, textScale, 1); + for(int i = 0; i < 4; ++i) { + //drawCenteredString(font, sign->messages[a], 32.0f, 10 * a, 0xFF000000); + std::string msg = sign->messages[i]; + if (i == sign->selectedLine && msg.length() < 14) { + std::string s = "> " + msg + " <"; + font->draw(s, -(float)font->width(s) / 2.0f, 10.0f * i, 0xFF000000, false); + } else { + font->draw(msg, -(float)font->width(msg) / 2.0f, 10.0f * i, 0xFF000000, false); + } + } + sign->selectedLine = -1; + //font->draw("Hej", minecraft->width / 2, 100, 0xFFFFFFFF, false); + + glPopMatrix(); + glEnable(GL_CULL_FACE); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + + //glEnable(GL_DEPTH_TEST); + super::render(xm, ym, a); +} + +void TextEditScreen::lostFocus() { + +} + +void TextEditScreen::tick() { + frame++; +} + +void TextEditScreen::keyPressed( int eventKey ) { + LOGW("Key pressed! [%d]", eventKey); + if(eventKey == Keyboard::KEY_BACKSPACE) { + if(sign->messages[line].length() > 0) { + sign->messages[line].erase(sign->messages[line].size() - 1, 1); + } else { + line--; + if(line < 0) { + line = 3; + } + } + } else if(eventKey == Keyboard::KEY_RETURN) { + line = (line + 1) % 4; + } else { + super::keyPressed(eventKey); + } +} + +void TextEditScreen::keyboardNewChar( char inputChar ) { + std::string fullstring = sign->messages[line] + inputChar; + if(fullstring.length() < 16) { + sign->messages[line] = fullstring; + //LOGW("Line text updated: %s\n", fullstring.c_str()); + } +} + +void TextEditScreen::buttonClicked( Button* button ) { + if(button == &btnClose) + handleBackEvent(true); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/187DE8AD52EBC841816C6DE591979E5C/C7BFBF0B0EC23C48FBCDA27148FA48E5 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/187DE8AD52EBC841816C6DE591979E5C/C7BFBF0B0EC23C48FBCDA27148FA48E5 new file mode 100644 index 0000000..2dd50b2 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/187DE8AD52EBC841816C6DE591979E5C/C7BFBF0B0EC23C48FBCDA27148FA48E5 @@ -0,0 +1,139 @@ +#ifndef KEYBOARD_H__ +#define KEYBOARD_H__ + +#include + +/** A keyboard action; key-down or key-up */ +class KeyboardAction +{ +public: + static const int KEYUP = 0; + static const int KEYDOWN = 1; + + KeyboardAction(unsigned char keyCode, int state) { + this->key = keyCode; + this->state = state; + } + + int state; + unsigned char key; +}; + +/* Iterators */ +typedef std::vector KeyboardActionVec; +typedef KeyboardActionVec::iterator KeyboardActionIt; +typedef KeyboardActionVec::const_iterator KeyboardActionCIt; + +/** A static keyboard class, written to resemble the one in lwjgl somewhat */ +class Keyboard +{ +public: + static const int KEY_A = 65; + static const int KEY_B = 66; + static const int KEY_C = 67; + static const int KEY_D = 68; + static const int KEY_E = 69; + static const int KEY_F = 70; + static const int KEY_G = 71; + static const int KEY_H = 72; + static const int KEY_I = 73; + static const int KEY_J = 74; + static const int KEY_K = 75; + static const int KEY_L = 76; + static const int KEY_M = 77; + static const int KEY_N = 78; + static const int KEY_O = 79; + static const int KEY_P = 80; + static const int KEY_Q = 81; + static const int KEY_R = 82; + static const int KEY_S = 83; + static const int KEY_T = 84; + static const int KEY_U = 85; + static const int KEY_V = 86; + static const int KEY_W = 87; + static const int KEY_X = 88; + static const int KEY_Y = 89; + static const int KEY_Z = 90; + + static const int KEY_BACKSPACE = 8; + static const int KEY_RETURN = 13; + + static const int KEY_DELETE = 127; // Delete key (ASCII DEL) + + static const int KEY_F1 = 112; + static const int KEY_F2 = 113; + static const int KEY_F3 = 114; + static const int KEY_F4 = 115; + static const int KEY_F5 = 116; + static const int KEY_F6 = 117; + static const int KEY_F7 = 118; + static const int KEY_F8 = 119; + static const int KEY_F9 = 120; + static const int KEY_F10 = 121; + static const int KEY_F11 = 122; + static const int KEY_F12 = 123; + + static const int KEY_ESCAPE = 27; + static const int KEY_SPACE = 32; + static const int KEY_LSHIFT = 10; + + static bool isKeyDown(int keyCode) { + return _states[keyCode] == KeyboardAction::KEYDOWN; + } + + static void reset() { + _inputs.clear(); + _inputText.clear(); + _index = -1; + _textIndex = -1; + } + + static void feed(unsigned char keyCode, int state) { + _inputs.push_back(KeyboardAction(keyCode, state)); + + _states[keyCode] = state; + } + static void feedText(char character) { + _inputText.push_back(character); + } + + static bool next() { + if (_index + 1 >= (int)_inputs.size()) + return false; + + ++_index; + return true; + } + + static bool nextTextChar() { + if(_textIndex + 1 >= (int)_inputText.size()) + return false; + ++_textIndex; + return true; + } + + static void rewind() { + _index = -1; + _textIndex = -1; + } + + static int getEventKey() { + return _inputs[_index].key; + } + + static int getEventKeyState() { + return _inputs[_index].state; + } + static char getChar() { + return _inputText[_textIndex]; + } +private: + static int _index; + static int _textIndex; + static int _states[256]; + static std::vector _inputs; + static std::vector _inputText; + static bool _inited; +}; + +#endif//KEYBOARD_H__ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/187DE8AD52EBC841816C6DE591979E5C/E19DC915D7B7F4D40A50F260C758DAD9 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/187DE8AD52EBC841816C6DE591979E5C/E19DC915D7B7F4D40A50F260C758DAD9 new file mode 100644 index 0000000..c45276d --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/187DE8AD52EBC841816C6DE591979E5C/E19DC915D7B7F4D40A50F260C758DAD9 @@ -0,0 +1,80 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI__Screen_H__ +#define NET_MINECRAFT_CLIENT_GUI__Screen_H__ + +//package net.minecraft.client.gui; + +#include +#include "GuiComponent.h" + +class Font; +class Minecraft; +class Button; +class TextBox; +struct IntRectangle; + +class Screen: public GuiComponent +{ +public: + Screen(); + + virtual void render(int xm, int ym, float a); + + void init(Minecraft* minecraft, int width, int height); + virtual void init(); + + void setSize(int width, int height); + virtual void setupPositions() {}; + + virtual void updateEvents(); + virtual void mouseEvent(); + virtual void keyboardEvent(); + virtual void keyboardTextEvent(); + virtual bool handleBackEvent(bool isDown); + + virtual void tick() {} + + virtual void removed() {} + + virtual void renderBackground(); + virtual void renderBackground(int vo); + virtual void renderDirtBackground(int vo); + // query + virtual bool renderGameBehind(); + virtual bool hasClippingArea(IntRectangle& out); + + virtual bool isPauseScreen(); + virtual bool isErrorScreen(); + virtual bool isInGameScreen(); + virtual bool closeOnPlayerHurt(); + + virtual void confirmResult(bool result, int id) {} + virtual void lostFocus(); + virtual void toGUICoordinate(int& x, int& y); +protected: + void updateTabButtonSelection(); + + virtual void buttonClicked(Button* button) {} + virtual void mouseClicked(int x, int y, int buttonNum); + virtual void mouseReleased(int x, int y, int buttonNum); + + virtual void keyPressed(int eventKey); + virtual void keyboardNewChar(char inputChar); +public: + int width; + int height; + bool passEvents; + //GuiParticles* particles; +protected: + Minecraft* minecraft; + std::vector buttons; + std::vector textBoxes; + + std::vector tabButtons; + int tabButtonIndex; + + Font* font; +private: + Button* clickedButton; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI__Screen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/0E1E245EA16F1FAA685C5686B18BDD08 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/0E1E245EA16F1FAA685C5686B18BDD08 new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/0E1E245EA16F1FAA685C5686B18BDD08 @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/12795CE2DE855BB598F1AF108DC377B4 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/12795CE2DE855BB598F1AF108DC377B4 new file mode 100644 index 0000000..ca65891 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/12795CE2DE855BB598F1AF108DC377B4 @@ -0,0 +1,230 @@ +#include "JoinGameScreen.h" +#include "StartMenuScreen.h" +#include "ProgressScreen.h" +#include "../Font.h" +#include "../../../network/RakNetInstance.h" +#include "../../../network/ClientSideNetworkHandler.h" + +#include "../components/TextBox.h" + +#include +#include +#include + +JoinGameScreen::JoinGameScreen() +: bJoin(2, "Join Game"), + bBack(3, "Back"), + gamesList(NULL), + ip(5, "IP+Port?") +{ + bJoin.active = false; + //gamesList->yInertia =0.5f; +} + +JoinGameScreen::~JoinGameScreen() +{ + delete gamesList; +} + +void JoinGameScreen::buttonClicked(Button* button) +{ + if (button->id == bJoin.id) + { + // Try manual IP:Port from textbox first (if provided) + std::string addr = ip.text; + // trim whitespace + auto trim = [](std::string &s) { + size_t start =0; + while (start < s.size() && std::isspace((unsigned char)s[start])) ++start; + size_t end = s.size(); + while (end > start && std::isspace((unsigned char)s[end -1])) --end; + s = s.substr(start, end - start); + }; + trim(addr); + + if (!addr.empty() && addr != "IP+Port?") + { + // parse host[:port], default port19132 + std::string host = addr; + int port =19132; + size_t colon = addr.find(':'); + if (colon != std::string::npos) + { + host = addr.substr(0, colon); + std::string portStr = addr.substr(colon +1); + trim(host); + trim(portStr); + if (!portStr.empty()) + port = std::atoi(portStr.c_str()); + } else { + trim(host); + } + + if (!host.empty()) + { + // Tear down any previous callback and create a client callback for this connection + if (minecraft->netCallback) { + delete minecraft->netCallback; + minecraft->netCallback = NULL; + } + minecraft->netCallback = new ClientSideNetworkHandler(minecraft, minecraft->raknetInstance); + + // Start the connection (returns immediately whether startup succeeded) + minecraft->raknetInstance->connect(host.c_str(), port); + + // Mirror existing behavior: disable buttons and show progress screen + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + return; + } + + // Fallback: join selected discovered server (existing behavior) + if (isIndexValid(gamesList->selectedItem)) + { + PingedCompatibleServer selectedServer = gamesList->copiedServerList[gamesList->selectedItem]; + minecraft->joinMultiplayer(selectedServer); + { + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + } + //minecraft->locateMultiplayer(); + //minecraft->setScreen(new JoinGameScreen()); + } + if (button->id == bBack.id) + { + minecraft->cancelLocateMultiplayer(); + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } +} + +bool JoinGameScreen::handleBackEvent(bool isDown) +{ + if (!isDown) + { + minecraft->cancelLocateMultiplayer(); + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } + return true; +} + + +bool JoinGameScreen::isIndexValid( int index ) +{ + return gamesList && index >=0 && index < gamesList->getNumberOfItems(); +} + +void JoinGameScreen::tick() +{ + const ServerList& orgServerList = minecraft->raknetInstance->getServerList(); + ServerList serverList; + for (unsigned int i =0; i < orgServerList.size(); ++i) + if (orgServerList[i].name.GetLength() >0) + serverList.push_back(orgServerList[i]); + + if (serverList.size() != gamesList->copiedServerList.size()) + { + // copy the currently selected item + PingedCompatibleServer selectedServer; + bool hasSelection = false; + if (isIndexValid(gamesList->selectedItem)) + { + selectedServer = gamesList->copiedServerList[gamesList->selectedItem]; + hasSelection = true; + } + + gamesList->copiedServerList = serverList; + gamesList->selectItem(-1, false); + + // re-select previous item if it still exists + if (hasSelection) + { + for (unsigned int i =0; i < gamesList->copiedServerList.size(); i++) + { + if (gamesList->copiedServerList[i].address == selectedServer.address) + { + gamesList->selectItem(i, false); + break; + } + } + } + } else { + for (int i = (int)gamesList->copiedServerList.size()-1; i >=0 ; --i) { + for (int j =0; j < (int) serverList.size(); ++j) + if (serverList[j].address == gamesList->copiedServerList[i].address) + gamesList->copiedServerList[i].name = serverList[j].name; + } + } + + bJoin.active = isIndexValid(gamesList->selectedItem); +} + +void JoinGameScreen::init() +{ + buttons.push_back(&bJoin); + buttons.push_back(&bBack); + textBoxes.push_back(&ip); + + minecraft->raknetInstance->clearServerList(); + gamesList = new AvailableGamesList(minecraft, width, height); + +#ifdef ANDROID + tabButtons.push_back(&bJoin); + tabButtons.push_back(&bBack); +#endif +} + +void JoinGameScreen::setupPositions() { + int yBase = height -26; + + //#ifdef ANDROID + bJoin.y = yBase; + bBack.y = yBase; + + bBack.width = bJoin.width =120; + //#endif + + // Center buttons + bJoin.x = width /2 -4 - bJoin.width; + bBack.x = width /2 +4; + ip.x =1; + ip.y =10; + ip.w = bJoin.width; +} + +void JoinGameScreen::render( int xm, int ym, float a ) +{ + bool hasNetwork = minecraft->platform()->isNetworkEnabled(true); +#ifdef WIN32 + hasNetwork = hasNetwork && !GetAsyncKeyState(VK_TAB); +#endif + + renderBackground(); + if (hasNetwork) gamesList->render(xm, ym, a); + Screen::render(xm, ym, a); + + if (hasNetwork) { +#ifdef RPI + std::string s = "Scanning for Local Network Games..."; +#else + std::string s = "Scanning for WiFi Games..."; +#endif + drawCenteredString(minecraft->font, s, width /2,8,0xffffffff); + + const int textWidth = minecraft->font->width(s); + const int spinnerX = width/2 + textWidth /2 +6; + + static const char* spinnerTexts[] = {"-", "\\", "|", "/"}; + int n = ((int)(5.5f * getTimeS()) %4); + drawCenteredString(minecraft->font, spinnerTexts[n], spinnerX,8,0xffffffff); + } else { + std::string s = "WiFi is disabled"; + const int yy = height /2 -8; + drawCenteredString(minecraft->font, s, width /2, yy,0xffffffff); + } +} + +bool JoinGameScreen::isInGameScreen() { return false; } diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/1CC65E0062271217494E8E6A4C0A58CE b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/1CC65E0062271217494E8E6A4C0A58CE new file mode 100644 index 0000000..bfd810c --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/1CC65E0062271217494E8E6A4C0A58CE @@ -0,0 +1,34 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ +#define NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ + +//package net.minecraft.client.gui; + +#include +#include "../GuiComponent.h" +#include "../../Options.h" + +class Font; +class Minecraft; + +class TextBox: public GuiComponent +{ +public: + TextBox(int id, const std::string& msg); + TextBox(int id, int x, int y, const std::string& msg); + TextBox(int id, int x, int y, int w, int h, const std::string& msg); + + virtual void setFocus(Minecraft* minecraft); + virtual bool loseFocus(Minecraft* minecraft); + + virtual void render(Minecraft* minecraft, int xm, int ym); + +public: + int w, h; + int x, y; + + std::string text; + int id; + bool focused; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/1D11F3CE27B0B595836AB483CC9A0B43 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/1D11F3CE27B0B595836AB483CC9A0B43 new file mode 100644 index 0000000..3af41b5 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/1D11F3CE27B0B595836AB483CC9A0B43 @@ -0,0 +1,37 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +TextBox::TextBox( int id, const std::string& msg ) + : id(0), w(0), h(0), x(0), y(0), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + minecraft->platform()->showKeyboard(); + focused = true; + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + minecraft->platform()->showKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/31E5C6E25D1A85B2BD22B44535F6828F b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/31E5C6E25D1A85B2BD22B44535F6828F new file mode 100644 index 0000000..c3bbd26 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/31E5C6E25D1A85B2BD22B44535F6828F @@ -0,0 +1,227 @@ +cpp ..\..\src\client\gui\screens\JoinGameScreen.cpp +#include "JoinGameScreen.h" +#include "StartMenuScreen.h" +#include "ProgressScreen.h" +#include "../Font.h" +#include "../../../network/RakNetInstance.h" +#include "../../../network/ClientSideNetworkHandler.h" + +#include "../components/TextBox.h" + +JoinGameScreen::JoinGameScreen() +: bJoin( 2, "Join Game"), + bBack( 3, "Back"), + gamesList(NULL), + ip(5, "IP+Port?") +{ + bJoin.active = false; + //gamesList->yInertia = 0.5f; +} + +JoinGameScreen::~JoinGameScreen() +{ + delete gamesList; +} + +void JoinGameScreen::buttonClicked(Button* button) +{ + if (button->id == bJoin.id) + { + // Try manual IP:Port from textbox first (if provided) + std::string addr = ip.text; + // trim whitespace + auto trim = [](std::string &s) { + size_t start = 0; + while (start < s.size() && isspace((unsigned char)s[start])) ++start; + size_t end = s.size(); + while (end > start && isspace((unsigned char)s[end - 1])) --end; + s = s.substr(start, end - start); + }; + trim(addr); + + if (!addr.empty() && addr != "IP+Port?") + { + // parse host[:port], default port 19132 + std::string host = addr; + int port = 19132; + size_t colon = addr.find(':'); + if (colon != std::string::npos) + { + host = addr.substr(0, colon); + std::string portStr = addr.substr(colon + 1); + trim(host); + trim(portStr); + if (!portStr.empty()) + port = atoi(portStr.c_str()); + } else { + trim(host); + } + + if (!host.empty()) + { + // Tear down any previous callback and create a client callback for this connection + if (minecraft->netCallback) { + delete minecraft->netCallback; + minecraft->netCallback = NULL; + } + minecraft->netCallback = new ClientSideNetworkHandler(minecraft, minecraft->raknetInstance); + + // Start the connection (returns immediately whether startup succeeded) + minecraft->raknetInstance->connect(host.c_str(), port); + + // Mirror existing behavior: disable buttons and show progress screen + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + return; + } + + // Fallback: join selected discovered server (existing behavior) + if (isIndexValid(gamesList->selectedItem)) + { + PingedCompatibleServer selectedServer = gamesList->copiedServerList[gamesList->selectedItem]; + minecraft->joinMultiplayer(selectedServer); + { + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + } + //minecraft->locateMultiplayer(); + //minecraft->setScreen(new JoinGameScreen()); + } + if (button->id == bBack.id) + { + minecraft->cancelLocateMultiplayer(); + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } +} + +bool JoinGameScreen::handleBackEvent(bool isDown) +{ + if (!isDown) + { + minecraft->cancelLocateMultiplayer(); + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } + return true; +} + + +bool JoinGameScreen::isIndexValid( int index ) +{ + return gamesList && index >= 0 && index < gamesList->getNumberOfItems(); +} + +void JoinGameScreen::tick() +{ + const ServerList& orgServerList = minecraft->raknetInstance->getServerList(); + ServerList serverList; + for (unsigned int i = 0; i < orgServerList.size(); ++i) + if (orgServerList[i].name.GetLength() > 0) + serverList.push_back(orgServerList[i]); + + if (serverList.size() != gamesList->copiedServerList.size()) + { + // copy the currently selected item + PingedCompatibleServer selectedServer; + bool hasSelection = false; + if (isIndexValid(gamesList->selectedItem)) + { + selectedServer = gamesList->copiedServerList[gamesList->selectedItem]; + hasSelection = true; + } + + gamesList->copiedServerList = serverList; + gamesList->selectItem(-1, false); + + // re-select previous item if it still exists + if (hasSelection) + { + for (unsigned int i = 0; i < gamesList->copiedServerList.size(); i++) + { + if (gamesList->copiedServerList[i].address == selectedServer.address) + { + gamesList->selectItem(i, false); + break; + } + } + } + } else { + for (int i = (int)gamesList->copiedServerList.size()-1; i >= 0 ; --i) { + for (int j = 0; j < (int) serverList.size(); ++j) + if (serverList[j].address == gamesList->copiedServerList[i].address) + gamesList->copiedServerList[i].name = serverList[j].name; + } + } + + bJoin.active = isIndexValid(gamesList->selectedItem); +} + +void JoinGameScreen::init() +{ + buttons.push_back(&bJoin); + buttons.push_back(&bBack); + textBoxes.push_back(&ip); + + minecraft->raknetInstance->clearServerList(); + gamesList = new AvailableGamesList(minecraft, width, height); + +#ifdef ANDROID + tabButtons.push_back(&bJoin); + tabButtons.push_back(&bBack); +#endif +} + +void JoinGameScreen::setupPositions() { + int yBase = height - 26; + + //#ifdef ANDROID + bJoin.y = yBase; + bBack.y = yBase; + + bBack.width = bJoin.width = 120; + //#endif + + // Center buttons + bJoin.x = width / 2 - 4 - bJoin.width; + bBack.x = width / 2 + 4; + ip.x = 1; + ip.y = 10; + ip.w = bJoin.width; +} + +void JoinGameScreen::render( int xm, int ym, float a ) +{ + bool hasNetwork = minecraft->platform()->isNetworkEnabled(true); +#ifdef WIN32 + hasNetwork = hasNetwork && !GetAsyncKeyState(VK_TAB); +#endif + + renderBackground(); + if (hasNetwork) gamesList->render(xm, ym, a); + Screen::render(xm, ym, a); + + if (hasNetwork) { +#ifdef RPI + std::string s = "Scanning for Local Network Games..."; +#else + std::string s = "Scanning for WiFi Games..."; +#endif + drawCenteredString(minecraft->font, s, width / 2, 8, 0xffffffff); + + const int textWidth = minecraft->font->width(s); + const int spinnerX = width/2 + textWidth / 2 + 6; + + static const char* spinnerTexts[] = {"-", "\\", "|", "/"}; + int n = ((int)(5.5f * getTimeS()) % 4); + drawCenteredString(minecraft->font, spinnerTexts[n], spinnerX, 8, 0xffffffff); + } else { + std::string s = "WiFi is disabled"; + const int yy = height / 2 - 8; + drawCenteredString(minecraft->font, s, width / 2, yy, 0xffffffff); + } +} + +bool JoinGameScreen::isInGameScreen() { return false; } diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/4222F2040602983458B5992A709F7336 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/4222F2040602983458B5992A709F7336 new file mode 100644 index 0000000..ad4d97c --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/4222F2040602983458B5992A709F7336 @@ -0,0 +1,74 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_SCREENS_TOUCH__TouchJoinGameScreen_H__ +#define NET_MINECRAFT_CLIENT_GUI_SCREENS_TOUCH__TouchJoinGameScreen_H__ + +#include "../../Screen.h" +#include "../../components/Button.h" +#include "../../components/SmallButton.h" +#include "../../components/RolledSelectionListV.h" +#include "../../../Minecraft.h" +#include "../../../../platform/input/Multitouch.h" +#include "../../../../network/RakNetInstance.h" + +namespace Touch { + +class JoinGameScreen; + +class AvailableGamesList : public RolledSelectionListV +{ + int startSelected; + int selectedItem; + ServerList copiedServerList; + + friend class JoinGameScreen; + +public: + AvailableGamesList(Minecraft* _minecraft, int _width, int _height) + : RolledSelectionListV(_minecraft, _width, _height, 0, _width, 24, _height, 34), + selectedItem(-1), + startSelected(-1) + { + } + +protected: + + virtual int getNumberOfItems() { return (int)copiedServerList.size(); } + + virtual void selectCancel(); + virtual void selectStart(int item); + virtual void selectItem(int item, bool doubleClick); + + virtual bool isSelectedItem(int item) { return item == selectedItem; } + + virtual void renderBackground() {} + virtual void renderItem(int i, int x, int y, int h, Tesselator& t); +}; + +class JoinGameScreen: public Screen +{ +public: + JoinGameScreen(); + virtual ~JoinGameScreen(); + + void init(); + void setupPositions(); + + virtual bool handleBackEvent(bool isDown); + + virtual bool isIndexValid(int index); + + virtual void tick(); + void render(int xm, int ym, float a); + + void buttonClicked(Button* button); + + bool isInGameScreen(); +private: + Button bJoin; + TButton bBack; + THeader bHeader; + AvailableGamesList* gamesList; +}; + +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_SCREENS_TOUCH__TouchJoinGameScreen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/430CC357A15D4BE1A70387A7C3462A3C b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/430CC357A15D4BE1A70387A7C3462A3C new file mode 100644 index 0000000..92a367b --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/430CC357A15D4BE1A70387A7C3462A3C @@ -0,0 +1,258 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i = 0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0, 0, width, height, 0xc0101010, 0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1, 1, 1, 1); + float s = 32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height, 0, 0, height / s + fvo); + t.vertexUV((float)width, (float)height, 0, width / s, (float)height / s + fvo); + t.vertexUV((float)width, 0, 0, (float)width / s, 0 + fvo); + t.vertexUV(0, 0, 0, 0, 0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex = 0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount - 1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i = 0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; +/* +#if !defined(ANDROID) && !defined(__APPLE__) //if (!minecraft->isTouchscreen()) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); +#endif } +*/ + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + +#if 1 +//#if defined(ANDROID) || defined(__APPLE__) //if (minecraft->isTouchscreen()) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click", 1, 1); + clickedButton->released(x, y); + } + } +# else // } else { + clickedButton->released(x, y); +#endif // } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height - 1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/572513C3D8D309B3634C045C3C8FAC54 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/572513C3D8D309B3634C045C3C8FAC54 new file mode 100644 index 0000000..872695a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/572513C3D8D309B3634C045C3C8FAC54 @@ -0,0 +1,137 @@ +#ifndef KEYBOARD_H__ +#define KEYBOARD_H__ + +#include + +/** A keyboard action; key-down or key-up */ +class KeyboardAction +{ +public: + static const int KEYUP = 0; + static const int KEYDOWN = 1; + + KeyboardAction(unsigned char keyCode, int state) { + this->key = keyCode; + this->state = state; + } + + int state; + unsigned char key; +}; + +/* Iterators */ +typedef std::vector KeyboardActionVec; +typedef KeyboardActionVec::iterator KeyboardActionIt; +typedef KeyboardActionVec::const_iterator KeyboardActionCIt; + +/** A static keyboard class, written to resemble the one in lwjgl somewhat */ +class Keyboard +{ +public: + static const int KEY_A = 65; + static const int KEY_B = 66; + static const int KEY_C = 67; + static const int KEY_D = 68; + static const int KEY_E = 69; + static const int KEY_F = 70; + static const int KEY_G = 71; + static const int KEY_H = 72; + static const int KEY_I = 73; + static const int KEY_J = 74; + static const int KEY_K = 75; + static const int KEY_L = 76; + static const int KEY_M = 77; + static const int KEY_N = 78; + static const int KEY_O = 79; + static const int KEY_P = 80; + static const int KEY_Q = 81; + static const int KEY_R = 82; + static const int KEY_S = 83; + static const int KEY_T = 84; + static const int KEY_U = 85; + static const int KEY_V = 86; + static const int KEY_W = 87; + static const int KEY_X = 88; + static const int KEY_Y = 89; + static const int KEY_Z = 90; + + static const int KEY_BACKSPACE = 8; + static const int KEY_RETURN = 13; + + static const int KEY_F1 = 112; + static const int KEY_F2 = 113; + static const int KEY_F3 = 114; + static const int KEY_F4 = 115; + static const int KEY_F5 = 116; + static const int KEY_F6 = 117; + static const int KEY_F7 = 118; + static const int KEY_F8 = 119; + static const int KEY_F9 = 120; + static const int KEY_F10 = 121; + static const int KEY_F11 = 122; + static const int KEY_F12 = 123; + + static const int KEY_ESCAPE = 27; + static const int KEY_SPACE = 32; + static const int KEY_LSHIFT = 10; + + static bool isKeyDown(int keyCode) { + return _states[keyCode] == KeyboardAction::KEYDOWN; + } + + static void reset() { + _inputs.clear(); + _inputText.clear(); + _index = -1; + _textIndex = -1; + } + + static void feed(unsigned char keyCode, int state) { + _inputs.push_back(KeyboardAction(keyCode, state)); + + _states[keyCode] = state; + } + static void feedText(char character) { + _inputText.push_back(character); + } + + static bool next() { + if (_index + 1 >= (int)_inputs.size()) + return false; + + ++_index; + return true; + } + + static bool nextTextChar() { + if(_textIndex + 1 >= (int)_inputText.size()) + return false; + ++_textIndex; + return true; + } + + static void rewind() { + _index = -1; + _textIndex = -1; + } + + static int getEventKey() { + return _inputs[_index].key; + } + + static int getEventKeyState() { + return _inputs[_index].state; + } + static char getChar() { + return _inputText[_textIndex]; + } +private: + static int _index; + static int _textIndex; + static int _states[256]; + static std::vector _inputs; + static std::vector _inputText; + static bool _inited; +}; + +#endif//KEYBOARD_H__ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/72B2752C7CD663CF9A1CC0178EF19114 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/72B2752C7CD663CF9A1CC0178EF19114 new file mode 100644 index 0000000..c9f6e6a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/72B2752C7CD663CF9A1CC0178EF19114 @@ -0,0 +1,1563 @@ +#include "Minecraft.h" + +#if defined(APPLE_DEMO_PROMOTION) + #define NO_NETWORK +#endif + +#if defined(RPI) + #define CREATORMODE +#endif + +#include "../network/RakNetInstance.h" +#include "../network/ClientSideNetworkHandler.h" +#include "../network/ServerSideNetworkHandler.h" +//#include "../network/Packet.h" +#include "../world/entity/player/Inventory.h" +#include "../world/level/chunk/ChunkCache.h" +#include "../world/level/tile/Tile.h" +#include "../world/level/storage/LevelStorageSource.h" +#include "../world/level/storage/LevelStorage.h" +#include "player/input/KeyboardInput.h" +#ifndef STANDALONE_SERVER +#include "player/input/touchscreen/TouchInputHolder.h" +#endif +#include "player/LocalPlayer.h" +#include "gamemode/CreativeMode.h" +#include "gamemode/SurvivalMode.h" +#include "player/LocalPlayer.h" +#ifndef STANDALONE_SERVER +#include "particle/ParticleEngine.h" +#include "gui/Screen.h" +#include "gui/Font.h" +#include "gui/screens/RenameMPLevelScreen.h" +#include "sound/SoundEngine.h" +#endif +#include "../platform/CThread.h" +#include "../platform/input/Mouse.h" +#include "../AppPlatform.h" +#include "../Performance.h" +#include "../LicenseCodes.h" +#include "../util/PerfTimer.h" +#include "../util/PerfRenderer.h" +#include "player/input/MouseBuildInput.h" + +#include "../world/Facing.h" + +#include "../network/packet/PlaceBlockPacket.h" + +#include "player/input/IInputHolder.h" +#ifndef STANDALONE_SERVER +#include "player/input/touchscreen/TouchscreenInput.h" + +#include "player/input/ControllerTurnInput.h" +#include "player/input/XperiaPlayInput.h" + +#endif + +#include "player/input/MouseTurnInput.h" +#include "../world/entity/MobFactory.h" +#include "../world/level/MobSpawner.h" +#include "../util/Mth.h" +#include "../network/packet/InteractPacket.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/PrerenderTilesScreen.h" +#include "renderer/Textures.h" +#include "gui/screens/DeathScreen.h" +#endif + +#include "../network/packet/RespawnPacket.h" +#include "IConfigListener.h" +#include "../world/entity/MobCategory.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/FurnaceScreen.h" +#endif +#include "../world/Difficulty.h" +#include "../server/ServerLevel.h" +#ifdef CREATORMODE +#include "../server/CreatorLevel.h" +#endif +#include "../network/packet/AdventureSettingsPacket.h" +#include "../network/packet/SetSpawnPositionPacket.h" +#include "../network/command/CommandServer.h" +#include "gamemode/CreatorMode.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/ArmorScreen.h" +#endif +#include "../world/level/levelgen/synth/ImprovedNoise.h" +#ifndef STANDALONE_SERVER +#include "renderer/tileentity/TileEntityRenderDispatcher.h" +#endif + +#ifndef STANDALONE_SERVER +#include "renderer/ptexture/DynamicTexture.h" +#include "renderer/GameRenderer.h" +#include "renderer/ItemInHandRenderer.h" +#include "renderer/LevelRenderer.h" +#include "renderer/entity/EntityRenderDispatcher.h" +#include "gui/Screen.h" +#include "gui/Font.h" +#include "gui/screens/RenameMPLevelScreen.h" +#include "sound/SoundEngine.h" +#endif + +static void checkGlError(const char* tag) { +#ifdef GLDEBUG + while (1) { + const int errCode = glGetError(); + if (errCode == GL_NO_ERROR) break; + + LOGE("################\nOpenGL-error @ %s : #%d\n", tag, errCode); + } +#endif /*GLDEBUG*/ +} + +/*static*/ +const char* Minecraft::progressMessages[] = { + "Locating server", + "Building terrain", + "Preparing", + "Saving chunks" +}; + +int Minecraft::customDebugId = Minecraft::CDI_NONE; + +#if defined(_MSC_VER) + #pragma warning( disable : 4355 ) // 'this' pointer in initialization list which is perfectly legal +#endif + +bool Minecraft::useAmbientOcclusion = false; + +Minecraft::Minecraft() +: user(NULL), + level(NULL), + player(NULL), + cameraTargetPlayer(NULL), + levelRenderer(NULL), + gameRenderer(NULL), +#ifndef STANDALONE_SERVER + particleEngine(NULL), + _perfRenderer(NULL), +#endif + _commandServer(NULL), +#ifndef STANDALONE_SERVER + textures(NULL), +#endif + lastTickTime(-1), + lastTime(0), + ticksSinceLastUpdate(0), + gameMode(NULL), + mouseGrabbed(true), + missTime(0), + pause(false), + _running(false), + timer(20), +#ifndef STANDALONE_SERVER + gui(this), +#endif + netCallback(NULL), +#ifndef STANDALONE_SERVER + screen(NULL), + font(NULL), +#endif + screenMutex(false), +#ifndef STANDALONE_SERVER + scheduledScreen(NULL), + hasScheduledScreen(false), + soundEngine(NULL), +#endif + ticks(0), + isGeneratingLevel(false), + _hasSignaledGeneratingLevelFinished(true), + generateLevelThread(NULL), + progressStagePercentage(0), + progressStageStatusId(0), + isLookingForMultiplayer(false), + _licenseId(LicenseCodes::WAIT_PLATFORM_NOT_READY), + inputHolder(0), + _supportsNonTouchscreen(false), +#ifndef STANDALONE_SERVER + screenChooser(this), +#endif + width(1), height(1), + //_respawnPlayerTicks(-1), +#ifdef __APPLE__ + _isSuperFast(false), +#endif + _powerVr(false), + commandPort(4711), + reserved_d1(0),reserved_d2(0), + reserved_f1(0),reserved_f2(0) +{ +//#ifdef ANDROID + +#if defined(NO_NETWORK) + raknetInstance = new IRakNetInstance(); +#else + raknetInstance = new RakNetInstance(); +#endif +#ifndef STANDALONE_SERVER + soundEngine = new SoundEngine(20.0f); + soundEngine->init(this, &options); +#endif + //setupPieces(); +} + +Minecraft::~Minecraft() +{ + delete netCallback; + delete raknetInstance; +#ifndef STANDALONE_SERVER + delete levelRenderer; + delete gameRenderer; + delete particleEngine; + + delete soundEngine; +#endif + delete gameMode; +#ifndef STANDALONE_SERVER + delete font; + delete textures; + + if (screen != NULL) { + delete screen; + screen = NULL; + } +#endif + if (level != NULL) { + level->saveGame(); + if (level->getChunkSource()) + level->getChunkSource()->saveAll(true); + delete level->getLevelStorage(); + delete level; + level = NULL; + } + + //delete player; + delete user; + delete inputHolder; + + delete storageSource; + delete _perfRenderer; + delete _commandServer; + + MobFactory::clearStaticTestMobs(); +#ifndef STANDALONE_SERVER + EntityRenderDispatcher::destroy(); +#endif +} + +// Only called by server +void Minecraft::selectLevel( const std::string& levelId, const std::string& levelName, const LevelSettings& settings ) +{ +#if defined(CREATORMODE) + level = new CreatorLevel( +#else + level = new ServerLevel( +#endif + storageSource->selectLevel(levelId, false), + levelName, + settings, + SharedConstants::GeneratorVersion); + + // note: settings is useless beyond this point, since it's + // either copied to LevelData (or LevelData read from file) + setLevel(level, "Generating level"); + setIsCreativeMode(level->getLevelData()->getGameType() == GameType::Creative); + _running = true; +} + +void Minecraft::setLevel(Level* level, const std::string& message /* ="" */, LocalPlayer* forceInsertPlayer /* = NULL */) { + cameraTargetPlayer = NULL; + LOGI("Seed is %ld\n", level->getSeed()); + + if (level != NULL) { + level->raknetInstance = raknetInstance; + gameMode->initLevel(level); + + if (!player && forceInsertPlayer) + { + player = forceInsertPlayer; + player->resetPos(false); + //level->addEntity(forceInsertPlayer); + } + else if (player != NULL) { + player->resetPos(false); + if (level != NULL) { + level->addEntity(player); + } + } + this->level = level; + _hasSignaledGeneratingLevelFinished = false; +#ifdef STANDALONE_SERVER + const bool threadedLevelCreation = false; +#else + const bool threadedLevelCreation = true; +#endif + + if (threadedLevelCreation) { + // Threaded + // "Lock" + isGeneratingLevel = true; + generateLevelThread = new CThread(Minecraft::prepareLevel_tspawn, this); + } else { + // Non-threaded + generateLevel("Currently not used", level); + } + } else { + player = NULL; + } + + this->lastTickTime = 0; + this->_running = true; +} + +void Minecraft::leaveGame(bool renameLevel /*=false*/) +{ + if (isGeneratingLevel || !_hasSignaledGeneratingLevelFinished) + return; + + isGeneratingLevel = false; + bool saveLevel = level && (!level->isClientSide || renameLevel); + + raknetInstance->disconnect(); + if (saveLevel) { + // If server or wanting to save level as client, save all unsaved chunks! + level->getChunkSource()->saveAll(true); + } + + LOGI("Clearing levels\n"); + + cameraTargetPlayer = NULL; +#ifndef STANDALONE_SERVER + levelRenderer->setLevel(NULL); + particleEngine->setLevel(NULL); +#endif + LOGI("Erasing callback\n"); + delete netCallback; + netCallback = NULL; + + LOGI("Erasing level\n"); + if (level != NULL) { + delete level->getLevelStorage(); + delete level; + level = NULL; + } + //delete player; + player = NULL; + cameraTargetPlayer = NULL; + + _running = false; +#ifndef STANDALONE_SERVER + if (renameLevel) { + setScreen(new RenameMPLevelScreen(LevelStorageSource::TempLevelId)); + } + else + screenChooser.setScreen(SCREEN_STARTMENU); +#endif +} + +void Minecraft::prepareLevel(const std::string& title) { + LOGI("status: 1\n"); + progressStageStatusId = 1; + + Stopwatch A, B, C, D; + A.start(); + + Stopwatch L; + + // Dont update lights if we load the level (ok, actually just with leveldata version=1.+(?)) + if (!level->isNew()) + level->setUpdateLights(false); + + int Max = CHUNK_CACHE_WIDTH * CHUNK_CACHE_WIDTH; + int pp = 0; + for (int x = 8; x < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); x += CHUNK_WIDTH) { + for (int z = 8; z < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); z += CHUNK_WIDTH) { + progressStagePercentage = 100 * pp++ / Max; + //printf("level generation progress %d\n", progressStagePercentage); + B.start(); + level->getTile(x, 64, z); + B.stop(); + L.start(); + if (level->isNew()) + while (level->updateLights()) + ; + L.stop(); + } + } + A.stop(); + level->setUpdateLights(true); + + C.start(); + for (int x = 0; x < CHUNK_CACHE_WIDTH; x++) + { + for (int z = 0; z < CHUNK_CACHE_WIDTH; z++) + { + LevelChunk* chunk = level->getChunk(x, z); + if (chunk && !chunk->createdFromSave) + { + chunk->unsaved = false; + chunk->clearUpdateMap(); + } + } + } + C.stop(); + + LOGI("status: 3\n"); + progressStageStatusId = 3; + if (level->isNew()) { + level->setInitialSpawn(); // @note: should obviously be called from Level itself + level->saveLevelData(); + level->getChunkSource()->saveAll(false); + level->saveGame(); + } else { + level->saveLevelData(); + level->loadEntities(); + } + + progressStagePercentage = -1; + progressStageStatusId = 2; + LOGI("status: 2\n"); + + D.start(); + level->prepare(); + D.stop(); + + A.print("Generate level: "); + L.print(" - light: "); + B.print(" - getTl: "); + C.print(" - clear: "); + D.print(" - prepr: "); + progressStageStatusId = 0; +} + +void Minecraft::update() { + //LOGI("Enter Update\n"); + + if (Options::debugGl) + LOGI(">>>>>>>>>>\n"); + + TIMER_PUSH("root"); + + //if (level) { + // LOGI("numplayers: %d\n", level->players.size()); + // for (int i = 0; i < level->players.size(); ++i) { + // Player* p = level->players[i]; + // bool inEnt = std::find(level->entities.begin(), level->entities.end(), p) != level->entities.end(); + // LOGI(" %p, %d, %d - in? %d\n", p, p->entityId, p->owner.ToUint32(p->owner), inEnt); + // } + //} + + if (pause && level != NULL) { + float lastA = timer.a; + timer.advanceTime(); + timer.a = lastA; + } else { + timer.advanceTime(); + } + + if (raknetInstance) { + raknetInstance->runEvents(netCallback); + } + + TIMER_PUSH("tick"); + int toTick = timer.ticks; + for (int i = 0; i < toTick; ++i, ++ticks) + tick(i, toTick-1); + + TIMER_POP_PUSH("updatelights"); + if (level && !isGeneratingLevel) { + level->updateLights(); + } + TIMER_POP(); + + #ifndef STANDALONE_SERVER + if (gameMode != NULL) gameMode->render(timer.a); + TIMER_PUSH("sound"); + soundEngine->update(player, timer.a); + TIMER_POP_PUSH("render"); + gameRenderer->render(timer.a); + TIMER_POP(); + #else + CThread::sleep(1); + #endif +#ifndef STANDALONE_SERVER + Multitouch::resetThisUpdate(); +#endif + TIMER_POP(); +#ifndef STANDALONE_SERVER + checkGlError("Update finished"); + + if (options.renderDebug) { + if (!PerfTimer::enabled) { + PerfTimer::reset(); + PerfTimer::enabled = true; + } + + //TIMER_PUSH("debugfps"); + _perfRenderer->renderFpsMeter(1); + checkGlError("render debug"); + //TIMER_POP(); + } else { + PerfTimer::enabled = false; + } +#endif + //LOGI("Exit Update\n"); +} + +void Minecraft::tick(int nTick, int maxTick) { + if (missTime > 0) missTime--; +#ifndef STANDALONE_SERVER + if (!screen && player) { + if (player->health <= 0) { + setScreen(new DeathScreen()); + } + } +#endif + TIMER_PUSH("gameMode"); + if (level && !pause) { + gameMode->tick(); + } + + TIMER_POP_PUSH("commandServer"); + if (level && _commandServer) { + _commandServer->tick(); + } + + TIMER_POP_PUSH("input"); + tickInput(); +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("gui"); + gui.tick(); +#endif + // + // Ongoing level generation in a (perhaps) different thread. When it's + // ready, _levelGenerated() is called once and any threads are deleted. + // + if (isGeneratingLevel) { + return; + } else if (!_hasSignaledGeneratingLevelFinished) { + if (generateLevelThread) { + delete generateLevelThread; + generateLevelThread = NULL; + } + _levelGenerated(); + } + + // + // Normal game loop, run before or efter level generation + // + if (level != NULL) + { + if (!pause) { +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("gameRenderer"); + gameRenderer->tick(nTick, maxTick); + + TIMER_POP_PUSH("levelRenderer"); + levelRenderer->tick(); +#endif + level->difficulty = options.difficulty; + if (level->isClientSide) level->difficulty = Difficulty::EASY; + + TIMER_POP_PUSH("level"); + level->tickEntities(); + level->tick(); +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("animateTick"); + if (player) { + level->animateTick(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); + } +#endif + } + } +#ifndef STANDALONE_SERVER + textures->loadAndBindTexture("terrain.png"); + if (!pause && !(screen && !screen->renderGameBehind())) { + #if !defined(RPI) + #ifdef __APPLE__ + if (isSuperFast()) + #endif + { + if (nTick == maxTick) { + TIMER_POP_PUSH("textures"); + textures->tick(true); + } + } + #endif + } + TIMER_POP_PUSH("particles"); + particleEngine->tick(); + if (screen) { + screenMutex = true; + screen->tick(); + screenMutex = false; + } + + // @note: fix to keep "isPressed" and "isReleased" as long as necessary. + // Most likely keyboard and mouse could/should be reset here as well. + Multitouch::reset(); +#endif + TIMER_POP(); +} + +class InputRAII { +public: + ~InputRAII() { +#ifndef STANDALONE_SERVER + Mouse::reset(); + Keyboard::reset(); +#endif + } +}; + +void Minecraft::tickInput() { +#ifndef STANDALONE_SERVER + InputRAII raiiInput; + + if (screen && !screen->passEvents) { + screenMutex = true; + screen->updateEvents(); + //screen->updateSetScreen(); + screenMutex = false; + if (hasScheduledScreen) { + setScreen(scheduledScreen); + scheduledScreen = NULL; + hasScheduledScreen = false; + } + return; + } + + if (!player) { + return; + } + +#ifdef RPI + bool mouseDiggable = true; + bool allowGuiClicks = !mouseGrabbed; +#else + bool mouseDiggable = !gui.isInside(Mouse::getX(), Mouse::getY()); + bool allowGuiClicks = true; +#endif + + TIMER_PUSH("mouse"); + while (Mouse::next()) { + //if (Mouse::getButtonState(MouseAction::ACTION_LEFT)) + // LOGI("mouse-down-at: %d, %d\n", Mouse::getX(), Mouse::getY()); + int passedTime = getTimeMs() - lastTickTime; + if (passedTime > 200) continue; // @note: As long Mouse::clear CLEARS the whole buffer, it's safe to break here + // But since it might be rewritten anyway (and hopefully there aren't a lot of messages, we just continue. + + const MouseAction& e = Mouse::getEvent(); + +#ifdef RPI // If clicked when not having focus, get focus @keyboard + if (!mouseGrabbed) { + if (!screen && e.data == MouseAction::DATA_DOWN) { + grabMouse(); + } + } +#endif + + if (allowGuiClicks && e.action == MouseAction::ACTION_LEFT && e.data == MouseAction::DATA_DOWN) { + gui.handleClick(MouseAction::ACTION_LEFT, Mouse::getX(), Mouse::getY()); + } + + if (e.action == MouseAction::ACTION_WHEEL) { + Inventory* v = player->inventory; + int numSlots = gui.getNumSlots() - 1; + int slot = (v->selected - e.dy + numSlots) % numSlots; + v->selectSlot(slot); + } + /* + if (mouseDiggable && options.useMouseForDigging) { + if (Mouse::getEventButton() == MouseAction::ACTION_LEFT && Mouse::getEventButtonState()) { + handleMouseClick(MouseAction::ACTION_LEFT); + lastClickTick = ticks; + } + if (Mouse::getEventButton() == MouseAction::ACTION_RIGHT && Mouse::getEventButtonState()) { + handleMouseClick(MouseAction::ACTION_RIGHT); + lastClickTick = ticks; + } + } + */ + } + + TIMER_POP_PUSH("keyboard"); + while (Keyboard::next()) { + int key = Keyboard::getEventKey(); + bool isPressed = (Keyboard::getEventKeyState() == KeyboardAction::KEYDOWN); + player->setKey(key, isPressed); + + if (isPressed) { + gui.handleKeyPressed(key); + + #if defined(WIN32) || defined(RPI)//|| defined(_DEBUG) || defined(DEBUG) + if (key >= '0' && key <= '9') { + int digit = key - '0'; + int slot = digit - 1; + + if (slot >= 0 && slot < gui.getNumSlots()-1) + player->inventory->selectSlot(slot); + + #if defined(WIN32) + if (digit >= 1 && GetAsyncKeyState(VK_CONTROL) < 0) { + // Set adventure settings here! + AdventureSettingsPacket p(level->adventureSettings); + p.toggle((AdventureSettingsPacket::Flags)(1 << slot)); + p.fillIn(level->adventureSettings); + raknetInstance->send(p); + } + if (digit == 0) { + Pos pos((int)player->x, (int)player->y-1, (int)player->z); + SetSpawnPositionPacket p(pos); + raknetInstance->send(p); + } + #endif + } + #endif + #if defined(RPI) + if (key == Keyboard::KEY_E) { + screenChooser.setScreen(SCREEN_BLOCKSELECTION); + } + if (!screen && key == Keyboard::KEY_O || key == 250) { + releaseMouse(); + } + #endif + #if defined(WIN32) + if (key == Keyboard::KEY_F) { + options.isFlying = !options.isFlying; + player->noPhysics = options.isFlying; + } + + if (key == Keyboard::KEY_T) { + options.thirdPersonView = !options.thirdPersonView; + /* + ImprovedNoise noise; + for (int i = 0; i < 16; ++i) + printf("%d\t%f\n", i, noise.grad2(i, 3, 8)); + */ + } + + if (key == Keyboard::KEY_O) { + useAmbientOcclusion = !useAmbientOcclusion; + options.ambientOcclusion = useAmbientOcclusion; + levelRenderer->allChanged(); + } + + if (key == Keyboard::KEY_L) + options.viewDistance = (options.viewDistance + 1) % 4; + + if (key == Keyboard::KEY_U) { + onGraphicsReset(); + player->heal(100); + } + + if (key == Keyboard::KEY_B || key == 108) // Toggle the game mode + setIsCreativeMode(!isCreativeMode()); + + if (key == Keyboard::KEY_P) // Step forward in time + level->setTime( level->getTime() + 1000); + + if (key == Keyboard::KEY_G) { + setScreen(new ArmorScreen()); + /* + std::vector& boxs = level->getCubes(NULL, AABB(128.1f, 73, 128.1f, 128.9f, 74.9f, 128.9f)); + LOGI("boxes: %d\n", (int)boxs.size()); + */ + } + + if (key == Keyboard::KEY_Y) { + textures->reloadAll(); + player->hurtTo(2); + } + if (key == Keyboard::KEY_Z || key == 108) { + for (int i = 0; i < 1; ++i) { + Mob* mob = NULL; + int forceId = 0;//MobTypes::Sheep; + + int types[] = { + MobTypes::Sheep, + MobTypes::Pig, + MobTypes::Chicken, + MobTypes::Cow, + }; + + int mobType = (forceId > 0)? forceId : types[Mth::random(sizeof(types) / sizeof(int))]; + mob = MobFactory::CreateMob(mobType, level); + + //((Animal*)mob)->setAge(-1000); + float dx = 4 - 8 * Mth::random() + 4 * Mth::sin(Mth::DEGRAD * player->yRot); + float dz = 4 - 8 * Mth::random() + 4 * Mth::cos(Mth::DEGRAD * player->yRot); + if (mob && !MobSpawner::addMob(level, mob, player->x + dx, player->y, player->z + dz, Mth::random()*360, 0, true)) + delete mob; + } + } + + if (key == Keyboard::KEY_X) { + const EntityList& entities = level->getAllEntities(); + for (int i = entities.size()-1; i >= 0; --i) { + Entity* e = entities[i]; + if (!e->isPlayer()) + level->removeEntity(e); + } + } + + if (key == Keyboard::KEY_C /*|| key == 4*/) { + player->inventory->clearInventoryWithDefault(); + // @todo: Add saving here for benchmarking + } + if (key == Keyboard::KEY_H) { + setScreen( new PrerenderTilesScreen() ); + } + + if (key == Keyboard::KEY_O) { + for (int i = Inventory::MAX_SELECTION_SIZE; i < player->inventory->getContainerSize(); ++i) + if (player->inventory->getItem(i)) + player->inventory->dropSlot(i, false); + } + if (key == Keyboard::KEY_F3) { + options.renderDebug = !options.renderDebug; + } + if (key == Keyboard::KEY_M) { + options.difficulty = (options.difficulty == Difficulty::PEACEFUL)? + Difficulty::NORMAL : Difficulty::PEACEFUL; + //setIsCreativeMode( !isCreativeMode() ); + } + + // lanternroci + if (key == Keyboard::KEY_ESCAPE) + pauseGame(false); + if (key == Keyboard::KEY_E && !options.isFlying) { + screenChooser.setScreen(SCREEN_BLOCKSELECTION); + } + + if (options.renderDebug) { + if (key >= '0' && key <= '9') { + _perfRenderer->debugFpsMeterKeyPress(key - '0'); + } + } + #endif + + #ifndef RPI + if (key == 82) + pauseGame(false); + #else + if (key == Keyboard::KEY_ESCAPE) + pauseGame(false); + #endif + + #ifndef OPENGL_ES + if (key == Keyboard::KEY_P) { + static bool isWireFrame = false; + isWireFrame = !isWireFrame; + glPolygonMode(GL_FRONT, isWireFrame? GL_LINE : GL_FILL); + //glPolygonMode(GL_BACK, isWireFrame? GL_LINE : GL_FILL); + } + #endif + } + #ifdef WIN32 + if (key == Keyboard::KEY_M) { + for (int i = 0; i < 5 * SharedConstants::TicksPerSecond; ++i) + level->tick(); + } + #endif + + + //if (!isPressed) LOGI("Key released: %d\n", key); + + if (!options.useMouseForDigging) { + int passedTime = getTimeMs() - lastTickTime; + if (passedTime > 200) continue; + + // Destroy and attack is on same button + if (key == options.keyDestroy.key && isPressed) { + BuildActionIntention bai(BuildActionIntention::BAI_REMOVE | BuildActionIntention::BAI_ATTACK); + handleBuildAction(&bai); + } + else // Build and use/interact is on same button + if (key == options.keyUse.key && isPressed) { + BuildActionIntention bai(BuildActionIntention::BAI_BUILD | BuildActionIntention::BAI_INTERACT); + handleBuildAction(&bai); + } + } + } + + TIMER_POP_PUSH("tickbuild"); + BuildActionIntention bai; + // @note: This might be a problem. This method is polling based here, but + // event based when using mouse (or keys..), and in java. Not quite + // sure just yet what way to go. + bool buildHandled = inputHolder->getBuildInput()->tickBuild(player, &bai); + if (buildHandled) { + if (!bai.isRemoveContinue()) + handleBuildAction(&bai); + } + + bool isTryingToDestroyBlock = (options.useMouseForDigging + ? (Mouse::isButtonDown(MouseAction::ACTION_LEFT) && mouseDiggable) + : Keyboard::isKeyDown(options.keyDestroy.key)) + || (buildHandled && bai.isRemove()); + + TIMER_POP_PUSH("handlemouse"); +#ifdef RPI + handleMouseDown(MouseAction::ACTION_LEFT, isTryingToDestroyBlock); + handleMouseClick(buildHandled && bai.isInteract() + || options.useMouseForDigging && Mouse::isButtonDown(MouseAction::ACTION_RIGHT)); +#else + handleMouseDown(MouseAction::ACTION_LEFT, isTryingToDestroyBlock || (buildHandled && bai.isInteract())); +#endif + + lastTickTime = getTimeMs(); + + // we have (hopefully) handled the keyboard & mouse queue and it + // can now be emptied. If wanted, the reset could be changed to: + // index -= numRead; // then this code doesn't have to be placed here + // + it prepares for tick not handling all or any events. + // update: RAII'ing instead, see above + //Keyboard::reset(); + //Mouse::reset(); + + TIMER_POP(); +#endif +} + +void Minecraft::handleMouseDown(int button, bool down) { +#ifndef STANDALONE_SERVER +#ifndef RPI + if(player->isUsingItem()) { + if(!down && !Keyboard::isKeyDown(options.keyUse.key)) { + gameMode->releaseUsingItem(player); + } + return; + } +#endif + if(player->isSleeping()) { + return; + } + if (button == MouseAction::ACTION_LEFT && missTime > 0) return; + if (down && hitResult.type == TILE && button == MouseAction::ACTION_LEFT && !hitResult.indirectHit) { + int x = hitResult.x; + int y = hitResult.y; + int z = hitResult.z; + gameMode->continueDestroyBlock(x, y, z, hitResult.f); + particleEngine->crack(x, y, z, hitResult.f); + player->swing(); + } else { + gameMode->stopDestroyBlock(); + } +#endif +} + +void Minecraft::handleMouseClick(int button) { +// BuildActionIntention bai( +// (button == MouseAction::ACTION_LEFT)? +// BuildActionIntention::BAI_REMOVE +// : BuildActionIntention::BAI_BUILD); +// +// handleBuildAction(&bai); +} + +void Minecraft::handleBuildAction(BuildActionIntention* action) { +#ifndef STANDALONE_SERVER + if (action->isRemove()) { + if (missTime > 0) return; + player->swing(); + } + if(player->isUsingItem()) + return; + bool mayUse = true; + + if (!hitResult.isHit()) { + if (action->isRemove() && !gameMode->isCreativeType()) { + missTime = 10; + } + } else if (hitResult.type == ENTITY) { + if (action->isAttack()) { + player->swing(); + //LOGI("attacking!\n"); + InteractPacket packet(InteractPacket::Attack, player->entityId, hitResult.entity->entityId); + raknetInstance->send(packet); + gameMode->attack(player, hitResult.entity); + } else if (action->isInteract()) { + if (hitResult.entity->interactPreventDefault()) + mayUse = false; + //LOGI("interacting!\n"); + InteractPacket packet(InteractPacket::Interact, player->entityId, hitResult.entity->entityId); + raknetInstance->send(packet); + gameMode->interact(player, hitResult.entity); + } + } else if (hitResult.type == TILE) { + int x = hitResult.x; + int y = hitResult.y; + int z = hitResult.z; + int face = hitResult.f; + + int oldTileId = level->getTile(x, y, z); + Tile* oldTile = Tile::tiles[oldTileId]; + + //bool tryDestroyBlock = false; + + if (action->isRemove()) { + if (!oldTile) + return; + + //LOGI("tile: %s - %d, %d, %d. b: %f - %f\n", oldTile->getDescriptionId().c_str(), x, y, z, oldTile->getBrightness(level, x, y, z), oldTile->getBrightness(level, x, y+1, z)); + level->extinguishFire(x, y, z, hitResult.f); + gameMode->startDestroyBlock(x, y, z, hitResult.f); + } + else { + ItemInstance* item = player->inventory->getSelected(); + if (gameMode->useItemOn(player, level, item, x, y, z, face, hitResult.pos)) { + mayUse = false; + player->swing(); + #ifdef RPI + } else if (item && item->id == ((Item*)Item::sword_iron)->id) { + player->swing(); + #endif + } + if (item && item->count <= 0) { + player->inventory->clearSlot(player->inventory->selected); + } + //} else if (item && item->count != oldCount) { + // gameRenderer->itemInHandRenderer->itemPlaced(); + //} + } + } + if (mayUse && action->isInteract()) { + ItemInstance* item = player->inventory->getSelected(); + if (item && !player->isUsingItem()) { + if (gameMode->useItem(player, level, item)) { + gameRenderer->itemInHandRenderer->itemUsed(); + } + if (item && item->count <= 0) { + player->inventory->clearSlot(player->inventory->selected); + } + } + } +#endif +} + +bool Minecraft::isOnlineClient() +{ + return (level != NULL && level->isClientSide); +} + +bool Minecraft::isOnline() +{ + return netCallback != NULL; +} + +void Minecraft::pauseGame(bool isBackPaused) { +#ifndef STANDALONE_SERVER + if (screen != NULL) return; + screenChooser.setScreen(isBackPaused? SCREEN_PAUSEPREV : SCREEN_PAUSE); +#endif +} +void Minecraft::gameLostFocus() { +#ifndef STANDALONE_SERVER + if(screen != NULL) { + screen->lostFocus(); + } +#endif +} + + +void Minecraft::setScreen( Screen* screen ) +{ +#ifndef STANDALONE_SERVER + Mouse::reset(); + Multitouch::reset(); + Multitouch::resetThisUpdate(); + + if (screenMutex) { + hasScheduledScreen = true; + scheduledScreen = screen; + return; + } + + if (screen != NULL && screen->isErrorScreen()) + return; + if (screen == NULL && level == NULL) + screen = screenChooser.createScreen(SCREEN_STARTMENU); + + if (this->screen != NULL) { + this->screen->removed(); + delete this->screen; + } + + this->screen = screen; + if (screen != NULL) { + releaseMouse(); + //ScreenSizeCalculator ssc = new ScreenSizeCalculator(options, width, height); + int screenWidth = (int)(width * Gui::InvGuiScale); //ssc.getWidth(); + int screenHeight = (int)(height * Gui::InvGuiScale); //ssc.getHeight(); + screen->init(this, screenWidth, screenHeight); + + if (screen->isInGameScreen() && level) { + level->saveLevelData(); + level->saveGame(); + } + + //noRender = false; + } else { + grabMouse(); + } +#endif +} + +void Minecraft::grabMouse() +{ +#ifndef STANDALONE_SERVER + if (mouseGrabbed) return; + mouseGrabbed = true; + mouseHandler.grab(); + //setScreen(NULL); +#endif +} + +void Minecraft::releaseMouse() +{ +#ifndef STANDALONE_SERVER + if (!mouseGrabbed) { + return; + } + if (player) { + player->releaseAllKeys(); + } + mouseGrabbed = false; + mouseHandler.release(); +#endif +} + +bool Minecraft::useTouchscreen() { +#ifdef RPI + return false; +#endif + return options.useTouchScreen || !_supportsNonTouchscreen; +} +bool Minecraft::supportNonTouchScreen() { + return _supportsNonTouchscreen; +} +void Minecraft::init() +{ + options.minecraft = this; + options.initDefaultValues(); +#ifndef STANDALONE_SERVER + checkGlError("Init enter"); + + _supportsNonTouchscreen = !platform()->supportsTouchscreen(); + + LOGI("IS TOUCHSCREEN? %d\n", options.useTouchScreen); + + textures = new Textures(&options, platform()); + textures->addDynamicTexture(new WaterTexture()); + textures->addDynamicTexture(new WaterSideTexture()); + gui.texturesLoaded(textures); + + levelRenderer = new LevelRenderer(this); + gameRenderer = new GameRenderer(this); + particleEngine = new ParticleEngine(level, textures); + + // Platform specific initialization here + font = new Font(&options, "font/default8.png", textures); + + _perfRenderer = new PerfRenderer(this, font); + + checkGlError("Init complete"); +#endif + + user = new User("TestUser", ""); + setIsCreativeMode(false); // false means it's Survival Mode + reloadOptions(); + +} + +void Minecraft::setSize(int w, int h) { +#ifndef STANDALONE_SERVER + transformResolution(&w, &h); + + width = w; + height = h; + + if (width >= 1000) { + #ifdef __APPLE__ + Gui::GuiScale = (width > 2000)? 8.0f : 4.0f; + #else + Gui::GuiScale = 4.0f; + #endif + } + else if (width >= 800) { +#ifdef __APPLE__ + Gui::GuiScale = 4.0f; +#else + Gui::GuiScale = 3.0f; +#endif + } + else if (width >= 400) + Gui::GuiScale = 2.0f; + else + Gui::GuiScale = 1.0f; + + Gui::InvGuiScale = 1.0f / Gui::GuiScale; + int screenWidth = (int)(width * Gui::InvGuiScale); + int screenHeight = (int)(height * Gui::InvGuiScale); + + if (platform()) { + float pixelsPerMillimeter = options.getProgressValue(&Options::Option::PIXELS_PER_MILLIMETER); + pixelCalc.setPixelsPerMillimeter(pixelsPerMillimeter); + pixelCalcUi.setPixelsPerMillimeter(pixelsPerMillimeter * Gui::InvGuiScale); + } + + Config config = createConfig(this); + gui.onConfigChanged(config); + + if (screen) + screen->setSize(screenWidth, screenHeight); + + if (inputHolder) + inputHolder->onConfigChanged(config); + //LOGI("Setting size: %d, %d: %f\n", width, height, Gui::InvGuiScale); + +#ifdef WIN32 + char resbuf[128]; + sprintf(resbuf, " %d x %d @ scale %.2f", width, height, Gui::GuiScale); + //gui.addMessage(resbuf); +#endif +#endif /* STANDALONE_SERVER */ +} + +void Minecraft::reloadOptions() { + options.update(); + options.save(); + bool wasTouchscreen = options.useTouchScreen; + options.useTouchScreen = useTouchscreen(); + options.save(); + + if ((wasTouchscreen != options.useTouchScreen) || (inputHolder == 0)) + _reloadInput(); + + user->name = options.username; + + LOGI("Reloading-options\n"); + + // @todo @fix Android and iOS behaves a bit differently when leaving + // an options screen (Android recreates OpenGL surface) + setSize(width, height); +} + +void Minecraft::_reloadInput() { +#ifndef STANDALONE_SERVER + delete inputHolder; + + if (useTouchscreen()) { + inputHolder = new TouchInputHolder(this, &options); + } else { + #if defined(ANDROID) || defined(__APPLE__) + inputHolder = new CustomInputHolder( + new XperiaPlayInput(&options), + new ControllerTurnInput(2, ControllerTurnInput::MODE_DELTA), + new IBuildInput()); + #else + inputHolder = new CustomInputHolder( + new KeyboardInput(&options), + new MouseTurnInput(MouseTurnInput::MODE_DELTA, width/2, height/2), + new MouseBuildInput()); + #endif + } + + mouseHandler.setTurnInput(inputHolder->getTurnInput()); + if (level && player) { + player->input = inputHolder->getMoveInput(); + } +#endif +} + + +// +// Multiplayer +// +void Minecraft::locateMultiplayer() { + isLookingForMultiplayer = true; + + raknetInstance->pingForHosts(19132); + netCallback = new ClientSideNetworkHandler(this, raknetInstance); +} + +void Minecraft::cancelLocateMultiplayer() { + isLookingForMultiplayer = false; + + raknetInstance->stopPingForHosts(); + + delete netCallback; + netCallback = NULL; +} + +bool Minecraft::joinMultiplayer( const PingedCompatibleServer& server ) +{ + if (isLookingForMultiplayer && netCallback) { + isLookingForMultiplayer = false; + return raknetInstance->connect(server.address.ToString(false), server.address.GetPort()); + } + return false; +} + +void Minecraft::hostMultiplayer(int port) { + // Tear down last instance + raknetInstance->disconnect(); + delete netCallback; + netCallback = NULL; + +#if !defined(NO_NETWORK) + netCallback = new ServerSideNetworkHandler(this, raknetInstance); + #ifdef STANDALONE_SERVER + raknetInstance->host(user->name, port, 16); + #else + raknetInstance->host(user->name, port); + #endif +#endif +} + +// +// Level generation +// +/*static*/ + + void* Minecraft::prepareLevel_tspawn(void *p_param) +{ + Minecraft* mc = (Minecraft*) p_param; + mc->generateLevel("Currently not used", mc->level); + return 0; +} + +void Minecraft::generateLevel( const std::string& message, Level* level ) +{ + Stopwatch s; + s.start(); + prepareLevel(message); + s.stop(); + s.print("Level generated: "); + + // "Unlock" + isGeneratingLevel = false; +} + +void Minecraft::_levelGenerated() +{ +#ifndef STANDALONE_SERVER + if (player == NULL) { + player = (LocalPlayer*) gameMode->createPlayer(level); + gameMode->initPlayer(player); + } + + if (player) { + player->input = inputHolder->getMoveInput(); + } + + if (levelRenderer != NULL) levelRenderer->setLevel(level); + if (particleEngine != NULL) particleEngine->setLevel(level); + + gameMode->adjustPlayer(player); + gui.onLevelGenerated(); +#endif + + level->validateSpawn(); + level->loadPlayer(player, true); + // if we are client side, we trust the server to have given us a correct position + if (player && !level->isClientSide) { + player->resetPos(false); + } + + this->cameraTargetPlayer = player; + + if (raknetInstance->isServer()) + raknetInstance->announceServer(user->name); + + if (netCallback) { + netCallback->levelGenerated(level); + } + +#if defined(WIN32) || defined(RPI) + if (_commandServer) { + delete _commandServer; + } + _commandServer = new CommandServer(this); + _commandServer->init(commandPort); +#endif + + // Hack to (hopefully) get the players to show (note: in LevelListener + // instead, since adding yourself always generates a entityAdded) + //EntityRenderDispatcher::getInstance()->onGraphicsReset(); + _hasSignaledGeneratingLevelFinished = true; +} + +Player* Minecraft::respawnPlayer(int playerId) { + for (unsigned int i = 0; i < level->players.size(); ++i) { + if (level->players[i]->entityId == playerId) { + resetPlayer(level->players[i]); + return level->players[i]; + } + } + return NULL; +} + +void Minecraft::resetPlayer(Player* player) { + level->validateSpawn(); + player->reset(); + + Pos p; + if(player->hasRespawnPosition()) { + p = player->getRespawnPosition(); + } + else { + p = level->getSharedSpawnPos(); + } + player->setPos((float)p.x + 0.5f, (float)p.y + 1.0f, (float)p.z + 0.5f); + player->resetPos(true); + + if (isCreativeMode()) + player->inventory->clearInventoryWithDefault(); +} + +void Minecraft::respawnPlayer() { + // RESET THE FRACKING PLAYER HERE + //bool slowCheck = false; + //for (int i = 0; i < level->entities.size(); ++i) + // if (level->entities[i] == player) slowCheck = true; + // + //LOGI("Has entity? %d, %d\n", level->getEntity(player->entityId), slowCheck); + + resetPlayer(player); + + // tell server (or other client) that we re-spawned + RespawnPacket packet(player); + raknetInstance->send(packet); +} + +void Minecraft::onGraphicsReset() +{ +#ifndef STANDALONE_SERVER + textures->clear(); + + font->onGraphicsReset(); + gui.onGraphicsReset(); + + if (levelRenderer) levelRenderer->onGraphicsReset(); + if (gameRenderer) gameRenderer->onGraphicsReset(); + + EntityRenderDispatcher::getInstance()->onGraphicsReset(); + TileEntityRenderDispatcher::getInstance()->onGraphicsReset(); +#endif +} + +int Minecraft::getProgressStatusId() { + return progressStageStatusId; +} + +const char* Minecraft::getProgressMessage() +{ + return progressMessages[progressStageStatusId]; +} + +bool Minecraft::isLevelGenerated() +{ + return level != NULL && !isGeneratingLevel; +} + +LevelStorageSource* Minecraft::getLevelSource() +{ + return storageSource; +} + +int Minecraft::getLicenseId() { + if (!LicenseCodes::isReady(_licenseId)) + _licenseId = platform()->checkLicense(); + return _licenseId; +} + +void Minecraft::audioEngineOn() { +#ifndef STANDALONE_SERVER + soundEngine->enable(true); +#endif +} +void Minecraft::audioEngineOff() { +#ifndef STANDALONE_SERVER + soundEngine->enable(false); +#endif +} + +void Minecraft::setIsCreativeMode(bool isCreative) +{ +#ifdef CREATORMODE + delete gameMode; + gameMode = new CreatorMode(this); + _isCreativeMode = true; +#else + if (!gameMode || isCreative != _isCreativeMode) + { + delete gameMode; + if (isCreative) gameMode = new CreativeMode(this); + else gameMode = new SurvivalMode(this); + _isCreativeMode = isCreative; + } +#endif + if (player) + gameMode->initAbilities(player->abilities); +} + +bool Minecraft::isCreativeMode() { + return _isCreativeMode; +} + +bool Minecraft::isKindleFire(int kindleVersion) { + if (kindleVersion != 1) + return false; + + std::string model = platform()->getPlatformStringVar(PlatformStringVars::DEVICE_BUILD_MODEL); + std::string modelLower(model); + std::transform(modelLower.begin(), modelLower.end(), modelLower.begin(), tolower); + + return (modelLower.find("kindle") != std::string::npos) && (modelLower.find("fire") != std::string::npos); +} + +bool Minecraft::transformResolution(int* w, int* h) +{ + bool changed = false; + + // Kindle Fire 1: reporting wrong height in + // certain cases (e.g. after screen lock) + if (isKindleFire(1) && *h >= 560 && *h <= 620) { + *h = 580; + changed = true; + } + + return changed; +} + +ICreator* Minecraft::getCreator() +{ +#ifdef CREATORMODE + return ((CreatorMode*)gameMode)->getCreator(); +#else + return NULL; +#endif +} + +void Minecraft::optionUpdated( const Options::Option* option, bool value ) { + if(netCallback != NULL && option == &Options::Option::SERVER_VISIBLE) { + ServerSideNetworkHandler* ss = (ServerSideNetworkHandler*) netCallback; + ss->allowIncomingConnections(value); + } +} + +void Minecraft::optionUpdated( const Options::Option* option, float value ) { +#ifndef STANDALONE_SERVER + if(option == &Options::Option::PIXELS_PER_MILLIMETER) { + pixelCalcUi.setPixelsPerMillimeter(value * Gui::InvGuiScale); + pixelCalc.setPixelsPerMillimeter(value); + } +#endif +} + +void Minecraft::optionUpdated( const Options::Option* option, int value ) { + +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/7EAC658EF12ABB6C7FB918B4EE6CE367 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/7EAC658EF12ABB6C7FB918B4EE6CE367 new file mode 100644 index 0000000..c3bbd26 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/7EAC658EF12ABB6C7FB918B4EE6CE367 @@ -0,0 +1,227 @@ +cpp ..\..\src\client\gui\screens\JoinGameScreen.cpp +#include "JoinGameScreen.h" +#include "StartMenuScreen.h" +#include "ProgressScreen.h" +#include "../Font.h" +#include "../../../network/RakNetInstance.h" +#include "../../../network/ClientSideNetworkHandler.h" + +#include "../components/TextBox.h" + +JoinGameScreen::JoinGameScreen() +: bJoin( 2, "Join Game"), + bBack( 3, "Back"), + gamesList(NULL), + ip(5, "IP+Port?") +{ + bJoin.active = false; + //gamesList->yInertia = 0.5f; +} + +JoinGameScreen::~JoinGameScreen() +{ + delete gamesList; +} + +void JoinGameScreen::buttonClicked(Button* button) +{ + if (button->id == bJoin.id) + { + // Try manual IP:Port from textbox first (if provided) + std::string addr = ip.text; + // trim whitespace + auto trim = [](std::string &s) { + size_t start = 0; + while (start < s.size() && isspace((unsigned char)s[start])) ++start; + size_t end = s.size(); + while (end > start && isspace((unsigned char)s[end - 1])) --end; + s = s.substr(start, end - start); + }; + trim(addr); + + if (!addr.empty() && addr != "IP+Port?") + { + // parse host[:port], default port 19132 + std::string host = addr; + int port = 19132; + size_t colon = addr.find(':'); + if (colon != std::string::npos) + { + host = addr.substr(0, colon); + std::string portStr = addr.substr(colon + 1); + trim(host); + trim(portStr); + if (!portStr.empty()) + port = atoi(portStr.c_str()); + } else { + trim(host); + } + + if (!host.empty()) + { + // Tear down any previous callback and create a client callback for this connection + if (minecraft->netCallback) { + delete minecraft->netCallback; + minecraft->netCallback = NULL; + } + minecraft->netCallback = new ClientSideNetworkHandler(minecraft, minecraft->raknetInstance); + + // Start the connection (returns immediately whether startup succeeded) + minecraft->raknetInstance->connect(host.c_str(), port); + + // Mirror existing behavior: disable buttons and show progress screen + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + return; + } + + // Fallback: join selected discovered server (existing behavior) + if (isIndexValid(gamesList->selectedItem)) + { + PingedCompatibleServer selectedServer = gamesList->copiedServerList[gamesList->selectedItem]; + minecraft->joinMultiplayer(selectedServer); + { + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + } + //minecraft->locateMultiplayer(); + //minecraft->setScreen(new JoinGameScreen()); + } + if (button->id == bBack.id) + { + minecraft->cancelLocateMultiplayer(); + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } +} + +bool JoinGameScreen::handleBackEvent(bool isDown) +{ + if (!isDown) + { + minecraft->cancelLocateMultiplayer(); + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } + return true; +} + + +bool JoinGameScreen::isIndexValid( int index ) +{ + return gamesList && index >= 0 && index < gamesList->getNumberOfItems(); +} + +void JoinGameScreen::tick() +{ + const ServerList& orgServerList = minecraft->raknetInstance->getServerList(); + ServerList serverList; + for (unsigned int i = 0; i < orgServerList.size(); ++i) + if (orgServerList[i].name.GetLength() > 0) + serverList.push_back(orgServerList[i]); + + if (serverList.size() != gamesList->copiedServerList.size()) + { + // copy the currently selected item + PingedCompatibleServer selectedServer; + bool hasSelection = false; + if (isIndexValid(gamesList->selectedItem)) + { + selectedServer = gamesList->copiedServerList[gamesList->selectedItem]; + hasSelection = true; + } + + gamesList->copiedServerList = serverList; + gamesList->selectItem(-1, false); + + // re-select previous item if it still exists + if (hasSelection) + { + for (unsigned int i = 0; i < gamesList->copiedServerList.size(); i++) + { + if (gamesList->copiedServerList[i].address == selectedServer.address) + { + gamesList->selectItem(i, false); + break; + } + } + } + } else { + for (int i = (int)gamesList->copiedServerList.size()-1; i >= 0 ; --i) { + for (int j = 0; j < (int) serverList.size(); ++j) + if (serverList[j].address == gamesList->copiedServerList[i].address) + gamesList->copiedServerList[i].name = serverList[j].name; + } + } + + bJoin.active = isIndexValid(gamesList->selectedItem); +} + +void JoinGameScreen::init() +{ + buttons.push_back(&bJoin); + buttons.push_back(&bBack); + textBoxes.push_back(&ip); + + minecraft->raknetInstance->clearServerList(); + gamesList = new AvailableGamesList(minecraft, width, height); + +#ifdef ANDROID + tabButtons.push_back(&bJoin); + tabButtons.push_back(&bBack); +#endif +} + +void JoinGameScreen::setupPositions() { + int yBase = height - 26; + + //#ifdef ANDROID + bJoin.y = yBase; + bBack.y = yBase; + + bBack.width = bJoin.width = 120; + //#endif + + // Center buttons + bJoin.x = width / 2 - 4 - bJoin.width; + bBack.x = width / 2 + 4; + ip.x = 1; + ip.y = 10; + ip.w = bJoin.width; +} + +void JoinGameScreen::render( int xm, int ym, float a ) +{ + bool hasNetwork = minecraft->platform()->isNetworkEnabled(true); +#ifdef WIN32 + hasNetwork = hasNetwork && !GetAsyncKeyState(VK_TAB); +#endif + + renderBackground(); + if (hasNetwork) gamesList->render(xm, ym, a); + Screen::render(xm, ym, a); + + if (hasNetwork) { +#ifdef RPI + std::string s = "Scanning for Local Network Games..."; +#else + std::string s = "Scanning for WiFi Games..."; +#endif + drawCenteredString(minecraft->font, s, width / 2, 8, 0xffffffff); + + const int textWidth = minecraft->font->width(s); + const int spinnerX = width/2 + textWidth / 2 + 6; + + static const char* spinnerTexts[] = {"-", "\\", "|", "/"}; + int n = ((int)(5.5f * getTimeS()) % 4); + drawCenteredString(minecraft->font, spinnerTexts[n], spinnerX, 8, 0xffffffff); + } else { + std::string s = "WiFi is disabled"; + const int yy = height / 2 - 8; + drawCenteredString(minecraft->font, s, width / 2, yy, 0xffffffff); + } +} + +bool JoinGameScreen::isInGameScreen() { return false; } diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/83105CECE6AA00603D9DA1057156A4A0 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/83105CECE6AA00603D9DA1057156A4A0 new file mode 100644 index 0000000..55155fc --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/83105CECE6AA00603D9DA1057156A4A0 @@ -0,0 +1,146 @@ +#include "TextEditScreen.h" +#include "../../../world/level/tile/entity/SignTileEntity.h" +#include "../../../AppPlatform.h" +#include "../../Minecraft.h" +#include "../../renderer/tileentity/TileEntityRenderDispatcher.h" +#include "../../renderer/Tesselator.h" +#include "../../renderer/Textures.h" +#include "../../renderer/GameRenderer.h" +#include "../components/Button.h" +#include "../../../network/Packet.h" +#include "../../../network/RakNetInstance.h" +TextEditScreen::TextEditScreen( SignTileEntity* signEntity ) + : sign(signEntity), isShowingKeyboard(false), frame(0), line(0), btnClose(1, "") { + +} +TextEditScreen::~TextEditScreen() { + +} +void TextEditScreen::init() { + super::init(); + minecraft->platform()->showKeyboard(); + isShowingKeyboard = true; + ImageDef def; + def.name = "gui/spritesheet.png"; + def.x = 0; + def.y = 1; + def.width = def.height = 18; + def.setSrc(IntRectangle(60, 0, 18, 18)); + btnClose.setImageDef(def, true); + btnClose.scaleWhenPressed = false; + buttons.push_back(&btnClose); +} + +void TextEditScreen::setupPositions() { + btnClose.width = btnClose.height = 19; + btnClose.x = width - btnClose.width; + btnClose.y = 0; +} + + +bool TextEditScreen::handleBackEvent( bool isDown ) { + sign->setChanged(); + Packet* signUpdatePacket = sign->getUpdatePacket(); + minecraft->raknetInstance->send(signUpdatePacket); + minecraft->platform()->hideKeyboard(); + minecraft->setScreen(NULL); + return true; +} + +void TextEditScreen::render( int xm, int ym, float a ) { + glDepthMask(GL_FALSE); + renderBackground(); + glPushMatrix(); + glDepthMask(GL_TRUE); + glDisable(GL_CULL_FACE); + glLoadIdentity(); + Tesselator& t = Tesselator::instance; + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrthof(0.0f, (float)minecraft->width, (float)minecraft->height, 0, -1, 1); + glMatrixMode(GL_MODELVIEW); + + minecraft->textures->loadAndBindTexture("item/sign.png"); + glColor4f2(1, 1, 1, 1); + + static float minUV[] = {0.03126f, 0.06249f}; + static float maxUV[] = {0.39063f, 0.4374f}; + float scale = ((minecraft->height / 2) / 32) * 0.9f; + + glTranslatef(minecraft->width / 2.0f, 5.0f, 0.0f); + glScalef2(scale,scale,1); + t.begin(GL_QUADS); + t.vertexUV(-32, 0, 0.0f,minUV[0],minUV[1]); + t.vertexUV(32, 0, 0.0f, maxUV[0], minUV[1]); + t.vertexUV(32, 0 + 32, 0.0f, maxUV[0], maxUV[1]); + t.vertexUV(-32, 0 + 32, 0.0f, minUV[0], maxUV[1]); + t.draw(); + + sign->selectedLine = line; + float textScale = 8.0f / 11.0f; + + glTranslatef(0, 2 ,0); + glScalef2(textScale, textScale, 1); + for(int i = 0; i < 4; ++i) { + //drawCenteredString(font, sign->messages[a], 32.0f, 10 * a, 0xFF000000); + std::string msg = sign->messages[i]; + if (i == sign->selectedLine && msg.length() < 14) { + std::string s = "> " + msg + " <"; + font->draw(s, -(float)font->width(s) / 2.0f, 10.0f * i, 0xFF000000, false); + } else { + font->draw(msg, -(float)font->width(msg) / 2.0f, 10.0f * i, 0xFF000000, false); + } + } + sign->selectedLine = -1; + //font->draw("Hej", minecraft->width / 2, 100, 0xFFFFFFFF, false); + + glPopMatrix(); + glEnable(GL_CULL_FACE); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + + //glEnable(GL_DEPTH_TEST); + super::render(xm, ym, a); +} + +void TextEditScreen::lostFocus() { + +} + +void TextEditScreen::tick() { + frame++; +} + +void TextEditScreen::keyPressed( int eventKey ) { + LOGW("Key pressed! [%d]", eventKey); + if(eventKey == Keyboard::KEY_BACKSPACE) { + if(sign->messages[line].length() > 0) { + sign->messages[line].erase(sign->messages[line].size() - 1, 1); + } else { + line--; + if(line < 0) { + line = 3; + } + } + } else if(eventKey == Keyboard::KEY_RETURN) { + line = (line + 1) % 4; + } else { + super::keyPressed(eventKey); + } +} + +void TextEditScreen::keyboardNewChar( char inputChar ) { + std::string fullstring = sign->messages[line] + inputChar; + if(fullstring.length() < 16) { + sign->messages[line] = fullstring; + //LOGW("Line text updated: %s\n", fullstring.c_str()); + } +} + +void TextEditScreen::buttonClicked( Button* button ) { + if(button == &btnClose) + handleBackEvent(true); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/9CAB88584C535B15B7D916C84A38AB20 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/9CAB88584C535B15B7D916C84A38AB20 new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/9CAB88584C535B15B7D916C84A38AB20 @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/AF8821B3E089A14209FA7C2F8B96C378 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/AF8821B3E089A14209FA7C2F8B96C378 new file mode 100644 index 0000000..fe92a27 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/AF8821B3E089A14209FA7C2F8B96C378 @@ -0,0 +1,233 @@ +#include "TouchJoinGameScreen.h" +#include "../StartMenuScreen.h" +#include "../ProgressScreen.h" +#include "../../Font.h" +#include "../../../Minecraft.h" +#include "../../../renderer/Textures.h" + +namespace Touch { + +// +// Games list +// + +void AvailableGamesList::selectStart( int item) { + startSelected = item; +} + +void AvailableGamesList::selectCancel() { + startSelected = -1; +} + +void AvailableGamesList::selectItem( int item, bool doubleClick ) { + LOGI("selected an item! %d\n", item); + selectedItem = item; +} + +void AvailableGamesList::renderItem( int i, int x, int y, int h, Tesselator& t ) +{ + if (startSelected == i && Multitouch::getFirstActivePointerIdEx() >= 0) { + fill((int)x0, y, (int)x1, y+h, 0x809E684F); + } + + //static int colors[2] = {0xffffb0, 0xcccc90}; + const PingedCompatibleServer& s = copiedServerList[i]; + unsigned int color = s.isSpecial? 0x6090a0 : 0xffffb0; + unsigned int color2 = 0xffffa0;//colors[i&1]; + + int xx1 = (int)x0 + 24; + int xx2 = xx1; + + if (s.isSpecial) { + xx1 += 50; + + glEnable2(GL_TEXTURE_2D); + glColor4f2(1,1,1,1); + glEnable2(GL_BLEND); + minecraft->textures->loadAndBindTexture("gui/badge/minecon140.png"); + blit(xx2, y + 6, 0, 0, 37, 8, 140, 240); + } + + drawString(minecraft->font, s.name.C_String(), xx1, y + 4 + 2, color); + drawString(minecraft->font, s.address.ToString(false), xx2, y + 18, color2); + + /* + drawString(minecraft->font, copiedServerList[i].name.C_String(), (int)x0 + 24, y + 4, color); + drawString(minecraft->font, copiedServerList[i].address.ToString(false), (int)x0 + 24, y + 18, color); + */ +} + + +// +// Join Game screen +// +JoinGameScreen::JoinGameScreen() +: bJoin( 2, "Join Game"), + bBack( 3, "Back"), + bHeader(0, ""), + gamesList(NULL) +{ + bJoin.active = false; + //gamesList->yInertia = 0.5f; +} + +JoinGameScreen::~JoinGameScreen() +{ + delete gamesList; +} + +void JoinGameScreen::init() +{ + //buttons.push_back(&bJoin); + buttons.push_back(&bBack); + buttons.push_back(&bHeader); + + minecraft->raknetInstance->clearServerList(); + gamesList = new AvailableGamesList(minecraft, width, height); + +#ifdef ANDROID + //tabButtons.push_back(&bJoin); + tabButtons.push_back(&bBack); +#endif +} + +void JoinGameScreen::setupPositions() { + //int yBase = height - 26; + + //#ifdef ANDROID + bJoin.y = 0; + bBack.y = 0; + bHeader.y = 0; + //#endif + + // Center buttons + //bJoin.x = width / 2 - 4 - bJoin.w; + bBack.x = 0;//width / 2 + 4; + bHeader.x = bBack.width; + bHeader.width = width - bHeader.x; +} + +void JoinGameScreen::buttonClicked(Button* button) +{ + if (button->id == bJoin.id) + { + if (isIndexValid(gamesList->selectedItem)) + { + PingedCompatibleServer selectedServer = gamesList->copiedServerList[gamesList->selectedItem]; + minecraft->joinMultiplayer(selectedServer); + { + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + } + //minecraft->locateMultiplayer(); + //minecraft->setScreen(new JoinGameScreen()); + } + if (button->id == bBack.id) + { + minecraft->cancelLocateMultiplayer(); + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } +} + +bool JoinGameScreen::handleBackEvent(bool isDown) +{ + if (!isDown) + { + minecraft->cancelLocateMultiplayer(); + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } + return true; +} + + +bool JoinGameScreen::isIndexValid( int index ) +{ + return gamesList && index >= 0 && index < gamesList->getNumberOfItems(); +} + +void JoinGameScreen::tick() +{ + if (isIndexValid(gamesList->selectedItem)) { + buttonClicked(&bJoin); + return; + } + + //gamesList->tick(); + + const ServerList& orgServerList = minecraft->raknetInstance->getServerList(); + ServerList serverList; + for (unsigned int i = 0; i < orgServerList.size(); ++i) + if (orgServerList[i].name.GetLength() > 0) + serverList.push_back(orgServerList[i]); + + if (serverList.size() != gamesList->copiedServerList.size()) + { + // copy the currently selected item + PingedCompatibleServer selectedServer; + bool hasSelection = false; + if (isIndexValid(gamesList->selectedItem)) + { + selectedServer = gamesList->copiedServerList[gamesList->selectedItem]; + hasSelection = true; + } + + gamesList->copiedServerList = serverList; + gamesList->selectItem(-1, false); + + // re-select previous item if it still exists + if (hasSelection) + { + for (unsigned int i = 0; i < gamesList->copiedServerList.size(); i++) + { + if (gamesList->copiedServerList[i].address == selectedServer.address) + { + gamesList->selectItem(i, false); + break; + } + } + } + } else { + for (int i = (int)gamesList->copiedServerList.size()-1; i >= 0 ; --i) { + for (int j = 0; j < (int) serverList.size(); ++j) + if (serverList[j].address == gamesList->copiedServerList[i].address) + gamesList->copiedServerList[i].name = serverList[j].name; + } + } + + bJoin.active = isIndexValid(gamesList->selectedItem); +} + +void JoinGameScreen::render( int xm, int ym, float a ) +{ + bool hasNetwork = minecraft->platform()->isNetworkEnabled(true); +#ifdef WIN32 + hasNetwork = hasNetwork && !GetAsyncKeyState(VK_TAB); +#endif + + renderBackground(); + if (hasNetwork) gamesList->render(xm, ym, a); + else gamesList->renderDirtBackground(); + Screen::render(xm, ym, a); + + const int baseX = bHeader.x + bHeader.width / 2; + + if (hasNetwork) { + std::string s = "Scanning for WiFi Games..."; + drawCenteredString(minecraft->font, s, baseX, 8, 0xffffffff); + + const int textWidth = minecraft->font->width(s); + const int spinnerX = baseX + textWidth / 2 + 6; + + static const char* spinnerTexts[] = {"-", "\\", "|", "/"}; + int n = ((int)(5.5f * getTimeS()) % 4); + drawCenteredString(minecraft->font, spinnerTexts[n], spinnerX, 8, 0xffffffff); + } else { + drawCenteredString(minecraft->font, "WiFi is disabled", baseX, 8, 0xffffffff); + } +} + +bool JoinGameScreen::isInGameScreen() { return false; } + +}; diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/B232B2832A57A8D434C0B6499C9ADAE5 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/B232B2832A57A8D434C0B6499C9ADAE5 new file mode 100644 index 0000000..b447bc5 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/B232B2832A57A8D434C0B6499C9ADAE5 @@ -0,0 +1,73 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_SCREENS__JoinGameScreen_H__ +#define NET_MINECRAFT_CLIENT_GUI_SCREENS__JoinGameScreen_H__ + +#include "../Screen.h" +#include "../components/Button.h" +#include "../components/SmallButton.h" +#include "../components/ScrolledSelectionList.h" +#include "../../Minecraft.h" +#include "../../../network/RakNetInstance.h" + +#include "../components/TextBox.h" + +class JoinGameScreen; + +class AvailableGamesList : public ScrolledSelectionList +{ + int selectedItem; + ServerList copiedServerList; + + friend class JoinGameScreen; + +public: + + AvailableGamesList(Minecraft* _minecraft, int _width, int _height) + : ScrolledSelectionList(_minecraft, _width, _height, 24, _height - 30, 28) + { + } + +protected: + + virtual int getNumberOfItems() { return (int)copiedServerList.size(); } + + virtual void selectItem(int item, bool doubleClick) { selectedItem = item; } + virtual bool isSelectedItem(int item) { return item == selectedItem; } + + virtual void renderBackground() {} + virtual void renderItem(int i, int x, int y, int h, Tesselator& t) + { + const PingedCompatibleServer& s = copiedServerList[i]; + unsigned int color = s.isSpecial? 0xff00b0 : 0xffffa0; + drawString(minecraft->font, s.name.C_String(), x, y + 2, color); + drawString(minecraft->font, s.address.ToString(false), x, y + 16, 0xffffa0); + } +}; + +class JoinGameScreen: public Screen +{ +public: + JoinGameScreen(); + virtual ~JoinGameScreen(); + + void init(); + void setupPositions(); + + virtual bool handleBackEvent(bool isDown); + + virtual bool isIndexValid(int index); + + virtual void tick(); + + void render(int xm, int ym, float a); + + void buttonClicked(Button* button); + + bool isInGameScreen(); +private: + Button bJoin; + Button bBack; + AvailableGamesList* gamesList; + TextBox ip; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_SCREENS__JoinGameScreen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/E19DC915D7B7F4D40A50F260C758DAD9 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/E19DC915D7B7F4D40A50F260C758DAD9 new file mode 100644 index 0000000..8b4d6da --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/E19DC915D7B7F4D40A50F260C758DAD9 @@ -0,0 +1,80 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI__Screen_H__ +#define NET_MINECRAFT_CLIENT_GUI__Screen_H__ + +//package net.minecraft.client.gui; + +#include +#include "GuiComponent.h" + +class Font; +class Minecraft; +class Button; +class TextBox; +struct IntRectangle; + +class Screen: public GuiComponent +{ +public: + Screen(); + + virtual void render(int xm, int ym, float a); + + void init(Minecraft* minecraft, int width, int height); + virtual void init(); + + void setSize(int width, int height); + virtual void setupPositions() {}; + + virtual void updateEvents(); + virtual void mouseEvent(); + virtual void keyboardEvent(); + virtual void keyboardTextEvent(); + virtual bool handleBackEvent(bool isDown); + + virtual void tick() {} + + virtual void removed() {} + + virtual void renderBackground(); + virtual void renderBackground(int vo); + virtual void renderDirtBackground(int vo); + // query + virtual bool renderGameBehind(); + virtual bool hasClippingArea(IntRectangle& out); + + virtual bool isPauseScreen(); + virtual bool isErrorScreen(); + virtual bool isInGameScreen(); + virtual bool closeOnPlayerHurt(); + + virtual void confirmResult(bool result, int id) {} + virtual void lostFocus(); + virtual void toGUICoordinate(int& x, int& y); +protected: + void updateTabButtonSelection(); + + virtual void buttonClicked(Button* button) {} + virtual void mouseClicked(int x, int y, int buttonNum); + virtual void mouseReleased(int x, int y, int buttonNum); + + virtual void keyPressed(int eventKey); + virtual void keyboardNewChar(char inputChar) {} +public: + int width; + int height; + bool passEvents; + //GuiParticles* particles; +protected: + Minecraft* minecraft; + std::vector buttons; + std::vector textBoxes; + + std::vector tabButtons; + int tabButtonIndex; + + Font* font; +private: + Button* clickedButton; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI__Screen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/E25FB3B811E26EA86767132ABFD6C0FE b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/E25FB3B811E26EA86767132ABFD6C0FE new file mode 100644 index 0000000..45852ad --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/239194AA05142747BFF54850B68F1378/E25FB3B811E26EA86767132ABFD6C0FE @@ -0,0 +1,233 @@ +#ifndef NET_MINECRAFT_CLIENT__Minecraft_H__ +#define NET_MINECRAFT_CLIENT__Minecraft_H__ + +#include "Options.h" +#ifndef STANDALONE_SERVER +#include "MouseHandler.h" +#endif +#include "Timer.h" +#include "player/input/ITurnInput.h" +#ifndef STANDALONE_SERVER +#include "gui/Gui.h" +#include "gui/screens/ScreenChooser.h" +#endif +//#include "../network/RakNetInstance.h" +#include "../world/phys/HitResult.h" + +class User; +class Level; +class LocalPlayer; +class IInputHolder; +class Mob; +class Player; +class LevelRenderer; +class GameRenderer; +class ParticleEngine; +class Entity; +class ICreator; +class GameMode; +class Textures; +class CThread; +class SoundEngine; +class Screen; +class Font; +class LevelStorageSource; +class BuildActionIntention; +class PerfRenderer; +class LevelSettings; +class IRakNetInstance; +class NetEventCallback; +class CommandServer; +struct PingedCompatibleServer; +//class ExternalFileLevelStorageSource; + + +#include "../App.h" +#include "PixelCalc.h" +class AppPlatform; +class AppPlatform_android; + +class Minecraft: public App +{ +protected: + Minecraft(); +public: + virtual ~Minecraft(); + + void init(); + void setSize(int width, int height); + void reloadOptions(); + + bool supportNonTouchScreen(); + bool useTouchscreen(); + void grabMouse(); + void releaseMouse(); + + void handleBuildAction(BuildActionIntention*); + + void toggleDimension(){} + bool isCreativeMode(); + void setIsCreativeMode(bool isCreative); + void setScreen(Screen*); + + virtual void selectLevel(const std::string& levelId, const std::string& levelName, const LevelSettings& settings); + virtual void setLevel(Level* level, const std::string& message = "", LocalPlayer* forceInsertPlayer = NULL); + + void generateLevel( const std::string& message, Level* level ); + LevelStorageSource* getLevelSource(); + + bool isLookingForMultiplayer; + void locateMultiplayer(); + void cancelLocateMultiplayer(); + bool joinMultiplayer(const PingedCompatibleServer& server); + void hostMultiplayer(int port=19132); + Player* respawnPlayer(int playerId); + void respawnPlayer(); + void resetPlayer(Player* player); + void doActuallyRespawnPlayer(); + + void update(); + + void tick(int nTick, int maxTick); + void tickInput(); + + bool isOnlineClient(); + bool isOnline(); + void pauseGame(bool isBackPaused); + void gameLostFocus(); + + void prepareLevel(const std::string& message); + + void leaveGame(bool renameLevel = false); + + int getProgressStatusId(); + const char* getProgressMessage(); + + ICreator* getCreator(); + + // void onGraphicsLost() {} + void onGraphicsReset(); + + bool isLevelGenerated(); + int getLicenseId(); + + void audioEngineOn(); + void audioEngineOff(); + + bool isPowerVR() { return _powerVr; } + bool isKindleFire(int kindleVersion); + bool transformResolution(int* w, int* h); + void optionUpdated(const Options::Option* option, bool value); + void optionUpdated(const Options::Option* option, float value); + void optionUpdated(const Options::Option* option, int value); +#ifdef __APPLE__ + bool _isSuperFast; + bool isSuperFast() { return _isSuperFast; } +#endif + +protected: + void _levelGenerated(); + +private: + static void* prepareLevel_tspawn(void *p_param); + + void handleMouseClick(int button); + void handleMouseDown(int button, bool down); + + void _reloadInput(); +public: + int width; + int height; + + // Vars that the platform is allowed to use in the future + int commandPort; + int reserved_d1, reserved_d2; + float reserved_f1, reserved_f2; + + Options options; + + static bool useAmbientOcclusion; + //static bool threadInterrupt; + + volatile bool pause; + + LevelRenderer* levelRenderer; + GameRenderer* gameRenderer; + ParticleEngine* particleEngine; + SoundEngine* soundEngine; + + GameMode* gameMode; +#ifndef STANDALONE_SERVER + Textures* textures; + ScreenChooser screenChooser; + Font* font; +#endif + IRakNetInstance* raknetInstance; + NetEventCallback* netCallback; + + int lastTime; + int lastTickTime; + float ticksSinceLastUpdate; + + User* user; + Level* level; + + LocalPlayer* player; + IInputHolder* inputHolder; + Mob* cameraTargetPlayer; +#ifndef STANDALONE_SERVER + Gui gui; +#endif + CThread* generateLevelThread; + Screen* screen; + static int customDebugId; + + static const int CDI_NONE = 0; + static const int CDI_GRAPHICS = 1; +#ifndef STANDALONE_SERVER + MouseHandler mouseHandler; +#endif + bool mouseGrabbed; + + PixelCalc pixelCalc; + PixelCalc pixelCalcUi; + + HitResult hitResult; + volatile int progressStagePercentage; + + // This field is initialized in main() + // It sets the base path to where worlds can be written (sdcard on android) + std::string externalStoragePath; + std::string externalCacheStoragePath; +protected: + Timer timer; + // @note @attn @warn: this is dangerous as fuck! + volatile bool isGeneratingLevel; + bool _hasSignaledGeneratingLevelFinished; + + LevelStorageSource* storageSource; + bool _running; + bool _powerVr; + +private: + volatile int progressStageStatusId; + static const char* progressMessages[]; + + int missTime; + int ticks; + bool screenMutex; + bool hasScheduledScreen; + Screen* scheduledScreen; + + int _licenseId; + bool _supportsNonTouchscreen; + + bool _isCreativeMode; + //int _respawnPlayerTicks; + Player* _pendingRemovePlayer; // @attn @todo @fix: remove this shait and fix the respawn behaviour + + PerfRenderer* _perfRenderer; + CommandServer* _commandServer; +}; + +#endif /*NET_MINECRAFT_CLIENT__Minecraft_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/05661E5BFC4005859D3B1DAC4D411428 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/05661E5BFC4005859D3B1DAC4D411428 new file mode 100644 index 0000000..fe92a27 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/05661E5BFC4005859D3B1DAC4D411428 @@ -0,0 +1,233 @@ +#include "TouchJoinGameScreen.h" +#include "../StartMenuScreen.h" +#include "../ProgressScreen.h" +#include "../../Font.h" +#include "../../../Minecraft.h" +#include "../../../renderer/Textures.h" + +namespace Touch { + +// +// Games list +// + +void AvailableGamesList::selectStart( int item) { + startSelected = item; +} + +void AvailableGamesList::selectCancel() { + startSelected = -1; +} + +void AvailableGamesList::selectItem( int item, bool doubleClick ) { + LOGI("selected an item! %d\n", item); + selectedItem = item; +} + +void AvailableGamesList::renderItem( int i, int x, int y, int h, Tesselator& t ) +{ + if (startSelected == i && Multitouch::getFirstActivePointerIdEx() >= 0) { + fill((int)x0, y, (int)x1, y+h, 0x809E684F); + } + + //static int colors[2] = {0xffffb0, 0xcccc90}; + const PingedCompatibleServer& s = copiedServerList[i]; + unsigned int color = s.isSpecial? 0x6090a0 : 0xffffb0; + unsigned int color2 = 0xffffa0;//colors[i&1]; + + int xx1 = (int)x0 + 24; + int xx2 = xx1; + + if (s.isSpecial) { + xx1 += 50; + + glEnable2(GL_TEXTURE_2D); + glColor4f2(1,1,1,1); + glEnable2(GL_BLEND); + minecraft->textures->loadAndBindTexture("gui/badge/minecon140.png"); + blit(xx2, y + 6, 0, 0, 37, 8, 140, 240); + } + + drawString(minecraft->font, s.name.C_String(), xx1, y + 4 + 2, color); + drawString(minecraft->font, s.address.ToString(false), xx2, y + 18, color2); + + /* + drawString(minecraft->font, copiedServerList[i].name.C_String(), (int)x0 + 24, y + 4, color); + drawString(minecraft->font, copiedServerList[i].address.ToString(false), (int)x0 + 24, y + 18, color); + */ +} + + +// +// Join Game screen +// +JoinGameScreen::JoinGameScreen() +: bJoin( 2, "Join Game"), + bBack( 3, "Back"), + bHeader(0, ""), + gamesList(NULL) +{ + bJoin.active = false; + //gamesList->yInertia = 0.5f; +} + +JoinGameScreen::~JoinGameScreen() +{ + delete gamesList; +} + +void JoinGameScreen::init() +{ + //buttons.push_back(&bJoin); + buttons.push_back(&bBack); + buttons.push_back(&bHeader); + + minecraft->raknetInstance->clearServerList(); + gamesList = new AvailableGamesList(minecraft, width, height); + +#ifdef ANDROID + //tabButtons.push_back(&bJoin); + tabButtons.push_back(&bBack); +#endif +} + +void JoinGameScreen::setupPositions() { + //int yBase = height - 26; + + //#ifdef ANDROID + bJoin.y = 0; + bBack.y = 0; + bHeader.y = 0; + //#endif + + // Center buttons + //bJoin.x = width / 2 - 4 - bJoin.w; + bBack.x = 0;//width / 2 + 4; + bHeader.x = bBack.width; + bHeader.width = width - bHeader.x; +} + +void JoinGameScreen::buttonClicked(Button* button) +{ + if (button->id == bJoin.id) + { + if (isIndexValid(gamesList->selectedItem)) + { + PingedCompatibleServer selectedServer = gamesList->copiedServerList[gamesList->selectedItem]; + minecraft->joinMultiplayer(selectedServer); + { + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + } + //minecraft->locateMultiplayer(); + //minecraft->setScreen(new JoinGameScreen()); + } + if (button->id == bBack.id) + { + minecraft->cancelLocateMultiplayer(); + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } +} + +bool JoinGameScreen::handleBackEvent(bool isDown) +{ + if (!isDown) + { + minecraft->cancelLocateMultiplayer(); + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } + return true; +} + + +bool JoinGameScreen::isIndexValid( int index ) +{ + return gamesList && index >= 0 && index < gamesList->getNumberOfItems(); +} + +void JoinGameScreen::tick() +{ + if (isIndexValid(gamesList->selectedItem)) { + buttonClicked(&bJoin); + return; + } + + //gamesList->tick(); + + const ServerList& orgServerList = minecraft->raknetInstance->getServerList(); + ServerList serverList; + for (unsigned int i = 0; i < orgServerList.size(); ++i) + if (orgServerList[i].name.GetLength() > 0) + serverList.push_back(orgServerList[i]); + + if (serverList.size() != gamesList->copiedServerList.size()) + { + // copy the currently selected item + PingedCompatibleServer selectedServer; + bool hasSelection = false; + if (isIndexValid(gamesList->selectedItem)) + { + selectedServer = gamesList->copiedServerList[gamesList->selectedItem]; + hasSelection = true; + } + + gamesList->copiedServerList = serverList; + gamesList->selectItem(-1, false); + + // re-select previous item if it still exists + if (hasSelection) + { + for (unsigned int i = 0; i < gamesList->copiedServerList.size(); i++) + { + if (gamesList->copiedServerList[i].address == selectedServer.address) + { + gamesList->selectItem(i, false); + break; + } + } + } + } else { + for (int i = (int)gamesList->copiedServerList.size()-1; i >= 0 ; --i) { + for (int j = 0; j < (int) serverList.size(); ++j) + if (serverList[j].address == gamesList->copiedServerList[i].address) + gamesList->copiedServerList[i].name = serverList[j].name; + } + } + + bJoin.active = isIndexValid(gamesList->selectedItem); +} + +void JoinGameScreen::render( int xm, int ym, float a ) +{ + bool hasNetwork = minecraft->platform()->isNetworkEnabled(true); +#ifdef WIN32 + hasNetwork = hasNetwork && !GetAsyncKeyState(VK_TAB); +#endif + + renderBackground(); + if (hasNetwork) gamesList->render(xm, ym, a); + else gamesList->renderDirtBackground(); + Screen::render(xm, ym, a); + + const int baseX = bHeader.x + bHeader.width / 2; + + if (hasNetwork) { + std::string s = "Scanning for WiFi Games..."; + drawCenteredString(minecraft->font, s, baseX, 8, 0xffffffff); + + const int textWidth = minecraft->font->width(s); + const int spinnerX = baseX + textWidth / 2 + 6; + + static const char* spinnerTexts[] = {"-", "\\", "|", "/"}; + int n = ((int)(5.5f * getTimeS()) % 4); + drawCenteredString(minecraft->font, spinnerTexts[n], spinnerX, 8, 0xffffffff); + } else { + drawCenteredString(minecraft->font, "WiFi is disabled", baseX, 8, 0xffffffff); + } +} + +bool JoinGameScreen::isInGameScreen() { return false; } + +}; diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/0BDF72C32A320A19721B03C5EED067C6 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/0BDF72C32A320A19721B03C5EED067C6 new file mode 100644 index 0000000..ad4d97c --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/0BDF72C32A320A19721B03C5EED067C6 @@ -0,0 +1,74 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_SCREENS_TOUCH__TouchJoinGameScreen_H__ +#define NET_MINECRAFT_CLIENT_GUI_SCREENS_TOUCH__TouchJoinGameScreen_H__ + +#include "../../Screen.h" +#include "../../components/Button.h" +#include "../../components/SmallButton.h" +#include "../../components/RolledSelectionListV.h" +#include "../../../Minecraft.h" +#include "../../../../platform/input/Multitouch.h" +#include "../../../../network/RakNetInstance.h" + +namespace Touch { + +class JoinGameScreen; + +class AvailableGamesList : public RolledSelectionListV +{ + int startSelected; + int selectedItem; + ServerList copiedServerList; + + friend class JoinGameScreen; + +public: + AvailableGamesList(Minecraft* _minecraft, int _width, int _height) + : RolledSelectionListV(_minecraft, _width, _height, 0, _width, 24, _height, 34), + selectedItem(-1), + startSelected(-1) + { + } + +protected: + + virtual int getNumberOfItems() { return (int)copiedServerList.size(); } + + virtual void selectCancel(); + virtual void selectStart(int item); + virtual void selectItem(int item, bool doubleClick); + + virtual bool isSelectedItem(int item) { return item == selectedItem; } + + virtual void renderBackground() {} + virtual void renderItem(int i, int x, int y, int h, Tesselator& t); +}; + +class JoinGameScreen: public Screen +{ +public: + JoinGameScreen(); + virtual ~JoinGameScreen(); + + void init(); + void setupPositions(); + + virtual bool handleBackEvent(bool isDown); + + virtual bool isIndexValid(int index); + + virtual void tick(); + void render(int xm, int ym, float a); + + void buttonClicked(Button* button); + + bool isInGameScreen(); +private: + Button bJoin; + TButton bBack; + THeader bHeader; + AvailableGamesList* gamesList; +}; + +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_SCREENS_TOUCH__TouchJoinGameScreen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/0E1E245EA16F1FAA685C5686B18BDD08 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/0E1E245EA16F1FAA685C5686B18BDD08 new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/0E1E245EA16F1FAA685C5686B18BDD08 @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/1CC65E0062271217494E8E6A4C0A58CE b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/1CC65E0062271217494E8E6A4C0A58CE new file mode 100644 index 0000000..bfd810c --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/1CC65E0062271217494E8E6A4C0A58CE @@ -0,0 +1,34 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ +#define NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ + +//package net.minecraft.client.gui; + +#include +#include "../GuiComponent.h" +#include "../../Options.h" + +class Font; +class Minecraft; + +class TextBox: public GuiComponent +{ +public: + TextBox(int id, const std::string& msg); + TextBox(int id, int x, int y, const std::string& msg); + TextBox(int id, int x, int y, int w, int h, const std::string& msg); + + virtual void setFocus(Minecraft* minecraft); + virtual bool loseFocus(Minecraft* minecraft); + + virtual void render(Minecraft* minecraft, int xm, int ym); + +public: + int w, h; + int x, y; + + std::string text; + int id; + bool focused; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/1D11F3CE27B0B595836AB483CC9A0B43 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/1D11F3CE27B0B595836AB483CC9A0B43 new file mode 100644 index 0000000..c8328de --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/1D11F3CE27B0B595836AB483CC9A0B43 @@ -0,0 +1,70 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(0), w(0), h(0), x(0), y(0), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + minecraft->platform()->showKeyboard(); + focused = true; + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + minecraft->platform()->showKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + // Slightly translucent dark background + fill(x, y, x + w, y + h,0x80000000); + // Border + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + + // Draw text. If textbox contains the placeholder (no focus and text equals initial msg), draw dim color + int color =0xe0e0e0; + // If not focused and text is empty or equals default placeholder, draw dimmed + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + // measure available width approximated by character count + int calc = (w -8) /6; // approx6 px per char + int maxChars =1; + if (calc > maxChars) maxChars = calc; + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/272701C6349B7577D9F684F4939AD516 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/272701C6349B7577D9F684F4939AD516 new file mode 100644 index 0000000..b60f96c --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/272701C6349B7577D9F684F4939AD516 @@ -0,0 +1,132 @@ +#include "TouchJoinGameScreen.h" +#include "../StartMenuScreen.h" +#include "../ProgressScreen.h" +#include "../../Font.h" +#include "../../../Minecraft.h" +#include "../../../renderer/Textures.h" + +namespace Touch { + +JoinGameScreen::JoinGameScreen() +: bJoin(2, "Join Game"), + bBack(3, "Back"), + bHeader(0, "Join by address"), + ip(5, "IP:Port (host:19132)") +{ + bJoin.active = true; +} + +JoinGameScreen::~JoinGameScreen() +{ +} + +void JoinGameScreen::init() +{ + buttons.push_back(&bBack); + buttons.push_back(&bJoin); + buttons.push_back(&bHeader); + + textBoxes.push_back(&ip); + +#ifdef ANDROID + tabButtons.push_back(&bBack); + tabButtons.push_back(&bJoin); +#endif +} + +void JoinGameScreen::setupPositions() { + const int yBase =10; + + // header at top + bHeader.y = yBase; + bHeader.width = width; + bHeader.x =0; + + // textbox below header + ip.x = width/2 -140/2; + ip.y = bHeader.y +28; + ip.w =140; + + // buttons at bottom + const int btnW =120; + const int btnH =26; + bJoin.width = btnW; bJoin.height = btnH; + bBack.width = btnW; bBack.height = btnH; + + bJoin.y = height -30; + bBack.y = height -30; + + bJoin.x = width /2 -4 - bJoin.width; + bBack.x = width /2 +4; +} + +void JoinGameScreen::buttonClicked(Button* button) +{ + if (button->id == bJoin.id) + { + std::string addr = ip.text; + auto trim = [](std::string &s) { + size_t start =0; + while (start < s.size() && std::isspace((unsigned char)s[start])) ++start; + size_t end = s.size(); + while (end > start && std::isspace((unsigned char)s[end -1])) --end; + s = s.substr(start, end - start); + }; + trim(addr); + if (!addr.empty()) { + std::string host = addr; + int port =19132; + size_t colon = addr.find(':'); + if (colon != std::string::npos) { + host = addr.substr(0, colon); + std::string portStr = addr.substr(colon +1); + trim(host); + trim(portStr); + if (!portStr.empty()) port = std::atoi(portStr.c_str()); + } else trim(host); + if (!host.empty()) { + if (minecraft->netCallback) { delete minecraft->netCallback; minecraft->netCallback = NULL; } + minecraft->netCallback = new ClientSideNetworkHandler(minecraft, minecraft->raknetInstance); + minecraft->raknetInstance->connect(host.c_str(), port); + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + } + } + if (button->id == bBack.id) + { + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } +} + +bool JoinGameScreen::handleBackEvent(bool isDown) +{ + if (!isDown) { + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } + return true; +} + +bool JoinGameScreen::isIndexValid( int index ) +{ + return false; +} + +void JoinGameScreen::tick() +{ +} + +void JoinGameScreen::render( int xm, int ym, float a ) +{ + renderBackground(); + // render textbox explicitly + for (unsigned int i =0; i < textBoxes.size(); ++i) { + textBoxes[i]->render(minecraft, xm, ym); + } + Screen::render(xm, ym, a); +} + +bool JoinGameScreen::isInGameScreen() { return false; } + +}; diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/4222F2040602983458B5992A709F7336 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/4222F2040602983458B5992A709F7336 new file mode 100644 index 0000000..ad4d97c --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/4222F2040602983458B5992A709F7336 @@ -0,0 +1,74 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_SCREENS_TOUCH__TouchJoinGameScreen_H__ +#define NET_MINECRAFT_CLIENT_GUI_SCREENS_TOUCH__TouchJoinGameScreen_H__ + +#include "../../Screen.h" +#include "../../components/Button.h" +#include "../../components/SmallButton.h" +#include "../../components/RolledSelectionListV.h" +#include "../../../Minecraft.h" +#include "../../../../platform/input/Multitouch.h" +#include "../../../../network/RakNetInstance.h" + +namespace Touch { + +class JoinGameScreen; + +class AvailableGamesList : public RolledSelectionListV +{ + int startSelected; + int selectedItem; + ServerList copiedServerList; + + friend class JoinGameScreen; + +public: + AvailableGamesList(Minecraft* _minecraft, int _width, int _height) + : RolledSelectionListV(_minecraft, _width, _height, 0, _width, 24, _height, 34), + selectedItem(-1), + startSelected(-1) + { + } + +protected: + + virtual int getNumberOfItems() { return (int)copiedServerList.size(); } + + virtual void selectCancel(); + virtual void selectStart(int item); + virtual void selectItem(int item, bool doubleClick); + + virtual bool isSelectedItem(int item) { return item == selectedItem; } + + virtual void renderBackground() {} + virtual void renderItem(int i, int x, int y, int h, Tesselator& t); +}; + +class JoinGameScreen: public Screen +{ +public: + JoinGameScreen(); + virtual ~JoinGameScreen(); + + void init(); + void setupPositions(); + + virtual bool handleBackEvent(bool isDown); + + virtual bool isIndexValid(int index); + + virtual void tick(); + void render(int xm, int ym, float a); + + void buttonClicked(Button* button); + + bool isInGameScreen(); +private: + Button bJoin; + TButton bBack; + THeader bHeader; + AvailableGamesList* gamesList; +}; + +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_SCREENS_TOUCH__TouchJoinGameScreen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/430CC357A15D4BE1A70387A7C3462A3C b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/430CC357A15D4BE1A70387A7C3462A3C new file mode 100644 index 0000000..92a367b --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/430CC357A15D4BE1A70387A7C3462A3C @@ -0,0 +1,258 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i = 0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0, 0, width, height, 0xc0101010, 0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1, 1, 1, 1); + float s = 32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height, 0, 0, height / s + fvo); + t.vertexUV((float)width, (float)height, 0, width / s, (float)height / s + fvo); + t.vertexUV((float)width, 0, 0, (float)width / s, 0 + fvo); + t.vertexUV(0, 0, 0, 0, 0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex = 0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount - 1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i = 0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; +/* +#if !defined(ANDROID) && !defined(__APPLE__) //if (!minecraft->isTouchscreen()) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); +#endif } +*/ + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + +#if 1 +//#if defined(ANDROID) || defined(__APPLE__) //if (minecraft->isTouchscreen()) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click", 1, 1); + clickedButton->released(x, y); + } + } +# else // } else { + clickedButton->released(x, y); +#endif // } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height - 1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/572513C3D8D309B3634C045C3C8FAC54 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/572513C3D8D309B3634C045C3C8FAC54 new file mode 100644 index 0000000..872695a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/572513C3D8D309B3634C045C3C8FAC54 @@ -0,0 +1,137 @@ +#ifndef KEYBOARD_H__ +#define KEYBOARD_H__ + +#include + +/** A keyboard action; key-down or key-up */ +class KeyboardAction +{ +public: + static const int KEYUP = 0; + static const int KEYDOWN = 1; + + KeyboardAction(unsigned char keyCode, int state) { + this->key = keyCode; + this->state = state; + } + + int state; + unsigned char key; +}; + +/* Iterators */ +typedef std::vector KeyboardActionVec; +typedef KeyboardActionVec::iterator KeyboardActionIt; +typedef KeyboardActionVec::const_iterator KeyboardActionCIt; + +/** A static keyboard class, written to resemble the one in lwjgl somewhat */ +class Keyboard +{ +public: + static const int KEY_A = 65; + static const int KEY_B = 66; + static const int KEY_C = 67; + static const int KEY_D = 68; + static const int KEY_E = 69; + static const int KEY_F = 70; + static const int KEY_G = 71; + static const int KEY_H = 72; + static const int KEY_I = 73; + static const int KEY_J = 74; + static const int KEY_K = 75; + static const int KEY_L = 76; + static const int KEY_M = 77; + static const int KEY_N = 78; + static const int KEY_O = 79; + static const int KEY_P = 80; + static const int KEY_Q = 81; + static const int KEY_R = 82; + static const int KEY_S = 83; + static const int KEY_T = 84; + static const int KEY_U = 85; + static const int KEY_V = 86; + static const int KEY_W = 87; + static const int KEY_X = 88; + static const int KEY_Y = 89; + static const int KEY_Z = 90; + + static const int KEY_BACKSPACE = 8; + static const int KEY_RETURN = 13; + + static const int KEY_F1 = 112; + static const int KEY_F2 = 113; + static const int KEY_F3 = 114; + static const int KEY_F4 = 115; + static const int KEY_F5 = 116; + static const int KEY_F6 = 117; + static const int KEY_F7 = 118; + static const int KEY_F8 = 119; + static const int KEY_F9 = 120; + static const int KEY_F10 = 121; + static const int KEY_F11 = 122; + static const int KEY_F12 = 123; + + static const int KEY_ESCAPE = 27; + static const int KEY_SPACE = 32; + static const int KEY_LSHIFT = 10; + + static bool isKeyDown(int keyCode) { + return _states[keyCode] == KeyboardAction::KEYDOWN; + } + + static void reset() { + _inputs.clear(); + _inputText.clear(); + _index = -1; + _textIndex = -1; + } + + static void feed(unsigned char keyCode, int state) { + _inputs.push_back(KeyboardAction(keyCode, state)); + + _states[keyCode] = state; + } + static void feedText(char character) { + _inputText.push_back(character); + } + + static bool next() { + if (_index + 1 >= (int)_inputs.size()) + return false; + + ++_index; + return true; + } + + static bool nextTextChar() { + if(_textIndex + 1 >= (int)_inputText.size()) + return false; + ++_textIndex; + return true; + } + + static void rewind() { + _index = -1; + _textIndex = -1; + } + + static int getEventKey() { + return _inputs[_index].key; + } + + static int getEventKeyState() { + return _inputs[_index].state; + } + static char getChar() { + return _inputText[_textIndex]; + } +private: + static int _index; + static int _textIndex; + static int _states[256]; + static std::vector _inputs; + static std::vector _inputText; + static bool _inited; +}; + +#endif//KEYBOARD_H__ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/72B2752C7CD663CF9A1CC0178EF19114 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/72B2752C7CD663CF9A1CC0178EF19114 new file mode 100644 index 0000000..bbafff6 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/72B2752C7CD663CF9A1CC0178EF19114 @@ -0,0 +1,1578 @@ +#include "Minecraft.h" + +#if defined(APPLE_DEMO_PROMOTION) + #define NO_NETWORK +#endif + +#if defined(RPI) + #define CREATORMODE +#endif + +#include "../network/RakNetInstance.h" +#include "../network/ClientSideNetworkHandler.h" +#include "../network/ServerSideNetworkHandler.h" +//#include "../network/Packet.h" +#include "../world/entity/player/Inventory.h" +#include "../world/level/chunk/ChunkCache.h" +#include "../world/level/tile/Tile.h" +#include "../world/level/storage/LevelStorageSource.h" +#include "../world/level/storage/LevelStorage.h" +#include "player/input/KeyboardInput.h" +#ifndef STANDALONE_SERVER +#include "player/input/touchscreen/TouchInputHolder.h" +#endif +#include "player/LocalPlayer.h" +#include "gamemode/CreativeMode.h" +#include "gamemode/SurvivalMode.h" +#include "player/LocalPlayer.h" +#ifndef STANDALONE_SERVER +#include "particle/ParticleEngine.h" +#include "gui/Screen.h" +#include "gui/Font.h" +#include "gui/screens/RenameMPLevelScreen.h" +#include "sound/SoundEngine.h" +#endif +#include "../platform/CThread.h" +#include "../platform/input/Mouse.h" +#include "../AppPlatform.h" +#include "../Performance.h" +#include "../LicenseCodes.h" +#include "../util/PerfTimer.h" +#include "../util/PerfRenderer.h" +#include "player/input/MouseBuildInput.h" + +#include "../world/Facing.h" + +#include "../network/packet/PlaceBlockPacket.h" + +#include "player/input/IInputHolder.h" +#ifndef STANDALONE_SERVER +#include "player/input/touchscreen/TouchscreenInput.h" + +#include "player/input/ControllerTurnInput.h" +#include "player/input/XperiaPlayInput.h" + +#endif + +#include "player/input/MouseTurnInput.h" +#include "../world/entity/MobFactory.h" +#include "../world/level/MobSpawner.h" +#include "../util/Mth.h" +#include "../network/packet/InteractPacket.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/PrerenderTilesScreen.h" +#include "renderer/Textures.h" +#include "gui/screens/DeathScreen.h" +#endif + +#include "../network/packet/RespawnPacket.h" +#include "IConfigListener.h" +#include "../world/entity/MobCategory.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/FurnaceScreen.h" +#endif +#include "../world/Difficulty.h" +#include "../server/ServerLevel.h" +#ifdef CREATORMODE +#include "../server/CreatorLevel.h" +#endif +#include "../network/packet/AdventureSettingsPacket.h" +#include "../network/packet/SetSpawnPositionPacket.h" +#include "../network/command/CommandServer.h" +#include "gamemode/CreatorMode.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/ArmorScreen.h" +#endif +#include "../world/level/levelgen/synth/ImprovedNoise.h" +#ifndef STANDALONE_SERVER +#include "renderer/tileentity/TileEntityRenderDispatcher.h" +#endif + +#ifndef STANDALONE_SERVER +#include "renderer/ptexture/DynamicTexture.h" +#include "renderer/GameRenderer.h" +#include "renderer/ItemInHandRenderer.h" +#include "renderer/LevelRenderer.h" +#include "renderer/entity/EntityRenderDispatcher.h" +#include "gui/Screen.h" +#include "gui/Font.h" +#include "gui/screens/RenameMPLevelScreen.h" +#include "sound/SoundEngine.h" +#endif + +static void checkGlError(const char* tag) { +#ifdef GLDEBUG + while (1) { + const int errCode = glGetError(); + if (errCode == GL_NO_ERROR) break; + + LOGE("################\nOpenGL-error @ %s : #%d\n", tag, errCode); + } +#endif /*GLDEBUG*/ +} + +/*static*/ +const char* Minecraft::progressMessages[] = { + "Locating server", + "Building terrain", + "Preparing", + "Saving chunks" +}; + +int Minecraft::customDebugId = Minecraft::CDI_NONE; + +#if defined(_MSC_VER) + #pragma warning( disable : 4355 ) // 'this' pointer in initialization list which is perfectly legal +#endif + +bool Minecraft::useAmbientOcclusion = false; + +Minecraft::Minecraft() +: user(NULL), + level(NULL), + player(NULL), + cameraTargetPlayer(NULL), + levelRenderer(NULL), + gameRenderer(NULL), +#ifndef STANDALONE_SERVER + particleEngine(NULL), + _perfRenderer(NULL), +#endif + _commandServer(NULL), +#ifndef STANDALONE_SERVER + textures(NULL), +#endif + lastTickTime(-1), + lastTime(0), + ticksSinceLastUpdate(0), + gameMode(NULL), + mouseGrabbed(true), + missTime(0), + pause(false), + _running(false), + timer(20), +#ifndef STANDALONE_SERVER + gui(this), +#endif + netCallback(NULL), +#ifndef STANDALONE_SERVER + screen(NULL), + font(NULL), +#endif + screenMutex(false), +#ifndef STANDALONE_SERVER + scheduledScreen(NULL), + hasScheduledScreen(false), + soundEngine(NULL), +#endif + ticks(0), + isGeneratingLevel(false), + _hasSignaledGeneratingLevelFinished(true), + generateLevelThread(NULL), + progressStagePercentage(0), + progressStageStatusId(0), + isLookingForMultiplayer(false), + _licenseId(LicenseCodes::WAIT_PLATFORM_NOT_READY), + inputHolder(0), + _supportsNonTouchscreen(false), +#ifndef STANDALONE_SERVER + screenChooser(this), +#endif + width(1), height(1), + //_respawnPlayerTicks(-1), +#ifdef __APPLE__ + _isSuperFast(false), +#endif + _powerVr(false), + commandPort(4711), + reserved_d1(0),reserved_d2(0), + reserved_f1(0),reserved_f2(0) +{ +//#ifdef ANDROID + +#if defined(NO_NETWORK) + raknetInstance = new IRakNetInstance(); +#else + raknetInstance = new RakNetInstance(); +#endif +#ifndef STANDALONE_SERVER + soundEngine = new SoundEngine(20.0f); + soundEngine->init(this, &options); +#endif + //setupPieces(); +} + +Minecraft::~Minecraft() +{ + delete netCallback; + delete raknetInstance; +#ifndef STANDALONE_SERVER + delete levelRenderer; + delete gameRenderer; + delete particleEngine; + + delete soundEngine; +#endif + delete gameMode; +#ifndef STANDALONE_SERVER + delete font; + delete textures; + + if (screen != NULL) { + delete screen; + screen = NULL; + } +#endif + if (level != NULL) { + level->saveGame(); + if (level->getChunkSource()) + level->getChunkSource()->saveAll(true); + delete level->getLevelStorage(); + delete level; + level = NULL; + } + + //delete player; + delete user; + delete inputHolder; + + delete storageSource; + delete _perfRenderer; + delete _commandServer; + + MobFactory::clearStaticTestMobs(); +#ifndef STANDALONE_SERVER + EntityRenderDispatcher::destroy(); +#endif +} + +// Only called by server +void Minecraft::selectLevel( const std::string& levelId, const std::string& levelName, const LevelSettings& settings ) +{ +#if defined(CREATORMODE) + level = new CreatorLevel( +#else + level = new ServerLevel( +#endif + storageSource->selectLevel(levelId, false), + levelName, + settings, + SharedConstants::GeneratorVersion); + + // note: settings is useless beyond this point, since it's + // either copied to LevelData (or LevelData read from file) + setLevel(level, "Generating level"); + setIsCreativeMode(level->getLevelData()->getGameType() == GameType::Creative); + _running = true; +} + +void Minecraft::setLevel(Level* level, const std::string& message /* ="" */, LocalPlayer* forceInsertPlayer /* = NULL */) { + cameraTargetPlayer = NULL; + LOGI("Seed is %ld\n", level->getSeed()); + + if (level != NULL) { + level->raknetInstance = raknetInstance; + gameMode->initLevel(level); + + if (!player && forceInsertPlayer) + { + player = forceInsertPlayer; + player->resetPos(false); + //level->addEntity(forceInsertPlayer); + } + else if (player != NULL) { + player->resetPos(false); + if (level != NULL) { + level->addEntity(player); + } + } + this->level = level; + _hasSignaledGeneratingLevelFinished = false; +#ifdef STANDALONE_SERVER + const bool threadedLevelCreation = false; +#else + const bool threadedLevelCreation = true; +#endif + + if (threadedLevelCreation) { + // Threaded + // "Lock" + isGeneratingLevel = true; + generateLevelThread = new CThread(Minecraft::prepareLevel_tspawn, this); + } else { + // Non-threaded + generateLevel("Currently not used", level); + } + } else { + player = NULL; + } + + this->lastTickTime = 0; + this->_running = true; +} + +void Minecraft::leaveGame(bool renameLevel /*=false*/) +{ + if (isGeneratingLevel || !_hasSignaledGeneratingLevelFinished) + return; + + isGeneratingLevel = false; + bool saveLevel = level && (!level->isClientSide || renameLevel); + + raknetInstance->disconnect(); + if (saveLevel) { + // If server or wanting to save level as client, save all unsaved chunks! + level->getChunkSource()->saveAll(true); + } + + LOGI("Clearing levels\n"); + + cameraTargetPlayer = NULL; +#ifndef STANDALONE_SERVER + levelRenderer->setLevel(NULL); + particleEngine->setLevel(NULL); +#endif + LOGI("Erasing callback\n"); + delete netCallback; + netCallback = NULL; + + LOGI("Erasing level\n"); + if (level != NULL) { + delete level->getLevelStorage(); + delete level; + level = NULL; + } + //delete player; + player = NULL; + cameraTargetPlayer = NULL; + + _running = false; +#ifndef STANDALONE_SERVER + if (renameLevel) { + setScreen(new RenameMPLevelScreen(LevelStorageSource::TempLevelId)); + } + else + screenChooser.setScreen(SCREEN_STARTMENU); +#endif +} + +void Minecraft::prepareLevel(const std::string& title) { + LOGI("status: 1\n"); + progressStageStatusId = 1; + + Stopwatch A, B, C, D; + A.start(); + + Stopwatch L; + + // Dont update lights if we load the level (ok, actually just with leveldata version=1.+(?)) + if (!level->isNew()) + level->setUpdateLights(false); + + int Max = CHUNK_CACHE_WIDTH * CHUNK_CACHE_WIDTH; + int pp = 0; + for (int x = 8; x < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); x += CHUNK_WIDTH) { + for (int z = 8; z < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); z += CHUNK_WIDTH) { + progressStagePercentage = 100 * pp++ / Max; + //printf("level generation progress %d\n", progressStagePercentage); + B.start(); + level->getTile(x, 64, z); + B.stop(); + L.start(); + if (level->isNew()) + while (level->updateLights()) + ; + L.stop(); + } + } + A.stop(); + level->setUpdateLights(true); + + C.start(); + for (int x = 0; x < CHUNK_CACHE_WIDTH; x++) + { + for (int z = 0; z < CHUNK_CACHE_WIDTH; z++) + { + LevelChunk* chunk = level->getChunk(x, z); + if (chunk && !chunk->createdFromSave) + { + chunk->unsaved = false; + chunk->clearUpdateMap(); + } + } + } + C.stop(); + + LOGI("status: 3\n"); + progressStageStatusId = 3; + if (level->isNew()) { + level->setInitialSpawn(); // @note: should obviously be called from Level itself + level->saveLevelData(); + level->getChunkSource()->saveAll(false); + level->saveGame(); + } else { + level->saveLevelData(); + level->loadEntities(); + } + + progressStagePercentage = -1; + progressStageStatusId = 2; + LOGI("status: 2\n"); + + D.start(); + level->prepare(); + D.stop(); + + A.print("Generate level: "); + L.print(" - light: "); + B.print(" - getTl: "); + C.print(" - clear: "); + D.print(" - prepr: "); + progressStageStatusId = 0; +} + +void Minecraft::update() { + //LOGI("Enter Update\n"); + + if (Options::debugGl) + LOGI(">>>>>>>>>>\n"); + + TIMER_PUSH("root"); + + //if (level) { + // LOGI("numplayers: %d\n", level->players.size()); + // for (int i = 0; i < level->players.size(); ++i) { + // Player* p = level->players[i]; + // bool inEnt = std::find(level->entities.begin(), level->entities.end(), p) != level->entities.end(); + // LOGI(" %p, %d, %d - in? %d\n", p, p->entityId, p->owner.ToUint32(p->owner), inEnt); + // } + //} + + if (pause && level != NULL) { + float lastA = timer.a; + timer.advanceTime(); + timer.a = lastA; + } else { + timer.advanceTime(); + } + + if (raknetInstance) { + raknetInstance->runEvents(netCallback); + } + + TIMER_PUSH("tick"); + int toTick = timer.ticks; + for (int i = 0; i < toTick; ++i, ++ticks) + tick(i, toTick-1); + + TIMER_POP_PUSH("updatelights"); + if (level && !isGeneratingLevel) { + level->updateLights(); + } + TIMER_POP(); + + #ifndef STANDALONE_SERVER + if (gameMode != NULL) gameMode->render(timer.a); + TIMER_PUSH("sound"); + soundEngine->update(player, timer.a); + TIMER_POP_PUSH("render"); + gameRenderer->render(timer.a); + TIMER_POP(); + #else + CThread::sleep(1); + #endif +#ifndef STANDALONE_SERVER + Multitouch::resetThisUpdate(); +#endif + TIMER_POP(); +#ifndef STANDALONE_SERVER + checkGlError("Update finished"); + + if (options.renderDebug) { + if (!PerfTimer::enabled) { + PerfTimer::reset(); + PerfTimer::enabled = true; + } + + //TIMER_PUSH("debugfps"); + _perfRenderer->renderFpsMeter(1); + checkGlError("render debug"); + //TIMER_POP(); + } else { + PerfTimer::enabled = false; + } +#endif + //LOGI("Exit Update\n"); +} + +void Minecraft::tick(int nTick, int maxTick) { + if (missTime > 0) missTime--; +#ifndef STANDALONE_SERVER + if (!screen && player) { + if (player->health <= 0) { + setScreen(new DeathScreen()); + } + } +#endif + TIMER_PUSH("gameMode"); + if (level && !pause) { + gameMode->tick(); + } + + TIMER_POP_PUSH("commandServer"); + if (level && _commandServer) { + _commandServer->tick(); + } + + TIMER_POP_PUSH("input"); + tickInput(); +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("gui"); + gui.tick(); +#endif + // + // Ongoing level generation in a (perhaps) different thread. When it's + // ready, _levelGenerated() is called once and any threads are deleted. + // + if (isGeneratingLevel) { + return; + } else if (!_hasSignaledGeneratingLevelFinished) { + if (generateLevelThread) { + delete generateLevelThread; + generateLevelThread = NULL; + } + _levelGenerated(); + } + + // + // Normal game loop, run before or efter level generation + // + if (level != NULL) + { + if (!pause) { +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("gameRenderer"); + gameRenderer->tick(nTick, maxTick); + + TIMER_POP_PUSH("levelRenderer"); + levelRenderer->tick(); +#endif + level->difficulty = options.difficulty; + if (level->isClientSide) level->difficulty = Difficulty::EASY; + + TIMER_POP_PUSH("level"); + level->tickEntities(); + level->tick(); +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("animateTick"); + if (player) { + level->animateTick(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); + } +#endif + } + } +#ifndef STANDALONE_SERVER + textures->loadAndBindTexture("terrain.png"); + if (!pause && !(screen && !screen->renderGameBehind())) { + #if !defined(RPI) + #ifdef __APPLE__ + if (isSuperFast()) + #endif + { + if (nTick == maxTick) { + TIMER_POP_PUSH("textures"); + textures->tick(true); + } + } + #endif + } + TIMER_POP_PUSH("particles"); + particleEngine->tick(); + if (screen) { + screenMutex = true; + screen->tick(); + screenMutex = false; + } + + // @note: fix to keep "isPressed" and "isReleased" as long as necessary. + // Most likely keyboard and mouse could/should be reset here as well. + Multitouch::reset(); +#endif + TIMER_POP(); +} + +class InputRAII { +public: + ~InputRAII() { +#ifndef STANDALONE_SERVER + Mouse::reset(); + Keyboard::reset(); +#endif + } +}; + +void Minecraft::tickInput() { +#ifndef STANDALONE_SERVER + InputRAII raiiInput; + + if (screen && !screen->passEvents) { + screenMutex = true; + screen->updateEvents(); + //screen->updateSetScreen(); + screenMutex = false; + if (hasScheduledScreen) { + setScreen(scheduledScreen); + scheduledScreen = NULL; + hasScheduledScreen = false; + } + return; + } + + if (!player) { + return; + } + +#ifdef RPI + bool mouseDiggable = true; + bool allowGuiClicks = !mouseGrabbed; +#else + bool mouseDiggable = !gui.isInside(Mouse::getX(), Mouse::getY()); + bool allowGuiClicks = true; +#endif + + TIMER_PUSH("mouse"); + while (Mouse::next()) { + //if (Mouse::getButtonState(MouseAction::ACTION_LEFT)) + // LOGI("mouse-down-at: %d, %d\n", Mouse::getX(), Mouse::getY()); + int passedTime = getTimeMs() - lastTickTime; + if (passedTime > 200) continue; // @note: As long Mouse::clear CLEARS the whole buffer, it's safe to break here + // But since it might be rewritten anyway (and hopefully there aren't a lot of messages, we just continue. + + const MouseAction& e = Mouse::getEvent(); + +#ifdef RPI // If clicked when not having focus, get focus @keyboard + if (!mouseGrabbed) { + if (!screen && e.data == MouseAction::DATA_DOWN) { + grabMouse(); + } + } +#endif + + if (allowGuiClicks && e.action == MouseAction::ACTION_LEFT && e.data == MouseAction::DATA_DOWN) { + gui.handleClick(MouseAction::ACTION_LEFT, Mouse::getX(), Mouse::getY()); + } + + if (e.action == MouseAction::ACTION_WHEEL) { + Inventory* v = player->inventory; + int numSlots = gui.getNumSlots() - 1; + int slot = (v->selected - e.dy + numSlots) % numSlots; + v->selectSlot(slot); + } + /* + if (mouseDiggable && options.useMouseForDigging) { + if (Mouse::getEventButton() == MouseAction::ACTION_LEFT && Mouse::getEventButtonState()) { + handleMouseClick(MouseAction::ACTION_LEFT); + lastClickTick = ticks; + } + if (Mouse::getEventButton() == MouseAction::ACTION_RIGHT && Mouse::getEventButtonState()) { + handleMouseClick(MouseAction::ACTION_RIGHT); + lastClickTick = ticks; + } + } + */ + } + + TIMER_POP_PUSH("keyboard"); + while (Keyboard::next()) { + int key = Keyboard::getEventKey(); + bool isPressed = (Keyboard::getEventKeyState() == KeyboardAction::KEYDOWN); + player->setKey(key, isPressed); + + if (isPressed) { + gui.handleKeyPressed(key); + + #if defined(WIN32) || defined(RPI)//|| defined(_DEBUG) || defined(DEBUG) + if (key >= '0' && key <= '9') { + int digit = key - '0'; + int slot = digit - 1; + + if (slot >= 0 && slot < gui.getNumSlots()-1) + player->inventory->selectSlot(slot); + + #if defined(WIN32) + if (digit >= 1 && GetAsyncKeyState(VK_CONTROL) < 0) { + // Set adventure settings here! + AdventureSettingsPacket p(level->adventureSettings); + p.toggle((AdventureSettingsPacket::Flags)(1 << slot)); + p.fillIn(level->adventureSettings); + raknetInstance->send(p); + } + if (digit == 0) { + Pos pos((int)player->x, (int)player->y-1, (int)player->z); + SetSpawnPositionPacket p(pos); + raknetInstance->send(p); + } + #endif + } + #endif + #if defined(RPI) + if (key == Keyboard::KEY_E) { + screenChooser.setScreen(SCREEN_BLOCKSELECTION); + } + if (!screen && key == Keyboard::KEY_O || key == 250) { + releaseMouse(); + } + #endif + #if defined(WIN32) + if (key == Keyboard::KEY_F) { + options.isFlying = !options.isFlying; + player->noPhysics = options.isFlying; + } + + if (key == Keyboard::KEY_T) { + options.thirdPersonView = !options.thirdPersonView; + /* + ImprovedNoise noise; + for (int i = 0; i < 16; ++i) + printf("%d\t%f\n", i, noise.grad2(i, 3, 8)); + */ + } + + if (key == Keyboard::KEY_O) { + useAmbientOcclusion = !useAmbientOcclusion; + options.ambientOcclusion = useAmbientOcclusion; + levelRenderer->allChanged(); + } + + if (key == Keyboard::KEY_L) + options.viewDistance = (options.viewDistance + 1) % 4; + + if (key == Keyboard::KEY_U) { + onGraphicsReset(); + player->heal(100); + } + + if (key == Keyboard::KEY_B || key == 108) // Toggle the game mode + setIsCreativeMode(!isCreativeMode()); + + if (key == Keyboard::KEY_P) // Step forward in time + level->setTime( level->getTime() + 1000); + + if (key == Keyboard::KEY_G) { + setScreen(new ArmorScreen()); + /* + std::vector& boxs = level->getCubes(NULL, AABB(128.1f, 73, 128.1f, 128.9f, 74.9f, 128.9f)); + LOGI("boxes: %d\n", (int)boxs.size()); + */ + } + + if (key == Keyboard::KEY_Y) { + textures->reloadAll(); + player->hurtTo(2); + } + if (key == Keyboard::KEY_Z || key == 108) { + for (int i = 0; i < 1; ++i) { + Mob* mob = NULL; + int forceId = 0;//MobTypes::Sheep; + + int types[] = { + MobTypes::Sheep, + MobTypes::Pig, + MobTypes::Chicken, + MobTypes::Cow, + }; + + int mobType = (forceId > 0)? forceId : types[Mth::random(sizeof(types) / sizeof(int))]; + mob = MobFactory::CreateMob(mobType, level); + + //((Animal*)mob)->setAge(-1000); + float dx = 4 - 8 * Mth::random() + 4 * Mth::sin(Mth::DEGRAD * player->yRot); + float dz = 4 - 8 * Mth::random() + 4 * Mth::cos(Mth::DEGRAD * player->yRot); + if (mob && !MobSpawner::addMob(level, mob, player->x + dx, player->y, player->z + dz, Mth::random()*360, 0, true)) + delete mob; + } + } + + if (key == Keyboard::KEY_X) { + const EntityList& entities = level->getAllEntities(); + for (int i = entities.size()-1; i >= 0; --i) { + Entity* e = entities[i]; + if (!e->isPlayer()) + level->removeEntity(e); + } + } + + if (key == Keyboard::KEY_C /*|| key == 4*/) { + player->inventory->clearInventoryWithDefault(); + // @todo: Add saving here for benchmarking + } + if (key == Keyboard::KEY_H) { + setScreen( new PrerenderTilesScreen() ); + } + + if (key == Keyboard::KEY_O) { + for (int i = Inventory::MAX_SELECTION_SIZE; i < player->inventory->getContainerSize(); ++i) + if (player->inventory->getItem(i)) + player->inventory->dropSlot(i, false); + } + if (key == Keyboard::KEY_F3) { + options.renderDebug = !options.renderDebug; + } + if (key == Keyboard::KEY_M) { + options.difficulty = (options.difficulty == Difficulty::PEACEFUL)? + Difficulty::NORMAL : Difficulty::PEACEFUL; + //setIsCreativeMode( !isCreativeMode() ); + } + + // lanternroci + if (key == Keyboard::KEY_ESCAPE) + pauseGame(false); + if (key == Keyboard::KEY_E && !options.isFlying) { + screenChooser.setScreen(SCREEN_BLOCKSELECTION); + } + + if (options.renderDebug) { + if (key >= '0' && key <= '9') { + _perfRenderer->debugFpsMeterKeyPress(key - '0'); + } + } + #endif + + #ifndef RPI + if (key == 82) + pauseGame(false); + #else + if (key == Keyboard::KEY_ESCAPE) + pauseGame(false); + #endif + + #ifndef OPENGL_ES + if (key == Keyboard::KEY_P) { + static bool isWireFrame = false; + isWireFrame = !isWireFrame; + glPolygonMode(GL_FRONT, isWireFrame? GL_LINE : GL_FILL); + //glPolygonMode(GL_BACK, isWireFrame? GL_LINE : GL_FILL); + } + #endif + } + #ifdef WIN32 + if (key == Keyboard::KEY_M) { + for (int i = 0; i < 5 * SharedConstants::TicksPerSecond; ++i) + level->tick(); + } + #endif + + + //if (!isPressed) LOGI("Key released: %d\n", key); + + if (!options.useMouseForDigging) { + int passedTime = getTimeMs() - lastTickTime; + if (passedTime > 200) continue; + + // Destroy and attack is on same button + if (key == options.keyDestroy.key && isPressed) { + BuildActionIntention bai(BuildActionIntention::BAI_REMOVE | BuildActionIntention::BAI_ATTACK); + handleBuildAction(&bai); + } + else // Build and use/interact is on same button + if (key == options.keyUse.key && isPressed) { + BuildActionIntention bai(BuildActionIntention::BAI_BUILD | BuildActionIntention::BAI_INTERACT); + handleBuildAction(&bai); + } + } + } + + TIMER_POP_PUSH("tickbuild"); + BuildActionIntention bai; + // @note: This might be a problem. This method is polling based here, but + // event based when using mouse (or keys..), and in java. Not quite + // sure just yet what way to go. + bool buildHandled = inputHolder->getBuildInput()->tickBuild(player, &bai); + if (buildHandled) { + if (!bai.isRemoveContinue()) + handleBuildAction(&bai); + } + + bool isTryingToDestroyBlock = (options.useMouseForDigging + ? (Mouse::isButtonDown(MouseAction::ACTION_LEFT) && mouseDiggable) + : Keyboard::isKeyDown(options.keyDestroy.key)) + || (buildHandled && bai.isRemove()); + + TIMER_POP_PUSH("handlemouse"); +#ifdef RPI + handleMouseDown(MouseAction::ACTION_LEFT, isTryingToDestroyBlock); + handleMouseClick(buildHandled && bai.isInteract() + || options.useMouseForDigging && Mouse::isButtonDown(MouseAction::ACTION_RIGHT)); +#else + handleMouseDown(MouseAction::ACTION_LEFT, isTryingToDestroyBlock || (buildHandled && bai.isInteract())); +#endif + + lastTickTime = getTimeMs(); + + // we have (hopefully) handled the keyboard & mouse queue and it + // can now be emptied. If wanted, the reset could be changed to: + // index -= numRead; // then this code doesn't have to be placed here + // + it prepares for tick not handling all or any events. + // update: RAII'ing instead, see above + //Keyboard::reset(); + //Mouse::reset(); + + TIMER_POP(); +#endif +} + +void Minecraft::handleMouseDown(int button, bool down) { +#ifndef STANDALONE_SERVER +#ifndef RPI + if(player->isUsingItem()) { + if(!down && !Keyboard::isKeyDown(options.keyUse.key)) { + gameMode->releaseUsingItem(player); + } + return; + } +#endif + if(player->isSleeping()) { + return; + } + if (button == MouseAction::ACTION_LEFT && missTime > 0) return; + if (down && hitResult.type == TILE && button == MouseAction::ACTION_LEFT && !hitResult.indirectHit) { + int x = hitResult.x; + int y = hitResult.y; + int z = hitResult.z; + gameMode->continueDestroyBlock(x, y, z, hitResult.f); + particleEngine->crack(x, y, z, hitResult.f); + player->swing(); + } else { + gameMode->stopDestroyBlock(); + } +#endif +} + +void Minecraft::handleMouseClick(int button) { +// BuildActionIntention bai( +// (button == MouseAction::ACTION_LEFT)? +// BuildActionIntention::BAI_REMOVE +// : BuildActionIntention::BAI_BUILD); +// +// handleBuildAction(&bai); +} + +void Minecraft::handleBuildAction(BuildActionIntention* action) { +#ifndef STANDALONE_SERVER + if (action->isRemove()) { + if (missTime > 0) return; + player->swing(); + } + if(player->isUsingItem()) + return; + bool mayUse = true; + + if (!hitResult.isHit()) { + if (action->isRemove() && !gameMode->isCreativeType()) { + missTime = 10; + } + } else if (hitResult.type == ENTITY) { + if (action->isAttack()) { + player->swing(); + //LOGI("attacking!\n"); + InteractPacket packet(InteractPacket::Attack, player->entityId, hitResult.entity->entityId); + raknetInstance->send(packet); + gameMode->attack(player, hitResult.entity); + } else if (action->isInteract()) { + if (hitResult.entity->interactPreventDefault()) + mayUse = false; + //LOGI("interacting!\n"); + InteractPacket packet(InteractPacket::Interact, player->entityId, hitResult.entity->entityId); + raknetInstance->send(packet); + gameMode->interact(player, hitResult.entity); + } + } else if (hitResult.type == TILE) { + int x = hitResult.x; + int y = hitResult.y; + int z = hitResult.z; + int face = hitResult.f; + + int oldTileId = level->getTile(x, y, z); + Tile* oldTile = Tile::tiles[oldTileId]; + + //bool tryDestroyBlock = false; + + if (action->isRemove()) { + if (!oldTile) + return; + + //LOGI("tile: %s - %d, %d, %d. b: %f - %f\n", oldTile->getDescriptionId().c_str(), x, y, z, oldTile->getBrightness(level, x, y, z), oldTile->getBrightness(level, x, y+1, z)); + level->extinguishFire(x, y, z, hitResult.f); + gameMode->startDestroyBlock(x, y, z, hitResult.f); + } + else { + ItemInstance* item = player->inventory->getSelected(); + if (gameMode->useItemOn(player, level, item, x, y, z, face, hitResult.pos)) { + mayUse = false; + player->swing(); + #ifdef RPI + } else if (item && item->id == ((Item*)Item::sword_iron)->id) { + player->swing(); + #endif + } + if (item && item->count <= 0) { + player->inventory->clearSlot(player->inventory->selected); + } + //} else if (item && item->count != oldCount) { + // gameRenderer->itemInHandRenderer->itemPlaced(); + //} + } + } + if (mayUse && action->isInteract()) { + ItemInstance* item = player->inventory->getSelected(); + if (item && !player->isUsingItem()) { + if (gameMode->useItem(player, level, item)) { + gameRenderer->itemInHandRenderer->itemUsed(); + } + if (item && item->count <= 0) { + player->inventory->clearSlot(player->inventory->selected); + } + } + } +#endif +} + +bool Minecraft::isOnlineClient() +{ + return (level != NULL && level->isClientSide); +} + +bool Minecraft::isOnline() +{ + return netCallback != NULL; +} + +void Minecraft::pauseGame(bool isBackPaused) { +#ifndef STANDALONE_SERVER + if (screen != NULL) return; + screenChooser.setScreen(isBackPaused? SCREEN_PAUSEPREV : SCREEN_PAUSE); +#endif +} +void Minecraft::gameLostFocus() { +#ifndef STANDALONE_SERVER + if(screen != NULL) { + screen->lostFocus(); + } +#endif +} + + +void Minecraft::setScreen( Screen* screen ) +{ +#ifndef STANDALONE_SERVER + Mouse::reset(); + Multitouch::reset(); + Multitouch::resetThisUpdate(); + + if (screenMutex) { + hasScheduledScreen = true; + scheduledScreen = screen; + return; + } + + if (screen != NULL && screen->isErrorScreen()) + return; + if (screen == NULL && level == NULL) + screen = screenChooser.createScreen(SCREEN_STARTMENU); + + if (this->screen != NULL) { + this->screen->removed(); + delete this->screen; + } + + this->screen = screen; + if (screen != NULL) { + releaseMouse(); + //ScreenSizeCalculator ssc = new ScreenSizeCalculator(options, width, height); + int screenWidth = (int)(width * Gui::InvGuiScale); //ssc.getWidth(); + int screenHeight = (int)(height * Gui::InvGuiScale); //ssc.getHeight(); + screen->init(this, screenWidth, screenHeight); + + if (screen->isInGameScreen() && level) { + level->saveLevelData(); + level->saveGame(); + } + + //noRender = false; + } else { + grabMouse(); + } +#endif +} + +void Minecraft::grabMouse() +{ +#ifndef STANDALONE_SERVER + if (mouseGrabbed) return; + mouseGrabbed = true; + mouseHandler.grab(); + //setScreen(NULL); +#endif +} + +void Minecraft::releaseMouse() +{ +#ifndef STANDALONE_SERVER + if (!mouseGrabbed) { + return; + } + if (player) { + player->releaseAllKeys(); + } + mouseGrabbed = false; + mouseHandler.release(); +#endif +} + +bool Minecraft::useTouchscreen() { +#ifdef RPI + return false; +#endif + return options.useTouchScreen || !_supportsNonTouchscreen; +} +bool Minecraft::supportNonTouchScreen() { + return _supportsNonTouchscreen; +} +void Minecraft::init() +{ + options.minecraft = this; + options.initDefaultValues(); +#ifndef STANDALONE_SERVER + checkGlError("Init enter"); + + _supportsNonTouchscreen = !platform()->supportsTouchscreen(); + + LOGI("IS TOUCHSCREEN? %d\n", options.useTouchScreen); + + textures = new Textures(&options, platform()); + textures->addDynamicTexture(new WaterTexture()); + textures->addDynamicTexture(new WaterSideTexture()); + gui.texturesLoaded(textures); + + levelRenderer = new LevelRenderer(this); + gameRenderer = new GameRenderer(this); + particleEngine = new ParticleEngine(level, textures); + + // Platform specific initialization here + font = new Font(&options, "font/default8.png", textures); + + _perfRenderer = new PerfRenderer(this, font); + + checkGlError("Init complete"); +#endif + + user = new User("TestUser", ""); + setIsCreativeMode(false); // false means it's Survival Mode + reloadOptions(); + +} + +void Minecraft::setSize(int w, int h) { +#ifndef STANDALONE_SERVER + transformResolution(&w, &h); + + width = w; + height = h; + + if (width >= 1000) { + #ifdef __APPLE__ + Gui::GuiScale = (width > 2000)? 8.0f : 4.0f; + #else + Gui::GuiScale = 4.0f; + #endif + } + else if (width >= 800) { +#ifdef __APPLE__ + Gui::GuiScale = 4.0f; +#else + Gui::GuiScale = 3.0f; +#endif + } + else if (width >= 400) + Gui::GuiScale = 2.0f; + else + Gui::GuiScale = 1.0f; + + Gui::InvGuiScale = 1.0f / Gui::GuiScale; + int screenWidth = (int)(width * Gui::InvGuiScale); + int screenHeight = (int)(height * Gui::InvGuiScale); + + if (platform()) { + float pixelsPerMillimeter = options.getProgressValue(&Options::Option::PIXELS_PER_MILLIMETER); + pixelCalc.setPixelsPerMillimeter(pixelsPerMillimeter); + pixelCalcUi.setPixelsPerMillimeter(pixelsPerMillimeter * Gui::InvGuiScale); + } + + Config config = createConfig(this); + gui.onConfigChanged(config); + + if (screen) + screen->setSize(screenWidth, screenHeight); + + if (inputHolder) + inputHolder->onConfigChanged(config); + //LOGI("Setting size: %d, %d: %f\n", width, height, Gui::InvGuiScale); + +#ifdef WIN32 + char resbuf[128]; + sprintf(resbuf, " %d x %d @ scale %.2f", width, height, Gui::GuiScale); + //gui.addMessage(resbuf); +#endif +#endif /* STANDALONE_SERVER */ +} + +void Minecraft::reloadOptions() { + options.update(); + options.save(); + bool wasTouchscreen = options.useTouchScreen; + options.useTouchScreen = useTouchscreen(); + options.save(); + + if ((wasTouchscreen != options.useTouchScreen) || (inputHolder == 0)) + _reloadInput(); + + user->name = options.username; + + LOGI("Reloading-options\n"); + + // @todo @fix Android and iOS behaves a bit differently when leaving + // an options screen (Android recreates OpenGL surface) + setSize(width, height); +} + +void Minecraft::_reloadInput() { +#ifndef STANDALONE_SERVER + delete inputHolder; + + if (useTouchscreen()) { + inputHolder = new TouchInputHolder(this, &options); + } else { + #if defined(ANDROID) || defined(__APPLE__) + inputHolder = new CustomInputHolder( + new XperiaPlayInput(&options), + new ControllerTurnInput(2, ControllerTurnInput::MODE_DELTA), + new IBuildInput()); + #else + inputHolder = new CustomInputHolder( + new KeyboardInput(&options), + new MouseTurnInput(MouseTurnInput::MODE_DELTA, width/2, height/2), + new MouseBuildInput()); + #endif + } + + mouseHandler.setTurnInput(inputHolder->getTurnInput()); + if (level && player) { + player->input = inputHolder->getMoveInput(); + } +#endif +} + + +// +// Multiplayer +// +void Minecraft::locateMultiplayer() { +#ifndef WIN32 + isLookingForMultiplayer = true; + + raknetInstance->pingForHosts(19132); + netCallback = new ClientSideNetworkHandler(this, raknetInstance); +#else + // Server discovery/ping-for-hosts isn't supported/reliable on Windows in this build. + isLookingForMultiplayer = false; + // Ensure any previous list is cleared and no callback is left active + raknetInstance->clearServerList(); + if (netCallback) { delete netCallback; netCallback = NULL; } +#endif +} + +void Minecraft::cancelLocateMultiplayer() { +#ifndef WIN32 + isLookingForMultiplayer = false; + + raknetInstance->stopPingForHosts(); + + delete netCallback; + netCallback = NULL; +#else + // Nothing to stop on Windows; just ensure state is clean + isLookingForMultiplayer = false; + raknetInstance->clearServerList(); + if (netCallback) { delete netCallback; netCallback = NULL; } +#endif +} + +bool Minecraft::joinMultiplayer( const PingedCompatibleServer& server ) +{ + if (isLookingForMultiplayer && netCallback) { + isLookingForMultiplayer = false; + return raknetInstance->connect(server.address.ToString(false), server.address.GetPort()); + } + return false; +} + +void Minecraft::hostMultiplayer(int port) { + // Tear down last instance + raknetInstance->disconnect(); + delete netCallback; + netCallback = NULL; + +#if !defined(NO_NETWORK) + netCallback = new ServerSideNetworkHandler(this, raknetInstance); + #ifdef STANDALONE_SERVER + raknetInstance->host(user->name, port, 16); + #else + raknetInstance->host(user->name, port); + #endif +#endif +} + +// +// Level generation +// +/*static*/ + + void* Minecraft::prepareLevel_tspawn(void *p_param) +{ + Minecraft* mc = (Minecraft*) p_param; + mc->generateLevel("Currently not used", mc->level); + return 0; +} + +void Minecraft::generateLevel( const std::string& message, Level* level ) +{ + Stopwatch s; + s.start(); + prepareLevel(message); + s.stop(); + s.print("Level generated: "); + + // "Unlock" + isGeneratingLevel = false; +} + +void Minecraft::_levelGenerated() +{ +#ifndef STANDALONE_SERVER + if (player == NULL) { + player = (LocalPlayer*) gameMode->createPlayer(level); + gameMode->initPlayer(player); + } + + if (player) { + player->input = inputHolder->getMoveInput(); + } + + if (levelRenderer != NULL) levelRenderer->setLevel(level); + if (particleEngine != NULL) particleEngine->setLevel(level); + + gameMode->adjustPlayer(player); + gui.onLevelGenerated(); +#endif + + level->validateSpawn(); + level->loadPlayer(player, true); + // if we are client side, we trust the server to have given us a correct position + if (player && !level->isClientSide) { + player->resetPos(false); + } + + this->cameraTargetPlayer = player; + + if (raknetInstance->isServer()) + raknetInstance->announceServer(user->name); + + if (netCallback) { + netCallback->levelGenerated(level); + } + +#if defined(WIN32) || defined(RPI) + if (_commandServer) { + delete _commandServer; + } + _commandServer = new CommandServer(this); + _commandServer->init(commandPort); +#endif + + // Hack to (hopefully) get the players to show (note: in LevelListener + // instead, since adding yourself always generates a entityAdded) + //EntityRenderDispatcher::getInstance()->onGraphicsReset(); + _hasSignaledGeneratingLevelFinished = true; +} + +Player* Minecraft::respawnPlayer(int playerId) { + for (unsigned int i = 0; i < level->players.size(); ++i) { + if (level->players[i]->entityId == playerId) { + resetPlayer(level->players[i]); + return level->players[i]; + } + } + return NULL; +} + +void Minecraft::resetPlayer(Player* player) { + level->validateSpawn(); + player->reset(); + + Pos p; + if(player->hasRespawnPosition()) { + p = player->getRespawnPosition(); + } + else { + p = level->getSharedSpawnPos(); + } + player->setPos((float)p.x + 0.5f, (float)p.y + 1.0f, (float)p.z + 0.5f); + player->resetPos(true); + + if (isCreativeMode()) + player->inventory->clearInventoryWithDefault(); +} + +void Minecraft::respawnPlayer() { + // RESET THE FRACKING PLAYER HERE + //bool slowCheck = false; + //for (int i = 0; i < level->entities.size(); ++i) + // if (level->entities[i] == player) slowCheck = true; + // + //LOGI("Has entity? %d, %d\n", level->getEntity(player->entityId), slowCheck); + + resetPlayer(player); + + // tell server (or other client) that we re-spawned + RespawnPacket packet(player); + raknetInstance->send(packet); +} + +void Minecraft::onGraphicsReset() +{ +#ifndef STANDALONE_SERVER + textures->clear(); + + font->onGraphicsReset(); + gui.onGraphicsReset(); + + if (levelRenderer) levelRenderer->onGraphicsReset(); + if (gameRenderer) gameRenderer->onGraphicsReset(); + + EntityRenderDispatcher::getInstance()->onGraphicsReset(); + TileEntityRenderDispatcher::getInstance()->onGraphicsReset(); +#endif +} + +int Minecraft::getProgressStatusId() { + return progressStageStatusId; +} + +const char* Minecraft::getProgressMessage() +{ + return progressMessages[progressStageStatusId]; +} + +bool Minecraft::isLevelGenerated() +{ + return level != NULL && !isGeneratingLevel; +} + +LevelStorageSource* Minecraft::getLevelSource() +{ + return storageSource; +} + +int Minecraft::getLicenseId() { + if (!LicenseCodes::isReady(_licenseId)) + _licenseId = platform()->checkLicense(); + return _licenseId; +} + +void Minecraft::audioEngineOn() { +#ifndef STANDALONE_SERVER + soundEngine->enable(true); +#endif +} +void Minecraft::audioEngineOff() { +#ifndef STANDALONE_SERVER + soundEngine->enable(false); +#endif +} + +void Minecraft::setIsCreativeMode(bool isCreative) +{ +#ifdef CREATORMODE + delete gameMode; + gameMode = new CreatorMode(this); + _isCreativeMode = true; +#else + if (!gameMode || isCreative != _isCreativeMode) + { + delete gameMode; + if (isCreative) gameMode = new CreativeMode(this); + else gameMode = new SurvivalMode(this); + _isCreativeMode = isCreative; + } +#endif + if (player) + gameMode->initAbilities(player->abilities); +} + +bool Minecraft::isCreativeMode() { + return _isCreativeMode; +} + +bool Minecraft::isKindleFire(int kindleVersion) { + if (kindleVersion != 1) + return false; + + std::string model = platform()->getPlatformStringVar(PlatformStringVars::DEVICE_BUILD_MODEL); + std::string modelLower(model); + std::transform(modelLower.begin(), modelLower.end(), modelLower.begin(), tolower); + + return (modelLower.find("kindle") != std::string::npos) && (modelLower.find("fire") != std::string::npos); +} + +bool Minecraft::transformResolution(int* w, int* h) +{ + bool changed = false; + + // Kindle Fire 1: reporting wrong height in + // certain cases (e.g. after screen lock) + if (isKindleFire(1) && *h >= 560 && *h <= 620) { + *h = 580; + changed = true; + } + + return changed; +} + +ICreator* Minecraft::getCreator() +{ +#ifdef CREATORMODE + return ((CreatorMode*)gameMode)->getCreator(); +#else + return NULL; +#endif +} + +void Minecraft::optionUpdated( const Options::Option* option, bool value ) { + if(netCallback != NULL && option == &Options::Option::SERVER_VISIBLE) { + ServerSideNetworkHandler* ss = (ServerSideNetworkHandler*) netCallback; + ss->allowIncomingConnections(value); + } +} + +void Minecraft::optionUpdated( const Options::Option* option, float value ) { +#ifndef STANDALONE_SERVER + if(option == &Options::Option::PIXELS_PER_MILLIMETER) { + pixelCalcUi.setPixelsPerMillimeter(value * Gui::InvGuiScale); + pixelCalc.setPixelsPerMillimeter(value); + } +#endif +} + +void Minecraft::optionUpdated( const Options::Option* option, int value ) { + +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/83105CECE6AA00603D9DA1057156A4A0 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/83105CECE6AA00603D9DA1057156A4A0 new file mode 100644 index 0000000..55155fc --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/83105CECE6AA00603D9DA1057156A4A0 @@ -0,0 +1,146 @@ +#include "TextEditScreen.h" +#include "../../../world/level/tile/entity/SignTileEntity.h" +#include "../../../AppPlatform.h" +#include "../../Minecraft.h" +#include "../../renderer/tileentity/TileEntityRenderDispatcher.h" +#include "../../renderer/Tesselator.h" +#include "../../renderer/Textures.h" +#include "../../renderer/GameRenderer.h" +#include "../components/Button.h" +#include "../../../network/Packet.h" +#include "../../../network/RakNetInstance.h" +TextEditScreen::TextEditScreen( SignTileEntity* signEntity ) + : sign(signEntity), isShowingKeyboard(false), frame(0), line(0), btnClose(1, "") { + +} +TextEditScreen::~TextEditScreen() { + +} +void TextEditScreen::init() { + super::init(); + minecraft->platform()->showKeyboard(); + isShowingKeyboard = true; + ImageDef def; + def.name = "gui/spritesheet.png"; + def.x = 0; + def.y = 1; + def.width = def.height = 18; + def.setSrc(IntRectangle(60, 0, 18, 18)); + btnClose.setImageDef(def, true); + btnClose.scaleWhenPressed = false; + buttons.push_back(&btnClose); +} + +void TextEditScreen::setupPositions() { + btnClose.width = btnClose.height = 19; + btnClose.x = width - btnClose.width; + btnClose.y = 0; +} + + +bool TextEditScreen::handleBackEvent( bool isDown ) { + sign->setChanged(); + Packet* signUpdatePacket = sign->getUpdatePacket(); + minecraft->raknetInstance->send(signUpdatePacket); + minecraft->platform()->hideKeyboard(); + minecraft->setScreen(NULL); + return true; +} + +void TextEditScreen::render( int xm, int ym, float a ) { + glDepthMask(GL_FALSE); + renderBackground(); + glPushMatrix(); + glDepthMask(GL_TRUE); + glDisable(GL_CULL_FACE); + glLoadIdentity(); + Tesselator& t = Tesselator::instance; + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrthof(0.0f, (float)minecraft->width, (float)minecraft->height, 0, -1, 1); + glMatrixMode(GL_MODELVIEW); + + minecraft->textures->loadAndBindTexture("item/sign.png"); + glColor4f2(1, 1, 1, 1); + + static float minUV[] = {0.03126f, 0.06249f}; + static float maxUV[] = {0.39063f, 0.4374f}; + float scale = ((minecraft->height / 2) / 32) * 0.9f; + + glTranslatef(minecraft->width / 2.0f, 5.0f, 0.0f); + glScalef2(scale,scale,1); + t.begin(GL_QUADS); + t.vertexUV(-32, 0, 0.0f,minUV[0],minUV[1]); + t.vertexUV(32, 0, 0.0f, maxUV[0], minUV[1]); + t.vertexUV(32, 0 + 32, 0.0f, maxUV[0], maxUV[1]); + t.vertexUV(-32, 0 + 32, 0.0f, minUV[0], maxUV[1]); + t.draw(); + + sign->selectedLine = line; + float textScale = 8.0f / 11.0f; + + glTranslatef(0, 2 ,0); + glScalef2(textScale, textScale, 1); + for(int i = 0; i < 4; ++i) { + //drawCenteredString(font, sign->messages[a], 32.0f, 10 * a, 0xFF000000); + std::string msg = sign->messages[i]; + if (i == sign->selectedLine && msg.length() < 14) { + std::string s = "> " + msg + " <"; + font->draw(s, -(float)font->width(s) / 2.0f, 10.0f * i, 0xFF000000, false); + } else { + font->draw(msg, -(float)font->width(msg) / 2.0f, 10.0f * i, 0xFF000000, false); + } + } + sign->selectedLine = -1; + //font->draw("Hej", minecraft->width / 2, 100, 0xFFFFFFFF, false); + + glPopMatrix(); + glEnable(GL_CULL_FACE); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + + //glEnable(GL_DEPTH_TEST); + super::render(xm, ym, a); +} + +void TextEditScreen::lostFocus() { + +} + +void TextEditScreen::tick() { + frame++; +} + +void TextEditScreen::keyPressed( int eventKey ) { + LOGW("Key pressed! [%d]", eventKey); + if(eventKey == Keyboard::KEY_BACKSPACE) { + if(sign->messages[line].length() > 0) { + sign->messages[line].erase(sign->messages[line].size() - 1, 1); + } else { + line--; + if(line < 0) { + line = 3; + } + } + } else if(eventKey == Keyboard::KEY_RETURN) { + line = (line + 1) % 4; + } else { + super::keyPressed(eventKey); + } +} + +void TextEditScreen::keyboardNewChar( char inputChar ) { + std::string fullstring = sign->messages[line] + inputChar; + if(fullstring.length() < 16) { + sign->messages[line] = fullstring; + //LOGW("Line text updated: %s\n", fullstring.c_str()); + } +} + +void TextEditScreen::buttonClicked( Button* button ) { + if(button == &btnClose) + handleBackEvent(true); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/9CAB88584C535B15B7D916C84A38AB20 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/9CAB88584C535B15B7D916C84A38AB20 new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/9CAB88584C535B15B7D916C84A38AB20 @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/AF8821B3E089A14209FA7C2F8B96C378 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/AF8821B3E089A14209FA7C2F8B96C378 new file mode 100644 index 0000000..fe92a27 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/AF8821B3E089A14209FA7C2F8B96C378 @@ -0,0 +1,233 @@ +#include "TouchJoinGameScreen.h" +#include "../StartMenuScreen.h" +#include "../ProgressScreen.h" +#include "../../Font.h" +#include "../../../Minecraft.h" +#include "../../../renderer/Textures.h" + +namespace Touch { + +// +// Games list +// + +void AvailableGamesList::selectStart( int item) { + startSelected = item; +} + +void AvailableGamesList::selectCancel() { + startSelected = -1; +} + +void AvailableGamesList::selectItem( int item, bool doubleClick ) { + LOGI("selected an item! %d\n", item); + selectedItem = item; +} + +void AvailableGamesList::renderItem( int i, int x, int y, int h, Tesselator& t ) +{ + if (startSelected == i && Multitouch::getFirstActivePointerIdEx() >= 0) { + fill((int)x0, y, (int)x1, y+h, 0x809E684F); + } + + //static int colors[2] = {0xffffb0, 0xcccc90}; + const PingedCompatibleServer& s = copiedServerList[i]; + unsigned int color = s.isSpecial? 0x6090a0 : 0xffffb0; + unsigned int color2 = 0xffffa0;//colors[i&1]; + + int xx1 = (int)x0 + 24; + int xx2 = xx1; + + if (s.isSpecial) { + xx1 += 50; + + glEnable2(GL_TEXTURE_2D); + glColor4f2(1,1,1,1); + glEnable2(GL_BLEND); + minecraft->textures->loadAndBindTexture("gui/badge/minecon140.png"); + blit(xx2, y + 6, 0, 0, 37, 8, 140, 240); + } + + drawString(minecraft->font, s.name.C_String(), xx1, y + 4 + 2, color); + drawString(minecraft->font, s.address.ToString(false), xx2, y + 18, color2); + + /* + drawString(minecraft->font, copiedServerList[i].name.C_String(), (int)x0 + 24, y + 4, color); + drawString(minecraft->font, copiedServerList[i].address.ToString(false), (int)x0 + 24, y + 18, color); + */ +} + + +// +// Join Game screen +// +JoinGameScreen::JoinGameScreen() +: bJoin( 2, "Join Game"), + bBack( 3, "Back"), + bHeader(0, ""), + gamesList(NULL) +{ + bJoin.active = false; + //gamesList->yInertia = 0.5f; +} + +JoinGameScreen::~JoinGameScreen() +{ + delete gamesList; +} + +void JoinGameScreen::init() +{ + //buttons.push_back(&bJoin); + buttons.push_back(&bBack); + buttons.push_back(&bHeader); + + minecraft->raknetInstance->clearServerList(); + gamesList = new AvailableGamesList(minecraft, width, height); + +#ifdef ANDROID + //tabButtons.push_back(&bJoin); + tabButtons.push_back(&bBack); +#endif +} + +void JoinGameScreen::setupPositions() { + //int yBase = height - 26; + + //#ifdef ANDROID + bJoin.y = 0; + bBack.y = 0; + bHeader.y = 0; + //#endif + + // Center buttons + //bJoin.x = width / 2 - 4 - bJoin.w; + bBack.x = 0;//width / 2 + 4; + bHeader.x = bBack.width; + bHeader.width = width - bHeader.x; +} + +void JoinGameScreen::buttonClicked(Button* button) +{ + if (button->id == bJoin.id) + { + if (isIndexValid(gamesList->selectedItem)) + { + PingedCompatibleServer selectedServer = gamesList->copiedServerList[gamesList->selectedItem]; + minecraft->joinMultiplayer(selectedServer); + { + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + } + //minecraft->locateMultiplayer(); + //minecraft->setScreen(new JoinGameScreen()); + } + if (button->id == bBack.id) + { + minecraft->cancelLocateMultiplayer(); + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } +} + +bool JoinGameScreen::handleBackEvent(bool isDown) +{ + if (!isDown) + { + minecraft->cancelLocateMultiplayer(); + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } + return true; +} + + +bool JoinGameScreen::isIndexValid( int index ) +{ + return gamesList && index >= 0 && index < gamesList->getNumberOfItems(); +} + +void JoinGameScreen::tick() +{ + if (isIndexValid(gamesList->selectedItem)) { + buttonClicked(&bJoin); + return; + } + + //gamesList->tick(); + + const ServerList& orgServerList = minecraft->raknetInstance->getServerList(); + ServerList serverList; + for (unsigned int i = 0; i < orgServerList.size(); ++i) + if (orgServerList[i].name.GetLength() > 0) + serverList.push_back(orgServerList[i]); + + if (serverList.size() != gamesList->copiedServerList.size()) + { + // copy the currently selected item + PingedCompatibleServer selectedServer; + bool hasSelection = false; + if (isIndexValid(gamesList->selectedItem)) + { + selectedServer = gamesList->copiedServerList[gamesList->selectedItem]; + hasSelection = true; + } + + gamesList->copiedServerList = serverList; + gamesList->selectItem(-1, false); + + // re-select previous item if it still exists + if (hasSelection) + { + for (unsigned int i = 0; i < gamesList->copiedServerList.size(); i++) + { + if (gamesList->copiedServerList[i].address == selectedServer.address) + { + gamesList->selectItem(i, false); + break; + } + } + } + } else { + for (int i = (int)gamesList->copiedServerList.size()-1; i >= 0 ; --i) { + for (int j = 0; j < (int) serverList.size(); ++j) + if (serverList[j].address == gamesList->copiedServerList[i].address) + gamesList->copiedServerList[i].name = serverList[j].name; + } + } + + bJoin.active = isIndexValid(gamesList->selectedItem); +} + +void JoinGameScreen::render( int xm, int ym, float a ) +{ + bool hasNetwork = minecraft->platform()->isNetworkEnabled(true); +#ifdef WIN32 + hasNetwork = hasNetwork && !GetAsyncKeyState(VK_TAB); +#endif + + renderBackground(); + if (hasNetwork) gamesList->render(xm, ym, a); + else gamesList->renderDirtBackground(); + Screen::render(xm, ym, a); + + const int baseX = bHeader.x + bHeader.width / 2; + + if (hasNetwork) { + std::string s = "Scanning for WiFi Games..."; + drawCenteredString(minecraft->font, s, baseX, 8, 0xffffffff); + + const int textWidth = minecraft->font->width(s); + const int spinnerX = baseX + textWidth / 2 + 6; + + static const char* spinnerTexts[] = {"-", "\\", "|", "/"}; + int n = ((int)(5.5f * getTimeS()) % 4); + drawCenteredString(minecraft->font, spinnerTexts[n], spinnerX, 8, 0xffffffff); + } else { + drawCenteredString(minecraft->font, "WiFi is disabled", baseX, 8, 0xffffffff); + } +} + +bool JoinGameScreen::isInGameScreen() { return false; } + +}; diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/E19DC915D7B7F4D40A50F260C758DAD9 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/E19DC915D7B7F4D40A50F260C758DAD9 new file mode 100644 index 0000000..8b4d6da --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/E19DC915D7B7F4D40A50F260C758DAD9 @@ -0,0 +1,80 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI__Screen_H__ +#define NET_MINECRAFT_CLIENT_GUI__Screen_H__ + +//package net.minecraft.client.gui; + +#include +#include "GuiComponent.h" + +class Font; +class Minecraft; +class Button; +class TextBox; +struct IntRectangle; + +class Screen: public GuiComponent +{ +public: + Screen(); + + virtual void render(int xm, int ym, float a); + + void init(Minecraft* minecraft, int width, int height); + virtual void init(); + + void setSize(int width, int height); + virtual void setupPositions() {}; + + virtual void updateEvents(); + virtual void mouseEvent(); + virtual void keyboardEvent(); + virtual void keyboardTextEvent(); + virtual bool handleBackEvent(bool isDown); + + virtual void tick() {} + + virtual void removed() {} + + virtual void renderBackground(); + virtual void renderBackground(int vo); + virtual void renderDirtBackground(int vo); + // query + virtual bool renderGameBehind(); + virtual bool hasClippingArea(IntRectangle& out); + + virtual bool isPauseScreen(); + virtual bool isErrorScreen(); + virtual bool isInGameScreen(); + virtual bool closeOnPlayerHurt(); + + virtual void confirmResult(bool result, int id) {} + virtual void lostFocus(); + virtual void toGUICoordinate(int& x, int& y); +protected: + void updateTabButtonSelection(); + + virtual void buttonClicked(Button* button) {} + virtual void mouseClicked(int x, int y, int buttonNum); + virtual void mouseReleased(int x, int y, int buttonNum); + + virtual void keyPressed(int eventKey); + virtual void keyboardNewChar(char inputChar) {} +public: + int width; + int height; + bool passEvents; + //GuiParticles* particles; +protected: + Minecraft* minecraft; + std::vector buttons; + std::vector textBoxes; + + std::vector tabButtons; + int tabButtonIndex; + + Font* font; +private: + Button* clickedButton; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI__Screen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/E25FB3B811E26EA86767132ABFD6C0FE b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/E25FB3B811E26EA86767132ABFD6C0FE new file mode 100644 index 0000000..45852ad --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/E25FB3B811E26EA86767132ABFD6C0FE @@ -0,0 +1,233 @@ +#ifndef NET_MINECRAFT_CLIENT__Minecraft_H__ +#define NET_MINECRAFT_CLIENT__Minecraft_H__ + +#include "Options.h" +#ifndef STANDALONE_SERVER +#include "MouseHandler.h" +#endif +#include "Timer.h" +#include "player/input/ITurnInput.h" +#ifndef STANDALONE_SERVER +#include "gui/Gui.h" +#include "gui/screens/ScreenChooser.h" +#endif +//#include "../network/RakNetInstance.h" +#include "../world/phys/HitResult.h" + +class User; +class Level; +class LocalPlayer; +class IInputHolder; +class Mob; +class Player; +class LevelRenderer; +class GameRenderer; +class ParticleEngine; +class Entity; +class ICreator; +class GameMode; +class Textures; +class CThread; +class SoundEngine; +class Screen; +class Font; +class LevelStorageSource; +class BuildActionIntention; +class PerfRenderer; +class LevelSettings; +class IRakNetInstance; +class NetEventCallback; +class CommandServer; +struct PingedCompatibleServer; +//class ExternalFileLevelStorageSource; + + +#include "../App.h" +#include "PixelCalc.h" +class AppPlatform; +class AppPlatform_android; + +class Minecraft: public App +{ +protected: + Minecraft(); +public: + virtual ~Minecraft(); + + void init(); + void setSize(int width, int height); + void reloadOptions(); + + bool supportNonTouchScreen(); + bool useTouchscreen(); + void grabMouse(); + void releaseMouse(); + + void handleBuildAction(BuildActionIntention*); + + void toggleDimension(){} + bool isCreativeMode(); + void setIsCreativeMode(bool isCreative); + void setScreen(Screen*); + + virtual void selectLevel(const std::string& levelId, const std::string& levelName, const LevelSettings& settings); + virtual void setLevel(Level* level, const std::string& message = "", LocalPlayer* forceInsertPlayer = NULL); + + void generateLevel( const std::string& message, Level* level ); + LevelStorageSource* getLevelSource(); + + bool isLookingForMultiplayer; + void locateMultiplayer(); + void cancelLocateMultiplayer(); + bool joinMultiplayer(const PingedCompatibleServer& server); + void hostMultiplayer(int port=19132); + Player* respawnPlayer(int playerId); + void respawnPlayer(); + void resetPlayer(Player* player); + void doActuallyRespawnPlayer(); + + void update(); + + void tick(int nTick, int maxTick); + void tickInput(); + + bool isOnlineClient(); + bool isOnline(); + void pauseGame(bool isBackPaused); + void gameLostFocus(); + + void prepareLevel(const std::string& message); + + void leaveGame(bool renameLevel = false); + + int getProgressStatusId(); + const char* getProgressMessage(); + + ICreator* getCreator(); + + // void onGraphicsLost() {} + void onGraphicsReset(); + + bool isLevelGenerated(); + int getLicenseId(); + + void audioEngineOn(); + void audioEngineOff(); + + bool isPowerVR() { return _powerVr; } + bool isKindleFire(int kindleVersion); + bool transformResolution(int* w, int* h); + void optionUpdated(const Options::Option* option, bool value); + void optionUpdated(const Options::Option* option, float value); + void optionUpdated(const Options::Option* option, int value); +#ifdef __APPLE__ + bool _isSuperFast; + bool isSuperFast() { return _isSuperFast; } +#endif + +protected: + void _levelGenerated(); + +private: + static void* prepareLevel_tspawn(void *p_param); + + void handleMouseClick(int button); + void handleMouseDown(int button, bool down); + + void _reloadInput(); +public: + int width; + int height; + + // Vars that the platform is allowed to use in the future + int commandPort; + int reserved_d1, reserved_d2; + float reserved_f1, reserved_f2; + + Options options; + + static bool useAmbientOcclusion; + //static bool threadInterrupt; + + volatile bool pause; + + LevelRenderer* levelRenderer; + GameRenderer* gameRenderer; + ParticleEngine* particleEngine; + SoundEngine* soundEngine; + + GameMode* gameMode; +#ifndef STANDALONE_SERVER + Textures* textures; + ScreenChooser screenChooser; + Font* font; +#endif + IRakNetInstance* raknetInstance; + NetEventCallback* netCallback; + + int lastTime; + int lastTickTime; + float ticksSinceLastUpdate; + + User* user; + Level* level; + + LocalPlayer* player; + IInputHolder* inputHolder; + Mob* cameraTargetPlayer; +#ifndef STANDALONE_SERVER + Gui gui; +#endif + CThread* generateLevelThread; + Screen* screen; + static int customDebugId; + + static const int CDI_NONE = 0; + static const int CDI_GRAPHICS = 1; +#ifndef STANDALONE_SERVER + MouseHandler mouseHandler; +#endif + bool mouseGrabbed; + + PixelCalc pixelCalc; + PixelCalc pixelCalcUi; + + HitResult hitResult; + volatile int progressStagePercentage; + + // This field is initialized in main() + // It sets the base path to where worlds can be written (sdcard on android) + std::string externalStoragePath; + std::string externalCacheStoragePath; +protected: + Timer timer; + // @note @attn @warn: this is dangerous as fuck! + volatile bool isGeneratingLevel; + bool _hasSignaledGeneratingLevelFinished; + + LevelStorageSource* storageSource; + bool _running; + bool _powerVr; + +private: + volatile int progressStageStatusId; + static const char* progressMessages[]; + + int missTime; + int ticks; + bool screenMutex; + bool hasScheduledScreen; + Screen* scheduledScreen; + + int _licenseId; + bool _supportsNonTouchscreen; + + bool _isCreativeMode; + //int _respawnPlayerTicks; + Player* _pendingRemovePlayer; // @attn @todo @fix: remove this shait and fix the respawn behaviour + + PerfRenderer* _perfRenderer; + CommandServer* _commandServer; +}; + +#endif /*NET_MINECRAFT_CLIENT__Minecraft_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/F0C1581FFE29B5659D8019FF80209886 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/F0C1581FFE29B5659D8019FF80209886 new file mode 100644 index 0000000..786bfd0 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/28FAB316EBB5C943A14823EE7262CF60/F0C1581FFE29B5659D8019FF80209886 @@ -0,0 +1,40 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_SCREENS_TOUCH__TouchJoinGameScreen_H__ +#define NET_MINECRAFT_CLIENT_GUI_SCREENS_TOUCH__TouchJoinGameScreen_H__ + +#include "../../Screen.h" +#include "../../components/Button.h" +#include "../../components/SmallButton.h" +#include "../../../Minecraft.h" +#include "../../components/TextBox.h" + +namespace Touch { + +class JoinGameScreen: public Screen +{ +public: + JoinGameScreen(); + virtual ~JoinGameScreen(); + + void init(); + void setupPositions(); + + virtual bool handleBackEvent(bool isDown); + + virtual bool isIndexValid(int index); + + virtual void tick(); + void render(int xm, int ym, float a); + + void buttonClicked(Button* button); + + bool isInGameScreen(); +private: + TButton bJoin; + TButton bBack; + THeader bHeader; + TextBox ip; +}; + +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_SCREENS_TOUCH__TouchJoinGameScreen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/3FFD066E2ADD7C428C45D1BEA1A66E0A/172C2E8A2EC2F405000CF1EDE621837F b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/3FFD066E2ADD7C428C45D1BEA1A66E0A/172C2E8A2EC2F405000CF1EDE621837F new file mode 100644 index 0000000..92a367b --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/3FFD066E2ADD7C428C45D1BEA1A66E0A/172C2E8A2EC2F405000CF1EDE621837F @@ -0,0 +1,258 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i = 0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0, 0, width, height, 0xc0101010, 0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1, 1, 1, 1); + float s = 32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height, 0, 0, height / s + fvo); + t.vertexUV((float)width, (float)height, 0, width / s, (float)height / s + fvo); + t.vertexUV((float)width, 0, 0, (float)width / s, 0 + fvo); + t.vertexUV(0, 0, 0, 0, 0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex = 0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount - 1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i = 0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; +/* +#if !defined(ANDROID) && !defined(__APPLE__) //if (!minecraft->isTouchscreen()) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); +#endif } +*/ + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + +#if 1 +//#if defined(ANDROID) || defined(__APPLE__) //if (minecraft->isTouchscreen()) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click", 1, 1); + clickedButton->released(x, y); + } + } +# else // } else { + clickedButton->released(x, y); +#endif // } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height - 1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/3FFD066E2ADD7C428C45D1BEA1A66E0A/1CC65E0062271217494E8E6A4C0A58CE b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/3FFD066E2ADD7C428C45D1BEA1A66E0A/1CC65E0062271217494E8E6A4C0A58CE new file mode 100644 index 0000000..bfd810c --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/3FFD066E2ADD7C428C45D1BEA1A66E0A/1CC65E0062271217494E8E6A4C0A58CE @@ -0,0 +1,34 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ +#define NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ + +//package net.minecraft.client.gui; + +#include +#include "../GuiComponent.h" +#include "../../Options.h" + +class Font; +class Minecraft; + +class TextBox: public GuiComponent +{ +public: + TextBox(int id, const std::string& msg); + TextBox(int id, int x, int y, const std::string& msg); + TextBox(int id, int x, int y, int w, int h, const std::string& msg); + + virtual void setFocus(Minecraft* minecraft); + virtual bool loseFocus(Minecraft* minecraft); + + virtual void render(Minecraft* minecraft, int xm, int ym); + +public: + int w, h; + int x, y; + + std::string text; + int id; + bool focused; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/3FFD066E2ADD7C428C45D1BEA1A66E0A/1D11F3CE27B0B595836AB483CC9A0B43 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/3FFD066E2ADD7C428C45D1BEA1A66E0A/1D11F3CE27B0B595836AB483CC9A0B43 new file mode 100644 index 0000000..c8328de --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/3FFD066E2ADD7C428C45D1BEA1A66E0A/1D11F3CE27B0B595836AB483CC9A0B43 @@ -0,0 +1,70 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(0), w(0), h(0), x(0), y(0), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + minecraft->platform()->showKeyboard(); + focused = true; + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + minecraft->platform()->showKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + // Slightly translucent dark background + fill(x, y, x + w, y + h,0x80000000); + // Border + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + + // Draw text. If textbox contains the placeholder (no focus and text equals initial msg), draw dim color + int color =0xe0e0e0; + // If not focused and text is empty or equals default placeholder, draw dimmed + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + // measure available width approximated by character count + int calc = (w -8) /6; // approx6 px per char + int maxChars =1; + if (calc > maxChars) maxChars = calc; + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/3FFD066E2ADD7C428C45D1BEA1A66E0A/430CC357A15D4BE1A70387A7C3462A3C b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/3FFD066E2ADD7C428C45D1BEA1A66E0A/430CC357A15D4BE1A70387A7C3462A3C new file mode 100644 index 0000000..92a367b --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/3FFD066E2ADD7C428C45D1BEA1A66E0A/430CC357A15D4BE1A70387A7C3462A3C @@ -0,0 +1,258 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i = 0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0, 0, width, height, 0xc0101010, 0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1, 1, 1, 1); + float s = 32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height, 0, 0, height / s + fvo); + t.vertexUV((float)width, (float)height, 0, width / s, (float)height / s + fvo); + t.vertexUV((float)width, 0, 0, (float)width / s, 0 + fvo); + t.vertexUV(0, 0, 0, 0, 0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex = 0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount - 1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i = 0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; +/* +#if !defined(ANDROID) && !defined(__APPLE__) //if (!minecraft->isTouchscreen()) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); +#endif } +*/ + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + +#if 1 +//#if defined(ANDROID) || defined(__APPLE__) //if (minecraft->isTouchscreen()) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click", 1, 1); + clickedButton->released(x, y); + } + } +# else // } else { + clickedButton->released(x, y); +#endif // } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height - 1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/3FFD066E2ADD7C428C45D1BEA1A66E0A/572513C3D8D309B3634C045C3C8FAC54 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/3FFD066E2ADD7C428C45D1BEA1A66E0A/572513C3D8D309B3634C045C3C8FAC54 new file mode 100644 index 0000000..872695a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/3FFD066E2ADD7C428C45D1BEA1A66E0A/572513C3D8D309B3634C045C3C8FAC54 @@ -0,0 +1,137 @@ +#ifndef KEYBOARD_H__ +#define KEYBOARD_H__ + +#include + +/** A keyboard action; key-down or key-up */ +class KeyboardAction +{ +public: + static const int KEYUP = 0; + static const int KEYDOWN = 1; + + KeyboardAction(unsigned char keyCode, int state) { + this->key = keyCode; + this->state = state; + } + + int state; + unsigned char key; +}; + +/* Iterators */ +typedef std::vector KeyboardActionVec; +typedef KeyboardActionVec::iterator KeyboardActionIt; +typedef KeyboardActionVec::const_iterator KeyboardActionCIt; + +/** A static keyboard class, written to resemble the one in lwjgl somewhat */ +class Keyboard +{ +public: + static const int KEY_A = 65; + static const int KEY_B = 66; + static const int KEY_C = 67; + static const int KEY_D = 68; + static const int KEY_E = 69; + static const int KEY_F = 70; + static const int KEY_G = 71; + static const int KEY_H = 72; + static const int KEY_I = 73; + static const int KEY_J = 74; + static const int KEY_K = 75; + static const int KEY_L = 76; + static const int KEY_M = 77; + static const int KEY_N = 78; + static const int KEY_O = 79; + static const int KEY_P = 80; + static const int KEY_Q = 81; + static const int KEY_R = 82; + static const int KEY_S = 83; + static const int KEY_T = 84; + static const int KEY_U = 85; + static const int KEY_V = 86; + static const int KEY_W = 87; + static const int KEY_X = 88; + static const int KEY_Y = 89; + static const int KEY_Z = 90; + + static const int KEY_BACKSPACE = 8; + static const int KEY_RETURN = 13; + + static const int KEY_F1 = 112; + static const int KEY_F2 = 113; + static const int KEY_F3 = 114; + static const int KEY_F4 = 115; + static const int KEY_F5 = 116; + static const int KEY_F6 = 117; + static const int KEY_F7 = 118; + static const int KEY_F8 = 119; + static const int KEY_F9 = 120; + static const int KEY_F10 = 121; + static const int KEY_F11 = 122; + static const int KEY_F12 = 123; + + static const int KEY_ESCAPE = 27; + static const int KEY_SPACE = 32; + static const int KEY_LSHIFT = 10; + + static bool isKeyDown(int keyCode) { + return _states[keyCode] == KeyboardAction::KEYDOWN; + } + + static void reset() { + _inputs.clear(); + _inputText.clear(); + _index = -1; + _textIndex = -1; + } + + static void feed(unsigned char keyCode, int state) { + _inputs.push_back(KeyboardAction(keyCode, state)); + + _states[keyCode] = state; + } + static void feedText(char character) { + _inputText.push_back(character); + } + + static bool next() { + if (_index + 1 >= (int)_inputs.size()) + return false; + + ++_index; + return true; + } + + static bool nextTextChar() { + if(_textIndex + 1 >= (int)_inputText.size()) + return false; + ++_textIndex; + return true; + } + + static void rewind() { + _index = -1; + _textIndex = -1; + } + + static int getEventKey() { + return _inputs[_index].key; + } + + static int getEventKeyState() { + return _inputs[_index].state; + } + static char getChar() { + return _inputText[_textIndex]; + } +private: + static int _index; + static int _textIndex; + static int _states[256]; + static std::vector _inputs; + static std::vector _inputText; + static bool _inited; +}; + +#endif//KEYBOARD_H__ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/3FFD066E2ADD7C428C45D1BEA1A66E0A/83105CECE6AA00603D9DA1057156A4A0 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/3FFD066E2ADD7C428C45D1BEA1A66E0A/83105CECE6AA00603D9DA1057156A4A0 new file mode 100644 index 0000000..55155fc --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/3FFD066E2ADD7C428C45D1BEA1A66E0A/83105CECE6AA00603D9DA1057156A4A0 @@ -0,0 +1,146 @@ +#include "TextEditScreen.h" +#include "../../../world/level/tile/entity/SignTileEntity.h" +#include "../../../AppPlatform.h" +#include "../../Minecraft.h" +#include "../../renderer/tileentity/TileEntityRenderDispatcher.h" +#include "../../renderer/Tesselator.h" +#include "../../renderer/Textures.h" +#include "../../renderer/GameRenderer.h" +#include "../components/Button.h" +#include "../../../network/Packet.h" +#include "../../../network/RakNetInstance.h" +TextEditScreen::TextEditScreen( SignTileEntity* signEntity ) + : sign(signEntity), isShowingKeyboard(false), frame(0), line(0), btnClose(1, "") { + +} +TextEditScreen::~TextEditScreen() { + +} +void TextEditScreen::init() { + super::init(); + minecraft->platform()->showKeyboard(); + isShowingKeyboard = true; + ImageDef def; + def.name = "gui/spritesheet.png"; + def.x = 0; + def.y = 1; + def.width = def.height = 18; + def.setSrc(IntRectangle(60, 0, 18, 18)); + btnClose.setImageDef(def, true); + btnClose.scaleWhenPressed = false; + buttons.push_back(&btnClose); +} + +void TextEditScreen::setupPositions() { + btnClose.width = btnClose.height = 19; + btnClose.x = width - btnClose.width; + btnClose.y = 0; +} + + +bool TextEditScreen::handleBackEvent( bool isDown ) { + sign->setChanged(); + Packet* signUpdatePacket = sign->getUpdatePacket(); + minecraft->raknetInstance->send(signUpdatePacket); + minecraft->platform()->hideKeyboard(); + minecraft->setScreen(NULL); + return true; +} + +void TextEditScreen::render( int xm, int ym, float a ) { + glDepthMask(GL_FALSE); + renderBackground(); + glPushMatrix(); + glDepthMask(GL_TRUE); + glDisable(GL_CULL_FACE); + glLoadIdentity(); + Tesselator& t = Tesselator::instance; + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrthof(0.0f, (float)minecraft->width, (float)minecraft->height, 0, -1, 1); + glMatrixMode(GL_MODELVIEW); + + minecraft->textures->loadAndBindTexture("item/sign.png"); + glColor4f2(1, 1, 1, 1); + + static float minUV[] = {0.03126f, 0.06249f}; + static float maxUV[] = {0.39063f, 0.4374f}; + float scale = ((minecraft->height / 2) / 32) * 0.9f; + + glTranslatef(minecraft->width / 2.0f, 5.0f, 0.0f); + glScalef2(scale,scale,1); + t.begin(GL_QUADS); + t.vertexUV(-32, 0, 0.0f,minUV[0],minUV[1]); + t.vertexUV(32, 0, 0.0f, maxUV[0], minUV[1]); + t.vertexUV(32, 0 + 32, 0.0f, maxUV[0], maxUV[1]); + t.vertexUV(-32, 0 + 32, 0.0f, minUV[0], maxUV[1]); + t.draw(); + + sign->selectedLine = line; + float textScale = 8.0f / 11.0f; + + glTranslatef(0, 2 ,0); + glScalef2(textScale, textScale, 1); + for(int i = 0; i < 4; ++i) { + //drawCenteredString(font, sign->messages[a], 32.0f, 10 * a, 0xFF000000); + std::string msg = sign->messages[i]; + if (i == sign->selectedLine && msg.length() < 14) { + std::string s = "> " + msg + " <"; + font->draw(s, -(float)font->width(s) / 2.0f, 10.0f * i, 0xFF000000, false); + } else { + font->draw(msg, -(float)font->width(msg) / 2.0f, 10.0f * i, 0xFF000000, false); + } + } + sign->selectedLine = -1; + //font->draw("Hej", minecraft->width / 2, 100, 0xFFFFFFFF, false); + + glPopMatrix(); + glEnable(GL_CULL_FACE); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + + //glEnable(GL_DEPTH_TEST); + super::render(xm, ym, a); +} + +void TextEditScreen::lostFocus() { + +} + +void TextEditScreen::tick() { + frame++; +} + +void TextEditScreen::keyPressed( int eventKey ) { + LOGW("Key pressed! [%d]", eventKey); + if(eventKey == Keyboard::KEY_BACKSPACE) { + if(sign->messages[line].length() > 0) { + sign->messages[line].erase(sign->messages[line].size() - 1, 1); + } else { + line--; + if(line < 0) { + line = 3; + } + } + } else if(eventKey == Keyboard::KEY_RETURN) { + line = (line + 1) % 4; + } else { + super::keyPressed(eventKey); + } +} + +void TextEditScreen::keyboardNewChar( char inputChar ) { + std::string fullstring = sign->messages[line] + inputChar; + if(fullstring.length() < 16) { + sign->messages[line] = fullstring; + //LOGW("Line text updated: %s\n", fullstring.c_str()); + } +} + +void TextEditScreen::buttonClicked( Button* button ) { + if(button == &btnClose) + handleBackEvent(true); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/3FFD066E2ADD7C428C45D1BEA1A66E0A/AB4468542721469AF5132E3354EB32CE b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/3FFD066E2ADD7C428C45D1BEA1A66E0A/AB4468542721469AF5132E3354EB32CE new file mode 100644 index 0000000..307acb0 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/3FFD066E2ADD7C428C45D1BEA1A66E0A/AB4468542721469AF5132E3354EB32CE @@ -0,0 +1,290 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Handle backspace for focused textbox + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + if (!tb->text.empty()) tb->text.erase(tb->text.size() -1,1); + } + // Enter/Return will defocus the textbox + if (eventKey == Keyboard::KEY_RETURN || eventKey == Keyboard::KEY_NUMPADENTER) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; +/* +#if !defined(ANDROID) && !defined(__APPLE__) //if (!minecraft->isTouchscreen()) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); +#endif } +*/ + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + +#if1 +//#if defined(ANDROID) || defined(__APPLE__) //if (minecraft->isTouchscreen()) { + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } +# else // } else { + clickedButton->released(x, y); +#endif // } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height -1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/3FFD066E2ADD7C428C45D1BEA1A66E0A/E19DC915D7B7F4D40A50F260C758DAD9 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/3FFD066E2ADD7C428C45D1BEA1A66E0A/E19DC915D7B7F4D40A50F260C758DAD9 new file mode 100644 index 0000000..8b4d6da --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/3FFD066E2ADD7C428C45D1BEA1A66E0A/E19DC915D7B7F4D40A50F260C758DAD9 @@ -0,0 +1,80 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI__Screen_H__ +#define NET_MINECRAFT_CLIENT_GUI__Screen_H__ + +//package net.minecraft.client.gui; + +#include +#include "GuiComponent.h" + +class Font; +class Minecraft; +class Button; +class TextBox; +struct IntRectangle; + +class Screen: public GuiComponent +{ +public: + Screen(); + + virtual void render(int xm, int ym, float a); + + void init(Minecraft* minecraft, int width, int height); + virtual void init(); + + void setSize(int width, int height); + virtual void setupPositions() {}; + + virtual void updateEvents(); + virtual void mouseEvent(); + virtual void keyboardEvent(); + virtual void keyboardTextEvent(); + virtual bool handleBackEvent(bool isDown); + + virtual void tick() {} + + virtual void removed() {} + + virtual void renderBackground(); + virtual void renderBackground(int vo); + virtual void renderDirtBackground(int vo); + // query + virtual bool renderGameBehind(); + virtual bool hasClippingArea(IntRectangle& out); + + virtual bool isPauseScreen(); + virtual bool isErrorScreen(); + virtual bool isInGameScreen(); + virtual bool closeOnPlayerHurt(); + + virtual void confirmResult(bool result, int id) {} + virtual void lostFocus(); + virtual void toGUICoordinate(int& x, int& y); +protected: + void updateTabButtonSelection(); + + virtual void buttonClicked(Button* button) {} + virtual void mouseClicked(int x, int y, int buttonNum); + virtual void mouseReleased(int x, int y, int buttonNum); + + virtual void keyPressed(int eventKey); + virtual void keyboardNewChar(char inputChar) {} +public: + int width; + int height; + bool passEvents; + //GuiParticles* particles; +protected: + Minecraft* minecraft; + std::vector buttons; + std::vector textBoxes; + + std::vector tabButtons; + int tabButtonIndex; + + Font* font; +private: + Button* clickedButton; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI__Screen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/00E99AC35113958365731C528D4D682B b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/00E99AC35113958365731C528D4D682B new file mode 100644 index 0000000..1e4d608 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/00E99AC35113958365731C528D4D682B @@ -0,0 +1,309 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 to avoid off-by-one in GUI mapping + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} + +// Forward typed character directly to focused textbox to avoid duplicate definitions +void Screen::keyboardTextEvent() +{ + char c = Keyboard::getChar(); + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (c >=32) tb->insertChar(c); + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Focused textbox editing + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + tb->backspaceAtCaret(); + } + else if (eventKey == Keyboard::KEY_DELETE) { + tb->deleteAtCaret(); + } + else if (eventKey == Keyboard::KEY_LEFT) { + tb->moveCaretLeft(); + } + else if (eventKey == Keyboard::KEY_RIGHT) { + tb->moveCaretRight(); + } + else if (eventKey == Keyboard::KEY_HOME) { + tb->moveCaretHome(); + } + else if (eventKey == Keyboard::KEY_END) { + tb->moveCaretEnd(); + } + else if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height; // removed -1 +} + +// Default implementation for character input (virtual) +void Screen::keyboardNewChar(char inputChar) { + // default: forward to focused textbox is handled in keyboardTextEvent; keep empty here + (void)inputChar; +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/01001DC511551AEE541029E6BAD22D4F b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/01001DC511551AEE541029E6BAD22D4F new file mode 100644 index 0000000..4204871 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/01001DC511551AEE541029E6BAD22D4F @@ -0,0 +1,147 @@ +#ifndef KEYBOARD_H__ +#define KEYBOARD_H__ + +#include + +/** A keyboard action; key-down or key-up */ +class KeyboardAction +{ +public: + static const int KEYUP = 0; + static const int KEYDOWN = 1; + + KeyboardAction(unsigned char keyCode, int state) { + this->key = keyCode; + this->state = state; + } + + int state; + unsigned char key; +}; + +/* Iterators */ +typedef std::vector KeyboardActionVec; +typedef KeyboardActionVec::iterator KeyboardActionIt; +typedef KeyboardActionVec::const_iterator KeyboardActionCIt; + +/** A static keyboard class, written to resemble the one in lwjgl somewhat */ +class Keyboard +{ +public: + static const int KEY_A = 65; + static const int KEY_B = 66; + static const int KEY_C = 67; + static const int KEY_D = 68; + static const int KEY_E = 69; + static const int KEY_F = 70; + static const int KEY_G = 71; + static const int KEY_H = 72; + static const int KEY_I = 73; + static const int KEY_J = 74; + static const int KEY_K = 75; + static const int KEY_L = 76; + static const int KEY_M = 77; + static const int KEY_N = 78; + static const int KEY_O = 79; + static const int KEY_P = 80; + static const int KEY_Q = 81; + static const int KEY_R = 82; + static const int KEY_S = 83; + static const int KEY_T = 84; + static const int KEY_U = 85; + static const int KEY_V = 86; + static const int KEY_W = 87; + static const int KEY_X = 88; + static const int KEY_Y = 89; + static const int KEY_Z = 90; + + static const int KEY_BACKSPACE = 8; + static const int KEY_RETURN = 13; + // Delete key (use VK_DELETE / common code46) + static const int KEY_DELETE = 46; + + // Arrow keys, Home/End (common VK codes) + static const int KEY_LEFT = 37; + static const int KEY_UP = 38; + static const int KEY_RIGHT = 39; + static const int KEY_DOWN = 40; + static const int KEY_HOME = 36; + static const int KEY_END = 35; + + static const int KEY_F1 = 112; + static const int KEY_F2 = 113; + static const int KEY_F3 = 114; + static const int KEY_F4 = 115; + static const int KEY_F5 = 116; + static const int KEY_F6 = 117; + static const int KEY_F7 = 118; + static const int KEY_F8 = 119; + static const int KEY_F9 = 120; + static const int KEY_F10 = 121; + static const int KEY_F11 = 122; + static const int KEY_F12 = 123; + + static const int KEY_ESCAPE = 27; + static const int KEY_SPACE = 32; + static const int KEY_LSHIFT = 10; + + static bool isKeyDown(int keyCode) { + return _states[keyCode] == KeyboardAction::KEYDOWN; + } + + static void reset() { + _inputs.clear(); + _inputText.clear(); + _index = -1; + _textIndex = -1; + } + + static void feed(unsigned char keyCode, int state) { + _inputs.push_back(KeyboardAction(keyCode, state)); + + _states[keyCode] = state; + } + static void feedText(char character) { + _inputText.push_back(character); + } + + static bool next() { + if (_index + 1 >= (int)_inputs.size()) + return false; + + ++_index; + return true; + } + + static bool nextTextChar() { + if(_textIndex + 1 >= (int)_inputText.size()) + return false; + ++_textIndex; + return true; + } + + static void rewind() { + _index = -1; + _textIndex = -1; + } + + static int getEventKey() { + return _inputs[_index].key; + } + + static int getEventKeyState() { + return _inputs[_index].state; + } + static char getChar() { + return _inputText[_textIndex]; + } +private: + static int _index; + static int _textIndex; + static int _states[256]; + static std::vector _inputs; + static std::vector _inputText; + static bool _inited; +}; + +#endif//KEYBOARD_H__ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/08FFDC6DEFC8A9251BEC9211B6D84908 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/08FFDC6DEFC8A9251BEC9211B6D84908 new file mode 100644 index 0000000..81e0443 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/08FFDC6DEFC8A9251BEC9211B6D84908 @@ -0,0 +1,295 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 to avoid off-by-one in GUI mapping + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} + +// Forward typed character directly to focused textbox to avoid duplicate definitions +void Screen::keyboardTextEvent() +{ + char c = Keyboard::getChar(); + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (c >=32) tb->text.push_back(c); + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Handle backspace for focused textbox + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE || eventKey == Keyboard::KEY_DELETE) { + if (!tb->text.empty()) tb->text.erase(tb->text.size() -1,1); + } + // Enter/Return will defocus the textbox + if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height; // removed -1 +} + +// Default implementation for character input (virtual) +void Screen::keyboardNewChar(char inputChar) { + // default: forward to focused textbox is handled in keyboardTextEvent; keep empty here + (void)inputChar; +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/1CC65E0062271217494E8E6A4C0A58CE b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/1CC65E0062271217494E8E6A4C0A58CE new file mode 100644 index 0000000..bfd810c --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/1CC65E0062271217494E8E6A4C0A58CE @@ -0,0 +1,34 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ +#define NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ + +//package net.minecraft.client.gui; + +#include +#include "../GuiComponent.h" +#include "../../Options.h" + +class Font; +class Minecraft; + +class TextBox: public GuiComponent +{ +public: + TextBox(int id, const std::string& msg); + TextBox(int id, int x, int y, const std::string& msg); + TextBox(int id, int x, int y, int w, int h, const std::string& msg); + + virtual void setFocus(Minecraft* minecraft); + virtual bool loseFocus(Minecraft* minecraft); + + virtual void render(Minecraft* minecraft, int xm, int ym); + +public: + int w, h; + int x, y; + + std::string text; + int id; + bool focused; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/1D11F3CE27B0B595836AB483CC9A0B43 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/1D11F3CE27B0B595836AB483CC9A0B43 new file mode 100644 index 0000000..4adf7ad --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/1D11F3CE27B0B595836AB483CC9A0B43 @@ -0,0 +1,77 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(id), w(0), h(0), x(0), y(0), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg), focused(false) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->showKeyboard(); + focused = true; + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->hideKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + // Slightly translucent dark background + fill(x, y, x + w, y + h,0x80000000); + // Border - use different colors when focused + if (focused) { + fill(x, y, x + w, y +1,0xffa0c0ff); + fill(x, y + h -1, x + w, y + h,0xff4060a0); + fill(x, y, x +1, y + h,0xffa0c0ff); + fill(x + w -1, y, x + w, y + h,0xff4060a0); + } else { + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + } + + // Draw text. If textbox contains the placeholder (no focus and text equals initial msg), draw dim color + int color =0xe0e0e0; + // If not focused and text is empty or equals default placeholder, draw dimmed + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + // measure available width approximated by character count + int calc = (w -8) /6; // approx6 px per char + int maxChars =1; + if (calc > maxChars) maxChars = calc; + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/430CC357A15D4BE1A70387A7C3462A3C b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/430CC357A15D4BE1A70387A7C3462A3C new file mode 100644 index 0000000..81e0443 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/430CC357A15D4BE1A70387A7C3462A3C @@ -0,0 +1,295 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 to avoid off-by-one in GUI mapping + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} + +// Forward typed character directly to focused textbox to avoid duplicate definitions +void Screen::keyboardTextEvent() +{ + char c = Keyboard::getChar(); + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (c >=32) tb->text.push_back(c); + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Handle backspace for focused textbox + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE || eventKey == Keyboard::KEY_DELETE) { + if (!tb->text.empty()) tb->text.erase(tb->text.size() -1,1); + } + // Enter/Return will defocus the textbox + if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height; // removed -1 +} + +// Default implementation for character input (virtual) +void Screen::keyboardNewChar(char inputChar) { + // default: forward to focused textbox is handled in keyboardTextEvent; keep empty here + (void)inputChar; +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/502B20AC2E49ACF7221C04E0212B51D3 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/502B20AC2E49ACF7221C04E0212B51D3 new file mode 100644 index 0000000..83b6135 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/502B20AC2E49ACF7221C04E0212B51D3 @@ -0,0 +1,139 @@ +#ifndef KEYBOARD_H__ +#define KEYBOARD_H__ + +#include + +/** A keyboard action; key-down or key-up */ +class KeyboardAction +{ +public: + static const int KEYUP = 0; + static const int KEYDOWN = 1; + + KeyboardAction(unsigned char keyCode, int state) { + this->key = keyCode; + this->state = state; + } + + int state; + unsigned char key; +}; + +/* Iterators */ +typedef std::vector KeyboardActionVec; +typedef KeyboardActionVec::iterator KeyboardActionIt; +typedef KeyboardActionVec::const_iterator KeyboardActionCIt; + +/** A static keyboard class, written to resemble the one in lwjgl somewhat */ +class Keyboard +{ +public: + static const int KEY_A = 65; + static const int KEY_B = 66; + static const int KEY_C = 67; + static const int KEY_D = 68; + static const int KEY_E = 69; + static const int KEY_F = 70; + static const int KEY_G = 71; + static const int KEY_H = 72; + static const int KEY_I = 73; + static const int KEY_J = 74; + static const int KEY_K = 75; + static const int KEY_L = 76; + static const int KEY_M = 77; + static const int KEY_N = 78; + static const int KEY_O = 79; + static const int KEY_P = 80; + static const int KEY_Q = 81; + static const int KEY_R = 82; + static const int KEY_S = 83; + static const int KEY_T = 84; + static const int KEY_U = 85; + static const int KEY_V = 86; + static const int KEY_W = 87; + static const int KEY_X = 88; + static const int KEY_Y = 89; + static const int KEY_Z = 90; + + static const int KEY_BACKSPACE = 8; + static const int KEY_RETURN = 13; + // Delete key (use VK_DELETE / common code46) + static const int KEY_DELETE = 46; + + static const int KEY_F1 = 112; + static const int KEY_F2 = 113; + static const int KEY_F3 = 114; + static const int KEY_F4 = 115; + static const int KEY_F5 = 116; + static const int KEY_F6 = 117; + static const int KEY_F7 = 118; + static const int KEY_F8 = 119; + static const int KEY_F9 = 120; + static const int KEY_F10 = 121; + static const int KEY_F11 = 122; + static const int KEY_F12 = 123; + + static const int KEY_ESCAPE = 27; + static const int KEY_SPACE = 32; + static const int KEY_LSHIFT = 10; + + static bool isKeyDown(int keyCode) { + return _states[keyCode] == KeyboardAction::KEYDOWN; + } + + static void reset() { + _inputs.clear(); + _inputText.clear(); + _index = -1; + _textIndex = -1; + } + + static void feed(unsigned char keyCode, int state) { + _inputs.push_back(KeyboardAction(keyCode, state)); + + _states[keyCode] = state; + } + static void feedText(char character) { + _inputText.push_back(character); + } + + static bool next() { + if (_index + 1 >= (int)_inputs.size()) + return false; + + ++_index; + return true; + } + + static bool nextTextChar() { + if(_textIndex + 1 >= (int)_inputText.size()) + return false; + ++_textIndex; + return true; + } + + static void rewind() { + _index = -1; + _textIndex = -1; + } + + static int getEventKey() { + return _inputs[_index].key; + } + + static int getEventKeyState() { + return _inputs[_index].state; + } + static char getChar() { + return _inputText[_textIndex]; + } +private: + static int _index; + static int _textIndex; + static int _states[256]; + static std::vector _inputs; + static std::vector _inputText; + static bool _inited; +}; + +#endif//KEYBOARD_H__ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/572513C3D8D309B3634C045C3C8FAC54 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/572513C3D8D309B3634C045C3C8FAC54 new file mode 100644 index 0000000..83b6135 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/572513C3D8D309B3634C045C3C8FAC54 @@ -0,0 +1,139 @@ +#ifndef KEYBOARD_H__ +#define KEYBOARD_H__ + +#include + +/** A keyboard action; key-down or key-up */ +class KeyboardAction +{ +public: + static const int KEYUP = 0; + static const int KEYDOWN = 1; + + KeyboardAction(unsigned char keyCode, int state) { + this->key = keyCode; + this->state = state; + } + + int state; + unsigned char key; +}; + +/* Iterators */ +typedef std::vector KeyboardActionVec; +typedef KeyboardActionVec::iterator KeyboardActionIt; +typedef KeyboardActionVec::const_iterator KeyboardActionCIt; + +/** A static keyboard class, written to resemble the one in lwjgl somewhat */ +class Keyboard +{ +public: + static const int KEY_A = 65; + static const int KEY_B = 66; + static const int KEY_C = 67; + static const int KEY_D = 68; + static const int KEY_E = 69; + static const int KEY_F = 70; + static const int KEY_G = 71; + static const int KEY_H = 72; + static const int KEY_I = 73; + static const int KEY_J = 74; + static const int KEY_K = 75; + static const int KEY_L = 76; + static const int KEY_M = 77; + static const int KEY_N = 78; + static const int KEY_O = 79; + static const int KEY_P = 80; + static const int KEY_Q = 81; + static const int KEY_R = 82; + static const int KEY_S = 83; + static const int KEY_T = 84; + static const int KEY_U = 85; + static const int KEY_V = 86; + static const int KEY_W = 87; + static const int KEY_X = 88; + static const int KEY_Y = 89; + static const int KEY_Z = 90; + + static const int KEY_BACKSPACE = 8; + static const int KEY_RETURN = 13; + // Delete key (use VK_DELETE / common code46) + static const int KEY_DELETE = 46; + + static const int KEY_F1 = 112; + static const int KEY_F2 = 113; + static const int KEY_F3 = 114; + static const int KEY_F4 = 115; + static const int KEY_F5 = 116; + static const int KEY_F6 = 117; + static const int KEY_F7 = 118; + static const int KEY_F8 = 119; + static const int KEY_F9 = 120; + static const int KEY_F10 = 121; + static const int KEY_F11 = 122; + static const int KEY_F12 = 123; + + static const int KEY_ESCAPE = 27; + static const int KEY_SPACE = 32; + static const int KEY_LSHIFT = 10; + + static bool isKeyDown(int keyCode) { + return _states[keyCode] == KeyboardAction::KEYDOWN; + } + + static void reset() { + _inputs.clear(); + _inputText.clear(); + _index = -1; + _textIndex = -1; + } + + static void feed(unsigned char keyCode, int state) { + _inputs.push_back(KeyboardAction(keyCode, state)); + + _states[keyCode] = state; + } + static void feedText(char character) { + _inputText.push_back(character); + } + + static bool next() { + if (_index + 1 >= (int)_inputs.size()) + return false; + + ++_index; + return true; + } + + static bool nextTextChar() { + if(_textIndex + 1 >= (int)_inputText.size()) + return false; + ++_textIndex; + return true; + } + + static void rewind() { + _index = -1; + _textIndex = -1; + } + + static int getEventKey() { + return _inputs[_index].key; + } + + static int getEventKeyState() { + return _inputs[_index].state; + } + static char getChar() { + return _inputText[_textIndex]; + } +private: + static int _index; + static int _textIndex; + static int _states[256]; + static std::vector _inputs; + static std::vector _inputText; + static bool _inited; +}; + +#endif//KEYBOARD_H__ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/5E925EA522C330C18FFAA87EF5066AC3 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/5E925EA522C330C18FFAA87EF5066AC3 new file mode 100644 index 0000000..4adf7ad --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/5E925EA522C330C18FFAA87EF5066AC3 @@ -0,0 +1,77 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(id), w(0), h(0), x(0), y(0), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg), focused(false) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->showKeyboard(); + focused = true; + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->hideKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + // Slightly translucent dark background + fill(x, y, x + w, y + h,0x80000000); + // Border - use different colors when focused + if (focused) { + fill(x, y, x + w, y +1,0xffa0c0ff); + fill(x, y + h -1, x + w, y + h,0xff4060a0); + fill(x, y, x +1, y + h,0xffa0c0ff); + fill(x + w -1, y, x + w, y + h,0xff4060a0); + } else { + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + } + + // Draw text. If textbox contains the placeholder (no focus and text equals initial msg), draw dim color + int color =0xe0e0e0; + // If not focused and text is empty or equals default placeholder, draw dimmed + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + // measure available width approximated by character count + int calc = (w -8) /6; // approx6 px per char + int maxChars =1; + if (calc > maxChars) maxChars = calc; + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/68FB8EB069423E0E0BFE5B2B1536A453 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/68FB8EB069423E0E0BFE5B2B1536A453 new file mode 100644 index 0000000..bfd810c --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/68FB8EB069423E0E0BFE5B2B1536A453 @@ -0,0 +1,34 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ +#define NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ + +//package net.minecraft.client.gui; + +#include +#include "../GuiComponent.h" +#include "../../Options.h" + +class Font; +class Minecraft; + +class TextBox: public GuiComponent +{ +public: + TextBox(int id, const std::string& msg); + TextBox(int id, int x, int y, const std::string& msg); + TextBox(int id, int x, int y, int w, int h, const std::string& msg); + + virtual void setFocus(Minecraft* minecraft); + virtual bool loseFocus(Minecraft* minecraft); + + virtual void render(Minecraft* minecraft, int xm, int ym); + +public: + int w, h; + int x, y; + + std::string text; + int id; + bool focused; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/B064B42B42E4D7F2737542DAB815CDD1 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/B064B42B42E4D7F2737542DAB815CDD1 new file mode 100644 index 0000000..a8f549a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/B064B42B42E4D7F2737542DAB815CDD1 @@ -0,0 +1,118 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(id), w(0), h(0), x(0), y(0), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->showKeyboard(); + focused = true; + if (caretPos <0) caretPos =0; + if (caretPos > (int)text.length()) caretPos = (int)text.length(); + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->hideKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::setCaretPos(int p) { + if (p <0) p =0; + if (p > (int)text.length()) p = (int)text.length(); + caretPos = p; +} + +void TextBox::insertChar(char c) { + text.insert(text.begin() + caretPos, c); + ++caretPos; +} + +void TextBox::backspaceAtCaret() { + if (caretPos >0) { + text.erase(text.begin() + caretPos -1); + --caretPos; + } +} + +void TextBox::deleteAtCaret() { + if (caretPos < (int)text.length()) { + text.erase(text.begin() + caretPos); + } +} + +void TextBox::moveCaretLeft() { + if (caretPos >0) --caretPos; +} + +void TextBox::moveCaretRight() { + if (caretPos < (int)text.length()) ++caretPos; +} + +void TextBox::moveCaretHome() { caretPos =0; } +void TextBox::moveCaretEnd() { caretPos = (int)text.length(); } + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + fill(x, y, x + w, y + h,0x80000000); + // Border - use different colors when focused + if (focused) { + fill(x, y, x + w, y +1,0xffa0c0ff); + fill(x, y + h -1, x + w, y + h,0xff4060a0); + fill(x, y, x +1, y + h,0xffa0c0ff); + fill(x + w -1, y, x + w, y + h,0xff4060a0); + } else { + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + } + + int color =0xe0e0e0; + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + int calc = (w -8) /6; // approx6 px per char + int maxChars =1; + if (calc > maxChars) maxChars = calc; + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); + + // Draw caret if focused + if (focused) { + // compute caret x pos in pixels approximated by char width + int caretPixel = x +4 + caretPos *6; + if (caretPixel > x + w -6) caretPixel = x + w -6; + drawVLine(caretPixel, y +3, y + h -4,0xFFFFFFFF); + } +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/E19DC915D7B7F4D40A50F260C758DAD9 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/E19DC915D7B7F4D40A50F260C758DAD9 new file mode 100644 index 0000000..c45276d --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/E19DC915D7B7F4D40A50F260C758DAD9 @@ -0,0 +1,80 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI__Screen_H__ +#define NET_MINECRAFT_CLIENT_GUI__Screen_H__ + +//package net.minecraft.client.gui; + +#include +#include "GuiComponent.h" + +class Font; +class Minecraft; +class Button; +class TextBox; +struct IntRectangle; + +class Screen: public GuiComponent +{ +public: + Screen(); + + virtual void render(int xm, int ym, float a); + + void init(Minecraft* minecraft, int width, int height); + virtual void init(); + + void setSize(int width, int height); + virtual void setupPositions() {}; + + virtual void updateEvents(); + virtual void mouseEvent(); + virtual void keyboardEvent(); + virtual void keyboardTextEvent(); + virtual bool handleBackEvent(bool isDown); + + virtual void tick() {} + + virtual void removed() {} + + virtual void renderBackground(); + virtual void renderBackground(int vo); + virtual void renderDirtBackground(int vo); + // query + virtual bool renderGameBehind(); + virtual bool hasClippingArea(IntRectangle& out); + + virtual bool isPauseScreen(); + virtual bool isErrorScreen(); + virtual bool isInGameScreen(); + virtual bool closeOnPlayerHurt(); + + virtual void confirmResult(bool result, int id) {} + virtual void lostFocus(); + virtual void toGUICoordinate(int& x, int& y); +protected: + void updateTabButtonSelection(); + + virtual void buttonClicked(Button* button) {} + virtual void mouseClicked(int x, int y, int buttonNum); + virtual void mouseReleased(int x, int y, int buttonNum); + + virtual void keyPressed(int eventKey); + virtual void keyboardNewChar(char inputChar); +public: + int width; + int height; + bool passEvents; + //GuiParticles* particles; +protected: + Minecraft* minecraft; + std::vector buttons; + std::vector textBoxes; + + std::vector tabButtons; + int tabButtonIndex; + + Font* font; +private: + Button* clickedButton; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI__Screen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/E3316AAB38A4F7414BABF546C20F84B4 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/E3316AAB38A4F7414BABF546C20F84B4 new file mode 100644 index 0000000..55acfcd --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/40F283D71637BE42BEEB11F71504A1BE/E3316AAB38A4F7414BABF546C20F84B4 @@ -0,0 +1,47 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ +#define NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ + +//package net.minecraft.client.gui; + +#include +#include "../GuiComponent.h" +#include "../../Options.h" + +class Font; +class Minecraft; + +class TextBox: public GuiComponent +{ +public: + TextBox(int id, const std::string& msg); + TextBox(int id, int x, int y, const std::string& msg); + TextBox(int id, int x, int y, int w, int h, const std::string& msg); + + virtual void setFocus(Minecraft* minecraft); + virtual bool loseFocus(Minecraft* minecraft); + + virtual void render(Minecraft* minecraft, int xm, int ym); + + // Editing helpers + int getCaretPos() const { return caretPos; } + void setCaretPos(int p); + void insertChar(char c); + void backspaceAtCaret(); + void deleteAtCaret(); + void moveCaretLeft(); + void moveCaretRight(); + void moveCaretHome(); + void moveCaretEnd(); + +public: + int w, h; + int x, y; + + std::string text; + int id; + bool focused; +private: + int caretPos; // character index +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/0E1E245EA16F1FAA685C5686B18BDD08 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/0E1E245EA16F1FAA685C5686B18BDD08 new file mode 100644 index 0000000..964c789 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/0E1E245EA16F1FAA685C5686B18BDD08 @@ -0,0 +1,10 @@ +#ifndef NET_MINECRAFT_CLIENT_NETWORKING_HELPERS_H +#define NET_MINECRAFT_CLIENT_NETWORKING_HELPERS_H + +#include +class Minecraft; + +// Starts a connection to host:port. Returns true if the underlying connect call was started. +bool startConnect(Minecraft* mc, const std::string& host, int port); + +#endif // NET_MINECRAFT_CLIENT_NETWORKING_HELPERS_H diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/1CC65E0062271217494E8E6A4C0A58CE b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/1CC65E0062271217494E8E6A4C0A58CE new file mode 100644 index 0000000..bfd810c --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/1CC65E0062271217494E8E6A4C0A58CE @@ -0,0 +1,34 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ +#define NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ + +//package net.minecraft.client.gui; + +#include +#include "../GuiComponent.h" +#include "../../Options.h" + +class Font; +class Minecraft; + +class TextBox: public GuiComponent +{ +public: + TextBox(int id, const std::string& msg); + TextBox(int id, int x, int y, const std::string& msg); + TextBox(int id, int x, int y, int w, int h, const std::string& msg); + + virtual void setFocus(Minecraft* minecraft); + virtual bool loseFocus(Minecraft* minecraft); + + virtual void render(Minecraft* minecraft, int xm, int ym); + +public: + int w, h; + int x, y; + + std::string text; + int id; + bool focused; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/1D11F3CE27B0B595836AB483CC9A0B43 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/1D11F3CE27B0B595836AB483CC9A0B43 new file mode 100644 index 0000000..c8328de --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/1D11F3CE27B0B595836AB483CC9A0B43 @@ -0,0 +1,70 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(0), w(0), h(0), x(0), y(0), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + minecraft->platform()->showKeyboard(); + focused = true; + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + minecraft->platform()->showKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + // Slightly translucent dark background + fill(x, y, x + w, y + h,0x80000000); + // Border + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + + // Draw text. If textbox contains the placeholder (no focus and text equals initial msg), draw dim color + int color =0xe0e0e0; + // If not focused and text is empty or equals default placeholder, draw dimmed + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + // measure available width approximated by character count + int calc = (w -8) /6; // approx6 px per char + int maxChars =1; + if (calc > maxChars) maxChars = calc; + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/430CC357A15D4BE1A70387A7C3462A3C b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/430CC357A15D4BE1A70387A7C3462A3C new file mode 100644 index 0000000..92a367b --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/430CC357A15D4BE1A70387A7C3462A3C @@ -0,0 +1,258 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i = 0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0, 0, width, height, 0xc0101010, 0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1, 1, 1, 1); + float s = 32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height, 0, 0, height / s + fvo); + t.vertexUV((float)width, (float)height, 0, width / s, (float)height / s + fvo); + t.vertexUV((float)width, 0, 0, (float)width / s, 0 + fvo); + t.vertexUV(0, 0, 0, 0, 0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex = 0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount - 1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i = 0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; +/* +#if !defined(ANDROID) && !defined(__APPLE__) //if (!minecraft->isTouchscreen()) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); +#endif } +*/ + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + +#if 1 +//#if defined(ANDROID) || defined(__APPLE__) //if (minecraft->isTouchscreen()) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click", 1, 1); + clickedButton->released(x, y); + } + } +# else // } else { + clickedButton->released(x, y); +#endif // } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height - 1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/572513C3D8D309B3634C045C3C8FAC54 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/572513C3D8D309B3634C045C3C8FAC54 new file mode 100644 index 0000000..872695a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/572513C3D8D309B3634C045C3C8FAC54 @@ -0,0 +1,137 @@ +#ifndef KEYBOARD_H__ +#define KEYBOARD_H__ + +#include + +/** A keyboard action; key-down or key-up */ +class KeyboardAction +{ +public: + static const int KEYUP = 0; + static const int KEYDOWN = 1; + + KeyboardAction(unsigned char keyCode, int state) { + this->key = keyCode; + this->state = state; + } + + int state; + unsigned char key; +}; + +/* Iterators */ +typedef std::vector KeyboardActionVec; +typedef KeyboardActionVec::iterator KeyboardActionIt; +typedef KeyboardActionVec::const_iterator KeyboardActionCIt; + +/** A static keyboard class, written to resemble the one in lwjgl somewhat */ +class Keyboard +{ +public: + static const int KEY_A = 65; + static const int KEY_B = 66; + static const int KEY_C = 67; + static const int KEY_D = 68; + static const int KEY_E = 69; + static const int KEY_F = 70; + static const int KEY_G = 71; + static const int KEY_H = 72; + static const int KEY_I = 73; + static const int KEY_J = 74; + static const int KEY_K = 75; + static const int KEY_L = 76; + static const int KEY_M = 77; + static const int KEY_N = 78; + static const int KEY_O = 79; + static const int KEY_P = 80; + static const int KEY_Q = 81; + static const int KEY_R = 82; + static const int KEY_S = 83; + static const int KEY_T = 84; + static const int KEY_U = 85; + static const int KEY_V = 86; + static const int KEY_W = 87; + static const int KEY_X = 88; + static const int KEY_Y = 89; + static const int KEY_Z = 90; + + static const int KEY_BACKSPACE = 8; + static const int KEY_RETURN = 13; + + static const int KEY_F1 = 112; + static const int KEY_F2 = 113; + static const int KEY_F3 = 114; + static const int KEY_F4 = 115; + static const int KEY_F5 = 116; + static const int KEY_F6 = 117; + static const int KEY_F7 = 118; + static const int KEY_F8 = 119; + static const int KEY_F9 = 120; + static const int KEY_F10 = 121; + static const int KEY_F11 = 122; + static const int KEY_F12 = 123; + + static const int KEY_ESCAPE = 27; + static const int KEY_SPACE = 32; + static const int KEY_LSHIFT = 10; + + static bool isKeyDown(int keyCode) { + return _states[keyCode] == KeyboardAction::KEYDOWN; + } + + static void reset() { + _inputs.clear(); + _inputText.clear(); + _index = -1; + _textIndex = -1; + } + + static void feed(unsigned char keyCode, int state) { + _inputs.push_back(KeyboardAction(keyCode, state)); + + _states[keyCode] = state; + } + static void feedText(char character) { + _inputText.push_back(character); + } + + static bool next() { + if (_index + 1 >= (int)_inputs.size()) + return false; + + ++_index; + return true; + } + + static bool nextTextChar() { + if(_textIndex + 1 >= (int)_inputText.size()) + return false; + ++_textIndex; + return true; + } + + static void rewind() { + _index = -1; + _textIndex = -1; + } + + static int getEventKey() { + return _inputs[_index].key; + } + + static int getEventKeyState() { + return _inputs[_index].state; + } + static char getChar() { + return _inputText[_textIndex]; + } +private: + static int _index; + static int _textIndex; + static int _states[256]; + static std::vector _inputs; + static std::vector _inputText; + static bool _inited; +}; + +#endif//KEYBOARD_H__ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/823BDADDA9C3C4C2205BDD6EEACBEA30 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/823BDADDA9C3C4C2205BDD6EEACBEA30 new file mode 100644 index 0000000..a7cb233 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/823BDADDA9C3C4C2205BDD6EEACBEA30 @@ -0,0 +1,18 @@ +#ifndef NET_MINECRAFT_CLIENT_NETWORKING_HELPERS_H +#define NET_MINECRAFT_CLIENT_NETWORKING_HELPERS_H + +#include +#include "Minecraft.h" +#include "../network/ClientSideNetworkHandler.h" + +// Starts a connection to host:port. Returns true if the underlying connect call was started. +inline bool startConnect(Minecraft* mc, const std::string& host, int port) { + if (mc->netCallback) { + delete mc->netCallback; + mc->netCallback = nullptr; + } + mc->netCallback = new ClientSideNetworkHandler(mc, mc->raknetInstance); + return mc->raknetInstance->connect(host.c_str(), port); +} + +#endif // NET_MINECRAFT_CLIENT_NETWORKING_HELPERS_H diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/83105CECE6AA00603D9DA1057156A4A0 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/83105CECE6AA00603D9DA1057156A4A0 new file mode 100644 index 0000000..55155fc --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/83105CECE6AA00603D9DA1057156A4A0 @@ -0,0 +1,146 @@ +#include "TextEditScreen.h" +#include "../../../world/level/tile/entity/SignTileEntity.h" +#include "../../../AppPlatform.h" +#include "../../Minecraft.h" +#include "../../renderer/tileentity/TileEntityRenderDispatcher.h" +#include "../../renderer/Tesselator.h" +#include "../../renderer/Textures.h" +#include "../../renderer/GameRenderer.h" +#include "../components/Button.h" +#include "../../../network/Packet.h" +#include "../../../network/RakNetInstance.h" +TextEditScreen::TextEditScreen( SignTileEntity* signEntity ) + : sign(signEntity), isShowingKeyboard(false), frame(0), line(0), btnClose(1, "") { + +} +TextEditScreen::~TextEditScreen() { + +} +void TextEditScreen::init() { + super::init(); + minecraft->platform()->showKeyboard(); + isShowingKeyboard = true; + ImageDef def; + def.name = "gui/spritesheet.png"; + def.x = 0; + def.y = 1; + def.width = def.height = 18; + def.setSrc(IntRectangle(60, 0, 18, 18)); + btnClose.setImageDef(def, true); + btnClose.scaleWhenPressed = false; + buttons.push_back(&btnClose); +} + +void TextEditScreen::setupPositions() { + btnClose.width = btnClose.height = 19; + btnClose.x = width - btnClose.width; + btnClose.y = 0; +} + + +bool TextEditScreen::handleBackEvent( bool isDown ) { + sign->setChanged(); + Packet* signUpdatePacket = sign->getUpdatePacket(); + minecraft->raknetInstance->send(signUpdatePacket); + minecraft->platform()->hideKeyboard(); + minecraft->setScreen(NULL); + return true; +} + +void TextEditScreen::render( int xm, int ym, float a ) { + glDepthMask(GL_FALSE); + renderBackground(); + glPushMatrix(); + glDepthMask(GL_TRUE); + glDisable(GL_CULL_FACE); + glLoadIdentity(); + Tesselator& t = Tesselator::instance; + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrthof(0.0f, (float)minecraft->width, (float)minecraft->height, 0, -1, 1); + glMatrixMode(GL_MODELVIEW); + + minecraft->textures->loadAndBindTexture("item/sign.png"); + glColor4f2(1, 1, 1, 1); + + static float minUV[] = {0.03126f, 0.06249f}; + static float maxUV[] = {0.39063f, 0.4374f}; + float scale = ((minecraft->height / 2) / 32) * 0.9f; + + glTranslatef(minecraft->width / 2.0f, 5.0f, 0.0f); + glScalef2(scale,scale,1); + t.begin(GL_QUADS); + t.vertexUV(-32, 0, 0.0f,minUV[0],minUV[1]); + t.vertexUV(32, 0, 0.0f, maxUV[0], minUV[1]); + t.vertexUV(32, 0 + 32, 0.0f, maxUV[0], maxUV[1]); + t.vertexUV(-32, 0 + 32, 0.0f, minUV[0], maxUV[1]); + t.draw(); + + sign->selectedLine = line; + float textScale = 8.0f / 11.0f; + + glTranslatef(0, 2 ,0); + glScalef2(textScale, textScale, 1); + for(int i = 0; i < 4; ++i) { + //drawCenteredString(font, sign->messages[a], 32.0f, 10 * a, 0xFF000000); + std::string msg = sign->messages[i]; + if (i == sign->selectedLine && msg.length() < 14) { + std::string s = "> " + msg + " <"; + font->draw(s, -(float)font->width(s) / 2.0f, 10.0f * i, 0xFF000000, false); + } else { + font->draw(msg, -(float)font->width(msg) / 2.0f, 10.0f * i, 0xFF000000, false); + } + } + sign->selectedLine = -1; + //font->draw("Hej", minecraft->width / 2, 100, 0xFFFFFFFF, false); + + glPopMatrix(); + glEnable(GL_CULL_FACE); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + + //glEnable(GL_DEPTH_TEST); + super::render(xm, ym, a); +} + +void TextEditScreen::lostFocus() { + +} + +void TextEditScreen::tick() { + frame++; +} + +void TextEditScreen::keyPressed( int eventKey ) { + LOGW("Key pressed! [%d]", eventKey); + if(eventKey == Keyboard::KEY_BACKSPACE) { + if(sign->messages[line].length() > 0) { + sign->messages[line].erase(sign->messages[line].size() - 1, 1); + } else { + line--; + if(line < 0) { + line = 3; + } + } + } else if(eventKey == Keyboard::KEY_RETURN) { + line = (line + 1) % 4; + } else { + super::keyPressed(eventKey); + } +} + +void TextEditScreen::keyboardNewChar( char inputChar ) { + std::string fullstring = sign->messages[line] + inputChar; + if(fullstring.length() < 16) { + sign->messages[line] = fullstring; + //LOGW("Line text updated: %s\n", fullstring.c_str()); + } +} + +void TextEditScreen::buttonClicked( Button* button ) { + if(button == &btnClose) + handleBackEvent(true); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/9CAB88584C535B15B7D916C84A38AB20 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/9CAB88584C535B15B7D916C84A38AB20 new file mode 100644 index 0000000..29d22b5 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/9CAB88584C535B15B7D916C84A38AB20 @@ -0,0 +1,12 @@ +#include "NetworkingHelpers.h" +#include "Minecraft.h" +#include "../network/ClientSideNetworkHandler.h" + +bool startConnect(Minecraft* mc, const std::string& host, int port) { + if (mc->netCallback) { + delete mc->netCallback; + mc->netCallback = nullptr; + } + mc->netCallback = new ClientSideNetworkHandler(mc, mc->raknetInstance); + return mc->raknetInstance->connect(host.c_str(), port); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/B7C280CFC54FAB70EF47DCF8A88BE777 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/B7C280CFC54FAB70EF47DCF8A88BE777 new file mode 100644 index 0000000..29d22b5 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/B7C280CFC54FAB70EF47DCF8A88BE777 @@ -0,0 +1,12 @@ +#include "NetworkingHelpers.h" +#include "Minecraft.h" +#include "../network/ClientSideNetworkHandler.h" + +bool startConnect(Minecraft* mc, const std::string& host, int port) { + if (mc->netCallback) { + delete mc->netCallback; + mc->netCallback = nullptr; + } + mc->netCallback = new ClientSideNetworkHandler(mc, mc->raknetInstance); + return mc->raknetInstance->connect(host.c_str(), port); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/BAF13EF543693A4C124DAFF8D5C4D1D6 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/BAF13EF543693A4C124DAFF8D5C4D1D6 new file mode 100644 index 0000000..964c789 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/BAF13EF543693A4C124DAFF8D5C4D1D6 @@ -0,0 +1,10 @@ +#ifndef NET_MINECRAFT_CLIENT_NETWORKING_HELPERS_H +#define NET_MINECRAFT_CLIENT_NETWORKING_HELPERS_H + +#include +class Minecraft; + +// Starts a connection to host:port. Returns true if the underlying connect call was started. +bool startConnect(Minecraft* mc, const std::string& host, int port); + +#endif // NET_MINECRAFT_CLIENT_NETWORKING_HELPERS_H diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/E19DC915D7B7F4D40A50F260C758DAD9 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/E19DC915D7B7F4D40A50F260C758DAD9 new file mode 100644 index 0000000..8b4d6da --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/56ED7CEF3F51D04B860C5C3AE55A74CB/E19DC915D7B7F4D40A50F260C758DAD9 @@ -0,0 +1,80 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI__Screen_H__ +#define NET_MINECRAFT_CLIENT_GUI__Screen_H__ + +//package net.minecraft.client.gui; + +#include +#include "GuiComponent.h" + +class Font; +class Minecraft; +class Button; +class TextBox; +struct IntRectangle; + +class Screen: public GuiComponent +{ +public: + Screen(); + + virtual void render(int xm, int ym, float a); + + void init(Minecraft* minecraft, int width, int height); + virtual void init(); + + void setSize(int width, int height); + virtual void setupPositions() {}; + + virtual void updateEvents(); + virtual void mouseEvent(); + virtual void keyboardEvent(); + virtual void keyboardTextEvent(); + virtual bool handleBackEvent(bool isDown); + + virtual void tick() {} + + virtual void removed() {} + + virtual void renderBackground(); + virtual void renderBackground(int vo); + virtual void renderDirtBackground(int vo); + // query + virtual bool renderGameBehind(); + virtual bool hasClippingArea(IntRectangle& out); + + virtual bool isPauseScreen(); + virtual bool isErrorScreen(); + virtual bool isInGameScreen(); + virtual bool closeOnPlayerHurt(); + + virtual void confirmResult(bool result, int id) {} + virtual void lostFocus(); + virtual void toGUICoordinate(int& x, int& y); +protected: + void updateTabButtonSelection(); + + virtual void buttonClicked(Button* button) {} + virtual void mouseClicked(int x, int y, int buttonNum); + virtual void mouseReleased(int x, int y, int buttonNum); + + virtual void keyPressed(int eventKey); + virtual void keyboardNewChar(char inputChar) {} +public: + int width; + int height; + bool passEvents; + //GuiParticles* particles; +protected: + Minecraft* minecraft; + std::vector buttons; + std::vector textBoxes; + + std::vector tabButtons; + int tabButtonIndex; + + Font* font; +private: + Button* clickedButton; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI__Screen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/0704CF50EB8E4DBF354AA795AF7BE395 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/0704CF50EB8E4DBF354AA795AF7BE395 new file mode 100644 index 0000000..ac89e2b --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/0704CF50EB8E4DBF354AA795AF7BE395 @@ -0,0 +1,167 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include "../../platform/log.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(id), w(0), h(0), x(0), y(0), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->showKeyboard(); + focused = true; + if (caretPos <0) caretPos =0; + if (caretPos > (int)text.length()) caretPos = (int)text.length(); + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->hideKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::setCaretPos(int p) { + if (p <0) p =0; + if (p > (int)text.length()) p = (int)text.length(); + caretPos = p; +} + +void TextBox::insertChar(char c) { + LOGW("TextBox::insertChar id=%d before='%s' caret=%d inserting='%c'(%d)", id, text.c_str(), caretPos, (c >=32 && c <127) ? c : '?', (int)(unsigned char)c); + text.insert(text.begin() + caretPos, c); + ++caretPos; + LOGW("TextBox::insertChar id=%d after='%s' caret=%d", id, text.c_str(), caretPos); +} + +void TextBox::backspaceAtCaret() { + LOGW("TextBox::backspaceAtCaret id=%d before='%s' caret=%d", id, text.c_str(), caretPos); + if (caretPos >0) { + text.erase(text.begin() + caretPos -1); + --caretPos; + LOGW("TextBox::backspaceAtCaret id=%d after='%s' caret=%d", id, text.c_str(), caretPos); + } else { + LOGW("TextBox::backspaceAtCaret id=%d no-op (caret==0)", id); + } +} + +void TextBox::deleteAtCaret() { + LOGW("TextBox::deleteAtCaret id=%d before='%s' caret=%d", id, text.c_str(), caretPos); + if (caretPos < (int)text.length()) { + text.erase(text.begin() + caretPos); + LOGW("TextBox::deleteAtCaret id=%d after='%s' caret=%d", id, text.c_str(), caretPos); + } else { + LOGW("TextBox::deleteAtCaret id=%d no-op (caret at end)", id); + } +} + +void TextBox::moveCaretLeft() { + if (caretPos >0) --caretPos; +} + +void TextBox::moveCaretRight() { + if (caretPos < (int)text.length()) ++caretPos; +} + +void TextBox::moveCaretHome() { caretPos =0; } +void TextBox::moveCaretEnd() { caretPos = (int)text.length(); } + +void TextBox::setCaretFromPixel(int px, Font* font) { + // Use font metrics to determine nearest character position + if (!font) { + // fallback to approximate + int relative = px - (x +4); + int pos = (relative >0) ? (relative /6) :0; + if (pos <0) pos =0; + if (pos > (int)text.length()) pos = (int)text.length(); + caretPos = pos; + return; + } + int rel = px - (x +4); + if (rel <=0) { caretPos =0; return; } + int best =0; + int bestDiff = INT_MAX; + for (int i =0; i <= (int)text.length(); ++i) { + int w = font->width(text.substr(0, i)); + int diff = abs(w - rel); + if (diff < bestDiff) { best = i; bestDiff = diff; } + if (w > rel && i >0 && diff > bestDiff) break; + } + if (best <0) best =0; + if (best > (int)text.length()) best = (int)text.length(); + caretPos = best; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + fill(x, y, x + w, y + h,0x80000000); + // Border - use different colors when focused + if (focused) { + fill(x, y, x + w, y +1,0xffa0c0ff); + fill(x, y + h -1, x + w, y + h,0xff4060a0); + fill(x, y, x +1, y + h,0xffa0c0ff); + fill(x + w -1, y, x + w, y + h,0xff4060a0); + } else { + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + } + + int color =0xe0e0e0; + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + int maxChars =1; + if (minecraft && minecraft->font) { + int avgCharWidth = minecraft->font->width(std::string("W")); + if (avgCharWidth <=0) avgCharWidth =6; + int avg = (w -8) / avgCharWidth; + if (avg > maxChars) maxChars = avg; + } else { + int calc = (w -8) /6; // approx6 px per char + if (calc > maxChars) maxChars = calc; + } + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); + + // Draw caret if focused + if (focused) { + int caretPixel = x +4; + if (minecraft && minecraft->font) { + caretPixel += minecraft->font->width(text.substr(0, caretPos)); + } else { + caretPixel += caretPos *6; + } + if (caretPixel > x + w -6) caretPixel = x + w -6; + // draw vertical1px line as caret + fill(caretPixel, y +3, caretPixel +1, y + h -4,0xFFFFFFFF); + } +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/1406A231F85DAACAFF1616D9570D2E7A b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/1406A231F85DAACAFF1616D9570D2E7A new file mode 100644 index 0000000..1834b6f --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/1406A231F85DAACAFF1616D9570D2E7A @@ -0,0 +1,157 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(id), w(0), h(0), x(0), y(0), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->showKeyboard(); + focused = true; + if (caretPos <0) caretPos =0; + if (caretPos > (int)text.length()) caretPos = (int)text.length(); + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->hideKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::setCaretPos(int p) { + if (p <0) p =0; + if (p > (int)text.length()) p = (int)text.length(); + caretPos = p; +} + +void TextBox::insertChar(char c) { + text.insert(text.begin() + caretPos, c); + ++caretPos; +} + +void TextBox::backspaceAtCaret() { + if (caretPos >0) { + text.erase(text.begin() + caretPos -1); + --caretPos; + } +} + +void TextBox::deleteAtCaret() { + if (caretPos < (int)text.length()) { + text.erase(text.begin() + caretPos); + } +} + +void TextBox::moveCaretLeft() { + if (caretPos >0) --caretPos; +} + +void TextBox::moveCaretRight() { + if (caretPos < (int)text.length()) ++caretPos; +} + +void TextBox::moveCaretHome() { caretPos =0; } +void TextBox::moveCaretEnd() { caretPos = (int)text.length(); } + +void TextBox::setCaretFromPixel(int px, Font* font) { + // Use font metrics to determine nearest character position + if (!font) { + // fallback to approximate + int relative = px - (x +4); + int pos = (relative >0) ? (relative /6) :0; + if (pos <0) pos =0; + if (pos > (int)text.length()) pos = (int)text.length(); + caretPos = pos; + return; + } + int rel = px - (x +4); + if (rel <=0) { caretPos =0; return; } + int best =0; + int bestDiff = INT_MAX; + for (int i =0; i <= (int)text.length(); ++i) { + int w = font->width(text.substr(0, i)); + int diff = abs(w - rel); + if (diff < bestDiff) { best = i; bestDiff = diff; } + // small optimization: if w > rel and diff growing, break + if (w > rel && i >0 && diff > bestDiff) break; + } + if (best <0) best =0; + if (best > (int)text.length()) best = (int)text.length(); + caretPos = best; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + fill(x, y, x + w, y + h,0x80000000); + // Border - use different colors when focused + if (focused) { + fill(x, y, x + w, y +1,0xffa0c0ff); + fill(x, y + h -1, x + w, y + h,0xff4060a0); + fill(x, y, x +1, y + h,0xffa0c0ff); + fill(x + w -1, y, x + w, y + h,0xff4060a0); + } else { + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + } + + int color =0xe0e0e0; + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + int maxChars =1; + if (minecraft && minecraft->font) { + int avgCharWidth = minecraft->font->width(std::string("W")); + if (avgCharWidth <=0) avgCharWidth =6; + int avg = (w -8) / avgCharWidth; + if (avg > maxChars) maxChars = avg; + } else { + int calc = (w -8) /6; // approx6 px per char + if (calc > maxChars) maxChars = calc; + } + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); + + // Draw caret if focused + if (focused) { + int caretPixel = x +4; + if (minecraft && minecraft->font) { + caretPixel += minecraft->font->width(text.substr(0, caretPos)); + } else { + caretPixel += caretPos *6; + } + if (caretPixel > x + w -6) caretPixel = x + w -6; + // draw vertical1px line as caret + fill(caretPixel, y +3, caretPixel +1, y + h -4,0xFFFFFFFF); + } +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/1D11F3CE27B0B595836AB483CC9A0B43 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/1D11F3CE27B0B595836AB483CC9A0B43 new file mode 100644 index 0000000..1834b6f --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/1D11F3CE27B0B595836AB483CC9A0B43 @@ -0,0 +1,157 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(id), w(0), h(0), x(0), y(0), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->showKeyboard(); + focused = true; + if (caretPos <0) caretPos =0; + if (caretPos > (int)text.length()) caretPos = (int)text.length(); + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->hideKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::setCaretPos(int p) { + if (p <0) p =0; + if (p > (int)text.length()) p = (int)text.length(); + caretPos = p; +} + +void TextBox::insertChar(char c) { + text.insert(text.begin() + caretPos, c); + ++caretPos; +} + +void TextBox::backspaceAtCaret() { + if (caretPos >0) { + text.erase(text.begin() + caretPos -1); + --caretPos; + } +} + +void TextBox::deleteAtCaret() { + if (caretPos < (int)text.length()) { + text.erase(text.begin() + caretPos); + } +} + +void TextBox::moveCaretLeft() { + if (caretPos >0) --caretPos; +} + +void TextBox::moveCaretRight() { + if (caretPos < (int)text.length()) ++caretPos; +} + +void TextBox::moveCaretHome() { caretPos =0; } +void TextBox::moveCaretEnd() { caretPos = (int)text.length(); } + +void TextBox::setCaretFromPixel(int px, Font* font) { + // Use font metrics to determine nearest character position + if (!font) { + // fallback to approximate + int relative = px - (x +4); + int pos = (relative >0) ? (relative /6) :0; + if (pos <0) pos =0; + if (pos > (int)text.length()) pos = (int)text.length(); + caretPos = pos; + return; + } + int rel = px - (x +4); + if (rel <=0) { caretPos =0; return; } + int best =0; + int bestDiff = INT_MAX; + for (int i =0; i <= (int)text.length(); ++i) { + int w = font->width(text.substr(0, i)); + int diff = abs(w - rel); + if (diff < bestDiff) { best = i; bestDiff = diff; } + // small optimization: if w > rel and diff growing, break + if (w > rel && i >0 && diff > bestDiff) break; + } + if (best <0) best =0; + if (best > (int)text.length()) best = (int)text.length(); + caretPos = best; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + fill(x, y, x + w, y + h,0x80000000); + // Border - use different colors when focused + if (focused) { + fill(x, y, x + w, y +1,0xffa0c0ff); + fill(x, y + h -1, x + w, y + h,0xff4060a0); + fill(x, y, x +1, y + h,0xffa0c0ff); + fill(x + w -1, y, x + w, y + h,0xff4060a0); + } else { + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + } + + int color =0xe0e0e0; + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + int maxChars =1; + if (minecraft && minecraft->font) { + int avgCharWidth = minecraft->font->width(std::string("W")); + if (avgCharWidth <=0) avgCharWidth =6; + int avg = (w -8) / avgCharWidth; + if (avg > maxChars) maxChars = avg; + } else { + int calc = (w -8) /6; // approx6 px per char + if (calc > maxChars) maxChars = calc; + } + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); + + // Draw caret if focused + if (focused) { + int caretPixel = x +4; + if (minecraft && minecraft->font) { + caretPixel += minecraft->font->width(text.substr(0, caretPos)); + } else { + caretPixel += caretPos *6; + } + if (caretPixel > x + w -6) caretPixel = x + w -6; + // draw vertical1px line as caret + fill(caretPixel, y +3, caretPixel +1, y + h -4,0xFFFFFFFF); + } +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/1ED8AE932CE1BDA50F885ADBE70D045E b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/1ED8AE932CE1BDA50F885ADBE70D045E new file mode 100644 index 0000000..c45276d --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/1ED8AE932CE1BDA50F885ADBE70D045E @@ -0,0 +1,80 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI__Screen_H__ +#define NET_MINECRAFT_CLIENT_GUI__Screen_H__ + +//package net.minecraft.client.gui; + +#include +#include "GuiComponent.h" + +class Font; +class Minecraft; +class Button; +class TextBox; +struct IntRectangle; + +class Screen: public GuiComponent +{ +public: + Screen(); + + virtual void render(int xm, int ym, float a); + + void init(Minecraft* minecraft, int width, int height); + virtual void init(); + + void setSize(int width, int height); + virtual void setupPositions() {}; + + virtual void updateEvents(); + virtual void mouseEvent(); + virtual void keyboardEvent(); + virtual void keyboardTextEvent(); + virtual bool handleBackEvent(bool isDown); + + virtual void tick() {} + + virtual void removed() {} + + virtual void renderBackground(); + virtual void renderBackground(int vo); + virtual void renderDirtBackground(int vo); + // query + virtual bool renderGameBehind(); + virtual bool hasClippingArea(IntRectangle& out); + + virtual bool isPauseScreen(); + virtual bool isErrorScreen(); + virtual bool isInGameScreen(); + virtual bool closeOnPlayerHurt(); + + virtual void confirmResult(bool result, int id) {} + virtual void lostFocus(); + virtual void toGUICoordinate(int& x, int& y); +protected: + void updateTabButtonSelection(); + + virtual void buttonClicked(Button* button) {} + virtual void mouseClicked(int x, int y, int buttonNum); + virtual void mouseReleased(int x, int y, int buttonNum); + + virtual void keyPressed(int eventKey); + virtual void keyboardNewChar(char inputChar); +public: + int width; + int height; + bool passEvents; + //GuiParticles* particles; +protected: + Minecraft* minecraft; + std::vector buttons; + std::vector textBoxes; + + std::vector tabButtons; + int tabButtonIndex; + + Font* font; +private: + Button* clickedButton; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI__Screen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/30F4982A7CB65826D0C97E3284BF007E b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/30F4982A7CB65826D0C97E3284BF007E new file mode 100644 index 0000000..fa477e9 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/30F4982A7CB65826D0C97E3284BF007E @@ -0,0 +1,332 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" +#include "../../platform/log.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 to avoid off-by-one in GUI mapping + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} + +// Forward typed character directly to focused textbox to avoid duplicate definitions +void Screen::keyboardTextEvent() +{ + char c = Keyboard::getChar(); + LOGW("keyboardTextEvent: char code=%d ('%c')", (int)(unsigned char)c, (c >=32 && c <127) ? c : '?'); + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + // Some platforms deliver backspace/delete as text characters. Handle control chars here. + if (c == (char)Keyboard::KEY_BACKSPACE || c ==8 || c ==127) { + LOGW("keyboardTextEvent: treating as BACKSPACE/delete"); + tb->backspaceAtCaret(); + } else if (c == (char)Keyboard::KEY_DELETE || c ==127) { + LOGW("keyboardTextEvent: treating as DELETE"); + tb->deleteAtCaret(); + } else if (c >=32) { + LOGW("keyboardTextEvent: inserting char '%c'", c); + tb->insertChar(c); + } + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +void Screen::keyPressed(int eventKey) +{ + LOGW("keyPressed: eventKey=%d", eventKey); + if (eventKey == Keyboard::KEY_ESCAPE) { + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + const int tabButtonCount = tabButtons.size(); + // NOTE: previously returned early when there were no tab buttons which prevented + // textbox key handling (backspace/delete). Do not return here — still allow + // focused textbox editing below even when tabButtonCount ==0. + + Options& o = minecraft->options; + if (tabButtonCount && eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (tabButtonCount && eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (tabButtonCount && eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Focused textbox editing + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + LOGW("keyPressed: BACKSPACE detected"); + tb->backspaceAtCaret(); + } + else if (eventKey == Keyboard::KEY_DELETE || eventKey ==127) { + LOGW("keyPressed: DELETE detected (eventKey=%d)", eventKey); + tb->deleteAtCaret(); + } + else if (eventKey == Keyboard::KEY_LEFT) { + LOGW("keyPressed: LEFT"); + tb->moveCaretLeft(); + } + else if (eventKey == Keyboard::KEY_RIGHT) { + LOGW("keyPressed: RIGHT"); + tb->moveCaretRight(); + } + else if (eventKey == Keyboard::KEY_HOME) { + LOGW("keyPressed: HOME"); + tb->moveCaretHome(); + } + else if (eventKey == Keyboard::KEY_END) { + LOGW("keyPressed: END"); + tb->moveCaretEnd(); + } + else if (eventKey == Keyboard::KEY_RETURN) { + LOGW("keyPressed: RETURN (defocus)"); + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // position caret based on click + tb->setCaretFromPixel(x, minecraft->font); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height; // removed -1 +} + +// Default implementation for character input (virtual) +void Screen::keyboardNewChar(char inputChar) { + // default: forward to focused textbox is handled in keyboardTextEvent; keep empty here + (void)inputChar; +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/430CC357A15D4BE1A70387A7C3462A3C b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/430CC357A15D4BE1A70387A7C3462A3C new file mode 100644 index 0000000..69cb84b --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/430CC357A15D4BE1A70387A7C3462A3C @@ -0,0 +1,331 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" +#include "../../platform/log.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 to avoid off-by-one in GUI mapping + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} + +// Forward typed character directly to focused textbox to avoid duplicate definitions +void Screen::keyboardTextEvent() +{ + char c = Keyboard::getChar(); + LOGW("keyboardTextEvent: char code=%d ('%c')", (int)(unsigned char)c, (c >=32 && c <127) ? c : '?'); + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + // Some platforms deliver backspace/delete as text characters. Handle control chars here. + if (c == (char)Keyboard::KEY_BACKSPACE || c ==8 || c ==127) { + LOGW("keyboardTextEvent: treating as BACKSPACE/delete"); + tb->backspaceAtCaret(); + } else if (c == (char)Keyboard::KEY_DELETE || c ==127) { + LOGW("keyboardTextEvent: treating as DELETE"); + tb->deleteAtCaret(); + } else if (c >=32) { + LOGW("keyboardTextEvent: inserting char '%c'", c); + tb->insertChar(c); + } + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +void Screen::keyPressed(int eventKey) +{ + LOGW("keyPressed: eventKey=%d", eventKey); + if (eventKey == Keyboard::KEY_ESCAPE) { + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Focused textbox editing + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + LOGW("keyPressed: BACKSPACE detected"); + tb->backspaceAtCaret(); + } + else if (eventKey == Keyboard::KEY_DELETE || eventKey ==127) { + LOGW("keyPressed: DELETE detected (eventKey=%d)", eventKey); + tb->deleteAtCaret(); + } + else if (eventKey == Keyboard::KEY_LEFT) { + LOGW("keyPressed: LEFT"); + tb->moveCaretLeft(); + } + else if (eventKey == Keyboard::KEY_RIGHT) { + LOGW("keyPressed: RIGHT"); + tb->moveCaretRight(); + } + else if (eventKey == Keyboard::KEY_HOME) { + LOGW("keyPressed: HOME"); + tb->moveCaretHome(); + } + else if (eventKey == Keyboard::KEY_END) { + LOGW("keyPressed: END"); + tb->moveCaretEnd(); + } + else if (eventKey == Keyboard::KEY_RETURN) { + LOGW("keyPressed: RETURN (defocus)"); + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // position caret based on click + tb->setCaretFromPixel(x, minecraft->font); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height; // removed -1 +} + +// Default implementation for character input (virtual) +void Screen::keyboardNewChar(char inputChar) { + // default: forward to focused textbox is handled in keyboardTextEvent; keep empty here + (void)inputChar; +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/66E663931952A3E4686DB380C8B39A06 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/66E663931952A3E4686DB380C8B39A06 new file mode 100644 index 0000000..69cb84b --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/66E663931952A3E4686DB380C8B39A06 @@ -0,0 +1,331 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" +#include "../../platform/log.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 to avoid off-by-one in GUI mapping + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} + +// Forward typed character directly to focused textbox to avoid duplicate definitions +void Screen::keyboardTextEvent() +{ + char c = Keyboard::getChar(); + LOGW("keyboardTextEvent: char code=%d ('%c')", (int)(unsigned char)c, (c >=32 && c <127) ? c : '?'); + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + // Some platforms deliver backspace/delete as text characters. Handle control chars here. + if (c == (char)Keyboard::KEY_BACKSPACE || c ==8 || c ==127) { + LOGW("keyboardTextEvent: treating as BACKSPACE/delete"); + tb->backspaceAtCaret(); + } else if (c == (char)Keyboard::KEY_DELETE || c ==127) { + LOGW("keyboardTextEvent: treating as DELETE"); + tb->deleteAtCaret(); + } else if (c >=32) { + LOGW("keyboardTextEvent: inserting char '%c'", c); + tb->insertChar(c); + } + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +void Screen::keyPressed(int eventKey) +{ + LOGW("keyPressed: eventKey=%d", eventKey); + if (eventKey == Keyboard::KEY_ESCAPE) { + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Focused textbox editing + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + LOGW("keyPressed: BACKSPACE detected"); + tb->backspaceAtCaret(); + } + else if (eventKey == Keyboard::KEY_DELETE || eventKey ==127) { + LOGW("keyPressed: DELETE detected (eventKey=%d)", eventKey); + tb->deleteAtCaret(); + } + else if (eventKey == Keyboard::KEY_LEFT) { + LOGW("keyPressed: LEFT"); + tb->moveCaretLeft(); + } + else if (eventKey == Keyboard::KEY_RIGHT) { + LOGW("keyPressed: RIGHT"); + tb->moveCaretRight(); + } + else if (eventKey == Keyboard::KEY_HOME) { + LOGW("keyPressed: HOME"); + tb->moveCaretHome(); + } + else if (eventKey == Keyboard::KEY_END) { + LOGW("keyPressed: END"); + tb->moveCaretEnd(); + } + else if (eventKey == Keyboard::KEY_RETURN) { + LOGW("keyPressed: RETURN (defocus)"); + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // position caret based on click + tb->setCaretFromPixel(x, minecraft->font); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height; // removed -1 +} + +// Default implementation for character input (virtual) +void Screen::keyboardNewChar(char inputChar) { + // default: forward to focused textbox is handled in keyboardTextEvent; keep empty here + (void)inputChar; +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/7919664E1905CDA82B1CD86D7E2003B5 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/7919664E1905CDA82B1CD86D7E2003B5 new file mode 100644 index 0000000..16847e8 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/7919664E1905CDA82B1CD86D7E2003B5 @@ -0,0 +1,373 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" +#include "../../platform/log.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL), + focusedTextBox(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 to avoid off-by-one in GUI mapping + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} + +// Forward typed character directly to focused textbox to avoid duplicate definitions +void Screen::keyboardTextEvent() +{ + char c = Keyboard::getChar(); + if (focusedTextBox && focusedTextBox->focused) { + TextBox* tb = focusedTextBox; + if (c == (char)Keyboard::KEY_BACKSPACE || c ==8 || c ==127) { + tb->backspaceAtCaret(); + } else if (c == (char)Keyboard::KEY_DELETE || c ==127) { + tb->deleteAtCaret(); + } else if (c >=32) { + tb->insertChar(c); + } + return; + } + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + // Some platforms deliver backspace/delete as text characters. Handle control chars here. + if (c == (char)Keyboard::KEY_BACKSPACE || c ==8 || c ==127) { + LOGW("keyboardTextEvent: treating as BACKSPACE/delete"); + tb->backspaceAtCaret(); + } else if (c == (char)Keyboard::KEY_DELETE || c ==127) { + LOGW("keyboardTextEvent: treating as DELETE"); + tb->deleteAtCaret(); + } else if (c >=32) { + LOGW("keyboardTextEvent: inserting char '%c'", c); + tb->insertChar(c); + } + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +void Screen::keyPressed(int eventKey) +{ + LOGW("keyPressed: eventKey=%d", eventKey); + if (eventKey == Keyboard::KEY_ESCAPE) { + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + const int tabButtonCount = tabButtons.size(); + // NOTE: previously returned early when there were no tab buttons which prevented + // textbox key handling (backspace/delete). Do not return here — still allow + // focused textbox editing below even when tabButtonCount ==0. + + Options& o = minecraft->options; + if (tabButtonCount && eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (tabButtonCount && eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (tabButtonCount && eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Focused textbox editing + if (focusedTextBox && focusedTextBox->focused) { + TextBox* tb = focusedTextBox; + if (eventKey == Keyboard::KEY_BACKSPACE || eventKey ==8) { + LOGW("keyPressed: BACKSPACE detected"); + tb->backspaceAtCaret(); + } else if (eventKey == Keyboard::KEY_DELETE || eventKey ==127 || eventKey ==46) { + LOGW("keyPressed: DELETE detected (eventKey=%d)", eventKey); + tb->deleteAtCaret(); + } else if (eventKey == Keyboard::KEY_LEFT) { + LOGW("keyPressed: LEFT"); + tb->moveCaretLeft(); + } else if (eventKey == Keyboard::KEY_RIGHT) { + LOGW("keyPressed: RIGHT"); + tb->moveCaretRight(); + } else if (eventKey == Keyboard::KEY_HOME) { + LOGW("keyPressed: HOME"); + tb->moveCaretHome(); + } else if (eventKey == Keyboard::KEY_END) { + LOGW("keyPressed: END"); + tb->moveCaretEnd(); + } else if (eventKey == Keyboard::KEY_RETURN) { + LOGW("keyPressed: RETURN (defocus)"); + tb->loseFocus(minecraft); + focusedTextBox = NULL; + } + return; + } + + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + LOGW("keyPressed: BACKSPACE detected (fallback)"); + tb->backspaceAtCaret(); + } + else if (eventKey == Keyboard::KEY_DELETE || eventKey ==127) { + LOGW("keyPressed: DELETE detected (fallback) (eventKey=%d)", eventKey); + tb->deleteAtCaret(); + } + else if (eventKey == Keyboard::KEY_LEFT) { + LOGW("keyPressed: LEFT (fallback)"); + tb->moveCaretLeft(); + } + else if (eventKey == Keyboard::KEY_RIGHT) { + LOGW("keyPressed: RIGHT (fallback)"); + tb->moveCaretRight(); + } + else if (eventKey == Keyboard::KEY_HOME) { + LOGW("keyPressed: HOME (fallback)"); + tb->moveCaretHome(); + } + else if (eventKey == Keyboard::KEY_END) { + LOGW("keyPressed: END (fallback)"); + tb->moveCaretEnd(); + } + else if (eventKey == Keyboard::KEY_RETURN) { + LOGW("keyPressed: RETURN (defocus) (fallback)"); + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + focusedTextBox = tb; + // position caret based on click + tb->setCaretFromPixel(x, minecraft->font); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + focusedTextBox = NULL; + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height; // removed -1 +} + +// Default implementation for character input (virtual) +void Screen::keyboardNewChar(char inputChar) { + // default: forward to focused textbox is handled in keyboardTextEvent; keep empty here + (void)inputChar; +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/94C7C45B3249617EDE2E7F760F1117A7 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/94C7C45B3249617EDE2E7F760F1117A7 new file mode 100644 index 0000000..fa477e9 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/94C7C45B3249617EDE2E7F760F1117A7 @@ -0,0 +1,332 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" +#include "../../platform/log.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 to avoid off-by-one in GUI mapping + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} + +// Forward typed character directly to focused textbox to avoid duplicate definitions +void Screen::keyboardTextEvent() +{ + char c = Keyboard::getChar(); + LOGW("keyboardTextEvent: char code=%d ('%c')", (int)(unsigned char)c, (c >=32 && c <127) ? c : '?'); + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + // Some platforms deliver backspace/delete as text characters. Handle control chars here. + if (c == (char)Keyboard::KEY_BACKSPACE || c ==8 || c ==127) { + LOGW("keyboardTextEvent: treating as BACKSPACE/delete"); + tb->backspaceAtCaret(); + } else if (c == (char)Keyboard::KEY_DELETE || c ==127) { + LOGW("keyboardTextEvent: treating as DELETE"); + tb->deleteAtCaret(); + } else if (c >=32) { + LOGW("keyboardTextEvent: inserting char '%c'", c); + tb->insertChar(c); + } + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +void Screen::keyPressed(int eventKey) +{ + LOGW("keyPressed: eventKey=%d", eventKey); + if (eventKey == Keyboard::KEY_ESCAPE) { + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + const int tabButtonCount = tabButtons.size(); + // NOTE: previously returned early when there were no tab buttons which prevented + // textbox key handling (backspace/delete). Do not return here — still allow + // focused textbox editing below even when tabButtonCount ==0. + + Options& o = minecraft->options; + if (tabButtonCount && eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (tabButtonCount && eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (tabButtonCount && eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Focused textbox editing + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + LOGW("keyPressed: BACKSPACE detected"); + tb->backspaceAtCaret(); + } + else if (eventKey == Keyboard::KEY_DELETE || eventKey ==127) { + LOGW("keyPressed: DELETE detected (eventKey=%d)", eventKey); + tb->deleteAtCaret(); + } + else if (eventKey == Keyboard::KEY_LEFT) { + LOGW("keyPressed: LEFT"); + tb->moveCaretLeft(); + } + else if (eventKey == Keyboard::KEY_RIGHT) { + LOGW("keyPressed: RIGHT"); + tb->moveCaretRight(); + } + else if (eventKey == Keyboard::KEY_HOME) { + LOGW("keyPressed: HOME"); + tb->moveCaretHome(); + } + else if (eventKey == Keyboard::KEY_END) { + LOGW("keyPressed: END"); + tb->moveCaretEnd(); + } + else if (eventKey == Keyboard::KEY_RETURN) { + LOGW("keyPressed: RETURN (defocus)"); + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // position caret based on click + tb->setCaretFromPixel(x, minecraft->font); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height; // removed -1 +} + +// Default implementation for character input (virtual) +void Screen::keyboardNewChar(char inputChar) { + // default: forward to focused textbox is handled in keyboardTextEvent; keep empty here + (void)inputChar; +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/A40938809224B8B582772D1E4AED62B5 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/A40938809224B8B582772D1E4AED62B5 new file mode 100644 index 0000000..0ade684 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/A40938809224B8B582772D1E4AED62B5 @@ -0,0 +1,83 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI__Screen_H__ +#define NET_MINECRAFT_CLIENT_GUI__Screen_H__ + +//package net.minecraft.client.gui; + +#include +#include "GuiComponent.h" + +class Font; +class Minecraft; +class Button; +class TextBox; +struct IntRectangle; + +class Screen: public GuiComponent +{ +public: + Screen(); + + virtual void render(int xm, int ym, float a); + + void init(Minecraft* minecraft, int width, int height); + virtual void init(); + + void setSize(int width, int height); + virtual void setupPositions() {}; + + virtual void updateEvents(); + virtual void mouseEvent(); + virtual void keyboardEvent(); + virtual void keyboardTextEvent(); + virtual bool handleBackEvent(bool isDown); + + virtual void tick() {} + + virtual void removed() {} + + virtual void renderBackground(); + virtual void renderBackground(int vo); + virtual void renderDirtBackground(int vo); + // query + virtual bool renderGameBehind(); + virtual bool hasClippingArea(IntRectangle& out); + + virtual bool isPauseScreen(); + virtual bool isErrorScreen(); + virtual bool isInGameScreen(); + virtual bool closeOnPlayerHurt(); + + virtual void confirmResult(bool result, int id) {} + virtual void lostFocus(); + virtual void toGUICoordinate(int& x, int& y); +protected: + void updateTabButtonSelection(); + + virtual void buttonClicked(Button* button) {} + virtual void mouseClicked(int x, int y, int buttonNum); + virtual void mouseReleased(int x, int y, int buttonNum); + + virtual void keyPressed(int eventKey); + virtual void keyboardNewChar(char inputChar); +public: + int width; + int height; + bool passEvents; + //GuiParticles* particles; +protected: + Minecraft* minecraft; + std::vector buttons; + std::vector textBoxes; + + std::vector tabButtons; + int tabButtonIndex; + + Font* font; + + // Track the currently focused TextBox for reliable editing + TextBox* focusedTextBox; +private: + Button* clickedButton; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI__Screen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/E19DC915D7B7F4D40A50F260C758DAD9 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/E19DC915D7B7F4D40A50F260C758DAD9 new file mode 100644 index 0000000..c45276d --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/61C226EA5CC5A346ABD19D208E88DDD3/E19DC915D7B7F4D40A50F260C758DAD9 @@ -0,0 +1,80 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI__Screen_H__ +#define NET_MINECRAFT_CLIENT_GUI__Screen_H__ + +//package net.minecraft.client.gui; + +#include +#include "GuiComponent.h" + +class Font; +class Minecraft; +class Button; +class TextBox; +struct IntRectangle; + +class Screen: public GuiComponent +{ +public: + Screen(); + + virtual void render(int xm, int ym, float a); + + void init(Minecraft* minecraft, int width, int height); + virtual void init(); + + void setSize(int width, int height); + virtual void setupPositions() {}; + + virtual void updateEvents(); + virtual void mouseEvent(); + virtual void keyboardEvent(); + virtual void keyboardTextEvent(); + virtual bool handleBackEvent(bool isDown); + + virtual void tick() {} + + virtual void removed() {} + + virtual void renderBackground(); + virtual void renderBackground(int vo); + virtual void renderDirtBackground(int vo); + // query + virtual bool renderGameBehind(); + virtual bool hasClippingArea(IntRectangle& out); + + virtual bool isPauseScreen(); + virtual bool isErrorScreen(); + virtual bool isInGameScreen(); + virtual bool closeOnPlayerHurt(); + + virtual void confirmResult(bool result, int id) {} + virtual void lostFocus(); + virtual void toGUICoordinate(int& x, int& y); +protected: + void updateTabButtonSelection(); + + virtual void buttonClicked(Button* button) {} + virtual void mouseClicked(int x, int y, int buttonNum); + virtual void mouseReleased(int x, int y, int buttonNum); + + virtual void keyPressed(int eventKey); + virtual void keyboardNewChar(char inputChar); +public: + int width; + int height; + bool passEvents; + //GuiParticles* particles; +protected: + Minecraft* minecraft; + std::vector buttons; + std::vector textBoxes; + + std::vector tabButtons; + int tabButtonIndex; + + Font* font; +private: + Button* clickedButton; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI__Screen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/70FBAC2FAD5EB44D9E1FC5701B9ADF4E/08F8DAF032036A96B22732C2A9C229D4 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/70FBAC2FAD5EB44D9E1FC5701B9ADF4E/08F8DAF032036A96B22732C2A9C229D4 new file mode 100644 index 0000000..83b6135 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/70FBAC2FAD5EB44D9E1FC5701B9ADF4E/08F8DAF032036A96B22732C2A9C229D4 @@ -0,0 +1,139 @@ +#ifndef KEYBOARD_H__ +#define KEYBOARD_H__ + +#include + +/** A keyboard action; key-down or key-up */ +class KeyboardAction +{ +public: + static const int KEYUP = 0; + static const int KEYDOWN = 1; + + KeyboardAction(unsigned char keyCode, int state) { + this->key = keyCode; + this->state = state; + } + + int state; + unsigned char key; +}; + +/* Iterators */ +typedef std::vector KeyboardActionVec; +typedef KeyboardActionVec::iterator KeyboardActionIt; +typedef KeyboardActionVec::const_iterator KeyboardActionCIt; + +/** A static keyboard class, written to resemble the one in lwjgl somewhat */ +class Keyboard +{ +public: + static const int KEY_A = 65; + static const int KEY_B = 66; + static const int KEY_C = 67; + static const int KEY_D = 68; + static const int KEY_E = 69; + static const int KEY_F = 70; + static const int KEY_G = 71; + static const int KEY_H = 72; + static const int KEY_I = 73; + static const int KEY_J = 74; + static const int KEY_K = 75; + static const int KEY_L = 76; + static const int KEY_M = 77; + static const int KEY_N = 78; + static const int KEY_O = 79; + static const int KEY_P = 80; + static const int KEY_Q = 81; + static const int KEY_R = 82; + static const int KEY_S = 83; + static const int KEY_T = 84; + static const int KEY_U = 85; + static const int KEY_V = 86; + static const int KEY_W = 87; + static const int KEY_X = 88; + static const int KEY_Y = 89; + static const int KEY_Z = 90; + + static const int KEY_BACKSPACE = 8; + static const int KEY_RETURN = 13; + // Delete key (use VK_DELETE / common code46) + static const int KEY_DELETE = 46; + + static const int KEY_F1 = 112; + static const int KEY_F2 = 113; + static const int KEY_F3 = 114; + static const int KEY_F4 = 115; + static const int KEY_F5 = 116; + static const int KEY_F6 = 117; + static const int KEY_F7 = 118; + static const int KEY_F8 = 119; + static const int KEY_F9 = 120; + static const int KEY_F10 = 121; + static const int KEY_F11 = 122; + static const int KEY_F12 = 123; + + static const int KEY_ESCAPE = 27; + static const int KEY_SPACE = 32; + static const int KEY_LSHIFT = 10; + + static bool isKeyDown(int keyCode) { + return _states[keyCode] == KeyboardAction::KEYDOWN; + } + + static void reset() { + _inputs.clear(); + _inputText.clear(); + _index = -1; + _textIndex = -1; + } + + static void feed(unsigned char keyCode, int state) { + _inputs.push_back(KeyboardAction(keyCode, state)); + + _states[keyCode] = state; + } + static void feedText(char character) { + _inputText.push_back(character); + } + + static bool next() { + if (_index + 1 >= (int)_inputs.size()) + return false; + + ++_index; + return true; + } + + static bool nextTextChar() { + if(_textIndex + 1 >= (int)_inputText.size()) + return false; + ++_textIndex; + return true; + } + + static void rewind() { + _index = -1; + _textIndex = -1; + } + + static int getEventKey() { + return _inputs[_index].key; + } + + static int getEventKeyState() { + return _inputs[_index].state; + } + static char getChar() { + return _inputText[_textIndex]; + } +private: + static int _index; + static int _textIndex; + static int _states[256]; + static std::vector _inputs; + static std::vector _inputText; + static bool _inited; +}; + +#endif//KEYBOARD_H__ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/70FBAC2FAD5EB44D9E1FC5701B9ADF4E/1CC65E0062271217494E8E6A4C0A58CE b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/70FBAC2FAD5EB44D9E1FC5701B9ADF4E/1CC65E0062271217494E8E6A4C0A58CE new file mode 100644 index 0000000..bfd810c --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/70FBAC2FAD5EB44D9E1FC5701B9ADF4E/1CC65E0062271217494E8E6A4C0A58CE @@ -0,0 +1,34 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ +#define NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ + +//package net.minecraft.client.gui; + +#include +#include "../GuiComponent.h" +#include "../../Options.h" + +class Font; +class Minecraft; + +class TextBox: public GuiComponent +{ +public: + TextBox(int id, const std::string& msg); + TextBox(int id, int x, int y, const std::string& msg); + TextBox(int id, int x, int y, int w, int h, const std::string& msg); + + virtual void setFocus(Minecraft* minecraft); + virtual bool loseFocus(Minecraft* minecraft); + + virtual void render(Minecraft* minecraft, int xm, int ym); + +public: + int w, h; + int x, y; + + std::string text; + int id; + bool focused; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/70FBAC2FAD5EB44D9E1FC5701B9ADF4E/1D11F3CE27B0B595836AB483CC9A0B43 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/70FBAC2FAD5EB44D9E1FC5701B9ADF4E/1D11F3CE27B0B595836AB483CC9A0B43 new file mode 100644 index 0000000..4adf7ad --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/70FBAC2FAD5EB44D9E1FC5701B9ADF4E/1D11F3CE27B0B595836AB483CC9A0B43 @@ -0,0 +1,77 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(id), w(0), h(0), x(0), y(0), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg), focused(false) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->showKeyboard(); + focused = true; + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->hideKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + // Slightly translucent dark background + fill(x, y, x + w, y + h,0x80000000); + // Border - use different colors when focused + if (focused) { + fill(x, y, x + w, y +1,0xffa0c0ff); + fill(x, y + h -1, x + w, y + h,0xff4060a0); + fill(x, y, x +1, y + h,0xffa0c0ff); + fill(x + w -1, y, x + w, y + h,0xff4060a0); + } else { + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + } + + // Draw text. If textbox contains the placeholder (no focus and text equals initial msg), draw dim color + int color =0xe0e0e0; + // If not focused and text is empty or equals default placeholder, draw dimmed + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + // measure available width approximated by character count + int calc = (w -8) /6; // approx6 px per char + int maxChars =1; + if (calc > maxChars) maxChars = calc; + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/70FBAC2FAD5EB44D9E1FC5701B9ADF4E/430CC357A15D4BE1A70387A7C3462A3C b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/70FBAC2FAD5EB44D9E1FC5701B9ADF4E/430CC357A15D4BE1A70387A7C3462A3C new file mode 100644 index 0000000..81e0443 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/70FBAC2FAD5EB44D9E1FC5701B9ADF4E/430CC357A15D4BE1A70387A7C3462A3C @@ -0,0 +1,295 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 to avoid off-by-one in GUI mapping + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} + +// Forward typed character directly to focused textbox to avoid duplicate definitions +void Screen::keyboardTextEvent() +{ + char c = Keyboard::getChar(); + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (c >=32) tb->text.push_back(c); + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Handle backspace for focused textbox + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE || eventKey == Keyboard::KEY_DELETE) { + if (!tb->text.empty()) tb->text.erase(tb->text.size() -1,1); + } + // Enter/Return will defocus the textbox + if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height; // removed -1 +} + +// Default implementation for character input (virtual) +void Screen::keyboardNewChar(char inputChar) { + // default: forward to focused textbox is handled in keyboardTextEvent; keep empty here + (void)inputChar; +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/70FBAC2FAD5EB44D9E1FC5701B9ADF4E/54C3D092590E659C56D92B5E55C142BA b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/70FBAC2FAD5EB44D9E1FC5701B9ADF4E/54C3D092590E659C56D92B5E55C142BA new file mode 100644 index 0000000..446559d --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/70FBAC2FAD5EB44D9E1FC5701B9ADF4E/54C3D092590E659C56D92B5E55C142BA @@ -0,0 +1,147 @@ +#include "TextEditScreen.h" +#include "../../../world/level/tile/entity/SignTileEntity.h" +#include "../../../AppPlatform.h" +#include "../../Minecraft.h" +#include "../../renderer/tileentity/TileEntityRenderDispatcher.h" +#include "../../renderer/Tesselator.h" +#include "../../renderer/Textures.h" +#include "../../renderer/GameRenderer.h" +#include "../components/Button.h" +#include "../../../network/Packet.h" +#include "../../../network/RakNetInstance.h" + +TextEditScreen::TextEditScreen( SignTileEntity* signEntity ) + : sign(signEntity), isShowingKeyboard(false), frame(0), line(0), btnClose(1, "") { + +} +TextEditScreen::~TextEditScreen() { + +} +void TextEditScreen::init() { + super::init(); + minecraft->platform()->showKeyboard(); + isShowingKeyboard = true; + ImageDef def; + def.name = "gui/spritesheet.png"; + def.x =0; + def.y =1; + def.width = def.height =18; + def.setSrc(IntRectangle(60,0,18,18)); + btnClose.setImageDef(def, true); + btnClose.scaleWhenPressed = false; + buttons.push_back(&btnClose); +} + +void TextEditScreen::setupPositions() { + btnClose.width = btnClose.height =19; + btnClose.x = width - btnClose.width; + btnClose.y =0; +} + + +bool TextEditScreen::handleBackEvent( bool isDown ) { + sign->setChanged(); + Packet* signUpdatePacket = sign->getUpdatePacket(); + minecraft->raknetInstance->send(signUpdatePacket); + minecraft->platform()->hideKeyboard(); + minecraft->setScreen(NULL); + return true; +} + +void TextEditScreen::render( int xm, int ym, float a ) { + glDepthMask(GL_FALSE); + renderBackground(); + glPushMatrix(); + glDepthMask(GL_TRUE); + glDisable(GL_CULL_FACE); + glLoadIdentity(); + Tesselator& t = Tesselator::instance; + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrthof(0.0f, (float)minecraft->width, (float)minecraft->height,0, -1,1); + glMatrixMode(GL_MODELVIEW); + + minecraft->textures->loadAndBindTexture("item/sign.png"); + glColor4f2(1,1,1,1); + + static float minUV[] = {0.03126f,0.06249f}; + static float maxUV[] = {0.39063f,0.4374f}; + float scale = ((minecraft->height /2) /32) *0.9f; + + glTranslatef(minecraft->width /2.0f,5.0f,0.0f); + glScalef2(scale,scale,1); + t.begin(GL_QUADS); + t.vertexUV(-32,0,0.0f,minUV[0],minUV[1]); + t.vertexUV(32,0,0.0f, maxUV[0], minUV[1]); + t.vertexUV(32,0 +32,0.0f, maxUV[0], maxUV[1]); + t.vertexUV(-32,0 +32,0.0f, minUV[0], maxUV[1]); + t.draw(); + + sign->selectedLine = line; + float textScale =8.0f /11.0f; + + glTranslatef(0,2 ,0); + glScalef2(textScale, textScale,1); + for(int i =0; i <4; ++i) { + //drawCenteredString(font, sign->messages[a],32.0f,10 * a,0xFF000000); + std::string msg = sign->messages[i]; + if (i == sign->selectedLine && msg.length() <14) { + std::string s = "> " + msg + " <"; + font->draw(s, -(float)font->width(s) /2.0f,10.0f * i,0xFF000000, false); + } else { + font->draw(msg, -(float)font->width(msg) /2.0f,10.0f * i,0xFF000000, false); + } + } + sign->selectedLine = -1; + //font->draw("Hej", minecraft->width /2,100,0xFFFFFFFF, false); + + glPopMatrix(); + glEnable(GL_CULL_FACE); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + + //glEnable(GL_DEPTH_TEST); + super::render(xm, ym, a); +} + +void TextEditScreen::lostFocus() { + +} + +void TextEditScreen::tick() { + frame++; +} + +void TextEditScreen::keyPressed( int eventKey ) { + LOGW("Key pressed! [%d]", eventKey); + if(eventKey == Keyboard::KEY_BACKSPACE || eventKey == Keyboard::KEY_DELETE) { + if(sign->messages[line].length() >0) { + sign->messages[line].erase(sign->messages[line].size() -1,1); + } else { + line--; + if(line <0) { + line =3; + } + } + } else if(eventKey == Keyboard::KEY_RETURN) { + line = (line +1) %4; + } else { + super::keyPressed(eventKey); + } +} + +void TextEditScreen::keyboardNewChar( char inputChar ) { + std::string fullstring = sign->messages[line] + inputChar; + if(fullstring.length() <16) { + sign->messages[line] = fullstring; + //LOGW("Line text updated: %s\n", fullstring.c_str()); + } +} + +void TextEditScreen::buttonClicked( Button* button ) { + if(button == &btnClose) + handleBackEvent(true); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/70FBAC2FAD5EB44D9E1FC5701B9ADF4E/572513C3D8D309B3634C045C3C8FAC54 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/70FBAC2FAD5EB44D9E1FC5701B9ADF4E/572513C3D8D309B3634C045C3C8FAC54 new file mode 100644 index 0000000..2dd50b2 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/70FBAC2FAD5EB44D9E1FC5701B9ADF4E/572513C3D8D309B3634C045C3C8FAC54 @@ -0,0 +1,139 @@ +#ifndef KEYBOARD_H__ +#define KEYBOARD_H__ + +#include + +/** A keyboard action; key-down or key-up */ +class KeyboardAction +{ +public: + static const int KEYUP = 0; + static const int KEYDOWN = 1; + + KeyboardAction(unsigned char keyCode, int state) { + this->key = keyCode; + this->state = state; + } + + int state; + unsigned char key; +}; + +/* Iterators */ +typedef std::vector KeyboardActionVec; +typedef KeyboardActionVec::iterator KeyboardActionIt; +typedef KeyboardActionVec::const_iterator KeyboardActionCIt; + +/** A static keyboard class, written to resemble the one in lwjgl somewhat */ +class Keyboard +{ +public: + static const int KEY_A = 65; + static const int KEY_B = 66; + static const int KEY_C = 67; + static const int KEY_D = 68; + static const int KEY_E = 69; + static const int KEY_F = 70; + static const int KEY_G = 71; + static const int KEY_H = 72; + static const int KEY_I = 73; + static const int KEY_J = 74; + static const int KEY_K = 75; + static const int KEY_L = 76; + static const int KEY_M = 77; + static const int KEY_N = 78; + static const int KEY_O = 79; + static const int KEY_P = 80; + static const int KEY_Q = 81; + static const int KEY_R = 82; + static const int KEY_S = 83; + static const int KEY_T = 84; + static const int KEY_U = 85; + static const int KEY_V = 86; + static const int KEY_W = 87; + static const int KEY_X = 88; + static const int KEY_Y = 89; + static const int KEY_Z = 90; + + static const int KEY_BACKSPACE = 8; + static const int KEY_RETURN = 13; + + static const int KEY_DELETE = 127; // Delete key (ASCII DEL) + + static const int KEY_F1 = 112; + static const int KEY_F2 = 113; + static const int KEY_F3 = 114; + static const int KEY_F4 = 115; + static const int KEY_F5 = 116; + static const int KEY_F6 = 117; + static const int KEY_F7 = 118; + static const int KEY_F8 = 119; + static const int KEY_F9 = 120; + static const int KEY_F10 = 121; + static const int KEY_F11 = 122; + static const int KEY_F12 = 123; + + static const int KEY_ESCAPE = 27; + static const int KEY_SPACE = 32; + static const int KEY_LSHIFT = 10; + + static bool isKeyDown(int keyCode) { + return _states[keyCode] == KeyboardAction::KEYDOWN; + } + + static void reset() { + _inputs.clear(); + _inputText.clear(); + _index = -1; + _textIndex = -1; + } + + static void feed(unsigned char keyCode, int state) { + _inputs.push_back(KeyboardAction(keyCode, state)); + + _states[keyCode] = state; + } + static void feedText(char character) { + _inputText.push_back(character); + } + + static bool next() { + if (_index + 1 >= (int)_inputs.size()) + return false; + + ++_index; + return true; + } + + static bool nextTextChar() { + if(_textIndex + 1 >= (int)_inputText.size()) + return false; + ++_textIndex; + return true; + } + + static void rewind() { + _index = -1; + _textIndex = -1; + } + + static int getEventKey() { + return _inputs[_index].key; + } + + static int getEventKeyState() { + return _inputs[_index].state; + } + static char getChar() { + return _inputText[_textIndex]; + } +private: + static int _index; + static int _textIndex; + static int _states[256]; + static std::vector _inputs; + static std::vector _inputText; + static bool _inited; +}; + +#endif//KEYBOARD_H__ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/70FBAC2FAD5EB44D9E1FC5701B9ADF4E/83105CECE6AA00603D9DA1057156A4A0 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/70FBAC2FAD5EB44D9E1FC5701B9ADF4E/83105CECE6AA00603D9DA1057156A4A0 new file mode 100644 index 0000000..55155fc --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/70FBAC2FAD5EB44D9E1FC5701B9ADF4E/83105CECE6AA00603D9DA1057156A4A0 @@ -0,0 +1,146 @@ +#include "TextEditScreen.h" +#include "../../../world/level/tile/entity/SignTileEntity.h" +#include "../../../AppPlatform.h" +#include "../../Minecraft.h" +#include "../../renderer/tileentity/TileEntityRenderDispatcher.h" +#include "../../renderer/Tesselator.h" +#include "../../renderer/Textures.h" +#include "../../renderer/GameRenderer.h" +#include "../components/Button.h" +#include "../../../network/Packet.h" +#include "../../../network/RakNetInstance.h" +TextEditScreen::TextEditScreen( SignTileEntity* signEntity ) + : sign(signEntity), isShowingKeyboard(false), frame(0), line(0), btnClose(1, "") { + +} +TextEditScreen::~TextEditScreen() { + +} +void TextEditScreen::init() { + super::init(); + minecraft->platform()->showKeyboard(); + isShowingKeyboard = true; + ImageDef def; + def.name = "gui/spritesheet.png"; + def.x = 0; + def.y = 1; + def.width = def.height = 18; + def.setSrc(IntRectangle(60, 0, 18, 18)); + btnClose.setImageDef(def, true); + btnClose.scaleWhenPressed = false; + buttons.push_back(&btnClose); +} + +void TextEditScreen::setupPositions() { + btnClose.width = btnClose.height = 19; + btnClose.x = width - btnClose.width; + btnClose.y = 0; +} + + +bool TextEditScreen::handleBackEvent( bool isDown ) { + sign->setChanged(); + Packet* signUpdatePacket = sign->getUpdatePacket(); + minecraft->raknetInstance->send(signUpdatePacket); + minecraft->platform()->hideKeyboard(); + minecraft->setScreen(NULL); + return true; +} + +void TextEditScreen::render( int xm, int ym, float a ) { + glDepthMask(GL_FALSE); + renderBackground(); + glPushMatrix(); + glDepthMask(GL_TRUE); + glDisable(GL_CULL_FACE); + glLoadIdentity(); + Tesselator& t = Tesselator::instance; + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrthof(0.0f, (float)minecraft->width, (float)minecraft->height, 0, -1, 1); + glMatrixMode(GL_MODELVIEW); + + minecraft->textures->loadAndBindTexture("item/sign.png"); + glColor4f2(1, 1, 1, 1); + + static float minUV[] = {0.03126f, 0.06249f}; + static float maxUV[] = {0.39063f, 0.4374f}; + float scale = ((minecraft->height / 2) / 32) * 0.9f; + + glTranslatef(minecraft->width / 2.0f, 5.0f, 0.0f); + glScalef2(scale,scale,1); + t.begin(GL_QUADS); + t.vertexUV(-32, 0, 0.0f,minUV[0],minUV[1]); + t.vertexUV(32, 0, 0.0f, maxUV[0], minUV[1]); + t.vertexUV(32, 0 + 32, 0.0f, maxUV[0], maxUV[1]); + t.vertexUV(-32, 0 + 32, 0.0f, minUV[0], maxUV[1]); + t.draw(); + + sign->selectedLine = line; + float textScale = 8.0f / 11.0f; + + glTranslatef(0, 2 ,0); + glScalef2(textScale, textScale, 1); + for(int i = 0; i < 4; ++i) { + //drawCenteredString(font, sign->messages[a], 32.0f, 10 * a, 0xFF000000); + std::string msg = sign->messages[i]; + if (i == sign->selectedLine && msg.length() < 14) { + std::string s = "> " + msg + " <"; + font->draw(s, -(float)font->width(s) / 2.0f, 10.0f * i, 0xFF000000, false); + } else { + font->draw(msg, -(float)font->width(msg) / 2.0f, 10.0f * i, 0xFF000000, false); + } + } + sign->selectedLine = -1; + //font->draw("Hej", minecraft->width / 2, 100, 0xFFFFFFFF, false); + + glPopMatrix(); + glEnable(GL_CULL_FACE); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + + //glEnable(GL_DEPTH_TEST); + super::render(xm, ym, a); +} + +void TextEditScreen::lostFocus() { + +} + +void TextEditScreen::tick() { + frame++; +} + +void TextEditScreen::keyPressed( int eventKey ) { + LOGW("Key pressed! [%d]", eventKey); + if(eventKey == Keyboard::KEY_BACKSPACE) { + if(sign->messages[line].length() > 0) { + sign->messages[line].erase(sign->messages[line].size() - 1, 1); + } else { + line--; + if(line < 0) { + line = 3; + } + } + } else if(eventKey == Keyboard::KEY_RETURN) { + line = (line + 1) % 4; + } else { + super::keyPressed(eventKey); + } +} + +void TextEditScreen::keyboardNewChar( char inputChar ) { + std::string fullstring = sign->messages[line] + inputChar; + if(fullstring.length() < 16) { + sign->messages[line] = fullstring; + //LOGW("Line text updated: %s\n", fullstring.c_str()); + } +} + +void TextEditScreen::buttonClicked( Button* button ) { + if(button == &btnClose) + handleBackEvent(true); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/70FBAC2FAD5EB44D9E1FC5701B9ADF4E/8966291C4D4BA66E25AE8C2B7E87D557 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/70FBAC2FAD5EB44D9E1FC5701B9ADF4E/8966291C4D4BA66E25AE8C2B7E87D557 new file mode 100644 index 0000000..55155fc --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/70FBAC2FAD5EB44D9E1FC5701B9ADF4E/8966291C4D4BA66E25AE8C2B7E87D557 @@ -0,0 +1,146 @@ +#include "TextEditScreen.h" +#include "../../../world/level/tile/entity/SignTileEntity.h" +#include "../../../AppPlatform.h" +#include "../../Minecraft.h" +#include "../../renderer/tileentity/TileEntityRenderDispatcher.h" +#include "../../renderer/Tesselator.h" +#include "../../renderer/Textures.h" +#include "../../renderer/GameRenderer.h" +#include "../components/Button.h" +#include "../../../network/Packet.h" +#include "../../../network/RakNetInstance.h" +TextEditScreen::TextEditScreen( SignTileEntity* signEntity ) + : sign(signEntity), isShowingKeyboard(false), frame(0), line(0), btnClose(1, "") { + +} +TextEditScreen::~TextEditScreen() { + +} +void TextEditScreen::init() { + super::init(); + minecraft->platform()->showKeyboard(); + isShowingKeyboard = true; + ImageDef def; + def.name = "gui/spritesheet.png"; + def.x = 0; + def.y = 1; + def.width = def.height = 18; + def.setSrc(IntRectangle(60, 0, 18, 18)); + btnClose.setImageDef(def, true); + btnClose.scaleWhenPressed = false; + buttons.push_back(&btnClose); +} + +void TextEditScreen::setupPositions() { + btnClose.width = btnClose.height = 19; + btnClose.x = width - btnClose.width; + btnClose.y = 0; +} + + +bool TextEditScreen::handleBackEvent( bool isDown ) { + sign->setChanged(); + Packet* signUpdatePacket = sign->getUpdatePacket(); + minecraft->raknetInstance->send(signUpdatePacket); + minecraft->platform()->hideKeyboard(); + minecraft->setScreen(NULL); + return true; +} + +void TextEditScreen::render( int xm, int ym, float a ) { + glDepthMask(GL_FALSE); + renderBackground(); + glPushMatrix(); + glDepthMask(GL_TRUE); + glDisable(GL_CULL_FACE); + glLoadIdentity(); + Tesselator& t = Tesselator::instance; + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrthof(0.0f, (float)minecraft->width, (float)minecraft->height, 0, -1, 1); + glMatrixMode(GL_MODELVIEW); + + minecraft->textures->loadAndBindTexture("item/sign.png"); + glColor4f2(1, 1, 1, 1); + + static float minUV[] = {0.03126f, 0.06249f}; + static float maxUV[] = {0.39063f, 0.4374f}; + float scale = ((minecraft->height / 2) / 32) * 0.9f; + + glTranslatef(minecraft->width / 2.0f, 5.0f, 0.0f); + glScalef2(scale,scale,1); + t.begin(GL_QUADS); + t.vertexUV(-32, 0, 0.0f,minUV[0],minUV[1]); + t.vertexUV(32, 0, 0.0f, maxUV[0], minUV[1]); + t.vertexUV(32, 0 + 32, 0.0f, maxUV[0], maxUV[1]); + t.vertexUV(-32, 0 + 32, 0.0f, minUV[0], maxUV[1]); + t.draw(); + + sign->selectedLine = line; + float textScale = 8.0f / 11.0f; + + glTranslatef(0, 2 ,0); + glScalef2(textScale, textScale, 1); + for(int i = 0; i < 4; ++i) { + //drawCenteredString(font, sign->messages[a], 32.0f, 10 * a, 0xFF000000); + std::string msg = sign->messages[i]; + if (i == sign->selectedLine && msg.length() < 14) { + std::string s = "> " + msg + " <"; + font->draw(s, -(float)font->width(s) / 2.0f, 10.0f * i, 0xFF000000, false); + } else { + font->draw(msg, -(float)font->width(msg) / 2.0f, 10.0f * i, 0xFF000000, false); + } + } + sign->selectedLine = -1; + //font->draw("Hej", minecraft->width / 2, 100, 0xFFFFFFFF, false); + + glPopMatrix(); + glEnable(GL_CULL_FACE); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + + //glEnable(GL_DEPTH_TEST); + super::render(xm, ym, a); +} + +void TextEditScreen::lostFocus() { + +} + +void TextEditScreen::tick() { + frame++; +} + +void TextEditScreen::keyPressed( int eventKey ) { + LOGW("Key pressed! [%d]", eventKey); + if(eventKey == Keyboard::KEY_BACKSPACE) { + if(sign->messages[line].length() > 0) { + sign->messages[line].erase(sign->messages[line].size() - 1, 1); + } else { + line--; + if(line < 0) { + line = 3; + } + } + } else if(eventKey == Keyboard::KEY_RETURN) { + line = (line + 1) % 4; + } else { + super::keyPressed(eventKey); + } +} + +void TextEditScreen::keyboardNewChar( char inputChar ) { + std::string fullstring = sign->messages[line] + inputChar; + if(fullstring.length() < 16) { + sign->messages[line] = fullstring; + //LOGW("Line text updated: %s\n", fullstring.c_str()); + } +} + +void TextEditScreen::buttonClicked( Button* button ) { + if(button == &btnClose) + handleBackEvent(true); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/70FBAC2FAD5EB44D9E1FC5701B9ADF4E/A4DF6DD5D716AB2D0B4FAB683F8B4963 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/70FBAC2FAD5EB44D9E1FC5701B9ADF4E/A4DF6DD5D716AB2D0B4FAB683F8B4963 new file mode 100644 index 0000000..2dd50b2 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/70FBAC2FAD5EB44D9E1FC5701B9ADF4E/A4DF6DD5D716AB2D0B4FAB683F8B4963 @@ -0,0 +1,139 @@ +#ifndef KEYBOARD_H__ +#define KEYBOARD_H__ + +#include + +/** A keyboard action; key-down or key-up */ +class KeyboardAction +{ +public: + static const int KEYUP = 0; + static const int KEYDOWN = 1; + + KeyboardAction(unsigned char keyCode, int state) { + this->key = keyCode; + this->state = state; + } + + int state; + unsigned char key; +}; + +/* Iterators */ +typedef std::vector KeyboardActionVec; +typedef KeyboardActionVec::iterator KeyboardActionIt; +typedef KeyboardActionVec::const_iterator KeyboardActionCIt; + +/** A static keyboard class, written to resemble the one in lwjgl somewhat */ +class Keyboard +{ +public: + static const int KEY_A = 65; + static const int KEY_B = 66; + static const int KEY_C = 67; + static const int KEY_D = 68; + static const int KEY_E = 69; + static const int KEY_F = 70; + static const int KEY_G = 71; + static const int KEY_H = 72; + static const int KEY_I = 73; + static const int KEY_J = 74; + static const int KEY_K = 75; + static const int KEY_L = 76; + static const int KEY_M = 77; + static const int KEY_N = 78; + static const int KEY_O = 79; + static const int KEY_P = 80; + static const int KEY_Q = 81; + static const int KEY_R = 82; + static const int KEY_S = 83; + static const int KEY_T = 84; + static const int KEY_U = 85; + static const int KEY_V = 86; + static const int KEY_W = 87; + static const int KEY_X = 88; + static const int KEY_Y = 89; + static const int KEY_Z = 90; + + static const int KEY_BACKSPACE = 8; + static const int KEY_RETURN = 13; + + static const int KEY_DELETE = 127; // Delete key (ASCII DEL) + + static const int KEY_F1 = 112; + static const int KEY_F2 = 113; + static const int KEY_F3 = 114; + static const int KEY_F4 = 115; + static const int KEY_F5 = 116; + static const int KEY_F6 = 117; + static const int KEY_F7 = 118; + static const int KEY_F8 = 119; + static const int KEY_F9 = 120; + static const int KEY_F10 = 121; + static const int KEY_F11 = 122; + static const int KEY_F12 = 123; + + static const int KEY_ESCAPE = 27; + static const int KEY_SPACE = 32; + static const int KEY_LSHIFT = 10; + + static bool isKeyDown(int keyCode) { + return _states[keyCode] == KeyboardAction::KEYDOWN; + } + + static void reset() { + _inputs.clear(); + _inputText.clear(); + _index = -1; + _textIndex = -1; + } + + static void feed(unsigned char keyCode, int state) { + _inputs.push_back(KeyboardAction(keyCode, state)); + + _states[keyCode] = state; + } + static void feedText(char character) { + _inputText.push_back(character); + } + + static bool next() { + if (_index + 1 >= (int)_inputs.size()) + return false; + + ++_index; + return true; + } + + static bool nextTextChar() { + if(_textIndex + 1 >= (int)_inputText.size()) + return false; + ++_textIndex; + return true; + } + + static void rewind() { + _index = -1; + _textIndex = -1; + } + + static int getEventKey() { + return _inputs[_index].key; + } + + static int getEventKeyState() { + return _inputs[_index].state; + } + static char getChar() { + return _inputText[_textIndex]; + } +private: + static int _index; + static int _textIndex; + static int _states[256]; + static std::vector _inputs; + static std::vector _inputText; + static bool _inited; +}; + +#endif//KEYBOARD_H__ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/70FBAC2FAD5EB44D9E1FC5701B9ADF4E/E19DC915D7B7F4D40A50F260C758DAD9 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/70FBAC2FAD5EB44D9E1FC5701B9ADF4E/E19DC915D7B7F4D40A50F260C758DAD9 new file mode 100644 index 0000000..c45276d --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/70FBAC2FAD5EB44D9E1FC5701B9ADF4E/E19DC915D7B7F4D40A50F260C758DAD9 @@ -0,0 +1,80 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI__Screen_H__ +#define NET_MINECRAFT_CLIENT_GUI__Screen_H__ + +//package net.minecraft.client.gui; + +#include +#include "GuiComponent.h" + +class Font; +class Minecraft; +class Button; +class TextBox; +struct IntRectangle; + +class Screen: public GuiComponent +{ +public: + Screen(); + + virtual void render(int xm, int ym, float a); + + void init(Minecraft* minecraft, int width, int height); + virtual void init(); + + void setSize(int width, int height); + virtual void setupPositions() {}; + + virtual void updateEvents(); + virtual void mouseEvent(); + virtual void keyboardEvent(); + virtual void keyboardTextEvent(); + virtual bool handleBackEvent(bool isDown); + + virtual void tick() {} + + virtual void removed() {} + + virtual void renderBackground(); + virtual void renderBackground(int vo); + virtual void renderDirtBackground(int vo); + // query + virtual bool renderGameBehind(); + virtual bool hasClippingArea(IntRectangle& out); + + virtual bool isPauseScreen(); + virtual bool isErrorScreen(); + virtual bool isInGameScreen(); + virtual bool closeOnPlayerHurt(); + + virtual void confirmResult(bool result, int id) {} + virtual void lostFocus(); + virtual void toGUICoordinate(int& x, int& y); +protected: + void updateTabButtonSelection(); + + virtual void buttonClicked(Button* button) {} + virtual void mouseClicked(int x, int y, int buttonNum); + virtual void mouseReleased(int x, int y, int buttonNum); + + virtual void keyPressed(int eventKey); + virtual void keyboardNewChar(char inputChar); +public: + int width; + int height; + bool passEvents; + //GuiParticles* particles; +protected: + Minecraft* minecraft; + std::vector buttons; + std::vector textBoxes; + + std::vector tabButtons; + int tabButtonIndex; + + Font* font; +private: + Button* clickedButton; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI__Screen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/0C63B92E4F2ED616B53766C987C85544 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/0C63B92E4F2ED616B53766C987C85544 new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/0C63B92E4F2ED616B53766C987C85544 @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/0E1E245EA16F1FAA685C5686B18BDD08 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/0E1E245EA16F1FAA685C5686B18BDD08 new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/0E1E245EA16F1FAA685C5686B18BDD08 @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/1CC65E0062271217494E8E6A4C0A58CE b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/1CC65E0062271217494E8E6A4C0A58CE new file mode 100644 index 0000000..bfd810c --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/1CC65E0062271217494E8E6A4C0A58CE @@ -0,0 +1,34 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ +#define NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ + +//package net.minecraft.client.gui; + +#include +#include "../GuiComponent.h" +#include "../../Options.h" + +class Font; +class Minecraft; + +class TextBox: public GuiComponent +{ +public: + TextBox(int id, const std::string& msg); + TextBox(int id, int x, int y, const std::string& msg); + TextBox(int id, int x, int y, int w, int h, const std::string& msg); + + virtual void setFocus(Minecraft* minecraft); + virtual bool loseFocus(Minecraft* minecraft); + + virtual void render(Minecraft* minecraft, int xm, int ym); + +public: + int w, h; + int x, y; + + std::string text; + int id; + bool focused; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/1D11F3CE27B0B595836AB483CC9A0B43 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/1D11F3CE27B0B595836AB483CC9A0B43 new file mode 100644 index 0000000..c8328de --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/1D11F3CE27B0B595836AB483CC9A0B43 @@ -0,0 +1,70 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(0), w(0), h(0), x(0), y(0), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + minecraft->platform()->showKeyboard(); + focused = true; + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + minecraft->platform()->showKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + // Slightly translucent dark background + fill(x, y, x + w, y + h,0x80000000); + // Border + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + + // Draw text. If textbox contains the placeholder (no focus and text equals initial msg), draw dim color + int color =0xe0e0e0; + // If not focused and text is empty or equals default placeholder, draw dimmed + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + // measure available width approximated by character count + int calc = (w -8) /6; // approx6 px per char + int maxChars =1; + if (calc > maxChars) maxChars = calc; + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/2283792100116549939513A00AC84618 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/2283792100116549939513A00AC84618 new file mode 100644 index 0000000..45852ad --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/2283792100116549939513A00AC84618 @@ -0,0 +1,233 @@ +#ifndef NET_MINECRAFT_CLIENT__Minecraft_H__ +#define NET_MINECRAFT_CLIENT__Minecraft_H__ + +#include "Options.h" +#ifndef STANDALONE_SERVER +#include "MouseHandler.h" +#endif +#include "Timer.h" +#include "player/input/ITurnInput.h" +#ifndef STANDALONE_SERVER +#include "gui/Gui.h" +#include "gui/screens/ScreenChooser.h" +#endif +//#include "../network/RakNetInstance.h" +#include "../world/phys/HitResult.h" + +class User; +class Level; +class LocalPlayer; +class IInputHolder; +class Mob; +class Player; +class LevelRenderer; +class GameRenderer; +class ParticleEngine; +class Entity; +class ICreator; +class GameMode; +class Textures; +class CThread; +class SoundEngine; +class Screen; +class Font; +class LevelStorageSource; +class BuildActionIntention; +class PerfRenderer; +class LevelSettings; +class IRakNetInstance; +class NetEventCallback; +class CommandServer; +struct PingedCompatibleServer; +//class ExternalFileLevelStorageSource; + + +#include "../App.h" +#include "PixelCalc.h" +class AppPlatform; +class AppPlatform_android; + +class Minecraft: public App +{ +protected: + Minecraft(); +public: + virtual ~Minecraft(); + + void init(); + void setSize(int width, int height); + void reloadOptions(); + + bool supportNonTouchScreen(); + bool useTouchscreen(); + void grabMouse(); + void releaseMouse(); + + void handleBuildAction(BuildActionIntention*); + + void toggleDimension(){} + bool isCreativeMode(); + void setIsCreativeMode(bool isCreative); + void setScreen(Screen*); + + virtual void selectLevel(const std::string& levelId, const std::string& levelName, const LevelSettings& settings); + virtual void setLevel(Level* level, const std::string& message = "", LocalPlayer* forceInsertPlayer = NULL); + + void generateLevel( const std::string& message, Level* level ); + LevelStorageSource* getLevelSource(); + + bool isLookingForMultiplayer; + void locateMultiplayer(); + void cancelLocateMultiplayer(); + bool joinMultiplayer(const PingedCompatibleServer& server); + void hostMultiplayer(int port=19132); + Player* respawnPlayer(int playerId); + void respawnPlayer(); + void resetPlayer(Player* player); + void doActuallyRespawnPlayer(); + + void update(); + + void tick(int nTick, int maxTick); + void tickInput(); + + bool isOnlineClient(); + bool isOnline(); + void pauseGame(bool isBackPaused); + void gameLostFocus(); + + void prepareLevel(const std::string& message); + + void leaveGame(bool renameLevel = false); + + int getProgressStatusId(); + const char* getProgressMessage(); + + ICreator* getCreator(); + + // void onGraphicsLost() {} + void onGraphicsReset(); + + bool isLevelGenerated(); + int getLicenseId(); + + void audioEngineOn(); + void audioEngineOff(); + + bool isPowerVR() { return _powerVr; } + bool isKindleFire(int kindleVersion); + bool transformResolution(int* w, int* h); + void optionUpdated(const Options::Option* option, bool value); + void optionUpdated(const Options::Option* option, float value); + void optionUpdated(const Options::Option* option, int value); +#ifdef __APPLE__ + bool _isSuperFast; + bool isSuperFast() { return _isSuperFast; } +#endif + +protected: + void _levelGenerated(); + +private: + static void* prepareLevel_tspawn(void *p_param); + + void handleMouseClick(int button); + void handleMouseDown(int button, bool down); + + void _reloadInput(); +public: + int width; + int height; + + // Vars that the platform is allowed to use in the future + int commandPort; + int reserved_d1, reserved_d2; + float reserved_f1, reserved_f2; + + Options options; + + static bool useAmbientOcclusion; + //static bool threadInterrupt; + + volatile bool pause; + + LevelRenderer* levelRenderer; + GameRenderer* gameRenderer; + ParticleEngine* particleEngine; + SoundEngine* soundEngine; + + GameMode* gameMode; +#ifndef STANDALONE_SERVER + Textures* textures; + ScreenChooser screenChooser; + Font* font; +#endif + IRakNetInstance* raknetInstance; + NetEventCallback* netCallback; + + int lastTime; + int lastTickTime; + float ticksSinceLastUpdate; + + User* user; + Level* level; + + LocalPlayer* player; + IInputHolder* inputHolder; + Mob* cameraTargetPlayer; +#ifndef STANDALONE_SERVER + Gui gui; +#endif + CThread* generateLevelThread; + Screen* screen; + static int customDebugId; + + static const int CDI_NONE = 0; + static const int CDI_GRAPHICS = 1; +#ifndef STANDALONE_SERVER + MouseHandler mouseHandler; +#endif + bool mouseGrabbed; + + PixelCalc pixelCalc; + PixelCalc pixelCalcUi; + + HitResult hitResult; + volatile int progressStagePercentage; + + // This field is initialized in main() + // It sets the base path to where worlds can be written (sdcard on android) + std::string externalStoragePath; + std::string externalCacheStoragePath; +protected: + Timer timer; + // @note @attn @warn: this is dangerous as fuck! + volatile bool isGeneratingLevel; + bool _hasSignaledGeneratingLevelFinished; + + LevelStorageSource* storageSource; + bool _running; + bool _powerVr; + +private: + volatile int progressStageStatusId; + static const char* progressMessages[]; + + int missTime; + int ticks; + bool screenMutex; + bool hasScheduledScreen; + Screen* scheduledScreen; + + int _licenseId; + bool _supportsNonTouchscreen; + + bool _isCreativeMode; + //int _respawnPlayerTicks; + Player* _pendingRemovePlayer; // @attn @todo @fix: remove this shait and fix the respawn behaviour + + PerfRenderer* _perfRenderer; + CommandServer* _commandServer; +}; + +#endif /*NET_MINECRAFT_CLIENT__Minecraft_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/2B98430B365869C2575C119FFFBA9630 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/2B98430B365869C2575C119FFFBA9630 new file mode 100644 index 0000000..b60f96c --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/2B98430B365869C2575C119FFFBA9630 @@ -0,0 +1,132 @@ +#include "TouchJoinGameScreen.h" +#include "../StartMenuScreen.h" +#include "../ProgressScreen.h" +#include "../../Font.h" +#include "../../../Minecraft.h" +#include "../../../renderer/Textures.h" + +namespace Touch { + +JoinGameScreen::JoinGameScreen() +: bJoin(2, "Join Game"), + bBack(3, "Back"), + bHeader(0, "Join by address"), + ip(5, "IP:Port (host:19132)") +{ + bJoin.active = true; +} + +JoinGameScreen::~JoinGameScreen() +{ +} + +void JoinGameScreen::init() +{ + buttons.push_back(&bBack); + buttons.push_back(&bJoin); + buttons.push_back(&bHeader); + + textBoxes.push_back(&ip); + +#ifdef ANDROID + tabButtons.push_back(&bBack); + tabButtons.push_back(&bJoin); +#endif +} + +void JoinGameScreen::setupPositions() { + const int yBase =10; + + // header at top + bHeader.y = yBase; + bHeader.width = width; + bHeader.x =0; + + // textbox below header + ip.x = width/2 -140/2; + ip.y = bHeader.y +28; + ip.w =140; + + // buttons at bottom + const int btnW =120; + const int btnH =26; + bJoin.width = btnW; bJoin.height = btnH; + bBack.width = btnW; bBack.height = btnH; + + bJoin.y = height -30; + bBack.y = height -30; + + bJoin.x = width /2 -4 - bJoin.width; + bBack.x = width /2 +4; +} + +void JoinGameScreen::buttonClicked(Button* button) +{ + if (button->id == bJoin.id) + { + std::string addr = ip.text; + auto trim = [](std::string &s) { + size_t start =0; + while (start < s.size() && std::isspace((unsigned char)s[start])) ++start; + size_t end = s.size(); + while (end > start && std::isspace((unsigned char)s[end -1])) --end; + s = s.substr(start, end - start); + }; + trim(addr); + if (!addr.empty()) { + std::string host = addr; + int port =19132; + size_t colon = addr.find(':'); + if (colon != std::string::npos) { + host = addr.substr(0, colon); + std::string portStr = addr.substr(colon +1); + trim(host); + trim(portStr); + if (!portStr.empty()) port = std::atoi(portStr.c_str()); + } else trim(host); + if (!host.empty()) { + if (minecraft->netCallback) { delete minecraft->netCallback; minecraft->netCallback = NULL; } + minecraft->netCallback = new ClientSideNetworkHandler(minecraft, minecraft->raknetInstance); + minecraft->raknetInstance->connect(host.c_str(), port); + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + } + } + if (button->id == bBack.id) + { + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } +} + +bool JoinGameScreen::handleBackEvent(bool isDown) +{ + if (!isDown) { + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } + return true; +} + +bool JoinGameScreen::isIndexValid( int index ) +{ + return false; +} + +void JoinGameScreen::tick() +{ +} + +void JoinGameScreen::render( int xm, int ym, float a ) +{ + renderBackground(); + // render textbox explicitly + for (unsigned int i =0; i < textBoxes.size(); ++i) { + textBoxes[i]->render(minecraft, xm, ym); + } + Screen::render(xm, ym, a); +} + +bool JoinGameScreen::isInGameScreen() { return false; } + +}; diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/430CC357A15D4BE1A70387A7C3462A3C b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/430CC357A15D4BE1A70387A7C3462A3C new file mode 100644 index 0000000..92a367b --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/430CC357A15D4BE1A70387A7C3462A3C @@ -0,0 +1,258 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i = 0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0, 0, width, height, 0xc0101010, 0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1, 1, 1, 1); + float s = 32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height, 0, 0, height / s + fvo); + t.vertexUV((float)width, (float)height, 0, width / s, (float)height / s + fvo); + t.vertexUV((float)width, 0, 0, (float)width / s, 0 + fvo); + t.vertexUV(0, 0, 0, 0, 0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex = 0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount - 1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i = 0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; +/* +#if !defined(ANDROID) && !defined(__APPLE__) //if (!minecraft->isTouchscreen()) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); +#endif } +*/ + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + +#if 1 +//#if defined(ANDROID) || defined(__APPLE__) //if (minecraft->isTouchscreen()) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click", 1, 1); + clickedButton->released(x, y); + } + } +# else // } else { + clickedButton->released(x, y); +#endif // } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height - 1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/45184E75B309C114B1B10A2D0DA96C4D b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/45184E75B309C114B1B10A2D0DA96C4D new file mode 100644 index 0000000..3fcfe72 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/45184E75B309C114B1B10A2D0DA96C4D @@ -0,0 +1,134 @@ +#include "TouchJoinGameScreen.h" +#include "../StartMenuScreen.h" +#include "../ProgressScreen.h" +#include "../../Font.h" +#include "../../../Minecraft.h" +#include "../../../renderer/Textures.h" +#include "../../../network/RakNetInstance.h" +#include "../../../network/ClientSideNetworkHandler.h" + +namespace Touch { + +JoinGameScreen::JoinGameScreen() +: bJoin(2, "Join Game"), + bBack(3, "Back"), + bHeader(0, "Join by address"), + ip(5, "IP:Port (host:19132)") +{ + bJoin.active = true; +} + +JoinGameScreen::~JoinGameScreen() +{ +} + +void JoinGameScreen::init() +{ + buttons.push_back(&bBack); + buttons.push_back(&bJoin); + buttons.push_back(&bHeader); + + textBoxes.push_back(&ip); + +#ifdef ANDROID + tabButtons.push_back(&bBack); + tabButtons.push_back(&bJoin); +#endif +} + +void JoinGameScreen::setupPositions() { + const int yBase =10; + + // header at top + bHeader.y = yBase; + bHeader.width = width; + bHeader.x =0; + + // textbox below header + ip.x = width/2 -140/2; + ip.y = bHeader.y +28; + ip.w =140; + + // buttons at bottom + const int btnW =120; + const int btnH =26; + bJoin.width = btnW; bJoin.height = btnH; + bBack.width = btnW; bBack.height = btnH; + + bJoin.y = height -30; + bBack.y = height -30; + + bJoin.x = width /2 -4 - bJoin.width; + bBack.x = width /2 +4; +} + +void JoinGameScreen::buttonClicked(Button* button) +{ + if (button->id == bJoin.id) + { + std::string addr = ip.text; + auto trim = [](std::string &s) { + size_t start =0; + while (start < s.size() && std::isspace((unsigned char)s[start])) ++start; + size_t end = s.size(); + while (end > start && std::isspace((unsigned char)s[end -1])) --end; + s = s.substr(start, end - start); + }; + trim(addr); + if (!addr.empty()) { + std::string host = addr; + int port =19132; + size_t colon = addr.find(':'); + if (colon != std::string::npos) { + host = addr.substr(0, colon); + std::string portStr = addr.substr(colon +1); + trim(host); + trim(portStr); + if (!portStr.empty()) port = std::atoi(portStr.c_str()); + } else trim(host); + if (!host.empty()) { + if (minecraft->netCallback) { delete minecraft->netCallback; minecraft->netCallback = NULL; } + minecraft->netCallback = new ClientSideNetworkHandler(minecraft, minecraft->raknetInstance); + minecraft->raknetInstance->connect(host.c_str(), port); + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + } + } + if (button->id == bBack.id) + { + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } +} + +bool JoinGameScreen::handleBackEvent(bool isDown) +{ + if (!isDown) { + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } + return true; +} + +bool JoinGameScreen::isIndexValid( int index ) +{ + return false; +} + +void JoinGameScreen::tick() +{ +} + +void JoinGameScreen::render( int xm, int ym, float a ) +{ + renderBackground(); + // render textbox explicitly + for (unsigned int i =0; i < textBoxes.size(); ++i) { + textBoxes[i]->render(minecraft, xm, ym); + } + Screen::render(xm, ym, a); +} + +bool JoinGameScreen::isInGameScreen() { return false; } + +}; diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/47E213DB53B8236500018DEF684C0C4A b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/47E213DB53B8236500018DEF684C0C4A new file mode 100644 index 0000000..d351c67 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/47E213DB53B8236500018DEF684C0C4A @@ -0,0 +1,131 @@ +#include "TouchJoinGameScreen.h" +#include "../StartMenuScreen.h" +#include "../ProgressScreen.h" +#include "../../Font.h" +#include "../../../Minecraft.h" +#include "../../../renderer/Textures.h" +#include "../../../NetworkingHelpers.h" + +namespace Touch { + +JoinGameScreen::JoinGameScreen() +: bJoin(2, "Join Game"), + bBack(3, "Back"), + bHeader(0, "Join by address"), + ip(5, "IP:Port (host:19132)") +{ + bJoin.active = true; +} + +JoinGameScreen::~JoinGameScreen() +{ +} + +void JoinGameScreen::init() +{ + buttons.push_back(&bBack); + buttons.push_back(&bJoin); + buttons.push_back(&bHeader); + + textBoxes.push_back(&ip); + +#ifdef ANDROID + tabButtons.push_back(&bBack); + tabButtons.push_back(&bJoin); +#endif +} + +void JoinGameScreen::setupPositions() { + const int yBase =10; + + // header at top + bHeader.y = yBase; + bHeader.width = width; + bHeader.x =0; + + // textbox below header + ip.x = width/2 -140/2; + ip.y = bHeader.y +28; + ip.w =140; + + // buttons at bottom + const int btnW =120; + const int btnH =26; + bJoin.width = btnW; bJoin.height = btnH; + bBack.width = btnW; bBack.height = btnH; + + bJoin.y = height -30; + bBack.y = height -30; + + bJoin.x = width /2 -4 - bJoin.width; + bBack.x = width /2 +4; +} + +void JoinGameScreen::buttonClicked(Button* button) +{ + if (button->id == bJoin.id) + { + std::string addr = ip.text; + auto trim = [](std::string &s) { + size_t start =0; + while (start < s.size() && std::isspace((unsigned char)s[start])) ++start; + size_t end = s.size(); + while (end > start && std::isspace((unsigned char)s[end -1])) --end; + s = s.substr(start, end - start); + }; + trim(addr); + if (!addr.empty()) { + std::string host = addr; + int port =19132; + size_t colon = addr.find(':'); + if (colon != std::string::npos) { + host = addr.substr(0, colon); + std::string portStr = addr.substr(colon +1); + trim(host); + trim(portStr); + if (!portStr.empty()) port = std::atoi(portStr.c_str()); + } else trim(host); + if (!host.empty()) { + startConnect(minecraft, host, port); + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + } + } + if (button->id == bBack.id) + { + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } +} + +bool JoinGameScreen::handleBackEvent(bool isDown) +{ + if (!isDown) { + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } + return true; +} + +bool JoinGameScreen::isIndexValid( int index ) +{ + return false; +} + +void JoinGameScreen::tick() +{ +} + +void JoinGameScreen::render( int xm, int ym, float a ) +{ + renderBackground(); + // render textbox explicitly + for (unsigned int i =0; i < textBoxes.size(); ++i) { + textBoxes[i]->render(minecraft, xm, ym); + } + Screen::render(xm, ym, a); +} + +bool JoinGameScreen::isInGameScreen() { return false; } + +}; diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/537385A43D87705EF4C66A0C3BD1EB7A b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/537385A43D87705EF4C66A0C3BD1EB7A new file mode 100644 index 0000000..6d1460d --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/537385A43D87705EF4C66A0C3BD1EB7A @@ -0,0 +1,133 @@ +#include "TouchJoinGameScreen.h" +#include "../StartMenuScreen.h" +#include "../ProgressScreen.h" +#include "../../Font.h" +#include "../../../Minecraft.h" +#include "../../../renderer/Textures.h" +#include "../../../../network/RakNetInstance.h" +#include "../../../../network/ClientSideNetworkHandler.h" +#include "../../NetworkingHelpers.h" + +namespace Touch { + +JoinGameScreen::JoinGameScreen() +: bJoin(2, "Join Game"), + bBack(3, "Back"), + bHeader(0, "Join by address"), + ip(5, "IP:Port (host:19132)") +{ + bJoin.active = true; +} + +JoinGameScreen::~JoinGameScreen() +{ +} + +void JoinGameScreen::init() +{ + buttons.push_back(&bBack); + buttons.push_back(&bJoin); + buttons.push_back(&bHeader); + + textBoxes.push_back(&ip); + +#ifdef ANDROID + tabButtons.push_back(&bBack); + tabButtons.push_back(&bJoin); +#endif +} + +void JoinGameScreen::setupPositions() { + const int yBase =10; + + // header at top + bHeader.y = yBase; + bHeader.width = width; + bHeader.x =0; + + // textbox below header + ip.x = width/2 -140/2; + ip.y = bHeader.y +28; + ip.w =140; + + // buttons at bottom + const int btnW =120; + const int btnH =26; + bJoin.width = btnW; bJoin.height = btnH; + bBack.width = btnW; bBack.height = btnH; + + bJoin.y = height -30; + bBack.y = height -30; + + bJoin.x = width /2 -4 - bJoin.width; + bBack.x = width /2 +4; +} + +void JoinGameScreen::buttonClicked(Button* button) +{ + if (button->id == bJoin.id) + { + std::string addr = ip.text; + auto trim = [](std::string &s) { + size_t start =0; + while (start < s.size() && std::isspace((unsigned char)s[start])) ++start; + size_t end = s.size(); + while (end > start && std::isspace((unsigned char)s[end -1])) --end; + s = s.substr(start, end - start); + }; + trim(addr); + if (!addr.empty()) { + std::string host = addr; + int port =19132; + size_t colon = addr.find(':'); + if (colon != std::string::npos) { + host = addr.substr(0, colon); + std::string portStr = addr.substr(colon +1); + trim(host); + trim(portStr); + if (!portStr.empty()) port = std::atoi(portStr.c_str()); + } else trim(host); + if (!host.empty()) { + startConnect(minecraft, host, port); + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + } + } + if (button->id == bBack.id) + { + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } +} + +bool JoinGameScreen::handleBackEvent(bool isDown) +{ + if (!isDown) { + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } + return true; +} + +bool JoinGameScreen::isIndexValid( int index ) +{ + return false; +} + +void JoinGameScreen::tick() +{ +} + +void JoinGameScreen::render( int xm, int ym, float a ) +{ + renderBackground(); + // render textbox explicitly + for (unsigned int i =0; i < textBoxes.size(); ++i) { + textBoxes[i]->render(minecraft, xm, ym); + } + Screen::render(xm, ym, a); +} + +bool JoinGameScreen::isInGameScreen() { return false; } + +}; diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/572513C3D8D309B3634C045C3C8FAC54 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/572513C3D8D309B3634C045C3C8FAC54 new file mode 100644 index 0000000..872695a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/572513C3D8D309B3634C045C3C8FAC54 @@ -0,0 +1,137 @@ +#ifndef KEYBOARD_H__ +#define KEYBOARD_H__ + +#include + +/** A keyboard action; key-down or key-up */ +class KeyboardAction +{ +public: + static const int KEYUP = 0; + static const int KEYDOWN = 1; + + KeyboardAction(unsigned char keyCode, int state) { + this->key = keyCode; + this->state = state; + } + + int state; + unsigned char key; +}; + +/* Iterators */ +typedef std::vector KeyboardActionVec; +typedef KeyboardActionVec::iterator KeyboardActionIt; +typedef KeyboardActionVec::const_iterator KeyboardActionCIt; + +/** A static keyboard class, written to resemble the one in lwjgl somewhat */ +class Keyboard +{ +public: + static const int KEY_A = 65; + static const int KEY_B = 66; + static const int KEY_C = 67; + static const int KEY_D = 68; + static const int KEY_E = 69; + static const int KEY_F = 70; + static const int KEY_G = 71; + static const int KEY_H = 72; + static const int KEY_I = 73; + static const int KEY_J = 74; + static const int KEY_K = 75; + static const int KEY_L = 76; + static const int KEY_M = 77; + static const int KEY_N = 78; + static const int KEY_O = 79; + static const int KEY_P = 80; + static const int KEY_Q = 81; + static const int KEY_R = 82; + static const int KEY_S = 83; + static const int KEY_T = 84; + static const int KEY_U = 85; + static const int KEY_V = 86; + static const int KEY_W = 87; + static const int KEY_X = 88; + static const int KEY_Y = 89; + static const int KEY_Z = 90; + + static const int KEY_BACKSPACE = 8; + static const int KEY_RETURN = 13; + + static const int KEY_F1 = 112; + static const int KEY_F2 = 113; + static const int KEY_F3 = 114; + static const int KEY_F4 = 115; + static const int KEY_F5 = 116; + static const int KEY_F6 = 117; + static const int KEY_F7 = 118; + static const int KEY_F8 = 119; + static const int KEY_F9 = 120; + static const int KEY_F10 = 121; + static const int KEY_F11 = 122; + static const int KEY_F12 = 123; + + static const int KEY_ESCAPE = 27; + static const int KEY_SPACE = 32; + static const int KEY_LSHIFT = 10; + + static bool isKeyDown(int keyCode) { + return _states[keyCode] == KeyboardAction::KEYDOWN; + } + + static void reset() { + _inputs.clear(); + _inputText.clear(); + _index = -1; + _textIndex = -1; + } + + static void feed(unsigned char keyCode, int state) { + _inputs.push_back(KeyboardAction(keyCode, state)); + + _states[keyCode] = state; + } + static void feedText(char character) { + _inputText.push_back(character); + } + + static bool next() { + if (_index + 1 >= (int)_inputs.size()) + return false; + + ++_index; + return true; + } + + static bool nextTextChar() { + if(_textIndex + 1 >= (int)_inputText.size()) + return false; + ++_textIndex; + return true; + } + + static void rewind() { + _index = -1; + _textIndex = -1; + } + + static int getEventKey() { + return _inputs[_index].key; + } + + static int getEventKeyState() { + return _inputs[_index].state; + } + static char getChar() { + return _inputText[_textIndex]; + } +private: + static int _index; + static int _textIndex; + static int _states[256]; + static std::vector _inputs; + static std::vector _inputText; + static bool _inited; +}; + +#endif//KEYBOARD_H__ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/72B2752C7CD663CF9A1CC0178EF19114 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/72B2752C7CD663CF9A1CC0178EF19114 new file mode 100644 index 0000000..bbafff6 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/72B2752C7CD663CF9A1CC0178EF19114 @@ -0,0 +1,1578 @@ +#include "Minecraft.h" + +#if defined(APPLE_DEMO_PROMOTION) + #define NO_NETWORK +#endif + +#if defined(RPI) + #define CREATORMODE +#endif + +#include "../network/RakNetInstance.h" +#include "../network/ClientSideNetworkHandler.h" +#include "../network/ServerSideNetworkHandler.h" +//#include "../network/Packet.h" +#include "../world/entity/player/Inventory.h" +#include "../world/level/chunk/ChunkCache.h" +#include "../world/level/tile/Tile.h" +#include "../world/level/storage/LevelStorageSource.h" +#include "../world/level/storage/LevelStorage.h" +#include "player/input/KeyboardInput.h" +#ifndef STANDALONE_SERVER +#include "player/input/touchscreen/TouchInputHolder.h" +#endif +#include "player/LocalPlayer.h" +#include "gamemode/CreativeMode.h" +#include "gamemode/SurvivalMode.h" +#include "player/LocalPlayer.h" +#ifndef STANDALONE_SERVER +#include "particle/ParticleEngine.h" +#include "gui/Screen.h" +#include "gui/Font.h" +#include "gui/screens/RenameMPLevelScreen.h" +#include "sound/SoundEngine.h" +#endif +#include "../platform/CThread.h" +#include "../platform/input/Mouse.h" +#include "../AppPlatform.h" +#include "../Performance.h" +#include "../LicenseCodes.h" +#include "../util/PerfTimer.h" +#include "../util/PerfRenderer.h" +#include "player/input/MouseBuildInput.h" + +#include "../world/Facing.h" + +#include "../network/packet/PlaceBlockPacket.h" + +#include "player/input/IInputHolder.h" +#ifndef STANDALONE_SERVER +#include "player/input/touchscreen/TouchscreenInput.h" + +#include "player/input/ControllerTurnInput.h" +#include "player/input/XperiaPlayInput.h" + +#endif + +#include "player/input/MouseTurnInput.h" +#include "../world/entity/MobFactory.h" +#include "../world/level/MobSpawner.h" +#include "../util/Mth.h" +#include "../network/packet/InteractPacket.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/PrerenderTilesScreen.h" +#include "renderer/Textures.h" +#include "gui/screens/DeathScreen.h" +#endif + +#include "../network/packet/RespawnPacket.h" +#include "IConfigListener.h" +#include "../world/entity/MobCategory.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/FurnaceScreen.h" +#endif +#include "../world/Difficulty.h" +#include "../server/ServerLevel.h" +#ifdef CREATORMODE +#include "../server/CreatorLevel.h" +#endif +#include "../network/packet/AdventureSettingsPacket.h" +#include "../network/packet/SetSpawnPositionPacket.h" +#include "../network/command/CommandServer.h" +#include "gamemode/CreatorMode.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/ArmorScreen.h" +#endif +#include "../world/level/levelgen/synth/ImprovedNoise.h" +#ifndef STANDALONE_SERVER +#include "renderer/tileentity/TileEntityRenderDispatcher.h" +#endif + +#ifndef STANDALONE_SERVER +#include "renderer/ptexture/DynamicTexture.h" +#include "renderer/GameRenderer.h" +#include "renderer/ItemInHandRenderer.h" +#include "renderer/LevelRenderer.h" +#include "renderer/entity/EntityRenderDispatcher.h" +#include "gui/Screen.h" +#include "gui/Font.h" +#include "gui/screens/RenameMPLevelScreen.h" +#include "sound/SoundEngine.h" +#endif + +static void checkGlError(const char* tag) { +#ifdef GLDEBUG + while (1) { + const int errCode = glGetError(); + if (errCode == GL_NO_ERROR) break; + + LOGE("################\nOpenGL-error @ %s : #%d\n", tag, errCode); + } +#endif /*GLDEBUG*/ +} + +/*static*/ +const char* Minecraft::progressMessages[] = { + "Locating server", + "Building terrain", + "Preparing", + "Saving chunks" +}; + +int Minecraft::customDebugId = Minecraft::CDI_NONE; + +#if defined(_MSC_VER) + #pragma warning( disable : 4355 ) // 'this' pointer in initialization list which is perfectly legal +#endif + +bool Minecraft::useAmbientOcclusion = false; + +Minecraft::Minecraft() +: user(NULL), + level(NULL), + player(NULL), + cameraTargetPlayer(NULL), + levelRenderer(NULL), + gameRenderer(NULL), +#ifndef STANDALONE_SERVER + particleEngine(NULL), + _perfRenderer(NULL), +#endif + _commandServer(NULL), +#ifndef STANDALONE_SERVER + textures(NULL), +#endif + lastTickTime(-1), + lastTime(0), + ticksSinceLastUpdate(0), + gameMode(NULL), + mouseGrabbed(true), + missTime(0), + pause(false), + _running(false), + timer(20), +#ifndef STANDALONE_SERVER + gui(this), +#endif + netCallback(NULL), +#ifndef STANDALONE_SERVER + screen(NULL), + font(NULL), +#endif + screenMutex(false), +#ifndef STANDALONE_SERVER + scheduledScreen(NULL), + hasScheduledScreen(false), + soundEngine(NULL), +#endif + ticks(0), + isGeneratingLevel(false), + _hasSignaledGeneratingLevelFinished(true), + generateLevelThread(NULL), + progressStagePercentage(0), + progressStageStatusId(0), + isLookingForMultiplayer(false), + _licenseId(LicenseCodes::WAIT_PLATFORM_NOT_READY), + inputHolder(0), + _supportsNonTouchscreen(false), +#ifndef STANDALONE_SERVER + screenChooser(this), +#endif + width(1), height(1), + //_respawnPlayerTicks(-1), +#ifdef __APPLE__ + _isSuperFast(false), +#endif + _powerVr(false), + commandPort(4711), + reserved_d1(0),reserved_d2(0), + reserved_f1(0),reserved_f2(0) +{ +//#ifdef ANDROID + +#if defined(NO_NETWORK) + raknetInstance = new IRakNetInstance(); +#else + raknetInstance = new RakNetInstance(); +#endif +#ifndef STANDALONE_SERVER + soundEngine = new SoundEngine(20.0f); + soundEngine->init(this, &options); +#endif + //setupPieces(); +} + +Minecraft::~Minecraft() +{ + delete netCallback; + delete raknetInstance; +#ifndef STANDALONE_SERVER + delete levelRenderer; + delete gameRenderer; + delete particleEngine; + + delete soundEngine; +#endif + delete gameMode; +#ifndef STANDALONE_SERVER + delete font; + delete textures; + + if (screen != NULL) { + delete screen; + screen = NULL; + } +#endif + if (level != NULL) { + level->saveGame(); + if (level->getChunkSource()) + level->getChunkSource()->saveAll(true); + delete level->getLevelStorage(); + delete level; + level = NULL; + } + + //delete player; + delete user; + delete inputHolder; + + delete storageSource; + delete _perfRenderer; + delete _commandServer; + + MobFactory::clearStaticTestMobs(); +#ifndef STANDALONE_SERVER + EntityRenderDispatcher::destroy(); +#endif +} + +// Only called by server +void Minecraft::selectLevel( const std::string& levelId, const std::string& levelName, const LevelSettings& settings ) +{ +#if defined(CREATORMODE) + level = new CreatorLevel( +#else + level = new ServerLevel( +#endif + storageSource->selectLevel(levelId, false), + levelName, + settings, + SharedConstants::GeneratorVersion); + + // note: settings is useless beyond this point, since it's + // either copied to LevelData (or LevelData read from file) + setLevel(level, "Generating level"); + setIsCreativeMode(level->getLevelData()->getGameType() == GameType::Creative); + _running = true; +} + +void Minecraft::setLevel(Level* level, const std::string& message /* ="" */, LocalPlayer* forceInsertPlayer /* = NULL */) { + cameraTargetPlayer = NULL; + LOGI("Seed is %ld\n", level->getSeed()); + + if (level != NULL) { + level->raknetInstance = raknetInstance; + gameMode->initLevel(level); + + if (!player && forceInsertPlayer) + { + player = forceInsertPlayer; + player->resetPos(false); + //level->addEntity(forceInsertPlayer); + } + else if (player != NULL) { + player->resetPos(false); + if (level != NULL) { + level->addEntity(player); + } + } + this->level = level; + _hasSignaledGeneratingLevelFinished = false; +#ifdef STANDALONE_SERVER + const bool threadedLevelCreation = false; +#else + const bool threadedLevelCreation = true; +#endif + + if (threadedLevelCreation) { + // Threaded + // "Lock" + isGeneratingLevel = true; + generateLevelThread = new CThread(Minecraft::prepareLevel_tspawn, this); + } else { + // Non-threaded + generateLevel("Currently not used", level); + } + } else { + player = NULL; + } + + this->lastTickTime = 0; + this->_running = true; +} + +void Minecraft::leaveGame(bool renameLevel /*=false*/) +{ + if (isGeneratingLevel || !_hasSignaledGeneratingLevelFinished) + return; + + isGeneratingLevel = false; + bool saveLevel = level && (!level->isClientSide || renameLevel); + + raknetInstance->disconnect(); + if (saveLevel) { + // If server or wanting to save level as client, save all unsaved chunks! + level->getChunkSource()->saveAll(true); + } + + LOGI("Clearing levels\n"); + + cameraTargetPlayer = NULL; +#ifndef STANDALONE_SERVER + levelRenderer->setLevel(NULL); + particleEngine->setLevel(NULL); +#endif + LOGI("Erasing callback\n"); + delete netCallback; + netCallback = NULL; + + LOGI("Erasing level\n"); + if (level != NULL) { + delete level->getLevelStorage(); + delete level; + level = NULL; + } + //delete player; + player = NULL; + cameraTargetPlayer = NULL; + + _running = false; +#ifndef STANDALONE_SERVER + if (renameLevel) { + setScreen(new RenameMPLevelScreen(LevelStorageSource::TempLevelId)); + } + else + screenChooser.setScreen(SCREEN_STARTMENU); +#endif +} + +void Minecraft::prepareLevel(const std::string& title) { + LOGI("status: 1\n"); + progressStageStatusId = 1; + + Stopwatch A, B, C, D; + A.start(); + + Stopwatch L; + + // Dont update lights if we load the level (ok, actually just with leveldata version=1.+(?)) + if (!level->isNew()) + level->setUpdateLights(false); + + int Max = CHUNK_CACHE_WIDTH * CHUNK_CACHE_WIDTH; + int pp = 0; + for (int x = 8; x < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); x += CHUNK_WIDTH) { + for (int z = 8; z < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); z += CHUNK_WIDTH) { + progressStagePercentage = 100 * pp++ / Max; + //printf("level generation progress %d\n", progressStagePercentage); + B.start(); + level->getTile(x, 64, z); + B.stop(); + L.start(); + if (level->isNew()) + while (level->updateLights()) + ; + L.stop(); + } + } + A.stop(); + level->setUpdateLights(true); + + C.start(); + for (int x = 0; x < CHUNK_CACHE_WIDTH; x++) + { + for (int z = 0; z < CHUNK_CACHE_WIDTH; z++) + { + LevelChunk* chunk = level->getChunk(x, z); + if (chunk && !chunk->createdFromSave) + { + chunk->unsaved = false; + chunk->clearUpdateMap(); + } + } + } + C.stop(); + + LOGI("status: 3\n"); + progressStageStatusId = 3; + if (level->isNew()) { + level->setInitialSpawn(); // @note: should obviously be called from Level itself + level->saveLevelData(); + level->getChunkSource()->saveAll(false); + level->saveGame(); + } else { + level->saveLevelData(); + level->loadEntities(); + } + + progressStagePercentage = -1; + progressStageStatusId = 2; + LOGI("status: 2\n"); + + D.start(); + level->prepare(); + D.stop(); + + A.print("Generate level: "); + L.print(" - light: "); + B.print(" - getTl: "); + C.print(" - clear: "); + D.print(" - prepr: "); + progressStageStatusId = 0; +} + +void Minecraft::update() { + //LOGI("Enter Update\n"); + + if (Options::debugGl) + LOGI(">>>>>>>>>>\n"); + + TIMER_PUSH("root"); + + //if (level) { + // LOGI("numplayers: %d\n", level->players.size()); + // for (int i = 0; i < level->players.size(); ++i) { + // Player* p = level->players[i]; + // bool inEnt = std::find(level->entities.begin(), level->entities.end(), p) != level->entities.end(); + // LOGI(" %p, %d, %d - in? %d\n", p, p->entityId, p->owner.ToUint32(p->owner), inEnt); + // } + //} + + if (pause && level != NULL) { + float lastA = timer.a; + timer.advanceTime(); + timer.a = lastA; + } else { + timer.advanceTime(); + } + + if (raknetInstance) { + raknetInstance->runEvents(netCallback); + } + + TIMER_PUSH("tick"); + int toTick = timer.ticks; + for (int i = 0; i < toTick; ++i, ++ticks) + tick(i, toTick-1); + + TIMER_POP_PUSH("updatelights"); + if (level && !isGeneratingLevel) { + level->updateLights(); + } + TIMER_POP(); + + #ifndef STANDALONE_SERVER + if (gameMode != NULL) gameMode->render(timer.a); + TIMER_PUSH("sound"); + soundEngine->update(player, timer.a); + TIMER_POP_PUSH("render"); + gameRenderer->render(timer.a); + TIMER_POP(); + #else + CThread::sleep(1); + #endif +#ifndef STANDALONE_SERVER + Multitouch::resetThisUpdate(); +#endif + TIMER_POP(); +#ifndef STANDALONE_SERVER + checkGlError("Update finished"); + + if (options.renderDebug) { + if (!PerfTimer::enabled) { + PerfTimer::reset(); + PerfTimer::enabled = true; + } + + //TIMER_PUSH("debugfps"); + _perfRenderer->renderFpsMeter(1); + checkGlError("render debug"); + //TIMER_POP(); + } else { + PerfTimer::enabled = false; + } +#endif + //LOGI("Exit Update\n"); +} + +void Minecraft::tick(int nTick, int maxTick) { + if (missTime > 0) missTime--; +#ifndef STANDALONE_SERVER + if (!screen && player) { + if (player->health <= 0) { + setScreen(new DeathScreen()); + } + } +#endif + TIMER_PUSH("gameMode"); + if (level && !pause) { + gameMode->tick(); + } + + TIMER_POP_PUSH("commandServer"); + if (level && _commandServer) { + _commandServer->tick(); + } + + TIMER_POP_PUSH("input"); + tickInput(); +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("gui"); + gui.tick(); +#endif + // + // Ongoing level generation in a (perhaps) different thread. When it's + // ready, _levelGenerated() is called once and any threads are deleted. + // + if (isGeneratingLevel) { + return; + } else if (!_hasSignaledGeneratingLevelFinished) { + if (generateLevelThread) { + delete generateLevelThread; + generateLevelThread = NULL; + } + _levelGenerated(); + } + + // + // Normal game loop, run before or efter level generation + // + if (level != NULL) + { + if (!pause) { +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("gameRenderer"); + gameRenderer->tick(nTick, maxTick); + + TIMER_POP_PUSH("levelRenderer"); + levelRenderer->tick(); +#endif + level->difficulty = options.difficulty; + if (level->isClientSide) level->difficulty = Difficulty::EASY; + + TIMER_POP_PUSH("level"); + level->tickEntities(); + level->tick(); +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("animateTick"); + if (player) { + level->animateTick(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); + } +#endif + } + } +#ifndef STANDALONE_SERVER + textures->loadAndBindTexture("terrain.png"); + if (!pause && !(screen && !screen->renderGameBehind())) { + #if !defined(RPI) + #ifdef __APPLE__ + if (isSuperFast()) + #endif + { + if (nTick == maxTick) { + TIMER_POP_PUSH("textures"); + textures->tick(true); + } + } + #endif + } + TIMER_POP_PUSH("particles"); + particleEngine->tick(); + if (screen) { + screenMutex = true; + screen->tick(); + screenMutex = false; + } + + // @note: fix to keep "isPressed" and "isReleased" as long as necessary. + // Most likely keyboard and mouse could/should be reset here as well. + Multitouch::reset(); +#endif + TIMER_POP(); +} + +class InputRAII { +public: + ~InputRAII() { +#ifndef STANDALONE_SERVER + Mouse::reset(); + Keyboard::reset(); +#endif + } +}; + +void Minecraft::tickInput() { +#ifndef STANDALONE_SERVER + InputRAII raiiInput; + + if (screen && !screen->passEvents) { + screenMutex = true; + screen->updateEvents(); + //screen->updateSetScreen(); + screenMutex = false; + if (hasScheduledScreen) { + setScreen(scheduledScreen); + scheduledScreen = NULL; + hasScheduledScreen = false; + } + return; + } + + if (!player) { + return; + } + +#ifdef RPI + bool mouseDiggable = true; + bool allowGuiClicks = !mouseGrabbed; +#else + bool mouseDiggable = !gui.isInside(Mouse::getX(), Mouse::getY()); + bool allowGuiClicks = true; +#endif + + TIMER_PUSH("mouse"); + while (Mouse::next()) { + //if (Mouse::getButtonState(MouseAction::ACTION_LEFT)) + // LOGI("mouse-down-at: %d, %d\n", Mouse::getX(), Mouse::getY()); + int passedTime = getTimeMs() - lastTickTime; + if (passedTime > 200) continue; // @note: As long Mouse::clear CLEARS the whole buffer, it's safe to break here + // But since it might be rewritten anyway (and hopefully there aren't a lot of messages, we just continue. + + const MouseAction& e = Mouse::getEvent(); + +#ifdef RPI // If clicked when not having focus, get focus @keyboard + if (!mouseGrabbed) { + if (!screen && e.data == MouseAction::DATA_DOWN) { + grabMouse(); + } + } +#endif + + if (allowGuiClicks && e.action == MouseAction::ACTION_LEFT && e.data == MouseAction::DATA_DOWN) { + gui.handleClick(MouseAction::ACTION_LEFT, Mouse::getX(), Mouse::getY()); + } + + if (e.action == MouseAction::ACTION_WHEEL) { + Inventory* v = player->inventory; + int numSlots = gui.getNumSlots() - 1; + int slot = (v->selected - e.dy + numSlots) % numSlots; + v->selectSlot(slot); + } + /* + if (mouseDiggable && options.useMouseForDigging) { + if (Mouse::getEventButton() == MouseAction::ACTION_LEFT && Mouse::getEventButtonState()) { + handleMouseClick(MouseAction::ACTION_LEFT); + lastClickTick = ticks; + } + if (Mouse::getEventButton() == MouseAction::ACTION_RIGHT && Mouse::getEventButtonState()) { + handleMouseClick(MouseAction::ACTION_RIGHT); + lastClickTick = ticks; + } + } + */ + } + + TIMER_POP_PUSH("keyboard"); + while (Keyboard::next()) { + int key = Keyboard::getEventKey(); + bool isPressed = (Keyboard::getEventKeyState() == KeyboardAction::KEYDOWN); + player->setKey(key, isPressed); + + if (isPressed) { + gui.handleKeyPressed(key); + + #if defined(WIN32) || defined(RPI)//|| defined(_DEBUG) || defined(DEBUG) + if (key >= '0' && key <= '9') { + int digit = key - '0'; + int slot = digit - 1; + + if (slot >= 0 && slot < gui.getNumSlots()-1) + player->inventory->selectSlot(slot); + + #if defined(WIN32) + if (digit >= 1 && GetAsyncKeyState(VK_CONTROL) < 0) { + // Set adventure settings here! + AdventureSettingsPacket p(level->adventureSettings); + p.toggle((AdventureSettingsPacket::Flags)(1 << slot)); + p.fillIn(level->adventureSettings); + raknetInstance->send(p); + } + if (digit == 0) { + Pos pos((int)player->x, (int)player->y-1, (int)player->z); + SetSpawnPositionPacket p(pos); + raknetInstance->send(p); + } + #endif + } + #endif + #if defined(RPI) + if (key == Keyboard::KEY_E) { + screenChooser.setScreen(SCREEN_BLOCKSELECTION); + } + if (!screen && key == Keyboard::KEY_O || key == 250) { + releaseMouse(); + } + #endif + #if defined(WIN32) + if (key == Keyboard::KEY_F) { + options.isFlying = !options.isFlying; + player->noPhysics = options.isFlying; + } + + if (key == Keyboard::KEY_T) { + options.thirdPersonView = !options.thirdPersonView; + /* + ImprovedNoise noise; + for (int i = 0; i < 16; ++i) + printf("%d\t%f\n", i, noise.grad2(i, 3, 8)); + */ + } + + if (key == Keyboard::KEY_O) { + useAmbientOcclusion = !useAmbientOcclusion; + options.ambientOcclusion = useAmbientOcclusion; + levelRenderer->allChanged(); + } + + if (key == Keyboard::KEY_L) + options.viewDistance = (options.viewDistance + 1) % 4; + + if (key == Keyboard::KEY_U) { + onGraphicsReset(); + player->heal(100); + } + + if (key == Keyboard::KEY_B || key == 108) // Toggle the game mode + setIsCreativeMode(!isCreativeMode()); + + if (key == Keyboard::KEY_P) // Step forward in time + level->setTime( level->getTime() + 1000); + + if (key == Keyboard::KEY_G) { + setScreen(new ArmorScreen()); + /* + std::vector& boxs = level->getCubes(NULL, AABB(128.1f, 73, 128.1f, 128.9f, 74.9f, 128.9f)); + LOGI("boxes: %d\n", (int)boxs.size()); + */ + } + + if (key == Keyboard::KEY_Y) { + textures->reloadAll(); + player->hurtTo(2); + } + if (key == Keyboard::KEY_Z || key == 108) { + for (int i = 0; i < 1; ++i) { + Mob* mob = NULL; + int forceId = 0;//MobTypes::Sheep; + + int types[] = { + MobTypes::Sheep, + MobTypes::Pig, + MobTypes::Chicken, + MobTypes::Cow, + }; + + int mobType = (forceId > 0)? forceId : types[Mth::random(sizeof(types) / sizeof(int))]; + mob = MobFactory::CreateMob(mobType, level); + + //((Animal*)mob)->setAge(-1000); + float dx = 4 - 8 * Mth::random() + 4 * Mth::sin(Mth::DEGRAD * player->yRot); + float dz = 4 - 8 * Mth::random() + 4 * Mth::cos(Mth::DEGRAD * player->yRot); + if (mob && !MobSpawner::addMob(level, mob, player->x + dx, player->y, player->z + dz, Mth::random()*360, 0, true)) + delete mob; + } + } + + if (key == Keyboard::KEY_X) { + const EntityList& entities = level->getAllEntities(); + for (int i = entities.size()-1; i >= 0; --i) { + Entity* e = entities[i]; + if (!e->isPlayer()) + level->removeEntity(e); + } + } + + if (key == Keyboard::KEY_C /*|| key == 4*/) { + player->inventory->clearInventoryWithDefault(); + // @todo: Add saving here for benchmarking + } + if (key == Keyboard::KEY_H) { + setScreen( new PrerenderTilesScreen() ); + } + + if (key == Keyboard::KEY_O) { + for (int i = Inventory::MAX_SELECTION_SIZE; i < player->inventory->getContainerSize(); ++i) + if (player->inventory->getItem(i)) + player->inventory->dropSlot(i, false); + } + if (key == Keyboard::KEY_F3) { + options.renderDebug = !options.renderDebug; + } + if (key == Keyboard::KEY_M) { + options.difficulty = (options.difficulty == Difficulty::PEACEFUL)? + Difficulty::NORMAL : Difficulty::PEACEFUL; + //setIsCreativeMode( !isCreativeMode() ); + } + + // lanternroci + if (key == Keyboard::KEY_ESCAPE) + pauseGame(false); + if (key == Keyboard::KEY_E && !options.isFlying) { + screenChooser.setScreen(SCREEN_BLOCKSELECTION); + } + + if (options.renderDebug) { + if (key >= '0' && key <= '9') { + _perfRenderer->debugFpsMeterKeyPress(key - '0'); + } + } + #endif + + #ifndef RPI + if (key == 82) + pauseGame(false); + #else + if (key == Keyboard::KEY_ESCAPE) + pauseGame(false); + #endif + + #ifndef OPENGL_ES + if (key == Keyboard::KEY_P) { + static bool isWireFrame = false; + isWireFrame = !isWireFrame; + glPolygonMode(GL_FRONT, isWireFrame? GL_LINE : GL_FILL); + //glPolygonMode(GL_BACK, isWireFrame? GL_LINE : GL_FILL); + } + #endif + } + #ifdef WIN32 + if (key == Keyboard::KEY_M) { + for (int i = 0; i < 5 * SharedConstants::TicksPerSecond; ++i) + level->tick(); + } + #endif + + + //if (!isPressed) LOGI("Key released: %d\n", key); + + if (!options.useMouseForDigging) { + int passedTime = getTimeMs() - lastTickTime; + if (passedTime > 200) continue; + + // Destroy and attack is on same button + if (key == options.keyDestroy.key && isPressed) { + BuildActionIntention bai(BuildActionIntention::BAI_REMOVE | BuildActionIntention::BAI_ATTACK); + handleBuildAction(&bai); + } + else // Build and use/interact is on same button + if (key == options.keyUse.key && isPressed) { + BuildActionIntention bai(BuildActionIntention::BAI_BUILD | BuildActionIntention::BAI_INTERACT); + handleBuildAction(&bai); + } + } + } + + TIMER_POP_PUSH("tickbuild"); + BuildActionIntention bai; + // @note: This might be a problem. This method is polling based here, but + // event based when using mouse (or keys..), and in java. Not quite + // sure just yet what way to go. + bool buildHandled = inputHolder->getBuildInput()->tickBuild(player, &bai); + if (buildHandled) { + if (!bai.isRemoveContinue()) + handleBuildAction(&bai); + } + + bool isTryingToDestroyBlock = (options.useMouseForDigging + ? (Mouse::isButtonDown(MouseAction::ACTION_LEFT) && mouseDiggable) + : Keyboard::isKeyDown(options.keyDestroy.key)) + || (buildHandled && bai.isRemove()); + + TIMER_POP_PUSH("handlemouse"); +#ifdef RPI + handleMouseDown(MouseAction::ACTION_LEFT, isTryingToDestroyBlock); + handleMouseClick(buildHandled && bai.isInteract() + || options.useMouseForDigging && Mouse::isButtonDown(MouseAction::ACTION_RIGHT)); +#else + handleMouseDown(MouseAction::ACTION_LEFT, isTryingToDestroyBlock || (buildHandled && bai.isInteract())); +#endif + + lastTickTime = getTimeMs(); + + // we have (hopefully) handled the keyboard & mouse queue and it + // can now be emptied. If wanted, the reset could be changed to: + // index -= numRead; // then this code doesn't have to be placed here + // + it prepares for tick not handling all or any events. + // update: RAII'ing instead, see above + //Keyboard::reset(); + //Mouse::reset(); + + TIMER_POP(); +#endif +} + +void Minecraft::handleMouseDown(int button, bool down) { +#ifndef STANDALONE_SERVER +#ifndef RPI + if(player->isUsingItem()) { + if(!down && !Keyboard::isKeyDown(options.keyUse.key)) { + gameMode->releaseUsingItem(player); + } + return; + } +#endif + if(player->isSleeping()) { + return; + } + if (button == MouseAction::ACTION_LEFT && missTime > 0) return; + if (down && hitResult.type == TILE && button == MouseAction::ACTION_LEFT && !hitResult.indirectHit) { + int x = hitResult.x; + int y = hitResult.y; + int z = hitResult.z; + gameMode->continueDestroyBlock(x, y, z, hitResult.f); + particleEngine->crack(x, y, z, hitResult.f); + player->swing(); + } else { + gameMode->stopDestroyBlock(); + } +#endif +} + +void Minecraft::handleMouseClick(int button) { +// BuildActionIntention bai( +// (button == MouseAction::ACTION_LEFT)? +// BuildActionIntention::BAI_REMOVE +// : BuildActionIntention::BAI_BUILD); +// +// handleBuildAction(&bai); +} + +void Minecraft::handleBuildAction(BuildActionIntention* action) { +#ifndef STANDALONE_SERVER + if (action->isRemove()) { + if (missTime > 0) return; + player->swing(); + } + if(player->isUsingItem()) + return; + bool mayUse = true; + + if (!hitResult.isHit()) { + if (action->isRemove() && !gameMode->isCreativeType()) { + missTime = 10; + } + } else if (hitResult.type == ENTITY) { + if (action->isAttack()) { + player->swing(); + //LOGI("attacking!\n"); + InteractPacket packet(InteractPacket::Attack, player->entityId, hitResult.entity->entityId); + raknetInstance->send(packet); + gameMode->attack(player, hitResult.entity); + } else if (action->isInteract()) { + if (hitResult.entity->interactPreventDefault()) + mayUse = false; + //LOGI("interacting!\n"); + InteractPacket packet(InteractPacket::Interact, player->entityId, hitResult.entity->entityId); + raknetInstance->send(packet); + gameMode->interact(player, hitResult.entity); + } + } else if (hitResult.type == TILE) { + int x = hitResult.x; + int y = hitResult.y; + int z = hitResult.z; + int face = hitResult.f; + + int oldTileId = level->getTile(x, y, z); + Tile* oldTile = Tile::tiles[oldTileId]; + + //bool tryDestroyBlock = false; + + if (action->isRemove()) { + if (!oldTile) + return; + + //LOGI("tile: %s - %d, %d, %d. b: %f - %f\n", oldTile->getDescriptionId().c_str(), x, y, z, oldTile->getBrightness(level, x, y, z), oldTile->getBrightness(level, x, y+1, z)); + level->extinguishFire(x, y, z, hitResult.f); + gameMode->startDestroyBlock(x, y, z, hitResult.f); + } + else { + ItemInstance* item = player->inventory->getSelected(); + if (gameMode->useItemOn(player, level, item, x, y, z, face, hitResult.pos)) { + mayUse = false; + player->swing(); + #ifdef RPI + } else if (item && item->id == ((Item*)Item::sword_iron)->id) { + player->swing(); + #endif + } + if (item && item->count <= 0) { + player->inventory->clearSlot(player->inventory->selected); + } + //} else if (item && item->count != oldCount) { + // gameRenderer->itemInHandRenderer->itemPlaced(); + //} + } + } + if (mayUse && action->isInteract()) { + ItemInstance* item = player->inventory->getSelected(); + if (item && !player->isUsingItem()) { + if (gameMode->useItem(player, level, item)) { + gameRenderer->itemInHandRenderer->itemUsed(); + } + if (item && item->count <= 0) { + player->inventory->clearSlot(player->inventory->selected); + } + } + } +#endif +} + +bool Minecraft::isOnlineClient() +{ + return (level != NULL && level->isClientSide); +} + +bool Minecraft::isOnline() +{ + return netCallback != NULL; +} + +void Minecraft::pauseGame(bool isBackPaused) { +#ifndef STANDALONE_SERVER + if (screen != NULL) return; + screenChooser.setScreen(isBackPaused? SCREEN_PAUSEPREV : SCREEN_PAUSE); +#endif +} +void Minecraft::gameLostFocus() { +#ifndef STANDALONE_SERVER + if(screen != NULL) { + screen->lostFocus(); + } +#endif +} + + +void Minecraft::setScreen( Screen* screen ) +{ +#ifndef STANDALONE_SERVER + Mouse::reset(); + Multitouch::reset(); + Multitouch::resetThisUpdate(); + + if (screenMutex) { + hasScheduledScreen = true; + scheduledScreen = screen; + return; + } + + if (screen != NULL && screen->isErrorScreen()) + return; + if (screen == NULL && level == NULL) + screen = screenChooser.createScreen(SCREEN_STARTMENU); + + if (this->screen != NULL) { + this->screen->removed(); + delete this->screen; + } + + this->screen = screen; + if (screen != NULL) { + releaseMouse(); + //ScreenSizeCalculator ssc = new ScreenSizeCalculator(options, width, height); + int screenWidth = (int)(width * Gui::InvGuiScale); //ssc.getWidth(); + int screenHeight = (int)(height * Gui::InvGuiScale); //ssc.getHeight(); + screen->init(this, screenWidth, screenHeight); + + if (screen->isInGameScreen() && level) { + level->saveLevelData(); + level->saveGame(); + } + + //noRender = false; + } else { + grabMouse(); + } +#endif +} + +void Minecraft::grabMouse() +{ +#ifndef STANDALONE_SERVER + if (mouseGrabbed) return; + mouseGrabbed = true; + mouseHandler.grab(); + //setScreen(NULL); +#endif +} + +void Minecraft::releaseMouse() +{ +#ifndef STANDALONE_SERVER + if (!mouseGrabbed) { + return; + } + if (player) { + player->releaseAllKeys(); + } + mouseGrabbed = false; + mouseHandler.release(); +#endif +} + +bool Minecraft::useTouchscreen() { +#ifdef RPI + return false; +#endif + return options.useTouchScreen || !_supportsNonTouchscreen; +} +bool Minecraft::supportNonTouchScreen() { + return _supportsNonTouchscreen; +} +void Minecraft::init() +{ + options.minecraft = this; + options.initDefaultValues(); +#ifndef STANDALONE_SERVER + checkGlError("Init enter"); + + _supportsNonTouchscreen = !platform()->supportsTouchscreen(); + + LOGI("IS TOUCHSCREEN? %d\n", options.useTouchScreen); + + textures = new Textures(&options, platform()); + textures->addDynamicTexture(new WaterTexture()); + textures->addDynamicTexture(new WaterSideTexture()); + gui.texturesLoaded(textures); + + levelRenderer = new LevelRenderer(this); + gameRenderer = new GameRenderer(this); + particleEngine = new ParticleEngine(level, textures); + + // Platform specific initialization here + font = new Font(&options, "font/default8.png", textures); + + _perfRenderer = new PerfRenderer(this, font); + + checkGlError("Init complete"); +#endif + + user = new User("TestUser", ""); + setIsCreativeMode(false); // false means it's Survival Mode + reloadOptions(); + +} + +void Minecraft::setSize(int w, int h) { +#ifndef STANDALONE_SERVER + transformResolution(&w, &h); + + width = w; + height = h; + + if (width >= 1000) { + #ifdef __APPLE__ + Gui::GuiScale = (width > 2000)? 8.0f : 4.0f; + #else + Gui::GuiScale = 4.0f; + #endif + } + else if (width >= 800) { +#ifdef __APPLE__ + Gui::GuiScale = 4.0f; +#else + Gui::GuiScale = 3.0f; +#endif + } + else if (width >= 400) + Gui::GuiScale = 2.0f; + else + Gui::GuiScale = 1.0f; + + Gui::InvGuiScale = 1.0f / Gui::GuiScale; + int screenWidth = (int)(width * Gui::InvGuiScale); + int screenHeight = (int)(height * Gui::InvGuiScale); + + if (platform()) { + float pixelsPerMillimeter = options.getProgressValue(&Options::Option::PIXELS_PER_MILLIMETER); + pixelCalc.setPixelsPerMillimeter(pixelsPerMillimeter); + pixelCalcUi.setPixelsPerMillimeter(pixelsPerMillimeter * Gui::InvGuiScale); + } + + Config config = createConfig(this); + gui.onConfigChanged(config); + + if (screen) + screen->setSize(screenWidth, screenHeight); + + if (inputHolder) + inputHolder->onConfigChanged(config); + //LOGI("Setting size: %d, %d: %f\n", width, height, Gui::InvGuiScale); + +#ifdef WIN32 + char resbuf[128]; + sprintf(resbuf, " %d x %d @ scale %.2f", width, height, Gui::GuiScale); + //gui.addMessage(resbuf); +#endif +#endif /* STANDALONE_SERVER */ +} + +void Minecraft::reloadOptions() { + options.update(); + options.save(); + bool wasTouchscreen = options.useTouchScreen; + options.useTouchScreen = useTouchscreen(); + options.save(); + + if ((wasTouchscreen != options.useTouchScreen) || (inputHolder == 0)) + _reloadInput(); + + user->name = options.username; + + LOGI("Reloading-options\n"); + + // @todo @fix Android and iOS behaves a bit differently when leaving + // an options screen (Android recreates OpenGL surface) + setSize(width, height); +} + +void Minecraft::_reloadInput() { +#ifndef STANDALONE_SERVER + delete inputHolder; + + if (useTouchscreen()) { + inputHolder = new TouchInputHolder(this, &options); + } else { + #if defined(ANDROID) || defined(__APPLE__) + inputHolder = new CustomInputHolder( + new XperiaPlayInput(&options), + new ControllerTurnInput(2, ControllerTurnInput::MODE_DELTA), + new IBuildInput()); + #else + inputHolder = new CustomInputHolder( + new KeyboardInput(&options), + new MouseTurnInput(MouseTurnInput::MODE_DELTA, width/2, height/2), + new MouseBuildInput()); + #endif + } + + mouseHandler.setTurnInput(inputHolder->getTurnInput()); + if (level && player) { + player->input = inputHolder->getMoveInput(); + } +#endif +} + + +// +// Multiplayer +// +void Minecraft::locateMultiplayer() { +#ifndef WIN32 + isLookingForMultiplayer = true; + + raknetInstance->pingForHosts(19132); + netCallback = new ClientSideNetworkHandler(this, raknetInstance); +#else + // Server discovery/ping-for-hosts isn't supported/reliable on Windows in this build. + isLookingForMultiplayer = false; + // Ensure any previous list is cleared and no callback is left active + raknetInstance->clearServerList(); + if (netCallback) { delete netCallback; netCallback = NULL; } +#endif +} + +void Minecraft::cancelLocateMultiplayer() { +#ifndef WIN32 + isLookingForMultiplayer = false; + + raknetInstance->stopPingForHosts(); + + delete netCallback; + netCallback = NULL; +#else + // Nothing to stop on Windows; just ensure state is clean + isLookingForMultiplayer = false; + raknetInstance->clearServerList(); + if (netCallback) { delete netCallback; netCallback = NULL; } +#endif +} + +bool Minecraft::joinMultiplayer( const PingedCompatibleServer& server ) +{ + if (isLookingForMultiplayer && netCallback) { + isLookingForMultiplayer = false; + return raknetInstance->connect(server.address.ToString(false), server.address.GetPort()); + } + return false; +} + +void Minecraft::hostMultiplayer(int port) { + // Tear down last instance + raknetInstance->disconnect(); + delete netCallback; + netCallback = NULL; + +#if !defined(NO_NETWORK) + netCallback = new ServerSideNetworkHandler(this, raknetInstance); + #ifdef STANDALONE_SERVER + raknetInstance->host(user->name, port, 16); + #else + raknetInstance->host(user->name, port); + #endif +#endif +} + +// +// Level generation +// +/*static*/ + + void* Minecraft::prepareLevel_tspawn(void *p_param) +{ + Minecraft* mc = (Minecraft*) p_param; + mc->generateLevel("Currently not used", mc->level); + return 0; +} + +void Minecraft::generateLevel( const std::string& message, Level* level ) +{ + Stopwatch s; + s.start(); + prepareLevel(message); + s.stop(); + s.print("Level generated: "); + + // "Unlock" + isGeneratingLevel = false; +} + +void Minecraft::_levelGenerated() +{ +#ifndef STANDALONE_SERVER + if (player == NULL) { + player = (LocalPlayer*) gameMode->createPlayer(level); + gameMode->initPlayer(player); + } + + if (player) { + player->input = inputHolder->getMoveInput(); + } + + if (levelRenderer != NULL) levelRenderer->setLevel(level); + if (particleEngine != NULL) particleEngine->setLevel(level); + + gameMode->adjustPlayer(player); + gui.onLevelGenerated(); +#endif + + level->validateSpawn(); + level->loadPlayer(player, true); + // if we are client side, we trust the server to have given us a correct position + if (player && !level->isClientSide) { + player->resetPos(false); + } + + this->cameraTargetPlayer = player; + + if (raknetInstance->isServer()) + raknetInstance->announceServer(user->name); + + if (netCallback) { + netCallback->levelGenerated(level); + } + +#if defined(WIN32) || defined(RPI) + if (_commandServer) { + delete _commandServer; + } + _commandServer = new CommandServer(this); + _commandServer->init(commandPort); +#endif + + // Hack to (hopefully) get the players to show (note: in LevelListener + // instead, since adding yourself always generates a entityAdded) + //EntityRenderDispatcher::getInstance()->onGraphicsReset(); + _hasSignaledGeneratingLevelFinished = true; +} + +Player* Minecraft::respawnPlayer(int playerId) { + for (unsigned int i = 0; i < level->players.size(); ++i) { + if (level->players[i]->entityId == playerId) { + resetPlayer(level->players[i]); + return level->players[i]; + } + } + return NULL; +} + +void Minecraft::resetPlayer(Player* player) { + level->validateSpawn(); + player->reset(); + + Pos p; + if(player->hasRespawnPosition()) { + p = player->getRespawnPosition(); + } + else { + p = level->getSharedSpawnPos(); + } + player->setPos((float)p.x + 0.5f, (float)p.y + 1.0f, (float)p.z + 0.5f); + player->resetPos(true); + + if (isCreativeMode()) + player->inventory->clearInventoryWithDefault(); +} + +void Minecraft::respawnPlayer() { + // RESET THE FRACKING PLAYER HERE + //bool slowCheck = false; + //for (int i = 0; i < level->entities.size(); ++i) + // if (level->entities[i] == player) slowCheck = true; + // + //LOGI("Has entity? %d, %d\n", level->getEntity(player->entityId), slowCheck); + + resetPlayer(player); + + // tell server (or other client) that we re-spawned + RespawnPacket packet(player); + raknetInstance->send(packet); +} + +void Minecraft::onGraphicsReset() +{ +#ifndef STANDALONE_SERVER + textures->clear(); + + font->onGraphicsReset(); + gui.onGraphicsReset(); + + if (levelRenderer) levelRenderer->onGraphicsReset(); + if (gameRenderer) gameRenderer->onGraphicsReset(); + + EntityRenderDispatcher::getInstance()->onGraphicsReset(); + TileEntityRenderDispatcher::getInstance()->onGraphicsReset(); +#endif +} + +int Minecraft::getProgressStatusId() { + return progressStageStatusId; +} + +const char* Minecraft::getProgressMessage() +{ + return progressMessages[progressStageStatusId]; +} + +bool Minecraft::isLevelGenerated() +{ + return level != NULL && !isGeneratingLevel; +} + +LevelStorageSource* Minecraft::getLevelSource() +{ + return storageSource; +} + +int Minecraft::getLicenseId() { + if (!LicenseCodes::isReady(_licenseId)) + _licenseId = platform()->checkLicense(); + return _licenseId; +} + +void Minecraft::audioEngineOn() { +#ifndef STANDALONE_SERVER + soundEngine->enable(true); +#endif +} +void Minecraft::audioEngineOff() { +#ifndef STANDALONE_SERVER + soundEngine->enable(false); +#endif +} + +void Minecraft::setIsCreativeMode(bool isCreative) +{ +#ifdef CREATORMODE + delete gameMode; + gameMode = new CreatorMode(this); + _isCreativeMode = true; +#else + if (!gameMode || isCreative != _isCreativeMode) + { + delete gameMode; + if (isCreative) gameMode = new CreativeMode(this); + else gameMode = new SurvivalMode(this); + _isCreativeMode = isCreative; + } +#endif + if (player) + gameMode->initAbilities(player->abilities); +} + +bool Minecraft::isCreativeMode() { + return _isCreativeMode; +} + +bool Minecraft::isKindleFire(int kindleVersion) { + if (kindleVersion != 1) + return false; + + std::string model = platform()->getPlatformStringVar(PlatformStringVars::DEVICE_BUILD_MODEL); + std::string modelLower(model); + std::transform(modelLower.begin(), modelLower.end(), modelLower.begin(), tolower); + + return (modelLower.find("kindle") != std::string::npos) && (modelLower.find("fire") != std::string::npos); +} + +bool Minecraft::transformResolution(int* w, int* h) +{ + bool changed = false; + + // Kindle Fire 1: reporting wrong height in + // certain cases (e.g. after screen lock) + if (isKindleFire(1) && *h >= 560 && *h <= 620) { + *h = 580; + changed = true; + } + + return changed; +} + +ICreator* Minecraft::getCreator() +{ +#ifdef CREATORMODE + return ((CreatorMode*)gameMode)->getCreator(); +#else + return NULL; +#endif +} + +void Minecraft::optionUpdated( const Options::Option* option, bool value ) { + if(netCallback != NULL && option == &Options::Option::SERVER_VISIBLE) { + ServerSideNetworkHandler* ss = (ServerSideNetworkHandler*) netCallback; + ss->allowIncomingConnections(value); + } +} + +void Minecraft::optionUpdated( const Options::Option* option, float value ) { +#ifndef STANDALONE_SERVER + if(option == &Options::Option::PIXELS_PER_MILLIMETER) { + pixelCalcUi.setPixelsPerMillimeter(value * Gui::InvGuiScale); + pixelCalc.setPixelsPerMillimeter(value); + } +#endif +} + +void Minecraft::optionUpdated( const Options::Option* option, int value ) { + +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/79E19DA4287B508903835C567387403F b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/79E19DA4287B508903835C567387403F new file mode 100644 index 0000000..45852ad --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/79E19DA4287B508903835C567387403F @@ -0,0 +1,233 @@ +#ifndef NET_MINECRAFT_CLIENT__Minecraft_H__ +#define NET_MINECRAFT_CLIENT__Minecraft_H__ + +#include "Options.h" +#ifndef STANDALONE_SERVER +#include "MouseHandler.h" +#endif +#include "Timer.h" +#include "player/input/ITurnInput.h" +#ifndef STANDALONE_SERVER +#include "gui/Gui.h" +#include "gui/screens/ScreenChooser.h" +#endif +//#include "../network/RakNetInstance.h" +#include "../world/phys/HitResult.h" + +class User; +class Level; +class LocalPlayer; +class IInputHolder; +class Mob; +class Player; +class LevelRenderer; +class GameRenderer; +class ParticleEngine; +class Entity; +class ICreator; +class GameMode; +class Textures; +class CThread; +class SoundEngine; +class Screen; +class Font; +class LevelStorageSource; +class BuildActionIntention; +class PerfRenderer; +class LevelSettings; +class IRakNetInstance; +class NetEventCallback; +class CommandServer; +struct PingedCompatibleServer; +//class ExternalFileLevelStorageSource; + + +#include "../App.h" +#include "PixelCalc.h" +class AppPlatform; +class AppPlatform_android; + +class Minecraft: public App +{ +protected: + Minecraft(); +public: + virtual ~Minecraft(); + + void init(); + void setSize(int width, int height); + void reloadOptions(); + + bool supportNonTouchScreen(); + bool useTouchscreen(); + void grabMouse(); + void releaseMouse(); + + void handleBuildAction(BuildActionIntention*); + + void toggleDimension(){} + bool isCreativeMode(); + void setIsCreativeMode(bool isCreative); + void setScreen(Screen*); + + virtual void selectLevel(const std::string& levelId, const std::string& levelName, const LevelSettings& settings); + virtual void setLevel(Level* level, const std::string& message = "", LocalPlayer* forceInsertPlayer = NULL); + + void generateLevel( const std::string& message, Level* level ); + LevelStorageSource* getLevelSource(); + + bool isLookingForMultiplayer; + void locateMultiplayer(); + void cancelLocateMultiplayer(); + bool joinMultiplayer(const PingedCompatibleServer& server); + void hostMultiplayer(int port=19132); + Player* respawnPlayer(int playerId); + void respawnPlayer(); + void resetPlayer(Player* player); + void doActuallyRespawnPlayer(); + + void update(); + + void tick(int nTick, int maxTick); + void tickInput(); + + bool isOnlineClient(); + bool isOnline(); + void pauseGame(bool isBackPaused); + void gameLostFocus(); + + void prepareLevel(const std::string& message); + + void leaveGame(bool renameLevel = false); + + int getProgressStatusId(); + const char* getProgressMessage(); + + ICreator* getCreator(); + + // void onGraphicsLost() {} + void onGraphicsReset(); + + bool isLevelGenerated(); + int getLicenseId(); + + void audioEngineOn(); + void audioEngineOff(); + + bool isPowerVR() { return _powerVr; } + bool isKindleFire(int kindleVersion); + bool transformResolution(int* w, int* h); + void optionUpdated(const Options::Option* option, bool value); + void optionUpdated(const Options::Option* option, float value); + void optionUpdated(const Options::Option* option, int value); +#ifdef __APPLE__ + bool _isSuperFast; + bool isSuperFast() { return _isSuperFast; } +#endif + +protected: + void _levelGenerated(); + +private: + static void* prepareLevel_tspawn(void *p_param); + + void handleMouseClick(int button); + void handleMouseDown(int button, bool down); + + void _reloadInput(); +public: + int width; + int height; + + // Vars that the platform is allowed to use in the future + int commandPort; + int reserved_d1, reserved_d2; + float reserved_f1, reserved_f2; + + Options options; + + static bool useAmbientOcclusion; + //static bool threadInterrupt; + + volatile bool pause; + + LevelRenderer* levelRenderer; + GameRenderer* gameRenderer; + ParticleEngine* particleEngine; + SoundEngine* soundEngine; + + GameMode* gameMode; +#ifndef STANDALONE_SERVER + Textures* textures; + ScreenChooser screenChooser; + Font* font; +#endif + IRakNetInstance* raknetInstance; + NetEventCallback* netCallback; + + int lastTime; + int lastTickTime; + float ticksSinceLastUpdate; + + User* user; + Level* level; + + LocalPlayer* player; + IInputHolder* inputHolder; + Mob* cameraTargetPlayer; +#ifndef STANDALONE_SERVER + Gui gui; +#endif + CThread* generateLevelThread; + Screen* screen; + static int customDebugId; + + static const int CDI_NONE = 0; + static const int CDI_GRAPHICS = 1; +#ifndef STANDALONE_SERVER + MouseHandler mouseHandler; +#endif + bool mouseGrabbed; + + PixelCalc pixelCalc; + PixelCalc pixelCalcUi; + + HitResult hitResult; + volatile int progressStagePercentage; + + // This field is initialized in main() + // It sets the base path to where worlds can be written (sdcard on android) + std::string externalStoragePath; + std::string externalCacheStoragePath; +protected: + Timer timer; + // @note @attn @warn: this is dangerous as fuck! + volatile bool isGeneratingLevel; + bool _hasSignaledGeneratingLevelFinished; + + LevelStorageSource* storageSource; + bool _running; + bool _powerVr; + +private: + volatile int progressStageStatusId; + static const char* progressMessages[]; + + int missTime; + int ticks; + bool screenMutex; + bool hasScheduledScreen; + Screen* scheduledScreen; + + int _licenseId; + bool _supportsNonTouchscreen; + + bool _isCreativeMode; + //int _respawnPlayerTicks; + Player* _pendingRemovePlayer; // @attn @todo @fix: remove this shait and fix the respawn behaviour + + PerfRenderer* _perfRenderer; + CommandServer* _commandServer; +}; + +#endif /*NET_MINECRAFT_CLIENT__Minecraft_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/8194D297C941B6BC9AB98BDA59117A32 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/8194D297C941B6BC9AB98BDA59117A32 new file mode 100644 index 0000000..45852ad --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/8194D297C941B6BC9AB98BDA59117A32 @@ -0,0 +1,233 @@ +#ifndef NET_MINECRAFT_CLIENT__Minecraft_H__ +#define NET_MINECRAFT_CLIENT__Minecraft_H__ + +#include "Options.h" +#ifndef STANDALONE_SERVER +#include "MouseHandler.h" +#endif +#include "Timer.h" +#include "player/input/ITurnInput.h" +#ifndef STANDALONE_SERVER +#include "gui/Gui.h" +#include "gui/screens/ScreenChooser.h" +#endif +//#include "../network/RakNetInstance.h" +#include "../world/phys/HitResult.h" + +class User; +class Level; +class LocalPlayer; +class IInputHolder; +class Mob; +class Player; +class LevelRenderer; +class GameRenderer; +class ParticleEngine; +class Entity; +class ICreator; +class GameMode; +class Textures; +class CThread; +class SoundEngine; +class Screen; +class Font; +class LevelStorageSource; +class BuildActionIntention; +class PerfRenderer; +class LevelSettings; +class IRakNetInstance; +class NetEventCallback; +class CommandServer; +struct PingedCompatibleServer; +//class ExternalFileLevelStorageSource; + + +#include "../App.h" +#include "PixelCalc.h" +class AppPlatform; +class AppPlatform_android; + +class Minecraft: public App +{ +protected: + Minecraft(); +public: + virtual ~Minecraft(); + + void init(); + void setSize(int width, int height); + void reloadOptions(); + + bool supportNonTouchScreen(); + bool useTouchscreen(); + void grabMouse(); + void releaseMouse(); + + void handleBuildAction(BuildActionIntention*); + + void toggleDimension(){} + bool isCreativeMode(); + void setIsCreativeMode(bool isCreative); + void setScreen(Screen*); + + virtual void selectLevel(const std::string& levelId, const std::string& levelName, const LevelSettings& settings); + virtual void setLevel(Level* level, const std::string& message = "", LocalPlayer* forceInsertPlayer = NULL); + + void generateLevel( const std::string& message, Level* level ); + LevelStorageSource* getLevelSource(); + + bool isLookingForMultiplayer; + void locateMultiplayer(); + void cancelLocateMultiplayer(); + bool joinMultiplayer(const PingedCompatibleServer& server); + void hostMultiplayer(int port=19132); + Player* respawnPlayer(int playerId); + void respawnPlayer(); + void resetPlayer(Player* player); + void doActuallyRespawnPlayer(); + + void update(); + + void tick(int nTick, int maxTick); + void tickInput(); + + bool isOnlineClient(); + bool isOnline(); + void pauseGame(bool isBackPaused); + void gameLostFocus(); + + void prepareLevel(const std::string& message); + + void leaveGame(bool renameLevel = false); + + int getProgressStatusId(); + const char* getProgressMessage(); + + ICreator* getCreator(); + + // void onGraphicsLost() {} + void onGraphicsReset(); + + bool isLevelGenerated(); + int getLicenseId(); + + void audioEngineOn(); + void audioEngineOff(); + + bool isPowerVR() { return _powerVr; } + bool isKindleFire(int kindleVersion); + bool transformResolution(int* w, int* h); + void optionUpdated(const Options::Option* option, bool value); + void optionUpdated(const Options::Option* option, float value); + void optionUpdated(const Options::Option* option, int value); +#ifdef __APPLE__ + bool _isSuperFast; + bool isSuperFast() { return _isSuperFast; } +#endif + +protected: + void _levelGenerated(); + +private: + static void* prepareLevel_tspawn(void *p_param); + + void handleMouseClick(int button); + void handleMouseDown(int button, bool down); + + void _reloadInput(); +public: + int width; + int height; + + // Vars that the platform is allowed to use in the future + int commandPort; + int reserved_d1, reserved_d2; + float reserved_f1, reserved_f2; + + Options options; + + static bool useAmbientOcclusion; + //static bool threadInterrupt; + + volatile bool pause; + + LevelRenderer* levelRenderer; + GameRenderer* gameRenderer; + ParticleEngine* particleEngine; + SoundEngine* soundEngine; + + GameMode* gameMode; +#ifndef STANDALONE_SERVER + Textures* textures; + ScreenChooser screenChooser; + Font* font; +#endif + IRakNetInstance* raknetInstance; + NetEventCallback* netCallback; + + int lastTime; + int lastTickTime; + float ticksSinceLastUpdate; + + User* user; + Level* level; + + LocalPlayer* player; + IInputHolder* inputHolder; + Mob* cameraTargetPlayer; +#ifndef STANDALONE_SERVER + Gui gui; +#endif + CThread* generateLevelThread; + Screen* screen; + static int customDebugId; + + static const int CDI_NONE = 0; + static const int CDI_GRAPHICS = 1; +#ifndef STANDALONE_SERVER + MouseHandler mouseHandler; +#endif + bool mouseGrabbed; + + PixelCalc pixelCalc; + PixelCalc pixelCalcUi; + + HitResult hitResult; + volatile int progressStagePercentage; + + // This field is initialized in main() + // It sets the base path to where worlds can be written (sdcard on android) + std::string externalStoragePath; + std::string externalCacheStoragePath; +protected: + Timer timer; + // @note @attn @warn: this is dangerous as fuck! + volatile bool isGeneratingLevel; + bool _hasSignaledGeneratingLevelFinished; + + LevelStorageSource* storageSource; + bool _running; + bool _powerVr; + +private: + volatile int progressStageStatusId; + static const char* progressMessages[]; + + int missTime; + int ticks; + bool screenMutex; + bool hasScheduledScreen; + Screen* scheduledScreen; + + int _licenseId; + bool _supportsNonTouchscreen; + + bool _isCreativeMode; + //int _respawnPlayerTicks; + Player* _pendingRemovePlayer; // @attn @todo @fix: remove this shait and fix the respawn behaviour + + PerfRenderer* _perfRenderer; + CommandServer* _commandServer; +}; + +#endif /*NET_MINECRAFT_CLIENT__Minecraft_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/81E4292BB6C934C66197FADE2715F758 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/81E4292BB6C934C66197FADE2715F758 new file mode 100644 index 0000000..18d0f9c --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/81E4292BB6C934C66197FADE2715F758 @@ -0,0 +1,236 @@ +#ifndef NET_MINECRAFT_CLIENT__Minecraft_H__ +#define NET_MINECRAFT_CLIENT__Minecraft_H__ + +#include "Options.h" +#ifndef STANDALONE_SERVER +#include "MouseHandler.h" +#endif +#include "Timer.h" +#include "player/input/ITurnInput.h" +#ifndef STANDALONE_SERVER +#include "gui/Gui.h" +#include "gui/screens/ScreenChooser.h" +#endif +//#include "../network/RakNetInstance.h" +#include "../world/phys/HitResult.h" + +class User; +class Level; +class LocalPlayer; +class IInputHolder; +class Mob; +class Player; +class LevelRenderer; +class GameRenderer; +class ParticleEngine; +class Entity; +class ICreator; +class GameMode; +class Textures; +class CThread; +class SoundEngine; +class Screen; +class Font; +class LevelStorageSource; +class BuildActionIntention; +class PerfRenderer; +class LevelSettings; +class IRakNetInstance; +class NetEventCallback; +class CommandServer; +struct PingedCompatibleServer; +//class ExternalFileLevelStorageSource; + + +#include "../App.h" +#include "PixelCalc.h" +class AppPlatform; +class AppPlatform_android; + +class Minecraft: public App +{ +protected: + Minecraft(); +public: + virtual ~Minecraft(); + + void init(); + void setSize(int width, int height); + void reloadOptions(); + + bool supportNonTouchScreen(); + bool useTouchscreen(); + void grabMouse(); + void releaseMouse(); + + void handleBuildAction(BuildActionIntention*); + + void toggleDimension(){} + bool isCreativeMode(); + void setIsCreativeMode(bool isCreative); + void setScreen(Screen*); + + virtual void selectLevel(const std::string& levelId, const std::string& levelName, const LevelSettings& settings); + virtual void setLevel(Level* level, const std::string& message = "", LocalPlayer* forceInsertPlayer = NULL); + + void generateLevel( const std::string& message, Level* level ); + LevelStorageSource* getLevelSource(); + + bool isLookingForMultiplayer; + void locateMultiplayer(); + void cancelLocateMultiplayer(); + bool joinMultiplayer(const PingedCompatibleServer& server); + void hostMultiplayer(int port=19132); + Player* respawnPlayer(int playerId); + void respawnPlayer(); + void resetPlayer(Player* player); + void doActuallyRespawnPlayer(); + + void update(); + + void tick(int nTick, int maxTick); + void tickInput(); + + bool isOnlineClient(); + bool isOnline(); + void pauseGame(bool isBackPaused); + void gameLostFocus(); + + void prepareLevel(const std::string& message); + + void leaveGame(bool renameLevel = false); + + int getProgressStatusId(); + const char* getProgressMessage(); + + ICreator* getCreator(); + + // void onGraphicsLost() {} + void onGraphicsReset(); + + bool isLevelGenerated(); + int getLicenseId(); + + void audioEngineOn(); + void audioEngineOff(); + + bool isPowerVR() { return _powerVr; } + bool isKindleFire(int kindleVersion); + bool transformResolution(int* w, int* h); + void optionUpdated(const Options::Option* option, bool value); + void optionUpdated(const Options::Option* option, float value); + void optionUpdated(const Options::Option* option, int value); +#ifdef __APPLE__ + bool _isSuperFast; + bool isSuperFast() { return _isSuperFast; } +#endif + + // Connect to a host by hostname/IP and port. Returns true on successful connect() call. + bool connectToHost(const std::string& host, int port); + +protected: + void _levelGenerated(); + +private: + static void* prepareLevel_tspawn(void *p_param); + + void handleMouseClick(int button); + void handleMouseDown(int button, bool down); + + void _reloadInput(); +public: + int width; + int height; + + // Vars that the platform is allowed to use in the future + int commandPort; + int reserved_d1, reserved_d2; + float reserved_f1, reserved_f2; + + Options options; + + static bool useAmbientOcclusion; + //static bool threadInterrupt; + + volatile bool pause; + + LevelRenderer* levelRenderer; + GameRenderer* gameRenderer; + ParticleEngine* particleEngine; + SoundEngine* soundEngine; + + GameMode* gameMode; +#ifndef STANDALONE_SERVER + Textures* textures; + ScreenChooser screenChooser; + Font* font; +#endif + IRakNetInstance* raknetInstance; + NetEventCallback* netCallback; + + int lastTime; + int lastTickTime; + float ticksSinceLastUpdate; + + User* user; + Level* level; + + LocalPlayer* player; + IInputHolder* inputHolder; + Mob* cameraTargetPlayer; +#ifndef STANDALONE_SERVER + Gui gui; +#endif + CThread* generateLevelThread; + Screen* screen; + static int customDebugId; + + static const int CDI_NONE =0; + static const int CDI_GRAPHICS =1; +#ifndef STANDALONE_SERVER + MouseHandler mouseHandler; +#endif + bool mouseGrabbed; + + PixelCalc pixelCalc; + PixelCalc pixelCalcUi; + + HitResult hitResult; + volatile int progressStagePercentage; + + // This field is initialized in main() + // It sets the base path to where worlds can be written (sdcard on android) + std::string externalStoragePath; + std::string externalCacheStoragePath; +protected: + Timer timer; + // @note @attn @warn: this is dangerous as fuck! + volatile bool isGeneratingLevel; + bool _hasSignaledGeneratingLevelFinished; + + LevelStorageSource* storageSource; + bool _running; + bool _powerVr; + +private: + volatile int progressStageStatusId; + static const char* progressMessages[]; + + int missTime; + int ticks; + bool screenMutex; + bool hasScheduledScreen; + Screen* scheduledScreen; + + int _licenseId; + bool _supportsNonTouchscreen; + + bool _isCreativeMode; + //int _respawnPlayerTicks; + Player* _pendingRemovePlayer; // @attn @todo @fix: remove this shait and fix the respawn behaviour + + PerfRenderer* _perfRenderer; + CommandServer* _commandServer; +}; + +#endif /*NET_MINECRAFT_CLIENT__Minecraft_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/83105CECE6AA00603D9DA1057156A4A0 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/83105CECE6AA00603D9DA1057156A4A0 new file mode 100644 index 0000000..55155fc --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/83105CECE6AA00603D9DA1057156A4A0 @@ -0,0 +1,146 @@ +#include "TextEditScreen.h" +#include "../../../world/level/tile/entity/SignTileEntity.h" +#include "../../../AppPlatform.h" +#include "../../Minecraft.h" +#include "../../renderer/tileentity/TileEntityRenderDispatcher.h" +#include "../../renderer/Tesselator.h" +#include "../../renderer/Textures.h" +#include "../../renderer/GameRenderer.h" +#include "../components/Button.h" +#include "../../../network/Packet.h" +#include "../../../network/RakNetInstance.h" +TextEditScreen::TextEditScreen( SignTileEntity* signEntity ) + : sign(signEntity), isShowingKeyboard(false), frame(0), line(0), btnClose(1, "") { + +} +TextEditScreen::~TextEditScreen() { + +} +void TextEditScreen::init() { + super::init(); + minecraft->platform()->showKeyboard(); + isShowingKeyboard = true; + ImageDef def; + def.name = "gui/spritesheet.png"; + def.x = 0; + def.y = 1; + def.width = def.height = 18; + def.setSrc(IntRectangle(60, 0, 18, 18)); + btnClose.setImageDef(def, true); + btnClose.scaleWhenPressed = false; + buttons.push_back(&btnClose); +} + +void TextEditScreen::setupPositions() { + btnClose.width = btnClose.height = 19; + btnClose.x = width - btnClose.width; + btnClose.y = 0; +} + + +bool TextEditScreen::handleBackEvent( bool isDown ) { + sign->setChanged(); + Packet* signUpdatePacket = sign->getUpdatePacket(); + minecraft->raknetInstance->send(signUpdatePacket); + minecraft->platform()->hideKeyboard(); + minecraft->setScreen(NULL); + return true; +} + +void TextEditScreen::render( int xm, int ym, float a ) { + glDepthMask(GL_FALSE); + renderBackground(); + glPushMatrix(); + glDepthMask(GL_TRUE); + glDisable(GL_CULL_FACE); + glLoadIdentity(); + Tesselator& t = Tesselator::instance; + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrthof(0.0f, (float)minecraft->width, (float)minecraft->height, 0, -1, 1); + glMatrixMode(GL_MODELVIEW); + + minecraft->textures->loadAndBindTexture("item/sign.png"); + glColor4f2(1, 1, 1, 1); + + static float minUV[] = {0.03126f, 0.06249f}; + static float maxUV[] = {0.39063f, 0.4374f}; + float scale = ((minecraft->height / 2) / 32) * 0.9f; + + glTranslatef(minecraft->width / 2.0f, 5.0f, 0.0f); + glScalef2(scale,scale,1); + t.begin(GL_QUADS); + t.vertexUV(-32, 0, 0.0f,minUV[0],minUV[1]); + t.vertexUV(32, 0, 0.0f, maxUV[0], minUV[1]); + t.vertexUV(32, 0 + 32, 0.0f, maxUV[0], maxUV[1]); + t.vertexUV(-32, 0 + 32, 0.0f, minUV[0], maxUV[1]); + t.draw(); + + sign->selectedLine = line; + float textScale = 8.0f / 11.0f; + + glTranslatef(0, 2 ,0); + glScalef2(textScale, textScale, 1); + for(int i = 0; i < 4; ++i) { + //drawCenteredString(font, sign->messages[a], 32.0f, 10 * a, 0xFF000000); + std::string msg = sign->messages[i]; + if (i == sign->selectedLine && msg.length() < 14) { + std::string s = "> " + msg + " <"; + font->draw(s, -(float)font->width(s) / 2.0f, 10.0f * i, 0xFF000000, false); + } else { + font->draw(msg, -(float)font->width(msg) / 2.0f, 10.0f * i, 0xFF000000, false); + } + } + sign->selectedLine = -1; + //font->draw("Hej", minecraft->width / 2, 100, 0xFFFFFFFF, false); + + glPopMatrix(); + glEnable(GL_CULL_FACE); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + + //glEnable(GL_DEPTH_TEST); + super::render(xm, ym, a); +} + +void TextEditScreen::lostFocus() { + +} + +void TextEditScreen::tick() { + frame++; +} + +void TextEditScreen::keyPressed( int eventKey ) { + LOGW("Key pressed! [%d]", eventKey); + if(eventKey == Keyboard::KEY_BACKSPACE) { + if(sign->messages[line].length() > 0) { + sign->messages[line].erase(sign->messages[line].size() - 1, 1); + } else { + line--; + if(line < 0) { + line = 3; + } + } + } else if(eventKey == Keyboard::KEY_RETURN) { + line = (line + 1) % 4; + } else { + super::keyPressed(eventKey); + } +} + +void TextEditScreen::keyboardNewChar( char inputChar ) { + std::string fullstring = sign->messages[line] + inputChar; + if(fullstring.length() < 16) { + sign->messages[line] = fullstring; + //LOGW("Line text updated: %s\n", fullstring.c_str()); + } +} + +void TextEditScreen::buttonClicked( Button* button ) { + if(button == &btnClose) + handleBackEvent(true); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/832E134E1AA59F5696B023CDF9799D34 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/832E134E1AA59F5696B023CDF9799D34 new file mode 100644 index 0000000..6d1460d --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/832E134E1AA59F5696B023CDF9799D34 @@ -0,0 +1,133 @@ +#include "TouchJoinGameScreen.h" +#include "../StartMenuScreen.h" +#include "../ProgressScreen.h" +#include "../../Font.h" +#include "../../../Minecraft.h" +#include "../../../renderer/Textures.h" +#include "../../../../network/RakNetInstance.h" +#include "../../../../network/ClientSideNetworkHandler.h" +#include "../../NetworkingHelpers.h" + +namespace Touch { + +JoinGameScreen::JoinGameScreen() +: bJoin(2, "Join Game"), + bBack(3, "Back"), + bHeader(0, "Join by address"), + ip(5, "IP:Port (host:19132)") +{ + bJoin.active = true; +} + +JoinGameScreen::~JoinGameScreen() +{ +} + +void JoinGameScreen::init() +{ + buttons.push_back(&bBack); + buttons.push_back(&bJoin); + buttons.push_back(&bHeader); + + textBoxes.push_back(&ip); + +#ifdef ANDROID + tabButtons.push_back(&bBack); + tabButtons.push_back(&bJoin); +#endif +} + +void JoinGameScreen::setupPositions() { + const int yBase =10; + + // header at top + bHeader.y = yBase; + bHeader.width = width; + bHeader.x =0; + + // textbox below header + ip.x = width/2 -140/2; + ip.y = bHeader.y +28; + ip.w =140; + + // buttons at bottom + const int btnW =120; + const int btnH =26; + bJoin.width = btnW; bJoin.height = btnH; + bBack.width = btnW; bBack.height = btnH; + + bJoin.y = height -30; + bBack.y = height -30; + + bJoin.x = width /2 -4 - bJoin.width; + bBack.x = width /2 +4; +} + +void JoinGameScreen::buttonClicked(Button* button) +{ + if (button->id == bJoin.id) + { + std::string addr = ip.text; + auto trim = [](std::string &s) { + size_t start =0; + while (start < s.size() && std::isspace((unsigned char)s[start])) ++start; + size_t end = s.size(); + while (end > start && std::isspace((unsigned char)s[end -1])) --end; + s = s.substr(start, end - start); + }; + trim(addr); + if (!addr.empty()) { + std::string host = addr; + int port =19132; + size_t colon = addr.find(':'); + if (colon != std::string::npos) { + host = addr.substr(0, colon); + std::string portStr = addr.substr(colon +1); + trim(host); + trim(portStr); + if (!portStr.empty()) port = std::atoi(portStr.c_str()); + } else trim(host); + if (!host.empty()) { + startConnect(minecraft, host, port); + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + } + } + if (button->id == bBack.id) + { + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } +} + +bool JoinGameScreen::handleBackEvent(bool isDown) +{ + if (!isDown) { + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } + return true; +} + +bool JoinGameScreen::isIndexValid( int index ) +{ + return false; +} + +void JoinGameScreen::tick() +{ +} + +void JoinGameScreen::render( int xm, int ym, float a ) +{ + renderBackground(); + // render textbox explicitly + for (unsigned int i =0; i < textBoxes.size(); ++i) { + textBoxes[i]->render(minecraft, xm, ym); + } + Screen::render(xm, ym, a); +} + +bool JoinGameScreen::isInGameScreen() { return false; } + +}; diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/83EB053BEB8FE82CA9D7BA6D09FCA996 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/83EB053BEB8FE82CA9D7BA6D09FCA996 new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/83EB053BEB8FE82CA9D7BA6D09FCA996 @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/9CAB88584C535B15B7D916C84A38AB20 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/9CAB88584C535B15B7D916C84A38AB20 new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/9CAB88584C535B15B7D916C84A38AB20 @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/AF8821B3E089A14209FA7C2F8B96C378 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/AF8821B3E089A14209FA7C2F8B96C378 new file mode 100644 index 0000000..b60f96c --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/AF8821B3E089A14209FA7C2F8B96C378 @@ -0,0 +1,132 @@ +#include "TouchJoinGameScreen.h" +#include "../StartMenuScreen.h" +#include "../ProgressScreen.h" +#include "../../Font.h" +#include "../../../Minecraft.h" +#include "../../../renderer/Textures.h" + +namespace Touch { + +JoinGameScreen::JoinGameScreen() +: bJoin(2, "Join Game"), + bBack(3, "Back"), + bHeader(0, "Join by address"), + ip(5, "IP:Port (host:19132)") +{ + bJoin.active = true; +} + +JoinGameScreen::~JoinGameScreen() +{ +} + +void JoinGameScreen::init() +{ + buttons.push_back(&bBack); + buttons.push_back(&bJoin); + buttons.push_back(&bHeader); + + textBoxes.push_back(&ip); + +#ifdef ANDROID + tabButtons.push_back(&bBack); + tabButtons.push_back(&bJoin); +#endif +} + +void JoinGameScreen::setupPositions() { + const int yBase =10; + + // header at top + bHeader.y = yBase; + bHeader.width = width; + bHeader.x =0; + + // textbox below header + ip.x = width/2 -140/2; + ip.y = bHeader.y +28; + ip.w =140; + + // buttons at bottom + const int btnW =120; + const int btnH =26; + bJoin.width = btnW; bJoin.height = btnH; + bBack.width = btnW; bBack.height = btnH; + + bJoin.y = height -30; + bBack.y = height -30; + + bJoin.x = width /2 -4 - bJoin.width; + bBack.x = width /2 +4; +} + +void JoinGameScreen::buttonClicked(Button* button) +{ + if (button->id == bJoin.id) + { + std::string addr = ip.text; + auto trim = [](std::string &s) { + size_t start =0; + while (start < s.size() && std::isspace((unsigned char)s[start])) ++start; + size_t end = s.size(); + while (end > start && std::isspace((unsigned char)s[end -1])) --end; + s = s.substr(start, end - start); + }; + trim(addr); + if (!addr.empty()) { + std::string host = addr; + int port =19132; + size_t colon = addr.find(':'); + if (colon != std::string::npos) { + host = addr.substr(0, colon); + std::string portStr = addr.substr(colon +1); + trim(host); + trim(portStr); + if (!portStr.empty()) port = std::atoi(portStr.c_str()); + } else trim(host); + if (!host.empty()) { + if (minecraft->netCallback) { delete minecraft->netCallback; minecraft->netCallback = NULL; } + minecraft->netCallback = new ClientSideNetworkHandler(minecraft, minecraft->raknetInstance); + minecraft->raknetInstance->connect(host.c_str(), port); + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + } + } + if (button->id == bBack.id) + { + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } +} + +bool JoinGameScreen::handleBackEvent(bool isDown) +{ + if (!isDown) { + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } + return true; +} + +bool JoinGameScreen::isIndexValid( int index ) +{ + return false; +} + +void JoinGameScreen::tick() +{ +} + +void JoinGameScreen::render( int xm, int ym, float a ) +{ + renderBackground(); + // render textbox explicitly + for (unsigned int i =0; i < textBoxes.size(); ++i) { + textBoxes[i]->render(minecraft, xm, ym); + } + Screen::render(xm, ym, a); +} + +bool JoinGameScreen::isInGameScreen() { return false; } + +}; diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/BC02B5BE97EE41AD143867BF9D2CA9E4 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/BC02B5BE97EE41AD143867BF9D2CA9E4 new file mode 100644 index 0000000..2fc962a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/BC02B5BE97EE41AD143867BF9D2CA9E4 @@ -0,0 +1,134 @@ +#include "TouchJoinGameScreen.h" +#include "../StartMenuScreen.h" +#include "../ProgressScreen.h" +#include "../../Font.h" +#include "../../../Minecraft.h" +#include "../../../renderer/Textures.h" +#include "../../../../network/RakNetInstance.h" +#include "../../../../network/ClientSideNetworkHandler.h" + +namespace Touch { + +JoinGameScreen::JoinGameScreen() +: bJoin(2, "Join Game"), + bBack(3, "Back"), + bHeader(0, "Join by address"), + ip(5, "IP:Port (host:19132)") +{ + bJoin.active = true; +} + +JoinGameScreen::~JoinGameScreen() +{ +} + +void JoinGameScreen::init() +{ + buttons.push_back(&bBack); + buttons.push_back(&bJoin); + buttons.push_back(&bHeader); + + textBoxes.push_back(&ip); + +#ifdef ANDROID + tabButtons.push_back(&bBack); + tabButtons.push_back(&bJoin); +#endif +} + +void JoinGameScreen::setupPositions() { + const int yBase =10; + + // header at top + bHeader.y = yBase; + bHeader.width = width; + bHeader.x =0; + + // textbox below header + ip.x = width/2 -140/2; + ip.y = bHeader.y +28; + ip.w =140; + + // buttons at bottom + const int btnW =120; + const int btnH =26; + bJoin.width = btnW; bJoin.height = btnH; + bBack.width = btnW; bBack.height = btnH; + + bJoin.y = height -30; + bBack.y = height -30; + + bJoin.x = width /2 -4 - bJoin.width; + bBack.x = width /2 +4; +} + +void JoinGameScreen::buttonClicked(Button* button) +{ + if (button->id == bJoin.id) + { + std::string addr = ip.text; + auto trim = [](std::string &s) { + size_t start =0; + while (start < s.size() && std::isspace((unsigned char)s[start])) ++start; + size_t end = s.size(); + while (end > start && std::isspace((unsigned char)s[end -1])) --end; + s = s.substr(start, end - start); + }; + trim(addr); + if (!addr.empty()) { + std::string host = addr; + int port =19132; + size_t colon = addr.find(':'); + if (colon != std::string::npos) { + host = addr.substr(0, colon); + std::string portStr = addr.substr(colon +1); + trim(host); + trim(portStr); + if (!portStr.empty()) port = std::atoi(portStr.c_str()); + } else trim(host); + if (!host.empty()) { + if (minecraft->netCallback) { delete minecraft->netCallback; minecraft->netCallback = NULL; } + minecraft->netCallback = new ClientSideNetworkHandler(minecraft, minecraft->raknetInstance); + minecraft->raknetInstance->connect(host.c_str(), port); + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + } + } + if (button->id == bBack.id) + { + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } +} + +bool JoinGameScreen::handleBackEvent(bool isDown) +{ + if (!isDown) { + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } + return true; +} + +bool JoinGameScreen::isIndexValid( int index ) +{ + return false; +} + +void JoinGameScreen::tick() +{ +} + +void JoinGameScreen::render( int xm, int ym, float a ) +{ + renderBackground(); + // render textbox explicitly + for (unsigned int i =0; i < textBoxes.size(); ++i) { + textBoxes[i]->render(minecraft, xm, ym); + } + Screen::render(xm, ym, a); +} + +bool JoinGameScreen::isInGameScreen() { return false; } + +}; diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/C3F667CE0537A8BB2B4636D2C8DF5F4D b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/C3F667CE0537A8BB2B4636D2C8DF5F4D new file mode 100644 index 0000000..f1a7b8a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/C3F667CE0537A8BB2B4636D2C8DF5F4D @@ -0,0 +1,132 @@ +#include "TouchJoinGameScreen.h" +#include "../StartMenuScreen.h" +#include "../ProgressScreen.h" +#include "../../Font.h" +#include "../../../Minecraft.h" +#include "../../../renderer/Textures.h" +#include "../../../../network/RakNetInstance.h" +#include "../../../../network/ClientSideNetworkHandler.h" + +namespace Touch { + +JoinGameScreen::JoinGameScreen() +: bJoin(2, "Join Game"), + bBack(3, "Back"), + bHeader(0, "Join by address"), + ip(5, "IP:Port (host:19132)") +{ + bJoin.active = true; +} + +JoinGameScreen::~JoinGameScreen() +{ +} + +void JoinGameScreen::init() +{ + buttons.push_back(&bBack); + buttons.push_back(&bJoin); + buttons.push_back(&bHeader); + + textBoxes.push_back(&ip); + +#ifdef ANDROID + tabButtons.push_back(&bBack); + tabButtons.push_back(&bJoin); +#endif +} + +void JoinGameScreen::setupPositions() { + const int yBase =10; + + // header at top + bHeader.y = yBase; + bHeader.width = width; + bHeader.x =0; + + // textbox below header + ip.x = width/2 -140/2; + ip.y = bHeader.y +28; + ip.w =140; + + // buttons at bottom + const int btnW =120; + const int btnH =26; + bJoin.width = btnW; bJoin.height = btnH; + bBack.width = btnW; bBack.height = btnH; + + bJoin.y = height -30; + bBack.y = height -30; + + bJoin.x = width /2 -4 - bJoin.width; + bBack.x = width /2 +4; +} + +void JoinGameScreen::buttonClicked(Button* button) +{ + if (button->id == bJoin.id) + { + std::string addr = ip.text; + auto trim = [](std::string &s) { + size_t start =0; + while (start < s.size() && std::isspace((unsigned char)s[start])) ++start; + size_t end = s.size(); + while (end > start && std::isspace((unsigned char)s[end -1])) --end; + s = s.substr(start, end - start); + }; + trim(addr); + if (!addr.empty()) { + std::string host = addr; + int port =19132; + size_t colon = addr.find(':'); + if (colon != std::string::npos) { + host = addr.substr(0, colon); + std::string portStr = addr.substr(colon +1); + trim(host); + trim(portStr); + if (!portStr.empty()) port = std::atoi(portStr.c_str()); + } else trim(host); + if (!host.empty()) { + minecraft->connectToHost(host, port); + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + } + } + if (button->id == bBack.id) + { + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } +} + +bool JoinGameScreen::handleBackEvent(bool isDown) +{ + if (!isDown) { + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } + return true; +} + +bool JoinGameScreen::isIndexValid( int index ) +{ + return false; +} + +void JoinGameScreen::tick() +{ +} + +void JoinGameScreen::render( int xm, int ym, float a ) +{ + renderBackground(); + // render textbox explicitly + for (unsigned int i =0; i < textBoxes.size(); ++i) { + textBoxes[i]->render(minecraft, xm, ym); + } + Screen::render(xm, ym, a); +} + +bool JoinGameScreen::isInGameScreen() { return false; } + +}; diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/CE0BE2BEA449C06BA4A335C13CF44C53 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/CE0BE2BEA449C06BA4A335C13CF44C53 new file mode 100644 index 0000000..3fcfe72 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/CE0BE2BEA449C06BA4A335C13CF44C53 @@ -0,0 +1,134 @@ +#include "TouchJoinGameScreen.h" +#include "../StartMenuScreen.h" +#include "../ProgressScreen.h" +#include "../../Font.h" +#include "../../../Minecraft.h" +#include "../../../renderer/Textures.h" +#include "../../../network/RakNetInstance.h" +#include "../../../network/ClientSideNetworkHandler.h" + +namespace Touch { + +JoinGameScreen::JoinGameScreen() +: bJoin(2, "Join Game"), + bBack(3, "Back"), + bHeader(0, "Join by address"), + ip(5, "IP:Port (host:19132)") +{ + bJoin.active = true; +} + +JoinGameScreen::~JoinGameScreen() +{ +} + +void JoinGameScreen::init() +{ + buttons.push_back(&bBack); + buttons.push_back(&bJoin); + buttons.push_back(&bHeader); + + textBoxes.push_back(&ip); + +#ifdef ANDROID + tabButtons.push_back(&bBack); + tabButtons.push_back(&bJoin); +#endif +} + +void JoinGameScreen::setupPositions() { + const int yBase =10; + + // header at top + bHeader.y = yBase; + bHeader.width = width; + bHeader.x =0; + + // textbox below header + ip.x = width/2 -140/2; + ip.y = bHeader.y +28; + ip.w =140; + + // buttons at bottom + const int btnW =120; + const int btnH =26; + bJoin.width = btnW; bJoin.height = btnH; + bBack.width = btnW; bBack.height = btnH; + + bJoin.y = height -30; + bBack.y = height -30; + + bJoin.x = width /2 -4 - bJoin.width; + bBack.x = width /2 +4; +} + +void JoinGameScreen::buttonClicked(Button* button) +{ + if (button->id == bJoin.id) + { + std::string addr = ip.text; + auto trim = [](std::string &s) { + size_t start =0; + while (start < s.size() && std::isspace((unsigned char)s[start])) ++start; + size_t end = s.size(); + while (end > start && std::isspace((unsigned char)s[end -1])) --end; + s = s.substr(start, end - start); + }; + trim(addr); + if (!addr.empty()) { + std::string host = addr; + int port =19132; + size_t colon = addr.find(':'); + if (colon != std::string::npos) { + host = addr.substr(0, colon); + std::string portStr = addr.substr(colon +1); + trim(host); + trim(portStr); + if (!portStr.empty()) port = std::atoi(portStr.c_str()); + } else trim(host); + if (!host.empty()) { + if (minecraft->netCallback) { delete minecraft->netCallback; minecraft->netCallback = NULL; } + minecraft->netCallback = new ClientSideNetworkHandler(minecraft, minecraft->raknetInstance); + minecraft->raknetInstance->connect(host.c_str(), port); + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + } + } + if (button->id == bBack.id) + { + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } +} + +bool JoinGameScreen::handleBackEvent(bool isDown) +{ + if (!isDown) { + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } + return true; +} + +bool JoinGameScreen::isIndexValid( int index ) +{ + return false; +} + +void JoinGameScreen::tick() +{ +} + +void JoinGameScreen::render( int xm, int ym, float a ) +{ + renderBackground(); + // render textbox explicitly + for (unsigned int i =0; i < textBoxes.size(); ++i) { + textBoxes[i]->render(minecraft, xm, ym); + } + Screen::render(xm, ym, a); +} + +bool JoinGameScreen::isInGameScreen() { return false; } + +}; diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/E19DC915D7B7F4D40A50F260C758DAD9 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/E19DC915D7B7F4D40A50F260C758DAD9 new file mode 100644 index 0000000..8b4d6da --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/E19DC915D7B7F4D40A50F260C758DAD9 @@ -0,0 +1,80 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI__Screen_H__ +#define NET_MINECRAFT_CLIENT_GUI__Screen_H__ + +//package net.minecraft.client.gui; + +#include +#include "GuiComponent.h" + +class Font; +class Minecraft; +class Button; +class TextBox; +struct IntRectangle; + +class Screen: public GuiComponent +{ +public: + Screen(); + + virtual void render(int xm, int ym, float a); + + void init(Minecraft* minecraft, int width, int height); + virtual void init(); + + void setSize(int width, int height); + virtual void setupPositions() {}; + + virtual void updateEvents(); + virtual void mouseEvent(); + virtual void keyboardEvent(); + virtual void keyboardTextEvent(); + virtual bool handleBackEvent(bool isDown); + + virtual void tick() {} + + virtual void removed() {} + + virtual void renderBackground(); + virtual void renderBackground(int vo); + virtual void renderDirtBackground(int vo); + // query + virtual bool renderGameBehind(); + virtual bool hasClippingArea(IntRectangle& out); + + virtual bool isPauseScreen(); + virtual bool isErrorScreen(); + virtual bool isInGameScreen(); + virtual bool closeOnPlayerHurt(); + + virtual void confirmResult(bool result, int id) {} + virtual void lostFocus(); + virtual void toGUICoordinate(int& x, int& y); +protected: + void updateTabButtonSelection(); + + virtual void buttonClicked(Button* button) {} + virtual void mouseClicked(int x, int y, int buttonNum); + virtual void mouseReleased(int x, int y, int buttonNum); + + virtual void keyPressed(int eventKey); + virtual void keyboardNewChar(char inputChar) {} +public: + int width; + int height; + bool passEvents; + //GuiParticles* particles; +protected: + Minecraft* minecraft; + std::vector buttons; + std::vector textBoxes; + + std::vector tabButtons; + int tabButtonIndex; + + Font* font; +private: + Button* clickedButton; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI__Screen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/E25FB3B811E26EA86767132ABFD6C0FE b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/E25FB3B811E26EA86767132ABFD6C0FE new file mode 100644 index 0000000..45852ad --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/E25FB3B811E26EA86767132ABFD6C0FE @@ -0,0 +1,233 @@ +#ifndef NET_MINECRAFT_CLIENT__Minecraft_H__ +#define NET_MINECRAFT_CLIENT__Minecraft_H__ + +#include "Options.h" +#ifndef STANDALONE_SERVER +#include "MouseHandler.h" +#endif +#include "Timer.h" +#include "player/input/ITurnInput.h" +#ifndef STANDALONE_SERVER +#include "gui/Gui.h" +#include "gui/screens/ScreenChooser.h" +#endif +//#include "../network/RakNetInstance.h" +#include "../world/phys/HitResult.h" + +class User; +class Level; +class LocalPlayer; +class IInputHolder; +class Mob; +class Player; +class LevelRenderer; +class GameRenderer; +class ParticleEngine; +class Entity; +class ICreator; +class GameMode; +class Textures; +class CThread; +class SoundEngine; +class Screen; +class Font; +class LevelStorageSource; +class BuildActionIntention; +class PerfRenderer; +class LevelSettings; +class IRakNetInstance; +class NetEventCallback; +class CommandServer; +struct PingedCompatibleServer; +//class ExternalFileLevelStorageSource; + + +#include "../App.h" +#include "PixelCalc.h" +class AppPlatform; +class AppPlatform_android; + +class Minecraft: public App +{ +protected: + Minecraft(); +public: + virtual ~Minecraft(); + + void init(); + void setSize(int width, int height); + void reloadOptions(); + + bool supportNonTouchScreen(); + bool useTouchscreen(); + void grabMouse(); + void releaseMouse(); + + void handleBuildAction(BuildActionIntention*); + + void toggleDimension(){} + bool isCreativeMode(); + void setIsCreativeMode(bool isCreative); + void setScreen(Screen*); + + virtual void selectLevel(const std::string& levelId, const std::string& levelName, const LevelSettings& settings); + virtual void setLevel(Level* level, const std::string& message = "", LocalPlayer* forceInsertPlayer = NULL); + + void generateLevel( const std::string& message, Level* level ); + LevelStorageSource* getLevelSource(); + + bool isLookingForMultiplayer; + void locateMultiplayer(); + void cancelLocateMultiplayer(); + bool joinMultiplayer(const PingedCompatibleServer& server); + void hostMultiplayer(int port=19132); + Player* respawnPlayer(int playerId); + void respawnPlayer(); + void resetPlayer(Player* player); + void doActuallyRespawnPlayer(); + + void update(); + + void tick(int nTick, int maxTick); + void tickInput(); + + bool isOnlineClient(); + bool isOnline(); + void pauseGame(bool isBackPaused); + void gameLostFocus(); + + void prepareLevel(const std::string& message); + + void leaveGame(bool renameLevel = false); + + int getProgressStatusId(); + const char* getProgressMessage(); + + ICreator* getCreator(); + + // void onGraphicsLost() {} + void onGraphicsReset(); + + bool isLevelGenerated(); + int getLicenseId(); + + void audioEngineOn(); + void audioEngineOff(); + + bool isPowerVR() { return _powerVr; } + bool isKindleFire(int kindleVersion); + bool transformResolution(int* w, int* h); + void optionUpdated(const Options::Option* option, bool value); + void optionUpdated(const Options::Option* option, float value); + void optionUpdated(const Options::Option* option, int value); +#ifdef __APPLE__ + bool _isSuperFast; + bool isSuperFast() { return _isSuperFast; } +#endif + +protected: + void _levelGenerated(); + +private: + static void* prepareLevel_tspawn(void *p_param); + + void handleMouseClick(int button); + void handleMouseDown(int button, bool down); + + void _reloadInput(); +public: + int width; + int height; + + // Vars that the platform is allowed to use in the future + int commandPort; + int reserved_d1, reserved_d2; + float reserved_f1, reserved_f2; + + Options options; + + static bool useAmbientOcclusion; + //static bool threadInterrupt; + + volatile bool pause; + + LevelRenderer* levelRenderer; + GameRenderer* gameRenderer; + ParticleEngine* particleEngine; + SoundEngine* soundEngine; + + GameMode* gameMode; +#ifndef STANDALONE_SERVER + Textures* textures; + ScreenChooser screenChooser; + Font* font; +#endif + IRakNetInstance* raknetInstance; + NetEventCallback* netCallback; + + int lastTime; + int lastTickTime; + float ticksSinceLastUpdate; + + User* user; + Level* level; + + LocalPlayer* player; + IInputHolder* inputHolder; + Mob* cameraTargetPlayer; +#ifndef STANDALONE_SERVER + Gui gui; +#endif + CThread* generateLevelThread; + Screen* screen; + static int customDebugId; + + static const int CDI_NONE = 0; + static const int CDI_GRAPHICS = 1; +#ifndef STANDALONE_SERVER + MouseHandler mouseHandler; +#endif + bool mouseGrabbed; + + PixelCalc pixelCalc; + PixelCalc pixelCalcUi; + + HitResult hitResult; + volatile int progressStagePercentage; + + // This field is initialized in main() + // It sets the base path to where worlds can be written (sdcard on android) + std::string externalStoragePath; + std::string externalCacheStoragePath; +protected: + Timer timer; + // @note @attn @warn: this is dangerous as fuck! + volatile bool isGeneratingLevel; + bool _hasSignaledGeneratingLevelFinished; + + LevelStorageSource* storageSource; + bool _running; + bool _powerVr; + +private: + volatile int progressStageStatusId; + static const char* progressMessages[]; + + int missTime; + int ticks; + bool screenMutex; + bool hasScheduledScreen; + Screen* scheduledScreen; + + int _licenseId; + bool _supportsNonTouchscreen; + + bool _isCreativeMode; + //int _respawnPlayerTicks; + Player* _pendingRemovePlayer; // @attn @todo @fix: remove this shait and fix the respawn behaviour + + PerfRenderer* _perfRenderer; + CommandServer* _commandServer; +}; + +#endif /*NET_MINECRAFT_CLIENT__Minecraft_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/E500CB5CAB2083B168B56C85BAFB25B1 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/E500CB5CAB2083B168B56C85BAFB25B1 new file mode 100644 index 0000000..f1a7b8a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/E500CB5CAB2083B168B56C85BAFB25B1 @@ -0,0 +1,132 @@ +#include "TouchJoinGameScreen.h" +#include "../StartMenuScreen.h" +#include "../ProgressScreen.h" +#include "../../Font.h" +#include "../../../Minecraft.h" +#include "../../../renderer/Textures.h" +#include "../../../../network/RakNetInstance.h" +#include "../../../../network/ClientSideNetworkHandler.h" + +namespace Touch { + +JoinGameScreen::JoinGameScreen() +: bJoin(2, "Join Game"), + bBack(3, "Back"), + bHeader(0, "Join by address"), + ip(5, "IP:Port (host:19132)") +{ + bJoin.active = true; +} + +JoinGameScreen::~JoinGameScreen() +{ +} + +void JoinGameScreen::init() +{ + buttons.push_back(&bBack); + buttons.push_back(&bJoin); + buttons.push_back(&bHeader); + + textBoxes.push_back(&ip); + +#ifdef ANDROID + tabButtons.push_back(&bBack); + tabButtons.push_back(&bJoin); +#endif +} + +void JoinGameScreen::setupPositions() { + const int yBase =10; + + // header at top + bHeader.y = yBase; + bHeader.width = width; + bHeader.x =0; + + // textbox below header + ip.x = width/2 -140/2; + ip.y = bHeader.y +28; + ip.w =140; + + // buttons at bottom + const int btnW =120; + const int btnH =26; + bJoin.width = btnW; bJoin.height = btnH; + bBack.width = btnW; bBack.height = btnH; + + bJoin.y = height -30; + bBack.y = height -30; + + bJoin.x = width /2 -4 - bJoin.width; + bBack.x = width /2 +4; +} + +void JoinGameScreen::buttonClicked(Button* button) +{ + if (button->id == bJoin.id) + { + std::string addr = ip.text; + auto trim = [](std::string &s) { + size_t start =0; + while (start < s.size() && std::isspace((unsigned char)s[start])) ++start; + size_t end = s.size(); + while (end > start && std::isspace((unsigned char)s[end -1])) --end; + s = s.substr(start, end - start); + }; + trim(addr); + if (!addr.empty()) { + std::string host = addr; + int port =19132; + size_t colon = addr.find(':'); + if (colon != std::string::npos) { + host = addr.substr(0, colon); + std::string portStr = addr.substr(colon +1); + trim(host); + trim(portStr); + if (!portStr.empty()) port = std::atoi(portStr.c_str()); + } else trim(host); + if (!host.empty()) { + minecraft->connectToHost(host, port); + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + } + } + if (button->id == bBack.id) + { + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } +} + +bool JoinGameScreen::handleBackEvent(bool isDown) +{ + if (!isDown) { + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } + return true; +} + +bool JoinGameScreen::isIndexValid( int index ) +{ + return false; +} + +void JoinGameScreen::tick() +{ +} + +void JoinGameScreen::render( int xm, int ym, float a ) +{ + renderBackground(); + // render textbox explicitly + for (unsigned int i =0; i < textBoxes.size(); ++i) { + textBoxes[i]->render(minecraft, xm, ym); + } + Screen::render(xm, ym, a); +} + +bool JoinGameScreen::isInGameScreen() { return false; } + +}; diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/F1B770EB0BD1C56318A3D75B68049C1D b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/F1B770EB0BD1C56318A3D75B68049C1D new file mode 100644 index 0000000..bbafff6 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/F1B770EB0BD1C56318A3D75B68049C1D @@ -0,0 +1,1578 @@ +#include "Minecraft.h" + +#if defined(APPLE_DEMO_PROMOTION) + #define NO_NETWORK +#endif + +#if defined(RPI) + #define CREATORMODE +#endif + +#include "../network/RakNetInstance.h" +#include "../network/ClientSideNetworkHandler.h" +#include "../network/ServerSideNetworkHandler.h" +//#include "../network/Packet.h" +#include "../world/entity/player/Inventory.h" +#include "../world/level/chunk/ChunkCache.h" +#include "../world/level/tile/Tile.h" +#include "../world/level/storage/LevelStorageSource.h" +#include "../world/level/storage/LevelStorage.h" +#include "player/input/KeyboardInput.h" +#ifndef STANDALONE_SERVER +#include "player/input/touchscreen/TouchInputHolder.h" +#endif +#include "player/LocalPlayer.h" +#include "gamemode/CreativeMode.h" +#include "gamemode/SurvivalMode.h" +#include "player/LocalPlayer.h" +#ifndef STANDALONE_SERVER +#include "particle/ParticleEngine.h" +#include "gui/Screen.h" +#include "gui/Font.h" +#include "gui/screens/RenameMPLevelScreen.h" +#include "sound/SoundEngine.h" +#endif +#include "../platform/CThread.h" +#include "../platform/input/Mouse.h" +#include "../AppPlatform.h" +#include "../Performance.h" +#include "../LicenseCodes.h" +#include "../util/PerfTimer.h" +#include "../util/PerfRenderer.h" +#include "player/input/MouseBuildInput.h" + +#include "../world/Facing.h" + +#include "../network/packet/PlaceBlockPacket.h" + +#include "player/input/IInputHolder.h" +#ifndef STANDALONE_SERVER +#include "player/input/touchscreen/TouchscreenInput.h" + +#include "player/input/ControllerTurnInput.h" +#include "player/input/XperiaPlayInput.h" + +#endif + +#include "player/input/MouseTurnInput.h" +#include "../world/entity/MobFactory.h" +#include "../world/level/MobSpawner.h" +#include "../util/Mth.h" +#include "../network/packet/InteractPacket.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/PrerenderTilesScreen.h" +#include "renderer/Textures.h" +#include "gui/screens/DeathScreen.h" +#endif + +#include "../network/packet/RespawnPacket.h" +#include "IConfigListener.h" +#include "../world/entity/MobCategory.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/FurnaceScreen.h" +#endif +#include "../world/Difficulty.h" +#include "../server/ServerLevel.h" +#ifdef CREATORMODE +#include "../server/CreatorLevel.h" +#endif +#include "../network/packet/AdventureSettingsPacket.h" +#include "../network/packet/SetSpawnPositionPacket.h" +#include "../network/command/CommandServer.h" +#include "gamemode/CreatorMode.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/ArmorScreen.h" +#endif +#include "../world/level/levelgen/synth/ImprovedNoise.h" +#ifndef STANDALONE_SERVER +#include "renderer/tileentity/TileEntityRenderDispatcher.h" +#endif + +#ifndef STANDALONE_SERVER +#include "renderer/ptexture/DynamicTexture.h" +#include "renderer/GameRenderer.h" +#include "renderer/ItemInHandRenderer.h" +#include "renderer/LevelRenderer.h" +#include "renderer/entity/EntityRenderDispatcher.h" +#include "gui/Screen.h" +#include "gui/Font.h" +#include "gui/screens/RenameMPLevelScreen.h" +#include "sound/SoundEngine.h" +#endif + +static void checkGlError(const char* tag) { +#ifdef GLDEBUG + while (1) { + const int errCode = glGetError(); + if (errCode == GL_NO_ERROR) break; + + LOGE("################\nOpenGL-error @ %s : #%d\n", tag, errCode); + } +#endif /*GLDEBUG*/ +} + +/*static*/ +const char* Minecraft::progressMessages[] = { + "Locating server", + "Building terrain", + "Preparing", + "Saving chunks" +}; + +int Minecraft::customDebugId = Minecraft::CDI_NONE; + +#if defined(_MSC_VER) + #pragma warning( disable : 4355 ) // 'this' pointer in initialization list which is perfectly legal +#endif + +bool Minecraft::useAmbientOcclusion = false; + +Minecraft::Minecraft() +: user(NULL), + level(NULL), + player(NULL), + cameraTargetPlayer(NULL), + levelRenderer(NULL), + gameRenderer(NULL), +#ifndef STANDALONE_SERVER + particleEngine(NULL), + _perfRenderer(NULL), +#endif + _commandServer(NULL), +#ifndef STANDALONE_SERVER + textures(NULL), +#endif + lastTickTime(-1), + lastTime(0), + ticksSinceLastUpdate(0), + gameMode(NULL), + mouseGrabbed(true), + missTime(0), + pause(false), + _running(false), + timer(20), +#ifndef STANDALONE_SERVER + gui(this), +#endif + netCallback(NULL), +#ifndef STANDALONE_SERVER + screen(NULL), + font(NULL), +#endif + screenMutex(false), +#ifndef STANDALONE_SERVER + scheduledScreen(NULL), + hasScheduledScreen(false), + soundEngine(NULL), +#endif + ticks(0), + isGeneratingLevel(false), + _hasSignaledGeneratingLevelFinished(true), + generateLevelThread(NULL), + progressStagePercentage(0), + progressStageStatusId(0), + isLookingForMultiplayer(false), + _licenseId(LicenseCodes::WAIT_PLATFORM_NOT_READY), + inputHolder(0), + _supportsNonTouchscreen(false), +#ifndef STANDALONE_SERVER + screenChooser(this), +#endif + width(1), height(1), + //_respawnPlayerTicks(-1), +#ifdef __APPLE__ + _isSuperFast(false), +#endif + _powerVr(false), + commandPort(4711), + reserved_d1(0),reserved_d2(0), + reserved_f1(0),reserved_f2(0) +{ +//#ifdef ANDROID + +#if defined(NO_NETWORK) + raknetInstance = new IRakNetInstance(); +#else + raknetInstance = new RakNetInstance(); +#endif +#ifndef STANDALONE_SERVER + soundEngine = new SoundEngine(20.0f); + soundEngine->init(this, &options); +#endif + //setupPieces(); +} + +Minecraft::~Minecraft() +{ + delete netCallback; + delete raknetInstance; +#ifndef STANDALONE_SERVER + delete levelRenderer; + delete gameRenderer; + delete particleEngine; + + delete soundEngine; +#endif + delete gameMode; +#ifndef STANDALONE_SERVER + delete font; + delete textures; + + if (screen != NULL) { + delete screen; + screen = NULL; + } +#endif + if (level != NULL) { + level->saveGame(); + if (level->getChunkSource()) + level->getChunkSource()->saveAll(true); + delete level->getLevelStorage(); + delete level; + level = NULL; + } + + //delete player; + delete user; + delete inputHolder; + + delete storageSource; + delete _perfRenderer; + delete _commandServer; + + MobFactory::clearStaticTestMobs(); +#ifndef STANDALONE_SERVER + EntityRenderDispatcher::destroy(); +#endif +} + +// Only called by server +void Minecraft::selectLevel( const std::string& levelId, const std::string& levelName, const LevelSettings& settings ) +{ +#if defined(CREATORMODE) + level = new CreatorLevel( +#else + level = new ServerLevel( +#endif + storageSource->selectLevel(levelId, false), + levelName, + settings, + SharedConstants::GeneratorVersion); + + // note: settings is useless beyond this point, since it's + // either copied to LevelData (or LevelData read from file) + setLevel(level, "Generating level"); + setIsCreativeMode(level->getLevelData()->getGameType() == GameType::Creative); + _running = true; +} + +void Minecraft::setLevel(Level* level, const std::string& message /* ="" */, LocalPlayer* forceInsertPlayer /* = NULL */) { + cameraTargetPlayer = NULL; + LOGI("Seed is %ld\n", level->getSeed()); + + if (level != NULL) { + level->raknetInstance = raknetInstance; + gameMode->initLevel(level); + + if (!player && forceInsertPlayer) + { + player = forceInsertPlayer; + player->resetPos(false); + //level->addEntity(forceInsertPlayer); + } + else if (player != NULL) { + player->resetPos(false); + if (level != NULL) { + level->addEntity(player); + } + } + this->level = level; + _hasSignaledGeneratingLevelFinished = false; +#ifdef STANDALONE_SERVER + const bool threadedLevelCreation = false; +#else + const bool threadedLevelCreation = true; +#endif + + if (threadedLevelCreation) { + // Threaded + // "Lock" + isGeneratingLevel = true; + generateLevelThread = new CThread(Minecraft::prepareLevel_tspawn, this); + } else { + // Non-threaded + generateLevel("Currently not used", level); + } + } else { + player = NULL; + } + + this->lastTickTime = 0; + this->_running = true; +} + +void Minecraft::leaveGame(bool renameLevel /*=false*/) +{ + if (isGeneratingLevel || !_hasSignaledGeneratingLevelFinished) + return; + + isGeneratingLevel = false; + bool saveLevel = level && (!level->isClientSide || renameLevel); + + raknetInstance->disconnect(); + if (saveLevel) { + // If server or wanting to save level as client, save all unsaved chunks! + level->getChunkSource()->saveAll(true); + } + + LOGI("Clearing levels\n"); + + cameraTargetPlayer = NULL; +#ifndef STANDALONE_SERVER + levelRenderer->setLevel(NULL); + particleEngine->setLevel(NULL); +#endif + LOGI("Erasing callback\n"); + delete netCallback; + netCallback = NULL; + + LOGI("Erasing level\n"); + if (level != NULL) { + delete level->getLevelStorage(); + delete level; + level = NULL; + } + //delete player; + player = NULL; + cameraTargetPlayer = NULL; + + _running = false; +#ifndef STANDALONE_SERVER + if (renameLevel) { + setScreen(new RenameMPLevelScreen(LevelStorageSource::TempLevelId)); + } + else + screenChooser.setScreen(SCREEN_STARTMENU); +#endif +} + +void Minecraft::prepareLevel(const std::string& title) { + LOGI("status: 1\n"); + progressStageStatusId = 1; + + Stopwatch A, B, C, D; + A.start(); + + Stopwatch L; + + // Dont update lights if we load the level (ok, actually just with leveldata version=1.+(?)) + if (!level->isNew()) + level->setUpdateLights(false); + + int Max = CHUNK_CACHE_WIDTH * CHUNK_CACHE_WIDTH; + int pp = 0; + for (int x = 8; x < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); x += CHUNK_WIDTH) { + for (int z = 8; z < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); z += CHUNK_WIDTH) { + progressStagePercentage = 100 * pp++ / Max; + //printf("level generation progress %d\n", progressStagePercentage); + B.start(); + level->getTile(x, 64, z); + B.stop(); + L.start(); + if (level->isNew()) + while (level->updateLights()) + ; + L.stop(); + } + } + A.stop(); + level->setUpdateLights(true); + + C.start(); + for (int x = 0; x < CHUNK_CACHE_WIDTH; x++) + { + for (int z = 0; z < CHUNK_CACHE_WIDTH; z++) + { + LevelChunk* chunk = level->getChunk(x, z); + if (chunk && !chunk->createdFromSave) + { + chunk->unsaved = false; + chunk->clearUpdateMap(); + } + } + } + C.stop(); + + LOGI("status: 3\n"); + progressStageStatusId = 3; + if (level->isNew()) { + level->setInitialSpawn(); // @note: should obviously be called from Level itself + level->saveLevelData(); + level->getChunkSource()->saveAll(false); + level->saveGame(); + } else { + level->saveLevelData(); + level->loadEntities(); + } + + progressStagePercentage = -1; + progressStageStatusId = 2; + LOGI("status: 2\n"); + + D.start(); + level->prepare(); + D.stop(); + + A.print("Generate level: "); + L.print(" - light: "); + B.print(" - getTl: "); + C.print(" - clear: "); + D.print(" - prepr: "); + progressStageStatusId = 0; +} + +void Minecraft::update() { + //LOGI("Enter Update\n"); + + if (Options::debugGl) + LOGI(">>>>>>>>>>\n"); + + TIMER_PUSH("root"); + + //if (level) { + // LOGI("numplayers: %d\n", level->players.size()); + // for (int i = 0; i < level->players.size(); ++i) { + // Player* p = level->players[i]; + // bool inEnt = std::find(level->entities.begin(), level->entities.end(), p) != level->entities.end(); + // LOGI(" %p, %d, %d - in? %d\n", p, p->entityId, p->owner.ToUint32(p->owner), inEnt); + // } + //} + + if (pause && level != NULL) { + float lastA = timer.a; + timer.advanceTime(); + timer.a = lastA; + } else { + timer.advanceTime(); + } + + if (raknetInstance) { + raknetInstance->runEvents(netCallback); + } + + TIMER_PUSH("tick"); + int toTick = timer.ticks; + for (int i = 0; i < toTick; ++i, ++ticks) + tick(i, toTick-1); + + TIMER_POP_PUSH("updatelights"); + if (level && !isGeneratingLevel) { + level->updateLights(); + } + TIMER_POP(); + + #ifndef STANDALONE_SERVER + if (gameMode != NULL) gameMode->render(timer.a); + TIMER_PUSH("sound"); + soundEngine->update(player, timer.a); + TIMER_POP_PUSH("render"); + gameRenderer->render(timer.a); + TIMER_POP(); + #else + CThread::sleep(1); + #endif +#ifndef STANDALONE_SERVER + Multitouch::resetThisUpdate(); +#endif + TIMER_POP(); +#ifndef STANDALONE_SERVER + checkGlError("Update finished"); + + if (options.renderDebug) { + if (!PerfTimer::enabled) { + PerfTimer::reset(); + PerfTimer::enabled = true; + } + + //TIMER_PUSH("debugfps"); + _perfRenderer->renderFpsMeter(1); + checkGlError("render debug"); + //TIMER_POP(); + } else { + PerfTimer::enabled = false; + } +#endif + //LOGI("Exit Update\n"); +} + +void Minecraft::tick(int nTick, int maxTick) { + if (missTime > 0) missTime--; +#ifndef STANDALONE_SERVER + if (!screen && player) { + if (player->health <= 0) { + setScreen(new DeathScreen()); + } + } +#endif + TIMER_PUSH("gameMode"); + if (level && !pause) { + gameMode->tick(); + } + + TIMER_POP_PUSH("commandServer"); + if (level && _commandServer) { + _commandServer->tick(); + } + + TIMER_POP_PUSH("input"); + tickInput(); +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("gui"); + gui.tick(); +#endif + // + // Ongoing level generation in a (perhaps) different thread. When it's + // ready, _levelGenerated() is called once and any threads are deleted. + // + if (isGeneratingLevel) { + return; + } else if (!_hasSignaledGeneratingLevelFinished) { + if (generateLevelThread) { + delete generateLevelThread; + generateLevelThread = NULL; + } + _levelGenerated(); + } + + // + // Normal game loop, run before or efter level generation + // + if (level != NULL) + { + if (!pause) { +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("gameRenderer"); + gameRenderer->tick(nTick, maxTick); + + TIMER_POP_PUSH("levelRenderer"); + levelRenderer->tick(); +#endif + level->difficulty = options.difficulty; + if (level->isClientSide) level->difficulty = Difficulty::EASY; + + TIMER_POP_PUSH("level"); + level->tickEntities(); + level->tick(); +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("animateTick"); + if (player) { + level->animateTick(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); + } +#endif + } + } +#ifndef STANDALONE_SERVER + textures->loadAndBindTexture("terrain.png"); + if (!pause && !(screen && !screen->renderGameBehind())) { + #if !defined(RPI) + #ifdef __APPLE__ + if (isSuperFast()) + #endif + { + if (nTick == maxTick) { + TIMER_POP_PUSH("textures"); + textures->tick(true); + } + } + #endif + } + TIMER_POP_PUSH("particles"); + particleEngine->tick(); + if (screen) { + screenMutex = true; + screen->tick(); + screenMutex = false; + } + + // @note: fix to keep "isPressed" and "isReleased" as long as necessary. + // Most likely keyboard and mouse could/should be reset here as well. + Multitouch::reset(); +#endif + TIMER_POP(); +} + +class InputRAII { +public: + ~InputRAII() { +#ifndef STANDALONE_SERVER + Mouse::reset(); + Keyboard::reset(); +#endif + } +}; + +void Minecraft::tickInput() { +#ifndef STANDALONE_SERVER + InputRAII raiiInput; + + if (screen && !screen->passEvents) { + screenMutex = true; + screen->updateEvents(); + //screen->updateSetScreen(); + screenMutex = false; + if (hasScheduledScreen) { + setScreen(scheduledScreen); + scheduledScreen = NULL; + hasScheduledScreen = false; + } + return; + } + + if (!player) { + return; + } + +#ifdef RPI + bool mouseDiggable = true; + bool allowGuiClicks = !mouseGrabbed; +#else + bool mouseDiggable = !gui.isInside(Mouse::getX(), Mouse::getY()); + bool allowGuiClicks = true; +#endif + + TIMER_PUSH("mouse"); + while (Mouse::next()) { + //if (Mouse::getButtonState(MouseAction::ACTION_LEFT)) + // LOGI("mouse-down-at: %d, %d\n", Mouse::getX(), Mouse::getY()); + int passedTime = getTimeMs() - lastTickTime; + if (passedTime > 200) continue; // @note: As long Mouse::clear CLEARS the whole buffer, it's safe to break here + // But since it might be rewritten anyway (and hopefully there aren't a lot of messages, we just continue. + + const MouseAction& e = Mouse::getEvent(); + +#ifdef RPI // If clicked when not having focus, get focus @keyboard + if (!mouseGrabbed) { + if (!screen && e.data == MouseAction::DATA_DOWN) { + grabMouse(); + } + } +#endif + + if (allowGuiClicks && e.action == MouseAction::ACTION_LEFT && e.data == MouseAction::DATA_DOWN) { + gui.handleClick(MouseAction::ACTION_LEFT, Mouse::getX(), Mouse::getY()); + } + + if (e.action == MouseAction::ACTION_WHEEL) { + Inventory* v = player->inventory; + int numSlots = gui.getNumSlots() - 1; + int slot = (v->selected - e.dy + numSlots) % numSlots; + v->selectSlot(slot); + } + /* + if (mouseDiggable && options.useMouseForDigging) { + if (Mouse::getEventButton() == MouseAction::ACTION_LEFT && Mouse::getEventButtonState()) { + handleMouseClick(MouseAction::ACTION_LEFT); + lastClickTick = ticks; + } + if (Mouse::getEventButton() == MouseAction::ACTION_RIGHT && Mouse::getEventButtonState()) { + handleMouseClick(MouseAction::ACTION_RIGHT); + lastClickTick = ticks; + } + } + */ + } + + TIMER_POP_PUSH("keyboard"); + while (Keyboard::next()) { + int key = Keyboard::getEventKey(); + bool isPressed = (Keyboard::getEventKeyState() == KeyboardAction::KEYDOWN); + player->setKey(key, isPressed); + + if (isPressed) { + gui.handleKeyPressed(key); + + #if defined(WIN32) || defined(RPI)//|| defined(_DEBUG) || defined(DEBUG) + if (key >= '0' && key <= '9') { + int digit = key - '0'; + int slot = digit - 1; + + if (slot >= 0 && slot < gui.getNumSlots()-1) + player->inventory->selectSlot(slot); + + #if defined(WIN32) + if (digit >= 1 && GetAsyncKeyState(VK_CONTROL) < 0) { + // Set adventure settings here! + AdventureSettingsPacket p(level->adventureSettings); + p.toggle((AdventureSettingsPacket::Flags)(1 << slot)); + p.fillIn(level->adventureSettings); + raknetInstance->send(p); + } + if (digit == 0) { + Pos pos((int)player->x, (int)player->y-1, (int)player->z); + SetSpawnPositionPacket p(pos); + raknetInstance->send(p); + } + #endif + } + #endif + #if defined(RPI) + if (key == Keyboard::KEY_E) { + screenChooser.setScreen(SCREEN_BLOCKSELECTION); + } + if (!screen && key == Keyboard::KEY_O || key == 250) { + releaseMouse(); + } + #endif + #if defined(WIN32) + if (key == Keyboard::KEY_F) { + options.isFlying = !options.isFlying; + player->noPhysics = options.isFlying; + } + + if (key == Keyboard::KEY_T) { + options.thirdPersonView = !options.thirdPersonView; + /* + ImprovedNoise noise; + for (int i = 0; i < 16; ++i) + printf("%d\t%f\n", i, noise.grad2(i, 3, 8)); + */ + } + + if (key == Keyboard::KEY_O) { + useAmbientOcclusion = !useAmbientOcclusion; + options.ambientOcclusion = useAmbientOcclusion; + levelRenderer->allChanged(); + } + + if (key == Keyboard::KEY_L) + options.viewDistance = (options.viewDistance + 1) % 4; + + if (key == Keyboard::KEY_U) { + onGraphicsReset(); + player->heal(100); + } + + if (key == Keyboard::KEY_B || key == 108) // Toggle the game mode + setIsCreativeMode(!isCreativeMode()); + + if (key == Keyboard::KEY_P) // Step forward in time + level->setTime( level->getTime() + 1000); + + if (key == Keyboard::KEY_G) { + setScreen(new ArmorScreen()); + /* + std::vector& boxs = level->getCubes(NULL, AABB(128.1f, 73, 128.1f, 128.9f, 74.9f, 128.9f)); + LOGI("boxes: %d\n", (int)boxs.size()); + */ + } + + if (key == Keyboard::KEY_Y) { + textures->reloadAll(); + player->hurtTo(2); + } + if (key == Keyboard::KEY_Z || key == 108) { + for (int i = 0; i < 1; ++i) { + Mob* mob = NULL; + int forceId = 0;//MobTypes::Sheep; + + int types[] = { + MobTypes::Sheep, + MobTypes::Pig, + MobTypes::Chicken, + MobTypes::Cow, + }; + + int mobType = (forceId > 0)? forceId : types[Mth::random(sizeof(types) / sizeof(int))]; + mob = MobFactory::CreateMob(mobType, level); + + //((Animal*)mob)->setAge(-1000); + float dx = 4 - 8 * Mth::random() + 4 * Mth::sin(Mth::DEGRAD * player->yRot); + float dz = 4 - 8 * Mth::random() + 4 * Mth::cos(Mth::DEGRAD * player->yRot); + if (mob && !MobSpawner::addMob(level, mob, player->x + dx, player->y, player->z + dz, Mth::random()*360, 0, true)) + delete mob; + } + } + + if (key == Keyboard::KEY_X) { + const EntityList& entities = level->getAllEntities(); + for (int i = entities.size()-1; i >= 0; --i) { + Entity* e = entities[i]; + if (!e->isPlayer()) + level->removeEntity(e); + } + } + + if (key == Keyboard::KEY_C /*|| key == 4*/) { + player->inventory->clearInventoryWithDefault(); + // @todo: Add saving here for benchmarking + } + if (key == Keyboard::KEY_H) { + setScreen( new PrerenderTilesScreen() ); + } + + if (key == Keyboard::KEY_O) { + for (int i = Inventory::MAX_SELECTION_SIZE; i < player->inventory->getContainerSize(); ++i) + if (player->inventory->getItem(i)) + player->inventory->dropSlot(i, false); + } + if (key == Keyboard::KEY_F3) { + options.renderDebug = !options.renderDebug; + } + if (key == Keyboard::KEY_M) { + options.difficulty = (options.difficulty == Difficulty::PEACEFUL)? + Difficulty::NORMAL : Difficulty::PEACEFUL; + //setIsCreativeMode( !isCreativeMode() ); + } + + // lanternroci + if (key == Keyboard::KEY_ESCAPE) + pauseGame(false); + if (key == Keyboard::KEY_E && !options.isFlying) { + screenChooser.setScreen(SCREEN_BLOCKSELECTION); + } + + if (options.renderDebug) { + if (key >= '0' && key <= '9') { + _perfRenderer->debugFpsMeterKeyPress(key - '0'); + } + } + #endif + + #ifndef RPI + if (key == 82) + pauseGame(false); + #else + if (key == Keyboard::KEY_ESCAPE) + pauseGame(false); + #endif + + #ifndef OPENGL_ES + if (key == Keyboard::KEY_P) { + static bool isWireFrame = false; + isWireFrame = !isWireFrame; + glPolygonMode(GL_FRONT, isWireFrame? GL_LINE : GL_FILL); + //glPolygonMode(GL_BACK, isWireFrame? GL_LINE : GL_FILL); + } + #endif + } + #ifdef WIN32 + if (key == Keyboard::KEY_M) { + for (int i = 0; i < 5 * SharedConstants::TicksPerSecond; ++i) + level->tick(); + } + #endif + + + //if (!isPressed) LOGI("Key released: %d\n", key); + + if (!options.useMouseForDigging) { + int passedTime = getTimeMs() - lastTickTime; + if (passedTime > 200) continue; + + // Destroy and attack is on same button + if (key == options.keyDestroy.key && isPressed) { + BuildActionIntention bai(BuildActionIntention::BAI_REMOVE | BuildActionIntention::BAI_ATTACK); + handleBuildAction(&bai); + } + else // Build and use/interact is on same button + if (key == options.keyUse.key && isPressed) { + BuildActionIntention bai(BuildActionIntention::BAI_BUILD | BuildActionIntention::BAI_INTERACT); + handleBuildAction(&bai); + } + } + } + + TIMER_POP_PUSH("tickbuild"); + BuildActionIntention bai; + // @note: This might be a problem. This method is polling based here, but + // event based when using mouse (or keys..), and in java. Not quite + // sure just yet what way to go. + bool buildHandled = inputHolder->getBuildInput()->tickBuild(player, &bai); + if (buildHandled) { + if (!bai.isRemoveContinue()) + handleBuildAction(&bai); + } + + bool isTryingToDestroyBlock = (options.useMouseForDigging + ? (Mouse::isButtonDown(MouseAction::ACTION_LEFT) && mouseDiggable) + : Keyboard::isKeyDown(options.keyDestroy.key)) + || (buildHandled && bai.isRemove()); + + TIMER_POP_PUSH("handlemouse"); +#ifdef RPI + handleMouseDown(MouseAction::ACTION_LEFT, isTryingToDestroyBlock); + handleMouseClick(buildHandled && bai.isInteract() + || options.useMouseForDigging && Mouse::isButtonDown(MouseAction::ACTION_RIGHT)); +#else + handleMouseDown(MouseAction::ACTION_LEFT, isTryingToDestroyBlock || (buildHandled && bai.isInteract())); +#endif + + lastTickTime = getTimeMs(); + + // we have (hopefully) handled the keyboard & mouse queue and it + // can now be emptied. If wanted, the reset could be changed to: + // index -= numRead; // then this code doesn't have to be placed here + // + it prepares for tick not handling all or any events. + // update: RAII'ing instead, see above + //Keyboard::reset(); + //Mouse::reset(); + + TIMER_POP(); +#endif +} + +void Minecraft::handleMouseDown(int button, bool down) { +#ifndef STANDALONE_SERVER +#ifndef RPI + if(player->isUsingItem()) { + if(!down && !Keyboard::isKeyDown(options.keyUse.key)) { + gameMode->releaseUsingItem(player); + } + return; + } +#endif + if(player->isSleeping()) { + return; + } + if (button == MouseAction::ACTION_LEFT && missTime > 0) return; + if (down && hitResult.type == TILE && button == MouseAction::ACTION_LEFT && !hitResult.indirectHit) { + int x = hitResult.x; + int y = hitResult.y; + int z = hitResult.z; + gameMode->continueDestroyBlock(x, y, z, hitResult.f); + particleEngine->crack(x, y, z, hitResult.f); + player->swing(); + } else { + gameMode->stopDestroyBlock(); + } +#endif +} + +void Minecraft::handleMouseClick(int button) { +// BuildActionIntention bai( +// (button == MouseAction::ACTION_LEFT)? +// BuildActionIntention::BAI_REMOVE +// : BuildActionIntention::BAI_BUILD); +// +// handleBuildAction(&bai); +} + +void Minecraft::handleBuildAction(BuildActionIntention* action) { +#ifndef STANDALONE_SERVER + if (action->isRemove()) { + if (missTime > 0) return; + player->swing(); + } + if(player->isUsingItem()) + return; + bool mayUse = true; + + if (!hitResult.isHit()) { + if (action->isRemove() && !gameMode->isCreativeType()) { + missTime = 10; + } + } else if (hitResult.type == ENTITY) { + if (action->isAttack()) { + player->swing(); + //LOGI("attacking!\n"); + InteractPacket packet(InteractPacket::Attack, player->entityId, hitResult.entity->entityId); + raknetInstance->send(packet); + gameMode->attack(player, hitResult.entity); + } else if (action->isInteract()) { + if (hitResult.entity->interactPreventDefault()) + mayUse = false; + //LOGI("interacting!\n"); + InteractPacket packet(InteractPacket::Interact, player->entityId, hitResult.entity->entityId); + raknetInstance->send(packet); + gameMode->interact(player, hitResult.entity); + } + } else if (hitResult.type == TILE) { + int x = hitResult.x; + int y = hitResult.y; + int z = hitResult.z; + int face = hitResult.f; + + int oldTileId = level->getTile(x, y, z); + Tile* oldTile = Tile::tiles[oldTileId]; + + //bool tryDestroyBlock = false; + + if (action->isRemove()) { + if (!oldTile) + return; + + //LOGI("tile: %s - %d, %d, %d. b: %f - %f\n", oldTile->getDescriptionId().c_str(), x, y, z, oldTile->getBrightness(level, x, y, z), oldTile->getBrightness(level, x, y+1, z)); + level->extinguishFire(x, y, z, hitResult.f); + gameMode->startDestroyBlock(x, y, z, hitResult.f); + } + else { + ItemInstance* item = player->inventory->getSelected(); + if (gameMode->useItemOn(player, level, item, x, y, z, face, hitResult.pos)) { + mayUse = false; + player->swing(); + #ifdef RPI + } else if (item && item->id == ((Item*)Item::sword_iron)->id) { + player->swing(); + #endif + } + if (item && item->count <= 0) { + player->inventory->clearSlot(player->inventory->selected); + } + //} else if (item && item->count != oldCount) { + // gameRenderer->itemInHandRenderer->itemPlaced(); + //} + } + } + if (mayUse && action->isInteract()) { + ItemInstance* item = player->inventory->getSelected(); + if (item && !player->isUsingItem()) { + if (gameMode->useItem(player, level, item)) { + gameRenderer->itemInHandRenderer->itemUsed(); + } + if (item && item->count <= 0) { + player->inventory->clearSlot(player->inventory->selected); + } + } + } +#endif +} + +bool Minecraft::isOnlineClient() +{ + return (level != NULL && level->isClientSide); +} + +bool Minecraft::isOnline() +{ + return netCallback != NULL; +} + +void Minecraft::pauseGame(bool isBackPaused) { +#ifndef STANDALONE_SERVER + if (screen != NULL) return; + screenChooser.setScreen(isBackPaused? SCREEN_PAUSEPREV : SCREEN_PAUSE); +#endif +} +void Minecraft::gameLostFocus() { +#ifndef STANDALONE_SERVER + if(screen != NULL) { + screen->lostFocus(); + } +#endif +} + + +void Minecraft::setScreen( Screen* screen ) +{ +#ifndef STANDALONE_SERVER + Mouse::reset(); + Multitouch::reset(); + Multitouch::resetThisUpdate(); + + if (screenMutex) { + hasScheduledScreen = true; + scheduledScreen = screen; + return; + } + + if (screen != NULL && screen->isErrorScreen()) + return; + if (screen == NULL && level == NULL) + screen = screenChooser.createScreen(SCREEN_STARTMENU); + + if (this->screen != NULL) { + this->screen->removed(); + delete this->screen; + } + + this->screen = screen; + if (screen != NULL) { + releaseMouse(); + //ScreenSizeCalculator ssc = new ScreenSizeCalculator(options, width, height); + int screenWidth = (int)(width * Gui::InvGuiScale); //ssc.getWidth(); + int screenHeight = (int)(height * Gui::InvGuiScale); //ssc.getHeight(); + screen->init(this, screenWidth, screenHeight); + + if (screen->isInGameScreen() && level) { + level->saveLevelData(); + level->saveGame(); + } + + //noRender = false; + } else { + grabMouse(); + } +#endif +} + +void Minecraft::grabMouse() +{ +#ifndef STANDALONE_SERVER + if (mouseGrabbed) return; + mouseGrabbed = true; + mouseHandler.grab(); + //setScreen(NULL); +#endif +} + +void Minecraft::releaseMouse() +{ +#ifndef STANDALONE_SERVER + if (!mouseGrabbed) { + return; + } + if (player) { + player->releaseAllKeys(); + } + mouseGrabbed = false; + mouseHandler.release(); +#endif +} + +bool Minecraft::useTouchscreen() { +#ifdef RPI + return false; +#endif + return options.useTouchScreen || !_supportsNonTouchscreen; +} +bool Minecraft::supportNonTouchScreen() { + return _supportsNonTouchscreen; +} +void Minecraft::init() +{ + options.minecraft = this; + options.initDefaultValues(); +#ifndef STANDALONE_SERVER + checkGlError("Init enter"); + + _supportsNonTouchscreen = !platform()->supportsTouchscreen(); + + LOGI("IS TOUCHSCREEN? %d\n", options.useTouchScreen); + + textures = new Textures(&options, platform()); + textures->addDynamicTexture(new WaterTexture()); + textures->addDynamicTexture(new WaterSideTexture()); + gui.texturesLoaded(textures); + + levelRenderer = new LevelRenderer(this); + gameRenderer = new GameRenderer(this); + particleEngine = new ParticleEngine(level, textures); + + // Platform specific initialization here + font = new Font(&options, "font/default8.png", textures); + + _perfRenderer = new PerfRenderer(this, font); + + checkGlError("Init complete"); +#endif + + user = new User("TestUser", ""); + setIsCreativeMode(false); // false means it's Survival Mode + reloadOptions(); + +} + +void Minecraft::setSize(int w, int h) { +#ifndef STANDALONE_SERVER + transformResolution(&w, &h); + + width = w; + height = h; + + if (width >= 1000) { + #ifdef __APPLE__ + Gui::GuiScale = (width > 2000)? 8.0f : 4.0f; + #else + Gui::GuiScale = 4.0f; + #endif + } + else if (width >= 800) { +#ifdef __APPLE__ + Gui::GuiScale = 4.0f; +#else + Gui::GuiScale = 3.0f; +#endif + } + else if (width >= 400) + Gui::GuiScale = 2.0f; + else + Gui::GuiScale = 1.0f; + + Gui::InvGuiScale = 1.0f / Gui::GuiScale; + int screenWidth = (int)(width * Gui::InvGuiScale); + int screenHeight = (int)(height * Gui::InvGuiScale); + + if (platform()) { + float pixelsPerMillimeter = options.getProgressValue(&Options::Option::PIXELS_PER_MILLIMETER); + pixelCalc.setPixelsPerMillimeter(pixelsPerMillimeter); + pixelCalcUi.setPixelsPerMillimeter(pixelsPerMillimeter * Gui::InvGuiScale); + } + + Config config = createConfig(this); + gui.onConfigChanged(config); + + if (screen) + screen->setSize(screenWidth, screenHeight); + + if (inputHolder) + inputHolder->onConfigChanged(config); + //LOGI("Setting size: %d, %d: %f\n", width, height, Gui::InvGuiScale); + +#ifdef WIN32 + char resbuf[128]; + sprintf(resbuf, " %d x %d @ scale %.2f", width, height, Gui::GuiScale); + //gui.addMessage(resbuf); +#endif +#endif /* STANDALONE_SERVER */ +} + +void Minecraft::reloadOptions() { + options.update(); + options.save(); + bool wasTouchscreen = options.useTouchScreen; + options.useTouchScreen = useTouchscreen(); + options.save(); + + if ((wasTouchscreen != options.useTouchScreen) || (inputHolder == 0)) + _reloadInput(); + + user->name = options.username; + + LOGI("Reloading-options\n"); + + // @todo @fix Android and iOS behaves a bit differently when leaving + // an options screen (Android recreates OpenGL surface) + setSize(width, height); +} + +void Minecraft::_reloadInput() { +#ifndef STANDALONE_SERVER + delete inputHolder; + + if (useTouchscreen()) { + inputHolder = new TouchInputHolder(this, &options); + } else { + #if defined(ANDROID) || defined(__APPLE__) + inputHolder = new CustomInputHolder( + new XperiaPlayInput(&options), + new ControllerTurnInput(2, ControllerTurnInput::MODE_DELTA), + new IBuildInput()); + #else + inputHolder = new CustomInputHolder( + new KeyboardInput(&options), + new MouseTurnInput(MouseTurnInput::MODE_DELTA, width/2, height/2), + new MouseBuildInput()); + #endif + } + + mouseHandler.setTurnInput(inputHolder->getTurnInput()); + if (level && player) { + player->input = inputHolder->getMoveInput(); + } +#endif +} + + +// +// Multiplayer +// +void Minecraft::locateMultiplayer() { +#ifndef WIN32 + isLookingForMultiplayer = true; + + raknetInstance->pingForHosts(19132); + netCallback = new ClientSideNetworkHandler(this, raknetInstance); +#else + // Server discovery/ping-for-hosts isn't supported/reliable on Windows in this build. + isLookingForMultiplayer = false; + // Ensure any previous list is cleared and no callback is left active + raknetInstance->clearServerList(); + if (netCallback) { delete netCallback; netCallback = NULL; } +#endif +} + +void Minecraft::cancelLocateMultiplayer() { +#ifndef WIN32 + isLookingForMultiplayer = false; + + raknetInstance->stopPingForHosts(); + + delete netCallback; + netCallback = NULL; +#else + // Nothing to stop on Windows; just ensure state is clean + isLookingForMultiplayer = false; + raknetInstance->clearServerList(); + if (netCallback) { delete netCallback; netCallback = NULL; } +#endif +} + +bool Minecraft::joinMultiplayer( const PingedCompatibleServer& server ) +{ + if (isLookingForMultiplayer && netCallback) { + isLookingForMultiplayer = false; + return raknetInstance->connect(server.address.ToString(false), server.address.GetPort()); + } + return false; +} + +void Minecraft::hostMultiplayer(int port) { + // Tear down last instance + raknetInstance->disconnect(); + delete netCallback; + netCallback = NULL; + +#if !defined(NO_NETWORK) + netCallback = new ServerSideNetworkHandler(this, raknetInstance); + #ifdef STANDALONE_SERVER + raknetInstance->host(user->name, port, 16); + #else + raknetInstance->host(user->name, port); + #endif +#endif +} + +// +// Level generation +// +/*static*/ + + void* Minecraft::prepareLevel_tspawn(void *p_param) +{ + Minecraft* mc = (Minecraft*) p_param; + mc->generateLevel("Currently not used", mc->level); + return 0; +} + +void Minecraft::generateLevel( const std::string& message, Level* level ) +{ + Stopwatch s; + s.start(); + prepareLevel(message); + s.stop(); + s.print("Level generated: "); + + // "Unlock" + isGeneratingLevel = false; +} + +void Minecraft::_levelGenerated() +{ +#ifndef STANDALONE_SERVER + if (player == NULL) { + player = (LocalPlayer*) gameMode->createPlayer(level); + gameMode->initPlayer(player); + } + + if (player) { + player->input = inputHolder->getMoveInput(); + } + + if (levelRenderer != NULL) levelRenderer->setLevel(level); + if (particleEngine != NULL) particleEngine->setLevel(level); + + gameMode->adjustPlayer(player); + gui.onLevelGenerated(); +#endif + + level->validateSpawn(); + level->loadPlayer(player, true); + // if we are client side, we trust the server to have given us a correct position + if (player && !level->isClientSide) { + player->resetPos(false); + } + + this->cameraTargetPlayer = player; + + if (raknetInstance->isServer()) + raknetInstance->announceServer(user->name); + + if (netCallback) { + netCallback->levelGenerated(level); + } + +#if defined(WIN32) || defined(RPI) + if (_commandServer) { + delete _commandServer; + } + _commandServer = new CommandServer(this); + _commandServer->init(commandPort); +#endif + + // Hack to (hopefully) get the players to show (note: in LevelListener + // instead, since adding yourself always generates a entityAdded) + //EntityRenderDispatcher::getInstance()->onGraphicsReset(); + _hasSignaledGeneratingLevelFinished = true; +} + +Player* Minecraft::respawnPlayer(int playerId) { + for (unsigned int i = 0; i < level->players.size(); ++i) { + if (level->players[i]->entityId == playerId) { + resetPlayer(level->players[i]); + return level->players[i]; + } + } + return NULL; +} + +void Minecraft::resetPlayer(Player* player) { + level->validateSpawn(); + player->reset(); + + Pos p; + if(player->hasRespawnPosition()) { + p = player->getRespawnPosition(); + } + else { + p = level->getSharedSpawnPos(); + } + player->setPos((float)p.x + 0.5f, (float)p.y + 1.0f, (float)p.z + 0.5f); + player->resetPos(true); + + if (isCreativeMode()) + player->inventory->clearInventoryWithDefault(); +} + +void Minecraft::respawnPlayer() { + // RESET THE FRACKING PLAYER HERE + //bool slowCheck = false; + //for (int i = 0; i < level->entities.size(); ++i) + // if (level->entities[i] == player) slowCheck = true; + // + //LOGI("Has entity? %d, %d\n", level->getEntity(player->entityId), slowCheck); + + resetPlayer(player); + + // tell server (or other client) that we re-spawned + RespawnPacket packet(player); + raknetInstance->send(packet); +} + +void Minecraft::onGraphicsReset() +{ +#ifndef STANDALONE_SERVER + textures->clear(); + + font->onGraphicsReset(); + gui.onGraphicsReset(); + + if (levelRenderer) levelRenderer->onGraphicsReset(); + if (gameRenderer) gameRenderer->onGraphicsReset(); + + EntityRenderDispatcher::getInstance()->onGraphicsReset(); + TileEntityRenderDispatcher::getInstance()->onGraphicsReset(); +#endif +} + +int Minecraft::getProgressStatusId() { + return progressStageStatusId; +} + +const char* Minecraft::getProgressMessage() +{ + return progressMessages[progressStageStatusId]; +} + +bool Minecraft::isLevelGenerated() +{ + return level != NULL && !isGeneratingLevel; +} + +LevelStorageSource* Minecraft::getLevelSource() +{ + return storageSource; +} + +int Minecraft::getLicenseId() { + if (!LicenseCodes::isReady(_licenseId)) + _licenseId = platform()->checkLicense(); + return _licenseId; +} + +void Minecraft::audioEngineOn() { +#ifndef STANDALONE_SERVER + soundEngine->enable(true); +#endif +} +void Minecraft::audioEngineOff() { +#ifndef STANDALONE_SERVER + soundEngine->enable(false); +#endif +} + +void Minecraft::setIsCreativeMode(bool isCreative) +{ +#ifdef CREATORMODE + delete gameMode; + gameMode = new CreatorMode(this); + _isCreativeMode = true; +#else + if (!gameMode || isCreative != _isCreativeMode) + { + delete gameMode; + if (isCreative) gameMode = new CreativeMode(this); + else gameMode = new SurvivalMode(this); + _isCreativeMode = isCreative; + } +#endif + if (player) + gameMode->initAbilities(player->abilities); +} + +bool Minecraft::isCreativeMode() { + return _isCreativeMode; +} + +bool Minecraft::isKindleFire(int kindleVersion) { + if (kindleVersion != 1) + return false; + + std::string model = platform()->getPlatformStringVar(PlatformStringVars::DEVICE_BUILD_MODEL); + std::string modelLower(model); + std::transform(modelLower.begin(), modelLower.end(), modelLower.begin(), tolower); + + return (modelLower.find("kindle") != std::string::npos) && (modelLower.find("fire") != std::string::npos); +} + +bool Minecraft::transformResolution(int* w, int* h) +{ + bool changed = false; + + // Kindle Fire 1: reporting wrong height in + // certain cases (e.g. after screen lock) + if (isKindleFire(1) && *h >= 560 && *h <= 620) { + *h = 580; + changed = true; + } + + return changed; +} + +ICreator* Minecraft::getCreator() +{ +#ifdef CREATORMODE + return ((CreatorMode*)gameMode)->getCreator(); +#else + return NULL; +#endif +} + +void Minecraft::optionUpdated( const Options::Option* option, bool value ) { + if(netCallback != NULL && option == &Options::Option::SERVER_VISIBLE) { + ServerSideNetworkHandler* ss = (ServerSideNetworkHandler*) netCallback; + ss->allowIncomingConnections(value); + } +} + +void Minecraft::optionUpdated( const Options::Option* option, float value ) { +#ifndef STANDALONE_SERVER + if(option == &Options::Option::PIXELS_PER_MILLIMETER) { + pixelCalcUi.setPixelsPerMillimeter(value * Gui::InvGuiScale); + pixelCalc.setPixelsPerMillimeter(value); + } +#endif +} + +void Minecraft::optionUpdated( const Options::Option* option, int value ) { + +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/F272D55972901EB5328C1E9942BD1892 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/F272D55972901EB5328C1E9942BD1892 new file mode 100644 index 0000000..2fc962a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/F272D55972901EB5328C1E9942BD1892 @@ -0,0 +1,134 @@ +#include "TouchJoinGameScreen.h" +#include "../StartMenuScreen.h" +#include "../ProgressScreen.h" +#include "../../Font.h" +#include "../../../Minecraft.h" +#include "../../../renderer/Textures.h" +#include "../../../../network/RakNetInstance.h" +#include "../../../../network/ClientSideNetworkHandler.h" + +namespace Touch { + +JoinGameScreen::JoinGameScreen() +: bJoin(2, "Join Game"), + bBack(3, "Back"), + bHeader(0, "Join by address"), + ip(5, "IP:Port (host:19132)") +{ + bJoin.active = true; +} + +JoinGameScreen::~JoinGameScreen() +{ +} + +void JoinGameScreen::init() +{ + buttons.push_back(&bBack); + buttons.push_back(&bJoin); + buttons.push_back(&bHeader); + + textBoxes.push_back(&ip); + +#ifdef ANDROID + tabButtons.push_back(&bBack); + tabButtons.push_back(&bJoin); +#endif +} + +void JoinGameScreen::setupPositions() { + const int yBase =10; + + // header at top + bHeader.y = yBase; + bHeader.width = width; + bHeader.x =0; + + // textbox below header + ip.x = width/2 -140/2; + ip.y = bHeader.y +28; + ip.w =140; + + // buttons at bottom + const int btnW =120; + const int btnH =26; + bJoin.width = btnW; bJoin.height = btnH; + bBack.width = btnW; bBack.height = btnH; + + bJoin.y = height -30; + bBack.y = height -30; + + bJoin.x = width /2 -4 - bJoin.width; + bBack.x = width /2 +4; +} + +void JoinGameScreen::buttonClicked(Button* button) +{ + if (button->id == bJoin.id) + { + std::string addr = ip.text; + auto trim = [](std::string &s) { + size_t start =0; + while (start < s.size() && std::isspace((unsigned char)s[start])) ++start; + size_t end = s.size(); + while (end > start && std::isspace((unsigned char)s[end -1])) --end; + s = s.substr(start, end - start); + }; + trim(addr); + if (!addr.empty()) { + std::string host = addr; + int port =19132; + size_t colon = addr.find(':'); + if (colon != std::string::npos) { + host = addr.substr(0, colon); + std::string portStr = addr.substr(colon +1); + trim(host); + trim(portStr); + if (!portStr.empty()) port = std::atoi(portStr.c_str()); + } else trim(host); + if (!host.empty()) { + if (minecraft->netCallback) { delete minecraft->netCallback; minecraft->netCallback = NULL; } + minecraft->netCallback = new ClientSideNetworkHandler(minecraft, minecraft->raknetInstance); + minecraft->raknetInstance->connect(host.c_str(), port); + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + } + } + if (button->id == bBack.id) + { + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } +} + +bool JoinGameScreen::handleBackEvent(bool isDown) +{ + if (!isDown) { + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } + return true; +} + +bool JoinGameScreen::isIndexValid( int index ) +{ + return false; +} + +void JoinGameScreen::tick() +{ +} + +void JoinGameScreen::render( int xm, int ym, float a ) +{ + renderBackground(); + // render textbox explicitly + for (unsigned int i =0; i < textBoxes.size(); ++i) { + textBoxes[i]->render(minecraft, xm, ym); + } + Screen::render(xm, ym, a); +} + +bool JoinGameScreen::isInGameScreen() { return false; } + +}; diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/FE071D4E7CC531467621E08A41B5B5A3 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/FE071D4E7CC531467621E08A41B5B5A3 new file mode 100644 index 0000000..08de9bb --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/734DACF3D4D859408226F965DF40649C/FE071D4E7CC531467621E08A41B5B5A3 @@ -0,0 +1,1584 @@ +#include "Minecraft.h" + +#if defined(APPLE_DEMO_PROMOTION) + #define NO_NETWORK +#endif + +#if defined(RPI) + #define CREATORMODE +#endif + +#include "../network/RakNetInstance.h" +#include "../network/ClientSideNetworkHandler.h" +#include "../network/ServerSideNetworkHandler.h" +//#include "../network/Packet.h" +#include "../world/entity/player/Inventory.h" +#include "../world/level/chunk/ChunkCache.h" +#include "../world/level/tile/Tile.h" +#include "../world/level/storage/LevelStorageSource.h" +#include "../world/level/storage/LevelStorage.h" +#include "player/input/KeyboardInput.h" +#ifndef STANDALONE_SERVER +#include "player/input/touchscreen/TouchInputHolder.h" +#endif +#include "player/LocalPlayer.h" +#include "gamemode/CreativeMode.h" +#include "gamemode/SurvivalMode.h" +#include "player/LocalPlayer.h" +#ifndef STANDALONE_SERVER +#include "particle/ParticleEngine.h" +#include "gui/Screen.h" +#include "gui/Font.h" +#include "gui/screens/RenameMPLevelScreen.h" +#include "sound/SoundEngine.h" +#endif +#include "../platform/CThread.h" +#include "../platform/input/Mouse.h" +#include "../AppPlatform.h" +#include "../Performance.h" +#include "../LicenseCodes.h" +#include "../util/PerfTimer.h" +#include "../util/PerfRenderer.h" +#include "player/input/MouseBuildInput.h" + +#include "../world/Facing.h" + +#include "../network/packet/PlaceBlockPacket.h" + +#include "player/input/IInputHolder.h" +#ifndef STANDALONE_SERVER +#include "player/input/touchscreen/TouchscreenInput.h" + +#include "player/input/ControllerTurnInput.h" +#include "player/input/XperiaPlayInput.h" + +#endif + +#include "player/input/MouseTurnInput.h" +#include "../world/entity/MobFactory.h" +#include "../world/level/MobSpawner.h" +#include "../util/Mth.h" +#include "../network/packet/InteractPacket.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/PrerenderTilesScreen.h" +#include "renderer/Textures.h" +#include "gui/screens/DeathScreen.h" +#endif + +#include "../network/packet/RespawnPacket.h" +#include "IConfigListener.h" +#include "../world/entity/MobCategory.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/FurnaceScreen.h" +#endif +#include "../world/Difficulty.h" +#include "../server/ServerLevel.h" +#ifdef CREATORMODE +#include "../server/CreatorLevel.h" +#endif +#include "../network/packet/AdventureSettingsPacket.h" +#include "../network/packet/SetSpawnPositionPacket.h" +#include "../network/command/CommandServer.h" +#include "gamemode/CreatorMode.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/ArmorScreen.h" +#endif +#include "../world/level/levelgen/synth/ImprovedNoise.h" +#ifndef STANDALONE_SERVER +#include "renderer/tileentity/TileEntityRenderDispatcher.h" +#endif + +#ifndef STANDALONE_SERVER +#include "renderer/ptexture/DynamicTexture.h" +#include "renderer/GameRenderer.h" +#include "renderer/ItemInHandRenderer.h" +#include "renderer/LevelRenderer.h" +#include "renderer/entity/EntityRenderDispatcher.h" +#include "gui/Screen.h" +#include "gui/Font.h" +#include "gui/screens/RenameMPLevelScreen.h" +#include "sound/SoundEngine.h" +#endif + +static void checkGlError(const char* tag) { +#ifdef GLDEBUG + while (1) { + const int errCode = glGetError(); + if (errCode == GL_NO_ERROR) break; + + LOGE("################\nOpenGL-error @ %s : #%d\n", tag, errCode); + } +#endif /*GLDEBUG*/ +} + +/*static*/ +const char* Minecraft::progressMessages[] = { + "Locating server", + "Building terrain", + "Preparing", + "Saving chunks" +}; + +int Minecraft::customDebugId = Minecraft::CDI_NONE; + +#if defined(_MSC_VER) + #pragma warning( disable : 4355 ) // 'this' pointer in initialization list which is perfectly legal +#endif + +bool Minecraft::useAmbientOcclusion = false; + +Minecraft::Minecraft() +: user(NULL), + level(NULL), + player(NULL), + cameraTargetPlayer(NULL), + levelRenderer(NULL), + gameRenderer(NULL), +#ifndef STANDALONE_SERVER + particleEngine(NULL), + _perfRenderer(NULL), +#endif + _commandServer(NULL), +#ifndef STANDALONE_SERVER + textures(NULL), +#endif + lastTickTime(-1), + lastTime(0), + ticksSinceLastUpdate(0), + gameMode(NULL), + mouseGrabbed(true), + missTime(0), + pause(false), + _running(false), + timer(20), +#ifndef STANDALONE_SERVER + gui(this), +#endif + netCallback(NULL), +#ifndef STANDALONE_SERVER + screen(NULL), + font(NULL), +#endif + screenMutex(false), +#ifndef STANDALONE_SERVER + scheduledScreen(NULL), + hasScheduledScreen(false), + soundEngine(NULL), +#endif + ticks(0), + isGeneratingLevel(false), + _hasSignaledGeneratingLevelFinished(true), + generateLevelThread(NULL), + progressStagePercentage(0), + progressStageStatusId(0), + isLookingForMultiplayer(false), + _licenseId(LicenseCodes::WAIT_PLATFORM_NOT_READY), + inputHolder(0), + _supportsNonTouchscreen(false), +#ifndef STANDALONE_SERVER + screenChooser(this), +#endif + width(1), height(1), + //_respawnPlayerTicks(-1), +#ifdef __APPLE__ + _isSuperFast(false), +#endif + _powerVr(false), + commandPort(4711), + reserved_d1(0),reserved_d2(0), + reserved_f1(0),reserved_f2(0) +{ +//#ifdef ANDROID + +#if defined(NO_NETWORK) + raknetInstance = new IRakNetInstance(); +#else + raknetInstance = new RakNetInstance(); +#endif +#ifndef STANDALONE_SERVER + soundEngine = new SoundEngine(20.0f); + soundEngine->init(this, &options); +#endif + //setupPieces(); +} + +Minecraft::~Minecraft() +{ + delete netCallback; + delete raknetInstance; +#ifndef STANDALONE_SERVER + delete levelRenderer; + delete gameRenderer; + delete particleEngine; + + delete soundEngine; +#endif + delete gameMode; +#ifndef STANDALONE_SERVER + delete font; + delete textures; + + if (screen != NULL) { + delete screen; + screen = NULL; + } +#endif + if (level != NULL) { + level->saveGame(); + if (level->getChunkSource()) + level->getChunkSource()->saveAll(true); + delete level->getLevelStorage(); + delete level; + level = NULL; + } + + //delete player; + delete user; + delete inputHolder; + + delete storageSource; + delete _perfRenderer; + delete _commandServer; + + MobFactory::clearStaticTestMobs(); +#ifndef STANDALONE_SERVER + EntityRenderDispatcher::destroy(); +#endif +} + +// Only called by server +void Minecraft::selectLevel( const std::string& levelId, const std::string& levelName, const LevelSettings& settings ) +{ +#if defined(CREATORMODE) + level = new CreatorLevel( +#else + level = new ServerLevel( +#endif + storageSource->selectLevel(levelId, false), + levelName, + settings, + SharedConstants::GeneratorVersion); + + // note: settings is useless beyond this point, since it's + // either copied to LevelData (or LevelData read from file) + setLevel(level, "Generating level"); + setIsCreativeMode(level->getLevelData()->getGameType() == GameType::Creative); + _running = true; +} + +void Minecraft::setLevel(Level* level, const std::string& message /* ="" */, LocalPlayer* forceInsertPlayer /* = NULL */) { + cameraTargetPlayer = NULL; + LOGI("Seed is %ld\n", level->getSeed()); + + if (level != NULL) { + level->raknetInstance = raknetInstance; + gameMode->initLevel(level); + + if (!player && forceInsertPlayer) + { + player = forceInsertPlayer; + player->resetPos(false); + //level->addEntity(forceInsertPlayer); + } + else if (player != NULL) { + player->resetPos(false); + if (level != NULL) { + level->addEntity(player); + } + } + this->level = level; + _hasSignaledGeneratingLevelFinished = false; +#ifdef STANDALONE_SERVER + const bool threadedLevelCreation = false; +#else + const bool threadedLevelCreation = true; +#endif + + if (threadedLevelCreation) { + // Threaded + // "Lock" + isGeneratingLevel = true; + generateLevelThread = new CThread(Minecraft::prepareLevel_tspawn, this); + } else { + // Non-threaded + generateLevel("Currently not used", level); + } + } else { + player = NULL; + } + + this->lastTickTime = 0; + this->_running = true; +} + +void Minecraft::leaveGame(bool renameLevel /*=false*/) +{ + if (isGeneratingLevel || !_hasSignaledGeneratingLevelFinished) + return; + + isGeneratingLevel = false; + bool saveLevel = level && (!level->isClientSide || renameLevel); + + raknetInstance->disconnect(); + if (saveLevel) { + // If server or wanting to save level as client, save all unsaved chunks! + level->getChunkSource()->saveAll(true); + } + + LOGI("Clearing levels\n"); + + cameraTargetPlayer = NULL; +#ifndef STANDALONE_SERVER + levelRenderer->setLevel(NULL); + particleEngine->setLevel(NULL); +#endif + LOGI("Erasing callback\n"); + delete netCallback; + netCallback = NULL; + + LOGI("Erasing level\n"); + if (level != NULL) { + delete level->getLevelStorage(); + delete level; + level = NULL; + } + //delete player; + player = NULL; + cameraTargetPlayer = NULL; + + _running = false; +#ifndef STANDALONE_SERVER + if (renameLevel) { + setScreen(new RenameMPLevelScreen(LevelStorageSource::TempLevelId)); + } + else + screenChooser.setScreen(SCREEN_STARTMENU); +#endif +} + +void Minecraft::prepareLevel(const std::string& title) { + LOGI("status: 1\n"); + progressStageStatusId = 1; + + Stopwatch A, B, C, D; + A.start(); + + Stopwatch L; + + // Dont update lights if we load the level (ok, actually just with leveldata version=1.+(?)) + if (!level->isNew()) + level->setUpdateLights(false); + + int Max = CHUNK_CACHE_WIDTH * CHUNK_CACHE_WIDTH; + int pp = 0; + for (int x = 8; x < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); x += CHUNK_WIDTH) { + for (int z = 8; z < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); z += CHUNK_WIDTH) { + progressStagePercentage = 100 * pp++ / Max; + //printf("level generation progress %d\n", progressStagePercentage); + B.start(); + level->getTile(x, 64, z); + B.stop(); + L.start(); + if (level->isNew()) + while (level->updateLights()) + ; + L.stop(); + } + } + A.stop(); + level->setUpdateLights(true); + + C.start(); + for (int x = 0; x < CHUNK_CACHE_WIDTH; x++) + { + for (int z = 0; z < CHUNK_CACHE_WIDTH; z++) + { + LevelChunk* chunk = level->getChunk(x, z); + if (chunk && !chunk->createdFromSave) + { + chunk->unsaved = false; + chunk->clearUpdateMap(); + } + } + } + C.stop(); + + LOGI("status: 3\n"); + progressStageStatusId = 3; + if (level->isNew()) { + level->setInitialSpawn(); // @note: should obviously be called from Level itself + level->saveLevelData(); + level->getChunkSource()->saveAll(false); + level->saveGame(); + } else { + level->saveLevelData(); + level->loadEntities(); + } + + progressStagePercentage = -1; + progressStageStatusId = 2; + LOGI("status: 2\n"); + + D.start(); + level->prepare(); + D.stop(); + + A.print("Generate level: "); + L.print(" - light: "); + B.print(" - getTl: "); + C.print(" - clear: "); + D.print(" - prepr: "); + progressStageStatusId = 0; +} + +void Minecraft::update() { + //LOGI("Enter Update\n"); + + if (Options::debugGl) + LOGI(">>>>>>>>>>\n"); + + TIMER_PUSH("root"); + + //if (level) { + // LOGI("numplayers: %d\n", level->players.size()); + // for (int i = 0; i < level->players.size(); ++i) { + // Player* p = level->players[i]; + // bool inEnt = std::find(level->entities.begin(), level->entities.end(), p) != level->entities.end(); + // LOGI(" %p, %d, %d - in? %d\n", p, p->entityId, p->owner.ToUint32(p->owner), inEnt); + // } + //} + + if (pause && level != NULL) { + float lastA = timer.a; + timer.advanceTime(); + timer.a = lastA; + } else { + timer.advanceTime(); + } + + if (raknetInstance) { + raknetInstance->runEvents(netCallback); + } + + TIMER_PUSH("tick"); + int toTick = timer.ticks; + for (int i = 0; i < toTick; ++i, ++ticks) + tick(i, toTick-1); + + TIMER_POP_PUSH("updatelights"); + if (level && !isGeneratingLevel) { + level->updateLights(); + } + TIMER_POP(); + + #ifndef STANDALONE_SERVER + if (gameMode != NULL) gameMode->render(timer.a); + TIMER_PUSH("sound"); + soundEngine->update(player, timer.a); + TIMER_POP_PUSH("render"); + gameRenderer->render(timer.a); + TIMER_POP(); + #else + CThread::sleep(1); + #endif +#ifndef STANDALONE_SERVER + Multitouch::resetThisUpdate(); +#endif + TIMER_POP(); +#ifndef STANDALONE_SERVER + checkGlError("Update finished"); + + if (options.renderDebug) { + if (!PerfTimer::enabled) { + PerfTimer::reset(); + PerfTimer::enabled = true; + } + + //TIMER_PUSH("debugfps"); + _perfRenderer->renderFpsMeter(1); + checkGlError("render debug"); + //TIMER_POP(); + } else { + PerfTimer::enabled = false; + } +#endif + //LOGI("Exit Update\n"); +} + +void Minecraft::tick(int nTick, int maxTick) { + if (missTime > 0) missTime--; +#ifndef STANDALONE_SERVER + if (!screen && player) { + if (player->health <= 0) { + setScreen(new DeathScreen()); + } + } +#endif + TIMER_PUSH("gameMode"); + if (level && !pause) { + gameMode->tick(); + } + + TIMER_POP_PUSH("commandServer"); + if (level && _commandServer) { + _commandServer->tick(); + } + + TIMER_POP_PUSH("input"); + tickInput(); +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("gui"); + gui.tick(); +#endif + // + // Ongoing level generation in a (perhaps) different thread. When it's + // ready, _levelGenerated() is called once and any threads are deleted. + // + if (isGeneratingLevel) { + return; + } else if (!_hasSignaledGeneratingLevelFinished) { + if (generateLevelThread) { + delete generateLevelThread; + generateLevelThread = NULL; + } + _levelGenerated(); + } + + // + // Normal game loop, run before or efter level generation + // + if (level != NULL) + { + if (!pause) { +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("gameRenderer"); + gameRenderer->tick(nTick, maxTick); + + TIMER_POP_PUSH("levelRenderer"); + levelRenderer->tick(); +#endif + level->difficulty = options.difficulty; + if (level->isClientSide) level->difficulty = Difficulty::EASY; + + TIMER_POP_PUSH("level"); + level->tickEntities(); + level->tick(); +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("animateTick"); + if (player) { + level->animateTick(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); + } +#endif + } + } +#ifndef STANDALONE_SERVER + textures->loadAndBindTexture("terrain.png"); + if (!pause && !(screen && !screen->renderGameBehind())) { + #if !defined(RPI) + #ifdef __APPLE__ + if (isSuperFast()) + #endif + { + if (nTick == maxTick) { + TIMER_POP_PUSH("textures"); + textures->tick(true); + } + } + #endif + } + TIMER_POP_PUSH("particles"); + particleEngine->tick(); + if (screen) { + screenMutex = true; + screen->tick(); + screenMutex = false; + } + + // @note: fix to keep "isPressed" and "isReleased" as long as necessary. + // Most likely keyboard and mouse could/should be reset here as well. + Multitouch::reset(); +#endif + TIMER_POP(); +} + +class InputRAII { +public: + ~InputRAII() { +#ifndef STANDALONE_SERVER + Mouse::reset(); + Keyboard::reset(); +#endif + } +}; + +void Minecraft::tickInput() { +#ifndef STANDALONE_SERVER + InputRAII raiiInput; + + if (screen && !screen->passEvents) { + screenMutex = true; + screen->updateEvents(); + //screen->updateSetScreen(); + screenMutex = false; + if (hasScheduledScreen) { + setScreen(scheduledScreen); + scheduledScreen = NULL; + hasScheduledScreen = false; + } + return; + } + + if (!player) { + return; + } + +#ifdef RPI + bool mouseDiggable = true; + bool allowGuiClicks = !mouseGrabbed; +#else + bool mouseDiggable = !gui.isInside(Mouse::getX(), Mouse::getY()); + bool allowGuiClicks = true; +#endif + + TIMER_PUSH("mouse"); + while (Mouse::next()) { + //if (Mouse::getButtonState(MouseAction::ACTION_LEFT)) + // LOGI("mouse-down-at: %d, %d\n", Mouse::getX(), Mouse::getY()); + int passedTime = getTimeMs() - lastTickTime; + if (passedTime > 200) continue; // @note: As long Mouse::clear CLEARS the whole buffer, it's safe to break here + // But since it might be rewritten anyway (and hopefully there aren't a lot of messages, we just continue. + + const MouseAction& e = Mouse::getEvent(); + +#ifdef RPI // If clicked when not having focus, get focus @keyboard + if (!mouseGrabbed) { + if (!screen && e.data == MouseAction::DATA_DOWN) { + grabMouse(); + } + } +#endif + + if (allowGuiClicks && e.action == MouseAction::ACTION_LEFT && e.data == MouseAction::DATA_DOWN) { + gui.handleClick(MouseAction::ACTION_LEFT, Mouse::getX(), Mouse::getY()); + } + + if (e.action == MouseAction::ACTION_WHEEL) { + Inventory* v = player->inventory; + int numSlots = gui.getNumSlots() - 1; + int slot = (v->selected - e.dy + numSlots) % numSlots; + v->selectSlot(slot); + } + /* + if (mouseDiggable && options.useMouseForDigging) { + if (Mouse::getEventButton() == MouseAction::ACTION_LEFT && Mouse::getEventButtonState()) { + handleMouseClick(MouseAction::ACTION_LEFT); + lastClickTick = ticks; + } + if (Mouse::getEventButton() == MouseAction::ACTION_RIGHT && Mouse::getEventButtonState()) { + handleMouseClick(MouseAction::ACTION_RIGHT); + lastClickTick = ticks; + } + } + */ + } + + TIMER_POP_PUSH("keyboard"); + while (Keyboard::next()) { + int key = Keyboard::getEventKey(); + bool isPressed = (Keyboard::getEventKeyState() == KeyboardAction::KEYDOWN); + player->setKey(key, isPressed); + + if (isPressed) { + gui.handleKeyPressed(key); + + #if defined(WIN32) || defined(RPI)//|| defined(_DEBUG) || defined(DEBUG) + if (key >= '0' && key <= '9') { + int digit = key - '0'; + int slot = digit - 1; + + if (slot >= 0 && slot < gui.getNumSlots()-1) + player->inventory->selectSlot(slot); + + #if defined(WIN32) + if (digit >= 1 && GetAsyncKeyState(VK_CONTROL) < 0) { + // Set adventure settings here! + AdventureSettingsPacket p(level->adventureSettings); + p.toggle((AdventureSettingsPacket::Flags)(1 << slot)); + p.fillIn(level->adventureSettings); + raknetInstance->send(p); + } + if (digit == 0) { + Pos pos((int)player->x, (int)player->y-1, (int)player->z); + SetSpawnPositionPacket p(pos); + raknetInstance->send(p); + } + #endif + } + #endif + #if defined(RPI) + if (key == Keyboard::KEY_E) { + screenChooser.setScreen(SCREEN_BLOCKSELECTION); + } + if (!screen && key == Keyboard::KEY_O || key == 250) { + releaseMouse(); + } + #endif + #if defined(WIN32) + if (key == Keyboard::KEY_F) { + options.isFlying = !options.isFlying; + player->noPhysics = options.isFlying; + } + + if (key == Keyboard::KEY_T) { + options.thirdPersonView = !options.thirdPersonView; + /* + ImprovedNoise noise; + for (int i = 0; i < 16; ++i) + printf("%d\t%f\n", i, noise.grad2(i, 3, 8)); + */ + } + + if (key == Keyboard::KEY_O) { + useAmbientOcclusion = !useAmbientOcclusion; + options.ambientOcclusion = useAmbientOcclusion; + levelRenderer->allChanged(); + } + + if (key == Keyboard::KEY_L) + options.viewDistance = (options.viewDistance + 1) % 4; + + if (key == Keyboard::KEY_U) { + onGraphicsReset(); + player->heal(100); + } + + if (key == Keyboard::KEY_B || key == 108) // Toggle the game mode + setIsCreativeMode(!isCreativeMode()); + + if (key == Keyboard::KEY_P) // Step forward in time + level->setTime( level->getTime() + 1000); + + if (key == Keyboard::KEY_G) { + setScreen(new ArmorScreen()); + /* + std::vector& boxs = level->getCubes(NULL, AABB(128.1f, 73, 128.1f, 128.9f, 74.9f, 128.9f)); + LOGI("boxes: %d\n", (int)boxs.size()); + */ + } + + if (key == Keyboard::KEY_Y) { + textures->reloadAll(); + player->hurtTo(2); + } + if (key == Keyboard::KEY_Z || key == 108) { + for (int i = 0; i < 1; ++i) { + Mob* mob = NULL; + int forceId = 0;//MobTypes::Sheep; + + int types[] = { + MobTypes::Sheep, + MobTypes::Pig, + MobTypes::Chicken, + MobTypes::Cow, + }; + + int mobType = (forceId > 0)? forceId : types[Mth::random(sizeof(types) / sizeof(int))]; + mob = MobFactory::CreateMob(mobType, level); + + //((Animal*)mob)->setAge(-1000); + float dx = 4 - 8 * Mth::random() + 4 * Mth::sin(Mth::DEGRAD * player->yRot); + float dz = 4 - 8 * Mth::random() + 4 * Mth::cos(Mth::DEGRAD * player->yRot); + if (mob && !MobSpawner::addMob(level, mob, player->x + dx, player->y, player->z + dz, Mth::random()*360, 0, true)) + delete mob; + } + } + + if (key == Keyboard::KEY_X) { + const EntityList& entities = level->getAllEntities(); + for (int i = entities.size()-1; i >= 0; --i) { + Entity* e = entities[i]; + if (!e->isPlayer()) + level->removeEntity(e); + } + } + + if (key == Keyboard::KEY_C /*|| key == 4*/) { + player->inventory->clearInventoryWithDefault(); + // @todo: Add saving here for benchmarking + } + if (key == Keyboard::KEY_H) { + setScreen( new PrerenderTilesScreen() ); + } + + if (key == Keyboard::KEY_O) { + for (int i = Inventory::MAX_SELECTION_SIZE; i < player->inventory->getContainerSize(); ++i) + if (player->inventory->getItem(i)) + player->inventory->dropSlot(i, false); + } + if (key == Keyboard::KEY_F3) { + options.renderDebug = !options.renderDebug; + } + if (key == Keyboard::KEY_M) { + options.difficulty = (options.difficulty == Difficulty::PEACEFUL)? + Difficulty::NORMAL : Difficulty::PEACEFUL; + //setIsCreativeMode( !isCreativeMode() ); + } + + // lanternroci + if (key == Keyboard::KEY_ESCAPE) + pauseGame(false); + if (key == Keyboard::KEY_E && !options.isFlying) { + screenChooser.setScreen(SCREEN_BLOCKSELECTION); + } + + if (options.renderDebug) { + if (key >= '0' && key <= '9') { + _perfRenderer->debugFpsMeterKeyPress(key - '0'); + } + } + #endif + + #ifndef RPI + if (key == 82) + pauseGame(false); + #else + if (key == Keyboard::KEY_ESCAPE) + pauseGame(false); + #endif + + #ifndef OPENGL_ES + if (key == Keyboard::KEY_P) { + static bool isWireFrame = false; + isWireFrame = !isWireFrame; + glPolygonMode(GL_FRONT, isWireFrame? GL_LINE : GL_FILL); + //glPolygonMode(GL_BACK, isWireFrame? GL_LINE : GL_FILL); + } + #endif + } + #ifdef WIN32 + if (key == Keyboard::KEY_M) { + for (int i = 0; i < 5 * SharedConstants::TicksPerSecond; ++i) + level->tick(); + } + #endif + + + //if (!isPressed) LOGI("Key released: %d\n", key); + + if (!options.useMouseForDigging) { + int passedTime = getTimeMs() - lastTickTime; + if (passedTime > 200) continue; + + // Destroy and attack is on same button + if (key == options.keyDestroy.key && isPressed) { + BuildActionIntention bai(BuildActionIntention::BAI_REMOVE | BuildActionIntention::BAI_ATTACK); + handleBuildAction(&bai); + } + else // Build and use/interact is on same button + if (key == options.keyUse.key && isPressed) { + BuildActionIntention bai(BuildActionIntention::BAI_BUILD | BuildActionIntention::BAI_INTERACT); + handleBuildAction(&bai); + } + } + } + + TIMER_POP_PUSH("tickbuild"); + BuildActionIntention bai; + // @note: This might be a problem. This method is polling based here, but + // event based when using mouse (or keys..), and in java. Not quite + // sure just yet what way to go. + bool buildHandled = inputHolder->getBuildInput()->tickBuild(player, &bai); + if (buildHandled) { + if (!bai.isRemoveContinue()) + handleBuildAction(&bai); + } + + bool isTryingToDestroyBlock = (options.useMouseForDigging + ? (Mouse::isButtonDown(MouseAction::ACTION_LEFT) && mouseDiggable) + : Keyboard::isKeyDown(options.keyDestroy.key)) + || (buildHandled && bai.isRemove()); + + TIMER_POP_PUSH("handlemouse"); +#ifdef RPI + handleMouseDown(MouseAction::ACTION_LEFT, isTryingToDestroyBlock); + handleMouseClick(buildHandled && bai.isInteract() + || options.useMouseForDigging && Mouse::isButtonDown(MouseAction::ACTION_RIGHT)); +#else + handleMouseDown(MouseAction::ACTION_LEFT, isTryingToDestroyBlock || (buildHandled && bai.isInteract())); +#endif + + lastTickTime = getTimeMs(); + + // we have (hopefully) handled the keyboard & mouse queue and it + // can now be emptied. If wanted, the reset could be changed to: + // index -= numRead; // then this code doesn't have to be placed here + // + it prepares for tick not handling all or any events. + // update: RAII'ing instead, see above + //Keyboard::reset(); + //Mouse::reset(); + + TIMER_POP(); +#endif +} + +void Minecraft::handleMouseDown(int button, bool down) { +#ifndef STANDALONE_SERVER +#ifndef RPI + if(player->isUsingItem()) { + if(!down && !Keyboard::isKeyDown(options.keyUse.key)) { + gameMode->releaseUsingItem(player); + } + return; + } +#endif + if(player->isSleeping()) { + return; + } + if (button == MouseAction::ACTION_LEFT && missTime > 0) return; + if (down && hitResult.type == TILE && button == MouseAction::ACTION_LEFT && !hitResult.indirectHit) { + int x = hitResult.x; + int y = hitResult.y; + int z = hitResult.z; + gameMode->continueDestroyBlock(x, y, z, hitResult.f); + particleEngine->crack(x, y, z, hitResult.f); + player->swing(); + } else { + gameMode->stopDestroyBlock(); + } +#endif +} + +void Minecraft::handleMouseClick(int button) { +// BuildActionIntention bai( +// (button == MouseAction::ACTION_LEFT)? +// BuildActionIntention::BAI_REMOVE +// : BuildActionIntention::BAI_BUILD); +// +// handleBuildAction(&bai); +} + +void Minecraft::handleBuildAction(BuildActionIntention* action) { +#ifndef STANDALONE_SERVER + if (action->isRemove()) { + if (missTime > 0) return; + player->swing(); + } + if(player->isUsingItem()) + return; + bool mayUse = true; + + if (!hitResult.isHit()) { + if (action->isRemove() && !gameMode->isCreativeType()) { + missTime = 10; + } + } else if (hitResult.type == ENTITY) { + if (action->isAttack()) { + player->swing(); + //LOGI("attacking!\n"); + InteractPacket packet(InteractPacket::Attack, player->entityId, hitResult.entity->entityId); + raknetInstance->send(packet); + gameMode->attack(player, hitResult.entity); + } else if (action->isInteract()) { + if (hitResult.entity->interactPreventDefault()) + mayUse = false; + //LOGI("interacting!\n"); + InteractPacket packet(InteractPacket::Interact, player->entityId, hitResult.entity->entityId); + raknetInstance->send(packet); + gameMode->interact(player, hitResult.entity); + } + } else if (hitResult.type == TILE) { + int x = hitResult.x; + int y = hitResult.y; + int z = hitResult.z; + int face = hitResult.f; + + int oldTileId = level->getTile(x, y, z); + Tile* oldTile = Tile::tiles[oldTileId]; + + //bool tryDestroyBlock = false; + + if (action->isRemove()) { + if (!oldTile) + return; + + //LOGI("tile: %s - %d, %d, %d. b: %f - %f\n", oldTile->getDescriptionId().c_str(), x, y, z, oldTile->getBrightness(level, x, y, z), oldTile->getBrightness(level, x, y+1, z)); + level->extinguishFire(x, y, z, hitResult.f); + gameMode->startDestroyBlock(x, y, z, hitResult.f); + } + else { + ItemInstance* item = player->inventory->getSelected(); + if (gameMode->useItemOn(player, level, item, x, y, z, face, hitResult.pos)) { + mayUse = false; + player->swing(); + #ifdef RPI + } else if (item && item->id == ((Item*)Item::sword_iron)->id) { + player->swing(); + #endif + } + if (item && item->count <= 0) { + player->inventory->clearSlot(player->inventory->selected); + } + //} else if (item && item->count != oldCount) { + // gameRenderer->itemInHandRenderer->itemPlaced(); + //} + } + } + if (mayUse && action->isInteract()) { + ItemInstance* item = player->inventory->getSelected(); + if (item && !player->isUsingItem()) { + if (gameMode->useItem(player, level, item)) { + gameRenderer->itemInHandRenderer->itemUsed(); + } + if (item && item->count <= 0) { + player->inventory->clearSlot(player->inventory->selected); + } + } + } +#endif +} + +bool Minecraft::isOnlineClient() +{ + return (level != NULL && level->isClientSide); +} + +bool Minecraft::isOnline() +{ + return netCallback != NULL; +} + +void Minecraft::pauseGame(bool isBackPaused) { +#ifndef STANDALONE_SERVER + if (screen != NULL) return; + screenChooser.setScreen(isBackPaused? SCREEN_PAUSEPREV : SCREEN_PAUSE); +#endif +} +void Minecraft::gameLostFocus() { +#ifndef STANDALONE_SERVER + if(screen != NULL) { + screen->lostFocus(); + } +#endif +} + + +void Minecraft::setScreen( Screen* screen ) +{ +#ifndef STANDALONE_SERVER + Mouse::reset(); + Multitouch::reset(); + Multitouch::resetThisUpdate(); + + if (screenMutex) { + hasScheduledScreen = true; + scheduledScreen = screen; + return; + } + + if (screen != NULL && screen->isErrorScreen()) + return; + if (screen == NULL && level == NULL) + screen = screenChooser.createScreen(SCREEN_STARTMENU); + + if (this->screen != NULL) { + this->screen->removed(); + delete this->screen; + } + + this->screen = screen; + if (screen != NULL) { + releaseMouse(); + //ScreenSizeCalculator ssc = new ScreenSizeCalculator(options, width, height); + int screenWidth = (int)(width * Gui::InvGuiScale); //ssc.getWidth(); + int screenHeight = (int)(height * Gui::InvGuiScale); //ssc.getHeight(); + screen->init(this, screenWidth, screenHeight); + + if (screen->isInGameScreen() && level) { + level->saveLevelData(); + level->saveGame(); + } + + //noRender = false; + } else { + grabMouse(); + } +#endif +} + +void Minecraft::grabMouse() +{ +#ifndef STANDALONE_SERVER + if (mouseGrabbed) return; + mouseGrabbed = true; + mouseHandler.grab(); + //setScreen(NULL); +#endif +} + +void Minecraft::releaseMouse() +{ +#ifndef STANDALONE_SERVER + if (!mouseGrabbed) { + return; + } + if (player) { + player->releaseAllKeys(); + } + mouseGrabbed = false; + mouseHandler.release(); +#endif +} + +bool Minecraft::useTouchscreen() { +#ifdef RPI + return false; +#endif + return options.useTouchScreen || !_supportsNonTouchscreen; +} +bool Minecraft::supportNonTouchScreen() { + return _supportsNonTouchscreen; +} +void Minecraft::init() +{ + options.minecraft = this; + options.initDefaultValues(); +#ifndef STANDALONE_SERVER + checkGlError("Init enter"); + + _supportsNonTouchscreen = !platform()->supportsTouchscreen(); + + LOGI("IS TOUCHSCREEN? %d\n", options.useTouchScreen); + + textures = new Textures(&options, platform()); + textures->addDynamicTexture(new WaterTexture()); + textures->addDynamicTexture(new WaterSideTexture()); + gui.texturesLoaded(textures); + + levelRenderer = new LevelRenderer(this); + gameRenderer = new GameRenderer(this); + particleEngine = new ParticleEngine(level, textures); + + // Platform specific initialization here + font = new Font(&options, "font/default8.png", textures); + + _perfRenderer = new PerfRenderer(this, font); + + checkGlError("Init complete"); +#endif + + user = new User("TestUser", ""); + setIsCreativeMode(false); // false means it's Survival Mode + reloadOptions(); + +} + +void Minecraft::setSize(int w, int h) { +#ifndef STANDALONE_SERVER + transformResolution(&w, &h); + + width = w; + height = h; + + if (width >= 1000) { + #ifdef __APPLE__ + Gui::GuiScale = (width > 2000)? 8.0f : 4.0f; + #else + Gui::GuiScale = 4.0f; + #endif + } + else if (width >= 800) { +#ifdef __APPLE__ + Gui::GuiScale = 4.0f; +#else + Gui::GuiScale = 3.0f; +#endif + } + else if (width >= 400) + Gui::GuiScale = 2.0f; + else + Gui::GuiScale = 1.0f; + + Gui::InvGuiScale = 1.0f / Gui::GuiScale; + int screenWidth = (int)(width * Gui::InvGuiScale); + int screenHeight = (int)(height * Gui::InvGuiScale); + + if (platform()) { + float pixelsPerMillimeter = options.getProgressValue(&Options::Option::PIXELS_PER_MILLIMETER); + pixelCalc.setPixelsPerMillimeter(pixelsPerMillimeter); + pixelCalcUi.setPixelsPerMillimeter(pixelsPerMillimeter * Gui::InvGuiScale); + } + + Config config = createConfig(this); + gui.onConfigChanged(config); + + if (screen) + screen->setSize(screenWidth, screenHeight); + + if (inputHolder) + inputHolder->onConfigChanged(config); + //LOGI("Setting size: %d, %d: %f\n", width, height, Gui::InvGuiScale); + +#ifdef WIN32 + char resbuf[128]; + sprintf(resbuf, " %d x %d @ scale %.2f", width, height, Gui::GuiScale); + //gui.addMessage(resbuf); +#endif +#endif /* STANDALONE_SERVER */ +} + +void Minecraft::reloadOptions() { + options.update(); + options.save(); + bool wasTouchscreen = options.useTouchScreen; + options.useTouchScreen = useTouchscreen(); + options.save(); + + if ((wasTouchscreen != options.useTouchScreen) || (inputHolder == 0)) + _reloadInput(); + + user->name = options.username; + + LOGI("Reloading-options\n"); + + // @todo @fix Android and iOS behaves a bit differently when leaving + // an options screen (Android recreates OpenGL surface) + setSize(width, height); +} + +void Minecraft::_reloadInput() { +#ifndef STANDALONE_SERVER + delete inputHolder; + + if (useTouchscreen()) { + inputHolder = new TouchInputHolder(this, &options); + } else { + #if defined(ANDROID) || defined(__APPLE__) + inputHolder = new CustomInputHolder( + new XperiaPlayInput(&options), + new ControllerTurnInput(2, ControllerTurnInput::MODE_DELTA), + new IBuildInput()); + #else + inputHolder = new CustomInputHolder( + new KeyboardInput(&options), + new MouseTurnInput(MouseTurnInput::MODE_DELTA, width/2, height/2), + new MouseBuildInput()); + #endif + } + + mouseHandler.setTurnInput(inputHolder->getTurnInput()); + if (level && player) { + player->input = inputHolder->getMoveInput(); + } +#endif +} + + +// +// Multiplayer +// +void Minecraft::locateMultiplayer() { +#ifndef WIN32 + isLookingForMultiplayer = true; + + raknetInstance->pingForHosts(19132); + netCallback = new ClientSideNetworkHandler(this, raknetInstance); +#else + // Server discovery/ping-for-hosts isn't supported/reliable on Windows in this build. + isLookingForMultiplayer = false; + // Ensure any previous list is cleared and no callback is left active + raknetInstance->clearServerList(); + if (netCallback) { delete netCallback; netCallback = NULL; } +#endif +} + +void Minecraft::cancelLocateMultiplayer() { +#ifndef WIN32 + isLookingForMultiplayer = false; + + raknetInstance->stopPingForHosts(); + + delete netCallback; + netCallback = NULL; +#else + // Nothing to stop on Windows; just ensure state is clean + isLookingForMultiplayer = false; + raknetInstance->clearServerList(); + if (netCallback) { delete netCallback; netCallback = NULL; } +#endif +} + +bool Minecraft::joinMultiplayer( const PingedCompatibleServer& server ) +{ + if (isLookingForMultiplayer && netCallback) { + isLookingForMultiplayer = false; + return raknetInstance->connect(server.address.ToString(false), server.address.GetPort()); + } + return false; +} + +void Minecraft::hostMultiplayer(int port) { + // Tear down last instance + raknetInstance->disconnect(); + delete netCallback; + netCallback = NULL; + +#if !defined(NO_NETWORK) + netCallback = new ServerSideNetworkHandler(this, raknetInstance); + #ifdef STANDALONE_SERVER + raknetInstance->host(user->name, port, 16); + #else + raknetInstance->host(user->name, port); + #endif +#endif +} + +// +// Level generation +// +/*static*/ + + void* Minecraft::prepareLevel_tspawn(void *p_param) +{ + Minecraft* mc = (Minecraft*) p_param; + mc->generateLevel("Currently not used", mc->level); + return 0; +} + +void Minecraft::generateLevel( const std::string& message, Level* level ) +{ + Stopwatch s; + s.start(); + prepareLevel(message); + s.stop(); + s.print("Level generated: "); + + // "Unlock" + isGeneratingLevel = false; +} + +void Minecraft::_levelGenerated() +{ +#ifndef STANDALONE_SERVER + if (player == NULL) { + player = (LocalPlayer*) gameMode->createPlayer(level); + gameMode->initPlayer(player); + } + + if (player) { + player->input = inputHolder->getMoveInput(); + } + + if (levelRenderer != NULL) levelRenderer->setLevel(level); + if (particleEngine != NULL) particleEngine->setLevel(level); + + gameMode->adjustPlayer(player); + gui.onLevelGenerated(); +#endif + + level->validateSpawn(); + level->loadPlayer(player, true); + // if we are client side, we trust the server to have given us a correct position + if (player && !level->isClientSide) { + player->resetPos(false); + } + + this->cameraTargetPlayer = player; + + if (raknetInstance->isServer()) + raknetInstance->announceServer(user->name); + + if (netCallback) { + netCallback->levelGenerated(level); + } + +#if defined(WIN32) || defined(RPI) + if (_commandServer) { + delete _commandServer; + } + _commandServer = new CommandServer(this); + _commandServer->init(commandPort); +#endif + + // Hack to (hopefully) get the players to show (note: in LevelListener + // instead, since adding yourself always generates a entityAdded) + //EntityRenderDispatcher::getInstance()->onGraphicsReset(); + _hasSignaledGeneratingLevelFinished = true; +} + +Player* Minecraft::respawnPlayer(int playerId) { + for (unsigned int i = 0; i < level->players.size(); ++i) { + if (level->players[i]->entityId == playerId) { + resetPlayer(level->players[i]); + return level->players[i]; + } + } + return NULL; +} + +void Minecraft::resetPlayer(Player* player) { + level->validateSpawn(); + player->reset(); + + Pos p; + if(player->hasRespawnPosition()) { + p = player->getRespawnPosition(); + } + else { + p = level->getSharedSpawnPos(); + } + player->setPos((float)p.x + 0.5f, (float)p.y + 1.0f, (float)p.z + 0.5f); + player->resetPos(true); + + if (isCreativeMode()) + player->inventory->clearInventoryWithDefault(); +} + +void Minecraft::respawnPlayer() { + // RESET THE FRACKING PLAYER HERE + //bool slowCheck = false; + //for (int i = 0; i < level->entities.size(); ++i) + // if (level->entities[i] == player) slowCheck = true; + // + //LOGI("Has entity? %d, %d\n", level->getEntity(player->entityId), slowCheck); + + resetPlayer(player); + + // tell server (or other client) that we re-spawned + RespawnPacket packet(player); + raknetInstance->send(packet); +} + +void Minecraft::onGraphicsReset() +{ +#ifndef STANDALONE_SERVER + textures->clear(); + + font->onGraphicsReset(); + gui.onGraphicsReset(); + + if (levelRenderer) levelRenderer->onGraphicsReset(); + if (gameRenderer) gameRenderer->onGraphicsReset(); + + EntityRenderDispatcher::getInstance()->onGraphicsReset(); + TileEntityRenderDispatcher::getInstance()->onGraphicsReset(); +#endif +} + +int Minecraft::getProgressStatusId() { + return progressStageStatusId; +} + +const char* Minecraft::getProgressMessage() +{ + return progressMessages[progressStageStatusId]; +} + +bool Minecraft::isLevelGenerated() +{ + return level != NULL && !isGeneratingLevel; +} + +LevelStorageSource* Minecraft::getLevelSource() +{ + return storageSource; +} + +int Minecraft::getLicenseId() { + if (!LicenseCodes::isReady(_licenseId)) + _licenseId = platform()->checkLicense(); + return _licenseId; +} + +void Minecraft::audioEngineOn() { +#ifndef STANDALONE_SERVER + soundEngine->enable(true); +#endif +} +void Minecraft::audioEngineOff() { +#ifndef STANDALONE_SERVER + soundEngine->enable(false); +#endif +} + +void Minecraft::setIsCreativeMode(bool isCreative) +{ +#ifdef CREATORMODE + delete gameMode; + gameMode = new CreatorMode(this); + _isCreativeMode = true; +#else + if (!gameMode || isCreative != _isCreativeMode) + { + delete gameMode; + if (isCreative) gameMode = new CreativeMode(this); + else gameMode = new SurvivalMode(this); + _isCreativeMode = isCreative; + } +#endif + if (player) + gameMode->initAbilities(player->abilities); +} + +bool Minecraft::isCreativeMode() { + return _isCreativeMode; +} + +bool Minecraft::isKindleFire(int kindleVersion) { + if (kindleVersion != 1) + return false; + + std::string model = platform()->getPlatformStringVar(PlatformStringVars::DEVICE_BUILD_MODEL); + std::string modelLower(model); + std::transform(modelLower.begin(), modelLower.end(), modelLower.begin(), tolower); + + return (modelLower.find("kindle") != std::string::npos) && (modelLower.find("fire") != std::string::npos); +} + +bool Minecraft::transformResolution(int* w, int* h) +{ + bool changed = false; + + // Kindle Fire 1: reporting wrong height in + // certain cases (e.g. after screen lock) + if (isKindleFire(1) && *h >= 560 && *h <= 620) { + *h = 580; + changed = true; + } + + return changed; +} + +ICreator* Minecraft::getCreator() +{ +#ifdef CREATORMODE + return ((CreatorMode*)gameMode)->getCreator(); +#else + return NULL; +#endif +} + +void Minecraft::optionUpdated( const Options::Option* option, bool value ) { + if(netCallback != NULL && option == &Options::Option::SERVER_VISIBLE) { + ServerSideNetworkHandler* ss = (ServerSideNetworkHandler*) netCallback; + ss->allowIncomingConnections(value); + } +} + +void Minecraft::optionUpdated( const Options::Option* option, float value ) { +#ifndef STANDALONE_SERVER + if(option == &Options::Option::PIXELS_PER_MILLIMETER) { + pixelCalcUi.setPixelsPerMillimeter(value * Gui::InvGuiScale); + pixelCalc.setPixelsPerMillimeter(value); + } +#endif +} + +void Minecraft::optionUpdated( const Options::Option* option, int value ) { + +} + +bool Minecraft::connectToHost(const std::string& host, int port) { + if (netCallback) { delete netCallback; netCallback = NULL; } + netCallback = new ClientSideNetworkHandler(this, raknetInstance); + return raknetInstance->connect(host.c_str(), port); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/01A14488C8EC4409FAAEF81E3A511152 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/01A14488C8EC4409FAAEF81E3A511152 new file mode 100644 index 0000000..ca65891 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/01A14488C8EC4409FAAEF81E3A511152 @@ -0,0 +1,230 @@ +#include "JoinGameScreen.h" +#include "StartMenuScreen.h" +#include "ProgressScreen.h" +#include "../Font.h" +#include "../../../network/RakNetInstance.h" +#include "../../../network/ClientSideNetworkHandler.h" + +#include "../components/TextBox.h" + +#include +#include +#include + +JoinGameScreen::JoinGameScreen() +: bJoin(2, "Join Game"), + bBack(3, "Back"), + gamesList(NULL), + ip(5, "IP+Port?") +{ + bJoin.active = false; + //gamesList->yInertia =0.5f; +} + +JoinGameScreen::~JoinGameScreen() +{ + delete gamesList; +} + +void JoinGameScreen::buttonClicked(Button* button) +{ + if (button->id == bJoin.id) + { + // Try manual IP:Port from textbox first (if provided) + std::string addr = ip.text; + // trim whitespace + auto trim = [](std::string &s) { + size_t start =0; + while (start < s.size() && std::isspace((unsigned char)s[start])) ++start; + size_t end = s.size(); + while (end > start && std::isspace((unsigned char)s[end -1])) --end; + s = s.substr(start, end - start); + }; + trim(addr); + + if (!addr.empty() && addr != "IP+Port?") + { + // parse host[:port], default port19132 + std::string host = addr; + int port =19132; + size_t colon = addr.find(':'); + if (colon != std::string::npos) + { + host = addr.substr(0, colon); + std::string portStr = addr.substr(colon +1); + trim(host); + trim(portStr); + if (!portStr.empty()) + port = std::atoi(portStr.c_str()); + } else { + trim(host); + } + + if (!host.empty()) + { + // Tear down any previous callback and create a client callback for this connection + if (minecraft->netCallback) { + delete minecraft->netCallback; + minecraft->netCallback = NULL; + } + minecraft->netCallback = new ClientSideNetworkHandler(minecraft, minecraft->raknetInstance); + + // Start the connection (returns immediately whether startup succeeded) + minecraft->raknetInstance->connect(host.c_str(), port); + + // Mirror existing behavior: disable buttons and show progress screen + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + return; + } + + // Fallback: join selected discovered server (existing behavior) + if (isIndexValid(gamesList->selectedItem)) + { + PingedCompatibleServer selectedServer = gamesList->copiedServerList[gamesList->selectedItem]; + minecraft->joinMultiplayer(selectedServer); + { + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + } + //minecraft->locateMultiplayer(); + //minecraft->setScreen(new JoinGameScreen()); + } + if (button->id == bBack.id) + { + minecraft->cancelLocateMultiplayer(); + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } +} + +bool JoinGameScreen::handleBackEvent(bool isDown) +{ + if (!isDown) + { + minecraft->cancelLocateMultiplayer(); + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } + return true; +} + + +bool JoinGameScreen::isIndexValid( int index ) +{ + return gamesList && index >=0 && index < gamesList->getNumberOfItems(); +} + +void JoinGameScreen::tick() +{ + const ServerList& orgServerList = minecraft->raknetInstance->getServerList(); + ServerList serverList; + for (unsigned int i =0; i < orgServerList.size(); ++i) + if (orgServerList[i].name.GetLength() >0) + serverList.push_back(orgServerList[i]); + + if (serverList.size() != gamesList->copiedServerList.size()) + { + // copy the currently selected item + PingedCompatibleServer selectedServer; + bool hasSelection = false; + if (isIndexValid(gamesList->selectedItem)) + { + selectedServer = gamesList->copiedServerList[gamesList->selectedItem]; + hasSelection = true; + } + + gamesList->copiedServerList = serverList; + gamesList->selectItem(-1, false); + + // re-select previous item if it still exists + if (hasSelection) + { + for (unsigned int i =0; i < gamesList->copiedServerList.size(); i++) + { + if (gamesList->copiedServerList[i].address == selectedServer.address) + { + gamesList->selectItem(i, false); + break; + } + } + } + } else { + for (int i = (int)gamesList->copiedServerList.size()-1; i >=0 ; --i) { + for (int j =0; j < (int) serverList.size(); ++j) + if (serverList[j].address == gamesList->copiedServerList[i].address) + gamesList->copiedServerList[i].name = serverList[j].name; + } + } + + bJoin.active = isIndexValid(gamesList->selectedItem); +} + +void JoinGameScreen::init() +{ + buttons.push_back(&bJoin); + buttons.push_back(&bBack); + textBoxes.push_back(&ip); + + minecraft->raknetInstance->clearServerList(); + gamesList = new AvailableGamesList(minecraft, width, height); + +#ifdef ANDROID + tabButtons.push_back(&bJoin); + tabButtons.push_back(&bBack); +#endif +} + +void JoinGameScreen::setupPositions() { + int yBase = height -26; + + //#ifdef ANDROID + bJoin.y = yBase; + bBack.y = yBase; + + bBack.width = bJoin.width =120; + //#endif + + // Center buttons + bJoin.x = width /2 -4 - bJoin.width; + bBack.x = width /2 +4; + ip.x =1; + ip.y =10; + ip.w = bJoin.width; +} + +void JoinGameScreen::render( int xm, int ym, float a ) +{ + bool hasNetwork = minecraft->platform()->isNetworkEnabled(true); +#ifdef WIN32 + hasNetwork = hasNetwork && !GetAsyncKeyState(VK_TAB); +#endif + + renderBackground(); + if (hasNetwork) gamesList->render(xm, ym, a); + Screen::render(xm, ym, a); + + if (hasNetwork) { +#ifdef RPI + std::string s = "Scanning for Local Network Games..."; +#else + std::string s = "Scanning for WiFi Games..."; +#endif + drawCenteredString(minecraft->font, s, width /2,8,0xffffffff); + + const int textWidth = minecraft->font->width(s); + const int spinnerX = width/2 + textWidth /2 +6; + + static const char* spinnerTexts[] = {"-", "\\", "|", "/"}; + int n = ((int)(5.5f * getTimeS()) %4); + drawCenteredString(minecraft->font, spinnerTexts[n], spinnerX,8,0xffffffff); + } else { + std::string s = "WiFi is disabled"; + const int yy = height /2 -8; + drawCenteredString(minecraft->font, s, width /2, yy,0xffffffff); + } +} + +bool JoinGameScreen::isInGameScreen() { return false; } diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/0E1E245EA16F1FAA685C5686B18BDD08 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/0E1E245EA16F1FAA685C5686B18BDD08 new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/0E1E245EA16F1FAA685C5686B18BDD08 @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/1CC65E0062271217494E8E6A4C0A58CE b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/1CC65E0062271217494E8E6A4C0A58CE new file mode 100644 index 0000000..bfd810c --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/1CC65E0062271217494E8E6A4C0A58CE @@ -0,0 +1,34 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ +#define NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ + +//package net.minecraft.client.gui; + +#include +#include "../GuiComponent.h" +#include "../../Options.h" + +class Font; +class Minecraft; + +class TextBox: public GuiComponent +{ +public: + TextBox(int id, const std::string& msg); + TextBox(int id, int x, int y, const std::string& msg); + TextBox(int id, int x, int y, int w, int h, const std::string& msg); + + virtual void setFocus(Minecraft* minecraft); + virtual bool loseFocus(Minecraft* minecraft); + + virtual void render(Minecraft* minecraft, int xm, int ym); + +public: + int w, h; + int x, y; + + std::string text; + int id; + bool focused; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/1D11F3CE27B0B595836AB483CC9A0B43 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/1D11F3CE27B0B595836AB483CC9A0B43 new file mode 100644 index 0000000..c8328de --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/1D11F3CE27B0B595836AB483CC9A0B43 @@ -0,0 +1,70 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(0), w(0), h(0), x(0), y(0), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + minecraft->platform()->showKeyboard(); + focused = true; + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + minecraft->platform()->showKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + // Slightly translucent dark background + fill(x, y, x + w, y + h,0x80000000); + // Border + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + + // Draw text. If textbox contains the placeholder (no focus and text equals initial msg), draw dim color + int color =0xe0e0e0; + // If not focused and text is empty or equals default placeholder, draw dimmed + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + // measure available width approximated by character count + int calc = (w -8) /6; // approx6 px per char + int maxChars =1; + if (calc > maxChars) maxChars = calc; + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/4222F2040602983458B5992A709F7336 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/4222F2040602983458B5992A709F7336 new file mode 100644 index 0000000..ad4d97c --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/4222F2040602983458B5992A709F7336 @@ -0,0 +1,74 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_SCREENS_TOUCH__TouchJoinGameScreen_H__ +#define NET_MINECRAFT_CLIENT_GUI_SCREENS_TOUCH__TouchJoinGameScreen_H__ + +#include "../../Screen.h" +#include "../../components/Button.h" +#include "../../components/SmallButton.h" +#include "../../components/RolledSelectionListV.h" +#include "../../../Minecraft.h" +#include "../../../../platform/input/Multitouch.h" +#include "../../../../network/RakNetInstance.h" + +namespace Touch { + +class JoinGameScreen; + +class AvailableGamesList : public RolledSelectionListV +{ + int startSelected; + int selectedItem; + ServerList copiedServerList; + + friend class JoinGameScreen; + +public: + AvailableGamesList(Minecraft* _minecraft, int _width, int _height) + : RolledSelectionListV(_minecraft, _width, _height, 0, _width, 24, _height, 34), + selectedItem(-1), + startSelected(-1) + { + } + +protected: + + virtual int getNumberOfItems() { return (int)copiedServerList.size(); } + + virtual void selectCancel(); + virtual void selectStart(int item); + virtual void selectItem(int item, bool doubleClick); + + virtual bool isSelectedItem(int item) { return item == selectedItem; } + + virtual void renderBackground() {} + virtual void renderItem(int i, int x, int y, int h, Tesselator& t); +}; + +class JoinGameScreen: public Screen +{ +public: + JoinGameScreen(); + virtual ~JoinGameScreen(); + + void init(); + void setupPositions(); + + virtual bool handleBackEvent(bool isDown); + + virtual bool isIndexValid(int index); + + virtual void tick(); + void render(int xm, int ym, float a); + + void buttonClicked(Button* button); + + bool isInGameScreen(); +private: + Button bJoin; + TButton bBack; + THeader bHeader; + AvailableGamesList* gamesList; +}; + +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_SCREENS_TOUCH__TouchJoinGameScreen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/430CC357A15D4BE1A70387A7C3462A3C b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/430CC357A15D4BE1A70387A7C3462A3C new file mode 100644 index 0000000..92a367b --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/430CC357A15D4BE1A70387A7C3462A3C @@ -0,0 +1,258 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i = 0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0, 0, width, height, 0xc0101010, 0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1, 1, 1, 1); + float s = 32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height, 0, 0, height / s + fvo); + t.vertexUV((float)width, (float)height, 0, width / s, (float)height / s + fvo); + t.vertexUV((float)width, 0, 0, (float)width / s, 0 + fvo); + t.vertexUV(0, 0, 0, 0, 0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex = 0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount - 1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i = 0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; +/* +#if !defined(ANDROID) && !defined(__APPLE__) //if (!minecraft->isTouchscreen()) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); +#endif } +*/ + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + +#if 1 +//#if defined(ANDROID) || defined(__APPLE__) //if (minecraft->isTouchscreen()) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click", 1, 1); + clickedButton->released(x, y); + } + } +# else // } else { + clickedButton->released(x, y); +#endif // } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height - 1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/572513C3D8D309B3634C045C3C8FAC54 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/572513C3D8D309B3634C045C3C8FAC54 new file mode 100644 index 0000000..872695a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/572513C3D8D309B3634C045C3C8FAC54 @@ -0,0 +1,137 @@ +#ifndef KEYBOARD_H__ +#define KEYBOARD_H__ + +#include + +/** A keyboard action; key-down or key-up */ +class KeyboardAction +{ +public: + static const int KEYUP = 0; + static const int KEYDOWN = 1; + + KeyboardAction(unsigned char keyCode, int state) { + this->key = keyCode; + this->state = state; + } + + int state; + unsigned char key; +}; + +/* Iterators */ +typedef std::vector KeyboardActionVec; +typedef KeyboardActionVec::iterator KeyboardActionIt; +typedef KeyboardActionVec::const_iterator KeyboardActionCIt; + +/** A static keyboard class, written to resemble the one in lwjgl somewhat */ +class Keyboard +{ +public: + static const int KEY_A = 65; + static const int KEY_B = 66; + static const int KEY_C = 67; + static const int KEY_D = 68; + static const int KEY_E = 69; + static const int KEY_F = 70; + static const int KEY_G = 71; + static const int KEY_H = 72; + static const int KEY_I = 73; + static const int KEY_J = 74; + static const int KEY_K = 75; + static const int KEY_L = 76; + static const int KEY_M = 77; + static const int KEY_N = 78; + static const int KEY_O = 79; + static const int KEY_P = 80; + static const int KEY_Q = 81; + static const int KEY_R = 82; + static const int KEY_S = 83; + static const int KEY_T = 84; + static const int KEY_U = 85; + static const int KEY_V = 86; + static const int KEY_W = 87; + static const int KEY_X = 88; + static const int KEY_Y = 89; + static const int KEY_Z = 90; + + static const int KEY_BACKSPACE = 8; + static const int KEY_RETURN = 13; + + static const int KEY_F1 = 112; + static const int KEY_F2 = 113; + static const int KEY_F3 = 114; + static const int KEY_F4 = 115; + static const int KEY_F5 = 116; + static const int KEY_F6 = 117; + static const int KEY_F7 = 118; + static const int KEY_F8 = 119; + static const int KEY_F9 = 120; + static const int KEY_F10 = 121; + static const int KEY_F11 = 122; + static const int KEY_F12 = 123; + + static const int KEY_ESCAPE = 27; + static const int KEY_SPACE = 32; + static const int KEY_LSHIFT = 10; + + static bool isKeyDown(int keyCode) { + return _states[keyCode] == KeyboardAction::KEYDOWN; + } + + static void reset() { + _inputs.clear(); + _inputText.clear(); + _index = -1; + _textIndex = -1; + } + + static void feed(unsigned char keyCode, int state) { + _inputs.push_back(KeyboardAction(keyCode, state)); + + _states[keyCode] = state; + } + static void feedText(char character) { + _inputText.push_back(character); + } + + static bool next() { + if (_index + 1 >= (int)_inputs.size()) + return false; + + ++_index; + return true; + } + + static bool nextTextChar() { + if(_textIndex + 1 >= (int)_inputText.size()) + return false; + ++_textIndex; + return true; + } + + static void rewind() { + _index = -1; + _textIndex = -1; + } + + static int getEventKey() { + return _inputs[_index].key; + } + + static int getEventKeyState() { + return _inputs[_index].state; + } + static char getChar() { + return _inputText[_textIndex]; + } +private: + static int _index; + static int _textIndex; + static int _states[256]; + static std::vector _inputs; + static std::vector _inputText; + static bool _inited; +}; + +#endif//KEYBOARD_H__ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/72B2752C7CD663CF9A1CC0178EF19114 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/72B2752C7CD663CF9A1CC0178EF19114 new file mode 100644 index 0000000..c9f6e6a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/72B2752C7CD663CF9A1CC0178EF19114 @@ -0,0 +1,1563 @@ +#include "Minecraft.h" + +#if defined(APPLE_DEMO_PROMOTION) + #define NO_NETWORK +#endif + +#if defined(RPI) + #define CREATORMODE +#endif + +#include "../network/RakNetInstance.h" +#include "../network/ClientSideNetworkHandler.h" +#include "../network/ServerSideNetworkHandler.h" +//#include "../network/Packet.h" +#include "../world/entity/player/Inventory.h" +#include "../world/level/chunk/ChunkCache.h" +#include "../world/level/tile/Tile.h" +#include "../world/level/storage/LevelStorageSource.h" +#include "../world/level/storage/LevelStorage.h" +#include "player/input/KeyboardInput.h" +#ifndef STANDALONE_SERVER +#include "player/input/touchscreen/TouchInputHolder.h" +#endif +#include "player/LocalPlayer.h" +#include "gamemode/CreativeMode.h" +#include "gamemode/SurvivalMode.h" +#include "player/LocalPlayer.h" +#ifndef STANDALONE_SERVER +#include "particle/ParticleEngine.h" +#include "gui/Screen.h" +#include "gui/Font.h" +#include "gui/screens/RenameMPLevelScreen.h" +#include "sound/SoundEngine.h" +#endif +#include "../platform/CThread.h" +#include "../platform/input/Mouse.h" +#include "../AppPlatform.h" +#include "../Performance.h" +#include "../LicenseCodes.h" +#include "../util/PerfTimer.h" +#include "../util/PerfRenderer.h" +#include "player/input/MouseBuildInput.h" + +#include "../world/Facing.h" + +#include "../network/packet/PlaceBlockPacket.h" + +#include "player/input/IInputHolder.h" +#ifndef STANDALONE_SERVER +#include "player/input/touchscreen/TouchscreenInput.h" + +#include "player/input/ControllerTurnInput.h" +#include "player/input/XperiaPlayInput.h" + +#endif + +#include "player/input/MouseTurnInput.h" +#include "../world/entity/MobFactory.h" +#include "../world/level/MobSpawner.h" +#include "../util/Mth.h" +#include "../network/packet/InteractPacket.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/PrerenderTilesScreen.h" +#include "renderer/Textures.h" +#include "gui/screens/DeathScreen.h" +#endif + +#include "../network/packet/RespawnPacket.h" +#include "IConfigListener.h" +#include "../world/entity/MobCategory.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/FurnaceScreen.h" +#endif +#include "../world/Difficulty.h" +#include "../server/ServerLevel.h" +#ifdef CREATORMODE +#include "../server/CreatorLevel.h" +#endif +#include "../network/packet/AdventureSettingsPacket.h" +#include "../network/packet/SetSpawnPositionPacket.h" +#include "../network/command/CommandServer.h" +#include "gamemode/CreatorMode.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/ArmorScreen.h" +#endif +#include "../world/level/levelgen/synth/ImprovedNoise.h" +#ifndef STANDALONE_SERVER +#include "renderer/tileentity/TileEntityRenderDispatcher.h" +#endif + +#ifndef STANDALONE_SERVER +#include "renderer/ptexture/DynamicTexture.h" +#include "renderer/GameRenderer.h" +#include "renderer/ItemInHandRenderer.h" +#include "renderer/LevelRenderer.h" +#include "renderer/entity/EntityRenderDispatcher.h" +#include "gui/Screen.h" +#include "gui/Font.h" +#include "gui/screens/RenameMPLevelScreen.h" +#include "sound/SoundEngine.h" +#endif + +static void checkGlError(const char* tag) { +#ifdef GLDEBUG + while (1) { + const int errCode = glGetError(); + if (errCode == GL_NO_ERROR) break; + + LOGE("################\nOpenGL-error @ %s : #%d\n", tag, errCode); + } +#endif /*GLDEBUG*/ +} + +/*static*/ +const char* Minecraft::progressMessages[] = { + "Locating server", + "Building terrain", + "Preparing", + "Saving chunks" +}; + +int Minecraft::customDebugId = Minecraft::CDI_NONE; + +#if defined(_MSC_VER) + #pragma warning( disable : 4355 ) // 'this' pointer in initialization list which is perfectly legal +#endif + +bool Minecraft::useAmbientOcclusion = false; + +Minecraft::Minecraft() +: user(NULL), + level(NULL), + player(NULL), + cameraTargetPlayer(NULL), + levelRenderer(NULL), + gameRenderer(NULL), +#ifndef STANDALONE_SERVER + particleEngine(NULL), + _perfRenderer(NULL), +#endif + _commandServer(NULL), +#ifndef STANDALONE_SERVER + textures(NULL), +#endif + lastTickTime(-1), + lastTime(0), + ticksSinceLastUpdate(0), + gameMode(NULL), + mouseGrabbed(true), + missTime(0), + pause(false), + _running(false), + timer(20), +#ifndef STANDALONE_SERVER + gui(this), +#endif + netCallback(NULL), +#ifndef STANDALONE_SERVER + screen(NULL), + font(NULL), +#endif + screenMutex(false), +#ifndef STANDALONE_SERVER + scheduledScreen(NULL), + hasScheduledScreen(false), + soundEngine(NULL), +#endif + ticks(0), + isGeneratingLevel(false), + _hasSignaledGeneratingLevelFinished(true), + generateLevelThread(NULL), + progressStagePercentage(0), + progressStageStatusId(0), + isLookingForMultiplayer(false), + _licenseId(LicenseCodes::WAIT_PLATFORM_NOT_READY), + inputHolder(0), + _supportsNonTouchscreen(false), +#ifndef STANDALONE_SERVER + screenChooser(this), +#endif + width(1), height(1), + //_respawnPlayerTicks(-1), +#ifdef __APPLE__ + _isSuperFast(false), +#endif + _powerVr(false), + commandPort(4711), + reserved_d1(0),reserved_d2(0), + reserved_f1(0),reserved_f2(0) +{ +//#ifdef ANDROID + +#if defined(NO_NETWORK) + raknetInstance = new IRakNetInstance(); +#else + raknetInstance = new RakNetInstance(); +#endif +#ifndef STANDALONE_SERVER + soundEngine = new SoundEngine(20.0f); + soundEngine->init(this, &options); +#endif + //setupPieces(); +} + +Minecraft::~Minecraft() +{ + delete netCallback; + delete raknetInstance; +#ifndef STANDALONE_SERVER + delete levelRenderer; + delete gameRenderer; + delete particleEngine; + + delete soundEngine; +#endif + delete gameMode; +#ifndef STANDALONE_SERVER + delete font; + delete textures; + + if (screen != NULL) { + delete screen; + screen = NULL; + } +#endif + if (level != NULL) { + level->saveGame(); + if (level->getChunkSource()) + level->getChunkSource()->saveAll(true); + delete level->getLevelStorage(); + delete level; + level = NULL; + } + + //delete player; + delete user; + delete inputHolder; + + delete storageSource; + delete _perfRenderer; + delete _commandServer; + + MobFactory::clearStaticTestMobs(); +#ifndef STANDALONE_SERVER + EntityRenderDispatcher::destroy(); +#endif +} + +// Only called by server +void Minecraft::selectLevel( const std::string& levelId, const std::string& levelName, const LevelSettings& settings ) +{ +#if defined(CREATORMODE) + level = new CreatorLevel( +#else + level = new ServerLevel( +#endif + storageSource->selectLevel(levelId, false), + levelName, + settings, + SharedConstants::GeneratorVersion); + + // note: settings is useless beyond this point, since it's + // either copied to LevelData (or LevelData read from file) + setLevel(level, "Generating level"); + setIsCreativeMode(level->getLevelData()->getGameType() == GameType::Creative); + _running = true; +} + +void Minecraft::setLevel(Level* level, const std::string& message /* ="" */, LocalPlayer* forceInsertPlayer /* = NULL */) { + cameraTargetPlayer = NULL; + LOGI("Seed is %ld\n", level->getSeed()); + + if (level != NULL) { + level->raknetInstance = raknetInstance; + gameMode->initLevel(level); + + if (!player && forceInsertPlayer) + { + player = forceInsertPlayer; + player->resetPos(false); + //level->addEntity(forceInsertPlayer); + } + else if (player != NULL) { + player->resetPos(false); + if (level != NULL) { + level->addEntity(player); + } + } + this->level = level; + _hasSignaledGeneratingLevelFinished = false; +#ifdef STANDALONE_SERVER + const bool threadedLevelCreation = false; +#else + const bool threadedLevelCreation = true; +#endif + + if (threadedLevelCreation) { + // Threaded + // "Lock" + isGeneratingLevel = true; + generateLevelThread = new CThread(Minecraft::prepareLevel_tspawn, this); + } else { + // Non-threaded + generateLevel("Currently not used", level); + } + } else { + player = NULL; + } + + this->lastTickTime = 0; + this->_running = true; +} + +void Minecraft::leaveGame(bool renameLevel /*=false*/) +{ + if (isGeneratingLevel || !_hasSignaledGeneratingLevelFinished) + return; + + isGeneratingLevel = false; + bool saveLevel = level && (!level->isClientSide || renameLevel); + + raknetInstance->disconnect(); + if (saveLevel) { + // If server or wanting to save level as client, save all unsaved chunks! + level->getChunkSource()->saveAll(true); + } + + LOGI("Clearing levels\n"); + + cameraTargetPlayer = NULL; +#ifndef STANDALONE_SERVER + levelRenderer->setLevel(NULL); + particleEngine->setLevel(NULL); +#endif + LOGI("Erasing callback\n"); + delete netCallback; + netCallback = NULL; + + LOGI("Erasing level\n"); + if (level != NULL) { + delete level->getLevelStorage(); + delete level; + level = NULL; + } + //delete player; + player = NULL; + cameraTargetPlayer = NULL; + + _running = false; +#ifndef STANDALONE_SERVER + if (renameLevel) { + setScreen(new RenameMPLevelScreen(LevelStorageSource::TempLevelId)); + } + else + screenChooser.setScreen(SCREEN_STARTMENU); +#endif +} + +void Minecraft::prepareLevel(const std::string& title) { + LOGI("status: 1\n"); + progressStageStatusId = 1; + + Stopwatch A, B, C, D; + A.start(); + + Stopwatch L; + + // Dont update lights if we load the level (ok, actually just with leveldata version=1.+(?)) + if (!level->isNew()) + level->setUpdateLights(false); + + int Max = CHUNK_CACHE_WIDTH * CHUNK_CACHE_WIDTH; + int pp = 0; + for (int x = 8; x < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); x += CHUNK_WIDTH) { + for (int z = 8; z < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); z += CHUNK_WIDTH) { + progressStagePercentage = 100 * pp++ / Max; + //printf("level generation progress %d\n", progressStagePercentage); + B.start(); + level->getTile(x, 64, z); + B.stop(); + L.start(); + if (level->isNew()) + while (level->updateLights()) + ; + L.stop(); + } + } + A.stop(); + level->setUpdateLights(true); + + C.start(); + for (int x = 0; x < CHUNK_CACHE_WIDTH; x++) + { + for (int z = 0; z < CHUNK_CACHE_WIDTH; z++) + { + LevelChunk* chunk = level->getChunk(x, z); + if (chunk && !chunk->createdFromSave) + { + chunk->unsaved = false; + chunk->clearUpdateMap(); + } + } + } + C.stop(); + + LOGI("status: 3\n"); + progressStageStatusId = 3; + if (level->isNew()) { + level->setInitialSpawn(); // @note: should obviously be called from Level itself + level->saveLevelData(); + level->getChunkSource()->saveAll(false); + level->saveGame(); + } else { + level->saveLevelData(); + level->loadEntities(); + } + + progressStagePercentage = -1; + progressStageStatusId = 2; + LOGI("status: 2\n"); + + D.start(); + level->prepare(); + D.stop(); + + A.print("Generate level: "); + L.print(" - light: "); + B.print(" - getTl: "); + C.print(" - clear: "); + D.print(" - prepr: "); + progressStageStatusId = 0; +} + +void Minecraft::update() { + //LOGI("Enter Update\n"); + + if (Options::debugGl) + LOGI(">>>>>>>>>>\n"); + + TIMER_PUSH("root"); + + //if (level) { + // LOGI("numplayers: %d\n", level->players.size()); + // for (int i = 0; i < level->players.size(); ++i) { + // Player* p = level->players[i]; + // bool inEnt = std::find(level->entities.begin(), level->entities.end(), p) != level->entities.end(); + // LOGI(" %p, %d, %d - in? %d\n", p, p->entityId, p->owner.ToUint32(p->owner), inEnt); + // } + //} + + if (pause && level != NULL) { + float lastA = timer.a; + timer.advanceTime(); + timer.a = lastA; + } else { + timer.advanceTime(); + } + + if (raknetInstance) { + raknetInstance->runEvents(netCallback); + } + + TIMER_PUSH("tick"); + int toTick = timer.ticks; + for (int i = 0; i < toTick; ++i, ++ticks) + tick(i, toTick-1); + + TIMER_POP_PUSH("updatelights"); + if (level && !isGeneratingLevel) { + level->updateLights(); + } + TIMER_POP(); + + #ifndef STANDALONE_SERVER + if (gameMode != NULL) gameMode->render(timer.a); + TIMER_PUSH("sound"); + soundEngine->update(player, timer.a); + TIMER_POP_PUSH("render"); + gameRenderer->render(timer.a); + TIMER_POP(); + #else + CThread::sleep(1); + #endif +#ifndef STANDALONE_SERVER + Multitouch::resetThisUpdate(); +#endif + TIMER_POP(); +#ifndef STANDALONE_SERVER + checkGlError("Update finished"); + + if (options.renderDebug) { + if (!PerfTimer::enabled) { + PerfTimer::reset(); + PerfTimer::enabled = true; + } + + //TIMER_PUSH("debugfps"); + _perfRenderer->renderFpsMeter(1); + checkGlError("render debug"); + //TIMER_POP(); + } else { + PerfTimer::enabled = false; + } +#endif + //LOGI("Exit Update\n"); +} + +void Minecraft::tick(int nTick, int maxTick) { + if (missTime > 0) missTime--; +#ifndef STANDALONE_SERVER + if (!screen && player) { + if (player->health <= 0) { + setScreen(new DeathScreen()); + } + } +#endif + TIMER_PUSH("gameMode"); + if (level && !pause) { + gameMode->tick(); + } + + TIMER_POP_PUSH("commandServer"); + if (level && _commandServer) { + _commandServer->tick(); + } + + TIMER_POP_PUSH("input"); + tickInput(); +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("gui"); + gui.tick(); +#endif + // + // Ongoing level generation in a (perhaps) different thread. When it's + // ready, _levelGenerated() is called once and any threads are deleted. + // + if (isGeneratingLevel) { + return; + } else if (!_hasSignaledGeneratingLevelFinished) { + if (generateLevelThread) { + delete generateLevelThread; + generateLevelThread = NULL; + } + _levelGenerated(); + } + + // + // Normal game loop, run before or efter level generation + // + if (level != NULL) + { + if (!pause) { +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("gameRenderer"); + gameRenderer->tick(nTick, maxTick); + + TIMER_POP_PUSH("levelRenderer"); + levelRenderer->tick(); +#endif + level->difficulty = options.difficulty; + if (level->isClientSide) level->difficulty = Difficulty::EASY; + + TIMER_POP_PUSH("level"); + level->tickEntities(); + level->tick(); +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("animateTick"); + if (player) { + level->animateTick(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); + } +#endif + } + } +#ifndef STANDALONE_SERVER + textures->loadAndBindTexture("terrain.png"); + if (!pause && !(screen && !screen->renderGameBehind())) { + #if !defined(RPI) + #ifdef __APPLE__ + if (isSuperFast()) + #endif + { + if (nTick == maxTick) { + TIMER_POP_PUSH("textures"); + textures->tick(true); + } + } + #endif + } + TIMER_POP_PUSH("particles"); + particleEngine->tick(); + if (screen) { + screenMutex = true; + screen->tick(); + screenMutex = false; + } + + // @note: fix to keep "isPressed" and "isReleased" as long as necessary. + // Most likely keyboard and mouse could/should be reset here as well. + Multitouch::reset(); +#endif + TIMER_POP(); +} + +class InputRAII { +public: + ~InputRAII() { +#ifndef STANDALONE_SERVER + Mouse::reset(); + Keyboard::reset(); +#endif + } +}; + +void Minecraft::tickInput() { +#ifndef STANDALONE_SERVER + InputRAII raiiInput; + + if (screen && !screen->passEvents) { + screenMutex = true; + screen->updateEvents(); + //screen->updateSetScreen(); + screenMutex = false; + if (hasScheduledScreen) { + setScreen(scheduledScreen); + scheduledScreen = NULL; + hasScheduledScreen = false; + } + return; + } + + if (!player) { + return; + } + +#ifdef RPI + bool mouseDiggable = true; + bool allowGuiClicks = !mouseGrabbed; +#else + bool mouseDiggable = !gui.isInside(Mouse::getX(), Mouse::getY()); + bool allowGuiClicks = true; +#endif + + TIMER_PUSH("mouse"); + while (Mouse::next()) { + //if (Mouse::getButtonState(MouseAction::ACTION_LEFT)) + // LOGI("mouse-down-at: %d, %d\n", Mouse::getX(), Mouse::getY()); + int passedTime = getTimeMs() - lastTickTime; + if (passedTime > 200) continue; // @note: As long Mouse::clear CLEARS the whole buffer, it's safe to break here + // But since it might be rewritten anyway (and hopefully there aren't a lot of messages, we just continue. + + const MouseAction& e = Mouse::getEvent(); + +#ifdef RPI // If clicked when not having focus, get focus @keyboard + if (!mouseGrabbed) { + if (!screen && e.data == MouseAction::DATA_DOWN) { + grabMouse(); + } + } +#endif + + if (allowGuiClicks && e.action == MouseAction::ACTION_LEFT && e.data == MouseAction::DATA_DOWN) { + gui.handleClick(MouseAction::ACTION_LEFT, Mouse::getX(), Mouse::getY()); + } + + if (e.action == MouseAction::ACTION_WHEEL) { + Inventory* v = player->inventory; + int numSlots = gui.getNumSlots() - 1; + int slot = (v->selected - e.dy + numSlots) % numSlots; + v->selectSlot(slot); + } + /* + if (mouseDiggable && options.useMouseForDigging) { + if (Mouse::getEventButton() == MouseAction::ACTION_LEFT && Mouse::getEventButtonState()) { + handleMouseClick(MouseAction::ACTION_LEFT); + lastClickTick = ticks; + } + if (Mouse::getEventButton() == MouseAction::ACTION_RIGHT && Mouse::getEventButtonState()) { + handleMouseClick(MouseAction::ACTION_RIGHT); + lastClickTick = ticks; + } + } + */ + } + + TIMER_POP_PUSH("keyboard"); + while (Keyboard::next()) { + int key = Keyboard::getEventKey(); + bool isPressed = (Keyboard::getEventKeyState() == KeyboardAction::KEYDOWN); + player->setKey(key, isPressed); + + if (isPressed) { + gui.handleKeyPressed(key); + + #if defined(WIN32) || defined(RPI)//|| defined(_DEBUG) || defined(DEBUG) + if (key >= '0' && key <= '9') { + int digit = key - '0'; + int slot = digit - 1; + + if (slot >= 0 && slot < gui.getNumSlots()-1) + player->inventory->selectSlot(slot); + + #if defined(WIN32) + if (digit >= 1 && GetAsyncKeyState(VK_CONTROL) < 0) { + // Set adventure settings here! + AdventureSettingsPacket p(level->adventureSettings); + p.toggle((AdventureSettingsPacket::Flags)(1 << slot)); + p.fillIn(level->adventureSettings); + raknetInstance->send(p); + } + if (digit == 0) { + Pos pos((int)player->x, (int)player->y-1, (int)player->z); + SetSpawnPositionPacket p(pos); + raknetInstance->send(p); + } + #endif + } + #endif + #if defined(RPI) + if (key == Keyboard::KEY_E) { + screenChooser.setScreen(SCREEN_BLOCKSELECTION); + } + if (!screen && key == Keyboard::KEY_O || key == 250) { + releaseMouse(); + } + #endif + #if defined(WIN32) + if (key == Keyboard::KEY_F) { + options.isFlying = !options.isFlying; + player->noPhysics = options.isFlying; + } + + if (key == Keyboard::KEY_T) { + options.thirdPersonView = !options.thirdPersonView; + /* + ImprovedNoise noise; + for (int i = 0; i < 16; ++i) + printf("%d\t%f\n", i, noise.grad2(i, 3, 8)); + */ + } + + if (key == Keyboard::KEY_O) { + useAmbientOcclusion = !useAmbientOcclusion; + options.ambientOcclusion = useAmbientOcclusion; + levelRenderer->allChanged(); + } + + if (key == Keyboard::KEY_L) + options.viewDistance = (options.viewDistance + 1) % 4; + + if (key == Keyboard::KEY_U) { + onGraphicsReset(); + player->heal(100); + } + + if (key == Keyboard::KEY_B || key == 108) // Toggle the game mode + setIsCreativeMode(!isCreativeMode()); + + if (key == Keyboard::KEY_P) // Step forward in time + level->setTime( level->getTime() + 1000); + + if (key == Keyboard::KEY_G) { + setScreen(new ArmorScreen()); + /* + std::vector& boxs = level->getCubes(NULL, AABB(128.1f, 73, 128.1f, 128.9f, 74.9f, 128.9f)); + LOGI("boxes: %d\n", (int)boxs.size()); + */ + } + + if (key == Keyboard::KEY_Y) { + textures->reloadAll(); + player->hurtTo(2); + } + if (key == Keyboard::KEY_Z || key == 108) { + for (int i = 0; i < 1; ++i) { + Mob* mob = NULL; + int forceId = 0;//MobTypes::Sheep; + + int types[] = { + MobTypes::Sheep, + MobTypes::Pig, + MobTypes::Chicken, + MobTypes::Cow, + }; + + int mobType = (forceId > 0)? forceId : types[Mth::random(sizeof(types) / sizeof(int))]; + mob = MobFactory::CreateMob(mobType, level); + + //((Animal*)mob)->setAge(-1000); + float dx = 4 - 8 * Mth::random() + 4 * Mth::sin(Mth::DEGRAD * player->yRot); + float dz = 4 - 8 * Mth::random() + 4 * Mth::cos(Mth::DEGRAD * player->yRot); + if (mob && !MobSpawner::addMob(level, mob, player->x + dx, player->y, player->z + dz, Mth::random()*360, 0, true)) + delete mob; + } + } + + if (key == Keyboard::KEY_X) { + const EntityList& entities = level->getAllEntities(); + for (int i = entities.size()-1; i >= 0; --i) { + Entity* e = entities[i]; + if (!e->isPlayer()) + level->removeEntity(e); + } + } + + if (key == Keyboard::KEY_C /*|| key == 4*/) { + player->inventory->clearInventoryWithDefault(); + // @todo: Add saving here for benchmarking + } + if (key == Keyboard::KEY_H) { + setScreen( new PrerenderTilesScreen() ); + } + + if (key == Keyboard::KEY_O) { + for (int i = Inventory::MAX_SELECTION_SIZE; i < player->inventory->getContainerSize(); ++i) + if (player->inventory->getItem(i)) + player->inventory->dropSlot(i, false); + } + if (key == Keyboard::KEY_F3) { + options.renderDebug = !options.renderDebug; + } + if (key == Keyboard::KEY_M) { + options.difficulty = (options.difficulty == Difficulty::PEACEFUL)? + Difficulty::NORMAL : Difficulty::PEACEFUL; + //setIsCreativeMode( !isCreativeMode() ); + } + + // lanternroci + if (key == Keyboard::KEY_ESCAPE) + pauseGame(false); + if (key == Keyboard::KEY_E && !options.isFlying) { + screenChooser.setScreen(SCREEN_BLOCKSELECTION); + } + + if (options.renderDebug) { + if (key >= '0' && key <= '9') { + _perfRenderer->debugFpsMeterKeyPress(key - '0'); + } + } + #endif + + #ifndef RPI + if (key == 82) + pauseGame(false); + #else + if (key == Keyboard::KEY_ESCAPE) + pauseGame(false); + #endif + + #ifndef OPENGL_ES + if (key == Keyboard::KEY_P) { + static bool isWireFrame = false; + isWireFrame = !isWireFrame; + glPolygonMode(GL_FRONT, isWireFrame? GL_LINE : GL_FILL); + //glPolygonMode(GL_BACK, isWireFrame? GL_LINE : GL_FILL); + } + #endif + } + #ifdef WIN32 + if (key == Keyboard::KEY_M) { + for (int i = 0; i < 5 * SharedConstants::TicksPerSecond; ++i) + level->tick(); + } + #endif + + + //if (!isPressed) LOGI("Key released: %d\n", key); + + if (!options.useMouseForDigging) { + int passedTime = getTimeMs() - lastTickTime; + if (passedTime > 200) continue; + + // Destroy and attack is on same button + if (key == options.keyDestroy.key && isPressed) { + BuildActionIntention bai(BuildActionIntention::BAI_REMOVE | BuildActionIntention::BAI_ATTACK); + handleBuildAction(&bai); + } + else // Build and use/interact is on same button + if (key == options.keyUse.key && isPressed) { + BuildActionIntention bai(BuildActionIntention::BAI_BUILD | BuildActionIntention::BAI_INTERACT); + handleBuildAction(&bai); + } + } + } + + TIMER_POP_PUSH("tickbuild"); + BuildActionIntention bai; + // @note: This might be a problem. This method is polling based here, but + // event based when using mouse (or keys..), and in java. Not quite + // sure just yet what way to go. + bool buildHandled = inputHolder->getBuildInput()->tickBuild(player, &bai); + if (buildHandled) { + if (!bai.isRemoveContinue()) + handleBuildAction(&bai); + } + + bool isTryingToDestroyBlock = (options.useMouseForDigging + ? (Mouse::isButtonDown(MouseAction::ACTION_LEFT) && mouseDiggable) + : Keyboard::isKeyDown(options.keyDestroy.key)) + || (buildHandled && bai.isRemove()); + + TIMER_POP_PUSH("handlemouse"); +#ifdef RPI + handleMouseDown(MouseAction::ACTION_LEFT, isTryingToDestroyBlock); + handleMouseClick(buildHandled && bai.isInteract() + || options.useMouseForDigging && Mouse::isButtonDown(MouseAction::ACTION_RIGHT)); +#else + handleMouseDown(MouseAction::ACTION_LEFT, isTryingToDestroyBlock || (buildHandled && bai.isInteract())); +#endif + + lastTickTime = getTimeMs(); + + // we have (hopefully) handled the keyboard & mouse queue and it + // can now be emptied. If wanted, the reset could be changed to: + // index -= numRead; // then this code doesn't have to be placed here + // + it prepares for tick not handling all or any events. + // update: RAII'ing instead, see above + //Keyboard::reset(); + //Mouse::reset(); + + TIMER_POP(); +#endif +} + +void Minecraft::handleMouseDown(int button, bool down) { +#ifndef STANDALONE_SERVER +#ifndef RPI + if(player->isUsingItem()) { + if(!down && !Keyboard::isKeyDown(options.keyUse.key)) { + gameMode->releaseUsingItem(player); + } + return; + } +#endif + if(player->isSleeping()) { + return; + } + if (button == MouseAction::ACTION_LEFT && missTime > 0) return; + if (down && hitResult.type == TILE && button == MouseAction::ACTION_LEFT && !hitResult.indirectHit) { + int x = hitResult.x; + int y = hitResult.y; + int z = hitResult.z; + gameMode->continueDestroyBlock(x, y, z, hitResult.f); + particleEngine->crack(x, y, z, hitResult.f); + player->swing(); + } else { + gameMode->stopDestroyBlock(); + } +#endif +} + +void Minecraft::handleMouseClick(int button) { +// BuildActionIntention bai( +// (button == MouseAction::ACTION_LEFT)? +// BuildActionIntention::BAI_REMOVE +// : BuildActionIntention::BAI_BUILD); +// +// handleBuildAction(&bai); +} + +void Minecraft::handleBuildAction(BuildActionIntention* action) { +#ifndef STANDALONE_SERVER + if (action->isRemove()) { + if (missTime > 0) return; + player->swing(); + } + if(player->isUsingItem()) + return; + bool mayUse = true; + + if (!hitResult.isHit()) { + if (action->isRemove() && !gameMode->isCreativeType()) { + missTime = 10; + } + } else if (hitResult.type == ENTITY) { + if (action->isAttack()) { + player->swing(); + //LOGI("attacking!\n"); + InteractPacket packet(InteractPacket::Attack, player->entityId, hitResult.entity->entityId); + raknetInstance->send(packet); + gameMode->attack(player, hitResult.entity); + } else if (action->isInteract()) { + if (hitResult.entity->interactPreventDefault()) + mayUse = false; + //LOGI("interacting!\n"); + InteractPacket packet(InteractPacket::Interact, player->entityId, hitResult.entity->entityId); + raknetInstance->send(packet); + gameMode->interact(player, hitResult.entity); + } + } else if (hitResult.type == TILE) { + int x = hitResult.x; + int y = hitResult.y; + int z = hitResult.z; + int face = hitResult.f; + + int oldTileId = level->getTile(x, y, z); + Tile* oldTile = Tile::tiles[oldTileId]; + + //bool tryDestroyBlock = false; + + if (action->isRemove()) { + if (!oldTile) + return; + + //LOGI("tile: %s - %d, %d, %d. b: %f - %f\n", oldTile->getDescriptionId().c_str(), x, y, z, oldTile->getBrightness(level, x, y, z), oldTile->getBrightness(level, x, y+1, z)); + level->extinguishFire(x, y, z, hitResult.f); + gameMode->startDestroyBlock(x, y, z, hitResult.f); + } + else { + ItemInstance* item = player->inventory->getSelected(); + if (gameMode->useItemOn(player, level, item, x, y, z, face, hitResult.pos)) { + mayUse = false; + player->swing(); + #ifdef RPI + } else if (item && item->id == ((Item*)Item::sword_iron)->id) { + player->swing(); + #endif + } + if (item && item->count <= 0) { + player->inventory->clearSlot(player->inventory->selected); + } + //} else if (item && item->count != oldCount) { + // gameRenderer->itemInHandRenderer->itemPlaced(); + //} + } + } + if (mayUse && action->isInteract()) { + ItemInstance* item = player->inventory->getSelected(); + if (item && !player->isUsingItem()) { + if (gameMode->useItem(player, level, item)) { + gameRenderer->itemInHandRenderer->itemUsed(); + } + if (item && item->count <= 0) { + player->inventory->clearSlot(player->inventory->selected); + } + } + } +#endif +} + +bool Minecraft::isOnlineClient() +{ + return (level != NULL && level->isClientSide); +} + +bool Minecraft::isOnline() +{ + return netCallback != NULL; +} + +void Minecraft::pauseGame(bool isBackPaused) { +#ifndef STANDALONE_SERVER + if (screen != NULL) return; + screenChooser.setScreen(isBackPaused? SCREEN_PAUSEPREV : SCREEN_PAUSE); +#endif +} +void Minecraft::gameLostFocus() { +#ifndef STANDALONE_SERVER + if(screen != NULL) { + screen->lostFocus(); + } +#endif +} + + +void Minecraft::setScreen( Screen* screen ) +{ +#ifndef STANDALONE_SERVER + Mouse::reset(); + Multitouch::reset(); + Multitouch::resetThisUpdate(); + + if (screenMutex) { + hasScheduledScreen = true; + scheduledScreen = screen; + return; + } + + if (screen != NULL && screen->isErrorScreen()) + return; + if (screen == NULL && level == NULL) + screen = screenChooser.createScreen(SCREEN_STARTMENU); + + if (this->screen != NULL) { + this->screen->removed(); + delete this->screen; + } + + this->screen = screen; + if (screen != NULL) { + releaseMouse(); + //ScreenSizeCalculator ssc = new ScreenSizeCalculator(options, width, height); + int screenWidth = (int)(width * Gui::InvGuiScale); //ssc.getWidth(); + int screenHeight = (int)(height * Gui::InvGuiScale); //ssc.getHeight(); + screen->init(this, screenWidth, screenHeight); + + if (screen->isInGameScreen() && level) { + level->saveLevelData(); + level->saveGame(); + } + + //noRender = false; + } else { + grabMouse(); + } +#endif +} + +void Minecraft::grabMouse() +{ +#ifndef STANDALONE_SERVER + if (mouseGrabbed) return; + mouseGrabbed = true; + mouseHandler.grab(); + //setScreen(NULL); +#endif +} + +void Minecraft::releaseMouse() +{ +#ifndef STANDALONE_SERVER + if (!mouseGrabbed) { + return; + } + if (player) { + player->releaseAllKeys(); + } + mouseGrabbed = false; + mouseHandler.release(); +#endif +} + +bool Minecraft::useTouchscreen() { +#ifdef RPI + return false; +#endif + return options.useTouchScreen || !_supportsNonTouchscreen; +} +bool Minecraft::supportNonTouchScreen() { + return _supportsNonTouchscreen; +} +void Minecraft::init() +{ + options.minecraft = this; + options.initDefaultValues(); +#ifndef STANDALONE_SERVER + checkGlError("Init enter"); + + _supportsNonTouchscreen = !platform()->supportsTouchscreen(); + + LOGI("IS TOUCHSCREEN? %d\n", options.useTouchScreen); + + textures = new Textures(&options, platform()); + textures->addDynamicTexture(new WaterTexture()); + textures->addDynamicTexture(new WaterSideTexture()); + gui.texturesLoaded(textures); + + levelRenderer = new LevelRenderer(this); + gameRenderer = new GameRenderer(this); + particleEngine = new ParticleEngine(level, textures); + + // Platform specific initialization here + font = new Font(&options, "font/default8.png", textures); + + _perfRenderer = new PerfRenderer(this, font); + + checkGlError("Init complete"); +#endif + + user = new User("TestUser", ""); + setIsCreativeMode(false); // false means it's Survival Mode + reloadOptions(); + +} + +void Minecraft::setSize(int w, int h) { +#ifndef STANDALONE_SERVER + transformResolution(&w, &h); + + width = w; + height = h; + + if (width >= 1000) { + #ifdef __APPLE__ + Gui::GuiScale = (width > 2000)? 8.0f : 4.0f; + #else + Gui::GuiScale = 4.0f; + #endif + } + else if (width >= 800) { +#ifdef __APPLE__ + Gui::GuiScale = 4.0f; +#else + Gui::GuiScale = 3.0f; +#endif + } + else if (width >= 400) + Gui::GuiScale = 2.0f; + else + Gui::GuiScale = 1.0f; + + Gui::InvGuiScale = 1.0f / Gui::GuiScale; + int screenWidth = (int)(width * Gui::InvGuiScale); + int screenHeight = (int)(height * Gui::InvGuiScale); + + if (platform()) { + float pixelsPerMillimeter = options.getProgressValue(&Options::Option::PIXELS_PER_MILLIMETER); + pixelCalc.setPixelsPerMillimeter(pixelsPerMillimeter); + pixelCalcUi.setPixelsPerMillimeter(pixelsPerMillimeter * Gui::InvGuiScale); + } + + Config config = createConfig(this); + gui.onConfigChanged(config); + + if (screen) + screen->setSize(screenWidth, screenHeight); + + if (inputHolder) + inputHolder->onConfigChanged(config); + //LOGI("Setting size: %d, %d: %f\n", width, height, Gui::InvGuiScale); + +#ifdef WIN32 + char resbuf[128]; + sprintf(resbuf, " %d x %d @ scale %.2f", width, height, Gui::GuiScale); + //gui.addMessage(resbuf); +#endif +#endif /* STANDALONE_SERVER */ +} + +void Minecraft::reloadOptions() { + options.update(); + options.save(); + bool wasTouchscreen = options.useTouchScreen; + options.useTouchScreen = useTouchscreen(); + options.save(); + + if ((wasTouchscreen != options.useTouchScreen) || (inputHolder == 0)) + _reloadInput(); + + user->name = options.username; + + LOGI("Reloading-options\n"); + + // @todo @fix Android and iOS behaves a bit differently when leaving + // an options screen (Android recreates OpenGL surface) + setSize(width, height); +} + +void Minecraft::_reloadInput() { +#ifndef STANDALONE_SERVER + delete inputHolder; + + if (useTouchscreen()) { + inputHolder = new TouchInputHolder(this, &options); + } else { + #if defined(ANDROID) || defined(__APPLE__) + inputHolder = new CustomInputHolder( + new XperiaPlayInput(&options), + new ControllerTurnInput(2, ControllerTurnInput::MODE_DELTA), + new IBuildInput()); + #else + inputHolder = new CustomInputHolder( + new KeyboardInput(&options), + new MouseTurnInput(MouseTurnInput::MODE_DELTA, width/2, height/2), + new MouseBuildInput()); + #endif + } + + mouseHandler.setTurnInput(inputHolder->getTurnInput()); + if (level && player) { + player->input = inputHolder->getMoveInput(); + } +#endif +} + + +// +// Multiplayer +// +void Minecraft::locateMultiplayer() { + isLookingForMultiplayer = true; + + raknetInstance->pingForHosts(19132); + netCallback = new ClientSideNetworkHandler(this, raknetInstance); +} + +void Minecraft::cancelLocateMultiplayer() { + isLookingForMultiplayer = false; + + raknetInstance->stopPingForHosts(); + + delete netCallback; + netCallback = NULL; +} + +bool Minecraft::joinMultiplayer( const PingedCompatibleServer& server ) +{ + if (isLookingForMultiplayer && netCallback) { + isLookingForMultiplayer = false; + return raknetInstance->connect(server.address.ToString(false), server.address.GetPort()); + } + return false; +} + +void Minecraft::hostMultiplayer(int port) { + // Tear down last instance + raknetInstance->disconnect(); + delete netCallback; + netCallback = NULL; + +#if !defined(NO_NETWORK) + netCallback = new ServerSideNetworkHandler(this, raknetInstance); + #ifdef STANDALONE_SERVER + raknetInstance->host(user->name, port, 16); + #else + raknetInstance->host(user->name, port); + #endif +#endif +} + +// +// Level generation +// +/*static*/ + + void* Minecraft::prepareLevel_tspawn(void *p_param) +{ + Minecraft* mc = (Minecraft*) p_param; + mc->generateLevel("Currently not used", mc->level); + return 0; +} + +void Minecraft::generateLevel( const std::string& message, Level* level ) +{ + Stopwatch s; + s.start(); + prepareLevel(message); + s.stop(); + s.print("Level generated: "); + + // "Unlock" + isGeneratingLevel = false; +} + +void Minecraft::_levelGenerated() +{ +#ifndef STANDALONE_SERVER + if (player == NULL) { + player = (LocalPlayer*) gameMode->createPlayer(level); + gameMode->initPlayer(player); + } + + if (player) { + player->input = inputHolder->getMoveInput(); + } + + if (levelRenderer != NULL) levelRenderer->setLevel(level); + if (particleEngine != NULL) particleEngine->setLevel(level); + + gameMode->adjustPlayer(player); + gui.onLevelGenerated(); +#endif + + level->validateSpawn(); + level->loadPlayer(player, true); + // if we are client side, we trust the server to have given us a correct position + if (player && !level->isClientSide) { + player->resetPos(false); + } + + this->cameraTargetPlayer = player; + + if (raknetInstance->isServer()) + raknetInstance->announceServer(user->name); + + if (netCallback) { + netCallback->levelGenerated(level); + } + +#if defined(WIN32) || defined(RPI) + if (_commandServer) { + delete _commandServer; + } + _commandServer = new CommandServer(this); + _commandServer->init(commandPort); +#endif + + // Hack to (hopefully) get the players to show (note: in LevelListener + // instead, since adding yourself always generates a entityAdded) + //EntityRenderDispatcher::getInstance()->onGraphicsReset(); + _hasSignaledGeneratingLevelFinished = true; +} + +Player* Minecraft::respawnPlayer(int playerId) { + for (unsigned int i = 0; i < level->players.size(); ++i) { + if (level->players[i]->entityId == playerId) { + resetPlayer(level->players[i]); + return level->players[i]; + } + } + return NULL; +} + +void Minecraft::resetPlayer(Player* player) { + level->validateSpawn(); + player->reset(); + + Pos p; + if(player->hasRespawnPosition()) { + p = player->getRespawnPosition(); + } + else { + p = level->getSharedSpawnPos(); + } + player->setPos((float)p.x + 0.5f, (float)p.y + 1.0f, (float)p.z + 0.5f); + player->resetPos(true); + + if (isCreativeMode()) + player->inventory->clearInventoryWithDefault(); +} + +void Minecraft::respawnPlayer() { + // RESET THE FRACKING PLAYER HERE + //bool slowCheck = false; + //for (int i = 0; i < level->entities.size(); ++i) + // if (level->entities[i] == player) slowCheck = true; + // + //LOGI("Has entity? %d, %d\n", level->getEntity(player->entityId), slowCheck); + + resetPlayer(player); + + // tell server (or other client) that we re-spawned + RespawnPacket packet(player); + raknetInstance->send(packet); +} + +void Minecraft::onGraphicsReset() +{ +#ifndef STANDALONE_SERVER + textures->clear(); + + font->onGraphicsReset(); + gui.onGraphicsReset(); + + if (levelRenderer) levelRenderer->onGraphicsReset(); + if (gameRenderer) gameRenderer->onGraphicsReset(); + + EntityRenderDispatcher::getInstance()->onGraphicsReset(); + TileEntityRenderDispatcher::getInstance()->onGraphicsReset(); +#endif +} + +int Minecraft::getProgressStatusId() { + return progressStageStatusId; +} + +const char* Minecraft::getProgressMessage() +{ + return progressMessages[progressStageStatusId]; +} + +bool Minecraft::isLevelGenerated() +{ + return level != NULL && !isGeneratingLevel; +} + +LevelStorageSource* Minecraft::getLevelSource() +{ + return storageSource; +} + +int Minecraft::getLicenseId() { + if (!LicenseCodes::isReady(_licenseId)) + _licenseId = platform()->checkLicense(); + return _licenseId; +} + +void Minecraft::audioEngineOn() { +#ifndef STANDALONE_SERVER + soundEngine->enable(true); +#endif +} +void Minecraft::audioEngineOff() { +#ifndef STANDALONE_SERVER + soundEngine->enable(false); +#endif +} + +void Minecraft::setIsCreativeMode(bool isCreative) +{ +#ifdef CREATORMODE + delete gameMode; + gameMode = new CreatorMode(this); + _isCreativeMode = true; +#else + if (!gameMode || isCreative != _isCreativeMode) + { + delete gameMode; + if (isCreative) gameMode = new CreativeMode(this); + else gameMode = new SurvivalMode(this); + _isCreativeMode = isCreative; + } +#endif + if (player) + gameMode->initAbilities(player->abilities); +} + +bool Minecraft::isCreativeMode() { + return _isCreativeMode; +} + +bool Minecraft::isKindleFire(int kindleVersion) { + if (kindleVersion != 1) + return false; + + std::string model = platform()->getPlatformStringVar(PlatformStringVars::DEVICE_BUILD_MODEL); + std::string modelLower(model); + std::transform(modelLower.begin(), modelLower.end(), modelLower.begin(), tolower); + + return (modelLower.find("kindle") != std::string::npos) && (modelLower.find("fire") != std::string::npos); +} + +bool Minecraft::transformResolution(int* w, int* h) +{ + bool changed = false; + + // Kindle Fire 1: reporting wrong height in + // certain cases (e.g. after screen lock) + if (isKindleFire(1) && *h >= 560 && *h <= 620) { + *h = 580; + changed = true; + } + + return changed; +} + +ICreator* Minecraft::getCreator() +{ +#ifdef CREATORMODE + return ((CreatorMode*)gameMode)->getCreator(); +#else + return NULL; +#endif +} + +void Minecraft::optionUpdated( const Options::Option* option, bool value ) { + if(netCallback != NULL && option == &Options::Option::SERVER_VISIBLE) { + ServerSideNetworkHandler* ss = (ServerSideNetworkHandler*) netCallback; + ss->allowIncomingConnections(value); + } +} + +void Minecraft::optionUpdated( const Options::Option* option, float value ) { +#ifndef STANDALONE_SERVER + if(option == &Options::Option::PIXELS_PER_MILLIMETER) { + pixelCalcUi.setPixelsPerMillimeter(value * Gui::InvGuiScale); + pixelCalc.setPixelsPerMillimeter(value); + } +#endif +} + +void Minecraft::optionUpdated( const Options::Option* option, int value ) { + +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/74D6A5E205AA7E20BFDC3FB1DA7ED7AB b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/74D6A5E205AA7E20BFDC3FB1DA7ED7AB new file mode 100644 index 0000000..b447bc5 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/74D6A5E205AA7E20BFDC3FB1DA7ED7AB @@ -0,0 +1,73 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_SCREENS__JoinGameScreen_H__ +#define NET_MINECRAFT_CLIENT_GUI_SCREENS__JoinGameScreen_H__ + +#include "../Screen.h" +#include "../components/Button.h" +#include "../components/SmallButton.h" +#include "../components/ScrolledSelectionList.h" +#include "../../Minecraft.h" +#include "../../../network/RakNetInstance.h" + +#include "../components/TextBox.h" + +class JoinGameScreen; + +class AvailableGamesList : public ScrolledSelectionList +{ + int selectedItem; + ServerList copiedServerList; + + friend class JoinGameScreen; + +public: + + AvailableGamesList(Minecraft* _minecraft, int _width, int _height) + : ScrolledSelectionList(_minecraft, _width, _height, 24, _height - 30, 28) + { + } + +protected: + + virtual int getNumberOfItems() { return (int)copiedServerList.size(); } + + virtual void selectItem(int item, bool doubleClick) { selectedItem = item; } + virtual bool isSelectedItem(int item) { return item == selectedItem; } + + virtual void renderBackground() {} + virtual void renderItem(int i, int x, int y, int h, Tesselator& t) + { + const PingedCompatibleServer& s = copiedServerList[i]; + unsigned int color = s.isSpecial? 0xff00b0 : 0xffffa0; + drawString(minecraft->font, s.name.C_String(), x, y + 2, color); + drawString(minecraft->font, s.address.ToString(false), x, y + 16, 0xffffa0); + } +}; + +class JoinGameScreen: public Screen +{ +public: + JoinGameScreen(); + virtual ~JoinGameScreen(); + + void init(); + void setupPositions(); + + virtual bool handleBackEvent(bool isDown); + + virtual bool isIndexValid(int index); + + virtual void tick(); + + void render(int xm, int ym, float a); + + void buttonClicked(Button* button); + + bool isInGameScreen(); +private: + Button bJoin; + Button bBack; + AvailableGamesList* gamesList; + TextBox ip; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_SCREENS__JoinGameScreen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/7EAC658EF12ABB6C7FB918B4EE6CE367 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/7EAC658EF12ABB6C7FB918B4EE6CE367 new file mode 100644 index 0000000..ca65891 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/7EAC658EF12ABB6C7FB918B4EE6CE367 @@ -0,0 +1,230 @@ +#include "JoinGameScreen.h" +#include "StartMenuScreen.h" +#include "ProgressScreen.h" +#include "../Font.h" +#include "../../../network/RakNetInstance.h" +#include "../../../network/ClientSideNetworkHandler.h" + +#include "../components/TextBox.h" + +#include +#include +#include + +JoinGameScreen::JoinGameScreen() +: bJoin(2, "Join Game"), + bBack(3, "Back"), + gamesList(NULL), + ip(5, "IP+Port?") +{ + bJoin.active = false; + //gamesList->yInertia =0.5f; +} + +JoinGameScreen::~JoinGameScreen() +{ + delete gamesList; +} + +void JoinGameScreen::buttonClicked(Button* button) +{ + if (button->id == bJoin.id) + { + // Try manual IP:Port from textbox first (if provided) + std::string addr = ip.text; + // trim whitespace + auto trim = [](std::string &s) { + size_t start =0; + while (start < s.size() && std::isspace((unsigned char)s[start])) ++start; + size_t end = s.size(); + while (end > start && std::isspace((unsigned char)s[end -1])) --end; + s = s.substr(start, end - start); + }; + trim(addr); + + if (!addr.empty() && addr != "IP+Port?") + { + // parse host[:port], default port19132 + std::string host = addr; + int port =19132; + size_t colon = addr.find(':'); + if (colon != std::string::npos) + { + host = addr.substr(0, colon); + std::string portStr = addr.substr(colon +1); + trim(host); + trim(portStr); + if (!portStr.empty()) + port = std::atoi(portStr.c_str()); + } else { + trim(host); + } + + if (!host.empty()) + { + // Tear down any previous callback and create a client callback for this connection + if (minecraft->netCallback) { + delete minecraft->netCallback; + minecraft->netCallback = NULL; + } + minecraft->netCallback = new ClientSideNetworkHandler(minecraft, minecraft->raknetInstance); + + // Start the connection (returns immediately whether startup succeeded) + minecraft->raknetInstance->connect(host.c_str(), port); + + // Mirror existing behavior: disable buttons and show progress screen + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + return; + } + + // Fallback: join selected discovered server (existing behavior) + if (isIndexValid(gamesList->selectedItem)) + { + PingedCompatibleServer selectedServer = gamesList->copiedServerList[gamesList->selectedItem]; + minecraft->joinMultiplayer(selectedServer); + { + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + } + //minecraft->locateMultiplayer(); + //minecraft->setScreen(new JoinGameScreen()); + } + if (button->id == bBack.id) + { + minecraft->cancelLocateMultiplayer(); + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } +} + +bool JoinGameScreen::handleBackEvent(bool isDown) +{ + if (!isDown) + { + minecraft->cancelLocateMultiplayer(); + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } + return true; +} + + +bool JoinGameScreen::isIndexValid( int index ) +{ + return gamesList && index >=0 && index < gamesList->getNumberOfItems(); +} + +void JoinGameScreen::tick() +{ + const ServerList& orgServerList = minecraft->raknetInstance->getServerList(); + ServerList serverList; + for (unsigned int i =0; i < orgServerList.size(); ++i) + if (orgServerList[i].name.GetLength() >0) + serverList.push_back(orgServerList[i]); + + if (serverList.size() != gamesList->copiedServerList.size()) + { + // copy the currently selected item + PingedCompatibleServer selectedServer; + bool hasSelection = false; + if (isIndexValid(gamesList->selectedItem)) + { + selectedServer = gamesList->copiedServerList[gamesList->selectedItem]; + hasSelection = true; + } + + gamesList->copiedServerList = serverList; + gamesList->selectItem(-1, false); + + // re-select previous item if it still exists + if (hasSelection) + { + for (unsigned int i =0; i < gamesList->copiedServerList.size(); i++) + { + if (gamesList->copiedServerList[i].address == selectedServer.address) + { + gamesList->selectItem(i, false); + break; + } + } + } + } else { + for (int i = (int)gamesList->copiedServerList.size()-1; i >=0 ; --i) { + for (int j =0; j < (int) serverList.size(); ++j) + if (serverList[j].address == gamesList->copiedServerList[i].address) + gamesList->copiedServerList[i].name = serverList[j].name; + } + } + + bJoin.active = isIndexValid(gamesList->selectedItem); +} + +void JoinGameScreen::init() +{ + buttons.push_back(&bJoin); + buttons.push_back(&bBack); + textBoxes.push_back(&ip); + + minecraft->raknetInstance->clearServerList(); + gamesList = new AvailableGamesList(minecraft, width, height); + +#ifdef ANDROID + tabButtons.push_back(&bJoin); + tabButtons.push_back(&bBack); +#endif +} + +void JoinGameScreen::setupPositions() { + int yBase = height -26; + + //#ifdef ANDROID + bJoin.y = yBase; + bBack.y = yBase; + + bBack.width = bJoin.width =120; + //#endif + + // Center buttons + bJoin.x = width /2 -4 - bJoin.width; + bBack.x = width /2 +4; + ip.x =1; + ip.y =10; + ip.w = bJoin.width; +} + +void JoinGameScreen::render( int xm, int ym, float a ) +{ + bool hasNetwork = minecraft->platform()->isNetworkEnabled(true); +#ifdef WIN32 + hasNetwork = hasNetwork && !GetAsyncKeyState(VK_TAB); +#endif + + renderBackground(); + if (hasNetwork) gamesList->render(xm, ym, a); + Screen::render(xm, ym, a); + + if (hasNetwork) { +#ifdef RPI + std::string s = "Scanning for Local Network Games..."; +#else + std::string s = "Scanning for WiFi Games..."; +#endif + drawCenteredString(minecraft->font, s, width /2,8,0xffffffff); + + const int textWidth = minecraft->font->width(s); + const int spinnerX = width/2 + textWidth /2 +6; + + static const char* spinnerTexts[] = {"-", "\\", "|", "/"}; + int n = ((int)(5.5f * getTimeS()) %4); + drawCenteredString(minecraft->font, spinnerTexts[n], spinnerX,8,0xffffffff); + } else { + std::string s = "WiFi is disabled"; + const int yy = height /2 -8; + drawCenteredString(minecraft->font, s, width /2, yy,0xffffffff); + } +} + +bool JoinGameScreen::isInGameScreen() { return false; } diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/83105CECE6AA00603D9DA1057156A4A0 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/83105CECE6AA00603D9DA1057156A4A0 new file mode 100644 index 0000000..55155fc --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/83105CECE6AA00603D9DA1057156A4A0 @@ -0,0 +1,146 @@ +#include "TextEditScreen.h" +#include "../../../world/level/tile/entity/SignTileEntity.h" +#include "../../../AppPlatform.h" +#include "../../Minecraft.h" +#include "../../renderer/tileentity/TileEntityRenderDispatcher.h" +#include "../../renderer/Tesselator.h" +#include "../../renderer/Textures.h" +#include "../../renderer/GameRenderer.h" +#include "../components/Button.h" +#include "../../../network/Packet.h" +#include "../../../network/RakNetInstance.h" +TextEditScreen::TextEditScreen( SignTileEntity* signEntity ) + : sign(signEntity), isShowingKeyboard(false), frame(0), line(0), btnClose(1, "") { + +} +TextEditScreen::~TextEditScreen() { + +} +void TextEditScreen::init() { + super::init(); + minecraft->platform()->showKeyboard(); + isShowingKeyboard = true; + ImageDef def; + def.name = "gui/spritesheet.png"; + def.x = 0; + def.y = 1; + def.width = def.height = 18; + def.setSrc(IntRectangle(60, 0, 18, 18)); + btnClose.setImageDef(def, true); + btnClose.scaleWhenPressed = false; + buttons.push_back(&btnClose); +} + +void TextEditScreen::setupPositions() { + btnClose.width = btnClose.height = 19; + btnClose.x = width - btnClose.width; + btnClose.y = 0; +} + + +bool TextEditScreen::handleBackEvent( bool isDown ) { + sign->setChanged(); + Packet* signUpdatePacket = sign->getUpdatePacket(); + minecraft->raknetInstance->send(signUpdatePacket); + minecraft->platform()->hideKeyboard(); + minecraft->setScreen(NULL); + return true; +} + +void TextEditScreen::render( int xm, int ym, float a ) { + glDepthMask(GL_FALSE); + renderBackground(); + glPushMatrix(); + glDepthMask(GL_TRUE); + glDisable(GL_CULL_FACE); + glLoadIdentity(); + Tesselator& t = Tesselator::instance; + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrthof(0.0f, (float)minecraft->width, (float)minecraft->height, 0, -1, 1); + glMatrixMode(GL_MODELVIEW); + + minecraft->textures->loadAndBindTexture("item/sign.png"); + glColor4f2(1, 1, 1, 1); + + static float minUV[] = {0.03126f, 0.06249f}; + static float maxUV[] = {0.39063f, 0.4374f}; + float scale = ((minecraft->height / 2) / 32) * 0.9f; + + glTranslatef(minecraft->width / 2.0f, 5.0f, 0.0f); + glScalef2(scale,scale,1); + t.begin(GL_QUADS); + t.vertexUV(-32, 0, 0.0f,minUV[0],minUV[1]); + t.vertexUV(32, 0, 0.0f, maxUV[0], minUV[1]); + t.vertexUV(32, 0 + 32, 0.0f, maxUV[0], maxUV[1]); + t.vertexUV(-32, 0 + 32, 0.0f, minUV[0], maxUV[1]); + t.draw(); + + sign->selectedLine = line; + float textScale = 8.0f / 11.0f; + + glTranslatef(0, 2 ,0); + glScalef2(textScale, textScale, 1); + for(int i = 0; i < 4; ++i) { + //drawCenteredString(font, sign->messages[a], 32.0f, 10 * a, 0xFF000000); + std::string msg = sign->messages[i]; + if (i == sign->selectedLine && msg.length() < 14) { + std::string s = "> " + msg + " <"; + font->draw(s, -(float)font->width(s) / 2.0f, 10.0f * i, 0xFF000000, false); + } else { + font->draw(msg, -(float)font->width(msg) / 2.0f, 10.0f * i, 0xFF000000, false); + } + } + sign->selectedLine = -1; + //font->draw("Hej", minecraft->width / 2, 100, 0xFFFFFFFF, false); + + glPopMatrix(); + glEnable(GL_CULL_FACE); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + + //glEnable(GL_DEPTH_TEST); + super::render(xm, ym, a); +} + +void TextEditScreen::lostFocus() { + +} + +void TextEditScreen::tick() { + frame++; +} + +void TextEditScreen::keyPressed( int eventKey ) { + LOGW("Key pressed! [%d]", eventKey); + if(eventKey == Keyboard::KEY_BACKSPACE) { + if(sign->messages[line].length() > 0) { + sign->messages[line].erase(sign->messages[line].size() - 1, 1); + } else { + line--; + if(line < 0) { + line = 3; + } + } + } else if(eventKey == Keyboard::KEY_RETURN) { + line = (line + 1) % 4; + } else { + super::keyPressed(eventKey); + } +} + +void TextEditScreen::keyboardNewChar( char inputChar ) { + std::string fullstring = sign->messages[line] + inputChar; + if(fullstring.length() < 16) { + sign->messages[line] = fullstring; + //LOGW("Line text updated: %s\n", fullstring.c_str()); + } +} + +void TextEditScreen::buttonClicked( Button* button ) { + if(button == &btnClose) + handleBackEvent(true); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/9CAB88584C535B15B7D916C84A38AB20 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/9CAB88584C535B15B7D916C84A38AB20 new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/9CAB88584C535B15B7D916C84A38AB20 @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/AF8821B3E089A14209FA7C2F8B96C378 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/AF8821B3E089A14209FA7C2F8B96C378 new file mode 100644 index 0000000..fe92a27 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/AF8821B3E089A14209FA7C2F8B96C378 @@ -0,0 +1,233 @@ +#include "TouchJoinGameScreen.h" +#include "../StartMenuScreen.h" +#include "../ProgressScreen.h" +#include "../../Font.h" +#include "../../../Minecraft.h" +#include "../../../renderer/Textures.h" + +namespace Touch { + +// +// Games list +// + +void AvailableGamesList::selectStart( int item) { + startSelected = item; +} + +void AvailableGamesList::selectCancel() { + startSelected = -1; +} + +void AvailableGamesList::selectItem( int item, bool doubleClick ) { + LOGI("selected an item! %d\n", item); + selectedItem = item; +} + +void AvailableGamesList::renderItem( int i, int x, int y, int h, Tesselator& t ) +{ + if (startSelected == i && Multitouch::getFirstActivePointerIdEx() >= 0) { + fill((int)x0, y, (int)x1, y+h, 0x809E684F); + } + + //static int colors[2] = {0xffffb0, 0xcccc90}; + const PingedCompatibleServer& s = copiedServerList[i]; + unsigned int color = s.isSpecial? 0x6090a0 : 0xffffb0; + unsigned int color2 = 0xffffa0;//colors[i&1]; + + int xx1 = (int)x0 + 24; + int xx2 = xx1; + + if (s.isSpecial) { + xx1 += 50; + + glEnable2(GL_TEXTURE_2D); + glColor4f2(1,1,1,1); + glEnable2(GL_BLEND); + minecraft->textures->loadAndBindTexture("gui/badge/minecon140.png"); + blit(xx2, y + 6, 0, 0, 37, 8, 140, 240); + } + + drawString(minecraft->font, s.name.C_String(), xx1, y + 4 + 2, color); + drawString(minecraft->font, s.address.ToString(false), xx2, y + 18, color2); + + /* + drawString(minecraft->font, copiedServerList[i].name.C_String(), (int)x0 + 24, y + 4, color); + drawString(minecraft->font, copiedServerList[i].address.ToString(false), (int)x0 + 24, y + 18, color); + */ +} + + +// +// Join Game screen +// +JoinGameScreen::JoinGameScreen() +: bJoin( 2, "Join Game"), + bBack( 3, "Back"), + bHeader(0, ""), + gamesList(NULL) +{ + bJoin.active = false; + //gamesList->yInertia = 0.5f; +} + +JoinGameScreen::~JoinGameScreen() +{ + delete gamesList; +} + +void JoinGameScreen::init() +{ + //buttons.push_back(&bJoin); + buttons.push_back(&bBack); + buttons.push_back(&bHeader); + + minecraft->raknetInstance->clearServerList(); + gamesList = new AvailableGamesList(minecraft, width, height); + +#ifdef ANDROID + //tabButtons.push_back(&bJoin); + tabButtons.push_back(&bBack); +#endif +} + +void JoinGameScreen::setupPositions() { + //int yBase = height - 26; + + //#ifdef ANDROID + bJoin.y = 0; + bBack.y = 0; + bHeader.y = 0; + //#endif + + // Center buttons + //bJoin.x = width / 2 - 4 - bJoin.w; + bBack.x = 0;//width / 2 + 4; + bHeader.x = bBack.width; + bHeader.width = width - bHeader.x; +} + +void JoinGameScreen::buttonClicked(Button* button) +{ + if (button->id == bJoin.id) + { + if (isIndexValid(gamesList->selectedItem)) + { + PingedCompatibleServer selectedServer = gamesList->copiedServerList[gamesList->selectedItem]; + minecraft->joinMultiplayer(selectedServer); + { + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + } + //minecraft->locateMultiplayer(); + //minecraft->setScreen(new JoinGameScreen()); + } + if (button->id == bBack.id) + { + minecraft->cancelLocateMultiplayer(); + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } +} + +bool JoinGameScreen::handleBackEvent(bool isDown) +{ + if (!isDown) + { + minecraft->cancelLocateMultiplayer(); + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } + return true; +} + + +bool JoinGameScreen::isIndexValid( int index ) +{ + return gamesList && index >= 0 && index < gamesList->getNumberOfItems(); +} + +void JoinGameScreen::tick() +{ + if (isIndexValid(gamesList->selectedItem)) { + buttonClicked(&bJoin); + return; + } + + //gamesList->tick(); + + const ServerList& orgServerList = minecraft->raknetInstance->getServerList(); + ServerList serverList; + for (unsigned int i = 0; i < orgServerList.size(); ++i) + if (orgServerList[i].name.GetLength() > 0) + serverList.push_back(orgServerList[i]); + + if (serverList.size() != gamesList->copiedServerList.size()) + { + // copy the currently selected item + PingedCompatibleServer selectedServer; + bool hasSelection = false; + if (isIndexValid(gamesList->selectedItem)) + { + selectedServer = gamesList->copiedServerList[gamesList->selectedItem]; + hasSelection = true; + } + + gamesList->copiedServerList = serverList; + gamesList->selectItem(-1, false); + + // re-select previous item if it still exists + if (hasSelection) + { + for (unsigned int i = 0; i < gamesList->copiedServerList.size(); i++) + { + if (gamesList->copiedServerList[i].address == selectedServer.address) + { + gamesList->selectItem(i, false); + break; + } + } + } + } else { + for (int i = (int)gamesList->copiedServerList.size()-1; i >= 0 ; --i) { + for (int j = 0; j < (int) serverList.size(); ++j) + if (serverList[j].address == gamesList->copiedServerList[i].address) + gamesList->copiedServerList[i].name = serverList[j].name; + } + } + + bJoin.active = isIndexValid(gamesList->selectedItem); +} + +void JoinGameScreen::render( int xm, int ym, float a ) +{ + bool hasNetwork = minecraft->platform()->isNetworkEnabled(true); +#ifdef WIN32 + hasNetwork = hasNetwork && !GetAsyncKeyState(VK_TAB); +#endif + + renderBackground(); + if (hasNetwork) gamesList->render(xm, ym, a); + else gamesList->renderDirtBackground(); + Screen::render(xm, ym, a); + + const int baseX = bHeader.x + bHeader.width / 2; + + if (hasNetwork) { + std::string s = "Scanning for WiFi Games..."; + drawCenteredString(minecraft->font, s, baseX, 8, 0xffffffff); + + const int textWidth = minecraft->font->width(s); + const int spinnerX = baseX + textWidth / 2 + 6; + + static const char* spinnerTexts[] = {"-", "\\", "|", "/"}; + int n = ((int)(5.5f * getTimeS()) % 4); + drawCenteredString(minecraft->font, spinnerTexts[n], spinnerX, 8, 0xffffffff); + } else { + drawCenteredString(minecraft->font, "WiFi is disabled", baseX, 8, 0xffffffff); + } +} + +bool JoinGameScreen::isInGameScreen() { return false; } + +}; diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/B232B2832A57A8D434C0B6499C9ADAE5 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/B232B2832A57A8D434C0B6499C9ADAE5 new file mode 100644 index 0000000..b447bc5 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/B232B2832A57A8D434C0B6499C9ADAE5 @@ -0,0 +1,73 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_SCREENS__JoinGameScreen_H__ +#define NET_MINECRAFT_CLIENT_GUI_SCREENS__JoinGameScreen_H__ + +#include "../Screen.h" +#include "../components/Button.h" +#include "../components/SmallButton.h" +#include "../components/ScrolledSelectionList.h" +#include "../../Minecraft.h" +#include "../../../network/RakNetInstance.h" + +#include "../components/TextBox.h" + +class JoinGameScreen; + +class AvailableGamesList : public ScrolledSelectionList +{ + int selectedItem; + ServerList copiedServerList; + + friend class JoinGameScreen; + +public: + + AvailableGamesList(Minecraft* _minecraft, int _width, int _height) + : ScrolledSelectionList(_minecraft, _width, _height, 24, _height - 30, 28) + { + } + +protected: + + virtual int getNumberOfItems() { return (int)copiedServerList.size(); } + + virtual void selectItem(int item, bool doubleClick) { selectedItem = item; } + virtual bool isSelectedItem(int item) { return item == selectedItem; } + + virtual void renderBackground() {} + virtual void renderItem(int i, int x, int y, int h, Tesselator& t) + { + const PingedCompatibleServer& s = copiedServerList[i]; + unsigned int color = s.isSpecial? 0xff00b0 : 0xffffa0; + drawString(minecraft->font, s.name.C_String(), x, y + 2, color); + drawString(minecraft->font, s.address.ToString(false), x, y + 16, 0xffffa0); + } +}; + +class JoinGameScreen: public Screen +{ +public: + JoinGameScreen(); + virtual ~JoinGameScreen(); + + void init(); + void setupPositions(); + + virtual bool handleBackEvent(bool isDown); + + virtual bool isIndexValid(int index); + + virtual void tick(); + + void render(int xm, int ym, float a); + + void buttonClicked(Button* button); + + bool isInGameScreen(); +private: + Button bJoin; + Button bBack; + AvailableGamesList* gamesList; + TextBox ip; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_SCREENS__JoinGameScreen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/BD96A8FD3E2AEC05DE47E02DB4F7693D b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/BD96A8FD3E2AEC05DE47E02DB4F7693D new file mode 100644 index 0000000..637c81e --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/BD96A8FD3E2AEC05DE47E02DB4F7693D @@ -0,0 +1,107 @@ +#include "JoinGameScreen.h" +#include "StartMenuScreen.h" +#include "ProgressScreen.h" +#include "../Font.h" +#include "../../../network/RakNetInstance.h" +#include "../../../network/ClientSideNetworkHandler.h" + +#include "../components/TextBox.h" + +#include +#include +#include + +JoinGameScreen::JoinGameScreen() +: bJoin(2, "Join Game"), + bBack(3, "Back"), + ip(5, "IP+Port?") +{ + bJoin.active = true; // enable manual join +} + +JoinGameScreen::~JoinGameScreen() +{ +} + +void JoinGameScreen::buttonClicked(Button* button) +{ + if (button->id == bJoin.id) + { + std::string addr = ip.text; + auto trim = [](std::string &s) { + size_t start =0; + while (start < s.size() && std::isspace((unsigned char)s[start])) ++start; + size_t end = s.size(); + while (end > start && std::isspace((unsigned char)s[end -1])) --end; + s = s.substr(start, end - start); + }; + trim(addr); + if (!addr.empty() && addr != "IP+Port?") { + std::string host = addr; + int port =19132; + size_t colon = addr.find(':'); + if (colon != std::string::npos) { + host = addr.substr(0, colon); + std::string portStr = addr.substr(colon +1); + trim(host); + trim(portStr); + if (!portStr.empty()) port = std::atoi(portStr.c_str()); + } else trim(host); + if (!host.empty()) { + if (minecraft->netCallback) { delete minecraft->netCallback; minecraft->netCallback = NULL; } + minecraft->netCallback = new ClientSideNetworkHandler(minecraft, minecraft->raknetInstance); + minecraft->raknetInstance->connect(host.c_str(), port); + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + } + } + if (button->id == bBack.id) + { + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } +} + +bool JoinGameScreen::handleBackEvent(bool isDown) +{ + if (!isDown) minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + return true; +} + +bool JoinGameScreen::isIndexValid( int index ) { return false; } + +void JoinGameScreen::tick() +{ +} + +void JoinGameScreen::init() +{ + buttons.push_back(&bJoin); + buttons.push_back(&bBack); + textBoxes.push_back(&ip); +} + +void JoinGameScreen::setupPositions() { + int yBase = height -26; + bJoin.y = yBase; + bBack.y = yBase; + bBack.width = bJoin.width =120; + bJoin.x = width /2 -4 - bJoin.width; + bBack.x = width /2 +4; + ip.x = width/2 -60; // center + ip.y =10; + ip.w =120; +} + +void JoinGameScreen::render( int xm, int ym, float a ) +{ + renderBackground(); + // Render textboxes explicitly (Screen::render only draws buttons) + for (unsigned int i =0; i < textBoxes.size(); ++i) { + textBoxes[i]->render(minecraft, xm, ym); + } + Screen::render(xm, ym, a); +} + +bool JoinGameScreen::isInGameScreen() { return false; } diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/BE9FB10FE64CB7155DE9FC69671A1A65 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/BE9FB10FE64CB7155DE9FC69671A1A65 new file mode 100644 index 0000000..9f40fdf --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/BE9FB10FE64CB7155DE9FC69671A1A65 @@ -0,0 +1,37 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_SCREENS__JoinGameScreen_H__ +#define NET_MINECRAFT_CLIENT_GUI_SCREENS__JoinGameScreen_H__ + +#include "../Screen.h" +#include "../components/Button.h" +#include "../../Minecraft.h" +#include "../../../network/RakNetInstance.h" + +#include "../components/TextBox.h" + +class JoinGameScreen: public Screen +{ +public: + JoinGameScreen(); + virtual ~JoinGameScreen(); + + void init(); + void setupPositions(); + + virtual bool handleBackEvent(bool isDown); + + virtual bool isIndexValid(int index); + + virtual void tick(); + + void render(int xm, int ym, float a); + + void buttonClicked(Button* button); + + bool isInGameScreen(); +private: + Button bJoin; + Button bBack; + TextBox ip; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_SCREENS__JoinGameScreen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/E19DC915D7B7F4D40A50F260C758DAD9 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/E19DC915D7B7F4D40A50F260C758DAD9 new file mode 100644 index 0000000..8b4d6da --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/E19DC915D7B7F4D40A50F260C758DAD9 @@ -0,0 +1,80 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI__Screen_H__ +#define NET_MINECRAFT_CLIENT_GUI__Screen_H__ + +//package net.minecraft.client.gui; + +#include +#include "GuiComponent.h" + +class Font; +class Minecraft; +class Button; +class TextBox; +struct IntRectangle; + +class Screen: public GuiComponent +{ +public: + Screen(); + + virtual void render(int xm, int ym, float a); + + void init(Minecraft* minecraft, int width, int height); + virtual void init(); + + void setSize(int width, int height); + virtual void setupPositions() {}; + + virtual void updateEvents(); + virtual void mouseEvent(); + virtual void keyboardEvent(); + virtual void keyboardTextEvent(); + virtual bool handleBackEvent(bool isDown); + + virtual void tick() {} + + virtual void removed() {} + + virtual void renderBackground(); + virtual void renderBackground(int vo); + virtual void renderDirtBackground(int vo); + // query + virtual bool renderGameBehind(); + virtual bool hasClippingArea(IntRectangle& out); + + virtual bool isPauseScreen(); + virtual bool isErrorScreen(); + virtual bool isInGameScreen(); + virtual bool closeOnPlayerHurt(); + + virtual void confirmResult(bool result, int id) {} + virtual void lostFocus(); + virtual void toGUICoordinate(int& x, int& y); +protected: + void updateTabButtonSelection(); + + virtual void buttonClicked(Button* button) {} + virtual void mouseClicked(int x, int y, int buttonNum); + virtual void mouseReleased(int x, int y, int buttonNum); + + virtual void keyPressed(int eventKey); + virtual void keyboardNewChar(char inputChar) {} +public: + int width; + int height; + bool passEvents; + //GuiParticles* particles; +protected: + Minecraft* minecraft; + std::vector buttons; + std::vector textBoxes; + + std::vector tabButtons; + int tabButtonIndex; + + Font* font; +private: + Button* clickedButton; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI__Screen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/E25FB3B811E26EA86767132ABFD6C0FE b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/E25FB3B811E26EA86767132ABFD6C0FE new file mode 100644 index 0000000..45852ad --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/847526E50E6A4244B4C57F04CD6FB53A/E25FB3B811E26EA86767132ABFD6C0FE @@ -0,0 +1,233 @@ +#ifndef NET_MINECRAFT_CLIENT__Minecraft_H__ +#define NET_MINECRAFT_CLIENT__Minecraft_H__ + +#include "Options.h" +#ifndef STANDALONE_SERVER +#include "MouseHandler.h" +#endif +#include "Timer.h" +#include "player/input/ITurnInput.h" +#ifndef STANDALONE_SERVER +#include "gui/Gui.h" +#include "gui/screens/ScreenChooser.h" +#endif +//#include "../network/RakNetInstance.h" +#include "../world/phys/HitResult.h" + +class User; +class Level; +class LocalPlayer; +class IInputHolder; +class Mob; +class Player; +class LevelRenderer; +class GameRenderer; +class ParticleEngine; +class Entity; +class ICreator; +class GameMode; +class Textures; +class CThread; +class SoundEngine; +class Screen; +class Font; +class LevelStorageSource; +class BuildActionIntention; +class PerfRenderer; +class LevelSettings; +class IRakNetInstance; +class NetEventCallback; +class CommandServer; +struct PingedCompatibleServer; +//class ExternalFileLevelStorageSource; + + +#include "../App.h" +#include "PixelCalc.h" +class AppPlatform; +class AppPlatform_android; + +class Minecraft: public App +{ +protected: + Minecraft(); +public: + virtual ~Minecraft(); + + void init(); + void setSize(int width, int height); + void reloadOptions(); + + bool supportNonTouchScreen(); + bool useTouchscreen(); + void grabMouse(); + void releaseMouse(); + + void handleBuildAction(BuildActionIntention*); + + void toggleDimension(){} + bool isCreativeMode(); + void setIsCreativeMode(bool isCreative); + void setScreen(Screen*); + + virtual void selectLevel(const std::string& levelId, const std::string& levelName, const LevelSettings& settings); + virtual void setLevel(Level* level, const std::string& message = "", LocalPlayer* forceInsertPlayer = NULL); + + void generateLevel( const std::string& message, Level* level ); + LevelStorageSource* getLevelSource(); + + bool isLookingForMultiplayer; + void locateMultiplayer(); + void cancelLocateMultiplayer(); + bool joinMultiplayer(const PingedCompatibleServer& server); + void hostMultiplayer(int port=19132); + Player* respawnPlayer(int playerId); + void respawnPlayer(); + void resetPlayer(Player* player); + void doActuallyRespawnPlayer(); + + void update(); + + void tick(int nTick, int maxTick); + void tickInput(); + + bool isOnlineClient(); + bool isOnline(); + void pauseGame(bool isBackPaused); + void gameLostFocus(); + + void prepareLevel(const std::string& message); + + void leaveGame(bool renameLevel = false); + + int getProgressStatusId(); + const char* getProgressMessage(); + + ICreator* getCreator(); + + // void onGraphicsLost() {} + void onGraphicsReset(); + + bool isLevelGenerated(); + int getLicenseId(); + + void audioEngineOn(); + void audioEngineOff(); + + bool isPowerVR() { return _powerVr; } + bool isKindleFire(int kindleVersion); + bool transformResolution(int* w, int* h); + void optionUpdated(const Options::Option* option, bool value); + void optionUpdated(const Options::Option* option, float value); + void optionUpdated(const Options::Option* option, int value); +#ifdef __APPLE__ + bool _isSuperFast; + bool isSuperFast() { return _isSuperFast; } +#endif + +protected: + void _levelGenerated(); + +private: + static void* prepareLevel_tspawn(void *p_param); + + void handleMouseClick(int button); + void handleMouseDown(int button, bool down); + + void _reloadInput(); +public: + int width; + int height; + + // Vars that the platform is allowed to use in the future + int commandPort; + int reserved_d1, reserved_d2; + float reserved_f1, reserved_f2; + + Options options; + + static bool useAmbientOcclusion; + //static bool threadInterrupt; + + volatile bool pause; + + LevelRenderer* levelRenderer; + GameRenderer* gameRenderer; + ParticleEngine* particleEngine; + SoundEngine* soundEngine; + + GameMode* gameMode; +#ifndef STANDALONE_SERVER + Textures* textures; + ScreenChooser screenChooser; + Font* font; +#endif + IRakNetInstance* raknetInstance; + NetEventCallback* netCallback; + + int lastTime; + int lastTickTime; + float ticksSinceLastUpdate; + + User* user; + Level* level; + + LocalPlayer* player; + IInputHolder* inputHolder; + Mob* cameraTargetPlayer; +#ifndef STANDALONE_SERVER + Gui gui; +#endif + CThread* generateLevelThread; + Screen* screen; + static int customDebugId; + + static const int CDI_NONE = 0; + static const int CDI_GRAPHICS = 1; +#ifndef STANDALONE_SERVER + MouseHandler mouseHandler; +#endif + bool mouseGrabbed; + + PixelCalc pixelCalc; + PixelCalc pixelCalcUi; + + HitResult hitResult; + volatile int progressStagePercentage; + + // This field is initialized in main() + // It sets the base path to where worlds can be written (sdcard on android) + std::string externalStoragePath; + std::string externalCacheStoragePath; +protected: + Timer timer; + // @note @attn @warn: this is dangerous as fuck! + volatile bool isGeneratingLevel; + bool _hasSignaledGeneratingLevelFinished; + + LevelStorageSource* storageSource; + bool _running; + bool _powerVr; + +private: + volatile int progressStageStatusId; + static const char* progressMessages[]; + + int missTime; + int ticks; + bool screenMutex; + bool hasScheduledScreen; + Screen* scheduledScreen; + + int _licenseId; + bool _supportsNonTouchscreen; + + bool _isCreativeMode; + //int _respawnPlayerTicks; + Player* _pendingRemovePlayer; // @attn @todo @fix: remove this shait and fix the respawn behaviour + + PerfRenderer* _perfRenderer; + CommandServer* _commandServer; +}; + +#endif /*NET_MINECRAFT_CLIENT__Minecraft_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/9145696F63849E4BAF58F781F536C267/1D11F3CE27B0B595836AB483CC9A0B43 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/9145696F63849E4BAF58F781F536C267/1D11F3CE27B0B595836AB483CC9A0B43 new file mode 100644 index 0000000..1834b6f --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/9145696F63849E4BAF58F781F536C267/1D11F3CE27B0B595836AB483CC9A0B43 @@ -0,0 +1,157 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(id), w(0), h(0), x(0), y(0), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->showKeyboard(); + focused = true; + if (caretPos <0) caretPos =0; + if (caretPos > (int)text.length()) caretPos = (int)text.length(); + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->hideKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::setCaretPos(int p) { + if (p <0) p =0; + if (p > (int)text.length()) p = (int)text.length(); + caretPos = p; +} + +void TextBox::insertChar(char c) { + text.insert(text.begin() + caretPos, c); + ++caretPos; +} + +void TextBox::backspaceAtCaret() { + if (caretPos >0) { + text.erase(text.begin() + caretPos -1); + --caretPos; + } +} + +void TextBox::deleteAtCaret() { + if (caretPos < (int)text.length()) { + text.erase(text.begin() + caretPos); + } +} + +void TextBox::moveCaretLeft() { + if (caretPos >0) --caretPos; +} + +void TextBox::moveCaretRight() { + if (caretPos < (int)text.length()) ++caretPos; +} + +void TextBox::moveCaretHome() { caretPos =0; } +void TextBox::moveCaretEnd() { caretPos = (int)text.length(); } + +void TextBox::setCaretFromPixel(int px, Font* font) { + // Use font metrics to determine nearest character position + if (!font) { + // fallback to approximate + int relative = px - (x +4); + int pos = (relative >0) ? (relative /6) :0; + if (pos <0) pos =0; + if (pos > (int)text.length()) pos = (int)text.length(); + caretPos = pos; + return; + } + int rel = px - (x +4); + if (rel <=0) { caretPos =0; return; } + int best =0; + int bestDiff = INT_MAX; + for (int i =0; i <= (int)text.length(); ++i) { + int w = font->width(text.substr(0, i)); + int diff = abs(w - rel); + if (diff < bestDiff) { best = i; bestDiff = diff; } + // small optimization: if w > rel and diff growing, break + if (w > rel && i >0 && diff > bestDiff) break; + } + if (best <0) best =0; + if (best > (int)text.length()) best = (int)text.length(); + caretPos = best; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + fill(x, y, x + w, y + h,0x80000000); + // Border - use different colors when focused + if (focused) { + fill(x, y, x + w, y +1,0xffa0c0ff); + fill(x, y + h -1, x + w, y + h,0xff4060a0); + fill(x, y, x +1, y + h,0xffa0c0ff); + fill(x + w -1, y, x + w, y + h,0xff4060a0); + } else { + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + } + + int color =0xe0e0e0; + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + int maxChars =1; + if (minecraft && minecraft->font) { + int avgCharWidth = minecraft->font->width(std::string("W")); + if (avgCharWidth <=0) avgCharWidth =6; + int avg = (w -8) / avgCharWidth; + if (avg > maxChars) maxChars = avg; + } else { + int calc = (w -8) /6; // approx6 px per char + if (calc > maxChars) maxChars = calc; + } + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); + + // Draw caret if focused + if (focused) { + int caretPixel = x +4; + if (minecraft && minecraft->font) { + caretPixel += minecraft->font->width(text.substr(0, caretPos)); + } else { + caretPixel += caretPos *6; + } + if (caretPixel > x + w -6) caretPixel = x + w -6; + // draw vertical1px line as caret + fill(caretPixel, y +3, caretPixel +1, y + h -4,0xFFFFFFFF); + } +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/9145696F63849E4BAF58F781F536C267/430CC357A15D4BE1A70387A7C3462A3C b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/9145696F63849E4BAF58F781F536C267/430CC357A15D4BE1A70387A7C3462A3C new file mode 100644 index 0000000..bbb8652 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/9145696F63849E4BAF58F781F536C267/430CC357A15D4BE1A70387A7C3462A3C @@ -0,0 +1,311 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 to avoid off-by-one in GUI mapping + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} + +// Forward typed character directly to focused textbox to avoid duplicate definitions +void Screen::keyboardTextEvent() +{ + char c = Keyboard::getChar(); + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (c >=32) tb->insertChar(c); + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Focused textbox editing + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + tb->backspaceAtCaret(); + } + else if (eventKey == Keyboard::KEY_DELETE || eventKey ==127) { + tb->deleteAtCaret(); + } + else if (eventKey == Keyboard::KEY_LEFT) { + tb->moveCaretLeft(); + } + else if (eventKey == Keyboard::KEY_RIGHT) { + tb->moveCaretRight(); + } + else if (eventKey == Keyboard::KEY_HOME) { + tb->moveCaretHome(); + } + else if (eventKey == Keyboard::KEY_END) { + tb->moveCaretEnd(); + } + else if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // position caret based on click + tb->setCaretFromPixel(x, minecraft->font); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height; // removed -1 +} + +// Default implementation for character input (virtual) +void Screen::keyboardNewChar(char inputChar) { + // default: forward to focused textbox is handled in keyboardTextEvent; keep empty here + (void)inputChar; +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/9145696F63849E4BAF58F781F536C267/572513C3D8D309B3634C045C3C8FAC54 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/9145696F63849E4BAF58F781F536C267/572513C3D8D309B3634C045C3C8FAC54 new file mode 100644 index 0000000..4204871 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/9145696F63849E4BAF58F781F536C267/572513C3D8D309B3634C045C3C8FAC54 @@ -0,0 +1,147 @@ +#ifndef KEYBOARD_H__ +#define KEYBOARD_H__ + +#include + +/** A keyboard action; key-down or key-up */ +class KeyboardAction +{ +public: + static const int KEYUP = 0; + static const int KEYDOWN = 1; + + KeyboardAction(unsigned char keyCode, int state) { + this->key = keyCode; + this->state = state; + } + + int state; + unsigned char key; +}; + +/* Iterators */ +typedef std::vector KeyboardActionVec; +typedef KeyboardActionVec::iterator KeyboardActionIt; +typedef KeyboardActionVec::const_iterator KeyboardActionCIt; + +/** A static keyboard class, written to resemble the one in lwjgl somewhat */ +class Keyboard +{ +public: + static const int KEY_A = 65; + static const int KEY_B = 66; + static const int KEY_C = 67; + static const int KEY_D = 68; + static const int KEY_E = 69; + static const int KEY_F = 70; + static const int KEY_G = 71; + static const int KEY_H = 72; + static const int KEY_I = 73; + static const int KEY_J = 74; + static const int KEY_K = 75; + static const int KEY_L = 76; + static const int KEY_M = 77; + static const int KEY_N = 78; + static const int KEY_O = 79; + static const int KEY_P = 80; + static const int KEY_Q = 81; + static const int KEY_R = 82; + static const int KEY_S = 83; + static const int KEY_T = 84; + static const int KEY_U = 85; + static const int KEY_V = 86; + static const int KEY_W = 87; + static const int KEY_X = 88; + static const int KEY_Y = 89; + static const int KEY_Z = 90; + + static const int KEY_BACKSPACE = 8; + static const int KEY_RETURN = 13; + // Delete key (use VK_DELETE / common code46) + static const int KEY_DELETE = 46; + + // Arrow keys, Home/End (common VK codes) + static const int KEY_LEFT = 37; + static const int KEY_UP = 38; + static const int KEY_RIGHT = 39; + static const int KEY_DOWN = 40; + static const int KEY_HOME = 36; + static const int KEY_END = 35; + + static const int KEY_F1 = 112; + static const int KEY_F2 = 113; + static const int KEY_F3 = 114; + static const int KEY_F4 = 115; + static const int KEY_F5 = 116; + static const int KEY_F6 = 117; + static const int KEY_F7 = 118; + static const int KEY_F8 = 119; + static const int KEY_F9 = 120; + static const int KEY_F10 = 121; + static const int KEY_F11 = 122; + static const int KEY_F12 = 123; + + static const int KEY_ESCAPE = 27; + static const int KEY_SPACE = 32; + static const int KEY_LSHIFT = 10; + + static bool isKeyDown(int keyCode) { + return _states[keyCode] == KeyboardAction::KEYDOWN; + } + + static void reset() { + _inputs.clear(); + _inputText.clear(); + _index = -1; + _textIndex = -1; + } + + static void feed(unsigned char keyCode, int state) { + _inputs.push_back(KeyboardAction(keyCode, state)); + + _states[keyCode] = state; + } + static void feedText(char character) { + _inputText.push_back(character); + } + + static bool next() { + if (_index + 1 >= (int)_inputs.size()) + return false; + + ++_index; + return true; + } + + static bool nextTextChar() { + if(_textIndex + 1 >= (int)_inputText.size()) + return false; + ++_textIndex; + return true; + } + + static void rewind() { + _index = -1; + _textIndex = -1; + } + + static int getEventKey() { + return _inputs[_index].key; + } + + static int getEventKeyState() { + return _inputs[_index].state; + } + static char getChar() { + return _inputText[_textIndex]; + } +private: + static int _index; + static int _textIndex; + static int _states[256]; + static std::vector _inputs; + static std::vector _inputText; + static bool _inited; +}; + +#endif//KEYBOARD_H__ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/9145696F63849E4BAF58F781F536C267/80DB511CAC3B107B0C25886A0A17FE64 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/9145696F63849E4BAF58F781F536C267/80DB511CAC3B107B0C25886A0A17FE64 new file mode 100644 index 0000000..bbb8652 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/9145696F63849E4BAF58F781F536C267/80DB511CAC3B107B0C25886A0A17FE64 @@ -0,0 +1,311 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 to avoid off-by-one in GUI mapping + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} + +// Forward typed character directly to focused textbox to avoid duplicate definitions +void Screen::keyboardTextEvent() +{ + char c = Keyboard::getChar(); + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (c >=32) tb->insertChar(c); + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Focused textbox editing + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + tb->backspaceAtCaret(); + } + else if (eventKey == Keyboard::KEY_DELETE || eventKey ==127) { + tb->deleteAtCaret(); + } + else if (eventKey == Keyboard::KEY_LEFT) { + tb->moveCaretLeft(); + } + else if (eventKey == Keyboard::KEY_RIGHT) { + tb->moveCaretRight(); + } + else if (eventKey == Keyboard::KEY_HOME) { + tb->moveCaretHome(); + } + else if (eventKey == Keyboard::KEY_END) { + tb->moveCaretEnd(); + } + else if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // position caret based on click + tb->setCaretFromPixel(x, minecraft->font); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height; // removed -1 +} + +// Default implementation for character input (virtual) +void Screen::keyboardNewChar(char inputChar) { + // default: forward to focused textbox is handled in keyboardTextEvent; keep empty here + (void)inputChar; +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/9145696F63849E4BAF58F781F536C267/E19DC915D7B7F4D40A50F260C758DAD9 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/9145696F63849E4BAF58F781F536C267/E19DC915D7B7F4D40A50F260C758DAD9 new file mode 100644 index 0000000..c45276d --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/9145696F63849E4BAF58F781F536C267/E19DC915D7B7F4D40A50F260C758DAD9 @@ -0,0 +1,80 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI__Screen_H__ +#define NET_MINECRAFT_CLIENT_GUI__Screen_H__ + +//package net.minecraft.client.gui; + +#include +#include "GuiComponent.h" + +class Font; +class Minecraft; +class Button; +class TextBox; +struct IntRectangle; + +class Screen: public GuiComponent +{ +public: + Screen(); + + virtual void render(int xm, int ym, float a); + + void init(Minecraft* minecraft, int width, int height); + virtual void init(); + + void setSize(int width, int height); + virtual void setupPositions() {}; + + virtual void updateEvents(); + virtual void mouseEvent(); + virtual void keyboardEvent(); + virtual void keyboardTextEvent(); + virtual bool handleBackEvent(bool isDown); + + virtual void tick() {} + + virtual void removed() {} + + virtual void renderBackground(); + virtual void renderBackground(int vo); + virtual void renderDirtBackground(int vo); + // query + virtual bool renderGameBehind(); + virtual bool hasClippingArea(IntRectangle& out); + + virtual bool isPauseScreen(); + virtual bool isErrorScreen(); + virtual bool isInGameScreen(); + virtual bool closeOnPlayerHurt(); + + virtual void confirmResult(bool result, int id) {} + virtual void lostFocus(); + virtual void toGUICoordinate(int& x, int& y); +protected: + void updateTabButtonSelection(); + + virtual void buttonClicked(Button* button) {} + virtual void mouseClicked(int x, int y, int buttonNum); + virtual void mouseReleased(int x, int y, int buttonNum); + + virtual void keyPressed(int eventKey); + virtual void keyboardNewChar(char inputChar); +public: + int width; + int height; + bool passEvents; + //GuiParticles* particles; +protected: + Minecraft* minecraft; + std::vector buttons; + std::vector textBoxes; + + std::vector tabButtons; + int tabButtonIndex; + + Font* font; +private: + Button* clickedButton; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI__Screen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/9145696F63849E4BAF58F781F536C267/E2026D62C2632A6FFA37D85019AE6FC1 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/9145696F63849E4BAF58F781F536C267/E2026D62C2632A6FFA37D85019AE6FC1 new file mode 100644 index 0000000..474bb2b --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/9145696F63849E4BAF58F781F536C267/E2026D62C2632A6FFA37D85019AE6FC1 @@ -0,0 +1,318 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 to avoid off-by-one in GUI mapping + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} + +// Forward typed character directly to focused textbox to avoid duplicate definitions +void Screen::keyboardTextEvent() +{ + char c = Keyboard::getChar(); + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + // Some platforms deliver backspace/delete as text characters. Handle control chars here. + if (c == (char)Keyboard::KEY_BACKSPACE || c ==8 || c ==127) { + tb->backspaceAtCaret(); + } else if (c == (char)Keyboard::KEY_DELETE || c ==127) { + tb->deleteAtCaret(); + } else if (c >=32) { + tb->insertChar(c); + } + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Focused textbox editing + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + tb->backspaceAtCaret(); + } + else if (eventKey == Keyboard::KEY_DELETE || eventKey ==127) { + tb->deleteAtCaret(); + } + else if (eventKey == Keyboard::KEY_LEFT) { + tb->moveCaretLeft(); + } + else if (eventKey == Keyboard::KEY_RIGHT) { + tb->moveCaretRight(); + } + else if (eventKey == Keyboard::KEY_HOME) { + tb->moveCaretHome(); + } + else if (eventKey == Keyboard::KEY_END) { + tb->moveCaretEnd(); + } + else if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // position caret based on click + tb->setCaretFromPixel(x, minecraft->font); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height; // removed -1 +} + +// Default implementation for character input (virtual) +void Screen::keyboardNewChar(char inputChar) { + // default: forward to focused textbox is handled in keyboardTextEvent; keep empty here + (void)inputChar; +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/0C30AFB3E62BB9633196392E88424289 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/0C30AFB3E62BB9633196392E88424289 new file mode 100644 index 0000000..dcf4184 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/0C30AFB3E62BB9633196392E88424289 @@ -0,0 +1,119 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(id), w(0), h(0), x(0), y(0), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->showKeyboard(); + focused = true; + if (caretPos <0) caretPos =0; + if (caretPos > (int)text.length()) caretPos = (int)text.length(); + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->hideKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::setCaretPos(int p) { + if (p <0) p =0; + if (p > (int)text.length()) p = (int)text.length(); + caretPos = p; +} + +void TextBox::insertChar(char c) { + text.insert(text.begin() + caretPos, c); + ++caretPos; +} + +void TextBox::backspaceAtCaret() { + if (caretPos >0) { + text.erase(text.begin() + caretPos -1); + --caretPos; + } +} + +void TextBox::deleteAtCaret() { + if (caretPos < (int)text.length()) { + text.erase(text.begin() + caretPos); + } +} + +void TextBox::moveCaretLeft() { + if (caretPos >0) --caretPos; +} + +void TextBox::moveCaretRight() { + if (caretPos < (int)text.length()) ++caretPos; +} + +void TextBox::moveCaretHome() { caretPos =0; } +void TextBox::moveCaretEnd() { caretPos = (int)text.length(); } + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + fill(x, y, x + w, y + h,0x80000000); + // Border - use different colors when focused + if (focused) { + fill(x, y, x + w, y +1,0xffa0c0ff); + fill(x, y + h -1, x + w, y + h,0xff4060a0); + fill(x, y, x +1, y + h,0xffa0c0ff); + fill(x + w -1, y, x + w, y + h,0xff4060a0); + } else { + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + } + + int color =0xe0e0e0; + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + int calc = (w -8) /6; // approx6 px per char + int maxChars =1; + if (calc > maxChars) maxChars = calc; + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); + + // Draw caret if focused + if (focused) { + // compute caret x pos in pixels approximated by char width + int caretPixel = x +4 + caretPos *6; + if (caretPixel > x + w -6) caretPixel = x + w -6; + // draw vertical1px line as caret + fill(caretPixel, y +3, caretPixel +1, y + h -4,0xFFFFFFFF); + } +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/160D85258E9E031E24CDC8411AB170A6 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/160D85258E9E031E24CDC8411AB170A6 new file mode 100644 index 0000000..1834b6f --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/160D85258E9E031E24CDC8411AB170A6 @@ -0,0 +1,157 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(id), w(0), h(0), x(0), y(0), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->showKeyboard(); + focused = true; + if (caretPos <0) caretPos =0; + if (caretPos > (int)text.length()) caretPos = (int)text.length(); + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->hideKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::setCaretPos(int p) { + if (p <0) p =0; + if (p > (int)text.length()) p = (int)text.length(); + caretPos = p; +} + +void TextBox::insertChar(char c) { + text.insert(text.begin() + caretPos, c); + ++caretPos; +} + +void TextBox::backspaceAtCaret() { + if (caretPos >0) { + text.erase(text.begin() + caretPos -1); + --caretPos; + } +} + +void TextBox::deleteAtCaret() { + if (caretPos < (int)text.length()) { + text.erase(text.begin() + caretPos); + } +} + +void TextBox::moveCaretLeft() { + if (caretPos >0) --caretPos; +} + +void TextBox::moveCaretRight() { + if (caretPos < (int)text.length()) ++caretPos; +} + +void TextBox::moveCaretHome() { caretPos =0; } +void TextBox::moveCaretEnd() { caretPos = (int)text.length(); } + +void TextBox::setCaretFromPixel(int px, Font* font) { + // Use font metrics to determine nearest character position + if (!font) { + // fallback to approximate + int relative = px - (x +4); + int pos = (relative >0) ? (relative /6) :0; + if (pos <0) pos =0; + if (pos > (int)text.length()) pos = (int)text.length(); + caretPos = pos; + return; + } + int rel = px - (x +4); + if (rel <=0) { caretPos =0; return; } + int best =0; + int bestDiff = INT_MAX; + for (int i =0; i <= (int)text.length(); ++i) { + int w = font->width(text.substr(0, i)); + int diff = abs(w - rel); + if (diff < bestDiff) { best = i; bestDiff = diff; } + // small optimization: if w > rel and diff growing, break + if (w > rel && i >0 && diff > bestDiff) break; + } + if (best <0) best =0; + if (best > (int)text.length()) best = (int)text.length(); + caretPos = best; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + fill(x, y, x + w, y + h,0x80000000); + // Border - use different colors when focused + if (focused) { + fill(x, y, x + w, y +1,0xffa0c0ff); + fill(x, y + h -1, x + w, y + h,0xff4060a0); + fill(x, y, x +1, y + h,0xffa0c0ff); + fill(x + w -1, y, x + w, y + h,0xff4060a0); + } else { + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + } + + int color =0xe0e0e0; + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + int maxChars =1; + if (minecraft && minecraft->font) { + int avgCharWidth = minecraft->font->width(std::string("W")); + if (avgCharWidth <=0) avgCharWidth =6; + int avg = (w -8) / avgCharWidth; + if (avg > maxChars) maxChars = avg; + } else { + int calc = (w -8) /6; // approx6 px per char + if (calc > maxChars) maxChars = calc; + } + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); + + // Draw caret if focused + if (focused) { + int caretPixel = x +4; + if (minecraft && minecraft->font) { + caretPixel += minecraft->font->width(text.substr(0, caretPos)); + } else { + caretPixel += caretPos *6; + } + if (caretPixel > x + w -6) caretPixel = x + w -6; + // draw vertical1px line as caret + fill(caretPixel, y +3, caretPixel +1, y + h -4,0xFFFFFFFF); + } +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/1B3A453533BF6F10F175E8D16B2C6D61 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/1B3A453533BF6F10F175E8D16B2C6D61 new file mode 100644 index 0000000..0f92122 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/1B3A453533BF6F10F175E8D16B2C6D61 @@ -0,0 +1,134 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +// Simple helper: draw a1px vertical line using existing fill() helper +static void drawVLine(int x, int y1, int y2, int color) { + fill(x, y1, x +1, y2, color); +} + +TextBox::TextBox( int id, const std::string& msg ) + : id(id), w(0), h(0), x(0), y(0), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->showKeyboard(); + focused = true; + if (caretPos <0) caretPos =0; + if (caretPos > (int)text.length()) caretPos = (int)text.length(); + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->hideKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::setCaretPos(int p) { + if (p <0) p =0; + if (p > (int)text.length()) p = (int)text.length(); + caretPos = p; +} + +void TextBox::insertChar(char c) { + text.insert(text.begin() + caretPos, c); + ++caretPos; +} + +void TextBox::backspaceAtCaret() { + if (caretPos >0) { + text.erase(text.begin() + caretPos -1); + --caretPos; + } +} + +void TextBox::deleteAtCaret() { + if (caretPos < (int)text.length()) { + text.erase(text.begin() + caretPos); + } +} + +void TextBox::moveCaretLeft() { + if (caretPos >0) --caretPos; +} + +void TextBox::moveCaretRight() { + if (caretPos < (int)text.length()) ++caretPos; +} + +void TextBox::moveCaretHome() { caretPos =0; } +void TextBox::moveCaretEnd() { caretPos = (int)text.length(); } + +void TextBox::setCaretFromPixel(int px, Font* font) { + // approximate char width + int relative = px - (x +4); + if (relative <=0) { caretPos =0; return; } + int pos = relative /6; + if (pos <0) pos =0; + if (pos > (int)text.length()) pos = (int)text.length(); + caretPos = pos; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + fill(x, y, x + w, y + h,0x80000000); + // Border - use different colors when focused + if (focused) { + fill(x, y, x + w, y +1,0xffa0c0ff); + fill(x, y + h -1, x + w, y + h,0xff4060a0); + fill(x, y, x +1, y + h,0xffa0c0ff); + fill(x + w -1, y, x + w, y + h,0xff4060a0); + } else { + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + } + + int color =0xe0e0e0; + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + int calc = (w -8) /6; // approx6 px per char + int maxChars =1; + if (calc > maxChars) maxChars = calc; + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); + + // Draw caret if focused + if (focused) { + // compute caret x pos in pixels approximated by char width + int caretPixel = x +4 + caretPos *6; + if (caretPixel > x + w -6) caretPixel = x + w -6; + // draw vertical1px line as caret + drawVLine(caretPixel, y +3, y + h -4,0xFFFFFFFF); + } +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/1CC65E0062271217494E8E6A4C0A58CE b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/1CC65E0062271217494E8E6A4C0A58CE new file mode 100644 index 0000000..55acfcd --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/1CC65E0062271217494E8E6A4C0A58CE @@ -0,0 +1,47 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ +#define NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ + +//package net.minecraft.client.gui; + +#include +#include "../GuiComponent.h" +#include "../../Options.h" + +class Font; +class Minecraft; + +class TextBox: public GuiComponent +{ +public: + TextBox(int id, const std::string& msg); + TextBox(int id, int x, int y, const std::string& msg); + TextBox(int id, int x, int y, int w, int h, const std::string& msg); + + virtual void setFocus(Minecraft* minecraft); + virtual bool loseFocus(Minecraft* minecraft); + + virtual void render(Minecraft* minecraft, int xm, int ym); + + // Editing helpers + int getCaretPos() const { return caretPos; } + void setCaretPos(int p); + void insertChar(char c); + void backspaceAtCaret(); + void deleteAtCaret(); + void moveCaretLeft(); + void moveCaretRight(); + void moveCaretHome(); + void moveCaretEnd(); + +public: + int w, h; + int x, y; + + std::string text; + int id; + bool focused; +private: + int caretPos; // character index +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/1D11F3CE27B0B595836AB483CC9A0B43 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/1D11F3CE27B0B595836AB483CC9A0B43 new file mode 100644 index 0000000..a8f549a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/1D11F3CE27B0B595836AB483CC9A0B43 @@ -0,0 +1,118 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(id), w(0), h(0), x(0), y(0), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->showKeyboard(); + focused = true; + if (caretPos <0) caretPos =0; + if (caretPos > (int)text.length()) caretPos = (int)text.length(); + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->hideKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::setCaretPos(int p) { + if (p <0) p =0; + if (p > (int)text.length()) p = (int)text.length(); + caretPos = p; +} + +void TextBox::insertChar(char c) { + text.insert(text.begin() + caretPos, c); + ++caretPos; +} + +void TextBox::backspaceAtCaret() { + if (caretPos >0) { + text.erase(text.begin() + caretPos -1); + --caretPos; + } +} + +void TextBox::deleteAtCaret() { + if (caretPos < (int)text.length()) { + text.erase(text.begin() + caretPos); + } +} + +void TextBox::moveCaretLeft() { + if (caretPos >0) --caretPos; +} + +void TextBox::moveCaretRight() { + if (caretPos < (int)text.length()) ++caretPos; +} + +void TextBox::moveCaretHome() { caretPos =0; } +void TextBox::moveCaretEnd() { caretPos = (int)text.length(); } + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + fill(x, y, x + w, y + h,0x80000000); + // Border - use different colors when focused + if (focused) { + fill(x, y, x + w, y +1,0xffa0c0ff); + fill(x, y + h -1, x + w, y + h,0xff4060a0); + fill(x, y, x +1, y + h,0xffa0c0ff); + fill(x + w -1, y, x + w, y + h,0xff4060a0); + } else { + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + } + + int color =0xe0e0e0; + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + int calc = (w -8) /6; // approx6 px per char + int maxChars =1; + if (calc > maxChars) maxChars = calc; + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); + + // Draw caret if focused + if (focused) { + // compute caret x pos in pixels approximated by char width + int caretPixel = x +4 + caretPos *6; + if (caretPixel > x + w -6) caretPixel = x + w -6; + drawVLine(caretPixel, y +3, y + h -4,0xFFFFFFFF); + } +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/22F13A2A02666949795DA70E267C53D8 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/22F13A2A02666949795DA70E267C53D8 new file mode 100644 index 0000000..a51765e --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/22F13A2A02666949795DA70E267C53D8 @@ -0,0 +1,156 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(id), w(0), h(0), x(0), y(0), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->showKeyboard(); + focused = true; + if (caretPos <0) caretPos =0; + if (caretPos > (int)text.length()) caretPos = (int)text.length(); + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->hideKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::setCaretPos(int p) { + if (p <0) p =0; + if (p > (int)text.length()) p = (int)text.length(); + caretPos = p; +} + +void TextBox::insertChar(char c) { + text.insert(text.begin() + caretPos, c); + ++caretPos; +} + +void TextBox::backspaceAtCaret() { + if (caretPos >0) { + text.erase(text.begin() + caretPos -1); + --caretPos; + } +} + +void TextBox::deleteAtCaret() { + if (caretPos < (int)text.length()) { + text.erase(text.begin() + caretPos); + } +} + +void TextBox::moveCaretLeft() { + if (caretPos >0) --caretPos; +} + +void TextBox::moveCaretRight() { + if (caretPos < (int)text.length()) ++caretPos; +} + +void TextBox::moveCaretHome() { caretPos =0; } +void TextBox::moveCaretEnd() { caretPos = (int)text.length(); } + +void TextBox::setCaretFromPixel(int px, Font* font) { + // Use font metrics to determine nearest character position + if (!font) { + // fallback to approximate + int relative = px - (x +4); + int pos = (relative >0) ? (relative /6) :0; + if (pos <0) pos =0; + if (pos > (int)text.length()) pos = (int)text.length(); + caretPos = pos; + return; + } + int rel = px - (x +4); + if (rel <=0) { caretPos =0; return; } + int best =0; + int bestDiff = INT_MAX; + int acc =0; + for (int i =0; i <= (int)text.length(); ++i) { + int w = font->width(text.substr(0, i)); + int diff = abs(w - rel); + if (diff < bestDiff) { best = i; bestDiff = diff; } + // small optimization: if w > rel and diff growing, break + if (w > rel && i >0 && diff > bestDiff) break; + } + if (best <0) best =0; + if (best > (int)text.length()) best = (int)text.length(); + caretPos = best; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + fill(x, y, x + w, y + h,0x80000000); + // Border - use different colors when focused + if (focused) { + fill(x, y, x + w, y +1,0xffa0c0ff); + fill(x, y + h -1, x + w, y + h,0xff4060a0); + fill(x, y, x +1, y + h,0xffa0c0ff); + fill(x + w -1, y, x + w, y + h,0xff4060a0); + } else { + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + } + + int color =0xe0e0e0; + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + int maxChars =1; + if (minecraft && minecraft->font) { + int avg = (w -8) / (minecraft->font->charWidth >0 ? minecraft->font->charWidth :6); + if (avg > maxChars) maxChars = avg; + } else { + int calc = (w -8) /6; // approx6 px per char + if (calc > maxChars) maxChars = calc; + } + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); + + // Draw caret if focused + if (focused) { + int caretPixel = x +4; + if (minecraft && minecraft->font) { + caretPixel += minecraft->font->width(text.substr(0, caretPos)); + } else { + caretPixel += caretPos *6; + } + if (caretPixel > x + w -6) caretPixel = x + w -6; + // draw vertical1px line as caret + fill(caretPixel, y +3, caretPixel +1, y + h -4,0xFFFFFFFF); + } +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/2662FA5862C009C4D852774D2E54400F b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/2662FA5862C009C4D852774D2E54400F new file mode 100644 index 0000000..0f92122 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/2662FA5862C009C4D852774D2E54400F @@ -0,0 +1,134 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +// Simple helper: draw a1px vertical line using existing fill() helper +static void drawVLine(int x, int y1, int y2, int color) { + fill(x, y1, x +1, y2, color); +} + +TextBox::TextBox( int id, const std::string& msg ) + : id(id), w(0), h(0), x(0), y(0), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->showKeyboard(); + focused = true; + if (caretPos <0) caretPos =0; + if (caretPos > (int)text.length()) caretPos = (int)text.length(); + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->hideKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::setCaretPos(int p) { + if (p <0) p =0; + if (p > (int)text.length()) p = (int)text.length(); + caretPos = p; +} + +void TextBox::insertChar(char c) { + text.insert(text.begin() + caretPos, c); + ++caretPos; +} + +void TextBox::backspaceAtCaret() { + if (caretPos >0) { + text.erase(text.begin() + caretPos -1); + --caretPos; + } +} + +void TextBox::deleteAtCaret() { + if (caretPos < (int)text.length()) { + text.erase(text.begin() + caretPos); + } +} + +void TextBox::moveCaretLeft() { + if (caretPos >0) --caretPos; +} + +void TextBox::moveCaretRight() { + if (caretPos < (int)text.length()) ++caretPos; +} + +void TextBox::moveCaretHome() { caretPos =0; } +void TextBox::moveCaretEnd() { caretPos = (int)text.length(); } + +void TextBox::setCaretFromPixel(int px, Font* font) { + // approximate char width + int relative = px - (x +4); + if (relative <=0) { caretPos =0; return; } + int pos = relative /6; + if (pos <0) pos =0; + if (pos > (int)text.length()) pos = (int)text.length(); + caretPos = pos; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + fill(x, y, x + w, y + h,0x80000000); + // Border - use different colors when focused + if (focused) { + fill(x, y, x + w, y +1,0xffa0c0ff); + fill(x, y + h -1, x + w, y + h,0xff4060a0); + fill(x, y, x +1, y + h,0xffa0c0ff); + fill(x + w -1, y, x + w, y + h,0xff4060a0); + } else { + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + } + + int color =0xe0e0e0; + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + int calc = (w -8) /6; // approx6 px per char + int maxChars =1; + if (calc > maxChars) maxChars = calc; + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); + + // Draw caret if focused + if (focused) { + // compute caret x pos in pixels approximated by char width + int caretPixel = x +4 + caretPos *6; + if (caretPixel > x + w -6) caretPixel = x + w -6; + // draw vertical1px line as caret + drawVLine(caretPixel, y +3, y + h -4,0xFFFFFFFF); + } +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/3193CD270A7B0AB983D678989CB04E87 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/3193CD270A7B0AB983D678989CB04E87 new file mode 100644 index 0000000..e6b81f3 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/3193CD270A7B0AB983D678989CB04E87 @@ -0,0 +1,129 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(id), w(0), h(0), x(0), y(0), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->showKeyboard(); + focused = true; + if (caretPos <0) caretPos =0; + if (caretPos > (int)text.length()) caretPos = (int)text.length(); + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->hideKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::setCaretPos(int p) { + if (p <0) p =0; + if (p > (int)text.length()) p = (int)text.length(); + caretPos = p; +} + +void TextBox::insertChar(char c) { + text.insert(text.begin() + caretPos, c); + ++caretPos; +} + +void TextBox::backspaceAtCaret() { + if (caretPos >0) { + text.erase(text.begin() + caretPos -1); + --caretPos; + } +} + +void TextBox::deleteAtCaret() { + if (caretPos < (int)text.length()) { + text.erase(text.begin() + caretPos); + } +} + +void TextBox::moveCaretLeft() { + if (caretPos >0) --caretPos; +} + +void TextBox::moveCaretRight() { + if (caretPos < (int)text.length()) ++caretPos; +} + +void TextBox::moveCaretHome() { caretPos =0; } +void TextBox::moveCaretEnd() { caretPos = (int)text.length(); } + +void TextBox::setCaretFromPixel(int px, Font* font) { + // approximate char width + int relative = px - (x +4); + if (relative <=0) { caretPos =0; return; } + int pos = relative /6; + if (pos <0) pos =0; + if (pos > (int)text.length()) pos = (int)text.length(); + caretPos = pos; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + fill(x, y, x + w, y + h,0x80000000); + // Border - use different colors when focused + if (focused) { + fill(x, y, x + w, y +1,0xffa0c0ff); + fill(x, y + h -1, x + w, y + h,0xff4060a0); + fill(x, y, x +1, y + h,0xffa0c0ff); + fill(x + w -1, y, x + w, y + h,0xff4060a0); + } else { + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + } + + int color =0xe0e0e0; + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + int calc = (w -8) /6; // approx6 px per char + int maxChars =1; + if (calc > maxChars) maxChars = calc; + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); + + // Draw caret if focused + if (focused) { + // compute caret x pos in pixels approximated by char width + int caretPixel = x +4 + caretPos *6; + if (caretPixel > x + w -6) caretPixel = x + w -6; + // draw vertical1px line as caret + fill(caretPixel, y +3, caretPixel +1, y + h -4,0xFFFFFFFF); + } +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/384D14F3D9C7407139BBB6FC3BFAB75C b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/384D14F3D9C7407139BBB6FC3BFAB75C new file mode 100644 index 0000000..647a4b8 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/384D14F3D9C7407139BBB6FC3BFAB75C @@ -0,0 +1,48 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ +#define NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ + +//package net.minecraft.client.gui; + +#include +#include "../GuiComponent.h" +#include "../../Options.h" + +class Font; +class Minecraft; + +class TextBox: public GuiComponent +{ +public: + TextBox(int id, const std::string& msg); + TextBox(int id, int x, int y, const std::string& msg); + TextBox(int id, int x, int y, int w, int h, const std::string& msg); + + virtual void setFocus(Minecraft* minecraft); + virtual bool loseFocus(Minecraft* minecraft); + + virtual void render(Minecraft* minecraft, int xm, int ym); + + // Editing helpers + int getCaretPos() const { return caretPos; } + void setCaretPos(int p); + void insertChar(char c); + void backspaceAtCaret(); + void deleteAtCaret(); + void moveCaretLeft(); + void moveCaretRight(); + void moveCaretHome(); + void moveCaretEnd(); + void setCaretFromPixel(int px, Font* font); + +public: + int w, h; + int x, y; + + std::string text; + int id; + bool focused; +private: + int caretPos; // character index +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/430CC357A15D4BE1A70387A7C3462A3C b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/430CC357A15D4BE1A70387A7C3462A3C new file mode 100644 index 0000000..1e4d608 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/430CC357A15D4BE1A70387A7C3462A3C @@ -0,0 +1,309 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 to avoid off-by-one in GUI mapping + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} + +// Forward typed character directly to focused textbox to avoid duplicate definitions +void Screen::keyboardTextEvent() +{ + char c = Keyboard::getChar(); + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (c >=32) tb->insertChar(c); + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Focused textbox editing + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + tb->backspaceAtCaret(); + } + else if (eventKey == Keyboard::KEY_DELETE) { + tb->deleteAtCaret(); + } + else if (eventKey == Keyboard::KEY_LEFT) { + tb->moveCaretLeft(); + } + else if (eventKey == Keyboard::KEY_RIGHT) { + tb->moveCaretRight(); + } + else if (eventKey == Keyboard::KEY_HOME) { + tb->moveCaretHome(); + } + else if (eventKey == Keyboard::KEY_END) { + tb->moveCaretEnd(); + } + else if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height; // removed -1 +} + +// Default implementation for character input (virtual) +void Screen::keyboardNewChar(char inputChar) { + // default: forward to focused textbox is handled in keyboardTextEvent; keep empty here + (void)inputChar; +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/5155AB407BB675C0EE7F2F480A7432EF b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/5155AB407BB675C0EE7F2F480A7432EF new file mode 100644 index 0000000..f2eb175 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/5155AB407BB675C0EE7F2F480A7432EF @@ -0,0 +1,311 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 to avoid off-by-one in GUI mapping + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} + +// Forward typed character directly to focused textbox to avoid duplicate definitions +void Screen::keyboardTextEvent() +{ + char c = Keyboard::getChar(); + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (c >=32) tb->insertChar(c); + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Focused textbox editing + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + tb->backspaceAtCaret(); + } + else if (eventKey == Keyboard::KEY_DELETE) { + tb->deleteAtCaret(); + } + else if (eventKey == Keyboard::KEY_LEFT) { + tb->moveCaretLeft(); + } + else if (eventKey == Keyboard::KEY_RIGHT) { + tb->moveCaretRight(); + } + else if (eventKey == Keyboard::KEY_HOME) { + tb->moveCaretHome(); + } + else if (eventKey == Keyboard::KEY_END) { + tb->moveCaretEnd(); + } + else if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // position caret based on click + tb->setCaretFromPixel(x, minecraft->font); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height; // removed -1 +} + +// Default implementation for character input (virtual) +void Screen::keyboardNewChar(char inputChar) { + // default: forward to focused textbox is handled in keyboardTextEvent; keep empty here + (void)inputChar; +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/572513C3D8D309B3634C045C3C8FAC54 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/572513C3D8D309B3634C045C3C8FAC54 new file mode 100644 index 0000000..4204871 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/572513C3D8D309B3634C045C3C8FAC54 @@ -0,0 +1,147 @@ +#ifndef KEYBOARD_H__ +#define KEYBOARD_H__ + +#include + +/** A keyboard action; key-down or key-up */ +class KeyboardAction +{ +public: + static const int KEYUP = 0; + static const int KEYDOWN = 1; + + KeyboardAction(unsigned char keyCode, int state) { + this->key = keyCode; + this->state = state; + } + + int state; + unsigned char key; +}; + +/* Iterators */ +typedef std::vector KeyboardActionVec; +typedef KeyboardActionVec::iterator KeyboardActionIt; +typedef KeyboardActionVec::const_iterator KeyboardActionCIt; + +/** A static keyboard class, written to resemble the one in lwjgl somewhat */ +class Keyboard +{ +public: + static const int KEY_A = 65; + static const int KEY_B = 66; + static const int KEY_C = 67; + static const int KEY_D = 68; + static const int KEY_E = 69; + static const int KEY_F = 70; + static const int KEY_G = 71; + static const int KEY_H = 72; + static const int KEY_I = 73; + static const int KEY_J = 74; + static const int KEY_K = 75; + static const int KEY_L = 76; + static const int KEY_M = 77; + static const int KEY_N = 78; + static const int KEY_O = 79; + static const int KEY_P = 80; + static const int KEY_Q = 81; + static const int KEY_R = 82; + static const int KEY_S = 83; + static const int KEY_T = 84; + static const int KEY_U = 85; + static const int KEY_V = 86; + static const int KEY_W = 87; + static const int KEY_X = 88; + static const int KEY_Y = 89; + static const int KEY_Z = 90; + + static const int KEY_BACKSPACE = 8; + static const int KEY_RETURN = 13; + // Delete key (use VK_DELETE / common code46) + static const int KEY_DELETE = 46; + + // Arrow keys, Home/End (common VK codes) + static const int KEY_LEFT = 37; + static const int KEY_UP = 38; + static const int KEY_RIGHT = 39; + static const int KEY_DOWN = 40; + static const int KEY_HOME = 36; + static const int KEY_END = 35; + + static const int KEY_F1 = 112; + static const int KEY_F2 = 113; + static const int KEY_F3 = 114; + static const int KEY_F4 = 115; + static const int KEY_F5 = 116; + static const int KEY_F6 = 117; + static const int KEY_F7 = 118; + static const int KEY_F8 = 119; + static const int KEY_F9 = 120; + static const int KEY_F10 = 121; + static const int KEY_F11 = 122; + static const int KEY_F12 = 123; + + static const int KEY_ESCAPE = 27; + static const int KEY_SPACE = 32; + static const int KEY_LSHIFT = 10; + + static bool isKeyDown(int keyCode) { + return _states[keyCode] == KeyboardAction::KEYDOWN; + } + + static void reset() { + _inputs.clear(); + _inputText.clear(); + _index = -1; + _textIndex = -1; + } + + static void feed(unsigned char keyCode, int state) { + _inputs.push_back(KeyboardAction(keyCode, state)); + + _states[keyCode] = state; + } + static void feedText(char character) { + _inputText.push_back(character); + } + + static bool next() { + if (_index + 1 >= (int)_inputs.size()) + return false; + + ++_index; + return true; + } + + static bool nextTextChar() { + if(_textIndex + 1 >= (int)_inputText.size()) + return false; + ++_textIndex; + return true; + } + + static void rewind() { + _index = -1; + _textIndex = -1; + } + + static int getEventKey() { + return _inputs[_index].key; + } + + static int getEventKeyState() { + return _inputs[_index].state; + } + static char getChar() { + return _inputText[_textIndex]; + } +private: + static int _index; + static int _textIndex; + static int _states[256]; + static std::vector _inputs; + static std::vector _inputText; + static bool _inited; +}; + +#endif//KEYBOARD_H__ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/6870477E6682CFF22A5846092C3A5746 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/6870477E6682CFF22A5846092C3A5746 new file mode 100644 index 0000000..a8f549a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/6870477E6682CFF22A5846092C3A5746 @@ -0,0 +1,118 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(id), w(0), h(0), x(0), y(0), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->showKeyboard(); + focused = true; + if (caretPos <0) caretPos =0; + if (caretPos > (int)text.length()) caretPos = (int)text.length(); + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->hideKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::setCaretPos(int p) { + if (p <0) p =0; + if (p > (int)text.length()) p = (int)text.length(); + caretPos = p; +} + +void TextBox::insertChar(char c) { + text.insert(text.begin() + caretPos, c); + ++caretPos; +} + +void TextBox::backspaceAtCaret() { + if (caretPos >0) { + text.erase(text.begin() + caretPos -1); + --caretPos; + } +} + +void TextBox::deleteAtCaret() { + if (caretPos < (int)text.length()) { + text.erase(text.begin() + caretPos); + } +} + +void TextBox::moveCaretLeft() { + if (caretPos >0) --caretPos; +} + +void TextBox::moveCaretRight() { + if (caretPos < (int)text.length()) ++caretPos; +} + +void TextBox::moveCaretHome() { caretPos =0; } +void TextBox::moveCaretEnd() { caretPos = (int)text.length(); } + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + fill(x, y, x + w, y + h,0x80000000); + // Border - use different colors when focused + if (focused) { + fill(x, y, x + w, y +1,0xffa0c0ff); + fill(x, y + h -1, x + w, y + h,0xff4060a0); + fill(x, y, x +1, y + h,0xffa0c0ff); + fill(x + w -1, y, x + w, y + h,0xff4060a0); + } else { + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + } + + int color =0xe0e0e0; + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + int calc = (w -8) /6; // approx6 px per char + int maxChars =1; + if (calc > maxChars) maxChars = calc; + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); + + // Draw caret if focused + if (focused) { + // compute caret x pos in pixels approximated by char width + int caretPixel = x +4 + caretPos *6; + if (caretPixel > x + w -6) caretPixel = x + w -6; + drawVLine(caretPixel, y +3, y + h -4,0xFFFFFFFF); + } +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/8146877229477753D9428BB145DD1662 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/8146877229477753D9428BB145DD1662 new file mode 100644 index 0000000..f2eb175 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/8146877229477753D9428BB145DD1662 @@ -0,0 +1,311 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 to avoid off-by-one in GUI mapping + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} + +// Forward typed character directly to focused textbox to avoid duplicate definitions +void Screen::keyboardTextEvent() +{ + char c = Keyboard::getChar(); + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (c >=32) tb->insertChar(c); + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Focused textbox editing + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + tb->backspaceAtCaret(); + } + else if (eventKey == Keyboard::KEY_DELETE) { + tb->deleteAtCaret(); + } + else if (eventKey == Keyboard::KEY_LEFT) { + tb->moveCaretLeft(); + } + else if (eventKey == Keyboard::KEY_RIGHT) { + tb->moveCaretRight(); + } + else if (eventKey == Keyboard::KEY_HOME) { + tb->moveCaretHome(); + } + else if (eventKey == Keyboard::KEY_END) { + tb->moveCaretEnd(); + } + else if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // position caret based on click + tb->setCaretFromPixel(x, minecraft->font); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height; // removed -1 +} + +// Default implementation for character input (virtual) +void Screen::keyboardNewChar(char inputChar) { + // default: forward to focused textbox is handled in keyboardTextEvent; keep empty here + (void)inputChar; +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/8D8D59879786B7323D74F85E4D3B705C b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/8D8D59879786B7323D74F85E4D3B705C new file mode 100644 index 0000000..1e4d608 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/8D8D59879786B7323D74F85E4D3B705C @@ -0,0 +1,309 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 to avoid off-by-one in GUI mapping + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} + +// Forward typed character directly to focused textbox to avoid duplicate definitions +void Screen::keyboardTextEvent() +{ + char c = Keyboard::getChar(); + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (c >=32) tb->insertChar(c); + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Focused textbox editing + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + tb->backspaceAtCaret(); + } + else if (eventKey == Keyboard::KEY_DELETE) { + tb->deleteAtCaret(); + } + else if (eventKey == Keyboard::KEY_LEFT) { + tb->moveCaretLeft(); + } + else if (eventKey == Keyboard::KEY_RIGHT) { + tb->moveCaretRight(); + } + else if (eventKey == Keyboard::KEY_HOME) { + tb->moveCaretHome(); + } + else if (eventKey == Keyboard::KEY_END) { + tb->moveCaretEnd(); + } + else if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height; // removed -1 +} + +// Default implementation for character input (virtual) +void Screen::keyboardNewChar(char inputChar) { + // default: forward to focused textbox is handled in keyboardTextEvent; keep empty here + (void)inputChar; +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/9C1934F8133BFE6F5B6439012727F319 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/9C1934F8133BFE6F5B6439012727F319 new file mode 100644 index 0000000..bbb8652 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/9C1934F8133BFE6F5B6439012727F319 @@ -0,0 +1,311 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 to avoid off-by-one in GUI mapping + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} + +// Forward typed character directly to focused textbox to avoid duplicate definitions +void Screen::keyboardTextEvent() +{ + char c = Keyboard::getChar(); + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (c >=32) tb->insertChar(c); + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Focused textbox editing + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + tb->backspaceAtCaret(); + } + else if (eventKey == Keyboard::KEY_DELETE || eventKey ==127) { + tb->deleteAtCaret(); + } + else if (eventKey == Keyboard::KEY_LEFT) { + tb->moveCaretLeft(); + } + else if (eventKey == Keyboard::KEY_RIGHT) { + tb->moveCaretRight(); + } + else if (eventKey == Keyboard::KEY_HOME) { + tb->moveCaretHome(); + } + else if (eventKey == Keyboard::KEY_END) { + tb->moveCaretEnd(); + } + else if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // position caret based on click + tb->setCaretFromPixel(x, minecraft->font); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height; // removed -1 +} + +// Default implementation for character input (virtual) +void Screen::keyboardNewChar(char inputChar) { + // default: forward to focused textbox is handled in keyboardTextEvent; keep empty here + (void)inputChar; +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/BECAD6E9CAC9979694900A3467661460 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/BECAD6E9CAC9979694900A3467661460 new file mode 100644 index 0000000..f355e93 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/BECAD6E9CAC9979694900A3467661460 @@ -0,0 +1,129 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(id), w(0), h(0), x(0), y(0), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg, focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->showKeyboard(); + focused = true; + if (caretPos <0) caretPos =0; + if (caretPos > (int)text.length()) caretPos = (int)text.length(); + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->hideKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::setCaretPos(int p) { + if (p <0) p =0; + if (p > (int)text.length()) p = (int)text.length(); + caretPos = p; +} + +void TextBox::insertChar(char c) { + text.insert(text.begin() + caretPos, c); + ++caretPos; +} + +void TextBox::backspaceAtCaret() { + if (caretPos >0) { + text.erase(text.begin() + caretPos -1); + --caretPos; + } +} + +void TextBox::deleteAtCaret() { + if (caretPos < (int)text.length()) { + text.erase(text.begin() + caretPos); + } +} + +void TextBox::moveCaretLeft() { + if (caretPos >0) --caretPos; +} + +void TextBox::moveCaretRight() { + if (caretPos < (int)text.length()) ++caretPos; +} + +void TextBox::moveCaretHome() { caretPos =0; } +void TextBox::moveCaretEnd() { caretPos = (int)text.length(); } + +void TextBox::setCaretFromPixel(int px, Font* font) { + // approximate char width + int relative = px - (x +4); + if (relative <=0) { caretPos =0; return; } + int pos = relative /6; + if (pos <0) pos =0; + if (pos > (int)text.length()) pos = (int)text.length(); + caretPos = pos; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + fill(x, y, x + w, y + h,0x80000000); + // Border - use different colors when focused + if (focused) { + fill(x, y, x + w, y +1,0xffa0c0ff); + fill(x, y + h -1, x + w, y + h,0xff4060a0); + fill(x, y, x +1, y + h,0xffa0c0ff); + fill(x + w -1, y, x + w, y + h,0xff4060a0); + } else { + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + } + + int color =0xe0e0e0; + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + int calc = (w -8) /6; // approx6 px per char + int maxChars =1; + if (calc > maxChars) maxChars = calc; + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); + + // Draw caret if focused + if (focused) { + // compute caret x pos in pixels approximated by char width + int caretPixel = x +4 + caretPos *6; + if (caretPixel > x + w -6) caretPixel = x + w -6; + // draw vertical1px line as caret + fill(caretPixel, y +3, caretPixel +1, y + h -4,0xFFFFFFFF); + } +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/CBFF824C79DF0D5184BE6E79855449AA b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/CBFF824C79DF0D5184BE6E79855449AA new file mode 100644 index 0000000..55acfcd --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/CBFF824C79DF0D5184BE6E79855449AA @@ -0,0 +1,47 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ +#define NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ + +//package net.minecraft.client.gui; + +#include +#include "../GuiComponent.h" +#include "../../Options.h" + +class Font; +class Minecraft; + +class TextBox: public GuiComponent +{ +public: + TextBox(int id, const std::string& msg); + TextBox(int id, int x, int y, const std::string& msg); + TextBox(int id, int x, int y, int w, int h, const std::string& msg); + + virtual void setFocus(Minecraft* minecraft); + virtual bool loseFocus(Minecraft* minecraft); + + virtual void render(Minecraft* minecraft, int xm, int ym); + + // Editing helpers + int getCaretPos() const { return caretPos; } + void setCaretPos(int p); + void insertChar(char c); + void backspaceAtCaret(); + void deleteAtCaret(); + void moveCaretLeft(); + void moveCaretRight(); + void moveCaretHome(); + void moveCaretEnd(); + +public: + int w, h; + int x, y; + + std::string text; + int id; + bool focused; +private: + int caretPos; // character index +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/D33356E53A2A50E442A2F559A1DC0E5F b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/D33356E53A2A50E442A2F559A1DC0E5F new file mode 100644 index 0000000..dcf4184 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/D33356E53A2A50E442A2F559A1DC0E5F @@ -0,0 +1,119 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(id), w(0), h(0), x(0), y(0), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->showKeyboard(); + focused = true; + if (caretPos <0) caretPos =0; + if (caretPos > (int)text.length()) caretPos = (int)text.length(); + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->hideKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::setCaretPos(int p) { + if (p <0) p =0; + if (p > (int)text.length()) p = (int)text.length(); + caretPos = p; +} + +void TextBox::insertChar(char c) { + text.insert(text.begin() + caretPos, c); + ++caretPos; +} + +void TextBox::backspaceAtCaret() { + if (caretPos >0) { + text.erase(text.begin() + caretPos -1); + --caretPos; + } +} + +void TextBox::deleteAtCaret() { + if (caretPos < (int)text.length()) { + text.erase(text.begin() + caretPos); + } +} + +void TextBox::moveCaretLeft() { + if (caretPos >0) --caretPos; +} + +void TextBox::moveCaretRight() { + if (caretPos < (int)text.length()) ++caretPos; +} + +void TextBox::moveCaretHome() { caretPos =0; } +void TextBox::moveCaretEnd() { caretPos = (int)text.length(); } + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + fill(x, y, x + w, y + h,0x80000000); + // Border - use different colors when focused + if (focused) { + fill(x, y, x + w, y +1,0xffa0c0ff); + fill(x, y + h -1, x + w, y + h,0xff4060a0); + fill(x, y, x +1, y + h,0xffa0c0ff); + fill(x + w -1, y, x + w, y + h,0xff4060a0); + } else { + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + } + + int color =0xe0e0e0; + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + int calc = (w -8) /6; // approx6 px per char + int maxChars =1; + if (calc > maxChars) maxChars = calc; + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); + + // Draw caret if focused + if (focused) { + // compute caret x pos in pixels approximated by char width + int caretPixel = x +4 + caretPos *6; + if (caretPixel > x + w -6) caretPixel = x + w -6; + // draw vertical1px line as caret + fill(caretPixel, y +3, caretPixel +1, y + h -4,0xFFFFFFFF); + } +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/D5D731CF976B0E26ADB6AD74BCB19E22 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/D5D731CF976B0E26ADB6AD74BCB19E22 new file mode 100644 index 0000000..e6b81f3 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/D5D731CF976B0E26ADB6AD74BCB19E22 @@ -0,0 +1,129 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(id), w(0), h(0), x(0), y(0), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->showKeyboard(); + focused = true; + if (caretPos <0) caretPos =0; + if (caretPos > (int)text.length()) caretPos = (int)text.length(); + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->hideKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::setCaretPos(int p) { + if (p <0) p =0; + if (p > (int)text.length()) p = (int)text.length(); + caretPos = p; +} + +void TextBox::insertChar(char c) { + text.insert(text.begin() + caretPos, c); + ++caretPos; +} + +void TextBox::backspaceAtCaret() { + if (caretPos >0) { + text.erase(text.begin() + caretPos -1); + --caretPos; + } +} + +void TextBox::deleteAtCaret() { + if (caretPos < (int)text.length()) { + text.erase(text.begin() + caretPos); + } +} + +void TextBox::moveCaretLeft() { + if (caretPos >0) --caretPos; +} + +void TextBox::moveCaretRight() { + if (caretPos < (int)text.length()) ++caretPos; +} + +void TextBox::moveCaretHome() { caretPos =0; } +void TextBox::moveCaretEnd() { caretPos = (int)text.length(); } + +void TextBox::setCaretFromPixel(int px, Font* font) { + // approximate char width + int relative = px - (x +4); + if (relative <=0) { caretPos =0; return; } + int pos = relative /6; + if (pos <0) pos =0; + if (pos > (int)text.length()) pos = (int)text.length(); + caretPos = pos; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + fill(x, y, x + w, y + h,0x80000000); + // Border - use different colors when focused + if (focused) { + fill(x, y, x + w, y +1,0xffa0c0ff); + fill(x, y + h -1, x + w, y + h,0xff4060a0); + fill(x, y, x +1, y + h,0xffa0c0ff); + fill(x + w -1, y, x + w, y + h,0xff4060a0); + } else { + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + } + + int color =0xe0e0e0; + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + int calc = (w -8) /6; // approx6 px per char + int maxChars =1; + if (calc > maxChars) maxChars = calc; + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); + + // Draw caret if focused + if (focused) { + // compute caret x pos in pixels approximated by char width + int caretPixel = x +4 + caretPos *6; + if (caretPixel > x + w -6) caretPixel = x + w -6; + // draw vertical1px line as caret + fill(caretPixel, y +3, caretPixel +1, y + h -4,0xFFFFFFFF); + } +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/E19DC915D7B7F4D40A50F260C758DAD9 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/E19DC915D7B7F4D40A50F260C758DAD9 new file mode 100644 index 0000000..c45276d --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/E19DC915D7B7F4D40A50F260C758DAD9 @@ -0,0 +1,80 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI__Screen_H__ +#define NET_MINECRAFT_CLIENT_GUI__Screen_H__ + +//package net.minecraft.client.gui; + +#include +#include "GuiComponent.h" + +class Font; +class Minecraft; +class Button; +class TextBox; +struct IntRectangle; + +class Screen: public GuiComponent +{ +public: + Screen(); + + virtual void render(int xm, int ym, float a); + + void init(Minecraft* minecraft, int width, int height); + virtual void init(); + + void setSize(int width, int height); + virtual void setupPositions() {}; + + virtual void updateEvents(); + virtual void mouseEvent(); + virtual void keyboardEvent(); + virtual void keyboardTextEvent(); + virtual bool handleBackEvent(bool isDown); + + virtual void tick() {} + + virtual void removed() {} + + virtual void renderBackground(); + virtual void renderBackground(int vo); + virtual void renderDirtBackground(int vo); + // query + virtual bool renderGameBehind(); + virtual bool hasClippingArea(IntRectangle& out); + + virtual bool isPauseScreen(); + virtual bool isErrorScreen(); + virtual bool isInGameScreen(); + virtual bool closeOnPlayerHurt(); + + virtual void confirmResult(bool result, int id) {} + virtual void lostFocus(); + virtual void toGUICoordinate(int& x, int& y); +protected: + void updateTabButtonSelection(); + + virtual void buttonClicked(Button* button) {} + virtual void mouseClicked(int x, int y, int buttonNum); + virtual void mouseReleased(int x, int y, int buttonNum); + + virtual void keyPressed(int eventKey); + virtual void keyboardNewChar(char inputChar); +public: + int width; + int height; + bool passEvents; + //GuiParticles* particles; +protected: + Minecraft* minecraft; + std::vector buttons; + std::vector textBoxes; + + std::vector tabButtons; + int tabButtonIndex; + + Font* font; +private: + Button* clickedButton; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI__Screen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/E7E08E574F772D105F55E0FEDA32708C b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/E7E08E574F772D105F55E0FEDA32708C new file mode 100644 index 0000000..f355e93 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/E7E08E574F772D105F55E0FEDA32708C @@ -0,0 +1,129 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(id), w(0), h(0), x(0), y(0), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg, focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->showKeyboard(); + focused = true; + if (caretPos <0) caretPos =0; + if (caretPos > (int)text.length()) caretPos = (int)text.length(); + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->hideKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::setCaretPos(int p) { + if (p <0) p =0; + if (p > (int)text.length()) p = (int)text.length(); + caretPos = p; +} + +void TextBox::insertChar(char c) { + text.insert(text.begin() + caretPos, c); + ++caretPos; +} + +void TextBox::backspaceAtCaret() { + if (caretPos >0) { + text.erase(text.begin() + caretPos -1); + --caretPos; + } +} + +void TextBox::deleteAtCaret() { + if (caretPos < (int)text.length()) { + text.erase(text.begin() + caretPos); + } +} + +void TextBox::moveCaretLeft() { + if (caretPos >0) --caretPos; +} + +void TextBox::moveCaretRight() { + if (caretPos < (int)text.length()) ++caretPos; +} + +void TextBox::moveCaretHome() { caretPos =0; } +void TextBox::moveCaretEnd() { caretPos = (int)text.length(); } + +void TextBox::setCaretFromPixel(int px, Font* font) { + // approximate char width + int relative = px - (x +4); + if (relative <=0) { caretPos =0; return; } + int pos = relative /6; + if (pos <0) pos =0; + if (pos > (int)text.length()) pos = (int)text.length(); + caretPos = pos; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + fill(x, y, x + w, y + h,0x80000000); + // Border - use different colors when focused + if (focused) { + fill(x, y, x + w, y +1,0xffa0c0ff); + fill(x, y + h -1, x + w, y + h,0xff4060a0); + fill(x, y, x +1, y + h,0xffa0c0ff); + fill(x + w -1, y, x + w, y + h,0xff4060a0); + } else { + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + } + + int color =0xe0e0e0; + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + int calc = (w -8) /6; // approx6 px per char + int maxChars =1; + if (calc > maxChars) maxChars = calc; + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); + + // Draw caret if focused + if (focused) { + // compute caret x pos in pixels approximated by char width + int caretPixel = x +4 + caretPos *6; + if (caretPixel > x + w -6) caretPixel = x + w -6; + // draw vertical1px line as caret + fill(caretPixel, y +3, caretPixel +1, y + h -4,0xFFFFFFFF); + } +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/FCC8063A3935ACAD7700EF27C8E3B4AD b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/FCC8063A3935ACAD7700EF27C8E3B4AD new file mode 100644 index 0000000..a51765e --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/A93893FD5A84384B86FE3AC2EFDB85F5/FCC8063A3935ACAD7700EF27C8E3B4AD @@ -0,0 +1,156 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(id), w(0), h(0), x(0), y(0), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->showKeyboard(); + focused = true; + if (caretPos <0) caretPos =0; + if (caretPos > (int)text.length()) caretPos = (int)text.length(); + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->hideKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::setCaretPos(int p) { + if (p <0) p =0; + if (p > (int)text.length()) p = (int)text.length(); + caretPos = p; +} + +void TextBox::insertChar(char c) { + text.insert(text.begin() + caretPos, c); + ++caretPos; +} + +void TextBox::backspaceAtCaret() { + if (caretPos >0) { + text.erase(text.begin() + caretPos -1); + --caretPos; + } +} + +void TextBox::deleteAtCaret() { + if (caretPos < (int)text.length()) { + text.erase(text.begin() + caretPos); + } +} + +void TextBox::moveCaretLeft() { + if (caretPos >0) --caretPos; +} + +void TextBox::moveCaretRight() { + if (caretPos < (int)text.length()) ++caretPos; +} + +void TextBox::moveCaretHome() { caretPos =0; } +void TextBox::moveCaretEnd() { caretPos = (int)text.length(); } + +void TextBox::setCaretFromPixel(int px, Font* font) { + // Use font metrics to determine nearest character position + if (!font) { + // fallback to approximate + int relative = px - (x +4); + int pos = (relative >0) ? (relative /6) :0; + if (pos <0) pos =0; + if (pos > (int)text.length()) pos = (int)text.length(); + caretPos = pos; + return; + } + int rel = px - (x +4); + if (rel <=0) { caretPos =0; return; } + int best =0; + int bestDiff = INT_MAX; + int acc =0; + for (int i =0; i <= (int)text.length(); ++i) { + int w = font->width(text.substr(0, i)); + int diff = abs(w - rel); + if (diff < bestDiff) { best = i; bestDiff = diff; } + // small optimization: if w > rel and diff growing, break + if (w > rel && i >0 && diff > bestDiff) break; + } + if (best <0) best =0; + if (best > (int)text.length()) best = (int)text.length(); + caretPos = best; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + fill(x, y, x + w, y + h,0x80000000); + // Border - use different colors when focused + if (focused) { + fill(x, y, x + w, y +1,0xffa0c0ff); + fill(x, y + h -1, x + w, y + h,0xff4060a0); + fill(x, y, x +1, y + h,0xffa0c0ff); + fill(x + w -1, y, x + w, y + h,0xff4060a0); + } else { + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + } + + int color =0xe0e0e0; + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + int maxChars =1; + if (minecraft && minecraft->font) { + int avg = (w -8) / (minecraft->font->charWidth >0 ? minecraft->font->charWidth :6); + if (avg > maxChars) maxChars = avg; + } else { + int calc = (w -8) /6; // approx6 px per char + if (calc > maxChars) maxChars = calc; + } + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); + + // Draw caret if focused + if (focused) { + int caretPixel = x +4; + if (minecraft && minecraft->font) { + caretPixel += minecraft->font->width(text.substr(0, caretPos)); + } else { + caretPixel += caretPos *6; + } + if (caretPixel > x + w -6) caretPixel = x + w -6; + // draw vertical1px line as caret + fill(caretPixel, y +3, caretPixel +1, y + h -4,0xFFFFFFFF); + } +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/ADDAA969E47C504EB523DF7D24277426/1D11F3CE27B0B595836AB483CC9A0B43 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/ADDAA969E47C504EB523DF7D24277426/1D11F3CE27B0B595836AB483CC9A0B43 new file mode 100644 index 0000000..1834b6f --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/ADDAA969E47C504EB523DF7D24277426/1D11F3CE27B0B595836AB483CC9A0B43 @@ -0,0 +1,157 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(id), w(0), h(0), x(0), y(0), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg), focused(false), caretPos((int)msg.length()) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->showKeyboard(); + focused = true; + if (caretPos <0) caretPos =0; + if (caretPos > (int)text.length()) caretPos = (int)text.length(); + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->hideKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::setCaretPos(int p) { + if (p <0) p =0; + if (p > (int)text.length()) p = (int)text.length(); + caretPos = p; +} + +void TextBox::insertChar(char c) { + text.insert(text.begin() + caretPos, c); + ++caretPos; +} + +void TextBox::backspaceAtCaret() { + if (caretPos >0) { + text.erase(text.begin() + caretPos -1); + --caretPos; + } +} + +void TextBox::deleteAtCaret() { + if (caretPos < (int)text.length()) { + text.erase(text.begin() + caretPos); + } +} + +void TextBox::moveCaretLeft() { + if (caretPos >0) --caretPos; +} + +void TextBox::moveCaretRight() { + if (caretPos < (int)text.length()) ++caretPos; +} + +void TextBox::moveCaretHome() { caretPos =0; } +void TextBox::moveCaretEnd() { caretPos = (int)text.length(); } + +void TextBox::setCaretFromPixel(int px, Font* font) { + // Use font metrics to determine nearest character position + if (!font) { + // fallback to approximate + int relative = px - (x +4); + int pos = (relative >0) ? (relative /6) :0; + if (pos <0) pos =0; + if (pos > (int)text.length()) pos = (int)text.length(); + caretPos = pos; + return; + } + int rel = px - (x +4); + if (rel <=0) { caretPos =0; return; } + int best =0; + int bestDiff = INT_MAX; + for (int i =0; i <= (int)text.length(); ++i) { + int w = font->width(text.substr(0, i)); + int diff = abs(w - rel); + if (diff < bestDiff) { best = i; bestDiff = diff; } + // small optimization: if w > rel and diff growing, break + if (w > rel && i >0 && diff > bestDiff) break; + } + if (best <0) best =0; + if (best > (int)text.length()) best = (int)text.length(); + caretPos = best; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + fill(x, y, x + w, y + h,0x80000000); + // Border - use different colors when focused + if (focused) { + fill(x, y, x + w, y +1,0xffa0c0ff); + fill(x, y + h -1, x + w, y + h,0xff4060a0); + fill(x, y, x +1, y + h,0xffa0c0ff); + fill(x + w -1, y, x + w, y + h,0xff4060a0); + } else { + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + } + + int color =0xe0e0e0; + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + int maxChars =1; + if (minecraft && minecraft->font) { + int avgCharWidth = minecraft->font->width(std::string("W")); + if (avgCharWidth <=0) avgCharWidth =6; + int avg = (w -8) / avgCharWidth; + if (avg > maxChars) maxChars = avg; + } else { + int calc = (w -8) /6; // approx6 px per char + if (calc > maxChars) maxChars = calc; + } + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); + + // Draw caret if focused + if (focused) { + int caretPixel = x +4; + if (minecraft && minecraft->font) { + caretPixel += minecraft->font->width(text.substr(0, caretPos)); + } else { + caretPixel += caretPos *6; + } + if (caretPixel > x + w -6) caretPixel = x + w -6; + // draw vertical1px line as caret + fill(caretPixel, y +3, caretPixel +1, y + h -4,0xFFFFFFFF); + } +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/ADDAA969E47C504EB523DF7D24277426/29AF312A2EB9C491E6677EEF85B806D7 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/ADDAA969E47C504EB523DF7D24277426/29AF312A2EB9C491E6677EEF85B806D7 new file mode 100644 index 0000000..69cb84b --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/ADDAA969E47C504EB523DF7D24277426/29AF312A2EB9C491E6677EEF85B806D7 @@ -0,0 +1,331 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" +#include "../../platform/log.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 to avoid off-by-one in GUI mapping + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} + +// Forward typed character directly to focused textbox to avoid duplicate definitions +void Screen::keyboardTextEvent() +{ + char c = Keyboard::getChar(); + LOGW("keyboardTextEvent: char code=%d ('%c')", (int)(unsigned char)c, (c >=32 && c <127) ? c : '?'); + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + // Some platforms deliver backspace/delete as text characters. Handle control chars here. + if (c == (char)Keyboard::KEY_BACKSPACE || c ==8 || c ==127) { + LOGW("keyboardTextEvent: treating as BACKSPACE/delete"); + tb->backspaceAtCaret(); + } else if (c == (char)Keyboard::KEY_DELETE || c ==127) { + LOGW("keyboardTextEvent: treating as DELETE"); + tb->deleteAtCaret(); + } else if (c >=32) { + LOGW("keyboardTextEvent: inserting char '%c'", c); + tb->insertChar(c); + } + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +void Screen::keyPressed(int eventKey) +{ + LOGW("keyPressed: eventKey=%d", eventKey); + if (eventKey == Keyboard::KEY_ESCAPE) { + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Focused textbox editing + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + LOGW("keyPressed: BACKSPACE detected"); + tb->backspaceAtCaret(); + } + else if (eventKey == Keyboard::KEY_DELETE || eventKey ==127) { + LOGW("keyPressed: DELETE detected (eventKey=%d)", eventKey); + tb->deleteAtCaret(); + } + else if (eventKey == Keyboard::KEY_LEFT) { + LOGW("keyPressed: LEFT"); + tb->moveCaretLeft(); + } + else if (eventKey == Keyboard::KEY_RIGHT) { + LOGW("keyPressed: RIGHT"); + tb->moveCaretRight(); + } + else if (eventKey == Keyboard::KEY_HOME) { + LOGW("keyPressed: HOME"); + tb->moveCaretHome(); + } + else if (eventKey == Keyboard::KEY_END) { + LOGW("keyPressed: END"); + tb->moveCaretEnd(); + } + else if (eventKey == Keyboard::KEY_RETURN) { + LOGW("keyPressed: RETURN (defocus)"); + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // position caret based on click + tb->setCaretFromPixel(x, minecraft->font); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height; // removed -1 +} + +// Default implementation for character input (virtual) +void Screen::keyboardNewChar(char inputChar) { + // default: forward to focused textbox is handled in keyboardTextEvent; keep empty here + (void)inputChar; +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/ADDAA969E47C504EB523DF7D24277426/430CC357A15D4BE1A70387A7C3462A3C b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/ADDAA969E47C504EB523DF7D24277426/430CC357A15D4BE1A70387A7C3462A3C new file mode 100644 index 0000000..474bb2b --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/ADDAA969E47C504EB523DF7D24277426/430CC357A15D4BE1A70387A7C3462A3C @@ -0,0 +1,318 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 to avoid off-by-one in GUI mapping + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} + +// Forward typed character directly to focused textbox to avoid duplicate definitions +void Screen::keyboardTextEvent() +{ + char c = Keyboard::getChar(); + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + // Some platforms deliver backspace/delete as text characters. Handle control chars here. + if (c == (char)Keyboard::KEY_BACKSPACE || c ==8 || c ==127) { + tb->backspaceAtCaret(); + } else if (c == (char)Keyboard::KEY_DELETE || c ==127) { + tb->deleteAtCaret(); + } else if (c >=32) { + tb->insertChar(c); + } + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Focused textbox editing + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + tb->backspaceAtCaret(); + } + else if (eventKey == Keyboard::KEY_DELETE || eventKey ==127) { + tb->deleteAtCaret(); + } + else if (eventKey == Keyboard::KEY_LEFT) { + tb->moveCaretLeft(); + } + else if (eventKey == Keyboard::KEY_RIGHT) { + tb->moveCaretRight(); + } + else if (eventKey == Keyboard::KEY_HOME) { + tb->moveCaretHome(); + } + else if (eventKey == Keyboard::KEY_END) { + tb->moveCaretEnd(); + } + else if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // position caret based on click + tb->setCaretFromPixel(x, minecraft->font); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height; // removed -1 +} + +// Default implementation for character input (virtual) +void Screen::keyboardNewChar(char inputChar) { + // default: forward to focused textbox is handled in keyboardTextEvent; keep empty here + (void)inputChar; +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/ADDAA969E47C504EB523DF7D24277426/572513C3D8D309B3634C045C3C8FAC54 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/ADDAA969E47C504EB523DF7D24277426/572513C3D8D309B3634C045C3C8FAC54 new file mode 100644 index 0000000..4204871 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/ADDAA969E47C504EB523DF7D24277426/572513C3D8D309B3634C045C3C8FAC54 @@ -0,0 +1,147 @@ +#ifndef KEYBOARD_H__ +#define KEYBOARD_H__ + +#include + +/** A keyboard action; key-down or key-up */ +class KeyboardAction +{ +public: + static const int KEYUP = 0; + static const int KEYDOWN = 1; + + KeyboardAction(unsigned char keyCode, int state) { + this->key = keyCode; + this->state = state; + } + + int state; + unsigned char key; +}; + +/* Iterators */ +typedef std::vector KeyboardActionVec; +typedef KeyboardActionVec::iterator KeyboardActionIt; +typedef KeyboardActionVec::const_iterator KeyboardActionCIt; + +/** A static keyboard class, written to resemble the one in lwjgl somewhat */ +class Keyboard +{ +public: + static const int KEY_A = 65; + static const int KEY_B = 66; + static const int KEY_C = 67; + static const int KEY_D = 68; + static const int KEY_E = 69; + static const int KEY_F = 70; + static const int KEY_G = 71; + static const int KEY_H = 72; + static const int KEY_I = 73; + static const int KEY_J = 74; + static const int KEY_K = 75; + static const int KEY_L = 76; + static const int KEY_M = 77; + static const int KEY_N = 78; + static const int KEY_O = 79; + static const int KEY_P = 80; + static const int KEY_Q = 81; + static const int KEY_R = 82; + static const int KEY_S = 83; + static const int KEY_T = 84; + static const int KEY_U = 85; + static const int KEY_V = 86; + static const int KEY_W = 87; + static const int KEY_X = 88; + static const int KEY_Y = 89; + static const int KEY_Z = 90; + + static const int KEY_BACKSPACE = 8; + static const int KEY_RETURN = 13; + // Delete key (use VK_DELETE / common code46) + static const int KEY_DELETE = 46; + + // Arrow keys, Home/End (common VK codes) + static const int KEY_LEFT = 37; + static const int KEY_UP = 38; + static const int KEY_RIGHT = 39; + static const int KEY_DOWN = 40; + static const int KEY_HOME = 36; + static const int KEY_END = 35; + + static const int KEY_F1 = 112; + static const int KEY_F2 = 113; + static const int KEY_F3 = 114; + static const int KEY_F4 = 115; + static const int KEY_F5 = 116; + static const int KEY_F6 = 117; + static const int KEY_F7 = 118; + static const int KEY_F8 = 119; + static const int KEY_F9 = 120; + static const int KEY_F10 = 121; + static const int KEY_F11 = 122; + static const int KEY_F12 = 123; + + static const int KEY_ESCAPE = 27; + static const int KEY_SPACE = 32; + static const int KEY_LSHIFT = 10; + + static bool isKeyDown(int keyCode) { + return _states[keyCode] == KeyboardAction::KEYDOWN; + } + + static void reset() { + _inputs.clear(); + _inputText.clear(); + _index = -1; + _textIndex = -1; + } + + static void feed(unsigned char keyCode, int state) { + _inputs.push_back(KeyboardAction(keyCode, state)); + + _states[keyCode] = state; + } + static void feedText(char character) { + _inputText.push_back(character); + } + + static bool next() { + if (_index + 1 >= (int)_inputs.size()) + return false; + + ++_index; + return true; + } + + static bool nextTextChar() { + if(_textIndex + 1 >= (int)_inputText.size()) + return false; + ++_textIndex; + return true; + } + + static void rewind() { + _index = -1; + _textIndex = -1; + } + + static int getEventKey() { + return _inputs[_index].key; + } + + static int getEventKeyState() { + return _inputs[_index].state; + } + static char getChar() { + return _inputText[_textIndex]; + } +private: + static int _index; + static int _textIndex; + static int _states[256]; + static std::vector _inputs; + static std::vector _inputText; + static bool _inited; +}; + +#endif//KEYBOARD_H__ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/ADDAA969E47C504EB523DF7D24277426/711D8E7C34C50C43BC5F7BE72D813F3B b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/ADDAA969E47C504EB523DF7D24277426/711D8E7C34C50C43BC5F7BE72D813F3B new file mode 100644 index 0000000..4204871 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/ADDAA969E47C504EB523DF7D24277426/711D8E7C34C50C43BC5F7BE72D813F3B @@ -0,0 +1,147 @@ +#ifndef KEYBOARD_H__ +#define KEYBOARD_H__ + +#include + +/** A keyboard action; key-down or key-up */ +class KeyboardAction +{ +public: + static const int KEYUP = 0; + static const int KEYDOWN = 1; + + KeyboardAction(unsigned char keyCode, int state) { + this->key = keyCode; + this->state = state; + } + + int state; + unsigned char key; +}; + +/* Iterators */ +typedef std::vector KeyboardActionVec; +typedef KeyboardActionVec::iterator KeyboardActionIt; +typedef KeyboardActionVec::const_iterator KeyboardActionCIt; + +/** A static keyboard class, written to resemble the one in lwjgl somewhat */ +class Keyboard +{ +public: + static const int KEY_A = 65; + static const int KEY_B = 66; + static const int KEY_C = 67; + static const int KEY_D = 68; + static const int KEY_E = 69; + static const int KEY_F = 70; + static const int KEY_G = 71; + static const int KEY_H = 72; + static const int KEY_I = 73; + static const int KEY_J = 74; + static const int KEY_K = 75; + static const int KEY_L = 76; + static const int KEY_M = 77; + static const int KEY_N = 78; + static const int KEY_O = 79; + static const int KEY_P = 80; + static const int KEY_Q = 81; + static const int KEY_R = 82; + static const int KEY_S = 83; + static const int KEY_T = 84; + static const int KEY_U = 85; + static const int KEY_V = 86; + static const int KEY_W = 87; + static const int KEY_X = 88; + static const int KEY_Y = 89; + static const int KEY_Z = 90; + + static const int KEY_BACKSPACE = 8; + static const int KEY_RETURN = 13; + // Delete key (use VK_DELETE / common code46) + static const int KEY_DELETE = 46; + + // Arrow keys, Home/End (common VK codes) + static const int KEY_LEFT = 37; + static const int KEY_UP = 38; + static const int KEY_RIGHT = 39; + static const int KEY_DOWN = 40; + static const int KEY_HOME = 36; + static const int KEY_END = 35; + + static const int KEY_F1 = 112; + static const int KEY_F2 = 113; + static const int KEY_F3 = 114; + static const int KEY_F4 = 115; + static const int KEY_F5 = 116; + static const int KEY_F6 = 117; + static const int KEY_F7 = 118; + static const int KEY_F8 = 119; + static const int KEY_F9 = 120; + static const int KEY_F10 = 121; + static const int KEY_F11 = 122; + static const int KEY_F12 = 123; + + static const int KEY_ESCAPE = 27; + static const int KEY_SPACE = 32; + static const int KEY_LSHIFT = 10; + + static bool isKeyDown(int keyCode) { + return _states[keyCode] == KeyboardAction::KEYDOWN; + } + + static void reset() { + _inputs.clear(); + _inputText.clear(); + _index = -1; + _textIndex = -1; + } + + static void feed(unsigned char keyCode, int state) { + _inputs.push_back(KeyboardAction(keyCode, state)); + + _states[keyCode] = state; + } + static void feedText(char character) { + _inputText.push_back(character); + } + + static bool next() { + if (_index + 1 >= (int)_inputs.size()) + return false; + + ++_index; + return true; + } + + static bool nextTextChar() { + if(_textIndex + 1 >= (int)_inputText.size()) + return false; + ++_textIndex; + return true; + } + + static void rewind() { + _index = -1; + _textIndex = -1; + } + + static int getEventKey() { + return _inputs[_index].key; + } + + static int getEventKeyState() { + return _inputs[_index].state; + } + static char getChar() { + return _inputText[_textIndex]; + } +private: + static int _index; + static int _textIndex; + static int _states[256]; + static std::vector _inputs; + static std::vector _inputText; + static bool _inited; +}; + +#endif//KEYBOARD_H__ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/ADDAA969E47C504EB523DF7D24277426/76D3AA2447EA610B5195AD057A0FB522 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/ADDAA969E47C504EB523DF7D24277426/76D3AA2447EA610B5195AD057A0FB522 new file mode 100644 index 0000000..1648185 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/ADDAA969E47C504EB523DF7D24277426/76D3AA2447EA610B5195AD057A0FB522 @@ -0,0 +1,153 @@ +#ifndef KEYBOARD_H__ +#define KEYBOARD_H__ + +#include +#include +#include "../log.h" + +/** A keyboard action; key-down or key-up */ +class KeyboardAction +{ +public: + static const int KEYUP =0; + static const int KEYDOWN =1; + + KeyboardAction(unsigned char keyCode, int state) { + this->key = keyCode; + this->state = state; + } + + int state; + unsigned char key; +}; + +/* Iterators */ +typedef std::vector KeyboardActionVec; +typedef KeyboardActionVec::iterator KeyboardActionIt; +typedef KeyboardActionVec::const_iterator KeyboardActionCIt; + +/** A static keyboard class, written to resemble the one in lwjgl somewhat */ +class Keyboard +{ +public: + static const int KEY_A =65; + static const int KEY_B =66; + static const int KEY_C =67; + static const int KEY_D =68; + static const int KEY_E =69; + static const int KEY_F =70; + static const int KEY_G =71; + static const int KEY_H =72; + static const int KEY_I =73; + static const int KEY_J =74; + static const int KEY_K =75; + static const int KEY_L =76; + static const int KEY_M =77; + static const int KEY_N =78; + static const int KEY_O =79; + static const int KEY_P =80; + static const int KEY_Q =81; + static const int KEY_R =82; + static const int KEY_S =83; + static const int KEY_T =84; + static const int KEY_U =85; + static const int KEY_V =86; + static const int KEY_W =87; + static const int KEY_X =88; + static const int KEY_Y =89; + static const int KEY_Z =90; + + static const int KEY_BACKSPACE =8; + static const int KEY_RETURN =13; + // Delete key (use VK_DELETE / common code46) + static const int KEY_DELETE =46; + + // Arrow keys, Home/End (common VK codes) + static const int KEY_LEFT =37; + static const int KEY_UP =38; + static const int KEY_RIGHT =39; + static const int KEY_DOWN =40; + static const int KEY_HOME =36; + static const int KEY_END =35; + + static const int KEY_F1 =112; + static const int KEY_F2 =113; + static const int KEY_F3 =114; + static const int KEY_F4 =115; + static const int KEY_F5 =116; + static const int KEY_F6 =117; + static const int KEY_F7 =118; + static const int KEY_F8 =119; + static const int KEY_F9 =120; + static const int KEY_F10 =121; + static const int KEY_F11 =122; + static const int KEY_F12 =123; + + static const int KEY_ESCAPE =27; + static const int KEY_SPACE =32; + static const int KEY_LSHIFT =10; + + static bool isKeyDown(int keyCode) { + return _states[keyCode] == KeyboardAction::KEYDOWN; + } + + static void reset() { + _inputs.clear(); + _inputText.clear(); + _index = -1; + _textIndex = -1; + } + + static void feed(unsigned char keyCode, int state) { + // Debug: log incoming key events to help diagnose missing backspace/delete + LOGW("Keyboard::feed key=%d state=%d", (int)keyCode, state); + _inputs.push_back(KeyboardAction(keyCode, state)); + + _states[keyCode] = state; + } + static void feedText(char character) { + // Debug: log incoming text characters to see what the platform sends + LOGW("Keyboard::feedText char=%d ('%c')", (int)(unsigned char)character, (character >=32 && character <127) ? character : '?'); + _inputText.push_back(character); + } + + static bool next() { + if (_index +1 >= (int)_inputs.size()) + return false; + + ++_index; + return true; + } + + static bool nextTextChar() { + if(_textIndex +1 >= (int)_inputText.size()) + return false; + ++_textIndex; + return true; + } + + static void rewind() { + _index = -1; + _textIndex = -1; + } + + static int getEventKey() { + return _inputs[_index].key; + } + + static int getEventKeyState() { + return _inputs[_index].state; + } + static char getChar() { + return _inputText[_textIndex]; + } +private: + static int _index; + static int _textIndex; + static int _states[256]; + static std::vector _inputs; + static std::vector _inputText; + static bool _inited; +}; + +#endif//KEYBOARD_H__ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/ADDAA969E47C504EB523DF7D24277426/C573D6B7F545D6275A7708B6B8C5E73C b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/ADDAA969E47C504EB523DF7D24277426/C573D6B7F545D6275A7708B6B8C5E73C new file mode 100644 index 0000000..474bb2b --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/ADDAA969E47C504EB523DF7D24277426/C573D6B7F545D6275A7708B6B8C5E73C @@ -0,0 +1,318 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 to avoid off-by-one in GUI mapping + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} + +// Forward typed character directly to focused textbox to avoid duplicate definitions +void Screen::keyboardTextEvent() +{ + char c = Keyboard::getChar(); + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + // Some platforms deliver backspace/delete as text characters. Handle control chars here. + if (c == (char)Keyboard::KEY_BACKSPACE || c ==8 || c ==127) { + tb->backspaceAtCaret(); + } else if (c == (char)Keyboard::KEY_DELETE || c ==127) { + tb->deleteAtCaret(); + } else if (c >=32) { + tb->insertChar(c); + } + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Focused textbox editing + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + tb->backspaceAtCaret(); + } + else if (eventKey == Keyboard::KEY_DELETE || eventKey ==127) { + tb->deleteAtCaret(); + } + else if (eventKey == Keyboard::KEY_LEFT) { + tb->moveCaretLeft(); + } + else if (eventKey == Keyboard::KEY_RIGHT) { + tb->moveCaretRight(); + } + else if (eventKey == Keyboard::KEY_HOME) { + tb->moveCaretHome(); + } + else if (eventKey == Keyboard::KEY_END) { + tb->moveCaretEnd(); + } + else if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // position caret based on click + tb->setCaretFromPixel(x, minecraft->font); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height; // removed -1 +} + +// Default implementation for character input (virtual) +void Screen::keyboardNewChar(char inputChar) { + // default: forward to focused textbox is handled in keyboardTextEvent; keep empty here + (void)inputChar; +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/ADDAA969E47C504EB523DF7D24277426/E19DC915D7B7F4D40A50F260C758DAD9 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/ADDAA969E47C504EB523DF7D24277426/E19DC915D7B7F4D40A50F260C758DAD9 new file mode 100644 index 0000000..c45276d --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/ADDAA969E47C504EB523DF7D24277426/E19DC915D7B7F4D40A50F260C758DAD9 @@ -0,0 +1,80 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI__Screen_H__ +#define NET_MINECRAFT_CLIENT_GUI__Screen_H__ + +//package net.minecraft.client.gui; + +#include +#include "GuiComponent.h" + +class Font; +class Minecraft; +class Button; +class TextBox; +struct IntRectangle; + +class Screen: public GuiComponent +{ +public: + Screen(); + + virtual void render(int xm, int ym, float a); + + void init(Minecraft* minecraft, int width, int height); + virtual void init(); + + void setSize(int width, int height); + virtual void setupPositions() {}; + + virtual void updateEvents(); + virtual void mouseEvent(); + virtual void keyboardEvent(); + virtual void keyboardTextEvent(); + virtual bool handleBackEvent(bool isDown); + + virtual void tick() {} + + virtual void removed() {} + + virtual void renderBackground(); + virtual void renderBackground(int vo); + virtual void renderDirtBackground(int vo); + // query + virtual bool renderGameBehind(); + virtual bool hasClippingArea(IntRectangle& out); + + virtual bool isPauseScreen(); + virtual bool isErrorScreen(); + virtual bool isInGameScreen(); + virtual bool closeOnPlayerHurt(); + + virtual void confirmResult(bool result, int id) {} + virtual void lostFocus(); + virtual void toGUICoordinate(int& x, int& y); +protected: + void updateTabButtonSelection(); + + virtual void buttonClicked(Button* button) {} + virtual void mouseClicked(int x, int y, int buttonNum); + virtual void mouseReleased(int x, int y, int buttonNum); + + virtual void keyPressed(int eventKey); + virtual void keyboardNewChar(char inputChar); +public: + int width; + int height; + bool passEvents; + //GuiParticles* particles; +protected: + Minecraft* minecraft; + std::vector buttons; + std::vector textBoxes; + + std::vector tabButtons; + int tabButtonIndex; + + Font* font; +private: + Button* clickedButton; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI__Screen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/0E1E245EA16F1FAA685C5686B18BDD08 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/0E1E245EA16F1FAA685C5686B18BDD08 new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/0E1E245EA16F1FAA685C5686B18BDD08 @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/1CC65E0062271217494E8E6A4C0A58CE b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/1CC65E0062271217494E8E6A4C0A58CE new file mode 100644 index 0000000..bfd810c --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/1CC65E0062271217494E8E6A4C0A58CE @@ -0,0 +1,34 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ +#define NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ + +//package net.minecraft.client.gui; + +#include +#include "../GuiComponent.h" +#include "../../Options.h" + +class Font; +class Minecraft; + +class TextBox: public GuiComponent +{ +public: + TextBox(int id, const std::string& msg); + TextBox(int id, int x, int y, const std::string& msg); + TextBox(int id, int x, int y, int w, int h, const std::string& msg); + + virtual void setFocus(Minecraft* minecraft); + virtual bool loseFocus(Minecraft* minecraft); + + virtual void render(Minecraft* minecraft, int xm, int ym); + +public: + int w, h; + int x, y; + + std::string text; + int id; + bool focused; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/1D11F3CE27B0B595836AB483CC9A0B43 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/1D11F3CE27B0B595836AB483CC9A0B43 new file mode 100644 index 0000000..153fb79 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/1D11F3CE27B0B595836AB483CC9A0B43 @@ -0,0 +1,68 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(0), w(0), h(0), x(0), y(0), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + minecraft->platform()->showKeyboard(); + focused = true; + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + minecraft->platform()->showKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + // Slightly translucent dark background + fill(x, y, x + w, y + h,0x80000000); + // Border + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + + // Draw text. If textbox contains the placeholder (no focus and text equals initial msg), draw dim color + int color =0xe0e0e0; + // If not focused and text is empty or equals default placeholder, draw dimmed + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + // measure available width approximated by character count + int maxChars = std::max(1, (w -8) /6); // approx6 px per char + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/4222F2040602983458B5992A709F7336 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/4222F2040602983458B5992A709F7336 new file mode 100644 index 0000000..ad4d97c --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/4222F2040602983458B5992A709F7336 @@ -0,0 +1,74 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_SCREENS_TOUCH__TouchJoinGameScreen_H__ +#define NET_MINECRAFT_CLIENT_GUI_SCREENS_TOUCH__TouchJoinGameScreen_H__ + +#include "../../Screen.h" +#include "../../components/Button.h" +#include "../../components/SmallButton.h" +#include "../../components/RolledSelectionListV.h" +#include "../../../Minecraft.h" +#include "../../../../platform/input/Multitouch.h" +#include "../../../../network/RakNetInstance.h" + +namespace Touch { + +class JoinGameScreen; + +class AvailableGamesList : public RolledSelectionListV +{ + int startSelected; + int selectedItem; + ServerList copiedServerList; + + friend class JoinGameScreen; + +public: + AvailableGamesList(Minecraft* _minecraft, int _width, int _height) + : RolledSelectionListV(_minecraft, _width, _height, 0, _width, 24, _height, 34), + selectedItem(-1), + startSelected(-1) + { + } + +protected: + + virtual int getNumberOfItems() { return (int)copiedServerList.size(); } + + virtual void selectCancel(); + virtual void selectStart(int item); + virtual void selectItem(int item, bool doubleClick); + + virtual bool isSelectedItem(int item) { return item == selectedItem; } + + virtual void renderBackground() {} + virtual void renderItem(int i, int x, int y, int h, Tesselator& t); +}; + +class JoinGameScreen: public Screen +{ +public: + JoinGameScreen(); + virtual ~JoinGameScreen(); + + void init(); + void setupPositions(); + + virtual bool handleBackEvent(bool isDown); + + virtual bool isIndexValid(int index); + + virtual void tick(); + void render(int xm, int ym, float a); + + void buttonClicked(Button* button); + + bool isInGameScreen(); +private: + Button bJoin; + TButton bBack; + THeader bHeader; + AvailableGamesList* gamesList; +}; + +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_SCREENS_TOUCH__TouchJoinGameScreen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/430CC357A15D4BE1A70387A7C3462A3C b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/430CC357A15D4BE1A70387A7C3462A3C new file mode 100644 index 0000000..92a367b --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/430CC357A15D4BE1A70387A7C3462A3C @@ -0,0 +1,258 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i = 0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0, 0, width, height, 0xc0101010, 0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1, 1, 1, 1); + float s = 32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height, 0, 0, height / s + fvo); + t.vertexUV((float)width, (float)height, 0, width / s, (float)height / s + fvo); + t.vertexUV((float)width, 0, 0, (float)width / s, 0 + fvo); + t.vertexUV(0, 0, 0, 0, 0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex = 0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount - 1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i = 0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; +/* +#if !defined(ANDROID) && !defined(__APPLE__) //if (!minecraft->isTouchscreen()) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); +#endif } +*/ + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + +#if 1 +//#if defined(ANDROID) || defined(__APPLE__) //if (minecraft->isTouchscreen()) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click", 1, 1); + clickedButton->released(x, y); + } + } +# else // } else { + clickedButton->released(x, y); +#endif // } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height - 1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/572513C3D8D309B3634C045C3C8FAC54 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/572513C3D8D309B3634C045C3C8FAC54 new file mode 100644 index 0000000..872695a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/572513C3D8D309B3634C045C3C8FAC54 @@ -0,0 +1,137 @@ +#ifndef KEYBOARD_H__ +#define KEYBOARD_H__ + +#include + +/** A keyboard action; key-down or key-up */ +class KeyboardAction +{ +public: + static const int KEYUP = 0; + static const int KEYDOWN = 1; + + KeyboardAction(unsigned char keyCode, int state) { + this->key = keyCode; + this->state = state; + } + + int state; + unsigned char key; +}; + +/* Iterators */ +typedef std::vector KeyboardActionVec; +typedef KeyboardActionVec::iterator KeyboardActionIt; +typedef KeyboardActionVec::const_iterator KeyboardActionCIt; + +/** A static keyboard class, written to resemble the one in lwjgl somewhat */ +class Keyboard +{ +public: + static const int KEY_A = 65; + static const int KEY_B = 66; + static const int KEY_C = 67; + static const int KEY_D = 68; + static const int KEY_E = 69; + static const int KEY_F = 70; + static const int KEY_G = 71; + static const int KEY_H = 72; + static const int KEY_I = 73; + static const int KEY_J = 74; + static const int KEY_K = 75; + static const int KEY_L = 76; + static const int KEY_M = 77; + static const int KEY_N = 78; + static const int KEY_O = 79; + static const int KEY_P = 80; + static const int KEY_Q = 81; + static const int KEY_R = 82; + static const int KEY_S = 83; + static const int KEY_T = 84; + static const int KEY_U = 85; + static const int KEY_V = 86; + static const int KEY_W = 87; + static const int KEY_X = 88; + static const int KEY_Y = 89; + static const int KEY_Z = 90; + + static const int KEY_BACKSPACE = 8; + static const int KEY_RETURN = 13; + + static const int KEY_F1 = 112; + static const int KEY_F2 = 113; + static const int KEY_F3 = 114; + static const int KEY_F4 = 115; + static const int KEY_F5 = 116; + static const int KEY_F6 = 117; + static const int KEY_F7 = 118; + static const int KEY_F8 = 119; + static const int KEY_F9 = 120; + static const int KEY_F10 = 121; + static const int KEY_F11 = 122; + static const int KEY_F12 = 123; + + static const int KEY_ESCAPE = 27; + static const int KEY_SPACE = 32; + static const int KEY_LSHIFT = 10; + + static bool isKeyDown(int keyCode) { + return _states[keyCode] == KeyboardAction::KEYDOWN; + } + + static void reset() { + _inputs.clear(); + _inputText.clear(); + _index = -1; + _textIndex = -1; + } + + static void feed(unsigned char keyCode, int state) { + _inputs.push_back(KeyboardAction(keyCode, state)); + + _states[keyCode] = state; + } + static void feedText(char character) { + _inputText.push_back(character); + } + + static bool next() { + if (_index + 1 >= (int)_inputs.size()) + return false; + + ++_index; + return true; + } + + static bool nextTextChar() { + if(_textIndex + 1 >= (int)_inputText.size()) + return false; + ++_textIndex; + return true; + } + + static void rewind() { + _index = -1; + _textIndex = -1; + } + + static int getEventKey() { + return _inputs[_index].key; + } + + static int getEventKeyState() { + return _inputs[_index].state; + } + static char getChar() { + return _inputText[_textIndex]; + } +private: + static int _index; + static int _textIndex; + static int _states[256]; + static std::vector _inputs; + static std::vector _inputText; + static bool _inited; +}; + +#endif//KEYBOARD_H__ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/63FF9D77DCF72D5017BC28919FD3C547 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/63FF9D77DCF72D5017BC28919FD3C547 new file mode 100644 index 0000000..5322d51 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/63FF9D77DCF72D5017BC28919FD3C547 @@ -0,0 +1,68 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(0), w(0), h(0), x(0), y(0), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + minecraft->platform()->showKeyboard(); + focused = true; + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + minecraft->platform()->showKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + // Slightly translucent dark background + fill(x, y, x + w, y + h,0x80000000); + // Border + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + + // Draw text. If textbox contains the placeholder (no focus and text equals initial msg), draw dim color + int color =0xe0e0e0; + // If not focused and text is empty or equals default placeholder, draw dimmed + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + // measure available width approximated by character count + int maxChars = (std::max)(1, (w -8) /6); // approx6 px per char + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/72B2752C7CD663CF9A1CC0178EF19114 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/72B2752C7CD663CF9A1CC0178EF19114 new file mode 100644 index 0000000..c9f6e6a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/72B2752C7CD663CF9A1CC0178EF19114 @@ -0,0 +1,1563 @@ +#include "Minecraft.h" + +#if defined(APPLE_DEMO_PROMOTION) + #define NO_NETWORK +#endif + +#if defined(RPI) + #define CREATORMODE +#endif + +#include "../network/RakNetInstance.h" +#include "../network/ClientSideNetworkHandler.h" +#include "../network/ServerSideNetworkHandler.h" +//#include "../network/Packet.h" +#include "../world/entity/player/Inventory.h" +#include "../world/level/chunk/ChunkCache.h" +#include "../world/level/tile/Tile.h" +#include "../world/level/storage/LevelStorageSource.h" +#include "../world/level/storage/LevelStorage.h" +#include "player/input/KeyboardInput.h" +#ifndef STANDALONE_SERVER +#include "player/input/touchscreen/TouchInputHolder.h" +#endif +#include "player/LocalPlayer.h" +#include "gamemode/CreativeMode.h" +#include "gamemode/SurvivalMode.h" +#include "player/LocalPlayer.h" +#ifndef STANDALONE_SERVER +#include "particle/ParticleEngine.h" +#include "gui/Screen.h" +#include "gui/Font.h" +#include "gui/screens/RenameMPLevelScreen.h" +#include "sound/SoundEngine.h" +#endif +#include "../platform/CThread.h" +#include "../platform/input/Mouse.h" +#include "../AppPlatform.h" +#include "../Performance.h" +#include "../LicenseCodes.h" +#include "../util/PerfTimer.h" +#include "../util/PerfRenderer.h" +#include "player/input/MouseBuildInput.h" + +#include "../world/Facing.h" + +#include "../network/packet/PlaceBlockPacket.h" + +#include "player/input/IInputHolder.h" +#ifndef STANDALONE_SERVER +#include "player/input/touchscreen/TouchscreenInput.h" + +#include "player/input/ControllerTurnInput.h" +#include "player/input/XperiaPlayInput.h" + +#endif + +#include "player/input/MouseTurnInput.h" +#include "../world/entity/MobFactory.h" +#include "../world/level/MobSpawner.h" +#include "../util/Mth.h" +#include "../network/packet/InteractPacket.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/PrerenderTilesScreen.h" +#include "renderer/Textures.h" +#include "gui/screens/DeathScreen.h" +#endif + +#include "../network/packet/RespawnPacket.h" +#include "IConfigListener.h" +#include "../world/entity/MobCategory.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/FurnaceScreen.h" +#endif +#include "../world/Difficulty.h" +#include "../server/ServerLevel.h" +#ifdef CREATORMODE +#include "../server/CreatorLevel.h" +#endif +#include "../network/packet/AdventureSettingsPacket.h" +#include "../network/packet/SetSpawnPositionPacket.h" +#include "../network/command/CommandServer.h" +#include "gamemode/CreatorMode.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/ArmorScreen.h" +#endif +#include "../world/level/levelgen/synth/ImprovedNoise.h" +#ifndef STANDALONE_SERVER +#include "renderer/tileentity/TileEntityRenderDispatcher.h" +#endif + +#ifndef STANDALONE_SERVER +#include "renderer/ptexture/DynamicTexture.h" +#include "renderer/GameRenderer.h" +#include "renderer/ItemInHandRenderer.h" +#include "renderer/LevelRenderer.h" +#include "renderer/entity/EntityRenderDispatcher.h" +#include "gui/Screen.h" +#include "gui/Font.h" +#include "gui/screens/RenameMPLevelScreen.h" +#include "sound/SoundEngine.h" +#endif + +static void checkGlError(const char* tag) { +#ifdef GLDEBUG + while (1) { + const int errCode = glGetError(); + if (errCode == GL_NO_ERROR) break; + + LOGE("################\nOpenGL-error @ %s : #%d\n", tag, errCode); + } +#endif /*GLDEBUG*/ +} + +/*static*/ +const char* Minecraft::progressMessages[] = { + "Locating server", + "Building terrain", + "Preparing", + "Saving chunks" +}; + +int Minecraft::customDebugId = Minecraft::CDI_NONE; + +#if defined(_MSC_VER) + #pragma warning( disable : 4355 ) // 'this' pointer in initialization list which is perfectly legal +#endif + +bool Minecraft::useAmbientOcclusion = false; + +Minecraft::Minecraft() +: user(NULL), + level(NULL), + player(NULL), + cameraTargetPlayer(NULL), + levelRenderer(NULL), + gameRenderer(NULL), +#ifndef STANDALONE_SERVER + particleEngine(NULL), + _perfRenderer(NULL), +#endif + _commandServer(NULL), +#ifndef STANDALONE_SERVER + textures(NULL), +#endif + lastTickTime(-1), + lastTime(0), + ticksSinceLastUpdate(0), + gameMode(NULL), + mouseGrabbed(true), + missTime(0), + pause(false), + _running(false), + timer(20), +#ifndef STANDALONE_SERVER + gui(this), +#endif + netCallback(NULL), +#ifndef STANDALONE_SERVER + screen(NULL), + font(NULL), +#endif + screenMutex(false), +#ifndef STANDALONE_SERVER + scheduledScreen(NULL), + hasScheduledScreen(false), + soundEngine(NULL), +#endif + ticks(0), + isGeneratingLevel(false), + _hasSignaledGeneratingLevelFinished(true), + generateLevelThread(NULL), + progressStagePercentage(0), + progressStageStatusId(0), + isLookingForMultiplayer(false), + _licenseId(LicenseCodes::WAIT_PLATFORM_NOT_READY), + inputHolder(0), + _supportsNonTouchscreen(false), +#ifndef STANDALONE_SERVER + screenChooser(this), +#endif + width(1), height(1), + //_respawnPlayerTicks(-1), +#ifdef __APPLE__ + _isSuperFast(false), +#endif + _powerVr(false), + commandPort(4711), + reserved_d1(0),reserved_d2(0), + reserved_f1(0),reserved_f2(0) +{ +//#ifdef ANDROID + +#if defined(NO_NETWORK) + raknetInstance = new IRakNetInstance(); +#else + raknetInstance = new RakNetInstance(); +#endif +#ifndef STANDALONE_SERVER + soundEngine = new SoundEngine(20.0f); + soundEngine->init(this, &options); +#endif + //setupPieces(); +} + +Minecraft::~Minecraft() +{ + delete netCallback; + delete raknetInstance; +#ifndef STANDALONE_SERVER + delete levelRenderer; + delete gameRenderer; + delete particleEngine; + + delete soundEngine; +#endif + delete gameMode; +#ifndef STANDALONE_SERVER + delete font; + delete textures; + + if (screen != NULL) { + delete screen; + screen = NULL; + } +#endif + if (level != NULL) { + level->saveGame(); + if (level->getChunkSource()) + level->getChunkSource()->saveAll(true); + delete level->getLevelStorage(); + delete level; + level = NULL; + } + + //delete player; + delete user; + delete inputHolder; + + delete storageSource; + delete _perfRenderer; + delete _commandServer; + + MobFactory::clearStaticTestMobs(); +#ifndef STANDALONE_SERVER + EntityRenderDispatcher::destroy(); +#endif +} + +// Only called by server +void Minecraft::selectLevel( const std::string& levelId, const std::string& levelName, const LevelSettings& settings ) +{ +#if defined(CREATORMODE) + level = new CreatorLevel( +#else + level = new ServerLevel( +#endif + storageSource->selectLevel(levelId, false), + levelName, + settings, + SharedConstants::GeneratorVersion); + + // note: settings is useless beyond this point, since it's + // either copied to LevelData (or LevelData read from file) + setLevel(level, "Generating level"); + setIsCreativeMode(level->getLevelData()->getGameType() == GameType::Creative); + _running = true; +} + +void Minecraft::setLevel(Level* level, const std::string& message /* ="" */, LocalPlayer* forceInsertPlayer /* = NULL */) { + cameraTargetPlayer = NULL; + LOGI("Seed is %ld\n", level->getSeed()); + + if (level != NULL) { + level->raknetInstance = raknetInstance; + gameMode->initLevel(level); + + if (!player && forceInsertPlayer) + { + player = forceInsertPlayer; + player->resetPos(false); + //level->addEntity(forceInsertPlayer); + } + else if (player != NULL) { + player->resetPos(false); + if (level != NULL) { + level->addEntity(player); + } + } + this->level = level; + _hasSignaledGeneratingLevelFinished = false; +#ifdef STANDALONE_SERVER + const bool threadedLevelCreation = false; +#else + const bool threadedLevelCreation = true; +#endif + + if (threadedLevelCreation) { + // Threaded + // "Lock" + isGeneratingLevel = true; + generateLevelThread = new CThread(Minecraft::prepareLevel_tspawn, this); + } else { + // Non-threaded + generateLevel("Currently not used", level); + } + } else { + player = NULL; + } + + this->lastTickTime = 0; + this->_running = true; +} + +void Minecraft::leaveGame(bool renameLevel /*=false*/) +{ + if (isGeneratingLevel || !_hasSignaledGeneratingLevelFinished) + return; + + isGeneratingLevel = false; + bool saveLevel = level && (!level->isClientSide || renameLevel); + + raknetInstance->disconnect(); + if (saveLevel) { + // If server or wanting to save level as client, save all unsaved chunks! + level->getChunkSource()->saveAll(true); + } + + LOGI("Clearing levels\n"); + + cameraTargetPlayer = NULL; +#ifndef STANDALONE_SERVER + levelRenderer->setLevel(NULL); + particleEngine->setLevel(NULL); +#endif + LOGI("Erasing callback\n"); + delete netCallback; + netCallback = NULL; + + LOGI("Erasing level\n"); + if (level != NULL) { + delete level->getLevelStorage(); + delete level; + level = NULL; + } + //delete player; + player = NULL; + cameraTargetPlayer = NULL; + + _running = false; +#ifndef STANDALONE_SERVER + if (renameLevel) { + setScreen(new RenameMPLevelScreen(LevelStorageSource::TempLevelId)); + } + else + screenChooser.setScreen(SCREEN_STARTMENU); +#endif +} + +void Minecraft::prepareLevel(const std::string& title) { + LOGI("status: 1\n"); + progressStageStatusId = 1; + + Stopwatch A, B, C, D; + A.start(); + + Stopwatch L; + + // Dont update lights if we load the level (ok, actually just with leveldata version=1.+(?)) + if (!level->isNew()) + level->setUpdateLights(false); + + int Max = CHUNK_CACHE_WIDTH * CHUNK_CACHE_WIDTH; + int pp = 0; + for (int x = 8; x < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); x += CHUNK_WIDTH) { + for (int z = 8; z < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); z += CHUNK_WIDTH) { + progressStagePercentage = 100 * pp++ / Max; + //printf("level generation progress %d\n", progressStagePercentage); + B.start(); + level->getTile(x, 64, z); + B.stop(); + L.start(); + if (level->isNew()) + while (level->updateLights()) + ; + L.stop(); + } + } + A.stop(); + level->setUpdateLights(true); + + C.start(); + for (int x = 0; x < CHUNK_CACHE_WIDTH; x++) + { + for (int z = 0; z < CHUNK_CACHE_WIDTH; z++) + { + LevelChunk* chunk = level->getChunk(x, z); + if (chunk && !chunk->createdFromSave) + { + chunk->unsaved = false; + chunk->clearUpdateMap(); + } + } + } + C.stop(); + + LOGI("status: 3\n"); + progressStageStatusId = 3; + if (level->isNew()) { + level->setInitialSpawn(); // @note: should obviously be called from Level itself + level->saveLevelData(); + level->getChunkSource()->saveAll(false); + level->saveGame(); + } else { + level->saveLevelData(); + level->loadEntities(); + } + + progressStagePercentage = -1; + progressStageStatusId = 2; + LOGI("status: 2\n"); + + D.start(); + level->prepare(); + D.stop(); + + A.print("Generate level: "); + L.print(" - light: "); + B.print(" - getTl: "); + C.print(" - clear: "); + D.print(" - prepr: "); + progressStageStatusId = 0; +} + +void Minecraft::update() { + //LOGI("Enter Update\n"); + + if (Options::debugGl) + LOGI(">>>>>>>>>>\n"); + + TIMER_PUSH("root"); + + //if (level) { + // LOGI("numplayers: %d\n", level->players.size()); + // for (int i = 0; i < level->players.size(); ++i) { + // Player* p = level->players[i]; + // bool inEnt = std::find(level->entities.begin(), level->entities.end(), p) != level->entities.end(); + // LOGI(" %p, %d, %d - in? %d\n", p, p->entityId, p->owner.ToUint32(p->owner), inEnt); + // } + //} + + if (pause && level != NULL) { + float lastA = timer.a; + timer.advanceTime(); + timer.a = lastA; + } else { + timer.advanceTime(); + } + + if (raknetInstance) { + raknetInstance->runEvents(netCallback); + } + + TIMER_PUSH("tick"); + int toTick = timer.ticks; + for (int i = 0; i < toTick; ++i, ++ticks) + tick(i, toTick-1); + + TIMER_POP_PUSH("updatelights"); + if (level && !isGeneratingLevel) { + level->updateLights(); + } + TIMER_POP(); + + #ifndef STANDALONE_SERVER + if (gameMode != NULL) gameMode->render(timer.a); + TIMER_PUSH("sound"); + soundEngine->update(player, timer.a); + TIMER_POP_PUSH("render"); + gameRenderer->render(timer.a); + TIMER_POP(); + #else + CThread::sleep(1); + #endif +#ifndef STANDALONE_SERVER + Multitouch::resetThisUpdate(); +#endif + TIMER_POP(); +#ifndef STANDALONE_SERVER + checkGlError("Update finished"); + + if (options.renderDebug) { + if (!PerfTimer::enabled) { + PerfTimer::reset(); + PerfTimer::enabled = true; + } + + //TIMER_PUSH("debugfps"); + _perfRenderer->renderFpsMeter(1); + checkGlError("render debug"); + //TIMER_POP(); + } else { + PerfTimer::enabled = false; + } +#endif + //LOGI("Exit Update\n"); +} + +void Minecraft::tick(int nTick, int maxTick) { + if (missTime > 0) missTime--; +#ifndef STANDALONE_SERVER + if (!screen && player) { + if (player->health <= 0) { + setScreen(new DeathScreen()); + } + } +#endif + TIMER_PUSH("gameMode"); + if (level && !pause) { + gameMode->tick(); + } + + TIMER_POP_PUSH("commandServer"); + if (level && _commandServer) { + _commandServer->tick(); + } + + TIMER_POP_PUSH("input"); + tickInput(); +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("gui"); + gui.tick(); +#endif + // + // Ongoing level generation in a (perhaps) different thread. When it's + // ready, _levelGenerated() is called once and any threads are deleted. + // + if (isGeneratingLevel) { + return; + } else if (!_hasSignaledGeneratingLevelFinished) { + if (generateLevelThread) { + delete generateLevelThread; + generateLevelThread = NULL; + } + _levelGenerated(); + } + + // + // Normal game loop, run before or efter level generation + // + if (level != NULL) + { + if (!pause) { +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("gameRenderer"); + gameRenderer->tick(nTick, maxTick); + + TIMER_POP_PUSH("levelRenderer"); + levelRenderer->tick(); +#endif + level->difficulty = options.difficulty; + if (level->isClientSide) level->difficulty = Difficulty::EASY; + + TIMER_POP_PUSH("level"); + level->tickEntities(); + level->tick(); +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("animateTick"); + if (player) { + level->animateTick(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); + } +#endif + } + } +#ifndef STANDALONE_SERVER + textures->loadAndBindTexture("terrain.png"); + if (!pause && !(screen && !screen->renderGameBehind())) { + #if !defined(RPI) + #ifdef __APPLE__ + if (isSuperFast()) + #endif + { + if (nTick == maxTick) { + TIMER_POP_PUSH("textures"); + textures->tick(true); + } + } + #endif + } + TIMER_POP_PUSH("particles"); + particleEngine->tick(); + if (screen) { + screenMutex = true; + screen->tick(); + screenMutex = false; + } + + // @note: fix to keep "isPressed" and "isReleased" as long as necessary. + // Most likely keyboard and mouse could/should be reset here as well. + Multitouch::reset(); +#endif + TIMER_POP(); +} + +class InputRAII { +public: + ~InputRAII() { +#ifndef STANDALONE_SERVER + Mouse::reset(); + Keyboard::reset(); +#endif + } +}; + +void Minecraft::tickInput() { +#ifndef STANDALONE_SERVER + InputRAII raiiInput; + + if (screen && !screen->passEvents) { + screenMutex = true; + screen->updateEvents(); + //screen->updateSetScreen(); + screenMutex = false; + if (hasScheduledScreen) { + setScreen(scheduledScreen); + scheduledScreen = NULL; + hasScheduledScreen = false; + } + return; + } + + if (!player) { + return; + } + +#ifdef RPI + bool mouseDiggable = true; + bool allowGuiClicks = !mouseGrabbed; +#else + bool mouseDiggable = !gui.isInside(Mouse::getX(), Mouse::getY()); + bool allowGuiClicks = true; +#endif + + TIMER_PUSH("mouse"); + while (Mouse::next()) { + //if (Mouse::getButtonState(MouseAction::ACTION_LEFT)) + // LOGI("mouse-down-at: %d, %d\n", Mouse::getX(), Mouse::getY()); + int passedTime = getTimeMs() - lastTickTime; + if (passedTime > 200) continue; // @note: As long Mouse::clear CLEARS the whole buffer, it's safe to break here + // But since it might be rewritten anyway (and hopefully there aren't a lot of messages, we just continue. + + const MouseAction& e = Mouse::getEvent(); + +#ifdef RPI // If clicked when not having focus, get focus @keyboard + if (!mouseGrabbed) { + if (!screen && e.data == MouseAction::DATA_DOWN) { + grabMouse(); + } + } +#endif + + if (allowGuiClicks && e.action == MouseAction::ACTION_LEFT && e.data == MouseAction::DATA_DOWN) { + gui.handleClick(MouseAction::ACTION_LEFT, Mouse::getX(), Mouse::getY()); + } + + if (e.action == MouseAction::ACTION_WHEEL) { + Inventory* v = player->inventory; + int numSlots = gui.getNumSlots() - 1; + int slot = (v->selected - e.dy + numSlots) % numSlots; + v->selectSlot(slot); + } + /* + if (mouseDiggable && options.useMouseForDigging) { + if (Mouse::getEventButton() == MouseAction::ACTION_LEFT && Mouse::getEventButtonState()) { + handleMouseClick(MouseAction::ACTION_LEFT); + lastClickTick = ticks; + } + if (Mouse::getEventButton() == MouseAction::ACTION_RIGHT && Mouse::getEventButtonState()) { + handleMouseClick(MouseAction::ACTION_RIGHT); + lastClickTick = ticks; + } + } + */ + } + + TIMER_POP_PUSH("keyboard"); + while (Keyboard::next()) { + int key = Keyboard::getEventKey(); + bool isPressed = (Keyboard::getEventKeyState() == KeyboardAction::KEYDOWN); + player->setKey(key, isPressed); + + if (isPressed) { + gui.handleKeyPressed(key); + + #if defined(WIN32) || defined(RPI)//|| defined(_DEBUG) || defined(DEBUG) + if (key >= '0' && key <= '9') { + int digit = key - '0'; + int slot = digit - 1; + + if (slot >= 0 && slot < gui.getNumSlots()-1) + player->inventory->selectSlot(slot); + + #if defined(WIN32) + if (digit >= 1 && GetAsyncKeyState(VK_CONTROL) < 0) { + // Set adventure settings here! + AdventureSettingsPacket p(level->adventureSettings); + p.toggle((AdventureSettingsPacket::Flags)(1 << slot)); + p.fillIn(level->adventureSettings); + raknetInstance->send(p); + } + if (digit == 0) { + Pos pos((int)player->x, (int)player->y-1, (int)player->z); + SetSpawnPositionPacket p(pos); + raknetInstance->send(p); + } + #endif + } + #endif + #if defined(RPI) + if (key == Keyboard::KEY_E) { + screenChooser.setScreen(SCREEN_BLOCKSELECTION); + } + if (!screen && key == Keyboard::KEY_O || key == 250) { + releaseMouse(); + } + #endif + #if defined(WIN32) + if (key == Keyboard::KEY_F) { + options.isFlying = !options.isFlying; + player->noPhysics = options.isFlying; + } + + if (key == Keyboard::KEY_T) { + options.thirdPersonView = !options.thirdPersonView; + /* + ImprovedNoise noise; + for (int i = 0; i < 16; ++i) + printf("%d\t%f\n", i, noise.grad2(i, 3, 8)); + */ + } + + if (key == Keyboard::KEY_O) { + useAmbientOcclusion = !useAmbientOcclusion; + options.ambientOcclusion = useAmbientOcclusion; + levelRenderer->allChanged(); + } + + if (key == Keyboard::KEY_L) + options.viewDistance = (options.viewDistance + 1) % 4; + + if (key == Keyboard::KEY_U) { + onGraphicsReset(); + player->heal(100); + } + + if (key == Keyboard::KEY_B || key == 108) // Toggle the game mode + setIsCreativeMode(!isCreativeMode()); + + if (key == Keyboard::KEY_P) // Step forward in time + level->setTime( level->getTime() + 1000); + + if (key == Keyboard::KEY_G) { + setScreen(new ArmorScreen()); + /* + std::vector& boxs = level->getCubes(NULL, AABB(128.1f, 73, 128.1f, 128.9f, 74.9f, 128.9f)); + LOGI("boxes: %d\n", (int)boxs.size()); + */ + } + + if (key == Keyboard::KEY_Y) { + textures->reloadAll(); + player->hurtTo(2); + } + if (key == Keyboard::KEY_Z || key == 108) { + for (int i = 0; i < 1; ++i) { + Mob* mob = NULL; + int forceId = 0;//MobTypes::Sheep; + + int types[] = { + MobTypes::Sheep, + MobTypes::Pig, + MobTypes::Chicken, + MobTypes::Cow, + }; + + int mobType = (forceId > 0)? forceId : types[Mth::random(sizeof(types) / sizeof(int))]; + mob = MobFactory::CreateMob(mobType, level); + + //((Animal*)mob)->setAge(-1000); + float dx = 4 - 8 * Mth::random() + 4 * Mth::sin(Mth::DEGRAD * player->yRot); + float dz = 4 - 8 * Mth::random() + 4 * Mth::cos(Mth::DEGRAD * player->yRot); + if (mob && !MobSpawner::addMob(level, mob, player->x + dx, player->y, player->z + dz, Mth::random()*360, 0, true)) + delete mob; + } + } + + if (key == Keyboard::KEY_X) { + const EntityList& entities = level->getAllEntities(); + for (int i = entities.size()-1; i >= 0; --i) { + Entity* e = entities[i]; + if (!e->isPlayer()) + level->removeEntity(e); + } + } + + if (key == Keyboard::KEY_C /*|| key == 4*/) { + player->inventory->clearInventoryWithDefault(); + // @todo: Add saving here for benchmarking + } + if (key == Keyboard::KEY_H) { + setScreen( new PrerenderTilesScreen() ); + } + + if (key == Keyboard::KEY_O) { + for (int i = Inventory::MAX_SELECTION_SIZE; i < player->inventory->getContainerSize(); ++i) + if (player->inventory->getItem(i)) + player->inventory->dropSlot(i, false); + } + if (key == Keyboard::KEY_F3) { + options.renderDebug = !options.renderDebug; + } + if (key == Keyboard::KEY_M) { + options.difficulty = (options.difficulty == Difficulty::PEACEFUL)? + Difficulty::NORMAL : Difficulty::PEACEFUL; + //setIsCreativeMode( !isCreativeMode() ); + } + + // lanternroci + if (key == Keyboard::KEY_ESCAPE) + pauseGame(false); + if (key == Keyboard::KEY_E && !options.isFlying) { + screenChooser.setScreen(SCREEN_BLOCKSELECTION); + } + + if (options.renderDebug) { + if (key >= '0' && key <= '9') { + _perfRenderer->debugFpsMeterKeyPress(key - '0'); + } + } + #endif + + #ifndef RPI + if (key == 82) + pauseGame(false); + #else + if (key == Keyboard::KEY_ESCAPE) + pauseGame(false); + #endif + + #ifndef OPENGL_ES + if (key == Keyboard::KEY_P) { + static bool isWireFrame = false; + isWireFrame = !isWireFrame; + glPolygonMode(GL_FRONT, isWireFrame? GL_LINE : GL_FILL); + //glPolygonMode(GL_BACK, isWireFrame? GL_LINE : GL_FILL); + } + #endif + } + #ifdef WIN32 + if (key == Keyboard::KEY_M) { + for (int i = 0; i < 5 * SharedConstants::TicksPerSecond; ++i) + level->tick(); + } + #endif + + + //if (!isPressed) LOGI("Key released: %d\n", key); + + if (!options.useMouseForDigging) { + int passedTime = getTimeMs() - lastTickTime; + if (passedTime > 200) continue; + + // Destroy and attack is on same button + if (key == options.keyDestroy.key && isPressed) { + BuildActionIntention bai(BuildActionIntention::BAI_REMOVE | BuildActionIntention::BAI_ATTACK); + handleBuildAction(&bai); + } + else // Build and use/interact is on same button + if (key == options.keyUse.key && isPressed) { + BuildActionIntention bai(BuildActionIntention::BAI_BUILD | BuildActionIntention::BAI_INTERACT); + handleBuildAction(&bai); + } + } + } + + TIMER_POP_PUSH("tickbuild"); + BuildActionIntention bai; + // @note: This might be a problem. This method is polling based here, but + // event based when using mouse (or keys..), and in java. Not quite + // sure just yet what way to go. + bool buildHandled = inputHolder->getBuildInput()->tickBuild(player, &bai); + if (buildHandled) { + if (!bai.isRemoveContinue()) + handleBuildAction(&bai); + } + + bool isTryingToDestroyBlock = (options.useMouseForDigging + ? (Mouse::isButtonDown(MouseAction::ACTION_LEFT) && mouseDiggable) + : Keyboard::isKeyDown(options.keyDestroy.key)) + || (buildHandled && bai.isRemove()); + + TIMER_POP_PUSH("handlemouse"); +#ifdef RPI + handleMouseDown(MouseAction::ACTION_LEFT, isTryingToDestroyBlock); + handleMouseClick(buildHandled && bai.isInteract() + || options.useMouseForDigging && Mouse::isButtonDown(MouseAction::ACTION_RIGHT)); +#else + handleMouseDown(MouseAction::ACTION_LEFT, isTryingToDestroyBlock || (buildHandled && bai.isInteract())); +#endif + + lastTickTime = getTimeMs(); + + // we have (hopefully) handled the keyboard & mouse queue and it + // can now be emptied. If wanted, the reset could be changed to: + // index -= numRead; // then this code doesn't have to be placed here + // + it prepares for tick not handling all or any events. + // update: RAII'ing instead, see above + //Keyboard::reset(); + //Mouse::reset(); + + TIMER_POP(); +#endif +} + +void Minecraft::handleMouseDown(int button, bool down) { +#ifndef STANDALONE_SERVER +#ifndef RPI + if(player->isUsingItem()) { + if(!down && !Keyboard::isKeyDown(options.keyUse.key)) { + gameMode->releaseUsingItem(player); + } + return; + } +#endif + if(player->isSleeping()) { + return; + } + if (button == MouseAction::ACTION_LEFT && missTime > 0) return; + if (down && hitResult.type == TILE && button == MouseAction::ACTION_LEFT && !hitResult.indirectHit) { + int x = hitResult.x; + int y = hitResult.y; + int z = hitResult.z; + gameMode->continueDestroyBlock(x, y, z, hitResult.f); + particleEngine->crack(x, y, z, hitResult.f); + player->swing(); + } else { + gameMode->stopDestroyBlock(); + } +#endif +} + +void Minecraft::handleMouseClick(int button) { +// BuildActionIntention bai( +// (button == MouseAction::ACTION_LEFT)? +// BuildActionIntention::BAI_REMOVE +// : BuildActionIntention::BAI_BUILD); +// +// handleBuildAction(&bai); +} + +void Minecraft::handleBuildAction(BuildActionIntention* action) { +#ifndef STANDALONE_SERVER + if (action->isRemove()) { + if (missTime > 0) return; + player->swing(); + } + if(player->isUsingItem()) + return; + bool mayUse = true; + + if (!hitResult.isHit()) { + if (action->isRemove() && !gameMode->isCreativeType()) { + missTime = 10; + } + } else if (hitResult.type == ENTITY) { + if (action->isAttack()) { + player->swing(); + //LOGI("attacking!\n"); + InteractPacket packet(InteractPacket::Attack, player->entityId, hitResult.entity->entityId); + raknetInstance->send(packet); + gameMode->attack(player, hitResult.entity); + } else if (action->isInteract()) { + if (hitResult.entity->interactPreventDefault()) + mayUse = false; + //LOGI("interacting!\n"); + InteractPacket packet(InteractPacket::Interact, player->entityId, hitResult.entity->entityId); + raknetInstance->send(packet); + gameMode->interact(player, hitResult.entity); + } + } else if (hitResult.type == TILE) { + int x = hitResult.x; + int y = hitResult.y; + int z = hitResult.z; + int face = hitResult.f; + + int oldTileId = level->getTile(x, y, z); + Tile* oldTile = Tile::tiles[oldTileId]; + + //bool tryDestroyBlock = false; + + if (action->isRemove()) { + if (!oldTile) + return; + + //LOGI("tile: %s - %d, %d, %d. b: %f - %f\n", oldTile->getDescriptionId().c_str(), x, y, z, oldTile->getBrightness(level, x, y, z), oldTile->getBrightness(level, x, y+1, z)); + level->extinguishFire(x, y, z, hitResult.f); + gameMode->startDestroyBlock(x, y, z, hitResult.f); + } + else { + ItemInstance* item = player->inventory->getSelected(); + if (gameMode->useItemOn(player, level, item, x, y, z, face, hitResult.pos)) { + mayUse = false; + player->swing(); + #ifdef RPI + } else if (item && item->id == ((Item*)Item::sword_iron)->id) { + player->swing(); + #endif + } + if (item && item->count <= 0) { + player->inventory->clearSlot(player->inventory->selected); + } + //} else if (item && item->count != oldCount) { + // gameRenderer->itemInHandRenderer->itemPlaced(); + //} + } + } + if (mayUse && action->isInteract()) { + ItemInstance* item = player->inventory->getSelected(); + if (item && !player->isUsingItem()) { + if (gameMode->useItem(player, level, item)) { + gameRenderer->itemInHandRenderer->itemUsed(); + } + if (item && item->count <= 0) { + player->inventory->clearSlot(player->inventory->selected); + } + } + } +#endif +} + +bool Minecraft::isOnlineClient() +{ + return (level != NULL && level->isClientSide); +} + +bool Minecraft::isOnline() +{ + return netCallback != NULL; +} + +void Minecraft::pauseGame(bool isBackPaused) { +#ifndef STANDALONE_SERVER + if (screen != NULL) return; + screenChooser.setScreen(isBackPaused? SCREEN_PAUSEPREV : SCREEN_PAUSE); +#endif +} +void Minecraft::gameLostFocus() { +#ifndef STANDALONE_SERVER + if(screen != NULL) { + screen->lostFocus(); + } +#endif +} + + +void Minecraft::setScreen( Screen* screen ) +{ +#ifndef STANDALONE_SERVER + Mouse::reset(); + Multitouch::reset(); + Multitouch::resetThisUpdate(); + + if (screenMutex) { + hasScheduledScreen = true; + scheduledScreen = screen; + return; + } + + if (screen != NULL && screen->isErrorScreen()) + return; + if (screen == NULL && level == NULL) + screen = screenChooser.createScreen(SCREEN_STARTMENU); + + if (this->screen != NULL) { + this->screen->removed(); + delete this->screen; + } + + this->screen = screen; + if (screen != NULL) { + releaseMouse(); + //ScreenSizeCalculator ssc = new ScreenSizeCalculator(options, width, height); + int screenWidth = (int)(width * Gui::InvGuiScale); //ssc.getWidth(); + int screenHeight = (int)(height * Gui::InvGuiScale); //ssc.getHeight(); + screen->init(this, screenWidth, screenHeight); + + if (screen->isInGameScreen() && level) { + level->saveLevelData(); + level->saveGame(); + } + + //noRender = false; + } else { + grabMouse(); + } +#endif +} + +void Minecraft::grabMouse() +{ +#ifndef STANDALONE_SERVER + if (mouseGrabbed) return; + mouseGrabbed = true; + mouseHandler.grab(); + //setScreen(NULL); +#endif +} + +void Minecraft::releaseMouse() +{ +#ifndef STANDALONE_SERVER + if (!mouseGrabbed) { + return; + } + if (player) { + player->releaseAllKeys(); + } + mouseGrabbed = false; + mouseHandler.release(); +#endif +} + +bool Minecraft::useTouchscreen() { +#ifdef RPI + return false; +#endif + return options.useTouchScreen || !_supportsNonTouchscreen; +} +bool Minecraft::supportNonTouchScreen() { + return _supportsNonTouchscreen; +} +void Minecraft::init() +{ + options.minecraft = this; + options.initDefaultValues(); +#ifndef STANDALONE_SERVER + checkGlError("Init enter"); + + _supportsNonTouchscreen = !platform()->supportsTouchscreen(); + + LOGI("IS TOUCHSCREEN? %d\n", options.useTouchScreen); + + textures = new Textures(&options, platform()); + textures->addDynamicTexture(new WaterTexture()); + textures->addDynamicTexture(new WaterSideTexture()); + gui.texturesLoaded(textures); + + levelRenderer = new LevelRenderer(this); + gameRenderer = new GameRenderer(this); + particleEngine = new ParticleEngine(level, textures); + + // Platform specific initialization here + font = new Font(&options, "font/default8.png", textures); + + _perfRenderer = new PerfRenderer(this, font); + + checkGlError("Init complete"); +#endif + + user = new User("TestUser", ""); + setIsCreativeMode(false); // false means it's Survival Mode + reloadOptions(); + +} + +void Minecraft::setSize(int w, int h) { +#ifndef STANDALONE_SERVER + transformResolution(&w, &h); + + width = w; + height = h; + + if (width >= 1000) { + #ifdef __APPLE__ + Gui::GuiScale = (width > 2000)? 8.0f : 4.0f; + #else + Gui::GuiScale = 4.0f; + #endif + } + else if (width >= 800) { +#ifdef __APPLE__ + Gui::GuiScale = 4.0f; +#else + Gui::GuiScale = 3.0f; +#endif + } + else if (width >= 400) + Gui::GuiScale = 2.0f; + else + Gui::GuiScale = 1.0f; + + Gui::InvGuiScale = 1.0f / Gui::GuiScale; + int screenWidth = (int)(width * Gui::InvGuiScale); + int screenHeight = (int)(height * Gui::InvGuiScale); + + if (platform()) { + float pixelsPerMillimeter = options.getProgressValue(&Options::Option::PIXELS_PER_MILLIMETER); + pixelCalc.setPixelsPerMillimeter(pixelsPerMillimeter); + pixelCalcUi.setPixelsPerMillimeter(pixelsPerMillimeter * Gui::InvGuiScale); + } + + Config config = createConfig(this); + gui.onConfigChanged(config); + + if (screen) + screen->setSize(screenWidth, screenHeight); + + if (inputHolder) + inputHolder->onConfigChanged(config); + //LOGI("Setting size: %d, %d: %f\n", width, height, Gui::InvGuiScale); + +#ifdef WIN32 + char resbuf[128]; + sprintf(resbuf, " %d x %d @ scale %.2f", width, height, Gui::GuiScale); + //gui.addMessage(resbuf); +#endif +#endif /* STANDALONE_SERVER */ +} + +void Minecraft::reloadOptions() { + options.update(); + options.save(); + bool wasTouchscreen = options.useTouchScreen; + options.useTouchScreen = useTouchscreen(); + options.save(); + + if ((wasTouchscreen != options.useTouchScreen) || (inputHolder == 0)) + _reloadInput(); + + user->name = options.username; + + LOGI("Reloading-options\n"); + + // @todo @fix Android and iOS behaves a bit differently when leaving + // an options screen (Android recreates OpenGL surface) + setSize(width, height); +} + +void Minecraft::_reloadInput() { +#ifndef STANDALONE_SERVER + delete inputHolder; + + if (useTouchscreen()) { + inputHolder = new TouchInputHolder(this, &options); + } else { + #if defined(ANDROID) || defined(__APPLE__) + inputHolder = new CustomInputHolder( + new XperiaPlayInput(&options), + new ControllerTurnInput(2, ControllerTurnInput::MODE_DELTA), + new IBuildInput()); + #else + inputHolder = new CustomInputHolder( + new KeyboardInput(&options), + new MouseTurnInput(MouseTurnInput::MODE_DELTA, width/2, height/2), + new MouseBuildInput()); + #endif + } + + mouseHandler.setTurnInput(inputHolder->getTurnInput()); + if (level && player) { + player->input = inputHolder->getMoveInput(); + } +#endif +} + + +// +// Multiplayer +// +void Minecraft::locateMultiplayer() { + isLookingForMultiplayer = true; + + raknetInstance->pingForHosts(19132); + netCallback = new ClientSideNetworkHandler(this, raknetInstance); +} + +void Minecraft::cancelLocateMultiplayer() { + isLookingForMultiplayer = false; + + raknetInstance->stopPingForHosts(); + + delete netCallback; + netCallback = NULL; +} + +bool Minecraft::joinMultiplayer( const PingedCompatibleServer& server ) +{ + if (isLookingForMultiplayer && netCallback) { + isLookingForMultiplayer = false; + return raknetInstance->connect(server.address.ToString(false), server.address.GetPort()); + } + return false; +} + +void Minecraft::hostMultiplayer(int port) { + // Tear down last instance + raknetInstance->disconnect(); + delete netCallback; + netCallback = NULL; + +#if !defined(NO_NETWORK) + netCallback = new ServerSideNetworkHandler(this, raknetInstance); + #ifdef STANDALONE_SERVER + raknetInstance->host(user->name, port, 16); + #else + raknetInstance->host(user->name, port); + #endif +#endif +} + +// +// Level generation +// +/*static*/ + + void* Minecraft::prepareLevel_tspawn(void *p_param) +{ + Minecraft* mc = (Minecraft*) p_param; + mc->generateLevel("Currently not used", mc->level); + return 0; +} + +void Minecraft::generateLevel( const std::string& message, Level* level ) +{ + Stopwatch s; + s.start(); + prepareLevel(message); + s.stop(); + s.print("Level generated: "); + + // "Unlock" + isGeneratingLevel = false; +} + +void Minecraft::_levelGenerated() +{ +#ifndef STANDALONE_SERVER + if (player == NULL) { + player = (LocalPlayer*) gameMode->createPlayer(level); + gameMode->initPlayer(player); + } + + if (player) { + player->input = inputHolder->getMoveInput(); + } + + if (levelRenderer != NULL) levelRenderer->setLevel(level); + if (particleEngine != NULL) particleEngine->setLevel(level); + + gameMode->adjustPlayer(player); + gui.onLevelGenerated(); +#endif + + level->validateSpawn(); + level->loadPlayer(player, true); + // if we are client side, we trust the server to have given us a correct position + if (player && !level->isClientSide) { + player->resetPos(false); + } + + this->cameraTargetPlayer = player; + + if (raknetInstance->isServer()) + raknetInstance->announceServer(user->name); + + if (netCallback) { + netCallback->levelGenerated(level); + } + +#if defined(WIN32) || defined(RPI) + if (_commandServer) { + delete _commandServer; + } + _commandServer = new CommandServer(this); + _commandServer->init(commandPort); +#endif + + // Hack to (hopefully) get the players to show (note: in LevelListener + // instead, since adding yourself always generates a entityAdded) + //EntityRenderDispatcher::getInstance()->onGraphicsReset(); + _hasSignaledGeneratingLevelFinished = true; +} + +Player* Minecraft::respawnPlayer(int playerId) { + for (unsigned int i = 0; i < level->players.size(); ++i) { + if (level->players[i]->entityId == playerId) { + resetPlayer(level->players[i]); + return level->players[i]; + } + } + return NULL; +} + +void Minecraft::resetPlayer(Player* player) { + level->validateSpawn(); + player->reset(); + + Pos p; + if(player->hasRespawnPosition()) { + p = player->getRespawnPosition(); + } + else { + p = level->getSharedSpawnPos(); + } + player->setPos((float)p.x + 0.5f, (float)p.y + 1.0f, (float)p.z + 0.5f); + player->resetPos(true); + + if (isCreativeMode()) + player->inventory->clearInventoryWithDefault(); +} + +void Minecraft::respawnPlayer() { + // RESET THE FRACKING PLAYER HERE + //bool slowCheck = false; + //for (int i = 0; i < level->entities.size(); ++i) + // if (level->entities[i] == player) slowCheck = true; + // + //LOGI("Has entity? %d, %d\n", level->getEntity(player->entityId), slowCheck); + + resetPlayer(player); + + // tell server (or other client) that we re-spawned + RespawnPacket packet(player); + raknetInstance->send(packet); +} + +void Minecraft::onGraphicsReset() +{ +#ifndef STANDALONE_SERVER + textures->clear(); + + font->onGraphicsReset(); + gui.onGraphicsReset(); + + if (levelRenderer) levelRenderer->onGraphicsReset(); + if (gameRenderer) gameRenderer->onGraphicsReset(); + + EntityRenderDispatcher::getInstance()->onGraphicsReset(); + TileEntityRenderDispatcher::getInstance()->onGraphicsReset(); +#endif +} + +int Minecraft::getProgressStatusId() { + return progressStageStatusId; +} + +const char* Minecraft::getProgressMessage() +{ + return progressMessages[progressStageStatusId]; +} + +bool Minecraft::isLevelGenerated() +{ + return level != NULL && !isGeneratingLevel; +} + +LevelStorageSource* Minecraft::getLevelSource() +{ + return storageSource; +} + +int Minecraft::getLicenseId() { + if (!LicenseCodes::isReady(_licenseId)) + _licenseId = platform()->checkLicense(); + return _licenseId; +} + +void Minecraft::audioEngineOn() { +#ifndef STANDALONE_SERVER + soundEngine->enable(true); +#endif +} +void Minecraft::audioEngineOff() { +#ifndef STANDALONE_SERVER + soundEngine->enable(false); +#endif +} + +void Minecraft::setIsCreativeMode(bool isCreative) +{ +#ifdef CREATORMODE + delete gameMode; + gameMode = new CreatorMode(this); + _isCreativeMode = true; +#else + if (!gameMode || isCreative != _isCreativeMode) + { + delete gameMode; + if (isCreative) gameMode = new CreativeMode(this); + else gameMode = new SurvivalMode(this); + _isCreativeMode = isCreative; + } +#endif + if (player) + gameMode->initAbilities(player->abilities); +} + +bool Minecraft::isCreativeMode() { + return _isCreativeMode; +} + +bool Minecraft::isKindleFire(int kindleVersion) { + if (kindleVersion != 1) + return false; + + std::string model = platform()->getPlatformStringVar(PlatformStringVars::DEVICE_BUILD_MODEL); + std::string modelLower(model); + std::transform(modelLower.begin(), modelLower.end(), modelLower.begin(), tolower); + + return (modelLower.find("kindle") != std::string::npos) && (modelLower.find("fire") != std::string::npos); +} + +bool Minecraft::transformResolution(int* w, int* h) +{ + bool changed = false; + + // Kindle Fire 1: reporting wrong height in + // certain cases (e.g. after screen lock) + if (isKindleFire(1) && *h >= 560 && *h <= 620) { + *h = 580; + changed = true; + } + + return changed; +} + +ICreator* Minecraft::getCreator() +{ +#ifdef CREATORMODE + return ((CreatorMode*)gameMode)->getCreator(); +#else + return NULL; +#endif +} + +void Minecraft::optionUpdated( const Options::Option* option, bool value ) { + if(netCallback != NULL && option == &Options::Option::SERVER_VISIBLE) { + ServerSideNetworkHandler* ss = (ServerSideNetworkHandler*) netCallback; + ss->allowIncomingConnections(value); + } +} + +void Minecraft::optionUpdated( const Options::Option* option, float value ) { +#ifndef STANDALONE_SERVER + if(option == &Options::Option::PIXELS_PER_MILLIMETER) { + pixelCalcUi.setPixelsPerMillimeter(value * Gui::InvGuiScale); + pixelCalc.setPixelsPerMillimeter(value); + } +#endif +} + +void Minecraft::optionUpdated( const Options::Option* option, int value ) { + +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/7EAC658EF12ABB6C7FB918B4EE6CE367 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/7EAC658EF12ABB6C7FB918B4EE6CE367 new file mode 100644 index 0000000..ca65891 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/7EAC658EF12ABB6C7FB918B4EE6CE367 @@ -0,0 +1,230 @@ +#include "JoinGameScreen.h" +#include "StartMenuScreen.h" +#include "ProgressScreen.h" +#include "../Font.h" +#include "../../../network/RakNetInstance.h" +#include "../../../network/ClientSideNetworkHandler.h" + +#include "../components/TextBox.h" + +#include +#include +#include + +JoinGameScreen::JoinGameScreen() +: bJoin(2, "Join Game"), + bBack(3, "Back"), + gamesList(NULL), + ip(5, "IP+Port?") +{ + bJoin.active = false; + //gamesList->yInertia =0.5f; +} + +JoinGameScreen::~JoinGameScreen() +{ + delete gamesList; +} + +void JoinGameScreen::buttonClicked(Button* button) +{ + if (button->id == bJoin.id) + { + // Try manual IP:Port from textbox first (if provided) + std::string addr = ip.text; + // trim whitespace + auto trim = [](std::string &s) { + size_t start =0; + while (start < s.size() && std::isspace((unsigned char)s[start])) ++start; + size_t end = s.size(); + while (end > start && std::isspace((unsigned char)s[end -1])) --end; + s = s.substr(start, end - start); + }; + trim(addr); + + if (!addr.empty() && addr != "IP+Port?") + { + // parse host[:port], default port19132 + std::string host = addr; + int port =19132; + size_t colon = addr.find(':'); + if (colon != std::string::npos) + { + host = addr.substr(0, colon); + std::string portStr = addr.substr(colon +1); + trim(host); + trim(portStr); + if (!portStr.empty()) + port = std::atoi(portStr.c_str()); + } else { + trim(host); + } + + if (!host.empty()) + { + // Tear down any previous callback and create a client callback for this connection + if (minecraft->netCallback) { + delete minecraft->netCallback; + minecraft->netCallback = NULL; + } + minecraft->netCallback = new ClientSideNetworkHandler(minecraft, minecraft->raknetInstance); + + // Start the connection (returns immediately whether startup succeeded) + minecraft->raknetInstance->connect(host.c_str(), port); + + // Mirror existing behavior: disable buttons and show progress screen + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + return; + } + + // Fallback: join selected discovered server (existing behavior) + if (isIndexValid(gamesList->selectedItem)) + { + PingedCompatibleServer selectedServer = gamesList->copiedServerList[gamesList->selectedItem]; + minecraft->joinMultiplayer(selectedServer); + { + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + } + //minecraft->locateMultiplayer(); + //minecraft->setScreen(new JoinGameScreen()); + } + if (button->id == bBack.id) + { + minecraft->cancelLocateMultiplayer(); + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } +} + +bool JoinGameScreen::handleBackEvent(bool isDown) +{ + if (!isDown) + { + minecraft->cancelLocateMultiplayer(); + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } + return true; +} + + +bool JoinGameScreen::isIndexValid( int index ) +{ + return gamesList && index >=0 && index < gamesList->getNumberOfItems(); +} + +void JoinGameScreen::tick() +{ + const ServerList& orgServerList = minecraft->raknetInstance->getServerList(); + ServerList serverList; + for (unsigned int i =0; i < orgServerList.size(); ++i) + if (orgServerList[i].name.GetLength() >0) + serverList.push_back(orgServerList[i]); + + if (serverList.size() != gamesList->copiedServerList.size()) + { + // copy the currently selected item + PingedCompatibleServer selectedServer; + bool hasSelection = false; + if (isIndexValid(gamesList->selectedItem)) + { + selectedServer = gamesList->copiedServerList[gamesList->selectedItem]; + hasSelection = true; + } + + gamesList->copiedServerList = serverList; + gamesList->selectItem(-1, false); + + // re-select previous item if it still exists + if (hasSelection) + { + for (unsigned int i =0; i < gamesList->copiedServerList.size(); i++) + { + if (gamesList->copiedServerList[i].address == selectedServer.address) + { + gamesList->selectItem(i, false); + break; + } + } + } + } else { + for (int i = (int)gamesList->copiedServerList.size()-1; i >=0 ; --i) { + for (int j =0; j < (int) serverList.size(); ++j) + if (serverList[j].address == gamesList->copiedServerList[i].address) + gamesList->copiedServerList[i].name = serverList[j].name; + } + } + + bJoin.active = isIndexValid(gamesList->selectedItem); +} + +void JoinGameScreen::init() +{ + buttons.push_back(&bJoin); + buttons.push_back(&bBack); + textBoxes.push_back(&ip); + + minecraft->raknetInstance->clearServerList(); + gamesList = new AvailableGamesList(minecraft, width, height); + +#ifdef ANDROID + tabButtons.push_back(&bJoin); + tabButtons.push_back(&bBack); +#endif +} + +void JoinGameScreen::setupPositions() { + int yBase = height -26; + + //#ifdef ANDROID + bJoin.y = yBase; + bBack.y = yBase; + + bBack.width = bJoin.width =120; + //#endif + + // Center buttons + bJoin.x = width /2 -4 - bJoin.width; + bBack.x = width /2 +4; + ip.x =1; + ip.y =10; + ip.w = bJoin.width; +} + +void JoinGameScreen::render( int xm, int ym, float a ) +{ + bool hasNetwork = minecraft->platform()->isNetworkEnabled(true); +#ifdef WIN32 + hasNetwork = hasNetwork && !GetAsyncKeyState(VK_TAB); +#endif + + renderBackground(); + if (hasNetwork) gamesList->render(xm, ym, a); + Screen::render(xm, ym, a); + + if (hasNetwork) { +#ifdef RPI + std::string s = "Scanning for Local Network Games..."; +#else + std::string s = "Scanning for WiFi Games..."; +#endif + drawCenteredString(minecraft->font, s, width /2,8,0xffffffff); + + const int textWidth = minecraft->font->width(s); + const int spinnerX = width/2 + textWidth /2 +6; + + static const char* spinnerTexts[] = {"-", "\\", "|", "/"}; + int n = ((int)(5.5f * getTimeS()) %4); + drawCenteredString(minecraft->font, spinnerTexts[n], spinnerX,8,0xffffffff); + } else { + std::string s = "WiFi is disabled"; + const int yy = height /2 -8; + drawCenteredString(minecraft->font, s, width /2, yy,0xffffffff); + } +} + +bool JoinGameScreen::isInGameScreen() { return false; } diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/83105CECE6AA00603D9DA1057156A4A0 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/83105CECE6AA00603D9DA1057156A4A0 new file mode 100644 index 0000000..55155fc --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/83105CECE6AA00603D9DA1057156A4A0 @@ -0,0 +1,146 @@ +#include "TextEditScreen.h" +#include "../../../world/level/tile/entity/SignTileEntity.h" +#include "../../../AppPlatform.h" +#include "../../Minecraft.h" +#include "../../renderer/tileentity/TileEntityRenderDispatcher.h" +#include "../../renderer/Tesselator.h" +#include "../../renderer/Textures.h" +#include "../../renderer/GameRenderer.h" +#include "../components/Button.h" +#include "../../../network/Packet.h" +#include "../../../network/RakNetInstance.h" +TextEditScreen::TextEditScreen( SignTileEntity* signEntity ) + : sign(signEntity), isShowingKeyboard(false), frame(0), line(0), btnClose(1, "") { + +} +TextEditScreen::~TextEditScreen() { + +} +void TextEditScreen::init() { + super::init(); + minecraft->platform()->showKeyboard(); + isShowingKeyboard = true; + ImageDef def; + def.name = "gui/spritesheet.png"; + def.x = 0; + def.y = 1; + def.width = def.height = 18; + def.setSrc(IntRectangle(60, 0, 18, 18)); + btnClose.setImageDef(def, true); + btnClose.scaleWhenPressed = false; + buttons.push_back(&btnClose); +} + +void TextEditScreen::setupPositions() { + btnClose.width = btnClose.height = 19; + btnClose.x = width - btnClose.width; + btnClose.y = 0; +} + + +bool TextEditScreen::handleBackEvent( bool isDown ) { + sign->setChanged(); + Packet* signUpdatePacket = sign->getUpdatePacket(); + minecraft->raknetInstance->send(signUpdatePacket); + minecraft->platform()->hideKeyboard(); + minecraft->setScreen(NULL); + return true; +} + +void TextEditScreen::render( int xm, int ym, float a ) { + glDepthMask(GL_FALSE); + renderBackground(); + glPushMatrix(); + glDepthMask(GL_TRUE); + glDisable(GL_CULL_FACE); + glLoadIdentity(); + Tesselator& t = Tesselator::instance; + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrthof(0.0f, (float)minecraft->width, (float)minecraft->height, 0, -1, 1); + glMatrixMode(GL_MODELVIEW); + + minecraft->textures->loadAndBindTexture("item/sign.png"); + glColor4f2(1, 1, 1, 1); + + static float minUV[] = {0.03126f, 0.06249f}; + static float maxUV[] = {0.39063f, 0.4374f}; + float scale = ((minecraft->height / 2) / 32) * 0.9f; + + glTranslatef(minecraft->width / 2.0f, 5.0f, 0.0f); + glScalef2(scale,scale,1); + t.begin(GL_QUADS); + t.vertexUV(-32, 0, 0.0f,minUV[0],minUV[1]); + t.vertexUV(32, 0, 0.0f, maxUV[0], minUV[1]); + t.vertexUV(32, 0 + 32, 0.0f, maxUV[0], maxUV[1]); + t.vertexUV(-32, 0 + 32, 0.0f, minUV[0], maxUV[1]); + t.draw(); + + sign->selectedLine = line; + float textScale = 8.0f / 11.0f; + + glTranslatef(0, 2 ,0); + glScalef2(textScale, textScale, 1); + for(int i = 0; i < 4; ++i) { + //drawCenteredString(font, sign->messages[a], 32.0f, 10 * a, 0xFF000000); + std::string msg = sign->messages[i]; + if (i == sign->selectedLine && msg.length() < 14) { + std::string s = "> " + msg + " <"; + font->draw(s, -(float)font->width(s) / 2.0f, 10.0f * i, 0xFF000000, false); + } else { + font->draw(msg, -(float)font->width(msg) / 2.0f, 10.0f * i, 0xFF000000, false); + } + } + sign->selectedLine = -1; + //font->draw("Hej", minecraft->width / 2, 100, 0xFFFFFFFF, false); + + glPopMatrix(); + glEnable(GL_CULL_FACE); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + + //glEnable(GL_DEPTH_TEST); + super::render(xm, ym, a); +} + +void TextEditScreen::lostFocus() { + +} + +void TextEditScreen::tick() { + frame++; +} + +void TextEditScreen::keyPressed( int eventKey ) { + LOGW("Key pressed! [%d]", eventKey); + if(eventKey == Keyboard::KEY_BACKSPACE) { + if(sign->messages[line].length() > 0) { + sign->messages[line].erase(sign->messages[line].size() - 1, 1); + } else { + line--; + if(line < 0) { + line = 3; + } + } + } else if(eventKey == Keyboard::KEY_RETURN) { + line = (line + 1) % 4; + } else { + super::keyPressed(eventKey); + } +} + +void TextEditScreen::keyboardNewChar( char inputChar ) { + std::string fullstring = sign->messages[line] + inputChar; + if(fullstring.length() < 16) { + sign->messages[line] = fullstring; + //LOGW("Line text updated: %s\n", fullstring.c_str()); + } +} + +void TextEditScreen::buttonClicked( Button* button ) { + if(button == &btnClose) + handleBackEvent(true); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/9CAB88584C535B15B7D916C84A38AB20 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/9CAB88584C535B15B7D916C84A38AB20 new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/9CAB88584C535B15B7D916C84A38AB20 @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/AF8821B3E089A14209FA7C2F8B96C378 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/AF8821B3E089A14209FA7C2F8B96C378 new file mode 100644 index 0000000..fe92a27 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/AF8821B3E089A14209FA7C2F8B96C378 @@ -0,0 +1,233 @@ +#include "TouchJoinGameScreen.h" +#include "../StartMenuScreen.h" +#include "../ProgressScreen.h" +#include "../../Font.h" +#include "../../../Minecraft.h" +#include "../../../renderer/Textures.h" + +namespace Touch { + +// +// Games list +// + +void AvailableGamesList::selectStart( int item) { + startSelected = item; +} + +void AvailableGamesList::selectCancel() { + startSelected = -1; +} + +void AvailableGamesList::selectItem( int item, bool doubleClick ) { + LOGI("selected an item! %d\n", item); + selectedItem = item; +} + +void AvailableGamesList::renderItem( int i, int x, int y, int h, Tesselator& t ) +{ + if (startSelected == i && Multitouch::getFirstActivePointerIdEx() >= 0) { + fill((int)x0, y, (int)x1, y+h, 0x809E684F); + } + + //static int colors[2] = {0xffffb0, 0xcccc90}; + const PingedCompatibleServer& s = copiedServerList[i]; + unsigned int color = s.isSpecial? 0x6090a0 : 0xffffb0; + unsigned int color2 = 0xffffa0;//colors[i&1]; + + int xx1 = (int)x0 + 24; + int xx2 = xx1; + + if (s.isSpecial) { + xx1 += 50; + + glEnable2(GL_TEXTURE_2D); + glColor4f2(1,1,1,1); + glEnable2(GL_BLEND); + minecraft->textures->loadAndBindTexture("gui/badge/minecon140.png"); + blit(xx2, y + 6, 0, 0, 37, 8, 140, 240); + } + + drawString(minecraft->font, s.name.C_String(), xx1, y + 4 + 2, color); + drawString(minecraft->font, s.address.ToString(false), xx2, y + 18, color2); + + /* + drawString(minecraft->font, copiedServerList[i].name.C_String(), (int)x0 + 24, y + 4, color); + drawString(minecraft->font, copiedServerList[i].address.ToString(false), (int)x0 + 24, y + 18, color); + */ +} + + +// +// Join Game screen +// +JoinGameScreen::JoinGameScreen() +: bJoin( 2, "Join Game"), + bBack( 3, "Back"), + bHeader(0, ""), + gamesList(NULL) +{ + bJoin.active = false; + //gamesList->yInertia = 0.5f; +} + +JoinGameScreen::~JoinGameScreen() +{ + delete gamesList; +} + +void JoinGameScreen::init() +{ + //buttons.push_back(&bJoin); + buttons.push_back(&bBack); + buttons.push_back(&bHeader); + + minecraft->raknetInstance->clearServerList(); + gamesList = new AvailableGamesList(minecraft, width, height); + +#ifdef ANDROID + //tabButtons.push_back(&bJoin); + tabButtons.push_back(&bBack); +#endif +} + +void JoinGameScreen::setupPositions() { + //int yBase = height - 26; + + //#ifdef ANDROID + bJoin.y = 0; + bBack.y = 0; + bHeader.y = 0; + //#endif + + // Center buttons + //bJoin.x = width / 2 - 4 - bJoin.w; + bBack.x = 0;//width / 2 + 4; + bHeader.x = bBack.width; + bHeader.width = width - bHeader.x; +} + +void JoinGameScreen::buttonClicked(Button* button) +{ + if (button->id == bJoin.id) + { + if (isIndexValid(gamesList->selectedItem)) + { + PingedCompatibleServer selectedServer = gamesList->copiedServerList[gamesList->selectedItem]; + minecraft->joinMultiplayer(selectedServer); + { + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + } + //minecraft->locateMultiplayer(); + //minecraft->setScreen(new JoinGameScreen()); + } + if (button->id == bBack.id) + { + minecraft->cancelLocateMultiplayer(); + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } +} + +bool JoinGameScreen::handleBackEvent(bool isDown) +{ + if (!isDown) + { + minecraft->cancelLocateMultiplayer(); + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } + return true; +} + + +bool JoinGameScreen::isIndexValid( int index ) +{ + return gamesList && index >= 0 && index < gamesList->getNumberOfItems(); +} + +void JoinGameScreen::tick() +{ + if (isIndexValid(gamesList->selectedItem)) { + buttonClicked(&bJoin); + return; + } + + //gamesList->tick(); + + const ServerList& orgServerList = minecraft->raknetInstance->getServerList(); + ServerList serverList; + for (unsigned int i = 0; i < orgServerList.size(); ++i) + if (orgServerList[i].name.GetLength() > 0) + serverList.push_back(orgServerList[i]); + + if (serverList.size() != gamesList->copiedServerList.size()) + { + // copy the currently selected item + PingedCompatibleServer selectedServer; + bool hasSelection = false; + if (isIndexValid(gamesList->selectedItem)) + { + selectedServer = gamesList->copiedServerList[gamesList->selectedItem]; + hasSelection = true; + } + + gamesList->copiedServerList = serverList; + gamesList->selectItem(-1, false); + + // re-select previous item if it still exists + if (hasSelection) + { + for (unsigned int i = 0; i < gamesList->copiedServerList.size(); i++) + { + if (gamesList->copiedServerList[i].address == selectedServer.address) + { + gamesList->selectItem(i, false); + break; + } + } + } + } else { + for (int i = (int)gamesList->copiedServerList.size()-1; i >= 0 ; --i) { + for (int j = 0; j < (int) serverList.size(); ++j) + if (serverList[j].address == gamesList->copiedServerList[i].address) + gamesList->copiedServerList[i].name = serverList[j].name; + } + } + + bJoin.active = isIndexValid(gamesList->selectedItem); +} + +void JoinGameScreen::render( int xm, int ym, float a ) +{ + bool hasNetwork = minecraft->platform()->isNetworkEnabled(true); +#ifdef WIN32 + hasNetwork = hasNetwork && !GetAsyncKeyState(VK_TAB); +#endif + + renderBackground(); + if (hasNetwork) gamesList->render(xm, ym, a); + else gamesList->renderDirtBackground(); + Screen::render(xm, ym, a); + + const int baseX = bHeader.x + bHeader.width / 2; + + if (hasNetwork) { + std::string s = "Scanning for WiFi Games..."; + drawCenteredString(minecraft->font, s, baseX, 8, 0xffffffff); + + const int textWidth = minecraft->font->width(s); + const int spinnerX = baseX + textWidth / 2 + 6; + + static const char* spinnerTexts[] = {"-", "\\", "|", "/"}; + int n = ((int)(5.5f * getTimeS()) % 4); + drawCenteredString(minecraft->font, spinnerTexts[n], spinnerX, 8, 0xffffffff); + } else { + drawCenteredString(minecraft->font, "WiFi is disabled", baseX, 8, 0xffffffff); + } +} + +bool JoinGameScreen::isInGameScreen() { return false; } + +}; diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/B232B2832A57A8D434C0B6499C9ADAE5 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/B232B2832A57A8D434C0B6499C9ADAE5 new file mode 100644 index 0000000..b447bc5 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/B232B2832A57A8D434C0B6499C9ADAE5 @@ -0,0 +1,73 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_SCREENS__JoinGameScreen_H__ +#define NET_MINECRAFT_CLIENT_GUI_SCREENS__JoinGameScreen_H__ + +#include "../Screen.h" +#include "../components/Button.h" +#include "../components/SmallButton.h" +#include "../components/ScrolledSelectionList.h" +#include "../../Minecraft.h" +#include "../../../network/RakNetInstance.h" + +#include "../components/TextBox.h" + +class JoinGameScreen; + +class AvailableGamesList : public ScrolledSelectionList +{ + int selectedItem; + ServerList copiedServerList; + + friend class JoinGameScreen; + +public: + + AvailableGamesList(Minecraft* _minecraft, int _width, int _height) + : ScrolledSelectionList(_minecraft, _width, _height, 24, _height - 30, 28) + { + } + +protected: + + virtual int getNumberOfItems() { return (int)copiedServerList.size(); } + + virtual void selectItem(int item, bool doubleClick) { selectedItem = item; } + virtual bool isSelectedItem(int item) { return item == selectedItem; } + + virtual void renderBackground() {} + virtual void renderItem(int i, int x, int y, int h, Tesselator& t) + { + const PingedCompatibleServer& s = copiedServerList[i]; + unsigned int color = s.isSpecial? 0xff00b0 : 0xffffa0; + drawString(minecraft->font, s.name.C_String(), x, y + 2, color); + drawString(minecraft->font, s.address.ToString(false), x, y + 16, 0xffffa0); + } +}; + +class JoinGameScreen: public Screen +{ +public: + JoinGameScreen(); + virtual ~JoinGameScreen(); + + void init(); + void setupPositions(); + + virtual bool handleBackEvent(bool isDown); + + virtual bool isIndexValid(int index); + + virtual void tick(); + + void render(int xm, int ym, float a); + + void buttonClicked(Button* button); + + bool isInGameScreen(); +private: + Button bJoin; + Button bBack; + AvailableGamesList* gamesList; + TextBox ip; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_SCREENS__JoinGameScreen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/E19DC915D7B7F4D40A50F260C758DAD9 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/E19DC915D7B7F4D40A50F260C758DAD9 new file mode 100644 index 0000000..8b4d6da --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/E19DC915D7B7F4D40A50F260C758DAD9 @@ -0,0 +1,80 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI__Screen_H__ +#define NET_MINECRAFT_CLIENT_GUI__Screen_H__ + +//package net.minecraft.client.gui; + +#include +#include "GuiComponent.h" + +class Font; +class Minecraft; +class Button; +class TextBox; +struct IntRectangle; + +class Screen: public GuiComponent +{ +public: + Screen(); + + virtual void render(int xm, int ym, float a); + + void init(Minecraft* minecraft, int width, int height); + virtual void init(); + + void setSize(int width, int height); + virtual void setupPositions() {}; + + virtual void updateEvents(); + virtual void mouseEvent(); + virtual void keyboardEvent(); + virtual void keyboardTextEvent(); + virtual bool handleBackEvent(bool isDown); + + virtual void tick() {} + + virtual void removed() {} + + virtual void renderBackground(); + virtual void renderBackground(int vo); + virtual void renderDirtBackground(int vo); + // query + virtual bool renderGameBehind(); + virtual bool hasClippingArea(IntRectangle& out); + + virtual bool isPauseScreen(); + virtual bool isErrorScreen(); + virtual bool isInGameScreen(); + virtual bool closeOnPlayerHurt(); + + virtual void confirmResult(bool result, int id) {} + virtual void lostFocus(); + virtual void toGUICoordinate(int& x, int& y); +protected: + void updateTabButtonSelection(); + + virtual void buttonClicked(Button* button) {} + virtual void mouseClicked(int x, int y, int buttonNum); + virtual void mouseReleased(int x, int y, int buttonNum); + + virtual void keyPressed(int eventKey); + virtual void keyboardNewChar(char inputChar) {} +public: + int width; + int height; + bool passEvents; + //GuiParticles* particles; +protected: + Minecraft* minecraft; + std::vector buttons; + std::vector textBoxes; + + std::vector tabButtons; + int tabButtonIndex; + + Font* font; +private: + Button* clickedButton; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI__Screen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/E25FB3B811E26EA86767132ABFD6C0FE b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/E25FB3B811E26EA86767132ABFD6C0FE new file mode 100644 index 0000000..45852ad --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/E25FB3B811E26EA86767132ABFD6C0FE @@ -0,0 +1,233 @@ +#ifndef NET_MINECRAFT_CLIENT__Minecraft_H__ +#define NET_MINECRAFT_CLIENT__Minecraft_H__ + +#include "Options.h" +#ifndef STANDALONE_SERVER +#include "MouseHandler.h" +#endif +#include "Timer.h" +#include "player/input/ITurnInput.h" +#ifndef STANDALONE_SERVER +#include "gui/Gui.h" +#include "gui/screens/ScreenChooser.h" +#endif +//#include "../network/RakNetInstance.h" +#include "../world/phys/HitResult.h" + +class User; +class Level; +class LocalPlayer; +class IInputHolder; +class Mob; +class Player; +class LevelRenderer; +class GameRenderer; +class ParticleEngine; +class Entity; +class ICreator; +class GameMode; +class Textures; +class CThread; +class SoundEngine; +class Screen; +class Font; +class LevelStorageSource; +class BuildActionIntention; +class PerfRenderer; +class LevelSettings; +class IRakNetInstance; +class NetEventCallback; +class CommandServer; +struct PingedCompatibleServer; +//class ExternalFileLevelStorageSource; + + +#include "../App.h" +#include "PixelCalc.h" +class AppPlatform; +class AppPlatform_android; + +class Minecraft: public App +{ +protected: + Minecraft(); +public: + virtual ~Minecraft(); + + void init(); + void setSize(int width, int height); + void reloadOptions(); + + bool supportNonTouchScreen(); + bool useTouchscreen(); + void grabMouse(); + void releaseMouse(); + + void handleBuildAction(BuildActionIntention*); + + void toggleDimension(){} + bool isCreativeMode(); + void setIsCreativeMode(bool isCreative); + void setScreen(Screen*); + + virtual void selectLevel(const std::string& levelId, const std::string& levelName, const LevelSettings& settings); + virtual void setLevel(Level* level, const std::string& message = "", LocalPlayer* forceInsertPlayer = NULL); + + void generateLevel( const std::string& message, Level* level ); + LevelStorageSource* getLevelSource(); + + bool isLookingForMultiplayer; + void locateMultiplayer(); + void cancelLocateMultiplayer(); + bool joinMultiplayer(const PingedCompatibleServer& server); + void hostMultiplayer(int port=19132); + Player* respawnPlayer(int playerId); + void respawnPlayer(); + void resetPlayer(Player* player); + void doActuallyRespawnPlayer(); + + void update(); + + void tick(int nTick, int maxTick); + void tickInput(); + + bool isOnlineClient(); + bool isOnline(); + void pauseGame(bool isBackPaused); + void gameLostFocus(); + + void prepareLevel(const std::string& message); + + void leaveGame(bool renameLevel = false); + + int getProgressStatusId(); + const char* getProgressMessage(); + + ICreator* getCreator(); + + // void onGraphicsLost() {} + void onGraphicsReset(); + + bool isLevelGenerated(); + int getLicenseId(); + + void audioEngineOn(); + void audioEngineOff(); + + bool isPowerVR() { return _powerVr; } + bool isKindleFire(int kindleVersion); + bool transformResolution(int* w, int* h); + void optionUpdated(const Options::Option* option, bool value); + void optionUpdated(const Options::Option* option, float value); + void optionUpdated(const Options::Option* option, int value); +#ifdef __APPLE__ + bool _isSuperFast; + bool isSuperFast() { return _isSuperFast; } +#endif + +protected: + void _levelGenerated(); + +private: + static void* prepareLevel_tspawn(void *p_param); + + void handleMouseClick(int button); + void handleMouseDown(int button, bool down); + + void _reloadInput(); +public: + int width; + int height; + + // Vars that the platform is allowed to use in the future + int commandPort; + int reserved_d1, reserved_d2; + float reserved_f1, reserved_f2; + + Options options; + + static bool useAmbientOcclusion; + //static bool threadInterrupt; + + volatile bool pause; + + LevelRenderer* levelRenderer; + GameRenderer* gameRenderer; + ParticleEngine* particleEngine; + SoundEngine* soundEngine; + + GameMode* gameMode; +#ifndef STANDALONE_SERVER + Textures* textures; + ScreenChooser screenChooser; + Font* font; +#endif + IRakNetInstance* raknetInstance; + NetEventCallback* netCallback; + + int lastTime; + int lastTickTime; + float ticksSinceLastUpdate; + + User* user; + Level* level; + + LocalPlayer* player; + IInputHolder* inputHolder; + Mob* cameraTargetPlayer; +#ifndef STANDALONE_SERVER + Gui gui; +#endif + CThread* generateLevelThread; + Screen* screen; + static int customDebugId; + + static const int CDI_NONE = 0; + static const int CDI_GRAPHICS = 1; +#ifndef STANDALONE_SERVER + MouseHandler mouseHandler; +#endif + bool mouseGrabbed; + + PixelCalc pixelCalc; + PixelCalc pixelCalcUi; + + HitResult hitResult; + volatile int progressStagePercentage; + + // This field is initialized in main() + // It sets the base path to where worlds can be written (sdcard on android) + std::string externalStoragePath; + std::string externalCacheStoragePath; +protected: + Timer timer; + // @note @attn @warn: this is dangerous as fuck! + volatile bool isGeneratingLevel; + bool _hasSignaledGeneratingLevelFinished; + + LevelStorageSource* storageSource; + bool _running; + bool _powerVr; + +private: + volatile int progressStageStatusId; + static const char* progressMessages[]; + + int missTime; + int ticks; + bool screenMutex; + bool hasScheduledScreen; + Screen* scheduledScreen; + + int _licenseId; + bool _supportsNonTouchscreen; + + bool _isCreativeMode; + //int _respawnPlayerTicks; + Player* _pendingRemovePlayer; // @attn @todo @fix: remove this shait and fix the respawn behaviour + + PerfRenderer* _perfRenderer; + CommandServer* _commandServer; +}; + +#endif /*NET_MINECRAFT_CLIENT__Minecraft_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/E4EFF1B452D8F05B32DD01DDEF3E0542 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/E4EFF1B452D8F05B32DD01DDEF3E0542 new file mode 100644 index 0000000..5322d51 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/E4EFF1B452D8F05B32DD01DDEF3E0542 @@ -0,0 +1,68 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(0), w(0), h(0), x(0), y(0), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + minecraft->platform()->showKeyboard(); + focused = true; + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + minecraft->platform()->showKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + // Slightly translucent dark background + fill(x, y, x + w, y + h,0x80000000); + // Border + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + + // Draw text. If textbox contains the placeholder (no focus and text equals initial msg), draw dim color + int color =0xe0e0e0; + // If not focused and text is empty or equals default placeholder, draw dimmed + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + // measure available width approximated by character count + int maxChars = (std::max)(1, (w -8) /6); // approx6 px per char + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/EAC66B6D9C0430EF433E1CE448B5BE48 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/EAC66B6D9C0430EF433E1CE448B5BE48 new file mode 100644 index 0000000..c8328de --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/EAC66B6D9C0430EF433E1CE448B5BE48 @@ -0,0 +1,70 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(0), w(0), h(0), x(0), y(0), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + minecraft->platform()->showKeyboard(); + focused = true; + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + minecraft->platform()->showKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + // Slightly translucent dark background + fill(x, y, x + w, y + h,0x80000000); + // Border + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + + // Draw text. If textbox contains the placeholder (no focus and text equals initial msg), draw dim color + int color =0xe0e0e0; + // If not focused and text is empty or equals default placeholder, draw dimmed + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + // measure available width approximated by character count + int calc = (w -8) /6; // approx6 px per char + int maxChars =1; + if (calc > maxChars) maxChars = calc; + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/F5CB2E3722AA4FC150577096E6A8EE93 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/F5CB2E3722AA4FC150577096E6A8EE93 new file mode 100644 index 0000000..153fb79 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/AEE07BA2621F944FB33238F7C1DEA6EB/F5CB2E3722AA4FC150577096E6A8EE93 @@ -0,0 +1,68 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(0), w(0), h(0), x(0), y(0), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + minecraft->platform()->showKeyboard(); + focused = true; + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + minecraft->platform()->showKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + // Slightly translucent dark background + fill(x, y, x + w, y + h,0x80000000); + // Border + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + + // Draw text. If textbox contains the placeholder (no focus and text equals initial msg), draw dim color + int color =0xe0e0e0; + // If not focused and text is empty or equals default placeholder, draw dimmed + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + // measure available width approximated by character count + int maxChars = std::max(1, (w -8) /6); // approx6 px per char + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/0E1E245EA16F1FAA685C5686B18BDD08 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/0E1E245EA16F1FAA685C5686B18BDD08 new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/0E1E245EA16F1FAA685C5686B18BDD08 @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/1CC65E0062271217494E8E6A4C0A58CE b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/1CC65E0062271217494E8E6A4C0A58CE new file mode 100644 index 0000000..bfd810c --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/1CC65E0062271217494E8E6A4C0A58CE @@ -0,0 +1,34 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ +#define NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ + +//package net.minecraft.client.gui; + +#include +#include "../GuiComponent.h" +#include "../../Options.h" + +class Font; +class Minecraft; + +class TextBox: public GuiComponent +{ +public: + TextBox(int id, const std::string& msg); + TextBox(int id, int x, int y, const std::string& msg); + TextBox(int id, int x, int y, int w, int h, const std::string& msg); + + virtual void setFocus(Minecraft* minecraft); + virtual bool loseFocus(Minecraft* minecraft); + + virtual void render(Minecraft* minecraft, int xm, int ym); + +public: + int w, h; + int x, y; + + std::string text; + int id; + bool focused; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/1D11F3CE27B0B595836AB483CC9A0B43 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/1D11F3CE27B0B595836AB483CC9A0B43 new file mode 100644 index 0000000..c8328de --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/1D11F3CE27B0B595836AB483CC9A0B43 @@ -0,0 +1,70 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(0), w(0), h(0), x(0), y(0), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + minecraft->platform()->showKeyboard(); + focused = true; + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + minecraft->platform()->showKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + // Slightly translucent dark background + fill(x, y, x + w, y + h,0x80000000); + // Border + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + + // Draw text. If textbox contains the placeholder (no focus and text equals initial msg), draw dim color + int color =0xe0e0e0; + // If not focused and text is empty or equals default placeholder, draw dimmed + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + // measure available width approximated by character count + int calc = (w -8) /6; // approx6 px per char + int maxChars =1; + if (calc > maxChars) maxChars = calc; + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/395B54340827B6C319AA7E9DB9498FED b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/395B54340827B6C319AA7E9DB9498FED new file mode 100644 index 0000000..c9f6e6a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/395B54340827B6C319AA7E9DB9498FED @@ -0,0 +1,1563 @@ +#include "Minecraft.h" + +#if defined(APPLE_DEMO_PROMOTION) + #define NO_NETWORK +#endif + +#if defined(RPI) + #define CREATORMODE +#endif + +#include "../network/RakNetInstance.h" +#include "../network/ClientSideNetworkHandler.h" +#include "../network/ServerSideNetworkHandler.h" +//#include "../network/Packet.h" +#include "../world/entity/player/Inventory.h" +#include "../world/level/chunk/ChunkCache.h" +#include "../world/level/tile/Tile.h" +#include "../world/level/storage/LevelStorageSource.h" +#include "../world/level/storage/LevelStorage.h" +#include "player/input/KeyboardInput.h" +#ifndef STANDALONE_SERVER +#include "player/input/touchscreen/TouchInputHolder.h" +#endif +#include "player/LocalPlayer.h" +#include "gamemode/CreativeMode.h" +#include "gamemode/SurvivalMode.h" +#include "player/LocalPlayer.h" +#ifndef STANDALONE_SERVER +#include "particle/ParticleEngine.h" +#include "gui/Screen.h" +#include "gui/Font.h" +#include "gui/screens/RenameMPLevelScreen.h" +#include "sound/SoundEngine.h" +#endif +#include "../platform/CThread.h" +#include "../platform/input/Mouse.h" +#include "../AppPlatform.h" +#include "../Performance.h" +#include "../LicenseCodes.h" +#include "../util/PerfTimer.h" +#include "../util/PerfRenderer.h" +#include "player/input/MouseBuildInput.h" + +#include "../world/Facing.h" + +#include "../network/packet/PlaceBlockPacket.h" + +#include "player/input/IInputHolder.h" +#ifndef STANDALONE_SERVER +#include "player/input/touchscreen/TouchscreenInput.h" + +#include "player/input/ControllerTurnInput.h" +#include "player/input/XperiaPlayInput.h" + +#endif + +#include "player/input/MouseTurnInput.h" +#include "../world/entity/MobFactory.h" +#include "../world/level/MobSpawner.h" +#include "../util/Mth.h" +#include "../network/packet/InteractPacket.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/PrerenderTilesScreen.h" +#include "renderer/Textures.h" +#include "gui/screens/DeathScreen.h" +#endif + +#include "../network/packet/RespawnPacket.h" +#include "IConfigListener.h" +#include "../world/entity/MobCategory.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/FurnaceScreen.h" +#endif +#include "../world/Difficulty.h" +#include "../server/ServerLevel.h" +#ifdef CREATORMODE +#include "../server/CreatorLevel.h" +#endif +#include "../network/packet/AdventureSettingsPacket.h" +#include "../network/packet/SetSpawnPositionPacket.h" +#include "../network/command/CommandServer.h" +#include "gamemode/CreatorMode.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/ArmorScreen.h" +#endif +#include "../world/level/levelgen/synth/ImprovedNoise.h" +#ifndef STANDALONE_SERVER +#include "renderer/tileentity/TileEntityRenderDispatcher.h" +#endif + +#ifndef STANDALONE_SERVER +#include "renderer/ptexture/DynamicTexture.h" +#include "renderer/GameRenderer.h" +#include "renderer/ItemInHandRenderer.h" +#include "renderer/LevelRenderer.h" +#include "renderer/entity/EntityRenderDispatcher.h" +#include "gui/Screen.h" +#include "gui/Font.h" +#include "gui/screens/RenameMPLevelScreen.h" +#include "sound/SoundEngine.h" +#endif + +static void checkGlError(const char* tag) { +#ifdef GLDEBUG + while (1) { + const int errCode = glGetError(); + if (errCode == GL_NO_ERROR) break; + + LOGE("################\nOpenGL-error @ %s : #%d\n", tag, errCode); + } +#endif /*GLDEBUG*/ +} + +/*static*/ +const char* Minecraft::progressMessages[] = { + "Locating server", + "Building terrain", + "Preparing", + "Saving chunks" +}; + +int Minecraft::customDebugId = Minecraft::CDI_NONE; + +#if defined(_MSC_VER) + #pragma warning( disable : 4355 ) // 'this' pointer in initialization list which is perfectly legal +#endif + +bool Minecraft::useAmbientOcclusion = false; + +Minecraft::Minecraft() +: user(NULL), + level(NULL), + player(NULL), + cameraTargetPlayer(NULL), + levelRenderer(NULL), + gameRenderer(NULL), +#ifndef STANDALONE_SERVER + particleEngine(NULL), + _perfRenderer(NULL), +#endif + _commandServer(NULL), +#ifndef STANDALONE_SERVER + textures(NULL), +#endif + lastTickTime(-1), + lastTime(0), + ticksSinceLastUpdate(0), + gameMode(NULL), + mouseGrabbed(true), + missTime(0), + pause(false), + _running(false), + timer(20), +#ifndef STANDALONE_SERVER + gui(this), +#endif + netCallback(NULL), +#ifndef STANDALONE_SERVER + screen(NULL), + font(NULL), +#endif + screenMutex(false), +#ifndef STANDALONE_SERVER + scheduledScreen(NULL), + hasScheduledScreen(false), + soundEngine(NULL), +#endif + ticks(0), + isGeneratingLevel(false), + _hasSignaledGeneratingLevelFinished(true), + generateLevelThread(NULL), + progressStagePercentage(0), + progressStageStatusId(0), + isLookingForMultiplayer(false), + _licenseId(LicenseCodes::WAIT_PLATFORM_NOT_READY), + inputHolder(0), + _supportsNonTouchscreen(false), +#ifndef STANDALONE_SERVER + screenChooser(this), +#endif + width(1), height(1), + //_respawnPlayerTicks(-1), +#ifdef __APPLE__ + _isSuperFast(false), +#endif + _powerVr(false), + commandPort(4711), + reserved_d1(0),reserved_d2(0), + reserved_f1(0),reserved_f2(0) +{ +//#ifdef ANDROID + +#if defined(NO_NETWORK) + raknetInstance = new IRakNetInstance(); +#else + raknetInstance = new RakNetInstance(); +#endif +#ifndef STANDALONE_SERVER + soundEngine = new SoundEngine(20.0f); + soundEngine->init(this, &options); +#endif + //setupPieces(); +} + +Minecraft::~Minecraft() +{ + delete netCallback; + delete raknetInstance; +#ifndef STANDALONE_SERVER + delete levelRenderer; + delete gameRenderer; + delete particleEngine; + + delete soundEngine; +#endif + delete gameMode; +#ifndef STANDALONE_SERVER + delete font; + delete textures; + + if (screen != NULL) { + delete screen; + screen = NULL; + } +#endif + if (level != NULL) { + level->saveGame(); + if (level->getChunkSource()) + level->getChunkSource()->saveAll(true); + delete level->getLevelStorage(); + delete level; + level = NULL; + } + + //delete player; + delete user; + delete inputHolder; + + delete storageSource; + delete _perfRenderer; + delete _commandServer; + + MobFactory::clearStaticTestMobs(); +#ifndef STANDALONE_SERVER + EntityRenderDispatcher::destroy(); +#endif +} + +// Only called by server +void Minecraft::selectLevel( const std::string& levelId, const std::string& levelName, const LevelSettings& settings ) +{ +#if defined(CREATORMODE) + level = new CreatorLevel( +#else + level = new ServerLevel( +#endif + storageSource->selectLevel(levelId, false), + levelName, + settings, + SharedConstants::GeneratorVersion); + + // note: settings is useless beyond this point, since it's + // either copied to LevelData (or LevelData read from file) + setLevel(level, "Generating level"); + setIsCreativeMode(level->getLevelData()->getGameType() == GameType::Creative); + _running = true; +} + +void Minecraft::setLevel(Level* level, const std::string& message /* ="" */, LocalPlayer* forceInsertPlayer /* = NULL */) { + cameraTargetPlayer = NULL; + LOGI("Seed is %ld\n", level->getSeed()); + + if (level != NULL) { + level->raknetInstance = raknetInstance; + gameMode->initLevel(level); + + if (!player && forceInsertPlayer) + { + player = forceInsertPlayer; + player->resetPos(false); + //level->addEntity(forceInsertPlayer); + } + else if (player != NULL) { + player->resetPos(false); + if (level != NULL) { + level->addEntity(player); + } + } + this->level = level; + _hasSignaledGeneratingLevelFinished = false; +#ifdef STANDALONE_SERVER + const bool threadedLevelCreation = false; +#else + const bool threadedLevelCreation = true; +#endif + + if (threadedLevelCreation) { + // Threaded + // "Lock" + isGeneratingLevel = true; + generateLevelThread = new CThread(Minecraft::prepareLevel_tspawn, this); + } else { + // Non-threaded + generateLevel("Currently not used", level); + } + } else { + player = NULL; + } + + this->lastTickTime = 0; + this->_running = true; +} + +void Minecraft::leaveGame(bool renameLevel /*=false*/) +{ + if (isGeneratingLevel || !_hasSignaledGeneratingLevelFinished) + return; + + isGeneratingLevel = false; + bool saveLevel = level && (!level->isClientSide || renameLevel); + + raknetInstance->disconnect(); + if (saveLevel) { + // If server or wanting to save level as client, save all unsaved chunks! + level->getChunkSource()->saveAll(true); + } + + LOGI("Clearing levels\n"); + + cameraTargetPlayer = NULL; +#ifndef STANDALONE_SERVER + levelRenderer->setLevel(NULL); + particleEngine->setLevel(NULL); +#endif + LOGI("Erasing callback\n"); + delete netCallback; + netCallback = NULL; + + LOGI("Erasing level\n"); + if (level != NULL) { + delete level->getLevelStorage(); + delete level; + level = NULL; + } + //delete player; + player = NULL; + cameraTargetPlayer = NULL; + + _running = false; +#ifndef STANDALONE_SERVER + if (renameLevel) { + setScreen(new RenameMPLevelScreen(LevelStorageSource::TempLevelId)); + } + else + screenChooser.setScreen(SCREEN_STARTMENU); +#endif +} + +void Minecraft::prepareLevel(const std::string& title) { + LOGI("status: 1\n"); + progressStageStatusId = 1; + + Stopwatch A, B, C, D; + A.start(); + + Stopwatch L; + + // Dont update lights if we load the level (ok, actually just with leveldata version=1.+(?)) + if (!level->isNew()) + level->setUpdateLights(false); + + int Max = CHUNK_CACHE_WIDTH * CHUNK_CACHE_WIDTH; + int pp = 0; + for (int x = 8; x < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); x += CHUNK_WIDTH) { + for (int z = 8; z < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); z += CHUNK_WIDTH) { + progressStagePercentage = 100 * pp++ / Max; + //printf("level generation progress %d\n", progressStagePercentage); + B.start(); + level->getTile(x, 64, z); + B.stop(); + L.start(); + if (level->isNew()) + while (level->updateLights()) + ; + L.stop(); + } + } + A.stop(); + level->setUpdateLights(true); + + C.start(); + for (int x = 0; x < CHUNK_CACHE_WIDTH; x++) + { + for (int z = 0; z < CHUNK_CACHE_WIDTH; z++) + { + LevelChunk* chunk = level->getChunk(x, z); + if (chunk && !chunk->createdFromSave) + { + chunk->unsaved = false; + chunk->clearUpdateMap(); + } + } + } + C.stop(); + + LOGI("status: 3\n"); + progressStageStatusId = 3; + if (level->isNew()) { + level->setInitialSpawn(); // @note: should obviously be called from Level itself + level->saveLevelData(); + level->getChunkSource()->saveAll(false); + level->saveGame(); + } else { + level->saveLevelData(); + level->loadEntities(); + } + + progressStagePercentage = -1; + progressStageStatusId = 2; + LOGI("status: 2\n"); + + D.start(); + level->prepare(); + D.stop(); + + A.print("Generate level: "); + L.print(" - light: "); + B.print(" - getTl: "); + C.print(" - clear: "); + D.print(" - prepr: "); + progressStageStatusId = 0; +} + +void Minecraft::update() { + //LOGI("Enter Update\n"); + + if (Options::debugGl) + LOGI(">>>>>>>>>>\n"); + + TIMER_PUSH("root"); + + //if (level) { + // LOGI("numplayers: %d\n", level->players.size()); + // for (int i = 0; i < level->players.size(); ++i) { + // Player* p = level->players[i]; + // bool inEnt = std::find(level->entities.begin(), level->entities.end(), p) != level->entities.end(); + // LOGI(" %p, %d, %d - in? %d\n", p, p->entityId, p->owner.ToUint32(p->owner), inEnt); + // } + //} + + if (pause && level != NULL) { + float lastA = timer.a; + timer.advanceTime(); + timer.a = lastA; + } else { + timer.advanceTime(); + } + + if (raknetInstance) { + raknetInstance->runEvents(netCallback); + } + + TIMER_PUSH("tick"); + int toTick = timer.ticks; + for (int i = 0; i < toTick; ++i, ++ticks) + tick(i, toTick-1); + + TIMER_POP_PUSH("updatelights"); + if (level && !isGeneratingLevel) { + level->updateLights(); + } + TIMER_POP(); + + #ifndef STANDALONE_SERVER + if (gameMode != NULL) gameMode->render(timer.a); + TIMER_PUSH("sound"); + soundEngine->update(player, timer.a); + TIMER_POP_PUSH("render"); + gameRenderer->render(timer.a); + TIMER_POP(); + #else + CThread::sleep(1); + #endif +#ifndef STANDALONE_SERVER + Multitouch::resetThisUpdate(); +#endif + TIMER_POP(); +#ifndef STANDALONE_SERVER + checkGlError("Update finished"); + + if (options.renderDebug) { + if (!PerfTimer::enabled) { + PerfTimer::reset(); + PerfTimer::enabled = true; + } + + //TIMER_PUSH("debugfps"); + _perfRenderer->renderFpsMeter(1); + checkGlError("render debug"); + //TIMER_POP(); + } else { + PerfTimer::enabled = false; + } +#endif + //LOGI("Exit Update\n"); +} + +void Minecraft::tick(int nTick, int maxTick) { + if (missTime > 0) missTime--; +#ifndef STANDALONE_SERVER + if (!screen && player) { + if (player->health <= 0) { + setScreen(new DeathScreen()); + } + } +#endif + TIMER_PUSH("gameMode"); + if (level && !pause) { + gameMode->tick(); + } + + TIMER_POP_PUSH("commandServer"); + if (level && _commandServer) { + _commandServer->tick(); + } + + TIMER_POP_PUSH("input"); + tickInput(); +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("gui"); + gui.tick(); +#endif + // + // Ongoing level generation in a (perhaps) different thread. When it's + // ready, _levelGenerated() is called once and any threads are deleted. + // + if (isGeneratingLevel) { + return; + } else if (!_hasSignaledGeneratingLevelFinished) { + if (generateLevelThread) { + delete generateLevelThread; + generateLevelThread = NULL; + } + _levelGenerated(); + } + + // + // Normal game loop, run before or efter level generation + // + if (level != NULL) + { + if (!pause) { +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("gameRenderer"); + gameRenderer->tick(nTick, maxTick); + + TIMER_POP_PUSH("levelRenderer"); + levelRenderer->tick(); +#endif + level->difficulty = options.difficulty; + if (level->isClientSide) level->difficulty = Difficulty::EASY; + + TIMER_POP_PUSH("level"); + level->tickEntities(); + level->tick(); +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("animateTick"); + if (player) { + level->animateTick(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); + } +#endif + } + } +#ifndef STANDALONE_SERVER + textures->loadAndBindTexture("terrain.png"); + if (!pause && !(screen && !screen->renderGameBehind())) { + #if !defined(RPI) + #ifdef __APPLE__ + if (isSuperFast()) + #endif + { + if (nTick == maxTick) { + TIMER_POP_PUSH("textures"); + textures->tick(true); + } + } + #endif + } + TIMER_POP_PUSH("particles"); + particleEngine->tick(); + if (screen) { + screenMutex = true; + screen->tick(); + screenMutex = false; + } + + // @note: fix to keep "isPressed" and "isReleased" as long as necessary. + // Most likely keyboard and mouse could/should be reset here as well. + Multitouch::reset(); +#endif + TIMER_POP(); +} + +class InputRAII { +public: + ~InputRAII() { +#ifndef STANDALONE_SERVER + Mouse::reset(); + Keyboard::reset(); +#endif + } +}; + +void Minecraft::tickInput() { +#ifndef STANDALONE_SERVER + InputRAII raiiInput; + + if (screen && !screen->passEvents) { + screenMutex = true; + screen->updateEvents(); + //screen->updateSetScreen(); + screenMutex = false; + if (hasScheduledScreen) { + setScreen(scheduledScreen); + scheduledScreen = NULL; + hasScheduledScreen = false; + } + return; + } + + if (!player) { + return; + } + +#ifdef RPI + bool mouseDiggable = true; + bool allowGuiClicks = !mouseGrabbed; +#else + bool mouseDiggable = !gui.isInside(Mouse::getX(), Mouse::getY()); + bool allowGuiClicks = true; +#endif + + TIMER_PUSH("mouse"); + while (Mouse::next()) { + //if (Mouse::getButtonState(MouseAction::ACTION_LEFT)) + // LOGI("mouse-down-at: %d, %d\n", Mouse::getX(), Mouse::getY()); + int passedTime = getTimeMs() - lastTickTime; + if (passedTime > 200) continue; // @note: As long Mouse::clear CLEARS the whole buffer, it's safe to break here + // But since it might be rewritten anyway (and hopefully there aren't a lot of messages, we just continue. + + const MouseAction& e = Mouse::getEvent(); + +#ifdef RPI // If clicked when not having focus, get focus @keyboard + if (!mouseGrabbed) { + if (!screen && e.data == MouseAction::DATA_DOWN) { + grabMouse(); + } + } +#endif + + if (allowGuiClicks && e.action == MouseAction::ACTION_LEFT && e.data == MouseAction::DATA_DOWN) { + gui.handleClick(MouseAction::ACTION_LEFT, Mouse::getX(), Mouse::getY()); + } + + if (e.action == MouseAction::ACTION_WHEEL) { + Inventory* v = player->inventory; + int numSlots = gui.getNumSlots() - 1; + int slot = (v->selected - e.dy + numSlots) % numSlots; + v->selectSlot(slot); + } + /* + if (mouseDiggable && options.useMouseForDigging) { + if (Mouse::getEventButton() == MouseAction::ACTION_LEFT && Mouse::getEventButtonState()) { + handleMouseClick(MouseAction::ACTION_LEFT); + lastClickTick = ticks; + } + if (Mouse::getEventButton() == MouseAction::ACTION_RIGHT && Mouse::getEventButtonState()) { + handleMouseClick(MouseAction::ACTION_RIGHT); + lastClickTick = ticks; + } + } + */ + } + + TIMER_POP_PUSH("keyboard"); + while (Keyboard::next()) { + int key = Keyboard::getEventKey(); + bool isPressed = (Keyboard::getEventKeyState() == KeyboardAction::KEYDOWN); + player->setKey(key, isPressed); + + if (isPressed) { + gui.handleKeyPressed(key); + + #if defined(WIN32) || defined(RPI)//|| defined(_DEBUG) || defined(DEBUG) + if (key >= '0' && key <= '9') { + int digit = key - '0'; + int slot = digit - 1; + + if (slot >= 0 && slot < gui.getNumSlots()-1) + player->inventory->selectSlot(slot); + + #if defined(WIN32) + if (digit >= 1 && GetAsyncKeyState(VK_CONTROL) < 0) { + // Set adventure settings here! + AdventureSettingsPacket p(level->adventureSettings); + p.toggle((AdventureSettingsPacket::Flags)(1 << slot)); + p.fillIn(level->adventureSettings); + raknetInstance->send(p); + } + if (digit == 0) { + Pos pos((int)player->x, (int)player->y-1, (int)player->z); + SetSpawnPositionPacket p(pos); + raknetInstance->send(p); + } + #endif + } + #endif + #if defined(RPI) + if (key == Keyboard::KEY_E) { + screenChooser.setScreen(SCREEN_BLOCKSELECTION); + } + if (!screen && key == Keyboard::KEY_O || key == 250) { + releaseMouse(); + } + #endif + #if defined(WIN32) + if (key == Keyboard::KEY_F) { + options.isFlying = !options.isFlying; + player->noPhysics = options.isFlying; + } + + if (key == Keyboard::KEY_T) { + options.thirdPersonView = !options.thirdPersonView; + /* + ImprovedNoise noise; + for (int i = 0; i < 16; ++i) + printf("%d\t%f\n", i, noise.grad2(i, 3, 8)); + */ + } + + if (key == Keyboard::KEY_O) { + useAmbientOcclusion = !useAmbientOcclusion; + options.ambientOcclusion = useAmbientOcclusion; + levelRenderer->allChanged(); + } + + if (key == Keyboard::KEY_L) + options.viewDistance = (options.viewDistance + 1) % 4; + + if (key == Keyboard::KEY_U) { + onGraphicsReset(); + player->heal(100); + } + + if (key == Keyboard::KEY_B || key == 108) // Toggle the game mode + setIsCreativeMode(!isCreativeMode()); + + if (key == Keyboard::KEY_P) // Step forward in time + level->setTime( level->getTime() + 1000); + + if (key == Keyboard::KEY_G) { + setScreen(new ArmorScreen()); + /* + std::vector& boxs = level->getCubes(NULL, AABB(128.1f, 73, 128.1f, 128.9f, 74.9f, 128.9f)); + LOGI("boxes: %d\n", (int)boxs.size()); + */ + } + + if (key == Keyboard::KEY_Y) { + textures->reloadAll(); + player->hurtTo(2); + } + if (key == Keyboard::KEY_Z || key == 108) { + for (int i = 0; i < 1; ++i) { + Mob* mob = NULL; + int forceId = 0;//MobTypes::Sheep; + + int types[] = { + MobTypes::Sheep, + MobTypes::Pig, + MobTypes::Chicken, + MobTypes::Cow, + }; + + int mobType = (forceId > 0)? forceId : types[Mth::random(sizeof(types) / sizeof(int))]; + mob = MobFactory::CreateMob(mobType, level); + + //((Animal*)mob)->setAge(-1000); + float dx = 4 - 8 * Mth::random() + 4 * Mth::sin(Mth::DEGRAD * player->yRot); + float dz = 4 - 8 * Mth::random() + 4 * Mth::cos(Mth::DEGRAD * player->yRot); + if (mob && !MobSpawner::addMob(level, mob, player->x + dx, player->y, player->z + dz, Mth::random()*360, 0, true)) + delete mob; + } + } + + if (key == Keyboard::KEY_X) { + const EntityList& entities = level->getAllEntities(); + for (int i = entities.size()-1; i >= 0; --i) { + Entity* e = entities[i]; + if (!e->isPlayer()) + level->removeEntity(e); + } + } + + if (key == Keyboard::KEY_C /*|| key == 4*/) { + player->inventory->clearInventoryWithDefault(); + // @todo: Add saving here for benchmarking + } + if (key == Keyboard::KEY_H) { + setScreen( new PrerenderTilesScreen() ); + } + + if (key == Keyboard::KEY_O) { + for (int i = Inventory::MAX_SELECTION_SIZE; i < player->inventory->getContainerSize(); ++i) + if (player->inventory->getItem(i)) + player->inventory->dropSlot(i, false); + } + if (key == Keyboard::KEY_F3) { + options.renderDebug = !options.renderDebug; + } + if (key == Keyboard::KEY_M) { + options.difficulty = (options.difficulty == Difficulty::PEACEFUL)? + Difficulty::NORMAL : Difficulty::PEACEFUL; + //setIsCreativeMode( !isCreativeMode() ); + } + + // lanternroci + if (key == Keyboard::KEY_ESCAPE) + pauseGame(false); + if (key == Keyboard::KEY_E && !options.isFlying) { + screenChooser.setScreen(SCREEN_BLOCKSELECTION); + } + + if (options.renderDebug) { + if (key >= '0' && key <= '9') { + _perfRenderer->debugFpsMeterKeyPress(key - '0'); + } + } + #endif + + #ifndef RPI + if (key == 82) + pauseGame(false); + #else + if (key == Keyboard::KEY_ESCAPE) + pauseGame(false); + #endif + + #ifndef OPENGL_ES + if (key == Keyboard::KEY_P) { + static bool isWireFrame = false; + isWireFrame = !isWireFrame; + glPolygonMode(GL_FRONT, isWireFrame? GL_LINE : GL_FILL); + //glPolygonMode(GL_BACK, isWireFrame? GL_LINE : GL_FILL); + } + #endif + } + #ifdef WIN32 + if (key == Keyboard::KEY_M) { + for (int i = 0; i < 5 * SharedConstants::TicksPerSecond; ++i) + level->tick(); + } + #endif + + + //if (!isPressed) LOGI("Key released: %d\n", key); + + if (!options.useMouseForDigging) { + int passedTime = getTimeMs() - lastTickTime; + if (passedTime > 200) continue; + + // Destroy and attack is on same button + if (key == options.keyDestroy.key && isPressed) { + BuildActionIntention bai(BuildActionIntention::BAI_REMOVE | BuildActionIntention::BAI_ATTACK); + handleBuildAction(&bai); + } + else // Build and use/interact is on same button + if (key == options.keyUse.key && isPressed) { + BuildActionIntention bai(BuildActionIntention::BAI_BUILD | BuildActionIntention::BAI_INTERACT); + handleBuildAction(&bai); + } + } + } + + TIMER_POP_PUSH("tickbuild"); + BuildActionIntention bai; + // @note: This might be a problem. This method is polling based here, but + // event based when using mouse (or keys..), and in java. Not quite + // sure just yet what way to go. + bool buildHandled = inputHolder->getBuildInput()->tickBuild(player, &bai); + if (buildHandled) { + if (!bai.isRemoveContinue()) + handleBuildAction(&bai); + } + + bool isTryingToDestroyBlock = (options.useMouseForDigging + ? (Mouse::isButtonDown(MouseAction::ACTION_LEFT) && mouseDiggable) + : Keyboard::isKeyDown(options.keyDestroy.key)) + || (buildHandled && bai.isRemove()); + + TIMER_POP_PUSH("handlemouse"); +#ifdef RPI + handleMouseDown(MouseAction::ACTION_LEFT, isTryingToDestroyBlock); + handleMouseClick(buildHandled && bai.isInteract() + || options.useMouseForDigging && Mouse::isButtonDown(MouseAction::ACTION_RIGHT)); +#else + handleMouseDown(MouseAction::ACTION_LEFT, isTryingToDestroyBlock || (buildHandled && bai.isInteract())); +#endif + + lastTickTime = getTimeMs(); + + // we have (hopefully) handled the keyboard & mouse queue and it + // can now be emptied. If wanted, the reset could be changed to: + // index -= numRead; // then this code doesn't have to be placed here + // + it prepares for tick not handling all or any events. + // update: RAII'ing instead, see above + //Keyboard::reset(); + //Mouse::reset(); + + TIMER_POP(); +#endif +} + +void Minecraft::handleMouseDown(int button, bool down) { +#ifndef STANDALONE_SERVER +#ifndef RPI + if(player->isUsingItem()) { + if(!down && !Keyboard::isKeyDown(options.keyUse.key)) { + gameMode->releaseUsingItem(player); + } + return; + } +#endif + if(player->isSleeping()) { + return; + } + if (button == MouseAction::ACTION_LEFT && missTime > 0) return; + if (down && hitResult.type == TILE && button == MouseAction::ACTION_LEFT && !hitResult.indirectHit) { + int x = hitResult.x; + int y = hitResult.y; + int z = hitResult.z; + gameMode->continueDestroyBlock(x, y, z, hitResult.f); + particleEngine->crack(x, y, z, hitResult.f); + player->swing(); + } else { + gameMode->stopDestroyBlock(); + } +#endif +} + +void Minecraft::handleMouseClick(int button) { +// BuildActionIntention bai( +// (button == MouseAction::ACTION_LEFT)? +// BuildActionIntention::BAI_REMOVE +// : BuildActionIntention::BAI_BUILD); +// +// handleBuildAction(&bai); +} + +void Minecraft::handleBuildAction(BuildActionIntention* action) { +#ifndef STANDALONE_SERVER + if (action->isRemove()) { + if (missTime > 0) return; + player->swing(); + } + if(player->isUsingItem()) + return; + bool mayUse = true; + + if (!hitResult.isHit()) { + if (action->isRemove() && !gameMode->isCreativeType()) { + missTime = 10; + } + } else if (hitResult.type == ENTITY) { + if (action->isAttack()) { + player->swing(); + //LOGI("attacking!\n"); + InteractPacket packet(InteractPacket::Attack, player->entityId, hitResult.entity->entityId); + raknetInstance->send(packet); + gameMode->attack(player, hitResult.entity); + } else if (action->isInteract()) { + if (hitResult.entity->interactPreventDefault()) + mayUse = false; + //LOGI("interacting!\n"); + InteractPacket packet(InteractPacket::Interact, player->entityId, hitResult.entity->entityId); + raknetInstance->send(packet); + gameMode->interact(player, hitResult.entity); + } + } else if (hitResult.type == TILE) { + int x = hitResult.x; + int y = hitResult.y; + int z = hitResult.z; + int face = hitResult.f; + + int oldTileId = level->getTile(x, y, z); + Tile* oldTile = Tile::tiles[oldTileId]; + + //bool tryDestroyBlock = false; + + if (action->isRemove()) { + if (!oldTile) + return; + + //LOGI("tile: %s - %d, %d, %d. b: %f - %f\n", oldTile->getDescriptionId().c_str(), x, y, z, oldTile->getBrightness(level, x, y, z), oldTile->getBrightness(level, x, y+1, z)); + level->extinguishFire(x, y, z, hitResult.f); + gameMode->startDestroyBlock(x, y, z, hitResult.f); + } + else { + ItemInstance* item = player->inventory->getSelected(); + if (gameMode->useItemOn(player, level, item, x, y, z, face, hitResult.pos)) { + mayUse = false; + player->swing(); + #ifdef RPI + } else if (item && item->id == ((Item*)Item::sword_iron)->id) { + player->swing(); + #endif + } + if (item && item->count <= 0) { + player->inventory->clearSlot(player->inventory->selected); + } + //} else if (item && item->count != oldCount) { + // gameRenderer->itemInHandRenderer->itemPlaced(); + //} + } + } + if (mayUse && action->isInteract()) { + ItemInstance* item = player->inventory->getSelected(); + if (item && !player->isUsingItem()) { + if (gameMode->useItem(player, level, item)) { + gameRenderer->itemInHandRenderer->itemUsed(); + } + if (item && item->count <= 0) { + player->inventory->clearSlot(player->inventory->selected); + } + } + } +#endif +} + +bool Minecraft::isOnlineClient() +{ + return (level != NULL && level->isClientSide); +} + +bool Minecraft::isOnline() +{ + return netCallback != NULL; +} + +void Minecraft::pauseGame(bool isBackPaused) { +#ifndef STANDALONE_SERVER + if (screen != NULL) return; + screenChooser.setScreen(isBackPaused? SCREEN_PAUSEPREV : SCREEN_PAUSE); +#endif +} +void Minecraft::gameLostFocus() { +#ifndef STANDALONE_SERVER + if(screen != NULL) { + screen->lostFocus(); + } +#endif +} + + +void Minecraft::setScreen( Screen* screen ) +{ +#ifndef STANDALONE_SERVER + Mouse::reset(); + Multitouch::reset(); + Multitouch::resetThisUpdate(); + + if (screenMutex) { + hasScheduledScreen = true; + scheduledScreen = screen; + return; + } + + if (screen != NULL && screen->isErrorScreen()) + return; + if (screen == NULL && level == NULL) + screen = screenChooser.createScreen(SCREEN_STARTMENU); + + if (this->screen != NULL) { + this->screen->removed(); + delete this->screen; + } + + this->screen = screen; + if (screen != NULL) { + releaseMouse(); + //ScreenSizeCalculator ssc = new ScreenSizeCalculator(options, width, height); + int screenWidth = (int)(width * Gui::InvGuiScale); //ssc.getWidth(); + int screenHeight = (int)(height * Gui::InvGuiScale); //ssc.getHeight(); + screen->init(this, screenWidth, screenHeight); + + if (screen->isInGameScreen() && level) { + level->saveLevelData(); + level->saveGame(); + } + + //noRender = false; + } else { + grabMouse(); + } +#endif +} + +void Minecraft::grabMouse() +{ +#ifndef STANDALONE_SERVER + if (mouseGrabbed) return; + mouseGrabbed = true; + mouseHandler.grab(); + //setScreen(NULL); +#endif +} + +void Minecraft::releaseMouse() +{ +#ifndef STANDALONE_SERVER + if (!mouseGrabbed) { + return; + } + if (player) { + player->releaseAllKeys(); + } + mouseGrabbed = false; + mouseHandler.release(); +#endif +} + +bool Minecraft::useTouchscreen() { +#ifdef RPI + return false; +#endif + return options.useTouchScreen || !_supportsNonTouchscreen; +} +bool Minecraft::supportNonTouchScreen() { + return _supportsNonTouchscreen; +} +void Minecraft::init() +{ + options.minecraft = this; + options.initDefaultValues(); +#ifndef STANDALONE_SERVER + checkGlError("Init enter"); + + _supportsNonTouchscreen = !platform()->supportsTouchscreen(); + + LOGI("IS TOUCHSCREEN? %d\n", options.useTouchScreen); + + textures = new Textures(&options, platform()); + textures->addDynamicTexture(new WaterTexture()); + textures->addDynamicTexture(new WaterSideTexture()); + gui.texturesLoaded(textures); + + levelRenderer = new LevelRenderer(this); + gameRenderer = new GameRenderer(this); + particleEngine = new ParticleEngine(level, textures); + + // Platform specific initialization here + font = new Font(&options, "font/default8.png", textures); + + _perfRenderer = new PerfRenderer(this, font); + + checkGlError("Init complete"); +#endif + + user = new User("TestUser", ""); + setIsCreativeMode(false); // false means it's Survival Mode + reloadOptions(); + +} + +void Minecraft::setSize(int w, int h) { +#ifndef STANDALONE_SERVER + transformResolution(&w, &h); + + width = w; + height = h; + + if (width >= 1000) { + #ifdef __APPLE__ + Gui::GuiScale = (width > 2000)? 8.0f : 4.0f; + #else + Gui::GuiScale = 4.0f; + #endif + } + else if (width >= 800) { +#ifdef __APPLE__ + Gui::GuiScale = 4.0f; +#else + Gui::GuiScale = 3.0f; +#endif + } + else if (width >= 400) + Gui::GuiScale = 2.0f; + else + Gui::GuiScale = 1.0f; + + Gui::InvGuiScale = 1.0f / Gui::GuiScale; + int screenWidth = (int)(width * Gui::InvGuiScale); + int screenHeight = (int)(height * Gui::InvGuiScale); + + if (platform()) { + float pixelsPerMillimeter = options.getProgressValue(&Options::Option::PIXELS_PER_MILLIMETER); + pixelCalc.setPixelsPerMillimeter(pixelsPerMillimeter); + pixelCalcUi.setPixelsPerMillimeter(pixelsPerMillimeter * Gui::InvGuiScale); + } + + Config config = createConfig(this); + gui.onConfigChanged(config); + + if (screen) + screen->setSize(screenWidth, screenHeight); + + if (inputHolder) + inputHolder->onConfigChanged(config); + //LOGI("Setting size: %d, %d: %f\n", width, height, Gui::InvGuiScale); + +#ifdef WIN32 + char resbuf[128]; + sprintf(resbuf, " %d x %d @ scale %.2f", width, height, Gui::GuiScale); + //gui.addMessage(resbuf); +#endif +#endif /* STANDALONE_SERVER */ +} + +void Minecraft::reloadOptions() { + options.update(); + options.save(); + bool wasTouchscreen = options.useTouchScreen; + options.useTouchScreen = useTouchscreen(); + options.save(); + + if ((wasTouchscreen != options.useTouchScreen) || (inputHolder == 0)) + _reloadInput(); + + user->name = options.username; + + LOGI("Reloading-options\n"); + + // @todo @fix Android and iOS behaves a bit differently when leaving + // an options screen (Android recreates OpenGL surface) + setSize(width, height); +} + +void Minecraft::_reloadInput() { +#ifndef STANDALONE_SERVER + delete inputHolder; + + if (useTouchscreen()) { + inputHolder = new TouchInputHolder(this, &options); + } else { + #if defined(ANDROID) || defined(__APPLE__) + inputHolder = new CustomInputHolder( + new XperiaPlayInput(&options), + new ControllerTurnInput(2, ControllerTurnInput::MODE_DELTA), + new IBuildInput()); + #else + inputHolder = new CustomInputHolder( + new KeyboardInput(&options), + new MouseTurnInput(MouseTurnInput::MODE_DELTA, width/2, height/2), + new MouseBuildInput()); + #endif + } + + mouseHandler.setTurnInput(inputHolder->getTurnInput()); + if (level && player) { + player->input = inputHolder->getMoveInput(); + } +#endif +} + + +// +// Multiplayer +// +void Minecraft::locateMultiplayer() { + isLookingForMultiplayer = true; + + raknetInstance->pingForHosts(19132); + netCallback = new ClientSideNetworkHandler(this, raknetInstance); +} + +void Minecraft::cancelLocateMultiplayer() { + isLookingForMultiplayer = false; + + raknetInstance->stopPingForHosts(); + + delete netCallback; + netCallback = NULL; +} + +bool Minecraft::joinMultiplayer( const PingedCompatibleServer& server ) +{ + if (isLookingForMultiplayer && netCallback) { + isLookingForMultiplayer = false; + return raknetInstance->connect(server.address.ToString(false), server.address.GetPort()); + } + return false; +} + +void Minecraft::hostMultiplayer(int port) { + // Tear down last instance + raknetInstance->disconnect(); + delete netCallback; + netCallback = NULL; + +#if !defined(NO_NETWORK) + netCallback = new ServerSideNetworkHandler(this, raknetInstance); + #ifdef STANDALONE_SERVER + raknetInstance->host(user->name, port, 16); + #else + raknetInstance->host(user->name, port); + #endif +#endif +} + +// +// Level generation +// +/*static*/ + + void* Minecraft::prepareLevel_tspawn(void *p_param) +{ + Minecraft* mc = (Minecraft*) p_param; + mc->generateLevel("Currently not used", mc->level); + return 0; +} + +void Minecraft::generateLevel( const std::string& message, Level* level ) +{ + Stopwatch s; + s.start(); + prepareLevel(message); + s.stop(); + s.print("Level generated: "); + + // "Unlock" + isGeneratingLevel = false; +} + +void Minecraft::_levelGenerated() +{ +#ifndef STANDALONE_SERVER + if (player == NULL) { + player = (LocalPlayer*) gameMode->createPlayer(level); + gameMode->initPlayer(player); + } + + if (player) { + player->input = inputHolder->getMoveInput(); + } + + if (levelRenderer != NULL) levelRenderer->setLevel(level); + if (particleEngine != NULL) particleEngine->setLevel(level); + + gameMode->adjustPlayer(player); + gui.onLevelGenerated(); +#endif + + level->validateSpawn(); + level->loadPlayer(player, true); + // if we are client side, we trust the server to have given us a correct position + if (player && !level->isClientSide) { + player->resetPos(false); + } + + this->cameraTargetPlayer = player; + + if (raknetInstance->isServer()) + raknetInstance->announceServer(user->name); + + if (netCallback) { + netCallback->levelGenerated(level); + } + +#if defined(WIN32) || defined(RPI) + if (_commandServer) { + delete _commandServer; + } + _commandServer = new CommandServer(this); + _commandServer->init(commandPort); +#endif + + // Hack to (hopefully) get the players to show (note: in LevelListener + // instead, since adding yourself always generates a entityAdded) + //EntityRenderDispatcher::getInstance()->onGraphicsReset(); + _hasSignaledGeneratingLevelFinished = true; +} + +Player* Minecraft::respawnPlayer(int playerId) { + for (unsigned int i = 0; i < level->players.size(); ++i) { + if (level->players[i]->entityId == playerId) { + resetPlayer(level->players[i]); + return level->players[i]; + } + } + return NULL; +} + +void Minecraft::resetPlayer(Player* player) { + level->validateSpawn(); + player->reset(); + + Pos p; + if(player->hasRespawnPosition()) { + p = player->getRespawnPosition(); + } + else { + p = level->getSharedSpawnPos(); + } + player->setPos((float)p.x + 0.5f, (float)p.y + 1.0f, (float)p.z + 0.5f); + player->resetPos(true); + + if (isCreativeMode()) + player->inventory->clearInventoryWithDefault(); +} + +void Minecraft::respawnPlayer() { + // RESET THE FRACKING PLAYER HERE + //bool slowCheck = false; + //for (int i = 0; i < level->entities.size(); ++i) + // if (level->entities[i] == player) slowCheck = true; + // + //LOGI("Has entity? %d, %d\n", level->getEntity(player->entityId), slowCheck); + + resetPlayer(player); + + // tell server (or other client) that we re-spawned + RespawnPacket packet(player); + raknetInstance->send(packet); +} + +void Minecraft::onGraphicsReset() +{ +#ifndef STANDALONE_SERVER + textures->clear(); + + font->onGraphicsReset(); + gui.onGraphicsReset(); + + if (levelRenderer) levelRenderer->onGraphicsReset(); + if (gameRenderer) gameRenderer->onGraphicsReset(); + + EntityRenderDispatcher::getInstance()->onGraphicsReset(); + TileEntityRenderDispatcher::getInstance()->onGraphicsReset(); +#endif +} + +int Minecraft::getProgressStatusId() { + return progressStageStatusId; +} + +const char* Minecraft::getProgressMessage() +{ + return progressMessages[progressStageStatusId]; +} + +bool Minecraft::isLevelGenerated() +{ + return level != NULL && !isGeneratingLevel; +} + +LevelStorageSource* Minecraft::getLevelSource() +{ + return storageSource; +} + +int Minecraft::getLicenseId() { + if (!LicenseCodes::isReady(_licenseId)) + _licenseId = platform()->checkLicense(); + return _licenseId; +} + +void Minecraft::audioEngineOn() { +#ifndef STANDALONE_SERVER + soundEngine->enable(true); +#endif +} +void Minecraft::audioEngineOff() { +#ifndef STANDALONE_SERVER + soundEngine->enable(false); +#endif +} + +void Minecraft::setIsCreativeMode(bool isCreative) +{ +#ifdef CREATORMODE + delete gameMode; + gameMode = new CreatorMode(this); + _isCreativeMode = true; +#else + if (!gameMode || isCreative != _isCreativeMode) + { + delete gameMode; + if (isCreative) gameMode = new CreativeMode(this); + else gameMode = new SurvivalMode(this); + _isCreativeMode = isCreative; + } +#endif + if (player) + gameMode->initAbilities(player->abilities); +} + +bool Minecraft::isCreativeMode() { + return _isCreativeMode; +} + +bool Minecraft::isKindleFire(int kindleVersion) { + if (kindleVersion != 1) + return false; + + std::string model = platform()->getPlatformStringVar(PlatformStringVars::DEVICE_BUILD_MODEL); + std::string modelLower(model); + std::transform(modelLower.begin(), modelLower.end(), modelLower.begin(), tolower); + + return (modelLower.find("kindle") != std::string::npos) && (modelLower.find("fire") != std::string::npos); +} + +bool Minecraft::transformResolution(int* w, int* h) +{ + bool changed = false; + + // Kindle Fire 1: reporting wrong height in + // certain cases (e.g. after screen lock) + if (isKindleFire(1) && *h >= 560 && *h <= 620) { + *h = 580; + changed = true; + } + + return changed; +} + +ICreator* Minecraft::getCreator() +{ +#ifdef CREATORMODE + return ((CreatorMode*)gameMode)->getCreator(); +#else + return NULL; +#endif +} + +void Minecraft::optionUpdated( const Options::Option* option, bool value ) { + if(netCallback != NULL && option == &Options::Option::SERVER_VISIBLE) { + ServerSideNetworkHandler* ss = (ServerSideNetworkHandler*) netCallback; + ss->allowIncomingConnections(value); + } +} + +void Minecraft::optionUpdated( const Options::Option* option, float value ) { +#ifndef STANDALONE_SERVER + if(option == &Options::Option::PIXELS_PER_MILLIMETER) { + pixelCalcUi.setPixelsPerMillimeter(value * Gui::InvGuiScale); + pixelCalc.setPixelsPerMillimeter(value); + } +#endif +} + +void Minecraft::optionUpdated( const Options::Option* option, int value ) { + +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/4222F2040602983458B5992A709F7336 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/4222F2040602983458B5992A709F7336 new file mode 100644 index 0000000..ad4d97c --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/4222F2040602983458B5992A709F7336 @@ -0,0 +1,74 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_SCREENS_TOUCH__TouchJoinGameScreen_H__ +#define NET_MINECRAFT_CLIENT_GUI_SCREENS_TOUCH__TouchJoinGameScreen_H__ + +#include "../../Screen.h" +#include "../../components/Button.h" +#include "../../components/SmallButton.h" +#include "../../components/RolledSelectionListV.h" +#include "../../../Minecraft.h" +#include "../../../../platform/input/Multitouch.h" +#include "../../../../network/RakNetInstance.h" + +namespace Touch { + +class JoinGameScreen; + +class AvailableGamesList : public RolledSelectionListV +{ + int startSelected; + int selectedItem; + ServerList copiedServerList; + + friend class JoinGameScreen; + +public: + AvailableGamesList(Minecraft* _minecraft, int _width, int _height) + : RolledSelectionListV(_minecraft, _width, _height, 0, _width, 24, _height, 34), + selectedItem(-1), + startSelected(-1) + { + } + +protected: + + virtual int getNumberOfItems() { return (int)copiedServerList.size(); } + + virtual void selectCancel(); + virtual void selectStart(int item); + virtual void selectItem(int item, bool doubleClick); + + virtual bool isSelectedItem(int item) { return item == selectedItem; } + + virtual void renderBackground() {} + virtual void renderItem(int i, int x, int y, int h, Tesselator& t); +}; + +class JoinGameScreen: public Screen +{ +public: + JoinGameScreen(); + virtual ~JoinGameScreen(); + + void init(); + void setupPositions(); + + virtual bool handleBackEvent(bool isDown); + + virtual bool isIndexValid(int index); + + virtual void tick(); + void render(int xm, int ym, float a); + + void buttonClicked(Button* button); + + bool isInGameScreen(); +private: + Button bJoin; + TButton bBack; + THeader bHeader; + AvailableGamesList* gamesList; +}; + +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_SCREENS_TOUCH__TouchJoinGameScreen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/430CC357A15D4BE1A70387A7C3462A3C b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/430CC357A15D4BE1A70387A7C3462A3C new file mode 100644 index 0000000..92a367b --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/430CC357A15D4BE1A70387A7C3462A3C @@ -0,0 +1,258 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i = 0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0, 0, width, height, 0xc0101010, 0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1, 1, 1, 1); + float s = 32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height, 0, 0, height / s + fvo); + t.vertexUV((float)width, (float)height, 0, width / s, (float)height / s + fvo); + t.vertexUV((float)width, 0, 0, (float)width / s, 0 + fvo); + t.vertexUV(0, 0, 0, 0, 0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex = 0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount - 1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i = 0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; +/* +#if !defined(ANDROID) && !defined(__APPLE__) //if (!minecraft->isTouchscreen()) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); +#endif } +*/ + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + +#if 1 +//#if defined(ANDROID) || defined(__APPLE__) //if (minecraft->isTouchscreen()) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click", 1, 1); + clickedButton->released(x, y); + } + } +# else // } else { + clickedButton->released(x, y); +#endif // } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height - 1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/572513C3D8D309B3634C045C3C8FAC54 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/572513C3D8D309B3634C045C3C8FAC54 new file mode 100644 index 0000000..872695a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/572513C3D8D309B3634C045C3C8FAC54 @@ -0,0 +1,137 @@ +#ifndef KEYBOARD_H__ +#define KEYBOARD_H__ + +#include + +/** A keyboard action; key-down or key-up */ +class KeyboardAction +{ +public: + static const int KEYUP = 0; + static const int KEYDOWN = 1; + + KeyboardAction(unsigned char keyCode, int state) { + this->key = keyCode; + this->state = state; + } + + int state; + unsigned char key; +}; + +/* Iterators */ +typedef std::vector KeyboardActionVec; +typedef KeyboardActionVec::iterator KeyboardActionIt; +typedef KeyboardActionVec::const_iterator KeyboardActionCIt; + +/** A static keyboard class, written to resemble the one in lwjgl somewhat */ +class Keyboard +{ +public: + static const int KEY_A = 65; + static const int KEY_B = 66; + static const int KEY_C = 67; + static const int KEY_D = 68; + static const int KEY_E = 69; + static const int KEY_F = 70; + static const int KEY_G = 71; + static const int KEY_H = 72; + static const int KEY_I = 73; + static const int KEY_J = 74; + static const int KEY_K = 75; + static const int KEY_L = 76; + static const int KEY_M = 77; + static const int KEY_N = 78; + static const int KEY_O = 79; + static const int KEY_P = 80; + static const int KEY_Q = 81; + static const int KEY_R = 82; + static const int KEY_S = 83; + static const int KEY_T = 84; + static const int KEY_U = 85; + static const int KEY_V = 86; + static const int KEY_W = 87; + static const int KEY_X = 88; + static const int KEY_Y = 89; + static const int KEY_Z = 90; + + static const int KEY_BACKSPACE = 8; + static const int KEY_RETURN = 13; + + static const int KEY_F1 = 112; + static const int KEY_F2 = 113; + static const int KEY_F3 = 114; + static const int KEY_F4 = 115; + static const int KEY_F5 = 116; + static const int KEY_F6 = 117; + static const int KEY_F7 = 118; + static const int KEY_F8 = 119; + static const int KEY_F9 = 120; + static const int KEY_F10 = 121; + static const int KEY_F11 = 122; + static const int KEY_F12 = 123; + + static const int KEY_ESCAPE = 27; + static const int KEY_SPACE = 32; + static const int KEY_LSHIFT = 10; + + static bool isKeyDown(int keyCode) { + return _states[keyCode] == KeyboardAction::KEYDOWN; + } + + static void reset() { + _inputs.clear(); + _inputText.clear(); + _index = -1; + _textIndex = -1; + } + + static void feed(unsigned char keyCode, int state) { + _inputs.push_back(KeyboardAction(keyCode, state)); + + _states[keyCode] = state; + } + static void feedText(char character) { + _inputText.push_back(character); + } + + static bool next() { + if (_index + 1 >= (int)_inputs.size()) + return false; + + ++_index; + return true; + } + + static bool nextTextChar() { + if(_textIndex + 1 >= (int)_inputText.size()) + return false; + ++_textIndex; + return true; + } + + static void rewind() { + _index = -1; + _textIndex = -1; + } + + static int getEventKey() { + return _inputs[_index].key; + } + + static int getEventKeyState() { + return _inputs[_index].state; + } + static char getChar() { + return _inputText[_textIndex]; + } +private: + static int _index; + static int _textIndex; + static int _states[256]; + static std::vector _inputs; + static std::vector _inputText; + static bool _inited; +}; + +#endif//KEYBOARD_H__ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/72B2752C7CD663CF9A1CC0178EF19114 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/72B2752C7CD663CF9A1CC0178EF19114 new file mode 100644 index 0000000..c9f6e6a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/72B2752C7CD663CF9A1CC0178EF19114 @@ -0,0 +1,1563 @@ +#include "Minecraft.h" + +#if defined(APPLE_DEMO_PROMOTION) + #define NO_NETWORK +#endif + +#if defined(RPI) + #define CREATORMODE +#endif + +#include "../network/RakNetInstance.h" +#include "../network/ClientSideNetworkHandler.h" +#include "../network/ServerSideNetworkHandler.h" +//#include "../network/Packet.h" +#include "../world/entity/player/Inventory.h" +#include "../world/level/chunk/ChunkCache.h" +#include "../world/level/tile/Tile.h" +#include "../world/level/storage/LevelStorageSource.h" +#include "../world/level/storage/LevelStorage.h" +#include "player/input/KeyboardInput.h" +#ifndef STANDALONE_SERVER +#include "player/input/touchscreen/TouchInputHolder.h" +#endif +#include "player/LocalPlayer.h" +#include "gamemode/CreativeMode.h" +#include "gamemode/SurvivalMode.h" +#include "player/LocalPlayer.h" +#ifndef STANDALONE_SERVER +#include "particle/ParticleEngine.h" +#include "gui/Screen.h" +#include "gui/Font.h" +#include "gui/screens/RenameMPLevelScreen.h" +#include "sound/SoundEngine.h" +#endif +#include "../platform/CThread.h" +#include "../platform/input/Mouse.h" +#include "../AppPlatform.h" +#include "../Performance.h" +#include "../LicenseCodes.h" +#include "../util/PerfTimer.h" +#include "../util/PerfRenderer.h" +#include "player/input/MouseBuildInput.h" + +#include "../world/Facing.h" + +#include "../network/packet/PlaceBlockPacket.h" + +#include "player/input/IInputHolder.h" +#ifndef STANDALONE_SERVER +#include "player/input/touchscreen/TouchscreenInput.h" + +#include "player/input/ControllerTurnInput.h" +#include "player/input/XperiaPlayInput.h" + +#endif + +#include "player/input/MouseTurnInput.h" +#include "../world/entity/MobFactory.h" +#include "../world/level/MobSpawner.h" +#include "../util/Mth.h" +#include "../network/packet/InteractPacket.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/PrerenderTilesScreen.h" +#include "renderer/Textures.h" +#include "gui/screens/DeathScreen.h" +#endif + +#include "../network/packet/RespawnPacket.h" +#include "IConfigListener.h" +#include "../world/entity/MobCategory.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/FurnaceScreen.h" +#endif +#include "../world/Difficulty.h" +#include "../server/ServerLevel.h" +#ifdef CREATORMODE +#include "../server/CreatorLevel.h" +#endif +#include "../network/packet/AdventureSettingsPacket.h" +#include "../network/packet/SetSpawnPositionPacket.h" +#include "../network/command/CommandServer.h" +#include "gamemode/CreatorMode.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/ArmorScreen.h" +#endif +#include "../world/level/levelgen/synth/ImprovedNoise.h" +#ifndef STANDALONE_SERVER +#include "renderer/tileentity/TileEntityRenderDispatcher.h" +#endif + +#ifndef STANDALONE_SERVER +#include "renderer/ptexture/DynamicTexture.h" +#include "renderer/GameRenderer.h" +#include "renderer/ItemInHandRenderer.h" +#include "renderer/LevelRenderer.h" +#include "renderer/entity/EntityRenderDispatcher.h" +#include "gui/Screen.h" +#include "gui/Font.h" +#include "gui/screens/RenameMPLevelScreen.h" +#include "sound/SoundEngine.h" +#endif + +static void checkGlError(const char* tag) { +#ifdef GLDEBUG + while (1) { + const int errCode = glGetError(); + if (errCode == GL_NO_ERROR) break; + + LOGE("################\nOpenGL-error @ %s : #%d\n", tag, errCode); + } +#endif /*GLDEBUG*/ +} + +/*static*/ +const char* Minecraft::progressMessages[] = { + "Locating server", + "Building terrain", + "Preparing", + "Saving chunks" +}; + +int Minecraft::customDebugId = Minecraft::CDI_NONE; + +#if defined(_MSC_VER) + #pragma warning( disable : 4355 ) // 'this' pointer in initialization list which is perfectly legal +#endif + +bool Minecraft::useAmbientOcclusion = false; + +Minecraft::Minecraft() +: user(NULL), + level(NULL), + player(NULL), + cameraTargetPlayer(NULL), + levelRenderer(NULL), + gameRenderer(NULL), +#ifndef STANDALONE_SERVER + particleEngine(NULL), + _perfRenderer(NULL), +#endif + _commandServer(NULL), +#ifndef STANDALONE_SERVER + textures(NULL), +#endif + lastTickTime(-1), + lastTime(0), + ticksSinceLastUpdate(0), + gameMode(NULL), + mouseGrabbed(true), + missTime(0), + pause(false), + _running(false), + timer(20), +#ifndef STANDALONE_SERVER + gui(this), +#endif + netCallback(NULL), +#ifndef STANDALONE_SERVER + screen(NULL), + font(NULL), +#endif + screenMutex(false), +#ifndef STANDALONE_SERVER + scheduledScreen(NULL), + hasScheduledScreen(false), + soundEngine(NULL), +#endif + ticks(0), + isGeneratingLevel(false), + _hasSignaledGeneratingLevelFinished(true), + generateLevelThread(NULL), + progressStagePercentage(0), + progressStageStatusId(0), + isLookingForMultiplayer(false), + _licenseId(LicenseCodes::WAIT_PLATFORM_NOT_READY), + inputHolder(0), + _supportsNonTouchscreen(false), +#ifndef STANDALONE_SERVER + screenChooser(this), +#endif + width(1), height(1), + //_respawnPlayerTicks(-1), +#ifdef __APPLE__ + _isSuperFast(false), +#endif + _powerVr(false), + commandPort(4711), + reserved_d1(0),reserved_d2(0), + reserved_f1(0),reserved_f2(0) +{ +//#ifdef ANDROID + +#if defined(NO_NETWORK) + raknetInstance = new IRakNetInstance(); +#else + raknetInstance = new RakNetInstance(); +#endif +#ifndef STANDALONE_SERVER + soundEngine = new SoundEngine(20.0f); + soundEngine->init(this, &options); +#endif + //setupPieces(); +} + +Minecraft::~Minecraft() +{ + delete netCallback; + delete raknetInstance; +#ifndef STANDALONE_SERVER + delete levelRenderer; + delete gameRenderer; + delete particleEngine; + + delete soundEngine; +#endif + delete gameMode; +#ifndef STANDALONE_SERVER + delete font; + delete textures; + + if (screen != NULL) { + delete screen; + screen = NULL; + } +#endif + if (level != NULL) { + level->saveGame(); + if (level->getChunkSource()) + level->getChunkSource()->saveAll(true); + delete level->getLevelStorage(); + delete level; + level = NULL; + } + + //delete player; + delete user; + delete inputHolder; + + delete storageSource; + delete _perfRenderer; + delete _commandServer; + + MobFactory::clearStaticTestMobs(); +#ifndef STANDALONE_SERVER + EntityRenderDispatcher::destroy(); +#endif +} + +// Only called by server +void Minecraft::selectLevel( const std::string& levelId, const std::string& levelName, const LevelSettings& settings ) +{ +#if defined(CREATORMODE) + level = new CreatorLevel( +#else + level = new ServerLevel( +#endif + storageSource->selectLevel(levelId, false), + levelName, + settings, + SharedConstants::GeneratorVersion); + + // note: settings is useless beyond this point, since it's + // either copied to LevelData (or LevelData read from file) + setLevel(level, "Generating level"); + setIsCreativeMode(level->getLevelData()->getGameType() == GameType::Creative); + _running = true; +} + +void Minecraft::setLevel(Level* level, const std::string& message /* ="" */, LocalPlayer* forceInsertPlayer /* = NULL */) { + cameraTargetPlayer = NULL; + LOGI("Seed is %ld\n", level->getSeed()); + + if (level != NULL) { + level->raknetInstance = raknetInstance; + gameMode->initLevel(level); + + if (!player && forceInsertPlayer) + { + player = forceInsertPlayer; + player->resetPos(false); + //level->addEntity(forceInsertPlayer); + } + else if (player != NULL) { + player->resetPos(false); + if (level != NULL) { + level->addEntity(player); + } + } + this->level = level; + _hasSignaledGeneratingLevelFinished = false; +#ifdef STANDALONE_SERVER + const bool threadedLevelCreation = false; +#else + const bool threadedLevelCreation = true; +#endif + + if (threadedLevelCreation) { + // Threaded + // "Lock" + isGeneratingLevel = true; + generateLevelThread = new CThread(Minecraft::prepareLevel_tspawn, this); + } else { + // Non-threaded + generateLevel("Currently not used", level); + } + } else { + player = NULL; + } + + this->lastTickTime = 0; + this->_running = true; +} + +void Minecraft::leaveGame(bool renameLevel /*=false*/) +{ + if (isGeneratingLevel || !_hasSignaledGeneratingLevelFinished) + return; + + isGeneratingLevel = false; + bool saveLevel = level && (!level->isClientSide || renameLevel); + + raknetInstance->disconnect(); + if (saveLevel) { + // If server or wanting to save level as client, save all unsaved chunks! + level->getChunkSource()->saveAll(true); + } + + LOGI("Clearing levels\n"); + + cameraTargetPlayer = NULL; +#ifndef STANDALONE_SERVER + levelRenderer->setLevel(NULL); + particleEngine->setLevel(NULL); +#endif + LOGI("Erasing callback\n"); + delete netCallback; + netCallback = NULL; + + LOGI("Erasing level\n"); + if (level != NULL) { + delete level->getLevelStorage(); + delete level; + level = NULL; + } + //delete player; + player = NULL; + cameraTargetPlayer = NULL; + + _running = false; +#ifndef STANDALONE_SERVER + if (renameLevel) { + setScreen(new RenameMPLevelScreen(LevelStorageSource::TempLevelId)); + } + else + screenChooser.setScreen(SCREEN_STARTMENU); +#endif +} + +void Minecraft::prepareLevel(const std::string& title) { + LOGI("status: 1\n"); + progressStageStatusId = 1; + + Stopwatch A, B, C, D; + A.start(); + + Stopwatch L; + + // Dont update lights if we load the level (ok, actually just with leveldata version=1.+(?)) + if (!level->isNew()) + level->setUpdateLights(false); + + int Max = CHUNK_CACHE_WIDTH * CHUNK_CACHE_WIDTH; + int pp = 0; + for (int x = 8; x < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); x += CHUNK_WIDTH) { + for (int z = 8; z < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); z += CHUNK_WIDTH) { + progressStagePercentage = 100 * pp++ / Max; + //printf("level generation progress %d\n", progressStagePercentage); + B.start(); + level->getTile(x, 64, z); + B.stop(); + L.start(); + if (level->isNew()) + while (level->updateLights()) + ; + L.stop(); + } + } + A.stop(); + level->setUpdateLights(true); + + C.start(); + for (int x = 0; x < CHUNK_CACHE_WIDTH; x++) + { + for (int z = 0; z < CHUNK_CACHE_WIDTH; z++) + { + LevelChunk* chunk = level->getChunk(x, z); + if (chunk && !chunk->createdFromSave) + { + chunk->unsaved = false; + chunk->clearUpdateMap(); + } + } + } + C.stop(); + + LOGI("status: 3\n"); + progressStageStatusId = 3; + if (level->isNew()) { + level->setInitialSpawn(); // @note: should obviously be called from Level itself + level->saveLevelData(); + level->getChunkSource()->saveAll(false); + level->saveGame(); + } else { + level->saveLevelData(); + level->loadEntities(); + } + + progressStagePercentage = -1; + progressStageStatusId = 2; + LOGI("status: 2\n"); + + D.start(); + level->prepare(); + D.stop(); + + A.print("Generate level: "); + L.print(" - light: "); + B.print(" - getTl: "); + C.print(" - clear: "); + D.print(" - prepr: "); + progressStageStatusId = 0; +} + +void Minecraft::update() { + //LOGI("Enter Update\n"); + + if (Options::debugGl) + LOGI(">>>>>>>>>>\n"); + + TIMER_PUSH("root"); + + //if (level) { + // LOGI("numplayers: %d\n", level->players.size()); + // for (int i = 0; i < level->players.size(); ++i) { + // Player* p = level->players[i]; + // bool inEnt = std::find(level->entities.begin(), level->entities.end(), p) != level->entities.end(); + // LOGI(" %p, %d, %d - in? %d\n", p, p->entityId, p->owner.ToUint32(p->owner), inEnt); + // } + //} + + if (pause && level != NULL) { + float lastA = timer.a; + timer.advanceTime(); + timer.a = lastA; + } else { + timer.advanceTime(); + } + + if (raknetInstance) { + raknetInstance->runEvents(netCallback); + } + + TIMER_PUSH("tick"); + int toTick = timer.ticks; + for (int i = 0; i < toTick; ++i, ++ticks) + tick(i, toTick-1); + + TIMER_POP_PUSH("updatelights"); + if (level && !isGeneratingLevel) { + level->updateLights(); + } + TIMER_POP(); + + #ifndef STANDALONE_SERVER + if (gameMode != NULL) gameMode->render(timer.a); + TIMER_PUSH("sound"); + soundEngine->update(player, timer.a); + TIMER_POP_PUSH("render"); + gameRenderer->render(timer.a); + TIMER_POP(); + #else + CThread::sleep(1); + #endif +#ifndef STANDALONE_SERVER + Multitouch::resetThisUpdate(); +#endif + TIMER_POP(); +#ifndef STANDALONE_SERVER + checkGlError("Update finished"); + + if (options.renderDebug) { + if (!PerfTimer::enabled) { + PerfTimer::reset(); + PerfTimer::enabled = true; + } + + //TIMER_PUSH("debugfps"); + _perfRenderer->renderFpsMeter(1); + checkGlError("render debug"); + //TIMER_POP(); + } else { + PerfTimer::enabled = false; + } +#endif + //LOGI("Exit Update\n"); +} + +void Minecraft::tick(int nTick, int maxTick) { + if (missTime > 0) missTime--; +#ifndef STANDALONE_SERVER + if (!screen && player) { + if (player->health <= 0) { + setScreen(new DeathScreen()); + } + } +#endif + TIMER_PUSH("gameMode"); + if (level && !pause) { + gameMode->tick(); + } + + TIMER_POP_PUSH("commandServer"); + if (level && _commandServer) { + _commandServer->tick(); + } + + TIMER_POP_PUSH("input"); + tickInput(); +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("gui"); + gui.tick(); +#endif + // + // Ongoing level generation in a (perhaps) different thread. When it's + // ready, _levelGenerated() is called once and any threads are deleted. + // + if (isGeneratingLevel) { + return; + } else if (!_hasSignaledGeneratingLevelFinished) { + if (generateLevelThread) { + delete generateLevelThread; + generateLevelThread = NULL; + } + _levelGenerated(); + } + + // + // Normal game loop, run before or efter level generation + // + if (level != NULL) + { + if (!pause) { +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("gameRenderer"); + gameRenderer->tick(nTick, maxTick); + + TIMER_POP_PUSH("levelRenderer"); + levelRenderer->tick(); +#endif + level->difficulty = options.difficulty; + if (level->isClientSide) level->difficulty = Difficulty::EASY; + + TIMER_POP_PUSH("level"); + level->tickEntities(); + level->tick(); +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("animateTick"); + if (player) { + level->animateTick(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); + } +#endif + } + } +#ifndef STANDALONE_SERVER + textures->loadAndBindTexture("terrain.png"); + if (!pause && !(screen && !screen->renderGameBehind())) { + #if !defined(RPI) + #ifdef __APPLE__ + if (isSuperFast()) + #endif + { + if (nTick == maxTick) { + TIMER_POP_PUSH("textures"); + textures->tick(true); + } + } + #endif + } + TIMER_POP_PUSH("particles"); + particleEngine->tick(); + if (screen) { + screenMutex = true; + screen->tick(); + screenMutex = false; + } + + // @note: fix to keep "isPressed" and "isReleased" as long as necessary. + // Most likely keyboard and mouse could/should be reset here as well. + Multitouch::reset(); +#endif + TIMER_POP(); +} + +class InputRAII { +public: + ~InputRAII() { +#ifndef STANDALONE_SERVER + Mouse::reset(); + Keyboard::reset(); +#endif + } +}; + +void Minecraft::tickInput() { +#ifndef STANDALONE_SERVER + InputRAII raiiInput; + + if (screen && !screen->passEvents) { + screenMutex = true; + screen->updateEvents(); + //screen->updateSetScreen(); + screenMutex = false; + if (hasScheduledScreen) { + setScreen(scheduledScreen); + scheduledScreen = NULL; + hasScheduledScreen = false; + } + return; + } + + if (!player) { + return; + } + +#ifdef RPI + bool mouseDiggable = true; + bool allowGuiClicks = !mouseGrabbed; +#else + bool mouseDiggable = !gui.isInside(Mouse::getX(), Mouse::getY()); + bool allowGuiClicks = true; +#endif + + TIMER_PUSH("mouse"); + while (Mouse::next()) { + //if (Mouse::getButtonState(MouseAction::ACTION_LEFT)) + // LOGI("mouse-down-at: %d, %d\n", Mouse::getX(), Mouse::getY()); + int passedTime = getTimeMs() - lastTickTime; + if (passedTime > 200) continue; // @note: As long Mouse::clear CLEARS the whole buffer, it's safe to break here + // But since it might be rewritten anyway (and hopefully there aren't a lot of messages, we just continue. + + const MouseAction& e = Mouse::getEvent(); + +#ifdef RPI // If clicked when not having focus, get focus @keyboard + if (!mouseGrabbed) { + if (!screen && e.data == MouseAction::DATA_DOWN) { + grabMouse(); + } + } +#endif + + if (allowGuiClicks && e.action == MouseAction::ACTION_LEFT && e.data == MouseAction::DATA_DOWN) { + gui.handleClick(MouseAction::ACTION_LEFT, Mouse::getX(), Mouse::getY()); + } + + if (e.action == MouseAction::ACTION_WHEEL) { + Inventory* v = player->inventory; + int numSlots = gui.getNumSlots() - 1; + int slot = (v->selected - e.dy + numSlots) % numSlots; + v->selectSlot(slot); + } + /* + if (mouseDiggable && options.useMouseForDigging) { + if (Mouse::getEventButton() == MouseAction::ACTION_LEFT && Mouse::getEventButtonState()) { + handleMouseClick(MouseAction::ACTION_LEFT); + lastClickTick = ticks; + } + if (Mouse::getEventButton() == MouseAction::ACTION_RIGHT && Mouse::getEventButtonState()) { + handleMouseClick(MouseAction::ACTION_RIGHT); + lastClickTick = ticks; + } + } + */ + } + + TIMER_POP_PUSH("keyboard"); + while (Keyboard::next()) { + int key = Keyboard::getEventKey(); + bool isPressed = (Keyboard::getEventKeyState() == KeyboardAction::KEYDOWN); + player->setKey(key, isPressed); + + if (isPressed) { + gui.handleKeyPressed(key); + + #if defined(WIN32) || defined(RPI)//|| defined(_DEBUG) || defined(DEBUG) + if (key >= '0' && key <= '9') { + int digit = key - '0'; + int slot = digit - 1; + + if (slot >= 0 && slot < gui.getNumSlots()-1) + player->inventory->selectSlot(slot); + + #if defined(WIN32) + if (digit >= 1 && GetAsyncKeyState(VK_CONTROL) < 0) { + // Set adventure settings here! + AdventureSettingsPacket p(level->adventureSettings); + p.toggle((AdventureSettingsPacket::Flags)(1 << slot)); + p.fillIn(level->adventureSettings); + raknetInstance->send(p); + } + if (digit == 0) { + Pos pos((int)player->x, (int)player->y-1, (int)player->z); + SetSpawnPositionPacket p(pos); + raknetInstance->send(p); + } + #endif + } + #endif + #if defined(RPI) + if (key == Keyboard::KEY_E) { + screenChooser.setScreen(SCREEN_BLOCKSELECTION); + } + if (!screen && key == Keyboard::KEY_O || key == 250) { + releaseMouse(); + } + #endif + #if defined(WIN32) + if (key == Keyboard::KEY_F) { + options.isFlying = !options.isFlying; + player->noPhysics = options.isFlying; + } + + if (key == Keyboard::KEY_T) { + options.thirdPersonView = !options.thirdPersonView; + /* + ImprovedNoise noise; + for (int i = 0; i < 16; ++i) + printf("%d\t%f\n", i, noise.grad2(i, 3, 8)); + */ + } + + if (key == Keyboard::KEY_O) { + useAmbientOcclusion = !useAmbientOcclusion; + options.ambientOcclusion = useAmbientOcclusion; + levelRenderer->allChanged(); + } + + if (key == Keyboard::KEY_L) + options.viewDistance = (options.viewDistance + 1) % 4; + + if (key == Keyboard::KEY_U) { + onGraphicsReset(); + player->heal(100); + } + + if (key == Keyboard::KEY_B || key == 108) // Toggle the game mode + setIsCreativeMode(!isCreativeMode()); + + if (key == Keyboard::KEY_P) // Step forward in time + level->setTime( level->getTime() + 1000); + + if (key == Keyboard::KEY_G) { + setScreen(new ArmorScreen()); + /* + std::vector& boxs = level->getCubes(NULL, AABB(128.1f, 73, 128.1f, 128.9f, 74.9f, 128.9f)); + LOGI("boxes: %d\n", (int)boxs.size()); + */ + } + + if (key == Keyboard::KEY_Y) { + textures->reloadAll(); + player->hurtTo(2); + } + if (key == Keyboard::KEY_Z || key == 108) { + for (int i = 0; i < 1; ++i) { + Mob* mob = NULL; + int forceId = 0;//MobTypes::Sheep; + + int types[] = { + MobTypes::Sheep, + MobTypes::Pig, + MobTypes::Chicken, + MobTypes::Cow, + }; + + int mobType = (forceId > 0)? forceId : types[Mth::random(sizeof(types) / sizeof(int))]; + mob = MobFactory::CreateMob(mobType, level); + + //((Animal*)mob)->setAge(-1000); + float dx = 4 - 8 * Mth::random() + 4 * Mth::sin(Mth::DEGRAD * player->yRot); + float dz = 4 - 8 * Mth::random() + 4 * Mth::cos(Mth::DEGRAD * player->yRot); + if (mob && !MobSpawner::addMob(level, mob, player->x + dx, player->y, player->z + dz, Mth::random()*360, 0, true)) + delete mob; + } + } + + if (key == Keyboard::KEY_X) { + const EntityList& entities = level->getAllEntities(); + for (int i = entities.size()-1; i >= 0; --i) { + Entity* e = entities[i]; + if (!e->isPlayer()) + level->removeEntity(e); + } + } + + if (key == Keyboard::KEY_C /*|| key == 4*/) { + player->inventory->clearInventoryWithDefault(); + // @todo: Add saving here for benchmarking + } + if (key == Keyboard::KEY_H) { + setScreen( new PrerenderTilesScreen() ); + } + + if (key == Keyboard::KEY_O) { + for (int i = Inventory::MAX_SELECTION_SIZE; i < player->inventory->getContainerSize(); ++i) + if (player->inventory->getItem(i)) + player->inventory->dropSlot(i, false); + } + if (key == Keyboard::KEY_F3) { + options.renderDebug = !options.renderDebug; + } + if (key == Keyboard::KEY_M) { + options.difficulty = (options.difficulty == Difficulty::PEACEFUL)? + Difficulty::NORMAL : Difficulty::PEACEFUL; + //setIsCreativeMode( !isCreativeMode() ); + } + + // lanternroci + if (key == Keyboard::KEY_ESCAPE) + pauseGame(false); + if (key == Keyboard::KEY_E && !options.isFlying) { + screenChooser.setScreen(SCREEN_BLOCKSELECTION); + } + + if (options.renderDebug) { + if (key >= '0' && key <= '9') { + _perfRenderer->debugFpsMeterKeyPress(key - '0'); + } + } + #endif + + #ifndef RPI + if (key == 82) + pauseGame(false); + #else + if (key == Keyboard::KEY_ESCAPE) + pauseGame(false); + #endif + + #ifndef OPENGL_ES + if (key == Keyboard::KEY_P) { + static bool isWireFrame = false; + isWireFrame = !isWireFrame; + glPolygonMode(GL_FRONT, isWireFrame? GL_LINE : GL_FILL); + //glPolygonMode(GL_BACK, isWireFrame? GL_LINE : GL_FILL); + } + #endif + } + #ifdef WIN32 + if (key == Keyboard::KEY_M) { + for (int i = 0; i < 5 * SharedConstants::TicksPerSecond; ++i) + level->tick(); + } + #endif + + + //if (!isPressed) LOGI("Key released: %d\n", key); + + if (!options.useMouseForDigging) { + int passedTime = getTimeMs() - lastTickTime; + if (passedTime > 200) continue; + + // Destroy and attack is on same button + if (key == options.keyDestroy.key && isPressed) { + BuildActionIntention bai(BuildActionIntention::BAI_REMOVE | BuildActionIntention::BAI_ATTACK); + handleBuildAction(&bai); + } + else // Build and use/interact is on same button + if (key == options.keyUse.key && isPressed) { + BuildActionIntention bai(BuildActionIntention::BAI_BUILD | BuildActionIntention::BAI_INTERACT); + handleBuildAction(&bai); + } + } + } + + TIMER_POP_PUSH("tickbuild"); + BuildActionIntention bai; + // @note: This might be a problem. This method is polling based here, but + // event based when using mouse (or keys..), and in java. Not quite + // sure just yet what way to go. + bool buildHandled = inputHolder->getBuildInput()->tickBuild(player, &bai); + if (buildHandled) { + if (!bai.isRemoveContinue()) + handleBuildAction(&bai); + } + + bool isTryingToDestroyBlock = (options.useMouseForDigging + ? (Mouse::isButtonDown(MouseAction::ACTION_LEFT) && mouseDiggable) + : Keyboard::isKeyDown(options.keyDestroy.key)) + || (buildHandled && bai.isRemove()); + + TIMER_POP_PUSH("handlemouse"); +#ifdef RPI + handleMouseDown(MouseAction::ACTION_LEFT, isTryingToDestroyBlock); + handleMouseClick(buildHandled && bai.isInteract() + || options.useMouseForDigging && Mouse::isButtonDown(MouseAction::ACTION_RIGHT)); +#else + handleMouseDown(MouseAction::ACTION_LEFT, isTryingToDestroyBlock || (buildHandled && bai.isInteract())); +#endif + + lastTickTime = getTimeMs(); + + // we have (hopefully) handled the keyboard & mouse queue and it + // can now be emptied. If wanted, the reset could be changed to: + // index -= numRead; // then this code doesn't have to be placed here + // + it prepares for tick not handling all or any events. + // update: RAII'ing instead, see above + //Keyboard::reset(); + //Mouse::reset(); + + TIMER_POP(); +#endif +} + +void Minecraft::handleMouseDown(int button, bool down) { +#ifndef STANDALONE_SERVER +#ifndef RPI + if(player->isUsingItem()) { + if(!down && !Keyboard::isKeyDown(options.keyUse.key)) { + gameMode->releaseUsingItem(player); + } + return; + } +#endif + if(player->isSleeping()) { + return; + } + if (button == MouseAction::ACTION_LEFT && missTime > 0) return; + if (down && hitResult.type == TILE && button == MouseAction::ACTION_LEFT && !hitResult.indirectHit) { + int x = hitResult.x; + int y = hitResult.y; + int z = hitResult.z; + gameMode->continueDestroyBlock(x, y, z, hitResult.f); + particleEngine->crack(x, y, z, hitResult.f); + player->swing(); + } else { + gameMode->stopDestroyBlock(); + } +#endif +} + +void Minecraft::handleMouseClick(int button) { +// BuildActionIntention bai( +// (button == MouseAction::ACTION_LEFT)? +// BuildActionIntention::BAI_REMOVE +// : BuildActionIntention::BAI_BUILD); +// +// handleBuildAction(&bai); +} + +void Minecraft::handleBuildAction(BuildActionIntention* action) { +#ifndef STANDALONE_SERVER + if (action->isRemove()) { + if (missTime > 0) return; + player->swing(); + } + if(player->isUsingItem()) + return; + bool mayUse = true; + + if (!hitResult.isHit()) { + if (action->isRemove() && !gameMode->isCreativeType()) { + missTime = 10; + } + } else if (hitResult.type == ENTITY) { + if (action->isAttack()) { + player->swing(); + //LOGI("attacking!\n"); + InteractPacket packet(InteractPacket::Attack, player->entityId, hitResult.entity->entityId); + raknetInstance->send(packet); + gameMode->attack(player, hitResult.entity); + } else if (action->isInteract()) { + if (hitResult.entity->interactPreventDefault()) + mayUse = false; + //LOGI("interacting!\n"); + InteractPacket packet(InteractPacket::Interact, player->entityId, hitResult.entity->entityId); + raknetInstance->send(packet); + gameMode->interact(player, hitResult.entity); + } + } else if (hitResult.type == TILE) { + int x = hitResult.x; + int y = hitResult.y; + int z = hitResult.z; + int face = hitResult.f; + + int oldTileId = level->getTile(x, y, z); + Tile* oldTile = Tile::tiles[oldTileId]; + + //bool tryDestroyBlock = false; + + if (action->isRemove()) { + if (!oldTile) + return; + + //LOGI("tile: %s - %d, %d, %d. b: %f - %f\n", oldTile->getDescriptionId().c_str(), x, y, z, oldTile->getBrightness(level, x, y, z), oldTile->getBrightness(level, x, y+1, z)); + level->extinguishFire(x, y, z, hitResult.f); + gameMode->startDestroyBlock(x, y, z, hitResult.f); + } + else { + ItemInstance* item = player->inventory->getSelected(); + if (gameMode->useItemOn(player, level, item, x, y, z, face, hitResult.pos)) { + mayUse = false; + player->swing(); + #ifdef RPI + } else if (item && item->id == ((Item*)Item::sword_iron)->id) { + player->swing(); + #endif + } + if (item && item->count <= 0) { + player->inventory->clearSlot(player->inventory->selected); + } + //} else if (item && item->count != oldCount) { + // gameRenderer->itemInHandRenderer->itemPlaced(); + //} + } + } + if (mayUse && action->isInteract()) { + ItemInstance* item = player->inventory->getSelected(); + if (item && !player->isUsingItem()) { + if (gameMode->useItem(player, level, item)) { + gameRenderer->itemInHandRenderer->itemUsed(); + } + if (item && item->count <= 0) { + player->inventory->clearSlot(player->inventory->selected); + } + } + } +#endif +} + +bool Minecraft::isOnlineClient() +{ + return (level != NULL && level->isClientSide); +} + +bool Minecraft::isOnline() +{ + return netCallback != NULL; +} + +void Minecraft::pauseGame(bool isBackPaused) { +#ifndef STANDALONE_SERVER + if (screen != NULL) return; + screenChooser.setScreen(isBackPaused? SCREEN_PAUSEPREV : SCREEN_PAUSE); +#endif +} +void Minecraft::gameLostFocus() { +#ifndef STANDALONE_SERVER + if(screen != NULL) { + screen->lostFocus(); + } +#endif +} + + +void Minecraft::setScreen( Screen* screen ) +{ +#ifndef STANDALONE_SERVER + Mouse::reset(); + Multitouch::reset(); + Multitouch::resetThisUpdate(); + + if (screenMutex) { + hasScheduledScreen = true; + scheduledScreen = screen; + return; + } + + if (screen != NULL && screen->isErrorScreen()) + return; + if (screen == NULL && level == NULL) + screen = screenChooser.createScreen(SCREEN_STARTMENU); + + if (this->screen != NULL) { + this->screen->removed(); + delete this->screen; + } + + this->screen = screen; + if (screen != NULL) { + releaseMouse(); + //ScreenSizeCalculator ssc = new ScreenSizeCalculator(options, width, height); + int screenWidth = (int)(width * Gui::InvGuiScale); //ssc.getWidth(); + int screenHeight = (int)(height * Gui::InvGuiScale); //ssc.getHeight(); + screen->init(this, screenWidth, screenHeight); + + if (screen->isInGameScreen() && level) { + level->saveLevelData(); + level->saveGame(); + } + + //noRender = false; + } else { + grabMouse(); + } +#endif +} + +void Minecraft::grabMouse() +{ +#ifndef STANDALONE_SERVER + if (mouseGrabbed) return; + mouseGrabbed = true; + mouseHandler.grab(); + //setScreen(NULL); +#endif +} + +void Minecraft::releaseMouse() +{ +#ifndef STANDALONE_SERVER + if (!mouseGrabbed) { + return; + } + if (player) { + player->releaseAllKeys(); + } + mouseGrabbed = false; + mouseHandler.release(); +#endif +} + +bool Minecraft::useTouchscreen() { +#ifdef RPI + return false; +#endif + return options.useTouchScreen || !_supportsNonTouchscreen; +} +bool Minecraft::supportNonTouchScreen() { + return _supportsNonTouchscreen; +} +void Minecraft::init() +{ + options.minecraft = this; + options.initDefaultValues(); +#ifndef STANDALONE_SERVER + checkGlError("Init enter"); + + _supportsNonTouchscreen = !platform()->supportsTouchscreen(); + + LOGI("IS TOUCHSCREEN? %d\n", options.useTouchScreen); + + textures = new Textures(&options, platform()); + textures->addDynamicTexture(new WaterTexture()); + textures->addDynamicTexture(new WaterSideTexture()); + gui.texturesLoaded(textures); + + levelRenderer = new LevelRenderer(this); + gameRenderer = new GameRenderer(this); + particleEngine = new ParticleEngine(level, textures); + + // Platform specific initialization here + font = new Font(&options, "font/default8.png", textures); + + _perfRenderer = new PerfRenderer(this, font); + + checkGlError("Init complete"); +#endif + + user = new User("TestUser", ""); + setIsCreativeMode(false); // false means it's Survival Mode + reloadOptions(); + +} + +void Minecraft::setSize(int w, int h) { +#ifndef STANDALONE_SERVER + transformResolution(&w, &h); + + width = w; + height = h; + + if (width >= 1000) { + #ifdef __APPLE__ + Gui::GuiScale = (width > 2000)? 8.0f : 4.0f; + #else + Gui::GuiScale = 4.0f; + #endif + } + else if (width >= 800) { +#ifdef __APPLE__ + Gui::GuiScale = 4.0f; +#else + Gui::GuiScale = 3.0f; +#endif + } + else if (width >= 400) + Gui::GuiScale = 2.0f; + else + Gui::GuiScale = 1.0f; + + Gui::InvGuiScale = 1.0f / Gui::GuiScale; + int screenWidth = (int)(width * Gui::InvGuiScale); + int screenHeight = (int)(height * Gui::InvGuiScale); + + if (platform()) { + float pixelsPerMillimeter = options.getProgressValue(&Options::Option::PIXELS_PER_MILLIMETER); + pixelCalc.setPixelsPerMillimeter(pixelsPerMillimeter); + pixelCalcUi.setPixelsPerMillimeter(pixelsPerMillimeter * Gui::InvGuiScale); + } + + Config config = createConfig(this); + gui.onConfigChanged(config); + + if (screen) + screen->setSize(screenWidth, screenHeight); + + if (inputHolder) + inputHolder->onConfigChanged(config); + //LOGI("Setting size: %d, %d: %f\n", width, height, Gui::InvGuiScale); + +#ifdef WIN32 + char resbuf[128]; + sprintf(resbuf, " %d x %d @ scale %.2f", width, height, Gui::GuiScale); + //gui.addMessage(resbuf); +#endif +#endif /* STANDALONE_SERVER */ +} + +void Minecraft::reloadOptions() { + options.update(); + options.save(); + bool wasTouchscreen = options.useTouchScreen; + options.useTouchScreen = useTouchscreen(); + options.save(); + + if ((wasTouchscreen != options.useTouchScreen) || (inputHolder == 0)) + _reloadInput(); + + user->name = options.username; + + LOGI("Reloading-options\n"); + + // @todo @fix Android and iOS behaves a bit differently when leaving + // an options screen (Android recreates OpenGL surface) + setSize(width, height); +} + +void Minecraft::_reloadInput() { +#ifndef STANDALONE_SERVER + delete inputHolder; + + if (useTouchscreen()) { + inputHolder = new TouchInputHolder(this, &options); + } else { + #if defined(ANDROID) || defined(__APPLE__) + inputHolder = new CustomInputHolder( + new XperiaPlayInput(&options), + new ControllerTurnInput(2, ControllerTurnInput::MODE_DELTA), + new IBuildInput()); + #else + inputHolder = new CustomInputHolder( + new KeyboardInput(&options), + new MouseTurnInput(MouseTurnInput::MODE_DELTA, width/2, height/2), + new MouseBuildInput()); + #endif + } + + mouseHandler.setTurnInput(inputHolder->getTurnInput()); + if (level && player) { + player->input = inputHolder->getMoveInput(); + } +#endif +} + + +// +// Multiplayer +// +void Minecraft::locateMultiplayer() { + isLookingForMultiplayer = true; + + raknetInstance->pingForHosts(19132); + netCallback = new ClientSideNetworkHandler(this, raknetInstance); +} + +void Minecraft::cancelLocateMultiplayer() { + isLookingForMultiplayer = false; + + raknetInstance->stopPingForHosts(); + + delete netCallback; + netCallback = NULL; +} + +bool Minecraft::joinMultiplayer( const PingedCompatibleServer& server ) +{ + if (isLookingForMultiplayer && netCallback) { + isLookingForMultiplayer = false; + return raknetInstance->connect(server.address.ToString(false), server.address.GetPort()); + } + return false; +} + +void Minecraft::hostMultiplayer(int port) { + // Tear down last instance + raknetInstance->disconnect(); + delete netCallback; + netCallback = NULL; + +#if !defined(NO_NETWORK) + netCallback = new ServerSideNetworkHandler(this, raknetInstance); + #ifdef STANDALONE_SERVER + raknetInstance->host(user->name, port, 16); + #else + raknetInstance->host(user->name, port); + #endif +#endif +} + +// +// Level generation +// +/*static*/ + + void* Minecraft::prepareLevel_tspawn(void *p_param) +{ + Minecraft* mc = (Minecraft*) p_param; + mc->generateLevel("Currently not used", mc->level); + return 0; +} + +void Minecraft::generateLevel( const std::string& message, Level* level ) +{ + Stopwatch s; + s.start(); + prepareLevel(message); + s.stop(); + s.print("Level generated: "); + + // "Unlock" + isGeneratingLevel = false; +} + +void Minecraft::_levelGenerated() +{ +#ifndef STANDALONE_SERVER + if (player == NULL) { + player = (LocalPlayer*) gameMode->createPlayer(level); + gameMode->initPlayer(player); + } + + if (player) { + player->input = inputHolder->getMoveInput(); + } + + if (levelRenderer != NULL) levelRenderer->setLevel(level); + if (particleEngine != NULL) particleEngine->setLevel(level); + + gameMode->adjustPlayer(player); + gui.onLevelGenerated(); +#endif + + level->validateSpawn(); + level->loadPlayer(player, true); + // if we are client side, we trust the server to have given us a correct position + if (player && !level->isClientSide) { + player->resetPos(false); + } + + this->cameraTargetPlayer = player; + + if (raknetInstance->isServer()) + raknetInstance->announceServer(user->name); + + if (netCallback) { + netCallback->levelGenerated(level); + } + +#if defined(WIN32) || defined(RPI) + if (_commandServer) { + delete _commandServer; + } + _commandServer = new CommandServer(this); + _commandServer->init(commandPort); +#endif + + // Hack to (hopefully) get the players to show (note: in LevelListener + // instead, since adding yourself always generates a entityAdded) + //EntityRenderDispatcher::getInstance()->onGraphicsReset(); + _hasSignaledGeneratingLevelFinished = true; +} + +Player* Minecraft::respawnPlayer(int playerId) { + for (unsigned int i = 0; i < level->players.size(); ++i) { + if (level->players[i]->entityId == playerId) { + resetPlayer(level->players[i]); + return level->players[i]; + } + } + return NULL; +} + +void Minecraft::resetPlayer(Player* player) { + level->validateSpawn(); + player->reset(); + + Pos p; + if(player->hasRespawnPosition()) { + p = player->getRespawnPosition(); + } + else { + p = level->getSharedSpawnPos(); + } + player->setPos((float)p.x + 0.5f, (float)p.y + 1.0f, (float)p.z + 0.5f); + player->resetPos(true); + + if (isCreativeMode()) + player->inventory->clearInventoryWithDefault(); +} + +void Minecraft::respawnPlayer() { + // RESET THE FRACKING PLAYER HERE + //bool slowCheck = false; + //for (int i = 0; i < level->entities.size(); ++i) + // if (level->entities[i] == player) slowCheck = true; + // + //LOGI("Has entity? %d, %d\n", level->getEntity(player->entityId), slowCheck); + + resetPlayer(player); + + // tell server (or other client) that we re-spawned + RespawnPacket packet(player); + raknetInstance->send(packet); +} + +void Minecraft::onGraphicsReset() +{ +#ifndef STANDALONE_SERVER + textures->clear(); + + font->onGraphicsReset(); + gui.onGraphicsReset(); + + if (levelRenderer) levelRenderer->onGraphicsReset(); + if (gameRenderer) gameRenderer->onGraphicsReset(); + + EntityRenderDispatcher::getInstance()->onGraphicsReset(); + TileEntityRenderDispatcher::getInstance()->onGraphicsReset(); +#endif +} + +int Minecraft::getProgressStatusId() { + return progressStageStatusId; +} + +const char* Minecraft::getProgressMessage() +{ + return progressMessages[progressStageStatusId]; +} + +bool Minecraft::isLevelGenerated() +{ + return level != NULL && !isGeneratingLevel; +} + +LevelStorageSource* Minecraft::getLevelSource() +{ + return storageSource; +} + +int Minecraft::getLicenseId() { + if (!LicenseCodes::isReady(_licenseId)) + _licenseId = platform()->checkLicense(); + return _licenseId; +} + +void Minecraft::audioEngineOn() { +#ifndef STANDALONE_SERVER + soundEngine->enable(true); +#endif +} +void Minecraft::audioEngineOff() { +#ifndef STANDALONE_SERVER + soundEngine->enable(false); +#endif +} + +void Minecraft::setIsCreativeMode(bool isCreative) +{ +#ifdef CREATORMODE + delete gameMode; + gameMode = new CreatorMode(this); + _isCreativeMode = true; +#else + if (!gameMode || isCreative != _isCreativeMode) + { + delete gameMode; + if (isCreative) gameMode = new CreativeMode(this); + else gameMode = new SurvivalMode(this); + _isCreativeMode = isCreative; + } +#endif + if (player) + gameMode->initAbilities(player->abilities); +} + +bool Minecraft::isCreativeMode() { + return _isCreativeMode; +} + +bool Minecraft::isKindleFire(int kindleVersion) { + if (kindleVersion != 1) + return false; + + std::string model = platform()->getPlatformStringVar(PlatformStringVars::DEVICE_BUILD_MODEL); + std::string modelLower(model); + std::transform(modelLower.begin(), modelLower.end(), modelLower.begin(), tolower); + + return (modelLower.find("kindle") != std::string::npos) && (modelLower.find("fire") != std::string::npos); +} + +bool Minecraft::transformResolution(int* w, int* h) +{ + bool changed = false; + + // Kindle Fire 1: reporting wrong height in + // certain cases (e.g. after screen lock) + if (isKindleFire(1) && *h >= 560 && *h <= 620) { + *h = 580; + changed = true; + } + + return changed; +} + +ICreator* Minecraft::getCreator() +{ +#ifdef CREATORMODE + return ((CreatorMode*)gameMode)->getCreator(); +#else + return NULL; +#endif +} + +void Minecraft::optionUpdated( const Options::Option* option, bool value ) { + if(netCallback != NULL && option == &Options::Option::SERVER_VISIBLE) { + ServerSideNetworkHandler* ss = (ServerSideNetworkHandler*) netCallback; + ss->allowIncomingConnections(value); + } +} + +void Minecraft::optionUpdated( const Options::Option* option, float value ) { +#ifndef STANDALONE_SERVER + if(option == &Options::Option::PIXELS_PER_MILLIMETER) { + pixelCalcUi.setPixelsPerMillimeter(value * Gui::InvGuiScale); + pixelCalc.setPixelsPerMillimeter(value); + } +#endif +} + +void Minecraft::optionUpdated( const Options::Option* option, int value ) { + +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/83105CECE6AA00603D9DA1057156A4A0 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/83105CECE6AA00603D9DA1057156A4A0 new file mode 100644 index 0000000..55155fc --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/83105CECE6AA00603D9DA1057156A4A0 @@ -0,0 +1,146 @@ +#include "TextEditScreen.h" +#include "../../../world/level/tile/entity/SignTileEntity.h" +#include "../../../AppPlatform.h" +#include "../../Minecraft.h" +#include "../../renderer/tileentity/TileEntityRenderDispatcher.h" +#include "../../renderer/Tesselator.h" +#include "../../renderer/Textures.h" +#include "../../renderer/GameRenderer.h" +#include "../components/Button.h" +#include "../../../network/Packet.h" +#include "../../../network/RakNetInstance.h" +TextEditScreen::TextEditScreen( SignTileEntity* signEntity ) + : sign(signEntity), isShowingKeyboard(false), frame(0), line(0), btnClose(1, "") { + +} +TextEditScreen::~TextEditScreen() { + +} +void TextEditScreen::init() { + super::init(); + minecraft->platform()->showKeyboard(); + isShowingKeyboard = true; + ImageDef def; + def.name = "gui/spritesheet.png"; + def.x = 0; + def.y = 1; + def.width = def.height = 18; + def.setSrc(IntRectangle(60, 0, 18, 18)); + btnClose.setImageDef(def, true); + btnClose.scaleWhenPressed = false; + buttons.push_back(&btnClose); +} + +void TextEditScreen::setupPositions() { + btnClose.width = btnClose.height = 19; + btnClose.x = width - btnClose.width; + btnClose.y = 0; +} + + +bool TextEditScreen::handleBackEvent( bool isDown ) { + sign->setChanged(); + Packet* signUpdatePacket = sign->getUpdatePacket(); + minecraft->raknetInstance->send(signUpdatePacket); + minecraft->platform()->hideKeyboard(); + minecraft->setScreen(NULL); + return true; +} + +void TextEditScreen::render( int xm, int ym, float a ) { + glDepthMask(GL_FALSE); + renderBackground(); + glPushMatrix(); + glDepthMask(GL_TRUE); + glDisable(GL_CULL_FACE); + glLoadIdentity(); + Tesselator& t = Tesselator::instance; + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrthof(0.0f, (float)minecraft->width, (float)minecraft->height, 0, -1, 1); + glMatrixMode(GL_MODELVIEW); + + minecraft->textures->loadAndBindTexture("item/sign.png"); + glColor4f2(1, 1, 1, 1); + + static float minUV[] = {0.03126f, 0.06249f}; + static float maxUV[] = {0.39063f, 0.4374f}; + float scale = ((minecraft->height / 2) / 32) * 0.9f; + + glTranslatef(minecraft->width / 2.0f, 5.0f, 0.0f); + glScalef2(scale,scale,1); + t.begin(GL_QUADS); + t.vertexUV(-32, 0, 0.0f,minUV[0],minUV[1]); + t.vertexUV(32, 0, 0.0f, maxUV[0], minUV[1]); + t.vertexUV(32, 0 + 32, 0.0f, maxUV[0], maxUV[1]); + t.vertexUV(-32, 0 + 32, 0.0f, minUV[0], maxUV[1]); + t.draw(); + + sign->selectedLine = line; + float textScale = 8.0f / 11.0f; + + glTranslatef(0, 2 ,0); + glScalef2(textScale, textScale, 1); + for(int i = 0; i < 4; ++i) { + //drawCenteredString(font, sign->messages[a], 32.0f, 10 * a, 0xFF000000); + std::string msg = sign->messages[i]; + if (i == sign->selectedLine && msg.length() < 14) { + std::string s = "> " + msg + " <"; + font->draw(s, -(float)font->width(s) / 2.0f, 10.0f * i, 0xFF000000, false); + } else { + font->draw(msg, -(float)font->width(msg) / 2.0f, 10.0f * i, 0xFF000000, false); + } + } + sign->selectedLine = -1; + //font->draw("Hej", minecraft->width / 2, 100, 0xFFFFFFFF, false); + + glPopMatrix(); + glEnable(GL_CULL_FACE); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + + //glEnable(GL_DEPTH_TEST); + super::render(xm, ym, a); +} + +void TextEditScreen::lostFocus() { + +} + +void TextEditScreen::tick() { + frame++; +} + +void TextEditScreen::keyPressed( int eventKey ) { + LOGW("Key pressed! [%d]", eventKey); + if(eventKey == Keyboard::KEY_BACKSPACE) { + if(sign->messages[line].length() > 0) { + sign->messages[line].erase(sign->messages[line].size() - 1, 1); + } else { + line--; + if(line < 0) { + line = 3; + } + } + } else if(eventKey == Keyboard::KEY_RETURN) { + line = (line + 1) % 4; + } else { + super::keyPressed(eventKey); + } +} + +void TextEditScreen::keyboardNewChar( char inputChar ) { + std::string fullstring = sign->messages[line] + inputChar; + if(fullstring.length() < 16) { + sign->messages[line] = fullstring; + //LOGW("Line text updated: %s\n", fullstring.c_str()); + } +} + +void TextEditScreen::buttonClicked( Button* button ) { + if(button == &btnClose) + handleBackEvent(true); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/9CAB88584C535B15B7D916C84A38AB20 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/9CAB88584C535B15B7D916C84A38AB20 new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/9CAB88584C535B15B7D916C84A38AB20 @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/AF8821B3E089A14209FA7C2F8B96C378 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/AF8821B3E089A14209FA7C2F8B96C378 new file mode 100644 index 0000000..fe92a27 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/AF8821B3E089A14209FA7C2F8B96C378 @@ -0,0 +1,233 @@ +#include "TouchJoinGameScreen.h" +#include "../StartMenuScreen.h" +#include "../ProgressScreen.h" +#include "../../Font.h" +#include "../../../Minecraft.h" +#include "../../../renderer/Textures.h" + +namespace Touch { + +// +// Games list +// + +void AvailableGamesList::selectStart( int item) { + startSelected = item; +} + +void AvailableGamesList::selectCancel() { + startSelected = -1; +} + +void AvailableGamesList::selectItem( int item, bool doubleClick ) { + LOGI("selected an item! %d\n", item); + selectedItem = item; +} + +void AvailableGamesList::renderItem( int i, int x, int y, int h, Tesselator& t ) +{ + if (startSelected == i && Multitouch::getFirstActivePointerIdEx() >= 0) { + fill((int)x0, y, (int)x1, y+h, 0x809E684F); + } + + //static int colors[2] = {0xffffb0, 0xcccc90}; + const PingedCompatibleServer& s = copiedServerList[i]; + unsigned int color = s.isSpecial? 0x6090a0 : 0xffffb0; + unsigned int color2 = 0xffffa0;//colors[i&1]; + + int xx1 = (int)x0 + 24; + int xx2 = xx1; + + if (s.isSpecial) { + xx1 += 50; + + glEnable2(GL_TEXTURE_2D); + glColor4f2(1,1,1,1); + glEnable2(GL_BLEND); + minecraft->textures->loadAndBindTexture("gui/badge/minecon140.png"); + blit(xx2, y + 6, 0, 0, 37, 8, 140, 240); + } + + drawString(minecraft->font, s.name.C_String(), xx1, y + 4 + 2, color); + drawString(minecraft->font, s.address.ToString(false), xx2, y + 18, color2); + + /* + drawString(minecraft->font, copiedServerList[i].name.C_String(), (int)x0 + 24, y + 4, color); + drawString(minecraft->font, copiedServerList[i].address.ToString(false), (int)x0 + 24, y + 18, color); + */ +} + + +// +// Join Game screen +// +JoinGameScreen::JoinGameScreen() +: bJoin( 2, "Join Game"), + bBack( 3, "Back"), + bHeader(0, ""), + gamesList(NULL) +{ + bJoin.active = false; + //gamesList->yInertia = 0.5f; +} + +JoinGameScreen::~JoinGameScreen() +{ + delete gamesList; +} + +void JoinGameScreen::init() +{ + //buttons.push_back(&bJoin); + buttons.push_back(&bBack); + buttons.push_back(&bHeader); + + minecraft->raknetInstance->clearServerList(); + gamesList = new AvailableGamesList(minecraft, width, height); + +#ifdef ANDROID + //tabButtons.push_back(&bJoin); + tabButtons.push_back(&bBack); +#endif +} + +void JoinGameScreen::setupPositions() { + //int yBase = height - 26; + + //#ifdef ANDROID + bJoin.y = 0; + bBack.y = 0; + bHeader.y = 0; + //#endif + + // Center buttons + //bJoin.x = width / 2 - 4 - bJoin.w; + bBack.x = 0;//width / 2 + 4; + bHeader.x = bBack.width; + bHeader.width = width - bHeader.x; +} + +void JoinGameScreen::buttonClicked(Button* button) +{ + if (button->id == bJoin.id) + { + if (isIndexValid(gamesList->selectedItem)) + { + PingedCompatibleServer selectedServer = gamesList->copiedServerList[gamesList->selectedItem]; + minecraft->joinMultiplayer(selectedServer); + { + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + } + //minecraft->locateMultiplayer(); + //minecraft->setScreen(new JoinGameScreen()); + } + if (button->id == bBack.id) + { + minecraft->cancelLocateMultiplayer(); + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } +} + +bool JoinGameScreen::handleBackEvent(bool isDown) +{ + if (!isDown) + { + minecraft->cancelLocateMultiplayer(); + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } + return true; +} + + +bool JoinGameScreen::isIndexValid( int index ) +{ + return gamesList && index >= 0 && index < gamesList->getNumberOfItems(); +} + +void JoinGameScreen::tick() +{ + if (isIndexValid(gamesList->selectedItem)) { + buttonClicked(&bJoin); + return; + } + + //gamesList->tick(); + + const ServerList& orgServerList = minecraft->raknetInstance->getServerList(); + ServerList serverList; + for (unsigned int i = 0; i < orgServerList.size(); ++i) + if (orgServerList[i].name.GetLength() > 0) + serverList.push_back(orgServerList[i]); + + if (serverList.size() != gamesList->copiedServerList.size()) + { + // copy the currently selected item + PingedCompatibleServer selectedServer; + bool hasSelection = false; + if (isIndexValid(gamesList->selectedItem)) + { + selectedServer = gamesList->copiedServerList[gamesList->selectedItem]; + hasSelection = true; + } + + gamesList->copiedServerList = serverList; + gamesList->selectItem(-1, false); + + // re-select previous item if it still exists + if (hasSelection) + { + for (unsigned int i = 0; i < gamesList->copiedServerList.size(); i++) + { + if (gamesList->copiedServerList[i].address == selectedServer.address) + { + gamesList->selectItem(i, false); + break; + } + } + } + } else { + for (int i = (int)gamesList->copiedServerList.size()-1; i >= 0 ; --i) { + for (int j = 0; j < (int) serverList.size(); ++j) + if (serverList[j].address == gamesList->copiedServerList[i].address) + gamesList->copiedServerList[i].name = serverList[j].name; + } + } + + bJoin.active = isIndexValid(gamesList->selectedItem); +} + +void JoinGameScreen::render( int xm, int ym, float a ) +{ + bool hasNetwork = minecraft->platform()->isNetworkEnabled(true); +#ifdef WIN32 + hasNetwork = hasNetwork && !GetAsyncKeyState(VK_TAB); +#endif + + renderBackground(); + if (hasNetwork) gamesList->render(xm, ym, a); + else gamesList->renderDirtBackground(); + Screen::render(xm, ym, a); + + const int baseX = bHeader.x + bHeader.width / 2; + + if (hasNetwork) { + std::string s = "Scanning for WiFi Games..."; + drawCenteredString(minecraft->font, s, baseX, 8, 0xffffffff); + + const int textWidth = minecraft->font->width(s); + const int spinnerX = baseX + textWidth / 2 + 6; + + static const char* spinnerTexts[] = {"-", "\\", "|", "/"}; + int n = ((int)(5.5f * getTimeS()) % 4); + drawCenteredString(minecraft->font, spinnerTexts[n], spinnerX, 8, 0xffffffff); + } else { + drawCenteredString(minecraft->font, "WiFi is disabled", baseX, 8, 0xffffffff); + } +} + +bool JoinGameScreen::isInGameScreen() { return false; } + +}; diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/D4B5B0C119D103A5E19CA95A18260B3C b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/D4B5B0C119D103A5E19CA95A18260B3C new file mode 100644 index 0000000..bbafff6 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/D4B5B0C119D103A5E19CA95A18260B3C @@ -0,0 +1,1578 @@ +#include "Minecraft.h" + +#if defined(APPLE_DEMO_PROMOTION) + #define NO_NETWORK +#endif + +#if defined(RPI) + #define CREATORMODE +#endif + +#include "../network/RakNetInstance.h" +#include "../network/ClientSideNetworkHandler.h" +#include "../network/ServerSideNetworkHandler.h" +//#include "../network/Packet.h" +#include "../world/entity/player/Inventory.h" +#include "../world/level/chunk/ChunkCache.h" +#include "../world/level/tile/Tile.h" +#include "../world/level/storage/LevelStorageSource.h" +#include "../world/level/storage/LevelStorage.h" +#include "player/input/KeyboardInput.h" +#ifndef STANDALONE_SERVER +#include "player/input/touchscreen/TouchInputHolder.h" +#endif +#include "player/LocalPlayer.h" +#include "gamemode/CreativeMode.h" +#include "gamemode/SurvivalMode.h" +#include "player/LocalPlayer.h" +#ifndef STANDALONE_SERVER +#include "particle/ParticleEngine.h" +#include "gui/Screen.h" +#include "gui/Font.h" +#include "gui/screens/RenameMPLevelScreen.h" +#include "sound/SoundEngine.h" +#endif +#include "../platform/CThread.h" +#include "../platform/input/Mouse.h" +#include "../AppPlatform.h" +#include "../Performance.h" +#include "../LicenseCodes.h" +#include "../util/PerfTimer.h" +#include "../util/PerfRenderer.h" +#include "player/input/MouseBuildInput.h" + +#include "../world/Facing.h" + +#include "../network/packet/PlaceBlockPacket.h" + +#include "player/input/IInputHolder.h" +#ifndef STANDALONE_SERVER +#include "player/input/touchscreen/TouchscreenInput.h" + +#include "player/input/ControllerTurnInput.h" +#include "player/input/XperiaPlayInput.h" + +#endif + +#include "player/input/MouseTurnInput.h" +#include "../world/entity/MobFactory.h" +#include "../world/level/MobSpawner.h" +#include "../util/Mth.h" +#include "../network/packet/InteractPacket.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/PrerenderTilesScreen.h" +#include "renderer/Textures.h" +#include "gui/screens/DeathScreen.h" +#endif + +#include "../network/packet/RespawnPacket.h" +#include "IConfigListener.h" +#include "../world/entity/MobCategory.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/FurnaceScreen.h" +#endif +#include "../world/Difficulty.h" +#include "../server/ServerLevel.h" +#ifdef CREATORMODE +#include "../server/CreatorLevel.h" +#endif +#include "../network/packet/AdventureSettingsPacket.h" +#include "../network/packet/SetSpawnPositionPacket.h" +#include "../network/command/CommandServer.h" +#include "gamemode/CreatorMode.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/ArmorScreen.h" +#endif +#include "../world/level/levelgen/synth/ImprovedNoise.h" +#ifndef STANDALONE_SERVER +#include "renderer/tileentity/TileEntityRenderDispatcher.h" +#endif + +#ifndef STANDALONE_SERVER +#include "renderer/ptexture/DynamicTexture.h" +#include "renderer/GameRenderer.h" +#include "renderer/ItemInHandRenderer.h" +#include "renderer/LevelRenderer.h" +#include "renderer/entity/EntityRenderDispatcher.h" +#include "gui/Screen.h" +#include "gui/Font.h" +#include "gui/screens/RenameMPLevelScreen.h" +#include "sound/SoundEngine.h" +#endif + +static void checkGlError(const char* tag) { +#ifdef GLDEBUG + while (1) { + const int errCode = glGetError(); + if (errCode == GL_NO_ERROR) break; + + LOGE("################\nOpenGL-error @ %s : #%d\n", tag, errCode); + } +#endif /*GLDEBUG*/ +} + +/*static*/ +const char* Minecraft::progressMessages[] = { + "Locating server", + "Building terrain", + "Preparing", + "Saving chunks" +}; + +int Minecraft::customDebugId = Minecraft::CDI_NONE; + +#if defined(_MSC_VER) + #pragma warning( disable : 4355 ) // 'this' pointer in initialization list which is perfectly legal +#endif + +bool Minecraft::useAmbientOcclusion = false; + +Minecraft::Minecraft() +: user(NULL), + level(NULL), + player(NULL), + cameraTargetPlayer(NULL), + levelRenderer(NULL), + gameRenderer(NULL), +#ifndef STANDALONE_SERVER + particleEngine(NULL), + _perfRenderer(NULL), +#endif + _commandServer(NULL), +#ifndef STANDALONE_SERVER + textures(NULL), +#endif + lastTickTime(-1), + lastTime(0), + ticksSinceLastUpdate(0), + gameMode(NULL), + mouseGrabbed(true), + missTime(0), + pause(false), + _running(false), + timer(20), +#ifndef STANDALONE_SERVER + gui(this), +#endif + netCallback(NULL), +#ifndef STANDALONE_SERVER + screen(NULL), + font(NULL), +#endif + screenMutex(false), +#ifndef STANDALONE_SERVER + scheduledScreen(NULL), + hasScheduledScreen(false), + soundEngine(NULL), +#endif + ticks(0), + isGeneratingLevel(false), + _hasSignaledGeneratingLevelFinished(true), + generateLevelThread(NULL), + progressStagePercentage(0), + progressStageStatusId(0), + isLookingForMultiplayer(false), + _licenseId(LicenseCodes::WAIT_PLATFORM_NOT_READY), + inputHolder(0), + _supportsNonTouchscreen(false), +#ifndef STANDALONE_SERVER + screenChooser(this), +#endif + width(1), height(1), + //_respawnPlayerTicks(-1), +#ifdef __APPLE__ + _isSuperFast(false), +#endif + _powerVr(false), + commandPort(4711), + reserved_d1(0),reserved_d2(0), + reserved_f1(0),reserved_f2(0) +{ +//#ifdef ANDROID + +#if defined(NO_NETWORK) + raknetInstance = new IRakNetInstance(); +#else + raknetInstance = new RakNetInstance(); +#endif +#ifndef STANDALONE_SERVER + soundEngine = new SoundEngine(20.0f); + soundEngine->init(this, &options); +#endif + //setupPieces(); +} + +Minecraft::~Minecraft() +{ + delete netCallback; + delete raknetInstance; +#ifndef STANDALONE_SERVER + delete levelRenderer; + delete gameRenderer; + delete particleEngine; + + delete soundEngine; +#endif + delete gameMode; +#ifndef STANDALONE_SERVER + delete font; + delete textures; + + if (screen != NULL) { + delete screen; + screen = NULL; + } +#endif + if (level != NULL) { + level->saveGame(); + if (level->getChunkSource()) + level->getChunkSource()->saveAll(true); + delete level->getLevelStorage(); + delete level; + level = NULL; + } + + //delete player; + delete user; + delete inputHolder; + + delete storageSource; + delete _perfRenderer; + delete _commandServer; + + MobFactory::clearStaticTestMobs(); +#ifndef STANDALONE_SERVER + EntityRenderDispatcher::destroy(); +#endif +} + +// Only called by server +void Minecraft::selectLevel( const std::string& levelId, const std::string& levelName, const LevelSettings& settings ) +{ +#if defined(CREATORMODE) + level = new CreatorLevel( +#else + level = new ServerLevel( +#endif + storageSource->selectLevel(levelId, false), + levelName, + settings, + SharedConstants::GeneratorVersion); + + // note: settings is useless beyond this point, since it's + // either copied to LevelData (or LevelData read from file) + setLevel(level, "Generating level"); + setIsCreativeMode(level->getLevelData()->getGameType() == GameType::Creative); + _running = true; +} + +void Minecraft::setLevel(Level* level, const std::string& message /* ="" */, LocalPlayer* forceInsertPlayer /* = NULL */) { + cameraTargetPlayer = NULL; + LOGI("Seed is %ld\n", level->getSeed()); + + if (level != NULL) { + level->raknetInstance = raknetInstance; + gameMode->initLevel(level); + + if (!player && forceInsertPlayer) + { + player = forceInsertPlayer; + player->resetPos(false); + //level->addEntity(forceInsertPlayer); + } + else if (player != NULL) { + player->resetPos(false); + if (level != NULL) { + level->addEntity(player); + } + } + this->level = level; + _hasSignaledGeneratingLevelFinished = false; +#ifdef STANDALONE_SERVER + const bool threadedLevelCreation = false; +#else + const bool threadedLevelCreation = true; +#endif + + if (threadedLevelCreation) { + // Threaded + // "Lock" + isGeneratingLevel = true; + generateLevelThread = new CThread(Minecraft::prepareLevel_tspawn, this); + } else { + // Non-threaded + generateLevel("Currently not used", level); + } + } else { + player = NULL; + } + + this->lastTickTime = 0; + this->_running = true; +} + +void Minecraft::leaveGame(bool renameLevel /*=false*/) +{ + if (isGeneratingLevel || !_hasSignaledGeneratingLevelFinished) + return; + + isGeneratingLevel = false; + bool saveLevel = level && (!level->isClientSide || renameLevel); + + raknetInstance->disconnect(); + if (saveLevel) { + // If server or wanting to save level as client, save all unsaved chunks! + level->getChunkSource()->saveAll(true); + } + + LOGI("Clearing levels\n"); + + cameraTargetPlayer = NULL; +#ifndef STANDALONE_SERVER + levelRenderer->setLevel(NULL); + particleEngine->setLevel(NULL); +#endif + LOGI("Erasing callback\n"); + delete netCallback; + netCallback = NULL; + + LOGI("Erasing level\n"); + if (level != NULL) { + delete level->getLevelStorage(); + delete level; + level = NULL; + } + //delete player; + player = NULL; + cameraTargetPlayer = NULL; + + _running = false; +#ifndef STANDALONE_SERVER + if (renameLevel) { + setScreen(new RenameMPLevelScreen(LevelStorageSource::TempLevelId)); + } + else + screenChooser.setScreen(SCREEN_STARTMENU); +#endif +} + +void Minecraft::prepareLevel(const std::string& title) { + LOGI("status: 1\n"); + progressStageStatusId = 1; + + Stopwatch A, B, C, D; + A.start(); + + Stopwatch L; + + // Dont update lights if we load the level (ok, actually just with leveldata version=1.+(?)) + if (!level->isNew()) + level->setUpdateLights(false); + + int Max = CHUNK_CACHE_WIDTH * CHUNK_CACHE_WIDTH; + int pp = 0; + for (int x = 8; x < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); x += CHUNK_WIDTH) { + for (int z = 8; z < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); z += CHUNK_WIDTH) { + progressStagePercentage = 100 * pp++ / Max; + //printf("level generation progress %d\n", progressStagePercentage); + B.start(); + level->getTile(x, 64, z); + B.stop(); + L.start(); + if (level->isNew()) + while (level->updateLights()) + ; + L.stop(); + } + } + A.stop(); + level->setUpdateLights(true); + + C.start(); + for (int x = 0; x < CHUNK_CACHE_WIDTH; x++) + { + for (int z = 0; z < CHUNK_CACHE_WIDTH; z++) + { + LevelChunk* chunk = level->getChunk(x, z); + if (chunk && !chunk->createdFromSave) + { + chunk->unsaved = false; + chunk->clearUpdateMap(); + } + } + } + C.stop(); + + LOGI("status: 3\n"); + progressStageStatusId = 3; + if (level->isNew()) { + level->setInitialSpawn(); // @note: should obviously be called from Level itself + level->saveLevelData(); + level->getChunkSource()->saveAll(false); + level->saveGame(); + } else { + level->saveLevelData(); + level->loadEntities(); + } + + progressStagePercentage = -1; + progressStageStatusId = 2; + LOGI("status: 2\n"); + + D.start(); + level->prepare(); + D.stop(); + + A.print("Generate level: "); + L.print(" - light: "); + B.print(" - getTl: "); + C.print(" - clear: "); + D.print(" - prepr: "); + progressStageStatusId = 0; +} + +void Minecraft::update() { + //LOGI("Enter Update\n"); + + if (Options::debugGl) + LOGI(">>>>>>>>>>\n"); + + TIMER_PUSH("root"); + + //if (level) { + // LOGI("numplayers: %d\n", level->players.size()); + // for (int i = 0; i < level->players.size(); ++i) { + // Player* p = level->players[i]; + // bool inEnt = std::find(level->entities.begin(), level->entities.end(), p) != level->entities.end(); + // LOGI(" %p, %d, %d - in? %d\n", p, p->entityId, p->owner.ToUint32(p->owner), inEnt); + // } + //} + + if (pause && level != NULL) { + float lastA = timer.a; + timer.advanceTime(); + timer.a = lastA; + } else { + timer.advanceTime(); + } + + if (raknetInstance) { + raknetInstance->runEvents(netCallback); + } + + TIMER_PUSH("tick"); + int toTick = timer.ticks; + for (int i = 0; i < toTick; ++i, ++ticks) + tick(i, toTick-1); + + TIMER_POP_PUSH("updatelights"); + if (level && !isGeneratingLevel) { + level->updateLights(); + } + TIMER_POP(); + + #ifndef STANDALONE_SERVER + if (gameMode != NULL) gameMode->render(timer.a); + TIMER_PUSH("sound"); + soundEngine->update(player, timer.a); + TIMER_POP_PUSH("render"); + gameRenderer->render(timer.a); + TIMER_POP(); + #else + CThread::sleep(1); + #endif +#ifndef STANDALONE_SERVER + Multitouch::resetThisUpdate(); +#endif + TIMER_POP(); +#ifndef STANDALONE_SERVER + checkGlError("Update finished"); + + if (options.renderDebug) { + if (!PerfTimer::enabled) { + PerfTimer::reset(); + PerfTimer::enabled = true; + } + + //TIMER_PUSH("debugfps"); + _perfRenderer->renderFpsMeter(1); + checkGlError("render debug"); + //TIMER_POP(); + } else { + PerfTimer::enabled = false; + } +#endif + //LOGI("Exit Update\n"); +} + +void Minecraft::tick(int nTick, int maxTick) { + if (missTime > 0) missTime--; +#ifndef STANDALONE_SERVER + if (!screen && player) { + if (player->health <= 0) { + setScreen(new DeathScreen()); + } + } +#endif + TIMER_PUSH("gameMode"); + if (level && !pause) { + gameMode->tick(); + } + + TIMER_POP_PUSH("commandServer"); + if (level && _commandServer) { + _commandServer->tick(); + } + + TIMER_POP_PUSH("input"); + tickInput(); +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("gui"); + gui.tick(); +#endif + // + // Ongoing level generation in a (perhaps) different thread. When it's + // ready, _levelGenerated() is called once and any threads are deleted. + // + if (isGeneratingLevel) { + return; + } else if (!_hasSignaledGeneratingLevelFinished) { + if (generateLevelThread) { + delete generateLevelThread; + generateLevelThread = NULL; + } + _levelGenerated(); + } + + // + // Normal game loop, run before or efter level generation + // + if (level != NULL) + { + if (!pause) { +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("gameRenderer"); + gameRenderer->tick(nTick, maxTick); + + TIMER_POP_PUSH("levelRenderer"); + levelRenderer->tick(); +#endif + level->difficulty = options.difficulty; + if (level->isClientSide) level->difficulty = Difficulty::EASY; + + TIMER_POP_PUSH("level"); + level->tickEntities(); + level->tick(); +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("animateTick"); + if (player) { + level->animateTick(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); + } +#endif + } + } +#ifndef STANDALONE_SERVER + textures->loadAndBindTexture("terrain.png"); + if (!pause && !(screen && !screen->renderGameBehind())) { + #if !defined(RPI) + #ifdef __APPLE__ + if (isSuperFast()) + #endif + { + if (nTick == maxTick) { + TIMER_POP_PUSH("textures"); + textures->tick(true); + } + } + #endif + } + TIMER_POP_PUSH("particles"); + particleEngine->tick(); + if (screen) { + screenMutex = true; + screen->tick(); + screenMutex = false; + } + + // @note: fix to keep "isPressed" and "isReleased" as long as necessary. + // Most likely keyboard and mouse could/should be reset here as well. + Multitouch::reset(); +#endif + TIMER_POP(); +} + +class InputRAII { +public: + ~InputRAII() { +#ifndef STANDALONE_SERVER + Mouse::reset(); + Keyboard::reset(); +#endif + } +}; + +void Minecraft::tickInput() { +#ifndef STANDALONE_SERVER + InputRAII raiiInput; + + if (screen && !screen->passEvents) { + screenMutex = true; + screen->updateEvents(); + //screen->updateSetScreen(); + screenMutex = false; + if (hasScheduledScreen) { + setScreen(scheduledScreen); + scheduledScreen = NULL; + hasScheduledScreen = false; + } + return; + } + + if (!player) { + return; + } + +#ifdef RPI + bool mouseDiggable = true; + bool allowGuiClicks = !mouseGrabbed; +#else + bool mouseDiggable = !gui.isInside(Mouse::getX(), Mouse::getY()); + bool allowGuiClicks = true; +#endif + + TIMER_PUSH("mouse"); + while (Mouse::next()) { + //if (Mouse::getButtonState(MouseAction::ACTION_LEFT)) + // LOGI("mouse-down-at: %d, %d\n", Mouse::getX(), Mouse::getY()); + int passedTime = getTimeMs() - lastTickTime; + if (passedTime > 200) continue; // @note: As long Mouse::clear CLEARS the whole buffer, it's safe to break here + // But since it might be rewritten anyway (and hopefully there aren't a lot of messages, we just continue. + + const MouseAction& e = Mouse::getEvent(); + +#ifdef RPI // If clicked when not having focus, get focus @keyboard + if (!mouseGrabbed) { + if (!screen && e.data == MouseAction::DATA_DOWN) { + grabMouse(); + } + } +#endif + + if (allowGuiClicks && e.action == MouseAction::ACTION_LEFT && e.data == MouseAction::DATA_DOWN) { + gui.handleClick(MouseAction::ACTION_LEFT, Mouse::getX(), Mouse::getY()); + } + + if (e.action == MouseAction::ACTION_WHEEL) { + Inventory* v = player->inventory; + int numSlots = gui.getNumSlots() - 1; + int slot = (v->selected - e.dy + numSlots) % numSlots; + v->selectSlot(slot); + } + /* + if (mouseDiggable && options.useMouseForDigging) { + if (Mouse::getEventButton() == MouseAction::ACTION_LEFT && Mouse::getEventButtonState()) { + handleMouseClick(MouseAction::ACTION_LEFT); + lastClickTick = ticks; + } + if (Mouse::getEventButton() == MouseAction::ACTION_RIGHT && Mouse::getEventButtonState()) { + handleMouseClick(MouseAction::ACTION_RIGHT); + lastClickTick = ticks; + } + } + */ + } + + TIMER_POP_PUSH("keyboard"); + while (Keyboard::next()) { + int key = Keyboard::getEventKey(); + bool isPressed = (Keyboard::getEventKeyState() == KeyboardAction::KEYDOWN); + player->setKey(key, isPressed); + + if (isPressed) { + gui.handleKeyPressed(key); + + #if defined(WIN32) || defined(RPI)//|| defined(_DEBUG) || defined(DEBUG) + if (key >= '0' && key <= '9') { + int digit = key - '0'; + int slot = digit - 1; + + if (slot >= 0 && slot < gui.getNumSlots()-1) + player->inventory->selectSlot(slot); + + #if defined(WIN32) + if (digit >= 1 && GetAsyncKeyState(VK_CONTROL) < 0) { + // Set adventure settings here! + AdventureSettingsPacket p(level->adventureSettings); + p.toggle((AdventureSettingsPacket::Flags)(1 << slot)); + p.fillIn(level->adventureSettings); + raknetInstance->send(p); + } + if (digit == 0) { + Pos pos((int)player->x, (int)player->y-1, (int)player->z); + SetSpawnPositionPacket p(pos); + raknetInstance->send(p); + } + #endif + } + #endif + #if defined(RPI) + if (key == Keyboard::KEY_E) { + screenChooser.setScreen(SCREEN_BLOCKSELECTION); + } + if (!screen && key == Keyboard::KEY_O || key == 250) { + releaseMouse(); + } + #endif + #if defined(WIN32) + if (key == Keyboard::KEY_F) { + options.isFlying = !options.isFlying; + player->noPhysics = options.isFlying; + } + + if (key == Keyboard::KEY_T) { + options.thirdPersonView = !options.thirdPersonView; + /* + ImprovedNoise noise; + for (int i = 0; i < 16; ++i) + printf("%d\t%f\n", i, noise.grad2(i, 3, 8)); + */ + } + + if (key == Keyboard::KEY_O) { + useAmbientOcclusion = !useAmbientOcclusion; + options.ambientOcclusion = useAmbientOcclusion; + levelRenderer->allChanged(); + } + + if (key == Keyboard::KEY_L) + options.viewDistance = (options.viewDistance + 1) % 4; + + if (key == Keyboard::KEY_U) { + onGraphicsReset(); + player->heal(100); + } + + if (key == Keyboard::KEY_B || key == 108) // Toggle the game mode + setIsCreativeMode(!isCreativeMode()); + + if (key == Keyboard::KEY_P) // Step forward in time + level->setTime( level->getTime() + 1000); + + if (key == Keyboard::KEY_G) { + setScreen(new ArmorScreen()); + /* + std::vector& boxs = level->getCubes(NULL, AABB(128.1f, 73, 128.1f, 128.9f, 74.9f, 128.9f)); + LOGI("boxes: %d\n", (int)boxs.size()); + */ + } + + if (key == Keyboard::KEY_Y) { + textures->reloadAll(); + player->hurtTo(2); + } + if (key == Keyboard::KEY_Z || key == 108) { + for (int i = 0; i < 1; ++i) { + Mob* mob = NULL; + int forceId = 0;//MobTypes::Sheep; + + int types[] = { + MobTypes::Sheep, + MobTypes::Pig, + MobTypes::Chicken, + MobTypes::Cow, + }; + + int mobType = (forceId > 0)? forceId : types[Mth::random(sizeof(types) / sizeof(int))]; + mob = MobFactory::CreateMob(mobType, level); + + //((Animal*)mob)->setAge(-1000); + float dx = 4 - 8 * Mth::random() + 4 * Mth::sin(Mth::DEGRAD * player->yRot); + float dz = 4 - 8 * Mth::random() + 4 * Mth::cos(Mth::DEGRAD * player->yRot); + if (mob && !MobSpawner::addMob(level, mob, player->x + dx, player->y, player->z + dz, Mth::random()*360, 0, true)) + delete mob; + } + } + + if (key == Keyboard::KEY_X) { + const EntityList& entities = level->getAllEntities(); + for (int i = entities.size()-1; i >= 0; --i) { + Entity* e = entities[i]; + if (!e->isPlayer()) + level->removeEntity(e); + } + } + + if (key == Keyboard::KEY_C /*|| key == 4*/) { + player->inventory->clearInventoryWithDefault(); + // @todo: Add saving here for benchmarking + } + if (key == Keyboard::KEY_H) { + setScreen( new PrerenderTilesScreen() ); + } + + if (key == Keyboard::KEY_O) { + for (int i = Inventory::MAX_SELECTION_SIZE; i < player->inventory->getContainerSize(); ++i) + if (player->inventory->getItem(i)) + player->inventory->dropSlot(i, false); + } + if (key == Keyboard::KEY_F3) { + options.renderDebug = !options.renderDebug; + } + if (key == Keyboard::KEY_M) { + options.difficulty = (options.difficulty == Difficulty::PEACEFUL)? + Difficulty::NORMAL : Difficulty::PEACEFUL; + //setIsCreativeMode( !isCreativeMode() ); + } + + // lanternroci + if (key == Keyboard::KEY_ESCAPE) + pauseGame(false); + if (key == Keyboard::KEY_E && !options.isFlying) { + screenChooser.setScreen(SCREEN_BLOCKSELECTION); + } + + if (options.renderDebug) { + if (key >= '0' && key <= '9') { + _perfRenderer->debugFpsMeterKeyPress(key - '0'); + } + } + #endif + + #ifndef RPI + if (key == 82) + pauseGame(false); + #else + if (key == Keyboard::KEY_ESCAPE) + pauseGame(false); + #endif + + #ifndef OPENGL_ES + if (key == Keyboard::KEY_P) { + static bool isWireFrame = false; + isWireFrame = !isWireFrame; + glPolygonMode(GL_FRONT, isWireFrame? GL_LINE : GL_FILL); + //glPolygonMode(GL_BACK, isWireFrame? GL_LINE : GL_FILL); + } + #endif + } + #ifdef WIN32 + if (key == Keyboard::KEY_M) { + for (int i = 0; i < 5 * SharedConstants::TicksPerSecond; ++i) + level->tick(); + } + #endif + + + //if (!isPressed) LOGI("Key released: %d\n", key); + + if (!options.useMouseForDigging) { + int passedTime = getTimeMs() - lastTickTime; + if (passedTime > 200) continue; + + // Destroy and attack is on same button + if (key == options.keyDestroy.key && isPressed) { + BuildActionIntention bai(BuildActionIntention::BAI_REMOVE | BuildActionIntention::BAI_ATTACK); + handleBuildAction(&bai); + } + else // Build and use/interact is on same button + if (key == options.keyUse.key && isPressed) { + BuildActionIntention bai(BuildActionIntention::BAI_BUILD | BuildActionIntention::BAI_INTERACT); + handleBuildAction(&bai); + } + } + } + + TIMER_POP_PUSH("tickbuild"); + BuildActionIntention bai; + // @note: This might be a problem. This method is polling based here, but + // event based when using mouse (or keys..), and in java. Not quite + // sure just yet what way to go. + bool buildHandled = inputHolder->getBuildInput()->tickBuild(player, &bai); + if (buildHandled) { + if (!bai.isRemoveContinue()) + handleBuildAction(&bai); + } + + bool isTryingToDestroyBlock = (options.useMouseForDigging + ? (Mouse::isButtonDown(MouseAction::ACTION_LEFT) && mouseDiggable) + : Keyboard::isKeyDown(options.keyDestroy.key)) + || (buildHandled && bai.isRemove()); + + TIMER_POP_PUSH("handlemouse"); +#ifdef RPI + handleMouseDown(MouseAction::ACTION_LEFT, isTryingToDestroyBlock); + handleMouseClick(buildHandled && bai.isInteract() + || options.useMouseForDigging && Mouse::isButtonDown(MouseAction::ACTION_RIGHT)); +#else + handleMouseDown(MouseAction::ACTION_LEFT, isTryingToDestroyBlock || (buildHandled && bai.isInteract())); +#endif + + lastTickTime = getTimeMs(); + + // we have (hopefully) handled the keyboard & mouse queue and it + // can now be emptied. If wanted, the reset could be changed to: + // index -= numRead; // then this code doesn't have to be placed here + // + it prepares for tick not handling all or any events. + // update: RAII'ing instead, see above + //Keyboard::reset(); + //Mouse::reset(); + + TIMER_POP(); +#endif +} + +void Minecraft::handleMouseDown(int button, bool down) { +#ifndef STANDALONE_SERVER +#ifndef RPI + if(player->isUsingItem()) { + if(!down && !Keyboard::isKeyDown(options.keyUse.key)) { + gameMode->releaseUsingItem(player); + } + return; + } +#endif + if(player->isSleeping()) { + return; + } + if (button == MouseAction::ACTION_LEFT && missTime > 0) return; + if (down && hitResult.type == TILE && button == MouseAction::ACTION_LEFT && !hitResult.indirectHit) { + int x = hitResult.x; + int y = hitResult.y; + int z = hitResult.z; + gameMode->continueDestroyBlock(x, y, z, hitResult.f); + particleEngine->crack(x, y, z, hitResult.f); + player->swing(); + } else { + gameMode->stopDestroyBlock(); + } +#endif +} + +void Minecraft::handleMouseClick(int button) { +// BuildActionIntention bai( +// (button == MouseAction::ACTION_LEFT)? +// BuildActionIntention::BAI_REMOVE +// : BuildActionIntention::BAI_BUILD); +// +// handleBuildAction(&bai); +} + +void Minecraft::handleBuildAction(BuildActionIntention* action) { +#ifndef STANDALONE_SERVER + if (action->isRemove()) { + if (missTime > 0) return; + player->swing(); + } + if(player->isUsingItem()) + return; + bool mayUse = true; + + if (!hitResult.isHit()) { + if (action->isRemove() && !gameMode->isCreativeType()) { + missTime = 10; + } + } else if (hitResult.type == ENTITY) { + if (action->isAttack()) { + player->swing(); + //LOGI("attacking!\n"); + InteractPacket packet(InteractPacket::Attack, player->entityId, hitResult.entity->entityId); + raknetInstance->send(packet); + gameMode->attack(player, hitResult.entity); + } else if (action->isInteract()) { + if (hitResult.entity->interactPreventDefault()) + mayUse = false; + //LOGI("interacting!\n"); + InteractPacket packet(InteractPacket::Interact, player->entityId, hitResult.entity->entityId); + raknetInstance->send(packet); + gameMode->interact(player, hitResult.entity); + } + } else if (hitResult.type == TILE) { + int x = hitResult.x; + int y = hitResult.y; + int z = hitResult.z; + int face = hitResult.f; + + int oldTileId = level->getTile(x, y, z); + Tile* oldTile = Tile::tiles[oldTileId]; + + //bool tryDestroyBlock = false; + + if (action->isRemove()) { + if (!oldTile) + return; + + //LOGI("tile: %s - %d, %d, %d. b: %f - %f\n", oldTile->getDescriptionId().c_str(), x, y, z, oldTile->getBrightness(level, x, y, z), oldTile->getBrightness(level, x, y+1, z)); + level->extinguishFire(x, y, z, hitResult.f); + gameMode->startDestroyBlock(x, y, z, hitResult.f); + } + else { + ItemInstance* item = player->inventory->getSelected(); + if (gameMode->useItemOn(player, level, item, x, y, z, face, hitResult.pos)) { + mayUse = false; + player->swing(); + #ifdef RPI + } else if (item && item->id == ((Item*)Item::sword_iron)->id) { + player->swing(); + #endif + } + if (item && item->count <= 0) { + player->inventory->clearSlot(player->inventory->selected); + } + //} else if (item && item->count != oldCount) { + // gameRenderer->itemInHandRenderer->itemPlaced(); + //} + } + } + if (mayUse && action->isInteract()) { + ItemInstance* item = player->inventory->getSelected(); + if (item && !player->isUsingItem()) { + if (gameMode->useItem(player, level, item)) { + gameRenderer->itemInHandRenderer->itemUsed(); + } + if (item && item->count <= 0) { + player->inventory->clearSlot(player->inventory->selected); + } + } + } +#endif +} + +bool Minecraft::isOnlineClient() +{ + return (level != NULL && level->isClientSide); +} + +bool Minecraft::isOnline() +{ + return netCallback != NULL; +} + +void Minecraft::pauseGame(bool isBackPaused) { +#ifndef STANDALONE_SERVER + if (screen != NULL) return; + screenChooser.setScreen(isBackPaused? SCREEN_PAUSEPREV : SCREEN_PAUSE); +#endif +} +void Minecraft::gameLostFocus() { +#ifndef STANDALONE_SERVER + if(screen != NULL) { + screen->lostFocus(); + } +#endif +} + + +void Minecraft::setScreen( Screen* screen ) +{ +#ifndef STANDALONE_SERVER + Mouse::reset(); + Multitouch::reset(); + Multitouch::resetThisUpdate(); + + if (screenMutex) { + hasScheduledScreen = true; + scheduledScreen = screen; + return; + } + + if (screen != NULL && screen->isErrorScreen()) + return; + if (screen == NULL && level == NULL) + screen = screenChooser.createScreen(SCREEN_STARTMENU); + + if (this->screen != NULL) { + this->screen->removed(); + delete this->screen; + } + + this->screen = screen; + if (screen != NULL) { + releaseMouse(); + //ScreenSizeCalculator ssc = new ScreenSizeCalculator(options, width, height); + int screenWidth = (int)(width * Gui::InvGuiScale); //ssc.getWidth(); + int screenHeight = (int)(height * Gui::InvGuiScale); //ssc.getHeight(); + screen->init(this, screenWidth, screenHeight); + + if (screen->isInGameScreen() && level) { + level->saveLevelData(); + level->saveGame(); + } + + //noRender = false; + } else { + grabMouse(); + } +#endif +} + +void Minecraft::grabMouse() +{ +#ifndef STANDALONE_SERVER + if (mouseGrabbed) return; + mouseGrabbed = true; + mouseHandler.grab(); + //setScreen(NULL); +#endif +} + +void Minecraft::releaseMouse() +{ +#ifndef STANDALONE_SERVER + if (!mouseGrabbed) { + return; + } + if (player) { + player->releaseAllKeys(); + } + mouseGrabbed = false; + mouseHandler.release(); +#endif +} + +bool Minecraft::useTouchscreen() { +#ifdef RPI + return false; +#endif + return options.useTouchScreen || !_supportsNonTouchscreen; +} +bool Minecraft::supportNonTouchScreen() { + return _supportsNonTouchscreen; +} +void Minecraft::init() +{ + options.minecraft = this; + options.initDefaultValues(); +#ifndef STANDALONE_SERVER + checkGlError("Init enter"); + + _supportsNonTouchscreen = !platform()->supportsTouchscreen(); + + LOGI("IS TOUCHSCREEN? %d\n", options.useTouchScreen); + + textures = new Textures(&options, platform()); + textures->addDynamicTexture(new WaterTexture()); + textures->addDynamicTexture(new WaterSideTexture()); + gui.texturesLoaded(textures); + + levelRenderer = new LevelRenderer(this); + gameRenderer = new GameRenderer(this); + particleEngine = new ParticleEngine(level, textures); + + // Platform specific initialization here + font = new Font(&options, "font/default8.png", textures); + + _perfRenderer = new PerfRenderer(this, font); + + checkGlError("Init complete"); +#endif + + user = new User("TestUser", ""); + setIsCreativeMode(false); // false means it's Survival Mode + reloadOptions(); + +} + +void Minecraft::setSize(int w, int h) { +#ifndef STANDALONE_SERVER + transformResolution(&w, &h); + + width = w; + height = h; + + if (width >= 1000) { + #ifdef __APPLE__ + Gui::GuiScale = (width > 2000)? 8.0f : 4.0f; + #else + Gui::GuiScale = 4.0f; + #endif + } + else if (width >= 800) { +#ifdef __APPLE__ + Gui::GuiScale = 4.0f; +#else + Gui::GuiScale = 3.0f; +#endif + } + else if (width >= 400) + Gui::GuiScale = 2.0f; + else + Gui::GuiScale = 1.0f; + + Gui::InvGuiScale = 1.0f / Gui::GuiScale; + int screenWidth = (int)(width * Gui::InvGuiScale); + int screenHeight = (int)(height * Gui::InvGuiScale); + + if (platform()) { + float pixelsPerMillimeter = options.getProgressValue(&Options::Option::PIXELS_PER_MILLIMETER); + pixelCalc.setPixelsPerMillimeter(pixelsPerMillimeter); + pixelCalcUi.setPixelsPerMillimeter(pixelsPerMillimeter * Gui::InvGuiScale); + } + + Config config = createConfig(this); + gui.onConfigChanged(config); + + if (screen) + screen->setSize(screenWidth, screenHeight); + + if (inputHolder) + inputHolder->onConfigChanged(config); + //LOGI("Setting size: %d, %d: %f\n", width, height, Gui::InvGuiScale); + +#ifdef WIN32 + char resbuf[128]; + sprintf(resbuf, " %d x %d @ scale %.2f", width, height, Gui::GuiScale); + //gui.addMessage(resbuf); +#endif +#endif /* STANDALONE_SERVER */ +} + +void Minecraft::reloadOptions() { + options.update(); + options.save(); + bool wasTouchscreen = options.useTouchScreen; + options.useTouchScreen = useTouchscreen(); + options.save(); + + if ((wasTouchscreen != options.useTouchScreen) || (inputHolder == 0)) + _reloadInput(); + + user->name = options.username; + + LOGI("Reloading-options\n"); + + // @todo @fix Android and iOS behaves a bit differently when leaving + // an options screen (Android recreates OpenGL surface) + setSize(width, height); +} + +void Minecraft::_reloadInput() { +#ifndef STANDALONE_SERVER + delete inputHolder; + + if (useTouchscreen()) { + inputHolder = new TouchInputHolder(this, &options); + } else { + #if defined(ANDROID) || defined(__APPLE__) + inputHolder = new CustomInputHolder( + new XperiaPlayInput(&options), + new ControllerTurnInput(2, ControllerTurnInput::MODE_DELTA), + new IBuildInput()); + #else + inputHolder = new CustomInputHolder( + new KeyboardInput(&options), + new MouseTurnInput(MouseTurnInput::MODE_DELTA, width/2, height/2), + new MouseBuildInput()); + #endif + } + + mouseHandler.setTurnInput(inputHolder->getTurnInput()); + if (level && player) { + player->input = inputHolder->getMoveInput(); + } +#endif +} + + +// +// Multiplayer +// +void Minecraft::locateMultiplayer() { +#ifndef WIN32 + isLookingForMultiplayer = true; + + raknetInstance->pingForHosts(19132); + netCallback = new ClientSideNetworkHandler(this, raknetInstance); +#else + // Server discovery/ping-for-hosts isn't supported/reliable on Windows in this build. + isLookingForMultiplayer = false; + // Ensure any previous list is cleared and no callback is left active + raknetInstance->clearServerList(); + if (netCallback) { delete netCallback; netCallback = NULL; } +#endif +} + +void Minecraft::cancelLocateMultiplayer() { +#ifndef WIN32 + isLookingForMultiplayer = false; + + raknetInstance->stopPingForHosts(); + + delete netCallback; + netCallback = NULL; +#else + // Nothing to stop on Windows; just ensure state is clean + isLookingForMultiplayer = false; + raknetInstance->clearServerList(); + if (netCallback) { delete netCallback; netCallback = NULL; } +#endif +} + +bool Minecraft::joinMultiplayer( const PingedCompatibleServer& server ) +{ + if (isLookingForMultiplayer && netCallback) { + isLookingForMultiplayer = false; + return raknetInstance->connect(server.address.ToString(false), server.address.GetPort()); + } + return false; +} + +void Minecraft::hostMultiplayer(int port) { + // Tear down last instance + raknetInstance->disconnect(); + delete netCallback; + netCallback = NULL; + +#if !defined(NO_NETWORK) + netCallback = new ServerSideNetworkHandler(this, raknetInstance); + #ifdef STANDALONE_SERVER + raknetInstance->host(user->name, port, 16); + #else + raknetInstance->host(user->name, port); + #endif +#endif +} + +// +// Level generation +// +/*static*/ + + void* Minecraft::prepareLevel_tspawn(void *p_param) +{ + Minecraft* mc = (Minecraft*) p_param; + mc->generateLevel("Currently not used", mc->level); + return 0; +} + +void Minecraft::generateLevel( const std::string& message, Level* level ) +{ + Stopwatch s; + s.start(); + prepareLevel(message); + s.stop(); + s.print("Level generated: "); + + // "Unlock" + isGeneratingLevel = false; +} + +void Minecraft::_levelGenerated() +{ +#ifndef STANDALONE_SERVER + if (player == NULL) { + player = (LocalPlayer*) gameMode->createPlayer(level); + gameMode->initPlayer(player); + } + + if (player) { + player->input = inputHolder->getMoveInput(); + } + + if (levelRenderer != NULL) levelRenderer->setLevel(level); + if (particleEngine != NULL) particleEngine->setLevel(level); + + gameMode->adjustPlayer(player); + gui.onLevelGenerated(); +#endif + + level->validateSpawn(); + level->loadPlayer(player, true); + // if we are client side, we trust the server to have given us a correct position + if (player && !level->isClientSide) { + player->resetPos(false); + } + + this->cameraTargetPlayer = player; + + if (raknetInstance->isServer()) + raknetInstance->announceServer(user->name); + + if (netCallback) { + netCallback->levelGenerated(level); + } + +#if defined(WIN32) || defined(RPI) + if (_commandServer) { + delete _commandServer; + } + _commandServer = new CommandServer(this); + _commandServer->init(commandPort); +#endif + + // Hack to (hopefully) get the players to show (note: in LevelListener + // instead, since adding yourself always generates a entityAdded) + //EntityRenderDispatcher::getInstance()->onGraphicsReset(); + _hasSignaledGeneratingLevelFinished = true; +} + +Player* Minecraft::respawnPlayer(int playerId) { + for (unsigned int i = 0; i < level->players.size(); ++i) { + if (level->players[i]->entityId == playerId) { + resetPlayer(level->players[i]); + return level->players[i]; + } + } + return NULL; +} + +void Minecraft::resetPlayer(Player* player) { + level->validateSpawn(); + player->reset(); + + Pos p; + if(player->hasRespawnPosition()) { + p = player->getRespawnPosition(); + } + else { + p = level->getSharedSpawnPos(); + } + player->setPos((float)p.x + 0.5f, (float)p.y + 1.0f, (float)p.z + 0.5f); + player->resetPos(true); + + if (isCreativeMode()) + player->inventory->clearInventoryWithDefault(); +} + +void Minecraft::respawnPlayer() { + // RESET THE FRACKING PLAYER HERE + //bool slowCheck = false; + //for (int i = 0; i < level->entities.size(); ++i) + // if (level->entities[i] == player) slowCheck = true; + // + //LOGI("Has entity? %d, %d\n", level->getEntity(player->entityId), slowCheck); + + resetPlayer(player); + + // tell server (or other client) that we re-spawned + RespawnPacket packet(player); + raknetInstance->send(packet); +} + +void Minecraft::onGraphicsReset() +{ +#ifndef STANDALONE_SERVER + textures->clear(); + + font->onGraphicsReset(); + gui.onGraphicsReset(); + + if (levelRenderer) levelRenderer->onGraphicsReset(); + if (gameRenderer) gameRenderer->onGraphicsReset(); + + EntityRenderDispatcher::getInstance()->onGraphicsReset(); + TileEntityRenderDispatcher::getInstance()->onGraphicsReset(); +#endif +} + +int Minecraft::getProgressStatusId() { + return progressStageStatusId; +} + +const char* Minecraft::getProgressMessage() +{ + return progressMessages[progressStageStatusId]; +} + +bool Minecraft::isLevelGenerated() +{ + return level != NULL && !isGeneratingLevel; +} + +LevelStorageSource* Minecraft::getLevelSource() +{ + return storageSource; +} + +int Minecraft::getLicenseId() { + if (!LicenseCodes::isReady(_licenseId)) + _licenseId = platform()->checkLicense(); + return _licenseId; +} + +void Minecraft::audioEngineOn() { +#ifndef STANDALONE_SERVER + soundEngine->enable(true); +#endif +} +void Minecraft::audioEngineOff() { +#ifndef STANDALONE_SERVER + soundEngine->enable(false); +#endif +} + +void Minecraft::setIsCreativeMode(bool isCreative) +{ +#ifdef CREATORMODE + delete gameMode; + gameMode = new CreatorMode(this); + _isCreativeMode = true; +#else + if (!gameMode || isCreative != _isCreativeMode) + { + delete gameMode; + if (isCreative) gameMode = new CreativeMode(this); + else gameMode = new SurvivalMode(this); + _isCreativeMode = isCreative; + } +#endif + if (player) + gameMode->initAbilities(player->abilities); +} + +bool Minecraft::isCreativeMode() { + return _isCreativeMode; +} + +bool Minecraft::isKindleFire(int kindleVersion) { + if (kindleVersion != 1) + return false; + + std::string model = platform()->getPlatformStringVar(PlatformStringVars::DEVICE_BUILD_MODEL); + std::string modelLower(model); + std::transform(modelLower.begin(), modelLower.end(), modelLower.begin(), tolower); + + return (modelLower.find("kindle") != std::string::npos) && (modelLower.find("fire") != std::string::npos); +} + +bool Minecraft::transformResolution(int* w, int* h) +{ + bool changed = false; + + // Kindle Fire 1: reporting wrong height in + // certain cases (e.g. after screen lock) + if (isKindleFire(1) && *h >= 560 && *h <= 620) { + *h = 580; + changed = true; + } + + return changed; +} + +ICreator* Minecraft::getCreator() +{ +#ifdef CREATORMODE + return ((CreatorMode*)gameMode)->getCreator(); +#else + return NULL; +#endif +} + +void Minecraft::optionUpdated( const Options::Option* option, bool value ) { + if(netCallback != NULL && option == &Options::Option::SERVER_VISIBLE) { + ServerSideNetworkHandler* ss = (ServerSideNetworkHandler*) netCallback; + ss->allowIncomingConnections(value); + } +} + +void Minecraft::optionUpdated( const Options::Option* option, float value ) { +#ifndef STANDALONE_SERVER + if(option == &Options::Option::PIXELS_PER_MILLIMETER) { + pixelCalcUi.setPixelsPerMillimeter(value * Gui::InvGuiScale); + pixelCalc.setPixelsPerMillimeter(value); + } +#endif +} + +void Minecraft::optionUpdated( const Options::Option* option, int value ) { + +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/E19DC915D7B7F4D40A50F260C758DAD9 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/E19DC915D7B7F4D40A50F260C758DAD9 new file mode 100644 index 0000000..8b4d6da --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/E19DC915D7B7F4D40A50F260C758DAD9 @@ -0,0 +1,80 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI__Screen_H__ +#define NET_MINECRAFT_CLIENT_GUI__Screen_H__ + +//package net.minecraft.client.gui; + +#include +#include "GuiComponent.h" + +class Font; +class Minecraft; +class Button; +class TextBox; +struct IntRectangle; + +class Screen: public GuiComponent +{ +public: + Screen(); + + virtual void render(int xm, int ym, float a); + + void init(Minecraft* minecraft, int width, int height); + virtual void init(); + + void setSize(int width, int height); + virtual void setupPositions() {}; + + virtual void updateEvents(); + virtual void mouseEvent(); + virtual void keyboardEvent(); + virtual void keyboardTextEvent(); + virtual bool handleBackEvent(bool isDown); + + virtual void tick() {} + + virtual void removed() {} + + virtual void renderBackground(); + virtual void renderBackground(int vo); + virtual void renderDirtBackground(int vo); + // query + virtual bool renderGameBehind(); + virtual bool hasClippingArea(IntRectangle& out); + + virtual bool isPauseScreen(); + virtual bool isErrorScreen(); + virtual bool isInGameScreen(); + virtual bool closeOnPlayerHurt(); + + virtual void confirmResult(bool result, int id) {} + virtual void lostFocus(); + virtual void toGUICoordinate(int& x, int& y); +protected: + void updateTabButtonSelection(); + + virtual void buttonClicked(Button* button) {} + virtual void mouseClicked(int x, int y, int buttonNum); + virtual void mouseReleased(int x, int y, int buttonNum); + + virtual void keyPressed(int eventKey); + virtual void keyboardNewChar(char inputChar) {} +public: + int width; + int height; + bool passEvents; + //GuiParticles* particles; +protected: + Minecraft* minecraft; + std::vector buttons; + std::vector textBoxes; + + std::vector tabButtons; + int tabButtonIndex; + + Font* font; +private: + Button* clickedButton; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI__Screen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/E25FB3B811E26EA86767132ABFD6C0FE b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/E25FB3B811E26EA86767132ABFD6C0FE new file mode 100644 index 0000000..45852ad --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/C31FD1570E5FB4418A227C9A682173B3/E25FB3B811E26EA86767132ABFD6C0FE @@ -0,0 +1,233 @@ +#ifndef NET_MINECRAFT_CLIENT__Minecraft_H__ +#define NET_MINECRAFT_CLIENT__Minecraft_H__ + +#include "Options.h" +#ifndef STANDALONE_SERVER +#include "MouseHandler.h" +#endif +#include "Timer.h" +#include "player/input/ITurnInput.h" +#ifndef STANDALONE_SERVER +#include "gui/Gui.h" +#include "gui/screens/ScreenChooser.h" +#endif +//#include "../network/RakNetInstance.h" +#include "../world/phys/HitResult.h" + +class User; +class Level; +class LocalPlayer; +class IInputHolder; +class Mob; +class Player; +class LevelRenderer; +class GameRenderer; +class ParticleEngine; +class Entity; +class ICreator; +class GameMode; +class Textures; +class CThread; +class SoundEngine; +class Screen; +class Font; +class LevelStorageSource; +class BuildActionIntention; +class PerfRenderer; +class LevelSettings; +class IRakNetInstance; +class NetEventCallback; +class CommandServer; +struct PingedCompatibleServer; +//class ExternalFileLevelStorageSource; + + +#include "../App.h" +#include "PixelCalc.h" +class AppPlatform; +class AppPlatform_android; + +class Minecraft: public App +{ +protected: + Minecraft(); +public: + virtual ~Minecraft(); + + void init(); + void setSize(int width, int height); + void reloadOptions(); + + bool supportNonTouchScreen(); + bool useTouchscreen(); + void grabMouse(); + void releaseMouse(); + + void handleBuildAction(BuildActionIntention*); + + void toggleDimension(){} + bool isCreativeMode(); + void setIsCreativeMode(bool isCreative); + void setScreen(Screen*); + + virtual void selectLevel(const std::string& levelId, const std::string& levelName, const LevelSettings& settings); + virtual void setLevel(Level* level, const std::string& message = "", LocalPlayer* forceInsertPlayer = NULL); + + void generateLevel( const std::string& message, Level* level ); + LevelStorageSource* getLevelSource(); + + bool isLookingForMultiplayer; + void locateMultiplayer(); + void cancelLocateMultiplayer(); + bool joinMultiplayer(const PingedCompatibleServer& server); + void hostMultiplayer(int port=19132); + Player* respawnPlayer(int playerId); + void respawnPlayer(); + void resetPlayer(Player* player); + void doActuallyRespawnPlayer(); + + void update(); + + void tick(int nTick, int maxTick); + void tickInput(); + + bool isOnlineClient(); + bool isOnline(); + void pauseGame(bool isBackPaused); + void gameLostFocus(); + + void prepareLevel(const std::string& message); + + void leaveGame(bool renameLevel = false); + + int getProgressStatusId(); + const char* getProgressMessage(); + + ICreator* getCreator(); + + // void onGraphicsLost() {} + void onGraphicsReset(); + + bool isLevelGenerated(); + int getLicenseId(); + + void audioEngineOn(); + void audioEngineOff(); + + bool isPowerVR() { return _powerVr; } + bool isKindleFire(int kindleVersion); + bool transformResolution(int* w, int* h); + void optionUpdated(const Options::Option* option, bool value); + void optionUpdated(const Options::Option* option, float value); + void optionUpdated(const Options::Option* option, int value); +#ifdef __APPLE__ + bool _isSuperFast; + bool isSuperFast() { return _isSuperFast; } +#endif + +protected: + void _levelGenerated(); + +private: + static void* prepareLevel_tspawn(void *p_param); + + void handleMouseClick(int button); + void handleMouseDown(int button, bool down); + + void _reloadInput(); +public: + int width; + int height; + + // Vars that the platform is allowed to use in the future + int commandPort; + int reserved_d1, reserved_d2; + float reserved_f1, reserved_f2; + + Options options; + + static bool useAmbientOcclusion; + //static bool threadInterrupt; + + volatile bool pause; + + LevelRenderer* levelRenderer; + GameRenderer* gameRenderer; + ParticleEngine* particleEngine; + SoundEngine* soundEngine; + + GameMode* gameMode; +#ifndef STANDALONE_SERVER + Textures* textures; + ScreenChooser screenChooser; + Font* font; +#endif + IRakNetInstance* raknetInstance; + NetEventCallback* netCallback; + + int lastTime; + int lastTickTime; + float ticksSinceLastUpdate; + + User* user; + Level* level; + + LocalPlayer* player; + IInputHolder* inputHolder; + Mob* cameraTargetPlayer; +#ifndef STANDALONE_SERVER + Gui gui; +#endif + CThread* generateLevelThread; + Screen* screen; + static int customDebugId; + + static const int CDI_NONE = 0; + static const int CDI_GRAPHICS = 1; +#ifndef STANDALONE_SERVER + MouseHandler mouseHandler; +#endif + bool mouseGrabbed; + + PixelCalc pixelCalc; + PixelCalc pixelCalcUi; + + HitResult hitResult; + volatile int progressStagePercentage; + + // This field is initialized in main() + // It sets the base path to where worlds can be written (sdcard on android) + std::string externalStoragePath; + std::string externalCacheStoragePath; +protected: + Timer timer; + // @note @attn @warn: this is dangerous as fuck! + volatile bool isGeneratingLevel; + bool _hasSignaledGeneratingLevelFinished; + + LevelStorageSource* storageSource; + bool _running; + bool _powerVr; + +private: + volatile int progressStageStatusId; + static const char* progressMessages[]; + + int missTime; + int ticks; + bool screenMutex; + bool hasScheduledScreen; + Screen* scheduledScreen; + + int _licenseId; + bool _supportsNonTouchscreen; + + bool _isCreativeMode; + //int _respawnPlayerTicks; + Player* _pendingRemovePlayer; // @attn @todo @fix: remove this shait and fix the respawn behaviour + + PerfRenderer* _perfRenderer; + CommandServer* _commandServer; +}; + +#endif /*NET_MINECRAFT_CLIENT__Minecraft_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/0E1E245EA16F1FAA685C5686B18BDD08 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/0E1E245EA16F1FAA685C5686B18BDD08 new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/0E1E245EA16F1FAA685C5686B18BDD08 @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/0FC8469C17490E392A4DDF62C37F3AC5 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/0FC8469C17490E392A4DDF62C37F3AC5 new file mode 100644 index 0000000..153fb79 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/0FC8469C17490E392A4DDF62C37F3AC5 @@ -0,0 +1,68 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(0), w(0), h(0), x(0), y(0), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + minecraft->platform()->showKeyboard(); + focused = true; + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + minecraft->platform()->showKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + // Slightly translucent dark background + fill(x, y, x + w, y + h,0x80000000); + // Border + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + + // Draw text. If textbox contains the placeholder (no focus and text equals initial msg), draw dim color + int color =0xe0e0e0; + // If not focused and text is empty or equals default placeholder, draw dimmed + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + // measure available width approximated by character count + int maxChars = std::max(1, (w -8) /6); // approx6 px per char + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/1CC65E0062271217494E8E6A4C0A58CE b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/1CC65E0062271217494E8E6A4C0A58CE new file mode 100644 index 0000000..bfd810c --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/1CC65E0062271217494E8E6A4C0A58CE @@ -0,0 +1,34 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ +#define NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ + +//package net.minecraft.client.gui; + +#include +#include "../GuiComponent.h" +#include "../../Options.h" + +class Font; +class Minecraft; + +class TextBox: public GuiComponent +{ +public: + TextBox(int id, const std::string& msg); + TextBox(int id, int x, int y, const std::string& msg); + TextBox(int id, int x, int y, int w, int h, const std::string& msg); + + virtual void setFocus(Minecraft* minecraft); + virtual bool loseFocus(Minecraft* minecraft); + + virtual void render(Minecraft* minecraft, int xm, int ym); + +public: + int w, h; + int x, y; + + std::string text; + int id; + bool focused; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/1D11F3CE27B0B595836AB483CC9A0B43 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/1D11F3CE27B0B595836AB483CC9A0B43 new file mode 100644 index 0000000..3af41b5 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/1D11F3CE27B0B595836AB483CC9A0B43 @@ -0,0 +1,37 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +TextBox::TextBox( int id, const std::string& msg ) + : id(0), w(0), h(0), x(0), y(0), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + minecraft->platform()->showKeyboard(); + focused = true; + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + minecraft->platform()->showKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/2B47DA87EA068FA4D6B7CC7859253564 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/2B47DA87EA068FA4D6B7CC7859253564 new file mode 100644 index 0000000..3af41b5 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/2B47DA87EA068FA4D6B7CC7859253564 @@ -0,0 +1,37 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +TextBox::TextBox( int id, const std::string& msg ) + : id(0), w(0), h(0), x(0), y(0), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + minecraft->platform()->showKeyboard(); + focused = true; + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + minecraft->platform()->showKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/4222F2040602983458B5992A709F7336 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/4222F2040602983458B5992A709F7336 new file mode 100644 index 0000000..ad4d97c --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/4222F2040602983458B5992A709F7336 @@ -0,0 +1,74 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_SCREENS_TOUCH__TouchJoinGameScreen_H__ +#define NET_MINECRAFT_CLIENT_GUI_SCREENS_TOUCH__TouchJoinGameScreen_H__ + +#include "../../Screen.h" +#include "../../components/Button.h" +#include "../../components/SmallButton.h" +#include "../../components/RolledSelectionListV.h" +#include "../../../Minecraft.h" +#include "../../../../platform/input/Multitouch.h" +#include "../../../../network/RakNetInstance.h" + +namespace Touch { + +class JoinGameScreen; + +class AvailableGamesList : public RolledSelectionListV +{ + int startSelected; + int selectedItem; + ServerList copiedServerList; + + friend class JoinGameScreen; + +public: + AvailableGamesList(Minecraft* _minecraft, int _width, int _height) + : RolledSelectionListV(_minecraft, _width, _height, 0, _width, 24, _height, 34), + selectedItem(-1), + startSelected(-1) + { + } + +protected: + + virtual int getNumberOfItems() { return (int)copiedServerList.size(); } + + virtual void selectCancel(); + virtual void selectStart(int item); + virtual void selectItem(int item, bool doubleClick); + + virtual bool isSelectedItem(int item) { return item == selectedItem; } + + virtual void renderBackground() {} + virtual void renderItem(int i, int x, int y, int h, Tesselator& t); +}; + +class JoinGameScreen: public Screen +{ +public: + JoinGameScreen(); + virtual ~JoinGameScreen(); + + void init(); + void setupPositions(); + + virtual bool handleBackEvent(bool isDown); + + virtual bool isIndexValid(int index); + + virtual void tick(); + void render(int xm, int ym, float a); + + void buttonClicked(Button* button); + + bool isInGameScreen(); +private: + Button bJoin; + TButton bBack; + THeader bHeader; + AvailableGamesList* gamesList; +}; + +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_SCREENS_TOUCH__TouchJoinGameScreen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/430CC357A15D4BE1A70387A7C3462A3C b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/430CC357A15D4BE1A70387A7C3462A3C new file mode 100644 index 0000000..92a367b --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/430CC357A15D4BE1A70387A7C3462A3C @@ -0,0 +1,258 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i = 0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0, 0, width, height, 0xc0101010, 0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1, 1, 1, 1); + float s = 32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height, 0, 0, height / s + fvo); + t.vertexUV((float)width, (float)height, 0, width / s, (float)height / s + fvo); + t.vertexUV((float)width, 0, 0, (float)width / s, 0 + fvo); + t.vertexUV(0, 0, 0, 0, 0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex = 0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount - 1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i = 0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; +/* +#if !defined(ANDROID) && !defined(__APPLE__) //if (!minecraft->isTouchscreen()) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); +#endif } +*/ + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + +#if 1 +//#if defined(ANDROID) || defined(__APPLE__) //if (minecraft->isTouchscreen()) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click", 1, 1); + clickedButton->released(x, y); + } + } +# else // } else { + clickedButton->released(x, y); +#endif // } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height - 1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/572513C3D8D309B3634C045C3C8FAC54 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/572513C3D8D309B3634C045C3C8FAC54 new file mode 100644 index 0000000..872695a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/572513C3D8D309B3634C045C3C8FAC54 @@ -0,0 +1,137 @@ +#ifndef KEYBOARD_H__ +#define KEYBOARD_H__ + +#include + +/** A keyboard action; key-down or key-up */ +class KeyboardAction +{ +public: + static const int KEYUP = 0; + static const int KEYDOWN = 1; + + KeyboardAction(unsigned char keyCode, int state) { + this->key = keyCode; + this->state = state; + } + + int state; + unsigned char key; +}; + +/* Iterators */ +typedef std::vector KeyboardActionVec; +typedef KeyboardActionVec::iterator KeyboardActionIt; +typedef KeyboardActionVec::const_iterator KeyboardActionCIt; + +/** A static keyboard class, written to resemble the one in lwjgl somewhat */ +class Keyboard +{ +public: + static const int KEY_A = 65; + static const int KEY_B = 66; + static const int KEY_C = 67; + static const int KEY_D = 68; + static const int KEY_E = 69; + static const int KEY_F = 70; + static const int KEY_G = 71; + static const int KEY_H = 72; + static const int KEY_I = 73; + static const int KEY_J = 74; + static const int KEY_K = 75; + static const int KEY_L = 76; + static const int KEY_M = 77; + static const int KEY_N = 78; + static const int KEY_O = 79; + static const int KEY_P = 80; + static const int KEY_Q = 81; + static const int KEY_R = 82; + static const int KEY_S = 83; + static const int KEY_T = 84; + static const int KEY_U = 85; + static const int KEY_V = 86; + static const int KEY_W = 87; + static const int KEY_X = 88; + static const int KEY_Y = 89; + static const int KEY_Z = 90; + + static const int KEY_BACKSPACE = 8; + static const int KEY_RETURN = 13; + + static const int KEY_F1 = 112; + static const int KEY_F2 = 113; + static const int KEY_F3 = 114; + static const int KEY_F4 = 115; + static const int KEY_F5 = 116; + static const int KEY_F6 = 117; + static const int KEY_F7 = 118; + static const int KEY_F8 = 119; + static const int KEY_F9 = 120; + static const int KEY_F10 = 121; + static const int KEY_F11 = 122; + static const int KEY_F12 = 123; + + static const int KEY_ESCAPE = 27; + static const int KEY_SPACE = 32; + static const int KEY_LSHIFT = 10; + + static bool isKeyDown(int keyCode) { + return _states[keyCode] == KeyboardAction::KEYDOWN; + } + + static void reset() { + _inputs.clear(); + _inputText.clear(); + _index = -1; + _textIndex = -1; + } + + static void feed(unsigned char keyCode, int state) { + _inputs.push_back(KeyboardAction(keyCode, state)); + + _states[keyCode] = state; + } + static void feedText(char character) { + _inputText.push_back(character); + } + + static bool next() { + if (_index + 1 >= (int)_inputs.size()) + return false; + + ++_index; + return true; + } + + static bool nextTextChar() { + if(_textIndex + 1 >= (int)_inputText.size()) + return false; + ++_textIndex; + return true; + } + + static void rewind() { + _index = -1; + _textIndex = -1; + } + + static int getEventKey() { + return _inputs[_index].key; + } + + static int getEventKeyState() { + return _inputs[_index].state; + } + static char getChar() { + return _inputText[_textIndex]; + } +private: + static int _index; + static int _textIndex; + static int _states[256]; + static std::vector _inputs; + static std::vector _inputText; + static bool _inited; +}; + +#endif//KEYBOARD_H__ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/72B2752C7CD663CF9A1CC0178EF19114 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/72B2752C7CD663CF9A1CC0178EF19114 new file mode 100644 index 0000000..c9f6e6a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/72B2752C7CD663CF9A1CC0178EF19114 @@ -0,0 +1,1563 @@ +#include "Minecraft.h" + +#if defined(APPLE_DEMO_PROMOTION) + #define NO_NETWORK +#endif + +#if defined(RPI) + #define CREATORMODE +#endif + +#include "../network/RakNetInstance.h" +#include "../network/ClientSideNetworkHandler.h" +#include "../network/ServerSideNetworkHandler.h" +//#include "../network/Packet.h" +#include "../world/entity/player/Inventory.h" +#include "../world/level/chunk/ChunkCache.h" +#include "../world/level/tile/Tile.h" +#include "../world/level/storage/LevelStorageSource.h" +#include "../world/level/storage/LevelStorage.h" +#include "player/input/KeyboardInput.h" +#ifndef STANDALONE_SERVER +#include "player/input/touchscreen/TouchInputHolder.h" +#endif +#include "player/LocalPlayer.h" +#include "gamemode/CreativeMode.h" +#include "gamemode/SurvivalMode.h" +#include "player/LocalPlayer.h" +#ifndef STANDALONE_SERVER +#include "particle/ParticleEngine.h" +#include "gui/Screen.h" +#include "gui/Font.h" +#include "gui/screens/RenameMPLevelScreen.h" +#include "sound/SoundEngine.h" +#endif +#include "../platform/CThread.h" +#include "../platform/input/Mouse.h" +#include "../AppPlatform.h" +#include "../Performance.h" +#include "../LicenseCodes.h" +#include "../util/PerfTimer.h" +#include "../util/PerfRenderer.h" +#include "player/input/MouseBuildInput.h" + +#include "../world/Facing.h" + +#include "../network/packet/PlaceBlockPacket.h" + +#include "player/input/IInputHolder.h" +#ifndef STANDALONE_SERVER +#include "player/input/touchscreen/TouchscreenInput.h" + +#include "player/input/ControllerTurnInput.h" +#include "player/input/XperiaPlayInput.h" + +#endif + +#include "player/input/MouseTurnInput.h" +#include "../world/entity/MobFactory.h" +#include "../world/level/MobSpawner.h" +#include "../util/Mth.h" +#include "../network/packet/InteractPacket.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/PrerenderTilesScreen.h" +#include "renderer/Textures.h" +#include "gui/screens/DeathScreen.h" +#endif + +#include "../network/packet/RespawnPacket.h" +#include "IConfigListener.h" +#include "../world/entity/MobCategory.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/FurnaceScreen.h" +#endif +#include "../world/Difficulty.h" +#include "../server/ServerLevel.h" +#ifdef CREATORMODE +#include "../server/CreatorLevel.h" +#endif +#include "../network/packet/AdventureSettingsPacket.h" +#include "../network/packet/SetSpawnPositionPacket.h" +#include "../network/command/CommandServer.h" +#include "gamemode/CreatorMode.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/ArmorScreen.h" +#endif +#include "../world/level/levelgen/synth/ImprovedNoise.h" +#ifndef STANDALONE_SERVER +#include "renderer/tileentity/TileEntityRenderDispatcher.h" +#endif + +#ifndef STANDALONE_SERVER +#include "renderer/ptexture/DynamicTexture.h" +#include "renderer/GameRenderer.h" +#include "renderer/ItemInHandRenderer.h" +#include "renderer/LevelRenderer.h" +#include "renderer/entity/EntityRenderDispatcher.h" +#include "gui/Screen.h" +#include "gui/Font.h" +#include "gui/screens/RenameMPLevelScreen.h" +#include "sound/SoundEngine.h" +#endif + +static void checkGlError(const char* tag) { +#ifdef GLDEBUG + while (1) { + const int errCode = glGetError(); + if (errCode == GL_NO_ERROR) break; + + LOGE("################\nOpenGL-error @ %s : #%d\n", tag, errCode); + } +#endif /*GLDEBUG*/ +} + +/*static*/ +const char* Minecraft::progressMessages[] = { + "Locating server", + "Building terrain", + "Preparing", + "Saving chunks" +}; + +int Minecraft::customDebugId = Minecraft::CDI_NONE; + +#if defined(_MSC_VER) + #pragma warning( disable : 4355 ) // 'this' pointer in initialization list which is perfectly legal +#endif + +bool Minecraft::useAmbientOcclusion = false; + +Minecraft::Minecraft() +: user(NULL), + level(NULL), + player(NULL), + cameraTargetPlayer(NULL), + levelRenderer(NULL), + gameRenderer(NULL), +#ifndef STANDALONE_SERVER + particleEngine(NULL), + _perfRenderer(NULL), +#endif + _commandServer(NULL), +#ifndef STANDALONE_SERVER + textures(NULL), +#endif + lastTickTime(-1), + lastTime(0), + ticksSinceLastUpdate(0), + gameMode(NULL), + mouseGrabbed(true), + missTime(0), + pause(false), + _running(false), + timer(20), +#ifndef STANDALONE_SERVER + gui(this), +#endif + netCallback(NULL), +#ifndef STANDALONE_SERVER + screen(NULL), + font(NULL), +#endif + screenMutex(false), +#ifndef STANDALONE_SERVER + scheduledScreen(NULL), + hasScheduledScreen(false), + soundEngine(NULL), +#endif + ticks(0), + isGeneratingLevel(false), + _hasSignaledGeneratingLevelFinished(true), + generateLevelThread(NULL), + progressStagePercentage(0), + progressStageStatusId(0), + isLookingForMultiplayer(false), + _licenseId(LicenseCodes::WAIT_PLATFORM_NOT_READY), + inputHolder(0), + _supportsNonTouchscreen(false), +#ifndef STANDALONE_SERVER + screenChooser(this), +#endif + width(1), height(1), + //_respawnPlayerTicks(-1), +#ifdef __APPLE__ + _isSuperFast(false), +#endif + _powerVr(false), + commandPort(4711), + reserved_d1(0),reserved_d2(0), + reserved_f1(0),reserved_f2(0) +{ +//#ifdef ANDROID + +#if defined(NO_NETWORK) + raknetInstance = new IRakNetInstance(); +#else + raknetInstance = new RakNetInstance(); +#endif +#ifndef STANDALONE_SERVER + soundEngine = new SoundEngine(20.0f); + soundEngine->init(this, &options); +#endif + //setupPieces(); +} + +Minecraft::~Minecraft() +{ + delete netCallback; + delete raknetInstance; +#ifndef STANDALONE_SERVER + delete levelRenderer; + delete gameRenderer; + delete particleEngine; + + delete soundEngine; +#endif + delete gameMode; +#ifndef STANDALONE_SERVER + delete font; + delete textures; + + if (screen != NULL) { + delete screen; + screen = NULL; + } +#endif + if (level != NULL) { + level->saveGame(); + if (level->getChunkSource()) + level->getChunkSource()->saveAll(true); + delete level->getLevelStorage(); + delete level; + level = NULL; + } + + //delete player; + delete user; + delete inputHolder; + + delete storageSource; + delete _perfRenderer; + delete _commandServer; + + MobFactory::clearStaticTestMobs(); +#ifndef STANDALONE_SERVER + EntityRenderDispatcher::destroy(); +#endif +} + +// Only called by server +void Minecraft::selectLevel( const std::string& levelId, const std::string& levelName, const LevelSettings& settings ) +{ +#if defined(CREATORMODE) + level = new CreatorLevel( +#else + level = new ServerLevel( +#endif + storageSource->selectLevel(levelId, false), + levelName, + settings, + SharedConstants::GeneratorVersion); + + // note: settings is useless beyond this point, since it's + // either copied to LevelData (or LevelData read from file) + setLevel(level, "Generating level"); + setIsCreativeMode(level->getLevelData()->getGameType() == GameType::Creative); + _running = true; +} + +void Minecraft::setLevel(Level* level, const std::string& message /* ="" */, LocalPlayer* forceInsertPlayer /* = NULL */) { + cameraTargetPlayer = NULL; + LOGI("Seed is %ld\n", level->getSeed()); + + if (level != NULL) { + level->raknetInstance = raknetInstance; + gameMode->initLevel(level); + + if (!player && forceInsertPlayer) + { + player = forceInsertPlayer; + player->resetPos(false); + //level->addEntity(forceInsertPlayer); + } + else if (player != NULL) { + player->resetPos(false); + if (level != NULL) { + level->addEntity(player); + } + } + this->level = level; + _hasSignaledGeneratingLevelFinished = false; +#ifdef STANDALONE_SERVER + const bool threadedLevelCreation = false; +#else + const bool threadedLevelCreation = true; +#endif + + if (threadedLevelCreation) { + // Threaded + // "Lock" + isGeneratingLevel = true; + generateLevelThread = new CThread(Minecraft::prepareLevel_tspawn, this); + } else { + // Non-threaded + generateLevel("Currently not used", level); + } + } else { + player = NULL; + } + + this->lastTickTime = 0; + this->_running = true; +} + +void Minecraft::leaveGame(bool renameLevel /*=false*/) +{ + if (isGeneratingLevel || !_hasSignaledGeneratingLevelFinished) + return; + + isGeneratingLevel = false; + bool saveLevel = level && (!level->isClientSide || renameLevel); + + raknetInstance->disconnect(); + if (saveLevel) { + // If server or wanting to save level as client, save all unsaved chunks! + level->getChunkSource()->saveAll(true); + } + + LOGI("Clearing levels\n"); + + cameraTargetPlayer = NULL; +#ifndef STANDALONE_SERVER + levelRenderer->setLevel(NULL); + particleEngine->setLevel(NULL); +#endif + LOGI("Erasing callback\n"); + delete netCallback; + netCallback = NULL; + + LOGI("Erasing level\n"); + if (level != NULL) { + delete level->getLevelStorage(); + delete level; + level = NULL; + } + //delete player; + player = NULL; + cameraTargetPlayer = NULL; + + _running = false; +#ifndef STANDALONE_SERVER + if (renameLevel) { + setScreen(new RenameMPLevelScreen(LevelStorageSource::TempLevelId)); + } + else + screenChooser.setScreen(SCREEN_STARTMENU); +#endif +} + +void Minecraft::prepareLevel(const std::string& title) { + LOGI("status: 1\n"); + progressStageStatusId = 1; + + Stopwatch A, B, C, D; + A.start(); + + Stopwatch L; + + // Dont update lights if we load the level (ok, actually just with leveldata version=1.+(?)) + if (!level->isNew()) + level->setUpdateLights(false); + + int Max = CHUNK_CACHE_WIDTH * CHUNK_CACHE_WIDTH; + int pp = 0; + for (int x = 8; x < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); x += CHUNK_WIDTH) { + for (int z = 8; z < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); z += CHUNK_WIDTH) { + progressStagePercentage = 100 * pp++ / Max; + //printf("level generation progress %d\n", progressStagePercentage); + B.start(); + level->getTile(x, 64, z); + B.stop(); + L.start(); + if (level->isNew()) + while (level->updateLights()) + ; + L.stop(); + } + } + A.stop(); + level->setUpdateLights(true); + + C.start(); + for (int x = 0; x < CHUNK_CACHE_WIDTH; x++) + { + for (int z = 0; z < CHUNK_CACHE_WIDTH; z++) + { + LevelChunk* chunk = level->getChunk(x, z); + if (chunk && !chunk->createdFromSave) + { + chunk->unsaved = false; + chunk->clearUpdateMap(); + } + } + } + C.stop(); + + LOGI("status: 3\n"); + progressStageStatusId = 3; + if (level->isNew()) { + level->setInitialSpawn(); // @note: should obviously be called from Level itself + level->saveLevelData(); + level->getChunkSource()->saveAll(false); + level->saveGame(); + } else { + level->saveLevelData(); + level->loadEntities(); + } + + progressStagePercentage = -1; + progressStageStatusId = 2; + LOGI("status: 2\n"); + + D.start(); + level->prepare(); + D.stop(); + + A.print("Generate level: "); + L.print(" - light: "); + B.print(" - getTl: "); + C.print(" - clear: "); + D.print(" - prepr: "); + progressStageStatusId = 0; +} + +void Minecraft::update() { + //LOGI("Enter Update\n"); + + if (Options::debugGl) + LOGI(">>>>>>>>>>\n"); + + TIMER_PUSH("root"); + + //if (level) { + // LOGI("numplayers: %d\n", level->players.size()); + // for (int i = 0; i < level->players.size(); ++i) { + // Player* p = level->players[i]; + // bool inEnt = std::find(level->entities.begin(), level->entities.end(), p) != level->entities.end(); + // LOGI(" %p, %d, %d - in? %d\n", p, p->entityId, p->owner.ToUint32(p->owner), inEnt); + // } + //} + + if (pause && level != NULL) { + float lastA = timer.a; + timer.advanceTime(); + timer.a = lastA; + } else { + timer.advanceTime(); + } + + if (raknetInstance) { + raknetInstance->runEvents(netCallback); + } + + TIMER_PUSH("tick"); + int toTick = timer.ticks; + for (int i = 0; i < toTick; ++i, ++ticks) + tick(i, toTick-1); + + TIMER_POP_PUSH("updatelights"); + if (level && !isGeneratingLevel) { + level->updateLights(); + } + TIMER_POP(); + + #ifndef STANDALONE_SERVER + if (gameMode != NULL) gameMode->render(timer.a); + TIMER_PUSH("sound"); + soundEngine->update(player, timer.a); + TIMER_POP_PUSH("render"); + gameRenderer->render(timer.a); + TIMER_POP(); + #else + CThread::sleep(1); + #endif +#ifndef STANDALONE_SERVER + Multitouch::resetThisUpdate(); +#endif + TIMER_POP(); +#ifndef STANDALONE_SERVER + checkGlError("Update finished"); + + if (options.renderDebug) { + if (!PerfTimer::enabled) { + PerfTimer::reset(); + PerfTimer::enabled = true; + } + + //TIMER_PUSH("debugfps"); + _perfRenderer->renderFpsMeter(1); + checkGlError("render debug"); + //TIMER_POP(); + } else { + PerfTimer::enabled = false; + } +#endif + //LOGI("Exit Update\n"); +} + +void Minecraft::tick(int nTick, int maxTick) { + if (missTime > 0) missTime--; +#ifndef STANDALONE_SERVER + if (!screen && player) { + if (player->health <= 0) { + setScreen(new DeathScreen()); + } + } +#endif + TIMER_PUSH("gameMode"); + if (level && !pause) { + gameMode->tick(); + } + + TIMER_POP_PUSH("commandServer"); + if (level && _commandServer) { + _commandServer->tick(); + } + + TIMER_POP_PUSH("input"); + tickInput(); +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("gui"); + gui.tick(); +#endif + // + // Ongoing level generation in a (perhaps) different thread. When it's + // ready, _levelGenerated() is called once and any threads are deleted. + // + if (isGeneratingLevel) { + return; + } else if (!_hasSignaledGeneratingLevelFinished) { + if (generateLevelThread) { + delete generateLevelThread; + generateLevelThread = NULL; + } + _levelGenerated(); + } + + // + // Normal game loop, run before or efter level generation + // + if (level != NULL) + { + if (!pause) { +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("gameRenderer"); + gameRenderer->tick(nTick, maxTick); + + TIMER_POP_PUSH("levelRenderer"); + levelRenderer->tick(); +#endif + level->difficulty = options.difficulty; + if (level->isClientSide) level->difficulty = Difficulty::EASY; + + TIMER_POP_PUSH("level"); + level->tickEntities(); + level->tick(); +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("animateTick"); + if (player) { + level->animateTick(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); + } +#endif + } + } +#ifndef STANDALONE_SERVER + textures->loadAndBindTexture("terrain.png"); + if (!pause && !(screen && !screen->renderGameBehind())) { + #if !defined(RPI) + #ifdef __APPLE__ + if (isSuperFast()) + #endif + { + if (nTick == maxTick) { + TIMER_POP_PUSH("textures"); + textures->tick(true); + } + } + #endif + } + TIMER_POP_PUSH("particles"); + particleEngine->tick(); + if (screen) { + screenMutex = true; + screen->tick(); + screenMutex = false; + } + + // @note: fix to keep "isPressed" and "isReleased" as long as necessary. + // Most likely keyboard and mouse could/should be reset here as well. + Multitouch::reset(); +#endif + TIMER_POP(); +} + +class InputRAII { +public: + ~InputRAII() { +#ifndef STANDALONE_SERVER + Mouse::reset(); + Keyboard::reset(); +#endif + } +}; + +void Minecraft::tickInput() { +#ifndef STANDALONE_SERVER + InputRAII raiiInput; + + if (screen && !screen->passEvents) { + screenMutex = true; + screen->updateEvents(); + //screen->updateSetScreen(); + screenMutex = false; + if (hasScheduledScreen) { + setScreen(scheduledScreen); + scheduledScreen = NULL; + hasScheduledScreen = false; + } + return; + } + + if (!player) { + return; + } + +#ifdef RPI + bool mouseDiggable = true; + bool allowGuiClicks = !mouseGrabbed; +#else + bool mouseDiggable = !gui.isInside(Mouse::getX(), Mouse::getY()); + bool allowGuiClicks = true; +#endif + + TIMER_PUSH("mouse"); + while (Mouse::next()) { + //if (Mouse::getButtonState(MouseAction::ACTION_LEFT)) + // LOGI("mouse-down-at: %d, %d\n", Mouse::getX(), Mouse::getY()); + int passedTime = getTimeMs() - lastTickTime; + if (passedTime > 200) continue; // @note: As long Mouse::clear CLEARS the whole buffer, it's safe to break here + // But since it might be rewritten anyway (and hopefully there aren't a lot of messages, we just continue. + + const MouseAction& e = Mouse::getEvent(); + +#ifdef RPI // If clicked when not having focus, get focus @keyboard + if (!mouseGrabbed) { + if (!screen && e.data == MouseAction::DATA_DOWN) { + grabMouse(); + } + } +#endif + + if (allowGuiClicks && e.action == MouseAction::ACTION_LEFT && e.data == MouseAction::DATA_DOWN) { + gui.handleClick(MouseAction::ACTION_LEFT, Mouse::getX(), Mouse::getY()); + } + + if (e.action == MouseAction::ACTION_WHEEL) { + Inventory* v = player->inventory; + int numSlots = gui.getNumSlots() - 1; + int slot = (v->selected - e.dy + numSlots) % numSlots; + v->selectSlot(slot); + } + /* + if (mouseDiggable && options.useMouseForDigging) { + if (Mouse::getEventButton() == MouseAction::ACTION_LEFT && Mouse::getEventButtonState()) { + handleMouseClick(MouseAction::ACTION_LEFT); + lastClickTick = ticks; + } + if (Mouse::getEventButton() == MouseAction::ACTION_RIGHT && Mouse::getEventButtonState()) { + handleMouseClick(MouseAction::ACTION_RIGHT); + lastClickTick = ticks; + } + } + */ + } + + TIMER_POP_PUSH("keyboard"); + while (Keyboard::next()) { + int key = Keyboard::getEventKey(); + bool isPressed = (Keyboard::getEventKeyState() == KeyboardAction::KEYDOWN); + player->setKey(key, isPressed); + + if (isPressed) { + gui.handleKeyPressed(key); + + #if defined(WIN32) || defined(RPI)//|| defined(_DEBUG) || defined(DEBUG) + if (key >= '0' && key <= '9') { + int digit = key - '0'; + int slot = digit - 1; + + if (slot >= 0 && slot < gui.getNumSlots()-1) + player->inventory->selectSlot(slot); + + #if defined(WIN32) + if (digit >= 1 && GetAsyncKeyState(VK_CONTROL) < 0) { + // Set adventure settings here! + AdventureSettingsPacket p(level->adventureSettings); + p.toggle((AdventureSettingsPacket::Flags)(1 << slot)); + p.fillIn(level->adventureSettings); + raknetInstance->send(p); + } + if (digit == 0) { + Pos pos((int)player->x, (int)player->y-1, (int)player->z); + SetSpawnPositionPacket p(pos); + raknetInstance->send(p); + } + #endif + } + #endif + #if defined(RPI) + if (key == Keyboard::KEY_E) { + screenChooser.setScreen(SCREEN_BLOCKSELECTION); + } + if (!screen && key == Keyboard::KEY_O || key == 250) { + releaseMouse(); + } + #endif + #if defined(WIN32) + if (key == Keyboard::KEY_F) { + options.isFlying = !options.isFlying; + player->noPhysics = options.isFlying; + } + + if (key == Keyboard::KEY_T) { + options.thirdPersonView = !options.thirdPersonView; + /* + ImprovedNoise noise; + for (int i = 0; i < 16; ++i) + printf("%d\t%f\n", i, noise.grad2(i, 3, 8)); + */ + } + + if (key == Keyboard::KEY_O) { + useAmbientOcclusion = !useAmbientOcclusion; + options.ambientOcclusion = useAmbientOcclusion; + levelRenderer->allChanged(); + } + + if (key == Keyboard::KEY_L) + options.viewDistance = (options.viewDistance + 1) % 4; + + if (key == Keyboard::KEY_U) { + onGraphicsReset(); + player->heal(100); + } + + if (key == Keyboard::KEY_B || key == 108) // Toggle the game mode + setIsCreativeMode(!isCreativeMode()); + + if (key == Keyboard::KEY_P) // Step forward in time + level->setTime( level->getTime() + 1000); + + if (key == Keyboard::KEY_G) { + setScreen(new ArmorScreen()); + /* + std::vector& boxs = level->getCubes(NULL, AABB(128.1f, 73, 128.1f, 128.9f, 74.9f, 128.9f)); + LOGI("boxes: %d\n", (int)boxs.size()); + */ + } + + if (key == Keyboard::KEY_Y) { + textures->reloadAll(); + player->hurtTo(2); + } + if (key == Keyboard::KEY_Z || key == 108) { + for (int i = 0; i < 1; ++i) { + Mob* mob = NULL; + int forceId = 0;//MobTypes::Sheep; + + int types[] = { + MobTypes::Sheep, + MobTypes::Pig, + MobTypes::Chicken, + MobTypes::Cow, + }; + + int mobType = (forceId > 0)? forceId : types[Mth::random(sizeof(types) / sizeof(int))]; + mob = MobFactory::CreateMob(mobType, level); + + //((Animal*)mob)->setAge(-1000); + float dx = 4 - 8 * Mth::random() + 4 * Mth::sin(Mth::DEGRAD * player->yRot); + float dz = 4 - 8 * Mth::random() + 4 * Mth::cos(Mth::DEGRAD * player->yRot); + if (mob && !MobSpawner::addMob(level, mob, player->x + dx, player->y, player->z + dz, Mth::random()*360, 0, true)) + delete mob; + } + } + + if (key == Keyboard::KEY_X) { + const EntityList& entities = level->getAllEntities(); + for (int i = entities.size()-1; i >= 0; --i) { + Entity* e = entities[i]; + if (!e->isPlayer()) + level->removeEntity(e); + } + } + + if (key == Keyboard::KEY_C /*|| key == 4*/) { + player->inventory->clearInventoryWithDefault(); + // @todo: Add saving here for benchmarking + } + if (key == Keyboard::KEY_H) { + setScreen( new PrerenderTilesScreen() ); + } + + if (key == Keyboard::KEY_O) { + for (int i = Inventory::MAX_SELECTION_SIZE; i < player->inventory->getContainerSize(); ++i) + if (player->inventory->getItem(i)) + player->inventory->dropSlot(i, false); + } + if (key == Keyboard::KEY_F3) { + options.renderDebug = !options.renderDebug; + } + if (key == Keyboard::KEY_M) { + options.difficulty = (options.difficulty == Difficulty::PEACEFUL)? + Difficulty::NORMAL : Difficulty::PEACEFUL; + //setIsCreativeMode( !isCreativeMode() ); + } + + // lanternroci + if (key == Keyboard::KEY_ESCAPE) + pauseGame(false); + if (key == Keyboard::KEY_E && !options.isFlying) { + screenChooser.setScreen(SCREEN_BLOCKSELECTION); + } + + if (options.renderDebug) { + if (key >= '0' && key <= '9') { + _perfRenderer->debugFpsMeterKeyPress(key - '0'); + } + } + #endif + + #ifndef RPI + if (key == 82) + pauseGame(false); + #else + if (key == Keyboard::KEY_ESCAPE) + pauseGame(false); + #endif + + #ifndef OPENGL_ES + if (key == Keyboard::KEY_P) { + static bool isWireFrame = false; + isWireFrame = !isWireFrame; + glPolygonMode(GL_FRONT, isWireFrame? GL_LINE : GL_FILL); + //glPolygonMode(GL_BACK, isWireFrame? GL_LINE : GL_FILL); + } + #endif + } + #ifdef WIN32 + if (key == Keyboard::KEY_M) { + for (int i = 0; i < 5 * SharedConstants::TicksPerSecond; ++i) + level->tick(); + } + #endif + + + //if (!isPressed) LOGI("Key released: %d\n", key); + + if (!options.useMouseForDigging) { + int passedTime = getTimeMs() - lastTickTime; + if (passedTime > 200) continue; + + // Destroy and attack is on same button + if (key == options.keyDestroy.key && isPressed) { + BuildActionIntention bai(BuildActionIntention::BAI_REMOVE | BuildActionIntention::BAI_ATTACK); + handleBuildAction(&bai); + } + else // Build and use/interact is on same button + if (key == options.keyUse.key && isPressed) { + BuildActionIntention bai(BuildActionIntention::BAI_BUILD | BuildActionIntention::BAI_INTERACT); + handleBuildAction(&bai); + } + } + } + + TIMER_POP_PUSH("tickbuild"); + BuildActionIntention bai; + // @note: This might be a problem. This method is polling based here, but + // event based when using mouse (or keys..), and in java. Not quite + // sure just yet what way to go. + bool buildHandled = inputHolder->getBuildInput()->tickBuild(player, &bai); + if (buildHandled) { + if (!bai.isRemoveContinue()) + handleBuildAction(&bai); + } + + bool isTryingToDestroyBlock = (options.useMouseForDigging + ? (Mouse::isButtonDown(MouseAction::ACTION_LEFT) && mouseDiggable) + : Keyboard::isKeyDown(options.keyDestroy.key)) + || (buildHandled && bai.isRemove()); + + TIMER_POP_PUSH("handlemouse"); +#ifdef RPI + handleMouseDown(MouseAction::ACTION_LEFT, isTryingToDestroyBlock); + handleMouseClick(buildHandled && bai.isInteract() + || options.useMouseForDigging && Mouse::isButtonDown(MouseAction::ACTION_RIGHT)); +#else + handleMouseDown(MouseAction::ACTION_LEFT, isTryingToDestroyBlock || (buildHandled && bai.isInteract())); +#endif + + lastTickTime = getTimeMs(); + + // we have (hopefully) handled the keyboard & mouse queue and it + // can now be emptied. If wanted, the reset could be changed to: + // index -= numRead; // then this code doesn't have to be placed here + // + it prepares for tick not handling all or any events. + // update: RAII'ing instead, see above + //Keyboard::reset(); + //Mouse::reset(); + + TIMER_POP(); +#endif +} + +void Minecraft::handleMouseDown(int button, bool down) { +#ifndef STANDALONE_SERVER +#ifndef RPI + if(player->isUsingItem()) { + if(!down && !Keyboard::isKeyDown(options.keyUse.key)) { + gameMode->releaseUsingItem(player); + } + return; + } +#endif + if(player->isSleeping()) { + return; + } + if (button == MouseAction::ACTION_LEFT && missTime > 0) return; + if (down && hitResult.type == TILE && button == MouseAction::ACTION_LEFT && !hitResult.indirectHit) { + int x = hitResult.x; + int y = hitResult.y; + int z = hitResult.z; + gameMode->continueDestroyBlock(x, y, z, hitResult.f); + particleEngine->crack(x, y, z, hitResult.f); + player->swing(); + } else { + gameMode->stopDestroyBlock(); + } +#endif +} + +void Minecraft::handleMouseClick(int button) { +// BuildActionIntention bai( +// (button == MouseAction::ACTION_LEFT)? +// BuildActionIntention::BAI_REMOVE +// : BuildActionIntention::BAI_BUILD); +// +// handleBuildAction(&bai); +} + +void Minecraft::handleBuildAction(BuildActionIntention* action) { +#ifndef STANDALONE_SERVER + if (action->isRemove()) { + if (missTime > 0) return; + player->swing(); + } + if(player->isUsingItem()) + return; + bool mayUse = true; + + if (!hitResult.isHit()) { + if (action->isRemove() && !gameMode->isCreativeType()) { + missTime = 10; + } + } else if (hitResult.type == ENTITY) { + if (action->isAttack()) { + player->swing(); + //LOGI("attacking!\n"); + InteractPacket packet(InteractPacket::Attack, player->entityId, hitResult.entity->entityId); + raknetInstance->send(packet); + gameMode->attack(player, hitResult.entity); + } else if (action->isInteract()) { + if (hitResult.entity->interactPreventDefault()) + mayUse = false; + //LOGI("interacting!\n"); + InteractPacket packet(InteractPacket::Interact, player->entityId, hitResult.entity->entityId); + raknetInstance->send(packet); + gameMode->interact(player, hitResult.entity); + } + } else if (hitResult.type == TILE) { + int x = hitResult.x; + int y = hitResult.y; + int z = hitResult.z; + int face = hitResult.f; + + int oldTileId = level->getTile(x, y, z); + Tile* oldTile = Tile::tiles[oldTileId]; + + //bool tryDestroyBlock = false; + + if (action->isRemove()) { + if (!oldTile) + return; + + //LOGI("tile: %s - %d, %d, %d. b: %f - %f\n", oldTile->getDescriptionId().c_str(), x, y, z, oldTile->getBrightness(level, x, y, z), oldTile->getBrightness(level, x, y+1, z)); + level->extinguishFire(x, y, z, hitResult.f); + gameMode->startDestroyBlock(x, y, z, hitResult.f); + } + else { + ItemInstance* item = player->inventory->getSelected(); + if (gameMode->useItemOn(player, level, item, x, y, z, face, hitResult.pos)) { + mayUse = false; + player->swing(); + #ifdef RPI + } else if (item && item->id == ((Item*)Item::sword_iron)->id) { + player->swing(); + #endif + } + if (item && item->count <= 0) { + player->inventory->clearSlot(player->inventory->selected); + } + //} else if (item && item->count != oldCount) { + // gameRenderer->itemInHandRenderer->itemPlaced(); + //} + } + } + if (mayUse && action->isInteract()) { + ItemInstance* item = player->inventory->getSelected(); + if (item && !player->isUsingItem()) { + if (gameMode->useItem(player, level, item)) { + gameRenderer->itemInHandRenderer->itemUsed(); + } + if (item && item->count <= 0) { + player->inventory->clearSlot(player->inventory->selected); + } + } + } +#endif +} + +bool Minecraft::isOnlineClient() +{ + return (level != NULL && level->isClientSide); +} + +bool Minecraft::isOnline() +{ + return netCallback != NULL; +} + +void Minecraft::pauseGame(bool isBackPaused) { +#ifndef STANDALONE_SERVER + if (screen != NULL) return; + screenChooser.setScreen(isBackPaused? SCREEN_PAUSEPREV : SCREEN_PAUSE); +#endif +} +void Minecraft::gameLostFocus() { +#ifndef STANDALONE_SERVER + if(screen != NULL) { + screen->lostFocus(); + } +#endif +} + + +void Minecraft::setScreen( Screen* screen ) +{ +#ifndef STANDALONE_SERVER + Mouse::reset(); + Multitouch::reset(); + Multitouch::resetThisUpdate(); + + if (screenMutex) { + hasScheduledScreen = true; + scheduledScreen = screen; + return; + } + + if (screen != NULL && screen->isErrorScreen()) + return; + if (screen == NULL && level == NULL) + screen = screenChooser.createScreen(SCREEN_STARTMENU); + + if (this->screen != NULL) { + this->screen->removed(); + delete this->screen; + } + + this->screen = screen; + if (screen != NULL) { + releaseMouse(); + //ScreenSizeCalculator ssc = new ScreenSizeCalculator(options, width, height); + int screenWidth = (int)(width * Gui::InvGuiScale); //ssc.getWidth(); + int screenHeight = (int)(height * Gui::InvGuiScale); //ssc.getHeight(); + screen->init(this, screenWidth, screenHeight); + + if (screen->isInGameScreen() && level) { + level->saveLevelData(); + level->saveGame(); + } + + //noRender = false; + } else { + grabMouse(); + } +#endif +} + +void Minecraft::grabMouse() +{ +#ifndef STANDALONE_SERVER + if (mouseGrabbed) return; + mouseGrabbed = true; + mouseHandler.grab(); + //setScreen(NULL); +#endif +} + +void Minecraft::releaseMouse() +{ +#ifndef STANDALONE_SERVER + if (!mouseGrabbed) { + return; + } + if (player) { + player->releaseAllKeys(); + } + mouseGrabbed = false; + mouseHandler.release(); +#endif +} + +bool Minecraft::useTouchscreen() { +#ifdef RPI + return false; +#endif + return options.useTouchScreen || !_supportsNonTouchscreen; +} +bool Minecraft::supportNonTouchScreen() { + return _supportsNonTouchscreen; +} +void Minecraft::init() +{ + options.minecraft = this; + options.initDefaultValues(); +#ifndef STANDALONE_SERVER + checkGlError("Init enter"); + + _supportsNonTouchscreen = !platform()->supportsTouchscreen(); + + LOGI("IS TOUCHSCREEN? %d\n", options.useTouchScreen); + + textures = new Textures(&options, platform()); + textures->addDynamicTexture(new WaterTexture()); + textures->addDynamicTexture(new WaterSideTexture()); + gui.texturesLoaded(textures); + + levelRenderer = new LevelRenderer(this); + gameRenderer = new GameRenderer(this); + particleEngine = new ParticleEngine(level, textures); + + // Platform specific initialization here + font = new Font(&options, "font/default8.png", textures); + + _perfRenderer = new PerfRenderer(this, font); + + checkGlError("Init complete"); +#endif + + user = new User("TestUser", ""); + setIsCreativeMode(false); // false means it's Survival Mode + reloadOptions(); + +} + +void Minecraft::setSize(int w, int h) { +#ifndef STANDALONE_SERVER + transformResolution(&w, &h); + + width = w; + height = h; + + if (width >= 1000) { + #ifdef __APPLE__ + Gui::GuiScale = (width > 2000)? 8.0f : 4.0f; + #else + Gui::GuiScale = 4.0f; + #endif + } + else if (width >= 800) { +#ifdef __APPLE__ + Gui::GuiScale = 4.0f; +#else + Gui::GuiScale = 3.0f; +#endif + } + else if (width >= 400) + Gui::GuiScale = 2.0f; + else + Gui::GuiScale = 1.0f; + + Gui::InvGuiScale = 1.0f / Gui::GuiScale; + int screenWidth = (int)(width * Gui::InvGuiScale); + int screenHeight = (int)(height * Gui::InvGuiScale); + + if (platform()) { + float pixelsPerMillimeter = options.getProgressValue(&Options::Option::PIXELS_PER_MILLIMETER); + pixelCalc.setPixelsPerMillimeter(pixelsPerMillimeter); + pixelCalcUi.setPixelsPerMillimeter(pixelsPerMillimeter * Gui::InvGuiScale); + } + + Config config = createConfig(this); + gui.onConfigChanged(config); + + if (screen) + screen->setSize(screenWidth, screenHeight); + + if (inputHolder) + inputHolder->onConfigChanged(config); + //LOGI("Setting size: %d, %d: %f\n", width, height, Gui::InvGuiScale); + +#ifdef WIN32 + char resbuf[128]; + sprintf(resbuf, " %d x %d @ scale %.2f", width, height, Gui::GuiScale); + //gui.addMessage(resbuf); +#endif +#endif /* STANDALONE_SERVER */ +} + +void Minecraft::reloadOptions() { + options.update(); + options.save(); + bool wasTouchscreen = options.useTouchScreen; + options.useTouchScreen = useTouchscreen(); + options.save(); + + if ((wasTouchscreen != options.useTouchScreen) || (inputHolder == 0)) + _reloadInput(); + + user->name = options.username; + + LOGI("Reloading-options\n"); + + // @todo @fix Android and iOS behaves a bit differently when leaving + // an options screen (Android recreates OpenGL surface) + setSize(width, height); +} + +void Minecraft::_reloadInput() { +#ifndef STANDALONE_SERVER + delete inputHolder; + + if (useTouchscreen()) { + inputHolder = new TouchInputHolder(this, &options); + } else { + #if defined(ANDROID) || defined(__APPLE__) + inputHolder = new CustomInputHolder( + new XperiaPlayInput(&options), + new ControllerTurnInput(2, ControllerTurnInput::MODE_DELTA), + new IBuildInput()); + #else + inputHolder = new CustomInputHolder( + new KeyboardInput(&options), + new MouseTurnInput(MouseTurnInput::MODE_DELTA, width/2, height/2), + new MouseBuildInput()); + #endif + } + + mouseHandler.setTurnInput(inputHolder->getTurnInput()); + if (level && player) { + player->input = inputHolder->getMoveInput(); + } +#endif +} + + +// +// Multiplayer +// +void Minecraft::locateMultiplayer() { + isLookingForMultiplayer = true; + + raknetInstance->pingForHosts(19132); + netCallback = new ClientSideNetworkHandler(this, raknetInstance); +} + +void Minecraft::cancelLocateMultiplayer() { + isLookingForMultiplayer = false; + + raknetInstance->stopPingForHosts(); + + delete netCallback; + netCallback = NULL; +} + +bool Minecraft::joinMultiplayer( const PingedCompatibleServer& server ) +{ + if (isLookingForMultiplayer && netCallback) { + isLookingForMultiplayer = false; + return raknetInstance->connect(server.address.ToString(false), server.address.GetPort()); + } + return false; +} + +void Minecraft::hostMultiplayer(int port) { + // Tear down last instance + raknetInstance->disconnect(); + delete netCallback; + netCallback = NULL; + +#if !defined(NO_NETWORK) + netCallback = new ServerSideNetworkHandler(this, raknetInstance); + #ifdef STANDALONE_SERVER + raknetInstance->host(user->name, port, 16); + #else + raknetInstance->host(user->name, port); + #endif +#endif +} + +// +// Level generation +// +/*static*/ + + void* Minecraft::prepareLevel_tspawn(void *p_param) +{ + Minecraft* mc = (Minecraft*) p_param; + mc->generateLevel("Currently not used", mc->level); + return 0; +} + +void Minecraft::generateLevel( const std::string& message, Level* level ) +{ + Stopwatch s; + s.start(); + prepareLevel(message); + s.stop(); + s.print("Level generated: "); + + // "Unlock" + isGeneratingLevel = false; +} + +void Minecraft::_levelGenerated() +{ +#ifndef STANDALONE_SERVER + if (player == NULL) { + player = (LocalPlayer*) gameMode->createPlayer(level); + gameMode->initPlayer(player); + } + + if (player) { + player->input = inputHolder->getMoveInput(); + } + + if (levelRenderer != NULL) levelRenderer->setLevel(level); + if (particleEngine != NULL) particleEngine->setLevel(level); + + gameMode->adjustPlayer(player); + gui.onLevelGenerated(); +#endif + + level->validateSpawn(); + level->loadPlayer(player, true); + // if we are client side, we trust the server to have given us a correct position + if (player && !level->isClientSide) { + player->resetPos(false); + } + + this->cameraTargetPlayer = player; + + if (raknetInstance->isServer()) + raknetInstance->announceServer(user->name); + + if (netCallback) { + netCallback->levelGenerated(level); + } + +#if defined(WIN32) || defined(RPI) + if (_commandServer) { + delete _commandServer; + } + _commandServer = new CommandServer(this); + _commandServer->init(commandPort); +#endif + + // Hack to (hopefully) get the players to show (note: in LevelListener + // instead, since adding yourself always generates a entityAdded) + //EntityRenderDispatcher::getInstance()->onGraphicsReset(); + _hasSignaledGeneratingLevelFinished = true; +} + +Player* Minecraft::respawnPlayer(int playerId) { + for (unsigned int i = 0; i < level->players.size(); ++i) { + if (level->players[i]->entityId == playerId) { + resetPlayer(level->players[i]); + return level->players[i]; + } + } + return NULL; +} + +void Minecraft::resetPlayer(Player* player) { + level->validateSpawn(); + player->reset(); + + Pos p; + if(player->hasRespawnPosition()) { + p = player->getRespawnPosition(); + } + else { + p = level->getSharedSpawnPos(); + } + player->setPos((float)p.x + 0.5f, (float)p.y + 1.0f, (float)p.z + 0.5f); + player->resetPos(true); + + if (isCreativeMode()) + player->inventory->clearInventoryWithDefault(); +} + +void Minecraft::respawnPlayer() { + // RESET THE FRACKING PLAYER HERE + //bool slowCheck = false; + //for (int i = 0; i < level->entities.size(); ++i) + // if (level->entities[i] == player) slowCheck = true; + // + //LOGI("Has entity? %d, %d\n", level->getEntity(player->entityId), slowCheck); + + resetPlayer(player); + + // tell server (or other client) that we re-spawned + RespawnPacket packet(player); + raknetInstance->send(packet); +} + +void Minecraft::onGraphicsReset() +{ +#ifndef STANDALONE_SERVER + textures->clear(); + + font->onGraphicsReset(); + gui.onGraphicsReset(); + + if (levelRenderer) levelRenderer->onGraphicsReset(); + if (gameRenderer) gameRenderer->onGraphicsReset(); + + EntityRenderDispatcher::getInstance()->onGraphicsReset(); + TileEntityRenderDispatcher::getInstance()->onGraphicsReset(); +#endif +} + +int Minecraft::getProgressStatusId() { + return progressStageStatusId; +} + +const char* Minecraft::getProgressMessage() +{ + return progressMessages[progressStageStatusId]; +} + +bool Minecraft::isLevelGenerated() +{ + return level != NULL && !isGeneratingLevel; +} + +LevelStorageSource* Minecraft::getLevelSource() +{ + return storageSource; +} + +int Minecraft::getLicenseId() { + if (!LicenseCodes::isReady(_licenseId)) + _licenseId = platform()->checkLicense(); + return _licenseId; +} + +void Minecraft::audioEngineOn() { +#ifndef STANDALONE_SERVER + soundEngine->enable(true); +#endif +} +void Minecraft::audioEngineOff() { +#ifndef STANDALONE_SERVER + soundEngine->enable(false); +#endif +} + +void Minecraft::setIsCreativeMode(bool isCreative) +{ +#ifdef CREATORMODE + delete gameMode; + gameMode = new CreatorMode(this); + _isCreativeMode = true; +#else + if (!gameMode || isCreative != _isCreativeMode) + { + delete gameMode; + if (isCreative) gameMode = new CreativeMode(this); + else gameMode = new SurvivalMode(this); + _isCreativeMode = isCreative; + } +#endif + if (player) + gameMode->initAbilities(player->abilities); +} + +bool Minecraft::isCreativeMode() { + return _isCreativeMode; +} + +bool Minecraft::isKindleFire(int kindleVersion) { + if (kindleVersion != 1) + return false; + + std::string model = platform()->getPlatformStringVar(PlatformStringVars::DEVICE_BUILD_MODEL); + std::string modelLower(model); + std::transform(modelLower.begin(), modelLower.end(), modelLower.begin(), tolower); + + return (modelLower.find("kindle") != std::string::npos) && (modelLower.find("fire") != std::string::npos); +} + +bool Minecraft::transformResolution(int* w, int* h) +{ + bool changed = false; + + // Kindle Fire 1: reporting wrong height in + // certain cases (e.g. after screen lock) + if (isKindleFire(1) && *h >= 560 && *h <= 620) { + *h = 580; + changed = true; + } + + return changed; +} + +ICreator* Minecraft::getCreator() +{ +#ifdef CREATORMODE + return ((CreatorMode*)gameMode)->getCreator(); +#else + return NULL; +#endif +} + +void Minecraft::optionUpdated( const Options::Option* option, bool value ) { + if(netCallback != NULL && option == &Options::Option::SERVER_VISIBLE) { + ServerSideNetworkHandler* ss = (ServerSideNetworkHandler*) netCallback; + ss->allowIncomingConnections(value); + } +} + +void Minecraft::optionUpdated( const Options::Option* option, float value ) { +#ifndef STANDALONE_SERVER + if(option == &Options::Option::PIXELS_PER_MILLIMETER) { + pixelCalcUi.setPixelsPerMillimeter(value * Gui::InvGuiScale); + pixelCalc.setPixelsPerMillimeter(value); + } +#endif +} + +void Minecraft::optionUpdated( const Options::Option* option, int value ) { + +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/7EAC658EF12ABB6C7FB918B4EE6CE367 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/7EAC658EF12ABB6C7FB918B4EE6CE367 new file mode 100644 index 0000000..ca65891 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/7EAC658EF12ABB6C7FB918B4EE6CE367 @@ -0,0 +1,230 @@ +#include "JoinGameScreen.h" +#include "StartMenuScreen.h" +#include "ProgressScreen.h" +#include "../Font.h" +#include "../../../network/RakNetInstance.h" +#include "../../../network/ClientSideNetworkHandler.h" + +#include "../components/TextBox.h" + +#include +#include +#include + +JoinGameScreen::JoinGameScreen() +: bJoin(2, "Join Game"), + bBack(3, "Back"), + gamesList(NULL), + ip(5, "IP+Port?") +{ + bJoin.active = false; + //gamesList->yInertia =0.5f; +} + +JoinGameScreen::~JoinGameScreen() +{ + delete gamesList; +} + +void JoinGameScreen::buttonClicked(Button* button) +{ + if (button->id == bJoin.id) + { + // Try manual IP:Port from textbox first (if provided) + std::string addr = ip.text; + // trim whitespace + auto trim = [](std::string &s) { + size_t start =0; + while (start < s.size() && std::isspace((unsigned char)s[start])) ++start; + size_t end = s.size(); + while (end > start && std::isspace((unsigned char)s[end -1])) --end; + s = s.substr(start, end - start); + }; + trim(addr); + + if (!addr.empty() && addr != "IP+Port?") + { + // parse host[:port], default port19132 + std::string host = addr; + int port =19132; + size_t colon = addr.find(':'); + if (colon != std::string::npos) + { + host = addr.substr(0, colon); + std::string portStr = addr.substr(colon +1); + trim(host); + trim(portStr); + if (!portStr.empty()) + port = std::atoi(portStr.c_str()); + } else { + trim(host); + } + + if (!host.empty()) + { + // Tear down any previous callback and create a client callback for this connection + if (minecraft->netCallback) { + delete minecraft->netCallback; + minecraft->netCallback = NULL; + } + minecraft->netCallback = new ClientSideNetworkHandler(minecraft, minecraft->raknetInstance); + + // Start the connection (returns immediately whether startup succeeded) + minecraft->raknetInstance->connect(host.c_str(), port); + + // Mirror existing behavior: disable buttons and show progress screen + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + return; + } + + // Fallback: join selected discovered server (existing behavior) + if (isIndexValid(gamesList->selectedItem)) + { + PingedCompatibleServer selectedServer = gamesList->copiedServerList[gamesList->selectedItem]; + minecraft->joinMultiplayer(selectedServer); + { + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + } + //minecraft->locateMultiplayer(); + //minecraft->setScreen(new JoinGameScreen()); + } + if (button->id == bBack.id) + { + minecraft->cancelLocateMultiplayer(); + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } +} + +bool JoinGameScreen::handleBackEvent(bool isDown) +{ + if (!isDown) + { + minecraft->cancelLocateMultiplayer(); + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } + return true; +} + + +bool JoinGameScreen::isIndexValid( int index ) +{ + return gamesList && index >=0 && index < gamesList->getNumberOfItems(); +} + +void JoinGameScreen::tick() +{ + const ServerList& orgServerList = minecraft->raknetInstance->getServerList(); + ServerList serverList; + for (unsigned int i =0; i < orgServerList.size(); ++i) + if (orgServerList[i].name.GetLength() >0) + serverList.push_back(orgServerList[i]); + + if (serverList.size() != gamesList->copiedServerList.size()) + { + // copy the currently selected item + PingedCompatibleServer selectedServer; + bool hasSelection = false; + if (isIndexValid(gamesList->selectedItem)) + { + selectedServer = gamesList->copiedServerList[gamesList->selectedItem]; + hasSelection = true; + } + + gamesList->copiedServerList = serverList; + gamesList->selectItem(-1, false); + + // re-select previous item if it still exists + if (hasSelection) + { + for (unsigned int i =0; i < gamesList->copiedServerList.size(); i++) + { + if (gamesList->copiedServerList[i].address == selectedServer.address) + { + gamesList->selectItem(i, false); + break; + } + } + } + } else { + for (int i = (int)gamesList->copiedServerList.size()-1; i >=0 ; --i) { + for (int j =0; j < (int) serverList.size(); ++j) + if (serverList[j].address == gamesList->copiedServerList[i].address) + gamesList->copiedServerList[i].name = serverList[j].name; + } + } + + bJoin.active = isIndexValid(gamesList->selectedItem); +} + +void JoinGameScreen::init() +{ + buttons.push_back(&bJoin); + buttons.push_back(&bBack); + textBoxes.push_back(&ip); + + minecraft->raknetInstance->clearServerList(); + gamesList = new AvailableGamesList(minecraft, width, height); + +#ifdef ANDROID + tabButtons.push_back(&bJoin); + tabButtons.push_back(&bBack); +#endif +} + +void JoinGameScreen::setupPositions() { + int yBase = height -26; + + //#ifdef ANDROID + bJoin.y = yBase; + bBack.y = yBase; + + bBack.width = bJoin.width =120; + //#endif + + // Center buttons + bJoin.x = width /2 -4 - bJoin.width; + bBack.x = width /2 +4; + ip.x =1; + ip.y =10; + ip.w = bJoin.width; +} + +void JoinGameScreen::render( int xm, int ym, float a ) +{ + bool hasNetwork = minecraft->platform()->isNetworkEnabled(true); +#ifdef WIN32 + hasNetwork = hasNetwork && !GetAsyncKeyState(VK_TAB); +#endif + + renderBackground(); + if (hasNetwork) gamesList->render(xm, ym, a); + Screen::render(xm, ym, a); + + if (hasNetwork) { +#ifdef RPI + std::string s = "Scanning for Local Network Games..."; +#else + std::string s = "Scanning for WiFi Games..."; +#endif + drawCenteredString(minecraft->font, s, width /2,8,0xffffffff); + + const int textWidth = minecraft->font->width(s); + const int spinnerX = width/2 + textWidth /2 +6; + + static const char* spinnerTexts[] = {"-", "\\", "|", "/"}; + int n = ((int)(5.5f * getTimeS()) %4); + drawCenteredString(minecraft->font, spinnerTexts[n], spinnerX,8,0xffffffff); + } else { + std::string s = "WiFi is disabled"; + const int yy = height /2 -8; + drawCenteredString(minecraft->font, s, width /2, yy,0xffffffff); + } +} + +bool JoinGameScreen::isInGameScreen() { return false; } diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/83105CECE6AA00603D9DA1057156A4A0 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/83105CECE6AA00603D9DA1057156A4A0 new file mode 100644 index 0000000..55155fc --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/83105CECE6AA00603D9DA1057156A4A0 @@ -0,0 +1,146 @@ +#include "TextEditScreen.h" +#include "../../../world/level/tile/entity/SignTileEntity.h" +#include "../../../AppPlatform.h" +#include "../../Minecraft.h" +#include "../../renderer/tileentity/TileEntityRenderDispatcher.h" +#include "../../renderer/Tesselator.h" +#include "../../renderer/Textures.h" +#include "../../renderer/GameRenderer.h" +#include "../components/Button.h" +#include "../../../network/Packet.h" +#include "../../../network/RakNetInstance.h" +TextEditScreen::TextEditScreen( SignTileEntity* signEntity ) + : sign(signEntity), isShowingKeyboard(false), frame(0), line(0), btnClose(1, "") { + +} +TextEditScreen::~TextEditScreen() { + +} +void TextEditScreen::init() { + super::init(); + minecraft->platform()->showKeyboard(); + isShowingKeyboard = true; + ImageDef def; + def.name = "gui/spritesheet.png"; + def.x = 0; + def.y = 1; + def.width = def.height = 18; + def.setSrc(IntRectangle(60, 0, 18, 18)); + btnClose.setImageDef(def, true); + btnClose.scaleWhenPressed = false; + buttons.push_back(&btnClose); +} + +void TextEditScreen::setupPositions() { + btnClose.width = btnClose.height = 19; + btnClose.x = width - btnClose.width; + btnClose.y = 0; +} + + +bool TextEditScreen::handleBackEvent( bool isDown ) { + sign->setChanged(); + Packet* signUpdatePacket = sign->getUpdatePacket(); + minecraft->raknetInstance->send(signUpdatePacket); + minecraft->platform()->hideKeyboard(); + minecraft->setScreen(NULL); + return true; +} + +void TextEditScreen::render( int xm, int ym, float a ) { + glDepthMask(GL_FALSE); + renderBackground(); + glPushMatrix(); + glDepthMask(GL_TRUE); + glDisable(GL_CULL_FACE); + glLoadIdentity(); + Tesselator& t = Tesselator::instance; + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrthof(0.0f, (float)minecraft->width, (float)minecraft->height, 0, -1, 1); + glMatrixMode(GL_MODELVIEW); + + minecraft->textures->loadAndBindTexture("item/sign.png"); + glColor4f2(1, 1, 1, 1); + + static float minUV[] = {0.03126f, 0.06249f}; + static float maxUV[] = {0.39063f, 0.4374f}; + float scale = ((minecraft->height / 2) / 32) * 0.9f; + + glTranslatef(minecraft->width / 2.0f, 5.0f, 0.0f); + glScalef2(scale,scale,1); + t.begin(GL_QUADS); + t.vertexUV(-32, 0, 0.0f,minUV[0],minUV[1]); + t.vertexUV(32, 0, 0.0f, maxUV[0], minUV[1]); + t.vertexUV(32, 0 + 32, 0.0f, maxUV[0], maxUV[1]); + t.vertexUV(-32, 0 + 32, 0.0f, minUV[0], maxUV[1]); + t.draw(); + + sign->selectedLine = line; + float textScale = 8.0f / 11.0f; + + glTranslatef(0, 2 ,0); + glScalef2(textScale, textScale, 1); + for(int i = 0; i < 4; ++i) { + //drawCenteredString(font, sign->messages[a], 32.0f, 10 * a, 0xFF000000); + std::string msg = sign->messages[i]; + if (i == sign->selectedLine && msg.length() < 14) { + std::string s = "> " + msg + " <"; + font->draw(s, -(float)font->width(s) / 2.0f, 10.0f * i, 0xFF000000, false); + } else { + font->draw(msg, -(float)font->width(msg) / 2.0f, 10.0f * i, 0xFF000000, false); + } + } + sign->selectedLine = -1; + //font->draw("Hej", minecraft->width / 2, 100, 0xFFFFFFFF, false); + + glPopMatrix(); + glEnable(GL_CULL_FACE); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + + //glEnable(GL_DEPTH_TEST); + super::render(xm, ym, a); +} + +void TextEditScreen::lostFocus() { + +} + +void TextEditScreen::tick() { + frame++; +} + +void TextEditScreen::keyPressed( int eventKey ) { + LOGW("Key pressed! [%d]", eventKey); + if(eventKey == Keyboard::KEY_BACKSPACE) { + if(sign->messages[line].length() > 0) { + sign->messages[line].erase(sign->messages[line].size() - 1, 1); + } else { + line--; + if(line < 0) { + line = 3; + } + } + } else if(eventKey == Keyboard::KEY_RETURN) { + line = (line + 1) % 4; + } else { + super::keyPressed(eventKey); + } +} + +void TextEditScreen::keyboardNewChar( char inputChar ) { + std::string fullstring = sign->messages[line] + inputChar; + if(fullstring.length() < 16) { + sign->messages[line] = fullstring; + //LOGW("Line text updated: %s\n", fullstring.c_str()); + } +} + +void TextEditScreen::buttonClicked( Button* button ) { + if(button == &btnClose) + handleBackEvent(true); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/9CAB88584C535B15B7D916C84A38AB20 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/9CAB88584C535B15B7D916C84A38AB20 new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/9CAB88584C535B15B7D916C84A38AB20 @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/AF8821B3E089A14209FA7C2F8B96C378 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/AF8821B3E089A14209FA7C2F8B96C378 new file mode 100644 index 0000000..fe92a27 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/AF8821B3E089A14209FA7C2F8B96C378 @@ -0,0 +1,233 @@ +#include "TouchJoinGameScreen.h" +#include "../StartMenuScreen.h" +#include "../ProgressScreen.h" +#include "../../Font.h" +#include "../../../Minecraft.h" +#include "../../../renderer/Textures.h" + +namespace Touch { + +// +// Games list +// + +void AvailableGamesList::selectStart( int item) { + startSelected = item; +} + +void AvailableGamesList::selectCancel() { + startSelected = -1; +} + +void AvailableGamesList::selectItem( int item, bool doubleClick ) { + LOGI("selected an item! %d\n", item); + selectedItem = item; +} + +void AvailableGamesList::renderItem( int i, int x, int y, int h, Tesselator& t ) +{ + if (startSelected == i && Multitouch::getFirstActivePointerIdEx() >= 0) { + fill((int)x0, y, (int)x1, y+h, 0x809E684F); + } + + //static int colors[2] = {0xffffb0, 0xcccc90}; + const PingedCompatibleServer& s = copiedServerList[i]; + unsigned int color = s.isSpecial? 0x6090a0 : 0xffffb0; + unsigned int color2 = 0xffffa0;//colors[i&1]; + + int xx1 = (int)x0 + 24; + int xx2 = xx1; + + if (s.isSpecial) { + xx1 += 50; + + glEnable2(GL_TEXTURE_2D); + glColor4f2(1,1,1,1); + glEnable2(GL_BLEND); + minecraft->textures->loadAndBindTexture("gui/badge/minecon140.png"); + blit(xx2, y + 6, 0, 0, 37, 8, 140, 240); + } + + drawString(minecraft->font, s.name.C_String(), xx1, y + 4 + 2, color); + drawString(minecraft->font, s.address.ToString(false), xx2, y + 18, color2); + + /* + drawString(minecraft->font, copiedServerList[i].name.C_String(), (int)x0 + 24, y + 4, color); + drawString(minecraft->font, copiedServerList[i].address.ToString(false), (int)x0 + 24, y + 18, color); + */ +} + + +// +// Join Game screen +// +JoinGameScreen::JoinGameScreen() +: bJoin( 2, "Join Game"), + bBack( 3, "Back"), + bHeader(0, ""), + gamesList(NULL) +{ + bJoin.active = false; + //gamesList->yInertia = 0.5f; +} + +JoinGameScreen::~JoinGameScreen() +{ + delete gamesList; +} + +void JoinGameScreen::init() +{ + //buttons.push_back(&bJoin); + buttons.push_back(&bBack); + buttons.push_back(&bHeader); + + minecraft->raknetInstance->clearServerList(); + gamesList = new AvailableGamesList(minecraft, width, height); + +#ifdef ANDROID + //tabButtons.push_back(&bJoin); + tabButtons.push_back(&bBack); +#endif +} + +void JoinGameScreen::setupPositions() { + //int yBase = height - 26; + + //#ifdef ANDROID + bJoin.y = 0; + bBack.y = 0; + bHeader.y = 0; + //#endif + + // Center buttons + //bJoin.x = width / 2 - 4 - bJoin.w; + bBack.x = 0;//width / 2 + 4; + bHeader.x = bBack.width; + bHeader.width = width - bHeader.x; +} + +void JoinGameScreen::buttonClicked(Button* button) +{ + if (button->id == bJoin.id) + { + if (isIndexValid(gamesList->selectedItem)) + { + PingedCompatibleServer selectedServer = gamesList->copiedServerList[gamesList->selectedItem]; + minecraft->joinMultiplayer(selectedServer); + { + bJoin.active = false; + bBack.active = false; + minecraft->setScreen(new ProgressScreen()); + } + } + //minecraft->locateMultiplayer(); + //minecraft->setScreen(new JoinGameScreen()); + } + if (button->id == bBack.id) + { + minecraft->cancelLocateMultiplayer(); + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } +} + +bool JoinGameScreen::handleBackEvent(bool isDown) +{ + if (!isDown) + { + minecraft->cancelLocateMultiplayer(); + minecraft->screenChooser.setScreen(SCREEN_STARTMENU); + } + return true; +} + + +bool JoinGameScreen::isIndexValid( int index ) +{ + return gamesList && index >= 0 && index < gamesList->getNumberOfItems(); +} + +void JoinGameScreen::tick() +{ + if (isIndexValid(gamesList->selectedItem)) { + buttonClicked(&bJoin); + return; + } + + //gamesList->tick(); + + const ServerList& orgServerList = minecraft->raknetInstance->getServerList(); + ServerList serverList; + for (unsigned int i = 0; i < orgServerList.size(); ++i) + if (orgServerList[i].name.GetLength() > 0) + serverList.push_back(orgServerList[i]); + + if (serverList.size() != gamesList->copiedServerList.size()) + { + // copy the currently selected item + PingedCompatibleServer selectedServer; + bool hasSelection = false; + if (isIndexValid(gamesList->selectedItem)) + { + selectedServer = gamesList->copiedServerList[gamesList->selectedItem]; + hasSelection = true; + } + + gamesList->copiedServerList = serverList; + gamesList->selectItem(-1, false); + + // re-select previous item if it still exists + if (hasSelection) + { + for (unsigned int i = 0; i < gamesList->copiedServerList.size(); i++) + { + if (gamesList->copiedServerList[i].address == selectedServer.address) + { + gamesList->selectItem(i, false); + break; + } + } + } + } else { + for (int i = (int)gamesList->copiedServerList.size()-1; i >= 0 ; --i) { + for (int j = 0; j < (int) serverList.size(); ++j) + if (serverList[j].address == gamesList->copiedServerList[i].address) + gamesList->copiedServerList[i].name = serverList[j].name; + } + } + + bJoin.active = isIndexValid(gamesList->selectedItem); +} + +void JoinGameScreen::render( int xm, int ym, float a ) +{ + bool hasNetwork = minecraft->platform()->isNetworkEnabled(true); +#ifdef WIN32 + hasNetwork = hasNetwork && !GetAsyncKeyState(VK_TAB); +#endif + + renderBackground(); + if (hasNetwork) gamesList->render(xm, ym, a); + else gamesList->renderDirtBackground(); + Screen::render(xm, ym, a); + + const int baseX = bHeader.x + bHeader.width / 2; + + if (hasNetwork) { + std::string s = "Scanning for WiFi Games..."; + drawCenteredString(minecraft->font, s, baseX, 8, 0xffffffff); + + const int textWidth = minecraft->font->width(s); + const int spinnerX = baseX + textWidth / 2 + 6; + + static const char* spinnerTexts[] = {"-", "\\", "|", "/"}; + int n = ((int)(5.5f * getTimeS()) % 4); + drawCenteredString(minecraft->font, spinnerTexts[n], spinnerX, 8, 0xffffffff); + } else { + drawCenteredString(minecraft->font, "WiFi is disabled", baseX, 8, 0xffffffff); + } +} + +bool JoinGameScreen::isInGameScreen() { return false; } + +}; diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/B232B2832A57A8D434C0B6499C9ADAE5 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/B232B2832A57A8D434C0B6499C9ADAE5 new file mode 100644 index 0000000..b447bc5 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/B232B2832A57A8D434C0B6499C9ADAE5 @@ -0,0 +1,73 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_SCREENS__JoinGameScreen_H__ +#define NET_MINECRAFT_CLIENT_GUI_SCREENS__JoinGameScreen_H__ + +#include "../Screen.h" +#include "../components/Button.h" +#include "../components/SmallButton.h" +#include "../components/ScrolledSelectionList.h" +#include "../../Minecraft.h" +#include "../../../network/RakNetInstance.h" + +#include "../components/TextBox.h" + +class JoinGameScreen; + +class AvailableGamesList : public ScrolledSelectionList +{ + int selectedItem; + ServerList copiedServerList; + + friend class JoinGameScreen; + +public: + + AvailableGamesList(Minecraft* _minecraft, int _width, int _height) + : ScrolledSelectionList(_minecraft, _width, _height, 24, _height - 30, 28) + { + } + +protected: + + virtual int getNumberOfItems() { return (int)copiedServerList.size(); } + + virtual void selectItem(int item, bool doubleClick) { selectedItem = item; } + virtual bool isSelectedItem(int item) { return item == selectedItem; } + + virtual void renderBackground() {} + virtual void renderItem(int i, int x, int y, int h, Tesselator& t) + { + const PingedCompatibleServer& s = copiedServerList[i]; + unsigned int color = s.isSpecial? 0xff00b0 : 0xffffa0; + drawString(minecraft->font, s.name.C_String(), x, y + 2, color); + drawString(minecraft->font, s.address.ToString(false), x, y + 16, 0xffffa0); + } +}; + +class JoinGameScreen: public Screen +{ +public: + JoinGameScreen(); + virtual ~JoinGameScreen(); + + void init(); + void setupPositions(); + + virtual bool handleBackEvent(bool isDown); + + virtual bool isIndexValid(int index); + + virtual void tick(); + + void render(int xm, int ym, float a); + + void buttonClicked(Button* button); + + bool isInGameScreen(); +private: + Button bJoin; + Button bBack; + AvailableGamesList* gamesList; + TextBox ip; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_SCREENS__JoinGameScreen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/E19DC915D7B7F4D40A50F260C758DAD9 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/E19DC915D7B7F4D40A50F260C758DAD9 new file mode 100644 index 0000000..8b4d6da --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/E19DC915D7B7F4D40A50F260C758DAD9 @@ -0,0 +1,80 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI__Screen_H__ +#define NET_MINECRAFT_CLIENT_GUI__Screen_H__ + +//package net.minecraft.client.gui; + +#include +#include "GuiComponent.h" + +class Font; +class Minecraft; +class Button; +class TextBox; +struct IntRectangle; + +class Screen: public GuiComponent +{ +public: + Screen(); + + virtual void render(int xm, int ym, float a); + + void init(Minecraft* minecraft, int width, int height); + virtual void init(); + + void setSize(int width, int height); + virtual void setupPositions() {}; + + virtual void updateEvents(); + virtual void mouseEvent(); + virtual void keyboardEvent(); + virtual void keyboardTextEvent(); + virtual bool handleBackEvent(bool isDown); + + virtual void tick() {} + + virtual void removed() {} + + virtual void renderBackground(); + virtual void renderBackground(int vo); + virtual void renderDirtBackground(int vo); + // query + virtual bool renderGameBehind(); + virtual bool hasClippingArea(IntRectangle& out); + + virtual bool isPauseScreen(); + virtual bool isErrorScreen(); + virtual bool isInGameScreen(); + virtual bool closeOnPlayerHurt(); + + virtual void confirmResult(bool result, int id) {} + virtual void lostFocus(); + virtual void toGUICoordinate(int& x, int& y); +protected: + void updateTabButtonSelection(); + + virtual void buttonClicked(Button* button) {} + virtual void mouseClicked(int x, int y, int buttonNum); + virtual void mouseReleased(int x, int y, int buttonNum); + + virtual void keyPressed(int eventKey); + virtual void keyboardNewChar(char inputChar) {} +public: + int width; + int height; + bool passEvents; + //GuiParticles* particles; +protected: + Minecraft* minecraft; + std::vector buttons; + std::vector textBoxes; + + std::vector tabButtons; + int tabButtonIndex; + + Font* font; +private: + Button* clickedButton; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI__Screen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/E25FB3B811E26EA86767132ABFD6C0FE b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/E25FB3B811E26EA86767132ABFD6C0FE new file mode 100644 index 0000000..45852ad --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/D8BC2D605FEE4B47AE204C3E46A742DC/E25FB3B811E26EA86767132ABFD6C0FE @@ -0,0 +1,233 @@ +#ifndef NET_MINECRAFT_CLIENT__Minecraft_H__ +#define NET_MINECRAFT_CLIENT__Minecraft_H__ + +#include "Options.h" +#ifndef STANDALONE_SERVER +#include "MouseHandler.h" +#endif +#include "Timer.h" +#include "player/input/ITurnInput.h" +#ifndef STANDALONE_SERVER +#include "gui/Gui.h" +#include "gui/screens/ScreenChooser.h" +#endif +//#include "../network/RakNetInstance.h" +#include "../world/phys/HitResult.h" + +class User; +class Level; +class LocalPlayer; +class IInputHolder; +class Mob; +class Player; +class LevelRenderer; +class GameRenderer; +class ParticleEngine; +class Entity; +class ICreator; +class GameMode; +class Textures; +class CThread; +class SoundEngine; +class Screen; +class Font; +class LevelStorageSource; +class BuildActionIntention; +class PerfRenderer; +class LevelSettings; +class IRakNetInstance; +class NetEventCallback; +class CommandServer; +struct PingedCompatibleServer; +//class ExternalFileLevelStorageSource; + + +#include "../App.h" +#include "PixelCalc.h" +class AppPlatform; +class AppPlatform_android; + +class Minecraft: public App +{ +protected: + Minecraft(); +public: + virtual ~Minecraft(); + + void init(); + void setSize(int width, int height); + void reloadOptions(); + + bool supportNonTouchScreen(); + bool useTouchscreen(); + void grabMouse(); + void releaseMouse(); + + void handleBuildAction(BuildActionIntention*); + + void toggleDimension(){} + bool isCreativeMode(); + void setIsCreativeMode(bool isCreative); + void setScreen(Screen*); + + virtual void selectLevel(const std::string& levelId, const std::string& levelName, const LevelSettings& settings); + virtual void setLevel(Level* level, const std::string& message = "", LocalPlayer* forceInsertPlayer = NULL); + + void generateLevel( const std::string& message, Level* level ); + LevelStorageSource* getLevelSource(); + + bool isLookingForMultiplayer; + void locateMultiplayer(); + void cancelLocateMultiplayer(); + bool joinMultiplayer(const PingedCompatibleServer& server); + void hostMultiplayer(int port=19132); + Player* respawnPlayer(int playerId); + void respawnPlayer(); + void resetPlayer(Player* player); + void doActuallyRespawnPlayer(); + + void update(); + + void tick(int nTick, int maxTick); + void tickInput(); + + bool isOnlineClient(); + bool isOnline(); + void pauseGame(bool isBackPaused); + void gameLostFocus(); + + void prepareLevel(const std::string& message); + + void leaveGame(bool renameLevel = false); + + int getProgressStatusId(); + const char* getProgressMessage(); + + ICreator* getCreator(); + + // void onGraphicsLost() {} + void onGraphicsReset(); + + bool isLevelGenerated(); + int getLicenseId(); + + void audioEngineOn(); + void audioEngineOff(); + + bool isPowerVR() { return _powerVr; } + bool isKindleFire(int kindleVersion); + bool transformResolution(int* w, int* h); + void optionUpdated(const Options::Option* option, bool value); + void optionUpdated(const Options::Option* option, float value); + void optionUpdated(const Options::Option* option, int value); +#ifdef __APPLE__ + bool _isSuperFast; + bool isSuperFast() { return _isSuperFast; } +#endif + +protected: + void _levelGenerated(); + +private: + static void* prepareLevel_tspawn(void *p_param); + + void handleMouseClick(int button); + void handleMouseDown(int button, bool down); + + void _reloadInput(); +public: + int width; + int height; + + // Vars that the platform is allowed to use in the future + int commandPort; + int reserved_d1, reserved_d2; + float reserved_f1, reserved_f2; + + Options options; + + static bool useAmbientOcclusion; + //static bool threadInterrupt; + + volatile bool pause; + + LevelRenderer* levelRenderer; + GameRenderer* gameRenderer; + ParticleEngine* particleEngine; + SoundEngine* soundEngine; + + GameMode* gameMode; +#ifndef STANDALONE_SERVER + Textures* textures; + ScreenChooser screenChooser; + Font* font; +#endif + IRakNetInstance* raknetInstance; + NetEventCallback* netCallback; + + int lastTime; + int lastTickTime; + float ticksSinceLastUpdate; + + User* user; + Level* level; + + LocalPlayer* player; + IInputHolder* inputHolder; + Mob* cameraTargetPlayer; +#ifndef STANDALONE_SERVER + Gui gui; +#endif + CThread* generateLevelThread; + Screen* screen; + static int customDebugId; + + static const int CDI_NONE = 0; + static const int CDI_GRAPHICS = 1; +#ifndef STANDALONE_SERVER + MouseHandler mouseHandler; +#endif + bool mouseGrabbed; + + PixelCalc pixelCalc; + PixelCalc pixelCalcUi; + + HitResult hitResult; + volatile int progressStagePercentage; + + // This field is initialized in main() + // It sets the base path to where worlds can be written (sdcard on android) + std::string externalStoragePath; + std::string externalCacheStoragePath; +protected: + Timer timer; + // @note @attn @warn: this is dangerous as fuck! + volatile bool isGeneratingLevel; + bool _hasSignaledGeneratingLevelFinished; + + LevelStorageSource* storageSource; + bool _running; + bool _powerVr; + +private: + volatile int progressStageStatusId; + static const char* progressMessages[]; + + int missTime; + int ticks; + bool screenMutex; + bool hasScheduledScreen; + Screen* scheduledScreen; + + int _licenseId; + bool _supportsNonTouchscreen; + + bool _isCreativeMode; + //int _respawnPlayerTicks; + Player* _pendingRemovePlayer; // @attn @todo @fix: remove this shait and fix the respawn behaviour + + PerfRenderer* _perfRenderer; + CommandServer* _commandServer; +}; + +#endif /*NET_MINECRAFT_CLIENT__Minecraft_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E38B99C2033D71488B5683D3A77E2CFC/131BF20CD6931E71B835A9779402F884 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E38B99C2033D71488B5683D3A77E2CFC/131BF20CD6931E71B835A9779402F884 new file mode 100644 index 0000000..17e15f0 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E38B99C2033D71488B5683D3A77E2CFC/131BF20CD6931E71B835A9779402F884 @@ -0,0 +1,269 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 to avoid off-by-one in GUI mapping + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} + +// Forward typed character directly to focused textbox to avoid duplicate definitions +void Screen::keyboardTextEvent() +{ + char c = Keyboard::getChar(); + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (c >=32) tb->text.push_back(c); + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Handle backspace for focused textbox + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + if (!tb->text.empty()) tb->text.erase(tb->text.size() -1,1); + } + if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height; // removed -1 +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E38B99C2033D71488B5683D3A77E2CFC/1CC65E0062271217494E8E6A4C0A58CE b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E38B99C2033D71488B5683D3A77E2CFC/1CC65E0062271217494E8E6A4C0A58CE new file mode 100644 index 0000000..bfd810c --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E38B99C2033D71488B5683D3A77E2CFC/1CC65E0062271217494E8E6A4C0A58CE @@ -0,0 +1,34 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ +#define NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ + +//package net.minecraft.client.gui; + +#include +#include "../GuiComponent.h" +#include "../../Options.h" + +class Font; +class Minecraft; + +class TextBox: public GuiComponent +{ +public: + TextBox(int id, const std::string& msg); + TextBox(int id, int x, int y, const std::string& msg); + TextBox(int id, int x, int y, int w, int h, const std::string& msg); + + virtual void setFocus(Minecraft* minecraft); + virtual bool loseFocus(Minecraft* minecraft); + + virtual void render(Minecraft* minecraft, int xm, int ym); + +public: + int w, h; + int x, y; + + std::string text; + int id; + bool focused; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E38B99C2033D71488B5683D3A77E2CFC/1D11F3CE27B0B595836AB483CC9A0B43 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E38B99C2033D71488B5683D3A77E2CFC/1D11F3CE27B0B595836AB483CC9A0B43 new file mode 100644 index 0000000..4adf7ad --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E38B99C2033D71488B5683D3A77E2CFC/1D11F3CE27B0B595836AB483CC9A0B43 @@ -0,0 +1,77 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(id), w(0), h(0), x(0), y(0), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg), focused(false) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->showKeyboard(); + focused = true; + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->hideKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + // Slightly translucent dark background + fill(x, y, x + w, y + h,0x80000000); + // Border - use different colors when focused + if (focused) { + fill(x, y, x + w, y +1,0xffa0c0ff); + fill(x, y + h -1, x + w, y + h,0xff4060a0); + fill(x, y, x +1, y + h,0xffa0c0ff); + fill(x + w -1, y, x + w, y + h,0xff4060a0); + } else { + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + } + + // Draw text. If textbox contains the placeholder (no focus and text equals initial msg), draw dim color + int color =0xe0e0e0; + // If not focused and text is empty or equals default placeholder, draw dimmed + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + // measure available width approximated by character count + int calc = (w -8) /6; // approx6 px per char + int maxChars =1; + if (calc > maxChars) maxChars = calc; + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E38B99C2033D71488B5683D3A77E2CFC/430CC357A15D4BE1A70387A7C3462A3C b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E38B99C2033D71488B5683D3A77E2CFC/430CC357A15D4BE1A70387A7C3462A3C new file mode 100644 index 0000000..17e15f0 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E38B99C2033D71488B5683D3A77E2CFC/430CC357A15D4BE1A70387A7C3462A3C @@ -0,0 +1,269 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 to avoid off-by-one in GUI mapping + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} + +// Forward typed character directly to focused textbox to avoid duplicate definitions +void Screen::keyboardTextEvent() +{ + char c = Keyboard::getChar(); + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (c >=32) tb->text.push_back(c); + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Handle backspace for focused textbox + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + if (!tb->text.empty()) tb->text.erase(tb->text.size() -1,1); + } + if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height; // removed -1 +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E38B99C2033D71488B5683D3A77E2CFC/572513C3D8D309B3634C045C3C8FAC54 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E38B99C2033D71488B5683D3A77E2CFC/572513C3D8D309B3634C045C3C8FAC54 new file mode 100644 index 0000000..872695a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E38B99C2033D71488B5683D3A77E2CFC/572513C3D8D309B3634C045C3C8FAC54 @@ -0,0 +1,137 @@ +#ifndef KEYBOARD_H__ +#define KEYBOARD_H__ + +#include + +/** A keyboard action; key-down or key-up */ +class KeyboardAction +{ +public: + static const int KEYUP = 0; + static const int KEYDOWN = 1; + + KeyboardAction(unsigned char keyCode, int state) { + this->key = keyCode; + this->state = state; + } + + int state; + unsigned char key; +}; + +/* Iterators */ +typedef std::vector KeyboardActionVec; +typedef KeyboardActionVec::iterator KeyboardActionIt; +typedef KeyboardActionVec::const_iterator KeyboardActionCIt; + +/** A static keyboard class, written to resemble the one in lwjgl somewhat */ +class Keyboard +{ +public: + static const int KEY_A = 65; + static const int KEY_B = 66; + static const int KEY_C = 67; + static const int KEY_D = 68; + static const int KEY_E = 69; + static const int KEY_F = 70; + static const int KEY_G = 71; + static const int KEY_H = 72; + static const int KEY_I = 73; + static const int KEY_J = 74; + static const int KEY_K = 75; + static const int KEY_L = 76; + static const int KEY_M = 77; + static const int KEY_N = 78; + static const int KEY_O = 79; + static const int KEY_P = 80; + static const int KEY_Q = 81; + static const int KEY_R = 82; + static const int KEY_S = 83; + static const int KEY_T = 84; + static const int KEY_U = 85; + static const int KEY_V = 86; + static const int KEY_W = 87; + static const int KEY_X = 88; + static const int KEY_Y = 89; + static const int KEY_Z = 90; + + static const int KEY_BACKSPACE = 8; + static const int KEY_RETURN = 13; + + static const int KEY_F1 = 112; + static const int KEY_F2 = 113; + static const int KEY_F3 = 114; + static const int KEY_F4 = 115; + static const int KEY_F5 = 116; + static const int KEY_F6 = 117; + static const int KEY_F7 = 118; + static const int KEY_F8 = 119; + static const int KEY_F9 = 120; + static const int KEY_F10 = 121; + static const int KEY_F11 = 122; + static const int KEY_F12 = 123; + + static const int KEY_ESCAPE = 27; + static const int KEY_SPACE = 32; + static const int KEY_LSHIFT = 10; + + static bool isKeyDown(int keyCode) { + return _states[keyCode] == KeyboardAction::KEYDOWN; + } + + static void reset() { + _inputs.clear(); + _inputText.clear(); + _index = -1; + _textIndex = -1; + } + + static void feed(unsigned char keyCode, int state) { + _inputs.push_back(KeyboardAction(keyCode, state)); + + _states[keyCode] = state; + } + static void feedText(char character) { + _inputText.push_back(character); + } + + static bool next() { + if (_index + 1 >= (int)_inputs.size()) + return false; + + ++_index; + return true; + } + + static bool nextTextChar() { + if(_textIndex + 1 >= (int)_inputText.size()) + return false; + ++_textIndex; + return true; + } + + static void rewind() { + _index = -1; + _textIndex = -1; + } + + static int getEventKey() { + return _inputs[_index].key; + } + + static int getEventKeyState() { + return _inputs[_index].state; + } + static char getChar() { + return _inputText[_textIndex]; + } +private: + static int _index; + static int _textIndex; + static int _states[256]; + static std::vector _inputs; + static std::vector _inputText; + static bool _inited; +}; + +#endif//KEYBOARD_H__ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E38B99C2033D71488B5683D3A77E2CFC/83105CECE6AA00603D9DA1057156A4A0 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E38B99C2033D71488B5683D3A77E2CFC/83105CECE6AA00603D9DA1057156A4A0 new file mode 100644 index 0000000..55155fc --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E38B99C2033D71488B5683D3A77E2CFC/83105CECE6AA00603D9DA1057156A4A0 @@ -0,0 +1,146 @@ +#include "TextEditScreen.h" +#include "../../../world/level/tile/entity/SignTileEntity.h" +#include "../../../AppPlatform.h" +#include "../../Minecraft.h" +#include "../../renderer/tileentity/TileEntityRenderDispatcher.h" +#include "../../renderer/Tesselator.h" +#include "../../renderer/Textures.h" +#include "../../renderer/GameRenderer.h" +#include "../components/Button.h" +#include "../../../network/Packet.h" +#include "../../../network/RakNetInstance.h" +TextEditScreen::TextEditScreen( SignTileEntity* signEntity ) + : sign(signEntity), isShowingKeyboard(false), frame(0), line(0), btnClose(1, "") { + +} +TextEditScreen::~TextEditScreen() { + +} +void TextEditScreen::init() { + super::init(); + minecraft->platform()->showKeyboard(); + isShowingKeyboard = true; + ImageDef def; + def.name = "gui/spritesheet.png"; + def.x = 0; + def.y = 1; + def.width = def.height = 18; + def.setSrc(IntRectangle(60, 0, 18, 18)); + btnClose.setImageDef(def, true); + btnClose.scaleWhenPressed = false; + buttons.push_back(&btnClose); +} + +void TextEditScreen::setupPositions() { + btnClose.width = btnClose.height = 19; + btnClose.x = width - btnClose.width; + btnClose.y = 0; +} + + +bool TextEditScreen::handleBackEvent( bool isDown ) { + sign->setChanged(); + Packet* signUpdatePacket = sign->getUpdatePacket(); + minecraft->raknetInstance->send(signUpdatePacket); + minecraft->platform()->hideKeyboard(); + minecraft->setScreen(NULL); + return true; +} + +void TextEditScreen::render( int xm, int ym, float a ) { + glDepthMask(GL_FALSE); + renderBackground(); + glPushMatrix(); + glDepthMask(GL_TRUE); + glDisable(GL_CULL_FACE); + glLoadIdentity(); + Tesselator& t = Tesselator::instance; + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrthof(0.0f, (float)minecraft->width, (float)minecraft->height, 0, -1, 1); + glMatrixMode(GL_MODELVIEW); + + minecraft->textures->loadAndBindTexture("item/sign.png"); + glColor4f2(1, 1, 1, 1); + + static float minUV[] = {0.03126f, 0.06249f}; + static float maxUV[] = {0.39063f, 0.4374f}; + float scale = ((minecraft->height / 2) / 32) * 0.9f; + + glTranslatef(minecraft->width / 2.0f, 5.0f, 0.0f); + glScalef2(scale,scale,1); + t.begin(GL_QUADS); + t.vertexUV(-32, 0, 0.0f,minUV[0],minUV[1]); + t.vertexUV(32, 0, 0.0f, maxUV[0], minUV[1]); + t.vertexUV(32, 0 + 32, 0.0f, maxUV[0], maxUV[1]); + t.vertexUV(-32, 0 + 32, 0.0f, minUV[0], maxUV[1]); + t.draw(); + + sign->selectedLine = line; + float textScale = 8.0f / 11.0f; + + glTranslatef(0, 2 ,0); + glScalef2(textScale, textScale, 1); + for(int i = 0; i < 4; ++i) { + //drawCenteredString(font, sign->messages[a], 32.0f, 10 * a, 0xFF000000); + std::string msg = sign->messages[i]; + if (i == sign->selectedLine && msg.length() < 14) { + std::string s = "> " + msg + " <"; + font->draw(s, -(float)font->width(s) / 2.0f, 10.0f * i, 0xFF000000, false); + } else { + font->draw(msg, -(float)font->width(msg) / 2.0f, 10.0f * i, 0xFF000000, false); + } + } + sign->selectedLine = -1; + //font->draw("Hej", minecraft->width / 2, 100, 0xFFFFFFFF, false); + + glPopMatrix(); + glEnable(GL_CULL_FACE); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + + //glEnable(GL_DEPTH_TEST); + super::render(xm, ym, a); +} + +void TextEditScreen::lostFocus() { + +} + +void TextEditScreen::tick() { + frame++; +} + +void TextEditScreen::keyPressed( int eventKey ) { + LOGW("Key pressed! [%d]", eventKey); + if(eventKey == Keyboard::KEY_BACKSPACE) { + if(sign->messages[line].length() > 0) { + sign->messages[line].erase(sign->messages[line].size() - 1, 1); + } else { + line--; + if(line < 0) { + line = 3; + } + } + } else if(eventKey == Keyboard::KEY_RETURN) { + line = (line + 1) % 4; + } else { + super::keyPressed(eventKey); + } +} + +void TextEditScreen::keyboardNewChar( char inputChar ) { + std::string fullstring = sign->messages[line] + inputChar; + if(fullstring.length() < 16) { + sign->messages[line] = fullstring; + //LOGW("Line text updated: %s\n", fullstring.c_str()); + } +} + +void TextEditScreen::buttonClicked( Button* button ) { + if(button == &btnClose) + handleBackEvent(true); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E38B99C2033D71488B5683D3A77E2CFC/E19DC915D7B7F4D40A50F260C758DAD9 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E38B99C2033D71488B5683D3A77E2CFC/E19DC915D7B7F4D40A50F260C758DAD9 new file mode 100644 index 0000000..c45276d --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E38B99C2033D71488B5683D3A77E2CFC/E19DC915D7B7F4D40A50F260C758DAD9 @@ -0,0 +1,80 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI__Screen_H__ +#define NET_MINECRAFT_CLIENT_GUI__Screen_H__ + +//package net.minecraft.client.gui; + +#include +#include "GuiComponent.h" + +class Font; +class Minecraft; +class Button; +class TextBox; +struct IntRectangle; + +class Screen: public GuiComponent +{ +public: + Screen(); + + virtual void render(int xm, int ym, float a); + + void init(Minecraft* minecraft, int width, int height); + virtual void init(); + + void setSize(int width, int height); + virtual void setupPositions() {}; + + virtual void updateEvents(); + virtual void mouseEvent(); + virtual void keyboardEvent(); + virtual void keyboardTextEvent(); + virtual bool handleBackEvent(bool isDown); + + virtual void tick() {} + + virtual void removed() {} + + virtual void renderBackground(); + virtual void renderBackground(int vo); + virtual void renderDirtBackground(int vo); + // query + virtual bool renderGameBehind(); + virtual bool hasClippingArea(IntRectangle& out); + + virtual bool isPauseScreen(); + virtual bool isErrorScreen(); + virtual bool isInGameScreen(); + virtual bool closeOnPlayerHurt(); + + virtual void confirmResult(bool result, int id) {} + virtual void lostFocus(); + virtual void toGUICoordinate(int& x, int& y); +protected: + void updateTabButtonSelection(); + + virtual void buttonClicked(Button* button) {} + virtual void mouseClicked(int x, int y, int buttonNum); + virtual void mouseReleased(int x, int y, int buttonNum); + + virtual void keyPressed(int eventKey); + virtual void keyboardNewChar(char inputChar); +public: + int width; + int height; + bool passEvents; + //GuiParticles* particles; +protected: + Minecraft* minecraft; + std::vector buttons; + std::vector textBoxes; + + std::vector tabButtons; + int tabButtonIndex; + + Font* font; +private: + Button* clickedButton; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI__Screen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E38B99C2033D71488B5683D3A77E2CFC/E8D273D0759B6A800486805D62071B57 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E38B99C2033D71488B5683D3A77E2CFC/E8D273D0759B6A800486805D62071B57 new file mode 100644 index 0000000..dec4b79 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E38B99C2033D71488B5683D3A77E2CFC/E8D273D0759B6A800486805D62071B57 @@ -0,0 +1,294 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 to avoid off-by-one in GUI mapping + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} + +// Forward typed character directly to focused textbox to avoid duplicate definitions +void Screen::keyboardTextEvent() +{ + char c = Keyboard::getChar(); + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (c >=32) tb->text.push_back(c); + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Handle backspace for focused textbox + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + if (!tb->text.empty()) tb->text.erase(tb->text.size() -1,1); + } + if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height; // removed -1 +} + +// Default implementation for character input (virtual) +void Screen::keyboardNewChar(char inputChar) { + // default: forward to focused textbox is handled in keyboardTextEvent; keep empty here + (void)inputChar; +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E8E491F121B27A43910C8F1870AB7D24/0E1E245EA16F1FAA685C5686B18BDD08 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E8E491F121B27A43910C8F1870AB7D24/0E1E245EA16F1FAA685C5686B18BDD08 new file mode 100644 index 0000000..a7cb233 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E8E491F121B27A43910C8F1870AB7D24/0E1E245EA16F1FAA685C5686B18BDD08 @@ -0,0 +1,18 @@ +#ifndef NET_MINECRAFT_CLIENT_NETWORKING_HELPERS_H +#define NET_MINECRAFT_CLIENT_NETWORKING_HELPERS_H + +#include +#include "Minecraft.h" +#include "../network/ClientSideNetworkHandler.h" + +// Starts a connection to host:port. Returns true if the underlying connect call was started. +inline bool startConnect(Minecraft* mc, const std::string& host, int port) { + if (mc->netCallback) { + delete mc->netCallback; + mc->netCallback = nullptr; + } + mc->netCallback = new ClientSideNetworkHandler(mc, mc->raknetInstance); + return mc->raknetInstance->connect(host.c_str(), port); +} + +#endif // NET_MINECRAFT_CLIENT_NETWORKING_HELPERS_H diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E8E491F121B27A43910C8F1870AB7D24/19BB34AF68B3CBC1381C7F597AD544E0 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E8E491F121B27A43910C8F1870AB7D24/19BB34AF68B3CBC1381C7F597AD544E0 new file mode 100644 index 0000000..a7cb233 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E8E491F121B27A43910C8F1870AB7D24/19BB34AF68B3CBC1381C7F597AD544E0 @@ -0,0 +1,18 @@ +#ifndef NET_MINECRAFT_CLIENT_NETWORKING_HELPERS_H +#define NET_MINECRAFT_CLIENT_NETWORKING_HELPERS_H + +#include +#include "Minecraft.h" +#include "../network/ClientSideNetworkHandler.h" + +// Starts a connection to host:port. Returns true if the underlying connect call was started. +inline bool startConnect(Minecraft* mc, const std::string& host, int port) { + if (mc->netCallback) { + delete mc->netCallback; + mc->netCallback = nullptr; + } + mc->netCallback = new ClientSideNetworkHandler(mc, mc->raknetInstance); + return mc->raknetInstance->connect(host.c_str(), port); +} + +#endif // NET_MINECRAFT_CLIENT_NETWORKING_HELPERS_H diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E8E491F121B27A43910C8F1870AB7D24/1CC65E0062271217494E8E6A4C0A58CE b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E8E491F121B27A43910C8F1870AB7D24/1CC65E0062271217494E8E6A4C0A58CE new file mode 100644 index 0000000..bfd810c --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E8E491F121B27A43910C8F1870AB7D24/1CC65E0062271217494E8E6A4C0A58CE @@ -0,0 +1,34 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ +#define NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ + +//package net.minecraft.client.gui; + +#include +#include "../GuiComponent.h" +#include "../../Options.h" + +class Font; +class Minecraft; + +class TextBox: public GuiComponent +{ +public: + TextBox(int id, const std::string& msg); + TextBox(int id, int x, int y, const std::string& msg); + TextBox(int id, int x, int y, int w, int h, const std::string& msg); + + virtual void setFocus(Minecraft* minecraft); + virtual bool loseFocus(Minecraft* minecraft); + + virtual void render(Minecraft* minecraft, int xm, int ym); + +public: + int w, h; + int x, y; + + std::string text; + int id; + bool focused; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E8E491F121B27A43910C8F1870AB7D24/1D11F3CE27B0B595836AB483CC9A0B43 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E8E491F121B27A43910C8F1870AB7D24/1D11F3CE27B0B595836AB483CC9A0B43 new file mode 100644 index 0000000..c8328de --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E8E491F121B27A43910C8F1870AB7D24/1D11F3CE27B0B595836AB483CC9A0B43 @@ -0,0 +1,70 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(0), w(0), h(0), x(0), y(0), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + minecraft->platform()->showKeyboard(); + focused = true; + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + minecraft->platform()->showKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + // Slightly translucent dark background + fill(x, y, x + w, y + h,0x80000000); + // Border + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + + // Draw text. If textbox contains the placeholder (no focus and text equals initial msg), draw dim color + int color =0xe0e0e0; + // If not focused and text is empty or equals default placeholder, draw dimmed + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + // measure available width approximated by character count + int calc = (w -8) /6; // approx6 px per char + int maxChars =1; + if (calc > maxChars) maxChars = calc; + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E8E491F121B27A43910C8F1870AB7D24/430CC357A15D4BE1A70387A7C3462A3C b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E8E491F121B27A43910C8F1870AB7D24/430CC357A15D4BE1A70387A7C3462A3C new file mode 100644 index 0000000..92a367b --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E8E491F121B27A43910C8F1870AB7D24/430CC357A15D4BE1A70387A7C3462A3C @@ -0,0 +1,258 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i = 0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0, 0, width, height, 0xc0101010, 0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1, 1, 1, 1); + float s = 32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height, 0, 0, height / s + fvo); + t.vertexUV((float)width, (float)height, 0, width / s, (float)height / s + fvo); + t.vertexUV((float)width, 0, 0, (float)width / s, 0 + fvo); + t.vertexUV(0, 0, 0, 0, 0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex = 0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount - 1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i = 0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; +/* +#if !defined(ANDROID) && !defined(__APPLE__) //if (!minecraft->isTouchscreen()) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); +#endif } +*/ + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + +#if 1 +//#if defined(ANDROID) || defined(__APPLE__) //if (minecraft->isTouchscreen()) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click", 1, 1); + clickedButton->released(x, y); + } + } +# else // } else { + clickedButton->released(x, y); +#endif // } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height - 1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E8E491F121B27A43910C8F1870AB7D24/572513C3D8D309B3634C045C3C8FAC54 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E8E491F121B27A43910C8F1870AB7D24/572513C3D8D309B3634C045C3C8FAC54 new file mode 100644 index 0000000..872695a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E8E491F121B27A43910C8F1870AB7D24/572513C3D8D309B3634C045C3C8FAC54 @@ -0,0 +1,137 @@ +#ifndef KEYBOARD_H__ +#define KEYBOARD_H__ + +#include + +/** A keyboard action; key-down or key-up */ +class KeyboardAction +{ +public: + static const int KEYUP = 0; + static const int KEYDOWN = 1; + + KeyboardAction(unsigned char keyCode, int state) { + this->key = keyCode; + this->state = state; + } + + int state; + unsigned char key; +}; + +/* Iterators */ +typedef std::vector KeyboardActionVec; +typedef KeyboardActionVec::iterator KeyboardActionIt; +typedef KeyboardActionVec::const_iterator KeyboardActionCIt; + +/** A static keyboard class, written to resemble the one in lwjgl somewhat */ +class Keyboard +{ +public: + static const int KEY_A = 65; + static const int KEY_B = 66; + static const int KEY_C = 67; + static const int KEY_D = 68; + static const int KEY_E = 69; + static const int KEY_F = 70; + static const int KEY_G = 71; + static const int KEY_H = 72; + static const int KEY_I = 73; + static const int KEY_J = 74; + static const int KEY_K = 75; + static const int KEY_L = 76; + static const int KEY_M = 77; + static const int KEY_N = 78; + static const int KEY_O = 79; + static const int KEY_P = 80; + static const int KEY_Q = 81; + static const int KEY_R = 82; + static const int KEY_S = 83; + static const int KEY_T = 84; + static const int KEY_U = 85; + static const int KEY_V = 86; + static const int KEY_W = 87; + static const int KEY_X = 88; + static const int KEY_Y = 89; + static const int KEY_Z = 90; + + static const int KEY_BACKSPACE = 8; + static const int KEY_RETURN = 13; + + static const int KEY_F1 = 112; + static const int KEY_F2 = 113; + static const int KEY_F3 = 114; + static const int KEY_F4 = 115; + static const int KEY_F5 = 116; + static const int KEY_F6 = 117; + static const int KEY_F7 = 118; + static const int KEY_F8 = 119; + static const int KEY_F9 = 120; + static const int KEY_F10 = 121; + static const int KEY_F11 = 122; + static const int KEY_F12 = 123; + + static const int KEY_ESCAPE = 27; + static const int KEY_SPACE = 32; + static const int KEY_LSHIFT = 10; + + static bool isKeyDown(int keyCode) { + return _states[keyCode] == KeyboardAction::KEYDOWN; + } + + static void reset() { + _inputs.clear(); + _inputText.clear(); + _index = -1; + _textIndex = -1; + } + + static void feed(unsigned char keyCode, int state) { + _inputs.push_back(KeyboardAction(keyCode, state)); + + _states[keyCode] = state; + } + static void feedText(char character) { + _inputText.push_back(character); + } + + static bool next() { + if (_index + 1 >= (int)_inputs.size()) + return false; + + ++_index; + return true; + } + + static bool nextTextChar() { + if(_textIndex + 1 >= (int)_inputText.size()) + return false; + ++_textIndex; + return true; + } + + static void rewind() { + _index = -1; + _textIndex = -1; + } + + static int getEventKey() { + return _inputs[_index].key; + } + + static int getEventKeyState() { + return _inputs[_index].state; + } + static char getChar() { + return _inputText[_textIndex]; + } +private: + static int _index; + static int _textIndex; + static int _states[256]; + static std::vector _inputs; + static std::vector _inputText; + static bool _inited; +}; + +#endif//KEYBOARD_H__ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E8E491F121B27A43910C8F1870AB7D24/83105CECE6AA00603D9DA1057156A4A0 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E8E491F121B27A43910C8F1870AB7D24/83105CECE6AA00603D9DA1057156A4A0 new file mode 100644 index 0000000..55155fc --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E8E491F121B27A43910C8F1870AB7D24/83105CECE6AA00603D9DA1057156A4A0 @@ -0,0 +1,146 @@ +#include "TextEditScreen.h" +#include "../../../world/level/tile/entity/SignTileEntity.h" +#include "../../../AppPlatform.h" +#include "../../Minecraft.h" +#include "../../renderer/tileentity/TileEntityRenderDispatcher.h" +#include "../../renderer/Tesselator.h" +#include "../../renderer/Textures.h" +#include "../../renderer/GameRenderer.h" +#include "../components/Button.h" +#include "../../../network/Packet.h" +#include "../../../network/RakNetInstance.h" +TextEditScreen::TextEditScreen( SignTileEntity* signEntity ) + : sign(signEntity), isShowingKeyboard(false), frame(0), line(0), btnClose(1, "") { + +} +TextEditScreen::~TextEditScreen() { + +} +void TextEditScreen::init() { + super::init(); + minecraft->platform()->showKeyboard(); + isShowingKeyboard = true; + ImageDef def; + def.name = "gui/spritesheet.png"; + def.x = 0; + def.y = 1; + def.width = def.height = 18; + def.setSrc(IntRectangle(60, 0, 18, 18)); + btnClose.setImageDef(def, true); + btnClose.scaleWhenPressed = false; + buttons.push_back(&btnClose); +} + +void TextEditScreen::setupPositions() { + btnClose.width = btnClose.height = 19; + btnClose.x = width - btnClose.width; + btnClose.y = 0; +} + + +bool TextEditScreen::handleBackEvent( bool isDown ) { + sign->setChanged(); + Packet* signUpdatePacket = sign->getUpdatePacket(); + minecraft->raknetInstance->send(signUpdatePacket); + minecraft->platform()->hideKeyboard(); + minecraft->setScreen(NULL); + return true; +} + +void TextEditScreen::render( int xm, int ym, float a ) { + glDepthMask(GL_FALSE); + renderBackground(); + glPushMatrix(); + glDepthMask(GL_TRUE); + glDisable(GL_CULL_FACE); + glLoadIdentity(); + Tesselator& t = Tesselator::instance; + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrthof(0.0f, (float)minecraft->width, (float)minecraft->height, 0, -1, 1); + glMatrixMode(GL_MODELVIEW); + + minecraft->textures->loadAndBindTexture("item/sign.png"); + glColor4f2(1, 1, 1, 1); + + static float minUV[] = {0.03126f, 0.06249f}; + static float maxUV[] = {0.39063f, 0.4374f}; + float scale = ((minecraft->height / 2) / 32) * 0.9f; + + glTranslatef(minecraft->width / 2.0f, 5.0f, 0.0f); + glScalef2(scale,scale,1); + t.begin(GL_QUADS); + t.vertexUV(-32, 0, 0.0f,minUV[0],minUV[1]); + t.vertexUV(32, 0, 0.0f, maxUV[0], minUV[1]); + t.vertexUV(32, 0 + 32, 0.0f, maxUV[0], maxUV[1]); + t.vertexUV(-32, 0 + 32, 0.0f, minUV[0], maxUV[1]); + t.draw(); + + sign->selectedLine = line; + float textScale = 8.0f / 11.0f; + + glTranslatef(0, 2 ,0); + glScalef2(textScale, textScale, 1); + for(int i = 0; i < 4; ++i) { + //drawCenteredString(font, sign->messages[a], 32.0f, 10 * a, 0xFF000000); + std::string msg = sign->messages[i]; + if (i == sign->selectedLine && msg.length() < 14) { + std::string s = "> " + msg + " <"; + font->draw(s, -(float)font->width(s) / 2.0f, 10.0f * i, 0xFF000000, false); + } else { + font->draw(msg, -(float)font->width(msg) / 2.0f, 10.0f * i, 0xFF000000, false); + } + } + sign->selectedLine = -1; + //font->draw("Hej", minecraft->width / 2, 100, 0xFFFFFFFF, false); + + glPopMatrix(); + glEnable(GL_CULL_FACE); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + + //glEnable(GL_DEPTH_TEST); + super::render(xm, ym, a); +} + +void TextEditScreen::lostFocus() { + +} + +void TextEditScreen::tick() { + frame++; +} + +void TextEditScreen::keyPressed( int eventKey ) { + LOGW("Key pressed! [%d]", eventKey); + if(eventKey == Keyboard::KEY_BACKSPACE) { + if(sign->messages[line].length() > 0) { + sign->messages[line].erase(sign->messages[line].size() - 1, 1); + } else { + line--; + if(line < 0) { + line = 3; + } + } + } else if(eventKey == Keyboard::KEY_RETURN) { + line = (line + 1) % 4; + } else { + super::keyPressed(eventKey); + } +} + +void TextEditScreen::keyboardNewChar( char inputChar ) { + std::string fullstring = sign->messages[line] + inputChar; + if(fullstring.length() < 16) { + sign->messages[line] = fullstring; + //LOGW("Line text updated: %s\n", fullstring.c_str()); + } +} + +void TextEditScreen::buttonClicked( Button* button ) { + if(button == &btnClose) + handleBackEvent(true); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E8E491F121B27A43910C8F1870AB7D24/BD7DC03F273098C9AC991AF444C1EC57 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E8E491F121B27A43910C8F1870AB7D24/BD7DC03F273098C9AC991AF444C1EC57 new file mode 100644 index 0000000..0382370 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E8E491F121B27A43910C8F1870AB7D24/BD7DC03F273098C9AC991AF444C1EC57 @@ -0,0 +1,12 @@ +#ifndef NET_MINECRAFT_CLIENT_NETWORKING_HELPERS_H +#define NET_MINECRAFT_CLIENT_NETWORKING_HELPERS_H + +#include +#include "Minecraft.h" + +// Starts a connection to host:port by calling Minecraft wrapper. +inline bool startConnect(Minecraft* mc, const std::string& host, int port) { + return mc->connectToHost(host, port); +} + +#endif // NET_MINECRAFT_CLIENT_NETWORKING_HELPERS_H diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E8E491F121B27A43910C8F1870AB7D24/E19DC915D7B7F4D40A50F260C758DAD9 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E8E491F121B27A43910C8F1870AB7D24/E19DC915D7B7F4D40A50F260C758DAD9 new file mode 100644 index 0000000..8b4d6da --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/E8E491F121B27A43910C8F1870AB7D24/E19DC915D7B7F4D40A50F260C758DAD9 @@ -0,0 +1,80 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI__Screen_H__ +#define NET_MINECRAFT_CLIENT_GUI__Screen_H__ + +//package net.minecraft.client.gui; + +#include +#include "GuiComponent.h" + +class Font; +class Minecraft; +class Button; +class TextBox; +struct IntRectangle; + +class Screen: public GuiComponent +{ +public: + Screen(); + + virtual void render(int xm, int ym, float a); + + void init(Minecraft* minecraft, int width, int height); + virtual void init(); + + void setSize(int width, int height); + virtual void setupPositions() {}; + + virtual void updateEvents(); + virtual void mouseEvent(); + virtual void keyboardEvent(); + virtual void keyboardTextEvent(); + virtual bool handleBackEvent(bool isDown); + + virtual void tick() {} + + virtual void removed() {} + + virtual void renderBackground(); + virtual void renderBackground(int vo); + virtual void renderDirtBackground(int vo); + // query + virtual bool renderGameBehind(); + virtual bool hasClippingArea(IntRectangle& out); + + virtual bool isPauseScreen(); + virtual bool isErrorScreen(); + virtual bool isInGameScreen(); + virtual bool closeOnPlayerHurt(); + + virtual void confirmResult(bool result, int id) {} + virtual void lostFocus(); + virtual void toGUICoordinate(int& x, int& y); +protected: + void updateTabButtonSelection(); + + virtual void buttonClicked(Button* button) {} + virtual void mouseClicked(int x, int y, int buttonNum); + virtual void mouseReleased(int x, int y, int buttonNum); + + virtual void keyPressed(int eventKey); + virtual void keyboardNewChar(char inputChar) {} +public: + int width; + int height; + bool passEvents; + //GuiParticles* particles; +protected: + Minecraft* minecraft; + std::vector buttons; + std::vector textBoxes; + + std::vector tabButtons; + int tabButtonIndex; + + Font* font; +private: + Button* clickedButton; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI__Screen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/02B2083C986C9DA189F62859360ECB1E b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/02B2083C986C9DA189F62859360ECB1E new file mode 100644 index 0000000..801252c --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/02B2083C986C9DA189F62859360ECB1E @@ -0,0 +1,293 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} + +void Screen::keyboardNewChar(char inputChar) { + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (inputChar >=32) tb->text.push_back(inputChar); + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Handle backspace for focused textbox + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + if (!tb->text.empty()) tb->text.erase(tb->text.size() -1,1); + } + // Enter/Return will defocus the textbox + if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height -1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/02D65364837E65E648694C5F06A95336 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/02D65364837E65E648694C5F06A95336 new file mode 100644 index 0000000..8b4d6da --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/02D65364837E65E648694C5F06A95336 @@ -0,0 +1,80 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI__Screen_H__ +#define NET_MINECRAFT_CLIENT_GUI__Screen_H__ + +//package net.minecraft.client.gui; + +#include +#include "GuiComponent.h" + +class Font; +class Minecraft; +class Button; +class TextBox; +struct IntRectangle; + +class Screen: public GuiComponent +{ +public: + Screen(); + + virtual void render(int xm, int ym, float a); + + void init(Minecraft* minecraft, int width, int height); + virtual void init(); + + void setSize(int width, int height); + virtual void setupPositions() {}; + + virtual void updateEvents(); + virtual void mouseEvent(); + virtual void keyboardEvent(); + virtual void keyboardTextEvent(); + virtual bool handleBackEvent(bool isDown); + + virtual void tick() {} + + virtual void removed() {} + + virtual void renderBackground(); + virtual void renderBackground(int vo); + virtual void renderDirtBackground(int vo); + // query + virtual bool renderGameBehind(); + virtual bool hasClippingArea(IntRectangle& out); + + virtual bool isPauseScreen(); + virtual bool isErrorScreen(); + virtual bool isInGameScreen(); + virtual bool closeOnPlayerHurt(); + + virtual void confirmResult(bool result, int id) {} + virtual void lostFocus(); + virtual void toGUICoordinate(int& x, int& y); +protected: + void updateTabButtonSelection(); + + virtual void buttonClicked(Button* button) {} + virtual void mouseClicked(int x, int y, int buttonNum); + virtual void mouseReleased(int x, int y, int buttonNum); + + virtual void keyPressed(int eventKey); + virtual void keyboardNewChar(char inputChar) {} +public: + int width; + int height; + bool passEvents; + //GuiParticles* particles; +protected: + Minecraft* minecraft; + std::vector buttons; + std::vector textBoxes; + + std::vector tabButtons; + int tabButtonIndex; + + Font* font; +private: + Button* clickedButton; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI__Screen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/0CC8589D353B3C228DAAA2FD3B3549D2 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/0CC8589D353B3C228DAAA2FD3B3549D2 new file mode 100644 index 0000000..6a190da --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/0CC8589D353B3C228DAAA2FD3B3549D2 @@ -0,0 +1,70 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(id), w(0), h(0), x(0), y(0), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg), focused(false) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->showKeyboard(); + focused = true; + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->hideKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + // Slightly translucent dark background + fill(x, y, x + w, y + h,0x80000000); + // Border + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + + // Draw text. If textbox contains the placeholder (no focus and text equals initial msg), draw dim color + int color =0xe0e0e0; + // If not focused and text is empty or equals default placeholder, draw dimmed + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + // measure available width approximated by character count + int calc = (w -8) /6; // approx6 px per char + int maxChars =1; + if (calc > maxChars) maxChars = calc; + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/1CC65E0062271217494E8E6A4C0A58CE b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/1CC65E0062271217494E8E6A4C0A58CE new file mode 100644 index 0000000..bfd810c --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/1CC65E0062271217494E8E6A4C0A58CE @@ -0,0 +1,34 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ +#define NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__ + +//package net.minecraft.client.gui; + +#include +#include "../GuiComponent.h" +#include "../../Options.h" + +class Font; +class Minecraft; + +class TextBox: public GuiComponent +{ +public: + TextBox(int id, const std::string& msg); + TextBox(int id, int x, int y, const std::string& msg); + TextBox(int id, int x, int y, int w, int h, const std::string& msg); + + virtual void setFocus(Minecraft* minecraft); + virtual bool loseFocus(Minecraft* minecraft); + + virtual void render(Minecraft* minecraft, int xm, int ym); + +public: + int w, h; + int x, y; + + std::string text; + int id; + bool focused; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI_COMPONENTS__TextBox_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/1D11F3CE27B0B595836AB483CC9A0B43 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/1D11F3CE27B0B595836AB483CC9A0B43 new file mode 100644 index 0000000..c8328de --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/1D11F3CE27B0B595836AB483CC9A0B43 @@ -0,0 +1,70 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(0), w(0), h(0), x(0), y(0), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + minecraft->platform()->showKeyboard(); + focused = true; + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + minecraft->platform()->showKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + // Slightly translucent dark background + fill(x, y, x + w, y + h,0x80000000); + // Border + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + + // Draw text. If textbox contains the placeholder (no focus and text equals initial msg), draw dim color + int color =0xe0e0e0; + // If not focused and text is empty or equals default placeholder, draw dimmed + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + // measure available width approximated by character count + int calc = (w -8) /6; // approx6 px per char + int maxChars =1; + if (calc > maxChars) maxChars = calc; + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/25088AB10FBB1D62148EC1412B45081B b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/25088AB10FBB1D62148EC1412B45081B new file mode 100644 index 0000000..801252c --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/25088AB10FBB1D62148EC1412B45081B @@ -0,0 +1,293 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} + +void Screen::keyboardNewChar(char inputChar) { + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (inputChar >=32) tb->text.push_back(inputChar); + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Handle backspace for focused textbox + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + if (!tb->text.empty()) tb->text.erase(tb->text.size() -1,1); + } + // Enter/Return will defocus the textbox + if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height -1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/2CA9898CF91D3452B6F221157909A7D0 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/2CA9898CF91D3452B6F221157909A7D0 new file mode 100644 index 0000000..8b4d6da --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/2CA9898CF91D3452B6F221157909A7D0 @@ -0,0 +1,80 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI__Screen_H__ +#define NET_MINECRAFT_CLIENT_GUI__Screen_H__ + +//package net.minecraft.client.gui; + +#include +#include "GuiComponent.h" + +class Font; +class Minecraft; +class Button; +class TextBox; +struct IntRectangle; + +class Screen: public GuiComponent +{ +public: + Screen(); + + virtual void render(int xm, int ym, float a); + + void init(Minecraft* minecraft, int width, int height); + virtual void init(); + + void setSize(int width, int height); + virtual void setupPositions() {}; + + virtual void updateEvents(); + virtual void mouseEvent(); + virtual void keyboardEvent(); + virtual void keyboardTextEvent(); + virtual bool handleBackEvent(bool isDown); + + virtual void tick() {} + + virtual void removed() {} + + virtual void renderBackground(); + virtual void renderBackground(int vo); + virtual void renderDirtBackground(int vo); + // query + virtual bool renderGameBehind(); + virtual bool hasClippingArea(IntRectangle& out); + + virtual bool isPauseScreen(); + virtual bool isErrorScreen(); + virtual bool isInGameScreen(); + virtual bool closeOnPlayerHurt(); + + virtual void confirmResult(bool result, int id) {} + virtual void lostFocus(); + virtual void toGUICoordinate(int& x, int& y); +protected: + void updateTabButtonSelection(); + + virtual void buttonClicked(Button* button) {} + virtual void mouseClicked(int x, int y, int buttonNum); + virtual void mouseReleased(int x, int y, int buttonNum); + + virtual void keyPressed(int eventKey); + virtual void keyboardNewChar(char inputChar) {} +public: + int width; + int height; + bool passEvents; + //GuiParticles* particles; +protected: + Minecraft* minecraft; + std::vector buttons; + std::vector textBoxes; + + std::vector tabButtons; + int tabButtonIndex; + + Font* font; +private: + Button* clickedButton; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI__Screen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/2FFED0D498C007DE11782258978B9956 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/2FFED0D498C007DE11782258978B9956 new file mode 100644 index 0000000..8b4d6da --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/2FFED0D498C007DE11782258978B9956 @@ -0,0 +1,80 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI__Screen_H__ +#define NET_MINECRAFT_CLIENT_GUI__Screen_H__ + +//package net.minecraft.client.gui; + +#include +#include "GuiComponent.h" + +class Font; +class Minecraft; +class Button; +class TextBox; +struct IntRectangle; + +class Screen: public GuiComponent +{ +public: + Screen(); + + virtual void render(int xm, int ym, float a); + + void init(Minecraft* minecraft, int width, int height); + virtual void init(); + + void setSize(int width, int height); + virtual void setupPositions() {}; + + virtual void updateEvents(); + virtual void mouseEvent(); + virtual void keyboardEvent(); + virtual void keyboardTextEvent(); + virtual bool handleBackEvent(bool isDown); + + virtual void tick() {} + + virtual void removed() {} + + virtual void renderBackground(); + virtual void renderBackground(int vo); + virtual void renderDirtBackground(int vo); + // query + virtual bool renderGameBehind(); + virtual bool hasClippingArea(IntRectangle& out); + + virtual bool isPauseScreen(); + virtual bool isErrorScreen(); + virtual bool isInGameScreen(); + virtual bool closeOnPlayerHurt(); + + virtual void confirmResult(bool result, int id) {} + virtual void lostFocus(); + virtual void toGUICoordinate(int& x, int& y); +protected: + void updateTabButtonSelection(); + + virtual void buttonClicked(Button* button) {} + virtual void mouseClicked(int x, int y, int buttonNum); + virtual void mouseReleased(int x, int y, int buttonNum); + + virtual void keyPressed(int eventKey); + virtual void keyboardNewChar(char inputChar) {} +public: + int width; + int height; + bool passEvents; + //GuiParticles* particles; +protected: + Minecraft* minecraft; + std::vector buttons; + std::vector textBoxes; + + std::vector tabButtons; + int tabButtonIndex; + + Font* font; +private: + Button* clickedButton; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI__Screen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/317AFE5EB05D1E5833702C42191A01C2 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/317AFE5EB05D1E5833702C42191A01C2 new file mode 100644 index 0000000..bf8afbf --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/317AFE5EB05D1E5833702C42191A01C2 @@ -0,0 +1,304 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} + +// Forward typed character to focused textbox +void Screen::keyboardNewChar(char inputChar) { + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + // ignore non-printable + if (inputChar >=32) { + tb->text.push_back(inputChar); + } + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Handle backspace for focused textbox + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + if (!tb->text.empty()) tb->text.erase(tb->text.size() -1,1); + } + // Enter/Return will defocus the textbox + if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; +/* +#if !defined(ANDROID) && !defined(__APPLE__) //if (!minecraft->isTouchscreen()) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); +#endif } +*/ + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + +#if1 + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } +# else // } else { + clickedButton->released(x, y); +#endif // } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height -1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/31B81A05A6F23238F7CCA11A10B638BF b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/31B81A05A6F23238F7CCA11A10B638BF new file mode 100644 index 0000000..c8328de --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/31B81A05A6F23238F7CCA11A10B638BF @@ -0,0 +1,70 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(0), w(0), h(0), x(0), y(0), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + minecraft->platform()->showKeyboard(); + focused = true; + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + minecraft->platform()->showKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + // Slightly translucent dark background + fill(x, y, x + w, y + h,0x80000000); + // Border + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + + // Draw text. If textbox contains the placeholder (no focus and text equals initial msg), draw dim color + int color =0xe0e0e0; + // If not focused and text is empty or equals default placeholder, draw dimmed + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + // measure available width approximated by character count + int calc = (w -8) /6; // approx6 px per char + int maxChars =1; + if (calc > maxChars) maxChars = calc; + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/37DA8DAD97A119E2751892388E7759BB b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/37DA8DAD97A119E2751892388E7759BB new file mode 100644 index 0000000..bf8afbf --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/37DA8DAD97A119E2751892388E7759BB @@ -0,0 +1,304 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} + +// Forward typed character to focused textbox +void Screen::keyboardNewChar(char inputChar) { + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + // ignore non-printable + if (inputChar >=32) { + tb->text.push_back(inputChar); + } + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Handle backspace for focused textbox + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + if (!tb->text.empty()) tb->text.erase(tb->text.size() -1,1); + } + // Enter/Return will defocus the textbox + if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; +/* +#if !defined(ANDROID) && !defined(__APPLE__) //if (!minecraft->isTouchscreen()) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); +#endif } +*/ + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + +#if1 + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } +# else // } else { + clickedButton->released(x, y); +#endif // } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height -1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/3EF05EEAE1A5257AFCF29AF213EE79B7 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/3EF05EEAE1A5257AFCF29AF213EE79B7 new file mode 100644 index 0000000..4adf7ad --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/3EF05EEAE1A5257AFCF29AF213EE79B7 @@ -0,0 +1,77 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(id), w(0), h(0), x(0), y(0), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg), focused(false) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->showKeyboard(); + focused = true; + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->hideKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + // Slightly translucent dark background + fill(x, y, x + w, y + h,0x80000000); + // Border - use different colors when focused + if (focused) { + fill(x, y, x + w, y +1,0xffa0c0ff); + fill(x, y + h -1, x + w, y + h,0xff4060a0); + fill(x, y, x +1, y + h,0xffa0c0ff); + fill(x + w -1, y, x + w, y + h,0xff4060a0); + } else { + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + } + + // Draw text. If textbox contains the placeholder (no focus and text equals initial msg), draw dim color + int color =0xe0e0e0; + // If not focused and text is empty or equals default placeholder, draw dimmed + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + // measure available width approximated by character count + int calc = (w -8) /6; // approx6 px per char + int maxChars =1; + if (calc > maxChars) maxChars = calc; + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/430CC357A15D4BE1A70387A7C3462A3C b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/430CC357A15D4BE1A70387A7C3462A3C new file mode 100644 index 0000000..307acb0 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/430CC357A15D4BE1A70387A7C3462A3C @@ -0,0 +1,290 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Handle backspace for focused textbox + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + if (!tb->text.empty()) tb->text.erase(tb->text.size() -1,1); + } + // Enter/Return will defocus the textbox + if (eventKey == Keyboard::KEY_RETURN || eventKey == Keyboard::KEY_NUMPADENTER) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; +/* +#if !defined(ANDROID) && !defined(__APPLE__) //if (!minecraft->isTouchscreen()) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); +#endif } +*/ + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + +#if1 +//#if defined(ANDROID) || defined(__APPLE__) //if (minecraft->isTouchscreen()) { + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } +# else // } else { + clickedButton->released(x, y); +#endif // } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height -1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/475B090A46A6A9CA6FC67B5F071F91EB b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/475B090A46A6A9CA6FC67B5F071F91EB new file mode 100644 index 0000000..17e15f0 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/475B090A46A6A9CA6FC67B5F071F91EB @@ -0,0 +1,269 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 to avoid off-by-one in GUI mapping + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} + +// Forward typed character directly to focused textbox to avoid duplicate definitions +void Screen::keyboardTextEvent() +{ + char c = Keyboard::getChar(); + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (c >=32) tb->text.push_back(c); + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Handle backspace for focused textbox + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + if (!tb->text.empty()) tb->text.erase(tb->text.size() -1,1); + } + if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height; // removed -1 +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/4D275761648E0227FAE08997B77798A5 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/4D275761648E0227FAE08997B77798A5 new file mode 100644 index 0000000..2ad053a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/4D275761648E0227FAE08997B77798A5 @@ -0,0 +1,287 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Handle backspace for focused textbox + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + if (!tb->text.empty()) tb->text.erase(tb->text.size() -1,1); + } + // Enter/Return will defocus the textbox + if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height -1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/572513C3D8D309B3634C045C3C8FAC54 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/572513C3D8D309B3634C045C3C8FAC54 new file mode 100644 index 0000000..872695a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/572513C3D8D309B3634C045C3C8FAC54 @@ -0,0 +1,137 @@ +#ifndef KEYBOARD_H__ +#define KEYBOARD_H__ + +#include + +/** A keyboard action; key-down or key-up */ +class KeyboardAction +{ +public: + static const int KEYUP = 0; + static const int KEYDOWN = 1; + + KeyboardAction(unsigned char keyCode, int state) { + this->key = keyCode; + this->state = state; + } + + int state; + unsigned char key; +}; + +/* Iterators */ +typedef std::vector KeyboardActionVec; +typedef KeyboardActionVec::iterator KeyboardActionIt; +typedef KeyboardActionVec::const_iterator KeyboardActionCIt; + +/** A static keyboard class, written to resemble the one in lwjgl somewhat */ +class Keyboard +{ +public: + static const int KEY_A = 65; + static const int KEY_B = 66; + static const int KEY_C = 67; + static const int KEY_D = 68; + static const int KEY_E = 69; + static const int KEY_F = 70; + static const int KEY_G = 71; + static const int KEY_H = 72; + static const int KEY_I = 73; + static const int KEY_J = 74; + static const int KEY_K = 75; + static const int KEY_L = 76; + static const int KEY_M = 77; + static const int KEY_N = 78; + static const int KEY_O = 79; + static const int KEY_P = 80; + static const int KEY_Q = 81; + static const int KEY_R = 82; + static const int KEY_S = 83; + static const int KEY_T = 84; + static const int KEY_U = 85; + static const int KEY_V = 86; + static const int KEY_W = 87; + static const int KEY_X = 88; + static const int KEY_Y = 89; + static const int KEY_Z = 90; + + static const int KEY_BACKSPACE = 8; + static const int KEY_RETURN = 13; + + static const int KEY_F1 = 112; + static const int KEY_F2 = 113; + static const int KEY_F3 = 114; + static const int KEY_F4 = 115; + static const int KEY_F5 = 116; + static const int KEY_F6 = 117; + static const int KEY_F7 = 118; + static const int KEY_F8 = 119; + static const int KEY_F9 = 120; + static const int KEY_F10 = 121; + static const int KEY_F11 = 122; + static const int KEY_F12 = 123; + + static const int KEY_ESCAPE = 27; + static const int KEY_SPACE = 32; + static const int KEY_LSHIFT = 10; + + static bool isKeyDown(int keyCode) { + return _states[keyCode] == KeyboardAction::KEYDOWN; + } + + static void reset() { + _inputs.clear(); + _inputText.clear(); + _index = -1; + _textIndex = -1; + } + + static void feed(unsigned char keyCode, int state) { + _inputs.push_back(KeyboardAction(keyCode, state)); + + _states[keyCode] = state; + } + static void feedText(char character) { + _inputText.push_back(character); + } + + static bool next() { + if (_index + 1 >= (int)_inputs.size()) + return false; + + ++_index; + return true; + } + + static bool nextTextChar() { + if(_textIndex + 1 >= (int)_inputText.size()) + return false; + ++_textIndex; + return true; + } + + static void rewind() { + _index = -1; + _textIndex = -1; + } + + static int getEventKey() { + return _inputs[_index].key; + } + + static int getEventKeyState() { + return _inputs[_index].state; + } + static char getChar() { + return _inputText[_textIndex]; + } +private: + static int _index; + static int _textIndex; + static int _states[256]; + static std::vector _inputs; + static std::vector _inputText; + static bool _inited; +}; + +#endif//KEYBOARD_H__ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/5F7F892CC2284C3F68D3FDB0B164979E b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/5F7F892CC2284C3F68D3FDB0B164979E new file mode 100644 index 0000000..c45276d --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/5F7F892CC2284C3F68D3FDB0B164979E @@ -0,0 +1,80 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI__Screen_H__ +#define NET_MINECRAFT_CLIENT_GUI__Screen_H__ + +//package net.minecraft.client.gui; + +#include +#include "GuiComponent.h" + +class Font; +class Minecraft; +class Button; +class TextBox; +struct IntRectangle; + +class Screen: public GuiComponent +{ +public: + Screen(); + + virtual void render(int xm, int ym, float a); + + void init(Minecraft* minecraft, int width, int height); + virtual void init(); + + void setSize(int width, int height); + virtual void setupPositions() {}; + + virtual void updateEvents(); + virtual void mouseEvent(); + virtual void keyboardEvent(); + virtual void keyboardTextEvent(); + virtual bool handleBackEvent(bool isDown); + + virtual void tick() {} + + virtual void removed() {} + + virtual void renderBackground(); + virtual void renderBackground(int vo); + virtual void renderDirtBackground(int vo); + // query + virtual bool renderGameBehind(); + virtual bool hasClippingArea(IntRectangle& out); + + virtual bool isPauseScreen(); + virtual bool isErrorScreen(); + virtual bool isInGameScreen(); + virtual bool closeOnPlayerHurt(); + + virtual void confirmResult(bool result, int id) {} + virtual void lostFocus(); + virtual void toGUICoordinate(int& x, int& y); +protected: + void updateTabButtonSelection(); + + virtual void buttonClicked(Button* button) {} + virtual void mouseClicked(int x, int y, int buttonNum); + virtual void mouseReleased(int x, int y, int buttonNum); + + virtual void keyPressed(int eventKey); + virtual void keyboardNewChar(char inputChar); +public: + int width; + int height; + bool passEvents; + //GuiParticles* particles; +protected: + Minecraft* minecraft; + std::vector buttons; + std::vector textBoxes; + + std::vector tabButtons; + int tabButtonIndex; + + Font* font; +private: + Button* clickedButton; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI__Screen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/60A49128B5F7DC3974C917A1409FE08A b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/60A49128B5F7DC3974C917A1409FE08A new file mode 100644 index 0000000..307acb0 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/60A49128B5F7DC3974C917A1409FE08A @@ -0,0 +1,290 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Handle backspace for focused textbox + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + if (!tb->text.empty()) tb->text.erase(tb->text.size() -1,1); + } + // Enter/Return will defocus the textbox + if (eventKey == Keyboard::KEY_RETURN || eventKey == Keyboard::KEY_NUMPADENTER) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; +/* +#if !defined(ANDROID) && !defined(__APPLE__) //if (!minecraft->isTouchscreen()) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); +#endif } +*/ + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + +#if1 +//#if defined(ANDROID) || defined(__APPLE__) //if (minecraft->isTouchscreen()) { + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } +# else // } else { + clickedButton->released(x, y); +#endif // } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height -1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/68EDA956C069ACCAF2814708D4E5D5E5 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/68EDA956C069ACCAF2814708D4E5D5E5 new file mode 100644 index 0000000..5ff2531 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/68EDA956C069ACCAF2814708D4E5D5E5 @@ -0,0 +1,293 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 to avoid off-by-one in GUI mapping + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} + +void Screen::keyboardNewChar(char inputChar) { + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (inputChar >=32) tb->text.push_back(inputChar); + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Handle backspace for focused textbox + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + if (!tb->text.empty()) tb->text.erase(tb->text.size() -1,1); + } + // Enter/Return will defocus the textbox + if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height; // removed -1 +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/6FA2490B4DA1AB55DB05331F3FE20693 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/6FA2490B4DA1AB55DB05331F3FE20693 new file mode 100644 index 0000000..5ff2531 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/6FA2490B4DA1AB55DB05331F3FE20693 @@ -0,0 +1,293 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 to avoid off-by-one in GUI mapping + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height; // removed -1 + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} + +void Screen::keyboardNewChar(char inputChar) { + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (inputChar >=32) tb->text.push_back(inputChar); + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Handle backspace for focused textbox + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + if (!tb->text.empty()) tb->text.erase(tb->text.size() -1,1); + } + // Enter/Return will defocus the textbox + if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height; // removed -1 +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/715CB10EEE5BE3A16E56F2092070C0C5 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/715CB10EEE5BE3A16E56F2092070C0C5 new file mode 100644 index 0000000..2ad053a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/715CB10EEE5BE3A16E56F2092070C0C5 @@ -0,0 +1,287 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Handle backspace for focused textbox + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + if (!tb->text.empty()) tb->text.erase(tb->text.size() -1,1); + } + // Enter/Return will defocus the textbox + if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height -1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/799957F9B383868F74046743B967733D b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/799957F9B383868F74046743B967733D new file mode 100644 index 0000000..e76b73b --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/799957F9B383868F74046743B967733D @@ -0,0 +1,310 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} + +// Forward typed character to focused textbox +void Screen::keyboardNewChar(char inputChar) { + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + // ignore non-printable + if (inputChar >=32) { + tb->text.push_back(inputChar); + } + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Handle backspace for focused textbox + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + if (!tb->text.empty()) tb->text.erase(tb->text.size() -1,1); + } + // Enter/Return will defocus the textbox + if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; +/* +#if !defined(ANDROID) && !defined(__APPLE__) //if (!minecraft->isTouchscreen()) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); +#endif } +*/ + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + +#if1 + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } +# else // } else { + clickedButton->released(x, y); +#endif // } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height -1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/7BFB97FEE47E40F7F6D198F8C0D5A1C5 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/7BFB97FEE47E40F7F6D198F8C0D5A1C5 new file mode 100644 index 0000000..93606e9 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/7BFB97FEE47E40F7F6D198F8C0D5A1C5 @@ -0,0 +1,297 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} + +void Screen::keyboardNewChar(char inputChar) { + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (inputChar >=32) tb->text.push_back(inputChar); + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Handle backspace for focused textbox + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + if (!tb->text.empty()) tb->text.erase(tb->text.size() -1,1); + } + // Enter/Return will defocus the textbox + if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height -1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/7D7A8A6AFBA5AB2BEC1032B1497A1212 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/7D7A8A6AFBA5AB2BEC1032B1497A1212 new file mode 100644 index 0000000..c45276d --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/7D7A8A6AFBA5AB2BEC1032B1497A1212 @@ -0,0 +1,80 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI__Screen_H__ +#define NET_MINECRAFT_CLIENT_GUI__Screen_H__ + +//package net.minecraft.client.gui; + +#include +#include "GuiComponent.h" + +class Font; +class Minecraft; +class Button; +class TextBox; +struct IntRectangle; + +class Screen: public GuiComponent +{ +public: + Screen(); + + virtual void render(int xm, int ym, float a); + + void init(Minecraft* minecraft, int width, int height); + virtual void init(); + + void setSize(int width, int height); + virtual void setupPositions() {}; + + virtual void updateEvents(); + virtual void mouseEvent(); + virtual void keyboardEvent(); + virtual void keyboardTextEvent(); + virtual bool handleBackEvent(bool isDown); + + virtual void tick() {} + + virtual void removed() {} + + virtual void renderBackground(); + virtual void renderBackground(int vo); + virtual void renderDirtBackground(int vo); + // query + virtual bool renderGameBehind(); + virtual bool hasClippingArea(IntRectangle& out); + + virtual bool isPauseScreen(); + virtual bool isErrorScreen(); + virtual bool isInGameScreen(); + virtual bool closeOnPlayerHurt(); + + virtual void confirmResult(bool result, int id) {} + virtual void lostFocus(); + virtual void toGUICoordinate(int& x, int& y); +protected: + void updateTabButtonSelection(); + + virtual void buttonClicked(Button* button) {} + virtual void mouseClicked(int x, int y, int buttonNum); + virtual void mouseReleased(int x, int y, int buttonNum); + + virtual void keyPressed(int eventKey); + virtual void keyboardNewChar(char inputChar); +public: + int width; + int height; + bool passEvents; + //GuiParticles* particles; +protected: + Minecraft* minecraft; + std::vector buttons; + std::vector textBoxes; + + std::vector tabButtons; + int tabButtonIndex; + + Font* font; +private: + Button* clickedButton; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI__Screen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/83105CECE6AA00603D9DA1057156A4A0 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/83105CECE6AA00603D9DA1057156A4A0 new file mode 100644 index 0000000..55155fc --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/83105CECE6AA00603D9DA1057156A4A0 @@ -0,0 +1,146 @@ +#include "TextEditScreen.h" +#include "../../../world/level/tile/entity/SignTileEntity.h" +#include "../../../AppPlatform.h" +#include "../../Minecraft.h" +#include "../../renderer/tileentity/TileEntityRenderDispatcher.h" +#include "../../renderer/Tesselator.h" +#include "../../renderer/Textures.h" +#include "../../renderer/GameRenderer.h" +#include "../components/Button.h" +#include "../../../network/Packet.h" +#include "../../../network/RakNetInstance.h" +TextEditScreen::TextEditScreen( SignTileEntity* signEntity ) + : sign(signEntity), isShowingKeyboard(false), frame(0), line(0), btnClose(1, "") { + +} +TextEditScreen::~TextEditScreen() { + +} +void TextEditScreen::init() { + super::init(); + minecraft->platform()->showKeyboard(); + isShowingKeyboard = true; + ImageDef def; + def.name = "gui/spritesheet.png"; + def.x = 0; + def.y = 1; + def.width = def.height = 18; + def.setSrc(IntRectangle(60, 0, 18, 18)); + btnClose.setImageDef(def, true); + btnClose.scaleWhenPressed = false; + buttons.push_back(&btnClose); +} + +void TextEditScreen::setupPositions() { + btnClose.width = btnClose.height = 19; + btnClose.x = width - btnClose.width; + btnClose.y = 0; +} + + +bool TextEditScreen::handleBackEvent( bool isDown ) { + sign->setChanged(); + Packet* signUpdatePacket = sign->getUpdatePacket(); + minecraft->raknetInstance->send(signUpdatePacket); + minecraft->platform()->hideKeyboard(); + minecraft->setScreen(NULL); + return true; +} + +void TextEditScreen::render( int xm, int ym, float a ) { + glDepthMask(GL_FALSE); + renderBackground(); + glPushMatrix(); + glDepthMask(GL_TRUE); + glDisable(GL_CULL_FACE); + glLoadIdentity(); + Tesselator& t = Tesselator::instance; + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrthof(0.0f, (float)minecraft->width, (float)minecraft->height, 0, -1, 1); + glMatrixMode(GL_MODELVIEW); + + minecraft->textures->loadAndBindTexture("item/sign.png"); + glColor4f2(1, 1, 1, 1); + + static float minUV[] = {0.03126f, 0.06249f}; + static float maxUV[] = {0.39063f, 0.4374f}; + float scale = ((minecraft->height / 2) / 32) * 0.9f; + + glTranslatef(minecraft->width / 2.0f, 5.0f, 0.0f); + glScalef2(scale,scale,1); + t.begin(GL_QUADS); + t.vertexUV(-32, 0, 0.0f,minUV[0],minUV[1]); + t.vertexUV(32, 0, 0.0f, maxUV[0], minUV[1]); + t.vertexUV(32, 0 + 32, 0.0f, maxUV[0], maxUV[1]); + t.vertexUV(-32, 0 + 32, 0.0f, minUV[0], maxUV[1]); + t.draw(); + + sign->selectedLine = line; + float textScale = 8.0f / 11.0f; + + glTranslatef(0, 2 ,0); + glScalef2(textScale, textScale, 1); + for(int i = 0; i < 4; ++i) { + //drawCenteredString(font, sign->messages[a], 32.0f, 10 * a, 0xFF000000); + std::string msg = sign->messages[i]; + if (i == sign->selectedLine && msg.length() < 14) { + std::string s = "> " + msg + " <"; + font->draw(s, -(float)font->width(s) / 2.0f, 10.0f * i, 0xFF000000, false); + } else { + font->draw(msg, -(float)font->width(msg) / 2.0f, 10.0f * i, 0xFF000000, false); + } + } + sign->selectedLine = -1; + //font->draw("Hej", minecraft->width / 2, 100, 0xFFFFFFFF, false); + + glPopMatrix(); + glEnable(GL_CULL_FACE); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + + //glEnable(GL_DEPTH_TEST); + super::render(xm, ym, a); +} + +void TextEditScreen::lostFocus() { + +} + +void TextEditScreen::tick() { + frame++; +} + +void TextEditScreen::keyPressed( int eventKey ) { + LOGW("Key pressed! [%d]", eventKey); + if(eventKey == Keyboard::KEY_BACKSPACE) { + if(sign->messages[line].length() > 0) { + sign->messages[line].erase(sign->messages[line].size() - 1, 1); + } else { + line--; + if(line < 0) { + line = 3; + } + } + } else if(eventKey == Keyboard::KEY_RETURN) { + line = (line + 1) % 4; + } else { + super::keyPressed(eventKey); + } +} + +void TextEditScreen::keyboardNewChar( char inputChar ) { + std::string fullstring = sign->messages[line] + inputChar; + if(fullstring.length() < 16) { + sign->messages[line] = fullstring; + //LOGW("Line text updated: %s\n", fullstring.c_str()); + } +} + +void TextEditScreen::buttonClicked( Button* button ) { + if(button == &btnClose) + handleBackEvent(true); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/9C78E1311036817AB755F51C4E99B3AC b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/9C78E1311036817AB755F51C4E99B3AC new file mode 100644 index 0000000..965dc41 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/9C78E1311036817AB755F51C4E99B3AC @@ -0,0 +1,301 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} + +// Forward typed character to focused textbox +void Screen::keyboardNewChar(char inputChar) { + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + // ignore non-printable + if (inputChar >=32) { + tb->text.push_back(inputChar); + } + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Handle backspace for focused textbox + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + if (!tb->text.empty()) tb->text.erase(tb->text.size() -1,1); + } + // Enter/Return will defocus the textbox + if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height -1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/AAD41D9C3D13592C1F9224E4E0EE605C b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/AAD41D9C3D13592C1F9224E4E0EE605C new file mode 100644 index 0000000..2ad053a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/AAD41D9C3D13592C1F9224E4E0EE605C @@ -0,0 +1,287 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Handle backspace for focused textbox + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + if (!tb->text.empty()) tb->text.erase(tb->text.size() -1,1); + } + // Enter/Return will defocus the textbox + if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height -1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/B2C2C2A0000D07E3B2E5C777754A4F55 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/B2C2C2A0000D07E3B2E5C777754A4F55 new file mode 100644 index 0000000..e76b73b --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/B2C2C2A0000D07E3B2E5C777754A4F55 @@ -0,0 +1,310 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} + +// Forward typed character to focused textbox +void Screen::keyboardNewChar(char inputChar) { + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + // ignore non-printable + if (inputChar >=32) { + tb->text.push_back(inputChar); + } + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Handle backspace for focused textbox + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + if (!tb->text.empty()) tb->text.erase(tb->text.size() -1,1); + } + // Enter/Return will defocus the textbox + if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; +/* +#if !defined(ANDROID) && !defined(__APPLE__) //if (!minecraft->isTouchscreen()) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); +#endif } +*/ + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + +#if1 + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } +# else // } else { + clickedButton->released(x, y); +#endif // } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height -1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/B7B60439456530BC15D4E47D3C56C8E0 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/B7B60439456530BC15D4E47D3C56C8E0 new file mode 100644 index 0000000..c45276d --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/B7B60439456530BC15D4E47D3C56C8E0 @@ -0,0 +1,80 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI__Screen_H__ +#define NET_MINECRAFT_CLIENT_GUI__Screen_H__ + +//package net.minecraft.client.gui; + +#include +#include "GuiComponent.h" + +class Font; +class Minecraft; +class Button; +class TextBox; +struct IntRectangle; + +class Screen: public GuiComponent +{ +public: + Screen(); + + virtual void render(int xm, int ym, float a); + + void init(Minecraft* minecraft, int width, int height); + virtual void init(); + + void setSize(int width, int height); + virtual void setupPositions() {}; + + virtual void updateEvents(); + virtual void mouseEvent(); + virtual void keyboardEvent(); + virtual void keyboardTextEvent(); + virtual bool handleBackEvent(bool isDown); + + virtual void tick() {} + + virtual void removed() {} + + virtual void renderBackground(); + virtual void renderBackground(int vo); + virtual void renderDirtBackground(int vo); + // query + virtual bool renderGameBehind(); + virtual bool hasClippingArea(IntRectangle& out); + + virtual bool isPauseScreen(); + virtual bool isErrorScreen(); + virtual bool isInGameScreen(); + virtual bool closeOnPlayerHurt(); + + virtual void confirmResult(bool result, int id) {} + virtual void lostFocus(); + virtual void toGUICoordinate(int& x, int& y); +protected: + void updateTabButtonSelection(); + + virtual void buttonClicked(Button* button) {} + virtual void mouseClicked(int x, int y, int buttonNum); + virtual void mouseReleased(int x, int y, int buttonNum); + + virtual void keyPressed(int eventKey); + virtual void keyboardNewChar(char inputChar); +public: + int width; + int height; + bool passEvents; + //GuiParticles* particles; +protected: + Minecraft* minecraft; + std::vector buttons; + std::vector textBoxes; + + std::vector tabButtons; + int tabButtonIndex; + + Font* font; +private: + Button* clickedButton; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI__Screen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/B87B55346E046620EB73B1212DA95B24 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/B87B55346E046620EB73B1212DA95B24 new file mode 100644 index 0000000..93606e9 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/B87B55346E046620EB73B1212DA95B24 @@ -0,0 +1,297 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} + +void Screen::keyboardNewChar(char inputChar) { + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (inputChar >=32) tb->text.push_back(inputChar); + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Handle backspace for focused textbox + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + if (!tb->text.empty()) tb->text.erase(tb->text.size() -1,1); + } + // Enter/Return will defocus the textbox + if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height -1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/C7B2F96609F29633FAB2F6F7229AE6E9 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/C7B2F96609F29633FAB2F6F7229AE6E9 new file mode 100644 index 0000000..2ad053a --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/C7B2F96609F29633FAB2F6F7229AE6E9 @@ -0,0 +1,287 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Handle backspace for focused textbox + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + if (!tb->text.empty()) tb->text.erase(tb->text.size() -1,1); + } + // Enter/Return will defocus the textbox + if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height -1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/D63E339FEC88633B8C5EAB1652DF6FD3 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/D63E339FEC88633B8C5EAB1652DF6FD3 new file mode 100644 index 0000000..965dc41 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/D63E339FEC88633B8C5EAB1652DF6FD3 @@ -0,0 +1,301 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i =0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } + + // Render textboxes on top of buttons so they are visible and clickable + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height -1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} + +// Forward typed character to focused textbox +void Screen::keyboardNewChar(char inputChar) { + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + // ignore non-printable + if (inputChar >=32) { + tb->text.push_back(inputChar); + } + break; + } + } +} + +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0,0, width, height,0xc0101010,0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1,1,1,1); + float s =32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height,0,0, height / s + fvo); + t.vertexUV((float)width, (float)height,0, width / s, (float)height / s + fvo); + t.vertexUV((float)width,0,0, (float)width / s,0 + fvo); + t.vertexUV(0,0,0,0,0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex =0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount -1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click",1,1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); + + // Handle backspace for focused textbox + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (tb->focused) { + if (eventKey == Keyboard::KEY_BACKSPACE) { + if (!tb->text.empty()) tb->text.erase(tb->text.size() -1,1); + } + // Enter/Return will defocus the textbox + if (eventKey == Keyboard::KEY_RETURN) { + tb->loseFocus(minecraft); + } + break; + } + } +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i =0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + // First, check textboxes for focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + if (x >= tb->x && y >= tb->y && x < tb->x + tb->w && y < tb->y + tb->h) { + // Focus this textbox + tb->setFocus(minecraft); + // Do not pass through to buttons + return; + } + } + + // Clicked outside textboxes: remove focus + for (unsigned int i =0; i < textBoxes.size(); ++i) { + TextBox* tb = textBoxes[i]; + tb->loseFocus(minecraft); + } + + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + + // Always handle release by checking buttons + for (unsigned int i =0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click",1,1); + clickedButton->released(x, y); + } + } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height -1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/E19DC915D7B7F4D40A50F260C758DAD9 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/E19DC915D7B7F4D40A50F260C758DAD9 new file mode 100644 index 0000000..8b4d6da --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/E19DC915D7B7F4D40A50F260C758DAD9 @@ -0,0 +1,80 @@ +#ifndef NET_MINECRAFT_CLIENT_GUI__Screen_H__ +#define NET_MINECRAFT_CLIENT_GUI__Screen_H__ + +//package net.minecraft.client.gui; + +#include +#include "GuiComponent.h" + +class Font; +class Minecraft; +class Button; +class TextBox; +struct IntRectangle; + +class Screen: public GuiComponent +{ +public: + Screen(); + + virtual void render(int xm, int ym, float a); + + void init(Minecraft* minecraft, int width, int height); + virtual void init(); + + void setSize(int width, int height); + virtual void setupPositions() {}; + + virtual void updateEvents(); + virtual void mouseEvent(); + virtual void keyboardEvent(); + virtual void keyboardTextEvent(); + virtual bool handleBackEvent(bool isDown); + + virtual void tick() {} + + virtual void removed() {} + + virtual void renderBackground(); + virtual void renderBackground(int vo); + virtual void renderDirtBackground(int vo); + // query + virtual bool renderGameBehind(); + virtual bool hasClippingArea(IntRectangle& out); + + virtual bool isPauseScreen(); + virtual bool isErrorScreen(); + virtual bool isInGameScreen(); + virtual bool closeOnPlayerHurt(); + + virtual void confirmResult(bool result, int id) {} + virtual void lostFocus(); + virtual void toGUICoordinate(int& x, int& y); +protected: + void updateTabButtonSelection(); + + virtual void buttonClicked(Button* button) {} + virtual void mouseClicked(int x, int y, int buttonNum); + virtual void mouseReleased(int x, int y, int buttonNum); + + virtual void keyPressed(int eventKey); + virtual void keyboardNewChar(char inputChar) {} +public: + int width; + int height; + bool passEvents; + //GuiParticles* particles; +protected: + Minecraft* minecraft; + std::vector buttons; + std::vector textBoxes; + + std::vector tabButtons; + int tabButtonIndex; + + Font* font; +private: + Button* clickedButton; +}; + +#endif /*NET_MINECRAFT_CLIENT_GUI__Screen_H__*/ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/F1258E0CB6DFE593C3EAE784FF810BBD b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/F1258E0CB6DFE593C3EAE784FF810BBD new file mode 100644 index 0000000..6a190da --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/F21C30E48F853C4299BB583D76F5B45F/F1258E0CB6DFE593C3EAE784FF810BBD @@ -0,0 +1,70 @@ +#include "TextBox.h" +#include "../../Minecraft.h" +#include "../../../AppPlatform.h" +#include + +TextBox::TextBox( int id, const std::string& msg ) + : id(id), w(0), h(0), x(0), y(0), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, const std::string& msg ) + : id(id), w(0), h(0), x(x), y(y), text(msg), focused(false) { + +} + +TextBox::TextBox( int id, int x, int y, int w, int h, const std::string& msg ) + : id(id), w(w), h(h), x(x), y(y), text(msg), focused(false) { + +} + +void TextBox::setFocus(Minecraft* minecraft) { + if(!focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->showKeyboard(); + focused = true; + } +} + +bool TextBox::loseFocus(Minecraft* minecraft) { + if(focused) { + if (minecraft && minecraft->platform()) minecraft->platform()->hideKeyboard(); + focused = false; + return true; + } + return false; +} + +void TextBox::render( Minecraft* minecraft, int xm, int ym ) { + if (w ==0) { + // default width + // try to not overflow the screen + w =120; + } + if (h ==0) h =20; + + // Background box + // Slightly translucent dark background + fill(x, y, x + w, y + h,0x80000000); + // Border + fill(x, y, x + w, y +1,0xff707070); + fill(x, y + h -1, x + w, y + h,0xff101010); + fill(x, y, x +1, y + h,0xff707070); + fill(x + w -1, y, x + w, y + h,0xff101010); + + // Draw text. If textbox contains the placeholder (no focus and text equals initial msg), draw dim color + int color =0xe0e0e0; + // If not focused and text is empty or equals default placeholder, draw dimmed + if (!focused && (text.empty())) color =0xffa0a0a0; + + // Clip text if too long - simple truncate + std::string out = text; + // measure available width approximated by character count + int calc = (w -8) /6; // approx6 px per char + int maxChars =1; + if (calc > maxChars) maxChars = calc; + if ((int)out.size() > maxChars) { + out = out.substr(0, maxChars -3) + "..."; + } + + drawString(minecraft->font, out, x +4, y + (h -8) /2, color); +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/state.mpack b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/state.mpack new file mode 100644 index 0000000..7450947 Binary files /dev/null and b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/521EF7E81C11864B804628BD5CE46039/state.mpack differ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/BA89C7AF1569F642860486F4AC0590EF/171EC30109002D41B8A329A7EFB47786/430CC357A15D4BE1A70387A7C3462A3C b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/BA89C7AF1569F642860486F4AC0590EF/171EC30109002D41B8A329A7EFB47786/430CC357A15D4BE1A70387A7C3462A3C new file mode 100644 index 0000000..92a367b --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/BA89C7AF1569F642860486F4AC0590EF/171EC30109002D41B8A329A7EFB47786/430CC357A15D4BE1A70387A7C3462A3C @@ -0,0 +1,258 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i = 0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0, 0, width, height, 0xc0101010, 0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1, 1, 1, 1); + float s = 32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height, 0, 0, height / s + fvo); + t.vertexUV((float)width, (float)height, 0, width / s, (float)height / s + fvo); + t.vertexUV((float)width, 0, 0, (float)width / s, 0 + fvo); + t.vertexUV(0, 0, 0, 0, 0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex = 0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount - 1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i = 0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; +/* +#if !defined(ANDROID) && !defined(__APPLE__) //if (!minecraft->isTouchscreen()) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); +#endif } +*/ + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + +#if 1 +//#if defined(ANDROID) || defined(__APPLE__) //if (minecraft->isTouchscreen()) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click", 1, 1); + clickedButton->released(x, y); + } + } +# else // } else { + clickedButton->released(x, y); +#endif // } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height - 1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/BA89C7AF1569F642860486F4AC0590EF/171EC30109002D41B8A329A7EFB47786/C27E48EE76E10BD3C3823A39E86CE1AC b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/BA89C7AF1569F642860486F4AC0590EF/171EC30109002D41B8A329A7EFB47786/C27E48EE76E10BD3C3823A39E86CE1AC new file mode 100644 index 0000000..92a367b --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/BA89C7AF1569F642860486F4AC0590EF/171EC30109002D41B8A329A7EFB47786/C27E48EE76E10BD3C3823A39E86CE1AC @@ -0,0 +1,258 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i = 0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0, 0, width, height, 0xc0101010, 0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1, 1, 1, 1); + float s = 32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height, 0, 0, height / s + fvo); + t.vertexUV((float)width, (float)height, 0, width / s, (float)height / s + fvo); + t.vertexUV((float)width, 0, 0, (float)width / s, 0 + fvo); + t.vertexUV(0, 0, 0, 0, 0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed(int eventKey) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + // Use Minecraft's pause helper so behavior is consistent across platforms + if (minecraft) minecraft->pauseGame(false); + return; + } + + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex = 0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount - 1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i = 0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; +/* +#if !defined(ANDROID) && !defined(__APPLE__) //if (!minecraft->isTouchscreen()) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); +#endif } +*/ + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + +#if 1 +//#if defined(ANDROID) || defined(__APPLE__) //if (minecraft->isTouchscreen()) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click", 1, 1); + clickedButton->released(x, y); + } + } +# else // } else { + clickedButton->released(x, y); +#endif // } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height - 1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/BA89C7AF1569F642860486F4AC0590EF/4BEB5D35CFBDA04581DC57DA21777F4C/3F1D43408684A182024FE1FF253ABC90 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/BA89C7AF1569F642860486F4AC0590EF/4BEB5D35CFBDA04581DC57DA21777F4C/3F1D43408684A182024FE1FF253ABC90 new file mode 100644 index 0000000..536dbe1 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/BA89C7AF1569F642860486F4AC0590EF/4BEB5D35CFBDA04581DC57DA21777F4C/3F1D43408684A182024FE1FF253ABC90 @@ -0,0 +1,258 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i = 0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0, 0, width, height, 0xc0101010, 0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1, 1, 1, 1); + float s = 32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height, 0, 0, height / s + fvo); + t.vertexUV((float)width, (float)height, 0, width / s, (float)height / s + fvo); + t.vertexUV((float)width, 0, 0, (float)width / s, 0 + fvo); + t.vertexUV(0, 0, 0, 0, 0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed( int eventKey ) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + printf("bruh this thing got pressed\n"); + Screen* screen = minecraft->screenChooser.createScreen(SCREEN_PAUSE); + minecraft->setScreen(screen); + //minecraft->grabMouse(); + } + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex = 0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount-1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i = 0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; +/* +#if !defined(ANDROID) && !defined(__APPLE__) //if (!minecraft->isTouchscreen()) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); +#endif } +*/ + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + +#if 1 +//#if defined(ANDROID) || defined(__APPLE__) //if (minecraft->isTouchscreen()) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click", 1, 1); + clickedButton->released(x, y); + } + } +# else // } else { + clickedButton->released(x, y); +#endif // } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height - 1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/BA89C7AF1569F642860486F4AC0590EF/4BEB5D35CFBDA04581DC57DA21777F4C/430CC357A15D4BE1A70387A7C3462A3C b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/BA89C7AF1569F642860486F4AC0590EF/4BEB5D35CFBDA04581DC57DA21777F4C/430CC357A15D4BE1A70387A7C3462A3C new file mode 100644 index 0000000..536dbe1 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/BA89C7AF1569F642860486F4AC0590EF/4BEB5D35CFBDA04581DC57DA21777F4C/430CC357A15D4BE1A70387A7C3462A3C @@ -0,0 +1,258 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i = 0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0, 0, width, height, 0xc0101010, 0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1, 1, 1, 1); + float s = 32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height, 0, 0, height / s + fvo); + t.vertexUV((float)width, (float)height, 0, width / s, (float)height / s + fvo); + t.vertexUV((float)width, 0, 0, (float)width / s, 0 + fvo); + t.vertexUV(0, 0, 0, 0, 0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed( int eventKey ) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + printf("bruh this thing got pressed\n"); + Screen* screen = minecraft->screenChooser.createScreen(SCREEN_PAUSE); + minecraft->setScreen(screen); + //minecraft->grabMouse(); + } + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex = 0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount-1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i = 0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; +/* +#if !defined(ANDROID) && !defined(__APPLE__) //if (!minecraft->isTouchscreen()) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); +#endif } +*/ + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + +#if 1 +//#if defined(ANDROID) || defined(__APPLE__) //if (minecraft->isTouchscreen()) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click", 1, 1); + clickedButton->released(x, y); + } + } +# else // } else { + clickedButton->released(x, y); +#endif // } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height - 1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/BA89C7AF1569F642860486F4AC0590EF/4BEB5D35CFBDA04581DC57DA21777F4C/72B2752C7CD663CF9A1CC0178EF19114 b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/BA89C7AF1569F642860486F4AC0590EF/4BEB5D35CFBDA04581DC57DA21777F4C/72B2752C7CD663CF9A1CC0178EF19114 new file mode 100644 index 0000000..2c2d557 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/BA89C7AF1569F642860486F4AC0590EF/4BEB5D35CFBDA04581DC57DA21777F4C/72B2752C7CD663CF9A1CC0178EF19114 @@ -0,0 +1,1556 @@ +#include "Minecraft.h" + +#if defined(APPLE_DEMO_PROMOTION) + #define NO_NETWORK +#endif + +#if defined(RPI) + #define CREATORMODE +#endif + +#include "../network/RakNetInstance.h" +#include "../network/ClientSideNetworkHandler.h" +#include "../network/ServerSideNetworkHandler.h" +//#include "../network/Packet.h" +#include "../world/entity/player/Inventory.h" +#include "../world/level/chunk/ChunkCache.h" +#include "../world/level/tile/Tile.h" +#include "../world/level/storage/LevelStorageSource.h" +#include "../world/level/storage/LevelStorage.h" +#include "player/input/KeyboardInput.h" +#ifndef STANDALONE_SERVER +#include "player/input/touchscreen/TouchInputHolder.h" +#endif +#include "player/LocalPlayer.h" +#include "gamemode/CreativeMode.h" +#include "gamemode/SurvivalMode.h" +#include "player/LocalPlayer.h" +#ifndef STANDALONE_SERVER +#include "particle/ParticleEngine.h" +#include "gui/Screen.h" +#include "gui/Font.h" +#include "gui/screens/RenameMPLevelScreen.h" +#include "sound/SoundEngine.h" +#endif +#include "../platform/CThread.h" +#include "../platform/input/Mouse.h" +#include "../AppPlatform.h" +#include "../Performance.h" +#include "../LicenseCodes.h" +#include "../util/PerfTimer.h" +#include "../util/PerfRenderer.h" +#include "player/input/MouseBuildInput.h" + +#include "../world/Facing.h" + +#include "../network/packet/PlaceBlockPacket.h" + +#include "player/input/IInputHolder.h" +#ifndef STANDALONE_SERVER +#include "player/input/touchscreen/TouchscreenInput.h" + +#include "player/input/ControllerTurnInput.h" +#include "player/input/XperiaPlayInput.h" + +#endif + +#include "player/input/MouseTurnInput.h" +#include "../world/entity/MobFactory.h" +#include "../world/level/MobSpawner.h" +#include "../util/Mth.h" +#include "../network/packet/InteractPacket.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/PrerenderTilesScreen.h" +#include "renderer/Textures.h" +#include "gui/screens/DeathScreen.h" +#endif + +#include "../network/packet/RespawnPacket.h" +#include "IConfigListener.h" +#include "../world/entity/MobCategory.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/FurnaceScreen.h" +#endif +#include "../world/Difficulty.h" +#include "../server/ServerLevel.h" +#ifdef CREATORMODE +#include "../server/CreatorLevel.h" +#endif +#include "../network/packet/AdventureSettingsPacket.h" +#include "../network/packet/SetSpawnPositionPacket.h" +#include "../network/command/CommandServer.h" +#include "gamemode/CreatorMode.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/ArmorScreen.h" +#endif +#include "../world/level/levelgen/synth/ImprovedNoise.h" +#ifndef STANDALONE_SERVER +#include "renderer/tileentity/TileEntityRenderDispatcher.h" +#endif + +#ifndef STANDALONE_SERVER +#include "renderer/ptexture/DynamicTexture.h" +#include "renderer/GameRenderer.h" +#include "renderer/ItemInHandRenderer.h" +#include "renderer/LevelRenderer.h" +#include "renderer/entity/EntityRenderDispatcher.h" +#include "gui/Screen.h" +#include "gui/Font.h" +#include "gui/screens/RenameMPLevelScreen.h" +#include "sound/SoundEngine.h" +#endif + +static void checkGlError(const char* tag) { +#ifdef GLDEBUG + while (1) { + const int errCode = glGetError(); + if (errCode == GL_NO_ERROR) break; + + LOGE("################\nOpenGL-error @ %s : #%d\n", tag, errCode); + } +#endif /*GLDEBUG*/ +} + +/*static*/ +const char* Minecraft::progressMessages[] = { + "Locating server", + "Building terrain", + "Preparing", + "Saving chunks" +}; + +int Minecraft::customDebugId = Minecraft::CDI_NONE; + +#if defined(_MSC_VER) + #pragma warning( disable : 4355 ) // 'this' pointer in initialization list which is perfectly legal +#endif + +bool Minecraft::useAmbientOcclusion = false; + +Minecraft::Minecraft() +: user(NULL), + level(NULL), + player(NULL), + cameraTargetPlayer(NULL), + levelRenderer(NULL), + gameRenderer(NULL), +#ifndef STANDALONE_SERVER + particleEngine(NULL), + _perfRenderer(NULL), +#endif + _commandServer(NULL), +#ifndef STANDALONE_SERVER + textures(NULL), +#endif + lastTickTime(-1), + lastTime(0), + ticksSinceLastUpdate(0), + gameMode(NULL), + mouseGrabbed(true), + missTime(0), + pause(false), + _running(false), + timer(20), +#ifndef STANDALONE_SERVER + gui(this), +#endif + netCallback(NULL), +#ifndef STANDALONE_SERVER + screen(NULL), + font(NULL), +#endif + screenMutex(false), +#ifndef STANDALONE_SERVER + scheduledScreen(NULL), + hasScheduledScreen(false), + soundEngine(NULL), +#endif + ticks(0), + isGeneratingLevel(false), + _hasSignaledGeneratingLevelFinished(true), + generateLevelThread(NULL), + progressStagePercentage(0), + progressStageStatusId(0), + isLookingForMultiplayer(false), + _licenseId(LicenseCodes::WAIT_PLATFORM_NOT_READY), + inputHolder(0), + _supportsNonTouchscreen(false), +#ifndef STANDALONE_SERVER + screenChooser(this), +#endif + width(1), height(1), + //_respawnPlayerTicks(-1), +#ifdef __APPLE__ + _isSuperFast(false), +#endif + _powerVr(false), + commandPort(4711), + reserved_d1(0),reserved_d2(0), + reserved_f1(0),reserved_f2(0) +{ +//#ifdef ANDROID + +#if defined(NO_NETWORK) + raknetInstance = new IRakNetInstance(); +#else + raknetInstance = new RakNetInstance(); +#endif +#ifndef STANDALONE_SERVER + soundEngine = new SoundEngine(20.0f); + soundEngine->init(this, &options); +#endif + //setupPieces(); +} + +Minecraft::~Minecraft() +{ + delete netCallback; + delete raknetInstance; +#ifndef STANDALONE_SERVER + delete levelRenderer; + delete gameRenderer; + delete particleEngine; + + delete soundEngine; +#endif + delete gameMode; +#ifndef STANDALONE_SERVER + delete font; + delete textures; + + if (screen != NULL) { + delete screen; + screen = NULL; + } +#endif + if (level != NULL) { + level->saveGame(); + if (level->getChunkSource()) + level->getChunkSource()->saveAll(true); + delete level->getLevelStorage(); + delete level; + level = NULL; + } + + //delete player; + delete user; + delete inputHolder; + + delete storageSource; + delete _perfRenderer; + delete _commandServer; + + MobFactory::clearStaticTestMobs(); +#ifndef STANDALONE_SERVER + EntityRenderDispatcher::destroy(); +#endif +} + +// Only called by server +void Minecraft::selectLevel( const std::string& levelId, const std::string& levelName, const LevelSettings& settings ) +{ +#if defined(CREATORMODE) + level = new CreatorLevel( +#else + level = new ServerLevel( +#endif + storageSource->selectLevel(levelId, false), + levelName, + settings, + SharedConstants::GeneratorVersion); + + // note: settings is useless beyond this point, since it's + // either copied to LevelData (or LevelData read from file) + setLevel(level, "Generating level"); + setIsCreativeMode(level->getLevelData()->getGameType() == GameType::Creative); + _running = true; +} + +void Minecraft::setLevel(Level* level, const std::string& message /* ="" */, LocalPlayer* forceInsertPlayer /* = NULL */) { + cameraTargetPlayer = NULL; + LOGI("Seed is %ld\n", level->getSeed()); + + if (level != NULL) { + level->raknetInstance = raknetInstance; + gameMode->initLevel(level); + + if (!player && forceInsertPlayer) + { + player = forceInsertPlayer; + player->resetPos(false); + //level->addEntity(forceInsertPlayer); + } + else if (player != NULL) { + player->resetPos(false); + if (level != NULL) { + level->addEntity(player); + } + } + this->level = level; + _hasSignaledGeneratingLevelFinished = false; +#ifdef STANDALONE_SERVER + const bool threadedLevelCreation = false; +#else + const bool threadedLevelCreation = true; +#endif + + if (threadedLevelCreation) { + // Threaded + // "Lock" + isGeneratingLevel = true; + generateLevelThread = new CThread(Minecraft::prepareLevel_tspawn, this); + } else { + // Non-threaded + generateLevel("Currently not used", level); + } + } else { + player = NULL; + } + + this->lastTickTime = 0; + this->_running = true; +} + +void Minecraft::leaveGame(bool renameLevel /*=false*/) +{ + if (isGeneratingLevel || !_hasSignaledGeneratingLevelFinished) + return; + + isGeneratingLevel = false; + bool saveLevel = level && (!level->isClientSide || renameLevel); + + raknetInstance->disconnect(); + if (saveLevel) { + // If server or wanting to save level as client, save all unsaved chunks! + level->getChunkSource()->saveAll(true); + } + + LOGI("Clearing levels\n"); + + cameraTargetPlayer = NULL; +#ifndef STANDALONE_SERVER + levelRenderer->setLevel(NULL); + particleEngine->setLevel(NULL); +#endif + LOGI("Erasing callback\n"); + delete netCallback; + netCallback = NULL; + + LOGI("Erasing level\n"); + if (level != NULL) { + delete level->getLevelStorage(); + delete level; + level = NULL; + } + //delete player; + player = NULL; + cameraTargetPlayer = NULL; + + _running = false; +#ifndef STANDALONE_SERVER + if (renameLevel) { + setScreen(new RenameMPLevelScreen(LevelStorageSource::TempLevelId)); + } + else + screenChooser.setScreen(SCREEN_STARTMENU); +#endif +} + +void Minecraft::prepareLevel(const std::string& title) { + LOGI("status: 1\n"); + progressStageStatusId = 1; + + Stopwatch A, B, C, D; + A.start(); + + Stopwatch L; + + // Dont update lights if we load the level (ok, actually just with leveldata version=1.+(?)) + if (!level->isNew()) + level->setUpdateLights(false); + + int Max = CHUNK_CACHE_WIDTH * CHUNK_CACHE_WIDTH; + int pp = 0; + for (int x = 8; x < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); x += CHUNK_WIDTH) { + for (int z = 8; z < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); z += CHUNK_WIDTH) { + progressStagePercentage = 100 * pp++ / Max; + //printf("level generation progress %d\n", progressStagePercentage); + B.start(); + level->getTile(x, 64, z); + B.stop(); + L.start(); + if (level->isNew()) + while (level->updateLights()) + ; + L.stop(); + } + } + A.stop(); + level->setUpdateLights(true); + + C.start(); + for (int x = 0; x < CHUNK_CACHE_WIDTH; x++) + { + for (int z = 0; z < CHUNK_CACHE_WIDTH; z++) + { + LevelChunk* chunk = level->getChunk(x, z); + if (chunk && !chunk->createdFromSave) + { + chunk->unsaved = false; + chunk->clearUpdateMap(); + } + } + } + C.stop(); + + LOGI("status: 3\n"); + progressStageStatusId = 3; + if (level->isNew()) { + level->setInitialSpawn(); // @note: should obviously be called from Level itself + level->saveLevelData(); + level->getChunkSource()->saveAll(false); + level->saveGame(); + } else { + level->saveLevelData(); + level->loadEntities(); + } + + progressStagePercentage = -1; + progressStageStatusId = 2; + LOGI("status: 2\n"); + + D.start(); + level->prepare(); + D.stop(); + + A.print("Generate level: "); + L.print(" - light: "); + B.print(" - getTl: "); + C.print(" - clear: "); + D.print(" - prepr: "); + progressStageStatusId = 0; +} + +void Minecraft::update() { + //LOGI("Enter Update\n"); + + if (Options::debugGl) + LOGI(">>>>>>>>>>\n"); + + TIMER_PUSH("root"); + + //if (level) { + // LOGI("numplayers: %d\n", level->players.size()); + // for (int i = 0; i < level->players.size(); ++i) { + // Player* p = level->players[i]; + // bool inEnt = std::find(level->entities.begin(), level->entities.end(), p) != level->entities.end(); + // LOGI(" %p, %d, %d - in? %d\n", p, p->entityId, p->owner.ToUint32(p->owner), inEnt); + // } + //} + + if (pause && level != NULL) { + float lastA = timer.a; + timer.advanceTime(); + timer.a = lastA; + } else { + timer.advanceTime(); + } + + if (raknetInstance) { + raknetInstance->runEvents(netCallback); + } + + TIMER_PUSH("tick"); + int toTick = timer.ticks; + for (int i = 0; i < toTick; ++i, ++ticks) + tick(i, toTick-1); + + TIMER_POP_PUSH("updatelights"); + if (level && !isGeneratingLevel) { + level->updateLights(); + } + TIMER_POP(); + + #ifndef STANDALONE_SERVER + if (gameMode != NULL) gameMode->render(timer.a); + TIMER_PUSH("sound"); + soundEngine->update(player, timer.a); + TIMER_POP_PUSH("render"); + gameRenderer->render(timer.a); + TIMER_POP(); + #else + CThread::sleep(1); + #endif +#ifndef STANDALONE_SERVER + Multitouch::resetThisUpdate(); +#endif + TIMER_POP(); +#ifndef STANDALONE_SERVER + checkGlError("Update finished"); + + if (options.renderDebug) { + if (!PerfTimer::enabled) { + PerfTimer::reset(); + PerfTimer::enabled = true; + } + + //TIMER_PUSH("debugfps"); + _perfRenderer->renderFpsMeter(1); + checkGlError("render debug"); + //TIMER_POP(); + } else { + PerfTimer::enabled = false; + } +#endif + //LOGI("Exit Update\n"); +} + +void Minecraft::tick(int nTick, int maxTick) { + if (missTime > 0) missTime--; +#ifndef STANDALONE_SERVER + if (!screen && player) { + if (player->health <= 0) { + setScreen(new DeathScreen()); + } + } +#endif + TIMER_PUSH("gameMode"); + if (level && !pause) { + gameMode->tick(); + } + + TIMER_POP_PUSH("commandServer"); + if (level && _commandServer) { + _commandServer->tick(); + } + + TIMER_POP_PUSH("input"); + tickInput(); +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("gui"); + gui.tick(); +#endif + // + // Ongoing level generation in a (perhaps) different thread. When it's + // ready, _levelGenerated() is called once and any threads are deleted. + // + if (isGeneratingLevel) { + return; + } else if (!_hasSignaledGeneratingLevelFinished) { + if (generateLevelThread) { + delete generateLevelThread; + generateLevelThread = NULL; + } + _levelGenerated(); + } + + // + // Normal game loop, run before or efter level generation + // + if (level != NULL) + { + if (!pause) { +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("gameRenderer"); + gameRenderer->tick(nTick, maxTick); + + TIMER_POP_PUSH("levelRenderer"); + levelRenderer->tick(); +#endif + level->difficulty = options.difficulty; + if (level->isClientSide) level->difficulty = Difficulty::EASY; + + TIMER_POP_PUSH("level"); + level->tickEntities(); + level->tick(); +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("animateTick"); + if (player) { + level->animateTick(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); + } +#endif + } + } +#ifndef STANDALONE_SERVER + textures->loadAndBindTexture("terrain.png"); + if (!pause && !(screen && !screen->renderGameBehind())) { + #if !defined(RPI) + #ifdef __APPLE__ + if (isSuperFast()) + #endif + { + if (nTick == maxTick) { + TIMER_POP_PUSH("textures"); + textures->tick(true); + } + } + #endif + } + TIMER_POP_PUSH("particles"); + particleEngine->tick(); + if (screen) { + screenMutex = true; + screen->tick(); + screenMutex = false; + } + + // @note: fix to keep "isPressed" and "isReleased" as long as necessary. + // Most likely keyboard and mouse could/should be reset here as well. + Multitouch::reset(); +#endif + TIMER_POP(); +} + +class InputRAII { +public: + ~InputRAII() { +#ifndef STANDALONE_SERVER + Mouse::reset(); + Keyboard::reset(); +#endif + } +}; + +void Minecraft::tickInput() { +#ifndef STANDALONE_SERVER + InputRAII raiiInput; + + if (screen && !screen->passEvents) { + screenMutex = true; + screen->updateEvents(); + //screen->updateSetScreen(); + screenMutex = false; + if (hasScheduledScreen) { + setScreen(scheduledScreen); + scheduledScreen = NULL; + hasScheduledScreen = false; + } + return; + } + + if (!player) { + return; + } + +#ifdef RPI + bool mouseDiggable = true; + bool allowGuiClicks = !mouseGrabbed; +#else + bool mouseDiggable = !gui.isInside(Mouse::getX(), Mouse::getY()); + bool allowGuiClicks = true; +#endif + + TIMER_PUSH("mouse"); + while (Mouse::next()) { + //if (Mouse::getButtonState(MouseAction::ACTION_LEFT)) + // LOGI("mouse-down-at: %d, %d\n", Mouse::getX(), Mouse::getY()); + int passedTime = getTimeMs() - lastTickTime; + if (passedTime > 200) continue; // @note: As long Mouse::clear CLEARS the whole buffer, it's safe to break here + // But since it might be rewritten anyway (and hopefully there aren't a lot of messages, we just continue. + + const MouseAction& e = Mouse::getEvent(); + +#ifdef RPI // If clicked when not having focus, get focus @keyboard + if (!mouseGrabbed) { + if (!screen && e.data == MouseAction::DATA_DOWN) { + grabMouse(); + } + } +#endif + + if (allowGuiClicks && e.action == MouseAction::ACTION_LEFT && e.data == MouseAction::DATA_DOWN) { + gui.handleClick(MouseAction::ACTION_LEFT, Mouse::getX(), Mouse::getY()); + } + + if (e.action == MouseAction::ACTION_WHEEL) { + Inventory* v = player->inventory; + int numSlots = gui.getNumSlots() - 1; + int slot = (v->selected - e.dy + numSlots) % numSlots; + v->selectSlot(slot); + } + /* + if (mouseDiggable && options.useMouseForDigging) { + if (Mouse::getEventButton() == MouseAction::ACTION_LEFT && Mouse::getEventButtonState()) { + handleMouseClick(MouseAction::ACTION_LEFT); + lastClickTick = ticks; + } + if (Mouse::getEventButton() == MouseAction::ACTION_RIGHT && Mouse::getEventButtonState()) { + handleMouseClick(MouseAction::ACTION_RIGHT); + lastClickTick = ticks; + } + } + */ + } + + TIMER_POP_PUSH("keyboard"); + while (Keyboard::next()) { + int key = Keyboard::getEventKey(); + bool isPressed = (Keyboard::getEventKeyState() == KeyboardAction::KEYDOWN); + player->setKey(key, isPressed); + + if (isPressed) { + gui.handleKeyPressed(key); + + #if defined(WIN32) || defined(RPI)//|| defined(_DEBUG) || defined(DEBUG) + if (key >= '0' && key <= '9') { + int digit = key - '0'; + int slot = digit - 1; + + if (slot >= 0 && slot < gui.getNumSlots()-1) + player->inventory->selectSlot(slot); + + #if defined(WIN32) + if (digit >= 1 && GetAsyncKeyState(VK_CONTROL) < 0) { + // Set adventure settings here! + AdventureSettingsPacket p(level->adventureSettings); + p.toggle((AdventureSettingsPacket::Flags)(1 << slot)); + p.fillIn(level->adventureSettings); + raknetInstance->send(p); + } + if (digit == 0) { + Pos pos((int)player->x, (int)player->y-1, (int)player->z); + SetSpawnPositionPacket p(pos); + raknetInstance->send(p); + } + #endif + } + #endif + #if defined(RPI) + if (key == Keyboard::KEY_E) { + screenChooser.setScreen(SCREEN_BLOCKSELECTION); + } + if (!screen && key == Keyboard::KEY_O || key == 250) { + releaseMouse(); + } + #endif + #if defined(WIN32) + if (key == Keyboard::KEY_F) { + options.isFlying = !options.isFlying; + player->noPhysics = options.isFlying; + } + + if (key == Keyboard::KEY_T) { + options.thirdPersonView = !options.thirdPersonView; + /* + ImprovedNoise noise; + for (int i = 0; i < 16; ++i) + printf("%d\t%f\n", i, noise.grad2(i, 3, 8)); + */ + } + + if (key == Keyboard::KEY_O) { + useAmbientOcclusion = !useAmbientOcclusion; + options.ambientOcclusion = useAmbientOcclusion; + levelRenderer->allChanged(); + } + + if (key == Keyboard::KEY_L) + options.viewDistance = (options.viewDistance + 1) % 4; + + if (key == Keyboard::KEY_U) { + onGraphicsReset(); + player->heal(100); + } + + if (key == Keyboard::KEY_B || key == 108) // Toggle the game mode + setIsCreativeMode(!isCreativeMode()); + + if (key == Keyboard::KEY_P) // Step forward in time + level->setTime( level->getTime() + 1000); + + if (key == Keyboard::KEY_G) { + setScreen(new ArmorScreen()); + /* + std::vector& boxs = level->getCubes(NULL, AABB(128.1f, 73, 128.1f, 128.9f, 74.9f, 128.9f)); + LOGI("boxes: %d\n", (int)boxs.size()); + */ + } + + if (key == Keyboard::KEY_Y) { + textures->reloadAll(); + player->hurtTo(2); + } + if (key == Keyboard::KEY_Z || key == 108) { + for (int i = 0; i < 1; ++i) { + Mob* mob = NULL; + int forceId = 0;//MobTypes::Sheep; + + int types[] = { + MobTypes::Sheep, + MobTypes::Pig, + MobTypes::Chicken, + MobTypes::Cow, + }; + + int mobType = (forceId > 0)? forceId : types[Mth::random(sizeof(types) / sizeof(int))]; + mob = MobFactory::CreateMob(mobType, level); + + //((Animal*)mob)->setAge(-1000); + float dx = 4 - 8 * Mth::random() + 4 * Mth::sin(Mth::DEGRAD * player->yRot); + float dz = 4 - 8 * Mth::random() + 4 * Mth::cos(Mth::DEGRAD * player->yRot); + if (mob && !MobSpawner::addMob(level, mob, player->x + dx, player->y, player->z + dz, Mth::random()*360, 0, true)) + delete mob; + } + } + + if (key == Keyboard::KEY_X) { + const EntityList& entities = level->getAllEntities(); + for (int i = entities.size()-1; i >= 0; --i) { + Entity* e = entities[i]; + if (!e->isPlayer()) + level->removeEntity(e); + } + } + + if (key == Keyboard::KEY_C /*|| key == 4*/) { + player->inventory->clearInventoryWithDefault(); + // @todo: Add saving here for benchmarking + } + if (key == Keyboard::KEY_H) { + setScreen( new PrerenderTilesScreen() ); + } + + if (key == Keyboard::KEY_O) { + for (int i = Inventory::MAX_SELECTION_SIZE; i < player->inventory->getContainerSize(); ++i) + if (player->inventory->getItem(i)) + player->inventory->dropSlot(i, false); + } + if (key == Keyboard::KEY_F3) { + options.renderDebug = !options.renderDebug; + } + if (key == Keyboard::KEY_M) { + options.difficulty = (options.difficulty == Difficulty::PEACEFUL)? + Difficulty::NORMAL : Difficulty::PEACEFUL; + //setIsCreativeMode( !isCreativeMode() ); + } + + if (options.renderDebug) { + if (key >= '0' && key <= '9') { + _perfRenderer->debugFpsMeterKeyPress(key - '0'); + } + } + #endif + + #ifndef RPI + if (key == 82) + pauseGame(false); + #else + if (key == Keyboard::KEY_ESCAPE) + pauseGame(false); + #endif + + #ifndef OPENGL_ES + if (key == Keyboard::KEY_P) { + static bool isWireFrame = false; + isWireFrame = !isWireFrame; + glPolygonMode(GL_FRONT, isWireFrame? GL_LINE : GL_FILL); + //glPolygonMode(GL_BACK, isWireFrame? GL_LINE : GL_FILL); + } + #endif + } + #ifdef WIN32 + if (key == Keyboard::KEY_M) { + for (int i = 0; i < 5 * SharedConstants::TicksPerSecond; ++i) + level->tick(); + } + #endif + + + //if (!isPressed) LOGI("Key released: %d\n", key); + + if (!options.useMouseForDigging) { + int passedTime = getTimeMs() - lastTickTime; + if (passedTime > 200) continue; + + // Destroy and attack is on same button + if (key == options.keyDestroy.key && isPressed) { + BuildActionIntention bai(BuildActionIntention::BAI_REMOVE | BuildActionIntention::BAI_ATTACK); + handleBuildAction(&bai); + } + else // Build and use/interact is on same button + if (key == options.keyUse.key && isPressed) { + BuildActionIntention bai(BuildActionIntention::BAI_BUILD | BuildActionIntention::BAI_INTERACT); + handleBuildAction(&bai); + } + } + } + + TIMER_POP_PUSH("tickbuild"); + BuildActionIntention bai; + // @note: This might be a problem. This method is polling based here, but + // event based when using mouse (or keys..), and in java. Not quite + // sure just yet what way to go. + bool buildHandled = inputHolder->getBuildInput()->tickBuild(player, &bai); + if (buildHandled) { + if (!bai.isRemoveContinue()) + handleBuildAction(&bai); + } + + bool isTryingToDestroyBlock = (options.useMouseForDigging + ? (Mouse::isButtonDown(MouseAction::ACTION_LEFT) && mouseDiggable) + : Keyboard::isKeyDown(options.keyDestroy.key)) + || (buildHandled && bai.isRemove()); + + TIMER_POP_PUSH("handlemouse"); +#ifdef RPI + handleMouseDown(MouseAction::ACTION_LEFT, isTryingToDestroyBlock); + handleMouseClick(buildHandled && bai.isInteract() + || options.useMouseForDigging && Mouse::isButtonDown(MouseAction::ACTION_RIGHT)); +#else + handleMouseDown(MouseAction::ACTION_LEFT, isTryingToDestroyBlock || (buildHandled && bai.isInteract())); +#endif + + lastTickTime = getTimeMs(); + + // we have (hopefully) handled the keyboard & mouse queue and it + // can now be emptied. If wanted, the reset could be changed to: + // index -= numRead; // then this code doesn't have to be placed here + // + it prepares for tick not handling all or any events. + // update: RAII'ing instead, see above + //Keyboard::reset(); + //Mouse::reset(); + + TIMER_POP(); +#endif +} + +void Minecraft::handleMouseDown(int button, bool down) { +#ifndef STANDALONE_SERVER +#ifndef RPI + if(player->isUsingItem()) { + if(!down && !Keyboard::isKeyDown(options.keyUse.key)) { + gameMode->releaseUsingItem(player); + } + return; + } +#endif + if(player->isSleeping()) { + return; + } + if (button == MouseAction::ACTION_LEFT && missTime > 0) return; + if (down && hitResult.type == TILE && button == MouseAction::ACTION_LEFT && !hitResult.indirectHit) { + int x = hitResult.x; + int y = hitResult.y; + int z = hitResult.z; + gameMode->continueDestroyBlock(x, y, z, hitResult.f); + particleEngine->crack(x, y, z, hitResult.f); + player->swing(); + } else { + gameMode->stopDestroyBlock(); + } +#endif +} + +void Minecraft::handleMouseClick(int button) { +// BuildActionIntention bai( +// (button == MouseAction::ACTION_LEFT)? +// BuildActionIntention::BAI_REMOVE +// : BuildActionIntention::BAI_BUILD); +// +// handleBuildAction(&bai); +} + +void Minecraft::handleBuildAction(BuildActionIntention* action) { +#ifndef STANDALONE_SERVER + if (action->isRemove()) { + if (missTime > 0) return; + player->swing(); + } + if(player->isUsingItem()) + return; + bool mayUse = true; + + if (!hitResult.isHit()) { + if (action->isRemove() && !gameMode->isCreativeType()) { + missTime = 10; + } + } else if (hitResult.type == ENTITY) { + if (action->isAttack()) { + player->swing(); + //LOGI("attacking!\n"); + InteractPacket packet(InteractPacket::Attack, player->entityId, hitResult.entity->entityId); + raknetInstance->send(packet); + gameMode->attack(player, hitResult.entity); + } else if (action->isInteract()) { + if (hitResult.entity->interactPreventDefault()) + mayUse = false; + //LOGI("interacting!\n"); + InteractPacket packet(InteractPacket::Interact, player->entityId, hitResult.entity->entityId); + raknetInstance->send(packet); + gameMode->interact(player, hitResult.entity); + } + } else if (hitResult.type == TILE) { + int x = hitResult.x; + int y = hitResult.y; + int z = hitResult.z; + int face = hitResult.f; + + int oldTileId = level->getTile(x, y, z); + Tile* oldTile = Tile::tiles[oldTileId]; + + //bool tryDestroyBlock = false; + + if (action->isRemove()) { + if (!oldTile) + return; + + //LOGI("tile: %s - %d, %d, %d. b: %f - %f\n", oldTile->getDescriptionId().c_str(), x, y, z, oldTile->getBrightness(level, x, y, z), oldTile->getBrightness(level, x, y+1, z)); + level->extinguishFire(x, y, z, hitResult.f); + gameMode->startDestroyBlock(x, y, z, hitResult.f); + } + else { + ItemInstance* item = player->inventory->getSelected(); + if (gameMode->useItemOn(player, level, item, x, y, z, face, hitResult.pos)) { + mayUse = false; + player->swing(); + #ifdef RPI + } else if (item && item->id == ((Item*)Item::sword_iron)->id) { + player->swing(); + #endif + } + if (item && item->count <= 0) { + player->inventory->clearSlot(player->inventory->selected); + } + //} else if (item && item->count != oldCount) { + // gameRenderer->itemInHandRenderer->itemPlaced(); + //} + } + } + if (mayUse && action->isInteract()) { + ItemInstance* item = player->inventory->getSelected(); + if (item && !player->isUsingItem()) { + if (gameMode->useItem(player, level, item)) { + gameRenderer->itemInHandRenderer->itemUsed(); + } + if (item && item->count <= 0) { + player->inventory->clearSlot(player->inventory->selected); + } + } + } +#endif +} + +bool Minecraft::isOnlineClient() +{ + return (level != NULL && level->isClientSide); +} + +bool Minecraft::isOnline() +{ + return netCallback != NULL; +} + +void Minecraft::pauseGame(bool isBackPaused) { +#ifndef STANDALONE_SERVER + if (screen != NULL) return; + screenChooser.setScreen(isBackPaused? SCREEN_PAUSEPREV : SCREEN_PAUSE); +#endif +} +void Minecraft::gameLostFocus() { +#ifndef STANDALONE_SERVER + if(screen != NULL) { + screen->lostFocus(); + } +#endif +} + + +void Minecraft::setScreen( Screen* screen ) +{ +#ifndef STANDALONE_SERVER + Mouse::reset(); + Multitouch::reset(); + Multitouch::resetThisUpdate(); + + if (screenMutex) { + hasScheduledScreen = true; + scheduledScreen = screen; + return; + } + + if (screen != NULL && screen->isErrorScreen()) + return; + if (screen == NULL && level == NULL) + screen = screenChooser.createScreen(SCREEN_STARTMENU); + + if (this->screen != NULL) { + this->screen->removed(); + delete this->screen; + } + + this->screen = screen; + if (screen != NULL) { + releaseMouse(); + //ScreenSizeCalculator ssc = new ScreenSizeCalculator(options, width, height); + int screenWidth = (int)(width * Gui::InvGuiScale); //ssc.getWidth(); + int screenHeight = (int)(height * Gui::InvGuiScale); //ssc.getHeight(); + screen->init(this, screenWidth, screenHeight); + + if (screen->isInGameScreen() && level) { + level->saveLevelData(); + level->saveGame(); + } + + //noRender = false; + } else { + grabMouse(); + } +#endif +} + +void Minecraft::grabMouse() +{ +#ifndef STANDALONE_SERVER + if (mouseGrabbed) return; + mouseGrabbed = true; + mouseHandler.grab(); + //setScreen(NULL); +#endif +} + +void Minecraft::releaseMouse() +{ +#ifndef STANDALONE_SERVER + if (!mouseGrabbed) { + return; + } + if (player) { + player->releaseAllKeys(); + } + mouseGrabbed = false; + mouseHandler.release(); +#endif +} + +bool Minecraft::useTouchscreen() { +#ifdef RPI + return false; +#endif + return options.useTouchScreen || !_supportsNonTouchscreen; +} +bool Minecraft::supportNonTouchScreen() { + return _supportsNonTouchscreen; +} +void Minecraft::init() +{ + options.minecraft = this; + options.initDefaultValues(); +#ifndef STANDALONE_SERVER + checkGlError("Init enter"); + + _supportsNonTouchscreen = !platform()->supportsTouchscreen(); + + LOGI("IS TOUCHSCREEN? %d\n", options.useTouchScreen); + + textures = new Textures(&options, platform()); + textures->addDynamicTexture(new WaterTexture()); + textures->addDynamicTexture(new WaterSideTexture()); + gui.texturesLoaded(textures); + + levelRenderer = new LevelRenderer(this); + gameRenderer = new GameRenderer(this); + particleEngine = new ParticleEngine(level, textures); + + // Platform specific initialization here + font = new Font(&options, "font/default8.png", textures); + + _perfRenderer = new PerfRenderer(this, font); + + checkGlError("Init complete"); +#endif + + user = new User("TestUser", ""); + setIsCreativeMode(false); // false means it's Survival Mode + reloadOptions(); + +} + +void Minecraft::setSize(int w, int h) { +#ifndef STANDALONE_SERVER + transformResolution(&w, &h); + + width = w; + height = h; + + if (width >= 1000) { + #ifdef __APPLE__ + Gui::GuiScale = (width > 2000)? 8.0f : 4.0f; + #else + Gui::GuiScale = 4.0f; + #endif + } + else if (width >= 800) { +#ifdef __APPLE__ + Gui::GuiScale = 4.0f; +#else + Gui::GuiScale = 3.0f; +#endif + } + else if (width >= 400) + Gui::GuiScale = 2.0f; + else + Gui::GuiScale = 1.0f; + + Gui::InvGuiScale = 1.0f / Gui::GuiScale; + int screenWidth = (int)(width * Gui::InvGuiScale); + int screenHeight = (int)(height * Gui::InvGuiScale); + + if (platform()) { + float pixelsPerMillimeter = options.getProgressValue(&Options::Option::PIXELS_PER_MILLIMETER); + pixelCalc.setPixelsPerMillimeter(pixelsPerMillimeter); + pixelCalcUi.setPixelsPerMillimeter(pixelsPerMillimeter * Gui::InvGuiScale); + } + + Config config = createConfig(this); + gui.onConfigChanged(config); + + if (screen) + screen->setSize(screenWidth, screenHeight); + + if (inputHolder) + inputHolder->onConfigChanged(config); + //LOGI("Setting size: %d, %d: %f\n", width, height, Gui::InvGuiScale); + +#ifdef WIN32 + char resbuf[128]; + sprintf(resbuf, " %d x %d @ scale %.2f", width, height, Gui::GuiScale); + //gui.addMessage(resbuf); +#endif +#endif /* STANDALONE_SERVER */ +} + +void Minecraft::reloadOptions() { + options.update(); + options.save(); + bool wasTouchscreen = options.useTouchScreen; + options.useTouchScreen = useTouchscreen(); + options.save(); + + if ((wasTouchscreen != options.useTouchScreen) || (inputHolder == 0)) + _reloadInput(); + + user->name = options.username; + + LOGI("Reloading-options\n"); + + // @todo @fix Android and iOS behaves a bit differently when leaving + // an options screen (Android recreates OpenGL surface) + setSize(width, height); +} + +void Minecraft::_reloadInput() { +#ifndef STANDALONE_SERVER + delete inputHolder; + + if (useTouchscreen()) { + inputHolder = new TouchInputHolder(this, &options); + } else { + #if defined(ANDROID) || defined(__APPLE__) + inputHolder = new CustomInputHolder( + new XperiaPlayInput(&options), + new ControllerTurnInput(2, ControllerTurnInput::MODE_DELTA), + new IBuildInput()); + #else + inputHolder = new CustomInputHolder( + new KeyboardInput(&options), + new MouseTurnInput(MouseTurnInput::MODE_DELTA, width/2, height/2), + new MouseBuildInput()); + #endif + } + + mouseHandler.setTurnInput(inputHolder->getTurnInput()); + if (level && player) { + player->input = inputHolder->getMoveInput(); + } +#endif +} + + +// +// Multiplayer +// +void Minecraft::locateMultiplayer() { + isLookingForMultiplayer = true; + + raknetInstance->pingForHosts(19132); + netCallback = new ClientSideNetworkHandler(this, raknetInstance); +} + +void Minecraft::cancelLocateMultiplayer() { + isLookingForMultiplayer = false; + + raknetInstance->stopPingForHosts(); + + delete netCallback; + netCallback = NULL; +} + +bool Minecraft::joinMultiplayer( const PingedCompatibleServer& server ) +{ + if (isLookingForMultiplayer && netCallback) { + isLookingForMultiplayer = false; + return raknetInstance->connect(server.address.ToString(false), server.address.GetPort()); + } + return false; +} + +void Minecraft::hostMultiplayer(int port) { + // Tear down last instance + raknetInstance->disconnect(); + delete netCallback; + netCallback = NULL; + +#if !defined(NO_NETWORK) + netCallback = new ServerSideNetworkHandler(this, raknetInstance); + #ifdef STANDALONE_SERVER + raknetInstance->host(user->name, port, 16); + #else + raknetInstance->host(user->name, port); + #endif +#endif +} + +// +// Level generation +// +/*static*/ + + void* Minecraft::prepareLevel_tspawn(void *p_param) +{ + Minecraft* mc = (Minecraft*) p_param; + mc->generateLevel("Currently not used", mc->level); + return 0; +} + +void Minecraft::generateLevel( const std::string& message, Level* level ) +{ + Stopwatch s; + s.start(); + prepareLevel(message); + s.stop(); + s.print("Level generated: "); + + // "Unlock" + isGeneratingLevel = false; +} + +void Minecraft::_levelGenerated() +{ +#ifndef STANDALONE_SERVER + if (player == NULL) { + player = (LocalPlayer*) gameMode->createPlayer(level); + gameMode->initPlayer(player); + } + + if (player) { + player->input = inputHolder->getMoveInput(); + } + + if (levelRenderer != NULL) levelRenderer->setLevel(level); + if (particleEngine != NULL) particleEngine->setLevel(level); + + gameMode->adjustPlayer(player); + gui.onLevelGenerated(); +#endif + + level->validateSpawn(); + level->loadPlayer(player, true); + // if we are client side, we trust the server to have given us a correct position + if (player && !level->isClientSide) { + player->resetPos(false); + } + + this->cameraTargetPlayer = player; + + if (raknetInstance->isServer()) + raknetInstance->announceServer(user->name); + + if (netCallback) { + netCallback->levelGenerated(level); + } + +#if defined(WIN32) || defined(RPI) + if (_commandServer) { + delete _commandServer; + } + _commandServer = new CommandServer(this); + _commandServer->init(commandPort); +#endif + + // Hack to (hopefully) get the players to show (note: in LevelListener + // instead, since adding yourself always generates a entityAdded) + //EntityRenderDispatcher::getInstance()->onGraphicsReset(); + _hasSignaledGeneratingLevelFinished = true; +} + +Player* Minecraft::respawnPlayer(int playerId) { + for (unsigned int i = 0; i < level->players.size(); ++i) { + if (level->players[i]->entityId == playerId) { + resetPlayer(level->players[i]); + return level->players[i]; + } + } + return NULL; +} + +void Minecraft::resetPlayer(Player* player) { + level->validateSpawn(); + player->reset(); + + Pos p; + if(player->hasRespawnPosition()) { + p = player->getRespawnPosition(); + } + else { + p = level->getSharedSpawnPos(); + } + player->setPos((float)p.x + 0.5f, (float)p.y + 1.0f, (float)p.z + 0.5f); + player->resetPos(true); + + if (isCreativeMode()) + player->inventory->clearInventoryWithDefault(); +} + +void Minecraft::respawnPlayer() { + // RESET THE FRACKING PLAYER HERE + //bool slowCheck = false; + //for (int i = 0; i < level->entities.size(); ++i) + // if (level->entities[i] == player) slowCheck = true; + // + //LOGI("Has entity? %d, %d\n", level->getEntity(player->entityId), slowCheck); + + resetPlayer(player); + + // tell server (or other client) that we re-spawned + RespawnPacket packet(player); + raknetInstance->send(packet); +} + +void Minecraft::onGraphicsReset() +{ +#ifndef STANDALONE_SERVER + textures->clear(); + + font->onGraphicsReset(); + gui.onGraphicsReset(); + + if (levelRenderer) levelRenderer->onGraphicsReset(); + if (gameRenderer) gameRenderer->onGraphicsReset(); + + EntityRenderDispatcher::getInstance()->onGraphicsReset(); + TileEntityRenderDispatcher::getInstance()->onGraphicsReset(); +#endif +} + +int Minecraft::getProgressStatusId() { + return progressStageStatusId; +} + +const char* Minecraft::getProgressMessage() +{ + return progressMessages[progressStageStatusId]; +} + +bool Minecraft::isLevelGenerated() +{ + return level != NULL && !isGeneratingLevel; +} + +LevelStorageSource* Minecraft::getLevelSource() +{ + return storageSource; +} + +int Minecraft::getLicenseId() { + if (!LicenseCodes::isReady(_licenseId)) + _licenseId = platform()->checkLicense(); + return _licenseId; +} + +void Minecraft::audioEngineOn() { +#ifndef STANDALONE_SERVER + soundEngine->enable(true); +#endif +} +void Minecraft::audioEngineOff() { +#ifndef STANDALONE_SERVER + soundEngine->enable(false); +#endif +} + +void Minecraft::setIsCreativeMode(bool isCreative) +{ +#ifdef CREATORMODE + delete gameMode; + gameMode = new CreatorMode(this); + _isCreativeMode = true; +#else + if (!gameMode || isCreative != _isCreativeMode) + { + delete gameMode; + if (isCreative) gameMode = new CreativeMode(this); + else gameMode = new SurvivalMode(this); + _isCreativeMode = isCreative; + } +#endif + if (player) + gameMode->initAbilities(player->abilities); +} + +bool Minecraft::isCreativeMode() { + return _isCreativeMode; +} + +bool Minecraft::isKindleFire(int kindleVersion) { + if (kindleVersion != 1) + return false; + + std::string model = platform()->getPlatformStringVar(PlatformStringVars::DEVICE_BUILD_MODEL); + std::string modelLower(model); + std::transform(modelLower.begin(), modelLower.end(), modelLower.begin(), tolower); + + return (modelLower.find("kindle") != std::string::npos) && (modelLower.find("fire") != std::string::npos); +} + +bool Minecraft::transformResolution(int* w, int* h) +{ + bool changed = false; + + // Kindle Fire 1: reporting wrong height in + // certain cases (e.g. after screen lock) + if (isKindleFire(1) && *h >= 560 && *h <= 620) { + *h = 580; + changed = true; + } + + return changed; +} + +ICreator* Minecraft::getCreator() +{ +#ifdef CREATORMODE + return ((CreatorMode*)gameMode)->getCreator(); +#else + return NULL; +#endif +} + +void Minecraft::optionUpdated( const Options::Option* option, bool value ) { + if(netCallback != NULL && option == &Options::Option::SERVER_VISIBLE) { + ServerSideNetworkHandler* ss = (ServerSideNetworkHandler*) netCallback; + ss->allowIncomingConnections(value); + } +} + +void Minecraft::optionUpdated( const Options::Option* option, float value ) { +#ifndef STANDALONE_SERVER + if(option == &Options::Option::PIXELS_PER_MILLIMETER) { + pixelCalcUi.setPixelsPerMillimeter(value * Gui::InvGuiScale); + pixelCalc.setPixelsPerMillimeter(value); + } +#endif +} + +void Minecraft::optionUpdated( const Options::Option* option, int value ) { + +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/BA89C7AF1569F642860486F4AC0590EF/4BEB5D35CFBDA04581DC57DA21777F4C/C21146B4629208B695025B2B1BC6B79C b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/BA89C7AF1569F642860486F4AC0590EF/4BEB5D35CFBDA04581DC57DA21777F4C/C21146B4629208B695025B2B1BC6B79C new file mode 100644 index 0000000..536dbe1 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/BA89C7AF1569F642860486F4AC0590EF/4BEB5D35CFBDA04581DC57DA21777F4C/C21146B4629208B695025B2B1BC6B79C @@ -0,0 +1,258 @@ +#include "Screen.h" +#include "components/Button.h" +#include "components/TextBox.h" +#include "../Minecraft.h" +#include "../renderer/Tesselator.h" +#include "../sound/SoundEngine.h" +#include "../../platform/input/Keyboard.h" +#include "../../platform/input/Mouse.h" +#include "../renderer/Textures.h" +#include "../gui/screens/ScreenChooser.h" + +Screen::Screen() +: passEvents(false), + clickedButton(NULL), + tabButtonIndex(0), + width(1), + height(1), + minecraft(NULL), + font(NULL) +{ +} + +void Screen::render( int xm, int ym, float a ) +{ + for (unsigned int i = 0; i < buttons.size(); i++) { + Button* button = buttons[i]; + button->render(minecraft, xm, ym); + } +} + +void Screen::init( Minecraft* minecraft, int width, int height ) +{ + //particles = /*new*/ GuiParticles(minecraft); + this->minecraft = minecraft; + this->font = minecraft->font; + this->width = width; + this->height = height; + init(); + setupPositions(); + updateTabButtonSelection(); +} + +void Screen::init() +{ +} + +void Screen::setSize( int width, int height ) +{ + this->width = width; + this->height = height; + setupPositions(); +} + +bool Screen::handleBackEvent( bool isDown ) +{ + return false; +} + +void Screen::updateEvents() +{ + if (passEvents) + return; + + while (Mouse::next()) + mouseEvent(); + + while (Keyboard::next()) + keyboardEvent(); + while (Keyboard::nextTextChar()) + keyboardTextEvent(); +} + +void Screen::mouseEvent() +{ + const MouseAction& e = Mouse::getEvent(); + if (!e.isButton()) + return; + + if (Mouse::getEventButtonState()) { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseClicked(xm, ym, Mouse::getEventButton()); + } else { + int xm = e.x * width / minecraft->width; + int ym = e.y * height / minecraft->height - 1; + mouseReleased(xm, ym, Mouse::getEventButton()); + } +} + +void Screen::keyboardEvent() +{ + if (Keyboard::getEventKeyState()) { + //if (Keyboard.getEventKey() == Keyboard.KEY_F11) { + // minecraft->toggleFullScreen(); + // return; + //} + keyPressed(Keyboard::getEventKey()); + } +} +void Screen::keyboardTextEvent() +{ + keyboardNewChar(Keyboard::getChar()); +} +void Screen::renderBackground() +{ + renderBackground(0); +} + +void Screen::renderBackground( int vo ) +{ + if (minecraft->isLevelGenerated()) { + fillGradient(0, 0, width, height, 0xc0101010, 0xd0101010); + } else { + renderDirtBackground(vo); + } +} + +void Screen::renderDirtBackground( int vo ) +{ + //glDisable2(GL_LIGHTING); + glDisable2(GL_FOG); + Tesselator& t = Tesselator::instance; + minecraft->textures->loadAndBindTexture("gui/background.png"); + glColor4f2(1, 1, 1, 1); + float s = 32; + float fvo = (float) vo; + t.begin(); + t.color(0x404040); + t.vertexUV(0, (float)height, 0, 0, height / s + fvo); + t.vertexUV((float)width, (float)height, 0, width / s, (float)height / s + fvo); + t.vertexUV((float)width, 0, 0, (float)width / s, 0 + fvo); + t.vertexUV(0, 0, 0, 0, 0 + fvo); + t.draw(); +} + +bool Screen::isPauseScreen() +{ + return true; +} + +bool Screen::isErrorScreen() +{ + return false; +} + +bool Screen::isInGameScreen() +{ + return true; +} + +bool Screen::closeOnPlayerHurt() { + return false; +} + +void Screen::keyPressed( int eventKey ) +{ + if (eventKey == Keyboard::KEY_ESCAPE) { + printf("bruh this thing got pressed\n"); + Screen* screen = minecraft->screenChooser.createScreen(SCREEN_PAUSE); + minecraft->setScreen(screen); + //minecraft->grabMouse(); + } + if (minecraft->useTouchscreen()) + return; + + // "Tabbing" the buttons (walking with keys) + const int tabButtonCount = tabButtons.size(); + if (!tabButtonCount) + return; + + Options& o = minecraft->options; + if (eventKey == o.keyMenuNext.key) + if (++tabButtonIndex == tabButtonCount) tabButtonIndex = 0; + if (eventKey == o.keyMenuPrevious.key) + if (--tabButtonIndex == -1) tabButtonIndex = tabButtonCount-1; + if (eventKey == o.keyMenuOk.key) { + Button* button = tabButtons[tabButtonIndex]; + if (button->active) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); + } + } + + updateTabButtonSelection(); +} + +void Screen::updateTabButtonSelection() +{ + if (minecraft->useTouchscreen()) + return; + + for (unsigned int i = 0; i < tabButtons.size(); ++i) + tabButtons[i]->selected = (i == tabButtonIndex); +} + +void Screen::mouseClicked( int x, int y, int buttonNum ) +{ + if (buttonNum == MouseAction::ACTION_LEFT) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + //LOGI("Hit-testing button: %p\n", button); + if (button->clicked(minecraft, x, y)) { + button->setPressed(); + + //LOGI("Hit-test successful: %p\n", button); + clickedButton = button; +/* +#if !defined(ANDROID) && !defined(__APPLE__) //if (!minecraft->isTouchscreen()) { + minecraft->soundEngine->playUI("random.click", 1, 1); + buttonClicked(button); +#endif } +*/ + } + } + } +} + +void Screen::mouseReleased( int x, int y, int buttonNum ) +{ + //LOGI("b_id: %d, (%p), text: %s\n", buttonNum, clickedButton, clickedButton?clickedButton->msg.c_str():""); + if (!clickedButton || buttonNum != MouseAction::ACTION_LEFT) return; + +#if 1 +//#if defined(ANDROID) || defined(__APPLE__) //if (minecraft->isTouchscreen()) { + for (unsigned int i = 0; i < buttons.size(); ++i) { + Button* button = buttons[i]; + if (clickedButton == button && button->clicked(minecraft, x, y)) { + buttonClicked(button); + minecraft->soundEngine->playUI("random.click", 1, 1); + clickedButton->released(x, y); + } + } +# else // } else { + clickedButton->released(x, y); +#endif // } + clickedButton = NULL; +} + +bool Screen::renderGameBehind() { + return true; +} + +bool Screen::hasClippingArea( IntRectangle& out ) +{ + return false; +} + +void Screen::lostFocus() { + for(std::vector::iterator it = textBoxes.begin(); it != textBoxes.end(); ++it) { + TextBox* tb = *it; + tb->loseFocus(minecraft); + } +} + +void Screen::toGUICoordinate( int& x, int& y ) { + x = x * width / minecraft->width; + y = y * height / minecraft->height - 1; +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/BA89C7AF1569F642860486F4AC0590EF/4BEB5D35CFBDA04581DC57DA21777F4C/C556F60E082BF7C9C8BD04269EAAFACD b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/BA89C7AF1569F642860486F4AC0590EF/4BEB5D35CFBDA04581DC57DA21777F4C/C556F60E082BF7C9C8BD04269EAAFACD new file mode 100644 index 0000000..2c2d557 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/BA89C7AF1569F642860486F4AC0590EF/4BEB5D35CFBDA04581DC57DA21777F4C/C556F60E082BF7C9C8BD04269EAAFACD @@ -0,0 +1,1556 @@ +#include "Minecraft.h" + +#if defined(APPLE_DEMO_PROMOTION) + #define NO_NETWORK +#endif + +#if defined(RPI) + #define CREATORMODE +#endif + +#include "../network/RakNetInstance.h" +#include "../network/ClientSideNetworkHandler.h" +#include "../network/ServerSideNetworkHandler.h" +//#include "../network/Packet.h" +#include "../world/entity/player/Inventory.h" +#include "../world/level/chunk/ChunkCache.h" +#include "../world/level/tile/Tile.h" +#include "../world/level/storage/LevelStorageSource.h" +#include "../world/level/storage/LevelStorage.h" +#include "player/input/KeyboardInput.h" +#ifndef STANDALONE_SERVER +#include "player/input/touchscreen/TouchInputHolder.h" +#endif +#include "player/LocalPlayer.h" +#include "gamemode/CreativeMode.h" +#include "gamemode/SurvivalMode.h" +#include "player/LocalPlayer.h" +#ifndef STANDALONE_SERVER +#include "particle/ParticleEngine.h" +#include "gui/Screen.h" +#include "gui/Font.h" +#include "gui/screens/RenameMPLevelScreen.h" +#include "sound/SoundEngine.h" +#endif +#include "../platform/CThread.h" +#include "../platform/input/Mouse.h" +#include "../AppPlatform.h" +#include "../Performance.h" +#include "../LicenseCodes.h" +#include "../util/PerfTimer.h" +#include "../util/PerfRenderer.h" +#include "player/input/MouseBuildInput.h" + +#include "../world/Facing.h" + +#include "../network/packet/PlaceBlockPacket.h" + +#include "player/input/IInputHolder.h" +#ifndef STANDALONE_SERVER +#include "player/input/touchscreen/TouchscreenInput.h" + +#include "player/input/ControllerTurnInput.h" +#include "player/input/XperiaPlayInput.h" + +#endif + +#include "player/input/MouseTurnInput.h" +#include "../world/entity/MobFactory.h" +#include "../world/level/MobSpawner.h" +#include "../util/Mth.h" +#include "../network/packet/InteractPacket.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/PrerenderTilesScreen.h" +#include "renderer/Textures.h" +#include "gui/screens/DeathScreen.h" +#endif + +#include "../network/packet/RespawnPacket.h" +#include "IConfigListener.h" +#include "../world/entity/MobCategory.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/FurnaceScreen.h" +#endif +#include "../world/Difficulty.h" +#include "../server/ServerLevel.h" +#ifdef CREATORMODE +#include "../server/CreatorLevel.h" +#endif +#include "../network/packet/AdventureSettingsPacket.h" +#include "../network/packet/SetSpawnPositionPacket.h" +#include "../network/command/CommandServer.h" +#include "gamemode/CreatorMode.h" +#ifndef STANDALONE_SERVER +#include "gui/screens/ArmorScreen.h" +#endif +#include "../world/level/levelgen/synth/ImprovedNoise.h" +#ifndef STANDALONE_SERVER +#include "renderer/tileentity/TileEntityRenderDispatcher.h" +#endif + +#ifndef STANDALONE_SERVER +#include "renderer/ptexture/DynamicTexture.h" +#include "renderer/GameRenderer.h" +#include "renderer/ItemInHandRenderer.h" +#include "renderer/LevelRenderer.h" +#include "renderer/entity/EntityRenderDispatcher.h" +#include "gui/Screen.h" +#include "gui/Font.h" +#include "gui/screens/RenameMPLevelScreen.h" +#include "sound/SoundEngine.h" +#endif + +static void checkGlError(const char* tag) { +#ifdef GLDEBUG + while (1) { + const int errCode = glGetError(); + if (errCode == GL_NO_ERROR) break; + + LOGE("################\nOpenGL-error @ %s : #%d\n", tag, errCode); + } +#endif /*GLDEBUG*/ +} + +/*static*/ +const char* Minecraft::progressMessages[] = { + "Locating server", + "Building terrain", + "Preparing", + "Saving chunks" +}; + +int Minecraft::customDebugId = Minecraft::CDI_NONE; + +#if defined(_MSC_VER) + #pragma warning( disable : 4355 ) // 'this' pointer in initialization list which is perfectly legal +#endif + +bool Minecraft::useAmbientOcclusion = false; + +Minecraft::Minecraft() +: user(NULL), + level(NULL), + player(NULL), + cameraTargetPlayer(NULL), + levelRenderer(NULL), + gameRenderer(NULL), +#ifndef STANDALONE_SERVER + particleEngine(NULL), + _perfRenderer(NULL), +#endif + _commandServer(NULL), +#ifndef STANDALONE_SERVER + textures(NULL), +#endif + lastTickTime(-1), + lastTime(0), + ticksSinceLastUpdate(0), + gameMode(NULL), + mouseGrabbed(true), + missTime(0), + pause(false), + _running(false), + timer(20), +#ifndef STANDALONE_SERVER + gui(this), +#endif + netCallback(NULL), +#ifndef STANDALONE_SERVER + screen(NULL), + font(NULL), +#endif + screenMutex(false), +#ifndef STANDALONE_SERVER + scheduledScreen(NULL), + hasScheduledScreen(false), + soundEngine(NULL), +#endif + ticks(0), + isGeneratingLevel(false), + _hasSignaledGeneratingLevelFinished(true), + generateLevelThread(NULL), + progressStagePercentage(0), + progressStageStatusId(0), + isLookingForMultiplayer(false), + _licenseId(LicenseCodes::WAIT_PLATFORM_NOT_READY), + inputHolder(0), + _supportsNonTouchscreen(false), +#ifndef STANDALONE_SERVER + screenChooser(this), +#endif + width(1), height(1), + //_respawnPlayerTicks(-1), +#ifdef __APPLE__ + _isSuperFast(false), +#endif + _powerVr(false), + commandPort(4711), + reserved_d1(0),reserved_d2(0), + reserved_f1(0),reserved_f2(0) +{ +//#ifdef ANDROID + +#if defined(NO_NETWORK) + raknetInstance = new IRakNetInstance(); +#else + raknetInstance = new RakNetInstance(); +#endif +#ifndef STANDALONE_SERVER + soundEngine = new SoundEngine(20.0f); + soundEngine->init(this, &options); +#endif + //setupPieces(); +} + +Minecraft::~Minecraft() +{ + delete netCallback; + delete raknetInstance; +#ifndef STANDALONE_SERVER + delete levelRenderer; + delete gameRenderer; + delete particleEngine; + + delete soundEngine; +#endif + delete gameMode; +#ifndef STANDALONE_SERVER + delete font; + delete textures; + + if (screen != NULL) { + delete screen; + screen = NULL; + } +#endif + if (level != NULL) { + level->saveGame(); + if (level->getChunkSource()) + level->getChunkSource()->saveAll(true); + delete level->getLevelStorage(); + delete level; + level = NULL; + } + + //delete player; + delete user; + delete inputHolder; + + delete storageSource; + delete _perfRenderer; + delete _commandServer; + + MobFactory::clearStaticTestMobs(); +#ifndef STANDALONE_SERVER + EntityRenderDispatcher::destroy(); +#endif +} + +// Only called by server +void Minecraft::selectLevel( const std::string& levelId, const std::string& levelName, const LevelSettings& settings ) +{ +#if defined(CREATORMODE) + level = new CreatorLevel( +#else + level = new ServerLevel( +#endif + storageSource->selectLevel(levelId, false), + levelName, + settings, + SharedConstants::GeneratorVersion); + + // note: settings is useless beyond this point, since it's + // either copied to LevelData (or LevelData read from file) + setLevel(level, "Generating level"); + setIsCreativeMode(level->getLevelData()->getGameType() == GameType::Creative); + _running = true; +} + +void Minecraft::setLevel(Level* level, const std::string& message /* ="" */, LocalPlayer* forceInsertPlayer /* = NULL */) { + cameraTargetPlayer = NULL; + LOGI("Seed is %ld\n", level->getSeed()); + + if (level != NULL) { + level->raknetInstance = raknetInstance; + gameMode->initLevel(level); + + if (!player && forceInsertPlayer) + { + player = forceInsertPlayer; + player->resetPos(false); + //level->addEntity(forceInsertPlayer); + } + else if (player != NULL) { + player->resetPos(false); + if (level != NULL) { + level->addEntity(player); + } + } + this->level = level; + _hasSignaledGeneratingLevelFinished = false; +#ifdef STANDALONE_SERVER + const bool threadedLevelCreation = false; +#else + const bool threadedLevelCreation = true; +#endif + + if (threadedLevelCreation) { + // Threaded + // "Lock" + isGeneratingLevel = true; + generateLevelThread = new CThread(Minecraft::prepareLevel_tspawn, this); + } else { + // Non-threaded + generateLevel("Currently not used", level); + } + } else { + player = NULL; + } + + this->lastTickTime = 0; + this->_running = true; +} + +void Minecraft::leaveGame(bool renameLevel /*=false*/) +{ + if (isGeneratingLevel || !_hasSignaledGeneratingLevelFinished) + return; + + isGeneratingLevel = false; + bool saveLevel = level && (!level->isClientSide || renameLevel); + + raknetInstance->disconnect(); + if (saveLevel) { + // If server or wanting to save level as client, save all unsaved chunks! + level->getChunkSource()->saveAll(true); + } + + LOGI("Clearing levels\n"); + + cameraTargetPlayer = NULL; +#ifndef STANDALONE_SERVER + levelRenderer->setLevel(NULL); + particleEngine->setLevel(NULL); +#endif + LOGI("Erasing callback\n"); + delete netCallback; + netCallback = NULL; + + LOGI("Erasing level\n"); + if (level != NULL) { + delete level->getLevelStorage(); + delete level; + level = NULL; + } + //delete player; + player = NULL; + cameraTargetPlayer = NULL; + + _running = false; +#ifndef STANDALONE_SERVER + if (renameLevel) { + setScreen(new RenameMPLevelScreen(LevelStorageSource::TempLevelId)); + } + else + screenChooser.setScreen(SCREEN_STARTMENU); +#endif +} + +void Minecraft::prepareLevel(const std::string& title) { + LOGI("status: 1\n"); + progressStageStatusId = 1; + + Stopwatch A, B, C, D; + A.start(); + + Stopwatch L; + + // Dont update lights if we load the level (ok, actually just with leveldata version=1.+(?)) + if (!level->isNew()) + level->setUpdateLights(false); + + int Max = CHUNK_CACHE_WIDTH * CHUNK_CACHE_WIDTH; + int pp = 0; + for (int x = 8; x < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); x += CHUNK_WIDTH) { + for (int z = 8; z < (CHUNK_CACHE_WIDTH * CHUNK_WIDTH); z += CHUNK_WIDTH) { + progressStagePercentage = 100 * pp++ / Max; + //printf("level generation progress %d\n", progressStagePercentage); + B.start(); + level->getTile(x, 64, z); + B.stop(); + L.start(); + if (level->isNew()) + while (level->updateLights()) + ; + L.stop(); + } + } + A.stop(); + level->setUpdateLights(true); + + C.start(); + for (int x = 0; x < CHUNK_CACHE_WIDTH; x++) + { + for (int z = 0; z < CHUNK_CACHE_WIDTH; z++) + { + LevelChunk* chunk = level->getChunk(x, z); + if (chunk && !chunk->createdFromSave) + { + chunk->unsaved = false; + chunk->clearUpdateMap(); + } + } + } + C.stop(); + + LOGI("status: 3\n"); + progressStageStatusId = 3; + if (level->isNew()) { + level->setInitialSpawn(); // @note: should obviously be called from Level itself + level->saveLevelData(); + level->getChunkSource()->saveAll(false); + level->saveGame(); + } else { + level->saveLevelData(); + level->loadEntities(); + } + + progressStagePercentage = -1; + progressStageStatusId = 2; + LOGI("status: 2\n"); + + D.start(); + level->prepare(); + D.stop(); + + A.print("Generate level: "); + L.print(" - light: "); + B.print(" - getTl: "); + C.print(" - clear: "); + D.print(" - prepr: "); + progressStageStatusId = 0; +} + +void Minecraft::update() { + //LOGI("Enter Update\n"); + + if (Options::debugGl) + LOGI(">>>>>>>>>>\n"); + + TIMER_PUSH("root"); + + //if (level) { + // LOGI("numplayers: %d\n", level->players.size()); + // for (int i = 0; i < level->players.size(); ++i) { + // Player* p = level->players[i]; + // bool inEnt = std::find(level->entities.begin(), level->entities.end(), p) != level->entities.end(); + // LOGI(" %p, %d, %d - in? %d\n", p, p->entityId, p->owner.ToUint32(p->owner), inEnt); + // } + //} + + if (pause && level != NULL) { + float lastA = timer.a; + timer.advanceTime(); + timer.a = lastA; + } else { + timer.advanceTime(); + } + + if (raknetInstance) { + raknetInstance->runEvents(netCallback); + } + + TIMER_PUSH("tick"); + int toTick = timer.ticks; + for (int i = 0; i < toTick; ++i, ++ticks) + tick(i, toTick-1); + + TIMER_POP_PUSH("updatelights"); + if (level && !isGeneratingLevel) { + level->updateLights(); + } + TIMER_POP(); + + #ifndef STANDALONE_SERVER + if (gameMode != NULL) gameMode->render(timer.a); + TIMER_PUSH("sound"); + soundEngine->update(player, timer.a); + TIMER_POP_PUSH("render"); + gameRenderer->render(timer.a); + TIMER_POP(); + #else + CThread::sleep(1); + #endif +#ifndef STANDALONE_SERVER + Multitouch::resetThisUpdate(); +#endif + TIMER_POP(); +#ifndef STANDALONE_SERVER + checkGlError("Update finished"); + + if (options.renderDebug) { + if (!PerfTimer::enabled) { + PerfTimer::reset(); + PerfTimer::enabled = true; + } + + //TIMER_PUSH("debugfps"); + _perfRenderer->renderFpsMeter(1); + checkGlError("render debug"); + //TIMER_POP(); + } else { + PerfTimer::enabled = false; + } +#endif + //LOGI("Exit Update\n"); +} + +void Minecraft::tick(int nTick, int maxTick) { + if (missTime > 0) missTime--; +#ifndef STANDALONE_SERVER + if (!screen && player) { + if (player->health <= 0) { + setScreen(new DeathScreen()); + } + } +#endif + TIMER_PUSH("gameMode"); + if (level && !pause) { + gameMode->tick(); + } + + TIMER_POP_PUSH("commandServer"); + if (level && _commandServer) { + _commandServer->tick(); + } + + TIMER_POP_PUSH("input"); + tickInput(); +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("gui"); + gui.tick(); +#endif + // + // Ongoing level generation in a (perhaps) different thread. When it's + // ready, _levelGenerated() is called once and any threads are deleted. + // + if (isGeneratingLevel) { + return; + } else if (!_hasSignaledGeneratingLevelFinished) { + if (generateLevelThread) { + delete generateLevelThread; + generateLevelThread = NULL; + } + _levelGenerated(); + } + + // + // Normal game loop, run before or efter level generation + // + if (level != NULL) + { + if (!pause) { +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("gameRenderer"); + gameRenderer->tick(nTick, maxTick); + + TIMER_POP_PUSH("levelRenderer"); + levelRenderer->tick(); +#endif + level->difficulty = options.difficulty; + if (level->isClientSide) level->difficulty = Difficulty::EASY; + + TIMER_POP_PUSH("level"); + level->tickEntities(); + level->tick(); +#ifndef STANDALONE_SERVER + TIMER_POP_PUSH("animateTick"); + if (player) { + level->animateTick(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z)); + } +#endif + } + } +#ifndef STANDALONE_SERVER + textures->loadAndBindTexture("terrain.png"); + if (!pause && !(screen && !screen->renderGameBehind())) { + #if !defined(RPI) + #ifdef __APPLE__ + if (isSuperFast()) + #endif + { + if (nTick == maxTick) { + TIMER_POP_PUSH("textures"); + textures->tick(true); + } + } + #endif + } + TIMER_POP_PUSH("particles"); + particleEngine->tick(); + if (screen) { + screenMutex = true; + screen->tick(); + screenMutex = false; + } + + // @note: fix to keep "isPressed" and "isReleased" as long as necessary. + // Most likely keyboard and mouse could/should be reset here as well. + Multitouch::reset(); +#endif + TIMER_POP(); +} + +class InputRAII { +public: + ~InputRAII() { +#ifndef STANDALONE_SERVER + Mouse::reset(); + Keyboard::reset(); +#endif + } +}; + +void Minecraft::tickInput() { +#ifndef STANDALONE_SERVER + InputRAII raiiInput; + + if (screen && !screen->passEvents) { + screenMutex = true; + screen->updateEvents(); + //screen->updateSetScreen(); + screenMutex = false; + if (hasScheduledScreen) { + setScreen(scheduledScreen); + scheduledScreen = NULL; + hasScheduledScreen = false; + } + return; + } + + if (!player) { + return; + } + +#ifdef RPI + bool mouseDiggable = true; + bool allowGuiClicks = !mouseGrabbed; +#else + bool mouseDiggable = !gui.isInside(Mouse::getX(), Mouse::getY()); + bool allowGuiClicks = true; +#endif + + TIMER_PUSH("mouse"); + while (Mouse::next()) { + //if (Mouse::getButtonState(MouseAction::ACTION_LEFT)) + // LOGI("mouse-down-at: %d, %d\n", Mouse::getX(), Mouse::getY()); + int passedTime = getTimeMs() - lastTickTime; + if (passedTime > 200) continue; // @note: As long Mouse::clear CLEARS the whole buffer, it's safe to break here + // But since it might be rewritten anyway (and hopefully there aren't a lot of messages, we just continue. + + const MouseAction& e = Mouse::getEvent(); + +#ifdef RPI // If clicked when not having focus, get focus @keyboard + if (!mouseGrabbed) { + if (!screen && e.data == MouseAction::DATA_DOWN) { + grabMouse(); + } + } +#endif + + if (allowGuiClicks && e.action == MouseAction::ACTION_LEFT && e.data == MouseAction::DATA_DOWN) { + gui.handleClick(MouseAction::ACTION_LEFT, Mouse::getX(), Mouse::getY()); + } + + if (e.action == MouseAction::ACTION_WHEEL) { + Inventory* v = player->inventory; + int numSlots = gui.getNumSlots() - 1; + int slot = (v->selected - e.dy + numSlots) % numSlots; + v->selectSlot(slot); + } + /* + if (mouseDiggable && options.useMouseForDigging) { + if (Mouse::getEventButton() == MouseAction::ACTION_LEFT && Mouse::getEventButtonState()) { + handleMouseClick(MouseAction::ACTION_LEFT); + lastClickTick = ticks; + } + if (Mouse::getEventButton() == MouseAction::ACTION_RIGHT && Mouse::getEventButtonState()) { + handleMouseClick(MouseAction::ACTION_RIGHT); + lastClickTick = ticks; + } + } + */ + } + + TIMER_POP_PUSH("keyboard"); + while (Keyboard::next()) { + int key = Keyboard::getEventKey(); + bool isPressed = (Keyboard::getEventKeyState() == KeyboardAction::KEYDOWN); + player->setKey(key, isPressed); + + if (isPressed) { + gui.handleKeyPressed(key); + + #if defined(WIN32) || defined(RPI)//|| defined(_DEBUG) || defined(DEBUG) + if (key >= '0' && key <= '9') { + int digit = key - '0'; + int slot = digit - 1; + + if (slot >= 0 && slot < gui.getNumSlots()-1) + player->inventory->selectSlot(slot); + + #if defined(WIN32) + if (digit >= 1 && GetAsyncKeyState(VK_CONTROL) < 0) { + // Set adventure settings here! + AdventureSettingsPacket p(level->adventureSettings); + p.toggle((AdventureSettingsPacket::Flags)(1 << slot)); + p.fillIn(level->adventureSettings); + raknetInstance->send(p); + } + if (digit == 0) { + Pos pos((int)player->x, (int)player->y-1, (int)player->z); + SetSpawnPositionPacket p(pos); + raknetInstance->send(p); + } + #endif + } + #endif + #if defined(RPI) + if (key == Keyboard::KEY_E) { + screenChooser.setScreen(SCREEN_BLOCKSELECTION); + } + if (!screen && key == Keyboard::KEY_O || key == 250) { + releaseMouse(); + } + #endif + #if defined(WIN32) + if (key == Keyboard::KEY_F) { + options.isFlying = !options.isFlying; + player->noPhysics = options.isFlying; + } + + if (key == Keyboard::KEY_T) { + options.thirdPersonView = !options.thirdPersonView; + /* + ImprovedNoise noise; + for (int i = 0; i < 16; ++i) + printf("%d\t%f\n", i, noise.grad2(i, 3, 8)); + */ + } + + if (key == Keyboard::KEY_O) { + useAmbientOcclusion = !useAmbientOcclusion; + options.ambientOcclusion = useAmbientOcclusion; + levelRenderer->allChanged(); + } + + if (key == Keyboard::KEY_L) + options.viewDistance = (options.viewDistance + 1) % 4; + + if (key == Keyboard::KEY_U) { + onGraphicsReset(); + player->heal(100); + } + + if (key == Keyboard::KEY_B || key == 108) // Toggle the game mode + setIsCreativeMode(!isCreativeMode()); + + if (key == Keyboard::KEY_P) // Step forward in time + level->setTime( level->getTime() + 1000); + + if (key == Keyboard::KEY_G) { + setScreen(new ArmorScreen()); + /* + std::vector& boxs = level->getCubes(NULL, AABB(128.1f, 73, 128.1f, 128.9f, 74.9f, 128.9f)); + LOGI("boxes: %d\n", (int)boxs.size()); + */ + } + + if (key == Keyboard::KEY_Y) { + textures->reloadAll(); + player->hurtTo(2); + } + if (key == Keyboard::KEY_Z || key == 108) { + for (int i = 0; i < 1; ++i) { + Mob* mob = NULL; + int forceId = 0;//MobTypes::Sheep; + + int types[] = { + MobTypes::Sheep, + MobTypes::Pig, + MobTypes::Chicken, + MobTypes::Cow, + }; + + int mobType = (forceId > 0)? forceId : types[Mth::random(sizeof(types) / sizeof(int))]; + mob = MobFactory::CreateMob(mobType, level); + + //((Animal*)mob)->setAge(-1000); + float dx = 4 - 8 * Mth::random() + 4 * Mth::sin(Mth::DEGRAD * player->yRot); + float dz = 4 - 8 * Mth::random() + 4 * Mth::cos(Mth::DEGRAD * player->yRot); + if (mob && !MobSpawner::addMob(level, mob, player->x + dx, player->y, player->z + dz, Mth::random()*360, 0, true)) + delete mob; + } + } + + if (key == Keyboard::KEY_X) { + const EntityList& entities = level->getAllEntities(); + for (int i = entities.size()-1; i >= 0; --i) { + Entity* e = entities[i]; + if (!e->isPlayer()) + level->removeEntity(e); + } + } + + if (key == Keyboard::KEY_C /*|| key == 4*/) { + player->inventory->clearInventoryWithDefault(); + // @todo: Add saving here for benchmarking + } + if (key == Keyboard::KEY_H) { + setScreen( new PrerenderTilesScreen() ); + } + + if (key == Keyboard::KEY_O) { + for (int i = Inventory::MAX_SELECTION_SIZE; i < player->inventory->getContainerSize(); ++i) + if (player->inventory->getItem(i)) + player->inventory->dropSlot(i, false); + } + if (key == Keyboard::KEY_F3) { + options.renderDebug = !options.renderDebug; + } + if (key == Keyboard::KEY_M) { + options.difficulty = (options.difficulty == Difficulty::PEACEFUL)? + Difficulty::NORMAL : Difficulty::PEACEFUL; + //setIsCreativeMode( !isCreativeMode() ); + } + + if (options.renderDebug) { + if (key >= '0' && key <= '9') { + _perfRenderer->debugFpsMeterKeyPress(key - '0'); + } + } + #endif + + #ifndef RPI + if (key == 82) + pauseGame(false); + #else + if (key == Keyboard::KEY_ESCAPE) + pauseGame(false); + #endif + + #ifndef OPENGL_ES + if (key == Keyboard::KEY_P) { + static bool isWireFrame = false; + isWireFrame = !isWireFrame; + glPolygonMode(GL_FRONT, isWireFrame? GL_LINE : GL_FILL); + //glPolygonMode(GL_BACK, isWireFrame? GL_LINE : GL_FILL); + } + #endif + } + #ifdef WIN32 + if (key == Keyboard::KEY_M) { + for (int i = 0; i < 5 * SharedConstants::TicksPerSecond; ++i) + level->tick(); + } + #endif + + + //if (!isPressed) LOGI("Key released: %d\n", key); + + if (!options.useMouseForDigging) { + int passedTime = getTimeMs() - lastTickTime; + if (passedTime > 200) continue; + + // Destroy and attack is on same button + if (key == options.keyDestroy.key && isPressed) { + BuildActionIntention bai(BuildActionIntention::BAI_REMOVE | BuildActionIntention::BAI_ATTACK); + handleBuildAction(&bai); + } + else // Build and use/interact is on same button + if (key == options.keyUse.key && isPressed) { + BuildActionIntention bai(BuildActionIntention::BAI_BUILD | BuildActionIntention::BAI_INTERACT); + handleBuildAction(&bai); + } + } + } + + TIMER_POP_PUSH("tickbuild"); + BuildActionIntention bai; + // @note: This might be a problem. This method is polling based here, but + // event based when using mouse (or keys..), and in java. Not quite + // sure just yet what way to go. + bool buildHandled = inputHolder->getBuildInput()->tickBuild(player, &bai); + if (buildHandled) { + if (!bai.isRemoveContinue()) + handleBuildAction(&bai); + } + + bool isTryingToDestroyBlock = (options.useMouseForDigging + ? (Mouse::isButtonDown(MouseAction::ACTION_LEFT) && mouseDiggable) + : Keyboard::isKeyDown(options.keyDestroy.key)) + || (buildHandled && bai.isRemove()); + + TIMER_POP_PUSH("handlemouse"); +#ifdef RPI + handleMouseDown(MouseAction::ACTION_LEFT, isTryingToDestroyBlock); + handleMouseClick(buildHandled && bai.isInteract() + || options.useMouseForDigging && Mouse::isButtonDown(MouseAction::ACTION_RIGHT)); +#else + handleMouseDown(MouseAction::ACTION_LEFT, isTryingToDestroyBlock || (buildHandled && bai.isInteract())); +#endif + + lastTickTime = getTimeMs(); + + // we have (hopefully) handled the keyboard & mouse queue and it + // can now be emptied. If wanted, the reset could be changed to: + // index -= numRead; // then this code doesn't have to be placed here + // + it prepares for tick not handling all or any events. + // update: RAII'ing instead, see above + //Keyboard::reset(); + //Mouse::reset(); + + TIMER_POP(); +#endif +} + +void Minecraft::handleMouseDown(int button, bool down) { +#ifndef STANDALONE_SERVER +#ifndef RPI + if(player->isUsingItem()) { + if(!down && !Keyboard::isKeyDown(options.keyUse.key)) { + gameMode->releaseUsingItem(player); + } + return; + } +#endif + if(player->isSleeping()) { + return; + } + if (button == MouseAction::ACTION_LEFT && missTime > 0) return; + if (down && hitResult.type == TILE && button == MouseAction::ACTION_LEFT && !hitResult.indirectHit) { + int x = hitResult.x; + int y = hitResult.y; + int z = hitResult.z; + gameMode->continueDestroyBlock(x, y, z, hitResult.f); + particleEngine->crack(x, y, z, hitResult.f); + player->swing(); + } else { + gameMode->stopDestroyBlock(); + } +#endif +} + +void Minecraft::handleMouseClick(int button) { +// BuildActionIntention bai( +// (button == MouseAction::ACTION_LEFT)? +// BuildActionIntention::BAI_REMOVE +// : BuildActionIntention::BAI_BUILD); +// +// handleBuildAction(&bai); +} + +void Minecraft::handleBuildAction(BuildActionIntention* action) { +#ifndef STANDALONE_SERVER + if (action->isRemove()) { + if (missTime > 0) return; + player->swing(); + } + if(player->isUsingItem()) + return; + bool mayUse = true; + + if (!hitResult.isHit()) { + if (action->isRemove() && !gameMode->isCreativeType()) { + missTime = 10; + } + } else if (hitResult.type == ENTITY) { + if (action->isAttack()) { + player->swing(); + //LOGI("attacking!\n"); + InteractPacket packet(InteractPacket::Attack, player->entityId, hitResult.entity->entityId); + raknetInstance->send(packet); + gameMode->attack(player, hitResult.entity); + } else if (action->isInteract()) { + if (hitResult.entity->interactPreventDefault()) + mayUse = false; + //LOGI("interacting!\n"); + InteractPacket packet(InteractPacket::Interact, player->entityId, hitResult.entity->entityId); + raknetInstance->send(packet); + gameMode->interact(player, hitResult.entity); + } + } else if (hitResult.type == TILE) { + int x = hitResult.x; + int y = hitResult.y; + int z = hitResult.z; + int face = hitResult.f; + + int oldTileId = level->getTile(x, y, z); + Tile* oldTile = Tile::tiles[oldTileId]; + + //bool tryDestroyBlock = false; + + if (action->isRemove()) { + if (!oldTile) + return; + + //LOGI("tile: %s - %d, %d, %d. b: %f - %f\n", oldTile->getDescriptionId().c_str(), x, y, z, oldTile->getBrightness(level, x, y, z), oldTile->getBrightness(level, x, y+1, z)); + level->extinguishFire(x, y, z, hitResult.f); + gameMode->startDestroyBlock(x, y, z, hitResult.f); + } + else { + ItemInstance* item = player->inventory->getSelected(); + if (gameMode->useItemOn(player, level, item, x, y, z, face, hitResult.pos)) { + mayUse = false; + player->swing(); + #ifdef RPI + } else if (item && item->id == ((Item*)Item::sword_iron)->id) { + player->swing(); + #endif + } + if (item && item->count <= 0) { + player->inventory->clearSlot(player->inventory->selected); + } + //} else if (item && item->count != oldCount) { + // gameRenderer->itemInHandRenderer->itemPlaced(); + //} + } + } + if (mayUse && action->isInteract()) { + ItemInstance* item = player->inventory->getSelected(); + if (item && !player->isUsingItem()) { + if (gameMode->useItem(player, level, item)) { + gameRenderer->itemInHandRenderer->itemUsed(); + } + if (item && item->count <= 0) { + player->inventory->clearSlot(player->inventory->selected); + } + } + } +#endif +} + +bool Minecraft::isOnlineClient() +{ + return (level != NULL && level->isClientSide); +} + +bool Minecraft::isOnline() +{ + return netCallback != NULL; +} + +void Minecraft::pauseGame(bool isBackPaused) { +#ifndef STANDALONE_SERVER + if (screen != NULL) return; + screenChooser.setScreen(isBackPaused? SCREEN_PAUSEPREV : SCREEN_PAUSE); +#endif +} +void Minecraft::gameLostFocus() { +#ifndef STANDALONE_SERVER + if(screen != NULL) { + screen->lostFocus(); + } +#endif +} + + +void Minecraft::setScreen( Screen* screen ) +{ +#ifndef STANDALONE_SERVER + Mouse::reset(); + Multitouch::reset(); + Multitouch::resetThisUpdate(); + + if (screenMutex) { + hasScheduledScreen = true; + scheduledScreen = screen; + return; + } + + if (screen != NULL && screen->isErrorScreen()) + return; + if (screen == NULL && level == NULL) + screen = screenChooser.createScreen(SCREEN_STARTMENU); + + if (this->screen != NULL) { + this->screen->removed(); + delete this->screen; + } + + this->screen = screen; + if (screen != NULL) { + releaseMouse(); + //ScreenSizeCalculator ssc = new ScreenSizeCalculator(options, width, height); + int screenWidth = (int)(width * Gui::InvGuiScale); //ssc.getWidth(); + int screenHeight = (int)(height * Gui::InvGuiScale); //ssc.getHeight(); + screen->init(this, screenWidth, screenHeight); + + if (screen->isInGameScreen() && level) { + level->saveLevelData(); + level->saveGame(); + } + + //noRender = false; + } else { + grabMouse(); + } +#endif +} + +void Minecraft::grabMouse() +{ +#ifndef STANDALONE_SERVER + if (mouseGrabbed) return; + mouseGrabbed = true; + mouseHandler.grab(); + //setScreen(NULL); +#endif +} + +void Minecraft::releaseMouse() +{ +#ifndef STANDALONE_SERVER + if (!mouseGrabbed) { + return; + } + if (player) { + player->releaseAllKeys(); + } + mouseGrabbed = false; + mouseHandler.release(); +#endif +} + +bool Minecraft::useTouchscreen() { +#ifdef RPI + return false; +#endif + return options.useTouchScreen || !_supportsNonTouchscreen; +} +bool Minecraft::supportNonTouchScreen() { + return _supportsNonTouchscreen; +} +void Minecraft::init() +{ + options.minecraft = this; + options.initDefaultValues(); +#ifndef STANDALONE_SERVER + checkGlError("Init enter"); + + _supportsNonTouchscreen = !platform()->supportsTouchscreen(); + + LOGI("IS TOUCHSCREEN? %d\n", options.useTouchScreen); + + textures = new Textures(&options, platform()); + textures->addDynamicTexture(new WaterTexture()); + textures->addDynamicTexture(new WaterSideTexture()); + gui.texturesLoaded(textures); + + levelRenderer = new LevelRenderer(this); + gameRenderer = new GameRenderer(this); + particleEngine = new ParticleEngine(level, textures); + + // Platform specific initialization here + font = new Font(&options, "font/default8.png", textures); + + _perfRenderer = new PerfRenderer(this, font); + + checkGlError("Init complete"); +#endif + + user = new User("TestUser", ""); + setIsCreativeMode(false); // false means it's Survival Mode + reloadOptions(); + +} + +void Minecraft::setSize(int w, int h) { +#ifndef STANDALONE_SERVER + transformResolution(&w, &h); + + width = w; + height = h; + + if (width >= 1000) { + #ifdef __APPLE__ + Gui::GuiScale = (width > 2000)? 8.0f : 4.0f; + #else + Gui::GuiScale = 4.0f; + #endif + } + else if (width >= 800) { +#ifdef __APPLE__ + Gui::GuiScale = 4.0f; +#else + Gui::GuiScale = 3.0f; +#endif + } + else if (width >= 400) + Gui::GuiScale = 2.0f; + else + Gui::GuiScale = 1.0f; + + Gui::InvGuiScale = 1.0f / Gui::GuiScale; + int screenWidth = (int)(width * Gui::InvGuiScale); + int screenHeight = (int)(height * Gui::InvGuiScale); + + if (platform()) { + float pixelsPerMillimeter = options.getProgressValue(&Options::Option::PIXELS_PER_MILLIMETER); + pixelCalc.setPixelsPerMillimeter(pixelsPerMillimeter); + pixelCalcUi.setPixelsPerMillimeter(pixelsPerMillimeter * Gui::InvGuiScale); + } + + Config config = createConfig(this); + gui.onConfigChanged(config); + + if (screen) + screen->setSize(screenWidth, screenHeight); + + if (inputHolder) + inputHolder->onConfigChanged(config); + //LOGI("Setting size: %d, %d: %f\n", width, height, Gui::InvGuiScale); + +#ifdef WIN32 + char resbuf[128]; + sprintf(resbuf, " %d x %d @ scale %.2f", width, height, Gui::GuiScale); + //gui.addMessage(resbuf); +#endif +#endif /* STANDALONE_SERVER */ +} + +void Minecraft::reloadOptions() { + options.update(); + options.save(); + bool wasTouchscreen = options.useTouchScreen; + options.useTouchScreen = useTouchscreen(); + options.save(); + + if ((wasTouchscreen != options.useTouchScreen) || (inputHolder == 0)) + _reloadInput(); + + user->name = options.username; + + LOGI("Reloading-options\n"); + + // @todo @fix Android and iOS behaves a bit differently when leaving + // an options screen (Android recreates OpenGL surface) + setSize(width, height); +} + +void Minecraft::_reloadInput() { +#ifndef STANDALONE_SERVER + delete inputHolder; + + if (useTouchscreen()) { + inputHolder = new TouchInputHolder(this, &options); + } else { + #if defined(ANDROID) || defined(__APPLE__) + inputHolder = new CustomInputHolder( + new XperiaPlayInput(&options), + new ControllerTurnInput(2, ControllerTurnInput::MODE_DELTA), + new IBuildInput()); + #else + inputHolder = new CustomInputHolder( + new KeyboardInput(&options), + new MouseTurnInput(MouseTurnInput::MODE_DELTA, width/2, height/2), + new MouseBuildInput()); + #endif + } + + mouseHandler.setTurnInput(inputHolder->getTurnInput()); + if (level && player) { + player->input = inputHolder->getMoveInput(); + } +#endif +} + + +// +// Multiplayer +// +void Minecraft::locateMultiplayer() { + isLookingForMultiplayer = true; + + raknetInstance->pingForHosts(19132); + netCallback = new ClientSideNetworkHandler(this, raknetInstance); +} + +void Minecraft::cancelLocateMultiplayer() { + isLookingForMultiplayer = false; + + raknetInstance->stopPingForHosts(); + + delete netCallback; + netCallback = NULL; +} + +bool Minecraft::joinMultiplayer( const PingedCompatibleServer& server ) +{ + if (isLookingForMultiplayer && netCallback) { + isLookingForMultiplayer = false; + return raknetInstance->connect(server.address.ToString(false), server.address.GetPort()); + } + return false; +} + +void Minecraft::hostMultiplayer(int port) { + // Tear down last instance + raknetInstance->disconnect(); + delete netCallback; + netCallback = NULL; + +#if !defined(NO_NETWORK) + netCallback = new ServerSideNetworkHandler(this, raknetInstance); + #ifdef STANDALONE_SERVER + raknetInstance->host(user->name, port, 16); + #else + raknetInstance->host(user->name, port); + #endif +#endif +} + +// +// Level generation +// +/*static*/ + + void* Minecraft::prepareLevel_tspawn(void *p_param) +{ + Minecraft* mc = (Minecraft*) p_param; + mc->generateLevel("Currently not used", mc->level); + return 0; +} + +void Minecraft::generateLevel( const std::string& message, Level* level ) +{ + Stopwatch s; + s.start(); + prepareLevel(message); + s.stop(); + s.print("Level generated: "); + + // "Unlock" + isGeneratingLevel = false; +} + +void Minecraft::_levelGenerated() +{ +#ifndef STANDALONE_SERVER + if (player == NULL) { + player = (LocalPlayer*) gameMode->createPlayer(level); + gameMode->initPlayer(player); + } + + if (player) { + player->input = inputHolder->getMoveInput(); + } + + if (levelRenderer != NULL) levelRenderer->setLevel(level); + if (particleEngine != NULL) particleEngine->setLevel(level); + + gameMode->adjustPlayer(player); + gui.onLevelGenerated(); +#endif + + level->validateSpawn(); + level->loadPlayer(player, true); + // if we are client side, we trust the server to have given us a correct position + if (player && !level->isClientSide) { + player->resetPos(false); + } + + this->cameraTargetPlayer = player; + + if (raknetInstance->isServer()) + raknetInstance->announceServer(user->name); + + if (netCallback) { + netCallback->levelGenerated(level); + } + +#if defined(WIN32) || defined(RPI) + if (_commandServer) { + delete _commandServer; + } + _commandServer = new CommandServer(this); + _commandServer->init(commandPort); +#endif + + // Hack to (hopefully) get the players to show (note: in LevelListener + // instead, since adding yourself always generates a entityAdded) + //EntityRenderDispatcher::getInstance()->onGraphicsReset(); + _hasSignaledGeneratingLevelFinished = true; +} + +Player* Minecraft::respawnPlayer(int playerId) { + for (unsigned int i = 0; i < level->players.size(); ++i) { + if (level->players[i]->entityId == playerId) { + resetPlayer(level->players[i]); + return level->players[i]; + } + } + return NULL; +} + +void Minecraft::resetPlayer(Player* player) { + level->validateSpawn(); + player->reset(); + + Pos p; + if(player->hasRespawnPosition()) { + p = player->getRespawnPosition(); + } + else { + p = level->getSharedSpawnPos(); + } + player->setPos((float)p.x + 0.5f, (float)p.y + 1.0f, (float)p.z + 0.5f); + player->resetPos(true); + + if (isCreativeMode()) + player->inventory->clearInventoryWithDefault(); +} + +void Minecraft::respawnPlayer() { + // RESET THE FRACKING PLAYER HERE + //bool slowCheck = false; + //for (int i = 0; i < level->entities.size(); ++i) + // if (level->entities[i] == player) slowCheck = true; + // + //LOGI("Has entity? %d, %d\n", level->getEntity(player->entityId), slowCheck); + + resetPlayer(player); + + // tell server (or other client) that we re-spawned + RespawnPacket packet(player); + raknetInstance->send(packet); +} + +void Minecraft::onGraphicsReset() +{ +#ifndef STANDALONE_SERVER + textures->clear(); + + font->onGraphicsReset(); + gui.onGraphicsReset(); + + if (levelRenderer) levelRenderer->onGraphicsReset(); + if (gameRenderer) gameRenderer->onGraphicsReset(); + + EntityRenderDispatcher::getInstance()->onGraphicsReset(); + TileEntityRenderDispatcher::getInstance()->onGraphicsReset(); +#endif +} + +int Minecraft::getProgressStatusId() { + return progressStageStatusId; +} + +const char* Minecraft::getProgressMessage() +{ + return progressMessages[progressStageStatusId]; +} + +bool Minecraft::isLevelGenerated() +{ + return level != NULL && !isGeneratingLevel; +} + +LevelStorageSource* Minecraft::getLevelSource() +{ + return storageSource; +} + +int Minecraft::getLicenseId() { + if (!LicenseCodes::isReady(_licenseId)) + _licenseId = platform()->checkLicense(); + return _licenseId; +} + +void Minecraft::audioEngineOn() { +#ifndef STANDALONE_SERVER + soundEngine->enable(true); +#endif +} +void Minecraft::audioEngineOff() { +#ifndef STANDALONE_SERVER + soundEngine->enable(false); +#endif +} + +void Minecraft::setIsCreativeMode(bool isCreative) +{ +#ifdef CREATORMODE + delete gameMode; + gameMode = new CreatorMode(this); + _isCreativeMode = true; +#else + if (!gameMode || isCreative != _isCreativeMode) + { + delete gameMode; + if (isCreative) gameMode = new CreativeMode(this); + else gameMode = new SurvivalMode(this); + _isCreativeMode = isCreative; + } +#endif + if (player) + gameMode->initAbilities(player->abilities); +} + +bool Minecraft::isCreativeMode() { + return _isCreativeMode; +} + +bool Minecraft::isKindleFire(int kindleVersion) { + if (kindleVersion != 1) + return false; + + std::string model = platform()->getPlatformStringVar(PlatformStringVars::DEVICE_BUILD_MODEL); + std::string modelLower(model); + std::transform(modelLower.begin(), modelLower.end(), modelLower.begin(), tolower); + + return (modelLower.find("kindle") != std::string::npos) && (modelLower.find("fire") != std::string::npos); +} + +bool Minecraft::transformResolution(int* w, int* h) +{ + bool changed = false; + + // Kindle Fire 1: reporting wrong height in + // certain cases (e.g. after screen lock) + if (isKindleFire(1) && *h >= 560 && *h <= 620) { + *h = 580; + changed = true; + } + + return changed; +} + +ICreator* Minecraft::getCreator() +{ +#ifdef CREATORMODE + return ((CreatorMode*)gameMode)->getCreator(); +#else + return NULL; +#endif +} + +void Minecraft::optionUpdated( const Options::Option* option, bool value ) { + if(netCallback != NULL && option == &Options::Option::SERVER_VISIBLE) { + ServerSideNetworkHandler* ss = (ServerSideNetworkHandler*) netCallback; + ss->allowIncomingConnections(value); + } +} + +void Minecraft::optionUpdated( const Options::Option* option, float value ) { +#ifndef STANDALONE_SERVER + if(option == &Options::Option::PIXELS_PER_MILLIMETER) { + pixelCalcUi.setPixelsPerMillimeter(value * Gui::InvGuiScale); + pixelCalc.setPixelsPerMillimeter(value); + } +#endif +} + +void Minecraft::optionUpdated( const Options::Option* option, int value ) { + +} diff --git a/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/BA89C7AF1569F642860486F4AC0590EF/state.mpack b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/BA89C7AF1569F642860486F4AC0590EF/state.mpack new file mode 100644 index 0000000..07d3177 Binary files /dev/null and b/minecraftcpp-master/handheld/project/win32/.vs/CopilotSnapshots/BA89C7AF1569F642860486F4AC0590EF/state.mpack differ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/CopilotIndices/17.14.1368.60722/CodeChunks.db b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/CopilotIndices/17.14.1368.60722/CodeChunks.db new file mode 100644 index 0000000..74c85e4 Binary files /dev/null and b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/CopilotIndices/17.14.1368.60722/CodeChunks.db differ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/CopilotIndices/17.14.1368.60722/SemanticSymbols.db b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/CopilotIndices/17.14.1368.60722/SemanticSymbols.db new file mode 100644 index 0000000..a109663 Binary files /dev/null and b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/CopilotIndices/17.14.1368.60722/SemanticSymbols.db differ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/FileContentIndex/9b92fe4c-cde5-4621-ab57-d58e2c588ee9.vsidx b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/FileContentIndex/9b92fe4c-cde5-4621-ab57-d58e2c588ee9.vsidx new file mode 100644 index 0000000..c78332d Binary files /dev/null and b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/FileContentIndex/9b92fe4c-cde5-4621-ab57-d58e2c588ee9.vsidx differ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/FileContentIndex/c3c6097c-bf70-4647-9a88-521c5df0fb5c.vsidx b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/FileContentIndex/c3c6097c-bf70-4647-9a88-521c5df0fb5c.vsidx new file mode 100644 index 0000000..70aef67 Binary files /dev/null and b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/FileContentIndex/c3c6097c-bf70-4647-9a88-521c5df0fb5c.vsidx differ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/FileContentIndex/f20eb44f-6060-4e70-ac65-28996ddab6d3.vsidx b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/FileContentIndex/f20eb44f-6060-4e70-ac65-28996ddab6d3.vsidx new file mode 100644 index 0000000..b1bff60 Binary files /dev/null and b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/FileContentIndex/f20eb44f-6060-4e70-ac65-28996ddab6d3.vsidx differ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/FileContentIndex/f6d2e471-f8b3-427c-9089-3c3c8e968d0d.vsidx b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/FileContentIndex/f6d2e471-f8b3-427c-9089-3c3c8e968d0d.vsidx new file mode 100644 index 0000000..016bd9e Binary files /dev/null and b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/FileContentIndex/f6d2e471-f8b3-427c-9089-3c3c8e968d0d.vsidx differ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/FileContentIndex/f9f458c0-8612-4a43-ae23-527cc19d65a6.vsidx b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/FileContentIndex/f9f458c0-8612-4a43-ae23-527cc19d65a6.vsidx new file mode 100644 index 0000000..92400d4 Binary files /dev/null and b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/FileContentIndex/f9f458c0-8612-4a43-ae23-527cc19d65a6.vsidx differ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/copilot-chat/89a8e636/sessions/afc789ba-6915-42f6-8604-86f4ac0590ef b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/copilot-chat/89a8e636/sessions/afc789ba-6915-42f6-8604-86f4ac0590ef new file mode 100644 index 0000000..9757070 Binary files /dev/null and b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/copilot-chat/89a8e636/sessions/afc789ba-6915-42f6-8604-86f4ac0590ef differ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/copilot-chat/d3533ef8/sessions/e8f71e52-111c-4b86-8046-28bd5ce46039 b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/copilot-chat/d3533ef8/sessions/e8f71e52-111c-4b86-8046-28bd5ce46039 new file mode 100644 index 0000000..844a60c Binary files /dev/null and b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/copilot-chat/d3533ef8/sessions/e8f71e52-111c-4b86-8046-28bd5ce46039 differ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/.suo b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/.suo new file mode 100644 index 0000000..b6c8250 Binary files /dev/null and b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/.suo differ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/Browse.VC.db b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/Browse.VC.db new file mode 100644 index 0000000..d043f3d Binary files /dev/null and b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/Browse.VC.db differ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/DocumentLayout.backup.json b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/DocumentLayout.backup.json new file mode 100644 index 0000000..20c1cf9 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/DocumentLayout.backup.json @@ -0,0 +1,312 @@ +{ + "Version": 1, + "WorkspaceRootPath": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\project\\win32\\", + "Documents": [ + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\Screen.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\components\\TextBox.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\NetworkingHelpers.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\NetworkingHelpers.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\Minecraft.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\touch\\TouchJoinGameScreen.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\touch\\TouchJoinGameScreen.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\JoinGameScreen.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\components\\TextBox.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\JoinGameScreen.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\components\\Button.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\DeathScreen.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\DeathScreen.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\ScreenChooser.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\Minecraft.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\Screen.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\platform\\input\\Keyboard.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\TextEditScreen.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + } + ], + "DocumentGroupContainers": [ + { + "Orientation": 0, + "VerticalTabListWidth": 256, + "DocumentGroups": [ + { + "DockedWidth": 200, + "SelectedChildIndex": 18, + "Children": [ + { + "$type": "Bookmark", + "Name": "ST:0:0:{aa2115a1-9712-457b-9047-dbb71ca2cdd2}" + }, + { + "$type": "Document", + "DocumentIndex": 17, + "Title": "TextEditScreen.cpp", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\TextEditScreen.cpp", + "RelativeDocumentMoniker": "..\\..\\src\\client\\gui\\screens\\TextEditScreen.cpp", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\TextEditScreen.cpp", + "RelativeToolTip": "..\\..\\src\\client\\gui\\screens\\TextEditScreen.cpp", + "ViewState": "AgIAAJIAAAAAAAAAAABBwAAAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|", + "WhenOpened": "2026-03-01T13:31:07.699Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 16, + "Title": "Keyboard.h", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\platform\\input\\Keyboard.h", + "RelativeDocumentMoniker": "..\\..\\src\\platform\\input\\Keyboard.h", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\platform\\input\\Keyboard.h", + "RelativeToolTip": "..\\..\\src\\platform\\input\\Keyboard.h", + "ViewState": "AgIAAJgAAAAAAAAAAABBwAAAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000680|", + "WhenOpened": "2026-03-01T13:27:57.854Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 15, + "Title": "Screen.h", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\Screen.h", + "RelativeDocumentMoniker": "..\\..\\src\\client\\gui\\Screen.h", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\Screen.h", + "RelativeToolTip": "..\\..\\src\\client\\gui\\Screen.h", + "ViewState": "AgIAAFIAAAAAAAAAAABBwAAAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000680|", + "WhenOpened": "2026-03-01T13:14:58.93Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 3, + "Title": "NetworkingHelpers.cpp", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\NetworkingHelpers.cpp", + "RelativeDocumentMoniker": "..\\..\\src\\client\\NetworkingHelpers.cpp", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\NetworkingHelpers.cpp", + "RelativeToolTip": "..\\..\\src\\client\\NetworkingHelpers.cpp", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|", + "WhenOpened": "2026-03-01T12:50:34.918Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 2, + "Title": "NetworkingHelpers.h", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\NetworkingHelpers.h", + "RelativeDocumentMoniker": "..\\..\\src\\client\\NetworkingHelpers.h", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\NetworkingHelpers.h", + "RelativeToolTip": "..\\..\\src\\client\\NetworkingHelpers.h", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000680|", + "WhenOpened": "2026-03-01T12:50:28.53Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 14, + "Title": "Minecraft.h", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\Minecraft.h", + "RelativeDocumentMoniker": "..\\..\\src\\client\\Minecraft.h", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\Minecraft.h", + "RelativeToolTip": "..\\..\\src\\client\\Minecraft.h", + "ViewState": "AgIAAOoAAAAAAAAAAIBJwAAAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000680|", + "WhenOpened": "2026-03-01T12:46:47.538Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 5, + "Title": "TouchJoinGameScreen.cpp", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\touch\\TouchJoinGameScreen.cpp", + "RelativeDocumentMoniker": "..\\..\\src\\client\\gui\\screens\\touch\\TouchJoinGameScreen.cpp", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\touch\\TouchJoinGameScreen.cpp", + "RelativeToolTip": "..\\..\\src\\client\\gui\\screens\\touch\\TouchJoinGameScreen.cpp", + "ViewState": "AgIAAHIAAAAAAAAAAAAawAAAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|", + "WhenOpened": "2026-03-01T12:44:40.749Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 6, + "Title": "TouchJoinGameScreen.h", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\touch\\TouchJoinGameScreen.h", + "RelativeDocumentMoniker": "..\\..\\src\\client\\gui\\screens\\touch\\TouchJoinGameScreen.h", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\touch\\TouchJoinGameScreen.h", + "RelativeToolTip": "..\\..\\src\\client\\gui\\screens\\touch\\TouchJoinGameScreen.h", + "ViewState": "AgIAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000680|", + "WhenOpened": "2026-03-01T12:44:13.379Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 8, + "Title": "TextBox.h", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\components\\TextBox.h", + "RelativeDocumentMoniker": "..\\..\\src\\client\\gui\\components\\TextBox.h", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\components\\TextBox.h", + "RelativeToolTip": "..\\..\\src\\client\\gui\\components\\TextBox.h", + "ViewState": "AgIAABIAAAAAAAAAAAAawAAAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000680|", + "WhenOpened": "2026-03-01T12:24:30.332Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 10, + "Title": "Button.cpp", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\components\\Button.cpp", + "RelativeDocumentMoniker": "..\\..\\src\\client\\gui\\components\\Button.cpp", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\components\\Button.cpp", + "RelativeToolTip": "..\\..\\src\\client\\gui\\components\\Button.cpp", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAA8AAAALAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|", + "WhenOpened": "2026-03-01T12:19:04.534Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 7, + "Title": "JoinGameScreen.cpp", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\JoinGameScreen.cpp", + "RelativeDocumentMoniker": "..\\..\\src\\client\\gui\\screens\\JoinGameScreen.cpp", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\JoinGameScreen.cpp", + "RelativeToolTip": "..\\..\\src\\client\\gui\\screens\\JoinGameScreen.cpp", + "ViewState": "AgIAAFYAAAAAAAAAAAAawEYAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|", + "WhenOpened": "2026-03-01T12:18:00.139Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 9, + "Title": "JoinGameScreen.h", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\JoinGameScreen.h", + "RelativeDocumentMoniker": "..\\..\\src\\client\\gui\\screens\\JoinGameScreen.h", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\JoinGameScreen.h", + "RelativeToolTip": "..\\..\\src\\client\\gui\\screens\\JoinGameScreen.h", + "ViewState": "AgIAABIAAAAAAAAAAAAawBIAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000680|", + "WhenOpened": "2026-03-01T12:17:12.408Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 1, + "Title": "TextBox.cpp", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\components\\TextBox.cpp", + "RelativeDocumentMoniker": "..\\..\\src\\client\\gui\\components\\TextBox.cpp", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\components\\TextBox.cpp", + "RelativeToolTip": "..\\..\\src\\client\\gui\\components\\TextBox.cpp", + "ViewState": "AgIAACMAAAAAAAAAAIAwwDQAAAAeAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|", + "WhenOpened": "2026-03-01T12:15:45.411Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 11, + "Title": "DeathScreen.h", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\DeathScreen.h", + "RelativeDocumentMoniker": "..\\..\\src\\client\\gui\\screens\\DeathScreen.h", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\DeathScreen.h", + "RelativeToolTip": "..\\..\\src\\client\\gui\\screens\\DeathScreen.h", + "ViewState": "AgIAAA8AAAAAAAAAAAAqwBcAAAAEAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000680|", + "WhenOpened": "2026-03-01T12:14:46.669Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 12, + "Title": "DeathScreen.cpp", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\DeathScreen.cpp", + "RelativeDocumentMoniker": "..\\..\\src\\client\\gui\\screens\\DeathScreen.cpp", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\DeathScreen.cpp", + "RelativeToolTip": "..\\..\\src\\client\\gui\\screens\\DeathScreen.cpp", + "ViewState": "AgIAABsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|", + "WhenOpened": "2026-03-01T12:15:11.172Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 4, + "Title": "Minecraft.cpp", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\Minecraft.cpp", + "RelativeDocumentMoniker": "..\\..\\src\\client\\Minecraft.cpp", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\Minecraft.cpp", + "RelativeToolTip": "..\\..\\src\\client\\Minecraft.cpp", + "ViewState": "AgIAAB4GAAAAAAAAAAAawD0DAAAjAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|", + "WhenOpened": "2026-03-01T11:59:52.098Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 13, + "Title": "ScreenChooser.cpp", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\ScreenChooser.cpp", + "RelativeDocumentMoniker": "..\\..\\src\\client\\gui\\screens\\ScreenChooser.cpp", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\ScreenChooser.cpp", + "RelativeToolTip": "..\\..\\src\\client\\gui\\screens\\ScreenChooser.cpp", + "ViewState": "AgIAAAAAAAAAAAAAAAAAABcAAAATAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|", + "WhenOpened": "2026-03-01T11:51:21.969Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 0, + "Title": "Screen.cpp", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\Screen.cpp", + "RelativeDocumentMoniker": "..\\..\\src\\client\\gui\\Screen.cpp", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\Screen.cpp", + "RelativeToolTip": "..\\..\\src\\client\\gui\\Screen.cpp", + "ViewState": "AgIAANYAAAAAAAAAAAAwwPcAAAABAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|", + "WhenOpened": "2026-03-01T11:44:11.773Z", + "EditorCaption": "" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/DocumentLayout.json b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/DocumentLayout.json new file mode 100644 index 0000000..03c7937 --- /dev/null +++ b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/DocumentLayout.json @@ -0,0 +1,312 @@ +{ + "Version": 1, + "WorkspaceRootPath": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\project\\win32\\", + "Documents": [ + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\Minecraft.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\Minecraft.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\Screen.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\components\\TextBox.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\NetworkingHelpers.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\NetworkingHelpers.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\touch\\TouchJoinGameScreen.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\touch\\TouchJoinGameScreen.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\JoinGameScreen.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\components\\TextBox.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\JoinGameScreen.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\components\\Button.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\DeathScreen.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\DeathScreen.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\ScreenChooser.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\Screen.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\platform\\input\\Keyboard.h||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + }, + { + "AbsoluteMoniker": "D:0:0:{61D12CAD-CC16-4024-9C45-DE97AB0465AF}|MinecraftWin32.vcxproj|C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\TextEditScreen.cpp||{D0E1A5C6-B359-4E41-9B60-3365922C2A22}" + } + ], + "DocumentGroupContainers": [ + { + "Orientation": 0, + "VerticalTabListWidth": 256, + "DocumentGroups": [ + { + "DockedWidth": 200, + "SelectedChildIndex": 16, + "Children": [ + { + "$type": "Bookmark", + "Name": "ST:0:0:{aa2115a1-9712-457b-9047-dbb71ca2cdd2}" + }, + { + "$type": "Document", + "DocumentIndex": 17, + "Title": "TextEditScreen.cpp", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\TextEditScreen.cpp", + "RelativeDocumentMoniker": "..\\..\\src\\client\\gui\\screens\\TextEditScreen.cpp", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\TextEditScreen.cpp", + "RelativeToolTip": "..\\..\\src\\client\\gui\\screens\\TextEditScreen.cpp", + "ViewState": "AgIAAJIAAAAAAAAAAABBwAAAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|", + "WhenOpened": "2026-03-01T13:31:07.699Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 16, + "Title": "Keyboard.h", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\platform\\input\\Keyboard.h", + "RelativeDocumentMoniker": "..\\..\\src\\platform\\input\\Keyboard.h", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\platform\\input\\Keyboard.h", + "RelativeToolTip": "..\\..\\src\\platform\\input\\Keyboard.h", + "ViewState": "AgIAAJYAAAAAAAAAAABRwAAAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000680|", + "WhenOpened": "2026-03-01T13:27:57.854Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 15, + "Title": "Screen.h", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\Screen.h", + "RelativeDocumentMoniker": "..\\..\\src\\client\\gui\\Screen.h", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\Screen.h", + "RelativeToolTip": "..\\..\\src\\client\\gui\\Screen.h", + "ViewState": "AgIAAFIAAAAAAAAAAABBwAAAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000680|", + "WhenOpened": "2026-03-01T13:14:58.93Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 5, + "Title": "NetworkingHelpers.cpp", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\NetworkingHelpers.cpp", + "RelativeDocumentMoniker": "..\\..\\src\\client\\NetworkingHelpers.cpp", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\NetworkingHelpers.cpp", + "RelativeToolTip": "..\\..\\src\\client\\NetworkingHelpers.cpp", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|", + "WhenOpened": "2026-03-01T12:50:34.918Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 4, + "Title": "NetworkingHelpers.h", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\NetworkingHelpers.h", + "RelativeDocumentMoniker": "..\\..\\src\\client\\NetworkingHelpers.h", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\NetworkingHelpers.h", + "RelativeToolTip": "..\\..\\src\\client\\NetworkingHelpers.h", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000680|", + "WhenOpened": "2026-03-01T12:50:28.53Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 1, + "Title": "Minecraft.h", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\Minecraft.h", + "RelativeDocumentMoniker": "..\\..\\src\\client\\Minecraft.h", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\Minecraft.h", + "RelativeToolTip": "..\\..\\src\\client\\Minecraft.h", + "ViewState": "AgIAAKsAAAAAAAAAAIAwwAAAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000680|", + "WhenOpened": "2026-03-01T12:46:47.538Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 6, + "Title": "TouchJoinGameScreen.cpp", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\touch\\TouchJoinGameScreen.cpp", + "RelativeDocumentMoniker": "..\\..\\src\\client\\gui\\screens\\touch\\TouchJoinGameScreen.cpp", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\touch\\TouchJoinGameScreen.cpp", + "RelativeToolTip": "..\\..\\src\\client\\gui\\screens\\touch\\TouchJoinGameScreen.cpp", + "ViewState": "AgIAAHIAAAAAAAAAAAAawAAAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|", + "WhenOpened": "2026-03-01T12:44:40.749Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 7, + "Title": "TouchJoinGameScreen.h", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\touch\\TouchJoinGameScreen.h", + "RelativeDocumentMoniker": "..\\..\\src\\client\\gui\\screens\\touch\\TouchJoinGameScreen.h", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\touch\\TouchJoinGameScreen.h", + "RelativeToolTip": "..\\..\\src\\client\\gui\\screens\\touch\\TouchJoinGameScreen.h", + "ViewState": "AgIAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000680|", + "WhenOpened": "2026-03-01T12:44:13.379Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 9, + "Title": "TextBox.h", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\components\\TextBox.h", + "RelativeDocumentMoniker": "..\\..\\src\\client\\gui\\components\\TextBox.h", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\components\\TextBox.h", + "RelativeToolTip": "..\\..\\src\\client\\gui\\components\\TextBox.h", + "ViewState": "AgIAABIAAAAAAAAAAAAawAAAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000680|", + "WhenOpened": "2026-03-01T12:24:30.332Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 11, + "Title": "Button.cpp", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\components\\Button.cpp", + "RelativeDocumentMoniker": "..\\..\\src\\client\\gui\\components\\Button.cpp", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\components\\Button.cpp", + "RelativeToolTip": "..\\..\\src\\client\\gui\\components\\Button.cpp", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAA8AAAALAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|", + "WhenOpened": "2026-03-01T12:19:04.534Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 8, + "Title": "JoinGameScreen.cpp", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\JoinGameScreen.cpp", + "RelativeDocumentMoniker": "..\\..\\src\\client\\gui\\screens\\JoinGameScreen.cpp", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\JoinGameScreen.cpp", + "RelativeToolTip": "..\\..\\src\\client\\gui\\screens\\JoinGameScreen.cpp", + "ViewState": "AgIAAFYAAAAAAAAAAAAawEYAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|", + "WhenOpened": "2026-03-01T12:18:00.139Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 10, + "Title": "JoinGameScreen.h", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\JoinGameScreen.h", + "RelativeDocumentMoniker": "..\\..\\src\\client\\gui\\screens\\JoinGameScreen.h", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\JoinGameScreen.h", + "RelativeToolTip": "..\\..\\src\\client\\gui\\screens\\JoinGameScreen.h", + "ViewState": "AgIAABIAAAAAAAAAAAAawBIAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000680|", + "WhenOpened": "2026-03-01T12:17:12.408Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 3, + "Title": "TextBox.cpp", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\components\\TextBox.cpp", + "RelativeDocumentMoniker": "..\\..\\src\\client\\gui\\components\\TextBox.cpp", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\components\\TextBox.cpp", + "RelativeToolTip": "..\\..\\src\\client\\gui\\components\\TextBox.cpp", + "ViewState": "AgIAACMAAAAAAAAAAIAwwDQAAAAeAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|", + "WhenOpened": "2026-03-01T12:15:45.411Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 12, + "Title": "DeathScreen.h", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\DeathScreen.h", + "RelativeDocumentMoniker": "..\\..\\src\\client\\gui\\screens\\DeathScreen.h", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\DeathScreen.h", + "RelativeToolTip": "..\\..\\src\\client\\gui\\screens\\DeathScreen.h", + "ViewState": "AgIAAA8AAAAAAAAAAAAqwBcAAAAEAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000680|", + "WhenOpened": "2026-03-01T12:14:46.669Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 13, + "Title": "DeathScreen.cpp", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\DeathScreen.cpp", + "RelativeDocumentMoniker": "..\\..\\src\\client\\gui\\screens\\DeathScreen.cpp", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\DeathScreen.cpp", + "RelativeToolTip": "..\\..\\src\\client\\gui\\screens\\DeathScreen.cpp", + "ViewState": "AgIAABsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|", + "WhenOpened": "2026-03-01T12:15:11.172Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 0, + "Title": "Minecraft.cpp", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\Minecraft.cpp", + "RelativeDocumentMoniker": "..\\..\\src\\client\\Minecraft.cpp", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\Minecraft.cpp", + "RelativeToolTip": "..\\..\\src\\client\\Minecraft.cpp", + "ViewState": "AgIAACoDAAAAAAAAAAAgwDoDAAAEAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|", + "WhenOpened": "2026-03-01T11:59:52.098Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 14, + "Title": "ScreenChooser.cpp", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\ScreenChooser.cpp", + "RelativeDocumentMoniker": "..\\..\\src\\client\\gui\\screens\\ScreenChooser.cpp", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\screens\\ScreenChooser.cpp", + "RelativeToolTip": "..\\..\\src\\client\\gui\\screens\\ScreenChooser.cpp", + "ViewState": "AgIAAAAAAAAAAAAAAAAAABcAAAATAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|", + "WhenOpened": "2026-03-01T11:51:21.969Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 2, + "Title": "Screen.cpp", + "DocumentMoniker": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\Screen.cpp", + "RelativeDocumentMoniker": "..\\..\\src\\client\\gui\\Screen.cpp", + "ToolTip": "C:\\Users\\Chris\\Desktop\\minecraftcpp-master\\handheld\\src\\client\\gui\\Screen.cpp", + "RelativeToolTip": "..\\..\\src\\client\\gui\\Screen.cpp", + "ViewState": "AgIAANYAAAAAAAAAAAAwwOkAAAAWAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000677|", + "WhenOpened": "2026-03-01T11:44:11.773Z", + "EditorCaption": "" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/Solution.VC.db b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/Solution.VC.db new file mode 100644 index 0000000..3d99342 Binary files /dev/null and b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/Solution.VC.db differ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/fileList.bin b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/fileList.bin new file mode 100644 index 0000000..3169ac0 Binary files /dev/null and b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/fileList.bin differ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/ipch/AutoPCH/18bffe0651fa57eb/TOUCHJOINGAMESCREEN.ipch b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/ipch/AutoPCH/18bffe0651fa57eb/TOUCHJOINGAMESCREEN.ipch new file mode 100644 index 0000000..af8c73e Binary files /dev/null and b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/ipch/AutoPCH/18bffe0651fa57eb/TOUCHJOINGAMESCREEN.ipch differ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/ipch/AutoPCH/19287a9dd07bc768/CHOOSELEVELSCREEN.ipch b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/ipch/AutoPCH/19287a9dd07bc768/CHOOSELEVELSCREEN.ipch new file mode 100644 index 0000000..6896227 Binary files /dev/null and b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/ipch/AutoPCH/19287a9dd07bc768/CHOOSELEVELSCREEN.ipch differ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/ipch/AutoPCH/1bf6d57fd086670b/RAKPEER.ipch b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/ipch/AutoPCH/1bf6d57fd086670b/RAKPEER.ipch new file mode 100644 index 0000000..e069f15 Binary files /dev/null and b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/ipch/AutoPCH/1bf6d57fd086670b/RAKPEER.ipch differ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/ipch/AutoPCH/25af02e0c58b9596/ARMORSCREEN.ipch b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/ipch/AutoPCH/25af02e0c58b9596/ARMORSCREEN.ipch new file mode 100644 index 0000000..e6ec289 Binary files /dev/null and b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/ipch/AutoPCH/25af02e0c58b9596/ARMORSCREEN.ipch differ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/ipch/AutoPCH/3b528a6f77b76698/SCREENCHOOSER.ipch b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/ipch/AutoPCH/3b528a6f77b76698/SCREENCHOOSER.ipch new file mode 100644 index 0000000..8d6ec1a Binary files /dev/null and b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/ipch/AutoPCH/3b528a6f77b76698/SCREENCHOOSER.ipch differ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/ipch/AutoPCH/40d03883aa0fbab/JOINGAMESCREEN.ipch b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/ipch/AutoPCH/40d03883aa0fbab/JOINGAMESCREEN.ipch new file mode 100644 index 0000000..01715ef Binary files /dev/null and b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/ipch/AutoPCH/40d03883aa0fbab/JOINGAMESCREEN.ipch differ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/ipch/AutoPCH/4a718708efdbe073/CLOUDSERVER.ipch b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/ipch/AutoPCH/4a718708efdbe073/CLOUDSERVER.ipch new file mode 100644 index 0000000..1565722 Binary files /dev/null and b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/ipch/AutoPCH/4a718708efdbe073/CLOUDSERVER.ipch differ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/ipch/AutoPCH/4a9978c11f7deac4/BUTTON.ipch b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/ipch/AutoPCH/4a9978c11f7deac4/BUTTON.ipch new file mode 100644 index 0000000..618175a Binary files /dev/null and b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/ipch/AutoPCH/4a9978c11f7deac4/BUTTON.ipch differ diff --git a/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/ipch/AutoPCH/52cf2c2a38e58f6b/PAUSESCREEN.ipch b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/ipch/AutoPCH/52cf2c2a38e58f6b/PAUSESCREEN.ipch new file mode 100644 index 0000000..d0dd923 Binary files /dev/null and b/minecraftcpp-master/handheld/project/win32/.vs/MinecraftWin32/v17/ipch/AutoPCH/52cf2c{"code":"deadline_exceeded","msg":"operation timed out"}